Subversion Repositories Kolibri OS

Rev

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