Subversion Repositories Kolibri OS

Rev

Rev 6210 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6175 IgorA 1
;
2
;*** функции рисования в буфере ***
3
;
4
 
5
align 16
6
proc buf_draw_buf, buf_struc:dword
7
	pushad
9520 IgorA 8
	mov edi,[buf_struc]
6175 IgorA 9
	cmp buf2d_bits,24
10
	jne .error
11
		mov eax,7
12
		mov ebx,buf2d_data
13
 
14
		mov ecx,buf2d_w
15
		ror ecx,16
16
		mov edx,buf2d_h
17
		mov cx,dx
18
 
19
		mov edx,buf2d_size_lt
20
		ror edx,16
21
		int 0x40
22
		jmp .end_draw_24
23
	.error:
24
		stdcall print_err,sz_buf2d_draw,txt_err_n24b
25
	.end_draw_24:
26
	popad
27
	ret
28
endp
29
 
6210 IgorA 30
align 4
31
txt_err_size_w16 db 'image width < 16 pixels',13,10,0
32
 
6175 IgorA 33
;input:
34
; ebx = coord x
35
; ecx = coord y
36
; edx = pixel color
37
; edi = pointer to buffer struct
38
align 4
39
draw_pixel:
40
	;cmp buf2d_bits,24
41
	;jne @f
42
	bt ebx,31
43
	jc @f
44
	bt ecx,31
45
	jc @f
46
	cmp ebx,buf2d_w
47
	jge @f
48
	cmp ecx,buf2d_h
49
	jge @f
50
	push esi
51
		mov esi,buf2d_w ;size x
52
		imul esi,ecx ;size_x*y
53
		add esi,ebx	 ;size_x*y+x
54
		cmp buf2d_bits,8
55
		je .beg8
56
		cmp buf2d_bits,32
57
		je .beg32
58
			lea esi,[esi+esi*2] ;(size_x*y+x)*3
59
			add esi,buf2d_data  ;ptr+(size_x*y+x)*3
60
			mov word[esi],dx ;copy pixel color
61
			ror edx,16
62
			mov byte[esi+2],dl
63
			ror edx,16
64
			jmp .end_draw
65
		.beg8: ;рисование точки в 8 битном буфере
66
			add esi,buf2d_data  ;ptr+(size_x*y+x)
67
			mov byte[esi],dl
68
			jmp .end_draw
69
		.beg32: ;рисование точки в 32 битном буфере
70
			shl esi,2
71
			add esi,buf2d_data  ;ptr+(size_x*y+x)
72
			mov dword[esi],edx
73
		.end_draw:
74
	pop esi
75
	@@:
76
	ret
77
 
78
;input:
79
; ebx = coord x
80
; ecx = coord y
81
; edi = pointer to buffer struct
82
;output:
83
; eax = цвет точки
84
; в случае ошибки eax = 0xffffffff
85
align 4
86
get_pixel_8:
87
	mov eax,0xffffffff
88
 
89
	bt ebx,31
90
	jc @f
91
	bt ecx,31
92
	jc @f
93
	cmp ebx,buf2d_w
94
	jge @f
95
	cmp ecx,buf2d_h
96
	jge @f
97
	push esi
98
		mov esi,buf2d_w ;size x
99
		imul esi,ecx ;size_x*y
100
		add esi,ebx	 ;size_x*y+x
101
		add esi,buf2d_data  ;ptr+(size_x*y+x)
102
 
103
		movzx eax,byte[esi] ;copy pixel color
104
	pop esi
105
	@@:
106
	ret
107
 
108
;input:
109
; ebx = coord x
110
; ecx = coord y
111
; edi = pointer to buffer struct
112
;output:
113
; eax = цвет точки
114
; в случае ошибки eax = 0xffffffff
115
align 4
116
get_pixel_24:
117
	mov eax,0xffffffff
118
 
119
	bt ebx,31
120
	jc @f
121
	bt ecx,31
122
	jc @f
123
	cmp ebx,buf2d_w
124
	jge @f
125
	cmp ecx,buf2d_h
126
	jge @f
127
	push esi
128
		mov esi,buf2d_w ;size x
129
		imul esi,ecx ;size_x*y
130
		add esi,ebx	 ;size_x*y+x
131
		lea esi,[esi+esi*2] ;(size_x*y+x)*3
132
		add esi,buf2d_data  ;ptr+(size_x*y+x)*3
133
 
134
		xor eax,eax
135
		mov ax,word[esi] ;copy pixel color
136
		ror eax,16
137
		mov al,byte[esi+2]
138
		ror eax,16
139
	pop esi
140
	@@:
141
	ret
142
 
143
;input:
144
; ebx = coord x
145
; ecx = coord y
146
; edi = pointer to buffer struct
147
;output:
148
; eax = цвет точки
149
; в случае ошибки eax = 0xffffffff
150
align 4
151
get_pixel_32:
152
	mov eax,0xffffffff
153
 
154
	bt ebx,31
155
	jc @f
156
	bt ecx,31
157
	jc @f
158
	cmp ebx,buf2d_w
159
	jge @f
160
	cmp ecx,buf2d_h
161
	jge @f
162
	push esi
163
		mov esi,buf2d_w ;size x
164
		imul esi,ecx ;size_x*y
165
		add esi,ebx	 ;size_x*y+x
166
		shl esi,2
167
		add esi,buf2d_data  ;ptr+(size_x*y+x)*4
168
 
169
		mov eax,dword[esi] ;copy pixel color
170
	pop esi
171
	@@:
172
	ret
173
 
174
;input:
175
; ebx = coord x
176
; ecx = coord y
177
; edx = pixel color + transparent
178
; edi = pointer to buffer struct
179
; t_prop, m_prop - коэфициенты необходимые для вычисления степени прозрачности
180
align 16
181
proc draw_pixel_transp, t_prop:dword, m_prop:dword
182
locals
183
	transp_32 dd 0 ;цвет рисуемой точки + прозрачность
184
endl
185
	;cmp buf2d_bits,24
186
	;jne @f
187
	bt ebx,31
188
	jc @f
189
	bt ecx,31
190
	jc @f
191
	cmp ebx,buf2d_w
192
	jge @f
193
	cmp ecx,buf2d_h
194
	jge @f
195
	push eax ebx edx edi esi
196
		mov esi,buf2d_w ;size x
197
		imul esi,ecx ;size_x*y
198
		add esi,ebx	 ;size_x*y+x
199
		lea esi,[esi+esi*2] ;(size_x*y+x)*3
200
		add esi,buf2d_data  ;ptr+(size_x*y+x)*3
201
 
202
		mov edi,esi ;указатель на цвет фона
203
		mov [transp_32],edx ;цвет рисуемой точки
204
 
205
		xor edx,edx
206
		mov eax,[t_prop]
207
		shl eax,8 ;*=256
208
		mov ebx,[m_prop]
209
		div ebx ;вычисляем коэф. прозрачности (должен быть от 0 до 255)
210
		bt ax,8
211
		jnc .over_255
212
			;если коеф. прозрачности >=256 то уменьшаем его до 255
213
			mov al,0xff
214
		.over_255:
215
 
216
		mov esi,ebp
217
		sub esi,4 ;указатель на transp_32
218
		mov byte[esi+3],al ;прозрачность рисуемой точки
219
 
220
		call combine_colors_0
221
	pop esi edi edx ebx eax
222
	@@:
223
	ret
224
endp
225
 
226
align 4
227
proc buf_clear, buf_struc:dword, color:dword ;очистка буфера заданым цветом
228
	pushad
9520 IgorA 229
	mov edi,[buf_struc]
6175 IgorA 230
 
231
	mov ecx,buf2d_w
232
	mov ebx,buf2d_h
233
	imul ecx,ebx
234
 
235
	cld
236
 
237
	cmp buf2d_bits,8
238
	jne .end_clear_8
239
		mov edi,buf2d_data
240
		mov al,byte[color]
241
		rep stosb
242
		jmp .end_clear_32
243
	.end_clear_8:
244
 
245
	cmp buf2d_bits,24
246
	jne .end_clear_24
247
		mov edi,buf2d_data
248
		mov eax,dword[color]
249
		mov ebx,eax
250
		shr ebx,16
251
		@@:
252
			stosw
253
			mov byte[edi],bl
254
			inc edi
255
			loop @b
256
		jmp .end_clear_32
257
	.end_clear_24:
258
 
259
	cmp buf2d_bits,32
260
	jne .end_clear_32
261
		mov edi,buf2d_data
262
		mov eax,dword[color]
263
		rep stosd
264
		;jmp .end_clear_32
265
	.end_clear_32:
266
	popad
267
	ret
268
endp
269
 
270
align 4
271
proc buf_line_brs, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, coord_y1:dword, color:dword
272
locals
273
	loc_1 dd ?
274
	loc_2 dd ?
275
	napravl db ?
276
endl
277
	pushad
9520 IgorA 278
		mov eax,[coord_x1]
279
		sub eax,[coord_x0]
6175 IgorA 280
		bt eax,31
281
		jae @f
282
			neg eax
283
		@@:
9520 IgorA 284
		mov ebx,[coord_y1]
285
		sub ebx,[coord_y0]
6175 IgorA 286
		jnz @f
287
			;если задана горизонтальная линия y0=y1
288
			stdcall buf_line_h, [buf_struc], [coord_x0], [coord_y0], [coord_x1], [color]
289
			jmp .coord_end
290
		@@:
291
		bt ebx,31
292
		jae @f
293
			neg ebx
294
		@@:
9520 IgorA 295
		mov edx,[color]
6175 IgorA 296
 
297
		mov [napravl],byte 0 ;bool steep=false
298
		cmp eax,ebx
299
		jle @f
300
			mov [napravl],byte 1 ;bool steep=true
301
			swap dword[coord_x0],dword[coord_y0] ;swap(x0, y0);
302
			swap dword[coord_x1],dword[coord_y1] ;swap(x1, y1);
303
		@@:
304
		mov eax,dword[coord_y0] ;x0
305
		cmp eax,dword[coord_y1] ;if(x0>x1)
306
		jle @f
307
			swap dword[coord_y0],dword[coord_y1] ;swap(x0, x1);
308
			swap dword[coord_x0],dword[coord_x1] ;swap(y0, y1);
309
		@@:
310
 
311
; int deltax esi
312
; int deltay edi
313
; int error  ebp-6
314
; int ystep  ebp-8
315
 
9520 IgorA 316
		mov eax,[coord_y0]
317
		mov esi,[coord_y1]
6175 IgorA 318
		sub esi,eax ;deltax = y1-y0
319
		mov ebx,esi
320
		shr ebx,1
321
		mov [loc_1],ebx ;error = deltax/2
322
 
323
		mov eax,dword[coord_x0]
9520 IgorA 324
		mov edi,[coord_x1]
6175 IgorA 325
		mov [loc_2],dword -1 ;ystep = -1
326
		cmp eax,edi ;if (x0
327
		jge @f
328
			mov [loc_2],dword 1 ;ystep = 1
329
		@@:
330
		sub edi,eax ;x1-x0
331
 
332
		bts edi,31
333
		jae @f
334
			neg edi
335
		@@:
336
		and edi,0x7fffffff ;deltay = abs(x1-x0)
337
 
338
		mov eax,edi
339
		mov edi,[buf_struc]
340
		cmp buf2d_bits,8
341
		je @f
342
		cmp buf2d_bits,24
343
		je @f
344
			jmp .coord_end
345
		@@:
346
 
347
		cmp [napravl],0
348
		jne .coord_yx
349
			mov ebx,dword[coord_x0]
350
			mov ecx,dword[coord_y0]
351
 
352
			@@: ;for (x=x0 ; x
353
				cmp ecx,dword[coord_y1]
354
				jg @f ;jge ???
355
				call draw_pixel
356
 
357
				sub dword[loc_1],eax ;error -= deltay
358
				cmp dword[loc_1],0 ;if(error<0)
359
				jge .if0
360
					add ebx,[loc_2] ;y += ystep
361
					add [loc_1],esi ;error += deltax
362
				.if0:
363
				inc ecx
364
				jmp @b
365
			@@:
366
			jmp .coord_end
367
		.coord_yx:
368
			mov ebx,dword[coord_y0]
369
			mov ecx,dword[coord_x0]
370
 
371
			@@: ;for (x=x0 ; x
372
				cmp ebx,dword[coord_y1]
373
				jg @f ;jge ???
374
				call draw_pixel
375
 
376
				sub dword[loc_1],eax ;error -= deltay
377
				cmp dword[loc_1],0 ;if(error<0)
378
				jge .if1
379
					add ecx,[loc_2] ;y += ystep
380
					add [loc_1],esi ;error += deltax
381
				.if1:
382
				inc ebx
383
				jmp @b
384
			@@:
385
	.coord_end:
386
	popad
387
	ret
388
endp
389
 
390
;рисование сглаженной линии
391
align 4
392
proc buf_line_brs_sm, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, coord_y1:dword, color:dword
393
locals
394
	loc_1 dd ?
395
	loc_2 dd ?
396
	napravl db ?
397
endl
398
	pushad
9520 IgorA 399
		mov eax,[coord_x1]
400
		sub eax,[coord_x0]
401
		jnz @f
402
			stdcall buf_line_brs, [buf_struc], [coord_x0], [coord_y0], [coord_x1], [coord_y1], [color] ;линия |
403
			jmp .coord_end
404
		@@:
6175 IgorA 405
		bt eax,31
406
		jae @f
407
			neg eax
408
		@@:
9520 IgorA 409
		mov ebx,[coord_y1]
410
		sub ebx,[coord_y0]
6175 IgorA 411
		jnz @f
412
			;если задана горизонтальная линия y0=y1
413
			stdcall buf_line_h, [buf_struc], [coord_x0], [coord_y0], [coord_x1], [color]
414
			jmp .coord_end
415
		@@:
416
		bt ebx,31
417
		jae @f
418
			neg ebx
419
		@@:
9520 IgorA 420
		mov edx,[color]
6175 IgorA 421
 
422
		mov [napravl],byte 0 ;bool steep=false
423
		cmp eax,ebx
424
		jle @f
425
			mov [napravl],byte 1 ;bool steep=true
426
			swap dword[coord_x0],dword[coord_y0] ;swap(x0, y0);
427
			swap dword[coord_x1],dword[coord_y1] ;swap(x1, y1);
428
		@@:
9520 IgorA 429
		mov eax,[coord_y0] ;x0
430
		cmp eax,[coord_y1] ;if(x0>x1)
6175 IgorA 431
		jle @f
432
			swap dword[coord_y0],dword[coord_y1] ;swap(x0, x1);
433
			swap dword[coord_x0],dword[coord_x1] ;swap(y0, y1);
434
		@@:
435
 
436
; int deltax esi
437
; int deltay edi
438
; int error  ebp-6
439
; int ystep  ebp-8
440
 
9520 IgorA 441
		mov eax,[coord_y0]
442
		mov esi,[coord_y1]
6175 IgorA 443
		sub esi,eax ;deltax = y1-y0
444
		mov ebx,esi
445
		shr ebx,1
446
		mov [loc_1],ebx ;error = deltax/2
447
 
9520 IgorA 448
		mov eax,[coord_x0]
449
		mov edi,[coord_x1]
6175 IgorA 450
		mov [loc_2],dword -1 ;ystep = -1
451
		cmp eax,edi ;if (x0
452
		jge @f
453
			mov [loc_2],dword 1 ;ystep = 1
454
		@@:
455
		sub edi,eax ;x1-x0
456
 
457
		bts edi,31
458
		jae @f
459
			neg edi
460
		@@:
461
		and edi,0x7fffffff ;deltay = abs(x1-x0)
462
 
463
		mov eax,edi
464
		mov edi,[buf_struc]
465
		cmp buf2d_bits,24
466
		jne .coord_end
467
 
468
		cmp [napravl],0
469
		jne .coord_yx
9520 IgorA 470
			mov ebx,[coord_x0]
471
			mov ecx,[coord_y0]
6175 IgorA 472
 
473
			@@: ;for (x=x0 ; x
9520 IgorA 474
				cmp ecx,[coord_y1]
6175 IgorA 475
				jg @f ;jge ???
476
				push eax
477
					mov eax,esi
478
					sub eax,[loc_1]
479
					stdcall draw_pixel_transp, eax,esi
480
				pop eax
481
				add ebx,[loc_2]
482
				stdcall draw_pixel_transp, [loc_1],esi
483
				sub ebx,[loc_2]
484
 
9520 IgorA 485
				sub [loc_1],eax ;error -= deltay
6175 IgorA 486
				cmp dword[loc_1],0 ;if(error<0)
487
				jge .if0
488
					add ebx,[loc_2] ;y += ystep
489
					add [loc_1],esi ;error += deltax
490
				.if0:
491
				inc ecx
492
				jmp @b
493
			@@:
494
			jmp .coord_end
495
		.coord_yx:
9520 IgorA 496
			mov ebx,[coord_y0]
497
			mov ecx,[coord_x0]
6175 IgorA 498
 
499
			@@: ;for (x=x0 ; x
9520 IgorA 500
				cmp ebx,[coord_y1]
6175 IgorA 501
				jg @f ;jge ???
502
				push eax
503
					mov eax,esi
504
					sub eax,[loc_1]
505
					stdcall draw_pixel_transp, eax,esi
506
				pop eax
507
				add ecx,[loc_2]
508
				stdcall draw_pixel_transp, [loc_1],esi
509
				sub ecx,[loc_2]
510
 
9520 IgorA 511
				sub [loc_1],eax ;error -= deltay
6175 IgorA 512
				cmp dword[loc_1],0 ;if(error<0)
513
				jge .if1
514
					add ecx,[loc_2] ;y += ystep
515
					add [loc_1],esi ;error += deltax
516
				.if1:
517
				inc ebx
518
				jmp @b
519
			@@:
520
	.coord_end:
521
	popad
522
	ret
523
endp
524
 
525
;рисование горизонтальной линии, потому нет параметра coord_y1
526
align 4
527
proc buf_line_h, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, color:dword
528
	pushad
529
	pushfd
530
		mov edi,[buf_struc]
531
		cmp buf2d_bits,8
532
		je @f
533
		cmp buf2d_bits,24
534
		je @f
535
			jmp .end24
536
		@@: ;определение координат линии относительно буфера
537
 
538
		mov ecx,dword[coord_y0]
539
		bt ecx,31
540
		jc .end24 ;если координата y0 отрицательная
541
		cmp ecx,buf2d_h
542
		jge .end24 ;если координата y0 больше высоты буфера
543
 
544
		mov ebx,dword[coord_x0]
545
		mov esi,dword[coord_x1]
546
		cmp ebx,esi
547
		jle @f
548
			xchg ebx,esi ;если x0 > x1 то меняем местами x0 и x1
549
		@@:
550
		bt ebx,31
551
		jae @f
552
			;если координата x0 отрицательная
553
			xor ebx,ebx
554
		@@:
555
		cmp esi,buf2d_w
556
		jl @f
557
			;если координата x0 больше ширины буфера
558
			mov esi,buf2d_w
559
			dec esi
560
		@@:
561
		cmp ebx,esi
562
		jg .end24 ;если x0 > x1 может возникнуть когда обе координаты x0, x1 находились за одним из пределов буфера
563
 
564
		cmp buf2d_bits,24
565
		je .beg24
566
			;рисование в 8 битном буфере
567
			;в edx вычисляем начало 1-й точки линии в буфере изображения
568
			mov edx,buf2d_w ;size x
569
			imul edx,ecx ;size_x*y
570
			add edx,ebx	 ;size_x*y+x
571
			add edx,buf2d_data ;ptr+(size_x*y+x)
572
			mov edi,edx ;теперь можем портить указатель на буфер
573
 
574
			mov ecx,esi
575
			sub ecx,ebx ;в ecx колличество точек линии выводимых в буфер
576
			inc ecx ;что-бы последняя точка линии также отображалась
577
			mov eax,dword[color] ;будем использовать только значение в al
578
			cld
579
			rep stosb ;цикл по оси x от x0 до x1 (включая x1)
580
			jmp .end24
581
 
582
		.beg24: ;рисование в 24 битном буфере
583
		;в eax вычисляем начало 1-й точки линии в буфере изображения
584
		mov eax,buf2d_w ;size x
585
		imul eax,ecx ;size_x*y
586
		add eax,ebx	 ;size_x*y+x
587
		lea eax,[eax+eax*2] ;(size_x*y+x)*3
588
		add eax,buf2d_data  ;ptr+(size_x*y+x)*3
589
 
590
		mov ecx,esi
591
		sub ecx,ebx ;в ecx колличество точек линии выводимых в буфер
592
		inc ecx ;что-бы последняя точка линии также отображалась
593
		mov edx,dword[color]
594
		mov ebx,edx ;координата x0 в ebx уже не нужна
595
		ror edx,16 ;поворачиваем регистр что бы 3-й байт попал в dl
596
		cld
597
		@@: ;цикл по оси x от x0 до x1 (включая x1)
598
			mov word[eax],bx ;copy pixel color
599
			mov byte[eax+2],dl
600
			add eax,3
601
			loop @b
602
		.end24:
603
	popfd
604
	popad
605
	ret
606
endp
607
 
608
align 4
609
proc buf_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword
610
pushad
611
	mov edi,[buf_struc]
612
	cmp buf2d_bits,8
613
	je @f
614
	cmp buf2d_bits,24
615
	je @f
616
		jmp .coord_end
617
	@@:
618
 
619
		mov eax,[coord_x]
620
		mov ebx,[coord_y]
621
		mov ecx,[w]
622
		;cmp ecx,1
623
		;jl .coord_end
9520 IgorA 624
		or ecx,ecx
625
		jz .coord_end
6175 IgorA 626
		jg @f
627
			add eax,ecx
628
			inc eax
629
			neg ecx
630
		@@:
631
		add ecx,eax
632
		dec ecx
633
		mov edx,[h]
634
		;cmp edx,1
635
		;jl .coord_end
9520 IgorA 636
		or edx,edx
637
		jz .coord_end
6175 IgorA 638
		jg @f
639
			add ebx,edx
640
			inc ebx
641
			neg edx
642
		@@:
643
 
644
		add edx,ebx
645
		dec edx
9520 IgorA 646
		mov esi,[color]
6175 IgorA 647
		stdcall buf_line_h, edi, eax, ebx, ecx, esi ;линия -
648
		stdcall buf_line_brs, edi, eax, ebx, eax, edx, esi ;линия |
649
		stdcall buf_line_h, edi, eax, edx, ecx, esi ;линия -
650
		stdcall buf_line_brs, edi, ecx, ebx, ecx, edx, esi ;линия |
651
	.coord_end:
652
popad
653
	ret
654
endp
655
 
656
align 4
657
proc buf_filled_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword
658
pushad
659
	mov edi,[buf_struc]
660
	cmp buf2d_bits,8
661
	je @f
662
	cmp buf2d_bits,24
663
	je @f
664
		jmp .coord_end
665
	@@:
666
		mov eax,[coord_x]
667
		mov ebx,[coord_y]
668
		mov edx,[w]
9520 IgorA 669
		or edx,edx
670
		jz .coord_end ;если высота 0 пикселей
6175 IgorA 671
		jg @f ;если высота положительная
672
			add eax,edx
673
			inc eax
674
			neg edx ;ширину делаем положительной
675
		@@:
676
		add edx,eax
677
		dec edx
678
		mov ecx,[h]
9520 IgorA 679
		or ecx,ecx
680
		jz .coord_end ;если высота 0 пикселей
6175 IgorA 681
		jg @f ;если высота положительная
682
			add ebx,ecx ;сдвигаем верхнюю координату прямоугольника
683
			inc ebx
684
			neg ecx ;высоту делаем положительной
685
		@@:
9520 IgorA 686
		mov esi,[color]
6175 IgorA 687
		cld
688
		@@:
689
			stdcall buf_line_h, edi, eax, ebx, edx, esi ;линия -
690
			inc ebx
691
			loop @b
692
	.coord_end:
693
popad
694
	ret
695
endp
696
 
697
align 4
698
proc buf_circle, buf_struc:dword, coord_x:dword, coord_y:dword, r:dword, color:dword
699
locals
700
	po_x dd ?
701
	po_y dd ?
702
endl
703
	pushad
9520 IgorA 704
	mov edi,[buf_struc]
6175 IgorA 705
	cmp buf2d_bits,8
706
	je @f
707
	cmp buf2d_bits,24
708
	je @f
709
		jmp .error
710
	@@:
711
		mov edx,dword[color]
712
 
713
		finit
714
		fild dword[coord_x]
715
		fild dword[coord_y]
716
		fild dword[r]
717
		fldz ;px=0
718
		fld st1 ;py=r
719
 
720
		fldpi
721
		fmul st0,st3
722
		fistp dword[po_x]
723
		mov esi,dword[po_x] ;esi=pi*r
724
		shl esi,1 ;esi=2*pi*r
725
 
726
		;st0 = py
727
		;st1 = px
728
		;st2 = r
729
		;st3 = y
730
		;st4 = x
731
 
732
		@@:
733
			;Point(px + x, y - py)
734
			fld st1 ;st0=px
735
			fadd st0,st5 ;st0=px+x
736
			fistp dword[po_x]
737
			mov ebx,dword[po_x]
738
			fld st3 ;st0=y
739
			fsub st0,st1 ;st0=y-py
740
			fistp dword[po_y]
741
			mov ecx,dword[po_y]
742
			call draw_pixel
743
			;px += py/r
744
			fld st0 ;st0=py
745
			fdiv st0,st3 ;st0=py/r
746
			faddp st2,st0 ;st3+=st0
747
			;py -= px/r
748
			fld st1 ;st0=px
749
			fdiv st0,st3 ;st0=px/r
750
			fsubp st1,st0 ;st2-=st0
751
 
752
			dec esi
753
			cmp esi,0
754
			jge @b
755
		jmp .exit_fun
756
	.error:
757
		stdcall print_err,sz_buf2d_circle,txt_err_n8_24b
758
	.exit_fun:
759
 
760
	popad
761
	ret
762
endp
763
 
764
;функция для заливки области выбранным цветом
765
align 4
766
proc buf_flood_fill, buf_struc:dword, coord_x:dword, coord_y:dword, mode:dword, color_f:dword, color_b:dword
767
	pushad
768
		mov edi,[buf_struc]
769
		cmp buf2d_bits,24
770
		jne .end24
771
 
9520 IgorA 772
			mov ebx,[coord_x]
773
			mov ecx,[coord_y]
774
			mov edx,[color_f]
775
			mov esi,[color_b]
6175 IgorA 776
 
777
			cmp dword[mode],1 ;в зависимости от 'mode' определяем каким алгоритмом будем пользоваться
778
			je @f
779
				call buf_flood_fill_recurs_0 ;заливаем до пикселей цвета esi
780
				jmp .end24
781
			@@:
782
				call buf_flood_fill_recurs_1 ;заливаем пиксели имеющие цвет esi
783
 
784
		.end24:
785
	popad
786
	ret
787
endp
788
 
789
;input:
790
; ebx = coord_x
791
; ecx = coord_y
792
; edx = цвет заливки
793
; esi = цвет границы, до которой будет ити заливка
794
; edi = buf_struc
795
;output:
796
; eax = портится
797
align 4
798
buf_flood_fill_recurs_0:
799
	call get_pixel_24
800
	cmp eax,0xffffffff ;if error coords
801
	je .end_fun
802
	cmp eax,edx ;если цвет пикселя совпал с цветом заливки, значит заливка в этой области уже была сделана
803
	je .end_fun
804
 
805
		call draw_pixel
806
 
807
		dec ebx
808
		call get_pixel_24
809
		cmp eax,esi
810
		je @f
811
			call buf_flood_fill_recurs_0
812
		@@:
813
		inc ebx
814
 
815
 
816
		inc ebx
817
		call get_pixel_24
818
		cmp eax,esi
819
		je @f
820
			call buf_flood_fill_recurs_0
821
		@@:
822
		dec ebx
823
 
824
		dec ecx
825
		call get_pixel_24
826
		cmp eax,esi
827
		je @f
828
			call buf_flood_fill_recurs_0
829
		@@:
830
		inc ecx
831
 
832
		inc ecx
833
		call get_pixel_24
834
		cmp eax,esi
835
		je @f
836
			call buf_flood_fill_recurs_0
837
		@@:
838
		dec ecx
839
 
840
	.end_fun:
841
	ret
842
 
843
;input:
844
; ebx = coord_x
845
; ecx = coord_y
846
; edx = цвет заливки
847
; esi = цвет пикселей, по которым будет ити заливка
848
; edi = buf_struc
849
;output:
850
; eax = портится
851
align 4
852
buf_flood_fill_recurs_1:
853
	call get_pixel_24
854
	cmp eax,0xffffffff ;if error coords
855
	je .end_fun
856
	cmp eax,edx ;если цвет пикселя совпал с цветом заливки, значит заливка в этой области уже была сделана
857
	je .end_fun
858
	cmp eax,esi ;если цвет пикселя не совпал с заливаемым цветом заливки, то прекращаем заливку
859
	jne .end_fun
860
 
861
		call draw_pixel
862
 
863
		dec ebx
864
		call get_pixel_24
865
		cmp eax,esi
866
		jne @f
867
			call buf_flood_fill_recurs_1
868
		@@:
869
		inc ebx
870
 
871
 
872
		inc ebx
873
		call get_pixel_24
874
		cmp eax,esi
875
		jne @f
876
			call buf_flood_fill_recurs_1
877
		@@:
878
		dec ebx
879
 
880
		dec ecx
881
		call get_pixel_24
882
		cmp eax,esi
883
		jne @f
884
			call buf_flood_fill_recurs_1
885
		@@:
886
		inc ecx
887
 
888
		inc ecx
889
		call get_pixel_24
890
		cmp eax,esi
891
		jne @f
892
			call buf_flood_fill_recurs_1
893
		@@:
894
		dec ecx
895
 
896
	.end_fun:
897
	ret
898
 
899
;функция для рисования точки
900
align 4
901
proc buf_set_pixel uses ebx ecx edx edi, buf_struc:dword, coord_x:dword, coord_y:dword, color:dword
9520 IgorA 902
	mov edi,[buf_struc]
903
	mov ebx,[coord_x]
904
	mov ecx,[coord_y]
905
	mov edx,[color]
6175 IgorA 906
	call draw_pixel
907
	ret
908
endp
909
 
910
;output:
911
; eax = цвет точки
912
; в случае ошибки eax = 0xffffffff
913
align 4
914
proc buf_get_pixel uses ebx ecx edi, buf_struc:dword, coord_x:dword, coord_y:dword
9520 IgorA 915
	mov edi,[buf_struc]
6175 IgorA 916
	mov ebx,[coord_x]
917
	mov ecx,[coord_y]
918
 
919
	cmp buf2d_bits,8
920
	jne @f
921
		call get_pixel_8
922
		jmp .end_fun
923
	@@:
924
	cmp buf2d_bits,24
925
	jne @f
926
		call get_pixel_24
927
		jmp .end_fun
928
	@@:
929
	cmp buf2d_bits,32
930
	jne @f
931
		call get_pixel_32
932
		;jmp .end_fun
933
	@@:
934
	.end_fun:
935
	ret
936
endp
937
 
938
;преобразование 8-битного буфера размером 16*16 в размер 1*256 символов
939
align 4
940
proc buf_convert_text_matrix, buf_struc:dword
941
	locals
942
		tmp_mem dd ?
943
		c1 dw ?
944
		c2 dd ?
945
		c3 dw ?
946
	endl
947
	pushad
9520 IgorA 948
	mov edi,[buf_struc]
6175 IgorA 949
	cmp buf2d_bits,8
6210 IgorA 950
	jne .error0
6175 IgorA 951
		mov ecx,buf2d_h
952
		mov ebx,ecx
953
		shr ebx,4 ;предполагаем что в буфере 16 строк с символами, потому делим на 2^4
6210 IgorA 954
		or ebx,ebx
955
		jz .error1
6175 IgorA 956
		mov edx,buf2d_w
957
		imul ecx,edx ;ecx = size  8 b
958
		invoke mem.alloc,ecx ;выделяем временную память
959
		mov [tmp_mem],eax ;eax - new memory
960
 
961
		shr edx,4 ;предполагаем что в буфере 16 колонок с символами, потому делим на 2^4
962
		mov eax,ebx
963
		imul ebx,edx ;вычисляем кооличество пикселей на 1 символ
964
		;eax = bhe - высота буквы
965
		;ebx = bwi*bhe - колличество пикселей в 1-й букве
966
		;edx = bwi - ширина буквы
967
		;ecx,esi,edi - используются в цикле .c_0
968
		shr buf2d_w,4
969
		shl buf2d_h,4 ;преобразовываем размеры буфера
970
 
971
		cld
972
		mov esi,buf2d_data
973
		mov edi,[tmp_mem]
974
		mov word[c3],16
975
		.c_3:
976
			mov dword[c2],eax
977
			.c_2:
978
				mov word[c1],16
979
				.c_1:
980
					mov ecx,edx ;.c_0:
981
					rep movsb
982
					add edi,ebx
983
					sub edi,edx ;edi+=(bwi*bhe-bwi)
984
					dec word[c1]
985
					cmp word[c1],0
986
					jg .c_1
987
				add edi,edx
988
				shl ebx,4
989
				sub edi,ebx ;edi-=(16*bwi*bhe-bwi)
990
				shr ebx,4
991
				dec dword[c2]
992
				cmp dword[c2],0
993
				jg .c_2
994
			sub edi,ebx
995
			shl ebx,4
996
			add edi,ebx ;edi+=(15*bwi*bhe)
997
			shr ebx,4
998
			dec word[c3]
999
			cmp word[c3],0
1000
			jg .c_3
1001
 
9520 IgorA 1002
		mov edi,[buf_struc] ;копирование новой матрицы в основной буфер
6175 IgorA 1003
		mov edi,buf2d_data
1004
		mov esi,[tmp_mem]
1005
		mov ecx,ebx
1006
		shl ecx,8
1007
		rep movsb
1008
		invoke mem.free,[tmp_mem] ;чистим временную память
1009
		jmp .end_conv
6210 IgorA 1010
	.error0:
6175 IgorA 1011
		stdcall print_err,sz_buf2d_convert_text_matrix,txt_err_n8b
6210 IgorA 1012
		jmp .end_conv
1013
	.error1:
1014
		stdcall print_err,sz_buf2d_convert_text_matrix,txt_err_size_w16
6175 IgorA 1015
	.end_conv:
1016
	popad
1017
	ret
1018
endp
1019
 
1020
align 4
1021
proc buf_draw_text, buf_struc:dword, buf_t_matr:dword, text:dword, coord_x:dword, coord_y:dword, color:dword
1022
	locals
1023
		buf_t_matr_offs dd ?
1024
		buf_s_matr buf_2d_header ? ;ebp-BUF_STRUCT_SIZE локальная матрица символа
1025
	endl
1026
	pushad
9520 IgorA 1027
	mov edi,[buf_struc]
6175 IgorA 1028
	cmp buf2d_bits,24
1029
	jne .error2
9520 IgorA 1030
	mov edi,[buf_t_matr]
6175 IgorA 1031
	cmp buf2d_bits,8
1032
	jne .error1
1033
		mov edx,buf2d_data
1034
		mov [buf_t_matr_offs],edx
1035
		mov ecx,BUF_STRUCT_SIZE ;копируем структуру текстовой матрицы
1036
		mov esi,edi
1037
		mov edi,ebp
1038
		sub edi,BUF_STRUCT_SIZE ;&buf_s_matr
1039
		cld
1040
		rep movsb
1041
		sub edi,BUF_STRUCT_SIZE ;&buf_s_matr
1042
		shr buf2d_h,8 ;делим высоту символьного буфера на 256, для нахождения высоты 1-го символа
1043
		mov ebx,buf2d_h ;берем высоту символа
1044
		mov ecx,buf2d_w ;берем ширину символа
1045
 
1046
		mov eax,[coord_x]
1047
		mov esi,[text]
1048
		cmp byte[esi],0
1049
		je .end_draw ;если пустая строка
1050
		@@:
1051
			xor edx,edx
1052
			mov dl,byte[esi] ;берем код символа
1053
			imul edx,ebx ;умножаем его на высоту символа
1054
			imul edx,ecx ;умножаем на ширину символа
1055
			add edx,[buf_t_matr_offs] ;прибавляем смещение 0-го символа, т. е. получается смещение выводимого символа
1056
			mov buf2d_data,edx ;в локальный буфер символа, ставим указатель на нужный символ из буфера buf_t_matr
1057
			stdcall buf_bit_blt_alpha, [buf_struc], eax,[coord_y], edi,[color]
1058
			add eax,ecx
1059
			.new_s:
1060
				inc esi
1061
				cmp byte[esi],13
1062
				jne .no_13
1063
					mov eax,[coord_x]
1064
					add [coord_y],ebx
1065
					jmp .new_s
1066
				.no_13:
1067
			cmp byte[esi],0
1068
			jne @b
1069
		jmp .end_draw
1070
	.error1:
1071
		stdcall print_err,sz_buf2d_draw_text,txt_err_n8b
1072
		jmp .end_draw
1073
	.error2:
1074
		stdcall print_err,sz_buf2d_draw_text,txt_err_n24b
1075
	.end_draw:
1076
	popad
1077
	ret
1078
endp
1079
 
1080
;input:
1081
; ebp+8  = p0
1082
; ebp+12 = p1
1083
align 4
1084
line_len4i:
1085
	push ebp
1086
	mov ebp,esp
1087
		fild word [ebp+8]
1088
		fisub word [ebp+12]
1089
		fmul st0,st0 ;st0=x^2
1090
		fild word [ebp+10]
1091
		fisub word [ebp+14]
1092
		fmul st0,st0 ;st0=y^2
1093
		faddp
1094
		fsqrt
1095
		fstp dword [ebp+12]
1096
	pop ebp
1097
	ret 4 ;8
1098
 
1099
align 4
1100
proc buf_curve_bezier, buffer:dword, coord_p0:dword,coord_p1:dword,coord_p2:dword, color:dword
1101
	locals
1102
		delt_t dd ?
1103
		opr_param dd ?
1104
		v_poi_0 dd ?
1105
	endl
1106
	pushad
1107
 
1108
;float t, xt,yt;
1109
;for(t=.0;t<1.;t+=.005){
1110
;  xt=pow(1.-t,2)*x0+2*t*(1.-t)*x1+pow(t,2)*x2;
1111
;  yt=pow(1.-t,2)*y0+2*t*(1.-t)*y1+pow(t,2)*y2;
1112
;  dc.SetPixel(xt,yt,255L);
1113
;}
1114
 
1115
	mov edx,[color] ;set curve color
1116
	mov edi,[buffer]
1117
	xor ebx,ebx
1118
	xor ecx,ecx
1119
 
1120
	finit
1121
	fldz
1122
 
1123
	; calculate delta t
1124
	stdcall line_len4i, dword[coord_p1],dword[coord_p0]
1125
	fadd dword[esp]
1126
	add esp,4 ;pop ...
1127
 
1128
	stdcall line_len4i, dword[coord_p2],dword[coord_p1]
1129
	fadd dword[esp]
1130
	add esp,4 ;pop ...
1131
 
1132
	fadd st0,st0 ; len*=2
1133
	ftst
1134
	fstsw ax
1135
 
1136
	fld1
1137
	sahf
1138
	jle @f ;избегаем деления на 0
1139
		fdiv st0,st1
1140
	@@:
1141
	fstp dword[delt_t]
1142
 
1143
	ffree st0 ;1.0
1144
	fincstp
1145
 
1146
	;fild word[coord_p2+2] ;y2
1147
	fild word[coord_p1+2] ;y1
1148
	fild word[coord_p0+2] ;y0
1149
	fild word[coord_p2] ;x2
1150
	fild word[coord_p1] ;x1
1151
	fild word[coord_p0] ;x0
1152
	fld dword[delt_t]
1153
	fldz ;t=.0
1154
 
1155
	@@:
1156
		fld1
1157
		fsub st0,st1 ;1.-t
1158
		fmul st0,st0 ;pow(1.-t,2)
1159
		fmul st0,st3 ;...*x0
1160
		fstp dword[opr_param]
1161
 
1162
		fld1
1163
		fsub st0,st1 ;1.-t
1164
		fmul st0,st1 ;(1.-t)*t
1165
		fadd st0,st0
1166
		fmul st0,st4 ;...*x1
1167
		mov esi,dword[opr_param]
1168
		fstp dword[opr_param]
1169
 
1170
		fld st0 ;st0=t
1171
		fmul st0,st0 ;t^2
1172
		fmul st0,st5 ;(t^2)*x2
1173
 
1174
		fadd dword[opr_param]
1175
		mov dword[opr_param],esi
1176
		fadd dword[opr_param]
1177
		fistp word[v_poi_0] ;x
1178
 
1179
		fld1
1180
		fsub st0,st1 ;1.-t
1181
		fmul st0,st0 ;pow(1.-t,2)
1182
		fmul st0,st6 ;...*y0
1183
		fstp dword[opr_param]
1184
 
1185
		fld1
1186
		fsub st0,st1 ;1.-t
1187
		fmul st0,st1 ;(1.-t)*t
1188
		fadd st0,st0
1189
		fmul st0,st7 ;...*y1
1190
		mov esi,dword[opr_param]
1191
		fstp dword[opr_param]
1192
 
1193
		fld st0 ;st0=t
1194
		fmul st0,st0 ;t^2
1195
		fimul word[coord_p2+2] ;(t^2)*y2
1196
 
1197
		fadd dword[opr_param]
1198
		mov dword[opr_param],esi
1199
		fadd dword[opr_param]
1200
		fistp word[v_poi_0+2] ;y
1201
 
1202
		mov eax,1
1203
		mov bx,word[v_poi_0+2]
1204
		mov cx,word[v_poi_0]
1205
		call draw_pixel
1206
 
1207
		fadd st0,st1 ;t+dt
1208
 
1209
		fld1
1210
		fcomp
1211
		fstsw ax
1212
		sahf
1213
	jae @b
1214
 
1215
	popad
1216
	ret
1217
endp