DIRECTORY Imager, ImagerBackdoor, HBrick, ImagerColor, ImagerDevice, ImagerMaskCache, ImagerPrintColor, ImagerPrivate, ImagerRaster, ImagerSample, ImagerTransformation, PrintColor, SF, Vector2, Terminal, ImagerPixel; DisplayAsPrinterImpl: CEDAR PROGRAM IMPORTS ImagerBackdoor, HBrick, ImagerMaskCache, ImagerPrintColor, ImagerRaster, ImagerPixel, ImagerSample, ImagerTransformation, Terminal ~ BEGIN Data: TYPE ~ REF DataRep; DataRep: TYPE ~ RECORD [ bitmaps: ImagerPixel.PixelMap _ NIL, viewToDevice: ImagerTransformation.Transformation, deviceColorData: ImagerPrintColor.DeviceColorData ]; fontCacheName: ATOM ~ $Print; fontCacheMaxSize: INT _ 8000; defaultDotShape: REAL _ 0.48; defaultScreenAngle: ARRAY PrintColor.Toner[black..yellow] OF REAL _ [ black: 90, cyan: 75, magenta: 105, yellow: 45 ]; MakeHalftoneProperties: PROC [logicalDevice: PrintColor.LogicalDevice, pixelsPerHalftoneDot: REAL] RETURNS [h: PrintColor.HalftoneProperties _ NIL] ~ { FOR t: PrintColor.Toner IN PrintColor.Toner[black..yellow] DO angle: REAL ~ defaultScreenAngle[t]; brick: HBrick.Brick ~ HBrick.BrickFromDotScreen[pixelsPerDot: pixelsPerHalftoneDot, degrees: angle, shape: defaultDotShape]; h _ CONS[[type: NIL, toner: t, brick: brick], h]; ENDLOOP; }; Create: PUBLIC PROC [deviceSpaceSize: SF.Vec, scanMode: ImagerTransformation.ScanMode, surfaceUnitsPerInch: Vector2.VEC, logicalDevice: PrintColor.LogicalDevice, pixelsPerHalftoneDot: REAL] RETURNS [Imager.Context] ~ { halftoneProperties: PrintColor.HalftoneProperties ~ MakeHalftoneProperties[logicalDevice, pixelsPerHalftoneDot]; data: Data ~ NEW[DataRep _ [bitmaps: NIL, deviceColorData: ImagerPrintColor.NewDeviceColorData[logicalDevice: logicalDevice, halftoneProperties: halftoneProperties, correction: NIL, interpolate: FALSE]]]; deviceParm: ImagerDevice.DeviceParm _ NEW[ImagerDevice.DeviceParmRep _ [ class: deviceClass, sSize: deviceSpaceSize.s, fSize: deviceSpaceSize.f, scanMode: scanMode, surfaceUnitsPerInch: surfaceUnitsPerInch, surfaceUnitsPerPixel: 1, fontTuner: NIL, fontCache: ImagerMaskCache.GetNamedCache[fontCacheName, fontCacheMaxSize], rastWeight: 2.0 ]]; context: Imager.Context ~ ImagerRaster.Create[class: contextClass, deviceParm: deviceParm, data: data, pixelUnits: FALSE]; ImagerRaster.SetDeviceClipBox[context, [[0,0], [0,0]]]; RETURN [context] }; InterleavedRep: TYPE ~ RECORD [mapInterleaved: ImagerSample.SampleMap, offset: NAT, samplesPerPixel: NAT]; InterleavedGetSamples: ImagerSample.ObjectGetProc ~ { data: REF InterleavedRep ~ NARROW[ImagerSample.GetData[self]]; ImagerSample.GetSamples[map: data.mapInterleaved, initIndex: [initIndex.s, initIndex.f*data.samplesPerPixel+data.offset], delta: [0, data.samplesPerPixel], buffer: buffer, start: start, count: count]; }; InterleavedPutSamples: ImagerSample.ObjectPutProc ~ { data: REF InterleavedRep ~ NARROW[ImagerSample.GetData[self]]; ImagerSample.PutSamples[map: data.mapInterleaved, initIndex: [initIndex.s, initIndex.f*data.samplesPerPixel+data.offset], delta: [0, data.samplesPerPixel], buffer: buffer, start: start, count: count, function: function]; }; InitColorMap: PUBLIC PROC [vt: Terminal.Virtual] ~ { FOR k: NAT IN [0..1] DO FOR y: NAT IN [0..1] DO FOR m: NAT IN [0..1] DO FOR c: NAT IN [0..1] DO channel: CARDINAL ~ (((c*2+m)*2+y)*2+k); red: CARDINAL ~ (1-c)*255*(1-k); green: CARDINAL ~ (1-m)*255*(1-k); blue: CARDINAL ~ (1-y)*255*(1-k); Terminal.SetColor[vt: vt, aChannelValue: channel, bChannelValue: 0, red: red, green: green, blue: blue]; ENDLOOP; ENDLOOP; ENDLOOP; ENDLOOP; }; PixelMapFromFrameBuffers: PUBLIC PROC [frameA: Terminal.FrameBuffer] RETURNS [ImagerPixel.PixelMap] ~ { sampleA: ImagerSample.SampleMap ~ ImagerSample.MapFromFrameBuffer[frameA]; box: SF.Box ~ ImagerSample.GetBox[sampleA]; frameAInterleaved: Terminal.FrameBuffer ~ NEW[Terminal.FrameBufferRep _ [vm: frameA.vm, base: frameA.base, wordsPerLine: frameA.wordsPerLine, bitsPerPixel: 1, width: frameA.width*frameA.bitsPerPixel, height: frameA.height]]; sampleInterleaved: ImagerSample.SampleMap ~ ImagerSample.MapFromFrameBuffer[frameAInterleaved]; sampleC: ImagerSample.SampleMap ~ ImagerSample.NewObjectSampleMap[box: box, bitsPerSample: 1, getSamples: InterleavedGetSamples, putSamples: InterleavedPutSamples, data: NEW[InterleavedRep _ [sampleInterleaved, frameA.bitsPerPixel-4, frameA.bitsPerPixel]]]; sampleM: ImagerSample.SampleMap ~ ImagerSample.NewObjectSampleMap[box: box, bitsPerSample: 1, getSamples: InterleavedGetSamples, putSamples: InterleavedPutSamples, data: NEW[InterleavedRep _ [sampleInterleaved, frameA.bitsPerPixel-3, frameA.bitsPerPixel]]]; sampleY: ImagerSample.SampleMap ~ ImagerSample.NewObjectSampleMap[box: box, bitsPerSample: 1, getSamples: InterleavedGetSamples, putSamples: InterleavedPutSamples, data: NEW[InterleavedRep _ [sampleInterleaved, frameA.bitsPerPixel-2, frameA.bitsPerPixel]]]; sampleK: ImagerSample.SampleMap ~ ImagerSample.NewObjectSampleMap[box: box, bitsPerSample: 1, getSamples: InterleavedGetSamples, putSamples: InterleavedPutSamples, data: NEW[InterleavedRep _ [sampleInterleaved, frameA.bitsPerPixel-1, frameA.bitsPerPixel]]]; pixelMap: ImagerPixel.PixelMap ~ ImagerPixel.MakePixelMap[sampleK, sampleC, sampleM, sampleY]; RETURN [pixelMap]; }; SetBitmaps: PUBLIC PROC [context: Imager.Context, bitmaps: ImagerPixel.PixelMap] ~ { data: Data ~ NARROW[context.data]; data.bitmaps _ bitmaps; ImagerRaster.SetDeviceClipBox[context, IF bitmaps = NIL THEN [] ELSE bitmaps.box]; }; MySetColor: PROC [context: Imager.Context, color: ImagerColor.Color, viewToDevice: ImagerTransformation.Transformation] RETURNS [ImagerDevice.AllowedMasks] ~ { data: Data ~ NARROW[context.data]; data.viewToDevice _ ImagerTransformation.Copy[viewToDevice]; RETURN [[ unorderedBoxes: FALSE, multipleCoverage: FALSE, regionFill: FALSE, bitmap: FALSE, rawBitmaps: FALSE, runGroupChar: FALSE, rasterChar: FALSE ]]; }; MyMaskBoxes: PROC [context: Imager.Context, bounds: SF.Box, boxes: SF.BoxGenerator] ~ { data: Data ~ NARROW[context.data]; FOR t: PrintColor.Toner IN [black..yellow] DO ImagerPrintColor.SetSeparation[data.deviceColorData, t]; ImagerPrintColor.SetDeviceColorData[data.deviceColorData, ImagerBackdoor.GetColor[context], data.viewToDevice]; ImagerPrintColor.MaskBoxes[data.bitmaps[ORD[t]], data.deviceColorData, bounds, boxes]; ENDLOOP; }; deviceClass: ImagerDevice.DeviceClass ~ NEW[ImagerDevice.DeviceClassRep _ [ SetColor: MySetColor, SetPriority: NIL, MaskBoxes: MyMaskBoxes, MaskRegion: NIL, MaskBitmap: NIL, MaskRawBitmaps: NIL, DrawBitmap: NIL, MaskChar: NIL, MoveBox: NIL, DoBuffered: NIL, AccessBuffer: NIL ]]; contextClass: ImagerPrivate.Class ~ CreateClass[]; CreateClass: PROC RETURNS [class: ImagerPrivate.Class] ~ INLINE { class _ ImagerRaster.CreateClass[type: $Print, deviceClass: deviceClass]; }; END. ΪDisplayAsPrinterImpl.mesa Copyright Σ 1987 by Xerox Corporation. All rights reserved. Michael Plass, July 13, 1987 5:20:30 pm PDT EXPORTS ExportsList frameA should be at least 4 bps. SetSeparation: PUBLIC PROC [context: Imager.Context, toner: PrintColor.Toner] ~ { data: Data ~ NARROW[context.data]; ImagerPrintColor.SetSeparation[data.deviceColorData, toner]; }; ImagerPrintColor.SetDeviceColorData[data.deviceColorData, color, viewToDevice]; class.Show _ ...; Κ ˜codešœ™K™K•StartOfExpansionΈ[map: ImagerSample.SampleMap, initIndex: SF.Vec _ [s: 0, f: 0], delta: SF.Vec _ [s: 0, f: 1], buffer: ImagerSample.SampleBuffer, start: NAT _ 0, count: NAT _ 32767]šœΘ˜ΘKšœ˜K˜—šŸœ ˜5Kšœœœ˜>K–Έ[map: ImagerSample.SampleMap, initIndex: SF.Vec _ [s: 0, f: 0], delta: SF.Vec _ [s: 0, f: 1], buffer: ImagerSample.SampleBuffer, start: NAT _ 0, count: NAT _ 32767]šœά˜άKšœ˜K˜—šŸ œœœ˜4šœœœ˜šœœœ˜šœœœ˜šœœœ˜Kšœ œ˜(K–ο[vt: Terminal.Virtual, aChannelValue: ColorDisplayDefs.ChannelValue _ 0, bChannelValue: ColorDisplayDefs.ChannelValue _ 0, red: ColorDisplayDefs.ColorValue, green: ColorDisplayDefs.ColorValue, blue: ColorDisplayDefs.ColorValue]šœœ˜ K–ο[vt: Terminal.Virtual, aChannelValue: ColorDisplayDefs.ChannelValue _ 0, bChannelValue: ColorDisplayDefs.ChannelValue _ 0, red: ColorDisplayDefs.ColorValue, green: ColorDisplayDefs.ColorValue, blue: ColorDisplayDefs.ColorValue]šœœ˜"K–ο[vt: Terminal.Virtual, aChannelValue: ColorDisplayDefs.ChannelValue _ 0, bChannelValue: ColorDisplayDefs.ChannelValue _ 0, red: ColorDisplayDefs.ColorValue, green: ColorDisplayDefs.ColorValue, blue: ColorDisplayDefs.ColorValue]šœœ˜!Kšœh˜hKšœ˜—Kšœ˜—Kšœ˜—Kšœ˜—Kšœ˜K˜—šŸœœœ œ˜gKšœJ˜JK–‘[box: SF.Box, bitsPerSample: ImagerSample.BitsPerSample, getSamples: ImagerSample.ObjectGetProc, putSamples: ImagerSample.ObjectPutProc, data: REF ANY]šœœ$˜+Kšœ*œ³˜ΰKšœ_˜_KšœͺœT˜KšœͺœT˜KšœͺœT˜KšœͺœT˜Kšœ^˜^Kšœ ˜Kšœ˜Kšœ ™ K˜—šŸ œ œ=˜TKšœ œ˜"Kšœ˜Kš œ'œ œœœ˜RKšœ˜K˜—šŸ œ œ7™QKšœ œ™"Kšœ<™