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

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

The routine I have will only work With 320x200x256c images.

        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, 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]