Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1535 IgorA 1
format MS COFF
2
public EXPORTS
3
section '.flat' code readable align 16
4
 
5
include '../../../../macros.inc'
6
include '../../../../proc32.inc'
7
 
8
;-----------------------------------------------------------------------------
9
mem.alloc   dd ? ;функция для выделения памяти
10
mem.free    dd ? ;функция для освобождения памяти
11
mem.realloc dd ? ;функция для перераспределения памяти
12
dll.load    dd ?
13
 
14
BUF_STRUCT_SIZE equ 21
15
buf2d_data equ dword[edi] ;данные буфера изображения
16
buf2d_w equ dword[edi+8] ;ширина буфера
17
buf2d_h equ dword[edi+12] ;высота буфера
1538 IgorA 18
buf2d_l equ word[edi+4]
1535 IgorA 19
buf2d_t equ word[edi+6] ;отступ сверху
20
buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера
21
buf2d_color equ dword[edi+16] ;цвет фона буфера
22
buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения
23
 
24
struct buf_2d_header
25
	img_data dd ?
26
	left dw ? ;+4 left
27
	top dw ? ;+6 top
28
	size_x dd ? ;+8 w
29
	size_y dd ? ;+12 h
30
	color dd ? ;+16 color
31
	bit_pp db ? ;+21 bit in pixel
32
ends
33
 
34
macro swap v1, v2 {
35
  push v1
36
  push v2
37
  pop v1
38
  pop v2
39
}
40
 
41
;флаги, для функции обрезания буфера
42
BUF2D_OPT_CROP_TOP equ 1 ;обрезка сверху
43
BUF2D_OPT_CROP_LEFT equ 2 ;обрезка слева
44
BUF2D_OPT_CROP_BOTTOM equ 4 ;обрезка снизу
45
BUF2D_OPT_CROP_RIGHT equ 8 ;обрезка справа
46
BUF2D_BIT_OPT_CROP_TOP equ 0
47
BUF2D_BIT_OPT_CROP_LEFT equ 1
48
BUF2D_BIT_OPT_CROP_BOTTOM equ 2
49
BUF2D_BIT_OPT_CROP_RIGHT equ 3
50
 
51
;input:
52
; eax = указатель на функцию выделения памяти
53
; ebx = ... освобождения памяти
54
; ecx = ... перераспределения памяти
55
; edx = ... загрузки библиотеки (пока не используется)
56
align 16
57
lib_init:
58
	mov dword[mem.alloc], eax
59
	mov dword[mem.free], ebx
60
	mov dword[mem.realloc], ecx
61
	mov dword[dll.load], edx
62
	ret
63
 
6175 IgorA 64
include 'fun_draw.inc' ;функции рисования в буфере
1535 IgorA 65
 
66
;создание буфера
67
align 4
68
proc buf_create, buf_struc:dword
69
	pushad
70
	mov edi,dword[buf_struc]
71
	mov ecx,buf2d_w
72
	mov ebx,buf2d_h
73
	imul ecx,ebx
74
	cmp buf2d_bits,24
75
	jne @f
76
		lea ecx,[ecx+ecx*2] ; 24 bit = 3
77
		;;;inc ecx ;запасной байт в конце буфера, что-бы не глючили некоторые функции на изображениях кратных 4К
78
	@@:
79
	cmp buf2d_bits,32
80
	jne @f
81
		shl ecx,2 ; 32 bit = 4
82
	@@:
83
	invoke mem.alloc,ecx
84
	mov buf2d_data,eax
85
 
86
	stdcall buf_clear,edi,buf2d_color ;очистка буфера фоновым цветом
87
	popad
88
	ret
89
endp
90
 
91
;создание буфера на основе изображения rgb
92
align 4
93
proc buf_create_f_img, buf_struc:dword, rgb_data:dword
94
	pushad
95
	mov edi,dword[buf_struc]
96
	mov ecx,buf2d_w
6210 IgorA 97
	cmp ecx,1
98
	jl .end_create
1535 IgorA 99
	mov ebx,buf2d_h
6210 IgorA 100
	cmp ebx,1
101
	jl .end_create
1535 IgorA 102
	imul ecx,ebx
103
	cmp buf2d_bits,24
104
	jne @f
105
		lea ecx,[ecx+ecx*2] ; 24 bit = 3
106
	@@:
107
	cmp buf2d_bits,32
108
	jne @f
109
		shl ecx,2 ; 32 bit = 4
110
	@@:
111
	invoke mem.alloc,ecx
112
	mov buf2d_data,eax
113
 
114
	cmp buf2d_bits,24
115
	jne @f
116
		cld
117
		mov esi,[rgb_data]
118
		mov edi,eax ;eax=buf2d_data
119
		rep movsb ;копируем биты изображения в буфер
120
		jmp .end_create
121
	@@:
122
		stdcall buf_clear,edi,buf2d_color ;очистка буфера фоновым цветом
6210 IgorA 123
		jmp .end_create
124
	.error:
125
		stdcall print_err,sz_buf2d_create_f_img,txt_err_size_0
1535 IgorA 126
	.end_create:
127
	popad
128
	ret
129
endp
130
 
1538 IgorA 131
;функция для обрезания буферов 8 и 24 битных, по заданому цвету.
132
;параметр opt задается комбинацией констант:
133
; BUF2D_OPT_CROP_TOP - обрезка сверху
134
; BUF2D_OPT_CROP_LEFT - обрезка слева
135
; BUF2D_OPT_CROP_BOTTOM - обрезка снизу
136
; BUF2D_OPT_CROP_RIGHT - обрезка справа
1535 IgorA 137
align 4
1538 IgorA 138
proc buf_crop_color, buf_struc:dword, color:dword, opt:dword
1535 IgorA 139
locals
140
	crop_r dd ?
141
endl
142
	pushad
143
	mov edi,dword[buf_struc]
144
	cmp buf2d_bits,24
145
	jne .24end_f
146
 
147
	bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM
148
	jae .24no_crop_bottom
149
		mov eax,dword[color]
150
		mov edx,eax ;ax = colors - r,g
151
		shr edx,16 ;dl = color - b
152
		mov ecx,buf2d_h
1555 IgorA 153
		cmp ecx,1
154
		jle .24no_crop_bottom ;проверяем на случай если высота буфера 1 пиксель
1535 IgorA 155
		mov ebx,buf2d_w
156
		imul ecx,ebx
157
		lea esi,[ecx+ecx*2] ;esi=3*ecx
158
		add esi,buf2d_data
159
		cld
160
		@@:
161
			sub esi,3
162
			cmp word[esi],ax
163
			jne @f
164
			cmp byte[esi+2],dl
165
			jne @f
166
			loop @b
167
		@@:
168
		lea ebx,[ebx+ebx*2]
169
		xor edx,edx
170
		mov eax,buf2d_h
171
		imul eax,ebx
172
		add eax,buf2d_data ;eax - указатель на конец буфера изображения
173
		@@:
174
			add esi,ebx
175
			cmp esi,eax
176
			jge @f
177
			inc edx ;вычисляем число полных строк для обрезания
178
			loop @b
179
		@@:
180
		cmp edx,0
181
		je .24no_crop_bottom
182
			cmp edx,buf2d_h
183
			jge .24no_crop_bottom ;что-бы не получить пустой буфер
184
			sub buf2d_h,edx ;уменьшаем высоту буфера
185
			mov ecx,buf2d_h
186
			imul ecx,ebx ;ecx = новый размер изображения
187
			invoke mem.realloc,buf2d_data,ecx
188
			mov buf2d_data,eax ;на случай если изменился указатель на данные
189
	.24no_crop_bottom:
190
 
191
	bt dword[opt],BUF2D_BIT_OPT_CROP_TOP
192
	jae .24no_crop_top
193
		mov eax,dword[color]
194
		mov edx,eax ;ax = colors - r,g
195
		shr edx,16 ;dl = color - b
196
		mov esi,buf2d_data
197
		mov ecx,buf2d_h
1555 IgorA 198
		cmp ecx,1
199
		jle .24no_crop_top ;проверяем на случай если высота буфера 1 пиксель
1535 IgorA 200
		dec ecx ;при обрезании должна остаться минимум 1-на строка пикселей
201
		mov ebx,buf2d_w
202
		imul ecx,ebx
203
		cld
204
		@@:
205
			cmp word[esi],ax
206
			jne @f
207
			cmp byte[esi+2],dl
208
			jne @f
209
			add esi,3
210
			loop @b
211
		@@:
212
		lea ebx,[ebx+ebx*2]
213
		xor edx,edx
214
		@@:
215
			sub esi,ebx
216
			cmp esi,buf2d_data
217
			jl @f
218
			inc edx ;вычисляем число полных строк для обрезания
219
			loop @b
220
		@@:
221
		cmp edx,0
222
		je .24no_crop_top
223
			xor eax,eax
224
			sub eax,edx
225
			mov ebx,buf2d_h
226
			sub ebx,edx
227
			stdcall buf_offset_h, edi, eax, edx, ebx ;сдвигаем изображение в буфере вверх (eax<0)
228
			sub buf2d_h,edx ;уменьшаем высоту буфера
229
			mov ecx,buf2d_h
230
			add buf2d_t,dx ;сдвигаем отступ вниз, на число обрезанных строк
231
			mov ebx,buf2d_w
232
			imul ecx,ebx
233
			lea ecx,[ecx+ecx*2]
234
			invoke mem.realloc,buf2d_data,ecx
235
			mov buf2d_data,eax ;на случай если изменился указатель на данные
236
	.24no_crop_top:
237
 
238
	bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT
239
	jae .24no_crop_right
240
		mov eax,dword[color]
241
		mov edx,eax ;ax = colors - r,g
242
		shr edx,16 ;dl = color - b
243
		mov ebx,buf2d_w
1555 IgorA 244
		cmp ebx,1
245
		jle .24no_crop_right ;на случай если ширина буфера 1 пиксель
1535 IgorA 246
		lea ebx,[ebx+ebx*2]
247
		mov esi,ebx
248
		imul esi,buf2d_h
249
		add esi,buf2d_data ;esi - указатель на конец буфера изображения
250
		mov dword[crop_r],0
251
		cld
1538 IgorA 252
		.24found_beg_right:
1535 IgorA 253
		sub esi,3 ;двигаемся на 1-ну колонку влево
254
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
255
		@@:
256
			cmp word[esi],ax
1538 IgorA 257
			jne .24found_right
1535 IgorA 258
			cmp byte[esi+2],dl
1538 IgorA 259
			jne .24found_right
1535 IgorA 260
			sub esi,ebx ;прыгаем на верхнюю строку
261
			loop @b
262
		inc dword[crop_r]
263
 
264
		mov ecx,buf2d_w
265
		dec ecx ;1 колонка на запас
266
		cmp dword[crop_r],ecx
1538 IgorA 267
		jge .24found_right
1535 IgorA 268
 
269
		sub esi,3 ;двигаемся на 1-ну колонку влево
270
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
271
		@@:
272
			add esi,ebx ;прыгаем на нижнюю строку
273
			cmp word[esi],ax
1538 IgorA 274
			jne .24found_right
1535 IgorA 275
			cmp byte[esi+2],dl
1538 IgorA 276
			jne .24found_right
1535 IgorA 277
			loop @b
278
		inc dword[crop_r]
279
 
280
		mov ecx,buf2d_w
281
		dec ecx ;1 колонка на запас
282
		cmp dword[crop_r],ecx
1538 IgorA 283
		jl .24found_beg_right
1535 IgorA 284
 
1538 IgorA 285
		.24found_right:
1535 IgorA 286
		cmp dword[crop_r],0
287
		je .24no_crop_right
288
			mov ecx,buf2d_w
289
			sub ecx,dword[crop_r]
1538 IgorA 290
			stdcall img_rgb_crop_r, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру
1535 IgorA 291
			mov buf2d_w,ecx ;ставим новую ширину для буфера
292
			mov ebx,buf2d_h
293
			imul ecx,ebx
294
			lea ecx,[ecx+ecx*2]
295
			invoke mem.realloc,buf2d_data,ecx
296
			mov buf2d_data,eax ;на случай если изменился указатель на данные
297
	.24no_crop_right:
298
 
1538 IgorA 299
	bt dword[opt],BUF2D_BIT_OPT_CROP_LEFT
300
	jae .24no_crop_left
301
		mov eax,dword[color]
302
		mov edx,eax ;ax = colors - r,g
303
		shr edx,16 ;dl = color - b
304
		mov ebx,buf2d_w
1555 IgorA 305
		cmp ebx,1
306
		jle .24no_crop_left ;на случай если ширина буфера 1 пиксель
1538 IgorA 307
		lea ebx,[ebx+ebx*2]
308
		mov esi,buf2d_data ;esi - указатель на начоло буфера изображения
309
		mov dword[crop_r],0
310
		cld
311
		.24found_beg_left:
312
 
313
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
314
		@@:
315
			cmp word[esi],ax
316
			jne .24found_left
317
			cmp byte[esi+2],dl
318
			jne .24found_left
319
			add esi,ebx ;прыгаем на нижнюю строку
320
			loop @b
321
		inc dword[crop_r]
322
		add esi,3 ;двигаемся на 1-ну колонку вправо
323
 
324
		mov ecx,buf2d_w
325
		dec ecx ;1 колонка на запас
326
		cmp dword[crop_r],ecx
327
		jge .24found_left
328
 
329
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
330
		@@:
331
			sub esi,ebx ;прыгаем на верхнюю строку
332
			cmp word[esi],ax
333
			jne .24found_left
334
			cmp byte[esi+2],dl
335
			jne .24found_left
336
			loop @b
337
		inc dword[crop_r]
338
		add esi,3 ;двигаемся на 1-ну колонку вправо
339
 
340
		mov ecx,buf2d_w
341
		dec ecx ;1 колонка на запас
342
		cmp dword[crop_r],ecx
343
		jl .24found_beg_left
344
 
345
		.24found_left:
346
		cmp dword[crop_r],0
347
		je .24no_crop_left
348
			mov ecx,buf2d_w
349
			sub ecx,dword[crop_r]
350
			stdcall img_rgb_crop_l, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру
351
			mov buf2d_w,ecx ;ставим новую ширину для буфера
352
			mov ebx,buf2d_h
353
			imul ecx,ebx
354
			lea ecx,[ecx+ecx*2]
355
			invoke mem.realloc,buf2d_data,ecx
356
			mov buf2d_data,eax ;на случай если изменился указатель на данные
357
			mov eax,dword[crop_r]
358
			add buf2d_l,ax
359
	.24no_crop_left:
360
 
1535 IgorA 361
	.24end_f:
362
 
363
 
364
	cmp buf2d_bits,8
365
	jne .8end_f
366
 
367
	bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM
368
	jae .8no_crop_bottom
369
		mov eax,dword[color]
370
		mov esi,buf2d_data
371
		mov ecx,buf2d_h
1555 IgorA 372
		cmp ecx,1
373
		jle .8no_crop_bottom ;проверяем на случай если высота буфера 1 пиксель
1535 IgorA 374
		mov ebx,buf2d_w
375
		imul ecx,ebx
376
		mov esi,ecx
377
		add esi,buf2d_data
378
		cld
379
		@@:
380
			dec esi
381
			cmp byte[esi],al
382
			jne @f
383
			loop @b
384
		@@:
385
		xor edx,edx
386
		mov eax,buf2d_h
387
		imul eax,ebx
388
		add eax,buf2d_data ;eax - указатель на конец буфера изображения
389
		@@:
390
			add esi,ebx
391
			cmp esi,eax
392
			jge @f
393
			inc edx
394
			loop @b
395
		@@:
396
		cmp edx,0
397
		je .8no_crop_bottom
398
			cmp edx,buf2d_h
399
			jge .8no_crop_bottom ;что-бы не получить пустой буфер
400
			sub buf2d_h,edx ;уменьшаем высоту буфера
401
			mov ecx,buf2d_h
402
			imul ecx,ebx ;ecx = новый размер изображения
403
			invoke mem.realloc,buf2d_data,ecx
404
			mov buf2d_data,eax ;на случай если изменился указатель на данные
405
	.8no_crop_bottom:
406
 
407
	bt dword[opt],BUF2D_BIT_OPT_CROP_TOP
408
	jae .8no_crop_top
409
		mov eax,dword[color]
410
		mov esi,buf2d_data
411
		mov ecx,buf2d_h
1555 IgorA 412
		cmp ecx,1
413
		jle .8no_crop_top ;проверяем на случай если высота буфера 1 пиксель
1535 IgorA 414
		dec ecx ;при обрезании должна остаться минимум 1-на строка пикселей
415
		mov ebx,buf2d_w
416
		imul ecx,ebx
417
		cld
418
		@@:
419
			cmp byte[esi],al
420
			jne @f
421
			inc esi
422
			loop @b
423
		@@:
424
		xor edx,edx
425
		@@:
426
			sub esi,ebx
427
			cmp esi,buf2d_data
428
			jl @f
429
			inc edx
430
			loop @b
431
		@@:
432
		cmp edx,0
433
		je .8no_crop_top
434
			xor eax,eax
435
			sub eax,edx
436
			mov ebx,buf2d_h
437
			sub ebx,edx
438
			stdcall buf_offset_h, edi, eax, edx, ebx
439
			mov ecx,buf2d_h
440
			sub ecx,edx
441
			mov buf2d_h,ecx ;уменьшаем высоту буфера
442
			add buf2d_t,dx ;сдвигаем отступ вниз, на число обрезанных строк
443
			mov ebx,buf2d_w
444
			imul ecx,ebx
445
			invoke mem.realloc,buf2d_data,ecx
446
			mov buf2d_data,eax ;на случай если изменился указатель на данные
447
	.8no_crop_top:
448
 
449
	bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT
450
	jae .8no_crop_right
451
		mov eax,dword[color]
452
		mov ebx,buf2d_w
1555 IgorA 453
		cmp ebx,1
454
		jle .8no_crop_right ;на случай если ширина буфера 1 пиксель
1535 IgorA 455
		mov esi,ebx
456
		imul esi,buf2d_h
457
		add esi,buf2d_data ;esi - указатель на конец буфера изображения
458
		xor edx,edx
459
		cld
460
 
461
		.8found_beg:
462
		dec esi ;двигаемся на 1-ну колонку влево
463
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
464
		@@:
465
			cmp byte[esi],al
466
			jne .8found
467
			sub esi,ebx ;прыгаем на верхнюю строку
468
			loop @b
469
		inc edx
470
		mov ecx,buf2d_w
471
		dec ecx ;1 колонка на запас
472
		cmp edx,ecx
473
		jge .8found
474
 
475
		dec esi ;двигаемся на 1-ну колонку влево
476
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
477
		@@:
478
			add esi,ebx ;прыгаем на нижнюю строку
479
			cmp byte[esi],al
480
			jne .8found
481
			loop @b
482
		inc edx
483
 
484
		mov ecx,buf2d_w
485
		dec ecx ;1 колонка на запас
486
		cmp edx,ecx
487
		jl .8found_beg
488
 
489
		.8found:
490
		cmp edx,0
491
		je .8no_crop_right
492
			mov ecx,buf2d_w
493
			sub ecx,edx
1538 IgorA 494
			stdcall img_gray_crop_r, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру
1535 IgorA 495
			mov buf2d_w,ecx ;ставим новую ширину для буфера
496
			mov ebx,buf2d_h
497
			imul ecx,ebx
498
			invoke mem.realloc,buf2d_data,ecx
499
			mov buf2d_data,eax ;на случай если изменился указатель на данные
500
	.8no_crop_right:
501
 
1538 IgorA 502
	bt dword[opt],BUF2D_BIT_OPT_CROP_LEFT
503
	jae .8no_crop_left
504
		mov eax,dword[color]
505
		mov ebx,buf2d_w
1555 IgorA 506
		cmp ebx,1
507
		jle .8no_crop_left ;на случай если ширина буфера 1 пиксель
1538 IgorA 508
		mov esi,buf2d_data ;esi - указатель на начоло буфера изображения
509
		mov edx,0
510
		cld
511
		.8found_beg_left:
512
 
513
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
514
		@@:
515
			cmp word[esi],ax
516
			jne .8found_left
517
			add esi,ebx ;прыгаем на нижнюю строку
518
			loop @b
519
		inc edx
520
		inc esi ;двигаемся на 1-ну колонку вправо
521
 
522
		mov ecx,buf2d_w
523
		dec ecx ;1 колонка на запас
524
		cmp edx,ecx
525
		jge .8found_left
526
 
527
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
528
		@@:
529
			sub esi,ebx ;прыгаем на верхнюю строку
530
			cmp word[esi],ax
531
			jne .8found_left
532
			loop @b
533
		inc edx
534
		inc esi ;двигаемся на 1-ну колонку вправо
535
 
536
		mov ecx,buf2d_w
537
		dec ecx ;1 колонка на запас
538
		cmp edx,ecx
539
		jl .8found_beg_left
540
 
541
		.8found_left:
542
		cmp edx,0
543
		je .8no_crop_left
544
			mov ecx,buf2d_w
545
			sub ecx,edx
546
			stdcall img_gray_crop_l, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру
547
			mov buf2d_w,ecx ;ставим новую ширину для буфера
548
			mov ebx,buf2d_h
549
			imul ecx,ebx
550
			invoke mem.realloc,buf2d_data,ecx
551
			mov buf2d_data,eax ;на случай если изменился указатель на данные
552
			mov eax,edx
553
			add buf2d_l,ax
554
	.8no_crop_left:
555
 
1535 IgorA 556
	.8end_f:
557
 
558
	popad
559
	ret
560
endp
561
 
1538 IgorA 562
;обрезаем цветное изображение с правой стороны
1535 IgorA 563
;input:
564
;data_rgb - pointer to rgb data
565
;size_w_old - width img in pixels
566
;size_w_new - new width img in pixels
567
;size_h - height img in pixels
568
align 4
1538 IgorA 569
proc img_rgb_crop_r, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword
1535 IgorA 570
	pushad
571
	mov eax, dword[size_w_old]
572
	lea eax, dword[eax+eax*2] ;eax = width(old) * 3(rgb)
573
	mov ebx, dword[size_w_new]
574
	lea ebx, dword[ebx+ebx*2] ;ebx = width(new) * 3(rgb)
575
	mov edx, dword[size_h]
576
	mov edi, dword[data_rgb] ;edi - получает данные
577
	mov esi, edi
578
	add edi, ebx
579
	add esi, eax
580
	cld
581
	@@:
582
		dec edx ;уменьшаем счетчик оставшихся строк на 1
583
		cmp edx,0
584
		jle @f
585
		mov ecx, ebx
586
		rep movsb ;перенос (копирование) строки пикселей
587
		add esi,eax ;переход на новую строчку изображения
588
		sub esi,ebx
589
		jmp @b
590
	@@:
591
	popad
592
	ret
593
endp
594
 
1538 IgorA 595
;обрезаем серое изображение с правой стороны
1535 IgorA 596
;input:
597
;data_gray - pointer to gray data
598
;size_w_old - width img in pixels
599
;size_w_new - new width img in pixels
600
;size_h - height img in pixels
601
align 4
1538 IgorA 602
proc img_gray_crop_r, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword
1535 IgorA 603
	pushad
604
	mov eax, dword[size_w_old]
605
	mov ebx, dword[size_w_new]
606
	mov edx, dword[size_h]
607
	mov edi, dword[data_gray] ;edi - получает данные
608
	mov esi, edi
609
	add edi, ebx
610
	add esi, eax
611
	cld
612
	@@:
613
		dec edx ;уменьшаем счетчик оставшихся строк на 1
614
		cmp edx,0
615
		jle @f
616
		mov ecx, ebx
617
		rep movsb ;перенос (копирование) строки пикселей
618
		add esi,eax ;переход на новую строчку изображения
619
		sub esi,ebx
620
		jmp @b
621
	@@:
622
	popad
623
	ret
624
endp
625
 
1538 IgorA 626
;обрезаем цветное изображение с левой стороны
627
;input:
628
;data_rgb - pointer to rgb data
629
;size_w_old - width img in pixels
630
;size_w_new - new width img in pixels
631
;size_h - height img in pixels
632
align 4
633
proc img_rgb_crop_l, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword
634
	pushad
635
	mov edi,dword[data_rgb]
636
	mov esi,edi
637
	mov eax,dword[size_w_old]
638
	mov ebx,dword[size_w_new]
639
	cmp eax,ebx
640
	jle .end_f ;старый размер изображения не может быть меньше нового (при условии обрезания картинки)
641
		lea eax,[eax+eax*2]
642
		lea ebx,[ebx+ebx*2]
643
		sub eax,ebx
644
		mov edx,dword[size_h] ;высота изображения
645
		cld
646
		@@:
647
			add esi,eax
648
			mov ecx,ebx
649
			rep movsb
650
			dec edx
651
			cmp edx,0
652
			jg @b
653
	.end_f:
654
	popad
655
	ret
656
endp
657
 
658
;обрезаем серое изображение с левой стороны
659
;input:
660
;data_gray - pointer to gray data
661
;size_w_old - width img in pixels
662
;size_w_new - new width img in pixels
663
;size_h - height img in pixels
664
align 4
665
proc img_gray_crop_l, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword
666
	pushad
667
	mov edi,dword[data_gray]
668
	mov esi,edi
669
	mov eax,dword[size_w_old]
670
	mov ebx,dword[size_w_new]
671
	cmp eax,ebx
672
	jle .end_f ;старый размер изображения не может быть меньше нового (при условии обрезания картинки)
673
		sub eax,ebx
674
		mov edx,dword[size_h] ;высота изображения
675
		cld
676
		@@:
677
			add esi,eax
678
			mov ecx,ebx
679
			rep movsb
680
			dec edx
681
			cmp edx,0
682
			jg @b
683
	.end_f:
684
	popad
685
	ret
686
endp
687
 
1535 IgorA 688
;hoffs - колличество пикселей на котрые поднимается/опускается изображение
689
;img_t - высота, с которой начинается двигающаяся часть изображения
690
align 4
691
proc buf_offset_h, buf_struc:dword, hoffs:dword, img_t:dword, img_h:dword ;сдвигает изображение по высоте
692
	pushad
693
	mov edi,dword[buf_struc]
694
	cmp buf2d_bits,24
695
	jne .end_move_24
696
 
697
	mov eax,[hoffs]
698
	cmp eax,0
699
	je .end_move_24
700
		mov ebx,buf2d_w
701
		mov edx,dword[img_t]
702
			mov ecx,dword[img_h] ;ecx - высота сдвигаемых данных
703
			cmp ecx,buf2d_h
704
			jge .end_f ;ошибочное условие, высота изображения меньше чем высота сдвигаемого изображения
705
			imul ecx,ebx ;ecx - колличество пикселей в сдвигаемых данных
706
			lea ecx,[ecx+ecx*2]
707
		imul ebx,edx
708
		lea ebx,[ebx+ebx*2]
709
		mov esi,buf2d_data
710
		add esi,ebx
711
 
712
		add edx,eax ;edx = img_t+hoffs (hoffs<0)
713
		mov ebx,buf2d_w
714
		imul ebx,edx
715
		lea ebx,[ebx+ebx*2]
716
		mov edi,buf2d_data ;позиция, куда будет двигаться изображение
717
		add edi,ebx
718
 
719
		cmp eax,0
720
		jg .move_down_24
721
			;двигаем изображение вверх
722
			cld
723
			rep movsb
724
			jmp .end_f
725
		.move_down_24:
726
			;двигаем изображение вниз
727
			add esi,ecx
728
			dec esi
729
			add edi,ecx
730
			dec edi
731
			std
732
			rep movsb
733
			jmp .end_f
734
	.end_move_24:
735
 
736
;stdcall print_err,sz_buf2d_offset_h,txt_err_n24b
737
 
738
	cmp buf2d_bits,8
739
	jne .end_move_8
740
 
741
	mov eax,[hoffs]
742
	cmp eax,0
743
	je .end_move_8
744
		;двигаем изображение вверх
745
		mov ebx,buf2d_w
746
		mov edx,dword[img_t]
747
			mov ecx,dword[img_h] ;ecx - высота сдвигаемых данных
748
			cmp ecx,buf2d_h
749
			jge .end_f ;ошибочное условие, высота изображения меньше чем высота сдвигаемого изображения
750
			imul ecx,ebx ;ecx - колличество пикселей в сдвигаемых данных
751
		imul ebx,edx
752
		mov esi,buf2d_data
753
		add esi,ebx
754
 
755
		add edx,eax ;edx = img_t+hoffs (hoffs<0)
756
		mov ebx,buf2d_w
757
		imul ebx,edx
758
		mov edi,buf2d_data ;позиция, куда будет двигаться изображение
759
		add edi,ebx
760
 
761
		cmp eax,0
762
		jg .move_down_8
763
			cld
764
			rep movsb
765
			jmp .end_f
766
		.move_down_8:
767
			;двигаем изображение вниз
768
			add esi,ecx
769
			dec esi
770
			add edi,ecx
771
			dec edi
772
			std
773
			rep movsb
774
			jmp .end_f
775
	.end_move_8:
776
 
777
	.end_f:
778
	popad
779
	ret
780
endp
781
 
782
align 4
783
proc buf_delete, buf_struc:dword
2136 IgorA 784
	push eax edi
1535 IgorA 785
	mov edi,dword[buf_struc]
786
	invoke mem.free,buf2d_data
2136 IgorA 787
	pop edi eax
1535 IgorA 788
	ret
789
endp
790
 
6175 IgorA 791
;input:
792
; new_w - новая ширина (если 0 то не меняется)
793
; new_h - новая высота (если 0 то не меняется)
794
; options - параметры изменения буфера (1 - изменять размер буфера,
795
;    2 - изменять изображение в буфере, 3 - изменять буфер и изображение)
1535 IgorA 796
align 4
6175 IgorA 797
proc buf_resize, buf_struc:dword, new_w:dword, new_h:dword, options:dword
2136 IgorA 798
	pushad
799
	mov edi,dword[buf_struc]
6175 IgorA 800
	cmp buf2d_bits,8
801
	jne .8bit
802
		bt dword[options],1 ;сжатие изобр.
803
		jnc @f
804
			;...
805
		@@:
806
		bt dword[options],0 ;измен. буфер
807
		jnc .end_f
808
			;...
809
		jmp .end_f
810
	.8bit:
2136 IgorA 811
	cmp buf2d_bits,24
812
	jne .24bit
6175 IgorA 813
		bt dword[options],1 ;сжатие изобр.
814
		jnc .24_end_r
815
			mov eax,dword[new_w]
816
			cmp eax,1
817
			jl @f
818
			cmp eax,buf2d_w
819
			jge @f
820
				;сжатие по ширине
821
				stdcall img_rgb24_wresize, buf2d_data,buf2d_w,buf2d_h,eax
822
				jmp .24_r_h
823
			@@:
824
			mov eax,buf2d_w
825
			.24_r_h: ;eax - ширина буфера или ширина сжатого изображения
826
			mov ebx,dword[new_h]
827
			cmp ebx,1
828
			jl @f
829
			cmp ebx,buf2d_h
830
			jge @f
831
				;сжатие по высоте
6178 IgorA 832
				stdcall img_rgb24_hresize, buf2d_data,eax,buf2d_h,ebx
6175 IgorA 833
			@@:
834
		.24_end_r:
835
		bt dword[options],0 ;измен. буфер
836
		jnc .end_f
2136 IgorA 837
		mov eax,dword[new_w]
838
		cmp eax,1
839
		jl @f
840
			mov buf2d_w,eax
841
		@@:
842
		mov ecx,buf2d_w
843
		mov eax,dword[new_h]
844
		cmp eax,1
845
		jl @f
846
			mov buf2d_h,eax
847
		@@:
848
		mov ebx,buf2d_h
849
		imul ecx,ebx
850
		lea ecx,[ecx+ecx*2] ; 24 bit = 3
851
		invoke mem.realloc,buf2d_data,ecx ;изменяем память занимаемую буфером
852
		mov buf2d_data,eax ;на случай если изменился указатель на данные
853
	.24bit:
6175 IgorA 854
	.end_f:
2136 IgorA 855
	popad
856
	ret
857
endp
858
 
859
align 4
2975 IgorA 860
rot_table: ;таблица для указания на подфункции для поворотов
861
	dd buf_rotate.8b90,buf_rotate.24b90,buf_rotate.32b90,\
862
	buf_rotate.8b180,buf_rotate.24b180,buf_rotate.32b180
863
 
864
;поворот изображения на 90 или 180 градусов
865
align 4
866
proc buf_rotate, buf_struc:dword, angle:dword
867
locals
868
	n_data dd ?
869
	dec_h dd ? ;число байт, для уменьшения координаты y
870
endl
871
	pushad
872
	mov edi,[buf_struc]
873
	mov ebx,buf2d_w
874
	mov ecx,buf2d_h
875
 
876
	lea eax,[rot_table]
877
	cmp dword[angle],90 ;проверка угла поворота
878
	je .beg_0
879
	cmp dword[angle],180
880
	jne @f
881
		add eax,12
882
		jmp .beg_0
883
	@@:
884
	jmp .end_f
885
	.beg_0: ;проверка битности буфера
886
	cmp buf2d_bits,8
887
	jne @f
888
		jmp dword[eax]
889
	@@:
890
	cmp buf2d_bits,24
891
	jne @f
892
		add eax,4
893
		jmp dword[eax]
894
	@@:
895
	cmp buf2d_bits,32
896
	jne @f
897
		add eax,8
898
		jmp dword[eax]
899
	@@:
900
	jmp .end_f
901
 
902
	.8b90: ;поворот 8 битного буфера на 90 градусов
903
		mov edx,ecx ;edx - buf_h
904
		imul ecx,ebx
905
		invoke mem.alloc,ecx ;выделяем временную память
906
		cmp eax,0
907
		je .end_f
908
		mov [n_data],eax
909
		mov [dec_h],ecx
910
		inc dword[dec_h]
911
 
912
		;copy buf --> mem
913
		mov edi,[buf_struc]
914
		mov esi,buf2d_data
915
		mov edi,eax ;[n_data]
916
		dec edx ;коректируем edx на 1 байт, для компенсации сдвига в movsb
917
		add edi,edx
918
		xor eax,eax
919
		cld
920
		.cycle_0:
921
			movsb
922
			add edi,edx
923
			inc eax
924
			cmp eax,ebx
925
			jl @f
926
				xor eax,eax
927
				sub edi,[dec_h]
928
			@@:
929
			loop .cycle_0
930
 
931
		;change buf_w <---> buf_h
932
		mov esi,[n_data]
933
		mov edi,[buf_struc]
934
		mov edi,buf2d_data
935
		mov ecx,ebx
936
		inc edx ;исправляем скоректированный edx
937
		imul ecx,edx
938
		;copy buf <-- mem
939
		;cld
940
		rep movsb
941
		invoke mem.free,[n_data]
942
		jmp .change_w_h
943
	.24b90: ;поворот 24 битного буфера на 90 градусов
944
		mov esi,ecx
945
		imul esi,ebx
946
		lea ecx,[ecx+ecx*2]
947
		mov edx,ecx ;edx - buf_h * 3
948
		imul ecx,ebx
949
		invoke mem.alloc,ecx ;выделяем временную память
950
		cmp eax,0
951
		je .end_f
952
		mov [n_data],eax
953
		mov [dec_h],ecx
954
		add dword[dec_h],3
955
 
956
		;copy buf --> mem
957
 
958
		mov edi,[buf_struc]
959
		mov ecx,esi
960
		mov esi,buf2d_data
961
		mov edi,eax ;[n_data]
962
		sub edx,3 ;коректируем edx на 3 байта, для компенсации сдвига
963
		add edi,edx
964
		xor eax,eax
965
		cld
966
		.cycle_1:
967
			movsw
968
			movsb
969
			add edi,edx
970
			inc eax
971
			cmp eax,ebx
972
			jl @f
973
				xor eax,eax
974
				sub edi,[dec_h]
975
			@@:
976
			loop .cycle_1
977
 
978
		;copy buf <-- mem
979
		mov esi,[n_data]
980
		mov edi,[buf_struc]
981
		mov edi,buf2d_data
982
		mov ecx,ebx
983
		add edx,3 ;исправляем скоректированный edx
984
		imul ecx,edx
985
		;cld
986
		rep movsb
987
		invoke mem.free,[n_data]
988
		jmp .change_w_h
989
	.32b90: ;поворот 32 битного буфера на 90 градусов
990
		shl ecx,2
991
		mov edx,ecx ;edx - buf_h * 4
992
		imul ecx,ebx
993
		invoke mem.alloc,ecx ;выделяем временную память
994
		cmp eax,0
995
		je .end_f
996
		mov [n_data],eax
997
		mov [dec_h],ecx
998
		add dword[dec_h],4
999
 
1000
		;copy buf --> mem
1001
		mov edi,[buf_struc]
1002
		shr ecx,2
1003
		mov esi,buf2d_data
1004
		mov edi,eax ;[n_data]
1005
		sub edx,4 ;коректируем edx на 4 байта, для компенсации сдвига в movsd
1006
		add edi,edx
1007
		xor eax,eax
1008
		cld
1009
		.cycle_2:
1010
			movsd
1011
			add edi,edx
1012
			inc eax
1013
			cmp eax,ebx
1014
			jl @f
1015
				xor eax,eax
1016
				sub edi,[dec_h]
1017
			@@:
1018
			loop .cycle_2
1019
 
1020
		;copy buf <-- mem
1021
		mov esi,[n_data]
1022
		mov edi,[buf_struc]
1023
		mov edi,buf2d_data
1024
		mov ecx,ebx
1025
		add edx,4 ;исправляем скоректированный edx
1026
		imul ecx,edx
1027
		shr ecx,2
1028
		;cld
1029
		rep movsd
1030
		invoke mem.free,[n_data]
1031
		;jmp .change_w_h
1032
	.change_w_h: ;change buf_w <---> buf_h
1033
		mov edi,[buf_struc]
1034
		mov eax,buf2d_w
1035
		mov ebx,buf2d_h
1036
		mov buf2d_h,eax
1037
		mov buf2d_w,ebx
1038
		jmp .end_f
1039
	.8b180: ;поворот 8 битного буфера на 180 градусов
1040
		mov edi,buf2d_data
1041
		mov esi,edi
1042
		imul ecx,ebx
1043
		add esi,ecx
1044
		dec esi
1045
		shr ecx,1 ;ecx - число пикселей буфера : 2
1046
		std
1047
		@@:
1048
			lodsb
1049
			mov ah,byte[edi]
1050
			mov byte[esi+1],ah
1051
			mov byte[edi],al
1052
			inc edi
1053
			loop @b
1054
			jmp .end_f
1055
	.24b180: ;поворот 24 битного буфера на 180 градусов
1056
		mov esi,buf2d_data
1057
		mov edi,esi
1058
		imul ecx,ebx
1059
		mov eax,ecx
1060
		lea ecx,[ecx+ecx*2]
1061
		add edi,ecx
1062
		sub edi,3
1063
		shr eax,1
1064
		mov ecx,eax ;ecx - число пикселей буфера : 2
1065
		cld
1066
		@@:
1067
			lodsw
1068
			mov edx,eax
1069
			lodsb
1070
			mov bx,word[edi]
1071
			mov word[esi-3],bx
1072
			mov bl,byte[edi+2]
1073
			mov byte[esi-1],bl
1074
			mov byte[edi+2],al
1075
			mov word[edi],dx
1076
			sub edi,3
1077
			loop @b
1078
			jmp .end_f
1079
	.32b180: ;поворот 32 битного буфера на 180 градусов
1080
		mov edi,buf2d_data
1081
		mov esi,edi
1082
		imul ecx,ebx
1083
		shl ecx,2
1084
		add esi,ecx
1085
		sub esi,4
1086
		shr ecx,3 ;ecx - число пикселей буфера : 2
1087
		std
1088
		@@:
1089
			lodsd
1090
			mov ebx,dword[edi]
1091
			mov dword[esi+4],ebx
1092
			mov dword[edi],eax
1093
			add edi,4
1094
			loop @b
1095
		;jmp .end_f
1096
 
1097
	.end_f:
1098
	popad
1099
	ret
1100
endp
1101
 
1102
align 4
5389 IgorA 1103
proc buf_flip_h, buf_struc:dword
1104
pushad
1105
	mov edi,[buf_struc]
1106
	cmp buf2d_bits,24
1107
	jne .end_24
1108
		mov esi,buf2d_data
1109
		mov eax,buf2d_w
1110
		mov ecx,eax
1111
		shr ecx,1
1112
		dec eax
1113
		lea eax,[eax+eax*2]
1114
		mov ebx,buf2d_h
1115
		mov edi,esi
1116
		add esi,eax
1117
		add eax,3
1118
		cld
1119
		.cycle_24:
1120
		push ecx edi esi
1121
align 4
1122
		@@:
1123
			;swap word[edi] <-> word[esi]
1124
			mov dx,[edi]
1125
			movsw
1126
			mov [esi-2],dx
1127
			;swap byte[edi] <-> byte[esi]
1128
			mov dl,[edi]
1129
			movsb
1130
			mov [esi-1],dl
1131
			sub esi,6
1132
		loop @b
1133
		pop esi edi ecx
1134
		add edi,eax
1135
		add esi,eax
1136
		dec ebx
1137
		or ebx,ebx
1138
		jnz .cycle_24
1139
		jmp .end_32
1140
	.end_24:
1141
	cmp buf2d_bits,32
1142
	jne .end_32
1143
		mov esi,buf2d_data
1144
		mov eax,buf2d_w
1145
		dec eax
1146
		shl eax,2
1147
		mov ebx,buf2d_h
1148
		mov edi,esi
1149
		add esi,eax
1150
		add eax,4
1151
		cld
1152
		.cycle_32:
1153
		mov ecx,eax
1154
		shr ecx,3
1155
		push edi esi
1156
align 4
1157
		@@:
1158
			;swap dword[edi] <-> dword[esi]
1159
			mov edx,[edi]
1160
			movsd
1161
			mov [esi-4],edx
1162
			sub esi,8
1163
		loop @b
1164
		pop esi edi
1165
		add edi,eax
1166
		add esi,eax
1167
		dec ebx
1168
		or ebx,ebx
1169
		jnz .cycle_32
1170
	.end_32:
1171
popad
1172
	ret
1173
endp
1174
 
3040 IgorA 1175
;отразить по вертикали (верх и низ меняются местами)
2658 IgorA 1176
align 4
3040 IgorA 1177
proc buf_flip_v, buf_struc:dword
1178
locals
5389 IgorA 1179
	line_pix dd ? ;кол. пикселей в линии буфера
1180
	line_2byte dd ? ;кол. байт в линии буфера * 2
3040 IgorA 1181
endl
1182
	pushad
1183
	mov edi,[buf_struc]
5389 IgorA 1184
	cmp buf2d_bits,24
1185
	jne .end_24
1186
		mov edx,buf2d_w
1187
		mov [line_pix],edx
1188
		mov ebx,buf2d_h
1189
		lea edx,[edx+edx*2]
1190
		mov esi,edx
1191
		imul esi,ebx
1192
		sub esi,edx
1193
		add esi,buf2d_data ;указатель на нижнюю линию
1194
		shr ebx,1 ;кол. линейных циклов
1195
		shl edx,1
1196
		mov [line_2byte],edx
1197
		mov edi,buf2d_data
1198
		xchg edi,esi
1199
		cld
1200
		.flip_24:
1201
		cmp ebx,0
1202
		jle .end_32 ;здесь выход из функции (потому .end_24 не подходит)
1203
		mov ecx,[line_pix]
1204
align 4
1205
		@@:
1206
			lodsw
1207
			mov dx,word[edi]
1208
			mov word[esi-2],dx
1209
			stosw
1210
			lodsb
1211
			mov ah,byte[edi]
1212
			mov byte[esi-1],ah
1213
			stosb
1214
			loop @b
1215
		sub edi,[line_2byte]
1216
		dec ebx
1217
		jmp .flip_24
1218
	.end_24:
1219
	cmp buf2d_bits,32
1220
	jne .end_32
1221
		mov edx,buf2d_w
1222
		mov [line_pix],edx
1223
		mov ebx,buf2d_h
1224
		shl edx,2
1225
		mov esi,edx
1226
		imul esi,ebx
1227
		sub esi,edx
1228
		add esi,buf2d_data ;указатель на нижнюю линию
1229
		shr ebx,1 ;кол. линейных циклов
1230
		shl edx,1
1231
		mov [line_2byte],edx
1232
		mov edi,buf2d_data
1233
		xchg edi,esi
1234
		cld
1235
		.flip_32:
1236
		cmp ebx,0
1237
		jle .end_32
1238
		mov ecx,[line_pix]
1239
align 4
1240
		@@:
1241
			lodsd
1242
			mov edx,dword[edi]
1243
			mov dword[esi-4],edx
1244
			stosd
1245
			loop @b
1246
		sub edi,[line_2byte]
1247
		dec ebx
1248
		jmp .flip_32
1249
	.end_32:
1250
	popad
1251
	ret
3040 IgorA 1252
endp
1253
 
6175 IgorA 1254
;description:
1255
; сжатие изображения по ширине в 2 раза (размеры буфера не меняются)
3040 IgorA 1256
align 4
1535 IgorA 1257
proc buf_img_wdiv2, buf_struc:dword
1258
	pushad
1259
	mov edi,dword[buf_struc]
2927 IgorA 1260
	cmp buf2d_bits,8
1261
	jne @f
1262
		mov eax,buf2d_w
1263
		mov ecx,buf2d_h
1264
		imul ecx,eax
1265
		stdcall img_8b_wdiv2, buf2d_data,ecx
1266
	@@:
1535 IgorA 1267
	cmp buf2d_bits,24
2927 IgorA 1268
	jne @f
1535 IgorA 1269
		mov eax,buf2d_w
1270
		mov ecx,buf2d_h
1271
		imul ecx,eax
1272
		stdcall img_rgb24_wdiv2, buf2d_data,ecx
2927 IgorA 1273
	@@:
2920 IgorA 1274
	cmp buf2d_bits,32
2927 IgorA 1275
	jne @f
2920 IgorA 1276
		mov eax,buf2d_w
1277
		mov ecx,buf2d_h
1278
		imul ecx,eax
2927 IgorA 1279
		stdcall img_rgba32_wdiv2, buf2d_data,ecx
1280
	@@:
1535 IgorA 1281
	popad
1282
	ret
1283
endp
1284
 
1285
;input:
2927 IgorA 1286
;data_8b - pointer to rgb data
1287
;size - count img pixels (size img data / 3(rgb) )
1288
align 4
1289
proc img_8b_wdiv2 data_8b:dword, size:dword
1290
	mov eax,dword[data_8b]
1291
	mov ecx,dword[size] ;ecx = size
1292
	cld
1293
	@@: ;затемнение цвета пикселей
1294
		shr byte[eax],1
1295
		inc eax
1296
		loop @b
1297
 
1298
	mov eax,dword[data_8b]
1299
	mov ecx,dword[size] ;ecx = size
1300
	shr ecx,1
1301
	@@: ;сложение цветов пикселей
1302
		mov bl,byte[eax+1] ;копируем цвет соседнего пикселя
1303
		add byte[eax],bl
1304
		add eax,2
1305
		loop @b
1306
 
1307
	mov eax,dword[data_8b]
1308
	inc eax
1309
	mov ebx,eax
1310
	inc ebx
1311
	mov ecx,dword[size] ;ecx = size
1312
	shr ecx,1
1313
	dec ecx ;лишний пиксель
1314
	@@: ;поджатие пикселей
1315
		mov dl,byte[ebx]
1316
		mov byte[eax],dl
1317
 
1318
		inc eax
1319
		add ebx,2
1320
		loop @b
1321
	ret
1322
endp
1323
 
1324
;input:
1535 IgorA 1325
;data_rgb - pointer to rgb data
1326
;size - count img pixels (size img data / 3(rgb) )
1327
align 4
1328
proc img_rgb24_wdiv2 data_rgb:dword, size:dword
1329
  mov eax,dword[data_rgb]
1330
  mov ecx,dword[size] ;ecx = size
1331
  lea ecx,[ecx+ecx*2]
1332
  cld
1333
  @@: ;затемнение цвета пикселей
1538 IgorA 1334
		shr byte[eax],1
1335
		inc eax
1336
		loop @b
1535 IgorA 1337
 
1338
  mov eax,dword[data_rgb]
1339
  mov ecx,dword[size] ;ecx = size
1340
  shr ecx,1
1341
  @@: ;сложение цветов пикселей
1538 IgorA 1342
		mov bx,word[eax+3] ;копируем цвет соседнего пикселя
1343
		add word[eax],bx
1344
		mov bl,byte[eax+5] ;копируем цвет соседнего пикселя
1345
		add byte[eax+2],bl
1346
		add eax,6 ;=2*3
1347
		loop @b
1535 IgorA 1348
 
1349
  mov eax,dword[data_rgb]
1350
  add eax,3
1351
  mov ebx,eax
1352
  add ebx,3
1353
  mov ecx,dword[size] ;ecx = size
1354
  shr ecx,1
1355
  dec ecx ;лишний пиксель
1356
  @@: ;поджатие пикселей
1538 IgorA 1357
		mov edx,dword[ebx]
1358
		mov word[eax],dx
1359
		shr edx,16
1360
		mov byte[eax+2],dl
1535 IgorA 1361
 
1538 IgorA 1362
		add eax,3
1363
		add ebx,6
1364
		loop @b
1535 IgorA 1365
  ret
1366
endp
1367
 
2920 IgorA 1368
;input:
2927 IgorA 1369
;data_rgba - pointer to rgba data
1370
;size - count img pixels (size img data / 4(rgba) )
1535 IgorA 1371
align 4
2927 IgorA 1372
proc img_rgba32_wdiv2 data_rgba:dword, size:dword
1373
	mov eax,dword[data_rgba]
2920 IgorA 1374
 
2927 IgorA 1375
	mov eax,dword[data_rgba]
2920 IgorA 1376
	mov ebx,eax
1377
	add ebx,4
1378
	mov ecx,dword[size] ;ecx = size
1379
	shr ecx,1
1380
	@@: ;смешивание цветов пикселей
1381
		call combine_colors_1
1382
		mov [eax],edx
1383
		add eax,8 ;=2*4
1384
		add ebx,8
1385
		loop @b
1386
 
2927 IgorA 1387
	mov eax,dword[data_rgba]
2920 IgorA 1388
	add eax,4
1389
	mov ebx,eax
1390
	add ebx,4
1391
	mov ecx,dword[size] ;ecx = size
1392
	shr ecx,1
1393
	dec ecx ;лишний пиксель
1394
	@@: ;поджатие пикселей
1395
		mov edx,dword[ebx]
1396
		mov dword[eax],edx
1397
 
1398
		add eax,4
1399
		add ebx,8
1400
		loop @b
1401
	ret
1402
endp
1403
 
3040 IgorA 1404
;description:
6175 IgorA 1405
; сжатие изображения по высоте в 2 раза (высота буфера не меняется)
2920 IgorA 1406
align 4
1535 IgorA 1407
proc buf_img_hdiv2, buf_struc:dword
1408
	pushad
1409
	mov edi,dword[buf_struc]
2927 IgorA 1410
	cmp buf2d_bits,8
1411
	jne @f
1412
		mov eax,buf2d_w
1413
		mov ecx,buf2d_h
1414
		imul ecx,eax
1415
		stdcall img_8b_hdiv2, buf2d_data,ecx,eax
3040 IgorA 1416
		jmp .end_f ;edi портится в функции, потому использование buf2d_bits опасно
2927 IgorA 1417
	@@:
1535 IgorA 1418
	cmp buf2d_bits,24
2927 IgorA 1419
	jne @f
1535 IgorA 1420
		mov eax,buf2d_w
1421
		mov ecx,buf2d_h
1422
		imul ecx,eax
1423
		stdcall img_rgb24_hdiv2, buf2d_data,ecx,eax
3040 IgorA 1424
		jmp .end_f
2927 IgorA 1425
	@@:
2920 IgorA 1426
	cmp buf2d_bits,32
2927 IgorA 1427
	jne @f
2920 IgorA 1428
		mov eax,buf2d_w
1429
		mov ecx,buf2d_h
1430
		imul ecx,eax
1431
		shl eax,2
2927 IgorA 1432
		stdcall img_rgba32_hdiv2, buf2d_data,ecx,eax
3040 IgorA 1433
		;jmp .end_f
2927 IgorA 1434
	@@:
3040 IgorA 1435
	.end_f:
1535 IgorA 1436
	popad
1437
	ret
1438
endp
1439
 
1440
;input:
2927 IgorA 1441
;data_8b - pointer to 8 bit data
1442
;size - count img pixels (size img data)
1443
;size_w - width img in pixels
1444
align 4
1445
proc img_8b_hdiv2, data_8b:dword, size:dword, size_w:dword
1446
 
1447
	mov eax,dword[data_8b] ;eax =
1448
	mov ecx,dword[size]
1449
	cld
1450
	@@: ;затемнение цвета пикселей
1451
		shr byte[eax],1
1452
		inc eax
1453
		loop @b
1454
 
1455
	mov eax,dword[data_8b] ;eax =
1456
	mov esi,dword[size_w]
1457
	mov ebx,esi
1458
	add ebx,eax
1459
	mov ecx,dword[size]  ;ecx = size
1460
	shr ecx,1
1461
	xor edi,edi
1462
	@@: ;сложение цветов пикселей
1463
		mov dl,byte[ebx] ;копируем цвет нижнего пикселя
1464
		add byte[eax],dl
1465
 
1466
		inc eax
1467
		inc ebx
1468
		inc edi
1469
		cmp edi,dword[size_w]
1470
		jl .old_line
1471
			add eax,esi
1472
			add ebx,esi
1473
			xor edi,edi
1474
		.old_line:
1475
		loop @b
1476
 
1477
 
1478
	mov eax,dword[data_8b] ;eax =
1479
	add eax,esi ;esi = width*3(rgb)
1480
	mov ebx,eax
1481
	add ebx,esi
1482
	mov ecx,dword[size] ;ecx = size
1483
	shr ecx,1
1484
	sub ecx,dword[size_w] ;лишняя строка пикселей
1485
	xor edi,edi
1486
	@@: ;поджатие пикселей
1487
		mov dl,byte[ebx] ;копируем цвет нижнего пикселя
1488
		mov byte[eax],dl
1489
 
1490
		inc eax
1491
		inc ebx
1492
		inc edi
1493
		cmp edi,dword[size_w]
1494
		jl .old_line_2
1495
			add ebx,esi
1496
			xor edi,edi
1497
		.old_line_2:
1498
		loop @b
1499
	ret
1500
endp
1501
 
1502
;input:
1535 IgorA 1503
;data_rgb - pointer to rgb data
1504
;size - count img pixels (size img data / 3(rgb) )
1505
;size_w - width img in pixels
1506
align 4
1507
proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword
1508
 
1509
  mov eax,dword[data_rgb] ;eax =
1510
  mov ecx,dword[size]	  ;ecx = size
1511
  lea ecx,[ecx+ecx*2]
1512
  cld
1513
  @@: ;затемнение цвета пикселей
1514
    shr byte[eax],1
1515
    inc eax
1516
    loop @b
1517
 
1518
  mov eax,dword[data_rgb] ;eax =
2920 IgorA 1519
  mov esi,dword[size_w]
1520
  lea esi,[esi+esi*2] ;esi = width*3(rgb)
1535 IgorA 1521
  mov ebx,esi
1522
  add ebx,eax
1523
  mov ecx,dword[size]  ;ecx = size
1524
  shr ecx,1
1525
  xor edi,edi
1526
  @@: ;сложение цветов пикселей
1527
    mov dx,word[ebx] ;копируем цвет нижнего пикселя
1528
    add word[eax],dx
1529
    mov dl,byte[ebx+2] ;копируем цвет нижнего пикселя
1530
    add byte[eax+2],dl
1531
 
1532
    add eax,3
1533
    add ebx,3
1534
    inc edi
1535
    cmp edi,dword[size_w]
1536
    jl .old_line
1537
      add eax,esi
1538
      add ebx,esi
1539
      xor edi,edi
1540
    .old_line:
1541
    loop @b
1542
 
1543
  mov eax,dword[data_rgb] ;eax =
1544
  add eax,esi ;esi = width*3(rgb)
2920 IgorA 1545
  mov ebx,eax
1546
  add ebx,esi
1535 IgorA 1547
  mov ecx,dword[size] ;ecx = size
1548
  shr ecx,1
1549
  sub ecx,dword[size_w] ;лишняя строка пикселей
1550
  xor edi,edi
1551
  @@: ;поджатие пикселей
1552
    mov edx,dword[ebx] ;копируем цвет нижнего пикселя
1553
    mov word[eax],dx
1554
    shr edx,16
1555
    mov byte[eax+2],dl
1556
 
1557
    add eax,3
1558
    add ebx,3
1559
    inc edi
1560
    cmp edi,dword[size_w]
1561
    jl .old_line_2
1562
      add ebx,esi
1563
      xor edi,edi
1564
    .old_line_2:
1565
    loop @b
1566
  ret
1567
endp
1568
 
2920 IgorA 1569
;input:
2927 IgorA 1570
;data_rgba - pointer to rgba data
1571
;size - count img pixels (size img data / 4(rgba) )
2920 IgorA 1572
;size_w_b - width img in bytes
1573
align 4
2927 IgorA 1574
proc img_rgba32_hdiv2, data_rgba:dword, size:dword, size_w_b:dword
2920 IgorA 1575
 
2927 IgorA 1576
	mov eax,dword[data_rgba] ;eax =
2920 IgorA 1577
	mov ebx,dword[size_w_b]
1578
	add ebx,eax
1579
	mov ecx,dword[size]  ;ecx = size
1580
	shr ecx,1
1581
	xor edi,edi
1582
	@@: ;смешивание цветов пикселей
1583
		call combine_colors_1
1584
		mov dword[eax],edx
1585
 
1586
		add eax,4
1587
		add ebx,4
1588
		add edi,4
1589
		cmp edi,dword[size_w_b]
1590
		jl .old_line
1591
			add eax,dword[size_w_b]
1592
			add ebx,dword[size_w_b]
1593
			xor edi,edi
1594
		.old_line:
1595
		loop @b
1596
 
2927 IgorA 1597
	mov eax,dword[data_rgba] ;eax =
2920 IgorA 1598
	mov ebx,dword[size_w_b]
1599
	add eax,ebx
1600
	add ebx,eax
1601
	mov ecx,dword[size] ;ecx = size
1602
	shl ecx,1
1603
	sub ecx,dword[size_w_b] ;лишняя строка пикселей
1604
	shr ecx,2
1605
	xor edi,edi
1606
	@@: ;поджатие пикселей
1607
		mov edx,dword[ebx] ;копируем цвет нижнего пикселя
1608
		mov dword[eax],edx
1609
 
1610
		add eax,4
1611
		add ebx,4
1612
		add edi,4
1613
		cmp edi,dword[size_w_b]
1614
		jl .old_line_2
1615
			add ebx,dword[size_w_b]
1616
			xor edi,edi
1617
		.old_line_2:
1618
		loop @b
1619
	ret
1620
endp
1621
 
1622
;input:
1623
; eax - указатель на 32-битный цвет
1624
; ebx - указатель на 32-битный цвет
1625
;output:
1626
; edx - 32-битный цвет смешанный с учетом прозрачности
1627
;destroy:
1628
; esi
1629
align 4
1630
proc combine_colors_1 uses ecx edi
1631
locals
1632
	c_blye dd ?
1633
	c_green dd ?
1634
	c_red dd ?
1635
endl
1636
	movzx edi,byte[eax+3]
1637
	cmp edi,255
1638
	je .c0z
1639
	movzx esi,byte[ebx+3]
1640
	cmp esi,255
1641
	je .c1z
2927 IgorA 1642
	cmp edi,esi
1643
	je .c0_c1
2920 IgorA 1644
 
1645
	;переворачиваем значения прозрачностей
1646
	neg edi
1647
	inc edi
1648
	add edi,255
1649
	neg esi
1650
	inc esi
1651
	add esi,255
1652
 
1653
	movzx ecx,byte[eax]
1654
	imul ecx,edi
1655
	mov [c_blye],ecx
1656
	movzx ecx,byte[ebx]
1657
	imul ecx,esi
1658
	add [c_blye],ecx
1659
 
1660
	movzx ecx,byte[eax+1]
1661
	imul ecx,edi
1662
	mov [c_green],ecx
1663
	movzx ecx,byte[ebx+1]
1664
	imul ecx,esi
1665
	add [c_green],ecx
1666
 
1667
	movzx ecx,byte[eax+2]
1668
	imul ecx,edi
1669
	mov [c_red],ecx
1670
	movzx ecx,byte[ebx+2]
1671
	imul ecx,esi
1672
	add [c_red],ecx
1673
 
1674
push eax ebx
1675
	xor ebx,ebx
1676
	mov eax,[c_red]
1677
	xor edx,edx
1678
	mov ecx,edi
1679
	add ecx,esi
1680
	div ecx
1681
	mov bl,al
1682
	shl ebx,16
1683
	mov eax,[c_green]
1684
	xor edx,edx
1685
	div ecx
1686
	mov bh,al
1687
	mov eax,[c_blye]
1688
	xor edx,edx
1689
	div ecx
1690
	mov bl,al
1691
 
1692
	shr ecx,1
1693
	;переворачиваем значения прозрачности
1694
	neg ecx
1695
	inc ecx
1696
	add ecx,255
1697
 
1698
	shl ecx,24
1699
	add ebx,ecx
1700
	mov edx,ebx
1701
pop ebx eax
1702
 
1703
	jmp .end_f
2927 IgorA 1704
	.c0_c1: ;если прозрачности обоих цветов совпадают
1705
		mov edx,dword[eax]
1706
		shr edx,1
1707
		and edx,011111110111111101111111b
1708
		mov esi,dword[ebx]
1709
		shr esi,1
1710
		and esi,011111110111111101111111b
1711
		add edx,esi
1712
		ror edi,8 ;перемещаем значение прозрачности в старший байт edi
1713
		or edx,edi
1714
		jmp .end_f
2920 IgorA 1715
	.c0z: ;если цвет в eax прозрачный
1716
		mov edx,dword[ebx]
1717
		movzx edi,byte[ebx+3]
1718
		jmp @f
1719
	.c1z: ;если цвет в ebx прозрачный
1720
		mov edx,dword[eax]
1721
	@@:
1722
		add edi,255 ;делаем цвет на половину прозрачным
1723
		shr edi,1
1724
		cmp edi,255
1725
		jl @f
1726
			mov edi,255 ;максимальная прозрачность не более 255
1727
		@@:
1728
		shl edi,24
1729
		and edx,0xffffff ;снимаем старую прозрачность
1730
		add edx,edi
1731
	.end_f:
1732
	ret
1733
endp
1734
 
6175 IgorA 1735
;description:
1736
; сжатие изображения по ширине (размеры буфера не меняются)
1737
;input:
1738
; data_rgb - pointer to rgb data
1739
; size_w - width img in pixels
1740
; size_h - height img in pixels
1741
; size_w_new - new width img in pixels
1742
align 16
1743
proc img_rgb24_wresize, data_rgb:dword, size_w:dword, size_h:dword, size_w_new:dword
1744
locals
1745
	pr dd 0
1746
	pg dd 0
1747
	pb dd 0
1748
	img_n dd ? ;указатель на данные нового изображения
1749
	lines dd ?
1750
endl
1751
pushad
1752
;eax - delta for inp. img
1753
;ebx - delta for outp. img
1754
;esi - pointer to data_rgb
1755
	mov esi,[data_rgb]
1756
	mov [img_n],esi
1757
	mov eax,[size_h]
1758
	mov [lines],eax
1759
align 4
1760
	.cycyle_0:
1761
	mov eax,[size_w_new]
1762
	mov ecx,[size_w]
1763
	mov ebx,ecx
1764
align 4
1765
	.cycyle_1:
1766
		cmp eax,ebx
1767
		jg .else_0
1768
			;копируемый пиксель максимально влияет на результат
1769
			;накапливаем rgb для интерполяции пикселей
1770
			mov edx,[size_w_new]
1771
			movzx edi,byte[esi]
1772
			imul edi,edx
1773
			add [pb],edi
1774
			movzx edi,byte[esi+1]
1775
			imul edi,edx
1776
			add [pg],edi
1777
			movzx edi,byte[esi+2]
1778
			imul edi,edx
1779
			add [pr],edi
1780
			cmp eax,ebx
1781
			je .d2_add
1782
			jmp .if_0_end
1783
		.else_0:
1784
			;копируемый пиксель попадет на границу пикселей
1785
			mov edx,ebx
1786
			sub edx,eax
1787
			add edx,[size_w_new]
1788
			movzx edi,byte[esi]
1789
			imul edi,edx
1790
			add [pb],edi
1791
			movzx edi,byte[esi+1]
1792
			imul edi,edx
1793
			add [pg],edi
1794
			movzx edi,byte[esi+2]
1795
			imul edi,edx
1796
			add [pr],edi
1797
			;сохраняем готовое rgb
1798
			.d2_add:
1799
			push eax
1800
				mov edi,[img_n]
1801
				mov eax,[pb]
1802
				xor edx,edx
1803
				div dword[size_w] ;eax /= [size_w]
1804
				stosb
1805
				mov eax,[pg]
1806
				xor edx,edx
1807
				div dword[size_w] ;eax /= [size_w]
1808
				stosb
1809
				mov eax,[pr]
1810
				xor edx,edx
1811
				div dword[size_w] ;eax /= [size_w]
1812
				stosb
1813
			pop eax
1814
			add dword[img_n],3 ;next pixel
1815
			;обновляем rgb для нового пикселя
1816
			mov edx,eax
1817
			sub edx,ebx
1818
			movzx edi,byte[esi]
1819
			imul edi,edx
1820
			mov [pb],edi
1821
			movzx edi,byte[esi+1]
1822
			imul edi,edx
1823
			mov [pg],edi
1824
			movzx edi,byte[esi+2]
1825
			imul edi,edx
1826
			mov [pr],edi
1827
			add ebx,[size_w]
1828
		.if_0_end:
1829
		add eax,[size_w_new]
1830
		add esi,3 ;next pixel
1831
		dec ecx
1832
		jnz .cycyle_1
1833
	dec dword[lines]
1834
	jnz .cycyle_0
1835
popad
1836
	ret
1837
endp
1838
 
6178 IgorA 1839
;description:
1840
; сжатие изображения по высоте (размеры буфера не меняются)
1841
;input:
1842
; data_rgb - pointer to rgb data
1843
; size_w - width img in pixels
1844
; size_h - height img in pixels
1845
; size_h_new - new height img in pixels
1846
align 16
1847
proc img_rgb24_hresize, data_rgb:dword, size_w:dword, size_h:dword, size_h_new:dword
1848
locals
1849
	pr dd 0
1850
	pg dd 0
1851
	pb dd 0
1852
	img_n dd ? ;указатель на данные нового изображения
1853
	cols dd ?
1854
	lin_b dd ? ;размер линии изображения в байтах
1855
	data_n dd ? ;указатель на данные для нового столбца пикселей
1856
endl
1857
pushad
1858
;eax - delta for inp. img
1859
;ebx - delta for outp. img
1860
;esi - pointer to data_rgb
1861
	mov esi,[data_rgb]
1862
	mov [data_n],esi
1863
	mov eax,[size_w]
1864
	mov [cols],eax
1865
	lea eax,[eax+eax*2]
1866
	mov [lin_b],eax
1867
align 4
1868
	.cycyle_0:
1869
	mov eax,[size_h_new]
1870
	mov ecx,[size_h]
1871
	mov ebx,ecx
1872
	mov esi,[data_n]
1873
	mov [img_n],esi
1874
	add dword[data_n],3 ;переход на следующий столбец пикселей
1875
align 4
1876
	.cycyle_1:
1877
		cmp eax,ebx
1878
		jg .else_0
1879
			;копируемый пиксель максимально влияет на результат
1880
			;накапливаем rgb для интерполяции пикселей
1881
			mov edx,[size_h_new]
1882
			movzx edi,byte[esi]
1883
			imul edi,edx
1884
			add [pb],edi
1885
			movzx edi,byte[esi+1]
1886
			imul edi,edx
1887
			add [pg],edi
1888
			movzx edi,byte[esi+2]
1889
			imul edi,edx
1890
			add [pr],edi
1891
			cmp eax,ebx
1892
			je .d2_add
1893
			jmp .if_0_end
1894
		.else_0:
1895
			;копируемый пиксель попадет на границу пикселей
1896
			mov edx,ebx
1897
			sub edx,eax
1898
			add edx,[size_h_new]
1899
			movzx edi,byte[esi]
1900
			imul edi,edx
1901
			add [pb],edi
1902
			movzx edi,byte[esi+1]
1903
			imul edi,edx
1904
			add [pg],edi
1905
			movzx edi,byte[esi+2]
1906
			imul edi,edx
1907
			add [pr],edi
1908
			;сохраняем готовое rgb
1909
			.d2_add:
1910
			push eax
1911
				mov edi,[img_n]
1912
				mov eax,[pb]
1913
				xor edx,edx
1914
				div dword[size_h] ;eax /= [size_h]
1915
				stosb
1916
				mov eax,[pg]
1917
				xor edx,edx
1918
				div dword[size_h] ;eax /= [size_h]
1919
				stosb
1920
				mov eax,[pr]
1921
				xor edx,edx
1922
				div dword[size_h] ;eax /= [size_h]
1923
				stosb
1924
			pop eax
1925
			mov edx,[lin_b]
1926
			add dword[img_n],edx ;next pixel
1927
			;обновляем rgb для нового пикселя
1928
			mov edx,eax
1929
			sub edx,ebx
1930
			movzx edi,byte[esi]
1931
			imul edi,edx
1932
			mov [pb],edi
1933
			movzx edi,byte[esi+1]
1934
			imul edi,edx
1935
			mov [pg],edi
1936
			movzx edi,byte[esi+2]
1937
			imul edi,edx
1938
			mov [pr],edi
1939
			add ebx,[size_h]
1940
		.if_0_end:
1941
		add eax,[size_h_new]
1942
		add esi,[lin_b] ;next pixel
1943
		dec ecx
1944
		jnz .cycyle_1
1945
	dec dword[cols]
1946
	jnz .cycyle_0
1947
popad
1948
	ret
1949
endp
1950
 
1535 IgorA 1951
;преобразование буфера из 24-битного в 8-битный
1952
; spectr - определяет какой спектр брать при преобразовании 0-синий, 1-зеленый, 2-красный
1953
align 4
1954
proc buf_conv_24_to_8, buf_struc:dword, spectr:dword
1955
	pushad
1956
	mov edi,dword[buf_struc]
1957
	cmp buf2d_bits,24
6210 IgorA 1958
	jne .error0
1535 IgorA 1959
		mov eax,buf2d_w
6210 IgorA 1960
		cmp eax,1
1961
		jl .error1
1535 IgorA 1962
		mov ecx,buf2d_h
6210 IgorA 1963
		cmp ecx,1
1964
		jl .error1
1535 IgorA 1965
		imul ecx,eax
1966
		mov esi,ecx
1967
		;ebx - память из которой копируется
1968
		;edx - память куда копируется
1969
		mov edx,buf2d_data
1970
		mov ebx,edx
1971
		cmp [spectr],3
1972
		jge @f
1973
			add ebx,[spectr]
1974
		@@:
1975
			mov al,byte[ebx]
1976
			mov byte[edx],al
1977
			add ebx,3
1978
			inc edx
1979
			loop @b
1980
		mov buf2d_bits,8
1981
		invoke mem.realloc,buf2d_data,esi ;уменьшаем память занимаемую буфером
1982
		jmp .end_conv
6210 IgorA 1983
	.error0:
1535 IgorA 1984
		stdcall print_err,sz_buf2d_conv_24_to_8,txt_err_n24b
6210 IgorA 1985
		jmp .end_conv
1986
	.error1:
1987
		stdcall print_err,sz_buf2d_conv_24_to_8,txt_err_size_0
1535 IgorA 1988
	.end_conv:
1989
	popad
1990
	ret
1991
endp
1992
 
1993
;преобразование буфера из 24-битного в 32-битный
1994
align 4
1995
proc buf_conv_24_to_32, buf_struc:dword, buf_str8:dword
1996
	pushad
1997
	mov edi,dword[buf_struc]
1998
	cmp buf2d_bits,24
1999
	jne .error1
2000
		mov ecx,buf2d_w
2001
		mov ebx,buf2d_h
2002
		imul ebx,ecx
2003
		mov ecx,ebx ;ecx = size  8 b
2004
		shl ebx,2   ;ebx = size 32 b
2005
		invoke mem.realloc,buf2d_data,ebx ;увеличиваем память занимаемую буфером
2006
		mov buf2d_data,eax ;на случай если изменился указатель на данные
2007
		mov buf2d_bits,32
2008
		mov edx,ebx ;edx = size 32 b
2009
		sub ebx,ecx ;ebx = size 24 b
2010
		mov eax,ecx
2011
		;eax - размер  8 битных данных
2012
		;ebx - размер 24 битных данных
2013
		;edx - размер 32 битных данных
2014
		add ebx,buf2d_data
2015
		add edx,buf2d_data
2016
		mov edi,dword[buf_str8]
2017
		cmp buf2d_bits,8
2018
		jne .error2
2019
		add eax,buf2d_data
2020
		mov edi,edx
2021
		;eax - указатель на конец  8 битных данных
2022
		;ebx - указатель на конец 24 битных данных
2023
		;edi - указатель на конец 32 битных данных
2024
		@@:
2025
			sub edi,4 ;отнимаем в начале цикла,
2026
			sub ebx,3 ; потому, что указатели стоят
2027
			dec eax   ; за пределами буферов
2028
			mov edx,dword[ebx]
2029
			mov dword[edi],edx
2030
			mov dl,byte[eax]
2031
			mov byte[edi+3],dl
2032
			loop @b
2033
 
2034
		jmp .end_conv
2035
	.error1:
2036
		stdcall print_err,sz_buf2d_conv_24_to_32,txt_err_n24b
2037
		jmp .end_conv
2038
	.error2:
2039
		stdcall print_err,sz_buf2d_conv_24_to_32,txt_err_n8b
2040
	.end_conv:
2041
	popad
2042
	ret
2043
endp
2044
 
2045
;функция копирует изображение из буфера buf_source (24b|32b) в buf_destination (24b)
2046
; указываются координаты вставки буфера buf_source относительно buf_destination
2047
; прозрачность при копировании не учитывается
2048
align 4
2049
proc buf_bit_blt, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword
2050
	locals
2051
		right_bytes dd ?
2052
	endl
2053
	pushad
2054
 
2055
	mov edi,[buf_source]
2056
	cmp buf2d_bits,24
2057
	je .sou24
2058
	cmp buf2d_bits,32
2059
	je .sou32
2060
		jmp .copy_end ;формат буфера не поодерживается
2061
 
1648 IgorA 2062
	.sou24: ;в источнике 24 битная картинка
1535 IgorA 2063
	mov eax,buf2d_w
2064
	mov edx,buf2d_h ;высота копируемой картинки
2065
	mov esi,buf2d_data ;данные копируемой картинки
2066
 
2067
	mov edi,[buf_destination]
2068
	cmp buf2d_bits,24
2069
	jne .copy_end ;формат буфера не поодерживается
1648 IgorA 2070
	mov ebx,[coord_x] ;в ebx временно ставим отступ изображения (для проверки)
2071
	cmp ebx,buf2d_w   ;проверяем влазит ли изображение по ширине
2422 IgorA 2072
	jge .copy_end	  ;если изображение полностью вылазит за правую сторону
1535 IgorA 2073
		mov ebx,buf2d_h ;ebx - высота основного буфера
2074
		mov ecx,[coord_y]
2422 IgorA 2075
		cmp ecx,0
2076
		jge @f
2077
			;если координата coord_y<0 (1-я настройка)
2078
			add edx,ecx ;уменьшаем высоту копируемой картинки
2079
			cmp edx,0
2080
			jle .copy_end ;если копируемое изображение находится полностью над верхней границей буфера (coord_y<0 и |coord_y|>buf_source.h)
2081
			neg ecx
2082
			;inc ecx
2083
			imul ecx,eax
2084
			lea ecx,[ecx+ecx*2] ;по 3 байта на пиксель
2085
			add esi,ecx ;сдвигаем указатель с копируемыми данными, с учетом пропушеной части
2086
			xor ecx,ecx ;обнуляем координату coord_y
2087
		@@:
1535 IgorA 2088
		cmp ecx,ebx
2089
		jge .copy_end ;если координата 'y' больше высоты буфера
2090
		add ecx,edx ;ecx - нижняя координата копируемой картинки
2091
		cmp ecx,ebx
2092
		jle @f
2093
			sub ecx,ebx
2094
			sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу
2095
		@@:
2096
		mov ebx,buf2d_w
2422 IgorA 2097
		mov ecx,[coord_y] ;ecx используем для временных целей
2098
		cmp ecx,0
2099
		jg .end_otr_c_y_24
2100
			;если координата coord_y<=0 (2-я настройка)
2101
			mov ecx,[coord_x]
2102
			jmp @f
2103
		.end_otr_c_y_24:
2104
		imul ecx,ebx
1535 IgorA 2105
		add ecx,[coord_x]
2422 IgorA 2106
		@@:
1535 IgorA 2107
		lea ecx,[ecx+ecx*2]
2108
		add ecx,buf2d_data
2109
		sub ebx,eax
2110
		mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование
2111
 
2112
	mov [right_bytes],0
2113
	mov ecx,[coord_x]
2114
	cmp ecx,ebx
2115
	jl @f
2116
		sub ecx,ebx
2117
		sub eax,ecx ;укорачиваем копируемую строку
2118
		add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера
2119
		lea ecx,[ecx+ecx*2] ;ecx - число байт в 1-й строке картинки, которые вылазят за правую сторону
2120
		mov [right_bytes],ecx
2121
	@@:
2122
 
2123
	lea eax,[eax+eax*2] ;колличество байт в 1-й строке копируемой картинки
2124
	lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки
2125
 
2126
	cld
2127
	cmp [right_bytes],0
2128
	jg .copy_1
2129
	.copy_0: ;простое копирование
2130
		mov ecx,eax
2131
		rep movsb
2132
		add edi,ebx
2133
		dec edx
2134
		cmp edx,0
2135
		jg .copy_0
2136
	jmp .copy_end
2137
	.copy_1: ;не простое копирование (картинка вылазит за правую сторону)
2138
		mov ecx,eax
2139
		rep movsb
2140
		add edi,ebx
2141
		add esi,[right_bytes] ;добавляем байты, которые вылазят за правую границу
2142
		dec edx
2143
		cmp edx,0
2144
		jg .copy_1
2145
	jmp .copy_end
2146
 
2147
	.sou32: ;в источнике 32 битная картинка
2148
	mov eax,buf2d_w
2149
	mov edx,buf2d_h ;высота копируемой картинки
2150
	mov esi,buf2d_data ;данные копируемой картинки
2151
 
2152
	mov edi,[buf_destination]
2153
	cmp buf2d_bits,24
2154
	jne .copy_end ;формат буфера не поодерживается
1648 IgorA 2155
	mov ebx,[coord_x] ;в ebx временно ставим отступ изображения (для проверки)
2156
	cmp ebx,buf2d_w   ;проверяем влазит ли изображение по ширине
2422 IgorA 2157
	jge .copy_end	  ;если изображение полностью вылазит за правую сторону
1535 IgorA 2158
		mov ebx,buf2d_h ;ebx - высота основного буфера
2159
		mov ecx,[coord_y]
2422 IgorA 2160
		cmp ecx,0
2161
		jge @f
2162
			;если координата coord_y<0 (1-я настройка)
2163
			add edx,ecx ;уменьшаем высоту копируемой картинки
2164
			cmp edx,0
2165
			jle .copy_end ;если копируемое изображение находится полностью над верхней границей буфера (coord_y<0 и |coord_y|>buf_source.h)
2166
			neg ecx
2167
			;inc ecx
2168
			imul ecx,eax
2169
			shl ecx,2 ;по 4 байта на пиксель
2170
			add esi,ecx ;сдвигаем указатель с копируемыми данными, с учетом пропушеной части
2171
			xor ecx,ecx ;обнуляем координату coord_y
2172
		@@:
1535 IgorA 2173
		cmp ecx,ebx
2174
		jge .copy_end ;если координата 'y' больше высоты буфера
2175
		add ecx,edx ;ecx - нижняя координата копируемой картинки
2176
		cmp ecx,ebx
2177
		jle @f
2178
			sub ecx,ebx
2179
			sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу
2180
		@@:
2181
		mov ebx,buf2d_w
2422 IgorA 2182
		;mov ecx,ebx ;ecx используем для временных целей
2183
		;imul ecx,[coord_y]
2184
		;add ecx,[coord_x]
2185
		mov ecx,[coord_y] ;ecx используем для временных целей
2186
		cmp ecx,0
2187
		jg .end_otr_c_y_32
2188
			;если координата coord_y<=0 (2-я настройка)
2189
			mov ecx,[coord_x]
2190
			jmp @f
2191
		.end_otr_c_y_32:
2192
		imul ecx,ebx
1535 IgorA 2193
		add ecx,[coord_x]
2422 IgorA 2194
		@@:
1535 IgorA 2195
		lea ecx,[ecx+ecx*2]
2196
		add ecx,buf2d_data
2197
		sub ebx,eax
2198
		mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование
2199
 
2200
	mov [right_bytes],0
2201
	mov ecx,[coord_x]
2202
	cmp ecx,ebx
2203
	jl @f
2204
		sub ecx,ebx
2205
		sub eax,ecx ;укорачиваем копируемую строку
2206
		add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера
2207
		shl ecx,2 ;ecx - число байт в 1-й строке картинки, которые вылазят за правую сторону
2208
		mov [right_bytes],ecx
2209
	@@:
2210
 
2211
	;eax - колличество пикселей в 1-й строке копируемой картинки
2212
	lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки
2213
 
2214
	cld
2215
	cmp [right_bytes],0
2216
	jg .copy_3
2217
	.copy_2: ;простое копирование
2218
		mov ecx,eax
2219
		@@:
2220
			movsw
2221
			movsb
2222
			inc esi
2223
			loop @b
2224
		add edi,ebx
2225
		dec edx
2226
		cmp edx,0
2227
		jg .copy_2
2228
	jmp .copy_end
2229
	.copy_3: ;не простое копирование (картинка вылазит за правую сторону)
2230
		mov ecx,eax
2231
		@@:
2232
			movsw
2233
			movsb
2234
			inc esi
2235
			loop @b
2236
		add edi,ebx
2237
		add esi,[right_bytes] ;добавляем байты, которые вылазят за правую границу
2238
		dec edx
2239
		cmp edx,0
2240
		jg .copy_3
2241
 
2242
	.copy_end:
2243
	popad
2244
	ret
2245
endp
2246
 
2247
;input:
2248
; esi = pointer to color1 + transparent
2249
; edi = pointer to background color2
2250
;output:
2251
; [edi] = combine color
2252
align 4
2920 IgorA 2253
combine_colors_0:
1535 IgorA 2254
	push ax bx cx dx
2255
	mov bx,0x00ff ;---get transparent---
2748 IgorA 2256
	movzx cx,byte[esi+3] ;pro
1535 IgorA 2257
	sub bx,cx ;256-pro
1653 IgorA 2258
	;---blye---
2748 IgorA 2259
	movzx ax,byte[esi]
1535 IgorA 2260
	imul ax,bx
2748 IgorA 2261
	movzx dx,byte[edi]
1535 IgorA 2262
	imul dx,cx
2263
	add ax,dx
1653 IgorA 2264
	mov byte[edi],ah
1535 IgorA 2265
	;---green---
2748 IgorA 2266
	movzx ax,byte[esi+1]
1535 IgorA 2267
	imul ax,bx
2748 IgorA 2268
	movzx dx,byte[edi+1]
1535 IgorA 2269
	imul dx,cx
2270
	add ax,dx
2271
	mov byte[edi+1],ah
1653 IgorA 2272
	;---red---
2748 IgorA 2273
	movzx ax,byte[esi+2]
1535 IgorA 2274
	imul ax,bx
2748 IgorA 2275
	movzx dx,byte[edi+2]
1535 IgorA 2276
	imul dx,cx
2277
	add ax,dx
1653 IgorA 2278
	mov byte[edi+2],ah
1535 IgorA 2279
 
2280
	pop dx cx bx ax
2281
	ret
2282
 
2283
;функция копирует изображение из буфера buf_source (32b) в buf_destination (24b)
2284
; указываются координаты вставки буфера buf_source относительно buf_destination
2285
; при копировании учитывается прозрачность
2286
align 4
2287
proc buf_bit_blt_transp, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword
2288
	locals
2927 IgorA 2289
		lost_bytes dd ?
1535 IgorA 2290
	endl
2291
	pushad
2292
 
2293
	mov edi,[buf_source]
2294
	cmp buf2d_bits,32
2295
	jne .copy_end ;формат буфера не поодерживается
2296
	mov eax,buf2d_w
2297
	mov edx,buf2d_h ;высота копируемой картинки
2298
	mov esi,buf2d_data ;данные копируемой картинки
2299
 
2300
	mov edi,[buf_destination]
2301
	cmp buf2d_bits,24
2302
	jne .copy_end ;формат буфера не поодерживается
2303
		mov ebx,buf2d_h ;ebx - высота основного буфера
2304
		mov ecx,[coord_y]
2383 IgorA 2305
		cmp ecx,0
2306
		jge @f
2307
			;если координата coord_y<0 (1-я настройка)
2308
			add edx,ecx ;уменьшаем высоту копируемой картинки
2309
			cmp edx,0
2310
			jle .copy_end ;если копируемое изображение находится полностью над верхней границей буфера (coord_y<0 и |coord_y|>buf_source.h)
2311
			neg ecx
2312
			;inc ecx
2313
			imul ecx,eax
2422 IgorA 2314
			shl ecx,2 ;по 4 байта на пиксель
2383 IgorA 2315
			add esi,ecx ;сдвигаем указатель с копируемыми данными, с учетом пропушеной части
2316
			xor ecx,ecx ;обнуляем координату coord_y
2317
		@@:
1535 IgorA 2318
		cmp ecx,ebx
2319
		jge .copy_end ;если координата 'y' больше высоты буфера
2320
		add ecx,edx ;ecx - нижняя координата копируемой картинки
2321
		cmp ecx,ebx
2322
		jle @f
2323
			sub ecx,ebx
2324
			sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу
2325
		@@:
2326
		mov ebx,buf2d_w
2327
		mov ecx,ebx ;ecx используем для временных целей
2383 IgorA 2328
		cmp [coord_y],0
2329
		jg .end_otr_c_y
2330
			;если координата coord_y<=0 (2-я настройка)
2331
			mov ecx,[coord_x]
2332
			jmp @f
2333
		.end_otr_c_y:
1535 IgorA 2334
		imul ecx,[coord_y]
2335
		add ecx,[coord_x]
2383 IgorA 2336
		@@:
1535 IgorA 2337
		lea ecx,[ecx+ecx*2]
2338
		add ecx,buf2d_data
2339
		sub ebx,eax
2340
		mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование
2341
 
2927 IgorA 2342
	mov dword[lost_bytes],0
1535 IgorA 2343
	mov ecx,[coord_x]
2927 IgorA 2344
	cmp ecx,0
2345
	jge @f
2346
		neg ecx
2347
		;inc ecx
2348
		cmp eax,ecx ;eax - ширина копируемой картинки
2349
		jle .copy_end ;если копируемое изображение находится полностью за левой границей буфера (coord_x<0 и |coord_x|>buf_source.w)
2350
		shl ecx,2
2351
		mov [lost_bytes],ecx
2352
		add esi,ecx
2353
		shr ecx,2
2354
		sub eax,ecx ;укорачиваем копируемую строку
2355
		add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера
2356
		lea ecx,[ecx+ecx*2]
2357
		add edi,ecx ;edi указатель на данные буфера, куда будет производится копирование
2358
		xor ecx,ecx
2359
	@@:
1535 IgorA 2360
	cmp ecx,ebx
2927 IgorA 2361
	jle @f
1535 IgorA 2362
		sub ecx,ebx
2363
		sub eax,ecx ;укорачиваем копируемую строку
2364
		add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера
2927 IgorA 2365
		shl ecx,2 ;ecx - число пикселей в 1-й строке картинки, которые вылазят за правую сторону
2366
		add [lost_bytes],ecx
1535 IgorA 2367
	@@:
2368
 
2927 IgorA 2369
;	mov [right_bytes],0
2370
;	mov ecx,[coord_x]
2371
;	cmp ecx,ebx
2372
;	jl @f
2373
;		sub ecx,ebx
2374
;		sub eax,ecx ;укорачиваем копируемую строку
2375
;		add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера
2376
;		shl ecx,2 ;ecx - число байт в 1-й строке картинки, которые вылазят за правую сторону
2377
;		mov [right_bytes],ecx
2378
;	@@:
2379
 
1535 IgorA 2380
	lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки
2658 IgorA 2381
 
1535 IgorA 2382
	cld
2927 IgorA 2383
	cmp [lost_bytes],0
1535 IgorA 2384
	jg .copy_1
2385
	.copy_0: ;простое копирование
2386
		mov ecx,eax
2387
		@@:
2920 IgorA 2388
			call combine_colors_0
1535 IgorA 2389
			add edi,3
2390
			add esi,4
2391
			loop @b
2392
		add edi,ebx
2393
		dec edx
2394
		cmp edx,0
2395
		jg .copy_0
2396
	jmp .copy_end
2397
	.copy_1: ;не простое копирование (картинка вылазит за правую сторону)
2398
		mov ecx,eax
2399
		@@:
2920 IgorA 2400
			call combine_colors_0
1535 IgorA 2401
			add edi,3
2402
			add esi,4
2403
			loop @b
2404
		add edi,ebx
2927 IgorA 2405
		add esi,[lost_bytes] ;добавляем байты, которые вылазят за правую границу
1535 IgorA 2406
		dec edx
2407
		cmp edx,0
2408
		jg .copy_1
2409
 
2410
	.copy_end:
2411
	popad
2412
	ret
2413
endp
2414
 
2415
;input:
2416
; ebx - color1
2417
; esi = pointer to transparent
2418
; edi = pointer to background color2
2419
;output:
2420
; [edi] = combine color
2421
align 4
2422
combine_colors_2:
2423
	push ax ebx cx dx si
2424
	mov cl,byte[esi] ;pro
2425
	xor ch,ch
2426
	mov si,0x00ff ;---get transparent---
2427
	sub si,cx ;256-pro
2428
 
1653 IgorA 2429
		;---blye---
2748 IgorA 2430
		movzx ax,bl
1535 IgorA 2431
		shr ebx,8
2432
		imul ax,si
2748 IgorA 2433
		movzx dx,byte[edi]
1535 IgorA 2434
		imul dx,cx
2435
		add ax,dx
1653 IgorA 2436
		mov byte[edi],ah
1535 IgorA 2437
		;---green---
2748 IgorA 2438
		movzx ax,bl
1535 IgorA 2439
		shr ebx,8
2440
		imul ax,si
2748 IgorA 2441
		movzx dx,byte[edi+1]
1535 IgorA 2442
		imul dx,cx
2443
		add ax,dx
2444
		mov byte[edi+1],ah
2445
		;---red---
2748 IgorA 2446
		movzx ax,bl
1535 IgorA 2447
		imul ax,si
2748 IgorA 2448
		movzx dx,byte[edi+2]
1535 IgorA 2449
		imul dx,cx
2450
		add ax,dx
1653 IgorA 2451
		mov byte[edi+2],ah
1535 IgorA 2452
 
2453
	pop si dx cx ebx ax
2454
	ret
2455
 
2456
;функция копирует изображение из буфера buf_source (8b) в buf_destination (24b)
2457
; указываются координаты вставки буфера buf_source относительно buf_destination
2458
align 4
2459
proc buf_bit_blt_alpha, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword, color:dword
2460
	locals
2383 IgorA 2461
		lost_bytes dd ? ;число потерянных байтов в строке копируемого изображеня (тех что не влазят в буфер)
1535 IgorA 2462
		dest_w_bytes dd ? ;колличество байт в буфере приемнике по ширине - ширина вставляемой картинки
2463
	endl
2464
	pushad
2465
 
2466
	mov edi,[buf_source]
2467
	cmp buf2d_bits,8
2468
	jne .error1 ;формат буфера не поодерживается
2383 IgorA 2469
	mov eax,buf2d_w ;ширина копируемой картинки
1535 IgorA 2470
	mov edx,buf2d_h ;высота копируемой картинки
2471
	mov esi,buf2d_data ;данные копируемой картинки
2472
 
2473
	mov edi,[buf_destination]
2474
	cmp buf2d_bits,24
2475
	jne .error2 ;формат буфера не поодерживается
1642 IgorA 2476
	mov ebx,[coord_x] ;в ebx временно ставим отступ изображения (для проверки)
2477
	cmp ebx,buf2d_w   ;проверяем влазит ли изображение по ширине
2422 IgorA 2478
	jge .copy_end	  ;если изображение полностью вылазит за правую сторону
1535 IgorA 2479
		mov ebx,buf2d_h ;ebx - высота основного буфера
2480
		mov ecx,[coord_y]
2367 IgorA 2481
		cmp ecx,0
2482
		jge @f
2483
			;если координата coord_y<0 (1-я настройка)
2484
			add edx,ecx ;уменьшаем высоту копируемой картинки
2383 IgorA 2485
			cmp edx,0
2486
			jle .copy_end ;если копируемое изображение находится полностью над верхней границей буфера (coord_y<0 и |coord_y|>buf_source.h)
2367 IgorA 2487
			neg ecx
2488
			;inc ecx
2489
			imul ecx,eax
2490
			add esi,ecx ;сдвигаем указатель с копируемыми данными, с учетом пропушеной части
2491
			xor ecx,ecx ;обнуляем координату coord_y
2492
		@@:
1535 IgorA 2493
		cmp ecx,ebx
2494
		jge .copy_end ;если координата 'y' больше высоты буфера
2495
		add ecx,edx ;ecx - нижняя координата копируемой картинки
2496
		cmp ecx,ebx
2497
		jle @f
2498
			sub ecx,ebx
2499
			sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу
2500
		@@:
2501
		mov ebx,buf2d_w
2367 IgorA 2502
		mov ecx,[coord_y] ;ecx используем для временных целей
2503
		cmp ecx,0
2383 IgorA 2504
		jg .end_otr_c_y
2505
			;если координата coord_y<=0 (2-я настройка)
2367 IgorA 2506
			mov ecx,[coord_x]
2507
			jmp @f
2508
		.end_otr_c_y:
2509
		imul ecx,ebx
1535 IgorA 2510
		add ecx,[coord_x]
2367 IgorA 2511
		@@:
1535 IgorA 2512
		lea ecx,[ecx+ecx*2]
2383 IgorA 2513
		add ecx,buf2d_data ;buf2d_data данные основного буфера
2514
		sub ebx,eax ;ebx - ширина основного буфера минус ширина рисуемого буфера
1535 IgorA 2515
		mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование
2516
 
2383 IgorA 2517
	mov dword[lost_bytes],0
1535 IgorA 2518
	mov ecx,[coord_x]
2383 IgorA 2519
	cmp ecx,0
2520
	jge @f
2521
		neg ecx
2522
		;inc ecx
2523
		cmp eax,ecx ;eax - ширина копируемой картинки
2524
		jle .copy_end ;если копируемое изображение находится полностью за левой границей буфера (coord_x<0 и |coord_x|>buf_source.w)
2927 IgorA 2525
		mov [lost_bytes],ecx
2383 IgorA 2526
		sub eax,ecx ;укорачиваем копируемую строку
2527
		add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера
2528
		add esi,ecx
2529
		lea ecx,[ecx+ecx*2]
2530
		add edi,ecx ;edi указатель на данные буфера, куда будет производится копирование
2531
		xor ecx,ecx
2532
	@@:
1535 IgorA 2533
	cmp ecx,ebx
2383 IgorA 2534
	jle @f
1535 IgorA 2535
		sub ecx,ebx
2536
		sub eax,ecx ;укорачиваем копируемую строку
2537
		add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера
2538
		;ecx - число пикселей в 1-й строке картинки, которые вылазят за правую сторону
2383 IgorA 2539
		add [lost_bytes],ecx
1535 IgorA 2540
	@@:
2541
 
2542
	lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки
2543
	mov [dest_w_bytes],ebx
2544
	mov ebx,[color]
2545
 
2546
	cld
2383 IgorA 2547
	cmp dword[lost_bytes],0
1535 IgorA 2548
	jg .copy_1
2549
	.copy_0: ;простое копирование
2550
		mov ecx,eax
2551
		@@:
2552
			call combine_colors_2
2553
			add edi,3
2554
			inc esi
2555
			loop @b
2556
		add edi,[dest_w_bytes]
2557
		dec edx
2558
		cmp edx,0
2559
		jg .copy_0
2560
	jmp .copy_end
2383 IgorA 2561
	.copy_1: ;не простое копирование (картинка вылазит за левую и/или правую сторону)
1535 IgorA 2562
		mov ecx,eax
2563
		@@:
2564
			call combine_colors_2
2565
			add edi,3
2566
			inc esi
2567
			loop @b
2568
		add edi,[dest_w_bytes]
2383 IgorA 2569
		add esi,[lost_bytes] ;добавляем байты, которые вылазят за правую границу
1535 IgorA 2570
		dec edx
2571
		cmp edx,0
2572
		jg .copy_1
2573
 
2574
	jmp .copy_end
2575
	.error1:
2576
		stdcall print_err,sz_buf2d_bit_blt_alpha,txt_err_n8b
2577
		jmp .copy_end
2578
	.error2:
2579
		stdcall print_err,sz_buf2d_bit_blt_alpha,txt_err_n24b
2580
	.copy_end:
2581
	popad
2582
	ret
2583
endp
2584
 
2585
align 4
2586
proc print_err, fun:dword, mes:dword ;выводим сообщение об шибке на доску отладки
2587
	pushad
2588
	mov eax,63
2589
	mov ebx,1
2590
 
2591
	mov esi,[fun]
2592
	@@:
2593
		mov cl,byte[esi]
2594
		int 0x40
2595
		inc esi
2596
		cmp byte[esi],0
2597
		jne @b
2598
	mov cl,':'
2599
	int 0x40
2600
	mov cl,' '
2601
	int 0x40
2602
	mov esi,[mes]
2603
	@@:
2604
		mov cl,byte[esi]
2605
		int 0x40
2606
		inc esi
2607
		cmp byte[esi],0
2608
		jne @b
2609
	popad
2610
	ret
2611
endp
2612
 
3138 heavyiron 2613
;фильтр
3105 IgorA 2614
align 4
2615
proc buf_filter_dither, buffer:dword, algor:dword
2616
	pushad
2617
	mov edi,[buffer]
2618
	cmp buf2d_bits,24
2619
	jne .error
2620
		mov edx,buf2d_w
2621
		mov esi,buf2d_h
2622
		mov edi,buf2d_data
2623
;edi - pointer to 24bit bitmap
2624
;edx - x size
2625
;esi - y size
3138 heavyiron 2626
		lea   edx,[edx+edx*2]
3105 IgorA 2627
		imul  esi,edx
2748 IgorA 2628
 
3105 IgorA 2629
		;определяем какой алгоритм использовать
2630
		cmp dword[algor],0
2631
		jne @f
2632
			call dither_0
2633
			jmp .dither_end
2634
		@@:
2635
		cmp dword[algor],1
2636
		jne @f
2637
			call dither_1
2638
			jmp .dither_end
2639
		@@:
3138 heavyiron 2640
		cmp dword[algor],2
2641
		jne @f
2642
			call dither_2
2643
			jmp .dither_end
2644
		@@:
2645
		cmp dword[algor],3
2646
		jne @f
2647
			call dither_3
2648
			jmp .dither_end
2649
		@@:
2650
		call dither_4
3105 IgorA 2651
		jmp .dither_end
2652
	.error:
2653
		stdcall print_err,sz_buf2d_filter_dither,txt_err_n24b
2654
	.dither_end:
2655
	popad
2656
	ret
2657
endp
2748 IgorA 2658
 
3105 IgorA 2659
align 16
3138 heavyiron 2660
dither_0: ; Sierra Filter Lite algorithm
3105 IgorA 2661
newp_0:   ; Dithering cycle
2662
	xor   ebx,ebx ; At first threshold
2663
	movzx ecx,byte[edi]
2664
	cmp   cl,255
2665
	je    newp_0.next
2666
	test  cl,cl
2667
	jz    newp_0.next
2668
	jns   @f
2669
	dec   ebx
2670
	sub   ecx,255
2671
@@:
2672
	mov   [edi],bl               ; putpixel
2673
 
2674
	sar   ecx,1                  ; error/2
2675
	;adc   ecx,0                  ; round to integer
2676
 
2677
	movzx eax,byte[edi+3]        ; pixel (x+1;y)
2678
	add   eax,ecx                ; add error/2 to (x+1;y)
2679
	jge   @f                     ; check_overflow
2680
	xor   eax,eax
2681
	jmp   .ok
2682
@@:
2683
	cmp   eax,255
2684
	jle   .ok
2685
	or    al,255
2686
.ok:
2687
	mov   [edi+3],al             ; putpixel
2688
 
2689
	sar   ecx,1                  ; error/4
2690
	adc   ecx,0                  ; round to integer
2691
 
2692
	movzx eax,byte[edi+edx-3]    ; pixel (x-1;y+1)
2693
	add   eax,ecx                ; add error/4 to (x-1;y+1)
2694
	jge   @f                     ; check_overflow
2695
	xor   eax,eax
2696
	jmp   .ok1
2697
@@:
2698
	cmp   eax,255
2699
	jle   .ok1
2700
	or    al,255
2701
.ok1:
2702
	mov   [edi+edx-3],al         ; putpixel
2703
 
2704
	movzx eax,byte[edi+edx]      ; pixel (x;y+1)
2705
	add   eax,ecx                ; add error/4 to (x;y+1)
2706
	jge   @f                     ; check_overflow
2707
	xor   eax,eax
2708
	jmp   .ok2
2709
@@:
2710
	cmp   eax,255
2711
	jle   .ok2
2712
	or    al,255
2713
.ok2:
2714
	mov   [edi+edx],al           ; putpixel
2715
 
2716
.next:
2717
	inc   edi
2718
	dec   esi
2719
	jnz   newp_0
2720
	ret
2721
 
2722
align 16
3138 heavyiron 2723
dither_1: ; Floyd-Steinberg algorithm
3105 IgorA 2724
newp_1:   ; Dithering cycle
2725
	xor   ebx,ebx ; At first threshold
2726
	movzx ecx,byte[edi]
2727
	cmp   cl,255
2728
	je    newp_1.next
2729
	test  cl,cl
2730
	jz    newp_1.next
2731
	jns   @f
2732
	dec   ebx
2733
	sub   ecx,255
2734
@@:
2735
	mov   [edi],bl               ; putpixel
2736
 
2737
	sar   ecx,4                  ; error/16
2738
	adc   ecx,0                  ; round to integer
2739
	mov   ebx,ecx
2740
 
2741
	movzx eax,byte[edi+edx+3]    ; pixel (x+1;y+1)
2742
	add   eax,ecx                ; add error/16 to (x+1;y+1)
2743
	jge   @f                     ; check_overflow
2744
	xor   eax,eax
2745
	jmp   .ok
2746
@@:
2747
	cmp   eax,255
2748
	jle   .ok
2749
	or    al,255
2750
.ok:
2751
	mov   [edi+edx+3],al         ;putpixel
2752
 
2753
	imul  ecx,3
2754
	movzx eax,byte[edi+edx-3]    ; pixel (x-1;y+1)
2755
	add   eax,ecx                ; add 3*error/16 to (x-1;y+1)
2756
	jge   @f                     ; check_overflow
2757
	xor   eax,eax
2758
	jmp   .ok1
2759
@@:
2760
	cmp   eax,255
2761
	jle   .ok1
2762
	or    al,255
2763
.ok1:
2764
	mov   [edi+edx-3],al         ;putpixel
2765
 
2766
	mov   ecx,ebx
2767
	imul  ecx,5
2768
	movzx eax,byte[edi+edx]      ; pixel (x;y+1)
2769
	add   eax,ecx                ; add 5*error/16 to (x;y+1)
2770
	jge   @f                     ; check_overflow
2771
	xor   eax,eax
2772
	jmp   .ok2
2773
@@:
2774
	cmp   eax,255
2775
	jle   .ok2
2776
	or    al,255
2777
.ok2:
2778
	mov   [edi+edx],al           ;putpixel
2779
 
2780
	mov   ecx,ebx
2781
	imul  ecx,7
2782
	movzx eax,byte[edi+3]        ; pixel (x+1;y)
2783
	add   eax,ecx                ; add 7*error/16 to (x+1;y)
2784
	jge   @f                     ; check_overflow
2785
	xor   eax,eax
2786
	jmp   .ok3
2787
@@:
2788
	cmp   eax,255
2789
	jle   .ok3
2790
	or    al,255
2791
.ok3:
2792
	mov   [edi+3],al             ;putpixel
2793
 
2794
.next:
2795
	inc  edi
2796
	dec  esi
2797
	jnz  newp_1
2798
	ret
2799
 
2800
align 16
3138 heavyiron 2801
dither_2: ; Burkes algorithm
3105 IgorA 2802
newp_2:   ; Dithering cycle
2803
	xor   ebx,ebx ; At first threshold
2804
	movsx ecx,byte[edi]
2805
	cmp   cl,255
2806
	je    newp_2.next
2807
	test  cl,cl
2808
	jz    newp_2.next
2809
	jns   @f
2810
	dec   ebx
2811
@@:
2812
	mov   [edi],bl               ; putpixel
2813
 
2814
	sar   ecx,2                  ; error/4
2815
	adc   ecx,0                  ; round to integer
2816
 
2817
	movzx eax,byte[edi+3]        ; pixel (x+1;y)
2818
	add   eax,ecx                ; add error/4 to (x+1;y)
2819
	jge   @f                     ; check_overflow
2820
	xor   eax,eax
2821
	jmp   .ok
2822
@@:
2823
	cmp   eax,255
2824
	jle   .ok
2825
	or    al,255
2826
.ok:
2827
	mov   [edi+3],al             ; putpixel
2828
 
2829
	movzx eax,byte[edi+edx]      ; pixel (x;y+1)
2830
	add   eax,ecx                ; add error/4 to (x;y+1)
2831
	jge   @f                     ; check_overflow
2832
	xor   eax,eax
2833
	jmp   .ok1
2834
@@:
2835
	cmp   eax,255
2836
	jle   .ok1
2837
	or    al,255
2838
.ok1:
2839
	mov   [edi+edx],al           ; putpixel
2840
 
2841
	sar   ecx,1                  ; error/8
2842
	adc   ecx,0                  ; round to integer
2843
 
2844
	movzx eax,byte[edi+6]        ; pixel (x+2;y)
2845
	add   eax,ecx                ; add error/8 to (x+2;y)
2846
	jge   @f                     ; check_overflow
2847
	xor   eax,eax
2848
	jmp   .ok2
2849
@@:
2850
	cmp   eax,255
2851
	jle   .ok2
2852
	or    al,255
2853
.ok2:
2854
	mov   [edi+6],al             ; putpixel
2855
 
2856
	movzx eax,byte[edi+edx-3]    ; pixel (x-1;y+1)
2857
	add   eax,ecx                ; add error/8 to (x-1;y+1)
2858
	jge   @f                     ; check_overflow
2859
	xor   eax,eax
2860
	jmp   .ok3
2861
@@:
2862
	cmp   eax,255
2863
	jle   .ok3
2864
	or    al,255
2865
.ok3:
2866
	mov   [edi+edx-3],al         ; putpixel
2867
 
2868
	movzx eax,byte[edi+edx+3]    ; pixel (x+1;y+1)
2869
	add   eax,ecx                ; add error/8 to (x+1;y+1)
2870
	jge   @f                     ; check_overflow
2871
	xor   eax,eax
2872
	jmp   .ok4
2873
@@:
2874
	cmp   eax,255
2875
	jle   .ok4
2876
	or    al,255
2877
.ok4:
2878
	mov   [edi+edx+3],al         ; putpixel
2879
 
2880
	sar   ecx,1                  ; error/16
2881
	;adc   ecx,0                  ; round to integer
2882
 
2883
	movzx eax,byte[edi+edx-6]    ; pixel (x-2;y+1)
2884
	add   eax,ecx                ; add error/16 to (x-2;y+1)
2885
	jge   @f                     ; check_overflow
2886
	xor   eax,eax
2887
	jmp   .ok5
2888
@@:
2889
	cmp   eax,255
2890
	jle   .ok5
2891
	or    al,255
2892
.ok5:
2893
	mov   [edi+edx-6],al         ; putpixel
2894
 
2895
	movzx eax,byte[edi+edx+6]    ; pixel (x+2;y+1)
2896
	add   eax,ecx                ; add error/16 to (x+2;y+1)
2897
	jge   @f                     ; check_overflow
2898
	xor   eax,eax
2899
	jmp   .ok6
2900
@@:
2901
	cmp   eax,255
2902
	jle   .ok6
2903
	or    al,255
2904
.ok6:
2905
	mov   [edi+edx+6],al         ; putpixel
2906
 
2907
.next:
2908
	inc   edi
2909
	dec   esi
2910
	jnz   newp_2
2911
	ret
2912
 
2913
 
3138 heavyiron 2914
align 16
2915
dither_3:                        ; Heavyiron_mod algorithm
2916
 newp_3:                         ; Dithering cycle
2917
    xor   ebx,ebx                ; At first threshold
2918
    movzx ecx,byte[edi]
2919
    cmp   cl,255
2920
    je   .next
2921
    test  cl,cl
2922
    jz    .next
2923
    jns   @f
2924
    dec   ebx
2925
    sub   ecx,255
2926
  @@:
2927
    mov   [edi],bl               ; putpixel
3105 IgorA 2928
 
3138 heavyiron 2929
    sar   ecx,2                  ; error/4
2930
 
2931
    movzx eax,byte[edi+3]        ; pixel (x+1;y)
2932
    add   eax,ecx                ; add error/4 to (x+1;y)
2933
    jge   @f                     ; check_overflow
2934
    xor   eax,eax
2935
    jmp   .ok
2936
  @@:
2937
    cmp   eax,255
2938
    jle   .ok
2939
    or    al,255
2940
  .ok:
2941
    mov   [edi+3],al             ; putpixel
2942
 
2943
    movzx eax,byte[edi+edx-3]    ; pixel (x-1;y+1)
2944
    add   eax,ecx                ; add error/4 to (x-1;y+1)
2945
    jge   @f                     ; check_overflow
2946
    xor   eax,eax
2947
    jmp   .ok1
2948
  @@:
2949
    cmp   eax,255
2950
    jle   .ok1
2951
    or    al,255
2952
  .ok1:
2953
    mov   [edi+edx-3],al         ; putpixel
2954
 
2955
    movzx eax,byte[edi+edx]      ; pixel (x;y+1)
2956
    add   eax,ecx                ; add error/4 to (x;y+1)
2957
    jge   @f                     ; check_overflow
2958
    xor   eax,eax
2959
    jmp   .ok2
2960
  @@:
2961
    cmp   eax,255
2962
    jle   .ok2
2963
    or    al,255
2964
  .ok2:
2965
    mov   [edi+edx],al           ; putpixel
2966
 
2967
  .next:
2968
    inc   edi
2969
    dec   esi
2970
    jnz   newp_3
2971
    ret
2972
 
2973
align 16
2974
dither_4:                        ; Atkinson algorithm
2975
 newp_4:                         ; Dithering cycle
2976
 
2977
    xor   ebx,ebx                ; At first threshold
2978
    movsx ecx,byte[edi]
2979
    cmp   cl,255
2980
    je   .next
2981
    test  cl,cl
2982
    jz    .next
2983
    jns   @f
2984
    dec   ebx
2985
  @@:
2986
    mov   [edi],bl               ; putpixel
2987
 
2988
    sar   ecx,3                  ; error/8
2989
 
2990
    movzx eax,byte[edi+3]        ; pixel (x+1;y)
2991
    add   eax,ecx                ; add error/8 to (x+1;y)
2992
    jge   @f                     ; check_overflow
2993
    xor   eax,eax
2994
    jmp   .ok
2995
  @@:
2996
    cmp   eax,255
2997
    jle   .ok
2998
    or    al,255
2999
  .ok:
3000
    mov   [edi+3],al             ; putpixel
3001
 
3002
    movzx eax,byte[edi+edx]      ; pixel (x;y+1)
3003
    add   eax,ecx                ; add error/8 to (x;y+1)
3004
    jge   @f                     ; check_overflow
3005
    xor   eax,eax
3006
    jmp   .ok1
3007
  @@:
3008
    cmp   eax,255
3009
    jle   .ok1
3010
    or    al,255
3011
  .ok1:
3012
    mov   [edi+edx],al           ; putpixel
3013
 
3014
    movzx eax,byte[edi+6]        ; pixel (x+2;y)
3015
    add   eax,ecx                ; add error/8 to (x+2;y)
3016
    jge   @f                     ; check_overflow
3017
    xor   eax,eax
3018
    jmp   .ok2
3019
  @@:
3020
    cmp   eax,255
3021
    jle   .ok2
3022
    or    al,255
3023
  .ok2:
3024
    mov   [edi+6],al             ; putpixel
3025
 
3026
    movzx eax,byte[edi+edx-3]    ; pixel (x-1;y+1)
3027
    add   eax,ecx                ; add error/8 to (x-1;y+1)
3028
    jge   @f                     ; check_overflow
3029
    xor   eax,eax
3030
    jmp   .ok3
3031
  @@:
3032
    cmp   eax,255
3033
    jle   .ok3
3034
    or    al,255
3035
  .ok3:
3036
    mov   [edi+edx-3],al         ; putpixel
3037
 
3038
    movzx eax,byte[edi+edx+3]    ; pixel (x+1;y+1)
3039
    add   eax,ecx                ; add error/8 to (x+1;y+1)
3040
    jge   @f                     ; check_overflow
3041
    xor   eax,eax
3042
    jmp   .ok4
3043
  @@:
3044
    cmp   eax,255
3045
    jle   .ok4
3046
    or    al,255
3047
  .ok4:
3048
    mov   [edi+edx+3],al         ; putpixel
3049
 
3050
 
3051
    movzx eax,byte[edi+edx+edx]    ; pixel (x;y+2)
3052
    add   eax,ecx                ; add error/8 to (x;y+2)
3053
    jge   @f                     ; check_overflow
3054
    xor   eax,eax
3055
    jmp   .ok5
3056
  @@:
3057
    cmp   eax,255
3058
    jle   .ok5
3059
    or    al,255
3060
  .ok5:
3061
    mov   [edi+edx+edx],al         ; putpixel
3062
 
3063
  .next:
3064
    inc   edi
3065
    dec   esi
3066
    jnz   newp_4
3067
    ret
3068
 
3069
 
2748 IgorA 3070
 
6175 IgorA 3071
include 'fun_voxel.inc' ;функции для работы с воксельной графикой
2748 IgorA 3072
 
6210 IgorA 3073
txt_err_size_0 db 'image size < 1 pixel',13,10,0
1535 IgorA 3074
txt_err_n8b db 'need buffer 8 bit',13,10,0
3075
txt_err_n24b db 'need buffer 24 bit',13,10,0
2815 IgorA 3076
txt_err_n32b db 'need buffer 32 bit',13,10,0
2358 IgorA 3077
txt_err_n8_24b db 'need buffer 8 or 24 bit',13,10,0
1535 IgorA 3078
 
3079
align 16
3080
EXPORTS:
3081
	dd sz_lib_init, lib_init
3082
	dd sz_buf2d_create, buf_create
3083
	dd sz_buf2d_create_f_img, buf_create_f_img
3084
	dd sz_buf2d_clear, buf_clear
3085
	dd sz_buf2d_draw, buf_draw_buf
3086
	dd sz_buf2d_delete, buf_delete
2136 IgorA 3087
	dd sz_buf2d_resize, buf_resize
2975 IgorA 3088
	dd sz_buf2d_rotate, buf_rotate
1535 IgorA 3089
	dd sz_buf2d_line, buf_line_brs
2230 IgorA 3090
	dd sz_buf2d_line_sm, buf_line_brs_sm
1634 IgorA 3091
	dd sz_buf2d_rect_by_size, buf_rect_by_size
1642 IgorA 3092
	dd sz_buf2d_filled_rect_by_size, buf_filled_rect_by_size
1535 IgorA 3093
	dd sz_buf2d_circle, buf_circle
3094
	dd sz_buf2d_img_hdiv2, buf_img_hdiv2
3095
	dd sz_buf2d_img_wdiv2, buf_img_wdiv2
3096
	dd sz_buf2d_conv_24_to_8, buf_conv_24_to_8
3097
	dd sz_buf2d_conv_24_to_32, buf_conv_24_to_32
3098
	dd sz_buf2d_bit_blt, buf_bit_blt
3099
	dd sz_buf2d_bit_blt_transp, buf_bit_blt_transp
3100
	dd sz_buf2d_bit_blt_alpha, buf_bit_blt_alpha
1727 IgorA 3101
	dd sz_buf2d_curve_bezier, buf_curve_bezier
1535 IgorA 3102
	dd sz_buf2d_convert_text_matrix, buf_convert_text_matrix
3103
	dd sz_buf2d_draw_text, buf_draw_text
3104
	dd sz_buf2d_crop_color, buf_crop_color
3105
	dd sz_buf2d_offset_h, buf_offset_h
1684 IgorA 3106
	dd sz_buf2d_flood_fill, buf_flood_fill
1910 IgorA 3107
	dd sz_buf2d_set_pixel, buf_set_pixel
2658 IgorA 3108
	dd sz_buf2d_get_pixel, buf_get_pixel
5389 IgorA 3109
	dd sz_buf2d_flip_h, buf_flip_h
3040 IgorA 3110
	dd sz_buf2d_flip_v, buf_flip_v
3105 IgorA 3111
	dd sz_buf2d_filter_dither, buf_filter_dither
2748 IgorA 3112
	dd sz_buf2d_vox_brush_create, vox_brush_create
3113
	dd sz_buf2d_vox_brush_delete, vox_brush_delete
2758 IgorA 3114
	dd sz_buf2d_vox_obj_get_img_w_3g, buf_vox_obj_get_img_w_3g
3115
	dd sz_buf2d_vox_obj_get_img_h_3g, buf_vox_obj_get_img_h_3g
2815 IgorA 3116
	dd sz_buf2d_vox_obj_draw_1g, buf_vox_obj_draw_1g
2758 IgorA 3117
	dd sz_buf2d_vox_obj_draw_3g, buf_vox_obj_draw_3g
3118
	dd sz_buf2d_vox_obj_draw_3g_scaled, buf_vox_obj_draw_3g_scaled
3119
	dd sz_buf2d_vox_obj_draw_pl, buf_vox_obj_draw_pl
3120
	dd sz_buf2d_vox_obj_draw_pl_scaled, buf_vox_obj_draw_pl_scaled
3121
	dd sz_buf2d_vox_obj_draw_3g_shadows, buf_vox_obj_draw_3g_shadows
1535 IgorA 3122
	dd 0,0
3123
	sz_lib_init db 'lib_init',0
3124
	sz_buf2d_create db 'buf2d_create',0
3125
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
3126
	sz_buf2d_clear db 'buf2d_clear',0 ;очистка буфера указанным цветом
3127
	sz_buf2d_draw db 'buf2d_draw',0
3128
	sz_buf2d_delete db 'buf2d_delete',0
2136 IgorA 3129
	sz_buf2d_resize db 'buf2d_resize',0
2975 IgorA 3130
	sz_buf2d_rotate db 'buf2d_rotate',0
1535 IgorA 3131
	sz_buf2d_line db 'buf2d_line',0 ;рисование линии
2230 IgorA 3132
	sz_buf2d_line_sm db 'buf2d_line_sm',0 ;рисование сглаженной линии
1642 IgorA 3133
	sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 ;рисование рамки прямоугольника, 2-я координата задана по размеру
3134
	sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 ;рисование залитого прямоугольника, 2-я координата задана по размеру
1535 IgorA 3135
	sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности
3136
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 ;сжатие изображения по высоте в 2 раза (размер буфера не меняется)
3137
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 ;сжатие изображения по ширине в 2 раза (размер буфера не меняется)
3138
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
3139
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
3140
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
3141
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
3142
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
1727 IgorA 3143
	sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
1535 IgorA 3144
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
3145
	sz_buf2d_draw_text db 'buf2d_draw_text',0
3146
	sz_buf2d_crop_color db 'buf2d_crop_color',0
3147
	sz_buf2d_offset_h db 'buf2d_offset_h',0
1684 IgorA 3148
	sz_buf2d_flood_fill db 'buf2d_flood_fill',0
1910 IgorA 3149
	sz_buf2d_set_pixel db 'buf2d_set_pixel',0
2658 IgorA 3150
	sz_buf2d_get_pixel db 'buf2d_get_pixel',0
5389 IgorA 3151
	sz_buf2d_flip_h db 'buf2d_flip_h',0
3040 IgorA 3152
	sz_buf2d_flip_v db 'buf2d_flip_v',0
3105 IgorA 3153
	sz_buf2d_filter_dither db 'buf2d_filter_dither',0
2748 IgorA 3154
	sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0
3155
	sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0
2758 IgorA 3156
	sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0
3157
	sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0
2815 IgorA 3158
	sz_buf2d_vox_obj_draw_1g db 'buf2d_vox_obj_draw_1g',0
2758 IgorA 3159
	sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0
3160
	sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0
3161
	sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0
3162
	sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0
3163
	sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0