Subversion Repositories Kolibri OS

Rev

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