Buf2d/ru

From KolibriOS wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Вступление

Документация к свободной библиотеке buf2d.asm, для ОС Колибри. Эта библиотека создана для работы с 2d изображениями. С ее помощью можно создавать буфера с изображениями в памяти, и при необходимости выводить их на экран. Изображения можно накладывать одно на другое, поддерживается работа с прозрачными изображениями. Есть функции рисования линий, кривых Безье, прямоугольников, окружностей. Также есть функции для рисований воксельной графики.

Форматы буферов

Поддерживается 3 формата буферов. Каждая функция при работе с буферами может быть расчитана на работу с определенными форматами изображений.

  • 8 бит

Сожержит альфа канал a (прозрачность) изображения. На экран не выводится. Используется для созданя 32-битных буферов.

  • 24 бит

Данный буфер содержит изображение в формате rgb. Может выводится на экран.

  • 32 бит

Содержит прозрачное изображение в формате rgba. На экран не выводится. Используется для наложения изображений. Если a=255 то пиксель прозрачный, если 0 не прозрачный.

Функции

Почти все функции 1-м параметром принимают указатель на структуру буфера, из которой могут использоваться параметры, нужные для работы конкретной функции. Пример структуры буфера изображения:

align 4
buf_0:
	dd    0 ;+ 0 указатель на буфер изображения
	dw  100 ;+ 4 отступ слева
	dw   10 ;+ 6 отступ справа
	dd  150 ;+ 8 ширина
	dd  100 ;+12 высота
	dd 0x80 ;+16 фоновый цвет
	db   24 ;+20 бит на пиксель

lib_init

Эта функция получает указатели на функции работы с памятью, вызыватся должна при загрузке библиотеки. Можете использовать макрос @use_library_mem, для ее автоматической настройки.

buf2d_create

Создает буфер и чистит его фоновым цветом. Пример:

stdcall [buf2d_create], buf_0

где buf_0 - структура буфера. Параметры для создания буфера берутся из структуры.

buf2d_create_f_img

Создает буфер на основе изображения в формате rgb.

buf2d_w equ dword[edi+8] ;ширина буфера
buf2d_h equ dword[edi+12] ;высота буфера
mov edi,buf_i0
mov buf2d_w,320
mov buf2d_h,240
stdcall [buf2d_create_f_img], edi,[open_file_img]

где buf_0 - структура буфера, open_file_img - указатель на данные изображения в формате rgb, 320 - ширина изображения в пикселях, 240 - высота изображения в пикселях.

buf2d_clear

Чистит буфер указаным цветом. Пример:

buf2d_color equ dword[edi+16] ;цвет фона буфера
mov edi,buf_0
stdcall [buf2d_clear], edi, buf2d_color ;очищаем экран фоновым цветом

где buf_0 - структура буфера.

buf2d_draw

Рисует буфер на экране (работает через системную ф. 7). Рисуются только буфера с глубиной цвета 24 бита.

buf2d_delete

Освобождает память занятую изображением буфера.

buf2d_rotate

Поворачивает буфер на 90 или 180 градусов. Пример:

stdcall [buf2d_rotate], buf_0, 90

где buf_0 - структура буфера (может быть 8, 24 или 32 битным); 90 - угол поворота.

buf2d_resize

Изменяет размеры буфера или изображения в буфере. Пока поддерживаются буфера с глубиной цвета 24 бита.
Пример 1:

stdcall [buf2d_resize], buf_0, 0,300, 1 ;изменяем высоту буфера

где buf_0 - структура буфера в котором будет рисоваться линия; 0 - новая ширина буфера (0 означает не изменять размер); 300 - новая высота буфера; 1 - параметр указывающий что изменяются размеры буфера.
Пример 2:

stdcall [buf2d_resize], buf_0, 250,0, 2 ;изменяем изображение в буфере

где 250 - новая ширина буфера; 0 - новая высота буфера (0 означает не изменять размер); 2 - параметр указывающий что изменяем изображение в буфере. Если последний параметр равен 2 то размер буфера остается неизменным и функция работает аналогично так как и функции buf2d_img_hdiv2, buf2d_img_wdiv2. Разница в том, что buf2d_resize может сжимать изображения до заданного размера, а не ровно в 2 раза.

buf2d_line

Рисует в буфере линию с заданным цветом и координатами. Пример:

stdcall [buf2d_line], buf_0, 30,10, 110,70, 0xffff00 ;рисуем линию

где buf_0 - структура буфера в котором будет рисоваться линия; 30, 10, 110, 70 - координаты линии; 0xffff00 - цвет линии.
Для рисования сглаженной линии используйте buf2d_line_sm.

buf2d_line_sm

Рисует в буфере линию принимает такиже параметры как и функция buf2d_line. Данная функция рисует сглаженную линию более красивую чем buf2d_line, но работает медленнее неё за счет вычисления смешанных цветов фона и самой линии.

buf2d_rect_by_size

Рисует прямоугольную рамку, по двум координатам, 2-я координата задана по размеру. Если размеры отрицательные рамка рисуется в обратном направлении.

stdcall [buf2d_rect_by_size], buf_0, 10,10,150,100, 0x8080

где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла (при отрицательных размерах координата правого нижнего); 150, 100 - размер прямоугольника; 0x8080 - цвет линии.

buf2d_filled_rect_by_size

Рисует закрашенный прямоугольник, по двум координатам, 2-я координата задана по размеру. Если размер задать 1*1, то будет нарисована точка размером в 1 пиксель, т.е. размер прямоугольника в пикселях будет равен указанному. Если размеры отрицательные прямоугольник рисуется в обратном направлении.

stdcall [buf2d_rect_by_size], buf_0, 10,10,150,100, 0x8080

где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла (при отрицательных размерах координата правого нижнего); 150, 100 - размер прямоугольника; 0x8080 - цвет прямоуголика.

buf2d_circle

Рисует в буфере окружность с заданным цветом и радиусом. Пример:

stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000

где buf_0 - структура буфера в котором будет рисоваться окружность; 25, 70 - координаты центра; 15 - радиус; 0xff0000 - цвет.

buf2d_img_hdiv2

Сжимает изображение в буфере по высоте в 2 раза, при этом размер самого буфера не уменьшается.

buf2d_img_wdiv2

Сжимает изображение в буфере по ширине в 2 раза, при этом размер самого буфера не уменьшается.

buf2d_conv_24_to_8

Преобразование буфера из 24-битного в 8-битный. При преобразовании указывается какой цвет берать: 0-синий, 1-зеленый, 2-красный. Остальные цвета при преобразовании теряются.

buf2d_conv_24_to_32

Преобразование буфера из 24-битного в 32-битный. При преобразовании указывается также 8-битный буфер, который будет использован для создания альфа канала. Пример:

stdcall [buf2d_conv_24_to_32],buf_a,buf_b ;делаем буфер rgba 32бит

До выполнения функции буфер buf_a должен быть 24 битным, а буфер buf_b - 8 битным. После выполнения функции буфер buf_a станет 32 битным, буфер buf_b не изменится.

buf2d_bit_blt

Рисует в буфере изображение из другого буфера в указанных координатах. Буфер в котором рисут (приемник) должен быть 24 битным, а тот который рисуется (источник) 24 или 32 битным. Если буфер источник 32 битный, то его прозрачность при рисовании не учитывается, для учета прозрачности используется функция buf2d_bit_blt_transp. Пример:

stdcall [buf2d_bit_blt], buf_0, 50,30, buf_1 ;прорисовка среднего скина

где buf_0 - структура буфера в котором будет рисоваться изображение (приемник);
buf_1 - структура буфера с рисуемым изображением (источник);
50,30 - координаты для вывода изображения, определяют положение рисуемой картинки в buf_0.

buf2d_bit_blt_transp

Рисует в буфере изображение из другого буфера в указанных координатах, при этом учитывается прозрачность. Буфер который будет нарисован должен быть 32 битным, а тот в котором рисуют 24 битным.

buf2d_bit_blt_alpha

Рисует в буфере изображение из другого буфера в указанных координатах, при этом учитывается прозрачность. Буфер который будет нарисован должен быть 8 битным, а тот в котором рисуют 24 битным.

buf2d_curve_bezier

Рисует по трем точкам отрезок кривой безье.

stdcall [buf2d_curve_bezier], buf_0, (10 shl 16)+20,(110 shl 16)+10,(50 shl 16)+90, dword 0xff

где buf_0 - структура буфера в котором будет рисоваться кривая; (10 shl 16)+20,(110 shl 16)+10,(50 shl 16)+90 - координаты точек (10,20), (110,10), (50,90); 0xff - цвет прямой.

buf2d_convert_text_matrix

Преобразует матрицу с текстом размером 16*16 в размер 1*256. Необходимо для создания матрицы для рисования текста. Перед использованием данной функции предполагается что есть изображение с полным набором символов размером 16 столбцов на 16 строк, из которого предварительно был создан 8 битный буфер.

stdcall [buf2d_create_f_img], buf_1,[image_data] ;создаем буфер 24 бит на основе данных изображения
stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит
stdcall [buf2d_convert_text_matrix], buf_1

где buf_1 - структура буфера для формирования текстовой матрицы; image_data - данные изображения текстовой матрицы в формате rgb, размером 16*16 символов.

buf2d_draw_text

Рисует текст в буфере, используя матрицу с текстом размером 1*256 символов. Пример:

stdcall [buf2d_draw_text], buf_0, buf_1,some_text,20,10,0x4040ff ;рисуем строку с текстом

где buf_0 - структура буфера в котором будет рисоваться текст; buf_1 - структура буфера с текстовой матрицей в формате 8 бит, размером 1*256 символов; some_text - текст, который будет выведен в буфер buf_0.

buf2d_crop_color

Обрезание буфера, по указанному цвету. Функция используется для уменьшения памяти, занимаемой буфером. Отрезаются крайние части буфера имеющие одинаковый цвет. Пример:

stdcall [buf2d_crop_color], buf_0,0xffffff,BUF2D_OPT_CROP_TOP+BUF2D_OPT_CROP_BOTTOM

где buf_0 - структура буфера который будет обрезан;
0xffffff - цвет по которому будет обрезаться буфер;
BUF2D_OPT_CROP_TOP и BUF2D_OPT_CROP_BOTTOM - константы, указывающие с каких сторон обрезать буфер.

buf2d_offset_h

Сдвиг изображения в буфере по высоте вверх или вниз.

buf2d_flood_fill

Функция для рекурсивной заливки выбранным цветом. Имеется два варианта заливки. Пример:

stdcall [buf2d_flood_fill], buf_0, 100,200, 0, 0xff,0xff0000

где buf_0 - структура буфера;
100,200 - координаты точки, с которой начнется заливка;
0 - параметр, определяет алгоритм заливки (может быть 0 или 1);
0xff - цвет заливки;
0xff0000 - зависит от значения 4-го параметра, 1) если 0 - цвет до которого будет заливаться область; 2) если 1 - цвет области которая будет заливаться;

buf2d_set_pixel

Функция ставит точку, принимает координаты и цвет.

stdcall [buf2d_set_pixel], buf_0, 100,150, 0xff0000

где buf_0 - структура буфера;
100,150 - координаты точки;
0xff0000 - цвет точки.

buf2d_get_pixel

Функция записывает цвет точки в регистр eax, принимает координаты.

stdcall [buf2d_get_pixel], buf_0, 100,150

где buf_0 - структура буфера;
100,150 - координаты точки;
eax - цвет точки (для 8 и 24 битных буферов не используемые старшие биты в eax равны 0) или значение -1 в случае ошибки.

buf2d_flip_v

Отражает изображение в буфере по вертикали (верх и низ меняются местами). Пример:

stdcall buf2d_flip_v, buf_0

где buf_0 - структура 24-х битного буфера.

buf2d_filter_dither

Фильтр, который преобразует изображение из 24 битного буфера в 8-ми цветное. Разрядность буфера не меняется. Пример:

stdcall [buf2d_filter_dither], buf_0, 0

где buf_0 - структура 24-х битного буфера;
0 - алгоритм (возможные значения: 0 - Sierra Lite, 1 - Floyd-Steinberg, 2 - Burkers).

buf2d_vox_brush_create

Создание воксельной кисти. Пример:

stdcall [buf2d_vox_brush_create], buf_vox, vox_6_7_z

.........

align 4
vox_6_7_z: ;данные для создания минимального единичного вокселя
dd 0,0,1,1,0,0,\
   0,2,2,2,2,0,\
   2,2,2,2,2,2,\
   2,3,2,2,3,2,\
   2,3,3,3,3,2,\
   0,3,3,3,3,0,\
   0,0,3,3,0,0

align 4
buf_vox: ;данные для создания набора воксельных кистей
	db 6,7,4,3 ;w,h,h_osn,n
	rb BUF_STRUCT_SIZE*(3+1)

где vox_6_7_z - данные для создания минимального единичного вокселя (0 - означает прозрачный пиксель, другие цифры определяют глубину для заполнения буфера глубины); buf_vox - данные для создания набора воксельных кистей (6 и 7 - размер минимального единичного вокселя, 4 - высота верхнего основания минимального единичного вокселя, 3 - число создаваемых воксельных кистей для рисования вокселей верхних уровней);

buf2d_vox_brush_delete

Удаление воксельной кисти.

buf2d_vox_obj_draw_1g

Рисование воксельного объекта с 1-й гранью.

buf2d_vox_obj_get_img_w_3g

Возврашает ширину воксельного изображения с 3-мя гранями (которое рисуется функцией buf2d_vox_obj_draw_3g), принимает указатель на кисть и масштаб.

buf2d_vox_obj_get_img_h_3g

Возврашает высоту воксельного изображения с 3-мя гранями (которое рисуется функцией buf2d_vox_obj_draw_3g), принимает указатель на кисть и масштаб.

buf2d_vox_obj_draw_3g

Рисование воксельного объекта с 3-мя гранями.

buf2d_vox_obj_draw_3g_scaled

Рисование части воксельного объекта.

buf2d_vox_obj_draw_3g_shadows

Функция рисующая тени для изображений нарисованных с помощью функции buf2d_vox_obj_draw_3g или buf2d_vox_obj_draw_3g_scaled.

buf2d_vox_obj_draw_pl

Функция рисующая срез воксельного обьекта.

buf2d_vox_obj_draw_pl_scaled

Функция рисующая срез части воксельного обьекта.

Константы

BUF2D_OPT_CROP_TOP equ 1

Константа для функции buf2d_crop_color, обозначает обрезку буфера сверху

BUF2D_OPT_CROP_LEFT equ 2

Константа для функции buf2d_crop_color, обозначает обрезку буфера слева

BUF2D_OPT_CROP_BOTTOM equ 4

Константа для функции buf2d_crop_color, обозначает обрезку буфера снизу

BUF2D_OPT_CROP_RIGHT equ 8

Константа для функции buf2d_crop_color, обозначает обрезку буфера справа

Таблица экспорта

Пример таблицы экспорта, расчитанной на использование макроса @use_library_mem:

align 4
import_buf2d_lib:
	dd sz_lib_init
	buf2d_create dd sz_buf2d_create
	buf2d_create_f_img dd sz_buf2d_create_f_img
	buf2d_clear dd sz_buf2d_clear
	buf2d_draw dd sz_buf2d_draw
	buf2d_delete dd sz_buf2d_delete
	buf2d_rotate dd sz_buf2d_rotate
	buf2d_resize dd sz_buf2d_resize
	buf2d_line dd sz_buf2d_line
	buf2d_line_sm dd sz_buf2d_line_sm
	buf2d_rect_by_size dd sz_buf2d_rect_by_size
	buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
	buf2d_circle dd sz_buf2d_circle
	buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
	buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
	buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
	buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
	buf2d_bit_blt dd sz_buf2d_bit_blt
	buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
	buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
	buf2d_curve_bezier dd sz_buf2d_curve_bezier
	buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
	buf2d_draw_text dd sz_buf2d_draw_text
	buf2d_crop_color dd sz_buf2d_crop_color
	buf2d_offset_h dd sz_buf2d_offset_h
	buf2d_flood_fill dd sz_buf2d_flood_fill
	buf2d_set_pixel dd sz_buf2d_set_pixel
	buf2d_get_pixel dd sz_buf2d_get_pixel
	buf2d_flip_h dd sz_buf2d_flip_h
	buf2d_flip_v dd sz_buf2d_flip_v
	buf2d_filter_dither dd sz_buf2d_filter_dither

	;воксельные функции:
	buf2d_vox_brush_create dd sz_buf2d_vox_brush_create
	buf2d_vox_brush_delete dd sz_buf2d_vox_brush_delete
	buf2d_vox_obj_draw_1g dd sz_buf2d_vox_obj_draw_1g
	buf2d_vox_obj_get_img_w_3g dd sz_buf2d_vox_obj_get_img_w_3g
	buf2d_vox_obj_get_img_h_3g dd sz_buf2d_vox_obj_get_img_h_3g
	buf2d_vox_obj_draw_3g dd sz_buf2d_vox_obj_draw_3g
	buf2d_vox_obj_draw_3g_scaled dd sz_buf2d_vox_obj_draw_3g_scaled
	buf2d_vox_obj_draw_3g_shadows dd sz_buf2d_vox_obj_draw_3g_shadows
	buf2d_vox_obj_draw_pl dd sz_buf2d_vox_obj_draw_pl
	buf2d_vox_obj_draw_pl_scaled dd sz_buf2d_vox_obj_draw_pl_scaled

	dd 0,0
	sz_lib_init db 'lib_init',0
	sz_buf2d_create db 'buf2d_create',0
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
	sz_buf2d_clear db 'buf2d_clear',0
	sz_buf2d_draw db 'buf2d_draw',0
	sz_buf2d_delete db 'buf2d_delete',0
	sz_buf2d_rotate db 'buf2d_rotate',0
	sz_buf2d_resize db 'buf2d_resize',0
	sz_buf2d_line db 'buf2d_line',0
	sz_buf2d_line_sm db 'buf2d_line_sm',0
	sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
	sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
	sz_buf2d_circle db 'buf2d_circle',0
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
	sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
	sz_buf2d_draw_text db 'buf2d_draw_text',0
	sz_buf2d_crop_color db 'buf2d_crop_color',0
	sz_buf2d_offset_h db 'buf2d_offset_h',0
	sz_buf2d_flood_fill db 'buf2d_flood_fill',0
	sz_buf2d_set_pixel db 'buf2d_set_pixel',0
	sz_buf2d_get_pixel db 'buf2d_get_pixel',0
	sz_buf2d_flip_h db 'buf2d_flip_h',0
	sz_buf2d_flip_v db 'buf2d_flip_v',0
	sz_buf2d_filter_dither db 'buf2d_filter_dither',0

	;воксельные функции:
	sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0
	sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0
	sz_buf2d_vox_obj_draw_1g db 'buf2d_vox_obj_draw_1g',0
	sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0
	sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0
	sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0
	sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0
	sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0
	sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0
	sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0