Subversion Repositories Kolibri OS

Rev

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