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

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