Subversion Repositories Kolibri OS

Rev

Rev 2658 | Rev 2758 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. format MS COFF
  2. public EXPORTS
  3. section '.flat' code readable align 16
  4.  
  5. include '../../../../macros.inc'
  6. include '../../../../proc32.inc'
  7.  
  8. ;-----------------------------------------------------------------------------
  9. mem.alloc   dd ? ;äã­ªæ¨ï ¤«ï ¢ë¤¥«¥­¨ï ¯ ¬ïâ¨
  10. mem.free    dd ? ;äã­ªæ¨ï ¤«ï ®á¢®¡®¦¤¥­¨ï ¯ ¬ïâ¨
  11. mem.realloc dd ? ;äã­ªæ¨ï ¤«ï ¯¥à¥à á¯à¥¤¥«¥­¨ï ¯ ¬ïâ¨
  12. dll.load    dd ?
  13.  
  14. BUF_STRUCT_SIZE equ 21
  15. buf2d_data equ dword[edi] ;¤ ­­ë¥ ¡ãä¥à  ¨§®¡à ¦¥­¨ï
  16. buf2d_w equ dword[edi+8] ;è¨à¨­  ¡ãä¥à 
  17. buf2d_h equ dword[edi+12] ;¢ëá®â  ¡ãä¥à 
  18. buf2d_l equ word[edi+4]
  19. buf2d_t equ word[edi+6] ;®âáâ㯠ᢥàåã
  20. buf2d_size_lt equ dword[edi+4] ;®âáâ㯠᫥¢  ¨ á¯à ¢  ¤«ï ¡ãä¥à 
  21. buf2d_color equ dword[edi+16] ;梥â ä®­  ¡ãä¥à 
  22. buf2d_bits equ byte[edi+20] ;ª®«¨ç¥á⢮ ¡¨â ¢ 1-© â®çª¥ ¨§®¡à ¦¥­¨ï
  23.  
  24. struct buf_2d_header
  25.         img_data dd ?
  26.         left dw ? ;+4 left
  27.         top dw ? ;+6 top
  28.         size_x dd ? ;+8 w
  29.         size_y dd ? ;+12 h
  30.         color dd ? ;+16 color
  31.         bit_pp db ? ;+21 bit in pixel
  32. ends
  33.  
  34. macro swap v1, v2 {
  35.   push v1
  36.   push v2
  37.   pop v1
  38.   pop v2
  39. }
  40.  
  41. ;ä« £¨, ¤«ï ä㭪樨 ®¡à¥§ ­¨ï ¡ãä¥à 
  42. BUF2D_OPT_CROP_TOP equ 1 ;®¡à¥§ª  ᢥàåã
  43. BUF2D_OPT_CROP_LEFT equ 2 ;®¡à¥§ª  á«¥¢ 
  44. BUF2D_OPT_CROP_BOTTOM equ 4 ;®¡à¥§ª  á­¨§ã
  45. BUF2D_OPT_CROP_RIGHT equ 8 ;®¡à¥§ª  á¯à ¢ 
  46. BUF2D_BIT_OPT_CROP_TOP equ 0
  47. BUF2D_BIT_OPT_CROP_LEFT equ 1
  48. BUF2D_BIT_OPT_CROP_BOTTOM equ 2
  49. BUF2D_BIT_OPT_CROP_RIGHT equ 3
  50.  
  51. vox_offs_tree_table equ 4
  52. vox_offs_data equ 12
  53.  
  54. ;input:
  55. ; eax = 㪠§ â¥«ì ­  äã­ªæ¨î ¢ë¤¥«¥­¨ï ¯ ¬ïâ¨
  56. ; ebx = ... ®á¢®¡®¦¤¥­¨ï ¯ ¬ïâ¨
  57. ; ecx = ... ¯¥à¥à á¯à¥¤¥«¥­¨ï ¯ ¬ïâ¨
  58. ; edx = ... § £à㧪¨ ¡¨¡«¨®â¥ª¨ (¯®ª  ­¥ ¨á¯®«ì§ã¥âáï)
  59. align 16
  60. lib_init:
  61.         mov dword[mem.alloc], eax
  62.         mov dword[mem.free], ebx
  63.         mov dword[mem.realloc], ecx
  64.         mov dword[dll.load], edx
  65.         ret
  66.  
  67. ;input:
  68. ; ebx = coord x
  69. ; ecx = coord y
  70. ; edx = pixel color
  71. ; edi = pointer to buffer struct
  72. align 4
  73. draw_pixel:
  74.         ;cmp buf2d_bits,24
  75.         ;jne @f
  76.         bt ebx,31
  77.         jc @f
  78.         bt ecx,31
  79.         jc @f
  80.         cmp ebx,buf2d_w
  81.         jge @f
  82.         cmp ecx,buf2d_h
  83.         jge @f
  84.         push esi
  85.                 mov esi,buf2d_w ;size x
  86.                 imul esi,ecx ;size_x*y
  87.                 add esi,ebx      ;size_x*y+x
  88.                 cmp buf2d_bits,8
  89.                 je .beg8
  90.                 cmp buf2d_bits,32
  91.                 je .beg32
  92.                         lea esi,[esi+esi*2] ;(size_x*y+x)*3
  93.                         add esi,buf2d_data  ;ptr+(size_x*y+x)*3
  94.                         mov word[esi],dx ;copy pixel color
  95.                         ror edx,16
  96.                         mov byte[esi+2],dl
  97.                         ror edx,16
  98.                         jmp .end_draw
  99.                 .beg8: ;à¨á®¢ ­¨¥ â®çª¨ ¢ 8 ¡¨â­®¬ ¡ãä¥à¥
  100.                         add esi,buf2d_data  ;ptr+(size_x*y+x)
  101.                         mov byte[esi],dl
  102.                         jmp .end_draw
  103.                 .beg32: ;à¨á®¢ ­¨¥ â®çª¨ ¢ 32 ¡¨â­®¬ ¡ãä¥à¥
  104.                         shl esi,2
  105.                         add esi,buf2d_data  ;ptr+(size_x*y+x)
  106.                         mov dword[esi],edx
  107.                 .end_draw:
  108.         pop esi
  109.         @@:
  110.         ret
  111.  
  112. ;input:
  113. ; ebx = coord x
  114. ; ecx = coord y
  115. ; edi = pointer to buffer struct
  116. ;output:
  117. ; eax = 梥â â®çª¨
  118. ; ¢ á«ãç ¥ ®è¨¡ª¨ eax = 0xffffffff
  119. align 4
  120. get_pixel_8:
  121.         mov eax,0xffffffff
  122.  
  123.         bt ebx,31
  124.         jc @f
  125.         bt ecx,31
  126.         jc @f
  127.         cmp ebx,buf2d_w
  128.         jge @f
  129.         cmp ecx,buf2d_h
  130.         jge @f
  131.         push esi
  132.                 mov esi,buf2d_w ;size x
  133.                 imul esi,ecx ;size_x*y
  134.                 add esi,ebx      ;size_x*y+x
  135.                 add esi,buf2d_data  ;ptr+(size_x*y+x)
  136.  
  137.                 movzx eax,byte[esi] ;copy pixel color
  138.         pop esi
  139.         @@:
  140.         ret
  141.  
  142. ;input:
  143. ; ebx = coord x
  144. ; ecx = coord y
  145. ; edi = pointer to buffer struct
  146. ;output:
  147. ; eax = 梥â â®çª¨
  148. ; ¢ á«ãç ¥ ®è¨¡ª¨ eax = 0xffffffff
  149. align 4
  150. get_pixel_24:
  151.         mov eax,0xffffffff
  152.  
  153.         bt ebx,31
  154.         jc @f
  155.         bt ecx,31
  156.         jc @f
  157.         cmp ebx,buf2d_w
  158.         jge @f
  159.         cmp ecx,buf2d_h
  160.         jge @f
  161.         push esi
  162.                 mov esi,buf2d_w ;size x
  163.                 imul esi,ecx ;size_x*y
  164.                 add esi,ebx      ;size_x*y+x
  165.                 lea esi,[esi+esi*2] ;(size_x*y+x)*3
  166.                 add esi,buf2d_data  ;ptr+(size_x*y+x)*3
  167.  
  168.                 xor eax,eax
  169.                 mov ax,word[esi] ;copy pixel color
  170.                 ror eax,16
  171.                 mov al,byte[esi+2]
  172.                 ror eax,16
  173.         pop esi
  174.         @@:
  175.         ret
  176.  
  177. ;input:
  178. ; ebx = coord x
  179. ; ecx = coord y
  180. ; edi = pointer to buffer struct
  181. ;output:
  182. ; eax = 梥â â®çª¨
  183. ; ¢ á«ãç ¥ ®è¨¡ª¨ eax = 0xffffffff
  184. align 4
  185. get_pixel_32:
  186.         mov eax,0xffffffff
  187.  
  188.         bt ebx,31
  189.         jc @f
  190.         bt ecx,31
  191.         jc @f
  192.         cmp ebx,buf2d_w
  193.         jge @f
  194.         cmp ecx,buf2d_h
  195.         jge @f
  196.         push esi
  197.                 mov esi,buf2d_w ;size x
  198.                 imul esi,ecx ;size_x*y
  199.                 add esi,ebx      ;size_x*y+x
  200.                 shl esi,2
  201.                 add esi,buf2d_data  ;ptr+(size_x*y+x)*4
  202.  
  203.                 mov eax,dword[esi] ;copy pixel color
  204.         pop esi
  205.         @@:
  206.         ret
  207.  
  208. ;input:
  209. ; ebx = coord x
  210. ; ecx = coord y
  211. ; edx = pixel color + transparent
  212. ; edi = pointer to buffer struct
  213. ; t_prop, m_prop - ª®íä¨æ¨¥­âë ­¥®¡å®¤¨¬ë¥ ¤«ï ¢ëç¨á«¥­¨ï á⥯¥­¨ ¯à®§à ç­®áâ¨
  214. align 4
  215. transp_32 dd 0 ;梥â à¨á㥬®© â®çª¨ + ¯à®§à ç­®áâì
  216. align 4
  217. proc draw_pixel_transp, t_prop:dword, m_prop:dword
  218.         ;cmp buf2d_bits,24
  219.         ;jne @f
  220.         bt ebx,31
  221.         jc @f
  222.         bt ecx,31
  223.         jc @f
  224.         cmp ebx,buf2d_w
  225.         jge @f
  226.         cmp ecx,buf2d_h
  227.         jge @f
  228.         push eax ebx edx edi esi
  229.                 mov esi,buf2d_w ;size x
  230.                 imul esi,ecx ;size_x*y
  231.                 add esi,ebx      ;size_x*y+x
  232.                 lea esi,[esi+esi*2] ;(size_x*y+x)*3
  233.                 add esi,buf2d_data  ;ptr+(size_x*y+x)*3
  234.  
  235.                 mov edi,esi ;㪠§ â¥«ì ­  梥â ä®­ 
  236.                 mov dword[transp_32],edx ;梥â à¨á㥬®© â®çª¨
  237.  
  238.                 xor edx,edx
  239.                 mov eax,[t_prop]
  240.                 shl eax,8 ;*=256
  241.                 mov ebx,[m_prop]
  242.                 div ebx ;¢ëç¨á«ï¥¬ ª®íä. ¯à®§à ç­®á⨠(¤®«¦¥­ ¡ëâì ®â 0 ¤® 255)
  243.                 bt ax,8
  244.                 jnc .over_255
  245.                         ;¥á«¨ ª®¥ä. ¯à®§à ç­®á⨠>=256 ⮠㬥­ìè ¥¬ ¥£® ¤® 255
  246.                         mov al,0xff
  247.                 .over_255:
  248.  
  249.                 mov byte[transp_32+3],al ;¯à®§à ç­®áâì à¨á㥬®© â®çª¨
  250.                 mov esi,dword transp_32 ;㪠§ â¥«ì ­  梥â à¨á㥬®© â®çª¨
  251.  
  252.                 call combine_colors
  253.         pop esi edi edx ebx eax
  254.         @@:
  255.         ret
  256. endp
  257.  
  258. ;ᮧ¤ ­¨¥ ¡ãä¥à 
  259. align 4
  260. proc buf_create, buf_struc:dword
  261.         pushad
  262.         mov edi,dword[buf_struc]
  263.         mov ecx,buf2d_w
  264.         mov ebx,buf2d_h
  265.         imul ecx,ebx
  266.         cmp buf2d_bits,24
  267.         jne @f
  268.                 lea ecx,[ecx+ecx*2] ; 24 bit = 3
  269.                 ;;;inc ecx ;§ ¯ á­®© ¡ ©â ¢ ª®­æ¥ ¡ãä¥à , çâ®-¡ë ­¥ £«î稫¨ ­¥ª®â®àë¥ ä㭪樨 ­  ¨§®¡à ¦¥­¨ïå ªà â­ëå 4Š
  270.         @@:
  271.         cmp buf2d_bits,32
  272.         jne @f
  273.                 shl ecx,2 ; 32 bit = 4
  274.         @@:
  275.         invoke mem.alloc,ecx
  276.         mov buf2d_data,eax
  277.  
  278.         stdcall buf_clear,edi,buf2d_color ;®ç¨á⪠ ¡ãä¥à  ä®­®¢ë¬ 梥⮬
  279.         popad
  280.         ret
  281. endp
  282.  
  283. ;ᮧ¤ ­¨¥ ¡ãä¥à  ­  ®á­®¢¥ ¨§®¡à ¦¥­¨ï rgb
  284. align 4
  285. proc buf_create_f_img, buf_struc:dword, rgb_data:dword
  286.         pushad
  287.         mov edi,dword[buf_struc]
  288.         mov ecx,buf2d_w
  289.         mov ebx,buf2d_h
  290.         imul ecx,ebx
  291.         cmp buf2d_bits,24
  292.         jne @f
  293.                 lea ecx,[ecx+ecx*2] ; 24 bit = 3
  294.                 ;;;inc ecx ;§ ¯ á­®© ¡ ©â ¢ ª®­æ¥ ¡ãä¥à , çâ®-¡ë ­¥ £«î稫¨ ­¥ª®â®àë¥ ä㭪樨 ­  ¨§®¡à ¦¥­¨ïå ªà â­ëå 4Š
  295.         @@:
  296.         cmp buf2d_bits,32
  297.         jne @f
  298.                 shl ecx,2 ; 32 bit = 4
  299.         @@:
  300.         invoke mem.alloc,ecx
  301.         mov buf2d_data,eax
  302.  
  303.         cmp buf2d_bits,24
  304.         jne @f
  305.                 cld
  306.                 mov esi,[rgb_data]
  307.                 mov edi,eax ;eax=buf2d_data
  308.                 rep movsb ;ª®¯¨à㥬 ¡¨âë ¨§®¡à ¦¥­¨ï ¢ ¡ãä¥à
  309.                 jmp .end_create
  310.         @@:
  311.                 stdcall buf_clear,edi,buf2d_color ;®ç¨á⪠ ¡ãä¥à  ä®­®¢ë¬ 梥⮬
  312.         .end_create:
  313.         popad
  314.         ret
  315. endp
  316.  
  317. align 4
  318. proc buf_clear, buf_struc:dword, color:dword ;®ç¨á⪠ ¡ãä¥à  § ¤ ­ë¬ 梥⮬
  319.         pushad
  320.         mov edi,dword[buf_struc]
  321.  
  322.         mov ecx,buf2d_w
  323.         mov ebx,buf2d_h
  324.         imul ecx,ebx
  325.  
  326.         cld
  327.  
  328.         cmp buf2d_bits,8
  329.         jne .end_clear_8
  330.                 mov edi,buf2d_data
  331.                 mov al,byte[color]
  332.                 rep stosb
  333.                 jmp .end_clear_32
  334.         .end_clear_8:
  335.  
  336.         cmp buf2d_bits,24
  337.         jne .end_clear_24
  338.                 mov edi,buf2d_data
  339.                 mov eax,dword[color]
  340.                 mov ebx,eax
  341.                 shr ebx,16
  342.                 @@:
  343.                         stosw
  344.                         mov byte[edi],bl
  345.                         inc edi
  346.                         loop @b
  347.                 jmp .end_clear_32
  348.         .end_clear_24:
  349.  
  350.         cmp buf2d_bits,32
  351.         jne .end_clear_32
  352.                 mov edi,buf2d_data
  353.                 mov eax,dword[color]
  354.                 rep stosd
  355.                 ;jmp .end_clear_32
  356.         .end_clear_32:
  357.         popad
  358.         ret
  359. endp
  360.  
  361. ;äã­ªæ¨ï ¤«ï ®¡à¥§ ­¨ï ¡ãä¥à®¢ 8 ¨ 24 ¡¨â­ëå, ¯® § ¤ ­®¬ã 梥âã.
  362. ;¯ à ¬¥âà opt § ¤ ¥âáï ª®¬¡¨­ æ¨¥© ª®­áâ ­â:
  363. ; BUF2D_OPT_CROP_TOP - ®¡à¥§ª  ᢥàåã
  364. ; BUF2D_OPT_CROP_LEFT - ®¡à¥§ª  á«¥¢ 
  365. ; BUF2D_OPT_CROP_BOTTOM - ®¡à¥§ª  á­¨§ã
  366. ; BUF2D_OPT_CROP_RIGHT - ®¡à¥§ª  á¯à ¢ 
  367. align 4
  368. proc buf_crop_color, buf_struc:dword, color:dword, opt:dword
  369. locals
  370.         crop_r dd ?
  371. endl
  372.         pushad
  373.         mov edi,dword[buf_struc]
  374.         cmp buf2d_bits,24
  375.         jne .24end_f
  376.  
  377.         bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM
  378.         jae .24no_crop_bottom
  379.                 mov eax,dword[color]
  380.                 mov edx,eax ;ax = colors - r,g
  381.                 shr edx,16 ;dl = color - b
  382.                 mov ecx,buf2d_h
  383.                 cmp ecx,1
  384.                 jle .24no_crop_bottom ;¯à®¢¥à塞 ­  á«ãç © ¥á«¨ ¢ëá®â  ¡ãä¥à  1 ¯¨ªá¥«ì
  385.                 mov ebx,buf2d_w
  386.                 imul ecx,ebx
  387.                 lea esi,[ecx+ecx*2] ;esi=3*ecx
  388.                 add esi,buf2d_data
  389.                 cld
  390.                 @@:
  391.                         sub esi,3
  392.                         cmp word[esi],ax
  393.                         jne @f
  394.                         cmp byte[esi+2],dl
  395.                         jne @f
  396.                         loop @b
  397.                 @@:
  398.                 lea ebx,[ebx+ebx*2]
  399.                 xor edx,edx
  400.                 mov eax,buf2d_h
  401.                 imul eax,ebx
  402.                 add eax,buf2d_data ;eax - 㪠§ â¥«ì ­  ª®­¥æ ¡ãä¥à  ¨§®¡à ¦¥­¨ï
  403.                 @@:
  404.                         add esi,ebx
  405.                         cmp esi,eax
  406.                         jge @f
  407.                         inc edx ;¢ëç¨á«ï¥¬ ç¨á«® ¯®«­ëå áâப ¤«ï ®¡à¥§ ­¨ï
  408.                         loop @b
  409.                 @@:
  410.                 cmp edx,0
  411.                 je .24no_crop_bottom
  412.                         cmp edx,buf2d_h
  413.                         jge .24no_crop_bottom ;çâ®-¡ë ­¥ ¯®«ãç¨âì ¯ãá⮩ ¡ãä¥à
  414.                         sub buf2d_h,edx ;㬥­ìè ¥¬ ¢ëá®âã ¡ãä¥à 
  415.                         mov ecx,buf2d_h
  416.                         imul ecx,ebx ;ecx = ­®¢ë© à §¬¥à ¨§®¡à ¦¥­¨ï
  417.                         invoke mem.realloc,buf2d_data,ecx
  418.                         mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
  419.         .24no_crop_bottom:
  420.  
  421.         bt dword[opt],BUF2D_BIT_OPT_CROP_TOP
  422.         jae .24no_crop_top
  423.                 mov eax,dword[color]
  424.                 mov edx,eax ;ax = colors - r,g
  425.                 shr edx,16 ;dl = color - b
  426.                 mov esi,buf2d_data
  427.                 mov ecx,buf2d_h
  428.                 cmp ecx,1
  429.                 jle .24no_crop_top ;¯à®¢¥à塞 ­  á«ãç © ¥á«¨ ¢ëá®â  ¡ãä¥à  1 ¯¨ªá¥«ì
  430.                 dec ecx ;¯à¨ ®¡à¥§ ­¨¨ ¤®«¦­  ®áâ âìáï ¬¨­¨¬ã¬ 1-­  áâப  ¯¨ªá¥«¥©
  431.                 mov ebx,buf2d_w
  432.                 imul ecx,ebx
  433.                 cld
  434.                 @@:
  435.                         cmp word[esi],ax
  436.                         jne @f
  437.                         cmp byte[esi+2],dl
  438.                         jne @f
  439.                         add esi,3
  440.                         loop @b
  441.                 @@:
  442.                 lea ebx,[ebx+ebx*2]
  443.                 xor edx,edx
  444.                 @@:
  445.                         sub esi,ebx
  446.                         cmp esi,buf2d_data
  447.                         jl @f
  448.                         inc edx ;¢ëç¨á«ï¥¬ ç¨á«® ¯®«­ëå áâப ¤«ï ®¡à¥§ ­¨ï
  449.                         loop @b
  450.                 @@:
  451.                 cmp edx,0
  452.                 je .24no_crop_top
  453.                         xor eax,eax
  454.                         sub eax,edx
  455.                         mov ebx,buf2d_h
  456.                         sub ebx,edx
  457.                         stdcall buf_offset_h, edi, eax, edx, ebx ;ᤢ¨£ ¥¬ ¨§®¡à ¦¥­¨¥ ¢ ¡ãä¥à¥ ¢¢¥àå (eax<0)
  458.                         sub buf2d_h,edx ;㬥­ìè ¥¬ ¢ëá®âã ¡ãä¥à 
  459.                         mov ecx,buf2d_h
  460.                         add buf2d_t,dx ;ᤢ¨£ ¥¬ ®âáâ㯠¢­¨§, ­  ç¨á«® ®¡à¥§ ­­ëå áâப
  461.                         mov ebx,buf2d_w
  462.                         imul ecx,ebx
  463.                         lea ecx,[ecx+ecx*2]
  464.                         invoke mem.realloc,buf2d_data,ecx
  465.                         mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
  466.         .24no_crop_top:
  467.  
  468.         bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT
  469.         jae .24no_crop_right
  470.                 mov eax,dword[color]
  471.                 mov edx,eax ;ax = colors - r,g
  472.                 shr edx,16 ;dl = color - b
  473.                 mov ebx,buf2d_w
  474.                 cmp ebx,1
  475.                 jle .24no_crop_right ;­  á«ãç © ¥á«¨ è¨à¨­  ¡ãä¥à  1 ¯¨ªá¥«ì
  476.                 lea ebx,[ebx+ebx*2]
  477.                 mov esi,ebx
  478.                 imul esi,buf2d_h
  479.                 add esi,buf2d_data ;esi - 㪠§ â¥«ì ­  ª®­¥æ ¡ãä¥à  ¨§®¡à ¦¥­¨ï
  480.                 mov dword[crop_r],0
  481.                 cld
  482.                 .24found_beg_right:
  483.                 sub esi,3 ;¤¢¨£ ¥¬áï ­  1-­ã ª®«®­ªã ¢«¥¢®
  484.                 mov ecx,buf2d_h ;¢®ááâ ­®¢«¥­¨¥ ecx ¤«ï ­®¢®£® 横« 
  485.                 @@:
  486.                         cmp word[esi],ax
  487.                         jne .24found_right
  488.                         cmp byte[esi+2],dl
  489.                         jne .24found_right
  490.                         sub esi,ebx ;¯à룠¥¬ ­  ¢¥àå­îî áâபã
  491.                         loop @b
  492.                 inc dword[crop_r]
  493.  
  494.                 mov ecx,buf2d_w
  495.                 dec ecx ;1 ª®«®­ª  ­  § ¯ á
  496.                 cmp dword[crop_r],ecx
  497.                 jge .24found_right
  498.  
  499.                 sub esi,3 ;¤¢¨£ ¥¬áï ­  1-­ã ª®«®­ªã ¢«¥¢®
  500.                 mov ecx,buf2d_h ;¢®ááâ ­®¢«¥­¨¥ ecx ¤«ï ­®¢®£® 横« 
  501.                 @@:
  502.                         add esi,ebx ;¯à룠¥¬ ­  ­¨¦­îî áâபã
  503.                         cmp word[esi],ax
  504.                         jne .24found_right
  505.                         cmp byte[esi+2],dl
  506.                         jne .24found_right
  507.                         loop @b
  508.                 inc dword[crop_r]
  509.  
  510.                 mov ecx,buf2d_w
  511.                 dec ecx ;1 ª®«®­ª  ­  § ¯ á
  512.                 cmp dword[crop_r],ecx
  513.                 jl .24found_beg_right
  514.  
  515.                 .24found_right:
  516.                 cmp dword[crop_r],0
  517.                 je .24no_crop_right
  518.                         mov ecx,buf2d_w
  519.                         sub ecx,dword[crop_r]
  520.                         stdcall img_rgb_crop_r, buf2d_data, buf2d_w, ecx, buf2d_h ;®¡à¥§ ¥¬ ¡ãä¥à, ¯® ­®¢®¬ã à §¬¥àã
  521.                         mov buf2d_w,ecx ;áâ ¢¨¬ ­®¢ãî è¨à¨­ã ¤«ï ¡ãä¥à 
  522.                         mov ebx,buf2d_h
  523.                         imul ecx,ebx
  524.                         lea ecx,[ecx+ecx*2]
  525.                         invoke mem.realloc,buf2d_data,ecx
  526.                         mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
  527.         .24no_crop_right:
  528.  
  529.         bt dword[opt],BUF2D_BIT_OPT_CROP_LEFT
  530.         jae .24no_crop_left
  531.                 mov eax,dword[color]
  532.                 mov edx,eax ;ax = colors - r,g
  533.                 shr edx,16 ;dl = color - b
  534.                 mov ebx,buf2d_w
  535.                 cmp ebx,1
  536.                 jle .24no_crop_left ;­  á«ãç © ¥á«¨ è¨à¨­  ¡ãä¥à  1 ¯¨ªá¥«ì
  537.                 lea ebx,[ebx+ebx*2]
  538.                 mov esi,buf2d_data ;esi - 㪠§ â¥«ì ­  ­ ç®«® ¡ãä¥à  ¨§®¡à ¦¥­¨ï
  539.                 mov dword[crop_r],0
  540.                 cld
  541.                 .24found_beg_left:
  542.  
  543.                 mov ecx,buf2d_h ;¢®ááâ ­®¢«¥­¨¥ ecx ¤«ï ­®¢®£® 横« 
  544.                 @@:
  545.                         cmp word[esi],ax
  546.                         jne .24found_left
  547.                         cmp byte[esi+2],dl
  548.                         jne .24found_left
  549.                         add esi,ebx ;¯à룠¥¬ ­  ­¨¦­îî áâபã
  550.                         loop @b
  551.                 inc dword[crop_r]
  552.                 add esi,3 ;¤¢¨£ ¥¬áï ­  1-­ã ª®«®­ªã ¢¯à ¢®
  553.  
  554.                 mov ecx,buf2d_w
  555.                 dec ecx ;1 ª®«®­ª  ­  § ¯ á
  556.                 cmp dword[crop_r],ecx
  557.                 jge .24found_left
  558.  
  559.                 mov ecx,buf2d_h ;¢®ááâ ­®¢«¥­¨¥ ecx ¤«ï ­®¢®£® 横« 
  560.                 @@:
  561.                         sub esi,ebx ;¯à룠¥¬ ­  ¢¥àå­îî áâபã
  562.                         cmp word[esi],ax
  563.                         jne .24found_left
  564.                         cmp byte[esi+2],dl
  565.                         jne .24found_left
  566.                         loop @b
  567.                 inc dword[crop_r]
  568.                 add esi,3 ;¤¢¨£ ¥¬áï ­  1-­ã ª®«®­ªã ¢¯à ¢®
  569.  
  570.                 mov ecx,buf2d_w
  571.                 dec ecx ;1 ª®«®­ª  ­  § ¯ á
  572.                 cmp dword[crop_r],ecx
  573.                 jl .24found_beg_left
  574.  
  575.                 .24found_left:
  576.                 cmp dword[crop_r],0
  577.                 je .24no_crop_left
  578.                         mov ecx,buf2d_w
  579.                         sub ecx,dword[crop_r]
  580.                         stdcall img_rgb_crop_l, buf2d_data, buf2d_w, ecx, buf2d_h ;®¡à¥§ ¥¬ ¡ãä¥à, ¯® ­®¢®¬ã à §¬¥àã
  581.                         mov buf2d_w,ecx ;áâ ¢¨¬ ­®¢ãî è¨à¨­ã ¤«ï ¡ãä¥à 
  582.                         mov ebx,buf2d_h
  583.                         imul ecx,ebx
  584.                         lea ecx,[ecx+ecx*2]
  585.                         invoke mem.realloc,buf2d_data,ecx
  586.                         mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
  587.                         mov eax,dword[crop_r]
  588.                         add buf2d_l,ax
  589.         .24no_crop_left:
  590.  
  591.         .24end_f:
  592.  
  593.  
  594.         cmp buf2d_bits,8
  595.         jne .8end_f
  596.  
  597.         bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM
  598.         jae .8no_crop_bottom
  599.                 mov eax,dword[color]
  600.                 mov esi,buf2d_data
  601.                 mov ecx,buf2d_h
  602.                 cmp ecx,1
  603.                 jle .8no_crop_bottom ;¯à®¢¥à塞 ­  á«ãç © ¥á«¨ ¢ëá®â  ¡ãä¥à  1 ¯¨ªá¥«ì
  604.                 mov ebx,buf2d_w
  605.                 imul ecx,ebx
  606.                 mov esi,ecx
  607.                 add esi,buf2d_data
  608.                 cld
  609.                 @@:
  610.                         dec esi
  611.                         cmp byte[esi],al
  612.                         jne @f
  613.                         loop @b
  614.                 @@:
  615.                 xor edx,edx
  616.                 mov eax,buf2d_h
  617.                 imul eax,ebx
  618.                 add eax,buf2d_data ;eax - 㪠§ â¥«ì ­  ª®­¥æ ¡ãä¥à  ¨§®¡à ¦¥­¨ï
  619.                 @@:
  620.                         add esi,ebx
  621.                         cmp esi,eax
  622.                         jge @f
  623.                         inc edx
  624.                         loop @b
  625.                 @@:
  626.                 cmp edx,0
  627.                 je .8no_crop_bottom
  628.                         cmp edx,buf2d_h
  629.                         jge .8no_crop_bottom ;çâ®-¡ë ­¥ ¯®«ãç¨âì ¯ãá⮩ ¡ãä¥à
  630.                         sub buf2d_h,edx ;㬥­ìè ¥¬ ¢ëá®âã ¡ãä¥à 
  631.                         mov ecx,buf2d_h
  632.                         imul ecx,ebx ;ecx = ­®¢ë© à §¬¥à ¨§®¡à ¦¥­¨ï
  633.                         invoke mem.realloc,buf2d_data,ecx
  634.                         mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
  635.         .8no_crop_bottom:
  636.  
  637.         bt dword[opt],BUF2D_BIT_OPT_CROP_TOP
  638.         jae .8no_crop_top
  639.                 mov eax,dword[color]
  640.                 mov esi,buf2d_data
  641.                 mov ecx,buf2d_h
  642.                 cmp ecx,1
  643.                 jle .8no_crop_top ;¯à®¢¥à塞 ­  á«ãç © ¥á«¨ ¢ëá®â  ¡ãä¥à  1 ¯¨ªá¥«ì
  644.                 dec ecx ;¯à¨ ®¡à¥§ ­¨¨ ¤®«¦­  ®áâ âìáï ¬¨­¨¬ã¬ 1-­  áâப  ¯¨ªá¥«¥©
  645.                 mov ebx,buf2d_w
  646.                 imul ecx,ebx
  647.                 cld
  648.                 @@:
  649.                         cmp byte[esi],al
  650.                         jne @f
  651.                         inc esi
  652.                         loop @b
  653.                 @@:
  654.                 xor edx,edx
  655.                 @@:
  656.                         sub esi,ebx
  657.                         cmp esi,buf2d_data
  658.                         jl @f
  659.                         inc edx
  660.                         loop @b
  661.                 @@:
  662.                 cmp edx,0
  663.                 je .8no_crop_top
  664.                         xor eax,eax
  665.                         sub eax,edx
  666.                         mov ebx,buf2d_h
  667.                         sub ebx,edx
  668.                         stdcall buf_offset_h, edi, eax, edx, ebx
  669.                         mov ecx,buf2d_h
  670.                         sub ecx,edx
  671.                         mov buf2d_h,ecx ;㬥­ìè ¥¬ ¢ëá®âã ¡ãä¥à 
  672.                         add buf2d_t,dx ;ᤢ¨£ ¥¬ ®âáâ㯠¢­¨§, ­  ç¨á«® ®¡à¥§ ­­ëå áâப
  673.                         mov ebx,buf2d_w
  674.                         imul ecx,ebx
  675.                         invoke mem.realloc,buf2d_data,ecx
  676.                         mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
  677.         .8no_crop_top:
  678.  
  679.         bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT
  680.         jae .8no_crop_right
  681.                 mov eax,dword[color]
  682.                 mov ebx,buf2d_w
  683.                 cmp ebx,1
  684.                 jle .8no_crop_right ;­  á«ãç © ¥á«¨ è¨à¨­  ¡ãä¥à  1 ¯¨ªá¥«ì
  685.                 mov esi,ebx
  686.                 imul esi,buf2d_h
  687.                 add esi,buf2d_data ;esi - 㪠§ â¥«ì ­  ª®­¥æ ¡ãä¥à  ¨§®¡à ¦¥­¨ï
  688.                 xor edx,edx
  689.                 cld
  690.  
  691.                 .8found_beg:
  692.                 dec esi ;¤¢¨£ ¥¬áï ­  1-­ã ª®«®­ªã ¢«¥¢®
  693.                 mov ecx,buf2d_h ;¢®ááâ ­®¢«¥­¨¥ ecx ¤«ï ­®¢®£® 横« 
  694.                 @@:
  695.                         cmp byte[esi],al
  696.                         jne .8found
  697.                         sub esi,ebx ;¯à룠¥¬ ­  ¢¥àå­îî áâபã
  698.                         loop @b
  699.                 inc edx
  700.                 mov ecx,buf2d_w
  701.                 dec ecx ;1 ª®«®­ª  ­  § ¯ á
  702.                 cmp edx,ecx
  703.                 jge .8found
  704.  
  705.                 dec esi ;¤¢¨£ ¥¬áï ­  1-­ã ª®«®­ªã ¢«¥¢®
  706.                 mov ecx,buf2d_h ;¢®ááâ ­®¢«¥­¨¥ ecx ¤«ï ­®¢®£® 横« 
  707.                 @@:
  708.                         add esi,ebx ;¯à룠¥¬ ­  ­¨¦­îî áâபã
  709.                         cmp byte[esi],al
  710.                         jne .8found
  711.                         loop @b
  712.                 inc edx
  713.  
  714.                 mov ecx,buf2d_w
  715.                 dec ecx ;1 ª®«®­ª  ­  § ¯ á
  716.                 cmp edx,ecx
  717.                 jl .8found_beg
  718.  
  719.                 .8found:
  720.                 cmp edx,0
  721.                 je .8no_crop_right
  722.                         mov ecx,buf2d_w
  723.                         sub ecx,edx
  724.                         stdcall img_gray_crop_r, buf2d_data, buf2d_w, ecx, buf2d_h ;®¡à¥§ ¥¬ ¡ãä¥à, ¯® ­®¢®¬ã à §¬¥àã
  725.                         mov buf2d_w,ecx ;áâ ¢¨¬ ­®¢ãî è¨à¨­ã ¤«ï ¡ãä¥à 
  726.                         mov ebx,buf2d_h
  727.                         imul ecx,ebx
  728.                         invoke mem.realloc,buf2d_data,ecx
  729.                         mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
  730.         .8no_crop_right:
  731.  
  732.         bt dword[opt],BUF2D_BIT_OPT_CROP_LEFT
  733.         jae .8no_crop_left
  734.                 mov eax,dword[color]
  735.                 mov ebx,buf2d_w
  736.                 cmp ebx,1
  737.                 jle .8no_crop_left ;­  á«ãç © ¥á«¨ è¨à¨­  ¡ãä¥à  1 ¯¨ªá¥«ì
  738.                 mov esi,buf2d_data ;esi - 㪠§ â¥«ì ­  ­ ç®«® ¡ãä¥à  ¨§®¡à ¦¥­¨ï
  739.                 mov edx,0
  740.                 cld
  741.                 .8found_beg_left:
  742.  
  743.                 mov ecx,buf2d_h ;¢®ááâ ­®¢«¥­¨¥ ecx ¤«ï ­®¢®£® 横« 
  744.                 @@:
  745.                         cmp word[esi],ax
  746.                         jne .8found_left
  747.                         add esi,ebx ;¯à룠¥¬ ­  ­¨¦­îî áâபã
  748.                         loop @b
  749.                 inc edx
  750.                 inc esi ;¤¢¨£ ¥¬áï ­  1-­ã ª®«®­ªã ¢¯à ¢®
  751.  
  752.                 mov ecx,buf2d_w
  753.                 dec ecx ;1 ª®«®­ª  ­  § ¯ á
  754.                 cmp edx,ecx
  755.                 jge .8found_left
  756.  
  757.                 mov ecx,buf2d_h ;¢®ááâ ­®¢«¥­¨¥ ecx ¤«ï ­®¢®£® 横« 
  758.                 @@:
  759.                         sub esi,ebx ;¯à룠¥¬ ­  ¢¥àå­îî áâபã
  760.                         cmp word[esi],ax
  761.                         jne .8found_left
  762.                         loop @b
  763.                 inc edx
  764.                 inc esi ;¤¢¨£ ¥¬áï ­  1-­ã ª®«®­ªã ¢¯à ¢®
  765.  
  766.                 mov ecx,buf2d_w
  767.                 dec ecx ;1 ª®«®­ª  ­  § ¯ á
  768.                 cmp edx,ecx
  769.                 jl .8found_beg_left
  770.  
  771.                 .8found_left:
  772.                 cmp edx,0
  773.                 je .8no_crop_left
  774.                         mov ecx,buf2d_w
  775.                         sub ecx,edx
  776.                         stdcall img_gray_crop_l, buf2d_data, buf2d_w, ecx, buf2d_h ;®¡à¥§ ¥¬ ¡ãä¥à, ¯® ­®¢®¬ã à §¬¥àã
  777.                         mov buf2d_w,ecx ;áâ ¢¨¬ ­®¢ãî è¨à¨­ã ¤«ï ¡ãä¥à 
  778.                         mov ebx,buf2d_h
  779.                         imul ecx,ebx
  780.                         invoke mem.realloc,buf2d_data,ecx
  781.                         mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
  782.                         mov eax,edx
  783.                         add buf2d_l,ax
  784.         .8no_crop_left:
  785.  
  786.         .8end_f:
  787.  
  788.         popad
  789.         ret
  790. endp
  791.  
  792. ;®¡à¥§ ¥¬ 梥⭮¥ ¨§®¡à ¦¥­¨¥ á ¯à ¢®© áâ®à®­ë
  793. ;input:
  794. ;data_rgb - pointer to rgb data
  795. ;size_w_old - width img in pixels
  796. ;size_w_new - new width img in pixels
  797. ;size_h - height img in pixels
  798. align 4
  799. proc img_rgb_crop_r, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword
  800.         pushad
  801.         mov eax, dword[size_w_old]
  802.         lea eax, dword[eax+eax*2] ;eax = width(old) * 3(rgb)
  803.         mov ebx, dword[size_w_new]
  804.         lea ebx, dword[ebx+ebx*2] ;ebx = width(new) * 3(rgb)
  805.         mov edx, dword[size_h]
  806.         mov edi, dword[data_rgb] ;edi - ¯®«ã砥⠤ ­­ë¥
  807.         mov esi, edi
  808.         add edi, ebx
  809.         add esi, eax
  810.         cld
  811.         @@:
  812.                 dec edx ;㬥­ìè ¥¬ áç¥â稪 ®áâ ¢è¨åáï áâப ­  1
  813.                 cmp edx,0
  814.                 jle @f
  815.                 mov ecx, ebx
  816.                 rep movsb ;¯¥à¥­®á (ª®¯¨à®¢ ­¨¥) áâப¨ ¯¨ªá¥«¥©
  817.                 add esi,eax ;¯¥à¥å®¤ ­  ­®¢ãî áâà®çªã ¨§®¡à ¦¥­¨ï
  818.                 sub esi,ebx
  819.                 jmp @b
  820.         @@:
  821.         popad
  822.         ret
  823. endp
  824.  
  825. ;®¡à¥§ ¥¬ á¥à®¥ ¨§®¡à ¦¥­¨¥ á ¯à ¢®© áâ®à®­ë
  826. ;input:
  827. ;data_gray - pointer to gray data
  828. ;size_w_old - width img in pixels
  829. ;size_w_new - new width img in pixels
  830. ;size_h - height img in pixels
  831. align 4
  832. proc img_gray_crop_r, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword
  833.         pushad
  834.         mov eax, dword[size_w_old]
  835.         mov ebx, dword[size_w_new]
  836.         mov edx, dword[size_h]
  837.         mov edi, dword[data_gray] ;edi - ¯®«ã砥⠤ ­­ë¥
  838.         mov esi, edi
  839.         add edi, ebx
  840.         add esi, eax
  841.         cld
  842.         @@:
  843.                 dec edx ;㬥­ìè ¥¬ áç¥â稪 ®áâ ¢è¨åáï áâப ­  1
  844.                 cmp edx,0
  845.                 jle @f
  846.                 mov ecx, ebx
  847.                 rep movsb ;¯¥à¥­®á (ª®¯¨à®¢ ­¨¥) áâப¨ ¯¨ªá¥«¥©
  848.                 add esi,eax ;¯¥à¥å®¤ ­  ­®¢ãî áâà®çªã ¨§®¡à ¦¥­¨ï
  849.                 sub esi,ebx
  850.                 jmp @b
  851.         @@:
  852.         popad
  853.         ret
  854. endp
  855.  
  856. ;®¡à¥§ ¥¬ 梥⭮¥ ¨§®¡à ¦¥­¨¥ á «¥¢®© áâ®à®­ë
  857. ;input:
  858. ;data_rgb - pointer to rgb data
  859. ;size_w_old - width img in pixels
  860. ;size_w_new - new width img in pixels
  861. ;size_h - height img in pixels
  862. align 4
  863. proc img_rgb_crop_l, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword
  864.         pushad
  865.         mov edi,dword[data_rgb]
  866.         mov esi,edi
  867.         mov eax,dword[size_w_old]
  868.         mov ebx,dword[size_w_new]
  869.         cmp eax,ebx
  870.         jle .end_f ;áâ àë© à §¬¥à ¨§®¡à ¦¥­¨ï ­¥ ¬®¦¥â ¡ëâì ¬¥­ìè¥ ­®¢®£® (¯à¨ ãá«®¢¨¨ ®¡à¥§ ­¨ï ª à⨭ª¨)
  871.                 lea eax,[eax+eax*2]
  872.                 lea ebx,[ebx+ebx*2]
  873.                 sub eax,ebx
  874.                 mov edx,dword[size_h] ;¢ëá®â  ¨§®¡à ¦¥­¨ï
  875.                 cld
  876.                 @@:
  877.                         add esi,eax
  878.                         mov ecx,ebx
  879.                         rep movsb
  880.                         dec edx
  881.                         cmp edx,0
  882.                         jg @b
  883.         .end_f:
  884.         popad
  885.         ret
  886. endp
  887.  
  888. ;®¡à¥§ ¥¬ á¥à®¥ ¨§®¡à ¦¥­¨¥ á «¥¢®© áâ®à®­ë
  889. ;input:
  890. ;data_gray - pointer to gray data
  891. ;size_w_old - width img in pixels
  892. ;size_w_new - new width img in pixels
  893. ;size_h - height img in pixels
  894. align 4
  895. proc img_gray_crop_l, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword
  896.         pushad
  897.         mov edi,dword[data_gray]
  898.         mov esi,edi
  899.         mov eax,dword[size_w_old]
  900.         mov ebx,dword[size_w_new]
  901.         cmp eax,ebx
  902.         jle .end_f ;áâ àë© à §¬¥à ¨§®¡à ¦¥­¨ï ­¥ ¬®¦¥â ¡ëâì ¬¥­ìè¥ ­®¢®£® (¯à¨ ãá«®¢¨¨ ®¡à¥§ ­¨ï ª à⨭ª¨)
  903.                 sub eax,ebx
  904.                 mov edx,dword[size_h] ;¢ëá®â  ¨§®¡à ¦¥­¨ï
  905.                 cld
  906.                 @@:
  907.                         add esi,eax
  908.                         mov ecx,ebx
  909.                         rep movsb
  910.                         dec edx
  911.                         cmp edx,0
  912.                         jg @b
  913.         .end_f:
  914.         popad
  915.         ret
  916. endp
  917.  
  918. ;hoffs - ª®««¨ç¥á⢮ ¯¨ªá¥«¥© ­  ª®âàë¥ ¯®¤­¨¬ ¥âáï/®¯ã᪠¥âáï ¨§®¡à ¦¥­¨¥
  919. ;img_t - ¢ëá®â , á ª®â®à®© ­ ç¨­ ¥âáï ¤¢¨£ îé ïáï ç áâì ¨§®¡à ¦¥­¨ï
  920. align 4
  921. proc buf_offset_h, buf_struc:dword, hoffs:dword, img_t:dword, img_h:dword ;ᤢ¨£ ¥â ¨§®¡à ¦¥­¨¥ ¯® ¢ëá®â¥
  922.         pushad
  923.         mov edi,dword[buf_struc]
  924.         cmp buf2d_bits,24
  925.         jne .end_move_24
  926.  
  927.         mov eax,[hoffs]
  928.         cmp eax,0
  929.         je .end_move_24
  930.                 mov ebx,buf2d_w
  931.                 mov edx,dword[img_t]
  932.                         mov ecx,dword[img_h] ;ecx - ¢ëá®â  ᤢ¨£ ¥¬ëå ¤ ­­ëå
  933.                         cmp ecx,buf2d_h
  934.                         jge .end_f ;®è¨¡®ç­®¥ ãá«®¢¨¥, ¢ëá®â  ¨§®¡à ¦¥­¨ï ¬¥­ìè¥ ç¥¬ ¢ëá®â  ᤢ¨£ ¥¬®£® ¨§®¡à ¦¥­¨ï
  935.                         imul ecx,ebx ;ecx - ª®««¨ç¥á⢮ ¯¨ªá¥«¥© ¢ ᤢ¨£ ¥¬ëå ¤ ­­ëå
  936.                         lea ecx,[ecx+ecx*2]
  937.                 imul ebx,edx
  938.                 lea ebx,[ebx+ebx*2]
  939.                 mov esi,buf2d_data
  940.                 add esi,ebx
  941.  
  942.                 add edx,eax ;edx = img_t+hoffs (hoffs<0)
  943.                 mov ebx,buf2d_w
  944.                 imul ebx,edx
  945.                 lea ebx,[ebx+ebx*2]
  946.                 mov edi,buf2d_data ;¯®§¨æ¨ï, ªã¤  ¡ã¤¥â ¤¢¨£ âìáï ¨§®¡à ¦¥­¨¥
  947.                 add edi,ebx
  948.  
  949.                 cmp eax,0
  950.                 jg .move_down_24
  951.                         ;¤¢¨£ ¥¬ ¨§®¡à ¦¥­¨¥ ¢¢¥àå
  952.                         cld
  953.                         rep movsb
  954.                         jmp .end_f
  955.                 .move_down_24:
  956.                         ;¤¢¨£ ¥¬ ¨§®¡à ¦¥­¨¥ ¢­¨§
  957.                         add esi,ecx
  958.                         dec esi
  959.                         add edi,ecx
  960.                         dec edi
  961.                         std
  962.                         rep movsb
  963.                         jmp .end_f
  964.         .end_move_24:
  965.  
  966. ;stdcall print_err,sz_buf2d_offset_h,txt_err_n24b
  967.  
  968.         cmp buf2d_bits,8
  969.         jne .end_move_8
  970.  
  971.         mov eax,[hoffs]
  972.         cmp eax,0
  973.         je .end_move_8
  974.                 ;¤¢¨£ ¥¬ ¨§®¡à ¦¥­¨¥ ¢¢¥àå
  975.                 mov ebx,buf2d_w
  976.                 mov edx,dword[img_t]
  977.                         mov ecx,dword[img_h] ;ecx - ¢ëá®â  ᤢ¨£ ¥¬ëå ¤ ­­ëå
  978.                         cmp ecx,buf2d_h
  979.                         jge .end_f ;®è¨¡®ç­®¥ ãá«®¢¨¥, ¢ëá®â  ¨§®¡à ¦¥­¨ï ¬¥­ìè¥ ç¥¬ ¢ëá®â  ᤢ¨£ ¥¬®£® ¨§®¡à ¦¥­¨ï
  980.                         imul ecx,ebx ;ecx - ª®««¨ç¥á⢮ ¯¨ªá¥«¥© ¢ ᤢ¨£ ¥¬ëå ¤ ­­ëå
  981.                 imul ebx,edx
  982.                 mov esi,buf2d_data
  983.                 add esi,ebx
  984.  
  985.                 add edx,eax ;edx = img_t+hoffs (hoffs<0)
  986.                 mov ebx,buf2d_w
  987.                 imul ebx,edx
  988.                 mov edi,buf2d_data ;¯®§¨æ¨ï, ªã¤  ¡ã¤¥â ¤¢¨£ âìáï ¨§®¡à ¦¥­¨¥
  989.                 add edi,ebx
  990.  
  991.                 cmp eax,0
  992.                 jg .move_down_8
  993.                         cld
  994.                         rep movsb
  995.                         jmp .end_f
  996.                 .move_down_8:
  997.                         ;¤¢¨£ ¥¬ ¨§®¡à ¦¥­¨¥ ¢­¨§
  998.                         add esi,ecx
  999.                         dec esi
  1000.                         add edi,ecx
  1001.                         dec edi
  1002.                         std
  1003.                         rep movsb
  1004.                         jmp .end_f
  1005.         .end_move_8:
  1006.  
  1007.         .end_f:
  1008.         popad
  1009.         ret
  1010. endp
  1011.  
  1012.  
  1013. align 4
  1014. proc buf_draw_buf, buf_struc:dword
  1015.         pushad
  1016.         mov edi,dword[buf_struc]
  1017.         cmp buf2d_bits,24
  1018.         jne .error
  1019.                 mov eax,7
  1020.                 mov ebx,buf2d_data
  1021.  
  1022.                 mov ecx,buf2d_w
  1023.                 ror ecx,16
  1024.                 mov edx,buf2d_h
  1025.                 mov cx,dx
  1026.  
  1027.                 mov edx,buf2d_size_lt
  1028.                 ror edx,16
  1029.                 int 0x40
  1030.                 jmp .end_draw_24
  1031.         .error:
  1032.                 stdcall print_err,sz_buf2d_draw,txt_err_n24b
  1033.         .end_draw_24:
  1034.         popad
  1035.         ret
  1036. endp
  1037.  
  1038. align 4
  1039. proc buf_delete, buf_struc:dword
  1040.         push eax edi
  1041.         mov edi,dword[buf_struc]
  1042.         invoke mem.free,buf2d_data
  1043.         pop edi eax
  1044.         ret
  1045. endp
  1046.  
  1047. align 4
  1048. proc buf_resize, buf_struc:dword, new_w:dword, new_h:dword
  1049.         pushad
  1050.         mov edi,dword[buf_struc]
  1051.         cmp buf2d_bits,24
  1052.         jne .24bit
  1053.                 mov eax,dword[new_w]
  1054.                 cmp eax,1
  1055.                 jl @f
  1056.                         mov buf2d_w,eax
  1057.                 @@:
  1058.                 mov ecx,buf2d_w
  1059.                 mov eax,dword[new_h]
  1060.                 cmp eax,1
  1061.                 jl @f
  1062.                         mov buf2d_h,eax
  1063.                 @@:
  1064.                 mov ebx,buf2d_h
  1065.                 imul ecx,ebx
  1066.                 lea ecx,[ecx+ecx*2] ; 24 bit = 3
  1067.                 invoke mem.realloc,buf2d_data,ecx ;¨§¬¥­ï¥¬ ¯ ¬ïâì § ­¨¬ ¥¬ãî ¡ãä¥à®¬
  1068.                 mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
  1069.         .24bit:
  1070.         popad
  1071.         ret
  1072. endp
  1073.  
  1074. align 4
  1075. proc buf_line_brs, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, coord_y1:dword, color:dword
  1076. locals
  1077.         loc_1 dd ?
  1078.         loc_2 dd ?
  1079.         napravl db ?
  1080. endl
  1081.         pushad
  1082.                 mov eax,dword[coord_x1]
  1083.                 sub eax,dword[coord_x0]
  1084.                 bt eax,31
  1085.                 jae @f
  1086.                         neg eax
  1087.                         inc eax
  1088.                 @@:
  1089.                 mov ebx,dword[coord_y1]
  1090.                 sub ebx,dword[coord_y0]
  1091.                 jnz @f
  1092.                         ;¥á«¨ § ¤ ­  £®à¨§®­â «ì­ ï «¨­¨ï y0=y1
  1093.                         stdcall buf_line_h, [buf_struc], [coord_x0], [coord_y0], [coord_x1], [color]
  1094.                         jmp .coord_end
  1095.                 @@:
  1096.                 bt ebx,31
  1097.                 jae @f
  1098.                         neg ebx
  1099.                         inc ebx
  1100.                 @@:
  1101.                 mov edx,dword[color]
  1102.  
  1103.                 mov [napravl],byte 0 ;bool steep=false
  1104.                 cmp eax,ebx
  1105.                 jle @f
  1106.                         mov [napravl],byte 1 ;bool steep=true
  1107.                         swap dword[coord_x0],dword[coord_y0] ;swap(x0, y0);
  1108.                         swap dword[coord_x1],dword[coord_y1] ;swap(x1, y1);
  1109.                 @@:
  1110.                 mov eax,dword[coord_y0] ;x0
  1111.                 cmp eax,dword[coord_y1] ;if(x0>x1)
  1112.                 jle @f
  1113.                         swap dword[coord_y0],dword[coord_y1] ;swap(x0, x1);
  1114.                         swap dword[coord_x0],dword[coord_x1] ;swap(y0, y1);
  1115.                 @@:
  1116.  
  1117. ; int deltax esi
  1118. ; int deltay edi
  1119. ; int error  ebp-6
  1120. ; int ystep  ebp-8
  1121.  
  1122.                 mov eax,dword[coord_y0]
  1123.                 mov esi,dword[coord_y1]
  1124.                 sub esi,eax ;deltax = y1-y0
  1125.                 mov ebx,esi
  1126.                 shr ebx,1
  1127.                 mov [loc_1],ebx ;error = deltax/2
  1128.  
  1129.                 mov eax,dword[coord_x0]
  1130.                 mov edi,dword[coord_x1]
  1131.                 mov [loc_2],dword -1 ;ystep = -1
  1132.                 cmp eax,edi ;if (x0<x1) ystep = 1;
  1133.                 jge @f
  1134.                         mov [loc_2],dword 1 ;ystep = 1
  1135.                 @@:
  1136.                 sub edi,eax ;x1-x0
  1137.  
  1138.                 bts edi,31
  1139.                 jae @f
  1140.                         neg edi
  1141.                         inc edi
  1142.                 @@:
  1143.                 and edi,0x7fffffff ;deltay = abs(x1-x0)
  1144.  
  1145.                 mov eax,edi
  1146.                 mov edi,[buf_struc]
  1147.                 cmp buf2d_bits,8
  1148.                 je @f
  1149.                 cmp buf2d_bits,24
  1150.                 je @f
  1151.                         jmp .coord_end
  1152.                 @@:
  1153.  
  1154.                 cmp [napravl],0
  1155.                 jne .coord_yx
  1156.                         mov ebx,dword[coord_x0]
  1157.                         mov ecx,dword[coord_y0]
  1158.  
  1159.                         @@: ;for (x=x0 ; x<x1; x++) ;------------------------------------
  1160.                                 cmp ecx,dword[coord_y1]
  1161.                                 jg @f ;jge ???
  1162.                                 call draw_pixel
  1163.  
  1164.                                 sub dword[loc_1],eax ;error -= deltay
  1165.                                 cmp dword[loc_1],0 ;if(error<0)
  1166.                                 jge .if0
  1167.                                         add ebx,[loc_2] ;y += ystep
  1168.                                         add [loc_1],esi ;error += deltax
  1169.                                 .if0:
  1170.                                 inc ecx
  1171.                                 jmp @b
  1172.                         @@:
  1173.                         jmp .coord_end
  1174.                 .coord_yx:
  1175.                         mov ebx,dword[coord_y0]
  1176.                         mov ecx,dword[coord_x0]
  1177.  
  1178.                         @@: ;for (x=x0 ; x<x1; x++) ;------------------------------------
  1179.                                 cmp ebx,dword[coord_y1]
  1180.                                 jg @f ;jge ???
  1181.                                 call draw_pixel
  1182.  
  1183.                                 sub dword[loc_1],eax ;error -= deltay
  1184.                                 cmp dword[loc_1],0 ;if(error<0)
  1185.                                 jge .if1
  1186.                                         add ecx,[loc_2] ;y += ystep
  1187.                                         add [loc_1],esi ;error += deltax
  1188.                                 .if1:
  1189.                                 inc ebx
  1190.                                 jmp @b
  1191.                         @@:
  1192.         .coord_end:
  1193.         popad
  1194.         ret
  1195. endp
  1196.  
  1197. ;à¨á®¢ ­¨¥ ᣫ ¦¥­­®© «¨­¨¨
  1198. align 4
  1199. proc buf_line_brs_sm, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, coord_y1:dword, color:dword
  1200. locals
  1201.         loc_1 dd ?
  1202.         loc_2 dd ?
  1203.         napravl db ?
  1204. endl
  1205.         pushad
  1206.                 mov eax,dword[coord_x1]
  1207.                 sub eax,dword[coord_x0]
  1208.                 bt eax,31
  1209.                 jae @f
  1210.                         neg eax
  1211.                         inc eax
  1212.                 @@:
  1213.                 mov ebx,dword[coord_y1]
  1214.                 sub ebx,dword[coord_y0]
  1215.                 jnz @f
  1216.                         ;¥á«¨ § ¤ ­  £®à¨§®­â «ì­ ï «¨­¨ï y0=y1
  1217.                         stdcall buf_line_h, [buf_struc], [coord_x0], [coord_y0], [coord_x1], [color]
  1218.                         jmp .coord_end
  1219.                 @@:
  1220.                 bt ebx,31
  1221.                 jae @f
  1222.                         neg ebx
  1223.                         inc ebx
  1224.                 @@:
  1225.                 mov edx,dword[color]
  1226.  
  1227.                 mov [napravl],byte 0 ;bool steep=false
  1228.                 cmp eax,ebx
  1229.                 jle @f
  1230.                         mov [napravl],byte 1 ;bool steep=true
  1231.                         swap dword[coord_x0],dword[coord_y0] ;swap(x0, y0);
  1232.                         swap dword[coord_x1],dword[coord_y1] ;swap(x1, y1);
  1233.                 @@:
  1234.                 mov eax,dword[coord_y0] ;x0
  1235.                 cmp eax,dword[coord_y1] ;if(x0>x1)
  1236.                 jle @f
  1237.                         swap dword[coord_y0],dword[coord_y1] ;swap(x0, x1);
  1238.                         swap dword[coord_x0],dword[coord_x1] ;swap(y0, y1);
  1239.                 @@:
  1240.  
  1241. ; int deltax esi
  1242. ; int deltay edi
  1243. ; int error  ebp-6
  1244. ; int ystep  ebp-8
  1245.  
  1246.                 mov eax,dword[coord_y0]
  1247.                 mov esi,dword[coord_y1]
  1248.                 sub esi,eax ;deltax = y1-y0
  1249.                 mov ebx,esi
  1250.                 shr ebx,1
  1251.                 mov [loc_1],ebx ;error = deltax/2
  1252.  
  1253.                 mov eax,dword[coord_x0]
  1254.                 mov edi,dword[coord_x1]
  1255.                 mov [loc_2],dword -1 ;ystep = -1
  1256.                 cmp eax,edi ;if (x0<x1) ystep = 1;
  1257.                 jge @f
  1258.                         mov [loc_2],dword 1 ;ystep = 1
  1259.                 @@:
  1260.                 sub edi,eax ;x1-x0
  1261.  
  1262.                 bts edi,31
  1263.                 jae @f
  1264.                         neg edi
  1265.                         inc edi
  1266.                 @@:
  1267.                 and edi,0x7fffffff ;deltay = abs(x1-x0)
  1268.  
  1269.                 mov eax,edi
  1270.                 mov edi,[buf_struc]
  1271.                 cmp buf2d_bits,24
  1272.                 jne .coord_end
  1273.  
  1274.                 cmp [napravl],0
  1275.                 jne .coord_yx
  1276.                         mov ebx,dword[coord_x0]
  1277.                         mov ecx,dword[coord_y0]
  1278.  
  1279.                         @@: ;for (x=x0 ; x<x1; x++) ;------------------------------------
  1280.                                 cmp ecx,dword[coord_y1]
  1281.                                 jg @f ;jge ???
  1282.                                 push eax
  1283.                                         mov eax,esi
  1284.                                         sub eax,[loc_1]
  1285.                                         stdcall draw_pixel_transp, eax,esi
  1286.                                 pop eax
  1287.                                 add ebx,[loc_2]
  1288.                                 stdcall draw_pixel_transp, [loc_1],esi
  1289.                                 sub ebx,[loc_2]
  1290.  
  1291.                                 sub dword[loc_1],eax ;error -= deltay
  1292.                                 cmp dword[loc_1],0 ;if(error<0)
  1293.                                 jge .if0
  1294.                                         add ebx,[loc_2] ;y += ystep
  1295.                                         add [loc_1],esi ;error += deltax
  1296.                                 .if0:
  1297.                                 inc ecx
  1298.                                 jmp @b
  1299.                         @@:
  1300.                         jmp .coord_end
  1301.                 .coord_yx:
  1302.                         mov ebx,dword[coord_y0]
  1303.                         mov ecx,dword[coord_x0]
  1304.  
  1305.                         @@: ;for (x=x0 ; x<x1; x++) ;------------------------------------
  1306.                                 cmp ebx,dword[coord_y1]
  1307.                                 jg @f ;jge ???
  1308.                                 push eax
  1309.                                         mov eax,esi
  1310.                                         sub eax,[loc_1]
  1311.                                         stdcall draw_pixel_transp, eax,esi
  1312.                                 pop eax
  1313.                                 add ecx,[loc_2]
  1314.                                 stdcall draw_pixel_transp, [loc_1],esi
  1315.                                 sub ecx,[loc_2]
  1316.  
  1317.                                 sub dword[loc_1],eax ;error -= deltay
  1318.                                 cmp dword[loc_1],0 ;if(error<0)
  1319.                                 jge .if1
  1320.                                         add ecx,[loc_2] ;y += ystep
  1321.                                         add [loc_1],esi ;error += deltax
  1322.                                 .if1:
  1323.                                 inc ebx
  1324.                                 jmp @b
  1325.                         @@:
  1326.         .coord_end:
  1327.         popad
  1328.         ret
  1329. endp
  1330.  
  1331. ;à¨á®¢ ­¨¥ £®à¨§®­â «ì­®© «¨­¨¨, ¯®â®¬ã ­¥â ¯ à ¬¥âà  coord_y1
  1332. align 4
  1333. proc buf_line_h, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, color:dword
  1334.         pushad
  1335.         pushfd
  1336.                 mov edi,[buf_struc]
  1337.                 cmp buf2d_bits,8
  1338.                 je @f
  1339.                 cmp buf2d_bits,24
  1340.                 je @f
  1341.                         jmp .end24
  1342.                 @@: ;®¯à¥¤¥«¥­¨¥ ª®®à¤¨­ â «¨­¨¨ ®â­®á¨â¥«ì­® ¡ãä¥à 
  1343.  
  1344.                 mov ecx,dword[coord_y0]
  1345.                 bt ecx,31
  1346.                 jc .end24 ;¥á«¨ ª®®à¤¨­ â  y0 ®âà¨æ â¥«ì­ ï
  1347.                 cmp ecx,buf2d_h
  1348.                 jge .end24 ;¥á«¨ ª®®à¤¨­ â  y0 ¡®«ìè¥ ¢ëá®âë ¡ãä¥à 
  1349.  
  1350.                 mov ebx,dword[coord_x0]
  1351.                 mov esi,dword[coord_x1]
  1352.                 cmp ebx,esi
  1353.                 jle @f
  1354.                         xchg ebx,esi ;¥á«¨ x0 > x1 â® ¬¥­ï¥¬ ¬¥áâ ¬¨ x0 ¨ x1
  1355.                 @@:
  1356.                 bt ebx,31
  1357.                 jae @f
  1358.                         ;¥á«¨ ª®®à¤¨­ â  x0 ®âà¨æ â¥«ì­ ï
  1359.                         xor ebx,ebx
  1360.                 @@:
  1361.                 cmp esi,buf2d_w
  1362.                 jl @f
  1363.                         ;¥á«¨ ª®®à¤¨­ â  x0 ¡®«ìè¥ è¨à¨­ë ¡ãä¥à 
  1364.                         mov esi,buf2d_w
  1365.                         dec esi
  1366.                 @@:
  1367.                 cmp ebx,esi
  1368.                 jg .end24 ;¥á«¨ x0 > x1 ¬®¦¥â ¢®§­¨ª­ãâì ª®£¤  ®¡¥ ª®®à¤¨­ âë x0, x1 ­ å®¤¨«¨áì §  ®¤­¨¬ ¨§ ¯à¥¤¥«®¢ ¡ãä¥à 
  1369.  
  1370.                 cmp buf2d_bits,24
  1371.                 je .beg24
  1372.                         ;à¨á®¢ ­¨¥ ¢ 8 ¡¨â­®¬ ¡ãä¥à¥
  1373.                         ;¢ edx ¢ëç¨á«ï¥¬ ­ ç «® 1-© â®çª¨ «¨­¨¨ ¢ ¡ãä¥à¥ ¨§®¡à ¦¥­¨ï
  1374.                         mov edx,buf2d_w ;size x
  1375.                         imul edx,ecx ;size_x*y
  1376.                         add edx,ebx      ;size_x*y+x
  1377.                         add edx,buf2d_data ;ptr+(size_x*y+x)
  1378.                         mov edi,edx ;⥯¥àì ¬®¦¥¬ ¯®àâ¨âì 㪠§ â¥«ì ­  ¡ãä¥à
  1379.  
  1380.                         mov ecx,esi
  1381.                         sub ecx,ebx ;¢ ecx ª®««¨ç¥á⢮ â®ç¥ª «¨­¨¨ ¢ë¢®¤¨¬ëå ¢ ¡ãä¥à
  1382.                         inc ecx ;çâ®-¡ë ¯®á«¥¤­ïï â®çª  «¨­¨¨ â ª¦¥ ®â®¡à ¦ « áì
  1383.                         mov eax,dword[color] ;¡ã¤¥¬ ¨á¯®«ì§®¢ âì ⮫쪮 §­ ç¥­¨¥ ¢ al
  1384.                         cld
  1385.                         rep stosb ;横« ¯® ®á¨ x ®â x0 ¤® x1 (¢ª«îç ï x1)
  1386.                         jmp .end24
  1387.  
  1388.                 .beg24: ;à¨á®¢ ­¨¥ ¢ 24 ¡¨â­®¬ ¡ãä¥à¥
  1389.                 ;¢ eax ¢ëç¨á«ï¥¬ ­ ç «® 1-© â®çª¨ «¨­¨¨ ¢ ¡ãä¥à¥ ¨§®¡à ¦¥­¨ï
  1390.                 mov eax,buf2d_w ;size x
  1391.                 imul eax,ecx ;size_x*y
  1392.                 add eax,ebx      ;size_x*y+x
  1393.                 lea eax,[eax+eax*2] ;(size_x*y+x)*3
  1394.                 add eax,buf2d_data  ;ptr+(size_x*y+x)*3
  1395.  
  1396.                 mov ecx,esi
  1397.                 sub ecx,ebx ;¢ ecx ª®««¨ç¥á⢮ â®ç¥ª «¨­¨¨ ¢ë¢®¤¨¬ëå ¢ ¡ãä¥à
  1398.                 inc ecx ;çâ®-¡ë ¯®á«¥¤­ïï â®çª  «¨­¨¨ â ª¦¥ ®â®¡à ¦ « áì
  1399.                 mov edx,dword[color]
  1400.                 mov ebx,edx ;ª®®à¤¨­ â  x0 ¢ ebx 㦥 ­¥ ­ã¦­ 
  1401.                 ror edx,16 ;¯®¢®à ç¨¢ ¥¬ ॣ¨áâà çâ® ¡ë 3-© ¡ ©â ¯®¯ « ¢ dl
  1402.                 cld
  1403.                 @@: ;横« ¯® ®á¨ x ®â x0 ¤® x1 (¢ª«îç ï x1)
  1404.                         mov word[eax],bx ;copy pixel color
  1405.                         mov byte[eax+2],dl
  1406.                         add eax,3
  1407.                         loop @b
  1408.                 .end24:
  1409.         popfd
  1410.         popad
  1411.         ret
  1412. endp
  1413.  
  1414. align 4
  1415. proc buf_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword
  1416. pushad
  1417.         mov edi,[buf_struc]
  1418.         cmp buf2d_bits,8
  1419.         je @f
  1420.         cmp buf2d_bits,24
  1421.         je @f
  1422.                 jmp .coord_end
  1423.         @@:
  1424.  
  1425.                 mov eax,[coord_x]
  1426.                 mov ebx,[coord_y]
  1427.                 mov ecx,[w]
  1428.                 ;cmp ecx,1
  1429.                 ;jl .coord_end
  1430.                 cmp ecx,0
  1431.                 je .coord_end
  1432.                 jg @f
  1433.                         add eax,ecx
  1434.                         inc eax
  1435.                         neg ecx
  1436.                 @@:
  1437.                 add ecx,eax
  1438.                 dec ecx
  1439.                 mov edx,[h]
  1440.                 ;cmp edx,1
  1441.                 ;jl .coord_end
  1442.                 cmp edx,0
  1443.                 je .coord_end
  1444.                 jg @f
  1445.                         add ebx,edx
  1446.                         inc ebx
  1447.                         neg edx
  1448.                 @@:
  1449.  
  1450.                 add edx,ebx
  1451.                 dec edx
  1452.                 mov esi,dword[color]
  1453.                 stdcall buf_line_h, edi, eax, ebx, ecx, esi ;«¨­¨ï -
  1454.                 stdcall buf_line_brs, edi, eax, ebx, eax, edx, esi ;«¨­¨ï |
  1455.                 stdcall buf_line_h, edi, eax, edx, ecx, esi ;«¨­¨ï -
  1456.                 stdcall buf_line_brs, edi, ecx, ebx, ecx, edx, esi ;«¨­¨ï |
  1457.         .coord_end:
  1458. popad
  1459.         ret
  1460. endp
  1461.  
  1462. align 4
  1463. proc buf_filled_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword
  1464. pushad
  1465.         mov edi,[buf_struc]
  1466.         cmp buf2d_bits,8
  1467.         je @f
  1468.         cmp buf2d_bits,24
  1469.         je @f
  1470.                 jmp .coord_end
  1471.         @@:
  1472.                 mov eax,[coord_x]
  1473.                 mov ebx,[coord_y]
  1474.                 mov edx,[w]
  1475.                 cmp edx,0
  1476.                 je .coord_end ;¥á«¨ ¢ëá®â  0 ¯¨ªá¥«¥©
  1477.                 jg @f ;¥á«¨ ¢ëá®â  ¯®«®¦¨â¥«ì­ ï
  1478.                         add eax,edx
  1479.                         inc eax
  1480.                         neg edx ;è¨à¨­ã ¤¥« ¥¬ ¯®«®¦¨â¥«ì­®©
  1481.                         ;inc edx ;¯®ç¥¬ã âãâ ­¥ ¤®¡ ¢«ï¥¬ 1-æã ï ­¥ §­ î, ­® á ­¥© à ¡®â ¥â ­¥ ¯à ¢¨«ì­®
  1482.                 @@:
  1483.                 add edx,eax
  1484.                 dec edx
  1485.                 mov ecx,[h]
  1486.                 cmp ecx,0
  1487.                 je .coord_end ;¥á«¨ ¢ëá®â  0 ¯¨ªá¥«¥©
  1488.                 jg @f ;¥á«¨ ¢ëá®â  ¯®«®¦¨â¥«ì­ ï
  1489.                         add ebx,ecx ;ᤢ¨£ ¥¬ ¢¥àå­îî ª®®à¤¨­ âã ¯àאַ㣮«ì­¨ª 
  1490.                         inc ebx
  1491.                         neg ecx ;¢ëá®âã ¤¥« ¥¬ ¯®«®¦¨â¥«ì­®©
  1492.                         ;inc ecx ;¯®ç¥¬ã âãâ ­¥ ¤®¡ ¢«ï¥¬ 1-æã ï ­¥ §­ î, ­® á ­¥© à ¡®â ¥â ­¥ ¯à ¢¨«ì­®
  1493.                 @@:
  1494.                 mov esi,dword[color]
  1495.                 cld
  1496.                 @@:
  1497.                         stdcall buf_line_h, edi, eax, ebx, edx, esi ;«¨­¨ï -
  1498.                         inc ebx
  1499.                         loop @b
  1500.         .coord_end:
  1501. popad
  1502.         ret
  1503. endp
  1504.  
  1505. align 4
  1506. proc buf_circle, buf_struc:dword, coord_x:dword, coord_y:dword, r:dword, color:dword
  1507. locals
  1508.         po_x dd ?
  1509.         po_y dd ?
  1510. endl
  1511.         pushad
  1512.         mov edi,dword[buf_struc]
  1513.         cmp buf2d_bits,8
  1514.         je @f
  1515.         cmp buf2d_bits,24
  1516.         je @f
  1517.                 jmp .error
  1518.         @@:
  1519.                 mov edx,dword[color]
  1520.  
  1521.                 finit
  1522.                 fild dword[coord_x]
  1523.                 fild dword[coord_y]
  1524.                 fild dword[r]
  1525.                 fldz ;px=0
  1526.                 fld st1 ;py=r
  1527.  
  1528.                 fldpi
  1529.                 fmul st0,st3
  1530.                 fistp dword[po_x]
  1531.                 mov esi,dword[po_x] ;esi=pi*r
  1532.                 shl esi,1 ;esi=2*pi*r
  1533.  
  1534.                 ;st0 = py
  1535.                 ;st1 = px
  1536.                 ;st2 = r
  1537.                 ;st3 = y
  1538.                 ;st4 = x
  1539.  
  1540.                 @@:
  1541.                         ;Point(px + x, y - py)
  1542.                         fld st1 ;st0=px
  1543.                         fadd st0,st5 ;st0=px+x
  1544.                         fistp dword[po_x]
  1545.                         mov ebx,dword[po_x]
  1546.                         fld st3 ;st0=y
  1547.                         fsub st0,st1 ;st0=y-py
  1548.                         fistp dword[po_y]
  1549.                         mov ecx,dword[po_y]
  1550.                         call draw_pixel
  1551.                         ;px += py/r
  1552.                         fld st0 ;st0=py
  1553.                         fdiv st0,st3 ;st0=py/r
  1554.                         faddp st2,st0 ;st3+=st0
  1555.                         ;py -= px/r
  1556.                         fld st1 ;st0=px
  1557.                         fdiv st0,st3 ;st0=px/r
  1558.                         fsubp st1,st0 ;st2-=st0
  1559.  
  1560.                         dec esi
  1561.                         cmp esi,0
  1562.                         jge @b
  1563.                 jmp .exit_fun
  1564.         .error:
  1565.                 stdcall print_err,sz_buf2d_circle,txt_err_n8_24b
  1566.         .exit_fun:
  1567.  
  1568.         popad
  1569.         ret
  1570. endp
  1571.  
  1572. ;äã­ªæ¨ï ¤«ï § «¨¢ª¨ ®¡« á⨠¢ë¡à ­­ë¬ 梥⮬
  1573. align 4
  1574. proc buf_flood_fill, buf_struc:dword, coord_x:dword, coord_y:dword, mode:dword, color_f:dword, color_b:dword
  1575.         pushad
  1576.                 mov edi,[buf_struc]
  1577.                 cmp buf2d_bits,24
  1578.                 jne .end24
  1579.  
  1580.                         mov ebx,dword[coord_x]
  1581.                         mov ecx,dword[coord_y]
  1582.                         mov edx,dword[color_f]
  1583.                         mov esi,dword[color_b]
  1584.  
  1585.                         cmp dword[mode],1 ;¢ § ¢¨á¨¬®á⨠®â 'mode' ®¯à¥¤¥«ï¥¬ ª ª¨¬  «£®à¨â¬®¬ ¡ã¤¥¬ ¯®«ì§®¢ âìáï
  1586.                         je @f
  1587.                                 call buf_flood_fill_recurs_0 ;§ «¨¢ ¥¬ ¤® ¯¨ªá¥«¥© æ¢¥â  esi
  1588.                                 jmp .end24
  1589.                         @@:
  1590.                                 call buf_flood_fill_recurs_1 ;§ «¨¢ ¥¬ ¯¨ªá¥«¨ ¨¬¥î騥 梥â esi
  1591.  
  1592.                 .end24:
  1593.         popad
  1594.         ret
  1595. endp
  1596.  
  1597. ;input:
  1598. ; ebx = coord_x
  1599. ; ecx = coord_y
  1600. ; edx = 梥⠧ «¨¢ª¨
  1601. ; esi = 梥⠣࠭¨æë, ¤® ª®â®à®© ¡ã¤¥â ¨â¨ § «¨¢ª 
  1602. ; edi = buf_struc
  1603. ;output:
  1604. ; eax = ¯®àâ¨âáï
  1605. align 4
  1606. buf_flood_fill_recurs_0:
  1607.         call get_pixel_24
  1608.         cmp eax,0xffffffff ;if error coords
  1609.         je .end_fun
  1610.         cmp eax,edx ;¥á«¨ 梥⠯¨ªá¥«ï ᮢ¯ « á 梥⮬ § «¨¢ª¨, §­ ç¨â § «¨¢ª  ¢ í⮩ ®¡« á⨠㦥 ¡ë«  ᤥ« ­ 
  1611.         je .end_fun
  1612.  
  1613.                 call draw_pixel
  1614.  
  1615.                 dec ebx
  1616.                 call get_pixel_24
  1617.                 cmp eax,esi
  1618.                 je @f
  1619.                         call buf_flood_fill_recurs_0
  1620.                 @@:
  1621.                 inc ebx
  1622.  
  1623.  
  1624.                 inc ebx
  1625.                 call get_pixel_24
  1626.                 cmp eax,esi
  1627.                 je @f
  1628.                         call buf_flood_fill_recurs_0
  1629.                 @@:
  1630.                 dec ebx
  1631.  
  1632.                 dec ecx
  1633.                 call get_pixel_24
  1634.                 cmp eax,esi
  1635.                 je @f
  1636.                         call buf_flood_fill_recurs_0
  1637.                 @@:
  1638.                 inc ecx
  1639.  
  1640.                 inc ecx
  1641.                 call get_pixel_24
  1642.                 cmp eax,esi
  1643.                 je @f
  1644.                         call buf_flood_fill_recurs_0
  1645.                 @@:
  1646.                 dec ecx
  1647.  
  1648.         .end_fun:
  1649.         ret
  1650.  
  1651. ;input:
  1652. ; ebx = coord_x
  1653. ; ecx = coord_y
  1654. ; edx = 梥⠧ «¨¢ª¨
  1655. ; esi = 梥⠯¨ªá¥«¥©, ¯® ª®â®àë¬ ¡ã¤¥â ¨â¨ § «¨¢ª 
  1656. ; edi = buf_struc
  1657. ;output:
  1658. ; eax = ¯®àâ¨âáï
  1659. align 4
  1660. buf_flood_fill_recurs_1:
  1661.         call get_pixel_24
  1662.         cmp eax,0xffffffff ;if error coords
  1663.         je .end_fun
  1664.         cmp eax,edx ;¥á«¨ 梥⠯¨ªá¥«ï ᮢ¯ « á 梥⮬ § «¨¢ª¨, §­ ç¨â § «¨¢ª  ¢ í⮩ ®¡« á⨠㦥 ¡ë«  ᤥ« ­ 
  1665.         je .end_fun
  1666.         cmp eax,esi ;¥á«¨ 梥⠯¨ªá¥«ï ­¥ ᮢ¯ « á § «¨¢ ¥¬ë¬ 梥⮬ § «¨¢ª¨, â® ¯à¥ªà é ¥¬ § «¨¢ªã
  1667.         jne .end_fun
  1668.  
  1669.                 call draw_pixel
  1670.  
  1671.                 dec ebx
  1672.                 call get_pixel_24
  1673.                 cmp eax,esi
  1674.                 jne @f
  1675.                         call buf_flood_fill_recurs_1
  1676.                 @@:
  1677.                 inc ebx
  1678.  
  1679.  
  1680.                 inc ebx
  1681.                 call get_pixel_24
  1682.                 cmp eax,esi
  1683.                 jne @f
  1684.                         call buf_flood_fill_recurs_1
  1685.                 @@:
  1686.                 dec ebx
  1687.  
  1688.                 dec ecx
  1689.                 call get_pixel_24
  1690.                 cmp eax,esi
  1691.                 jne @f
  1692.                         call buf_flood_fill_recurs_1
  1693.                 @@:
  1694.                 inc ecx
  1695.  
  1696.                 inc ecx
  1697.                 call get_pixel_24
  1698.                 cmp eax,esi
  1699.                 jne @f
  1700.                         call buf_flood_fill_recurs_1
  1701.                 @@:
  1702.                 dec ecx
  1703.  
  1704.         .end_fun:
  1705.         ret
  1706.  
  1707. ;äã­ªæ¨ï ¤«ï à¨á®¢ ­¨ï â®çª¨
  1708. align 4
  1709. proc buf_set_pixel uses ebx ecx edx edi, buf_struc:dword, coord_x:dword, coord_y:dword, color:dword
  1710.         mov edi,dword[buf_struc]
  1711.         mov ebx,dword[coord_x]
  1712.         mov ecx,dword[coord_y]
  1713.         mov edx,dword[color]
  1714.         call draw_pixel
  1715.         ret
  1716. endp
  1717.  
  1718. ;output:
  1719. ; eax = 梥â â®çª¨
  1720. ; ¢ á«ãç ¥ ®è¨¡ª¨ eax = 0xffffffff
  1721. align 4
  1722. proc buf_get_pixel uses ebx ecx edi, buf_struc:dword, coord_x:dword, coord_y:dword
  1723.         mov edi,dword[buf_struc]
  1724.         mov ebx,[coord_x]
  1725.         mov ecx,[coord_y]
  1726.  
  1727.         cmp buf2d_bits,8
  1728.         jne @f
  1729.                 call get_pixel_8
  1730.                 jmp .end_fun
  1731.         @@:
  1732.         cmp buf2d_bits,24
  1733.         jne @f
  1734.                 call get_pixel_24
  1735.                 jmp .end_fun
  1736.         @@:
  1737.         cmp buf2d_bits,32
  1738.         jne @f
  1739.                 call get_pixel_32
  1740.                 ;jmp .end_fun
  1741.         @@:
  1742.         .end_fun:
  1743.         ret
  1744. endp
  1745.  
  1746. align 4
  1747. proc buf_img_wdiv2, buf_struc:dword
  1748.         pushad
  1749.         mov edi,dword[buf_struc]
  1750.         cmp buf2d_bits,24
  1751.         jne .end_draw_24
  1752.                 mov eax,buf2d_w
  1753.                 mov ecx,buf2d_h
  1754.                 imul ecx,eax
  1755.                 stdcall img_rgb24_wdiv2, buf2d_data,ecx
  1756.         .end_draw_24:
  1757.         popad
  1758.         ret
  1759. endp
  1760.  
  1761. ;input:
  1762. ;data_rgb - pointer to rgb data
  1763. ;size - count img pixels (size img data / 3(rgb) )
  1764. align 4
  1765. proc img_rgb24_wdiv2 data_rgb:dword, size:dword
  1766.   ;push eax ebx ecx edx
  1767.   mov eax,dword[data_rgb]
  1768.   mov ecx,dword[size] ;ecx = size
  1769.   lea ecx,[ecx+ecx*2]
  1770.   cld
  1771.   @@: ;§ â¥¬­¥­¨¥ æ¢¥â  ¯¨ªá¥«¥©
  1772.                 shr byte[eax],1
  1773.                 inc eax
  1774.                 loop @b
  1775.  
  1776.   mov eax,dword[data_rgb]
  1777.   mov ecx,dword[size] ;ecx = size
  1778.   shr ecx,1
  1779.   @@: ;á«®¦¥­¨¥ 梥⮢ ¯¨ªá¥«¥©
  1780.                 mov bx,word[eax+3] ;ª®¯¨à㥬 梥â á®á¥¤­¥£® ¯¨ªá¥«ï
  1781.                 add word[eax],bx
  1782.                 mov bl,byte[eax+5] ;ª®¯¨à㥬 梥â á®á¥¤­¥£® ¯¨ªá¥«ï
  1783.                 add byte[eax+2],bl
  1784.                 add eax,6 ;=2*3
  1785.                 loop @b
  1786.  
  1787.   mov eax,dword[data_rgb]
  1788.   add eax,3
  1789.   mov ebx,eax
  1790.   add ebx,3
  1791.   mov ecx,dword[size] ;ecx = size
  1792.   shr ecx,1
  1793.   dec ecx ;«¨è­¨© ¯¨ªá¥«ì
  1794.   @@: ;¯®¤¦ â¨¥ ¯¨ªá¥«¥©
  1795.                 mov edx,dword[ebx]
  1796.                 mov word[eax],dx
  1797.                 shr edx,16
  1798.                 mov byte[eax+2],dl
  1799.  
  1800.                 add eax,3
  1801.                 add ebx,6
  1802.                 loop @b
  1803.   ;pop edx ecx ebx eax
  1804.   ret
  1805. endp
  1806.  
  1807. align 4
  1808. proc buf_img_hdiv2, buf_struc:dword
  1809.         pushad
  1810.         mov edi,dword[buf_struc]
  1811.         cmp buf2d_bits,24
  1812.         jne .end_draw_24
  1813.                 mov eax,buf2d_w
  1814.                 mov ecx,buf2d_h
  1815.                 imul ecx,eax
  1816.                 stdcall img_rgb24_hdiv2, buf2d_data,ecx,eax
  1817.         .end_draw_24:
  1818.         popad
  1819.         ret
  1820. endp
  1821.  
  1822. ;input:
  1823. ;data_rgb - pointer to rgb data
  1824. ;size - count img pixels (size img data / 3(rgb) )
  1825. ;size_w - width img in pixels
  1826. align 4
  1827. proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword
  1828.   ;pushad
  1829.  
  1830.   mov eax,dword[data_rgb] ;eax =
  1831.   mov ecx,dword[size]     ;ecx = size
  1832.   lea ecx,[ecx+ecx*2]
  1833.   cld
  1834.   @@: ;§ â¥¬­¥­¨¥ æ¢¥â  ¯¨ªá¥«¥©
  1835.     shr byte[eax],1
  1836.     inc eax
  1837.     loop @b
  1838.  
  1839.   mov eax,dword[data_rgb] ;eax =
  1840.   mov edi,dword[size_w]
  1841.   lea esi,[edi+edi*2] ;esi = width*3(rgb)
  1842.   mov ebx,esi
  1843.   add ebx,eax
  1844.   mov ecx,dword[size]  ;ecx = size
  1845.   shr ecx,1
  1846.   xor edi,edi
  1847.   @@: ;á«®¦¥­¨¥ 梥⮢ ¯¨ªá¥«¥©
  1848.     mov dx,word[ebx] ;ª®¯¨à㥬 梥⠭¨¦­¥£® ¯¨ªá¥«ï
  1849.     add word[eax],dx
  1850.     mov dl,byte[ebx+2] ;ª®¯¨à㥬 梥⠭¨¦­¥£® ¯¨ªá¥«ï
  1851.     add byte[eax+2],dl
  1852.  
  1853.     add eax,3
  1854.     add ebx,3
  1855.     inc edi
  1856.     cmp edi,dword[size_w]
  1857.     jl .old_line
  1858.       add eax,esi
  1859.       add ebx,esi
  1860.       xor edi,edi
  1861.     .old_line:
  1862.     loop @b
  1863.  
  1864.  
  1865.   mov eax,dword[data_rgb] ;eax =
  1866.   add eax,esi ;esi = width*3(rgb)
  1867.   mov ebx,esi
  1868.   add ebx,eax
  1869.   mov ecx,dword[size] ;ecx = size
  1870.   shr ecx,1
  1871.   sub ecx,dword[size_w] ;«¨è­ïï áâப  ¯¨ªá¥«¥©
  1872.   xor edi,edi
  1873.   @@: ;¯®¤¦ â¨¥ ¯¨ªá¥«¥©
  1874.     mov edx,dword[ebx] ;ª®¯¨à㥬 梥⠭¨¦­¥£® ¯¨ªá¥«ï
  1875.     mov word[eax],dx
  1876.     shr edx,16
  1877.     mov byte[eax+2],dl
  1878.  
  1879.     add eax,3
  1880.     add ebx,3
  1881.     inc edi
  1882.     cmp edi,dword[size_w]
  1883.     jl .old_line_2
  1884.       add ebx,esi
  1885.       xor edi,edi
  1886.     .old_line_2:
  1887.     loop @b
  1888.  
  1889.   ;popad
  1890.   ret
  1891. endp
  1892.  
  1893. ;¯à¥®¡à §®¢ ­¨¥ ¡ãä¥à  ¨§ 24-¡¨â­®£® ¢ 8-¡¨â­ë©
  1894. ; spectr - ®¯à¥¤¥«ï¥â ª ª®© ᯥªâà ¡à âì ¯à¨ ¯à¥®¡à §®¢ ­¨¨ 0-ᨭ¨©, 1-§¥«¥­ë©, 2-ªà á­ë©
  1895. align 4
  1896. proc buf_conv_24_to_8, buf_struc:dword, spectr:dword
  1897.         pushad
  1898.         mov edi,dword[buf_struc]
  1899.         cmp buf2d_bits,24
  1900.         jne .error
  1901.                 mov eax,buf2d_w
  1902.                 mov ecx,buf2d_h
  1903.                 imul ecx,eax
  1904.                 mov esi,ecx
  1905.                 ;ebx - ¯ ¬ïâì ¨§ ª®â®à®© ª®¯¨àã¥âáï
  1906.                 ;edx - ¯ ¬ïâì ªã¤  ª®¯¨àã¥âáï
  1907.                 mov edx,buf2d_data
  1908.                 mov ebx,edx
  1909.                 cmp [spectr],3
  1910.                 jge @f
  1911.                         add ebx,[spectr]
  1912.                 @@:
  1913.                         mov al,byte[ebx]
  1914.                         mov byte[edx],al
  1915.                         add ebx,3
  1916.                         inc edx
  1917.                         loop @b
  1918.                 mov buf2d_bits,8
  1919.                 invoke mem.realloc,buf2d_data,esi ;㬥­ìè ¥¬ ¯ ¬ïâì § ­¨¬ ¥¬ãî ¡ãä¥à®¬
  1920.                 jmp .end_conv
  1921.         .error:
  1922.                 stdcall print_err,sz_buf2d_conv_24_to_8,txt_err_n24b
  1923.         .end_conv:
  1924.         popad
  1925.         ret
  1926. endp
  1927.  
  1928. ;¯à¥®¡à §®¢ ­¨¥ ¡ãä¥à  ¨§ 24-¡¨â­®£® ¢ 32-¡¨â­ë©
  1929. align 4
  1930. proc buf_conv_24_to_32, buf_struc:dword, buf_str8:dword
  1931.         pushad
  1932.         mov edi,dword[buf_struc]
  1933.         cmp buf2d_bits,24
  1934.         jne .error1
  1935.                 mov ecx,buf2d_w
  1936.                 mov ebx,buf2d_h
  1937.                 imul ebx,ecx
  1938.                 mov ecx,ebx ;ecx = size  8 b
  1939.                 shl ebx,2   ;ebx = size 32 b
  1940.                 invoke mem.realloc,buf2d_data,ebx ;㢥«¨ç¨¢ ¥¬ ¯ ¬ïâì § ­¨¬ ¥¬ãî ¡ãä¥à®¬
  1941.                 mov buf2d_data,eax ;­  á«ãç © ¥á«¨ ¨§¬¥­¨«áï 㪠§ â¥«ì ­  ¤ ­­ë¥
  1942.                 mov buf2d_bits,32
  1943.                 mov edx,ebx ;edx = size 32 b
  1944.                 sub ebx,ecx ;ebx = size 24 b
  1945.                 mov eax,ecx
  1946.                 ;eax - à §¬¥à  8 ¡¨â­ëå ¤ ­­ëå
  1947.                 ;ebx - à §¬¥à 24 ¡¨â­ëå ¤ ­­ëå
  1948.                 ;edx - à §¬¥à 32 ¡¨â­ëå ¤ ­­ëå
  1949.                 add ebx,buf2d_data
  1950.                 add edx,buf2d_data
  1951.                 mov edi,dword[buf_str8]
  1952.                 cmp buf2d_bits,8
  1953.                 jne .error2
  1954.                 add eax,buf2d_data
  1955.                 mov edi,edx
  1956.                 ;eax - 㪠§ â¥«ì ­  ª®­¥æ  8 ¡¨â­ëå ¤ ­­ëå
  1957.                 ;ebx - 㪠§ â¥«ì ­  ª®­¥æ 24 ¡¨â­ëå ¤ ­­ëå
  1958.                 ;edi - 㪠§ â¥«ì ­  ª®­¥æ 32 ¡¨â­ëå ¤ ­­ëå
  1959.                 @@:
  1960.                         sub edi,4 ;®â­¨¬ ¥¬ ¢ ­ ç «¥ 横« ,
  1961.                         sub ebx,3 ; ¯®â®¬ã, ç⮠㪠§ â¥«¨ áâ®ïâ
  1962.                         dec eax   ; §  ¯à¥¤¥« ¬¨ ¡ãä¥à®¢
  1963.                         mov edx,dword[ebx]
  1964.                         mov dword[edi],edx
  1965.                         mov dl,byte[eax]
  1966.                         mov byte[edi+3],dl
  1967.                         loop @b
  1968.  
  1969.                 jmp .end_conv
  1970.         .error1:
  1971.                 stdcall print_err,sz_buf2d_conv_24_to_32,txt_err_n24b
  1972.                 jmp .end_conv
  1973.         .error2:
  1974.                 stdcall print_err,sz_buf2d_conv_24_to_32,txt_err_n8b
  1975.         .end_conv:
  1976.         popad
  1977.         ret
  1978. endp
  1979.  
  1980. ;äã­ªæ¨ï ª®¯¨àã¥â ¨§®¡à ¦¥­¨¥ ¨§ ¡ãä¥à  buf_source (24b|32b) ¢ buf_destination (24b)
  1981. ; 㪠§ë¢ îâáï ª®®à¤¨­ âë ¢áâ ¢ª¨ ¡ãä¥à  buf_source ®â­®á¨â¥«ì­® buf_destination
  1982. ; ¯à®§à ç­®áâì ¯à¨ ª®¯¨à®¢ ­¨¨ ­¥ ãç¨â뢠¥âáï
  1983. align 4
  1984. proc buf_bit_blt, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword
  1985.         locals
  1986.                 right_bytes dd ?
  1987.         endl
  1988.         pushad
  1989.  
  1990.         mov edi,[buf_source]
  1991.         cmp buf2d_bits,24
  1992.         je .sou24
  1993.         cmp buf2d_bits,32
  1994.         je .sou32
  1995.                 jmp .copy_end ;ä®à¬ â ¡ãä¥à  ­¥ ¯®®¤¥à¦¨¢ ¥âáï
  1996.  
  1997.         .sou24: ;¢ ¨áâ®ç­¨ª¥ 24 ¡¨â­ ï ª à⨭ª 
  1998.         mov eax,buf2d_w
  1999.         mov edx,buf2d_h ;¢ëá®â  ª®¯¨à㥬®© ª à⨭ª¨
  2000.         mov esi,buf2d_data ;¤ ­­ë¥ ª®¯¨à㥬®© ª à⨭ª¨
  2001.  
  2002.         mov edi,[buf_destination]
  2003.         cmp buf2d_bits,24
  2004.         jne .copy_end ;ä®à¬ â ¡ãä¥à  ­¥ ¯®®¤¥à¦¨¢ ¥âáï
  2005.         mov ebx,[coord_x] ;¢ ebx ¢à¥¬¥­­® áâ ¢¨¬ ®âáâ㯠¨§®¡à ¦¥­¨ï (¤«ï ¯à®¢¥àª¨)
  2006.         cmp ebx,buf2d_w   ;¯à®¢¥à塞 ¢« §¨â «¨ ¨§®¡à ¦¥­¨¥ ¯® è¨à¨­¥
  2007.         jge .copy_end     ;¥á«¨ ¨§®¡à ¦¥­¨¥ ¯®«­®áâìî ¢ë« §¨â §  ¯à ¢ãî áâ®à®­ã
  2008.                 mov ebx,buf2d_h ;ebx - ¢ëá®â  ®á­®¢­®£® ¡ãä¥à 
  2009.                 mov ecx,[coord_y]
  2010.                 cmp ecx,0
  2011.                 jge @f
  2012.                         ;¥á«¨ ª®®à¤¨­ â  coord_y<0 (1-ï ­ áâனª )
  2013.                         add edx,ecx ;㬥­ìè ¥¬ ¢ëá®âã ª®¯¨à㥬®© ª à⨭ª¨
  2014.                         cmp edx,0
  2015.                         jle .copy_end ;¥á«¨ ª®¯¨à㥬®¥ ¨§®¡à ¦¥­¨¥ ­ å®¤¨âáï ¯®«­®áâìî ­ ¤ ¢¥àå­¥© £à ­¨æ¥© ¡ãä¥à  (coord_y<0 ¨ |coord_y|>buf_source.h)
  2016.                         neg ecx
  2017.                         ;inc ecx
  2018.                         imul ecx,eax
  2019.                         lea ecx,[ecx+ecx*2] ;¯® 3 ¡ ©â  ­  ¯¨ªá¥«ì
  2020.                         add esi,ecx ;ᤢ¨£ ¥¬ 㪠§ â¥«ì á ª®¯¨à㥬묨 ¤ ­­ë¬¨, á ãç¥â®¬ ¯à®¯ã襭®© ç áâ¨
  2021.                         xor ecx,ecx ;®¡­ã«ï¥¬ ª®®à¤¨­ âã coord_y
  2022.                 @@:
  2023.                 cmp ecx,ebx
  2024.                 jge .copy_end ;¥á«¨ ª®®à¤¨­ â  'y' ¡®«ìè¥ ¢ëá®âë ¡ãä¥à 
  2025.                 add ecx,edx ;ecx - ­¨¦­ïï ª®®à¤¨­ â  ª®¯¨à㥬®© ª à⨭ª¨
  2026.                 cmp ecx,ebx
  2027.                 jle @f
  2028.                         sub ecx,ebx
  2029.                         sub edx,ecx ;㬥­ìè ¥¬ ¢ëá®âã ª®¯¨à㥬®© ª à⨭ª¨, ¢ á«ãç¥ ª®£¤  ®­  ¢ë« §¨â §  ­¨¦­îî £à ­¨æã
  2030.                 @@:
  2031.                 mov ebx,buf2d_w
  2032.                 mov ecx,[coord_y] ;ecx ¨á¯®«ì§ã¥¬ ¤«ï ¢à¥¬¥­­ëå 楫¥©
  2033.                 cmp ecx,0
  2034.                 jg .end_otr_c_y_24
  2035.                         ;¥á«¨ ª®®à¤¨­ â  coord_y<=0 (2-ï ­ áâனª )
  2036.                         mov ecx,[coord_x]
  2037.                         jmp @f
  2038.                 .end_otr_c_y_24:
  2039.                 imul ecx,ebx
  2040.                 add ecx,[coord_x]
  2041.                 @@:
  2042.                 lea ecx,[ecx+ecx*2]
  2043.                 add ecx,buf2d_data
  2044.                 sub ebx,eax
  2045.                 mov edi,ecx ;edi 㪠§ â¥«ì ­  ¤ ­­ë¥ ¡ãä¥à , ªã¤  ¡ã¤¥â ¯à®¨§¢®¤¨âáï ª®¯¨à®¢ ­¨¥
  2046.  
  2047.         mov [right_bytes],0
  2048.         mov ecx,[coord_x]
  2049.         cmp ecx,ebx
  2050.         jl @f
  2051.                 sub ecx,ebx
  2052.                 sub eax,ecx ;㪮à ç¨¢ ¥¬ ª®¯¨à㥬ãî áâபã
  2053.                 add ebx,ecx ;㤫¨­­ï¥¬ áâப㠤«ï ᤢ¨£  £« ¢­®© ª à⨭ª¨ ¡ãä¥à 
  2054.                 lea ecx,[ecx+ecx*2] ;ecx - ç¨á«® ¡ ©â ¢ 1-© áâப¥ ª à⨭ª¨, ª®â®àë¥ ¢ë« §ïâ §  ¯à ¢ãî áâ®à®­ã
  2055.                 mov [right_bytes],ecx
  2056.         @@:
  2057.  
  2058.         lea eax,[eax+eax*2] ;ª®««¨ç¥á⢮ ¡ ©â ¢ 1-© áâப¥ ª®¯¨à㥬®© ª à⨭ª¨
  2059.         lea ebx,[ebx+ebx*2] ;ª®««¨ç¥á⢮ ¡ ©â ¢ 1-© áâப¥ ¡ãä¥à  ¬¨­ãá ç¨á«® ¡ ©â ¢ 1-© áâப¥ ª®¯¨à㥬®© ª à⨭ª¨
  2060.  
  2061.         cld
  2062.         cmp [right_bytes],0
  2063.         jg .copy_1
  2064.         .copy_0: ;¯à®á⮥ ª®¯¨à®¢ ­¨¥
  2065.                 mov ecx,eax
  2066.                 rep movsb
  2067.                 add edi,ebx
  2068.                 dec edx
  2069.                 cmp edx,0
  2070.                 jg .copy_0
  2071.         jmp .copy_end
  2072.         .copy_1: ;­¥ ¯à®á⮥ ª®¯¨à®¢ ­¨¥ (ª à⨭ª  ¢ë« §¨â §  ¯à ¢ãî áâ®à®­ã)
  2073.                 mov ecx,eax
  2074.                 rep movsb
  2075.                 add edi,ebx
  2076.                 add esi,[right_bytes] ;¤®¡ ¢«ï¥¬ ¡ ©âë, ª®â®àë¥ ¢ë« §ïâ §  ¯à ¢ãî £à ­¨æã
  2077.                 dec edx
  2078.                 cmp edx,0
  2079.                 jg .copy_1
  2080.         jmp .copy_end
  2081.  
  2082.         .sou32: ;¢ ¨áâ®ç­¨ª¥ 32 ¡¨â­ ï ª à⨭ª 
  2083.         mov eax,buf2d_w
  2084.         mov edx,buf2d_h ;¢ëá®â  ª®¯¨à㥬®© ª à⨭ª¨
  2085.         mov esi,buf2d_data ;¤ ­­ë¥ ª®¯¨à㥬®© ª à⨭ª¨
  2086.  
  2087.         mov edi,[buf_destination]
  2088.         cmp buf2d_bits,24
  2089.         jne .copy_end ;ä®à¬ â ¡ãä¥à  ­¥ ¯®®¤¥à¦¨¢ ¥âáï
  2090.         mov ebx,[coord_x] ;¢ ebx ¢à¥¬¥­­® áâ ¢¨¬ ®âáâ㯠¨§®¡à ¦¥­¨ï (¤«ï ¯à®¢¥àª¨)
  2091.         cmp ebx,buf2d_w   ;¯à®¢¥à塞 ¢« §¨â «¨ ¨§®¡à ¦¥­¨¥ ¯® è¨à¨­¥
  2092.         jge .copy_end     ;¥á«¨ ¨§®¡à ¦¥­¨¥ ¯®«­®áâìî ¢ë« §¨â §  ¯à ¢ãî áâ®à®­ã
  2093.                 mov ebx,buf2d_h ;ebx - ¢ëá®â  ®á­®¢­®£® ¡ãä¥à 
  2094.                 mov ecx,[coord_y]
  2095.                 cmp ecx,0
  2096.                 jge @f
  2097.                         ;¥á«¨ ª®®à¤¨­ â  coord_y<0 (1-ï ­ áâனª )
  2098.                         add edx,ecx ;㬥­ìè ¥¬ ¢ëá®âã ª®¯¨à㥬®© ª à⨭ª¨
  2099.                         cmp edx,0
  2100.                         jle .copy_end ;¥á«¨ ª®¯¨à㥬®¥ ¨§®¡à ¦¥­¨¥ ­ å®¤¨âáï ¯®«­®áâìî ­ ¤ ¢¥àå­¥© £à ­¨æ¥© ¡ãä¥à  (coord_y<0 ¨ |coord_y|>buf_source.h)
  2101.                         neg ecx
  2102.                         ;inc ecx
  2103.                         imul ecx,eax
  2104.                         shl ecx,2 ;¯® 4 ¡ ©â  ­  ¯¨ªá¥«ì
  2105.                         add esi,ecx ;ᤢ¨£ ¥¬ 㪠§ â¥«ì á ª®¯¨à㥬묨 ¤ ­­ë¬¨, á ãç¥â®¬ ¯à®¯ã襭®© ç áâ¨
  2106.                         xor ecx,ecx ;®¡­ã«ï¥¬ ª®®à¤¨­ âã coord_y
  2107.                 @@:
  2108.                 cmp ecx,ebx
  2109.                 jge .copy_end ;¥á«¨ ª®®à¤¨­ â  'y' ¡®«ìè¥ ¢ëá®âë ¡ãä¥à 
  2110.                 add ecx,edx ;ecx - ­¨¦­ïï ª®®à¤¨­ â  ª®¯¨à㥬®© ª à⨭ª¨
  2111.                 cmp ecx,ebx
  2112.                 jle @f
  2113.                         sub ecx,ebx
  2114.                         sub edx,ecx ;㬥­ìè ¥¬ ¢ëá®âã ª®¯¨à㥬®© ª à⨭ª¨, ¢ á«ãç¥ ª®£¤  ®­  ¢ë« §¨â §  ­¨¦­îî £à ­¨æã
  2115.                 @@:
  2116.                 mov ebx,buf2d_w
  2117.                 ;mov ecx,ebx ;ecx ¨á¯®«ì§ã¥¬ ¤«ï ¢à¥¬¥­­ëå 楫¥©
  2118.                 ;imul ecx,[coord_y]
  2119.                 ;add ecx,[coord_x]
  2120.                 mov ecx,[coord_y] ;ecx ¨á¯®«ì§ã¥¬ ¤«ï ¢à¥¬¥­­ëå 楫¥©
  2121.                 cmp ecx,0
  2122.                 jg .end_otr_c_y_32
  2123.                         ;¥á«¨ ª®®à¤¨­ â  coord_y<=0 (2-ï ­ áâனª )
  2124.                         mov ecx,[coord_x]
  2125.                         jmp @f
  2126.                 .end_otr_c_y_32:
  2127.                 imul ecx,ebx
  2128.                 add ecx,[coord_x]
  2129.                 @@:
  2130.                 lea ecx,[ecx+ecx*2]
  2131.                 add ecx,buf2d_data
  2132.                 sub ebx,eax
  2133.                 mov edi,ecx ;edi 㪠§ â¥«ì ­  ¤ ­­ë¥ ¡ãä¥à , ªã¤  ¡ã¤¥â ¯à®¨§¢®¤¨âáï ª®¯¨à®¢ ­¨¥
  2134.  
  2135.         mov [right_bytes],0
  2136.         mov ecx,[coord_x]
  2137.         cmp ecx,ebx
  2138.         jl @f
  2139.                 sub ecx,ebx
  2140.                 sub eax,ecx ;㪮à ç¨¢ ¥¬ ª®¯¨à㥬ãî áâபã
  2141.                 add ebx,ecx ;㤫¨­­ï¥¬ áâப㠤«ï ᤢ¨£  £« ¢­®© ª à⨭ª¨ ¡ãä¥à 
  2142.                 shl ecx,2 ;ecx - ç¨á«® ¡ ©â ¢ 1-© áâப¥ ª à⨭ª¨, ª®â®àë¥ ¢ë« §ïâ §  ¯à ¢ãî áâ®à®­ã
  2143.                 mov [right_bytes],ecx
  2144.         @@:
  2145.  
  2146.         ;eax - ª®««¨ç¥á⢮ ¯¨ªá¥«¥© ¢ 1-© áâப¥ ª®¯¨à㥬®© ª à⨭ª¨
  2147.         lea ebx,[ebx+ebx*2] ;ª®««¨ç¥á⢮ ¡ ©â ¢ 1-© áâப¥ ¡ãä¥à  ¬¨­ãá ç¨á«® ¡ ©â ¢ 1-© áâப¥ ª®¯¨à㥬®© ª à⨭ª¨
  2148.  
  2149.         cld
  2150.         cmp [right_bytes],0
  2151.         jg .copy_3
  2152.         .copy_2: ;¯à®á⮥ ª®¯¨à®¢ ­¨¥
  2153.                 mov ecx,eax
  2154.                 @@:
  2155.                         movsw
  2156.                         movsb
  2157.                         inc esi
  2158.                         loop @b
  2159.                 add edi,ebx
  2160.                 dec edx
  2161.                 cmp edx,0
  2162.                 jg .copy_2
  2163.         jmp .copy_end
  2164.         .copy_3: ;­¥ ¯à®á⮥ ª®¯¨à®¢ ­¨¥ (ª à⨭ª  ¢ë« §¨â §  ¯à ¢ãî áâ®à®­ã)
  2165.                 mov ecx,eax
  2166.                 @@:
  2167.                         movsw
  2168.                         movsb
  2169.                         inc esi
  2170.                         loop @b
  2171.                 add edi,ebx
  2172.                 add esi,[right_bytes] ;¤®¡ ¢«ï¥¬ ¡ ©âë, ª®â®àë¥ ¢ë« §ïâ §  ¯à ¢ãî £à ­¨æã
  2173.                 dec edx
  2174.                 cmp edx,0
  2175.                 jg .copy_3
  2176.  
  2177.         .copy_end:
  2178.         popad
  2179.         ret
  2180. endp
  2181.  
  2182. ;input:
  2183. ; esi = pointer to color1 + transparent
  2184. ; edi = pointer to background color2
  2185. ;output:
  2186. ; [edi] = combine color
  2187. align 4
  2188. combine_colors:
  2189.         push ax bx cx dx
  2190.         mov bx,0x00ff ;---get transparent---
  2191.         movzx cx,byte[esi+3] ;pro
  2192.         sub bx,cx ;256-pro
  2193.         ;---blye---
  2194.         movzx ax,byte[esi]
  2195.         imul ax,bx
  2196.         movzx dx,byte[edi]
  2197.         imul dx,cx
  2198.         add ax,dx
  2199.         mov byte[edi],ah
  2200.         ;---green---
  2201.         movzx ax,byte[esi+1]
  2202.         imul ax,bx
  2203.         movzx dx,byte[edi+1]
  2204.         imul dx,cx
  2205.         add ax,dx
  2206.         mov byte[edi+1],ah
  2207.         ;---red---
  2208.         movzx ax,byte[esi+2]
  2209.         imul ax,bx
  2210.         movzx dx,byte[edi+2]
  2211.         imul dx,cx
  2212.         add ax,dx
  2213.         mov byte[edi+2],ah
  2214.  
  2215.         pop dx cx bx ax
  2216.         ret
  2217.  
  2218. ;äã­ªæ¨ï ª®¯¨àã¥â ¨§®¡à ¦¥­¨¥ ¨§ ¡ãä¥à  buf_source (32b) ¢ buf_destination (24b)
  2219. ; 㪠§ë¢ îâáï ª®®à¤¨­ âë ¢áâ ¢ª¨ ¡ãä¥à  buf_source ®â­®á¨â¥«ì­® buf_destination
  2220. ; ¯à¨ ª®¯¨à®¢ ­¨¨ ãç¨â뢠¥âáï ¯à®§à ç­®áâì
  2221. align 4
  2222. proc buf_bit_blt_transp, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword
  2223.         locals
  2224.                 right_bytes dd ?
  2225.         endl
  2226.         pushad
  2227.  
  2228.         mov edi,[buf_source]
  2229.         cmp buf2d_bits,32
  2230.         jne .copy_end ;ä®à¬ â ¡ãä¥à  ­¥ ¯®®¤¥à¦¨¢ ¥âáï
  2231.         mov eax,buf2d_w
  2232.         mov edx,buf2d_h ;¢ëá®â  ª®¯¨à㥬®© ª à⨭ª¨
  2233.         mov esi,buf2d_data ;¤ ­­ë¥ ª®¯¨à㥬®© ª à⨭ª¨
  2234.  
  2235.         mov edi,[buf_destination]
  2236.         cmp buf2d_bits,24
  2237.         jne .copy_end ;ä®à¬ â ¡ãä¥à  ­¥ ¯®®¤¥à¦¨¢ ¥âáï
  2238.                 mov ebx,buf2d_h ;ebx - ¢ëá®â  ®á­®¢­®£® ¡ãä¥à 
  2239.                 mov ecx,[coord_y]
  2240.                 cmp ecx,0
  2241.                 jge @f
  2242.                         ;¥á«¨ ª®®à¤¨­ â  coord_y<0 (1-ï ­ áâனª )
  2243.                         add edx,ecx ;㬥­ìè ¥¬ ¢ëá®âã ª®¯¨à㥬®© ª à⨭ª¨
  2244.                         cmp edx,0
  2245.                         jle .copy_end ;¥á«¨ ª®¯¨à㥬®¥ ¨§®¡à ¦¥­¨¥ ­ å®¤¨âáï ¯®«­®áâìî ­ ¤ ¢¥àå­¥© £à ­¨æ¥© ¡ãä¥à  (coord_y<0 ¨ |coord_y|>buf_source.h)
  2246.                         neg ecx
  2247.                         ;inc ecx
  2248.                         imul ecx,eax
  2249.                         shl ecx,2 ;¯® 4 ¡ ©â  ­  ¯¨ªá¥«ì
  2250.                         add esi,ecx ;ᤢ¨£ ¥¬ 㪠§ â¥«ì á ª®¯¨à㥬묨 ¤ ­­ë¬¨, á ãç¥â®¬ ¯à®¯ã襭®© ç áâ¨
  2251.                         xor ecx,ecx ;®¡­ã«ï¥¬ ª®®à¤¨­ âã coord_y
  2252.                 @@:
  2253.                 cmp ecx,ebx
  2254.                 jge .copy_end ;¥á«¨ ª®®à¤¨­ â  'y' ¡®«ìè¥ ¢ëá®âë ¡ãä¥à 
  2255.                 add ecx,edx ;ecx - ­¨¦­ïï ª®®à¤¨­ â  ª®¯¨à㥬®© ª à⨭ª¨
  2256.                 cmp ecx,ebx
  2257.                 jle @f
  2258.                         sub ecx,ebx
  2259.                         sub edx,ecx ;㬥­ìè ¥¬ ¢ëá®âã ª®¯¨à㥬®© ª à⨭ª¨, ¢ á«ãç¥ ª®£¤  ®­  ¢ë« §¨â §  ­¨¦­îî £à ­¨æã
  2260.                 @@:
  2261.                 mov ebx,buf2d_w
  2262.                 mov ecx,ebx ;ecx ¨á¯®«ì§ã¥¬ ¤«ï ¢à¥¬¥­­ëå 楫¥©
  2263.                 cmp [coord_y],0
  2264.                 jg .end_otr_c_y
  2265.                         ;¥á«¨ ª®®à¤¨­ â  coord_y<=0 (2-ï ­ áâனª )
  2266.                         mov ecx,[coord_x]
  2267.                         jmp @f
  2268.                 .end_otr_c_y:
  2269.                 imul ecx,[coord_y]
  2270.                 add ecx,[coord_x]
  2271.                 @@:
  2272.                 lea ecx,[ecx+ecx*2]
  2273.                 add ecx,buf2d_data
  2274.                 sub ebx,eax
  2275.                 mov edi,ecx ;edi 㪠§ â¥«ì ­  ¤ ­­ë¥ ¡ãä¥à , ªã¤  ¡ã¤¥â ¯à®¨§¢®¤¨âáï ª®¯¨à®¢ ­¨¥
  2276.  
  2277.         mov [right_bytes],0
  2278.         mov ecx,[coord_x]
  2279.         cmp ecx,ebx
  2280.         jl @f
  2281.                 sub ecx,ebx
  2282.                 sub eax,ecx ;㪮à ç¨¢ ¥¬ ª®¯¨à㥬ãî áâபã
  2283.                 add ebx,ecx ;㤫¨­­ï¥¬ áâப㠤«ï ᤢ¨£  £« ¢­®© ª à⨭ª¨ ¡ãä¥à 
  2284.                 shl ecx,2 ;ecx - ç¨á«® ¡ ©â ¢ 1-© áâப¥ ª à⨭ª¨, ª®â®àë¥ ¢ë« §ïâ §  ¯à ¢ãî áâ®à®­ã
  2285.                 mov [right_bytes],ecx
  2286.         @@:
  2287.  
  2288.         lea ebx,[ebx+ebx*2] ;ª®««¨ç¥á⢮ ¡ ©â ¢ 1-© áâப¥ ¡ãä¥à  ¬¨­ãá ç¨á«® ¡ ©â ¢ 1-© áâப¥ ª®¯¨à㥬®© ª à⨭ª¨
  2289.  
  2290.         cld
  2291.         cmp [right_bytes],0
  2292.         jg .copy_1
  2293.         .copy_0: ;¯à®á⮥ ª®¯¨à®¢ ­¨¥
  2294.                 mov ecx,eax
  2295.                 @@:
  2296.                         call combine_colors
  2297.                         add edi,3
  2298.                         add esi,4
  2299.                         loop @b
  2300.                 add edi,ebx
  2301.                 dec edx
  2302.                 cmp edx,0
  2303.                 jg .copy_0
  2304.         jmp .copy_end
  2305.         .copy_1: ;­¥ ¯à®á⮥ ª®¯¨à®¢ ­¨¥ (ª à⨭ª  ¢ë« §¨â §  ¯à ¢ãî áâ®à®­ã)
  2306.                 mov ecx,eax
  2307.                 @@:
  2308.                         call combine_colors
  2309.                         add edi,3
  2310.                         add esi,4
  2311.                         loop @b
  2312.                 add edi,ebx
  2313.                 add esi,[right_bytes] ;¤®¡ ¢«ï¥¬ ¡ ©âë, ª®â®àë¥ ¢ë« §ïâ §  ¯à ¢ãî £à ­¨æã
  2314.                 dec edx
  2315.                 cmp edx,0
  2316.                 jg .copy_1
  2317.  
  2318.         .copy_end:
  2319.         popad
  2320.         ret
  2321. endp
  2322.  
  2323. ;input:
  2324. ; ebx - color1
  2325. ; esi = pointer to transparent
  2326. ; edi = pointer to background color2
  2327. ;output:
  2328. ; [edi] = combine color
  2329. align 4
  2330. combine_colors_2:
  2331.         push ax ebx cx dx si
  2332.         mov cl,byte[esi] ;pro
  2333.         xor ch,ch
  2334.         mov si,0x00ff ;---get transparent---
  2335.         sub si,cx ;256-pro
  2336.  
  2337.                 ;---blye---
  2338.                 movzx ax,bl
  2339.                 shr ebx,8
  2340.                 imul ax,si
  2341.                 movzx dx,byte[edi]
  2342.                 imul dx,cx
  2343.                 add ax,dx
  2344.                 mov byte[edi],ah
  2345.                 ;---green---
  2346.                 movzx ax,bl
  2347.                 shr ebx,8
  2348.                 imul ax,si
  2349.                 movzx dx,byte[edi+1]
  2350.                 imul dx,cx
  2351.                 add ax,dx
  2352.                 mov byte[edi+1],ah
  2353.                 ;---red---
  2354.                 movzx ax,bl
  2355.                 imul ax,si
  2356.                 movzx dx,byte[edi+2]
  2357.                 imul dx,cx
  2358.                 add ax,dx
  2359.                 mov byte[edi+2],ah
  2360.  
  2361.         pop si dx cx ebx ax
  2362.         ret
  2363.  
  2364. ;äã­ªæ¨ï ª®¯¨àã¥â ¨§®¡à ¦¥­¨¥ ¨§ ¡ãä¥à  buf_source (8b) ¢ buf_destination (24b)
  2365. ; 㪠§ë¢ îâáï ª®®à¤¨­ âë ¢áâ ¢ª¨ ¡ãä¥à  buf_source ®â­®á¨â¥«ì­® buf_destination
  2366. align 4
  2367. proc buf_bit_blt_alpha, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword, color:dword
  2368.         locals
  2369.                 lost_bytes dd ? ;ç¨á«® ¯®â¥àï­­ëå ¡ ©â®¢ ¢ áâப¥ ª®¯¨à㥬®£® ¨§®¡à ¦¥­ï (â¥å çâ® ­¥ ¢« §ïâ ¢ ¡ãä¥à)
  2370.                 dest_w_bytes dd ? ;ª®««¨ç¥á⢮ ¡ ©â ¢ ¡ãä¥à¥ ¯à¨¥¬­¨ª¥ ¯® è¨à¨­¥ - è¨à¨­  ¢áâ ¢«ï¥¬®© ª à⨭ª¨
  2371.         endl
  2372.         pushad
  2373.  
  2374.         mov edi,[buf_source]
  2375.         cmp buf2d_bits,8
  2376.         jne .error1 ;ä®à¬ â ¡ãä¥à  ­¥ ¯®®¤¥à¦¨¢ ¥âáï
  2377.         mov eax,buf2d_w ;è¨à¨­  ª®¯¨à㥬®© ª à⨭ª¨
  2378.         mov edx,buf2d_h ;¢ëá®â  ª®¯¨à㥬®© ª à⨭ª¨
  2379.         mov esi,buf2d_data ;¤ ­­ë¥ ª®¯¨à㥬®© ª à⨭ª¨
  2380.  
  2381.         mov edi,[buf_destination]
  2382.         cmp buf2d_bits,24
  2383.         jne .error2 ;ä®à¬ â ¡ãä¥à  ­¥ ¯®®¤¥à¦¨¢ ¥âáï
  2384.         mov ebx,[coord_x] ;¢ ebx ¢à¥¬¥­­® áâ ¢¨¬ ®âáâ㯠¨§®¡à ¦¥­¨ï (¤«ï ¯à®¢¥àª¨)
  2385.         cmp ebx,buf2d_w   ;¯à®¢¥à塞 ¢« §¨â «¨ ¨§®¡à ¦¥­¨¥ ¯® è¨à¨­¥
  2386.         jge .copy_end     ;¥á«¨ ¨§®¡à ¦¥­¨¥ ¯®«­®áâìî ¢ë« §¨â §  ¯à ¢ãî áâ®à®­ã
  2387.                 mov ebx,buf2d_h ;ebx - ¢ëá®â  ®á­®¢­®£® ¡ãä¥à 
  2388.                 mov ecx,[coord_y]
  2389.                 cmp ecx,0
  2390.                 jge @f
  2391.                         ;¥á«¨ ª®®à¤¨­ â  coord_y<0 (1-ï ­ áâனª )
  2392.                         add edx,ecx ;㬥­ìè ¥¬ ¢ëá®âã ª®¯¨à㥬®© ª à⨭ª¨
  2393.                         cmp edx,0
  2394.                         jle .copy_end ;¥á«¨ ª®¯¨à㥬®¥ ¨§®¡à ¦¥­¨¥ ­ å®¤¨âáï ¯®«­®áâìî ­ ¤ ¢¥àå­¥© £à ­¨æ¥© ¡ãä¥à  (coord_y<0 ¨ |coord_y|>buf_source.h)
  2395.                         neg ecx
  2396.                         ;inc ecx
  2397.                         imul ecx,eax
  2398.                         add esi,ecx ;ᤢ¨£ ¥¬ 㪠§ â¥«ì á ª®¯¨à㥬묨 ¤ ­­ë¬¨, á ãç¥â®¬ ¯à®¯ã襭®© ç áâ¨
  2399.                         xor ecx,ecx ;®¡­ã«ï¥¬ ª®®à¤¨­ âã coord_y
  2400.                 @@:
  2401.                 cmp ecx,ebx
  2402.                 jge .copy_end ;¥á«¨ ª®®à¤¨­ â  'y' ¡®«ìè¥ ¢ëá®âë ¡ãä¥à 
  2403.                 add ecx,edx ;ecx - ­¨¦­ïï ª®®à¤¨­ â  ª®¯¨à㥬®© ª à⨭ª¨
  2404.                 cmp ecx,ebx
  2405.                 jle @f
  2406.                         sub ecx,ebx
  2407.                         sub edx,ecx ;㬥­ìè ¥¬ ¢ëá®âã ª®¯¨à㥬®© ª à⨭ª¨, ¢ á«ãç¥ ª®£¤  ®­  ¢ë« §¨â §  ­¨¦­îî £à ­¨æã
  2408.                 @@:
  2409.                 mov ebx,buf2d_w
  2410.                 mov ecx,[coord_y] ;ecx ¨á¯®«ì§ã¥¬ ¤«ï ¢à¥¬¥­­ëå 楫¥©
  2411.                 cmp ecx,0
  2412.                 jg .end_otr_c_y
  2413.                         ;¥á«¨ ª®®à¤¨­ â  coord_y<=0 (2-ï ­ áâனª )
  2414.                         mov ecx,[coord_x]
  2415.                         jmp @f
  2416.                 .end_otr_c_y:
  2417.                 imul ecx,ebx
  2418.                 add ecx,[coord_x]
  2419.                 @@:
  2420.                 lea ecx,[ecx+ecx*2]
  2421.                 add ecx,buf2d_data ;buf2d_data ¤ ­­ë¥ ®á­®¢­®£® ¡ãä¥à 
  2422.                 sub ebx,eax ;ebx - è¨à¨­  ®á­®¢­®£® ¡ãä¥à  ¬¨­ãá è¨à¨­  à¨á㥬®£® ¡ãä¥à 
  2423.                 mov edi,ecx ;edi 㪠§ â¥«ì ­  ¤ ­­ë¥ ¡ãä¥à , ªã¤  ¡ã¤¥â ¯à®¨§¢®¤¨âáï ª®¯¨à®¢ ­¨¥
  2424.  
  2425.         mov dword[lost_bytes],0
  2426.         mov ecx,[coord_x]
  2427.         cmp ecx,0
  2428.         jge @f
  2429.                 neg ecx
  2430.                 ;inc ecx
  2431.                 cmp eax,ecx ;eax - è¨à¨­  ª®¯¨à㥬®© ª à⨭ª¨
  2432.                 jle .copy_end ;¥á«¨ ª®¯¨à㥬®¥ ¨§®¡à ¦¥­¨¥ ­ å®¤¨âáï ¯®«­®áâìî §  «¥¢®© £à ­¨æ¥© ¡ãä¥à  (coord_x<0 ¨ |coord_x|>buf_source.w)
  2433.                 add [lost_bytes],ecx
  2434.                 sub eax,ecx ;㪮à ç¨¢ ¥¬ ª®¯¨à㥬ãî áâபã
  2435.                 add ebx,ecx ;㤫¨­­ï¥¬ áâப㠤«ï ᤢ¨£  £« ¢­®© ª à⨭ª¨ ¡ãä¥à 
  2436.                 add esi,ecx
  2437.                 lea ecx,[ecx+ecx*2]
  2438.                 add edi,ecx ;edi 㪠§ â¥«ì ­  ¤ ­­ë¥ ¡ãä¥à , ªã¤  ¡ã¤¥â ¯à®¨§¢®¤¨âáï ª®¯¨à®¢ ­¨¥
  2439.                 xor ecx,ecx
  2440.         @@:
  2441.         cmp ecx,ebx
  2442.         jle @f
  2443.                 sub ecx,ebx
  2444.                 sub eax,ecx ;㪮à ç¨¢ ¥¬ ª®¯¨à㥬ãî áâபã
  2445.                 add ebx,ecx ;㤫¨­­ï¥¬ áâப㠤«ï ᤢ¨£  £« ¢­®© ª à⨭ª¨ ¡ãä¥à 
  2446.                 ;ecx - ç¨á«® ¯¨ªá¥«¥© ¢ 1-© áâப¥ ª à⨭ª¨, ª®â®àë¥ ¢ë« §ïâ §  ¯à ¢ãî áâ®à®­ã
  2447.                 add [lost_bytes],ecx
  2448.         @@:
  2449.  
  2450.         lea ebx,[ebx+ebx*2] ;ª®««¨ç¥á⢮ ¡ ©â ¢ 1-© áâப¥ ¡ãä¥à  ¬¨­ãá ç¨á«® ¡ ©â ¢ 1-© áâப¥ ª®¯¨à㥬®© ª à⨭ª¨
  2451.         mov [dest_w_bytes],ebx
  2452.         mov ebx,[color]
  2453.  
  2454.         cld
  2455.         cmp dword[lost_bytes],0
  2456.         jg .copy_1
  2457.         .copy_0: ;¯à®á⮥ ª®¯¨à®¢ ­¨¥
  2458.                 mov ecx,eax
  2459.                 @@:
  2460.                         call combine_colors_2
  2461.                         add edi,3
  2462.                         inc esi
  2463.                         loop @b
  2464.                 add edi,[dest_w_bytes]
  2465.                 dec edx
  2466.                 cmp edx,0
  2467.                 jg .copy_0
  2468.         jmp .copy_end
  2469.         .copy_1: ;­¥ ¯à®á⮥ ª®¯¨à®¢ ­¨¥ (ª à⨭ª  ¢ë« §¨â §  «¥¢ãî ¨/¨«¨ ¯à ¢ãî áâ®à®­ã)
  2470.                 mov ecx,eax
  2471.                 @@:
  2472.                         call combine_colors_2
  2473.                         add edi,3
  2474.                         inc esi
  2475.                         loop @b
  2476.                 add edi,[dest_w_bytes]
  2477.                 add esi,[lost_bytes] ;¤®¡ ¢«ï¥¬ ¡ ©âë, ª®â®àë¥ ¢ë« §ïâ §  ¯à ¢ãî £à ­¨æã
  2478.                 dec edx
  2479.                 cmp edx,0
  2480.                 jg .copy_1
  2481.  
  2482.         jmp .copy_end
  2483.         .error1:
  2484.                 stdcall print_err,sz_buf2d_bit_blt_alpha,txt_err_n8b
  2485.                 jmp .copy_end
  2486.         .error2:
  2487.                 stdcall print_err,sz_buf2d_bit_blt_alpha,txt_err_n24b
  2488.         .copy_end:
  2489.         popad
  2490.         ret
  2491. endp
  2492.  
  2493. ;¯à¥®¡à §®¢ ­¨¥ 8-¡¨â­®£® ¡ãä¥à  à §¬¥à®¬ 16*16 ¢ à §¬¥à 1*256 ᨬ¢®«®¢
  2494. align 4
  2495. proc buf_convert_text_matrix, buf_struc:dword
  2496.         locals
  2497.                 tmp_mem dd ?
  2498.                 c1 dw ?
  2499.                 c2 dd ?
  2500.                 c3 dw ?
  2501.         endl
  2502.         pushad
  2503.         mov edi,dword[buf_struc]
  2504.         cmp buf2d_bits,8
  2505.         jne .error
  2506.                 mov ecx,buf2d_h
  2507.                 mov ebx,ecx
  2508.                 shr ebx,4 ;¯à¥¤¯®« £ ¥¬ çâ® ¢ ¡ãä¥à¥ 16 áâப á ᨬ¢®« ¬¨, ¯®â®¬ã ¤¥«¨¬ ­  2^4
  2509.                 mov edx,buf2d_w
  2510.                 imul ecx,edx ;ecx = size  8 b
  2511.                 invoke mem.alloc,ecx ;¢ë¤¥«ï¥¬ ¢à¥¬¥­­ãî ¯ ¬ïâì
  2512.                 mov [tmp_mem],eax ;eax - new memory
  2513.  
  2514.                 shr edx,4 ;¯à¥¤¯®« £ ¥¬ çâ® ¢ ¡ãä¥à¥ 16 ª®«®­®ª á ᨬ¢®« ¬¨, ¯®â®¬ã ¤¥«¨¬ ­  2^4
  2515.                 mov eax,ebx
  2516.                 imul ebx,edx ;¢ëç¨á«ï¥¬ ª®®«¨ç¥á⢮ ¯¨ªá¥«¥© ­  1 ᨬ¢®«
  2517.                 ;eax = bhe - ¢ëá®â  ¡ãª¢ë
  2518.                 ;ebx = bwi*bhe - ª®««¨ç¥á⢮ ¯¨ªá¥«¥© ¢ 1-© ¡ãª¢¥
  2519.                 ;edx = bwi - è¨à¨­  ¡ãª¢ë
  2520.                 ;ecx,esi,edi - ¨á¯®«ì§ãîâáï ¢ 横«¥ .c_0
  2521.                 shr buf2d_w,4
  2522.                 shl buf2d_h,4 ;¯à¥®¡à §®¢ë¢ ¥¬ à §¬¥àë ¡ãä¥à 
  2523.  
  2524.                 cld
  2525.                 mov esi,buf2d_data
  2526.                 mov edi,[tmp_mem]
  2527.                 mov word[c3],16
  2528.                 .c_3:
  2529.                         mov dword[c2],eax
  2530.                         .c_2:
  2531.                                 mov word[c1],16
  2532.                                 .c_1:
  2533.                                         mov ecx,edx ;.c_0:
  2534.                                         rep movsb
  2535.                                         add edi,ebx
  2536.                                         sub edi,edx ;edi+=(bwi*bhe-bwi)
  2537.                                         dec word[c1]
  2538.                                         cmp word[c1],0
  2539.                                         jg .c_1
  2540.                                 add edi,edx
  2541.                                 shl ebx,4
  2542.                                 sub edi,ebx ;edi-=(16*bwi*bhe-bwi)
  2543.                                 shr ebx,4
  2544.                                 dec dword[c2]
  2545.                                 cmp dword[c2],0
  2546.                                 jg .c_2
  2547.                         sub edi,ebx
  2548.                         shl ebx,4
  2549.                         add edi,ebx ;edi+=(15*bwi*bhe)
  2550.                         shr ebx,4
  2551.                         dec word[c3]
  2552.                         cmp word[c3],0
  2553.                         jg .c_3
  2554.  
  2555.                 mov edi,dword[buf_struc] ;ª®¯¨à®¢ ­¨¥ ­®¢®© ¬ âà¨æë ¢ ®á­®¢­®© ¡ãä¥à
  2556.                 mov edi,buf2d_data
  2557.                 mov esi,[tmp_mem]
  2558.                 mov ecx,ebx
  2559.                 shl ecx,8
  2560.                 rep movsb
  2561.                 invoke mem.free,[tmp_mem] ;ç¨á⨬ ¢à¥¬¥­­ãî ¯ ¬ïâì
  2562.                 jmp .end_conv
  2563.         .error:
  2564.                 stdcall print_err,sz_buf2d_convert_text_matrix,txt_err_n8b
  2565.         .end_conv:
  2566.         popad
  2567.         ret
  2568. endp
  2569.  
  2570. align 4
  2571. buf_s_matr buf_2d_header ? ;«®ª «ì­ ï ¬ âà¨æ  ᨬ¢®« 
  2572.  
  2573. align 4
  2574. proc buf_draw_text, buf_struc:dword, buf_t_matr:dword, text:dword, coord_x:dword, coord_y:dword, color:dword
  2575.         locals
  2576.                 buf_t_matr_offs dd ?
  2577.         endl
  2578.         pushad
  2579.         mov edi,dword[buf_struc]
  2580.         cmp buf2d_bits,24
  2581.         jne .error2
  2582.         mov edi,dword[buf_t_matr]
  2583.         cmp buf2d_bits,8
  2584.         jne .error1
  2585.                 mov edx,buf2d_data
  2586.                 mov [buf_t_matr_offs],edx
  2587.                 mov ecx,BUF_STRUCT_SIZE ;ª®¯¨à㥬 áâàãªâãàã ⥪á⮢®© ¬ âà¨æë
  2588.                 mov esi,edi
  2589.                 lea edi,[buf_s_matr]
  2590.                 cld
  2591.                 rep movsb
  2592.                 lea edi,[buf_s_matr]
  2593.                 shr buf2d_h,8 ;¤¥«¨¬ ¢ëá®âã ᨬ¢®«ì­®£® ¡ãä¥à  ­  256, ¤«ï ­ å®¦¤¥­¨ï ¢ëá®âë 1-£® ᨬ¢®« 
  2594.                 mov ebx,buf2d_h ;¡¥à¥¬ ¢ëá®âã ᨬ¢®« 
  2595.                 mov ecx,buf2d_w ;¡¥à¥¬ è¨à¨­ã ᨬ¢®« 
  2596.  
  2597.                 mov eax,[coord_x]
  2598.                 mov esi,[text]
  2599.                 cmp byte[esi],0
  2600.                 je .end_draw ;¥á«¨ ¯ãáâ ï áâப 
  2601.                 @@:
  2602.                         xor edx,edx
  2603.                         mov dl,byte[esi] ;¡¥à¥¬ ª®¤ ᨬ¢®« 
  2604.                         imul edx,ebx ;㬭®¦ ¥¬ ¥£® ­  ¢ëá®âã ᨬ¢®« 
  2605.                         imul edx,ecx ;㬭®¦ ¥¬ ­  è¨à¨­ã ᨬ¢®« 
  2606.                         add edx,[buf_t_matr_offs] ;¯à¨¡ ¢«ï¥¬ ᬥ饭¨¥ 0-£® ᨬ¢®« , â. ¥. ¯®«ãç ¥âáï ᬥ饭¨¥ ¢ë¢®¤¨¬®£® ᨬ¢®« 
  2607.                         mov buf2d_data,edx ;¢ «®ª «ì­ë© ¡ãä¥à ᨬ¢®« , áâ ¢¨¬ 㪠§ â¥«ì ­  ­ã¦­ë© ᨬ¢®« ¨§ ¡ãä¥à  buf_t_matr
  2608.                         stdcall buf_bit_blt_alpha, [buf_struc], eax,[coord_y], edi,[color]
  2609.                         add eax,ecx
  2610.                         .new_s:
  2611.                                 inc esi
  2612.                                 cmp byte[esi],13
  2613.                                 jne .no_13
  2614.                                         mov eax,[coord_x]
  2615.                                         add [coord_y],ebx
  2616.                                         jmp .new_s
  2617.                                 .no_13:
  2618.                         cmp byte[esi],0
  2619.                         jne @b
  2620.                 jmp .end_draw
  2621.         .error1:
  2622.                 stdcall print_err,sz_buf2d_draw_text,txt_err_n8b
  2623.                 jmp .end_draw
  2624.         .error2:
  2625.                 stdcall print_err,sz_buf2d_draw_text,txt_err_n24b
  2626.         .end_draw:
  2627.         popad
  2628.         ret
  2629. endp
  2630.  
  2631. align 4
  2632. proc print_err, fun:dword, mes:dword ;¢ë¢®¤¨¬ á®®¡é¥­¨¥ ®¡ 訡ª¥ ­  ¤®áªã ®â« ¤ª¨
  2633.         pushad
  2634.         mov eax,63
  2635.         mov ebx,1
  2636.  
  2637.         mov esi,[fun]
  2638.         @@:
  2639.                 mov cl,byte[esi]
  2640.                 int 0x40
  2641.                 inc esi
  2642.                 cmp byte[esi],0
  2643.                 jne @b
  2644.         mov cl,':'
  2645.         int 0x40
  2646.         mov cl,' '
  2647.         int 0x40
  2648.         mov esi,[mes]
  2649.         @@:
  2650.                 mov cl,byte[esi]
  2651.                 int 0x40
  2652.                 inc esi
  2653.                 cmp byte[esi],0
  2654.                 jne @b
  2655.         popad
  2656.         ret
  2657. endp
  2658.  
  2659. ;input:
  2660. ; ebp+8  = p0
  2661. ; ebp+12 = p1
  2662. align 4
  2663. line_len4i:
  2664.         push ebp
  2665.         mov ebp,esp
  2666.                 finit
  2667.                 fild word [ebp+8]
  2668.                 fisub word [ebp+12]
  2669.                 fmul st0,st0 ;st0=x^2
  2670.                 fild word [ebp+10]
  2671.                 fisub word [ebp+14]
  2672.                 fmul st0,st0 ;st0=y^2
  2673.                 fadd st0,st1
  2674.                 fsqrt
  2675.                 fstp dword [ebp+12]
  2676.         pop ebp
  2677.         ret 4 ;8
  2678.  
  2679. align 4
  2680. proc buf_curve_bezier, buffer:dword, coord_p0:dword,coord_p1:dword,coord_p2:dword, color:dword
  2681.         locals
  2682.                 delt_t dd ?
  2683.                 opr_param dd ?
  2684.                 v_poi_0 dd ?
  2685.         endl
  2686.         pushad
  2687.  
  2688. ;float t, xt,yt;
  2689. ;for(t=.0;t<1.;t+=.005){
  2690. ;  xt=pow(1.-t,2)*x0+2*t*(1.-t)*x1+pow(t,2)*x2;
  2691. ;  yt=pow(1.-t,2)*y0+2*t*(1.-t)*y1+pow(t,2)*y2;
  2692. ;  dc.SetPixel(xt,yt,255L);
  2693. ;}
  2694.  
  2695.         mov edx,[color] ;set curve color
  2696.         mov edi,[buffer]
  2697.         xor ebx,ebx
  2698.         xor ecx,ecx
  2699.  
  2700.         finit
  2701.  
  2702.         ; calculate delta t
  2703.         stdcall line_len4i, dword[coord_p1],dword[coord_p0]
  2704.         fadd dword[esp]
  2705.         add esp,4 ;pop ...
  2706.  
  2707.         stdcall line_len4i, dword[coord_p2],dword[coord_p1]
  2708.         fadd dword[esp]
  2709.         add esp,4 ;pop ...
  2710.  
  2711.         fadd st0,st0 ; len*=2
  2712.         ftst
  2713.         fstsw ax
  2714.  
  2715.         fld1
  2716.         sahf
  2717.         jle @f ;¨§¡¥£ ¥¬ ¤¥«¥­¨ï ­  0
  2718.                 fdiv st0,st1
  2719.         @@:
  2720.         fstp dword[delt_t]
  2721.  
  2722.         finit
  2723.  
  2724.         ;fild word[coord_p2+2] ;y2
  2725.         fild word[coord_p1+2] ;y1
  2726.         fild word[coord_p0+2] ;y0
  2727.         fild word[coord_p2] ;x2
  2728.         fild word[coord_p1] ;x1
  2729.         fild word[coord_p0] ;x0
  2730.         fld dword[delt_t]
  2731.         fldz ;t=.0
  2732.  
  2733.         @@:
  2734.                 fld1
  2735.                 fsub st0,st1 ;1.-t
  2736.                 fmul st0,st0 ;pow(1.-t,2)
  2737.                 fmul st0,st3 ;...*x0
  2738.                 fstp dword[opr_param]
  2739.  
  2740.                 fld1
  2741.                 fsub st0,st1 ;1.-t
  2742.                 fmul st0,st1 ;(1.-t)*t
  2743.                 fadd st0,st0
  2744.                 fmul st0,st4 ;...*x1
  2745.                 mov esi,dword[opr_param]
  2746.                 fstp dword[opr_param]
  2747.  
  2748.                 fldz
  2749.                 fadd st0,st1 ;0+t
  2750.                 fmul st0,st0 ;t*t
  2751.                 fmul st0,st5 ;...*x2
  2752.  
  2753.                 fadd dword[opr_param]
  2754.                 mov dword[opr_param],esi
  2755.                 fadd dword[opr_param]
  2756.                 fistp word[v_poi_0] ;x
  2757.  
  2758.                 fld1
  2759.                 fsub st0,st1 ;1.-t
  2760.                 fmul st0,st0 ;pow(1.-t,2)
  2761.                 fmul st0,st6 ;...*y0
  2762.                 fstp dword[opr_param]
  2763.  
  2764.                 fld1
  2765.                 fsub st0,st1 ;1.-t
  2766.                 fmul st0,st1 ;(1.-t)*t
  2767.                 fadd st0,st0
  2768.                 fmul st0,st7 ;...*y1
  2769.                 mov esi,dword[opr_param]
  2770.                 fstp dword[opr_param]
  2771.  
  2772.                 fldz
  2773.                 fadd st0,st1 ;0+t
  2774.                 fmul st0,st0 ;t*t
  2775.                 fimul word[coord_p2+2] ;...*y2
  2776.  
  2777.                 fadd dword[opr_param]
  2778.                 mov dword[opr_param],esi
  2779.                 fadd dword[opr_param]
  2780.                 fistp word[v_poi_0+2] ;y
  2781.  
  2782.                 mov eax,1
  2783.                 mov bx,word[v_poi_0+2]
  2784.                 mov cx,word[v_poi_0]
  2785.                 call draw_pixel
  2786.  
  2787.                 fadd st0,st1 ;t+dt
  2788.  
  2789.                 fld1
  2790.                 fcomp
  2791.                 fstsw ax
  2792.                 sahf
  2793.         jae @b
  2794.  
  2795.         popad
  2796.         ret
  2797. endp
  2798.  
  2799.  
  2800.  
  2801. ;*** ä㭪樨 ¤«ï à ¡®âë á ¢®ªá¥«ì­®© £à ä¨ª®© ***
  2802.  
  2803.  
  2804.  
  2805. ;ᮧ¤ ­¨¥ ¢®ªá¥«ì­ëå ª¨á⥩
  2806. align 4
  2807. proc vox_brush_create uses eax ebx ecx edi, h_br:dword, buf_z:dword
  2808.         mov edi,[h_br]
  2809.         movzx ecx,byte[edi+3]
  2810.         add edi,4
  2811.  
  2812.         ; *** ᮧ¤ ­¨¥ ¥¤¨­¨ç­®© ª¨á⨠***
  2813.         mov eax,[buf_z]
  2814.         mov buf2d_data,eax
  2815.         movzx eax,byte[edi-4] ;è¨à¨­  ¥¤¨­¨ç­®© ª¨áâ¨
  2816.         mov buf2d_w,eax ;è¨à¨­  ¡ãä¥à 
  2817.         movzx eax,byte[edi-4+1] ;¢ëá®â  ¥¤¨­¨ç­®© ª¨áâ¨
  2818.         mov buf2d_h,eax ;¢ëá®â  ¡ãä¥à 
  2819.         mov buf2d_size_lt,0 ;®âáâ㯠᫥¢  ¨ á¯à ¢  ¤«ï ¡ãä¥à 
  2820.         mov buf2d_color,0 ;梥â ä®­  ¡ãä¥à 
  2821.         mov buf2d_bits,32 ;ª®«¨ç¥á⢮ ¡¨â ¢ 1-© â®çª¥ ¨§®¡à ¦¥­¨ï
  2822.  
  2823.         ; *** ᮧ¤ ­¨¥ á«¥¤ãîé¨å ª¨á⥩ ***
  2824.         cmp ecx,1
  2825.         jl .end_creat
  2826.         movzx ebx,byte[edi-4+2] ;¢ëá®â  ®á­®¢ ­¨ï ¥¤¨­¨ç­®© ª¨áâ¨
  2827.         shr ebx,1
  2828.         cld
  2829.         @@:
  2830.                 mov eax,edi
  2831.                 add edi,BUF_STRUCT_SIZE
  2832.                 stdcall vox_create_next_brush, eax, edi, ebx
  2833.                 shl ebx,1
  2834.                 loop @b
  2835.         .end_creat:
  2836.         ret
  2837. endp
  2838.  
  2839. ;㤠«¥­¨¥ ¢®ªá¥«ì­ëå ª¨á⥩
  2840. align 4
  2841. proc vox_brush_delete uses ecx edi, h_br:dword
  2842.         mov edi,[h_br]
  2843.         movzx ecx,byte[edi+3]
  2844.         add edi,4
  2845.  
  2846.         ; *** 㤠«¥­¨¥ ª¨á⥩ ***
  2847.         cmp ecx,1
  2848.         jl .end_delete
  2849.         cld
  2850.         @@:
  2851.                 add edi,BUF_STRUCT_SIZE
  2852.                 stdcall buf_delete, edi
  2853.                 loop @b
  2854.         .end_delete:
  2855.         ret
  2856. endp
  2857.  
  2858. ;äã­ªæ¨ï ¤«ï ᮧ¤ ­¨ï ¢®ªá¥«ï á«¥¤ãî饣® ¯®à浪 
  2859. ; buf_v1 - ¡ãä¥à á ¨á室­ë¬ ¢®ªá¥«¥¬
  2860. ; buf_v2 - ¡ãä¥à á 㢥«¨ç¥­ë¬ ¢®ªá¥«¥¬
  2861. ; h - ¢ëá®â  ®á­®¢ ­¨ï ¨á室­®£® ¢®ªá¥«ï : 2
  2862. align 4
  2863. proc vox_create_next_brush uses eax ebx ecx edx edi, buf_v1:dword, buf_v2:dword, h:dword
  2864.         mov edi,[buf_v1]
  2865.         mov ebx,buf2d_h
  2866.         mov ecx,buf2d_w
  2867.         mov edi,[buf_v2]
  2868.         mov buf2d_h,ebx
  2869.         shl buf2d_h,1
  2870.         mov buf2d_w,ecx
  2871.         shl buf2d_w,1
  2872.         mov buf2d_color,0
  2873.         mov buf2d_bits,32
  2874.  
  2875.         stdcall buf_create, [buf_v2] ;ᮧ¤ ­¨¥ ¡ãä¥à  £«ã¡¨­ë
  2876.         shr ecx,1
  2877.         mov edx,[h]
  2878.         shl edx,1
  2879.         sub ebx,edx
  2880.         ;ecx - è¨à¨­  ¨á室­®£® ¢®ªá¥«ï : 2
  2881.         ;ebx - ¢ëá®â  ¨á室­®£® ¢®ªá¥«ï (¡¥§ ®á­®¢ ­¨ï)
  2882.         ;edx - ¢ëá®â  ®á­®¢ ­¨ï ¨á室­®£® ¢®ªá¥«ï
  2883.         stdcall vox_add, [buf_v2], [buf_v1], ecx,0,0
  2884.         stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,0
  2885.  
  2886.         mov eax,[h]
  2887.         stdcall vox_add, [buf_v2], [buf_v1], 0,eax,eax
  2888.         push eax ;stdcall ...
  2889.         add eax,ebx
  2890.         stdcall vox_add, [buf_v2], [buf_v1], 0,eax ;,...
  2891.         sub eax,ebx
  2892.  
  2893.         shl ecx,1
  2894.         ;ecx - è¨à¨­  ¨á室­®£® ¢®ªá¥«ï
  2895.         mov eax,[h]
  2896.         stdcall vox_add, [buf_v2], [buf_v1], ecx,eax,eax
  2897.         push eax ;stdcall ...,[h]
  2898.         add eax,ebx
  2899.         stdcall vox_add, [buf_v2], [buf_v1], ecx,eax;,[h]
  2900.         ;sub eax,ebx
  2901.         shr ecx,1
  2902.  
  2903.         ;ecx - è¨à¨­  ¨á室­®£® ¢®ªá¥«ï : 2
  2904.         stdcall vox_add, [buf_v2], [buf_v1], ecx,edx,edx
  2905.         add ebx,edx
  2906.         stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,edx
  2907.  
  2908.         ret
  2909. endp
  2910.  
  2911. ;
  2912. align 4
  2913. proc vox_add uses ebx ecx, buf_v1:dword, buf_v2:dword, coord_x:dword, coord_y:dword, coord_z:dword
  2914. pushad
  2915.         mov eax,[coord_x]
  2916.         mov ebx,[coord_y]
  2917.         mov edi,[buf_v2]
  2918.         mov ecx,buf2d_h
  2919.         mov esi,buf2d_w
  2920.         imul ecx,esi
  2921.         add esi,eax
  2922.         mov edx,buf2d_data
  2923.         cld
  2924.         ;ecx - count pixels in voxel
  2925.         ;edx - 㪠§ â¥«ì ­  ¤ ­­ë¥ ¢ ¢®ªá¥«ì­®¬ ¡ãä¥à¥
  2926.         ;edi - 㪠§ â¥«ì ­  ¢®ªá¥«ì­ë© ¡ãä¥à
  2927.         ;esi - width voxel buffer add coord x
  2928.         .cycle:
  2929.                 cmp dword[edx],0
  2930.                 je @f
  2931.                         ;¯à®¢¥à塞 ¡ãä¥à £«ã¡¨­ë
  2932.                         push eax ecx esi
  2933.                         mov ecx,eax
  2934.                         stdcall buf_get_pixel, [buf_v1],ecx,ebx
  2935.                         mov esi,[edx]
  2936.                         add esi,[coord_z]
  2937.                         cmp eax,esi
  2938.                         jge .end_draw
  2939.                         stdcall buf_set_pixel, [buf_v1],ecx,ebx,esi ;esi = new coord z
  2940.                         .end_draw:
  2941.                         pop esi ecx eax
  2942.                 @@:
  2943.                 add edx,4
  2944.                 inc eax
  2945.                 cmp eax,esi
  2946.                 jl @f
  2947.                         inc ebx
  2948.                         sub eax,buf2d_w
  2949.                 @@:
  2950.                 loop .cycle
  2951. popad
  2952.         ret
  2953. endp
  2954.  
  2955. txt_err_n8b db 'need buffer 8 bit',13,10,0
  2956. txt_err_n24b db 'need buffer 24 bit',13,10,0
  2957. txt_err_n8_24b db 'need buffer 8 or 24 bit',13,10,0
  2958.  
  2959. align 16
  2960. EXPORTS:
  2961.         dd sz_lib_init, lib_init
  2962.         dd sz_buf2d_create, buf_create
  2963.         dd sz_buf2d_create_f_img, buf_create_f_img
  2964.         dd sz_buf2d_clear, buf_clear
  2965.         dd sz_buf2d_draw, buf_draw_buf
  2966.         dd sz_buf2d_delete, buf_delete
  2967.         dd sz_buf2d_resize, buf_resize
  2968.         dd sz_buf2d_line, buf_line_brs
  2969.         dd sz_buf2d_line_sm, buf_line_brs_sm
  2970.         dd sz_buf2d_rect_by_size, buf_rect_by_size
  2971.         dd sz_buf2d_filled_rect_by_size, buf_filled_rect_by_size
  2972.         dd sz_buf2d_circle, buf_circle
  2973.         dd sz_buf2d_img_hdiv2, buf_img_hdiv2
  2974.         dd sz_buf2d_img_wdiv2, buf_img_wdiv2
  2975.         dd sz_buf2d_conv_24_to_8, buf_conv_24_to_8
  2976.         dd sz_buf2d_conv_24_to_32, buf_conv_24_to_32
  2977.         dd sz_buf2d_bit_blt, buf_bit_blt
  2978.         dd sz_buf2d_bit_blt_transp, buf_bit_blt_transp
  2979.         dd sz_buf2d_bit_blt_alpha, buf_bit_blt_alpha
  2980.         dd sz_buf2d_curve_bezier, buf_curve_bezier
  2981.         dd sz_buf2d_convert_text_matrix, buf_convert_text_matrix
  2982.         dd sz_buf2d_draw_text, buf_draw_text
  2983.         dd sz_buf2d_crop_color, buf_crop_color
  2984.         dd sz_buf2d_offset_h, buf_offset_h
  2985.         dd sz_buf2d_flood_fill, buf_flood_fill
  2986.         dd sz_buf2d_set_pixel, buf_set_pixel
  2987.         dd sz_buf2d_get_pixel, buf_get_pixel
  2988.         dd sz_buf2d_vox_brush_create, vox_brush_create
  2989.         dd sz_buf2d_vox_brush_delete, vox_brush_delete
  2990.         dd 0,0
  2991.         sz_lib_init db 'lib_init',0
  2992.         sz_buf2d_create db 'buf2d_create',0
  2993.         sz_buf2d_create_f_img db 'buf2d_create_f_img',0
  2994.         sz_buf2d_clear db 'buf2d_clear',0 ;®ç¨á⪠ ¡ãä¥à  㪠§ ­­ë¬ 梥⮬
  2995.         sz_buf2d_draw db 'buf2d_draw',0
  2996.         sz_buf2d_delete db 'buf2d_delete',0
  2997.         sz_buf2d_resize db 'buf2d_resize',0
  2998.         sz_buf2d_line db 'buf2d_line',0 ;à¨á®¢ ­¨¥ «¨­¨¨
  2999.         sz_buf2d_line_sm db 'buf2d_line_sm',0 ;à¨á®¢ ­¨¥ ᣫ ¦¥­­®© «¨­¨¨
  3000.         sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 ;à¨á®¢ ­¨¥ à ¬ª¨ ¯àאַ㣮«ì­¨ª , 2-ï ª®®à¤¨­ â  § ¤ ­  ¯® à §¬¥àã
  3001.         sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 ;à¨á®¢ ­¨¥ § «¨â®£® ¯àאַ㣮«ì­¨ª , 2-ï ª®®à¤¨­ â  § ¤ ­  ¯® à §¬¥àã
  3002.         sz_buf2d_circle db 'buf2d_circle',0 ;à¨á®¢ ­¨¥ ®ªà㦭®áâ¨
  3003.         sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 ;ᦠ⨥ ¨§®¡à ¦¥­¨ï ¯® ¢ëá®â¥ ¢ 2 à §  (à §¬¥à ¡ãä¥à  ­¥ ¬¥­ï¥âáï)
  3004.         sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 ;ᦠ⨥ ¨§®¡à ¦¥­¨ï ¯® è¨à¨­¥ ¢ 2 à §  (à §¬¥à ¡ãä¥à  ­¥ ¬¥­ï¥âáï)
  3005.         sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
  3006.         sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
  3007.         sz_buf2d_bit_blt db 'buf2d_bit_blt',0
  3008.         sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
  3009.         sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
  3010.         sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
  3011.         sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
  3012.         sz_buf2d_draw_text db 'buf2d_draw_text',0
  3013.         sz_buf2d_crop_color db 'buf2d_crop_color',0
  3014.         sz_buf2d_offset_h db 'buf2d_offset_h',0
  3015.         sz_buf2d_flood_fill db 'buf2d_flood_fill',0
  3016.         sz_buf2d_set_pixel db 'buf2d_set_pixel',0
  3017.         sz_buf2d_get_pixel db 'buf2d_get_pixel',0
  3018.         sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0
  3019.         sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0
  3020.