Subversion Repositories Kolibri OS

Rev

Rev 552 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. lang equ ru
  2.  
  3. ;
  4. ;   Assembler
  5. ;     SMALL
  6. ;       CODE
  7. ;         Graphics
  8. ;           Libary
  9. ;
  10. ;   Ver 0.18
  11. ;
  12.  
  13. ; draw image into image with alpha color mask
  14. ; image_draw_acimage dest, source, x, y, alpha_color
  15. ;
  16. macro image_draw_acimage dest, source, x, y, alpha_color
  17. {
  18. local next_pix,next_line,skip_pix,no_skip
  19.    push dest
  20.    push source
  21.    push x
  22.    push y
  23.    push alpha_color
  24.    pop ebp  ; alpha color
  25.    pop eax  ; y
  26.    pop ebx  ; x
  27.    pop esi  ; src
  28.    pop edi  ; dest
  29.    call image_draw_acimage_proc
  30.  
  31. if ~ defined image_draw_acimage_used
  32. image_draw_acimage_used equ 1
  33.  
  34.    jmp end_image_draw_acimage_proc
  35. image_draw_acimage_proc:
  36.    mov ecx,dword [edi]   ; ecx = canvas width
  37.    mul ecx       ; edx:eax = ypos * canvas width
  38.    add eax,ebx   ; eax =  (ypos * canvas width) + xpos
  39.    lea eax,[eax+eax*2+8] ; eax=(y*xsize+x)*3+8 (8=skip xy size dwords)
  40.  
  41.    mov edx,[esi]   ; edx = img width
  42.    sub ecx,edx     ; ecx = canvas width - img width
  43.    lea ebx,[ecx*2+ecx] ; ebx = how many pixels skip for new line
  44.    mov ecx,[esi+4] ; ecx = img height
  45.    add esi,8       ; esi + 8 for skip xy size dwords
  46.    add edi,eax     ; edi = dest position
  47.    shl ebp,8       ; for fast compare with alpha color
  48.    cld             ; set movs direction flag
  49. next_line:
  50.    push edx
  51. next_pix:
  52.    mov eax,[esi]
  53.    shl eax,8
  54.    cmp eax,ebp
  55.    je  skip_pix
  56.    movsw
  57.    movsb
  58.    jmp no_skip
  59. skip_pix:
  60.    add esi,3
  61.    add edi,3
  62. no_skip:
  63.    dec edx
  64.    jnz next_pix
  65.    pop edx
  66.    add edi,ebx
  67.    dec ecx
  68.    jnz next_line
  69.    ret
  70. end_image_draw_acimage_proc :
  71. end if
  72.  
  73. }
  74.  
  75. macro image_set_size image,width,height
  76. {
  77.    mov dword [image],width
  78.    mov dword [image+4],height
  79. }
  80.  
  81. ; label - draw label on window
  82. ; example:
  83. ; label 10,12,'Hello World!',cl_Green+font_size_x4+utf16
  84.  
  85. macro image_draw_label image,x,y,text,color
  86. {
  87. local label_text
  88.    draw_to_buffer   equ 00001000b shl 24
  89.    jmp @f
  90. label_text db text
  91. @@:
  92.    words2reg ebx,x,y       ; ebx - position
  93.    dword2reg ecx,color+draw_to_buffer ; ecx - color
  94.    mov edi,image
  95.    mov edx,label_text      ; edx - address of label text
  96.    mov esi,@b-label_text   ; esi - size of libel in bytes
  97.    mov eax,4
  98.    mcall
  99. }
  100.  
  101. ; draw_frect - draw filled rect
  102. macro draw_frect x,y,xs,ys,color
  103. {
  104.    wordstoreg ebx,x,xs ;x*65536+xs
  105.    wordstoreg ecx,y,ys ;y*65536+ys
  106.    mov  edx,color
  107.    mov  eax,13
  108.    mcall
  109. }
  110.  
  111. ; draw_label - Draw label in window
  112. ; example:
  113. ; draw_label 10,12,'Hello World!',cl_Green+font_size_x4+utf16
  114.  
  115. macro draw_label x,y,text,color
  116. {
  117. local label_text
  118.    words2reg ebx,x,y   ; ebx - position
  119. if text eqtype 123 | text eqtype eax
  120.    movt edx,text
  121.    mov ecx,color+(1 shl 31)  ; ecx - color
  122. else
  123.    mov edx,label_text  ; edx - address of label text
  124.    jmp @f
  125. label_text db text
  126. @@:
  127.    mov esi,@b-label_text     ; esi - size of libel in bytes
  128.    movt ecx,color            ; ecx - color
  129. end if
  130.    mov eax,4
  131.    mcall
  132. }
  133.  
  134. hide_zeros equ (1 shl 31)
  135. use_bg_color equ (1 shl 30)
  136. use_big_font equ (1 shl 28)
  137.  
  138. macro draw_number data, x, y, color, numtype, bg_color
  139. {
  140.    movt ecx,data
  141.    movt ebx,numtype
  142.    mov bl,0     ; if bl = 0, ecx is contain number
  143.    words2reg edx,x,y
  144. if bg_color eq
  145.    movt esi,color
  146. else
  147.    movt esi,color+use_bg_color
  148.    movt edi,bg_color
  149. end if
  150.    mov eax,47
  151.    mcall
  152. }
  153.  
  154. ; draw_image - macro for draw image on window area
  155. macro draw_image x, y, image
  156. {
  157.    mov ecx,[image-2]    ; -2 for except shl ecx,16
  158.    mov cx,[image+4]     ; ecx = xsize*65536+ysize
  159.    wordstoreg edx, x, y ; edx = x*65536+y
  160.    lea ebx,[image+8]    ; ebx = image data address
  161.    mov eax,7            ; eax = 7 is draw image function
  162.    mcall
  163. }
  164.  
  165. aframetoimg_use_count=0
  166. macro aframetoimg img, x, y, canvas,acol
  167. {
  168. local loo,loo2,acolor
  169. aframetoimg_use_count=aframetoimg_use_count+1
  170. if aframetoimg_use_count = 1
  171.  
  172.    jmp end_aframetoimg_proc
  173.  
  174. acolor dd 0
  175. aframetoimg_proc:
  176. ;getout coord
  177.    mov [acolor],ebp
  178.  
  179.    mov edx,ebx ;img   ;xsize
  180.    movzx eax,word [edx]
  181.    add eax,esi ;y cor
  182.  
  183. ;    mov eax,esi ;y cor
  184.    mul dword [ecx] ;canvas xsize
  185.    add eax,edi ;x cor
  186.  
  187.    mov ebp,ebx ;img   ;xsize
  188.    movzx edx,word [ebp]
  189.    add eax,edx
  190.  
  191.    mov ebp,eax
  192.    shl eax,1
  193.    add ebp,eax
  194.    add ebp,ecx ;canvas+8;start
  195.    add ebp,8
  196. ;get img size
  197.    add ebx,4
  198.    mov eax,ebx ;img   ;xsize
  199.    movzx esi,word [eax]
  200.    movzx edi,word [eax+2]
  201.    add ebx,4
  202.    mov edx,ebx ;img+8
  203. loo2:
  204. push esi
  205. loo:
  206. ;test on alpha color
  207.    mov eax,[edx]
  208.    shl eax,8
  209.    shr eax,8
  210.    cmp eax,[acolor]
  211.    jne  yx
  212.    add edx,3
  213.    add ebp,3
  214.    jmp nx
  215. yx:
  216.    mov al,byte [edx]
  217.    mov byte [ebp],al
  218.    inc ebp
  219.    inc edx
  220.    mov al,byte [edx]
  221.    mov byte [ebp],al
  222.    inc ebp
  223.    inc edx
  224.    mov al,byte [edx]
  225.    mov byte [ebp],al
  226.    inc ebp
  227.    inc edx
  228. nx:
  229.    dec esi
  230.    jnz loo
  231. pop esi
  232.    sub ebp,3
  233.    mov eax,[ecx]  ;offset = offset+((canxsize-imgxsize)*3)
  234.    sub eax,esi
  235.    add ebp,eax
  236.    shl eax,1
  237.    add ebp,eax
  238.  
  239.    add ebp,3
  240.  
  241.    dec edi
  242.    jnz loo2
  243.    ret
  244. end_aframetoimg_proc:
  245. end if
  246.    push img
  247.    push canvas
  248.    push x
  249.    push y
  250.    push acol
  251.    pop  ebp
  252.    pop  esi
  253.    pop  edi
  254.    pop ecx
  255.    pop ebx
  256.    call aframetoimg_proc
  257. }
  258.  
  259. frametoimg_use_count=0
  260. macro frametoimg img, x, y, canvas
  261. {
  262. local loo,loo2
  263. frametoimg_use_count=frametoimg_use_count+1
  264. if frametoimg_use_count = 1
  265.  
  266.    jmp end_frametoimg_proc
  267.  
  268. frametoimg_proc:
  269. ;getout coord
  270.    mov edx,ebx ;img   ;xsize
  271.    movzx eax,word [edx]
  272.    add eax,esi ;y cor
  273.  
  274. ;    mov eax,esi ;y cor
  275.    mul dword [ecx] ;canvas xsize
  276.    add eax,edi ;x cor
  277.  
  278.    mov ebp,ebx ;img   ;xsize
  279.    movzx edx,word [ebp]
  280.    add eax,edx
  281.  
  282.    mov ebp,eax
  283.    shl eax,1
  284.    add ebp,eax
  285.    add ebp,ecx ;canvas+8;start
  286.    add ebp,8
  287. ;get img size
  288.    add ebx,4
  289.    mov eax,ebx ;img   ;xsize
  290.    movzx esi,word [eax]
  291.    movzx edi,word [eax+2]
  292.    add ebx,4
  293.    mov edx,ebx ;img+8
  294. loo2:
  295. push esi
  296. loo:
  297.    mov al,byte [edx]
  298.    mov byte [ebp],al
  299.    inc ebp
  300.    inc edx
  301.    mov al,byte [edx]
  302.    mov byte [ebp],al
  303.    inc ebp
  304.    inc edx
  305.    mov al,byte [edx]
  306.    mov byte [ebp],al
  307.    inc ebp
  308.    inc edx
  309.  
  310.    dec esi
  311.    jnz loo
  312. pop esi
  313.    sub ebp,3
  314.    mov eax,[ecx]  ;offset = offset+((canxsize-imgxsize)*3)
  315.    sub eax,esi
  316.    add ebp,eax
  317.    shl eax,1
  318.    add ebp,eax
  319.  
  320.    add ebp,3
  321.  
  322.    dec edi
  323.    jnz loo2
  324.    ret
  325. end_frametoimg_proc:
  326. end if
  327.    push img
  328.    push canvas
  329.    push x
  330.    push y
  331.    pop  esi
  332.    pop  edi
  333.    pop ecx
  334.    pop ebx
  335.    call frametoimg_proc
  336. }
  337.  
  338.  
  339. imgtoimg_use_count=0
  340. macro imgtoimg img, x, y, canvas
  341. {
  342. local loo,loo2
  343. imgtoimg_use_count=imgtoimg_use_count+1
  344. if imgtoimg_use_count = 1
  345.  
  346.    jmp end_imgtoimg_proc
  347. imgtoimg_proc:
  348. ;getout coord
  349.    mov eax,esi ;y cor
  350.    mul dword [ecx] ;canvas xsize
  351.    add eax,edi ;x cor
  352.    mov ebp,eax
  353.    shl eax,1
  354.    add ebp,eax
  355.    add ebp,ecx ;canvas+8;start
  356.    add ebp,8
  357. ;get img size
  358.    mov eax,ebx ;img   ;xsize
  359.    mov esi,[eax]
  360.    add ebx,4
  361.    mov eax,ebx ; img+4 ;ysize
  362.    mov edi,[eax]
  363.    add ebx,4
  364.    mov edx,ebx ;img+8
  365. loo2:
  366. push esi
  367. loo:
  368.    mov al,byte [edx]
  369.    mov byte [ebp],al
  370.    inc ebp
  371.    inc edx
  372.    mov al,byte [edx]
  373.    mov byte [ebp],al
  374.    inc ebp
  375.    inc edx
  376.    mov al,byte [edx]
  377.    mov byte [ebp],al
  378.    inc ebp
  379.    inc edx
  380.    dec esi
  381.    jnz loo
  382. pop esi
  383.    sub ebp,3
  384.    mov eax,[ecx]  ;offset = offset+((canxsize-imgxsize)*3)
  385.    sub eax,esi
  386.    add ebp,eax
  387.    shl eax,1
  388.    add ebp,eax
  389.    add ebp,3
  390.    dec edi
  391.    jnz loo2
  392.    ret
  393. end_imgtoimg_proc:
  394. end if
  395.    push img
  396.    push canvas
  397.    push x
  398.    push y
  399.    pop  esi
  400.    pop  edi
  401.    pop  ecx
  402.    pop  ebx
  403.    call imgtoimg_proc
  404. }
  405.  
  406. ; FPS - Set Frame Per Second Display
  407. fps_show_frequency=40
  408. macro fps x,y,color,delcolor
  409. {
  410. local spdat,savetime,new_time,fps,fps_cntr,out_fps,new_time,ttt
  411. local no_out_fps
  412.    jmp spdat
  413. savetime dd 0
  414. fps_cntr dd 0
  415. fps      dd 0
  416. ttt      dd 0
  417. spdat:
  418. get_time:
  419.    mov eax,3
  420.    mcall
  421.    cmp eax,[savetime]
  422.    jne new_time
  423.    inc [fps_cntr]
  424.    cmp dword [ttt],0
  425.    je  out_fps
  426.    dec dword [ttt]
  427.    jmp no_out_fps
  428. new_time:
  429.    mov [savetime],eax
  430.    mov ebx,[fps_cntr]
  431.    mov [fps],ebx
  432.    mov [fps_cntr],0
  433. out_fps:
  434. if ~(delcolor eq )
  435.    mov ebx,x*65536+30
  436.    mov ecx,y*65536+7
  437.    mov edx,delcolor
  438.    mov eax,13
  439.    mcall
  440. end if
  441.    mov dword [ttt],fps_show_frequency
  442.    mov eax,47
  443.    mov ebx,5*65536
  444.    ;   mov bl,0
  445.    mov edx,x*65536+y
  446.    mov esi,color
  447.    mov ecx,[fps]
  448.    mcall
  449. no_out_fps:
  450. }
  451.  
  452. macro rgbtobgr image
  453. {
  454.    mov eax,[image]
  455.    mul dword [image+4]
  456.    mov ecx,eax
  457.    mov esi,image+8
  458. @@:
  459.    mov al,[esi]
  460.    mov bl,[esi+2]
  461.    mov [esi],bl
  462.    mov [esi+2],al
  463.    add esi,3
  464.    dec ecx
  465.    jnz @b
  466. }
  467.  
  468. macro setframe x , y ,arg3
  469. {
  470.    mov  eax,7
  471.    mov  ebx,arg3
  472.    add  ebx,8
  473.    wordstoreg edx, x , y  ;arg1*65536+arg2
  474.    add  edx,dword [arg3]
  475.    mov  ecx,dword [arg3+4]
  476.    mcall
  477. }
  478.  
  479.  
  480. macro getimg imgsrc,x,y,xs,ys,imgdest
  481. {
  482. local next_pixel,next_line
  483. ; store image size
  484. if xs eqtype 0 | xs eqtype eax
  485.    mov dword [imgdest],xs
  486. else
  487.    mov eax,xs
  488.    mov dword [imgdest],eax
  489. end if
  490. if ys eqtype 0 | ys eqtype eax
  491.    mov dword [imgdest+4],ys
  492. else
  493.    ;push ys
  494.    ;pop dword [imgdest+4]
  495.    mov eax,ys
  496.    mov dword [imgdest+4],eax
  497. end if
  498.  
  499.    lea edi,[8+imgdest]    ; edi = destinaton address
  500.    mov eax,dword [imgsrc] ; eax = xsize of source image in pixels
  501.    push eax               ; store eax before mul operation
  502.    mov edx,y
  503.    mul edx                ; edx:eax = eax*edx
  504.    add eax,x
  505.    lea esi,[imgsrc+8+eax+2*eax]    ; esi = start offset on img src
  506.    pop eax                ; restore eax
  507.    sub eax,xs             ; eax = src image xsize - crop fragment xsize
  508.    lea eax,[eax+eax*2]    ; eax = eax * 3 (bytes per pixel)
  509.  
  510.    ; this loop used esi,edi,ecx,edx,eax registers
  511.    mov edx,ys     ; edx = ysize in pixels
  512.    cld            ; set direction
  513. next_line:
  514.    mov ecx,xs     ; ecx = xsize in pixels
  515. next_pixel:
  516.    movsw
  517.    movsb          ; write 3 bytes pixel
  518.    dec ecx
  519.    jnz next_pixel
  520.    add esi,eax
  521.    dec edx
  522.    jnz next_line
  523. }
  524.  
  525. macro copyimg img2_off,img1_off
  526. {
  527.    mov  eax,dword [img1_off]
  528.    mov  ebx,dword [img1_off+4]
  529.    mul  ebx
  530.    lea  ecx,[eax+2*eax]
  531.    lea  esi,[img1_off+8]
  532.    lea  edi,[img2_off+8]
  533.    cld
  534.    rep  movsb
  535. }
  536.  
  537. macro fullimg img_off,xs,ys,color
  538. {
  539. local cop
  540.    mov eax,xs
  541.    mov ebx,ys
  542.    mov  dword [img_off],eax
  543.    mov  dword [img_off+4],ebx
  544.    mul  ebx
  545.    lea  ebp,[eax+2*eax]
  546.    mov  esi,color
  547. if color eqtype 0
  548.    mov  ecx,color/65536
  549. else
  550.    mov  ecx,esi
  551.    shr  ecx,16
  552. end if
  553.    xor  edi,edi
  554. cop:
  555.    mov  word [img_off+8+edi],si
  556.    add  edi,2
  557.    mov  byte [img_off+8+edi],cl
  558.    inc  edi
  559.    cmp  edi,ebp
  560.    jne  cop
  561. }
  562.  
  563. ; number of frame in ecx
  564. ; callculatin offset of raw data
  565.  
  566. macro getframeoff num_of_frame,offset_of_animation,offset_of_frame
  567. {
  568. local loo,setpic
  569.   mov ebp,num_of_frame ;ecx
  570.   mov esi,offset_of_animation;Image
  571. loo:
  572.   cmp ebp,0
  573.   je  setpic
  574.   movzx eax,word [esi+4]
  575.   movzx ebx,word [esi+6]
  576.   mul ebx ;dword [esi+4]
  577.   mov ebx,3
  578.   mul ebx
  579.   add eax,8
  580.   add esi,eax
  581.   dec ebp
  582.   jmp loo
  583. setpic:
  584.   mov dword offset_of_frame,esi
  585. }
  586.  
  587. ; BMPTOIMG -Convert BMP format TO IMG format
  588. ; (SYNTAX)  BMPTOIMG BMP_source_offset,IMG_dest_ofset
  589. ; (SAMPLE)  View BMPLS.ASM sample.
  590. ; ( NOTE )  This is macro is not brake bmp structure! Tested in 32,8,4 bits
  591.  
  592. bmptoimg_data_area_count=0
  593. macro bmptoimg bmp_load_area,img_dest_area
  594. {
  595. local fileinfo,string,end_bmp,nodix
  596. local converttable,noaddelem,nextbit,convert1bpp,convert4bpp,convert2
  597. local nextelem,convertno32,nomorestring,convert1,nextstring,yespicsize
  598. ;local qwe,bmpfn
  599.  
  600. ;  convert:
  601.    movzx eax,word [bmp_load_area+28]
  602.    mul  dword [bmp_load_area+18]
  603.    add  eax,31
  604.    shr  eax,5
  605.    mov  dword [bmptoimg_data_area_dwps],eax  ;dwps-doublewords per string
  606.    shl  eax,2
  607.    mov  dword [bmptoimg_data_area_bps],eax   ;bps-bytes per string
  608.  
  609.    cmp dword [bmp_load_area+34],0
  610.    jne  yespicsize  ;if picture size is defined
  611.    mul dword [bmp_load_area+22]
  612.    mov dword [bmp_load_area+34],eax
  613.  
  614. yespicsize:
  615.    mov ebp,img_dest_area+8
  616.  
  617.    mov  eax,bmp_load_area
  618.    mov  ebx,eax
  619.    add  ebx, [bmp_load_area+2];file size
  620.    inc  ebx
  621.    mov  dword [bmptoimg_soi],ebx   ;soi-start of image area for drawing
  622.  
  623.    add  eax, [bmp_load_area+10]
  624.    mov  dword [bmptoimg_data_area_sop],eax   ;sop-start of picture in file
  625.    add  eax, [bmp_load_area+34]
  626.    mov  dword [bmptoimg_data_area_eop],eax   ;eop-end of picture in file
  627.    mov  eax, [bmp_load_area+18]
  628.    lea  eax,[eax+2*eax]   ;3x pixels in eax
  629.  
  630.    mov  edi,dword [bmptoimg_soi]   ;initializing
  631.    mov  esi,dword [bmptoimg_data_area_eop]
  632.    sub  esi,dword [bmptoimg_data_area_bps]
  633.  
  634.  
  635. nextstring:
  636.    push edi
  637.    push ebp
  638.    cmp  word [bmp_load_area+28],24
  639.    jne  convertno32
  640.  
  641.    mov edi,ebp
  642.    mov  ecx,[bmptoimg_data_area_dwps]
  643.    cld
  644.    rep movsd
  645.  
  646. convert1:
  647.    pop  ebp
  648.    pop  edi
  649.    sub  esi,dword [bmptoimg_data_area_bps]
  650.    sub  esi,dword [bmptoimg_data_area_bps]
  651.    cmp  esi,dword [bmptoimg_data_area_sop]
  652.    jb   end_bmp
  653.    add  edi,eax
  654.    add  ebp,eax
  655.    jmp  nextstring
  656.  
  657. convertno32:
  658.    mov  ebx,bmp_load_area
  659.    add  ebx, [bmp_load_area+14]
  660.    add  ebx,14          ;start of color table
  661.    push esi
  662.    add  esi,dword [bmptoimg_data_area_bps]
  663.    mov  dword [bmptoimg_data_area_eos],esi
  664.    pop  esi
  665. nextelem:
  666.    push eax
  667.    movzx eax,byte [esi]
  668.    cmp  word [bmp_load_area+28],4
  669.    je   convert4bpp
  670.    cmp  word [bmp_load_area+28],1
  671.    je   convert1bpp
  672.    call converttable
  673.  
  674. convert2:
  675.    pop  eax
  676.    inc  esi
  677.    cmp  esi,dword [bmptoimg_data_area_eos]
  678.    jae  convert1
  679.    add  edi,3
  680.    add  ebp,3
  681.    jmp  nextelem
  682.  
  683. convert4bpp:
  684.    shl  ax,4
  685.    shr  al,4
  686.    push ax
  687.    movzx eax,ah
  688.    call converttable
  689.    add  edi,3
  690.    add ebp,3
  691.    pop  ax
  692.    movzx eax,al
  693.    call converttable
  694.    jmp  convert2
  695.  
  696. convert1bpp:
  697.    mov  ecx,eax
  698.    mov  edx,7
  699. nextbit:
  700.    xor  eax,eax
  701.    bt   ecx,edx
  702.    jnc  noaddelem
  703.    inc  eax
  704. noaddelem:
  705.    push edx
  706.    call converttable
  707.    pop  edx
  708.    dec  edx
  709.    js   convert2
  710.    add  edi,3
  711.    add  ebp,3
  712.    jmp  nextbit
  713. converttable:
  714.    shl  eax,2
  715.    add  eax,ebx
  716.    mov  edx, dword [eax]
  717.    ;    mov  dword [edi],edx
  718.    mov [ebp],edx
  719.    ret
  720.  
  721. bmptoimg_data_area_count=bmptoimg_data_area_count+1
  722. if bmptoimg_data_area_count = 1
  723. ; DATA AREA
  724. bmptoimg_soi                dd 0
  725. bmptoimg_data_area_bps      dd 0
  726. bmptoimg_data_area_dwps     dd 0
  727. bmptoimg_data_area_sop      dd 0
  728. bmptoimg_data_area_eop      dd 0
  729. bmptoimg_data_area_eos      dd 0
  730. end if
  731.  
  732. end_bmp:
  733.    mov  eax,dword [bmp_load_area+18]
  734.    mov  ebx,dword [bmp_load_area+22]
  735.    mov  dword [img_dest_area],eax
  736.    mov  dword [img_dest_area+4],ebx
  737. }
  738.  
  739. if used ReadGIF
  740. ; For convert RGB to BGR
  741. COLOR_ORDER equ MENUETOS
  742. include 'gif_lite.inc'
  743. end if
  744.  
  745. macro giftoani gifsrc,imgsrc,num_of_frames
  746. {
  747. gif_img_count = num_of_frames
  748.    mov     esi, gifsrc
  749.    mov     edi, imgsrc
  750.    call    ReadGIF
  751. }
  752.  
  753. macro giftoimg gifsrc,imgsrc
  754. {
  755. if defined gif_img_count
  756. error 'giftoimg cannot be used in GIF multiple images mode. Use giftoani instead.'
  757. end if
  758.    mov     esi, gifsrc
  759.    mov     edi, imgsrc
  760.    call    ReadGIF
  761. }
  762.