{様様様様様様様様様様様様様様様様様様様様様様様様様様様様様様様様様様様様様� � 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