Subversion Repositories Kolibri OS

Rev

Rev 2185 | Rev 2358 | 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
 
64
;input:
65
; ebx = coord x
66
; ecx = coord y
67
; edx = pixel color
68
; edi = pointer to buffer struct
69
align 4
70
draw_pixel:
71
	;cmp buf2d_bits,24
72
	;jne @f
73
	bt ebx,31
74
	jc @f
75
	bt ecx,31
76
	jc @f
77
	cmp ebx,buf2d_w
78
	jge @f
79
	cmp ecx,buf2d_h
80
	jge @f
81
	push esi
82
		mov esi,buf2d_w ;size x
83
		imul esi,ecx ;size_x*y
84
		add esi,ebx	 ;size_x*y+x
85
		lea esi,[esi+esi*2] ;(size_x*y+x)*3
86
		add esi,buf2d_data  ;ptr+(size_x*y+x)*3
1684 IgorA 87
 
1535 IgorA 88
		mov word[esi],dx ;copy pixel color
89
		ror edx,16
90
		mov byte[esi+2],dl
91
		ror edx,16
92
	pop esi
93
	@@:
94
	ret
95
 
1684 IgorA 96
;input:
97
; ebx = coord x
98
; ecx = coord y
99
; edi = pointer to buffer struct
100
;output:
101
; eax = цвет точки
102
; в случае ошибки eax = 0xffffffff
103
align 4
104
get_pixel_24:
105
	mov eax,0xffffffff
106
 
107
	bt ebx,31
108
	jc @f
109
	bt ecx,31
110
	jc @f
111
	cmp ebx,buf2d_w
112
	jge @f
113
	cmp ecx,buf2d_h
114
	jge @f
115
	push esi
116
		mov esi,buf2d_w ;size x
117
		imul esi,ecx ;size_x*y
118
		add esi,ebx	 ;size_x*y+x
119
		lea esi,[esi+esi*2] ;(size_x*y+x)*3
120
		add esi,buf2d_data  ;ptr+(size_x*y+x)*3
121
 
122
		xor eax,eax
123
		mov ax,word[esi] ;copy pixel color
124
		ror eax,16
125
		mov al,byte[esi+2]
126
		ror eax,16
127
	pop esi
128
	@@:
129
	ret
130
 
2230 IgorA 131
;input:
132
; ebx = coord x
133
; ecx = coord y
134
; edx = pixel color + transparent
135
; edi = pointer to buffer struct
136
; t_prop, m_prop - коэфициенты необходимые для вычисления степени прозрачности
137
align 4
138
transp_32 dd 0 ;цвет рисуемой точки + прозрачность
139
align 4
140
proc draw_pixel_transp, t_prop:dword, m_prop:dword
141
	;cmp buf2d_bits,24
142
	;jne @f
143
	bt ebx,31
144
	jc @f
145
	bt ecx,31
146
	jc @f
147
	cmp ebx,buf2d_w
148
	jge @f
149
	cmp ecx,buf2d_h
150
	jge @f
151
	push eax ebx edx edi esi
152
		mov esi,buf2d_w ;size x
153
		imul esi,ecx ;size_x*y
154
		add esi,ebx	 ;size_x*y+x
155
		lea esi,[esi+esi*2] ;(size_x*y+x)*3
156
		add esi,buf2d_data  ;ptr+(size_x*y+x)*3
1684 IgorA 157
 
2230 IgorA 158
		mov edi,esi ;указатель на цвет фона
159
		mov dword[transp_32],edx ;цвет рисуемой точки
160
 
161
		xor edx,edx
162
		mov eax,[t_prop]
163
		shl eax,8 ;*=256
164
		mov ebx,[m_prop]
165
		div ebx ;вычисляем коэф. прозрачности (должен быть от 0 до 255)
166
		bt ax,8
167
		jnc .over_255
168
			;если коеф. прозрачности >=256 то уменьшаем его до 255
169
			mov al,0xff
170
		.over_255:
171
 
172
		mov byte[transp_32+3],al ;прозрачность рисуемой точки
173
		mov esi,dword transp_32 ;указатель на цвет рисуемой точки
174
 
175
		call combine_colors
176
	pop esi edi edx ebx eax
177
	@@:
178
	ret
179
endp
180
 
1535 IgorA 181
;создание буфера
182
align 4
183
proc buf_create, buf_struc:dword
184
	pushad
185
	mov edi,dword[buf_struc]
186
	mov ecx,buf2d_w
187
	mov ebx,buf2d_h
188
	imul ecx,ebx
189
	cmp buf2d_bits,24
190
	jne @f
191
		lea ecx,[ecx+ecx*2] ; 24 bit = 3
192
		;;;inc ecx ;запасной байт в конце буфера, что-бы не глючили некоторые функции на изображениях кратных 4К
193
	@@:
194
	cmp buf2d_bits,32
195
	jne @f
196
		shl ecx,2 ; 32 bit = 4
197
	@@:
198
	invoke mem.alloc,ecx
199
	mov buf2d_data,eax
200
 
201
	stdcall buf_clear,edi,buf2d_color ;очистка буфера фоновым цветом
202
	popad
203
	ret
204
endp
205
 
206
;создание буфера на основе изображения rgb
207
align 4
208
proc buf_create_f_img, buf_struc:dword, rgb_data:dword
209
	pushad
210
	mov edi,dword[buf_struc]
211
	mov ecx,buf2d_w
212
	mov ebx,buf2d_h
213
	imul ecx,ebx
214
	cmp buf2d_bits,24
215
	jne @f
216
		lea ecx,[ecx+ecx*2] ; 24 bit = 3
217
		;;;inc ecx ;запасной байт в конце буфера, что-бы не глючили некоторые функции на изображениях кратных 4К
218
	@@:
219
	cmp buf2d_bits,32
220
	jne @f
221
		shl ecx,2 ; 32 bit = 4
222
	@@:
223
	invoke mem.alloc,ecx
224
	mov buf2d_data,eax
225
 
226
	cmp buf2d_bits,24
227
	jne @f
228
		cld
229
		mov esi,[rgb_data]
230
		mov edi,eax ;eax=buf2d_data
231
		rep movsb ;копируем биты изображения в буфер
232
		jmp .end_create
233
	@@:
234
		stdcall buf_clear,edi,buf2d_color ;очистка буфера фоновым цветом
235
	.end_create:
236
	popad
237
	ret
238
endp
239
 
240
align 4
241
proc buf_clear, buf_struc:dword, color:dword ;очистка буфера заданым цветом
242
	pushad
243
	mov edi,dword[buf_struc]
244
 
245
	mov ecx,buf2d_w
246
	mov ebx,buf2d_h
247
	imul ecx,ebx
248
 
249
	cld
250
 
251
	cmp buf2d_bits,8
252
	jne .end_clear_8
253
		mov edi,buf2d_data
254
		mov al,byte[color]
255
		rep stosb
256
		jmp .end_clear_32
257
	.end_clear_8:
258
 
259
	cmp buf2d_bits,24
260
	jne .end_clear_24
261
		mov edi,buf2d_data
262
		mov eax,dword[color]
263
		mov ebx,eax
264
		shr ebx,16
265
		@@:
266
			stosw
267
			mov byte[edi],bl
268
			inc edi
269
			loop @b
270
		jmp .end_clear_32
271
	.end_clear_24:
272
 
273
	cmp buf2d_bits,32
274
	jne .end_clear_32
275
		mov edi,buf2d_data
276
		mov eax,dword[color]
277
		rep stosd
278
		;jmp .end_clear_32
279
	.end_clear_32:
280
	popad
281
	ret
282
endp
283
 
1538 IgorA 284
;функция для обрезания буферов 8 и 24 битных, по заданому цвету.
285
;параметр opt задается комбинацией констант:
286
; BUF2D_OPT_CROP_TOP - обрезка сверху
287
; BUF2D_OPT_CROP_LEFT - обрезка слева
288
; BUF2D_OPT_CROP_BOTTOM - обрезка снизу
289
; BUF2D_OPT_CROP_RIGHT - обрезка справа
1535 IgorA 290
align 4
1538 IgorA 291
proc buf_crop_color, buf_struc:dword, color:dword, opt:dword
1535 IgorA 292
locals
293
	crop_r dd ?
294
endl
295
	pushad
296
	mov edi,dword[buf_struc]
297
	cmp buf2d_bits,24
298
	jne .24end_f
299
 
300
	bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM
301
	jae .24no_crop_bottom
302
		mov eax,dword[color]
303
		mov edx,eax ;ax = colors - r,g
304
		shr edx,16 ;dl = color - b
305
		mov ecx,buf2d_h
1555 IgorA 306
		cmp ecx,1
307
		jle .24no_crop_bottom ;проверяем на случай если высота буфера 1 пиксель
1535 IgorA 308
		mov ebx,buf2d_w
309
		imul ecx,ebx
310
		lea esi,[ecx+ecx*2] ;esi=3*ecx
311
		add esi,buf2d_data
312
		cld
313
		@@:
314
			sub esi,3
315
			cmp word[esi],ax
316
			jne @f
317
			cmp byte[esi+2],dl
318
			jne @f
319
			loop @b
320
		@@:
321
		lea ebx,[ebx+ebx*2]
322
		xor edx,edx
323
		mov eax,buf2d_h
324
		imul eax,ebx
325
		add eax,buf2d_data ;eax - указатель на конец буфера изображения
326
		@@:
327
			add esi,ebx
328
			cmp esi,eax
329
			jge @f
330
			inc edx ;вычисляем число полных строк для обрезания
331
			loop @b
332
		@@:
333
		cmp edx,0
334
		je .24no_crop_bottom
335
			cmp edx,buf2d_h
336
			jge .24no_crop_bottom ;что-бы не получить пустой буфер
337
			sub buf2d_h,edx ;уменьшаем высоту буфера
338
			mov ecx,buf2d_h
339
			imul ecx,ebx ;ecx = новый размер изображения
340
			invoke mem.realloc,buf2d_data,ecx
341
			mov buf2d_data,eax ;на случай если изменился указатель на данные
342
	.24no_crop_bottom:
343
 
344
	bt dword[opt],BUF2D_BIT_OPT_CROP_TOP
345
	jae .24no_crop_top
346
		mov eax,dword[color]
347
		mov edx,eax ;ax = colors - r,g
348
		shr edx,16 ;dl = color - b
349
		mov esi,buf2d_data
350
		mov ecx,buf2d_h
1555 IgorA 351
		cmp ecx,1
352
		jle .24no_crop_top ;проверяем на случай если высота буфера 1 пиксель
1535 IgorA 353
		dec ecx ;при обрезании должна остаться минимум 1-на строка пикселей
354
		mov ebx,buf2d_w
355
		imul ecx,ebx
356
		cld
357
		@@:
358
			cmp word[esi],ax
359
			jne @f
360
			cmp byte[esi+2],dl
361
			jne @f
362
			add esi,3
363
			loop @b
364
		@@:
365
		lea ebx,[ebx+ebx*2]
366
		xor edx,edx
367
		@@:
368
			sub esi,ebx
369
			cmp esi,buf2d_data
370
			jl @f
371
			inc edx ;вычисляем число полных строк для обрезания
372
			loop @b
373
		@@:
374
		cmp edx,0
375
		je .24no_crop_top
376
			xor eax,eax
377
			sub eax,edx
378
			mov ebx,buf2d_h
379
			sub ebx,edx
380
			stdcall buf_offset_h, edi, eax, edx, ebx ;сдвигаем изображение в буфере вверх (eax<0)
381
			sub buf2d_h,edx ;уменьшаем высоту буфера
382
			mov ecx,buf2d_h
383
			add buf2d_t,dx ;сдвигаем отступ вниз, на число обрезанных строк
384
			mov ebx,buf2d_w
385
			imul ecx,ebx
386
			lea ecx,[ecx+ecx*2]
387
			invoke mem.realloc,buf2d_data,ecx
388
			mov buf2d_data,eax ;на случай если изменился указатель на данные
389
	.24no_crop_top:
390
 
391
	bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT
392
	jae .24no_crop_right
393
		mov eax,dword[color]
394
		mov edx,eax ;ax = colors - r,g
395
		shr edx,16 ;dl = color - b
396
		mov ebx,buf2d_w
1555 IgorA 397
		cmp ebx,1
398
		jle .24no_crop_right ;на случай если ширина буфера 1 пиксель
1535 IgorA 399
		lea ebx,[ebx+ebx*2]
400
		mov esi,ebx
401
		imul esi,buf2d_h
402
		add esi,buf2d_data ;esi - указатель на конец буфера изображения
403
		mov dword[crop_r],0
404
		cld
1538 IgorA 405
		.24found_beg_right:
1535 IgorA 406
		sub esi,3 ;двигаемся на 1-ну колонку влево
407
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
408
		@@:
409
			cmp word[esi],ax
1538 IgorA 410
			jne .24found_right
1535 IgorA 411
			cmp byte[esi+2],dl
1538 IgorA 412
			jne .24found_right
1535 IgorA 413
			sub esi,ebx ;прыгаем на верхнюю строку
414
			loop @b
415
		inc dword[crop_r]
416
 
417
		mov ecx,buf2d_w
418
		dec ecx ;1 колонка на запас
419
		cmp dword[crop_r],ecx
1538 IgorA 420
		jge .24found_right
1535 IgorA 421
 
422
		sub esi,3 ;двигаемся на 1-ну колонку влево
423
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
424
		@@:
425
			add esi,ebx ;прыгаем на нижнюю строку
426
			cmp word[esi],ax
1538 IgorA 427
			jne .24found_right
1535 IgorA 428
			cmp byte[esi+2],dl
1538 IgorA 429
			jne .24found_right
1535 IgorA 430
			loop @b
431
		inc dword[crop_r]
432
 
433
		mov ecx,buf2d_w
434
		dec ecx ;1 колонка на запас
435
		cmp dword[crop_r],ecx
1538 IgorA 436
		jl .24found_beg_right
1535 IgorA 437
 
1538 IgorA 438
		.24found_right:
1535 IgorA 439
		cmp dword[crop_r],0
440
		je .24no_crop_right
441
			mov ecx,buf2d_w
442
			sub ecx,dword[crop_r]
1538 IgorA 443
			stdcall img_rgb_crop_r, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру
1535 IgorA 444
			mov buf2d_w,ecx ;ставим новую ширину для буфера
445
			mov ebx,buf2d_h
446
			imul ecx,ebx
447
			lea ecx,[ecx+ecx*2]
448
			invoke mem.realloc,buf2d_data,ecx
449
			mov buf2d_data,eax ;на случай если изменился указатель на данные
450
	.24no_crop_right:
451
 
1538 IgorA 452
	bt dword[opt],BUF2D_BIT_OPT_CROP_LEFT
453
	jae .24no_crop_left
454
		mov eax,dword[color]
455
		mov edx,eax ;ax = colors - r,g
456
		shr edx,16 ;dl = color - b
457
		mov ebx,buf2d_w
1555 IgorA 458
		cmp ebx,1
459
		jle .24no_crop_left ;на случай если ширина буфера 1 пиксель
1538 IgorA 460
		lea ebx,[ebx+ebx*2]
461
		mov esi,buf2d_data ;esi - указатель на начоло буфера изображения
462
		mov dword[crop_r],0
463
		cld
464
		.24found_beg_left:
465
 
466
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
467
		@@:
468
			cmp word[esi],ax
469
			jne .24found_left
470
			cmp byte[esi+2],dl
471
			jne .24found_left
472
			add esi,ebx ;прыгаем на нижнюю строку
473
			loop @b
474
		inc dword[crop_r]
475
		add esi,3 ;двигаемся на 1-ну колонку вправо
476
 
477
		mov ecx,buf2d_w
478
		dec ecx ;1 колонка на запас
479
		cmp dword[crop_r],ecx
480
		jge .24found_left
481
 
482
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
483
		@@:
484
			sub esi,ebx ;прыгаем на верхнюю строку
485
			cmp word[esi],ax
486
			jne .24found_left
487
			cmp byte[esi+2],dl
488
			jne .24found_left
489
			loop @b
490
		inc dword[crop_r]
491
		add esi,3 ;двигаемся на 1-ну колонку вправо
492
 
493
		mov ecx,buf2d_w
494
		dec ecx ;1 колонка на запас
495
		cmp dword[crop_r],ecx
496
		jl .24found_beg_left
497
 
498
		.24found_left:
499
		cmp dword[crop_r],0
500
		je .24no_crop_left
501
			mov ecx,buf2d_w
502
			sub ecx,dword[crop_r]
503
			stdcall img_rgb_crop_l, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру
504
			mov buf2d_w,ecx ;ставим новую ширину для буфера
505
			mov ebx,buf2d_h
506
			imul ecx,ebx
507
			lea ecx,[ecx+ecx*2]
508
			invoke mem.realloc,buf2d_data,ecx
509
			mov buf2d_data,eax ;на случай если изменился указатель на данные
510
			mov eax,dword[crop_r]
511
			add buf2d_l,ax
512
	.24no_crop_left:
513
 
1535 IgorA 514
	.24end_f:
515
 
516
 
517
	cmp buf2d_bits,8
518
	jne .8end_f
519
 
520
	bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM
521
	jae .8no_crop_bottom
522
		mov eax,dword[color]
523
		mov esi,buf2d_data
524
		mov ecx,buf2d_h
1555 IgorA 525
		cmp ecx,1
526
		jle .8no_crop_bottom ;проверяем на случай если высота буфера 1 пиксель
1535 IgorA 527
		mov ebx,buf2d_w
528
		imul ecx,ebx
529
		mov esi,ecx
530
		add esi,buf2d_data
531
		cld
532
		@@:
533
			dec esi
534
			cmp byte[esi],al
535
			jne @f
536
			loop @b
537
		@@:
538
		xor edx,edx
539
		mov eax,buf2d_h
540
		imul eax,ebx
541
		add eax,buf2d_data ;eax - указатель на конец буфера изображения
542
		@@:
543
			add esi,ebx
544
			cmp esi,eax
545
			jge @f
546
			inc edx
547
			loop @b
548
		@@:
549
		cmp edx,0
550
		je .8no_crop_bottom
551
			cmp edx,buf2d_h
552
			jge .8no_crop_bottom ;что-бы не получить пустой буфер
553
			sub buf2d_h,edx ;уменьшаем высоту буфера
554
			mov ecx,buf2d_h
555
			imul ecx,ebx ;ecx = новый размер изображения
556
			invoke mem.realloc,buf2d_data,ecx
557
			mov buf2d_data,eax ;на случай если изменился указатель на данные
558
	.8no_crop_bottom:
559
 
560
	bt dword[opt],BUF2D_BIT_OPT_CROP_TOP
561
	jae .8no_crop_top
562
		mov eax,dword[color]
563
		mov esi,buf2d_data
564
		mov ecx,buf2d_h
1555 IgorA 565
		cmp ecx,1
566
		jle .8no_crop_top ;проверяем на случай если высота буфера 1 пиксель
1535 IgorA 567
		dec ecx ;при обрезании должна остаться минимум 1-на строка пикселей
568
		mov ebx,buf2d_w
569
		imul ecx,ebx
570
		cld
571
		@@:
572
			cmp byte[esi],al
573
			jne @f
574
			inc esi
575
			loop @b
576
		@@:
577
		xor edx,edx
578
		@@:
579
			sub esi,ebx
580
			cmp esi,buf2d_data
581
			jl @f
582
			inc edx
583
			loop @b
584
		@@:
585
		cmp edx,0
586
		je .8no_crop_top
587
			xor eax,eax
588
			sub eax,edx
589
			mov ebx,buf2d_h
590
			sub ebx,edx
591
			stdcall buf_offset_h, edi, eax, edx, ebx
592
			mov ecx,buf2d_h
593
			sub ecx,edx
594
			mov buf2d_h,ecx ;уменьшаем высоту буфера
595
			add buf2d_t,dx ;сдвигаем отступ вниз, на число обрезанных строк
596
			mov ebx,buf2d_w
597
			imul ecx,ebx
598
			invoke mem.realloc,buf2d_data,ecx
599
			mov buf2d_data,eax ;на случай если изменился указатель на данные
600
	.8no_crop_top:
601
 
602
	bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT
603
	jae .8no_crop_right
604
		mov eax,dword[color]
605
		mov ebx,buf2d_w
1555 IgorA 606
		cmp ebx,1
607
		jle .8no_crop_right ;на случай если ширина буфера 1 пиксель
1535 IgorA 608
		mov esi,ebx
609
		imul esi,buf2d_h
610
		add esi,buf2d_data ;esi - указатель на конец буфера изображения
611
		xor edx,edx
612
		cld
613
 
614
		.8found_beg:
615
		dec esi ;двигаемся на 1-ну колонку влево
616
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
617
		@@:
618
			cmp byte[esi],al
619
			jne .8found
620
			sub esi,ebx ;прыгаем на верхнюю строку
621
			loop @b
622
		inc edx
623
		mov ecx,buf2d_w
624
		dec ecx ;1 колонка на запас
625
		cmp edx,ecx
626
		jge .8found
627
 
628
		dec esi ;двигаемся на 1-ну колонку влево
629
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
630
		@@:
631
			add esi,ebx ;прыгаем на нижнюю строку
632
			cmp byte[esi],al
633
			jne .8found
634
			loop @b
635
		inc edx
636
 
637
		mov ecx,buf2d_w
638
		dec ecx ;1 колонка на запас
639
		cmp edx,ecx
640
		jl .8found_beg
641
 
642
		.8found:
643
		cmp edx,0
644
		je .8no_crop_right
645
			mov ecx,buf2d_w
646
			sub ecx,edx
1538 IgorA 647
			stdcall img_gray_crop_r, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру
1535 IgorA 648
			mov buf2d_w,ecx ;ставим новую ширину для буфера
649
			mov ebx,buf2d_h
650
			imul ecx,ebx
651
			invoke mem.realloc,buf2d_data,ecx
652
			mov buf2d_data,eax ;на случай если изменился указатель на данные
653
	.8no_crop_right:
654
 
1538 IgorA 655
	bt dword[opt],BUF2D_BIT_OPT_CROP_LEFT
656
	jae .8no_crop_left
657
		mov eax,dword[color]
658
		mov ebx,buf2d_w
1555 IgorA 659
		cmp ebx,1
660
		jle .8no_crop_left ;на случай если ширина буфера 1 пиксель
1538 IgorA 661
		mov esi,buf2d_data ;esi - указатель на начоло буфера изображения
662
		mov edx,0
663
		cld
664
		.8found_beg_left:
665
 
666
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
667
		@@:
668
			cmp word[esi],ax
669
			jne .8found_left
670
			add esi,ebx ;прыгаем на нижнюю строку
671
			loop @b
672
		inc edx
673
		inc esi ;двигаемся на 1-ну колонку вправо
674
 
675
		mov ecx,buf2d_w
676
		dec ecx ;1 колонка на запас
677
		cmp edx,ecx
678
		jge .8found_left
679
 
680
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
681
		@@:
682
			sub esi,ebx ;прыгаем на верхнюю строку
683
			cmp word[esi],ax
684
			jne .8found_left
685
			loop @b
686
		inc edx
687
		inc esi ;двигаемся на 1-ну колонку вправо
688
 
689
		mov ecx,buf2d_w
690
		dec ecx ;1 колонка на запас
691
		cmp edx,ecx
692
		jl .8found_beg_left
693
 
694
		.8found_left:
695
		cmp edx,0
696
		je .8no_crop_left
697
			mov ecx,buf2d_w
698
			sub ecx,edx
699
			stdcall img_gray_crop_l, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру
700
			mov buf2d_w,ecx ;ставим новую ширину для буфера
701
			mov ebx,buf2d_h
702
			imul ecx,ebx
703
			invoke mem.realloc,buf2d_data,ecx
704
			mov buf2d_data,eax ;на случай если изменился указатель на данные
705
			mov eax,edx
706
			add buf2d_l,ax
707
	.8no_crop_left:
708
 
1535 IgorA 709
	.8end_f:
710
 
711
	popad
712
	ret
713
endp
714
 
1538 IgorA 715
;обрезаем цветное изображение с правой стороны
1535 IgorA 716
;input:
717
;data_rgb - pointer to rgb data
718
;size_w_old - width img in pixels
719
;size_w_new - new width img in pixels
720
;size_h - height img in pixels
721
align 4
1538 IgorA 722
proc img_rgb_crop_r, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword
1535 IgorA 723
	pushad
724
	mov eax, dword[size_w_old]
725
	lea eax, dword[eax+eax*2] ;eax = width(old) * 3(rgb)
726
	mov ebx, dword[size_w_new]
727
	lea ebx, dword[ebx+ebx*2] ;ebx = width(new) * 3(rgb)
728
	mov edx, dword[size_h]
729
	mov edi, dword[data_rgb] ;edi - получает данные
730
	mov esi, edi
731
	add edi, ebx
732
	add esi, eax
733
	cld
734
	@@:
735
		dec edx ;уменьшаем счетчик оставшихся строк на 1
736
		cmp edx,0
737
		jle @f
738
		mov ecx, ebx
739
		rep movsb ;перенос (копирование) строки пикселей
740
		add esi,eax ;переход на новую строчку изображения
741
		sub esi,ebx
742
		jmp @b
743
	@@:
744
	popad
745
	ret
746
endp
747
 
1538 IgorA 748
;обрезаем серое изображение с правой стороны
1535 IgorA 749
;input:
750
;data_gray - pointer to gray data
751
;size_w_old - width img in pixels
752
;size_w_new - new width img in pixels
753
;size_h - height img in pixels
754
align 4
1538 IgorA 755
proc img_gray_crop_r, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword
1535 IgorA 756
	pushad
757
	mov eax, dword[size_w_old]
758
	mov ebx, dword[size_w_new]
759
	mov edx, dword[size_h]
760
	mov edi, dword[data_gray] ;edi - получает данные
761
	mov esi, edi
762
	add edi, ebx
763
	add esi, eax
764
	cld
765
	@@:
766
		dec edx ;уменьшаем счетчик оставшихся строк на 1
767
		cmp edx,0
768
		jle @f
769
		mov ecx, ebx
770
		rep movsb ;перенос (копирование) строки пикселей
771
		add esi,eax ;переход на новую строчку изображения
772
		sub esi,ebx
773
		jmp @b
774
	@@:
775
	popad
776
	ret
777
endp
778
 
1538 IgorA 779
;обрезаем цветное изображение с левой стороны
780
;input:
781
;data_rgb - pointer to rgb data
782
;size_w_old - width img in pixels
783
;size_w_new - new width img in pixels
784
;size_h - height img in pixels
785
align 4
786
proc img_rgb_crop_l, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword
787
	pushad
788
	mov edi,dword[data_rgb]
789
	mov esi,edi
790
	mov eax,dword[size_w_old]
791
	mov ebx,dword[size_w_new]
792
	cmp eax,ebx
793
	jle .end_f ;старый размер изображения не может быть меньше нового (при условии обрезания картинки)
794
		lea eax,[eax+eax*2]
795
		lea ebx,[ebx+ebx*2]
796
		sub eax,ebx
797
		mov edx,dword[size_h] ;высота изображения
798
		cld
799
		@@:
800
			add esi,eax
801
			mov ecx,ebx
802
			rep movsb
803
			dec edx
804
			cmp edx,0
805
			jg @b
806
	.end_f:
807
	popad
808
	ret
809
endp
810
 
811
;обрезаем серое изображение с левой стороны
812
;input:
813
;data_gray - pointer to gray data
814
;size_w_old - width img in pixels
815
;size_w_new - new width img in pixels
816
;size_h - height img in pixels
817
align 4
818
proc img_gray_crop_l, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword
819
	pushad
820
	mov edi,dword[data_gray]
821
	mov esi,edi
822
	mov eax,dword[size_w_old]
823
	mov ebx,dword[size_w_new]
824
	cmp eax,ebx
825
	jle .end_f ;старый размер изображения не может быть меньше нового (при условии обрезания картинки)
826
		sub eax,ebx
827
		mov edx,dword[size_h] ;высота изображения
828
		cld
829
		@@:
830
			add esi,eax
831
			mov ecx,ebx
832
			rep movsb
833
			dec edx
834
			cmp edx,0
835
			jg @b
836
	.end_f:
837
	popad
838
	ret
839
endp
840
 
1535 IgorA 841
;hoffs - колличество пикселей на котрые поднимается/опускается изображение
842
;img_t - высота, с которой начинается двигающаяся часть изображения
843
align 4
844
proc buf_offset_h, buf_struc:dword, hoffs:dword, img_t:dword, img_h:dword ;сдвигает изображение по высоте
845
	pushad
846
	mov edi,dword[buf_struc]
847
	cmp buf2d_bits,24
848
	jne .end_move_24
849
 
850
	mov eax,[hoffs]
851
	cmp eax,0
852
	je .end_move_24
853
		mov ebx,buf2d_w
854
		mov edx,dword[img_t]
855
			mov ecx,dword[img_h] ;ecx - высота сдвигаемых данных
856
			cmp ecx,buf2d_h
857
			jge .end_f ;ошибочное условие, высота изображения меньше чем высота сдвигаемого изображения
858
			imul ecx,ebx ;ecx - колличество пикселей в сдвигаемых данных
859
			lea ecx,[ecx+ecx*2]
860
		imul ebx,edx
861
		lea ebx,[ebx+ebx*2]
862
		mov esi,buf2d_data
863
		add esi,ebx
864
 
865
		add edx,eax ;edx = img_t+hoffs (hoffs<0)
866
		mov ebx,buf2d_w
867
		imul ebx,edx
868
		lea ebx,[ebx+ebx*2]
869
		mov edi,buf2d_data ;позиция, куда будет двигаться изображение
870
		add edi,ebx
871
 
872
		cmp eax,0
873
		jg .move_down_24
874
			;двигаем изображение вверх
875
			cld
876
			rep movsb
877
			jmp .end_f
878
		.move_down_24:
879
			;двигаем изображение вниз
880
			add esi,ecx
881
			dec esi
882
			add edi,ecx
883
			dec edi
884
			std
885
			rep movsb
886
			jmp .end_f
887
	.end_move_24:
888
 
889
;stdcall print_err,sz_buf2d_offset_h,txt_err_n24b
890
 
891
	cmp buf2d_bits,8
892
	jne .end_move_8
893
 
894
	mov eax,[hoffs]
895
	cmp eax,0
896
	je .end_move_8
897
		;двигаем изображение вверх
898
		mov ebx,buf2d_w
899
		mov edx,dword[img_t]
900
			mov ecx,dword[img_h] ;ecx - высота сдвигаемых данных
901
			cmp ecx,buf2d_h
902
			jge .end_f ;ошибочное условие, высота изображения меньше чем высота сдвигаемого изображения
903
			imul ecx,ebx ;ecx - колличество пикселей в сдвигаемых данных
904
		imul ebx,edx
905
		mov esi,buf2d_data
906
		add esi,ebx
907
 
908
		add edx,eax ;edx = img_t+hoffs (hoffs<0)
909
		mov ebx,buf2d_w
910
		imul ebx,edx
911
		mov edi,buf2d_data ;позиция, куда будет двигаться изображение
912
		add edi,ebx
913
 
914
		cmp eax,0
915
		jg .move_down_8
916
			cld
917
			rep movsb
918
			jmp .end_f
919
		.move_down_8:
920
			;двигаем изображение вниз
921
			add esi,ecx
922
			dec esi
923
			add edi,ecx
924
			dec edi
925
			std
926
			rep movsb
927
			jmp .end_f
928
	.end_move_8:
929
 
930
	.end_f:
931
	popad
932
	ret
933
endp
934
 
935
 
936
align 4
937
proc buf_draw_buf, buf_struc:dword
938
	pushad
939
	mov edi,dword[buf_struc]
940
	cmp buf2d_bits,24
941
	jne .error
942
		mov eax,7
943
		mov ebx,buf2d_data
944
 
945
		mov ecx,buf2d_w
946
		ror ecx,16
947
		mov edx,buf2d_h
948
		mov cx,dx
949
 
950
		mov edx,buf2d_size_lt
951
		ror edx,16
952
		int 0x40
953
		jmp .end_draw_24
954
	.error:
955
		stdcall print_err,sz_buf2d_draw,txt_err_n24b
956
	.end_draw_24:
957
	popad
958
	ret
959
endp
960
 
961
align 4
962
proc buf_delete, buf_struc:dword
2136 IgorA 963
	push eax edi
1535 IgorA 964
	mov edi,dword[buf_struc]
965
	invoke mem.free,buf2d_data
2136 IgorA 966
	pop edi eax
1535 IgorA 967
	ret
968
endp
969
 
970
align 4
2136 IgorA 971
proc buf_resize, buf_struc:dword, new_w:dword, new_h:dword
972
	pushad
973
	mov edi,dword[buf_struc]
974
	cmp buf2d_bits,24
975
	jne .24bit
976
		mov eax,dword[new_w]
977
		cmp eax,1
978
		jl @f
979
			mov buf2d_w,eax
980
		@@:
981
		mov ecx,buf2d_w
982
		mov eax,dword[new_h]
983
		cmp eax,1
984
		jl @f
985
			mov buf2d_h,eax
986
		@@:
987
		mov ebx,buf2d_h
988
		imul ecx,ebx
989
		lea ecx,[ecx+ecx*2] ; 24 bit = 3
990
		invoke mem.realloc,buf2d_data,ecx ;изменяем память занимаемую буфером
991
		mov buf2d_data,eax ;на случай если изменился указатель на данные
992
	.24bit:
993
	popad
994
	ret
995
endp
996
 
997
align 4
1535 IgorA 998
proc buf_line_brs, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, coord_y1:dword, color:dword
999
locals
1000
	loc_1 dd ?
1001
	loc_2 dd ?
1002
	napravl db ?
1003
endl
1004
	pushad
1005
		mov eax,dword[coord_x1]
1006
		sub eax,dword[coord_x0]
1007
		bt eax,31
1008
		jae @f
1009
			neg eax
1010
			inc eax
1011
		@@:
1012
		mov ebx,dword[coord_y1]
1013
		sub ebx,dword[coord_y0]
2230 IgorA 1014
		jnz @f
1015
			;если задана горизонтальная линия y0=y1
1016
			stdcall buf_line_h, [buf_struc], [coord_x0], [coord_y0], [coord_x1], [color]
1017
			jmp .coord_end
1018
		@@:
1535 IgorA 1019
		bt ebx,31
1020
		jae @f
1021
			neg ebx
1022
			inc ebx
1023
		@@:
2230 IgorA 1024
		mov edx,dword[color]
1535 IgorA 1025
 
1026
		mov [napravl],byte 0 ;bool steep=false
1027
		cmp eax,ebx
1028
		jle @f
1029
			mov [napravl],byte 1 ;bool steep=true
1030
			swap dword[coord_x0],dword[coord_y0] ;swap(x0, y0);
1031
			swap dword[coord_x1],dword[coord_y1] ;swap(x1, y1);
1032
		@@:
1033
		mov eax,dword[coord_y0] ;x0
1034
		cmp eax,dword[coord_y1] ;if(x0>x1)
1035
		jle @f
1036
			swap dword[coord_y0],dword[coord_y1] ;swap(x0, x1);
1037
			swap dword[coord_x0],dword[coord_x1] ;swap(y0, y1);
1038
		@@:
1039
 
1040
; int deltax esi
1041
; int deltay edi
1042
; int error  ebp-6
1043
; int ystep  ebp-8
1044
 
1045
		mov eax,dword[coord_y0]
1046
		mov esi,dword[coord_y1]
1047
		sub esi,eax ;deltax = y1-y0
1048
		mov ebx,esi
1049
		shr ebx,1
1050
		mov [loc_1],ebx ;error = deltax/2
1051
 
1052
		mov eax,dword[coord_x0]
1053
		mov edi,dword[coord_x1]
1054
		mov [loc_2],dword -1 ;ystep = -1
1055
		cmp eax,edi ;if (x0
1056
		jge @f
1057
			mov [loc_2],dword 1 ;ystep = 1
1058
		@@:
1059
		sub edi,eax ;x1-x0
1060
 
1061
		bts edi,31
1062
		jae @f
1063
			neg edi
1064
			inc edi
1065
		@@:
1066
		and edi,0x7fffffff ;deltay = abs(x1-x0)
1067
 
1068
		mov eax,edi
1069
		mov edi,[buf_struc]
1070
		cmp buf2d_bits,24
1071
		jne .coord_end
1072
 
1073
		cmp [napravl],0
1074
		jne .coord_yx
1075
			mov ebx,dword[coord_x0]
1076
			mov ecx,dword[coord_y0]
1077
 
1078
			@@: ;for (x=x0 ; x
1079
				cmp ecx,dword[coord_y1]
1080
				jg @f ;jge ???
1081
				call draw_pixel
1082
 
1083
				sub dword[loc_1],eax ;error -= deltay
1084
				cmp dword[loc_1],0 ;if(error<0)
1085
				jge .if0
1086
					add ebx,[loc_2] ;y += ystep
1087
					add [loc_1],esi ;error += deltax
1088
				.if0:
1089
				inc ecx
1090
				jmp @b
1091
			@@:
1092
			jmp .coord_end
1093
		.coord_yx:
1094
			mov ebx,dword[coord_y0]
1095
			mov ecx,dword[coord_x0]
1096
 
1097
			@@: ;for (x=x0 ; x
1098
				cmp ebx,dword[coord_y1]
1099
				jg @f ;jge ???
1100
				call draw_pixel
1101
 
1102
				sub dword[loc_1],eax ;error -= deltay
1103
				cmp dword[loc_1],0 ;if(error<0)
1104
				jge .if1
1105
					add ecx,[loc_2] ;y += ystep
1106
					add [loc_1],esi ;error += deltax
1107
				.if1:
1108
				inc ebx
1109
				jmp @b
1110
			@@:
1111
	.coord_end:
1112
	popad
1113
	ret
1114
endp
1115
 
2230 IgorA 1116
;рисование сглаженной линии
1117
align 4
1118
proc buf_line_brs_sm, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, coord_y1:dword, color:dword
1119
locals
1120
	loc_1 dd ?
1121
	loc_2 dd ?
1122
	napravl db ?
1123
endl
1124
	pushad
1125
		mov eax,dword[coord_x1]
1126
		sub eax,dword[coord_x0]
1127
		bt eax,31
1128
		jae @f
1129
			neg eax
1130
			inc eax
1131
		@@:
1132
		mov ebx,dword[coord_y1]
1133
		sub ebx,dword[coord_y0]
1134
		jnz @f
1135
			;если задана горизонтальная линия y0=y1
1136
			stdcall buf_line_h, [buf_struc], [coord_x0], [coord_y0], [coord_x1], [color]
1137
			jmp .coord_end
1138
		@@:
1139
		bt ebx,31
1140
		jae @f
1141
			neg ebx
1142
			inc ebx
1143
		@@:
1144
		mov edx,dword[color]
1145
 
1146
		mov [napravl],byte 0 ;bool steep=false
1147
		cmp eax,ebx
1148
		jle @f
1149
			mov [napravl],byte 1 ;bool steep=true
1150
			swap dword[coord_x0],dword[coord_y0] ;swap(x0, y0);
1151
			swap dword[coord_x1],dword[coord_y1] ;swap(x1, y1);
1152
		@@:
1153
		mov eax,dword[coord_y0] ;x0
1154
		cmp eax,dword[coord_y1] ;if(x0>x1)
1155
		jle @f
1156
			swap dword[coord_y0],dword[coord_y1] ;swap(x0, x1);
1157
			swap dword[coord_x0],dword[coord_x1] ;swap(y0, y1);
1158
		@@:
1159
 
1160
; int deltax esi
1161
; int deltay edi
1162
; int error  ebp-6
1163
; int ystep  ebp-8
1164
 
1165
		mov eax,dword[coord_y0]
1166
		mov esi,dword[coord_y1]
1167
		sub esi,eax ;deltax = y1-y0
1168
		mov ebx,esi
1169
		shr ebx,1
1170
		mov [loc_1],ebx ;error = deltax/2
1171
 
1172
		mov eax,dword[coord_x0]
1173
		mov edi,dword[coord_x1]
1174
		mov [loc_2],dword -1 ;ystep = -1
1175
		cmp eax,edi ;if (x0
1176
		jge @f
1177
			mov [loc_2],dword 1 ;ystep = 1
1178
		@@:
1179
		sub edi,eax ;x1-x0
1180
 
1181
		bts edi,31
1182
		jae @f
1183
			neg edi
1184
			inc edi
1185
		@@:
1186
		and edi,0x7fffffff ;deltay = abs(x1-x0)
1187
 
1188
		mov eax,edi
1189
		mov edi,[buf_struc]
1190
		cmp buf2d_bits,24
1191
		jne .coord_end
1192
 
1193
		cmp [napravl],0
1194
		jne .coord_yx
1195
			mov ebx,dword[coord_x0]
1196
			mov ecx,dword[coord_y0]
1197
 
1198
			@@: ;for (x=x0 ; x
1199
				cmp ecx,dword[coord_y1]
1200
				jg @f ;jge ???
1201
				push eax
1202
					mov eax,esi
1203
					sub eax,[loc_1]
1204
					stdcall draw_pixel_transp, eax,esi
1205
				pop eax
1206
				add ebx,[loc_2]
1207
				stdcall draw_pixel_transp, [loc_1],esi
1208
				sub ebx,[loc_2]
1209
 
1210
				sub dword[loc_1],eax ;error -= deltay
1211
				cmp dword[loc_1],0 ;if(error<0)
1212
				jge .if0
1213
					add ebx,[loc_2] ;y += ystep
1214
					add [loc_1],esi ;error += deltax
1215
				.if0:
1216
				inc ecx
1217
				jmp @b
1218
			@@:
1219
			jmp .coord_end
1220
		.coord_yx:
1221
			mov ebx,dword[coord_y0]
1222
			mov ecx,dword[coord_x0]
1223
 
1224
			@@: ;for (x=x0 ; x
1225
				cmp ebx,dword[coord_y1]
1226
				jg @f ;jge ???
1227
				push eax
1228
					mov eax,esi
1229
					sub eax,[loc_1]
1230
					stdcall draw_pixel_transp, eax,esi
1231
				pop eax
1232
				add ecx,[loc_2]
1233
				stdcall draw_pixel_transp, [loc_1],esi
1234
				sub ecx,[loc_2]
1235
 
1236
				sub dword[loc_1],eax ;error -= deltay
1237
				cmp dword[loc_1],0 ;if(error<0)
1238
				jge .if1
1239
					add ecx,[loc_2] ;y += ystep
1240
					add [loc_1],esi ;error += deltax
1241
				.if1:
1242
				inc ebx
1243
				jmp @b
1244
			@@:
1245
	.coord_end:
1246
	popad
1247
	ret
1248
endp
1249
 
1653 IgorA 1250
;рисование горизонтальной линии, потому нет параметра coord_y1
1535 IgorA 1251
align 4
1634 IgorA 1252
proc buf_line_h, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, color:dword
1253
	pushad
1254
		mov edi,[buf_struc]
1255
		cmp buf2d_bits,24
1684 IgorA 1256
		jne .end24
1634 IgorA 1257
 
2177 IgorA 1258
		mov ecx,dword[coord_y0]
1259
		bt ecx,31
1260
		jc .end24 ;если координата y0 отрицательная
1261
		cmp ecx,buf2d_h
1262
		jge .end24 ;если координата y0 больше высоты буфера
1263
 
1634 IgorA 1264
		mov ebx,dword[coord_x0]
1265
		mov esi,dword[coord_x1]
1717 IgorA 1266
		cmp ebx,esi
1267
		jle @f
1268
			xchg ebx,esi ;если x0 > x1 то меняем местами x0 и x1
2177 IgorA 1269
		@@:
2185 IgorA 1270
		bt ebx,31
1271
		jae @f
1272
			;если координата x0 отрицательная
1273
			xor ebx,ebx
1274
		@@:
2177 IgorA 1275
		cmp esi,buf2d_w
1276
		jl @f
2185 IgorA 1277
			;если координата x0 больше ширины буфера
2177 IgorA 1278
			mov esi,buf2d_w
1279
			;dec esi
1280
		@@:
2185 IgorA 1281
		cmp ebx,esi
1282
		jge .end24 ;если x0 >= x1 может возникнуть когда обе координаты x0, x1 находились за одним из пределов буфера
1717 IgorA 1283
 
2177 IgorA 1284
		;в eax вычисляем начало 1-й точки линии в буфере изображения
1285
		mov eax,buf2d_w ;size x
1286
		imul eax,ecx ;size_x*y
1287
		add eax,ebx	 ;size_x*y+x
1288
		lea eax,[eax+eax*2] ;(size_x*y+x)*3
1289
		add eax,buf2d_data  ;ptr+(size_x*y+x)*3
1290
 
2185 IgorA 1291
		mov ecx,esi
1292
		sub ecx,ebx ;в ecx колличество точек линии выводимых в буфер
2177 IgorA 1293
		mov edx,dword[color]
2185 IgorA 1294
		mov ebx,edx ;координата x0 в ebx уже не нужна
1295
		ror edx,16 ;поворачиваем регистр что бы 3-й байт попал в dl
1296
		cld
1717 IgorA 1297
		@@: ;цикл по оси x от x0 до x1
2185 IgorA 1298
			mov word[eax],bx ;copy pixel color
1299
			mov byte[eax+2],dl
1300
			add eax,3
1301
			loop @b
1684 IgorA 1302
		.end24:
1634 IgorA 1303
	popad
1304
	ret
1305
endp
1306
 
1307
align 4
1308
proc buf_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword
1309
pushad
1310
	mov edi,[buf_struc]
1311
	cmp buf2d_bits,24
1312
	jne .coord_end
1313
 
1314
		mov eax,[coord_x]
1315
		mov ebx,[coord_y]
1316
		mov ecx,[w]
1642 IgorA 1317
		cmp ecx,1
1318
		jl .coord_end
1634 IgorA 1319
		add ecx,eax
1642 IgorA 1320
		dec ecx
1634 IgorA 1321
		mov edx,[h]
1642 IgorA 1322
		cmp edx,1
1323
		jl .coord_end
1324
 
1634 IgorA 1325
		add edx,ebx
1642 IgorA 1326
		dec edx
1634 IgorA 1327
		mov esi,dword[color]
1328
		stdcall buf_line_h, edi, eax, ebx, ecx, esi ;линия -
1329
		stdcall buf_line_brs, edi, eax, ebx, eax, edx, esi ;линия |
1330
		stdcall buf_line_h, edi, eax, edx, ecx, esi ;линия -
1331
		stdcall buf_line_brs, edi, ecx, ebx, ecx, edx, esi ;линия |
1332
	.coord_end:
1333
popad
1334
	ret
1335
endp
1336
 
1337
align 4
1642 IgorA 1338
proc buf_filled_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword
1339
pushad
1340
	mov edi,[buf_struc]
1341
	cmp buf2d_bits,24
1342
	jne .coord_end
1343
		mov eax,[coord_x]
1344
		mov ebx,[coord_y]
1345
		mov edx,[w]
1346
		add edx,eax
1347
		mov ecx,[h]
1717 IgorA 1348
		cmp ecx,1 ;сравнение с минимально возможной высотой
1349
		jl .coord_end ;если высота меньше 1-го пикселя
1642 IgorA 1350
		mov esi,dword[color]
1351
		cld
1352
		@@:
1353
			stdcall buf_line_h, edi, eax, ebx, edx, esi ;линия -
1354
			inc ebx
1355
			loop @b
1356
	.coord_end:
1357
popad
1358
	ret
1359
endp
1360
 
1361
align 4
1535 IgorA 1362
proc buf_circle, buf_struc:dword, coord_x:dword, coord_y:dword, r:dword, color:dword
1363
locals
1364
	po_x dd ?
1365
	po_y dd ?
1366
endl
1367
	pushad
1368
	mov edi,dword[buf_struc]
1369
	cmp buf2d_bits,24
1370
	jne .error
1371
		mov edx,dword[color]
1372
 
1373
		finit
1374
		fild dword[coord_x]
1375
		fild dword[coord_y]
1376
		fild dword[r]
1377
		fldz ;px=0
1378
		fld st1 ;py=r
1379
 
1380
		fldpi
1381
		fmul st0,st3
1382
		fistp dword[po_x]
1383
		mov esi,dword[po_x] ;esi=pi*r
1384
		shl esi,1 ;esi=2*pi*r
1385
 
1386
		;st0 = py
1387
		;st1 = px
1388
		;st2 = r
1389
		;st3 = y
1390
		;st4 = x
1391
 
1392
		@@:
1393
			;Point(px + x, y - py)
1394
			fld st1 ;st0=px
1395
			fadd st0,st5 ;st0=px+x
1396
			fistp dword[po_x]
1397
			mov ebx,dword[po_x]
1398
			fld st3 ;st0=y
1399
			fsub st0,st1 ;st0=y-py
1400
			fistp dword[po_y]
1401
			mov ecx,dword[po_y]
1402
			call draw_pixel
1403
			;px += py/r
1404
			fld st0 ;st0=py
1405
			fdiv st0,st3 ;st0=py/r
1406
			faddp st2,st0 ;st3+=st0
1407
			;py -= px/r
1408
			fld st1 ;st0=px
1409
			fdiv st0,st3 ;st0=px/r
1410
			fsubp st1,st0 ;st2-=st0
1411
 
1412
			dec esi
1413
			cmp esi,0
1414
			jge @b
1415
		jmp .exit_fun
1416
	.error:
1417
		stdcall print_err,sz_buf2d_circle,txt_err_n24b
1418
	.exit_fun:
1419
 
1420
	popad
1421
	ret
1422
endp
1423
 
1684 IgorA 1424
;функция для заливки области выбранным цветом
1535 IgorA 1425
align 4
1684 IgorA 1426
proc buf_flood_fill, buf_struc:dword, coord_x:dword, coord_y:dword, mode:dword, color_f:dword, color_b:dword
1427
	pushad
1428
		mov edi,[buf_struc]
1429
		cmp buf2d_bits,24
1430
		jne .end24
1431
 
1432
			mov ebx,dword[coord_x]
1433
			mov ecx,dword[coord_y]
1434
			mov edx,dword[color_f]
1435
			mov esi,dword[color_b]
1436
 
1437
			cmp dword[mode],1 ;в зависимости от 'mode' определяем каким алгоритмом будем пользоваться
1438
			je @f
1439
				call buf_flood_fill_recurs_0 ;заливаем до пикселей цвета esi
1440
				jmp .end24
1441
			@@:
1442
				call buf_flood_fill_recurs_1 ;заливаем пиксели имеющие цвет esi
1443
 
1444
		.end24:
1445
	popad
1446
	ret
1447
endp
1448
 
1449
;input:
1450
; ebx = coord_x
1451
; ecx = coord_y
1452
; edx = цвет заливки
1453
; esi = цвет границы, до которой будет ити заливка
1454
; edi = buf_struc
1455
;output:
1456
; eax = портится
1457
align 4
1458
buf_flood_fill_recurs_0:
1459
	call get_pixel_24
1460
	cmp eax,0xffffffff ;if error coords
1461
	je .end_fun
1462
	cmp eax,edx ;если цвет пикселя совпал с цветом заливки, значит заливка в этой области уже была сделана
1463
	je .end_fun
1464
 
1465
		call draw_pixel
1466
 
1467
		dec ebx
1468
		call get_pixel_24
1469
		cmp eax,esi
1470
		je @f
1471
			call buf_flood_fill_recurs_0
1472
		@@:
1473
		inc ebx
1474
 
1475
 
1476
		inc ebx
1477
		call get_pixel_24
1478
		cmp eax,esi
1479
		je @f
1480
			call buf_flood_fill_recurs_0
1481
		@@:
1482
		dec ebx
1483
 
1484
		dec ecx
1485
		call get_pixel_24
1486
		cmp eax,esi
1487
		je @f
1488
			call buf_flood_fill_recurs_0
1489
		@@:
1490
		inc ecx
1491
 
1492
		inc ecx
1493
		call get_pixel_24
1494
		cmp eax,esi
1495
		je @f
1496
			call buf_flood_fill_recurs_0
1497
		@@:
1498
		dec ecx
1499
 
1500
	.end_fun:
1501
	ret
1502
 
1503
;input:
1504
; ebx = coord_x
1505
; ecx = coord_y
1506
; edx = цвет заливки
1507
; esi = цвет пикселей, по которым будет ити заливка
1508
; edi = buf_struc
1509
;output:
1510
; eax = портится
1511
align 4
1512
buf_flood_fill_recurs_1:
1513
	call get_pixel_24
1514
	cmp eax,0xffffffff ;if error coords
1515
	je .end_fun
1516
	cmp eax,edx ;если цвет пикселя совпал с цветом заливки, значит заливка в этой области уже была сделана
1517
	je .end_fun
1518
	cmp eax,esi ;если цвет пикселя не совпал с заливаемым цветом заливки, то прекращаем заливку
1519
	jne .end_fun
1520
 
1521
		call draw_pixel
1522
 
1523
		dec ebx
1524
		call get_pixel_24
1525
		cmp eax,esi
1526
		jne @f
1527
			call buf_flood_fill_recurs_1
1528
		@@:
1529
		inc ebx
1530
 
1531
 
1532
		inc ebx
1533
		call get_pixel_24
1534
		cmp eax,esi
1535
		jne @f
1536
			call buf_flood_fill_recurs_1
1537
		@@:
1538
		dec ebx
1539
 
1540
		dec ecx
1541
		call get_pixel_24
1542
		cmp eax,esi
1543
		jne @f
1544
			call buf_flood_fill_recurs_1
1545
		@@:
1546
		inc ecx
1547
 
1548
		inc ecx
1549
		call get_pixel_24
1550
		cmp eax,esi
1551
		jne @f
1552
			call buf_flood_fill_recurs_1
1553
		@@:
1554
		dec ecx
1555
 
1556
	.end_fun:
1557
	ret
1558
 
1910 IgorA 1559
;функция для рисования точки
1684 IgorA 1560
align 4
1910 IgorA 1561
proc buf_set_pixel, buf_struc:dword, coord_x:dword, coord_y:dword, color:dword
1562
	pushad
1563
		mov edi,[buf_struc]
1564
		cmp buf2d_bits,24
1565
		jne .end24
1566
			mov ebx,dword[coord_x]
1567
			mov ecx,dword[coord_y]
1568
			mov edx,dword[color]
1569
			call draw_pixel
1570
		.end24:
1571
	popad
1572
	ret
1573
endp
1574
 
1575
align 4
1535 IgorA 1576
proc buf_img_wdiv2, buf_struc:dword
1577
	pushad
1578
	mov edi,dword[buf_struc]
1579
	cmp buf2d_bits,24
1580
	jne .end_draw_24
1581
		mov eax,buf2d_w
1582
		mov ecx,buf2d_h
1583
		imul ecx,eax
1584
		stdcall img_rgb24_wdiv2, buf2d_data,ecx
1585
	.end_draw_24:
1586
	popad
1587
	ret
1588
endp
1589
 
1590
;input:
1591
;data_rgb - pointer to rgb data
1592
;size - count img pixels (size img data / 3(rgb) )
1593
align 4
1594
proc img_rgb24_wdiv2 data_rgb:dword, size:dword
1595
  ;push eax ebx ecx edx
1596
  mov eax,dword[data_rgb]
1597
  mov ecx,dword[size] ;ecx = size
1598
  lea ecx,[ecx+ecx*2]
1599
  cld
1600
  @@: ;затемнение цвета пикселей
1538 IgorA 1601
		shr byte[eax],1
1602
		inc eax
1603
		loop @b
1535 IgorA 1604
 
1605
  mov eax,dword[data_rgb]
1606
  mov ecx,dword[size] ;ecx = size
1607
  shr ecx,1
1608
  @@: ;сложение цветов пикселей
1538 IgorA 1609
		mov bx,word[eax+3] ;копируем цвет соседнего пикселя
1610
		add word[eax],bx
1611
		mov bl,byte[eax+5] ;копируем цвет соседнего пикселя
1612
		add byte[eax+2],bl
1613
		add eax,6 ;=2*3
1614
		loop @b
1535 IgorA 1615
 
1616
  mov eax,dword[data_rgb]
1617
  add eax,3
1618
  mov ebx,eax
1619
  add ebx,3
1620
  mov ecx,dword[size] ;ecx = size
1621
  shr ecx,1
1622
  dec ecx ;лишний пиксель
1623
  @@: ;поджатие пикселей
1538 IgorA 1624
		mov edx,dword[ebx]
1625
		mov word[eax],dx
1626
		shr edx,16
1627
		mov byte[eax+2],dl
1535 IgorA 1628
 
1538 IgorA 1629
		add eax,3
1630
		add ebx,6
1631
		loop @b
1535 IgorA 1632
  ;pop edx ecx ebx eax
1633
  ret
1634
endp
1635
 
1636
align 4
1637
proc buf_img_hdiv2, buf_struc:dword
1638
	pushad
1639
	mov edi,dword[buf_struc]
1640
	cmp buf2d_bits,24
1641
	jne .end_draw_24
1642
		mov eax,buf2d_w
1643
		mov ecx,buf2d_h
1644
		imul ecx,eax
1645
		stdcall img_rgb24_hdiv2, buf2d_data,ecx,eax
1646
	.end_draw_24:
1647
	popad
1648
	ret
1649
endp
1650
 
1651
;input:
1652
;data_rgb - pointer to rgb data
1653
;size - count img pixels (size img data / 3(rgb) )
1654
;size_w - width img in pixels
1655
align 4
1656
proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword
1657
  ;pushad
1658
 
1659
  mov eax,dword[data_rgb] ;eax =
1660
  mov ecx,dword[size]	  ;ecx = size
1661
  lea ecx,[ecx+ecx*2]
1662
  cld
1663
  @@: ;затемнение цвета пикселей
1664
    shr byte[eax],1
1665
    inc eax
1666
    loop @b
1667
 
1668
  mov eax,dword[data_rgb] ;eax =
1669
  mov edi,dword[size_w]
1670
  lea esi,[edi+edi*2] ;esi = width*3(rgb)
1671
  mov ebx,esi
1672
  add ebx,eax
1673
  mov ecx,dword[size]  ;ecx = size
1674
  shr ecx,1
1675
  xor edi,edi
1676
  @@: ;сложение цветов пикселей
1677
    mov dx,word[ebx] ;копируем цвет нижнего пикселя
1678
    add word[eax],dx
1679
    mov dl,byte[ebx+2] ;копируем цвет нижнего пикселя
1680
    add byte[eax+2],dl
1681
 
1682
    add eax,3
1683
    add ebx,3
1684
    inc edi
1685
    cmp edi,dword[size_w]
1686
    jl .old_line
1687
      add eax,esi
1688
      add ebx,esi
1689
      xor edi,edi
1690
    .old_line:
1691
    loop @b
1692
 
1693
 
1694
  mov eax,dword[data_rgb] ;eax =
1695
  add eax,esi ;esi = width*3(rgb)
1696
  mov ebx,esi
1697
  add ebx,eax
1698
  mov ecx,dword[size] ;ecx = size
1699
  shr ecx,1
1700
  sub ecx,dword[size_w] ;лишняя строка пикселей
1701
  xor edi,edi
1702
  @@: ;поджатие пикселей
1703
    mov edx,dword[ebx] ;копируем цвет нижнего пикселя
1704
    mov word[eax],dx
1705
    shr edx,16
1706
    mov byte[eax+2],dl
1707
 
1708
    add eax,3
1709
    add ebx,3
1710
    inc edi
1711
    cmp edi,dword[size_w]
1712
    jl .old_line_2
1713
      add ebx,esi
1714
      xor edi,edi
1715
    .old_line_2:
1716
    loop @b
1717
 
1718
  ;popad
1719
  ret
1720
endp
1721
 
1722
;преобразование буфера из 24-битного в 8-битный
1723
; spectr - определяет какой спектр брать при преобразовании 0-синий, 1-зеленый, 2-красный
1724
align 4
1725
proc buf_conv_24_to_8, buf_struc:dword, spectr:dword
1726
	pushad
1727
	mov edi,dword[buf_struc]
1728
	cmp buf2d_bits,24
1729
	jne .error
1730
		mov eax,buf2d_w
1731
		mov ecx,buf2d_h
1732
		imul ecx,eax
1733
		mov esi,ecx
1734
		;ebx - память из которой копируется
1735
		;edx - память куда копируется
1736
		mov edx,buf2d_data
1737
		mov ebx,edx
1738
		cmp [spectr],3
1739
		jge @f
1740
			add ebx,[spectr]
1741
		@@:
1742
			mov al,byte[ebx]
1743
			mov byte[edx],al
1744
			add ebx,3
1745
			inc edx
1746
			loop @b
1747
		mov buf2d_bits,8
1748
		invoke mem.realloc,buf2d_data,esi ;уменьшаем память занимаемую буфером
1749
		jmp .end_conv
1750
	.error:
1751
		stdcall print_err,sz_buf2d_conv_24_to_8,txt_err_n24b
1752
	.end_conv:
1753
	popad
1754
	ret
1755
endp
1756
 
1757
;преобразование буфера из 24-битного в 32-битный
1758
align 4
1759
proc buf_conv_24_to_32, buf_struc:dword, buf_str8:dword
1760
	pushad
1761
	mov edi,dword[buf_struc]
1762
	cmp buf2d_bits,24
1763
	jne .error1
1764
		mov ecx,buf2d_w
1765
		mov ebx,buf2d_h
1766
		imul ebx,ecx
1767
		mov ecx,ebx ;ecx = size  8 b
1768
		shl ebx,2   ;ebx = size 32 b
1769
		invoke mem.realloc,buf2d_data,ebx ;увеличиваем память занимаемую буфером
1770
		mov buf2d_data,eax ;на случай если изменился указатель на данные
1771
		mov buf2d_bits,32
1772
		mov edx,ebx ;edx = size 32 b
1773
		sub ebx,ecx ;ebx = size 24 b
1774
		mov eax,ecx
1775
		;eax - размер  8 битных данных
1776
		;ebx - размер 24 битных данных
1777
		;edx - размер 32 битных данных
1778
		add ebx,buf2d_data
1779
		add edx,buf2d_data
1780
		mov edi,dword[buf_str8]
1781
		cmp buf2d_bits,8
1782
		jne .error2
1783
		add eax,buf2d_data
1784
		mov edi,edx
1785
		;eax - указатель на конец  8 битных данных
1786
		;ebx - указатель на конец 24 битных данных
1787
		;edi - указатель на конец 32 битных данных
1788
		@@:
1789
			sub edi,4 ;отнимаем в начале цикла,
1790
			sub ebx,3 ; потому, что указатели стоят
1791
			dec eax   ; за пределами буферов
1792
			mov edx,dword[ebx]
1793
			mov dword[edi],edx
1794
			mov dl,byte[eax]
1795
			mov byte[edi+3],dl
1796
			loop @b
1797
 
1798
		jmp .end_conv
1799
	.error1:
1800
		stdcall print_err,sz_buf2d_conv_24_to_32,txt_err_n24b
1801
		jmp .end_conv
1802
	.error2:
1803
		stdcall print_err,sz_buf2d_conv_24_to_32,txt_err_n8b
1804
	.end_conv:
1805
	popad
1806
	ret
1807
endp
1808
 
1809
;функция копирует изображение из буфера buf_source (24b|32b) в buf_destination (24b)
1810
; указываются координаты вставки буфера buf_source относительно buf_destination
1811
; прозрачность при копировании не учитывается
1812
align 4
1813
proc buf_bit_blt, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword
1814
	locals
1815
		right_bytes dd ?
1816
	endl
1817
	pushad
1818
 
1819
	mov edi,[buf_source]
1820
	cmp buf2d_bits,24
1821
	je .sou24
1822
	cmp buf2d_bits,32
1823
	je .sou32
1824
		jmp .copy_end ;формат буфера не поодерживается
1825
 
1648 IgorA 1826
	.sou24: ;в источнике 24 битная картинка
1535 IgorA 1827
	mov eax,buf2d_w
1828
	mov edx,buf2d_h ;высота копируемой картинки
1829
	mov esi,buf2d_data ;данные копируемой картинки
1830
 
1831
	mov edi,[buf_destination]
1832
	cmp buf2d_bits,24
1833
	jne .copy_end ;формат буфера не поодерживается
1648 IgorA 1834
	mov ebx,[coord_x] ;в ebx временно ставим отступ изображения (для проверки)
1835
	cmp ebx,buf2d_w   ;проверяем влазит ли изображение по ширине
1836
	jge .copy_end     ;если изображение полностью вылазит за правую сторону
1535 IgorA 1837
		mov ebx,buf2d_h ;ebx - высота основного буфера
1838
		mov ecx,[coord_y]
1839
		cmp ecx,ebx
1840
		jge .copy_end ;если координата 'y' больше высоты буфера
1841
		add ecx,edx ;ecx - нижняя координата копируемой картинки
1842
		cmp ecx,ebx
1843
		jle @f
1844
			sub ecx,ebx
1845
			sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу
1846
		@@:
1847
		mov ebx,buf2d_w
1848
		mov ecx,ebx ;ecx используем для временных целей
1849
		imul ecx,[coord_y]
1850
		add ecx,[coord_x]
1851
		lea ecx,[ecx+ecx*2]
1852
		add ecx,buf2d_data
1853
		sub ebx,eax
1854
		mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование
1855
 
1856
	mov [right_bytes],0
1857
	mov ecx,[coord_x]
1858
	cmp ecx,ebx
1859
	jl @f
1860
		sub ecx,ebx
1861
		sub eax,ecx ;укорачиваем копируемую строку
1862
		add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера
1863
		lea ecx,[ecx+ecx*2] ;ecx - число байт в 1-й строке картинки, которые вылазят за правую сторону
1864
		mov [right_bytes],ecx
1865
	@@:
1866
 
1867
	lea eax,[eax+eax*2] ;колличество байт в 1-й строке копируемой картинки
1868
	lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки
1869
 
1870
	cld
1871
	cmp [right_bytes],0
1872
	jg .copy_1
1873
	.copy_0: ;простое копирование
1874
		mov ecx,eax
1875
		rep movsb
1876
		add edi,ebx
1877
		dec edx
1878
		cmp edx,0
1879
		jg .copy_0
1880
	jmp .copy_end
1881
	.copy_1: ;не простое копирование (картинка вылазит за правую сторону)
1882
		mov ecx,eax
1883
		rep movsb
1884
		add edi,ebx
1885
		add esi,[right_bytes] ;добавляем байты, которые вылазят за правую границу
1886
		dec edx
1887
		cmp edx,0
1888
		jg .copy_1
1889
	jmp .copy_end
1890
 
1891
	.sou32: ;в источнике 32 битная картинка
1892
	mov eax,buf2d_w
1893
	mov edx,buf2d_h ;высота копируемой картинки
1894
	mov esi,buf2d_data ;данные копируемой картинки
1895
 
1896
	mov edi,[buf_destination]
1897
	cmp buf2d_bits,24
1898
	jne .copy_end ;формат буфера не поодерживается
1648 IgorA 1899
	mov ebx,[coord_x] ;в ebx временно ставим отступ изображения (для проверки)
1900
	cmp ebx,buf2d_w   ;проверяем влазит ли изображение по ширине
1901
	jge .copy_end     ;если изображение полностью вылазит за правую сторону
1535 IgorA 1902
		mov ebx,buf2d_h ;ebx - высота основного буфера
1903
		mov ecx,[coord_y]
1904
		cmp ecx,ebx
1905
		jge .copy_end ;если координата 'y' больше высоты буфера
1906
		add ecx,edx ;ecx - нижняя координата копируемой картинки
1907
		cmp ecx,ebx
1908
		jle @f
1909
			sub ecx,ebx
1910
			sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу
1911
		@@:
1912
		mov ebx,buf2d_w
1913
		mov ecx,ebx ;ecx используем для временных целей
1914
		imul ecx,[coord_y]
1915
		add ecx,[coord_x]
1916
		lea ecx,[ecx+ecx*2]
1917
		add ecx,buf2d_data
1918
		sub ebx,eax
1919
		mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование
1920
 
1921
	mov [right_bytes],0
1922
	mov ecx,[coord_x]
1923
	cmp ecx,ebx
1924
	jl @f
1925
		sub ecx,ebx
1926
		sub eax,ecx ;укорачиваем копируемую строку
1927
		add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера
1928
		shl ecx,2 ;ecx - число байт в 1-й строке картинки, которые вылазят за правую сторону
1929
		mov [right_bytes],ecx
1930
	@@:
1931
 
1932
	;eax - колличество пикселей в 1-й строке копируемой картинки
1933
	lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки
1934
 
1935
	cld
1936
	cmp [right_bytes],0
1937
	jg .copy_3
1938
	.copy_2: ;простое копирование
1939
		mov ecx,eax
1940
		@@:
1941
			movsw
1942
			movsb
1943
			inc esi
1944
			loop @b
1945
		add edi,ebx
1946
		dec edx
1947
		cmp edx,0
1948
		jg .copy_2
1949
	jmp .copy_end
1950
	.copy_3: ;не простое копирование (картинка вылазит за правую сторону)
1951
		mov ecx,eax
1952
		@@:
1953
			movsw
1954
			movsb
1955
			inc esi
1956
			loop @b
1957
		add edi,ebx
1958
		add esi,[right_bytes] ;добавляем байты, которые вылазят за правую границу
1959
		dec edx
1960
		cmp edx,0
1961
		jg .copy_3
1962
 
1963
	.copy_end:
1964
	popad
1965
	ret
1966
endp
1967
 
1968
;input:
1969
; esi = pointer to color1 + transparent
1970
; edi = pointer to background color2
1971
;output:
1972
; [edi] = combine color
1973
align 4
1974
combine_colors:
1975
	push ax bx cx dx
1976
	mov bx,0x00ff ;---get transparent---
1977
	mov cl,byte[esi+3] ;pro
1978
	xor ch,ch
1979
	sub bx,cx ;256-pro
1653 IgorA 1980
	;---blye---
1535 IgorA 1981
	xor ah,ah
1653 IgorA 1982
	mov al,byte[esi]
1535 IgorA 1983
	imul ax,bx
1984
	xor dh,dh
1653 IgorA 1985
	mov dl,byte[edi]
1535 IgorA 1986
	imul dx,cx
1987
	add ax,dx
1653 IgorA 1988
	mov byte[edi],ah
1535 IgorA 1989
	;---green---
1990
	xor ah,ah
1991
	mov al,byte[esi+1]
1992
	imul ax,bx
1993
	xor dh,dh
1994
	mov dl,byte[edi+1]
1995
	imul dx,cx
1996
	add ax,dx
1997
	mov byte[edi+1],ah
1653 IgorA 1998
	;---red---
1535 IgorA 1999
	xor ah,ah
1653 IgorA 2000
	mov al,byte[esi+2]
1535 IgorA 2001
	imul ax,bx
2002
	xor dh,dh
1653 IgorA 2003
	mov dl,byte[edi+2]
1535 IgorA 2004
	imul dx,cx
2005
	add ax,dx
1653 IgorA 2006
	mov byte[edi+2],ah
1535 IgorA 2007
 
2008
	pop dx cx bx ax
2009
	ret
2010
 
2011
;функция копирует изображение из буфера buf_source (32b) в buf_destination (24b)
2012
; указываются координаты вставки буфера buf_source относительно buf_destination
2013
; при копировании учитывается прозрачность
2014
align 4
2015
proc buf_bit_blt_transp, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword
2016
	locals
2017
		right_bytes dd ?
2018
	endl
2019
	pushad
2020
 
2021
	mov edi,[buf_source]
2022
	cmp buf2d_bits,32
2023
	jne .copy_end ;формат буфера не поодерживается
2024
	mov eax,buf2d_w
2025
	mov edx,buf2d_h ;высота копируемой картинки
2026
	mov esi,buf2d_data ;данные копируемой картинки
2027
 
2028
	mov edi,[buf_destination]
2029
	cmp buf2d_bits,24
2030
	jne .copy_end ;формат буфера не поодерживается
2031
		mov ebx,buf2d_h ;ebx - высота основного буфера
2032
		mov ecx,[coord_y]
2033
		cmp ecx,ebx
2034
		jge .copy_end ;если координата 'y' больше высоты буфера
2035
		add ecx,edx ;ecx - нижняя координата копируемой картинки
2036
		cmp ecx,ebx
2037
		jle @f
2038
			sub ecx,ebx
2039
			sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу
2040
		@@:
2041
		mov ebx,buf2d_w
2042
		mov ecx,ebx ;ecx используем для временных целей
2043
		imul ecx,[coord_y]
2044
		add ecx,[coord_x]
2045
		lea ecx,[ecx+ecx*2]
2046
		add ecx,buf2d_data
2047
		sub ebx,eax
2048
		mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование
2049
 
2050
	mov [right_bytes],0
2051
	mov ecx,[coord_x]
2052
	cmp ecx,ebx
2053
	jl @f
2054
		sub ecx,ebx
2055
		sub eax,ecx ;укорачиваем копируемую строку
2056
		add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера
2057
		shl ecx,2 ;ecx - число байт в 1-й строке картинки, которые вылазят за правую сторону
2058
		mov [right_bytes],ecx
2059
	@@:
2060
 
2061
	lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки
2062
 
2063
	cld
2064
	cmp [right_bytes],0
2065
	jg .copy_1
2066
	.copy_0: ;простое копирование
2067
		mov ecx,eax
2068
		@@:
2069
			call combine_colors
2070
			add edi,3
2071
			add esi,4
2072
			loop @b
2073
		add edi,ebx
2074
		dec edx
2075
		cmp edx,0
2076
		jg .copy_0
2077
	jmp .copy_end
2078
	.copy_1: ;не простое копирование (картинка вылазит за правую сторону)
2079
		mov ecx,eax
2080
		@@:
2081
			call combine_colors
2082
			add edi,3
2083
			add esi,4
2084
			loop @b
2085
		add edi,ebx
2086
		add esi,[right_bytes] ;добавляем байты, которые вылазят за правую границу
2087
		dec edx
2088
		cmp edx,0
2089
		jg .copy_1
2090
 
2091
	.copy_end:
2092
	popad
2093
	ret
2094
endp
2095
 
2096
;input:
2097
; ebx - color1
2098
; esi = pointer to transparent
2099
; edi = pointer to background color2
2100
;output:
2101
; [edi] = combine color
2102
align 4
2103
combine_colors_2:
2104
	push ax ebx cx dx si
2105
	mov cl,byte[esi] ;pro
2106
	xor ch,ch
2107
	mov si,0x00ff ;---get transparent---
2108
	sub si,cx ;256-pro
2109
 
1653 IgorA 2110
		;---blye---
1535 IgorA 2111
		mov al,bl
2112
		xor ah,ah
2113
		shr ebx,8
2114
		imul ax,si
2115
		xor dh,dh
1653 IgorA 2116
		mov dl,byte[edi]
1535 IgorA 2117
		imul dx,cx
2118
		add ax,dx
1653 IgorA 2119
		mov byte[edi],ah
1535 IgorA 2120
		;---green---
2121
		mov al,bl
2122
		xor ah,ah
2123
		shr ebx,8
2124
		imul ax,si
2125
		xor dh,dh
2126
		mov dl,byte[edi+1]
2127
		imul dx,cx
2128
		add ax,dx
2129
		mov byte[edi+1],ah
2130
		;---red---
2131
		mov al,bl
2132
		xor ah,ah
2133
		imul ax,si
2134
		xor dh,dh
1653 IgorA 2135
		mov dl,byte[edi+2]
1535 IgorA 2136
		imul dx,cx
2137
		add ax,dx
1653 IgorA 2138
		mov byte[edi+2],ah
1535 IgorA 2139
 
2140
	pop si dx cx ebx ax
2141
	ret
2142
 
2143
;функция копирует изображение из буфера buf_source (8b) в buf_destination (24b)
2144
; указываются координаты вставки буфера buf_source относительно buf_destination
2145
align 4
2146
proc buf_bit_blt_alpha, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword, color:dword
2147
	locals
2148
		right_bytes dd ?
2149
		dest_w_bytes dd ? ;колличество байт в буфере приемнике по ширине - ширина вставляемой картинки
2150
	endl
2151
	pushad
2152
 
2153
	mov edi,[buf_source]
2154
	cmp buf2d_bits,8
2155
	jne .error1 ;формат буфера не поодерживается
2156
	mov eax,buf2d_w
2157
	mov edx,buf2d_h ;высота копируемой картинки
2158
	mov esi,buf2d_data ;данные копируемой картинки
2159
 
2160
	mov edi,[buf_destination]
2161
	cmp buf2d_bits,24
2162
	jne .error2 ;формат буфера не поодерживается
1642 IgorA 2163
	mov ebx,[coord_x] ;в ebx временно ставим отступ изображения (для проверки)
2164
	cmp ebx,buf2d_w   ;проверяем влазит ли изображение по ширине
2165
	jge .copy_end     ;если изображение полностью вылазит за правую сторону
1535 IgorA 2166
		mov ebx,buf2d_h ;ebx - высота основного буфера
2167
		mov ecx,[coord_y]
2168
		cmp ecx,ebx
2169
		jge .copy_end ;если координата 'y' больше высоты буфера
2170
		add ecx,edx ;ecx - нижняя координата копируемой картинки
2171
		cmp ecx,ebx
2172
		jle @f
2173
			sub ecx,ebx
2174
			sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу
2175
		@@:
2176
		mov ebx,buf2d_w
2177
		mov ecx,ebx ;ecx используем для временных целей
2178
		imul ecx,[coord_y]
2179
		add ecx,[coord_x]
2180
		lea ecx,[ecx+ecx*2]
2181
		add ecx,buf2d_data
2182
		sub ebx,eax
2183
		mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование
2184
 
2185
	mov [right_bytes],0
2186
	mov ecx,[coord_x]
2187
	cmp ecx,ebx
2188
	jl @f
2189
		sub ecx,ebx
2190
		sub eax,ecx ;укорачиваем копируемую строку
2191
		add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера
2192
		;ecx - число пикселей в 1-й строке картинки, которые вылазят за правую сторону
2193
		mov [right_bytes],ecx
2194
	@@:
2195
 
2196
	lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки
2197
	mov [dest_w_bytes],ebx
2198
	mov ebx,[color]
2199
 
2200
	cld
2201
	cmp [right_bytes],0
2202
	jg .copy_1
2203
	.copy_0: ;простое копирование
2204
		mov ecx,eax
2205
		@@:
2206
			call combine_colors_2
2207
			add edi,3
2208
			inc esi
2209
			loop @b
2210
		add edi,[dest_w_bytes]
2211
		dec edx
2212
		cmp edx,0
2213
		jg .copy_0
2214
	jmp .copy_end
2215
	.copy_1: ;не простое копирование (картинка вылазит за правую сторону)
2216
		mov ecx,eax
2217
		@@:
2218
			call combine_colors_2
2219
			add edi,3
2220
			inc esi
2221
			loop @b
2222
		add edi,[dest_w_bytes]
2223
		add esi,[right_bytes] ;добавляем байты, которые вылазят за правую границу
2224
		dec edx
2225
		cmp edx,0
2226
		jg .copy_1
2227
 
2228
	jmp .copy_end
2229
	.error1:
2230
		stdcall print_err,sz_buf2d_bit_blt_alpha,txt_err_n8b
2231
		jmp .copy_end
2232
	.error2:
2233
		stdcall print_err,sz_buf2d_bit_blt_alpha,txt_err_n24b
2234
	.copy_end:
2235
	popad
2236
	ret
2237
endp
2238
 
2239
;преобразование 8-битного буфера размером 16*16 в размер 1*256 символов
2240
align 4
2241
proc buf_convert_text_matrix, buf_struc:dword
2242
	locals
2243
		tmp_mem dd ?
2244
		c1 dw ?
2245
		c2 dd ?
2246
		c3 dw ?
2247
	endl
2248
	pushad
2249
	mov edi,dword[buf_struc]
2250
	cmp buf2d_bits,8
2251
	jne .error
2252
		mov ecx,buf2d_h
2253
		mov ebx,ecx
2254
		shr ebx,4 ;предполагаем что в буфере 16 строк с символами, потому делим на 2^4
2255
		mov edx,buf2d_w
2256
		imul ecx,edx ;ecx = size  8 b
2257
		invoke mem.alloc,ecx ;выделяем временную память
2258
		mov [tmp_mem],eax ;eax - new memory
2259
 
2260
		shr edx,4 ;предполагаем что в буфере 16 колонок с символами, потому делим на 2^4
2261
		mov eax,ebx
2262
		imul ebx,edx ;вычисляем кооличество пикселей на 1 символ
2263
		;eax = bhe - высота буквы
2264
		;ebx = bwi*bhe - колличество пикселей в 1-й букве
2265
		;edx = bwi - ширина буквы
2266
		;ecx,esi,edi - используются в цикле .c_0
2267
		shr buf2d_w,4
2268
		shl buf2d_h,4 ;преобразовываем размеры буфера
2269
 
2270
		cld
2271
		mov esi,buf2d_data
2272
		mov edi,[tmp_mem]
2273
		mov word[c3],16
2274
		.c_3:
2275
			mov dword[c2],eax
2276
			.c_2:
2277
				mov word[c1],16
2278
				.c_1:
2279
					mov ecx,edx ;.c_0:
2280
					rep movsb
2281
					add edi,ebx
2282
					sub edi,edx ;edi+=(bwi*bhe-bwi)
2283
					dec word[c1]
2284
					cmp word[c1],0
2285
					jg .c_1
2286
				add edi,edx
2287
				shl ebx,4
2288
				sub edi,ebx ;edi-=(16*bwi*bhe-bwi)
2289
				shr ebx,4
2290
				dec dword[c2]
2291
				cmp dword[c2],0
2292
				jg .c_2
2293
			sub edi,ebx
2294
			shl ebx,4
2295
			add edi,ebx ;edi+=(15*bwi*bhe)
2296
			shr ebx,4
2297
			dec word[c3]
2298
			cmp word[c3],0
2299
			jg .c_3
2300
 
2301
		mov edi,dword[buf_struc] ;копирование новой матрицы в основной буфер
2302
		mov edi,buf2d_data
2303
		mov esi,[tmp_mem]
2304
		mov ecx,ebx
2305
		shl ecx,8
2306
		rep movsb
2307
		invoke mem.free,[tmp_mem] ;чистим временную память
2308
		jmp .end_conv
2309
	.error:
2310
		stdcall print_err,sz_buf2d_convert_text_matrix,txt_err_n8b
2311
	.end_conv:
2312
	popad
2313
	ret
2314
endp
2315
 
2316
align 4
2317
buf_s_matr buf_2d_header ? ;локальная матрица символа
2318
 
2319
align 4
2320
proc buf_draw_text, buf_struc:dword, buf_t_matr:dword, text:dword, coord_x:dword, coord_y:dword, color:dword
2321
	locals
2322
		buf_t_matr_offs dd ?
2323
	endl
2324
	pushad
2325
	mov edi,dword[buf_struc]
2326
	cmp buf2d_bits,24
2327
	jne .error2
2328
	mov edi,dword[buf_t_matr]
2329
	cmp buf2d_bits,8
2330
	jne .error1
2331
		mov edx,buf2d_data
2332
		mov [buf_t_matr_offs],edx
2333
		mov ecx,BUF_STRUCT_SIZE ;копируем структуру текстовой матрицы
2334
		mov esi,edi
2335
		lea edi,[buf_s_matr]
2336
		cld
2337
		rep movsb
2338
		lea edi,[buf_s_matr]
2339
		shr buf2d_h,8 ;делим высоту символьного буфера на 256, для нахождения высоты 1-го символа
2340
		mov ebx,buf2d_h ;берем высоту символа
2341
		mov ecx,buf2d_w ;берем ширину символа
2342
 
2343
		mov eax,[coord_x]
2344
		mov esi,[text]
2345
		cmp byte[esi],0
2346
		je .end_draw ;если пустая строка
2347
		@@:
2348
			xor edx,edx
2349
			mov dl,byte[esi] ;берем код символа
2350
			imul edx,ebx ;умножаем его на высоту символа
2351
			imul edx,ecx ;умножаем на ширину символа
2352
			add edx,[buf_t_matr_offs] ;прибавляем смещение 0-го символа, т. е. получается смещение выводимого символа
2353
			mov buf2d_data,edx ;в локальный буфер символа, ставим указатель на нужный символ из буфера buf_t_matr
2354
			stdcall buf_bit_blt_alpha, [buf_struc], eax,[coord_y], edi,[color]
2355
			add eax,ecx
2356
			.new_s:
2357
				inc esi
2358
				cmp byte[esi],13
2359
				jne .no_13
2360
					mov eax,[coord_x]
2361
					add [coord_y],ebx
2362
					jmp .new_s
2363
				.no_13:
2364
			cmp byte[esi],0
2365
			jne @b
2366
		jmp .end_draw
2367
	.error1:
2368
		stdcall print_err,sz_buf2d_draw_text,txt_err_n8b
2369
		jmp .end_draw
2370
	.error2:
2371
		stdcall print_err,sz_buf2d_draw_text,txt_err_n24b
2372
	.end_draw:
2373
	popad
2374
	ret
2375
endp
2376
 
2377
align 4
2378
proc print_err, fun:dword, mes:dword ;выводим сообщение об шибке на доску отладки
2379
	pushad
2380
	mov eax,63
2381
	mov ebx,1
2382
 
2383
	mov esi,[fun]
2384
	@@:
2385
		mov cl,byte[esi]
2386
		int 0x40
2387
		inc esi
2388
		cmp byte[esi],0
2389
		jne @b
2390
	mov cl,':'
2391
	int 0x40
2392
	mov cl,' '
2393
	int 0x40
2394
	mov esi,[mes]
2395
	@@:
2396
		mov cl,byte[esi]
2397
		int 0x40
2398
		inc esi
2399
		cmp byte[esi],0
2400
		jne @b
2401
	popad
2402
	ret
2403
endp
2404
 
2405
;input:
2406
; ebp+8  = p0
2407
; ebp+12 = p1
2408
align 4
2409
line_len4i:
2410
	push ebp
2411
	mov ebp,esp
2412
		finit
2413
		fild word [ebp+8]
2414
		fisub word [ebp+12]
2415
		fmul st0,st0 ;st0=x^2
2416
		fild word [ebp+10]
2417
		fisub word [ebp+14]
2418
		fmul st0,st0 ;st0=y^2
2419
		fadd st0,st1
2420
		fsqrt
2421
		fstp dword [ebp+12]
2422
	pop ebp
2423
	ret 4 ;8
2424
 
2425
align 4
1727 IgorA 2426
proc buf_curve_bezier, buffer:dword, coord_p0:dword,coord_p1:dword,coord_p2:dword, color:dword
1535 IgorA 2427
	locals
2428
		delt_t dd ?
2429
		opr_param dd ?
2430
		v_poi_0 dd ?
2431
	endl
2432
	pushad
2433
 
2434
;float t, xt,yt;
2435
;for(t=.0;t<1.;t+=.005){
2436
;  xt=pow(1.-t,2)*x0+2*t*(1.-t)*x1+pow(t,2)*x2;
2437
;  yt=pow(1.-t,2)*y0+2*t*(1.-t)*y1+pow(t,2)*y2;
2438
;  dc.SetPixel(xt,yt,255L);
2439
;}
2440
 
1727 IgorA 2441
	mov edx,[color] ;set curve color
1535 IgorA 2442
	mov edi,[buffer]
2443
	xor ebx,ebx
2444
	xor ecx,ecx
2445
 
2446
	finit
2447
 
2448
	; calculate delta t
2449
	stdcall line_len4i, dword[coord_p1],dword[coord_p0]
2450
	fadd dword[esp]
2451
	add esp,4 ;pop ...
2452
 
2453
	stdcall line_len4i, dword[coord_p2],dword[coord_p1]
2454
	fadd dword[esp]
2455
	add esp,4 ;pop ...
2456
 
2457
	fadd st0,st0 ; len*=2
2458
	ftst
2459
	fstsw ax
2460
 
2461
	fld1
2462
	sahf
2463
	jle @f ;избегаем деления на 0
2464
		fdiv st0,st1
2465
	@@:
2466
	fstp dword[delt_t]
2467
 
2468
	finit
2469
 
2470
	;fild word[coord_p2+2] ;y2
2471
	fild word[coord_p1+2] ;y1
2472
	fild word[coord_p0+2] ;y0
2473
	fild word[coord_p2] ;x2
2474
	fild word[coord_p1] ;x1
2475
	fild word[coord_p0] ;x0
2476
	fld dword[delt_t]
2477
	fldz ;t=.0
2478
 
2479
	@@:
2480
		fld1
2481
		fsub st0,st1 ;1.-t
2482
		fmul st0,st0 ;pow(1.-t,2)
2483
		fmul st0,st3 ;...*x0
2484
		fstp dword[opr_param]
2485
 
2486
		fld1
2487
		fsub st0,st1 ;1.-t
2488
		fmul st0,st1 ;(1.-t)*t
2489
		fadd st0,st0
2490
		fmul st0,st4 ;...*x1
2491
		mov esi,dword[opr_param]
2492
		fstp dword[opr_param]
2493
 
2494
		fldz
2495
		fadd st0,st1 ;0+t
2496
		fmul st0,st0 ;t*t
2497
		fmul st0,st5 ;...*x2
2498
 
2499
		fadd dword[opr_param]
2500
		mov dword[opr_param],esi
2501
		fadd dword[opr_param]
2502
		fistp word[v_poi_0] ;x
2503
 
2504
		fld1
2505
		fsub st0,st1 ;1.-t
2506
		fmul st0,st0 ;pow(1.-t,2)
2507
		fmul st0,st6 ;...*y0
2508
		fstp dword[opr_param]
2509
 
2510
		fld1
2511
		fsub st0,st1 ;1.-t
2512
		fmul st0,st1 ;(1.-t)*t
2513
		fadd st0,st0
2514
		fmul st0,st7 ;...*y1
2515
		mov esi,dword[opr_param]
2516
		fstp dword[opr_param]
2517
 
2518
		fldz
2519
		fadd st0,st1 ;0+t
2520
		fmul st0,st0 ;t*t
2521
		fimul word[coord_p2+2] ;...*y2
2522
 
2523
		fadd dword[opr_param]
2524
		mov dword[opr_param],esi
2525
		fadd dword[opr_param]
2526
		fistp word[v_poi_0+2] ;y
2527
 
2528
		mov eax,1
2529
		mov bx,word[v_poi_0+2]
2530
		mov cx,word[v_poi_0]
2531
		call draw_pixel
2532
 
2533
		fadd st0,st1 ;t+dt
2534
 
2535
		fld1
2536
		fcomp
2537
		fstsw ax
2538
		sahf
2539
	jae @b
2540
 
2541
	popad
2542
	ret
2543
endp
2544
 
2545
txt_err_n8b db 'need buffer 8 bit',13,10,0
2546
txt_err_n24b db 'need buffer 24 bit',13,10,0
2547
 
2548
align 16
2549
EXPORTS:
2550
	dd sz_lib_init, lib_init
2551
	dd sz_buf2d_create, buf_create
2552
	dd sz_buf2d_create_f_img, buf_create_f_img
2553
	dd sz_buf2d_clear, buf_clear
2554
	dd sz_buf2d_draw, buf_draw_buf
2555
	dd sz_buf2d_delete, buf_delete
2136 IgorA 2556
	dd sz_buf2d_resize, buf_resize
1535 IgorA 2557
	dd sz_buf2d_line, buf_line_brs
2230 IgorA 2558
	dd sz_buf2d_line_sm, buf_line_brs_sm
1634 IgorA 2559
	dd sz_buf2d_rect_by_size, buf_rect_by_size
1642 IgorA 2560
	dd sz_buf2d_filled_rect_by_size, buf_filled_rect_by_size
1535 IgorA 2561
	dd sz_buf2d_circle, buf_circle
2562
	dd sz_buf2d_img_hdiv2, buf_img_hdiv2
2563
	dd sz_buf2d_img_wdiv2, buf_img_wdiv2
2564
	dd sz_buf2d_conv_24_to_8, buf_conv_24_to_8
2565
	dd sz_buf2d_conv_24_to_32, buf_conv_24_to_32
2566
	dd sz_buf2d_bit_blt, buf_bit_blt
2567
	dd sz_buf2d_bit_blt_transp, buf_bit_blt_transp
2568
	dd sz_buf2d_bit_blt_alpha, buf_bit_blt_alpha
1727 IgorA 2569
	dd sz_buf2d_curve_bezier, buf_curve_bezier
1535 IgorA 2570
	dd sz_buf2d_convert_text_matrix, buf_convert_text_matrix
2571
	dd sz_buf2d_draw_text, buf_draw_text
2572
	dd sz_buf2d_crop_color, buf_crop_color
2573
	dd sz_buf2d_offset_h, buf_offset_h
1684 IgorA 2574
	dd sz_buf2d_flood_fill, buf_flood_fill
1910 IgorA 2575
	dd sz_buf2d_set_pixel, buf_set_pixel
1535 IgorA 2576
	dd 0,0
2577
	sz_lib_init db 'lib_init',0
2578
	sz_buf2d_create db 'buf2d_create',0
2579
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
2580
	sz_buf2d_clear db 'buf2d_clear',0 ;очистка буфера указанным цветом
2581
	sz_buf2d_draw db 'buf2d_draw',0
2582
	sz_buf2d_delete db 'buf2d_delete',0
2136 IgorA 2583
	sz_buf2d_resize db 'buf2d_resize',0
1535 IgorA 2584
	sz_buf2d_line db 'buf2d_line',0 ;рисование линии
2230 IgorA 2585
	sz_buf2d_line_sm db 'buf2d_line_sm',0 ;рисование сглаженной линии
1642 IgorA 2586
	sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 ;рисование рамки прямоугольника, 2-я координата задана по размеру
2587
	sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 ;рисование залитого прямоугольника, 2-я координата задана по размеру
1535 IgorA 2588
	sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности
2589
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 ;сжатие изображения по высоте в 2 раза (размер буфера не меняется)
2590
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 ;сжатие изображения по ширине в 2 раза (размер буфера не меняется)
2591
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
2592
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
2593
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
2594
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
2595
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
1727 IgorA 2596
	sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
1535 IgorA 2597
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
2598
	sz_buf2d_draw_text db 'buf2d_draw_text',0
2599
	sz_buf2d_crop_color db 'buf2d_crop_color',0
2600
	sz_buf2d_offset_h db 'buf2d_offset_h',0
1684 IgorA 2601
	sz_buf2d_flood_fill db 'buf2d_flood_fill',0
1910 IgorA 2602
	sz_buf2d_set_pixel db 'buf2d_set_pixel',0
1684 IgorA 2603