home *** CD-ROM | disk | FTP | other *** search
- {══════════════════════════════════════════════════════════════════════════╗
- ║ MDRUtils/Mark D.Rafn [71530,2307] ║
- ║ Rt1 Box138A ║
- ║ Two Harbors, MN 55616 ║
- ║ 218-834-5154 ║
- ║ ║
- ║ Unit for displaying/creating ZSoft PCX format picture files ║
- ║ Must be in graphics mode. ║
- ╚══════════════════════════════════════════════════════════════════════════}
- { See EOF for Revision Record }
-
- {$F+,O+,D-,R-,S-}
- unit PCX;
- interface
- uses Graph, EGA;
-
- type
- FStr = string[ 50 ];
- TripletArray = array[ 0..15,0..2] of byte;
-
- BufferType = array[ 1..128 ] of byte;
- OffsetType = array[ 0..479 ] of longint;
-
- PBuf = ^BufferType;
- POffset = ^OffsetType;
-
- Header = record
- Maker, Version, Encoding, bpp: byte;
- xmn, ymn, xmx, ymx, HRes, VRes: integer;
- CMap: TripletArray;
- Reserved, NPlanes: byte;
- NBpl, Palett: integer;
- end;
-
- DisplayRec = record
- SegBase: word;
- Page0, Page1: word;
- HorizRes, VertRes, BytesPerLine, NoColors: integer;
- end;
-
- { abstract objext type }
- BasePcxPtr = ^BasePcx;
- BasePCX = object
- PCXError: byte;
- Loaded: boolean;
- constructor Init;
- destructor Done; virtual;
- procedure Show( Filename: FStr; PageNo: byte; UsePal: boolean );
- procedure GetPicVp( var PicVp: viewporttype );
- procedure Save( x1, y1, x2, y2: integer; Filename: FStr );
- function GetPCXError: byte;
- function GetXmx: integer;
- function GetXmn: integer;
- function GetYmx: integer;
- function GetYmn: integer;
- function IsMultiPlane: boolean;
- function PCXLoaded: boolean;
- PRIVATE
- Hdr: Header;
- Page: word;
- PFile: pointer;
- SizeF: longint;
- Buf: PBuf;
- Offset: POffset;
- Display: DisplayRec;
- f: file;
- procedure OpenFile( Filename: FStr; NewFile: boolean; var OK: boolean );
- procedure GetHeader;
- procedure SetPal; virtual;
- procedure Decode; virtual;
- procedure DecodeRow( var Index: integer );
- procedure WriteRow( row: integer );
- procedure ReadRow( row, sbyt: integer; var inBuf: PBuf );
- procedure WriteHeader;
- function FillOffsets: boolean; virtual;
- function Encode( Srow, Erow: integer; sbyt: byte ): integer; virtual;
- function EncPut( byt, cnt: byte ): integer;
- function EncodeLine( inBuf: PBuf; inLen: integer ): boolean;
- function GetByte( n: integer ): byte;
- function GetInteger( n1, n2: integer ): integer;
- end; { object }
-
- HercPCXPtr = ^HercPCX;
- HercPCX = object( BasePCX )
- constructor Init;
- destructor Done; virtual;
- PRIVATE
- procedure Decode; virtual;
- procedure GetRow( r, sbyt: integer; var inBuf: PBuf );
- function Encode( Srow, Erow: integer; sbyt: byte ): integer; virtual;
- function FillOffsets: boolean; virtual;
- end; { object }
-
- EgaPCXPtr = ^EgaPCX;
- EgaPCX = object( BasePCX )
- constructor Init;
- destructor Done; virtual;
- PRIVATE
- procedure SetPal; virtual;
- procedure GetRow( Plane, r, sbyt: integer; var inBuf: PBuf );
- procedure Decode; virtual;
- function FillOffsets: boolean; virtual;
- function Encode( Srow, Erow: integer; sbyt: byte ): integer; virtual;
- end; { object }
-
- VgaPCXPtr = ^VgaPcx;
- VgaPCX = object( EgaPCX );
- constructor Init;
- destructor Done; virtual;
- end;
-
- const
- HERC_Attr: DisplayRec = ( SegBase: $B000; Page0: $0000; Page1: $8000;
- HorizRes: 720; VertRes: 348; BytesPerLine: 90;
- NoColors: 2 );
- EGA_Attr: DisplayRec = ( SegBase: $A000; Page0: $0000; Page1: $8000;
- HorizRes: 640; VertRes: 350; BytesPerLine: 80;
- NoColors: 16 );
-
- PCXError0: byte = 0; { no error }
- PCXError1: byte = 1; { File not found }
- PCXError2: byte = 2; { Not enough memory for picture buffer }
- PCXError3: byte = 3; { Error reading PCX file into RAM }
- PCXError4: byte = 4; { Multi-plane image encountered,display adapter for single plane only }
- PCXError5: byte = 5; { Not a valid PCX file }
- PCXError6: byte = 6; { Incorrect PCX version. Must be v3.0 or greater }
- PCXError7: byte = 7; { Not enough memory for Offset Buffer }
- PCXError8: byte = 8; { unable to open new file }
- PCXError9: byte = 9; { Encoding error }
- PCXError10: byte = 10; { Image exceeds 64k limit }
- PCXError11: byte = 11; { Image exceeds display capabilities }
-
- Zero: byte = 0;
- dMaker: byte = 10;
- dVersion: byte = 5;
- dEncoding: byte = 1;
- dbpp: byte = 1;
- dPallet: integer = 1;
- dFillSize = 58;
-
- EGATriplet: TripletArray = ( { 48byte default EGA/VGA palette}
- ($00, $00, $00), { black }
- ($00, $00, $AA), { blue }
- ($00, $AA, $00), { green }
- ($00, $AA, $AA), { cyan }
- ($AA, $00, $00), { red }
- ($AA, $00, $AA), { magenta }
- ($AA, $55, $00), { brown }
- ($AA, $AA, $AA), { lightgray }
- ($55, $55, $55), { darkgray }
- ($00, $00, $FF), { lightblue }
- ($00, $FF, $00), { lightgreen }
- ($00, $FF, $FF), { lightcyan }
- ($FF, $00, $00), { lightred }
- ($FF, $00, $FF), { lightmagenta }
- ($FF, $FF, $00), { yellow }
- ($FF, $FF, $FF) );{ white }
-
- MDATriplet: TripletArray = ( {48 byte default MDA palette entry for header }
- ($00, $00, $00), { black }
- ($FF, $FF, $FF), { white }
- ($00, $00, $00), { remaining = filler }
- ($00, $00, $00),
- ($00, $00, $00),
- ($00, $00, $00),
- ($00, $00, $00),
- ($00, $00, $00),
- ($00, $00, $00),
- ($00, $00, $00),
- ($00, $00, $00),
- ($00, $00, $00),
- ($00, $00, $00),
- ($00, $00, $00),
- ($00, $00, $00),
- ($00, $00, $00));
-
- {══════════════════════════════════════════════════════════════════════════╗
- ╚══════════════════════════════════════════════════════════════════════════}
- implementation
-