ImagerPrintContextImpl.mesa
Copyright Ó 1987 by Xerox Corporation. All rights reserved.
Michael Plass, July 13, 1987 5:02:40 pm PDT
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.