<> <> <> DIRECTORY ConstantColors, ColorModels, ColorNames, ImagerBasic USING [ConstantColor, ColorRep], Rope USING [ROPE], Real; ConstantColorsImpl: CEDAR PROGRAM IMPORTS Real, ColorNames, ColorModels EXPORTS ConstantColors ~ BEGIN OPEN ConstantColors; ConstantColor: TYPE ~ ImagerBasic.ConstantColor; black: PUBLIC ConstantColor _ MakeRep[x: 0.3101, y: 0.3163, Y: 0]; white: PUBLIC ConstantColor _ MakeRep[x: 0.3101, y: 0.3163, Y: 1]; IntensityToColor: PUBLIC PROC [intensity: REAL, cal: Calibration _ NIL] RETURNS [ConstantColor] ~ { IF intensity <= 0 THEN RETURN [black]; IF intensity >= 1 THEN RETURN [white]; RETURN [MakeRep[x: 0.3101, y: 0.3163, Y: intensity]]; }; HSVToColor: PUBLIC PROC[h,s,v: REAL, cal: Calibration _ NIL] RETURNS[ConstantColor] = { x,y,Y: REAL; r,g,b: REAL; [r: r,g: g,b: b] _ ColorModels.HSVToRGB[h: h, s: s, v: v]; [x: x,y: y,Y: Y] _ ColorModels.RGBToCIE[r: r, g: g, b: b, calibration: Cal[cal]]; RETURN[MakeRep[x: x, y: y,Y: Y]]; }; HSLToColor: PUBLIC PROC[h,s,l: REAL, cal: Calibration _ NIL] RETURNS[ConstantColor] = { x,y,Y: REAL; r,g,b: REAL; [r: r,g: g,b: b] _ ColorModels.HSLToRGB[h: h, s: s, l: l]; [x: x,y: y,Y: Y] _ ColorModels.RGBToCIE[r: r, g: g, b: b, calibration: Cal[cal]]; RETURN[MakeRep[x: x, y: y,Y: Y]]; }; RGBToColor: PUBLIC PROC[r,g,b: REAL, cal: Calibration _ NIL] RETURNS[ConstantColor] = { x,y,Y: REAL; [x: x,y: y,Y: Y] _ ColorModels.RGBToCIE[r: r, g: g, b: b, calibration: Cal[cal]]; RETURN[MakeRep[x: x, y: y,Y: Y]]; }; CIEToColor: PUBLIC PROC [x,y,Y: REAL] RETURNS [ConstantColor] = { RETURN[MakeRep[x: x, y: y,Y: Y]]}; NameToColor: PUBLIC PROC[name: Rope.ROPE, cal: Calibration _ NIL] RETURNS[ConstantColor] = { h,s,l: REAL; names: ColorNames.Names _ ColorNames.ParseColorName[name]; [h: h,s: s,l: l] _ ColorNames.NamesToHSL[names]; RETURN[HSLToColor[h: h,s: s,l: l, cal: cal]]; }; ColorToIntensity: PUBLIC PROC[color: ConstantColor, cal: Calibration _ NIL] RETURNS[intensity: REAL] = { RETURN[CardToReal[color.Y]]; }; ColorToHSV: PUBLIC PROC[color: ConstantColor, cal: Calibration _ NIL] RETURNS[h, s, v: REAL] = { x,y,Y: REAL; r,g,b: REAL; x _ CardToReal[color.x]; y _ CardToReal[color.y]; Y _ CardToReal[color.Y]; [r: r,g: g,b: b] _ ColorModels.CIEToRGB[x: x, y: y,Y: Y, calibration: Cal[cal]]; [h: h,s: s,v: v] _ ColorModels.RGBToHSV[r: r, g: g, b: b]; RETURN[h: h,s: s,v: v]; }; ColorToHSL: PUBLIC PROC[color: ConstantColor, cal: Calibration _ NIL] RETURNS[h, s, l: REAL] = { x,y,Y: REAL; r,g,b: REAL; x _ CardToReal[color.x]; y _ CardToReal[color.y]; Y _ CardToReal[color.Y]; [r: r,g: g,b: b] _ ColorModels.CIEToRGB[x: x, y: y,Y: Y, calibration: Cal[cal]]; [h: h,s: s,l: l] _ ColorModels.RGBToHSL[r: r, g: g, b: b]; RETURN[h: h,s: s,l: l]; }; ColorToRGB: PUBLIC PROC[color: ConstantColor, cal: Calibration _ NIL] RETURNS[r, g, b: REAL] = { x,y,Y: REAL; x _ CardToReal[color.x]; y _ CardToReal[color.y]; Y _ CardToReal[color.Y]; [r: r,g: g,b: b] _ ColorModels.CIEToRGB[x: x, y: y,Y: Y, calibration: Cal[cal]]; RETURN[r: r, g: g, b: b]; }; ColorToCIE: PROC [color: ConstantColor, cal: Calibration _ NIL] RETURNS [x,y,Y: REAL] = { x _ CardToReal[color.x]; y _ CardToReal[color.y]; Y _ CardToReal[color.Y]; }; ColorToName: PUBLIC PROC [color: ConstantColor, cal: Calibration _ NIL] RETURNS [name: Rope.ROPE] = { h,s,l: REAL; [h: h,s: s,l: l] _ ColorToHSL[color,cal]; name _ ColorNames.NamesToRope[ColorNames.HSLToNames[h: h,s: s,l: l]]; RETURN[name]; }; <> Card: PROC [real: REAL] RETURNS [card: CARDINAL] ~ { int: INT _ Real.RoundLI[real*LAST[CARDINAL]]; card _ MAX[MIN[int, LAST[CARDINAL]], 0]; }; CardToReal: PROC [card: CARDINAL] RETURNS [real: REAL] ~ { RETURN[card*LAST[CARDINAL]]; }; MakeRep: PROC[x,y,Y: REAL] RETURNS[ConstantColor] = { RETURN [NEW[ImagerBasic.ColorRep[constant] _ [constant[x: Card[0.3101], y: Card[0.3163], Y: Card[Y]]]]]; }; Cal: PROC[cal: ColorModels.Calibration] RETURNS [ColorModels.Calibration] = { RETURN[IF cal=NIL THEN ColorModels.GetDefaultCalibration[] ELSE cal]; }; END.