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_bc-gc ELSE IF g=max THEN h_2+rc-bc ELSE IF b=max THEN h_4+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. ͺ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 ΚΠ˜J™J™#J™7J™6J™˜ Jšœ ˜ Jšœ˜Jšœ ˜ Jšœ ˜ Jšœ ˜ Jšœ˜J˜Jšœ˜Jšœ ˜ —J˜šΟn œΟk œ˜Jšžœ]ž˜iJšžœžœžœ˜Jšœ˜Jšœ˜J˜šœž œ˜&Jšœ)˜)Jšœ3˜3Jšœ/˜/Jšœ-˜-Jšœ3˜3J˜J˜—šœž œ˜*Jšœ žœ˜'Jšœ˜J˜J˜—šœž œ žœ˜'Jšœ,˜,Jšœ2˜2Jšœ˜J˜J˜—š œž œ˜Jšœ'žœ˜,Jšœ˜J˜J˜—š œž œ˜-J˜ J˜J˜—š œž œ˜/Jšœžœhžœ˜|Jšœ žœ˜'Jšœ#˜#J˜J˜—š œ&˜/Jšžœ%˜+Jšœ˜J˜—procšœž œ˜/šžœžœžœ ž˜$Jšœ@˜@Jšžœ˜—Jšœ˜J˜—JšœžœžœžœžœžœžœžœžœžœžœžœΟc'œ Ÿ˜–J˜Jš0œžœžœžœžœžœžœžœžœžœ(ŸœŸœžœžœožœžœžœžœžœžœžœžœžœžœ˜ΩJš;œœžœžœžœžœžœ>žœžœ Ÿœ žœžœ ŸœžœžœžœŸœžœžœΠbkœ Ÿœ\žœžœ žœžœžœ žœžœžœžœ˜—š œž œžœžœ˜/Kšœžœ˜šžœž˜ š žœžœž œ žœŸ˜8šžœžœžœž˜(Jšžœ˜Jšœ˜Jšœ˜J˜Jšœ˜Jšœ$˜$Jšžœ˜—JšžœŸ˜—š žœžœžœžœŸ˜>Jšžœ˜Jšœ˜J˜Jšœ˜Jšœ$˜$Jšžœ˜—š žœžœžœ žœŸ˜.šžœžœžœž˜(Jšžœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ$˜$Jšžœ˜—Jšž˜—J˜ Jšžœ˜—Jšœ˜J˜—š œž œžœžœ˜,Kšœžœ˜šžœž˜ šžœž œ žœŸ˜4šžœžœžœž˜(Jšžœ˜Jšœ˜Jšœžœ˜Jšœ˜Jšœ$˜$Jšžœ˜—Jšž˜—š žœžœž œ žœŸ˜Fšžœžœžœž˜(Jšžœ˜Jšœ˜Jšœ ˜ Jšœ˜Jšœ$˜$Jšžœ˜—Jšž˜—š žœžœžœ žœŸ˜;šžœžœžœž˜(Jšžœ˜Jšœ˜Jš œžœžœžœžœžœ˜>J˜Jšœ˜Jšœ$˜$Jšžœ˜—Jšž˜—š žœžœž œ žœŸ˜9šžœžœžœž˜(Jšžœ˜Jšœ˜Jš œžœžœžœžœžœ˜>J˜Jšœ˜Jšœ$˜$Jšžœ˜—Jšž˜—š žœžœžœžœŸ ˜2Jšžœ˜Jšœ˜Jšœ ˜ J˜Jšœ˜Jšœ$˜$Jšžœ˜—šžœž œ žœŸ˜4šžœžœžœž˜(Jšžœ˜Jšœ˜Jšœ˜J˜Jšœ˜Jšœ$˜$Jšžœ˜—Jšž˜—š žœžœž œ žœŸ˜8šžœžœžœž˜(Jšžœ˜Jšœ˜Jšœ˜J˜Jšœ˜Jšœ$˜$Jšžœ˜—JšžœŸ˜—š žœžœž œ žœŸ˜@šžœžœžœž˜(Jšžœ˜Jšœ˜J˜J˜Jšœ ˜ Jšœ˜Jšœ$˜$Jšžœ˜—Jšž˜—š žœžœžœžœŸ˜>Jšžœ˜Jšœ˜J˜Jšœ˜Jšœ$˜$Jšžœ˜—š žœžœžœ žœŸ˜.šžœžœžœž˜(Jšžœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ$˜$Jšžœ˜—Jšž˜—J˜ Jšžœ˜—Jšœ˜J˜—š œž œ˜,Kšœ ˜ Jšœ˜J˜—š œž œ˜/Kšœ˜Jšœ˜J˜—J˜%J˜Jšžœ˜——…—N"Θ