Subversion Repositories Kolibri OS

Rev

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