Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;
  2. ;   Assembler
  3. ;     SMALL
  4. ;       CODE
  5. ;         Graphics
  6. ;           Libary
  7. ;
  8. ;   Ver 0.18 By Pavlushin Evgeni (RUSSIA)
  9. ;   www.waptap@mail.ru
  10.  
  11. ;InfoList
  12. ;0.01 LoadImage
  13. ;0.02 SetBmp
  14. ;0.03 Bmptoimg, Setimg ~01.03.2004
  15. ;0.04 Bug deleted, copyimg ~03.05.2004
  16. ;0.05 fullimg, collimg ~05.05.2004
  17. ;0.06 getimg ~09.05.2004
  18. ;0.07 convbmp ~13.05.2004
  19. ;0.08 fps ~14.05.2004
  20. ;0.09 drawfbox ~03.06.2004
  21. ;0.10 all macros optimized by halyavin, add at ~07.06.2004
  22. ;0.11 many macros optimized by halyavin, add at ~30.08.2004
  23. ;0.12 bmptoimg ~07.09.2004
  24. ;0.13 imgtoimg ~08.09.2004
  25. ;0.14 imgtoimg modify not brake bmp pict! ~09.09.2004
  26. ;0.15 giftoimg, giftoani ~10.09.2004
  27. ;0.16 setframe, rgbtobgr, setbmp deleted ~20.09.2004
  28. ;0.17 modification giftoimg, giftoani, getframeoff ~01.10.2004
  29. ;0.18 aframetoimg,aimgtoimg,frametoimg ~03.10.2004
  30.  
  31. aframetoimg_use_count=0
  32. macro aframetoimg img, x, y, canvas,acol
  33. {
  34. local loo,loo2,acolor
  35. aframetoimg_use_count=aframetoimg_use_count+1
  36. if aframetoimg_use_count = 1
  37.  
  38.      jmp end_aframetoimg_proc
  39.  
  40. acolor dd 0
  41. aframetoimg_proc:
  42. ;getout coord
  43.     mov [acolor],ebp
  44.  
  45.     mov edx,ebx ;img   ;xsize
  46.     movzx eax,word [edx]
  47.     add eax,esi ;y cor
  48.  
  49. ;    mov eax,esi ;y cor
  50.     mul dword [ecx] ;canvas xsize
  51.     add eax,edi ;x cor
  52.  
  53.     mov ebp,ebx ;img   ;xsize
  54.     movzx edx,word [ebp]
  55.     add eax,edx
  56.  
  57.     mov ebp,eax
  58.     shl eax,1
  59.     add ebp,eax
  60.     add ebp,ecx ;canvas+8;start
  61.     add ebp,8
  62. ;get img size
  63.     add ebx,4
  64.     mov eax,ebx ;img   ;xsize
  65.     movzx esi,word [eax]
  66.     movzx edi,word [eax+2]
  67.     add ebx,4
  68.     mov edx,ebx ;img+8
  69. loo2:
  70. push esi
  71. loo:
  72. ;test on alpha color
  73.     mov eax,[edx]
  74.     shl eax,8
  75.     shr eax,8
  76.     cmp eax,[acolor]
  77.     jne  yx
  78.     add edx,3
  79.     add ebp,3
  80.     jmp nx
  81. yx:
  82.  
  83.     mov al,byte [edx]
  84.     mov byte [ebp],al
  85.     inc ebp
  86.     inc edx
  87.     mov al,byte [edx]
  88.     mov byte [ebp],al
  89.     inc ebp
  90.     inc edx
  91.     mov al,byte [edx]
  92.     mov byte [ebp],al
  93.     inc ebp
  94.     inc edx
  95. nx:
  96.     dec esi
  97.     jnz loo
  98. pop esi
  99.     sub ebp,3
  100.     mov eax,[ecx]  ;offset = offset+((canxsize-imgxsize)*3)
  101.     sub eax,esi
  102.     add ebp,eax
  103.     shl eax,1
  104.     add ebp,eax
  105.  
  106.     add ebp,3
  107.  
  108.     dec edi
  109.     jnz loo2
  110.     ret
  111. end_aframetoimg_proc:
  112. end if
  113.     push img
  114.     push canvas
  115.     push x
  116.     push y
  117.     push acol
  118.     pop  ebp
  119.     pop  esi
  120.     pop  edi
  121.     pop ecx
  122.     pop ebx
  123.     call aframetoimg_proc
  124. }
  125.  
  126. frametoimg_use_count=0
  127. macro frametoimg img, x, y, canvas
  128. {
  129. local loo,loo2
  130. frametoimg_use_count=frametoimg_use_count+1
  131. if frametoimg_use_count = 1
  132.  
  133.     jmp end_frametoimg_proc
  134.  
  135. frametoimg_proc:
  136. ;getout coord
  137.     mov edx,ebx ;img   ;xsize
  138.     movzx eax,word [edx]
  139.     add eax,esi ;y cor
  140.  
  141. ;    mov eax,esi ;y cor
  142.     mul dword [ecx] ;canvas xsize
  143.     add eax,edi ;x cor
  144.  
  145.     mov ebp,ebx ;img   ;xsize
  146.     movzx edx,word [ebp]
  147.     add eax,edx
  148.  
  149.     mov ebp,eax
  150.     shl eax,1
  151.     add ebp,eax
  152.     add ebp,ecx ;canvas+8;start
  153.     add ebp,8
  154. ;get img size
  155.     add ebx,4
  156.     mov eax,ebx ;img   ;xsize
  157.     movzx esi,word [eax]
  158.     movzx edi,word [eax+2]
  159.     add ebx,4
  160.     mov edx,ebx ;img+8
  161. loo2:
  162. push esi
  163. loo:
  164.     mov al,byte [edx]
  165.     mov byte [ebp],al
  166.     inc ebp
  167.     inc edx
  168.     mov al,byte [edx]
  169.     mov byte [ebp],al
  170.     inc ebp
  171.     inc edx
  172.     mov al,byte [edx]
  173.     mov byte [ebp],al
  174.     inc ebp
  175.     inc edx
  176.  
  177.     dec esi
  178.     jnz loo
  179. pop esi
  180.     sub ebp,3
  181.     mov eax,[ecx]  ;offset = offset+((canxsize-imgxsize)*3)
  182.     sub eax,esi
  183.     add ebp,eax
  184.     shl eax,1
  185.     add ebp,eax
  186.  
  187.     add ebp,3
  188.  
  189.     dec edi
  190.     jnz loo2
  191.     ret
  192. end_frametoimg_proc:
  193. end if
  194.     push img
  195.     push canvas
  196.     push x
  197.     push y
  198.     pop  esi
  199.     pop  edi
  200.     pop ecx
  201.     pop ebx
  202.     call frametoimg_proc
  203. }
  204.  
  205.  
  206. aimgtoimg_use_count=0
  207. macro aimgtoimg img, x, y, canvas,acol,offset
  208. {
  209. local loo,loo2,acolor
  210. aimgtoimg_use_count=aimgtoimg_use_count+1
  211. if aimgtoimg_use_count = 1
  212.  
  213.      jmp end_aimgtoimg_proc
  214.  
  215. acolor dd 0
  216. aimgtoimg_proc:
  217. ;getout coord
  218.     mov [acolor],ebp
  219.     push eax                      ;;;;;;;;;;;;;;;;;;;
  220.     mov eax,esi ;y cor
  221.     mul dword [ecx] ;canvas xsize
  222.     add eax,edi ;x cor
  223.     mov ebp,eax
  224.     shl eax,1
  225.     add ebp,eax
  226.     add ebp,ecx ;canvas+8;start
  227.     add ebp,8
  228. ;get img size
  229.     mov eax,ebx ;img   ;xsize
  230.     mov esi,[eax]
  231.     add ebx,4
  232.     mov eax,ebx ; img+4 ;ysize
  233.     mov edi,[eax]
  234.     add ebx,4
  235.     mov edx,ebx ;img+8
  236.     pop eax
  237.     add edx,eax
  238.  
  239. loo2:
  240. push esi
  241. loo:
  242.  
  243. ;test on alpha color
  244.     mov eax,[edx]
  245.     shl eax,8
  246.     shr eax,8
  247.     cmp eax,[acolor]
  248.     jne  yx
  249.     add edx,3
  250.     add ebp,3
  251.     jmp nx
  252. yx:
  253.  
  254.     mov al,byte [edx]
  255.     mov byte [ebp],al
  256.     inc ebp
  257.     inc edx
  258.     mov al,byte [edx]
  259.     mov byte [ebp],al
  260.     inc ebp
  261.     inc edx
  262.     mov al,byte [edx]
  263.     mov byte [ebp],al
  264.     inc ebp
  265.     inc edx
  266. nx:
  267.     dec esi
  268.     jnz loo
  269. pop esi
  270.     sub ebp,3
  271.     mov eax,[ecx]  ;offset = offset+((canxsize-imgxsize)*3)
  272.     sub eax,esi
  273.     add ebp,eax
  274.     shl eax,1
  275.     add ebp,eax
  276.  
  277.     add ebp,3
  278.  
  279.     dec edi
  280.     jnz loo2
  281.     ret
  282. end_aimgtoimg_proc:
  283. end if
  284.     push img
  285.     push canvas
  286.     push x
  287.     push y
  288.     push acol
  289.     push offset
  290.     pop  eax
  291.     pop  ebp
  292.     pop  esi
  293.     pop  edi
  294.     pop ecx
  295.     pop ebx
  296.     call aimgtoimg_proc
  297. }
  298.  
  299.  
  300.  
  301.  
  302. imgtoimg_use_count=0
  303. macro imgtoimg img, x, y, canvas
  304. {
  305. local loo,loo2
  306. imgtoimg_use_count=imgtoimg_use_count+1
  307. if imgtoimg_use_count = 1
  308.  
  309.      jmp end_imgtoimg_proc
  310. imgtoimg_proc:
  311. ;getout coord
  312.     mov eax,esi ;y cor
  313.     mul dword [ecx] ;canvas xsize
  314.     add eax,edi ;x cor
  315.     mov ebp,eax
  316.     shl eax,1
  317.     add ebp,eax
  318.     add ebp,ecx ;canvas+8;start
  319.     add ebp,8
  320. ;get img size
  321.     mov eax,ebx ;img   ;xsize
  322.     mov esi,[eax]
  323.     add ebx,4
  324.     mov eax,ebx ; img+4 ;ysize
  325.     mov edi,[eax]
  326.     add ebx,4
  327.     mov edx,ebx ;img+8
  328. loo2:
  329. push esi
  330. loo:
  331.     mov al,byte [edx]
  332.     mov byte [ebp],al
  333.     inc ebp
  334.     inc edx
  335.     mov al,byte [edx]
  336.     mov byte [ebp],al
  337.     inc ebp
  338.     inc edx
  339.     mov al,byte [edx]
  340.     mov byte [ebp],al
  341.     inc ebp
  342.     inc edx
  343.     dec esi
  344.     jnz loo
  345. pop esi
  346.     sub ebp,3
  347.     mov eax,[ecx]  ;offset = offset+((canxsize-imgxsize)*3)
  348.     sub eax,esi
  349.     add ebp,eax
  350.     shl eax,1
  351.     add ebp,eax
  352.  
  353.     add ebp,3
  354.  
  355.     dec edi
  356.     jnz loo2
  357.     ret
  358. end_imgtoimg_proc:
  359. end if
  360.     push img
  361.     push canvas
  362.     push x
  363.     push y
  364.     pop  esi
  365.     pop  edi
  366.     pop  ecx
  367.     pop  ebx
  368.     call imgtoimg_proc
  369. }
  370.  
  371.  
  372. ;DrawBox
  373. macro drawfbox x,y,xs,ys,color
  374. {
  375.     words2reg ebx,x,xs ;x*65536+xs
  376.     words2reg ecx,y,ys ;y*65536+ys
  377.     mov  edx,color
  378.     mov  eax,13
  379.     int  0x40
  380. }
  381.  
  382. ; FPS - Set Frame Per Second Display
  383. fps_show_frequency=40
  384. macro fps x,y,color,delcolor
  385. {
  386. local spdat,savetime,new_time,fps,fps_cntr,out_fps,new_time,ttt
  387. local no_out_fps
  388.     jmp spdat
  389. savetime dd 0
  390. fps_cntr dd 0
  391. fps      dd 0
  392. ttt      dd 0
  393. spdat:
  394. get_time:
  395.     mov eax,3
  396.     int 0x40
  397.     cmp eax,[savetime]
  398.     jne new_time
  399.     inc [fps_cntr]
  400.     cmp dword [ttt],0
  401.     je  out_fps
  402.     dec dword [ttt]
  403.     jmp no_out_fps
  404. new_time:
  405.     mov [savetime],eax
  406.     mov ebx,[fps_cntr]
  407.     mov [fps],ebx
  408.     mov [fps_cntr],0
  409. out_fps:
  410. if ~(delcolor eq )
  411.     mov ebx,x*65536+30
  412.     mov ecx,y*65536+7
  413.     mov edx,delcolor
  414.     mov eax,13
  415.     int 0x40
  416. end if
  417.     mov dword [ttt],fps_show_frequency
  418.     mov eax,47
  419.     mov ebx,5*65536
  420. ;   mov bl,0
  421.     mov edx,x*65536+y
  422.     mov esi,color
  423.     mov ecx,[fps]
  424.     int 0x40
  425. no_out_fps:
  426. }
  427.  
  428. ; COLLIMG - Collusion image's
  429. _1dbounce_count=0;
  430. macro collimg img1_off,x1,y1,img2_off,x2,y2,otv
  431. {
  432. local bounce,exit,anot,bc,nbc
  433.         mov esi,[img1_off] ;xs1
  434.         mov edi,[img2_off] ;ys2
  435.         mov eax,x1 ;
  436.         mov ebx,x2 ;
  437.         call _1dbounce
  438.         mov edx,ecx
  439.         mov esi,[img1_off+4] ;ys1
  440.         mov edi,[img2_off+4] ;ys2
  441.         mov eax,y1 ;
  442.         mov ebx,y2 ;
  443.         call _1dbounce
  444.         add edx,ecx
  445.         cmp edx,2
  446.         je bounce
  447.         mov otv,0
  448.         jmp exit
  449. _1dbounce_count=_1dbounce_count+1
  450. if _1dbounce_count = 1
  451. _1dbounce:
  452.         cmp ebx,eax
  453.         jb  anot
  454.         add eax,esi
  455.         cmp eax,ebx
  456.         jbe nbc
  457. bc:
  458.         mov ecx,1
  459.         ret
  460. anot:
  461.     add ebx,edi
  462.         cmp ebx,eax
  463.         ja  bc
  464. nbc:
  465.         xor ecx,ecx
  466.         ret
  467. end if
  468. bounce:
  469.         mov otv,1
  470. exit:
  471. }
  472.  
  473. macro rgbtobgr image
  474. {
  475. local loo
  476.     mov eax,[image]
  477.     mul dword [image+4]
  478.     mov ecx,eax
  479.     mov esi,image+8
  480. ;   add esi,8
  481. loo:
  482.    mov al,[esi]
  483.    mov bl,[esi+2]
  484.    mov [esi],bl
  485.    mov [esi+2],al
  486.    add esi,3
  487.    dec ecx
  488.    jnz loo
  489. }
  490.  
  491.  
  492. macro setimg x , y ,arg3
  493. {
  494.     mov  eax,7
  495.     mov  ebx,arg3
  496.     add  ebx,8
  497.     mov  cx,[arg3]
  498.     shl  ecx,16
  499.     add  cx,[arg3+4]
  500. ;    wordstoreg ecx,[arg3],[arg3+4]
  501.     words2reg edx, x , y  ;arg1*65536+arg2
  502.     int  0x40
  503. }
  504.  
  505. macro setframe x , y ,arg3
  506. {
  507.     mov  eax,7
  508.     mov  ebx,arg3
  509.     add  ebx,8
  510.     words2reg edx, x , y  ;arg1*65536+arg2
  511.     add  edx,dword [arg3]
  512.     mov  ecx,dword [arg3+4]
  513.     int  0x40
  514. }
  515.  
  516.  
  517. macro getimg imgsrc,x,y,xs,ys,imgdest
  518. {
  519. local cyc
  520. if xs eqtype 0
  521.     mov dword [imgdest],xs
  522. else
  523.     mov eax,xs
  524.     mov dword [imgdest],eax
  525. end if
  526. if ys eqtype 0
  527.     mov dword [imgdest+4],ys
  528. else
  529.     mov eax,ys
  530.     mov dword [imgdest+4],eax
  531. end if
  532.  
  533.     mov eax,dword [imgsrc] ;getx size
  534. ;    lea ecx,[eax+2*eax]
  535.     mov ecx,eax
  536.     shl ecx,1
  537.     add ecx,eax
  538.  
  539.     mov ebx,y
  540.     mul ebx
  541.     add eax,x
  542.     mov edx,ecx
  543.     lea eax,[eax+2*eax]  ;eax=offset on imsrc
  544. ;    mov ebp,eax
  545. ;    shl eax,1
  546. ;    add eax,ebp
  547.  
  548.     mov ecx,xs
  549.     mov ebx,ys
  550.  
  551.     mov edi,8+imgdest
  552.     lea esi,[eax+8+imgsrc]
  553. ;    mov esi,eax
  554. ;    add esi,8
  555. ;    add esi,imgsrc
  556.  
  557.     cld
  558. cyc:
  559.     movsw
  560.     movsb
  561.     dec ecx
  562.     jne cyc
  563.     add esi,edx
  564.     mov ecx,xs
  565.     sub esi,ecx
  566.     sub esi,ecx
  567.     sub esi,ecx
  568.     dec ebx
  569.     jne cyc
  570. }
  571.  
  572. macro copyimg img2_off,img1_off
  573. {
  574.     mov  eax,dword [img1_off]
  575.     mov  ebx,dword [img1_off+4]
  576.     mul  ebx
  577.     lea  ecx,[eax+2*eax]
  578.     lea  esi,[img1_off+8]
  579.     lea  edi,[img2_off+8]
  580.     cld
  581.     rep  movsb
  582. }
  583.  
  584. macro fullimg img_off,xs,ys,color
  585. {
  586. local cop
  587.     mov eax,xs
  588.     mov ebx,ys
  589.     mov  dword [img_off],eax
  590.     mov  dword [img_off+4],ebx
  591.     mul  ebx
  592.     lea  ebp,[eax+2*eax]
  593.     mov  esi,color
  594. if color eqtype 0
  595.     mov  ecx,color/65536
  596. else
  597.     mov  ecx,esi
  598.     shr  ecx,16
  599. end if
  600.     xor  edi,edi
  601. cop:
  602.     mov  word [img_off+8+edi],si
  603.     add  edi,2
  604.     mov  byte [img_off+8+edi],cl
  605.     inc  edi
  606.     cmp  edi,ebp
  607.     jne  cop
  608. }
  609.  
  610.  
  611.  
  612.   ; number of frame in ecx
  613.   ; callculatin offset of raw data
  614.  
  615. macro getframeoff num_of_frame,offset_of_animation,offset_of_frame
  616. {
  617. local loo,setpic
  618.   mov ebp,num_of_frame ;ecx
  619.   mov esi,offset_of_animation;Image
  620. loo:
  621.   cmp ebp,0
  622.   je  setpic
  623.   movzx eax,word [esi+4]
  624.   movzx ebx,word [esi+6]
  625.   mul ebx ;dword [esi+4]
  626.   mov ebx,3
  627.   mul ebx
  628.   add eax,8
  629.   add esi,eax
  630.   dec ebp
  631.   jmp loo
  632. setpic:
  633.   mov dword offset_of_frame,esi
  634. }
  635.  
  636.  
  637. ; BMPTOIMG -Convert BMP format TO IMG format
  638. ; (SYNTAX)  BMPTOIMG BMP_source_offset,IMG_dest_ofset
  639. ; (SAMPLE)  View BMPLS.ASM sample.
  640. ; ( NOTE )  This is macros is not brake bmp structure! Tested in 32,8,4 bits
  641.  
  642.  
  643. bmptoimg_data_area_count=0
  644. macro bmptoimg bmp_load_area,img_dest_area
  645. {
  646. local fileinfo,string,end_bmp,nodix
  647. local converttable,noaddelem,nextbit,convert1bpp,convert4bpp,convert2
  648. local nextelem,convertno32,nomorestring,convert1,nextstring,yespicsize
  649. ;local qwe,bmpfn
  650.  
  651. ;  convert:
  652.     movzx eax,word [bmp_load_area+28]
  653.     mul  dword [bmp_load_area+18]
  654.     add  eax,31
  655.     shr  eax,5
  656.     mov  dword [bmptoimg_data_area_dwps],eax  ;dwps-doublewords per string
  657.     shl  eax,2
  658.     mov  dword [bmptoimg_data_area_bps],eax   ;bps-bytes per string
  659.  
  660.     cmp dword [bmp_load_area+34],0
  661.     jne  yespicsize  ;if picture size is defined
  662.     mul dword [bmp_load_area+22]
  663.     mov dword [bmp_load_area+34],eax
  664.  
  665.   yespicsize:
  666.     mov ebp,img_dest_area+8
  667.  
  668.     mov  eax,bmp_load_area
  669.     mov  ebx,eax
  670.     add  ebx, [bmp_load_area+2];file size
  671.     inc  ebx
  672.     mov  dword [bmptoimg_soi],ebx   ;soi-start of image area for drawing
  673.  
  674.     add  eax, [bmp_load_area+10]
  675.     mov  dword [bmptoimg_data_area_sop],eax   ;sop-start of picture in file
  676.     add  eax, [bmp_load_area+34]
  677.     mov  dword [bmptoimg_data_area_eop],eax   ;eop-end of picture in file
  678.     mov  eax, [bmp_load_area+18]
  679.     lea  eax,[eax+2*eax]   ;3x pixels in eax
  680.  
  681.     mov  edi,dword [bmptoimg_soi]   ;initializing
  682.     mov  esi,dword [bmptoimg_data_area_eop]
  683.     sub  esi,dword [bmptoimg_data_area_bps]
  684.  
  685.  
  686.   nextstring:
  687.     push edi
  688.     push ebp
  689.     cmp  word [bmp_load_area+28],24
  690.     jne  convertno32
  691.  
  692.     mov edi,ebp
  693.     mov  ecx,[bmptoimg_data_area_dwps]
  694.     cld
  695.     rep movsd
  696.  
  697.   convert1:
  698.     pop  ebp
  699.     pop  edi
  700.     sub  esi,dword [bmptoimg_data_area_bps]
  701.     sub  esi,dword [bmptoimg_data_area_bps]
  702.     cmp  esi,dword [bmptoimg_data_area_sop]
  703.     jb   end_bmp
  704.     add  edi,eax
  705.     add  ebp,eax
  706.     jmp  nextstring
  707.  
  708.   convertno32:
  709.     mov  ebx,bmp_load_area
  710.     add  ebx, [bmp_load_area+14]
  711.     add  ebx,14          ;start of color table
  712.     push esi
  713.     add  esi,dword [bmptoimg_data_area_bps]
  714.     mov  dword [bmptoimg_data_area_eos],esi
  715.     pop  esi
  716.   nextelem:
  717.     push eax
  718.     movzx eax,byte [esi]
  719.     cmp  word [bmp_load_area+28],4
  720.     je   convert4bpp
  721.     cmp  word [bmp_load_area+28],1
  722.     je   convert1bpp
  723.     call converttable
  724.  
  725.   convert2:
  726.     pop  eax
  727.     inc  esi
  728.     cmp  esi,dword [bmptoimg_data_area_eos]
  729.     jae  convert1
  730.     add  edi,3
  731.  
  732.     add  ebp,3
  733.  
  734.     jmp  nextelem
  735.  
  736.   convert4bpp:
  737.     shl  ax,4
  738.     shr  al,4
  739.     push ax
  740.     movzx eax,ah
  741.     call converttable
  742.     add  edi,3
  743.  
  744.     add ebp,3
  745.  
  746.     pop  ax
  747.     movzx eax,al
  748.     call converttable
  749.     jmp  convert2
  750.  
  751.   convert1bpp:
  752.     mov  ecx,eax
  753.     mov  edx,7
  754.   nextbit:
  755.     xor  eax,eax
  756.     bt   ecx,edx
  757.     jnc  noaddelem
  758.     inc  eax
  759.   noaddelem:
  760.     push edx
  761.     call converttable
  762.     pop  edx
  763.     dec  edx
  764.     js   convert2
  765.     add  edi,3
  766.  
  767.     add  ebp,3
  768.  
  769.     jmp  nextbit
  770.  
  771.   converttable:
  772.     shl  eax,2
  773.     add  eax,ebx
  774.     mov  edx, dword [eax]
  775. ;    mov  dword [edi],edx
  776.     mov [ebp],edx
  777.     ret
  778.  
  779. bmptoimg_data_area_count=bmptoimg_data_area_count+1
  780. if bmptoimg_data_area_count = 1
  781. ; DATA AREA
  782. bmptoimg_soi                dd 0
  783. bmptoimg_data_area_bps      dd 0
  784. bmptoimg_data_area_dwps     dd 0
  785. bmptoimg_data_area_sop      dd 0
  786. bmptoimg_data_area_eop      dd 0
  787. bmptoimg_data_area_eos      dd 0
  788. end if
  789.  
  790. end_bmp:
  791.     mov  eax,dword [bmp_load_area+18]
  792.     mov  ebx,dword [bmp_load_area+22]
  793.     mov  dword [img_dest_area],eax
  794.     mov  dword [img_dest_area+4],ebx
  795. }
  796.  
  797. ; For convert RGB to BGR
  798. COLOR_ORDER equ MENUETOS
  799.  
  800. macro giftoani gifsrc,imgsrc,num_of_frames
  801. {
  802. local hasharea, ReadGIF, nextblock,_null
  803. local globalColor, img_count, cur_info, img_start
  804. local codesize, compsize, bit_count, CC, EOI, Palette
  805. local block_ofs, table_ptr, gifmacend
  806. local no_gc, block_skip, no_comm, noextblock, uselocal
  807. local setPal, filltable, reinit, cycle, zadd, noinc
  808. local notintable, er, zend, nxt, continue, ex, Gif_skipmap
  809. local Gif_get_sym, shift, nextbl, noblock, loop1, exx
  810. local Gif_output, next, loop2
  811.  
  812. _null fix 1000h ; 0x1000
  813.  
  814. ;    jmp sss
  815. ;    if defined gif_hash_offset
  816. ;    else
  817. ;    hasharea:
  818. ;    times 4096 dd 0 ;4096
  819. ;    end if
  820. ;sss:
  821.  
  822.     mov  esi,gifsrc           ;Указатель на ГИФ фаил в памяти
  823.     mov  edi,imgsrc           ;Указатель на список картинок
  824.  
  825.     if defined gif_hash_offset
  826.     mov  eax,gif_hash_offset    ;Рабочая область минимум 4096*4 байт
  827.     else
  828.     mov  eax,hasharea         ;Рабочая область минимум 4096*4 байт
  829.     end if
  830.  
  831.     call ReadGIF
  832.     push ecx
  833.     pop  dword num_of_frames
  834.     jmp  gifmacend
  835.  
  836.     if defined gif_hash_offset
  837.     else
  838.     hasharea:
  839.     times 4096 dd 0 ;4096
  840.     end if
  841.  
  842. ReadGIF:
  843.     push esi edi
  844.     mov  [table_ptr],eax
  845.     mov  [cur_info],edi
  846.     xor  eax,eax
  847.     mov  [globalColor],eax
  848.     mov  [img_count],eax
  849.     inc  eax
  850.     cmp  dword[esi],'GIF8'
  851.     jne  er            ; signature
  852.     mov  ecx,[esi+0xa]
  853.     inc  eax
  854.     add  esi,0xd
  855.     mov  edi,esi
  856.     bt   ecx,7
  857.     jnc  nextblock
  858.     mov  [globalColor],esi
  859.     call Gif_skipmap
  860. nextblock:
  861.     cmp  byte[edi],0x21
  862.     jne  noextblock
  863.     inc  edi
  864.     cmp  byte[edi],0xf9 ; Graphic Control Ext
  865.     jne  no_gc
  866.     add  edi,7
  867.     jmp  nextblock
  868. no_gc:
  869.     cmp  byte[edi],0xfe ; Comment Ext
  870.     jne  no_comm
  871.     inc  edi
  872. block_skip:
  873.     movzx eax,byte[edi]
  874.     lea  edi,[edi+eax+1]
  875.     cmp  byte[edi],0
  876.     jnz  block_skip
  877.     inc  edi
  878.     jmp  nextblock
  879. no_comm:
  880.     cmp  byte[edi],0xff ; Application Ext
  881.     jne  nextblock
  882.     add  edi,13
  883.     jmp  block_skip
  884. noextblock:
  885.     cmp  byte[edi],0x2c    ; image beginning
  886.     jne  er
  887.     inc  [img_count]
  888.     inc  edi
  889.     mov  esi,[cur_info]
  890.     xchg esi,edi
  891.     movsd
  892.     movsd
  893.  
  894.     push edi
  895.     movzx ecx,word[esi]
  896.     inc  esi
  897.     bt   ecx,7
  898.     jc   uselocal
  899.     push [globalColor]
  900.     mov  edi,esi
  901.     jmp  setPal
  902. uselocal:
  903.     call Gif_skipmap
  904.     push esi
  905. setPal:
  906.     movzx ecx,byte[edi]
  907.     inc  ecx
  908.     mov  [codesize],ecx
  909.     dec  ecx
  910.     pop  [Palette]
  911.     lea  esi,[edi+1]
  912.     mov  edi,[table_ptr]
  913.     xor  eax,eax
  914.     cld
  915.     lodsb               ; eax - block_count
  916.     add  eax,esi
  917.     mov  [block_ofs],eax
  918.     mov  [bit_count],8
  919.     mov  eax,1
  920.     shl  eax,cl
  921.     mov  [CC],eax
  922.     inc  eax
  923.     mov  [EOI],eax
  924.     lea  ecx,[eax-1]
  925.     mov  eax, _null shl 16
  926. filltable:
  927.     stosd
  928.     inc  eax
  929.     loop filltable
  930.     pop  edi
  931.     mov  [img_start],edi
  932. reinit:
  933.     mov  edx,[EOI]
  934.     inc  edx
  935.     push [codesize]
  936.     pop  [compsize]
  937.     call Gif_get_sym
  938.     cmp  eax,[CC]
  939.     je   reinit
  940.     call Gif_output
  941. cycle:
  942.     movzx ebx,ax
  943.     call Gif_get_sym
  944.     cmp  eax,edx
  945.     jae  notintable
  946.     cmp  eax,[CC]
  947.     je   reinit
  948.     cmp  eax,[EOI]
  949.     je   zend
  950.     call Gif_output
  951. zadd:
  952.     push eax
  953.     mov  eax,[table_ptr]
  954.     mov  [eax+edx*4],ebx
  955.     pop  eax
  956.     cmp  edx,0xFFF
  957.     jae  cycle
  958.     inc  edx
  959.     bsr  ebx,edx
  960.     cmp  ebx,[compsize]
  961.     jne  noinc
  962.     inc  [compsize]
  963. noinc:
  964.     jmp  cycle
  965. notintable:
  966.     push eax
  967.     mov  eax,ebx
  968.     call Gif_output
  969.     push ebx
  970.     movzx eax,bx
  971.     call Gif_output
  972.     pop  ebx eax
  973.     jmp  zadd
  974. er:
  975.     pop  edi
  976.     jmp  ex
  977. zend:
  978. ;    mov  eax,[.cur_info]    ; skip offset to next frame
  979. ;    mov  [eax],edi
  980.     mov  [cur_info],edi
  981.     add  esi,2
  982.     xchg esi,edi
  983. nxt:
  984.     cmp  byte[edi],0
  985.     jnz  continue
  986.     inc  edi
  987.     jmp  nxt
  988. continue:
  989.     cmp  byte[edi],0x3b    ;read next frame
  990.     jne  nextblock
  991.     xor  eax,eax
  992.     stosd
  993.     mov  ecx,[img_count]
  994. ex:
  995.     pop  edi esi
  996.     ret
  997.  
  998. Gif_skipmap:
  999. ; in: ecx - image descriptor, esi - pointer to colormap
  1000. ; out: edi - pointer to area after colormap
  1001.  
  1002.     and  ecx,111b
  1003.     inc  ecx            ; color map size
  1004.     mov  ebx,1
  1005.     shl  ebx,cl
  1006.     lea  ebx,[ebx*2+ebx]
  1007.     lea  edi,[esi+ebx]
  1008.     ret
  1009.  
  1010. Gif_get_sym:
  1011.     mov  ecx,[compsize]
  1012.     push ecx
  1013.     xor  eax,eax
  1014. shift:
  1015.     ror  byte[esi],1
  1016.     rcr  eax,1
  1017.     dec  [bit_count]
  1018.     jnz  loop1
  1019.     inc  esi
  1020.     cmp  esi,[block_ofs]
  1021.     jb   noblock
  1022.     push eax
  1023.     xor  eax,eax
  1024.     lodsb
  1025.     test eax,eax
  1026.     jnz  nextbl
  1027.     mov  eax,[EOI]
  1028.     sub  esi,2
  1029.     add  esp,8
  1030.     jmp  exx
  1031. nextbl:
  1032.     add  eax,esi
  1033.     mov  [block_ofs],eax
  1034.     pop  eax
  1035. noblock:
  1036.     mov  [bit_count],8
  1037. loop1:
  1038.     loop shift
  1039.     pop  ecx
  1040.     rol  eax,cl
  1041. exx:
  1042.     xor  ecx,ecx
  1043.     ret
  1044.  
  1045. Gif_output:
  1046.     push esi eax edx
  1047.     mov  edx,[table_ptr]
  1048. next:
  1049.     push word[edx+eax*4]
  1050.     mov  ax,word[edx+eax*4+2]
  1051.     inc  ecx
  1052.     cmp  ax,_null
  1053.     jnz  next
  1054.     shl  ebx,16
  1055.     mov  bx,[esp]
  1056. loop2:
  1057.     pop  ax
  1058.  
  1059.     lea  esi,[eax+eax*2]
  1060.     add  esi,[Palette]
  1061.  
  1062.     if COLOR_ORDER eq MENUETOS
  1063.         mov  esi,[esi]
  1064.         bswap esi
  1065.         shr  esi,8
  1066.         mov  [edi],esi
  1067.         add  edi,3
  1068.     else
  1069.         movsw
  1070.         movsb
  1071.     end if
  1072.  
  1073.     loop loop2
  1074.     pop  edx eax esi
  1075.     ret
  1076.  
  1077.     globalColor dd 1
  1078.     img_count dd 1
  1079.     cur_info dd 1        ; image table pointer
  1080.     img_start dd 1
  1081.     codesize dd 1
  1082.     compsize dd 1
  1083.     bit_count dd 1
  1084.     CC dd 1
  1085.     EOI dd 1
  1086.     Palette dd 1
  1087.     block_ofs dd 1
  1088.     table_ptr dd 1
  1089.  
  1090. gifmacend:
  1091. }
  1092.  
  1093.  
  1094.  
  1095. macro giftoimg gifsrc,imgsrc
  1096. {
  1097. local hasharea, ReadGIF, nextblock,_null
  1098. local globalColor, img_count, cur_info, img_start
  1099. local codesize, compsize, bit_count, CC, EOI, Palette
  1100. local block_ofs, table_ptr, gifmacend
  1101. local no_gc, block_skip, no_comm, noextblock, uselocal
  1102. local setPal, filltable, reinit, cycle, zadd, noinc
  1103. local notintable, er, zend, nxt, continue, ex, Gif_skipmap
  1104. local Gif_get_sym, shift, nextbl, noblock, loop1, exx
  1105. local Gif_output, next, loop2
  1106.  
  1107. _null fix 0x1000 ; 0x1000
  1108.  
  1109.     mov  esi,gifsrc           ;Указатель на ГИФ фаил в памяти
  1110.     mov  edi,imgsrc           ;Указатель на список картинок
  1111.  
  1112.     if defined gif_hash_offset
  1113.     mov  eax,gif_hash_offset    ;Рабочая область минимум 4096*4 байт
  1114.     else
  1115.     mov  eax,hasharea         ;Рабочая область минимум 4096*4 байт
  1116.     end if
  1117.  
  1118.     call ReadGIF
  1119.     jmp  gifmacend
  1120.  
  1121.     if defined gif_hash_offset
  1122.     else
  1123.     hasharea:
  1124.     times 4096 dd 0 ;4096
  1125.     end if
  1126.  
  1127. ReadGIF:
  1128.     push esi edi
  1129.     mov  [table_ptr],eax
  1130.     mov  [cur_info],edi
  1131.     xor  eax,eax
  1132.     mov  [globalColor],eax
  1133.     mov  [img_count],eax
  1134.     inc  eax
  1135.     cmp  dword[esi],'GIF8'
  1136.     jne  er            ; signature
  1137.     mov  ecx,[esi+0xa]
  1138.     inc  eax
  1139.     add  esi,0xd
  1140.     mov  edi,esi
  1141.     bt   ecx,7
  1142.     jnc  nextblock
  1143.     mov  [globalColor],esi
  1144.     call Gif_skipmap
  1145. nextblock:
  1146.     cmp  byte[edi],0x21
  1147.     jne  noextblock
  1148.     inc  edi
  1149.     cmp  byte[edi],0xf9 ; Graphic Control Ext
  1150.     jne  no_gc
  1151.     add  edi,7
  1152.     jmp  nextblock
  1153. no_gc:
  1154.     cmp  byte[edi],0xfe ; Comment Ext
  1155.     jne  no_comm
  1156.     inc  edi
  1157. block_skip:
  1158.     movzx eax,byte[edi]
  1159.     lea  edi,[edi+eax+1]
  1160.     cmp  byte[edi],0
  1161.     jnz  block_skip
  1162.     inc  edi
  1163.     jmp  nextblock
  1164. no_comm:
  1165.     cmp  byte[edi],0xff ; Application Ext
  1166.     jne  nextblock
  1167.     add  edi,13
  1168.     jmp  block_skip
  1169. noextblock:
  1170.     cmp  byte[edi],0x2c    ; image beginning
  1171.     jne  er
  1172.     inc  [img_count]
  1173.     inc  edi
  1174.     mov  esi,[cur_info]
  1175.     xchg esi,edi
  1176. ;    movsd
  1177. ;    movsd
  1178.  
  1179.     mov   bp,word[esi+4]
  1180.     movzx ebx,bp
  1181.     mov   [edi],ebx
  1182.  
  1183.     mov   bp,word[esi+6]
  1184.     movzx ebx,bp
  1185.     mov   [edi+4],ebx
  1186.  
  1187.     add edi,8
  1188.     add esi,8
  1189.  
  1190.     push edi
  1191.     movzx ecx,word[esi]
  1192.     inc  esi
  1193.     bt   ecx,7
  1194.     jc   uselocal
  1195.     push [globalColor]
  1196.     mov  edi,esi
  1197.     jmp  setPal
  1198. uselocal:
  1199.     call Gif_skipmap
  1200.     push esi
  1201. setPal:
  1202.     movzx ecx,byte[edi]
  1203.     inc  ecx
  1204.     mov  [codesize],ecx
  1205.     dec  ecx
  1206.     pop  [Palette]
  1207.     lea  esi,[edi+1]
  1208.     mov  edi,[table_ptr]
  1209.     xor  eax,eax
  1210.     cld
  1211.     lodsb               ; eax - block_count
  1212.     add  eax,esi
  1213.     mov  [block_ofs],eax
  1214.     mov  [bit_count],8
  1215.     mov  eax,1
  1216.     shl  eax,cl
  1217.     mov  [CC],eax
  1218.     inc  eax
  1219.     mov  [EOI],eax
  1220.     lea  ecx,[eax-1]
  1221.     mov  eax, _null shl 16
  1222. filltable:
  1223.     stosd
  1224.     inc  eax
  1225.     loop filltable
  1226.     pop  edi
  1227.     mov  [img_start],edi
  1228. reinit:
  1229.     mov  edx,[EOI]
  1230.     inc  edx
  1231.     push [codesize]
  1232.     pop  [compsize]
  1233.     call Gif_get_sym
  1234.     cmp  eax,[CC]
  1235.     je   reinit
  1236.     call Gif_output
  1237. cycle:
  1238.     movzx ebx,ax
  1239.     call Gif_get_sym
  1240.     cmp  eax,edx
  1241.     jae  notintable
  1242.     cmp  eax,[CC]
  1243.     je   reinit
  1244.     cmp  eax,[EOI]
  1245.     je   zend
  1246.     call Gif_output
  1247. zadd:
  1248.     push eax
  1249.     mov  eax,[table_ptr]
  1250.     mov  [eax+edx*4],ebx
  1251.     pop  eax
  1252.     cmp  edx,0xFFF
  1253.     jae  cycle
  1254.     inc  edx
  1255.     bsr  ebx,edx
  1256.     cmp  ebx,[compsize]
  1257.     jne  noinc
  1258.     inc  [compsize]
  1259. noinc:
  1260.     jmp  cycle
  1261. notintable:
  1262.     push eax
  1263.     mov  eax,ebx
  1264.     call Gif_output
  1265.     push ebx
  1266.     movzx eax,bx
  1267.     call Gif_output
  1268.     pop  ebx eax
  1269.     jmp  zadd
  1270. er:
  1271.     pop  edi
  1272.     jmp  ex
  1273. zend:
  1274. ;    mov  eax,[.cur_info]    ; skip offset to next frame
  1275. ;    mov  [eax],edi
  1276.     mov  [cur_info],edi
  1277.     add  esi,2
  1278.     xchg esi,edi
  1279. nxt:
  1280.     cmp  byte[edi],0
  1281.     jnz  continue
  1282.     inc  edi
  1283.     jmp  nxt
  1284. continue:
  1285. ;    cmp  byte[edi],0x3b    ;read next frame
  1286. ;    jne  nextblock
  1287.     xor  eax,eax
  1288.     stosd
  1289.     mov  ecx,[img_count]
  1290. ex:
  1291.     pop  edi esi
  1292.     ret
  1293.  
  1294. Gif_skipmap:
  1295. ; in: ecx - image descriptor, esi - pointer to colormap
  1296. ; out: edi - pointer to area after colormap
  1297.  
  1298.     and  ecx,111b
  1299.     inc  ecx            ; color map size
  1300.     mov  ebx,1
  1301.     shl  ebx,cl
  1302.     lea  ebx,[ebx*2+ebx]
  1303.     lea  edi,[esi+ebx]
  1304.     ret
  1305.  
  1306. Gif_get_sym:
  1307.     mov  ecx,[compsize]
  1308.     push ecx
  1309.     xor  eax,eax
  1310. shift:
  1311.     ror  byte[esi],1
  1312.     rcr  eax,1
  1313.     dec  [bit_count]
  1314.     jnz  loop1
  1315.     inc  esi
  1316.     cmp  esi,[block_ofs]
  1317.     jb   noblock
  1318.     push eax
  1319.     xor  eax,eax
  1320.     lodsb
  1321.     test eax,eax
  1322.     jnz  nextbl
  1323.     mov  eax,[EOI]
  1324.     sub  esi,2
  1325.     add  esp,8
  1326.     jmp  exx
  1327. nextbl:
  1328.     add  eax,esi
  1329.     mov  [block_ofs],eax
  1330.     pop  eax
  1331. noblock:
  1332.     mov  [bit_count],8
  1333. loop1:
  1334.     loop shift
  1335.     pop  ecx
  1336.     rol  eax,cl
  1337. exx:
  1338.     xor  ecx,ecx
  1339.     ret
  1340.  
  1341. Gif_output:
  1342.     push esi eax edx
  1343.     mov  edx,[table_ptr]
  1344. next:
  1345.     push word[edx+eax*4]
  1346.     mov  ax,word[edx+eax*4+2]
  1347.     inc  ecx
  1348.     cmp  ax,_null
  1349.     jnz  next
  1350.     shl  ebx,16
  1351.     mov  bx,[esp]
  1352. loop2:
  1353.     pop  ax
  1354.  
  1355.     lea  esi,[eax+eax*2]
  1356.     add  esi,[Palette]
  1357.  
  1358.     if COLOR_ORDER eq MENUETOS
  1359.         mov  esi,[esi]
  1360.         bswap esi
  1361.         shr  esi,8
  1362.         mov  [edi],esi
  1363.         add  edi,3
  1364.     else
  1365.         movsw
  1366.         movsb
  1367.     end if
  1368.  
  1369.     loop loop2
  1370.     pop  edx eax esi
  1371.     ret
  1372.  
  1373.     globalColor dd 1
  1374.     img_count dd 1
  1375.     cur_info dd 1        ; image table pointer
  1376.     img_start dd 1
  1377.     codesize dd 1
  1378.     compsize dd 1
  1379.     bit_count dd 1
  1380.     CC dd 1
  1381.     EOI dd 1
  1382.     Palette dd 1
  1383.     block_ofs dd 1
  1384.     table_ptr dd 1
  1385.  
  1386. gifmacend:
  1387. }
  1388.  
  1389.