Subversion Repositories Kolibri OS

Rev

Rev 2383 | Rev 2759 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1535 IgorA 1
2
3
библиотека для работы с 2d буферами
4
5
45
46
 
47
48
 
49

Оглавление

50
    51
  • Вступление
  • 52
  • Форматы буферов
  • 53
  • Функции
  • 54
  • Константы
  • 55
  • Таблица экспорта
  • 56
  • История
  • 57
    58
     
    59

    Вступление

    60

    Документация к свободной библиотеке buf2d.asm, для ОС Колибри.

    61
     Эта библиотека создана для работы с 2d изображениями.
    1648 IgorA 62
     С ее помощью можно создавать буфера с изображениями в памяти, и при необходимости выводить их на экран.
    1535 IgorA 63
     Изображения можно накладывать одно на другое, поддерживается работа с прозрачными изображениями, есть функция рисования лини пока на этом все.

    64
     
    2658 IgorA 65

    Последнее обновление библиотеки 11.05.12.

    1535 IgorA 66
     
    67

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

    68

    Поддерживается 3 формата буферов.

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

    70
     
    71

    8 бит

    72

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

    73

    24 бит

    74

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

    75

    32 бит

    76

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

    77
     
    78

    Функции

    79
     
    80

    Почти все функции 1-м параметром принимают указатель на структуру буфера,

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

    83
    align 4
    84
    buf_0:
    85
    	dd    0 ;+ 0 указатель на буфер изображения
    86
    	dw  100 ;+ 4 отступ слева
    87
    	dw   10 ;+ 6 отступ справа
    88
    	dd  150 ;+ 8 ширина
    89
    	dd  100 ;+12 высота
    90
    	dd 0x80 ;+16 фоновый цвет
    91
    	db   24 ;+20 бит на пиксель
    92
     
    93

    lib_init

    94

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

    95
     
    96

    buf2d_create

    97

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

    98
     
    99

    buf2d_create_f_img

    100

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

    101
     
    102

    buf2d_clear

    2230 IgorA 103

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

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

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

    1535 IgorA 108
     
    109

    buf2d_draw

    110

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

    111
     
    112

    buf2d_delete

    113

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

    114
     
    2136 IgorA 115

    buf2d_resize

    116

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

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

    где buf_0 - структура буфера в котором будет рисоваться линия; 0 - новая ширина буфера (0 означает не изменять размер); 300 - новая высота буфера.

    119
     
    1535 IgorA 120

    buf2d_line

    1648 IgorA 121

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

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

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

    2230 IgorA 124

    Для рисования сглаженной линии используйте buf2d_line_sm.

    1535 IgorA 125
     
    2230 IgorA 126

    buf2d_line_sm

    127

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

    128
     
    1634 IgorA 129

    buf2d_rect_by_size

    2358 IgorA 130

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

    1634 IgorA 131
    stdcall [buf2d_rect_by_size], buf_0, 10,10,150,100, 0x8080
    2358 IgorA 132

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

    1634 IgorA 133
     
    1642 IgorA 134

    buf2d_filled_rect_by_size

    2358 IgorA 135

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

    1642 IgorA 136
    stdcall [buf2d_rect_by_size], buf_0, 10,10,150,100, 0x8080
    2358 IgorA 137

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

    1642 IgorA 138
     
    1535 IgorA 139

    buf2d_circle

    1648 IgorA 140

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

    1535 IgorA 141
    stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000
    142

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

    143
     
    144

    buf2d_img_hdiv2

    145

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

    146
     
    147

    buf2d_img_wdiv2

    148

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

    149
     
    150

    buf2d_conv_24_to_8

    151

    Преобразование буфера из 24-битного в 8-битный.

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

    154
     
    155

    buf2d_conv_24_to_32

    156

    Преобразование буфера из 24-битного в 32-битный.

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

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

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

    160
     После выполнения функции буфер buf_a станет 32 битным, буфер buf_b не изменится.

    161
     
    162

    buf2d_bit_blt

    1648 IgorA 163

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

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

    где buf_0 - структура буфера в котором будет рисоваться изображение (приемник);

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

    1535 IgorA 168
     
    169

    buf2d_bit_blt_transp

    170

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

    171
     Буфер который будет нарисован должен быть 32 битным, а тот в котором рисуют 24 битным.

    172
     
    173

    buf2d_bit_blt_alpha

    174

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

    175
     Буфер который будет нарисован должен быть 8 битным, а тот в котором рисуют 24 битным.

    176
     
    1727 IgorA 177

    buf2d_curve_bezier

    1535 IgorA 178

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

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

    где buf_0 - структура буфера в котором будет рисоваться кривая;

    181
      (10 shl 16)+20,(110 shl 16)+10,(50 shl 16)+90 - координаты точек (10,20), (110,10), (50,90);
    182
      0xff - цвет прямой.

    1535 IgorA 183
     
    184

    buf2d_convert_text_matrix

    185

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

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

    где buf_1 - структура буфера для формирования текстовой матрицы;

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

    191
     
    192

    buf2d_draw_text

    193

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

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

    где buf_0 - структура буфера в котором будет рисоваться текст;

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

    198
     
    199

    buf2d_crop_color

    200

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

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

    где buf_0 - структура буфера который будет обрезан;

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

    205
     
    206

    buf2d_offset_h

    207

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

    208
     
    1684 IgorA 209

    buf2d_flood_fill

    2358 IgorA 210

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

    1684 IgorA 211
    stdcall [buf2d_flood_fill], buf_0, 100,200, 0, 0xff,0xff0000
    212

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

    213
      100,200 - координаты точки, с которой начнется заливка;
    214
     
    215
      0xff - цвет заливки;

    216
      0xff0000 - зависит от значения 4-го параметра, 1) если 0 - цвет до которого будет заливаться область; 2) если 1 - цвет области которая будет заливатся;

    217
     
    1910 IgorA 218

    buf2d_set_pixel

    2658 IgorA 219

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

    1910 IgorA 220
    stdcall [buf2d_set_pixel], buf_0, 100,150, 0xff0000
    2658 IgorA 221

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

    222

    100,150 - координаты точки;

    223

    0xff0000 - цвет точки.

    1910 IgorA 224
     
    2658 IgorA 225

    buf2d_get_pixel

    226

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

    227
    stdcall [buf2d_get_pixel], buf_0, 100,150
    228

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

    229

    100,150 - координаты точки;

    230

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

    231
     
    1535 IgorA 232

    Константы

    233

    BUF2D_OPT_CROP_TOP equ 1

    234

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

    1538 IgorA 235

    BUF2D_OPT_CROP_LEFT equ 2

    236

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

    1535 IgorA 237

    BUF2D_OPT_CROP_BOTTOM equ 4

    238

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

    239

    BUF2D_OPT_CROP_RIGHT equ 8

    240

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

    241
     
    242

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

    243

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

    244
    align 4
    245
    import_buf2d_lib:
    246
    	dd sz_lib_init
    247
    	buf2d_create dd sz_buf2d_create
    248
    	buf2d_create_f_img dd sz_buf2d_create_f_img
    249
    	buf2d_clear dd sz_buf2d_clear
    250
    	buf2d_draw dd sz_buf2d_draw
    251
    	buf2d_delete dd sz_buf2d_delete
    2136 IgorA 252
    	buf2d_resize dd sz_buf2d_resize
    1535 IgorA 253
    	buf2d_line dd sz_buf2d_line
    2230 IgorA 254
    	buf2d_line_sm dd sz_buf2d_line_sm
    1634 IgorA 255
    	buf2d_rect_by_size dd sz_buf2d_rect_by_size
    1642 IgorA 256
    	buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
    1535 IgorA 257
    	buf2d_circle dd sz_buf2d_circle
    258
    	buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
    259
    	buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
    260
    	buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
    261
    	buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
    262
    	buf2d_bit_blt dd sz_buf2d_bit_blt
    263
    	buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
    264
    	buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
    1727 IgorA 265
    	buf2d_curve_bezier dd sz_buf2d_curve_bezier
    1535 IgorA 266
    	buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
    267
    	buf2d_draw_text dd sz_buf2d_draw_text
    268
    	buf2d_crop_color dd sz_buf2d_crop_color
    269
    	buf2d_offset_h dd sz_buf2d_offset_h
    1684 IgorA 270
    	buf2d_flood_fill dd sz_buf2d_flood_fill
    1910 IgorA 271
    	buf2d_set_pixel dd sz_buf2d_set_pixel
    2658 IgorA 272
    	buf2d_get_pixel dd sz_buf2d_get_pixel
    1535 IgorA 273
     
    274
    	dd 0,0
    275
    	sz_lib_init db 'lib_init',0
    276
    	sz_buf2d_create db 'buf2d_create',0
    277
    	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
    278
    	sz_buf2d_clear db 'buf2d_clear',0
    279
    	sz_buf2d_draw db 'buf2d_draw',0
    280
    	sz_buf2d_delete db 'buf2d_delete',0
    2136 IgorA 281
    	sz_buf2d_resize db 'buf2d_resize',0
    1535 IgorA 282
    	sz_buf2d_line db 'buf2d_line',0
    2230 IgorA 283
    	sz_buf2d_line_sm db 'buf2d_line_sm',0
    1634 IgorA 284
    	sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
    1642 IgorA 285
    	sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
    1535 IgorA 286
    	sz_buf2d_circle db 'buf2d_circle',0
    287
    	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
    288
    	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
    289
    	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
    290
    	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
    291
    	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
    292
    	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
    293
    	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
    1727 IgorA 294
    	sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
    1535 IgorA 295
    	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
    296
    	sz_buf2d_draw_text db 'buf2d_draw_text',0
    297
    	sz_buf2d_crop_color db 'buf2d_crop_color',0
    1684 IgorA 298
    	sz_buf2d_offset_h db 'buf2d_offset_h',0
    1910 IgorA 299
    	sz_buf2d_flood_fill db 'buf2d_flood_fill',0
    2658 IgorA 300
    	sz_buf2d_set_pixel db 'buf2d_set_pixel',0
    301
    	sz_buf2d_get_pixel db 'buf2d_get_pixel',0
    1535 IgorA 302
     
    303

    История

    304

    02.07.10 - самая первая версия библиотеки, 2 примера использования.

    305

    06.07.10 - расширены возможности функции buf2d_bit_blt, теперь она может рисовать 32 битные буферы. Добавлены 2 новые функции: buf2d_bit_blt_alpha и buf2d_cruve_bezier. Небольшие изменения в функции buf2d_line.

    306

    16.07.10 - исправлено по 2 ошибки в функциях buf2d_img_hdiv2 и buf2d_img_wdiv2, которые могли проявляться при определенных условиях (если размер изображения был кратен 4Кб и др.). Добавлены 2 функции для вывода текста в буфер buf2d_convert_text_matrix и buf2d_draw_text.

    307

    19.07.10 - добавлена функция рисования окружности buf2d_circle;

    308
     изменен формат буфера - для ширины и высоты используются 4-х байтные числа вместо 2-х байтных.

    309

    29.07.10 - добавлены функции buf2d_crop_color и buf2d_offset_h;

    310
     исправления в функции buf2d_delete.

    1634 IgorA 311

    30.09.10 - добавлена функция buf2d_rect_by_size.

    1642 IgorA 312

    04.10.10 - добавлена функция buf2d_filled_rect_by_size, доработана функция buf_bit_blt_alpha.

    1648 IgorA 313

    07.10.10 - доработана функция buf_bit_blt (при попытке нарисовать изображение за пределами правого края буфера приложение вызвавшее функцию падало).

    1653 IgorA 314

    11.10.10 - исправлено задание цветов в некоторых функциях, красный и синий цвета поменял местами. Теперь цвета совпадают с сисемными функциями.

    1684 IgorA 315

    02.11.10 - добавлена функция buf2d_flood_fill.

    1727 IgorA 316

    22.12.10 - изменено имя функции buf2d_cruve_bezier на buf2d_curve_bezier.

    2230 IgorA 317

    25.03.11 - добавлена функция для рисования точки buf2d_set_pixel.

    2136 IgorA 318

    30.08.11 - добавлена функция изменения размеров буфера buf2d_resize.

    2383 IgorA 319

    13.09.11 - оптимизирована работа функций buf2d_filled_rect_by_size buf2d_rect_by_size, добавлены примеры использования библиотеки.

    2358 IgorA 320

    22.09.11 - добавлена функция buf2d_line_sm для рисования сглаженной линии.

    2383 IgorA 321

    20.02.12 - функции buf2d_filled_rect_by_size и buf2d_rect_by_size могут принимать отрицательные размеры для прямоугольников, в функции buf2d_line горизонтальная линия рисуется на 1 пиксель длинее (раньше не дорисовывало), некоторые функции могут рисовать в 8 битных буферах.

    2658 IgorA 322

    23.02.12 - функция buf2d_bit_blt_alpha может принимать отрицательные координаты в позиции копируемого буфера, небольшие доработки в buf2d_bit_blt_transp

    323

    11.05.12 - добавлена функция для взятия цвета точки buf2d_get_pixel, доработки в buf2d_set_pixel.

    2383 IgorA 324
    1535 IgorA 325