[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]

{===========================================================================
Date: 08-23-93 (08:26)
From: NORMAN YEN
Subj: RE: .PCX AND COMM ROUTINE
---------------------------------------------------------------------------

 MB> I heard something in this echo about someone having Pascal source to
 MB> view .PCX
 MB> files and I would appreciate if they would re-post the source if it's
 MB> not too
 MB> long or tell me where I can get it.  I am also looking for some good
 MB> COMM routines for Pascal, anyone have any or no where I can get some?

        The routine I have will only work with 320x200x256c images.
Hope it helps!

Norman

{
        For all those Pascal programmers who just want something simple
        to display a 320x200x256 colour PCX file on the screen here it is.
        This was a direct translation from the C source code of PCXVIEW
        written by Lee Hamel (Patch), Avalanche coder.  I removed the
        inline assembly code so that you beginners can see what was going
        on behind those routines.

                                                      Norman Yen
                                                      Infinite Dreams BBS
                                                      August 11, 1993
}

type pcxheader_rec=record
     manufacturer: byte;
     version: byte;
     encoding: byte;
     bits_per_pixel: byte;
     xmin, ymin: word;
     xmax, ymax: word;
     hres: word;
     vres: word;
     palette: array [0..47] of byte;
     reserved: byte;
     colour_planes: byte;
     bytes_per_line: word;
     palette_type: word;
     filler: array [0..57] of byte;
     end;

var header: pcxheader_rec;
    width, depth: word;
    bytes: word;
    palette: array [0..767] of byte;
    f: file;
    c: byte;

procedure Read_PCX_Line(vidoffset: word);
var c, run: byte;
    n: integer;
    w: word;
begin
  n:=0;
  while (n < bytes) do
  begin
    blockread (f, c, 1);

    { if it's a run of bytes field }
    if ((c and 192)=192) then
    begin

      { and off the high bits }
      run:=c and 63;

      { get the run byte }
      blockread (f, c, 1);
      n:=n+run;
      for w:=0 to run-1 do
      begin
        mem [$a000:vidoffset]:=c;
        inc (vidoffset);
      end;
    end else
    begin
      n:=n+1;
      mem [$a000:vidoffset]:=c;
      inc (vidoffset);
    end;
  end;
end;

procedure Unpack_PCX_File;
var i: integer;
begin
  for i:=0 to 767 do
    palette [i]:=palette [i] shr 2;
  asm
    mov ax,13h
    int 10h
    mov ax,1012h
    xor bx,bx
    mov cx,256
    mov dx,offset palette
    int 10h
  end;
  for i:=0 to depth-1 do
    Read_PCX_Line (i*320);
  asm
    xor ax,ax
    int 16h
    mov ax,03h
    int 10h
  end;
end;

begin
  if (paramcount > 0) then
  begin
    assign (f, paramstr (1));
    reset (f,1);
    blockread (f, header, sizeof (header));
    if (header.manufacturer=10) and (header.version=5) and
       (header.bits_per_pixel=8) and (header.colour_planes=1) then
    begin
      seek (f, filesize (f)-769);
      blockread (f, c, 1);
      if (c=12) then
      begin
        blockread (f, palette, 768);
        seek (f, 128);
        width:=header.xmax-header.xmin+1;
        depth:=header.ymax-header.ymin+1;
        bytes:=header.bytes_per_line;
        Unpack_PCX_File;
      end else writeln ('Error reading palette.');
    end else writeln ('Not a 256 colour PCX file.');
    close (f);
  end else writeln ('No file name specified.');
end.


[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]