Buf2d/ru

From KolibriOS wiki
Jump to navigation Jump to search

Вступление

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

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

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

  • 8 бит

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

  • 24 бит

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

  • 32 бит

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

Функции

Почти все функции 1-м параметром принимают указатель на структуру буфера, из которой могут использоваться параметры, нужные для работы конкретной функции. Пример структуры буфера изображения: <syntaxhighlight lang="asm">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 бит на пиксель</syntaxhighlight>

lib_init

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

buf2d_create

Создает буфер и чистит его фоновым цветом. Пример: <syntaxhighlight lang="asm">stdcall [buf2d_create], buf_0</syntaxhighlight> где buf_0 - структура буфера. Параметры для создания буфера берутся из структуры.

buf2d_create_f_img

Создает буфер на основе изображения в формате rgb. <syntaxhighlight lang="asm">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]</syntaxhighlight> где buf_0 - структура буфера, open_file_img - указатель на данные изображения в формате rgb, 320 - ширина изображения в пикселях, 240 - высота изображения в пикселях.

buf2d_clear

Чистит буфер указаным цветом. Пример: <syntaxhighlight lang="asm">buf2d_color equ dword[edi+16] ;цвет фона буфера mov edi,buf_0 stdcall [buf2d_clear], edi, buf2d_color ;очищаем экран фоновым цветом</syntaxhighlight> где buf_0 - структура буфера.

buf2d_draw

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

buf2d_delete

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

buf2d_rotate

Поворачивает буфер на 90 или 180 градусов. Пример: <syntaxhighlight lang="asm">stdcall [buf2d_rotate], buf_0, 90</syntaxhighlight> где buf_0 - структура буфера (может быть 8, 24 или 32 битным); 90 - угол поворота.

buf2d_resize

Изменяет размеры буфера или изображения в буфере. Пока поддерживаются буфера с глубиной цвета 24 бита.
Пример 1: <syntaxhighlight lang="asm">stdcall [buf2d_resize], buf_0, 0,300, 1 ;изменяем высоту буфера</syntaxhighlight> где buf_0 - структура буфера в котором будет рисоваться линия; 0 - новая ширина буфера (0 означает не изменять размер); 300 - новая высота буфера; 1 - параметр указывающий что изменяются размеры буфера.
Пример 2: <syntaxhighlight lang="asm">stdcall [buf2d_resize], buf_0, 250,0, 2 ;изменяем изображение в буфере</syntaxhighlight> где 250 - новая ширина буфера; 0 - новая высота буфера (0 означает не изменять размер); 2 - параметр указывающий что изменяем изображение в буфере. Если последний параметр равен 2 то размер буфера остается неизменным и функция работает аналогично так как и функции buf2d_img_hdiv2, buf2d_img_wdiv2. Разница в том, что buf2d_resize может сжимать изображения до заданного размера, а не ровно в 2 раза.

buf2d_line

Рисует в буфере линию с заданным цветом и координатами. Пример: <syntaxhighlight lang="asm">stdcall [buf2d_line], buf_0, 30,10, 110,70, 0xffff00 ;рисуем линию</syntaxhighlight> где buf_0 - структура буфера в котором будет рисоваться линия; 30, 10, 110, 70 - координаты линии; 0xffff00 - цвет линии.
Для рисования сглаженной линии используйте buf2d_line_sm.

buf2d_line_sm

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

buf2d_rect_by_size

Рисует прямоугольную рамку, по двум координатам, 2-я координата задана по размеру. Если размеры отрицательные рамка рисуется в обратном направлении. <syntaxhighlight lang="asm">stdcall [buf2d_rect_by_size], buf_0, 10,10,150,100, 0x8080</syntaxhighlight> где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла (при отрицательных размерах координата правого нижнего); 150, 100 - размер прямоугольника; 0x8080 - цвет линии.

buf2d_filled_rect_by_size

Рисует закрашенный прямоугольник, по двум координатам, 2-я координата задана по размеру. Если размер задать 1*1, то будет нарисована точка размером в 1 пиксель, т.е. размер прямоугольника в пикселях будет равен указанному. Если размеры отрицательные прямоугольник рисуется в обратном направлении. <syntaxhighlight lang="asm">stdcall [buf2d_rect_by_size], buf_0, 10,10,150,100, 0x8080</syntaxhighlight> где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла (при отрицательных размерах координата правого нижнего); 150, 100 - размер прямоугольника; 0x8080 - цвет прямоуголика.

buf2d_circle

Рисует в буфере окружность с заданным цветом и радиусом. Пример: <syntaxhighlight lang="asm">stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000</syntaxhighlight> где 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-битный буфер, который будет использован для создания альфа канала. Пример: <syntaxhighlight lang="asm">stdcall [buf2d_conv_24_to_32],buf_a,buf_b ;делаем буфер rgba 32бит</syntaxhighlight> До выполнения функции буфер buf_a должен быть 24 битным, а буфер buf_b - 8 битным. После выполнения функции буфер buf_a станет 32 битным, буфер buf_b не изменится.

buf2d_bit_blt

Рисует в буфере изображение из другого буфера в указанных координатах. Буфер в котором рисут (приемник) должен быть 24 битным, а тот который рисуется (источник) 24 или 32 битным. Если буфер источник 32 битный, то его прозрачность при рисовании не учитывается, для учета прозрачности используется функция buf2d_bit_blt_transp. Пример: <syntaxhighlight lang="asm">stdcall [buf2d_bit_blt], buf_0, 50,30, buf_1 ;прорисовка среднего скина</syntaxhighlight> где buf_0 - структура буфера в котором будет рисоваться изображение (приемник);
buf_1 - структура буфера с рисуемым изображением (источник);
50,30 - координаты для вывода изображения, определяют положение рисуемой картинки в buf_0.

buf2d_bit_blt_transp

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

buf2d_bit_blt_alpha

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

buf2d_curve_bezier

Рисует по трем точкам отрезок кривой безье. <syntaxhighlight lang="asm">stdcall [buf2d_curve_bezier], buf_0, (10 shl 16)+20,(110 shl 16)+10,(50 shl 16)+90, dword 0xff</syntaxhighlight> где 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 битный буфер. <syntaxhighlight lang="asm">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</syntaxhighlight> где buf_1 - структура буфера для формирования текстовой матрицы; image_data - данные изображения текстовой матрицы в формате rgb, размером 16*16 символов.

buf2d_draw_text

Рисует текст в буфере, используя матрицу с текстом размером 1*256 символов. Пример: <syntaxhighlight lang="asm">stdcall [buf2d_draw_text], buf_0, buf_1,some_text,20,10,0x4040ff ;рисуем строку с текстом</syntaxhighlight> где buf_0 - структура буфера в котором будет рисоваться текст; buf_1 - структура буфера с текстовой матрицей в формате 8 бит, размером 1*256 символов; some_text - текст, который будет выведен в буфер buf_0.

buf2d_crop_color

Обрезание буфера, по указанному цвету. Функция используется для уменьшения памяти, занимаемой буфером. Отрезаются крайние части буфера имеющие одинаковый цвет. Пример: <syntaxhighlight lang="asm">stdcall [buf2d_crop_color], buf_0,0xffffff,BUF2D_OPT_CROP_TOP+BUF2D_OPT_CROP_BOTTOM</syntaxhighlight> где buf_0 - структура буфера который будет обрезан;
0xffffff - цвет по которому будет обрезаться буфер;
BUF2D_OPT_CROP_TOP и BUF2D_OPT_CROP_BOTTOM - константы, указывающие с каких сторон обрезать буфер.

buf2d_offset_h

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

buf2d_flood_fill

Функция для рекурсивной заливки выбранным цветом. Имеется два варианта заливки. Пример: <syntaxhighlight lang="asm">stdcall [buf2d_flood_fill], buf_0, 100,200, 0, 0xff,0xff0000</syntaxhighlight> где buf_0 - структура буфера;
100,200 - координаты точки, с которой начнется заливка;
0 - параметр, определяет алгоритм заливки (может быть 0 или 1);
0xff - цвет заливки;
0xff0000 - зависит от значения 4-го параметра, 1) если 0 - цвет до которого будет заливаться область; 2) если 1 - цвет области которая будет заливаться;

buf2d_set_pixel

Функция ставит точку, принимает координаты и цвет. <syntaxhighlight lang="asm">stdcall [buf2d_set_pixel], buf_0, 100,150, 0xff0000</syntaxhighlight> где buf_0 - структура буфера;
100,150 - координаты точки;
0xff0000 - цвет точки.

buf2d_get_pixel

Функция записывает цвет точки в регистр eax, принимает координаты. <syntaxhighlight lang="asm">stdcall [buf2d_get_pixel], buf_0, 100,150</syntaxhighlight> где buf_0 - структура буфера;
100,150 - координаты точки;
eax - цвет точки (для 8 и 24 битных буферов не используемые старшие биты в eax равны 0) или значение -1 в случае ошибки.

buf2d_flip_v

Отражает изображение в буфере по вертикали (верх и низ меняются местами). Пример: <syntaxhighlight lang="asm">stdcall buf2d_flip_v, buf_0</syntaxhighlight> где buf_0 - структура 24-х битного буфера.

buf2d_filter_dither

Фильтр, который преобразует изображение из 24 битного буфера в 8-ми цветное. Разрядность буфера не меняется. Пример: <syntaxhighlight lang="asm">stdcall [buf2d_filter_dither], buf_0, 0</syntaxhighlight> где buf_0 - структура 24-х битного буфера;
0 - алгоритм (возможные значения: 0 - Sierra Lite, 1 - Floyd-Steinberg, 2 - Burkers).

buf2d_vox_brush_create

Создание воксельной кисти. Пример: <syntaxhighlight lang="asm">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)</syntaxhighlight> где 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

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

Константы

<syntaxhighlight lang="asm">BUF2D_OPT_CROP_TOP equ 1</syntaxhighlight> Константа для функции buf2d_crop_color, обозначает обрезку буфера сверху <syntaxhighlight lang="asm">BUF2D_OPT_CROP_LEFT equ 2</syntaxhighlight> Константа для функции buf2d_crop_color, обозначает обрезку буфера слева <syntaxhighlight lang="asm">BUF2D_OPT_CROP_BOTTOM equ 4</syntaxhighlight> Константа для функции buf2d_crop_color, обозначает обрезку буфера снизу <syntaxhighlight lang="asm">BUF2D_OPT_CROP_RIGHT equ 8</syntaxhighlight> Константа для функции buf2d_crop_color, обозначает обрезку буфера справа

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

Пример таблицы экспорта, расчитанной на использование макроса @use_library_mem: <syntaxhighlight lang="asm">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</syntaxhighlight>