Subversion Repositories Kolibri OS

Rev

Rev 1535 | Rev 1555 | 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
87
 
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
;endp
96
 
97
;создание буфера
98
align 4
99
proc buf_create, buf_struc:dword
100
	pushad
101
	mov edi,dword[buf_struc]
102
	mov ecx,buf2d_w
103
	mov ebx,buf2d_h
104
	imul ecx,ebx
105
	cmp buf2d_bits,24
106
	jne @f
107
		lea ecx,[ecx+ecx*2] ; 24 bit = 3
108
		;;;inc ecx ;запасной байт в конце буфера, что-бы не глючили некоторые функции на изображениях кратных 4К
109
	@@:
110
	cmp buf2d_bits,32
111
	jne @f
112
		shl ecx,2 ; 32 bit = 4
113
	@@:
114
	invoke mem.alloc,ecx
115
	mov buf2d_data,eax
116
 
117
	stdcall buf_clear,edi,buf2d_color ;очистка буфера фоновым цветом
118
	popad
119
	ret
120
endp
121
 
122
;создание буфера на основе изображения rgb
123
align 4
124
proc buf_create_f_img, buf_struc:dword, rgb_data:dword
125
	pushad
126
	mov edi,dword[buf_struc]
127
	mov ecx,buf2d_w
128
	mov ebx,buf2d_h
129
	imul ecx,ebx
130
	cmp buf2d_bits,24
131
	jne @f
132
		lea ecx,[ecx+ecx*2] ; 24 bit = 3
133
		;;;inc ecx ;запасной байт в конце буфера, что-бы не глючили некоторые функции на изображениях кратных 4К
134
	@@:
135
	cmp buf2d_bits,32
136
	jne @f
137
		shl ecx,2 ; 32 bit = 4
138
	@@:
139
	invoke mem.alloc,ecx
140
	mov buf2d_data,eax
141
 
142
	cmp buf2d_bits,24
143
	jne @f
144
		cld
145
		mov esi,[rgb_data]
146
		mov edi,eax ;eax=buf2d_data
147
		rep movsb ;копируем биты изображения в буфер
148
		jmp .end_create
149
	@@:
150
		stdcall buf_clear,edi,buf2d_color ;очистка буфера фоновым цветом
151
	.end_create:
152
	popad
153
	ret
154
endp
155
 
156
align 4
157
proc buf_clear, buf_struc:dword, color:dword ;очистка буфера заданым цветом
158
	pushad
159
	mov edi,dword[buf_struc]
160
 
161
	mov ecx,buf2d_w
162
	mov ebx,buf2d_h
163
	imul ecx,ebx
164
 
165
	cld
166
 
167
	cmp buf2d_bits,8
168
	jne .end_clear_8
169
		mov edi,buf2d_data
170
		mov al,byte[color]
171
		rep stosb
172
		jmp .end_clear_32
173
	.end_clear_8:
174
 
175
	cmp buf2d_bits,24
176
	jne .end_clear_24
177
		mov edi,buf2d_data
178
		mov eax,dword[color]
179
		mov ebx,eax
180
		shr ebx,16
181
		@@:
182
			stosw
183
			mov byte[edi],bl
184
			inc edi
185
			loop @b
186
		jmp .end_clear_32
187
	.end_clear_24:
188
 
189
	cmp buf2d_bits,32
190
	jne .end_clear_32
191
		mov edi,buf2d_data
192
		mov eax,dword[color]
193
		rep stosd
194
		;jmp .end_clear_32
195
	.end_clear_32:
196
	popad
197
	ret
198
endp
199
 
1538 IgorA 200
;функция для обрезания буферов 8 и 24 битных, по заданому цвету.
201
;параметр opt задается комбинацией констант:
202
; BUF2D_OPT_CROP_TOP - обрезка сверху
203
; BUF2D_OPT_CROP_LEFT - обрезка слева
204
; BUF2D_OPT_CROP_BOTTOM - обрезка снизу
205
; BUF2D_OPT_CROP_RIGHT - обрезка справа
1535 IgorA 206
align 4
1538 IgorA 207
proc buf_crop_color, buf_struc:dword, color:dword, opt:dword
1535 IgorA 208
locals
209
	crop_r dd ?
210
endl
211
	pushad
212
	mov edi,dword[buf_struc]
213
	cmp buf2d_bits,24
214
	jne .24end_f
215
 
216
	bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM
217
	jae .24no_crop_bottom
218
		mov eax,dword[color]
219
		mov edx,eax ;ax = colors - r,g
220
		shr edx,16 ;dl = color - b
221
		mov ecx,buf2d_h
222
		mov ebx,buf2d_w
223
		imul ecx,ebx
224
		lea esi,[ecx+ecx*2] ;esi=3*ecx
225
		add esi,buf2d_data
226
		cld
227
		@@:
228
			sub esi,3
229
			cmp word[esi],ax
230
			jne @f
231
			cmp byte[esi+2],dl
232
			jne @f
233
			loop @b
234
		@@:
235
		lea ebx,[ebx+ebx*2]
236
		xor edx,edx
237
		mov eax,buf2d_h
238
		imul eax,ebx
239
		add eax,buf2d_data ;eax - указатель на конец буфера изображения
240
		@@:
241
			add esi,ebx
242
			cmp esi,eax
243
			jge @f
244
			inc edx ;вычисляем число полных строк для обрезания
245
			loop @b
246
		@@:
247
		cmp edx,0
248
		je .24no_crop_bottom
249
			cmp edx,buf2d_h
250
			jge .24no_crop_bottom ;что-бы не получить пустой буфер
251
			sub buf2d_h,edx ;уменьшаем высоту буфера
252
			mov ecx,buf2d_h
253
			imul ecx,ebx ;ecx = новый размер изображения
254
			invoke mem.realloc,buf2d_data,ecx
255
			mov buf2d_data,eax ;на случай если изменился указатель на данные
256
	.24no_crop_bottom:
257
 
258
	bt dword[opt],BUF2D_BIT_OPT_CROP_TOP
259
	jae .24no_crop_top
260
		mov eax,dword[color]
261
		mov edx,eax ;ax = colors - r,g
262
		shr edx,16 ;dl = color - b
263
		mov esi,buf2d_data
264
		mov ecx,buf2d_h
265
		dec ecx ;при обрезании должна остаться минимум 1-на строка пикселей
266
		mov ebx,buf2d_w
267
		imul ecx,ebx
268
		cld
269
		@@:
270
			cmp word[esi],ax
271
			jne @f
272
			cmp byte[esi+2],dl
273
			jne @f
274
			add esi,3
275
			loop @b
276
		@@:
277
		lea ebx,[ebx+ebx*2]
278
		xor edx,edx
279
		@@:
280
			sub esi,ebx
281
			cmp esi,buf2d_data
282
			jl @f
283
			inc edx ;вычисляем число полных строк для обрезания
284
			loop @b
285
		@@:
286
		cmp edx,0
287
		je .24no_crop_top
288
			xor eax,eax
289
			sub eax,edx
290
			mov ebx,buf2d_h
291
			sub ebx,edx
292
			stdcall buf_offset_h, edi, eax, edx, ebx ;сдвигаем изображение в буфере вверх (eax<0)
293
			sub buf2d_h,edx ;уменьшаем высоту буфера
294
			mov ecx,buf2d_h
295
			add buf2d_t,dx ;сдвигаем отступ вниз, на число обрезанных строк
296
			mov ebx,buf2d_w
297
			imul ecx,ebx
298
			lea ecx,[ecx+ecx*2]
299
			invoke mem.realloc,buf2d_data,ecx
300
			mov buf2d_data,eax ;на случай если изменился указатель на данные
301
	.24no_crop_top:
302
 
303
	bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT
304
	jae .24no_crop_right
305
		mov eax,dword[color]
306
		mov edx,eax ;ax = colors - r,g
307
		shr edx,16 ;dl = color - b
308
		mov ebx,buf2d_w
309
		lea ebx,[ebx+ebx*2]
310
		mov esi,ebx
311
		imul esi,buf2d_h
312
		add esi,buf2d_data ;esi - указатель на конец буфера изображения
313
		mov dword[crop_r],0
314
		cld
1538 IgorA 315
		.24found_beg_right:
1535 IgorA 316
		sub esi,3 ;двигаемся на 1-ну колонку влево
317
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
318
		@@:
319
			cmp word[esi],ax
1538 IgorA 320
			jne .24found_right
1535 IgorA 321
			cmp byte[esi+2],dl
1538 IgorA 322
			jne .24found_right
1535 IgorA 323
			sub esi,ebx ;прыгаем на верхнюю строку
324
			loop @b
325
		inc dword[crop_r]
326
 
327
		mov ecx,buf2d_w
328
		dec ecx ;1 колонка на запас
329
		cmp dword[crop_r],ecx
1538 IgorA 330
		jge .24found_right
1535 IgorA 331
 
332
		sub esi,3 ;двигаемся на 1-ну колонку влево
333
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
334
		@@:
335
			add esi,ebx ;прыгаем на нижнюю строку
336
			cmp word[esi],ax
1538 IgorA 337
			jne .24found_right
1535 IgorA 338
			cmp byte[esi+2],dl
1538 IgorA 339
			jne .24found_right
1535 IgorA 340
			loop @b
341
		inc dword[crop_r]
342
 
343
		mov ecx,buf2d_w
344
		dec ecx ;1 колонка на запас
345
		cmp dword[crop_r],ecx
1538 IgorA 346
		jl .24found_beg_right
1535 IgorA 347
 
1538 IgorA 348
		.24found_right:
1535 IgorA 349
		cmp dword[crop_r],0
350
		je .24no_crop_right
351
			mov ecx,buf2d_w
352
			sub ecx,dword[crop_r]
1538 IgorA 353
			stdcall img_rgb_crop_r, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру
1535 IgorA 354
			mov buf2d_w,ecx ;ставим новую ширину для буфера
355
			mov ebx,buf2d_h
356
			imul ecx,ebx
357
			lea ecx,[ecx+ecx*2]
358
			invoke mem.realloc,buf2d_data,ecx
359
			mov buf2d_data,eax ;на случай если изменился указатель на данные
360
	.24no_crop_right:
361
 
1538 IgorA 362
	bt dword[opt],BUF2D_BIT_OPT_CROP_LEFT
363
	jae .24no_crop_left
364
		mov eax,dword[color]
365
		mov edx,eax ;ax = colors - r,g
366
		shr edx,16 ;dl = color - b
367
		mov ebx,buf2d_w
368
		lea ebx,[ebx+ebx*2]
369
		mov esi,buf2d_data ;esi - указатель на начоло буфера изображения
370
		mov dword[crop_r],0
371
		cld
372
		.24found_beg_left:
373
 
374
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
375
		@@:
376
			cmp word[esi],ax
377
			jne .24found_left
378
			cmp byte[esi+2],dl
379
			jne .24found_left
380
			add esi,ebx ;прыгаем на нижнюю строку
381
			loop @b
382
		inc dword[crop_r]
383
		add esi,3 ;двигаемся на 1-ну колонку вправо
384
 
385
		mov ecx,buf2d_w
386
		dec ecx ;1 колонка на запас
387
		cmp dword[crop_r],ecx
388
		jge .24found_left
389
 
390
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
391
		@@:
392
			sub esi,ebx ;прыгаем на верхнюю строку
393
			cmp word[esi],ax
394
			jne .24found_left
395
			cmp byte[esi+2],dl
396
			jne .24found_left
397
			loop @b
398
		inc dword[crop_r]
399
		add esi,3 ;двигаемся на 1-ну колонку вправо
400
 
401
		mov ecx,buf2d_w
402
		dec ecx ;1 колонка на запас
403
		cmp dword[crop_r],ecx
404
		jl .24found_beg_left
405
 
406
		.24found_left:
407
		cmp dword[crop_r],0
408
		je .24no_crop_left
409
			mov ecx,buf2d_w
410
			sub ecx,dword[crop_r]
411
			stdcall img_rgb_crop_l, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру
412
			mov buf2d_w,ecx ;ставим новую ширину для буфера
413
			mov ebx,buf2d_h
414
			imul ecx,ebx
415
			lea ecx,[ecx+ecx*2]
416
			invoke mem.realloc,buf2d_data,ecx
417
			mov buf2d_data,eax ;на случай если изменился указатель на данные
418
			mov eax,dword[crop_r]
419
			add buf2d_l,ax
420
	.24no_crop_left:
421
 
1535 IgorA 422
	.24end_f:
423
 
424
 
425
	cmp buf2d_bits,8
426
	jne .8end_f
427
 
428
	bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM
429
	jae .8no_crop_bottom
430
		mov eax,dword[color]
431
		mov esi,buf2d_data
432
		mov ecx,buf2d_h
433
		mov ebx,buf2d_w
434
		imul ecx,ebx
435
		mov esi,ecx
436
		add esi,buf2d_data
437
		cld
438
		@@:
439
			dec esi
440
			cmp byte[esi],al
441
			jne @f
442
			loop @b
443
		@@:
444
		xor edx,edx
445
		mov eax,buf2d_h
446
		imul eax,ebx
447
		add eax,buf2d_data ;eax - указатель на конец буфера изображения
448
		@@:
449
			add esi,ebx
450
			cmp esi,eax
451
			jge @f
452
			inc edx
453
			loop @b
454
		@@:
455
		cmp edx,0
456
		je .8no_crop_bottom
457
			cmp edx,buf2d_h
458
			jge .8no_crop_bottom ;что-бы не получить пустой буфер
459
			sub buf2d_h,edx ;уменьшаем высоту буфера
460
			mov ecx,buf2d_h
461
			imul ecx,ebx ;ecx = новый размер изображения
462
			invoke mem.realloc,buf2d_data,ecx
463
			mov buf2d_data,eax ;на случай если изменился указатель на данные
464
	.8no_crop_bottom:
465
 
466
	bt dword[opt],BUF2D_BIT_OPT_CROP_TOP
467
	jae .8no_crop_top
468
		mov eax,dword[color]
469
		mov esi,buf2d_data
470
		mov ecx,buf2d_h
471
		dec ecx ;при обрезании должна остаться минимум 1-на строка пикселей
472
		mov ebx,buf2d_w
473
		imul ecx,ebx
474
		cld
475
		@@:
476
			cmp byte[esi],al
477
			jne @f
478
			inc esi
479
			loop @b
480
		@@:
481
		xor edx,edx
482
		@@:
483
			sub esi,ebx
484
			cmp esi,buf2d_data
485
			jl @f
486
			inc edx
487
			loop @b
488
		@@:
489
		cmp edx,0
490
		je .8no_crop_top
491
			xor eax,eax
492
			sub eax,edx
493
			mov ebx,buf2d_h
494
			sub ebx,edx
495
			stdcall buf_offset_h, edi, eax, edx, ebx
496
			mov ecx,buf2d_h
497
			sub ecx,edx
498
			mov buf2d_h,ecx ;уменьшаем высоту буфера
499
			add buf2d_t,dx ;сдвигаем отступ вниз, на число обрезанных строк
500
			mov ebx,buf2d_w
501
			imul ecx,ebx
502
			invoke mem.realloc,buf2d_data,ecx
503
			mov buf2d_data,eax ;на случай если изменился указатель на данные
504
	.8no_crop_top:
505
 
506
	bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT
507
	jae .8no_crop_right
508
		mov eax,dword[color]
509
		mov ebx,buf2d_w
510
		mov esi,ebx
511
		imul esi,buf2d_h
512
		add esi,buf2d_data ;esi - указатель на конец буфера изображения
513
		xor edx,edx
514
		cld
515
 
516
		.8found_beg:
517
		dec esi ;двигаемся на 1-ну колонку влево
518
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
519
		@@:
520
			cmp byte[esi],al
521
			jne .8found
522
			sub esi,ebx ;прыгаем на верхнюю строку
523
			loop @b
524
		inc edx
525
		mov ecx,buf2d_w
526
		dec ecx ;1 колонка на запас
527
		cmp edx,ecx
528
		jge .8found
529
 
530
		dec esi ;двигаемся на 1-ну колонку влево
531
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
532
		@@:
533
			add esi,ebx ;прыгаем на нижнюю строку
534
			cmp byte[esi],al
535
			jne .8found
536
			loop @b
537
		inc edx
538
 
539
		mov ecx,buf2d_w
540
		dec ecx ;1 колонка на запас
541
		cmp edx,ecx
542
		jl .8found_beg
543
 
544
		.8found:
545
		cmp edx,0
546
		je .8no_crop_right
547
			mov ecx,buf2d_w
548
			sub ecx,edx
1538 IgorA 549
			stdcall img_gray_crop_r, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру
1535 IgorA 550
			mov buf2d_w,ecx ;ставим новую ширину для буфера
551
			mov ebx,buf2d_h
552
			imul ecx,ebx
553
			invoke mem.realloc,buf2d_data,ecx
554
			mov buf2d_data,eax ;на случай если изменился указатель на данные
555
	.8no_crop_right:
556
 
1538 IgorA 557
	bt dword[opt],BUF2D_BIT_OPT_CROP_LEFT
558
	jae .8no_crop_left
559
		mov eax,dword[color]
560
		mov ebx,buf2d_w
561
		mov esi,buf2d_data ;esi - указатель на начоло буфера изображения
562
		mov edx,0
563
		cld
564
		.8found_beg_left:
565
 
566
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
567
		@@:
568
			cmp word[esi],ax
569
			jne .8found_left
570
			add esi,ebx ;прыгаем на нижнюю строку
571
			loop @b
572
		inc edx
573
		inc esi ;двигаемся на 1-ну колонку вправо
574
 
575
		mov ecx,buf2d_w
576
		dec ecx ;1 колонка на запас
577
		cmp edx,ecx
578
		jge .8found_left
579
 
580
		mov ecx,buf2d_h ;восстановление ecx для нового цикла
581
		@@:
582
			sub esi,ebx ;прыгаем на верхнюю строку
583
			cmp word[esi],ax
584
			jne .8found_left
585
			loop @b
586
		inc edx
587
		inc esi ;двигаемся на 1-ну колонку вправо
588
 
589
		mov ecx,buf2d_w
590
		dec ecx ;1 колонка на запас
591
		cmp edx,ecx
592
		jl .8found_beg_left
593
 
594
		.8found_left:
595
		cmp edx,0
596
		je .8no_crop_left
597
			mov ecx,buf2d_w
598
			sub ecx,edx
599
			stdcall img_gray_crop_l, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру
600
			mov buf2d_w,ecx ;ставим новую ширину для буфера
601
			mov ebx,buf2d_h
602
			imul ecx,ebx
603
			invoke mem.realloc,buf2d_data,ecx
604
			mov buf2d_data,eax ;на случай если изменился указатель на данные
605
			mov eax,edx
606
			add buf2d_l,ax
607
	.8no_crop_left:
608
 
1535 IgorA 609
	.8end_f:
610
 
611
	popad
612
	ret
613
endp
614
 
1538 IgorA 615
;обрезаем цветное изображение с правой стороны
1535 IgorA 616
;input:
617
;data_rgb - pointer to rgb data
618
;size_w_old - width img in pixels
619
;size_w_new - new width img in pixels
620
;size_h - height img in pixels
621
align 4
1538 IgorA 622
proc img_rgb_crop_r, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword
1535 IgorA 623
	pushad
624
	mov eax, dword[size_w_old]
625
	lea eax, dword[eax+eax*2] ;eax = width(old) * 3(rgb)
626
	mov ebx, dword[size_w_new]
627
	lea ebx, dword[ebx+ebx*2] ;ebx = width(new) * 3(rgb)
628
	mov edx, dword[size_h]
629
	mov edi, dword[data_rgb] ;edi - получает данные
630
	mov esi, edi
631
	add edi, ebx
632
	add esi, eax
633
	cld
634
	@@:
635
		dec edx ;уменьшаем счетчик оставшихся строк на 1
636
		cmp edx,0
637
		jle @f
638
		mov ecx, ebx
639
		rep movsb ;перенос (копирование) строки пикселей
640
		add esi,eax ;переход на новую строчку изображения
641
		sub esi,ebx
642
		jmp @b
643
	@@:
644
	popad
645
	ret
646
endp
647
 
1538 IgorA 648
;обрезаем серое изображение с правой стороны
1535 IgorA 649
;input:
650
;data_gray - pointer to gray data
651
;size_w_old - width img in pixels
652
;size_w_new - new width img in pixels
653
;size_h - height img in pixels
654
align 4
1538 IgorA 655
proc img_gray_crop_r, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword
1535 IgorA 656
	pushad
657
	mov eax, dword[size_w_old]
658
	mov ebx, dword[size_w_new]
659
	mov edx, dword[size_h]
660
	mov edi, dword[data_gray] ;edi - получает данные
661
	mov esi, edi
662
	add edi, ebx
663
	add esi, eax
664
	cld
665
	@@:
666
		dec edx ;уменьшаем счетчик оставшихся строк на 1
667
		cmp edx,0
668
		jle @f
669
		mov ecx, ebx
670
		rep movsb ;перенос (копирование) строки пикселей
671
		add esi,eax ;переход на новую строчку изображения
672
		sub esi,ebx
673
		jmp @b
674
	@@:
675
	popad
676
	ret
677
endp
678
 
1538 IgorA 679
;обрезаем цветное изображение с левой стороны
680
;input:
681
;data_rgb - pointer to rgb data
682
;size_w_old - width img in pixels
683
;size_w_new - new width img in pixels
684
;size_h - height img in pixels
685
align 4
686
proc img_rgb_crop_l, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword
687
	pushad
688
	mov edi,dword[data_rgb]
689
	mov esi,edi
690
	mov eax,dword[size_w_old]
691
	mov ebx,dword[size_w_new]
692
	cmp eax,ebx
693
	jle .end_f ;старый размер изображения не может быть меньше нового (при условии обрезания картинки)
694
		lea eax,[eax+eax*2]
695
		lea ebx,[ebx+ebx*2]
696
		sub eax,ebx
697
		mov edx,dword[size_h] ;высота изображения
698
		cld
699
		@@:
700
			add esi,eax
701
			mov ecx,ebx
702
			rep movsb
703
			dec edx
704
			cmp edx,0
705
			jg @b
706
	.end_f:
707
	popad
708
	ret
709
endp
710
 
711
;обрезаем серое изображение с левой стороны
712
;input:
713
;data_gray - pointer to gray data
714
;size_w_old - width img in pixels
715
;size_w_new - new width img in pixels
716
;size_h - height img in pixels
717
align 4
718
proc img_gray_crop_l, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword
719
	pushad
720
	mov edi,dword[data_gray]
721
	mov esi,edi
722
	mov eax,dword[size_w_old]
723
	mov ebx,dword[size_w_new]
724
	cmp eax,ebx
725
	jle .end_f ;старый размер изображения не может быть меньше нового (при условии обрезания картинки)
726
		sub eax,ebx
727
		mov edx,dword[size_h] ;высота изображения
728
		cld
729
		@@:
730
			add esi,eax
731
			mov ecx,ebx
732
			rep movsb
733
			dec edx
734
			cmp edx,0
735
			jg @b
736
	.end_f:
737
	popad
738
	ret
739
endp
740
 
1535 IgorA 741
;hoffs - колличество пикселей на котрые поднимается/опускается изображение
742
;img_t - высота, с которой начинается двигающаяся часть изображения
743
align 4
744
proc buf_offset_h, buf_struc:dword, hoffs:dword, img_t:dword, img_h:dword ;сдвигает изображение по высоте
745
	pushad
746
	mov edi,dword[buf_struc]
747
	cmp buf2d_bits,24
748
	jne .end_move_24
749
 
750
	mov eax,[hoffs]
751
	cmp eax,0
752
	je .end_move_24
753
		mov ebx,buf2d_w
754
		mov edx,dword[img_t]
755
			mov ecx,dword[img_h] ;ecx - высота сдвигаемых данных
756
			cmp ecx,buf2d_h
757
			jge .end_f ;ошибочное условие, высота изображения меньше чем высота сдвигаемого изображения
758
			imul ecx,ebx ;ecx - колличество пикселей в сдвигаемых данных
759
			lea ecx,[ecx+ecx*2]
760
		imul ebx,edx
761
		lea ebx,[ebx+ebx*2]
762
		mov esi,buf2d_data
763
		add esi,ebx
764
 
765
		add edx,eax ;edx = img_t+hoffs (hoffs<0)
766
		mov ebx,buf2d_w
767
		imul ebx,edx
768
		lea ebx,[ebx+ebx*2]
769
		mov edi,buf2d_data ;позиция, куда будет двигаться изображение
770
		add edi,ebx
771
 
772
		cmp eax,0
773
		jg .move_down_24
774
			;двигаем изображение вверх
775
			cld
776
			rep movsb
777
			jmp .end_f
778
		.move_down_24:
779
			;двигаем изображение вниз
780
			add esi,ecx
781
			dec esi
782
			add edi,ecx
783
			dec edi
784
			std
785
			rep movsb
786
			jmp .end_f
787
	.end_move_24:
788
 
789
;stdcall print_err,sz_buf2d_offset_h,txt_err_n24b
790
 
791
	cmp buf2d_bits,8
792
	jne .end_move_8
793
 
794
	mov eax,[hoffs]
795
	cmp eax,0
796
	je .end_move_8
797
		;двигаем изображение вверх
798
		mov ebx,buf2d_w
799
		mov edx,dword[img_t]
800
			mov ecx,dword[img_h] ;ecx - высота сдвигаемых данных
801
			cmp ecx,buf2d_h
802
			jge .end_f ;ошибочное условие, высота изображения меньше чем высота сдвигаемого изображения
803
			imul ecx,ebx ;ecx - колличество пикселей в сдвигаемых данных
804
		imul ebx,edx
805
		mov esi,buf2d_data
806
		add esi,ebx
807
 
808
		add edx,eax ;edx = img_t+hoffs (hoffs<0)
809
		mov ebx,buf2d_w
810
		imul ebx,edx
811
		mov edi,buf2d_data ;позиция, куда будет двигаться изображение
812
		add edi,ebx
813
 
814
		cmp eax,0
815
		jg .move_down_8
816
			cld
817
			rep movsb
818
			jmp .end_f
819
		.move_down_8:
820
			;двигаем изображение вниз
821
			add esi,ecx
822
			dec esi
823
			add edi,ecx
824
			dec edi
825
			std
826
			rep movsb
827
			jmp .end_f
828
	.end_move_8:
829
 
830
	.end_f:
831
	popad
832
	ret
833
endp
834
 
835
 
836
align 4
837
proc buf_draw_buf, buf_struc:dword
838
	pushad
839
	mov edi,dword[buf_struc]
840
	cmp buf2d_bits,24
841
	jne .error
842
		mov eax,7
843
		mov ebx,buf2d_data
844
 
845
		mov ecx,buf2d_w
846
		ror ecx,16
847
		mov edx,buf2d_h
848
		mov cx,dx
849
 
850
		mov edx,buf2d_size_lt
851
		ror edx,16
852
		int 0x40
853
		jmp .end_draw_24
854
	.error:
855
		stdcall print_err,sz_buf2d_draw,txt_err_n24b
856
	.end_draw_24:
857
	popad
858
	ret
859
endp
860
 
861
align 4
862
proc buf_delete, buf_struc:dword
863
	push edi
864
	mov edi,dword[buf_struc]
865
	invoke mem.free,buf2d_data
866
	pop edi
867
	ret
868
endp
869
 
870
align 4
871
proc buf_line_brs, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, coord_y1:dword, color:dword
872
locals
873
	loc_1 dd ?
874
	loc_2 dd ?
875
	napravl db ?
876
endl
877
	pushad
878
		mov edx,dword[color]
879
 
880
		mov eax,dword[coord_x1]
881
		sub eax,dword[coord_x0]
882
		bt eax,31
883
		jae @f
884
			neg eax
885
			inc eax
886
		@@:
887
		mov ebx,dword[coord_y1]
888
		sub ebx,dword[coord_y0]
889
		bt ebx,31
890
		jae @f
891
			neg ebx
892
			inc ebx
893
		@@:
894
 
895
		mov [napravl],byte 0 ;bool steep=false
896
		cmp eax,ebx
897
		jle @f
898
			mov [napravl],byte 1 ;bool steep=true
899
			swap dword[coord_x0],dword[coord_y0] ;swap(x0, y0);
900
			swap dword[coord_x1],dword[coord_y1] ;swap(x1, y1);
901
		@@:
902
		mov eax,dword[coord_y0] ;x0
903
		cmp eax,dword[coord_y1] ;if(x0>x1)
904
		jle @f
905
			swap dword[coord_y0],dword[coord_y1] ;swap(x0, x1);
906
			swap dword[coord_x0],dword[coord_x1] ;swap(y0, y1);
907
		@@:
908
 
909
; int deltax esi
910
; int deltay edi
911
; int error  ebp-6
912
; int ystep  ebp-8
913
 
914
		mov eax,dword[coord_y0]
915
		mov esi,dword[coord_y1]
916
		sub esi,eax ;deltax = y1-y0
917
		mov ebx,esi
918
		shr ebx,1
919
		mov [loc_1],ebx ;error = deltax/2
920
 
921
		mov eax,dword[coord_x0]
922
		mov edi,dword[coord_x1]
923
		mov [loc_2],dword -1 ;ystep = -1
924
		cmp eax,edi ;if (x0
925
		jge @f
926
			mov [loc_2],dword 1 ;ystep = 1
927
		@@:
928
		sub edi,eax ;x1-x0
929
 
930
		bts edi,31
931
		jae @f
932
			neg edi
933
			inc edi
934
		@@:
935
		and edi,0x7fffffff ;deltay = abs(x1-x0)
936
 
937
		mov eax,edi
938
		mov edi,[buf_struc]
939
		cmp buf2d_bits,24
940
		jne .coord_end
941
 
942
		cmp [napravl],0
943
		jne .coord_yx
944
			mov ebx,dword[coord_x0]
945
			mov ecx,dword[coord_y0]
946
 
947
			@@: ;for (x=x0 ; x
948
				cmp ecx,dword[coord_y1]
949
				jg @f ;jge ???
950
				call draw_pixel
951
 
952
				sub dword[loc_1],eax ;error -= deltay
953
				cmp dword[loc_1],0 ;if(error<0)
954
				jge .if0
955
					add ebx,[loc_2] ;y += ystep
956
					add [loc_1],esi ;error += deltax
957
				.if0:
958
				inc ecx
959
				jmp @b
960
			@@:
961
			jmp .coord_end
962
		.coord_yx:
963
			mov ebx,dword[coord_y0]
964
			mov ecx,dword[coord_x0]
965
 
966
			@@: ;for (x=x0 ; x
967
				cmp ebx,dword[coord_y1]
968
				jg @f ;jge ???
969
				call draw_pixel
970
 
971
				sub dword[loc_1],eax ;error -= deltay
972
				cmp dword[loc_1],0 ;if(error<0)
973
				jge .if1
974
					add ecx,[loc_2] ;y += ystep
975
					add [loc_1],esi ;error += deltax
976
				.if1:
977
				inc ebx
978
				jmp @b
979
			@@:
980
	.coord_end:
981
	popad
982
	ret
983
endp
984
 
985
align 4
986
proc buf_circle, buf_struc:dword, coord_x:dword, coord_y:dword, r:dword, color:dword
987
locals
988
	po_x dd ?
989
	po_y dd ?
990
endl
991
	pushad
992
	mov edi,dword[buf_struc]
993
	cmp buf2d_bits,24
994
	jne .error
995
		mov edx,dword[color]
996
 
997
		finit
998
		fild dword[coord_x]
999
		fild dword[coord_y]
1000
		fild dword[r]
1001
		fldz ;px=0
1002
		fld st1 ;py=r
1003
 
1004
		fldpi
1005
		fmul st0,st3
1006
		fistp dword[po_x]
1007
		mov esi,dword[po_x] ;esi=pi*r
1008
		shl esi,1 ;esi=2*pi*r
1009
 
1010
		;st0 = py
1011
		;st1 = px
1012
		;st2 = r
1013
		;st3 = y
1014
		;st4 = x
1015
 
1016
		@@:
1017
			;Point(px + x, y - py)
1018
			fld st1 ;st0=px
1019
			fadd st0,st5 ;st0=px+x
1020
			fistp dword[po_x]
1021
			mov ebx,dword[po_x]
1022
			fld st3 ;st0=y
1023
			fsub st0,st1 ;st0=y-py
1024
			fistp dword[po_y]
1025
			mov ecx,dword[po_y]
1026
			call draw_pixel
1027
			;px += py/r
1028
			fld st0 ;st0=py
1029
			fdiv st0,st3 ;st0=py/r
1030
			faddp st2,st0 ;st3+=st0
1031
			;py -= px/r
1032
			fld st1 ;st0=px
1033
			fdiv st0,st3 ;st0=px/r
1034
			fsubp st1,st0 ;st2-=st0
1035
 
1036
			dec esi
1037
			cmp esi,0
1038
			jge @b
1039
		jmp .exit_fun
1040
	.error:
1041
		stdcall print_err,sz_buf2d_circle,txt_err_n24b
1042
	.exit_fun:
1043
 
1044
	popad
1045
	ret
1046
endp
1047
 
1048
align 4
1049
proc buf_img_wdiv2, buf_struc:dword
1050
	pushad
1051
	mov edi,dword[buf_struc]
1052
	cmp buf2d_bits,24
1053
	jne .end_draw_24
1054
		mov eax,buf2d_w
1055
		mov ecx,buf2d_h
1056
		imul ecx,eax
1057
		stdcall img_rgb24_wdiv2, buf2d_data,ecx
1058
	.end_draw_24:
1059
	popad
1060
	ret
1061
endp
1062
 
1063
;input:
1064
;data_rgb - pointer to rgb data
1065
;size - count img pixels (size img data / 3(rgb) )
1066
align 4
1067
proc img_rgb24_wdiv2 data_rgb:dword, size:dword
1068
  ;push eax ebx ecx edx
1069
  mov eax,dword[data_rgb]
1070
  mov ecx,dword[size] ;ecx = size
1071
  lea ecx,[ecx+ecx*2]
1072
  cld
1073
  @@: ;затемнение цвета пикселей
1538 IgorA 1074
		shr byte[eax],1
1075
		inc eax
1076
		loop @b
1535 IgorA 1077
 
1078
  mov eax,dword[data_rgb]
1079
  mov ecx,dword[size] ;ecx = size
1080
  shr ecx,1
1081
  @@: ;сложение цветов пикселей
1538 IgorA 1082
		mov bx,word[eax+3] ;копируем цвет соседнего пикселя
1083
		add word[eax],bx
1084
		mov bl,byte[eax+5] ;копируем цвет соседнего пикселя
1085
		add byte[eax+2],bl
1086
		add eax,6 ;=2*3
1087
		loop @b
1535 IgorA 1088
 
1089
  mov eax,dword[data_rgb]
1090
  add eax,3
1091
  mov ebx,eax
1092
  add ebx,3
1093
  mov ecx,dword[size] ;ecx = size
1094
  shr ecx,1
1095
  dec ecx ;лишний пиксель
1096
  @@: ;поджатие пикселей
1538 IgorA 1097
		mov edx,dword[ebx]
1098
		mov word[eax],dx
1099
		shr edx,16
1100
		mov byte[eax+2],dl
1535 IgorA 1101
 
1538 IgorA 1102
		add eax,3
1103
		add ebx,6
1104
		loop @b
1535 IgorA 1105
  ;pop edx ecx ebx eax
1106
  ret
1107
endp
1108
 
1109
align 4
1110
proc buf_img_hdiv2, buf_struc:dword
1111
	pushad
1112
	mov edi,dword[buf_struc]
1113
	cmp buf2d_bits,24
1114
	jne .end_draw_24
1115
		mov eax,buf2d_w
1116
		mov ecx,buf2d_h
1117
		imul ecx,eax
1118
		stdcall img_rgb24_hdiv2, buf2d_data,ecx,eax
1119
	.end_draw_24:
1120
	popad
1121
	ret
1122
endp
1123
 
1124
;input:
1125
;data_rgb - pointer to rgb data
1126
;size - count img pixels (size img data / 3(rgb) )
1127
;size_w - width img in pixels
1128
align 4
1129
proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword
1130
  ;pushad
1131
 
1132
  mov eax,dword[data_rgb] ;eax =
1133
  mov ecx,dword[size]	  ;ecx = size
1134
  lea ecx,[ecx+ecx*2]
1135
  cld
1136
  @@: ;затемнение цвета пикселей
1137
    shr byte[eax],1
1138
    inc eax
1139
    loop @b
1140
 
1141
  mov eax,dword[data_rgb] ;eax =
1142
  mov edi,dword[size_w]
1143
  lea esi,[edi+edi*2] ;esi = width*3(rgb)
1144
  mov ebx,esi
1145
  add ebx,eax
1146
  mov ecx,dword[size]  ;ecx = size
1147
  shr ecx,1
1148
  xor edi,edi
1149
  @@: ;сложение цветов пикселей
1150
    mov dx,word[ebx] ;копируем цвет нижнего пикселя
1151
    add word[eax],dx
1152
    mov dl,byte[ebx+2] ;копируем цвет нижнего пикселя
1153
    add byte[eax+2],dl
1154
 
1155
    add eax,3
1156
    add ebx,3
1157
    inc edi
1158
    cmp edi,dword[size_w]
1159
    jl .old_line
1160
      add eax,esi
1161
      add ebx,esi
1162
      xor edi,edi
1163
    .old_line:
1164
    loop @b
1165
 
1166
 
1167
  mov eax,dword[data_rgb] ;eax =
1168
  add eax,esi ;esi = width*3(rgb)
1169
  mov ebx,esi
1170
  add ebx,eax
1171
  mov ecx,dword[size] ;ecx = size
1172
  shr ecx,1
1173
  sub ecx,dword[size_w] ;лишняя строка пикселей
1174
  xor edi,edi
1175
  @@: ;поджатие пикселей
1176
    mov edx,dword[ebx] ;копируем цвет нижнего пикселя
1177
    mov word[eax],dx
1178
    shr edx,16
1179
    mov byte[eax+2],dl
1180
 
1181
    add eax,3
1182
    add ebx,3
1183
    inc edi
1184
    cmp edi,dword[size_w]
1185
    jl .old_line_2
1186
      add ebx,esi
1187
      xor edi,edi
1188
    .old_line_2:
1189
    loop @b
1190
 
1191
  ;popad
1192
  ret
1193
endp
1194
 
1195
;преобразование буфера из 24-битного в 8-битный
1196
; spectr - определяет какой спектр брать при преобразовании 0-синий, 1-зеленый, 2-красный
1197
align 4
1198
proc buf_conv_24_to_8, buf_struc:dword, spectr:dword
1199
	pushad
1200
	mov edi,dword[buf_struc]
1201
	cmp buf2d_bits,24
1202
	jne .error
1203
		mov eax,buf2d_w
1204
		mov ecx,buf2d_h
1205
		imul ecx,eax
1206
		mov esi,ecx
1207
		;ebx - память из которой копируется
1208
		;edx - память куда копируется
1209
		mov edx,buf2d_data
1210
		mov ebx,edx
1211
		cmp [spectr],3
1212
		jge @f
1213
			add ebx,[spectr]
1214
		@@:
1215
			mov al,byte[ebx]
1216
			mov byte[edx],al
1217
			add ebx,3
1218
			inc edx
1219
			loop @b
1220
		mov buf2d_bits,8
1221
		invoke mem.realloc,buf2d_data,esi ;уменьшаем память занимаемую буфером
1222
		jmp .end_conv
1223
	.error:
1224
		stdcall print_err,sz_buf2d_conv_24_to_8,txt_err_n24b
1225
	.end_conv:
1226
	popad
1227
	ret
1228
endp
1229
 
1230
;преобразование буфера из 24-битного в 32-битный
1231
align 4
1232
proc buf_conv_24_to_32, buf_struc:dword, buf_str8:dword
1233
	pushad
1234
	mov edi,dword[buf_struc]
1235
	cmp buf2d_bits,24
1236
	jne .error1
1237
		mov ecx,buf2d_w
1238
		mov ebx,buf2d_h
1239
		imul ebx,ecx
1240
		mov ecx,ebx ;ecx = size  8 b
1241
		shl ebx,2   ;ebx = size 32 b
1242
		invoke mem.realloc,buf2d_data,ebx ;увеличиваем память занимаемую буфером
1243
		mov buf2d_data,eax ;на случай если изменился указатель на данные
1244
		mov buf2d_bits,32
1245
		mov edx,ebx ;edx = size 32 b
1246
		sub ebx,ecx ;ebx = size 24 b
1247
		mov eax,ecx
1248
		;eax - размер  8 битных данных
1249
		;ebx - размер 24 битных данных
1250
		;edx - размер 32 битных данных
1251
		add ebx,buf2d_data
1252
		add edx,buf2d_data
1253
		mov edi,dword[buf_str8]
1254
		cmp buf2d_bits,8
1255
		jne .error2
1256
		add eax,buf2d_data
1257
		mov edi,edx
1258
		;eax - указатель на конец  8 битных данных
1259
		;ebx - указатель на конец 24 битных данных
1260
		;edi - указатель на конец 32 битных данных
1261
		@@:
1262
			sub edi,4 ;отнимаем в начале цикла,
1263
			sub ebx,3 ; потому, что указатели стоят
1264
			dec eax   ; за пределами буферов
1265
			mov edx,dword[ebx]
1266
			mov dword[edi],edx
1267
			mov dl,byte[eax]
1268
			mov byte[edi+3],dl
1269
			loop @b
1270
 
1271
		jmp .end_conv
1272
	.error1:
1273
		stdcall print_err,sz_buf2d_conv_24_to_32,txt_err_n24b
1274
		jmp .end_conv
1275
	.error2:
1276
		stdcall print_err,sz_buf2d_conv_24_to_32,txt_err_n8b
1277
	.end_conv:
1278
	popad
1279
	ret
1280
endp
1281
 
1282
;функция копирует изображение из буфера buf_source (24b|32b) в buf_destination (24b)
1283
; указываются координаты вставки буфера buf_source относительно buf_destination
1284
; прозрачность при копировании не учитывается
1285
align 4
1286
proc buf_bit_blt, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword
1287
	locals
1288
		right_bytes dd ?
1289
	endl
1290
	pushad
1291
 
1292
	mov edi,[buf_source]
1293
	cmp buf2d_bits,24
1294
	je .sou24
1295
	cmp buf2d_bits,32
1296
	je .sou32
1297
		jmp .copy_end ;формат буфера не поодерживается
1298
 
1299
	.sou24: ;в источнике 32 битная картинка
1300
	mov eax,buf2d_w
1301
	mov edx,buf2d_h ;высота копируемой картинки
1302
	mov esi,buf2d_data ;данные копируемой картинки
1303
 
1304
	mov edi,[buf_destination]
1305
	cmp buf2d_bits,24
1306
	jne .copy_end ;формат буфера не поодерживается
1307
		mov ebx,buf2d_h ;ebx - высота основного буфера
1308
		mov ecx,[coord_y]
1309
		cmp ecx,ebx
1310
		jge .copy_end ;если координата 'y' больше высоты буфера
1311
		add ecx,edx ;ecx - нижняя координата копируемой картинки
1312
		cmp ecx,ebx
1313
		jle @f
1314
			sub ecx,ebx
1315
			sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу
1316
		@@:
1317
		mov ebx,buf2d_w
1318
		mov ecx,ebx ;ecx используем для временных целей
1319
		imul ecx,[coord_y]
1320
		add ecx,[coord_x]
1321
		lea ecx,[ecx+ecx*2]
1322
		add ecx,buf2d_data
1323
		sub ebx,eax
1324
		mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование
1325
 
1326
	mov [right_bytes],0
1327
	mov ecx,[coord_x]
1328
	cmp ecx,ebx
1329
	jl @f
1330
		sub ecx,ebx
1331
		sub eax,ecx ;укорачиваем копируемую строку
1332
		add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера
1333
		lea ecx,[ecx+ecx*2] ;ecx - число байт в 1-й строке картинки, которые вылазят за правую сторону
1334
		mov [right_bytes],ecx
1335
	@@:
1336
 
1337
	lea eax,[eax+eax*2] ;колличество байт в 1-й строке копируемой картинки
1338
	lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки
1339
 
1340
	cld
1341
	cmp [right_bytes],0
1342
	jg .copy_1
1343
	.copy_0: ;простое копирование
1344
		mov ecx,eax
1345
		rep movsb
1346
		add edi,ebx
1347
		dec edx
1348
		cmp edx,0
1349
		jg .copy_0
1350
	jmp .copy_end
1351
	.copy_1: ;не простое копирование (картинка вылазит за правую сторону)
1352
		mov ecx,eax
1353
		rep movsb
1354
		add edi,ebx
1355
		add esi,[right_bytes] ;добавляем байты, которые вылазят за правую границу
1356
		dec edx
1357
		cmp edx,0
1358
		jg .copy_1
1359
	jmp .copy_end
1360
 
1361
	.sou32: ;в источнике 32 битная картинка
1362
	mov eax,buf2d_w
1363
	mov edx,buf2d_h ;высота копируемой картинки
1364
	mov esi,buf2d_data ;данные копируемой картинки
1365
 
1366
	mov edi,[buf_destination]
1367
	cmp buf2d_bits,24
1368
	jne .copy_end ;формат буфера не поодерживается
1369
		mov ebx,buf2d_h ;ebx - высота основного буфера
1370
		mov ecx,[coord_y]
1371
		cmp ecx,ebx
1372
		jge .copy_end ;если координата 'y' больше высоты буфера
1373
		add ecx,edx ;ecx - нижняя координата копируемой картинки
1374
		cmp ecx,ebx
1375
		jle @f
1376
			sub ecx,ebx
1377
			sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу
1378
		@@:
1379
		mov ebx,buf2d_w
1380
		mov ecx,ebx ;ecx используем для временных целей
1381
		imul ecx,[coord_y]
1382
		add ecx,[coord_x]
1383
		lea ecx,[ecx+ecx*2]
1384
		add ecx,buf2d_data
1385
		sub ebx,eax
1386
		mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование
1387
 
1388
	mov [right_bytes],0
1389
	mov ecx,[coord_x]
1390
	cmp ecx,ebx
1391
	jl @f
1392
		sub ecx,ebx
1393
		sub eax,ecx ;укорачиваем копируемую строку
1394
		add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера
1395
		shl ecx,2 ;ecx - число байт в 1-й строке картинки, которые вылазят за правую сторону
1396
		mov [right_bytes],ecx
1397
	@@:
1398
 
1399
	;eax - колличество пикселей в 1-й строке копируемой картинки
1400
	lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки
1401
 
1402
	cld
1403
	cmp [right_bytes],0
1404
	jg .copy_3
1405
	.copy_2: ;простое копирование
1406
		mov ecx,eax
1407
		@@:
1408
			movsw
1409
			movsb
1410
			inc esi
1411
			loop @b
1412
		add edi,ebx
1413
		dec edx
1414
		cmp edx,0
1415
		jg .copy_2
1416
	jmp .copy_end
1417
	.copy_3: ;не простое копирование (картинка вылазит за правую сторону)
1418
		mov ecx,eax
1419
		@@:
1420
			movsw
1421
			movsb
1422
			inc esi
1423
			loop @b
1424
		add edi,ebx
1425
		add esi,[right_bytes] ;добавляем байты, которые вылазят за правую границу
1426
		dec edx
1427
		cmp edx,0
1428
		jg .copy_3
1429
 
1430
	.copy_end:
1431
	popad
1432
	ret
1433
endp
1434
 
1435
;input:
1436
; esi = pointer to color1 + transparent
1437
; edi = pointer to background color2
1438
;output:
1439
; [edi] = combine color
1440
align 4
1441
combine_colors:
1442
	push ax bx cx dx
1443
	mov bx,0x00ff ;---get transparent---
1444
	mov cl,byte[esi+3] ;pro
1445
	xor ch,ch
1446
	sub bx,cx ;256-pro
1447
	;---red---
1448
	xor ah,ah
1449
	mov al,byte[esi+2]
1450
	imul ax,bx
1451
	xor dh,dh
1452
	mov dl,byte[edi+2]
1453
	imul dx,cx
1454
	add ax,dx
1455
	mov byte[edi+2],ah
1456
	;---green---
1457
	xor ah,ah
1458
	mov al,byte[esi+1]
1459
	imul ax,bx
1460
	xor dh,dh
1461
	mov dl,byte[edi+1]
1462
	imul dx,cx
1463
	add ax,dx
1464
	mov byte[edi+1],ah
1465
	;---blye---
1466
	xor ah,ah
1467
	mov al,byte[esi]
1468
	imul ax,bx
1469
	xor dh,dh
1470
	mov dl,byte[edi]
1471
	imul dx,cx
1472
	add ax,dx
1473
	mov byte[edi],ah
1474
 
1475
	pop dx cx bx ax
1476
	ret
1477
 
1478
;функция копирует изображение из буфера buf_source (32b) в buf_destination (24b)
1479
; указываются координаты вставки буфера buf_source относительно buf_destination
1480
; при копировании учитывается прозрачность
1481
align 4
1482
proc buf_bit_blt_transp, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword
1483
	locals
1484
		right_bytes dd ?
1485
	endl
1486
	pushad
1487
 
1488
	mov edi,[buf_source]
1489
	cmp buf2d_bits,32
1490
	jne .copy_end ;формат буфера не поодерживается
1491
	mov eax,buf2d_w
1492
	mov edx,buf2d_h ;высота копируемой картинки
1493
	mov esi,buf2d_data ;данные копируемой картинки
1494
 
1495
	mov edi,[buf_destination]
1496
	cmp buf2d_bits,24
1497
	jne .copy_end ;формат буфера не поодерживается
1498
		mov ebx,buf2d_h ;ebx - высота основного буфера
1499
		mov ecx,[coord_y]
1500
		cmp ecx,ebx
1501
		jge .copy_end ;если координата 'y' больше высоты буфера
1502
		add ecx,edx ;ecx - нижняя координата копируемой картинки
1503
		cmp ecx,ebx
1504
		jle @f
1505
			sub ecx,ebx
1506
			sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу
1507
		@@:
1508
		mov ebx,buf2d_w
1509
		mov ecx,ebx ;ecx используем для временных целей
1510
		imul ecx,[coord_y]
1511
		add ecx,[coord_x]
1512
		lea ecx,[ecx+ecx*2]
1513
		add ecx,buf2d_data
1514
		sub ebx,eax
1515
		mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование
1516
 
1517
	mov [right_bytes],0
1518
	mov ecx,[coord_x]
1519
	cmp ecx,ebx
1520
	jl @f
1521
		sub ecx,ebx
1522
		sub eax,ecx ;укорачиваем копируемую строку
1523
		add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера
1524
		shl ecx,2 ;ecx - число байт в 1-й строке картинки, которые вылазят за правую сторону
1525
		mov [right_bytes],ecx
1526
	@@:
1527
 
1528
	lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки
1529
 
1530
	cld
1531
	cmp [right_bytes],0
1532
	jg .copy_1
1533
	.copy_0: ;простое копирование
1534
		mov ecx,eax
1535
		@@:
1536
			call combine_colors
1537
			add edi,3
1538
			add esi,4
1539
			loop @b
1540
		add edi,ebx
1541
		dec edx
1542
		cmp edx,0
1543
		jg .copy_0
1544
	jmp .copy_end
1545
	.copy_1: ;не простое копирование (картинка вылазит за правую сторону)
1546
		mov ecx,eax
1547
		@@:
1548
			call combine_colors
1549
			add edi,3
1550
			add esi,4
1551
			loop @b
1552
		add edi,ebx
1553
		add esi,[right_bytes] ;добавляем байты, которые вылазят за правую границу
1554
		dec edx
1555
		cmp edx,0
1556
		jg .copy_1
1557
 
1558
	.copy_end:
1559
	popad
1560
	ret
1561
endp
1562
 
1563
;input:
1564
; ebx - color1
1565
; esi = pointer to transparent
1566
; edi = pointer to background color2
1567
;output:
1568
; [edi] = combine color
1569
align 4
1570
combine_colors_2:
1571
	push ax ebx cx dx si
1572
	mov cl,byte[esi] ;pro
1573
	xor ch,ch
1574
	mov si,0x00ff ;---get transparent---
1575
	sub si,cx ;256-pro
1576
 
1577
	;---blye---
1578
		mov al,bl
1579
		xor ah,ah
1580
		shr ebx,8
1581
		imul ax,si
1582
		xor dh,dh
1583
		mov dl,byte[edi+2]
1584
		imul dx,cx
1585
		add ax,dx
1586
		mov byte[edi+2],ah
1587
		;---green---
1588
		mov al,bl
1589
		xor ah,ah
1590
		shr ebx,8
1591
		imul ax,si
1592
		xor dh,dh
1593
		mov dl,byte[edi+1]
1594
		imul dx,cx
1595
		add ax,dx
1596
		mov byte[edi+1],ah
1597
		;---red---
1598
		mov al,bl
1599
		xor ah,ah
1600
		imul ax,si
1601
		xor dh,dh
1602
		mov dl,byte[edi]
1603
		imul dx,cx
1604
		add ax,dx
1605
		mov byte[edi],ah
1606
 
1607
	pop si dx cx ebx ax
1608
	ret
1609
 
1610
;функция копирует изображение из буфера buf_source (8b) в buf_destination (24b)
1611
; указываются координаты вставки буфера buf_source относительно buf_destination
1612
align 4
1613
proc buf_bit_blt_alpha, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword, color:dword
1614
	locals
1615
		right_bytes dd ?
1616
		dest_w_bytes dd ? ;колличество байт в буфере приемнике по ширине - ширина вставляемой картинки
1617
	endl
1618
	pushad
1619
 
1620
	mov edi,[buf_source]
1621
	cmp buf2d_bits,8
1622
	jne .error1 ;формат буфера не поодерживается
1623
	mov eax,buf2d_w
1624
	mov edx,buf2d_h ;высота копируемой картинки
1625
	mov esi,buf2d_data ;данные копируемой картинки
1626
 
1627
	mov edi,[buf_destination]
1628
	cmp buf2d_bits,24
1629
	jne .error2 ;формат буфера не поодерживается
1630
		mov ebx,buf2d_h ;ebx - высота основного буфера
1631
		mov ecx,[coord_y]
1632
		cmp ecx,ebx
1633
		jge .copy_end ;если координата 'y' больше высоты буфера
1634
		add ecx,edx ;ecx - нижняя координата копируемой картинки
1635
		cmp ecx,ebx
1636
		jle @f
1637
			sub ecx,ebx
1638
			sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу
1639
		@@:
1640
		mov ebx,buf2d_w
1641
		mov ecx,ebx ;ecx используем для временных целей
1642
		imul ecx,[coord_y]
1643
		add ecx,[coord_x]
1644
		lea ecx,[ecx+ecx*2]
1645
		add ecx,buf2d_data
1646
		sub ebx,eax
1647
		mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование
1648
 
1649
	mov [right_bytes],0
1650
	mov ecx,[coord_x]
1651
	cmp ecx,ebx
1652
	jl @f
1653
		sub ecx,ebx
1654
		sub eax,ecx ;укорачиваем копируемую строку
1655
		add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера
1656
		;ecx - число пикселей в 1-й строке картинки, которые вылазят за правую сторону
1657
		mov [right_bytes],ecx
1658
	@@:
1659
 
1660
	lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки
1661
	mov [dest_w_bytes],ebx
1662
	mov ebx,[color]
1663
 
1664
	cld
1665
	cmp [right_bytes],0
1666
	jg .copy_1
1667
	.copy_0: ;простое копирование
1668
		mov ecx,eax
1669
		@@:
1670
			call combine_colors_2
1671
			add edi,3
1672
			inc esi
1673
			loop @b
1674
		add edi,[dest_w_bytes]
1675
		dec edx
1676
		cmp edx,0
1677
		jg .copy_0
1678
	jmp .copy_end
1679
	.copy_1: ;не простое копирование (картинка вылазит за правую сторону)
1680
		mov ecx,eax
1681
		@@:
1682
			call combine_colors_2
1683
			add edi,3
1684
			inc esi
1685
			loop @b
1686
		add edi,[dest_w_bytes]
1687
		add esi,[right_bytes] ;добавляем байты, которые вылазят за правую границу
1688
		dec edx
1689
		cmp edx,0
1690
		jg .copy_1
1691
 
1692
	jmp .copy_end
1693
	.error1:
1694
		stdcall print_err,sz_buf2d_bit_blt_alpha,txt_err_n8b
1695
		jmp .copy_end
1696
	.error2:
1697
		stdcall print_err,sz_buf2d_bit_blt_alpha,txt_err_n24b
1698
	.copy_end:
1699
	popad
1700
	ret
1701
endp
1702
 
1703
;преобразование 8-битного буфера размером 16*16 в размер 1*256 символов
1704
align 4
1705
proc buf_convert_text_matrix, buf_struc:dword
1706
	locals
1707
		tmp_mem dd ?
1708
		c1 dw ?
1709
		c2 dd ?
1710
		c3 dw ?
1711
	endl
1712
	pushad
1713
	mov edi,dword[buf_struc]
1714
	cmp buf2d_bits,8
1715
	jne .error
1716
		mov ecx,buf2d_h
1717
		mov ebx,ecx
1718
		shr ebx,4 ;предполагаем что в буфере 16 строк с символами, потому делим на 2^4
1719
		mov edx,buf2d_w
1720
		imul ecx,edx ;ecx = size  8 b
1721
		invoke mem.alloc,ecx ;выделяем временную память
1722
		mov [tmp_mem],eax ;eax - new memory
1723
 
1724
		shr edx,4 ;предполагаем что в буфере 16 колонок с символами, потому делим на 2^4
1725
		mov eax,ebx
1726
		imul ebx,edx ;вычисляем кооличество пикселей на 1 символ
1727
		;eax = bhe - высота буквы
1728
		;ebx = bwi*bhe - колличество пикселей в 1-й букве
1729
		;edx = bwi - ширина буквы
1730
		;ecx,esi,edi - используются в цикле .c_0
1731
		shr buf2d_w,4
1732
		shl buf2d_h,4 ;преобразовываем размеры буфера
1733
 
1734
		cld
1735
		mov esi,buf2d_data
1736
		mov edi,[tmp_mem]
1737
		mov word[c3],16
1738
		.c_3:
1739
			mov dword[c2],eax
1740
			.c_2:
1741
				mov word[c1],16
1742
				.c_1:
1743
					mov ecx,edx ;.c_0:
1744
					rep movsb
1745
					add edi,ebx
1746
					sub edi,edx ;edi+=(bwi*bhe-bwi)
1747
					dec word[c1]
1748
					cmp word[c1],0
1749
					jg .c_1
1750
				add edi,edx
1751
				shl ebx,4
1752
				sub edi,ebx ;edi-=(16*bwi*bhe-bwi)
1753
				shr ebx,4
1754
				dec dword[c2]
1755
				cmp dword[c2],0
1756
				jg .c_2
1757
			sub edi,ebx
1758
			shl ebx,4
1759
			add edi,ebx ;edi+=(15*bwi*bhe)
1760
			shr ebx,4
1761
			dec word[c3]
1762
			cmp word[c3],0
1763
			jg .c_3
1764
 
1765
		mov edi,dword[buf_struc] ;копирование новой матрицы в основной буфер
1766
		mov edi,buf2d_data
1767
		mov esi,[tmp_mem]
1768
		mov ecx,ebx
1769
		shl ecx,8
1770
		rep movsb
1771
		invoke mem.free,[tmp_mem] ;чистим временную память
1772
		jmp .end_conv
1773
	.error:
1774
		stdcall print_err,sz_buf2d_convert_text_matrix,txt_err_n8b
1775
	.end_conv:
1776
	popad
1777
	ret
1778
endp
1779
 
1780
align 4
1781
buf_s_matr buf_2d_header ? ;локальная матрица символа
1782
 
1783
align 4
1784
proc buf_draw_text, buf_struc:dword, buf_t_matr:dword, text:dword, coord_x:dword, coord_y:dword, color:dword
1785
	locals
1786
		buf_t_matr_offs dd ?
1787
	endl
1788
	pushad
1789
	mov edi,dword[buf_struc]
1790
	cmp buf2d_bits,24
1791
	jne .error2
1792
	mov edi,dword[buf_t_matr]
1793
	cmp buf2d_bits,8
1794
	jne .error1
1795
		mov edx,buf2d_data
1796
		mov [buf_t_matr_offs],edx
1797
		mov ecx,BUF_STRUCT_SIZE ;копируем структуру текстовой матрицы
1798
		mov esi,edi
1799
		lea edi,[buf_s_matr]
1800
		cld
1801
		rep movsb
1802
		lea edi,[buf_s_matr]
1803
		shr buf2d_h,8 ;делим высоту символьного буфера на 256, для нахождения высоты 1-го символа
1804
		mov ebx,buf2d_h ;берем высоту символа
1805
		mov ecx,buf2d_w ;берем ширину символа
1806
 
1807
		mov eax,[coord_x]
1808
		mov esi,[text]
1809
		cmp byte[esi],0
1810
		je .end_draw ;если пустая строка
1811
		@@:
1812
			xor edx,edx
1813
			mov dl,byte[esi] ;берем код символа
1814
			imul edx,ebx ;умножаем его на высоту символа
1815
			imul edx,ecx ;умножаем на ширину символа
1816
			add edx,[buf_t_matr_offs] ;прибавляем смещение 0-го символа, т. е. получается смещение выводимого символа
1817
			mov buf2d_data,edx ;в локальный буфер символа, ставим указатель на нужный символ из буфера buf_t_matr
1818
			stdcall buf_bit_blt_alpha, [buf_struc], eax,[coord_y], edi,[color]
1819
			add eax,ecx
1820
			.new_s:
1821
				inc esi
1822
				cmp byte[esi],13
1823
				jne .no_13
1824
					mov eax,[coord_x]
1825
					add [coord_y],ebx
1826
					jmp .new_s
1827
				.no_13:
1828
			cmp byte[esi],0
1829
			jne @b
1830
		jmp .end_draw
1831
	.error1:
1832
		stdcall print_err,sz_buf2d_draw_text,txt_err_n8b
1833
		jmp .end_draw
1834
	.error2:
1835
		stdcall print_err,sz_buf2d_draw_text,txt_err_n24b
1836
	.end_draw:
1837
	popad
1838
	ret
1839
endp
1840
 
1841
align 4
1842
proc print_err, fun:dword, mes:dword ;выводим сообщение об шибке на доску отладки
1843
	pushad
1844
	mov eax,63
1845
	mov ebx,1
1846
 
1847
	mov esi,[fun]
1848
	@@:
1849
		mov cl,byte[esi]
1850
		int 0x40
1851
		inc esi
1852
		cmp byte[esi],0
1853
		jne @b
1854
	mov cl,':'
1855
	int 0x40
1856
	mov cl,' '
1857
	int 0x40
1858
	mov esi,[mes]
1859
	@@:
1860
		mov cl,byte[esi]
1861
		int 0x40
1862
		inc esi
1863
		cmp byte[esi],0
1864
		jne @b
1865
	popad
1866
	ret
1867
endp
1868
 
1869
;input:
1870
; ebp+8  = p0
1871
; ebp+12 = p1
1872
align 4
1873
line_len4i:
1874
	push ebp
1875
	mov ebp,esp
1876
		finit
1877
		fild word [ebp+8]
1878
		fisub word [ebp+12]
1879
		fmul st0,st0 ;st0=x^2
1880
		fild word [ebp+10]
1881
		fisub word [ebp+14]
1882
		fmul st0,st0 ;st0=y^2
1883
		fadd st0,st1
1884
		fsqrt
1885
		fstp dword [ebp+12]
1886
	pop ebp
1887
	ret 4 ;8
1888
 
1889
align 4
1890
proc buf_cruve_bezier, buffer:dword, coord_p0:dword,coord_p1:dword,coord_p2:dword, color:dword
1891
	locals
1892
		delt_t dd ?
1893
		opr_param dd ?
1894
		v_poi_0 dd ?
1895
	endl
1896
	pushad
1897
 
1898
;float t, xt,yt;
1899
;for(t=.0;t<1.;t+=.005){
1900
;  xt=pow(1.-t,2)*x0+2*t*(1.-t)*x1+pow(t,2)*x2;
1901
;  yt=pow(1.-t,2)*y0+2*t*(1.-t)*y1+pow(t,2)*y2;
1902
;  dc.SetPixel(xt,yt,255L);
1903
;}
1904
 
1905
	mov edx,[color] ;set cruve color
1906
	mov edi,[buffer]
1907
	xor ebx,ebx
1908
	xor ecx,ecx
1909
 
1910
	finit
1911
 
1912
	; calculate delta t
1913
	stdcall line_len4i, dword[coord_p1],dword[coord_p0]
1914
	fadd dword[esp]
1915
	add esp,4 ;pop ...
1916
 
1917
	stdcall line_len4i, dword[coord_p2],dword[coord_p1]
1918
	fadd dword[esp]
1919
	add esp,4 ;pop ...
1920
 
1921
	fadd st0,st0 ; len*=2
1922
	ftst
1923
	fstsw ax
1924
 
1925
	fld1
1926
	sahf
1927
	jle @f ;избегаем деления на 0
1928
		fdiv st0,st1
1929
	@@:
1930
	fstp dword[delt_t]
1931
 
1932
	finit
1933
 
1934
	;fild word[coord_p2+2] ;y2
1935
	fild word[coord_p1+2] ;y1
1936
	fild word[coord_p0+2] ;y0
1937
	fild word[coord_p2] ;x2
1938
	fild word[coord_p1] ;x1
1939
	fild word[coord_p0] ;x0
1940
	fld dword[delt_t]
1941
	fldz ;t=.0
1942
 
1943
	@@:
1944
		fld1
1945
		fsub st0,st1 ;1.-t
1946
		fmul st0,st0 ;pow(1.-t,2)
1947
		fmul st0,st3 ;...*x0
1948
		fstp dword[opr_param]
1949
 
1950
		fld1
1951
		fsub st0,st1 ;1.-t
1952
		fmul st0,st1 ;(1.-t)*t
1953
		fadd st0,st0
1954
		fmul st0,st4 ;...*x1
1955
		mov esi,dword[opr_param]
1956
		fstp dword[opr_param]
1957
 
1958
		fldz
1959
		fadd st0,st1 ;0+t
1960
		fmul st0,st0 ;t*t
1961
		fmul st0,st5 ;...*x2
1962
 
1963
		fadd dword[opr_param]
1964
		mov dword[opr_param],esi
1965
		fadd dword[opr_param]
1966
		fistp word[v_poi_0] ;x
1967
 
1968
		fld1
1969
		fsub st0,st1 ;1.-t
1970
		fmul st0,st0 ;pow(1.-t,2)
1971
		fmul st0,st6 ;...*y0
1972
		fstp dword[opr_param]
1973
 
1974
		fld1
1975
		fsub st0,st1 ;1.-t
1976
		fmul st0,st1 ;(1.-t)*t
1977
		fadd st0,st0
1978
		fmul st0,st7 ;...*y1
1979
		mov esi,dword[opr_param]
1980
		fstp dword[opr_param]
1981
 
1982
		fldz
1983
		fadd st0,st1 ;0+t
1984
		fmul st0,st0 ;t*t
1985
		fimul word[coord_p2+2] ;...*y2
1986
 
1987
		fadd dword[opr_param]
1988
		mov dword[opr_param],esi
1989
		fadd dword[opr_param]
1990
		fistp word[v_poi_0+2] ;y
1991
 
1992
		mov eax,1
1993
		mov bx,word[v_poi_0+2]
1994
		mov cx,word[v_poi_0]
1995
		call draw_pixel
1996
 
1997
		fadd st0,st1 ;t+dt
1998
 
1999
		fld1
2000
		fcomp
2001
		fstsw ax
2002
		sahf
2003
	jae @b
2004
 
2005
	popad
2006
	ret
2007
endp
2008
 
2009
txt_err_n8b db 'need buffer 8 bit',13,10,0
2010
txt_err_n24b db 'need buffer 24 bit',13,10,0
2011
 
2012
align 16
2013
EXPORTS:
2014
	dd sz_lib_init, lib_init
2015
	dd sz_buf2d_create, buf_create
2016
	dd sz_buf2d_create_f_img, buf_create_f_img
2017
	dd sz_buf2d_clear, buf_clear
2018
	dd sz_buf2d_draw, buf_draw_buf
2019
	dd sz_buf2d_delete, buf_delete
2020
	dd sz_buf2d_line, buf_line_brs
2021
	dd sz_buf2d_circle, buf_circle
2022
	dd sz_buf2d_img_hdiv2, buf_img_hdiv2
2023
	dd sz_buf2d_img_wdiv2, buf_img_wdiv2
2024
	dd sz_buf2d_conv_24_to_8, buf_conv_24_to_8
2025
	dd sz_buf2d_conv_24_to_32, buf_conv_24_to_32
2026
	dd sz_buf2d_bit_blt, buf_bit_blt
2027
	dd sz_buf2d_bit_blt_transp, buf_bit_blt_transp
2028
	dd sz_buf2d_bit_blt_alpha, buf_bit_blt_alpha
2029
	dd sz_buf2d_cruve_bezier, buf_cruve_bezier
2030
	dd sz_buf2d_convert_text_matrix, buf_convert_text_matrix
2031
	dd sz_buf2d_draw_text, buf_draw_text
2032
	dd sz_buf2d_crop_color, buf_crop_color
2033
	dd sz_buf2d_offset_h, buf_offset_h
2034
	dd 0,0
2035
	sz_lib_init db 'lib_init',0
2036
	sz_buf2d_create db 'buf2d_create',0
2037
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
2038
	sz_buf2d_clear db 'buf2d_clear',0 ;очистка буфера указанным цветом
2039
	sz_buf2d_draw db 'buf2d_draw',0
2040
	sz_buf2d_delete db 'buf2d_delete',0
2041
	sz_buf2d_line db 'buf2d_line',0 ;рисование линии
2042
	sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности
2043
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 ;сжатие изображения по высоте в 2 раза (размер буфера не меняется)
2044
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 ;сжатие изображения по ширине в 2 раза (размер буфера не меняется)
2045
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
2046
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
2047
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
2048
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
2049
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
2050
	sz_buf2d_cruve_bezier db 'buf2d_cruve_bezier',0
2051
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
2052
	sz_buf2d_draw_text db 'buf2d_draw_text',0
2053
	sz_buf2d_crop_color db 'buf2d_crop_color',0
2054
	sz_buf2d_offset_h db 'buf2d_offset_h',0