Subversion Repositories Kolibri OS

Rev

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

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