home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_GEN / TCYBER.ZIP / PCX.PAS < prev    next >
Pascal/Delphi Source File  |  1994-01-15  |  9KB  |  105 lines

  1. {
  2. Turbo Vision CyberTools 1.0
  3. (C) 1994 Steve Goldsmith
  4. All Rights Reserved
  5.  
  6. Fast PCX objects for encoding and decoding various PCX formats.
  7.  
  8. Currently supports:
  9.  
  10. Decode/Encode 2 color.
  11. X size <= 640
  12. Y size <= 480
  13.  
  14. Decode/Encode 256 color/gray.
  15. X size <= 320
  16. Y size <= 200
  17. }
  18.  
  19. UNIT PCX;{$I APP.INC}{$X+}INTERFACE USES DOS,OBJECTS,VGA;CONST PCXMANUFACTURER=$0a;PCXSTART256PAL=$0c;
  20. PCXVER25=0;PCXVER28PAL=2;PCXVER28NOPAL=3;PCXVER30=5;PCXCOLORPAL=1;PCXGRAYPAL=2;PCXMAXXSIZE1=640;
  21. PCXMAXYSIZE1=480;PCXMAXXSIZE256=320;PCXMAXYSIZE256=200;PCXMAXENCODESIZE=4096;PCXMAXDECODESIZE=4096;
  22. PCXMEMALLOC=-100;PCXNOTPCXFORMAT=-101;PCXNOT2COLOR=-102;PCXNOT256COLOR=-103;PCXXSIZE=-104;PCXYSIZE=-105
  23. ;TYPE PCX16PAL=ARRAY [0..47] OF BYTE;PCXHEADER=RECORD MANUFACTURER,VERSION,ENCODING,BITSPERPIXEL:BYTE;
  24. XMIN,YMIN,XMAX,YMAX,HRES,VRES:INTEGER;PALETTE:PCX16PAL;RESERVED,COLORPLANES:BYTE;BYTESPERLINE,
  25. PALETTETYPE:INTEGER;FILLER:ARRAY [0..57] OF BYTE;END;PREADPCXFILE=^TREADPCXFILE;
  26. TREADPCXFILE=OBJECT(TOBJECT)READERROR:INTEGER;XSIZE,YSIZE,ENCODEBUFPOS:WORD;READFILESIZE,
  27. ENCODESIZE:LONGINT;READFILE:FILE;ENCODEBUFPTR:VGADATABUFPTR;DECODEBUFPTR:VGADATABUFPTR;HEADER:PCXHEADER;
  28. READPALETTE:VGAPALETTE;CONSTRUCTOR INIT(FILENAME:PATHSTR);DESTRUCTOR DONE;VIRTUAL;FUNCTION GETENCODEBYTE:BYTE;
  29. PROCEDURE DECODEFILE;VIRTUAL;END;PDECODEPCXFILE2=^TDECODEPCXFILE2;
  30. TDECODEPCXFILE2=OBJECT(TREADPCXFILE)CONSTRUCTOR INIT(FILENAME:PATHSTR);END;PDECODEPCXFILE256=^TDECODEPCXFILE256;
  31. TDECODEPCXFILE256=OBJECT(TREADPCXFILE)CONSTRUCTOR INIT(FILENAME:PATHSTR);PROCEDURE READPAL256;PROCEDURE DECODEFILE
  32. ;VIRTUAL;PROCEDURE PALETTE256TO64;END;PWRITEPCXFILE=^TWRITEPCXFILE;
  33. TWRITEPCXFILE=OBJECT(TOBJECT)WRITEERROR:INTEGER;ENCODEBUFPOS:WORD;WRITEFILE:FILE;ENCODEBUFPTR:VGADATABUFPTR;
  34. HEADER:PCXHEADER;CONSTRUCTOR INIT(FILENAME:PATHSTR);DESTRUCTOR DONE;VIRTUAL;PROCEDURE WRITEHEADER;
  35. PROCEDURE SETHEADER(XS,YS:INTEGER;BP,CP:BYTE);PROCEDURE WRITEENCODEBYTE(E:BYTE);PROCEDURE FLUSHENCODEBUF;
  36. PROCEDURE ENCODEFILE(PCXIMAGE:VGADATABUFPTR);VIRTUAL;END;PENCODEPCXFILE2=^TENCODEPCXFILE2;
  37. TENCODEPCXFILE2=OBJECT(TWRITEPCXFILE)PROCEDURE ENCODEFILE(PCXIMAGE:VGADATABUFPTR);VIRTUAL;END;
  38. PENCODEPCXFILE256=^TENCODEPCXFILE256;TENCODEPCXFILE256=OBJECT(TWRITEPCXFILE)PROCEDURE ENCODEFILE
  39. (PCXIMAGE:VGADATABUFPTR);VIRTUAL;PROCEDURE WRITEPAL256(PAL:VGAPALETTEPTR);PROCEDURE PALETTE64TO256
  40. (PAL:VGAPALETTEPTR);END;CONST PCXDEF1BITPAL:PCX16PAL=($00,$00,$00,$ff,$ff,$ff,$00,$aa,$00,$00,
  41. $aa,$aa,$aa,$00,$00,$aa,$00,$aa,$aa,$aa,$00,$aa,$aa,$aa,$55,$55,$55,$55,$55,$ff,
  42. $55,$ff,$55,$55,$ff,$ff,$ff,$55,$55,$ff,$55,$ff,$ff,$ff,$55,$ff,$ff,$ff);
  43. IMPLEMENTATION USES MEMORY;CONSTRUCTOR TREADPCXFILE.INIT(FILENAME:PATHSTR);BEGIN INHERITED INIT;ENCODEBUFPOS:=
  44. PCXMAXENCODESIZE;ASSIGN(READFILE,FILENAME);{$I-}RESET(READFILE,1);{$I+}READERROR:=IORESULT;IF READERROR=0
  45. THEN BEGIN{$I-}READFILESIZE:=FILESIZE(READFILE);{$I+}READERROR:=IORESULT;IF READERROR=0 THEN BEGIN{$I-}
  46. BLOCKREAD(READFILE,HEADER,SIZEOF(HEADER));{$I+}READERROR:=IORESULT;IF READERROR=0 THEN BEGIN IF
  47. HEADER.MANUFACTURER=PCXMANUFACTURER THEN BEGIN IF HEADER.BITSPERPIXEL=8 THEN ENCODESIZE:=READFILESIZE-SIZEOF
  48. (READPALETTE)-SIZEOF(HEADER)ELSE ENCODESIZE:=READFILESIZE-SIZEOF(HEADER);ENCODEBUFPTR:=MEMALLOC
  49. (PCXMAXENCODESIZE);IF ENCODEBUFPTR=NIL THEN READERROR:=PCXMEMALLOC END ELSE READERROR:=PCXNOTPCXFORMAT
  50. END END END END;DESTRUCTOR TREADPCXFILE.DONE;BEGIN IF ENCODEBUFPTR<> NIL THEN FREEMEM(ENCODEBUFPTR,PCXMAXENCODESIZE
  51. );IF DECODEBUFPTR<> NIL THEN FREEMEM(DECODEBUFPTR,HEADER.BYTESPERLINE * YSIZE);{$I-}CLOSE(READFILE);{$I+}
  52. READERROR:=IORESULT;INHERITED DONE;END;FUNCTION TREADPCXFILE.GETENCODEBYTE:BYTE;VAR O1lIII0lO0I1:WORD;BEGIN IF
  53. ENCODEBUFPOS=PCXMAXENCODESIZE THEN BEGIN ENCODEBUFPOS:=0;{$I-}BLOCKREAD(READFILE,ENCODEBUFPTR^,PCXMAXENCODESIZE
  54. ,O1lIII0lO0I1);{$I+}READERROR:=IORESULT END;GETENCODEBYTE:=ENCODEBUFPTR^[ENCODEBUFPOS];INC(ENCODEBUFPOS
  55. )END;PROCEDURE TREADPCXFILE.DECODEFILE;VAR OIOOIOl1lI,OOlIlOO0OlOI,O1lIOO0O100l:BYTE;OI11IIlOO110:WORD;
  56. OOllO11OOI0I:LONGINT;BEGIN OOllO11OOI0I:=1;OI11IIlOO110:=0;WHILE OOllO11OOI0I<ENCODESIZE DO BEGIN OIOOIOl1lI:=
  57. GETENCODEBYTE;INC(OOllO11OOI0I);IF(OIOOIOl1lI AND $c0)=$c0 THEN BEGIN OIOOIOl1lI:=(OIOOIOl1lI AND $3f)-1;
  58. O1lIOO0O100l:=GETENCODEBYTE;INC(OOllO11OOI0I);FOR OOlIlOO0OlOI:=0 TO OIOOIOl1lI DO DECODEBUFPTR^[OI11IIlOO110+
  59. OOlIlOO0OlOI]:=O1lIOO0O100l;OI11IIlOO110:=OI11IIlOO110+OOlIlOO0OlOI+1 END ELSE BEGIN DECODEBUFPTR^[
  60. OI11IIlOO110]:=OIOOIOl1lI;INC(OI11IIlOO110)END END END;CONSTRUCTOR TDECODEPCXFILE2.INIT(FILENAME:PATHSTR);
  61. BEGIN INHERITED INIT(FILENAME);IF READERROR=0 THEN BEGIN IF(HEADER.BITSPERPIXEL=1)AND(HEADER.COLORPLANES=1)THEN
  62. BEGIN XSIZE:=HEADER.XMAX-HEADER.XMIN+1;YSIZE:=HEADER.YMAX-HEADER.YMIN+1;IF XSIZE<=PCXMAXXSIZE1 THEN
  63. BEGIN IF YSIZE<=PCXMAXYSIZE1 THEN BEGIN DECODEBUFPTR:=MEMALLOC(HEADER.BYTESPERLINE * YSIZE);IF DECODEBUFPTR=NIL
  64. THEN READERROR:=PCXMEMALLOC END ELSE READERROR:=PCXYSIZE END ELSE READERROR:=PCXXSIZE END ELSE READERROR:=
  65. PCXNOT2COLOR END END;CONSTRUCTOR TDECODEPCXFILE256.INIT(FILENAME:PATHSTR);BEGIN INHERITED INIT(FILENAME);IF READERROR
  66. =0 THEN BEGIN IF(HEADER.VERSION=PCXVER30)AND(HEADER.BITSPERPIXEL=8)THEN BEGIN XSIZE:=HEADER.XMAX-HEADER.XMIN+
  67. 1;YSIZE:=HEADER.YMAX-HEADER.YMIN+1;IF XSIZE<=PCXMAXXSIZE256 THEN BEGIN IF YSIZE<=PCXMAXYSIZE256 THEN
  68. BEGIN DECODEBUFPTR:=NIL;DECODEBUFPTR:=MEMALLOC(XSIZE * YSIZE);IF DECODEBUFPTR=NIL THEN READERROR:=PCXMEMALLOC
  69. END ELSE READERROR:=PCXYSIZE END ELSE READERROR:=PCXXSIZE END ELSE READERROR:=PCXNOT256COLOR END END;
  70. PROCEDURE TDECODEPCXFILE256.READPAL256;BEGIN{$I-}SEEK(READFILE,SIZEOF(HEADER)+ENCODESIZE);{$I+}READERROR:=
  71. IORESULT;IF READERROR=0 THEN BEGIN{$I-}BLOCKREAD(READFILE,READPALETTE,SIZEOF(READPALETTE));{$I+}READERROR:=
  72. IORESULT END END;PROCEDURE TDECODEPCXFILE256.DECODEFILE;BEGIN INHERITED DECODEFILE;READPAL256 END;
  73. PROCEDURE TDECODEPCXFILE256.PALETTE256TO64;VAR OI10Illl01l,OI11I0I0ll0:BYTE;BEGIN FOR OI11I0I0ll0:=0 TO VGADACREGMAX
  74.  DO FOR OI10Illl01l:=0 TO VGARGBMAX DO READPALETTE [OI11I0I0ll0,OI10Illl01l]:=READPALETTE [OI11I0I0ll0,
  75. OI10Illl01l] SHR 2 END;CONSTRUCTOR TWRITEPCXFILE.INIT(FILENAME:PATHSTR);BEGIN INHERITED INIT;ASSIGN(WRITEFILE,
  76. FILENAME);{$I-}REWRITE(WRITEFILE,1);{$I+}WRITEERROR:=IORESULT;IF WRITEERROR=0 THEN BEGIN ENCODEBUFPTR:=
  77. MEMALLOC(PCXMAXENCODESIZE);IF ENCODEBUFPTR=NIL THEN WRITEERROR:=PCXMEMALLOC END END;
  78. PROCEDURE TWRITEPCXFILE.WRITEHEADER;BEGIN{$I-}BLOCKWRITE(WRITEFILE,HEADER,SIZEOF(HEADER));{$I+}WRITEERROR:=
  79. IORESULT END;PROCEDURE TWRITEPCXFILE.SETHEADER(XS,YS:INTEGER;BP,CP:BYTE);BEGIN WITH HEADER DO BEGIN MANUFACTURER:=
  80. PCXMANUFACTURER;VERSION:=PCXVER30;ENCODING:=1;BITSPERPIXEL:=BP;XMIN:=0;YMIN:=0;XMAX:=XS-1;YMAX:=YS
  81. -1;HRES:=640;VRES:=480;CASE BITSPERPIXEL OF 1:PALETTE:=PCXDEF1BITPAL;8:PALETTE:=PCXDEF1BITPAL END;
  82. RESERVED:=0;COLORPLANES:=CP;BYTESPERLINE:=XS DIV(8 DIV BP);IF XS AND $07<> 0 THEN INC(BYTESPERLINE);
  83. CASE BITSPERPIXEL OF 1:PALETTETYPE:=0;8:PALETTETYPE:=PCXCOLORPAL END;FILLCHAR(FILLER,SIZEOF(FILLER),0);
  84. END;END;DESTRUCTOR TWRITEPCXFILE.DONE;BEGIN IF ENCODEBUFPTR<> NIL THEN FREEMEM(ENCODEBUFPTR,PCXMAXENCODESIZE);
  85. {$I-}CLOSE(WRITEFILE);{$I+}WRITEERROR:=IORESULT;INHERITED DONE;END;PROCEDURE TWRITEPCXFILE.WRITEENCODEBYTE
  86. (E:BYTE);BEGIN IF ENCODEBUFPOS=PCXMAXENCODESIZE THEN BEGIN{$I-}BLOCKWRITE(WRITEFILE,ENCODEBUFPTR^,
  87. PCXMAXENCODESIZE);{$I+}WRITEERROR:=IORESULT;ENCODEBUFPOS:=0 END;ENCODEBUFPTR^[ENCODEBUFPOS]:=E;INC
  88. (ENCODEBUFPOS)END;PROCEDURE TWRITEPCXFILE.FLUSHENCODEBUF;VAR OI1OOO0OO0:WORD;BEGIN IF ENCODEBUFPOS> 0 THEN
  89. BEGIN{$I-}BLOCKWRITE(WRITEFILE,ENCODEBUFPTR^,ENCODEBUFPOS,OI1OOO0OO0);{$I+}WRITEERROR:=IORESULT;
  90. ENCODEBUFPOS:=0 END END;PROCEDURE TWRITEPCXFILE.ENCODEFILE(PCXIMAGE:VGADATABUFPTR);VAR OOlIlOO0OlOI:BYTE;
  91. OOlOOO1I1OI0,O10OIIlIlO0O0,O10OIIllll0IO,OOIl:WORD;BEGIN FOR OOIl:=0 TO HEADER.YMAX DO BEGIN OOlOOO1I1OI0:=
  92. (HEADER.BYTESPERLINE)* OOIl;O10OIIllll0IO:=OOlOOO1I1OI0+HEADER.BYTESPERLINE-1;OOlIlOO0OlOI:=0;
  93. WHILE OOlOOO1I1OI0<=O10OIIllll0IO DO BEGIN O10OIIlIlO0O0:=OOlOOO1I1OI0+1;WHILE(O10OIIlIlO0O0<=O10OIIllll0IO
  94. )AND(OOlIlOO0OlOI<62)AND(PCXIMAGE^[OOlOOO1I1OI0]=PCXIMAGE^[O10OIIlIlO0O0])DO BEGIN INC(O10OIIlIlO0O0);
  95. INC(OOlIlOO0OlOI)END;IF OOlIlOO0OlOI> 0 THEN BEGIN INC(OOlIlOO0OlOI);WRITEENCODEBYTE(OOlIlOO0OlOI OR $c0);
  96. WRITEENCODEBYTE(PCXIMAGE^[OOlOOO1I1OI0]);OOlOOO1I1OI0:=O10OIIlIlO0O0;OOlIlOO0OlOI:=0 END ELSE BEGIN IF
  97. (PCXIMAGE^[OOlOOO1I1OI0] AND $c0)=$c0 THEN WRITEENCODEBYTE($c1);WRITEENCODEBYTE(PCXIMAGE^[OOlOOO1I1OI0]);INC
  98. (OOlOOO1I1OI0)END END END END;PROCEDURE TENCODEPCXFILE2.ENCODEFILE(PCXIMAGE:VGADATABUFPTR);
  99. BEGIN INHERITED ENCODEFILE(PCXIMAGE);FLUSHENCODEBUF END;PROCEDURE TENCODEPCXFILE256.ENCODEFILE
  100. (PCXIMAGE:VGADATABUFPTR);BEGIN INHERITED ENCODEFILE(PCXIMAGE);WRITEENCODEBYTE(PCXSTART256PAL);FLUSHENCODEBUF END;
  101. PROCEDURE TENCODEPCXFILE256.WRITEPAL256(PAL:VGAPALETTEPTR);BEGIN{$I-}BLOCKWRITE(WRITEFILE,PAL^,SIZEOF(PAL^));
  102. {$I+}WRITEERROR:=IORESULT END;PROCEDURE TENCODEPCXFILE256.PALETTE64TO256(PAL:VGAPALETTEPTR);
  103. VAR OI10Illl01l,OI11I0I0ll0:BYTE;BEGIN FOR OI11I0I0ll0:=0 TO VGADACREGMAX DO FOR OI10Illl01l:=0 TO VGARGBMAX DO PAL
  104. ^[OI11I0I0ll0,OI10Illl01l]:=PAL^[OI11I0I0ll0,OI10Illl01l] SHL 2 END;END.
  105.