Color8Impl.mesa
Mik Lamming - July 15, 1983 4:35 pm
Last Edited by: Beach, February 10, 1984 2:12:01 pm PST
Last Edited by: Stone, January 10, 1985 4:38:28 pm PST
DIRECTORY
ColorMap,
ColorPackagePrivate,
DisplayMap,
Graphics,
GraphicsOps,
JaM,
Real,
Rope,
TJaMGraphics;
Color8Impl: CEDAR PROGRAM
IMPORTS ColorMap, ColorPackagePrivate, DisplayMap, Graphics, GraphicsOps, JaM, Real, TJaMGraphics = BEGIN
ROPE: TYPE = Rope.ROPE;
table: DisplayMap.ColorTable;
palette: DisplayMap.PalTable;
Init: PROCEDURE [state: JaM.State] = {
JaM.Register[state, "LoadMap", JLoadMap];
JaM.Register[state, "ShowRawImage", JShowRawImage];
JaM.Register[state, "RestoreMap", JRestoreMap];
JaM.Register[state, "RotateMap", JRotateMap];
JaM.Register[state, "RotateColors", JRotateColors];
};
JLoadMap: PROCEDURE [state: JaM.State] = {
mapFileName: ROPE ← JaM.PopRope[state];
LoadMap[mapFileName];
};
LoadMap: PROCEDURE [file:Rope.ROPE] = {
[table, palette] ← DisplayMap.Restore[file];
ColorPackagePrivate.SetNewColorMapProc[PalMapper];
SetUpMap[palette];
};
RestoreMap: PROCEDURE [] = {
ColorPackagePrivate.SetNewColorMapProc[NIL];
ColorMap.StandardMap[];
};
JRestoreMap: PROCEDURE [state: JaM.State] = {
RestoreMap[];
};
JShowRawImage: PROCEDURE [state: JaM.State] = {
paint: PROC [dc: Graphics.Context] = {
Graphics.DrawImage[self:dc, image:GraphicsOps.NewAisImage[aisFileName], raw:TRUE];
};
aisFileName: ROPE ← JaM.PopRope[state];
TJaMGraphics.Painter[paint, state];
};
PalMapper: ColorPackagePrivate.ColorMapProc = {
RETURN [DisplayMap.GetIndex[r,g,b, table]];
};
SetUpMap: PROCEDURE [p:DisplayMap.PalTable] = {
FOR palix:CARDINAL IN [0..p.size) DO
ColorMap.SetRGBColor[palix, p[palix].r, p[palix].g, p[palix].b];
ENDLOOP;
};
ToRange: PROC[v: REAL] RETURNS[REAL] = INLINE { IF v IN[0..1] THEN RETURN[v]
ELSE ERROR };
-- ensures that v is in [0..1]; raises BoundsFault if not
HSVToRGB: PROC[h,s,v: REAL] RETURNS[r,g,b: REAL] = {
hue: REAL ← ToRange[h];
saturation: REAL ← ToRange[s];
value: REAL ← ToRange[v];
 ihue: INTEGER;
 fhue,m,n,k: REAL;
 hue ← hue*6;
 ihue ← Real.FixI[hue]; --integer hue
 fhue ← hue-ihue; --fractional hue
IF ihue=6 THEN ihue ← 0;
 m ← value*(1-saturation);
 n ← value*(1-(saturation*fhue));
 k ← value*(1-(saturation*(1-fhue)));
SELECT ihue FROM
  0 => RETURN[value,k,m];
  1 => RETURN[n,value,m];
  2 => RETURN[m,value,k];
  3 => RETURN[m,n,value];
  4 => RETURN[k,m,value];
  5 => RETURN[value,m,n];
  ENDCASE => RETURN[0,0,0];
};


RGBToHSV: PROC[r,g,b: REAL] RETURNS[h,s,v: REAL] = {
max,min,rc,gc,bc: REAL;
r ← ToRange[r]; g ← ToRange[g]; b ← ToRange[b];
 min ← MIN[MIN[r,g],b]; --amount of white
 v ← max ← MAX[MAX[r,g],b]; --maximum "brightness"
IF max#0 THEN s ← (max-min)/max
ELSE s ← 0;
IF s=0 THEN RETURN[0,0,v]; --gray
 rc ← (max - r)/(max - min);
 gc ← (max - g)/(max - min);
 bc ← (max - b)/(max - min);
IF r=max THEN h�-gc
ELSE IF g=max THEN h𡤂+rc-bc
ELSE IF b=max THEN h𡤄+gc-rc;
 h ← h / 6.0;
IF h<0 THEN h←h+1;
};
RotateColors: PROCEDURE [n:INTEGER] = TRUSTED {
lr,lg,lb,h,s,v:REAL;
WHILE n>0 DO
FOR i:CARDINAL DECREASING IN [0..40] DO -- rotate colors
FOR pix:CARDINAL IN [0..palette.size) DO
OPEN palette[pix];
[h,s,v] ← RGBToHSV[r,g,b];
h ← i / 40.0 ;
s ← 1.0;
[lr,lg,lb] ← HSVToRGB[h,s,v];
ColorMap.SetRGBColor[pix, lr,lg,lb];
ENDLOOP;
ENDLOOP; -- NB hue is now 0
FOR pix:CARDINAL IN [0..palette.size) DO -- restore the colors
OPEN palette[pix];
[h,s,v] ← RGBToHSV[r,g,b];
s ← 1.0; v ← 0.0;
[lr,lg,lb] ← HSVToRGB[h,s,v];
ColorMap.SetRGBColor[pix, lr,lg,lb];
ENDLOOP;
FOR i:CARDINAL IN [0..20] DO -- restore values
FOR pix:CARDINAL IN [0..palette.size) DO
OPEN palette[pix];
[h,s,v] ← RGBToHSV[r,g,b];
v ← v * i/20.0;
[lr,lg,lb] ← HSVToRGB[h,s,v];
ColorMap.SetRGBColor[pix, lr,lg,lb];
ENDLOOP;
ENDLOOP;
n ← n - 1;
ENDLOOP;
};
RotateMap: PROCEDURE [n:INTEGER] = TRUSTED {
lr,lg,lb,h,s,v:REAL;
WHILE n>0 DO
FOR i:CARDINAL IN [0..20] DO -- maximise saturations
FOR pix:CARDINAL IN [0..palette.size) DO
OPEN palette[pix];
[h,s,v] ← RGBToHSV[r,g,b];
s ← MIN[s + i / 20.0, 1.0] ;
[lr,lg,lb] ← HSVToRGB[h,s,v];
ColorMap.SetRGBColor[pix, lr,lg,lb];
ENDLOOP;
ENDLOOP;
FOR i:CARDINAL DECREASING IN [0..20] DO -- reduce the saturations to 0
FOR pix:CARDINAL IN [0..palette.size) DO
OPEN palette[pix];
[h,s,v] ← RGBToHSV[r,g,b];
s ← i/20.0 ;
[lr,lg,lb] ← HSVToRGB[h,s,v];
ColorMap.SetRGBColor[pix, lr,lg,lb];
ENDLOOP;
ENDLOOP;
FOR i:CARDINAL IN [0..10] DO -- threshold values around 0.5
FOR pix:CARDINAL IN [0..palette.size) DO
OPEN palette[pix];
[h,s,v] ← RGBToHSV[r,g,b];
v ← IF v>0.5 THEN MIN[v+i*0.05, 1.0] ELSE MAX[v-i*0.05, 0.0] ;
s ← 0;
[lr,lg,lb] ← HSVToRGB[h,s,v];
ColorMap.SetRGBColor[pix, lr,lg,lb];
ENDLOOP;
ENDLOOP;
FOR i:CARDINAL DECREASING IN [0..10] DO -- restore values
FOR pix:CARDINAL IN [0..palette.size) DO
OPEN palette[pix];
[h,s,v] ← RGBToHSV[r,g,b];
v ← IF v>0.5 THEN MIN[v+i*0.05, 1.0] ELSE MAX[v-i*0.05, 0.0] ;
s ← 0;
[lr,lg,lb] ← HSVToRGB[h,s,v];
ColorMap.SetRGBColor[pix, lr,lg,lb];
ENDLOOP;
ENDLOOP;
FOR pix:CARDINAL IN [0..palette.size) DO -- go red
OPEN palette[pix];
[h,s,v] ← RGBToHSV[r,g,b];
h ← 1.0 ;
s ← 0.0;
[lr,lg,lb] ← HSVToRGB[h,s,v];
ColorMap.SetRGBColor[pix, lr,lg,lb];
ENDLOOP;
FOR i:CARDINAL IN [0..20] DO -- maximise saturations
FOR pix:CARDINAL IN [0..palette.size) DO
OPEN palette[pix];
[h,s,v] ← RGBToHSV[r,g,b];
s ← i / 20.0 ;
h ← 1.0;
[lr,lg,lb] ← HSVToRGB[h,s,v];
ColorMap.SetRGBColor[pix, lr,lg,lb];
ENDLOOP;
ENDLOOP;
FOR i:CARDINAL DECREASING IN [0..40] DO -- rotate colors
FOR pix:CARDINAL IN [0..palette.size) DO
OPEN palette[pix];
[h,s,v] ← RGBToHSV[r,g,b];
h ← i / 40.0 ;
s ← 1.0;
[lr,lg,lb] ← HSVToRGB[h,s,v];
ColorMap.SetRGBColor[pix, lr,lg,lb];
ENDLOOP;
ENDLOOP; -- NB hue is now 0
FOR i:CARDINAL DECREASING IN [0..20] DO -- reduce the value to 0
FOR pix:CARDINAL IN [0..palette.size) DO
OPEN palette[pix];
[h,s,v] ← RGBToHSV[r,g,b];
h ← 0.0;
v ← v * i/20.0;
s ← 1.0 ;
[lr,lg,lb] ← HSVToRGB[h,s,v];
ColorMap.SetRGBColor[pix, lr,lg,lb];
ENDLOOP;
ENDLOOP;
FOR pix:CARDINAL IN [0..palette.size) DO -- restore the colors
OPEN palette[pix];
[h,s,v] ← RGBToHSV[r,g,b];
s ← 1.0; v ← 0.0;
[lr,lg,lb] ← HSVToRGB[h,s,v];
ColorMap.SetRGBColor[pix, lr,lg,lb];
ENDLOOP;
FOR i:CARDINAL IN [0..20] DO -- restore values
FOR pix:CARDINAL IN [0..palette.size) DO
OPEN palette[pix];
[h,s,v] ← RGBToHSV[r,g,b];
v ← v * i/20.0;
[lr,lg,lb] ← HSVToRGB[h,s,v];
ColorMap.SetRGBColor[pix, lr,lg,lb];
ENDLOOP;
ENDLOOP;
n ← n - 1;
ENDLOOP;
};
JRotateMap: PROCEDURE [state: JaM.State] = {
RotateMap[1];
};
JRotateColors: PROCEDURE [state: JaM.State] = {
RotateColors[1];
};
JaM.RegisterInit["Color8Impl", Init];
END.