<> <> <> <> <> <> <> <<>> DIRECTORY ColorPatch, Commander, Imager, ImagerColor, ImagerDither, ImagerDitherContext, Real, ViewerClasses, ViewerOps; <<>> ColorPatchImpl: CEDAR PROGRAM IMPORTS Imager, ImagerDitherContext, ViewerOps, ImagerColor, Real, Commander EXPORTS ColorPatch ~ BEGIN OPEN ColorPatch; Viewer: TYPE = ViewerClasses.Viewer; RGB: TYPE = ImagerColor.RGB; MapEntry: TYPE ~ ImagerDither.MapEntry; ColorValue: TYPE ~ ImagerDither.ColorValue; MakeColorPatch: PUBLIC PROCEDURE[info: ViewerClasses.ViewerRec, mapEntry: MapEntry] RETURNS[ColorPatchViewer] = { viewer: ColorPatchViewer; rgb: RGB ¬ [FromByte[mapEntry.red], FromByte[mapEntry.green], FromByte[mapEntry.blue]]; info.data ¬ NEW[ColorPatchDataRec ¬ [ box: [xmin: 0, ymin: 0, xmax: info.ww, ymax: info.wh], rgb: rgb, patchMapEntry: mapEntry, lastColor: ImagerDitherContext.MakeSpecialColor[specialPixel: [mapEntry.mapIndex,null], ordinaryColor: ImagerColor.ColorFromRGB[rgb]] ]]; viewer ¬ ViewerOps.CreateViewer[ flavor: $ColorPatch, info: info, paint: FALSE ]; RETURN[viewer]; }; Paint: ViewerClasses.PaintProc = { patchData: ColorPatchData ¬ NARROW[self.data]; box: Imager.Box ¬ patchData.box; doLastColor: PROC = { Imager.SetColor[context, patchData.lastColor]; Imager.MaskBox[context, box]; }; patchData.lastColor ¬ ImagerColor.ColorFromRGB[patchData.rgb]; doLastColor[]; <<<<>> <> <> <> <> <> <> <<};>> <> <> <> <> <> <> <> <> <> <> <<>>>> }; ToByte: PROC[v: REAL] RETURNS[ColorValue] = INLINE { <> IF v<=0.0 THEN RETURN[0]; IF v>=1.0 THEN RETURN[255]; RETURN[Real.Round[v*255.0]]; }; FromByte: PROC[v: ColorValue] RETURNS[REAL] = INLINE { RETURN[v/255.0] }; PaintColorPatch: PUBLIC PROC[patch: ColorPatchViewer, color: ImagerColor.RGB] = { data: ColorPatchData ¬ NARROW[patch.data]; data.rgb ¬ color; data.lastColor ¬ ImagerDitherContext.MakeSpecialColor[specialPixel: [data.patchMapEntry.mapIndex,null], ordinaryColor: ImagerColor.ColorFromRGB[data.rgb]]; ViewerOps.PaintViewer[patch, client, FALSE, $NewColor]; }; PaintSpecial: PUBLIC PROC[patch: ColorPatchViewer, color: ImagerColor.ConstantColor] = { data: ColorPatchData ¬ NARROW[patch.data]; data.rgb ¬ ImagerColor.RGBFromColor[ImagerColor.NarrowToOpConstantColor[color]]; data.lastColor ¬ color; ViewerOps.PaintViewer[patch, client, FALSE, $Special]; }; GetSpecialMapEntry: PUBLIC PROC [patch: ColorPatchViewer] RETURNS [patchMapEntry: MapEntry] = { data: ColorPatchData ¬ NARROW[patch.data]; RETURN[data.patchMapEntry]; }; DestroyColorPatch: ViewerClasses.DestroyProc = {}; colorPatchClass: ViewerClasses.ViewerClass ¬ NEW[ViewerClasses.ViewerClassRec ¬ [paint: Paint, destroy: DestroyColorPatch]]; <> SetGamma: Commander.CommandProc ~ BEGIN msg ¬ "This command has been retracted" END; -- SetGamma <<>> <> ViewerOps.RegisterViewerClass[$ColorPatch, colorPatchClass]; Commander.Register[key: "ColorToolGamma", proc: SetGamma, doc: "This command has been retracted"] END.