home *** CD-ROM | disk | FTP | other *** search
- {
- > Does anyone have ANY source, on how to display a gif in VGA mode
-
- It's as bad as ... but it works.
-
- --- VGA gif loader part 1 of 3 ---
- }
-
- {$X+}
-
- Uses Graph,Dos;
-
- Var
- Gd,Gm: Integer;
- Datei: File;
- palette: array[0..767] of byte;
- buffer: array[0..1279] of byte;
- prefix,tail: array[0..4095] OF WORD;
- keller: array[0..640] of Word;
-
- Function LoadGif(N: String; VersX,VersY: Word): Integer;
-
- Function GetChar: Char;
- Var C: Char;
- Begin
- BlockRead(Datei,C,1);
- GetChar:=C;
- End;
-
- Function GetByte: Byte;
- Var B: Byte;
- Begin
- BlockRead(Datei,B,1);
- GetByte:=B;
- End;
-
- Function GetWord: Word;
- Var W: Word;
- Begin
- BlockRead(Datei,W,2);
- Getword:=W;
- End;
-
- Procedure AGetBytes(Anz: Word);
- Begin
- BlockRead(Datei,Buffer,Anz);
- End;
-
- Var
- lokal_farbtafel: Integer;
- mask,restbytes,pp,lbyte,blocklen,code,oldcode,sonderfall,
- incode,freepos,kanz,pass,clearcode,eofcode,maxcode,infobyte,
- globalfarbtafel,backcolor,interlace,bilddef,abslinks,absoben: word;
- bits,restbits,codesize: Byte;
- rot,gruen,blau,by,bpp: Byte;
- z,i,x1,y1,x2,y2: integer;
- bem: string[6];
- farben: integer;
- x,y,xa,ya,dy: word;
- begin
- loadgif:=0;
- Assign(Datei,N);
- reset(Datei,1);
- if ioresult>0 then begin loadgif:=1; exit; end;
- bem:='';
- for i:=1 to 6 do bem:=bem+getchar;
- if copy(bem,1,3)<>'GIF' then begin loadgif:=2; exit; end;
- x2:=getword;
- y2:=getword;
- infobyte:=getbyte;
- globalfarbtafel:=infobyte and 128;
- bpp:=(infobyte and 7)+1;
- farben:=1 shl bpp;
- backcolor:=getbyte;
- by:=getbyte;
- if globalfarbtafel<>0 then
- for i:=0 to (3*farben)-1 do
- palette[i]:=getbyte shr 2;
- bilddef:=getbyte;
- while bilddef=$21 do begin
- by:=getbyte; z:=getbyte;
- for i:=1 to z do by:=getbyte;
- by:=getbyte;
- bilddef:=getbyte;
- end;
-
-
- if bilddef<>$2c then begin loadgif:=3; exit; end;
- abslinks:=getword+VersX;
- absoben:=getword+VersY;
- x2:=getword;
- y2:=getword;
- by:=getbyte;
- lokal_farbtafel:=by and 128;
- interlace:=by and 64;
- by:=getbyte;
- x1:=0; y1:=0; xa:=x2; Ya:=Y2;
- if farben<16 then begin loadgif:=4; exit; end;
- if lokal_farbtafel<>0 then
- for i:=0 to 3*Farben-1 do
- palette[I]:=getbyte shr 2;
- asm
- mov ax,$1012
- push ds
- pop es
- xor bx,bx
- mov cx,256
- lea dx,palette
- int $10
- mov pass,0
- MOV CL,bpp
- MOV AX,1
- SHL AX,CL
- MOV clearcode,AX
- INC AX
- MOV eofcode,AX
- INC AX
- MOV freepos,AX
- MOV AL,bpp
- MOV AH,0
- INC AX
- MOV codesize,AL
- MOV CX,AX
- MOV AX,1
- SHL AX,CL
- DEC AX
- MOV maxcode,AX
- MOV kanz,0
- MOV dy,8
- MOV restbits,0
- MOV restbytes,0
- MOV x,0
- MOV y,0
- @gif0: CALL FAR PTR @getgifbyte
- CMP AX,eofcode
- je @ende1
- @gif1: CMP AX,clearcode
- je @reset1
- @gif3: MOV AX,code
- MOV incode,AX
- CMP ax,freepos
- jb @gif4
- MOV AX,oldcode
- MOV code,AX
- MOV BX,kanz
- MOV CX,sonderfall
- SHL BX,1
- MOV [OFFSET keller+BX],CX
- INC kanz
- @gif4: CMP AX,clearcode
- JB @gif6
- @gif5: MOV BX,code
- SHL BX,1
- PUSH BX
- MOV AX,[Offset tail+BX]
- MOV BX,kanz
- SHL BX,1
- MOV [OFFSET keller+BX],AX
- INC kanz
- POP BX
- MOV AX,[Offset prefix+BX]
- MOV code,AX
- CMP AX,clearcode
- ja @gif5
- @gif6: MOV BX,kanz
- SHL BX,1
- MOV [Offset keller+BX],AX
- MOV sonderfall,AX
- INC kanz
- @gif7: MOV AX,[Offset keller+BX]
- CALL FAR PTR @pixel
- CMP BX,0
- JE @gif8
- DEC BX
- DEC BX
- JMP @gif7
-
- @gif8: MOV kanz,0
- MOV BX,freepos
- SHL BX,1
- MOV AX,oldcode
- MOV [Offset prefix+BX],AX
- MOV AX,code
- MOV [Offset tail+BX],AX
- MOV AX,incode
- MOV oldcode,AX
- INC freepos
- MOV AX,freepos
- CMP AX,maxcode
- JBE @gif2
- CMP codesize,12
- JAE @gif2
- INC codesize
- MOV CL,codesize
- MOV AX,1
- SHL AX,CL
- DEC AX
- MOV maxcode,AX
- @gif2: JMP @gif0
- @ende1: JMP @ende
- @reset1: MOV AL,bpp
- MOV AH,0
- INC AX
- MOV codesize,AL
- MOV CX,AX
- MOV AX,1
- SHL AX,CL
- DEC AX
- MOV maxcode,AX
- MOV AX,clearcode
- ADD AX,2
- MOV freepos,AX
- CALL FAR PTR @getgifbyte
- MOV sonderfall,AX
- MOV oldcode,AX
- CALL FAR PTR @pixel
- JMP @gif2
- @getgifbyte: MOV DI,0
- MOV mask,1
- MOV bits,0
- @g1: MOV AL,bits
- CMP AL,codesize
- JAE @g0
- CMP restbits,0
- JA @g2
- CMP restbytes,0
- JNE @l2
- PUSH DI
- CALL Getbyte
- POP DI
- MOV blocklen,AX
- MOV restbytes,AX
- PUSH DI
- PUSH AX
- CALL AGetbytes
- POP DI
- MOV pp,0
- @l2: MOV BX,pp
- MOV AL,[BX+Offset Buffer]
- XOR AH,AH
- INC pp
- DEC restbytes
- MOV lbyte,AX
- MOV restbits,8
- @g2: SHR lbyte,1
- JNC @nocarry
- OR DI,mask
- @nocarry: INC bits
- DEC restbits
- SHL mask,1
- JMP @g1
- @g0:MOV bits,0
- MOV code,DI
- MOV AX,DI
- RETF
- @pixel:
- PUSH BX
- MOV BX,x
- ADD BX,abslinks
- PUSH BX
- MOV BX,y
- ADD BX,absoben
- PUSH BX
- PUSH AX
- CALL Putpixel
- POP BX
- INC x
- MOV AX,x
- CMP AX,x2
- JB @s0
- MOV x,0
- CMP interlace,0
- JNE @s1
- INC y
- JMP @s0
- @s1: MOV AX,dy
- ADD y,AX
- MOV AX,y
- CMP AX,y2
- JB @s0
- INC pass
- CMP pass,1
- JNE @s3
- JMP @s2
- @s3: SHR dy,1
- @s2: MOV AX,DY
- SHR AX,1
- MOV Y,AX
- @s0: RETF
- @ende:
- End;
- Close(Datei);
- End;
-
-
- begin
-
- end.