Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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