<> <> <> <<>> DIRECTORY ImagerPixelArray USING [PixelArray], ImagerSample USING [PixelBuffer, PixelMap, PixelProc, Sample, SampleBuffer, SampleMap], ImagerTransformation USING [Transformation], Rope USING [ROPE]; ImagerColor: CEDAR DEFINITIONS ~ BEGIN Transformation: TYPE ~ ImagerTransformation.Transformation; Sample: TYPE ~ ImagerSample.Sample; SampleBuffer: TYPE ~ ImagerSample.SampleBuffer; SampleMap: TYPE ~ ImagerSample.SampleMap; PixelProc: TYPE ~ ImagerSample.PixelProc; PixelBuffer: TYPE ~ ImagerSample.PixelBuffer; PixelMap: TYPE ~ ImagerSample.PixelMap; PixelArray: TYPE ~ ImagerPixelArray.PixelArray; ROPE: TYPE ~ Rope.ROPE; <> XYZ: TYPE ~ RECORD [X, Y, Z: REAL]; <> <> Chromaticity: TYPE ~ RECORD [x, y: REAL]; <> <<>> illuminantC: Chromaticity ~ [x: 0.310, y: 0.317]; <> ChromaticityFromXYZ: PROC [XYZ] RETURNS [Chromaticity]; <> XYZFromChromaticity: PROC [c: Chromaticity, Y: REAL] RETURNS [XYZ]; <> <<>> RGBCalibration: TYPE ~ REF RGBCalibrationRep; RGBCalibrationRep: TYPE ~ RECORD [ type: ATOM, -- identifying name red: Chromaticity, -- CIE chromaticity of red phosphor green: Chromaticity, -- CIE chromaticity of green phosphor blue: Chromaticity, -- CIE chromaticity of blue phosphor white: Chromaticity, -- CIE chromaticity of white (RGB[1, 1, 1]) YMax: REAL, -- maximum luminance, typically 100 impl: REF RGBCalibrationImplRep -- implementation data (matrices relating RGB and XYZ) ]; RGBCalibrationImplRep: TYPE; <> <<>> GetDefaultCalibration: PROC RETURNS [RGBCalibration]; <> <<>> CreateCalibration: PROC [type: ATOM, red, green, blue: Chromaticity, white: Chromaticity, YMax: REAL _ 100] RETURNS [RGBCalibration]; <> <<>> RGB: TYPE ~ RECORD [R, G, B: REAL]; <> <<>> XYZFromRGB: PROC [rgb: RGB, calibration: RGBCalibration _ NIL] RETURNS [XYZ]; <> <<>> RGBFromXYZ: PROC [xyz: XYZ, calibration: RGBCalibration _ NIL] RETURNS [RGB]; <> <> RGBMaxY: PROC [c: Chromaticity, calibration: RGBCalibration _ NIL] RETURNS [Y: REAL]; <> <<[x, y, Y] is inside the device's gamut iff Y<=RGBMaxY[[x, y], calibration].>> <<>> YIQ: TYPE ~ RECORD [Y, I, Q: REAL]; <> <> <> <<>> YIQFromRGB: PROC [RGB] RETURNS [YIQ]; RGBFromYIQ: PROC [YIQ] RETURNS [RGB]; <> HSV: TYPE ~ RECORD [H, S, V: REAL]; <> <> <> HSVFromRGB: PROC [RGB] RETURNS [HSV]; RGBFromHSV: PROC [HSV] RETURNS [RGB]; <> HSL: TYPE ~ RECORD [H, S, L: REAL]; <> <> <> HSLFromRGB: PROC [RGB] RETURNS [HSL]; RGBFromHSL: PROC [HSL] RETURNS [RGB]; <> <<>> <> Color: TYPE ~ REF ColorRep; ColorRep: TYPE ~ RECORD [ SELECT tag: * FROM constant => [ colorOperator: ColorOperator, pixel: SEQUENCE size: NAT OF Sample ], sampled => [ -- the result of MakeSampledColor pa: PixelArray, -- the array of pixels um: Transformation, -- transforms from color to device coordinates colorOperator: ColorOperator -- maps pixels into constant colors ], sampledBlack => [ -- the result of MakeSampledBlack pa: PixelArray, -- the array of pixels (must be 1 bit per pixel) um: Transformation, -- transforms from color to device coordinates clear: BOOL -- are zero bits transparent? ], special => [ -- XOR, stipples, and the like type: ATOM, data: REF, substitute: Color -- use this if you don't recognize type ], ENDCASE ]; ConstantColor: TYPE ~ REF ColorRep.constant; SampledColor: TYPE ~ REF ColorRep.sampled; SampledBlack: TYPE ~ REF ColorRep.sampledBlack; SpecialColor: TYPE ~ REF ColorRep.special; <> ColorOperator: TYPE ~ REF ColorOperatorRep; ColorOperatorRep: TYPE ~ RECORD [ chromatic: BOOL, samplesPerPixelIn: NAT, class: REF ColorOperatorClassRep, data: REF ]; ColorOperatorClassRep: TYPE; ColorOutput: TYPE ~ REF ColorOutputRep; ColorOutputRep: TYPE ~ RECORD [ type: ATOM, samplesPerPixelOut: NAT, impl: REF ColorOutputImplRep ]; ColorOutputImplRep: TYPE; TupleProc: TYPE ~ PROC [i: NAT] RETURNS [REAL]; TranslateProc: TYPE ~ PROC [pixelsIn: PixelBuffer, pixelsOut: PixelBuffer]; Apply: PROC [self: ColorOperator, pixel: PixelProc] RETURNS [ConstantColor]; <> <<>> TupleFromPixel: PROC [self: ColorOperator, output: ColorOutput, pixelIn: PixelProc, tupleAction: PROC [tupleOut: TupleProc]]; PixelFromPixel: PROC [self: ColorOperator, output: ColorOutput, pixelIn: PixelProc, maxOut: PixelProc, pixelAction: PROC [pixelOut: PixelProc]]; TranslatePixels: PROC [self: ColorOperator, output: ColorOutput, maxIn: PixelProc, maxOut: PixelProc, translateAction: PROC [translate: TranslateProc]]; Translate: PROC [self: ColorOperator, output: ColorOutput, pa: PixelArray, maxOut: PixelProc] RETURNS [PixelMap]; <> ColorFromGray: PROC [f: REAL] RETURNS [ConstantColor]; <> <> ColorFromXYZ: PROC [xyz: XYZ] RETURNS [ConstantColor]; <> <<>> ColorFromRGB: PROC [rgb: RGB, calibration: RGBCalibration _ NIL] RETURNS [ConstantColor]; <> <<>> ColorFromYIQ: PROC [yiq: YIQ, calibration: RGBCalibration _ NIL] RETURNS [ConstantColor]; ColorFromHSV: PROC [hsv: HSV, calibration: RGBCalibration _ NIL] RETURNS [ConstantColor]; ColorFromHSL: PROC [hsl: HSL, calibration: RGBCalibration _ NIL] RETURNS [ConstantColor]; <<>> TupleFromColor: PROC [self: ConstantColor, output: ColorOutput, tupleAction: PROC [tupleOut: TupleProc]]; PixelFromColor: PROC [self: ConstantColor, output: ColorOutput, maxOut: PixelProc, pixelAction: PROC [pixelOut: PixelProc]]; GrayFromColor: PROC [color: ConstantColor] RETURNS [REAL]; <> <> MakeSampledBlack: PROC [pa: PixelArray, um: Transformation, clear: BOOL _ FALSE] RETURNS [SampledBlack]; MakeSampledColor: PROC [pa: PixelArray, um: Transformation, colorOperator: ColorOperator] RETURNS [SampledColor]; END.