Subversion Repositories Kolibri OS

Rev

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

  1. COLOR_ORDER equ MENUETOS
  2. gif_hash_offset = gif_hash_area
  3.  
  4. macro gif2img gifsrc,imgsrc
  5. {
  6. local hasharea, ReadGIF, nextblock,_null
  7. ;local globalColor, img_count, cur_info, img_start
  8. ;local codesize, compsize, bit_count, CC, EOI, Palette
  9. ;local block_ofs, table_ptr, gifmacend
  10. local no_gc, block_skip, no_comm, noextblock, uselocal
  11. local setPal, filltable, reinit, cycle, zadd, noinc
  12. local notintable, er, zend, nxt, continue, ex, Gif_skipmap
  13. local Gif_get_sym, shift, nextbl, noblock, loop1, exx
  14. local Gif_output, next, loop2
  15.  
  16. _null fix 0x1000 ; 0x1000
  17.  
  18. if ~gifsrc eq esi
  19.     mov  esi,gifsrc
  20. end if
  21. if ~imgsrc eq edi
  22.     mov  edi,imgsrc
  23. end if
  24.  
  25.     if defined gif_hash_offset
  26.     mov  eax,gif_hash_offset
  27.     else
  28.     mov  eax,hasharea
  29.     end if
  30.  
  31.     call ReadGIF
  32.     ret
  33.  
  34.     if defined gif_hash_offset
  35.     else
  36.     hasharea:
  37.     times 4096 dd 0 ;4096
  38.     end if
  39.  
  40. ReadGIF:
  41.     push esi edi
  42.     mov  [table_ptr],eax
  43.     mov  [cur_info],edi
  44.     xor  eax,eax
  45.     mov  [globalColor],eax
  46.     mov  [img_count],eax
  47.     inc  eax
  48.     cmp  dword[esi],'GIF8'
  49.     jne  ex            ; signature
  50.     mov  ecx,[esi+0xa]
  51.     inc  eax
  52.     add  esi,0xd
  53.     mov  edi,esi
  54.     bt   ecx,7
  55.     jnc  nextblock
  56.     mov  [globalColor],esi
  57.     call Gif_skipmap
  58. nextblock:
  59.     cmp  byte[edi],0x21
  60.     jne  noextblock
  61.     inc  edi
  62.     cmp  byte[edi],0xf9 ; Graphic Control Ext
  63.     jne  no_gc
  64.     add  edi,7
  65.     jmp  nextblock
  66. no_gc:
  67.     cmp  byte[edi],0xfe ; Comment Ext
  68.     jne  no_comm
  69.     inc  edi
  70. block_skip:
  71.     movzx eax,byte[edi]
  72.     lea  edi,[edi+eax+1]
  73.     cmp  byte[edi],0
  74.     jnz  block_skip
  75.     inc  edi
  76.     jmp  nextblock
  77. no_comm:
  78.     cmp  byte[edi],0xff ; Application Ext
  79.     jne  nextblock
  80.     add  edi,13
  81.     jmp  block_skip
  82. noextblock:
  83.     cmp  byte[edi],0x2c    ; image beginning
  84.     jne  ex
  85.     inc  [img_count]
  86.     inc  edi
  87.     mov  esi,[cur_info]
  88.     xchg esi,edi
  89. ;    movsd
  90. ;    movsd
  91.  
  92.     mov   bp,word[esi+4]
  93.     movzx ebx,bp
  94.     mov   [edi],ebx
  95.  
  96.     mov   bp,word[esi+6]
  97.     movzx ebx,bp
  98.     mov   [edi+4],ebx
  99.  
  100.     add edi,8
  101.     add esi,8
  102.  
  103.     push edi
  104.     movzx ecx,word[esi]
  105.     inc  esi
  106.     bt   ecx,7
  107.     jc   uselocal
  108.     push [globalColor]
  109.     mov  edi,esi
  110.     jmp  setPal
  111. uselocal:
  112.     call Gif_skipmap
  113.     push esi
  114. setPal:
  115.     movzx ecx,byte[edi]
  116.     inc  ecx
  117.     mov  [codesize],ecx
  118.     dec  ecx
  119.     pop  [Palette]
  120.     lea  esi,[edi+1]
  121.     mov  edi,[table_ptr]
  122.     xor  eax,eax
  123.     cld
  124.     lodsb               ; eax - block_count
  125.     add  eax,esi
  126.     mov  [block_ofs],eax
  127.     mov  [bit_count],8
  128.     mov  eax,1
  129.     shl  eax,cl
  130.     mov  [CC],eax
  131.     inc  eax
  132.     mov  [EOI],eax
  133.     lea  ecx,[eax-1]
  134.     mov  eax, _null shl 16
  135. filltable:
  136.     stosd
  137.     inc  eax
  138.     loop filltable
  139.     pop  edi
  140. reinit:
  141.     mov  edx,[EOI]
  142.     inc  edx
  143.     push [codesize]
  144.     pop  [compsize]
  145.     call Gif_get_sym
  146.     cmp  eax,[CC]
  147.     je   reinit
  148.     call Gif_output
  149. cycle:
  150.     movzx ebx,ax
  151.     call Gif_get_sym
  152.     cmp  eax,edx
  153.     jae  notintable
  154.     cmp  eax,[CC]
  155.     je   reinit
  156.     cmp  eax,[EOI]
  157.     je   zend
  158.     call Gif_output
  159. zadd:
  160.     push eax
  161.     mov  eax,[table_ptr]
  162.     mov  [eax+edx*4],ebx
  163.     pop  eax
  164.     cmp  edx,0xFFF
  165.     jae  cycle
  166.     inc  edx
  167.     bsr  ebx,edx
  168.     cmp  ebx,[compsize]
  169.     jne  noinc
  170.     inc  [compsize]
  171. noinc:
  172.     jmp  cycle
  173. notintable:
  174.     push eax
  175.     mov  eax,ebx
  176.     call Gif_output
  177.     push ebx
  178.     movzx eax,bx
  179.     call Gif_output
  180.     pop  ebx eax
  181.     jmp  zadd
  182. zend:
  183. ;    mov  eax,[.cur_info]    ; skip offset to next frame
  184. ;    mov  [eax],edi
  185.     mov  [cur_info],edi
  186.     add  esi,2
  187.     xchg esi,edi
  188. nxt:
  189.     cmp  byte[edi],0
  190.     jnz  continue
  191.     inc  edi
  192.     jmp  nxt
  193. continue:
  194. ;    cmp  byte[edi],0x3b    ;read next frame
  195. ;    jne  nextblock
  196.     mov  ecx,[img_count]
  197. ex:
  198.     pop  edi esi
  199.     ret
  200.  
  201. Gif_skipmap:
  202. ; in: ecx - image descriptor, esi - pointer to colormap
  203. ; out: edi - pointer to area after colormap
  204.  
  205.     and  ecx,111b
  206.     inc  ecx            ; color map size
  207.     mov  ebx,1
  208.     shl  ebx,cl
  209.     lea  ebx,[ebx*2+ebx]
  210.     lea  edi,[esi+ebx]
  211.     ret
  212.  
  213. Gif_get_sym:
  214.     mov  ecx,[compsize]
  215.     push ecx
  216.     xor  eax,eax
  217. shift:
  218.     ror  byte[esi],1
  219.     rcr  eax,1
  220.     dec  [bit_count]
  221.     jnz  loop1
  222.     inc  esi
  223.     cmp  esi,[block_ofs]
  224.     jb   noblock
  225.     push eax
  226.     xor  eax,eax
  227.     lodsb
  228.     test eax,eax
  229.     jnz  nextbl
  230.     mov  eax,[EOI]
  231.     sub  esi,2
  232.     add  esp,8
  233.     jmp  exx
  234. nextbl:
  235.     add  eax,esi
  236.     mov  [block_ofs],eax
  237.     pop  eax
  238. noblock:
  239.     mov  [bit_count],8
  240. loop1:
  241.     loop shift
  242.     pop  ecx
  243.     rol  eax,cl
  244. exx:
  245.     xor  ecx,ecx
  246.     ret
  247.  
  248. Gif_output:
  249.     push esi eax edx
  250.     mov  edx,[table_ptr]
  251. next:
  252.     push word[edx+eax*4]
  253.     mov  ax,word[edx+eax*4+2]
  254.     inc  ecx
  255.     cmp  ax,_null
  256.     jnz  next
  257.     shl  ebx,16
  258.     mov  bx,[esp]
  259. loop2:
  260.     pop  ax
  261.  
  262.     lea  esi,[eax+eax*2]
  263.     add  esi,[Palette]
  264.  
  265.     if COLOR_ORDER eq MENUETOS
  266.         mov  esi,[esi]
  267.         bswap esi
  268.         shr  esi,8
  269.         mov  [edi],esi
  270.         add  edi,3
  271.     else
  272.         movsw
  273.         movsb
  274.     end if
  275.  
  276.     loop loop2
  277.     pop  edx eax esi
  278.     ret
  279.  
  280.  
  281. gifmacend:
  282. }
  283.  
  284.