[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]
{
SL> Does someone has a pascalsource for showing a PCX file with a resolution
SL> of 640x400x256 /or a automatic build-in convertor who wil let the drawing
Sure thing, the following code will load PCX files with 256 colors and variable
height and width (it looks into the header): (Sorry about the german comments,
but I've got no time to erase them right now :-(( ) }
UNIT uVESAPcx; { (c) 1993 by NEBULA-Software }
{ PCX-Darstellungsroutinen f. VESA } { Olaf Bartelt & Oliver Carow }
INTERFACE { Interface-Teil der Unit }
{ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Typen ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ }
TYPE pVESAPcx = ^tVESAPcx; { Zeiger auf Objekt }
tVESAPcx = OBJECT { Objekt f�r PCX-Dateien }
PROCEDURE load(f : STRING; dx, dy : WORD);
END;
{ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Variablen ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ }
VAR vVESAPcx : pVESAPcx; { Instanz des Objekts tPcx }
IMPLEMENTATION { Implementation-Teil d. Unit }
USES uVesa; { Einbinden der Units }
{ CAN BE FOUND IN SWAG }
{ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ tVESAPcx ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ }
PROCEDURE tVESAPcx.load(f : STRING; dx, dy : WORD);
VAR q : FILE;
b : ARRAY[0..2047] OF BYTE;
anz, pos, c, w, h, e, pack : WORD;
x, y : WORD;
LABEL ende_background;
BEGIN
x := 0; y := 0;
ASSIGN(q, f); {$I-} RESET(q, 1); {$I+}
IF IORESULT <> 0 THEN
GOTO ende_background;
BLOCKREAD(q, b, 128, anz);
IF (b[0] <> 10) OR (b[3] <> 8) THEN
BEGIN
CLOSE(q);
EXIT;
END;
w := SUCC((b[9] - b[5]) SHL 8 + b[8] - b[4]);
h := SUCC((b[11] - b[7]) SHL 8 + b[10] - b[6]);
pack := 0; c := 0; e := y + h;
REPEAT
BLOCKREAD(q, b, 2048, anz);
pos := 0;
WHILE (pos < anz) AND (y < e) DO
BEGIN
IF pack <> 0 THEN
BEGIN
FOR c := c TO c + pack DO
vVesa^.putpixel(x + c+dx, y+dy, b[pos]);
pack := 0;
END
ELSE
IF (b[pos] AND $C0) = $C0 THEN
pack := b[pos] AND $3F
ELSE
BEGIN
vVesa^.putpixel(x + c+dx, y+dy, b[pos]);
INC(c);
END;
INC(pos);
IF c = w THEN
BEGIN
c := 0;
INC(y);
END;
END;
UNTIL (anz = 0) OR (y = e);
SEEK(q, FILESIZE(q) - 3 SHL 8 - 1);
BLOCKREAD(q, b, 3 SHL 8 + 1);
IF b[0] = 12 THEN
FOR x := 1 TO 3 SHL 8 + 1 DO
b[x] := b[x] SHR 2;
CLOSE(q);
ende_background:
END;
{ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Hauptprogramm ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ }
BEGIN
NEW(vVESAPcx);
END.
Remember to put in *your* putpixel routines there!
scroll from top till bottom.(VGA/SVGAcompat./TPASCAL6.0)
[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]