ConstantColorsImpl.mesa
Copyright © 1984 by Xerox Corporation. All rights reserved.
Michael Plass, August 1, 1983 11:43 am
Last Edited by: Stone, August 11, 1984 4:30:05 pm PDT
Last Edited by: Crow, December 12, 1984 6:12:54 pm PST (rigidified DeFuzz to limit output to 0-1)
DIRECTORY
ConstantColors,
ColorModels,
ColorNames,
RealFns USING [AlmostZero],
ImagerBasic USING [ConstantColor, ColorRep],
Rope USING [ROPE],
Real;
ConstantColorsImpl: CEDAR PROGRAM
IMPORTS Real, ColorNames, ColorModels, RealFns
EXPORTS ConstantColors
~ BEGIN OPEN ConstantColors;
ConstantColor: TYPE ~ ImagerBasic.ConstantColor;  -- Color Definitions
black: PUBLIC ConstantColor ← NameToColor["Black"];
white: PUBLIC ConstantColor ← NameToColor["White"];
grey: PUBLIC ConstantColor ← NameToColor["Grey"];
darkGrey: PUBLIC ConstantColor ← NameToColor["Dark Grey"];
lightGrey: PUBLIC ConstantColor ← NameToColor["Light Grey"];
veryDarkGrey: PUBLIC ConstantColor ← NameToColor["Very Dark Grey"];
veryLightGrey: PUBLIC ConstantColor ← NameToColor["Very Light Grey"];
red: PUBLIC ConstantColor ← NameToColor["Red"];
green: PUBLIC ConstantColor ← NameToColor["Green"];
blue: PUBLIC ConstantColor ← NameToColor["Blue"];
magenta: PUBLIC ConstantColor ← NameToColor["Magenta"];
cyan: PUBLIC ConstantColor ← NameToColor["Cyan"];
yellow: PUBLIC ConstantColor ← NameToColor["Yellow"];
orange: PUBLIC ConstantColor ← NameToColor["Orange"];
purple: PUBLIC ConstantColor ← NameToColor["Purple"];
brown: PUBLIC ConstantColor ← NameToColor["Brown"];
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;
[h: h,s: s,l: l] ← ColorNames.ParseColorName[name];
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]];
[r,g,b] ← Defuzz[r,g,b];
[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]];
[r,g,b] ← Defuzz[r,g,b];
[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]];
[r,g,b] ← Defuzz[r,g,b];
RETURN[r: r, g: g, b: b];
};
Defuzz: PROC [a,b,c: REAL] RETURNS[REAL, REAL, REAL] = {
IF RealFns.AlmostZero[a,-10] THEN a ← 0;
IF RealFns.AlmostZero[b,-10] THEN b ← 0;
IF RealFns.AlmostZero[c,-10] THEN c ← 0;
a ← MAX [0.0, a]; b ← MAX [0.0, b]; c ← MAX [0.0, c];
IF RealFns.AlmostZero[a-1.0,-10] THEN a ← 1;
IF RealFns.AlmostZero[b-1.0,-10] THEN b ← 1;
IF RealFns.AlmostZero[c-1.0,-10] THEN c ← 1;
a ← MIN[ 1.0, a]; b ← MIN[ 1.0, b]; c ← MIN[ 1.0, c];
RETURN[a,b,c];
};
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.HSLToRope[h: h,s: s,l: l];
RETURN[name];
};
format utilities
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] ~ {
real ← card;
RETURN[real / LAST[CARDINAL]];
};
MakeRep: PROC[x,y,Y: REAL] RETURNS[ConstantColor] = {
RETURN [NEW[ImagerBasic.ColorRep[constant] ← [constant[x: Card[x], y: Card[y], Y: Card[Y]]]]];
};
Cal: PROC[cal: ColorModels.Calibration] RETURNS [ColorModels.Calibration] = {
RETURN[IF cal=NIL THEN ColorModels.GetPhosphorCalibration[] ELSE cal];
};
END.