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. |ColorPatchImpl.mesa Copyright Σ 1987, 1989, 1990, 1992 by Xerox Corporation. All rights reserved. Written by: Maureen Stone May 7, 1986 11:50:04 am PDT Maureen Stone, October 1, 1987 11:26:57 am PDT Pier, December 7, 1988 5:15:33 pm PST Giordano:PARC:Xerox (8*923-4484), June 25, 1990 4:46 pm PDT Doug Wyatt, April 10, 1992 5:11 pm PDT << mode: Terminal.ColorMode = Terminal.GetColorMode[Terminal.Current[]]; animationOK: BOOLEAN = self.column=color AND NOT mode.full AND mode.bitsPerPixelChannelA=8; IF NOT animationOK THEN { patchData.lastColor _ ImagerColor.ColorFromRGB[patchData.rgb]; doLastColor[]; RETURN; }; Here we manipulate the colormap for colormap animation patchData.patchMapEntry.red _ ToByte[patchData.rgb.R]; patchData.patchMapEntry.green _ ToByte[patchData.rgb.G]; patchData.patchMapEntry.blue _ ToByte[patchData.rgb.B]; ImagerColorMap.LoadEntries[vt: Terminal.Current[], mapEntries: LIST[patchData.patchMapEntry], shared: FALSE]; If we've just changed from NOT animationOK to animationOK, lastColor would be wrong This guarentees that if we think we're doing colormap animation, we're using the correct color for doLastColor patchData.lastColor _ ImagerDitherContext.MakeSpecialColor[specialPixel: [patchData.patchMapEntry.mapIndex,null], ordinaryColor: ImagerColor.ColorFromRGB[patchData.rgb]]; IF whatChanged=NIL OR whatChanged=$Special THEN doLastColor[]; --animation won't work >> N.B.: this code stupidly written to get around compiler. colorPatchClass is a record containing the procedures and data common to all ColorPatch viewer instances (class record). Register the ColorPatch class of viewer with the Window Manager Κ•NewlineDelimiter –(cedarcode) style˜codešœ™Kšœ ΟeœC™NKšœ3Οk™6Kšœ.™.K™%K™Kš ˜K™KšΟyE™EKš ‘ Πky‘’‘’‘ ’‘™[š’‘’‘ ’‘™Kš‘>™>Kš‘™Kš’‘™Kš‘™—Kš‘6™6Kš‘6™6Kš‘8™8Kš‘7™7Kš‘@’‘#’‘™nKš‘’‘5™SKš‘X™XKš‘™Kš‘ͺ™ͺKš ’‘ ’‘’‘’‘Πcy™VK™Kšœ˜—K˜š Ÿœžœžœžœžœ˜4K™8Kšžœžœžœ˜Kšžœžœžœ˜Kšžœ˜Kšœ˜—K˜Kš Ÿœžœžœžœžœžœ ˜IK˜šŸœžœžœ-žœ˜QKšœžœ ˜*K˜K˜›Kšœ%žœ ˜7K˜K˜—šŸ œžœžœ?˜XKšœžœ ˜*K˜PK˜Kšœ%žœ ˜6K˜K˜—šŸœžœžœžœ˜_Kšœžœ ˜*Kšžœ˜K˜K˜—K˜KšŸœ!˜2K˜šœ-žœL˜|Kšœx™x—code2šŸœž˜'K˜'KšžœΟc ˜—K™K˜Kšœ?™?Kšœ<˜