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

  1.  
  2. PROGRAM TGA;
  3. {
  4.   PROGRAMM ZUM ANZEIGEN VON 16- UND 24- BIT / PIXEL TARGA- FILES
  5.  
  6.   Paul Schubert, Rottweiler Str. 8, D6000 Frankfurt /M 1, 069 / 231145
  7.  
  8. }
  9. {$R-}
  10. {$S-}
  11. {$F+}
  12.  
  13. {.$DEFINE PAUL}
  14.  
  15.  
  16. USES  TPCRT,DOS,DIRUNIT,TPSTRING
  17.       ,SVGA,TPMOUSE,TPPICK
  18.       ;
  19.  
  20.  
  21. CONST LINLEN   = 1024;
  22.  
  23. CONST RGB_DM : ARRAY[0..3,0..3] OF BYTE = (
  24.                 ( 0,12, 3,15),
  25.                 ( 8, 4,11, 7),
  26.                 ( 2,14, 1,13),
  27.                 (10, 6, 9, 5)
  28.                );
  29.  
  30. TYPE  CMAPTYP  = ARRAY[0..255,0..2] OF BYTE;
  31.       PALTYP   = ARRAY[0..15,0..2] OF BYTE;
  32.       UCVAL    = RECORD B,G,R : BYTE END;
  33.  
  34. TYPE  HDRTYP = RECORD
  35.         PALSIZ     : WORD;
  36.         FTYP       : WORD;
  37.         FILL1      : WORD;
  38.         RGBSIZE    : BYTE;
  39.         FLAG0      : BYTE;
  40.         FILL2      : WORD;
  41.         FILL3      : WORD;
  42.         WID        : WORD;
  43.         HIG        : WORD;
  44.         TYP        : BYTE;
  45.         FLAGS      : BYTE;
  46.         CMAPSIZ    : WORD;
  47.         BPP        : BYTE;
  48.         REV        : BOOLEAN;
  49.       END;
  50.  
  51. VAR   I,J                  : INTEGER;
  52.       CH1,CH2              : CHAR;
  53.       S                    : STRING;
  54.       ENDE,DOPP            : BOOLEAN;
  55.       PATH,FN              : STRING;
  56.       F                    : FILE;
  57.       HDRERR               : INTEGER;
  58.  
  59.       CMAP                 : CMAPTYP;
  60.       PAL                  : VGAPALETTETYP ABSOLUTE CMAP;
  61.       HDR                  : HDRTYP;
  62.       LINBUF               : ARRAY[0..LINLEN] OF COLORVALUE;
  63.       ULINBUF              : ARRAY[0..LINLEN] OF UCVAL ABSOLUTE LINBUF;
  64.       WLINBUF              : ARRAY[0..LINLEN] OF WORD  ABSOLUTE LINBUF;
  65.  
  66.       RGB_XSIZE            : WORD ABSOLUTE XWID;
  67.       MKB                  : WORD;
  68.  
  69.  
  70. {$L VGARGB.OBJ}
  71. {$F+} PROCEDURE RGB_DOT(X,Y,R,G,B:WORD); EXTERNAL; {$F-}
  72.  
  73.  
  74. { PALETTE FÜR FARBRASTERUNG EINSTELLEN }
  75. PROCEDURE SETPALETTE;
  76. VAR   I,J,K  : INTEGER;
  77. BEGIN
  78.   FOR I := 0 TO 7 DO
  79.     FOR J := 0 TO 7 DO
  80.       FOR K := 0 TO 3 DO
  81.         WITH PAL[I * 32 + J * 4 + K] DO BEGIN
  82.           R := I * 9;  { 63 / 4 }
  83.           G := J * 9;  { 63 / 4 }
  84.           B := K * 21; { 63 / 3 }
  85.         END;
  86.   VGASETPALETTE(PAL,0,255);
  87. END; { SETPALETTE }
  88.  
  89.  
  90. PROCEDURE GRAPHEIN(VORGABE:BYTE);
  91. BEGIN { GRAPHEIN }
  92.   DOPP := FALSE;
  93.   WITH HDR DO BEGIN
  94.     VMOD := $13;
  95.     XWID := 320;
  96.     YWID := 200;
  97.  
  98.     IF VORGABE = 0 THEN BEGIN
  99.       IF WID > 320 THEN BEGIN
  100.         SET640X350;
  101.         IF HIG > 350 THEN SET640X400;
  102.         IF HIG > 400 THEN SET640X480;
  103.         IF HIG > 480 THEN SET800X600;
  104.         IF HIG > 600 THEN SET1024X768;
  105.       END;
  106.       IF WID > 640 THEN BEGIN
  107.         IF HIG <= 600 THEN SET800X600
  108.                       ELSE SET1024X768;
  109.       END;
  110.       IF WID > 800 THEN SET1024X768;
  111.       IF (WID <= 320) AND (HIG <= 200) THEN BEGIN
  112.         SET640X400;
  113.         DOPP := TRUE;
  114.       END;
  115.     END ELSE BEGIN
  116.       CASE VORGABE OF
  117.         2 : SET640X350;
  118.         3 : SET640X400;
  119.         4 : SET640X480;
  120.         5 : SET800X600;
  121.         6 : SET1024X768;
  122.       END;
  123.     END;
  124.  
  125.     IF CHECKVGA(VMOD) < 0 THEN BEGIN
  126.       TEXTMODE(CO80);
  127.       WRITELN;
  128.       WRITELN('KEINE VGA- KARTE VORHANDEN, ODER DIE VGA UNTERSTÜTZT');
  129.       WRITELN('DEN GEWÜNSCHTEN VIDEO- MODUS NICHT');
  130.       HALT(1);
  131.     END;
  132.     MAXX := PRED(XWID);
  133.     MAXY := PRED(YWID);
  134.  
  135.     DIRECTVIDEO := FALSE;
  136.     IF FTYP = 1 THEN VGASETPALETTE(PAL,0,255);
  137.     IF FTYP = 2 THEN SETPALETTE;
  138.  
  139.   END; { WITH HDR }
  140. END; {GRAPHEIN }
  141.  
  142.  
  143. PROCEDURE AUS;
  144. BEGIN
  145.   TEXTMODE(CO80);
  146.   HALT(3);
  147. END; { AUS }
  148.  
  149.  
  150. FUNCTION LIESHDR:BOOLEAN;
  151. VAR   FP   : LONGINT;
  152.       I,J  : INTEGER;
  153.       BB   : BYTE;
  154. BEGIN
  155.   LIESHDR := FALSE;
  156.   BLOCKREAD(F,HDR,18);
  157.   WITH HDR DO BEGIN
  158.     CMAPSIZ := 256;
  159.  
  160.     HDRERR := 1;
  161.     IF FILL1 <> 0 THEN EXIT;
  162.     HDRERR := 2;
  163.     IF FILL2 <> 0 THEN EXIT;
  164.     HDRERR := 3;
  165.     IF FILL3 <> 0 THEN EXIT;
  166.     HDRERR := 4;
  167.     IF NOT FTYP IN [1,2] THEN EXIT;
  168.     HDRERR := 5;
  169.     IF NOT (RGBSIZE IN [0,1]) THEN EXIT;
  170.  
  171.     REV := (FLAGS <> $20);
  172.  
  173.     HDRERR := 6;
  174.     IF FTYP = 1 THEN BEGIN
  175.       IF PALSIZ > 256 THEN EXIT;
  176.       BLOCKREAD(F,PAL,PALSIZ * 3);
  177.       FOR I := 0 TO PRED(PALSIZ) DO BEGIN
  178.         BB := PAL[I].R SHR 2;
  179.         PAL[I].G := PAL[I].G SHR 2;
  180.         PAL[I].R := PAL[I].B SHR 2;
  181.         PAL[I].B := BB;
  182.       END;
  183.     END;
  184.  
  185.     HDRERR := 7;
  186.     IF TYP = $18 THEN BEGIN
  187.       BPP := 3;
  188.       LIESHDR := TRUE;
  189.       HDRERR := 0;
  190.       EXIT;
  191.     END;
  192.     IF TYP = $10 THEN BEGIN
  193.       BPP := 2;
  194.       LIESHDR := TRUE;
  195.       HDRERR := 0;
  196.       EXIT;
  197.     END;
  198.     IF TYP = $08 THEN BEGIN
  199.       BPP := 1;
  200.       LIESHDR := TRUE;
  201.       HDRERR := 0;
  202.       EXIT;
  203.     END;
  204.   END; { WITH HDR }
  205. END; { LIESHDR }
  206.  
  207.  
  208. PROCEDURE ZEIGEBILD;
  209. VAR   X,Y       : INTEGER;
  210.       RW,GW,BW  : WORD;
  211.       C1,C2     : CHAR;
  212.       ERG       : WORD;
  213.  
  214. PROCEDURE ZEILE8;
  215. VAR   R,G,B,X  : WORD;
  216. BEGIN
  217.   BLOCKREAD(F,LINBUF,HDR.WID,ERG);
  218.   RAMTOVGA(@LINBUF,LONGINT(Y) * LONGINT(XWID),HDR.WID);
  219. END; { ZEILE8 }
  220.  
  221. PROCEDURE ZEILE16;
  222. VAR   R,G,B,X  : WORD;
  223. BEGIN
  224.   BLOCKREAD(F,LINBUF,2 * HDR.WID,ERG);
  225.   FOR X := 0 TO PRED(HDR.WID) DO BEGIN
  226.     R := (WLINBUF[X] SHR 7) AND $F8;
  227.     G := (WLINBUF[X] SHR 2) AND $F8;
  228.     B := (WLINBUF[X] SHL 3) AND $F8;
  229.       IF DOPP THEN BEGIN
  230.         RGB_DOT(X SHL 1,Y SHL 1,R,G,B);
  231.         RGB_DOT(SUCC(X SHL 1),Y SHL 1,R,G,B);
  232.         RGB_DOT(X SHL 1,SUCC(Y SHL 1),R,G,B);
  233.         RGB_DOT(SUCC(X SHL 1),SUCC(Y SHL 1),R,G,B);
  234.       END ELSE BEGIN
  235.         RGB_DOT(X,Y,R,G,B);
  236.       END;
  237.   END;
  238. END; { ZEILE16 }
  239.  
  240. PROCEDURE ZEILE24;
  241. VAR   X    : WORD;
  242. BEGIN
  243.   BLOCKREAD(F,LINBUF,3 * HDR.WID,ERG);
  244.   FOR X := 0 TO PRED(HDR.WID) DO BEGIN
  245.     WITH ULINBUF[X] DO BEGIN
  246.       IF DOPP THEN BEGIN
  247.         RGB_DOT(X SHL 1,Y SHL 1,R,G,B);
  248.         RGB_DOT(SUCC(X SHL 1),Y SHL 1,R,G,B);
  249.         RGB_DOT(X SHL 1,SUCC(Y SHL 1),R,G,B);
  250.         RGB_DOT(SUCC(X SHL 1),SUCC(Y SHL 1),R,G,B);
  251.       END ELSE BEGIN
  252.         RGB_DOT(X,Y,R,G,B);
  253.       END;
  254.     END; { WITH }
  255.   END;
  256. END; { ZEILE24 }
  257.  
  258. BEGIN { ZEIGEBILD }
  259.   GRAPHEIN(0);
  260.   WITH HDR DO BEGIN
  261.     IF REV THEN BEGIN
  262.       IF DOPP THEN Y := PRED(YWID SHR 1)
  263.               ELSE Y := PRED(YWID);
  264.     END ELSE Y := 0;
  265.     C1 := ' ';
  266.     REPEAT
  267.       CASE BPP OF
  268.         1 : ZEILE8;
  269.         2 : ZEILE16;
  270.         3 : ZEILE24;
  271.       END; { CASE HDR.BPP }
  272.       IF REV THEN DEC(Y) ELSE INC(Y);
  273.       IF KEYPRESSED THEN BEGIN
  274.         C1 := READKEY; IF C1 = #0 THEN C2 := READKEY ELSE C2 := #0;
  275.       END;
  276.     UNTIL (Y < 0) OR (Y >= HIG) OR (C1 = ^[);
  277.   END; { WITH HDR }
  278.  
  279.   SETSEG(0); { !!! }
  280.  
  281. (*
  282. FOR J := 0 TO 19 DO BEGIN
  283.   FOR I := 0 TO 255 DO BEGIN
  284.     PLOT(I SHL 1,J,I);
  285.     PLOT(SUCC(I SHL 1),J,I);
  286.   END; { NEXT I }
  287. END; { NEXT J }
  288. *)
  289.  
  290.   WRITE(#7);
  291.   MKB := READKEYORBUTTON;
  292.  
  293.   TEXTMODE(CO80);
  294.   DIRECTVIDEO := TRUE;
  295. END; { ZEIGEBILD }
  296.  
  297.  
  298. { DIE ETWAS UMFANGREICHERE AUFBEREITUNG DES PATHNAMENS IST LEIDER NICHT
  299.   ZU UMGEHEN !
  300. }
  301. FUNCTION PATHNAME(NAME:STRING):STRING;
  302. VAR   S  : STRING;
  303. BEGIN
  304.   S := JUSTPATHNAME(NAME);
  305.   IF NOT (S[LENGTH(S)] IN ['\',':']) THEN S := S + '\';
  306.   PATHNAME := S;
  307. END; { PATHNAME }
  308.  
  309.  
  310. BEGIN { MAIN }
  311.   INITIALIZEMOUSE;
  312.   ENABLEEVENTHANDLING;
  313.   ENABLEPICKMOUSE;
  314.  
  315.   FN := '';
  316.   PATH := '';
  317.   ENDE := FALSE;
  318.   FOR I := 1 TO PARAMCOUNT DO BEGIN
  319.     S := STUPCASE(PARAMSTR(I));
  320.     IF S[1] IN ['-','/'] THEN BEGIN
  321.       DELETE(S,1,1);
  322.       IF S[1] = 'E' THEN ENDE := TRUE;
  323.     END ELSE BEGIN
  324.       FN := S;
  325.       PATH := PATHNAME(FN);
  326.       FN := JUSTFILENAME(PARAMSTR(1));
  327.       IF (LENGTH(FN) > 0) AND (POS('.',FN) = 0) THEN FN := FN + '.TGA';
  328.     END;
  329.   END; { NEXT I }
  330.   REPEAT
  331.     IF FN = '' THEN FN := DIRUNIT.DIRECTORY(PATH+'*.TGA');
  332.     IF FN = '' THEN HALT;
  333.     PATH := PATHNAME(FN);
  334.  
  335.     ASSIGN(F,FN);
  336.     RESET(F,1);
  337.     WRITELN;
  338.     WRITELN('Filename : ',FN);
  339.     IF NOT LIESHDR THEN BEGIN
  340.       WRITELN('         ***** Lesefehler TGA- Header (',HDRERR,') *****');
  341.       WRITELN('***** oder ein nicht unterstütztes Dateiformat *****');
  342.       IF READKEY = ' ' THEN;
  343.     END ELSE BEGIN
  344.       ZEIGEBILD;
  345.     END;
  346.     CLOSE(F);
  347.     FN := '';
  348.   UNTIL ENDE;
  349.  
  350. END.
  351.  
  352.  
  353.