Subversion Repositories Kolibri OS

Rev

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