DIRECTORY Imager, ImagerPrintContext, HBrick, ImagerColor, ImagerDevice, ImagerMaskCache, ImagerPrintColor, ImagerPrivate, ImagerRaster, ImagerRasterShow, ImagerSample, ImagerTransformation, PrintColor, SF, Vector2; ImagerPrintContextImpl: CEDAR PROGRAM IMPORTS HBrick, ImagerMaskCache, ImagerPrintColor, ImagerRaster, ImagerRasterShow, ImagerSample EXPORTS ImagerPrintContext ~ BEGIN Data: TYPE ~ REF DataRep; DataRep: TYPE ~ RECORD [ bitmap: ImagerSample.SampleMap _ NIL, 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; }; SimpleCreate: 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]; RETURN [Create[deviceSpaceSize: deviceSpaceSize, scanMode: scanMode, surfaceUnitsPerInch: surfaceUnitsPerInch, logicalDevice: logicalDevice, halftoneProperties: halftoneProperties, correction: NIL, interpolate: FALSE]]; }; Create: PUBLIC PROC [deviceSpaceSize: SF.Vec, scanMode: ImagerTransformation.ScanMode, surfaceUnitsPerInch: Vector2.VEC, logicalDevice: PrintColor.LogicalDevice, halftoneProperties: PrintColor.HalftoneProperties, correction: PrintColor.ColorCorrection, interpolate: BOOL] RETURNS [Imager.Context] ~ { data: Data ~ NEW[DataRep _ [bitmap: NIL, deviceColorData: ImagerPrintColor.NewDeviceColorData[logicalDevice: logicalDevice, halftoneProperties: halftoneProperties, correction: correction, interpolate: interpolate]]]; 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] }; SetBitmap: PUBLIC PROC [context: Imager.Context, bitmap: ImagerSample.SampleMap] ~ { data: Data ~ NARROW[context.data]; data.bitmap _ bitmap; ImagerRaster.SetDeviceClipBox[context, IF bitmap = NIL THEN [] ELSE ImagerSample.GetBox[bitmap]]; }; SetSeparation: PUBLIC PROC [context: Imager.Context, toner: PrintColor.Toner] ~ { data: Data ~ NARROW[context.data]; ImagerPrintColor.SetSeparation[data.deviceColorData, toner]; }; MySetColor: PROC [context: Imager.Context, color: ImagerColor.Color, viewToDevice: ImagerTransformation.Transformation] RETURNS [ImagerDevice.AllowedMasks] ~ { data: Data ~ NARROW[context.data]; ImagerPrintColor.SetDeviceColorData[data.deviceColorData, color, viewToDevice]; RETURN [[ unorderedBoxes: (data.deviceColorData.case < sampledColor), multipleCoverage: (data.deviceColorData.case < sampledColor), regionFill: FALSE, bitmap: data.deviceColorData.case = constant, rawBitmaps: (data.deviceColorData.case = constant AND ISTYPE[data.bitmap, ImagerSample.RasterSampleMap]), runGroupChar: FALSE, rasterChar: FALSE ]]; }; MyMaskBoxes: PROC [context: Imager.Context, bounds: SF.Box, boxes: SF.BoxGenerator] ~ { data: Data ~ NARROW[context.data]; ImagerPrintColor.MaskBoxes[data.bitmap, data.deviceColorData, bounds, boxes]; }; MyMaskBitmap: PROC [context: Imager.Context, bitmap: ImagerSample.SampleMap, delta: SF.Vec, bounds: SF.Box, boxes: SF.BoxGenerator] ~ { data: Data ~ NARROW[context.data]; function: ImagerSample.Function _ [null, null]; IF data.deviceColorData.case # constant THEN ERROR; SELECT data.deviceColorData.ink FROM nop => NULL; set => function _ [or, null]; remove => function _ [and, complement]; ENDCASE => ERROR; ImagerSample.TransferBoxes[dst: data.bitmap, src: bitmap, delta: delta, boxes: boxes, function: function]; }; MyMaskRawBitmaps: PROC [context: Imager.Context, n: [0..ImagerSample.rawArraySize], a: POINTER TO ImagerSample.RawArray] ~ { data: Data ~ NARROW[context.data]; function: ImagerSample.Function _ [null, null]; IF data.deviceColorData.case # constant THEN ERROR; SELECT data.deviceColorData.ink FROM nop => NULL; set => function _ [or, null]; remove => function _ [and, complement]; ENDCASE => ERROR; ImagerSample.MultipleTransfer[dst: NARROW[data.bitmap], n: n, a: a, function: function]; }; deviceClass: ImagerDevice.DeviceClass ~ NEW[ImagerDevice.DeviceClassRep _ [ SetColor: MySetColor, SetPriority: NIL, MaskBoxes: MyMaskBoxes, MaskRegion: NIL, MaskBitmap: MyMaskBitmap, MaskRawBitmaps: MyMaskRawBitmaps, 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]; class.Show _ ImagerRasterShow.FastShow; }; END. ŒImagerPrintContextImpl.mesa Copyright Σ 1987 by Xerox Corporation. All rights reserved. Michael Plass, July 13, 1987 5:02:40 pm PDT Κ<˜codešœ™K™˜TKšœ œ˜"Kšœ˜Kš œ'œ œœœ˜aKšœ˜K˜—šŸ œ œ7˜QKšœ œ˜"Kšœ<˜