home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* CHNGCOL.PAS *)
- (* ChangeColor *)
- (* Turbo Pascal ab 5.0 *)
- (* (c) 1990 Gerald Arend & TOOLBOX *)
- (* ------------------------------------------------------ *)
- {$B-,D-,I-,L-,O-,R-,S-,V-}
- {$M 16384,0,655360}
-
- PROGRAM ChangeColor;
-
- USES Crt, Graph, LoadPCX, Dos;
-
- VAR
- n: BYTE;
- name: STRING;
-
- PROCEDURE ChangeColors; { Farben interaktiv verändern }
- TYPE
- RGBRec = RECORD
- RedVal, GreenVal, BlueVal: BYTE;
- END;
- VAR
- R: Registers;
- VGAFarben, VGAFarbenAlt: ARRAY[0..15] OF RGBRec;
- n, x: BYTE;
- del: WORD;
- ch: CHAR;
- Farben, FarbenAlt: PaletteType;
- ShowOtherColor: BOOLEAN;
-
- CONST
- Step = 1;
- BlinkDelay: ARRAY[FALSE..TRUE] OF WORD = (60, 300);
- { Blinkgeschwindigkeit der angewählten Farbe }
-
- PROCEDURE Add(VAR Source: BYTE; Min, Max: INTEGER;
- Step: SHORTINT; Wrap: BOOLEAN);
- { Add erhöht oder erniedrigt die als "Source" übergebene
- Variable. Min und Max sind die erlaubten Grenzen, Wrap
- schaltet das Wrapping bei Über- und Unterschreitung
- der zulässigen Minimal- oder Maximalwerte ein und aus }
- VAR
- WrapNoetig: BOOLEAN;
- SourceAlt: BYTE;
- BEGIN
- WrapNoetig:=(Source+Step>Max) OR (Source+Step<Min);
- CASE WrapNoetig OF
- TRUE: IF Wrap THEN
- IF Step>0 THEN
- Source:=Min
- ELSE
- Source:=Max
- ELSE
- IF Step>0 THEN
- Source:=Max
- ELSE
- Source:=Min;
- FALSE: Inc(Source, Step);
- END;
- END;
-
- PROCEDURE SavePalette;
- VAR
- F : FILE;
- i, j, c: BYTE;
- BEGIN
- { Die Prozeduren EGA2PCX und VGA2PCX aus PCXTOOLS.PAS arbeiten
- leider nicht immer problemlos mit der BGI-Grafik zusammen;
- daher hier die entsprechenden Routinen für BGI }
-
- IF EGAOnly THEN
- FOR i:=0 TO MaxColors DO
- BEGIN { EGA-Farben schreiben }
- WITH Header DO
- BEGIN
- c:=BYTE(Farben.Colors[i]);
- Palette[i, 0]:=
- ((c AND 32) SHR 5) OR ((c AND 4) SHR 1);
- Palette[i, 1]:=
- ((c AND 16) SHR 4) OR (c AND 2);
- Palette[i, 2]:=
- ((c AND 8) SHR 3) OR ((c AND 1) SHL 1);
- END;
- FOR j:=0 TO 2 DO
- CASE Header.Palette[i, j] OF
- 1: Header.Palette[i, j]:=85;
- 2: Header.Palette[i, j]:=170;
- 3: Header.Palette[i, j]:=225;
- END;
- END
- ELSE
- FOR j:=0 TO 15 DO { VGA-Farben schreiben }
- BEGIN
- c:=Farben.Colors[j];
- Header.Palette[j, 0]:=VGAFarben[c].RedVal SHL 2;
- Header.Palette[j, 1]:=VGAFarben[c].GreenVal SHL 2;
- Header.Palette[j, 2]:=VGAFarben[c].BlueVal SHL 2;
- END;
-
- Assign(F, name);
- Reset(F, 1);
- BlockWrite(F, Header, 128);
- Close(F);
- END;
-
- BEGIN
- IF NOT EGAOnly THEN
- EGAOnly:=(gd IN [EGA, EGA64, EGAMono]);
- n:=0;
- ShowOtherColor:=FALSE;
- GetPalette(Farben);
- IF NOT EGAOnly THEN
- BEGIN
- FOR n:=0 TO MaxColors DO
- BEGIN { Farbwerte einlesen }
- R.AH:=$10;
- R.AL:=$15;
- R.BX:=n;
- Intr($10, R);
- WITH VGAFarben[n] DO { alte Palette sichern / VGA }
- BEGIN
- RedVal:=R.DH;
- GreenVal:=R.ch;
- BlueVal:=R.CL;
- END;
- END;
- VGAFarbenAlt:=VGAFarben;
- END
- ELSE
- FarbenAlt:=Farben; { alte Palette sichern / EGA }
- REPEAT
- REPEAT
- del:=0;
- REPEAT { Farbe blinken lassen }
- Delay(1);
- Inc(del);
- UNTIL (del>BlinkDelay[ShowOtherColor]) OR KeyPressed;
- ShowOtherColor:=NOT ShowOtherColor;
- IF ShowOtherColor THEN { Paletteneintrag neu setzen }
- IF EGAOnly THEN
- SetPalette(n, Farben.Colors[n])
- ELSE
- WITH VGAFarben[n] DO
- SetRGBPalette(Farben.Colors[n], RedVal,
- GreenVal, BlueVal)
- ELSE
- IF EGAOnly THEN { Blinkfarbe setzen }
- SetPalette(n, Abs(NOT Farben.Colors[n]))
- ELSE
- WITH VGAFarben[n] DO
- SetRGBPalette(Farben.Colors[n], NOT RedVal,
- NOT GreenVal, NOT BlueVal)
- UNTIL KeyPressed;
- ch:=ReadKey;
- IF EGAOnly THEN { neuen Paletteneintrag darstellen }
- SetPalette(n, Farben.Colors[n])
- ELSE
- WITH VGAFarben[n] DO
- SetRGBPalette(Farben.Colors[n], RedVal,
- GreenVal, BlueVal);
- CASE ch OF
- #0: BEGIN
- ch:=ReadKey;
- CASE ch OF
- #75: Add(n, 0, MaxColors, -1, TRUE); { <- }
- #77: Add(n, 0, MaxColors, 1, TRUE); { -> }
- END;
- END;
- '+': IF EGAOnly THEN { Farbwert EGA verändern }
- IF Farben.Colors[n]<63 THEN
- Inc(Farben.Colors[n])
- ELSE
- Farben.Colors[n]:=0;
- '-': IF EGAOnly THEN { Farbwert EGA verändern }
- IF Farben.Colors[n]>0 THEN
- Dec(Farben.Colors[n])
- ELSE
- Farben.Colors[n]:=63;
- 'r': IF NOT EGAOnly THEN { VGA Rot erhöhen }
- Add(VGAFarben[n].RedVal, 0, 63, Step, TRUE);
- 'g': IF NOT EGAOnly THEN { VGA Grün erhöhen }
- Add(VGAFarben[n].GreenVal, 0, 63, Step, TRUE);
- 'b': IF NOT EGAOnly THEN { VGA Blau erhöhen }
- Add(VGAFarben[n].BlueVal, 0, 63, Step, TRUE);
- 'R': IF NOT EGAOnly THEN { VGA Rot vermindern }
- Add(VGAFarben[n].RedVal, 0, 63, -Step, TRUE);
- 'G': IF NOT EGAOnly THEN { VGA Grün vermindern }
- Add(VGAFarben[n].GreenVal, 0, 63, -Step, TRUE);
- 'B': IF NOT EGAOnly THEN { VGA Blau vermindern }
- Add(VGAFarben[n].BlueVal, 0, 63, -Step, TRUE);
- 's',
- 'S': SavePalette; { Palette in PCX-File schreiben }
- 'a',
- 'A': IF EGAOnly THEN { Alte Palette wiederherstellen }
- BEGIN
- Farben:=FarbenAlt;
- SetAllPalette(FarbenAlt);
- END
- ELSE
- BEGIN
- VGAFarben:=VGAFarbenAlt;
- FOR x:=0 TO MaxColors DO
- WITH VGAFarben[n] DO
- SetRGBPalette(Farben.Colors[n], RedVal,
- GreenVal, BlueVal);
- END;
- #27: Exit; { <Esc>: Programm verlassen }
- END;
- IF EGAOnly THEN { Veränderten Paletteneintrag setzen }
- SetPalette(n, Farben.Colors[n])
- ELSE
- WITH VGAFarben[n] DO
- SetRGBPalette(Farben.Colors[n], RedVal,
- GreenVal, BlueVal);
- UNTIL FALSE;
- END;
-
- BEGIN
- IF ParamCount >= 1 THEN
- BEGIN
- name := ParamStr(1);
- IF (ParamStr(2)='/E') OR (ParamStr(2)='/e') THEN
- EGAOnly:=TRUE;
- END
- ELSE
- Halt;
- IF Pos('.', name) = 0 THEN name := name + '.PCX';
- LoadPCXScreen(name);
- IF PCXError THEN
- Halt;
- ChangeColors;
- RestoreCrtMode;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von CHNGCOL.PAS *)