Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  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<y1) ystep = 1;
  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<x1; 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<x1; 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.  
  1252.