Subversion Repositories Kolibri OS

Rev

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