<<>> <> <> <> <> <> <<>> DIRECTORY ImagerPixelArray USING [PixelArray], ImagerTransformation USING [Transformation], Rope USING [ROPE]; ImagerColor: CEDAR DEFINITIONS ~ BEGIN SampleValue: TYPE ~ REAL; ROPE: TYPE ~ Rope.ROPE; <> Color: TYPE ~ REF ColorRep; ColorRep: TYPE ~ RECORD [ SELECT tag: * FROM constant => [ SELECT tag: * FROM op => [ colorOperator: ColorOperator, pixel: SEQUENCE size: NAT OF SampleValue ], special => [ -- XOR, stipples, named colors, and the like type: ATOM, -- identifies the kind of special color this is name: ROPE, -- hierarchical name data: REF, -- implementation-specific data substitute: ConstantColor -- use this if you don't recognize type ], ENDCASE ], sampled => [ -- the result of MakeSampledColor pa: ImagerPixelArray.PixelArray, -- the array of pixels um: ImagerTransformation.Transformation, -- transforms from color to device coordinates colorOperator: ColorOperator -- maps pixels into constant colors ], sampledBlack => [ -- the result of MakeSampledBlack pa: ImagerPixelArray.PixelArray, -- the array of pixels (must be 1 bit per pixel) um: ImagerTransformation.Transformation, -- transforms from color to device coordinates clear: BOOL -- are zero bits transparent? ], ENDCASE ]; ConstantColor: TYPE ~ REF ColorRep.constant; OpConstantColor: TYPE ~ REF ColorRep.constant.op; SpecialColor: TYPE ~ REF ColorRep.constant.special; SampledColor: TYPE ~ REF ColorRep.sampled; SampledBlack: TYPE ~ REF ColorRep.sampledBlack; <> <> Structure: TYPE ~ REF StructureRep; StructureRep: TYPE ~ RECORD [class: StructureClass, data: REF]; StructureClass: TYPE ~ REF StructureClassRep; StructureClassRep: TYPE; <> <> ColorOperator: TYPE ~ REF ColorOperatorRep; ColorOperatorRep: TYPE ~ RECORD [ chromatic: BOOL, -- If FALSE, everything is gray. samplesPerPixelIn: NAT, -- Number of samples per pixel expected. class: REF ColorOperatorClassRep, -- Contains the name of the Interpress color model operator and the operations that the ColorOperator needs to perform. data: REF, -- Contains the data specific to the ColorOperator; corresponds to the parameters needed by the color model operator appearanceHints: Structure -- Hints to the implementation about the desired appearance ]; ColorOperatorClassRep: TYPE; <> Find: PROC [name: ROPE] RETURNS [ConstantColor]; <> <<>> ColorFromPixel: PROC [colorOperator: ColorOperator, pixel: PROC [sampleIndex: NAT] RETURNS [REAL]] RETURNS [ConstantColor]; <> NarrowToOpConstantColor: PROC [color: ConstantColor] RETURNS [OpConstantColor]; <> <> MakeSampledBlack: PROC [pa: ImagerPixelArray.PixelArray, um: ImagerTransformation.Transformation, clear: BOOL ¬ FALSE] RETURNS [SampledBlack]; MakeSampledColor: PROC [pa: ImagerPixelArray.PixelArray, um: ImagerTransformation.Transformation, colorOperator: ColorOperator] RETURNS [SampledColor]; <> ColorFromGray: PROC [f: REAL] RETURNS [OpConstantColor]; <> <> SampleTableProc: TYPE ~ PROC [NAT] RETURNS [REAL]; NewColorOperatorGrayLinear: PROC [sWhite, sBlack: REAL, sampleTableSize: NAT ¬ 0, sampleTableProc: SampleTableProc ¬ NIL] RETURNS [ColorOperator]; <<... colorModelOperators/Xerox/GrayLinear, as specified in the Color Encoding Standard.>> <> <> <> NewColorOperatorGrayDensity: PROC [sWhite, sBlack, dBlack: REAL, sampleTableSize: NAT ¬ 0, sampleTableProc: SampleTableProc ¬ NIL] RETURNS [ColorOperator]; <<... colorModelOperators/Xerox/GrayDensity, as specified in the Color Encoding Standard.>> <> <> <> <> <<>> NewColorOperatorGrayVisual: PUBLIC PROC [sWhite, sBlack: REAL, sampleTableSize: NAT ¬ 0, sampleTableProc: SampleTableProc ¬ NIL] RETURNS [ColorOperator]; <<... colorModelOperators/Xerox/GrayVisual, as specified in the Color Encoding Standard.>> <> <> <> <> <> <> NewColorOperatorMap: PROC [maxSampleValue: NAT, map: PROC [NAT] RETURNS [ConstantColor]] RETURNS [ColorOperator]; <<... colorModelOperators/Xerox/Map, as specified in the Color Encoding Standard.>> <> NewColorOperatorBuildMap: PROC [colorOperator: ColorOperator, maxSampleValue: NAT, map: SampleTableProc] RETURNS [ColorOperator]; <<... colorModelOperators/Xerox/BuildMap, as specified in the Color Encoding Standard.>> <> <> <> PixelEncoding: TYPE ~ REF PixelEncodingRep; PixelEncodingRep: TYPE ~ RECORD [SEQUENCE samplesPerPixel: NAT OF SampleEncoding]; SampleEncoding: TYPE ~ REF SampleEncodingRep; SampleEncodingRep: TYPE ~ RECORD [SEQUENCE size: NAT OF REAL]; <> <<... Xerox/RGBLinear (Color Encoding Standard) >> RGB: TYPE ~ RECORD [R, G, B: REAL]; <> <<>> ColorFromRGB: PROC [rgb: RGB] RETURNS [OpConstantColor]; RGBFromColor: PROC [c: OpConstantColor] RETURNS [RGB]; NewColorOperatorRGB: PROC [sWhite: REAL, sBlack: REAL ¬ 0, map: PixelEncoding ¬ NIL, appearanceHints: Structure ¬ NIL] RETURNS [ColorOperator]; <> <> <<... convenience procedures; really produce an RGBLinear color.>> ColorFromHSV: PROC [H, S, V: REAL] RETURNS [OpConstantColor]; HSVFromColor: PROC [c: OpConstantColor] RETURNS [H, S, V: REAL]; <> <> <> <> <<... Xerox/YESLinear (Color Encoding Standard) >> YES: TYPE ~ RECORD [Y, E, S: REAL]; ColorFromYES: PROC [yes: YES] RETURNS [OpConstantColor]; YESFromColor: PROC [c: OpConstantColor] RETURNS [yes: YES]; NewColorOperatorYES: PROC [sWhite, sBlack, sneutral, srange: REAL, map: PixelEncoding ¬ NIL, appearanceHints: Structure ¬ NIL] RETURNS [ColorOperator]; <> <<... Xerox/CIELAB (Color Encoding Standard)>> CIELAB: TYPE ~ RECORD [lStar, aStar, bStar: REAL]; ColorFromCIELAB: PROC [cielab: CIELAB] RETURNS [OpConstantColor]; CIELABFromColor: PROC [c: OpConstantColor] RETURNS [CIELAB]; NewColorOperatorCIELAB: PROC [sWhite, sBlack, sneutral, srange: REAL, map: PixelEncoding ¬ NIL, appearanceHints: Structure ¬ NIL] RETURNS [ColorOperator]; <> <<... Xerox/HighlightLinear (Color Encoding Standard)>> Highlight: TYPE ~ RECORD [b, h: REAL]; ColorFromHighlight: PROC [highlight: Highlight] RETURNS [OpConstantColor]; HighlightFromColor: PROC [c: OpConstantColor] RETURNS [Highlight]; NewColorOperatorHighlight: PROC [sWhite, sBlack: REAL, map: PixelEncoding ¬ NIL, baseColor, highlightColor: OpConstantColor, appearanceHints: Structure ¬ NIL] RETURNS [ColorOperator]; <> <<... Xerox/Process (Color Encoding Standard)>> MaxSampleProc: TYPE ~ PROC [pixelIndex: NAT] RETURNS [NAT]; SignalType: TYPE ~ MACHINE DEPENDENT { dotPercent, reflectance, transmittance, density, (CARD32.LAST) }; SignalTypeFromSignalTypeName: PROC [ROPE] RETURNS [SignalType]; SignalTypeNameFromSignalType: PROC [SignalType] RETURNS [ROPE]; NewColorOperatorProcess: PROC [su, sz: REAL, signals: NAT, map: PixelEncoding ¬ NIL, signalType: SignalType, signalNames: PROC [signal: NAT] RETURNS [ConstantColor], deviceProps: Structure ¬ NIL] RETURNS [ColorOperator]; <<... CMYK is a useful special case.>> CMYK: TYPE ~ RECORD [C, M, Y, K: REAL]; <> ColorFromCMYK: PROC [cmyk: CMYK] RETURNS [OpConstantColor]; <> NewColorOperatorCMYK: PROC [maxIn: NAT] RETURNS [ColorOperator]; <<... a convenience color model for cyan, magenta, yellow, black separations; expects samplesPerPixel=4. For each separation, 0 ~ no ink, maxIn ~ full ink coverage. Really turns into a process ColorOperator.>> END.