home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / grafik / vgakit / pcx / pcx.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1991-10-16  |  10.5 KB  |  462 lines

  1.  
  2. PROGRAM PCX;
  3. {
  4.   PROGRAMM ZUM ANZEIGEN VON PCX- FILES
  5.  
  6.   Paul Schubert, Rottweiler Str. 8, D6000 Frankfurt /M 1, 069 / 231145
  7.  
  8. }
  9. {$R-}
  10. {$S-}
  11.  
  12.  
  13. {.$DEFINE PAUL}
  14.  
  15.  
  16. USES  TPCRT,DIRUNIT,TPSTRING,SVGA;
  17.  
  18.  
  19. CONST LINLEN   = 2048;
  20.       PCXHDRSIZE  = 128;
  21.  
  22.  
  23. TYPE  CMAPTYP  = ARRAY[0..255,0..2] OF BYTE;
  24.       PALTYP   = ARRAY[0..15,0..2] OF BYTE;
  25.  
  26. TYPE  HDRTYP = RECORD
  27.         ID,VER,COMPR,BPP  : BYTE;
  28.         X1,Y1,X2,Y2       : WORD;
  29.         RX,RY             : WORD;
  30.         HDRPAL            : PALTYP;
  31.         RES               : BYTE;
  32.         PLANES            : BYTE;
  33.         BYTES             : WORD;
  34.         PAL2              : WORD;
  35.         FILL              : ARRAY[1..58] OF BYTE;
  36. { ERRECHNETE WERTE }
  37.         WID,HIG           : WORD;
  38.         CMAPSIZ           : WORD;
  39.         MONO              : BOOLEAN;
  40.       END;
  41.  
  42.  
  43. VAR   I,J                  : INTEGER;
  44.       S                    : STRING;
  45.       CH1,CH2              : CHAR;
  46.       PATH,FN              : STRING;
  47.       F                    : FILE;
  48.       ENDE,AUTO            : BOOLEAN;
  49.  
  50.       CMAP                 : CMAPTYP;
  51.       PAL                  : VGAPALETTETYP ABSOLUTE CMAP;
  52.       HDR                  : HDRTYP;
  53.       LINBUF               : ARRAY[0..LINLEN] OF BYTE;
  54.  
  55.  
  56. PROCEDURE GRAPHEIN(VORGABE:BYTE);
  57.  
  58. PROCEDURE SET1024X768;
  59. BEGIN
  60.   IF HDR.MONO THEN VMOD := $37 { 16 COLOR }
  61.               ELSE VMOD := $38;
  62.   XWID := 1024;
  63.   YWID := 768;
  64. END; { SET1024X768 }
  65.  
  66. PROCEDURE SET800X600;
  67. BEGIN
  68.   IF HDR.MONO THEN VMOD := $29 { 16 COLOR }
  69.               ELSE VMOD := $30;
  70.   XWID := 800;
  71.   YWID := 600;
  72. END; { SET800X600 }
  73.  
  74. PROCEDURE SET640X480;
  75. BEGIN
  76.   IF HDR.MONO THEN VMOD := $11
  77.               ELSE VMOD := $2E;
  78.   XWID := 640;
  79.   YWID := 480;
  80. END; { SET640X480 }
  81.  
  82. PROCEDURE SET640X400;
  83. BEGIN
  84.   IF HDR.MONO THEN BEGIN
  85.     SET640X480;
  86.     EXIT;
  87.   END ELSE VMOD := $2F;
  88.   XWID := 640;
  89.   YWID := 400;
  90. END; { SET640X400 }
  91.  
  92. PROCEDURE SET640X350;
  93. BEGIN
  94.   IF HDR.MONO THEN VMOD := $0F
  95.               ELSE VMOD := $2D;
  96.   XWID := 640;
  97.   YWID := 350;
  98. END; { SET640X350 }
  99.  
  100. PROCEDURE SET320X200;
  101. BEGIN
  102.   IF HDR.MONO THEN BEGIN
  103.     VMOD := $0D { 16 COLOR }
  104. (*
  105.     SET640X350;
  106.     EXIT;
  107. *)
  108.   END ELSE VMOD := $13;
  109.   XWID := 320;
  110.   YWID := 200;
  111. END; { SET320X200 }
  112.  
  113. BEGIN { GRAPHEIN }
  114.   WITH HDR DO BEGIN
  115.     SET320X200;
  116.  
  117.     IF VORGABE = 0 THEN BEGIN
  118.       IF WID > 320 THEN BEGIN
  119.         SET640X350;
  120.         IF HIG > 350 THEN SET640X400;
  121.         IF HIG > 400 THEN SET640X480;
  122.         IF HIG > 480 THEN SET800X600;
  123.         IF HIG > 600 THEN SET1024X768;
  124.       END;
  125.       IF WID > 640 THEN BEGIN
  126.         IF HIG <= 600 THEN SET800X600
  127.                       ELSE SET1024X768;
  128.       END;
  129.       IF WID > 800 THEN SET1024X768;
  130.     END ELSE BEGIN
  131.       CASE VORGABE OF
  132.         2 : SET640X350;
  133.         3 : SET640X400;
  134.         4 : SET640X480;
  135.         5 : SET800X600;
  136.         6 : SET1024X768;
  137.       END;
  138.     END;
  139.  
  140.     IF CHECKVGA(VMOD) < 0 THEN BEGIN
  141.       TEXTMODE(CO80);
  142.       WRITELN;
  143.       WRITELN('KEINE VGA- KARTE VORHANDEN, ODER DIE VGA UNTERSTÜTZT');
  144.       WRITELN('DEN GEWÜNSCHTEN VIDEO- MODUS NICHT');
  145.       HALT(1);
  146.     END;
  147.     MAXX := PRED(XWID);
  148.     MAXY := PRED(YWID);
  149.  
  150.     DIRECTVIDEO := FALSE;
  151.  
  152.     IF (VER = 3) AND NOT (CMAPSIZ = 2) THEN EXIT;
  153.  
  154.     VGASETPALETTE(PAL,0,PRED(CMAPSIZ));
  155.  
  156.   END; { WITH HDR }
  157. END; {GRAPHEIN }
  158.  
  159.  
  160. PROCEDURE AUS;
  161. BEGIN
  162.   TEXTMODE(CO80);
  163.   HALT(3);
  164. END; { AUS }
  165.  
  166.  
  167. FUNCTION LIESHDR:BOOLEAN;
  168. VAR   FP   : LONGINT;
  169.       I,J  : INTEGER;
  170. BEGIN
  171.   LIESHDR := FALSE;
  172.   BLOCKREAD(F,HDR,PCXHDRSIZE);
  173.   WITH HDR DO BEGIN
  174.     IF ID <> 10 THEN EXIT;
  175.     WID := SUCC(X2 - X1);
  176.     HIG := SUCC(Y2 - Y1);
  177.     CMAPSIZ := 1 SHL (BPP * PLANES);
  178.  
  179.     IF CMAPSIZ = 2 THEN BEGIN
  180.       CMAP[0,0] := 0;   CMAP[0,1] := 0;   CMAP[0,2] := 0;
  181.       CMAP[1,0] := $FF; CMAP[1,1] := $FF; CMAP[1,2] := $FF;
  182.     END;
  183.     IF CMAPSIZ = 4 THEN BEGIN
  184.       CMAP[0,0] := 0;   CMAP[0,1] := 0;   CMAP[0,2] := 0;
  185.       CMAP[1,0] := 85;  CMAP[1,1] := $FF; CMAP[1,2] := $FF;
  186.       CMAP[2,0] := $FF; CMAP[2,1] := 85;  CMAP[2,2] := $FF;
  187.       CMAP[3,0] := $FF; CMAP[3,1] := $FF; CMAP[3,2] := $FF;
  188.     END;
  189.     IF CMAPSIZ = 16 THEN BEGIN
  190.       MOVE(HDR.HDRPAL,CMAP,48);
  191.     END;
  192.     IF CMAPSIZ = 256 THEN BEGIN
  193.       FP := FILEPOS(F);
  194.       SEEK(F,FILESIZE(F) - 768);
  195.       BLOCKREAD(F,CMAP,768);
  196.       SEEK(F,FP);
  197.     END;
  198.     FOR I := 0 TO PRED(CMAPSIZ) DO BEGIN
  199.       FOR J := 0 TO 2 DO CMAP[I][J] := CMAP[I][J] SHR 2;
  200.     END;
  201.     MONO := (BPP = 1) AND (PLANES = 1);
  202.   END; { WITH HDR }
  203.   LIESHDR := TRUE;
  204. END; { LIESHDR }
  205.  
  206.  
  207. PROCEDURE ZEIGEHDR;
  208. BEGIN
  209.   WITH HDR DO BEGIN
  210.   WRITELN('Version ',VER,',    Komprimiert ',COMPR);
  211.   WRITELN(WID:5,'*',HIG:5);
  212.   WRITELN(BPP:3,' Bits / Pixel,  ',PLANES,' Planes');
  213.   WRITELN;
  214.   WRITELN('linksoben = ',X1,',',Y1,'     rechtsunten = ',X2,',',Y2,'   Auflösung = ',RX,',',RY);
  215.   WRITELN('Linelength = ',BYTES,'    PAL2 = ',PAL2,' (',HEXW(PAL2),')');
  216.   END; { WITH HDR }
  217. END; { ZEIGEHDR }
  218.  
  219.  
  220. PROCEDURE ZEIGEBILD;
  221. CONST MASKS  : ARRAY[0..7] OF BYTE = ($80,$40,$20,$10,8,4,2,1);
  222. VAR   X,Y,Z  : WORD;
  223.       B,B2   : BYTE;
  224.       BW     : WORD;
  225.       BITMSK : BYTE;
  226.       BBUF   : ARRAY[0..LINLEN] OF BYTE;
  227.  
  228. PROCEDURE VGABILD;
  229. (*
  230. VAR   XX,YY  : WORD;
  231. *)
  232. BEGIN
  233.   WITH HDR DO BEGIN
  234.     REPEAT
  235.       IF COMPR = 1 THEN BEGIN
  236.         REPEAT
  237.           BLOCKREAD(F,LINBUF[X],1);
  238.           IF LINBUF[X] > $BF THEN BEGIN
  239.             B := LINBUF[X] AND $3F;
  240.             IF B > 0 THEN BEGIN
  241.               BLOCKREAD(F,B2,1);
  242.               FILLCHAR(LINBUF[X],B,B2);
  243.               INC(X,B);
  244.             END;
  245.           END ELSE BEGIN
  246.             INC(X);
  247.           END;
  248. IF KEYPRESSED THEN
  249. IF READKEY = ^[ THEN AUS;
  250.         UNTIL X >= BW;
  251.         X := 0;
  252.       END ELSE BEGIN
  253.         BLOCKREAD(F,LINBUF,WID);
  254.       END;
  255.       RAMTOVGA(@LINBUF,LONGINT(Y)*LONGINT(XWID),WID);
  256.       INC(Y);
  257.     UNTIL Y >= HIG;
  258.   END; { WITH HDR }
  259. (*
  260.   FOR YY := 0 TO 5 DO
  261.     FOR XX := 0 TO 255 DO PLOT(XX,YY,XX);
  262. *)
  263. END; { VGABILD }
  264.  
  265. PROCEDURE MONOBILD;
  266. VAR  I,J  : INTEGER;
  267. BEGIN
  268.   WITH HDR DO BEGIN
  269.     REPEAT
  270.       REPEAT
  271.         BLOCKREAD(F,B,1);
  272.         IF B > $BF THEN BEGIN
  273.           B := B AND $3F;
  274.           IF B > 0 THEN BEGIN
  275.             BLOCKREAD(F,B2,1);
  276.             FILLCHAR(LINBUF[X],B,B2);
  277.             INC(X,B);
  278.           END;
  279.         END ELSE BEGIN
  280.           LINBUF[X] := B;
  281.           INC(X);
  282.         END;
  283. IF KEYPRESSED THEN
  284. IF READKEY = ^[ THEN AUS;
  285.       UNTIL X >= BW;
  286.       X := 0;
  287.       RAMTOVGA(@LINBUF,LONGINT(Y)*LONGINT(XWID SHR 3),BW);
  288.       INC(Y);
  289.     UNTIL Y >= HIG;
  290.   END; { WITH HDR }
  291. END; { MONOBILD }
  292.  
  293. PROCEDURE PLANEBILD;
  294. VAR  I,J,K  : INTEGER;
  295.      RW     : WORD;
  296. BEGIN
  297.   RW := BW * 4; { 4 PLANES }
  298.   WITH HDR DO BEGIN
  299.     REPEAT
  300.       REPEAT
  301.         BLOCKREAD(F,B,1);
  302.         IF B > $BF THEN BEGIN
  303.           B := B AND $3F;
  304.           IF B > 0 THEN BEGIN
  305.             BLOCKREAD(F,B2,1);
  306.             FILLCHAR(BBUF[X],B,B2);
  307.             INC(X,B);
  308.           END;
  309.         END ELSE BEGIN
  310.           BBUF[X] := B;
  311.           INC(X);
  312.         END;
  313. IF KEYPRESSED THEN
  314. IF READKEY = ^[ THEN AUS;
  315.       UNTIL X >= RW;
  316.       BITMSK := 1;
  317.       FILLCHAR(LINBUF,SIZEOF(LINBUF),0);
  318.       X := 0;
  319.       FOR K := 0 TO 3 DO BEGIN
  320.         FOR I := 0 TO PRED(BW) DO BEGIN
  321.           FOR J := 0 TO 7 DO
  322.             IF (BBUF[X] AND MASKS[J]) <> 0 THEN
  323.               LINBUF[8*I+J] := LINBUF[8*I+J] OR BITMSK;
  324.           INC(X);
  325.         END;
  326.         BITMSK := BITMSK SHL 1;
  327.       END; { NEXT Z }
  328.       X := 0;
  329.       RAMTOVGA(@LINBUF,LONGINT(Y)*LONGINT(XWID),WID);
  330.       INC(Y);
  331.     UNTIL Y >= HIG;
  332.   END; { WITH HDR }
  333. END; { PLANEBILD }
  334.  
  335. PROCEDURE ANDERESBILD;
  336. VAR   PTRN  : ARRAY[0..3] OF BYTE;
  337. BEGIN
  338.   WITH HDR DO BEGIN
  339.     REPEAT
  340.       REPEAT
  341.         BLOCKREAD(F,B,1);
  342.         IF B > $BF THEN BEGIN
  343.           B := B AND $3F;
  344.           IF B > 0 THEN BEGIN
  345.             BLOCKREAD(F,B2,1);
  346.             PTRN[0] := B2 SHR 6;
  347.             PTRN[1] := (B2 SHR 4) AND 3;
  348.             PTRN[2] := (B2 SHR 2) AND 3;
  349.             PTRN[3] := B2 AND 3;
  350.             FOR I := 1 TO B DO BEGIN
  351.               MOVE(PTRN,LINBUF[X],4);
  352.               INC(X,4);
  353.             END;
  354.           END;
  355.         END ELSE BEGIN
  356.           LINBUF[X] := B SHR 6;
  357.           INC(X);
  358.           LINBUF[X] := (B SHR 4) AND 3;
  359.           INC(X);
  360.           LINBUF[X] := (B SHR 2) AND 3;
  361.           INC(X);
  362.           LINBUF[X] := B AND 3;
  363.           INC(X);
  364.         END;
  365. IF KEYPRESSED THEN
  366. IF READKEY = ^[ THEN AUS;
  367.       UNTIL X >= WID;
  368.       X := 0;
  369.       RAMTOVGA(@LINBUF,LONGINT(Y)*LONGINT(XWID),WID);
  370.       INC(Y);
  371.     UNTIL Y >= HIG;
  372.   END; { WITH HDR }
  373. END; { ANDERESBILD }
  374.  
  375. BEGIN { ZEIGEBILD }
  376.   GRAPHEIN(0);
  377.   X := 0;
  378.   Y := 0;
  379.   WITH HDR DO BEGIN
  380.     BW := BYTES;
  381.     IF MONO THEN MONOBILD
  382.     ELSE BEGIN
  383.       IF PLANES > 1 THEN PLANEBILD
  384.       ELSE BEGIN
  385.         IF BPP = 8 THEN VGABILD
  386.                    ELSE ANDERESBILD;
  387.       END;
  388.     END;
  389.   END; { WITH HDR }
  390. (*
  391.   FOR I := 0 TO 15 DO
  392.   BLOCK(I*10,0,I*10+9,9,I);
  393. *)
  394.   IF READKEY = ' ' THEN;
  395.   TEXTMODE(CO80);
  396.   DIRECTVIDEO := TRUE;
  397. END; { ZEIGEBILD }
  398.  
  399.  
  400. { DIE ETWAS UMFANGREICHERE AUFBEREITUNG DES PATHNAMENS IST LEIDER NICHT
  401.   ZU UMGEHEN !
  402. }
  403. FUNCTION PATHNAME(NAME:STRING):STRING;
  404. VAR   S  : STRING;
  405. BEGIN
  406.   S := JUSTPATHNAME(NAME);
  407.   IF NOT (S[LENGTH(S)] IN ['\',':']) THEN S := S + '\';
  408.   PATHNAME := S;
  409. END; { PATHNAME }
  410.  
  411.  
  412. BEGIN { MAIN }
  413.   FN := '*';
  414.   PATH := '';
  415.   ENDE := FALSE;
  416.   AUTO := FALSE;
  417.   IF PARAMCOUNT > 0 THEN BEGIN
  418.     FOR I := 1 TO PARAMCOUNT DO BEGIN
  419.       S := STUPCASE(PARAMSTR(I));
  420.       IF S[1] IN ['-','/'] THEN BEGIN
  421.         DELETE(S,1,1);
  422.         IF S[1] = 'E' THEN ENDE := TRUE;
  423.         IF S[1] = 'A' THEN AUTO := TRUE;
  424.       END ELSE BEGIN
  425.         FN := S;
  426.         PATH := PATHNAME(FN);
  427.         FN := JUSTFILENAME(PARAMSTR(1));
  428.         IF (LENGTH(FN) > 0) AND (POS('.',FN) = 0) THEN FN := FN + '.PCX';
  429.       END;
  430.     END; { NEXT I }
  431.   END ELSE BEGIN
  432. {$IFDEF PAUL}
  433.     PATH := 'D:\PCX\';
  434. {$ENDIF}
  435.   END;
  436.  
  437.   REPEAT
  438.     IF FN = '*' THEN FN := DIRECTORY(PATH+'*.PC?');
  439.     IF FN = '' THEN HALT;
  440.     PATH := JUSTPATHNAME(FN);
  441.     IF PATH[LENGTH(PATH)] <> '\' THEN PATH := PATH + '\';
  442.  
  443.     ASSIGN(F,FN);
  444.     RESET(F,1);
  445.     WRITELN;
  446.     WRITELN('Filename : ',FN);
  447.     IF NOT LIESHDR THEN BEGIN
  448.       WRITELN('***** Lesefehler PCX- Header *****');
  449.     END ELSE BEGIN
  450.       IF NOT AUTO THEN BEGIN
  451.         ZEIGEHDR;
  452.         IF READKEY = ' ' THEN ZEIGEBILD;
  453.       END ELSE ZEIGEBILD;
  454.     END;
  455.     CLOSE(F);
  456.     FN := '*';
  457.   UNTIL (FN = '') OR ENDE;
  458.  
  459. END.
  460.  
  461.  
  462.