Subversion Repositories Kolibri OS

Rev

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