Subversion Repositories Kolibri OS

Rev

Rev 37 | Blame | Last modification | View Log | Download | RSS feed

  1. ; GIF LITE v2.0 by Willow
  2. ; Written in pure assembler by Ivushkin Andrey aka Willow
  3. ;
  4. ; This include file will contain functions to handle GIF image format
  5. ;
  6. ; Created: August 15, 2004
  7. ; Last changed: September 9, 2004
  8.  
  9. ; Change COLOR_ORDER in your program
  10. ; if colors are displayed improperly
  11.  
  12. if ~ (COLOR_ORDER in <MENUETOS,OTHER>)
  13. ; This message may not appear under MenuetOS, so watch...
  14.   display 'Please define COLOR_ORDER: MENUETOS or OTHER',13,10
  15. end if
  16.  
  17. ; virtual structure, used internally
  18.  
  19. struc GIF_list
  20. {
  21.     .NextImg rd 1
  22.     .Left   rw 1
  23.     .Top    rw 1
  24.     .Width  rw 1
  25.     .Height rw 1
  26. }
  27.  
  28. struc GIF_info
  29. {
  30.     .Left   rw 1
  31.     .Top    rw 1
  32.     .Width  rw 1
  33.     .Height rw 1
  34. }
  35.  
  36. _null fix 0x1000
  37.  
  38.  
  39. ; ****************************************
  40. ;   FUNCTION ReadGIF - unpacks GIF image
  41. ; ****************************************
  42. ; in:
  43. ;   esi - pointer to GIF file in memory
  44. ;   edi - pointer to output image list
  45. ;   eax - pointer to work area (MIN 16 KB!)
  46.  
  47. ; out:
  48. ;   eax - 0, all OK;
  49. ;   eax - 1, invalid signature;
  50. ;   eax >=8, unsupported image attributes
  51. ;
  52. ;   ecx - number of images
  53.  
  54. ReadGIF:
  55.     push esi edi
  56.     mov  [.table_ptr],eax
  57.     mov  [.cur_info],edi
  58.     xor  eax,eax
  59.     mov  [.globalColor],eax
  60.     mov  [.img_count],eax
  61.     inc  eax
  62.     cmp  dword[esi],'GIF8'
  63.     jne  .er            ; signature
  64.     mov  ecx,[esi+0xa]
  65.     inc  eax
  66.     add  esi,0xd
  67.     mov  edi,esi
  68.     bt   ecx,7
  69.     jnc  .nextblock
  70.     mov  [.globalColor],esi
  71.     call .Gif_skipmap
  72.   .nextblock:
  73.     cmp  byte[edi],0x21
  74.     jne  .noextblock
  75.     inc  edi
  76.     cmp  byte[edi],0xf9 ; Graphic Control Ext
  77.     jne  .no_gc
  78.     add  edi,7
  79.     jmp  .nextblock
  80.   .no_gc:
  81.     cmp  byte[edi],0xfe ; Comment Ext
  82.     jne  .no_comm
  83.     inc  edi
  84.   .block_skip:
  85.     movzx eax,byte[edi]
  86.     lea  edi,[edi+eax+1]
  87.     cmp  byte[edi],0
  88.     jnz  .block_skip
  89.     inc  edi
  90.     jmp  .nextblock
  91.   .no_comm:
  92.     cmp  byte[edi],0xff ; Application Ext
  93.     jne  .nextblock
  94.     add  edi,13
  95.     jmp  .block_skip
  96.   .noextblock:
  97.     cmp  byte[edi],0x2c    ; image beginning
  98.     jne  .er
  99.     inc  [.img_count]
  100.     inc  edi
  101.     mov  esi,[.cur_info]
  102.     add  esi,4
  103.     xchg esi,edi
  104.     movsd
  105.     movsd
  106.     push edi
  107.     movzx ecx,word[esi]
  108.     inc  esi
  109.     bt   ecx,7
  110.     jc   .uselocal
  111.     push [.globalColor]
  112.     mov  edi,esi
  113.     jmp  .setPal
  114.   .uselocal:
  115.     call .Gif_skipmap
  116.     push esi
  117.   .setPal:
  118.     movzx ecx,byte[edi]
  119.     inc  ecx
  120.     mov  [.codesize],ecx
  121.     dec  ecx
  122.     pop  [.Palette]
  123.     lea  esi,[edi+1]
  124.     mov  edi,[.table_ptr]
  125.     xor  eax,eax
  126.     cld
  127.     lodsb               ; eax - block_count
  128.     add  eax,esi
  129.     mov  [.block_ofs],eax
  130.     mov  [.bit_count],8
  131.     mov  eax,1
  132.     shl  eax,cl
  133.     mov  [.CC],eax
  134.     inc  eax
  135.     mov  [.EOI],eax
  136.     lea  ecx,[eax-1]
  137.     mov  eax, _null shl 16
  138.   .filltable:
  139.     stosd
  140.     inc  eax
  141.     loop .filltable
  142.     pop  edi
  143.     mov  [.img_start],edi
  144.   .reinit:
  145.     mov  edx,[.EOI]
  146.     inc  edx
  147.     push [.codesize]
  148.     pop  [.compsize]
  149.     call .Gif_get_sym
  150.     cmp  eax,[.CC]
  151.     je   .reinit
  152.     call .Gif_output
  153.   .cycle:
  154.     movzx ebx,ax
  155.     call .Gif_get_sym
  156.     cmp  eax,edx
  157.     jae  .notintable
  158.     cmp  eax,[.CC]
  159.     je   .reinit
  160.     cmp  eax,[.EOI]
  161.     je   .end
  162.     call .Gif_output
  163.   .add:
  164.     push eax
  165.     mov  eax,[.table_ptr]
  166.     mov  [eax+edx*4],ebx
  167.     pop  eax
  168.     cmp  edx,0xFFF
  169.     jae  .cycle
  170.     inc  edx
  171.     bsr  ebx,edx
  172.     cmp  ebx,[.compsize]
  173.     jne  .noinc
  174.     inc  [.compsize]
  175.   .noinc:
  176.     jmp  .cycle
  177.   .notintable:
  178.     push eax
  179.     mov  eax,ebx
  180.     call .Gif_output
  181.     push ebx
  182.     movzx eax,bx
  183.     call .Gif_output
  184.     pop  ebx eax
  185.     jmp  .add
  186.   .er:
  187.     pop  edi
  188.     jmp  .ex
  189.   .end:
  190.     mov  eax,[.cur_info]
  191.     mov  [eax],edi
  192.     mov  [.cur_info],edi
  193.     add  esi,2
  194.     xchg esi,edi
  195.   .nxt:
  196.     cmp  byte[edi],0
  197.     jnz  .continue
  198.     inc  edi
  199.     jmp  .nxt
  200.   .continue:
  201.     cmp  byte[edi],0x3b
  202.     jne  .nextblock
  203.     xor  eax,eax
  204.     stosd
  205.     mov  ecx,[.img_count]
  206.   .ex:
  207.     pop  edi esi
  208.     ret
  209.  
  210. .Gif_skipmap:
  211. ; in: ecx - image descriptor, esi - pointer to colormap
  212. ; out: edi - pointer to area after colormap
  213.  
  214.     and  ecx,111b
  215.     inc  ecx            ; color map size
  216.     mov  ebx,1
  217.     shl  ebx,cl
  218.     lea  ebx,[ebx*2+ebx]
  219.     lea  edi,[esi+ebx]
  220.     ret
  221.  
  222. .Gif_get_sym:
  223.     mov  ecx,[.compsize]
  224.     push ecx
  225.     xor  eax,eax
  226.   .shift:
  227.     ror  byte[esi],1
  228.     rcr  eax,1
  229.     dec  [.bit_count]
  230.     jnz  .loop1
  231.     inc  esi
  232.     cmp  esi,[.block_ofs]
  233.     jb   .noblock
  234.     push eax
  235.     xor  eax,eax
  236.     lodsb
  237.     test eax,eax
  238.     jnz  .nextbl
  239.     mov  eax,[.EOI]
  240.     sub  esi,2
  241.     add  esp,8
  242.     jmp  .exx
  243.   .nextbl:
  244.     add  eax,esi
  245.     mov  [.block_ofs],eax
  246.     pop  eax
  247.   .noblock:
  248.     mov  [.bit_count],8
  249.   .loop1:
  250.     loop .shift
  251.     pop  ecx
  252.     rol  eax,cl
  253.   .exx:
  254.     xor  ecx,ecx
  255.     ret
  256.  
  257. .Gif_output:
  258.     push esi eax edx
  259.     mov  edx,[.table_ptr]
  260.   .next:
  261.     push word[edx+eax*4]
  262.     mov  ax,word[edx+eax*4+2]
  263.     inc  ecx
  264.     cmp  ax,_null
  265.     jnz  .next
  266.     shl  ebx,16
  267.     mov  bx,[esp]
  268.   .loop2:
  269.     pop  ax
  270.  
  271.     lea  esi,[eax+eax*2]
  272.     add  esi,[.Palette]
  273.  
  274.     if COLOR_ORDER eq MENUETOS
  275.         mov  esi,[esi]
  276.         bswap esi
  277.         shr  esi,8
  278.         mov  [edi],esi
  279.         add  edi,3
  280.     else
  281.                 movsw
  282.         movsb
  283.         and  byte[edi],0
  284.         inc  edi
  285.     end if
  286.  
  287.     loop .loop2
  288.     pop  edx eax esi
  289.     ret
  290.  
  291.     .globalColor rd 1
  292.     .img_count rd 1
  293.     .cur_info rd 1        ; image table pointer
  294.     .img_start rd 1
  295.     .codesize rd 1
  296.     .compsize rd 1
  297.     .bit_count rd 1
  298.     .CC rd 1
  299.     .EOI rd 1
  300.     .Palette rd 1
  301.     .block_ofs rd 1
  302.     .table_ptr rd 1
  303.