#include #include #include "types.h" #include "memman.h" #include "mem.h" #include "mgifmem.h" #define MGIF "MGIF" #define LZW_MAX_CODES 16384 #define LZW_BUFFER 64000 MGIF_PROC show_proc; static int mgif_frames; static int cur_frame; typedef struct double_s { short group,chr,first,next; }DOUBLE_S; typedef DOUBLE_S CODE_TABLE[LZW_MAX_CODES]; DOUBLE_S *compress_dic=NULL; static void *lzw_buffer=NULL; static int clear_code; static int end_code; static int free_code; static int nextgroup; static int bitsize,init_bitsize; char old_value=0; void do_clear_code() { int i; old_value=0; nextgroup=free_code; bitsize=init_bitsize; for(i=0;igroup=i;p->chr=-1;p->next=-1;p->first=-1; } } void reinit_lzw() { do_clear_code(); } void init_lzw_compressor(int dic_size) { if (compress_dic==NULL) compress_dic=(DOUBLE_S *)getmem(sizeof(CODE_TABLE)); clear_code=1<frames; cur_frame=0; c+=sizeof(*mgh); init_lzw_compressor(8); if (lzw_buffer==NULL) lzw_buffer=getmem(LZW_BUFFER); return c; } void close_mgif() //dealokuje buffery pro prehravani { done_lzw_compressor(); free(lzw_buffer); lzw_buffer=NULL; } int input_code(void *source,long *bitepos,int bitsize,int mask) { __asm { mov esi,source mov edi,bitepos mov ebx,bitsize mov edx,mask mov ecx,[edi] mov eax,ecx shr eax,3 mov eax,[esi+eax] and cl,7 shr eax,cl and eax,edx add [edi],ebx } } //#pragma aux input_code parm [esi][edi][ebx][edx]=\ value[eax] modify [ecx]; int de_add_code(int group,int chr,int mask) { DOUBLE_S *q; q=&compress_dic[nextgroup];q->group=group;q->chr=chr;q->first=compress_dic[group].first+1; nextgroup++; if (nextgroup==mask) { mask=(mask<<1)+1; bitsize++; } return mask; } char fast_expand_code(int code,char **target) //#pragma aux fast_expand_code parm[eax][edi] modify [esi ecx] value [bl] { _asm { mov eax,code mov edi,target cmp eax,256 jnc expand mov esi,[edi] inc dword ptr [edi] mov bl,al add al,old_value mov [esi],al mov old_value,al jmp end expand: mov ebx,compress_dic lea ecx,[eax*8+ebx] movzx eax,short ptr [ecx+4] add [edi],eax push eax mov esi,[edi] eloop:movzx eax,short ptr [ecx+2] mov [esi],al dec esi movzx eax,short ptr [ecx] lea ecx,[eax*8+ebx] cmp eax,256 jnc eloop mov bl,al add al,old_value mov [esi],al inc dword ptr [edi] pop ecx elp2:inc esi add al,[esi] mov [esi],al dec ecx jnz elp2 mov old_value,al end: movzx eax,bl } } void lzw_decode(void *source,char *target) { long bitpos=0; register int code; int old,i; //int group,chr; int old_first; register int mask=0xff; for(i=0;i