-- ImagerMaskContextImpl.mesa
-- Mik Lamming - July 30, 1986 5:34:19 pm PDT
Last edited by: Mik Lamming - July 31, 1986 12:16:56 pm PDT
DIRECTORY Atom, ImagerBackdoorPrivate, ImagerColor, ImagerMaskContext, Rope, ImagerDevice, ImagerBackdoor, ImagerScanConverter, ImagerPixelMap, ImagerFont, ImagerManhattan, ImagerPath, ImagerTransformation, Vector2, Imager, ImagerFontPrivate, ImagerPrivate;
ImagerMaskContextImpl: CEDAR PROGRAM
IMPORTS Atom, ImagerBackdoor, ImagerColor
EXPORTS Imager, ImagerFont, ImagerMaskContext
~ BEGIN
Class: TYPE ~ ImagerPrivate.Class;
ClassRep: PUBLIC TYPE ~ ImagerPrivate.ClassRep; -- export to Imager.ClassRep
ROPE: TYPE ~ Rope.ROPE;
CharMask: TYPE ~ ImagerDevice.CharMask;
Clipper: TYPE ~ ImagerBackdoor.Clipper;
Color: TYPE ~ Imager.Color;
ColorOperator: TYPE ~ Imager.ColorOperator;
Context: TYPE ~ Imager.Context;
Device: TYPE ~ ImagerDevice.Device;
DeviceBox: TYPE ~ ImagerDevice.DeviceBox;
RunProc: TYPE ~ ImagerDevice.RunProc;
DevicePath: TYPE ~ ImagerScanConverter.DevicePath;
DeviceRectangle: TYPE ~ ImagerPixelMap.DeviceRectangle;
Font: TYPE ~ ImagerFont.Font;
ManhattanPolygon: TYPE ~ ImagerManhattan.Polygon;
PathProc: TYPE ~ ImagerPath.PathProc;
PixelArray: TYPE ~ Imager.PixelArray;
Rectangle: TYPE ~ ImagerTransformation.Rectangle;
Transformation: TYPE ~ ImagerTransformation.Transformation;
TransformationRep: TYPE ~ ImagerTransformation.TransformationRep;
VEC: TYPE ~ Vector2.VEC;
XChar: TYPE ~ ImagerFont.XChar;
XStringProc: TYPE ~ ImagerFont.XStringProc;
FontImpl: TYPE ~ ImagerFontPrivate.FontImpl;
FontImplRep: PUBLIC TYPE ~ ImagerFontPrivate.FontImplRep;
IntKey: TYPE ~ ImagerBackdoor.IntKey;
RealKey: TYPE ~ ImagerBackdoor.RealKey;
-- Clipper: TYPE ~ ImagerBackdoor.Clipper;
Data: TYPE ~ REF DataRec;
DataRec: TYPE ~ RECORD [
context: Imager.Context ← ,
lastColorRequested: Imager.Color,
maskColor: Imager.Color ← ,
active:BOOLEAN
];
forkViewClass: ImagerBackdoorPrivate.Class ~ NEW[ImagerBackdoorPrivate.ClassRep ← [
type: $fork,
ViewReset: ViewReset,
ViewTranslateI: ViewTranslateI,
ViewClip: ViewClip,
ViewClipRectangleI: ViewClipRectangleI,
ViewFromClient: ViewFromClient,
ClientFromView: ClientFromView,
DeviceFromView: DeviceFromView,
ViewFromDevice: ViewFromDevice,
DeviceFromClient: DeviceFromClient,
ClientFromDevice: ClientFromDevice,
MoveViewRectangle: MoveViewRectangle,
TestViewRectangle: TestViewRectangle
]];
forkClass: Class ~ NEW[ClassRep ← [
type: $MaskContext,
DoSave: MaskDoSave,
SetInt: MaskSetInt,
SetReal: MaskSetReal,
SetT: MaskSetT,
SetFont: MaskSetFont,
SetColor: MaskSetColor,
SetClipper: MaskSetClipper,
GetInt: MaskGetInt,
GetReal: MaskGetReal,
GetT: MaskGetT,
GetFont: MaskGetFont,
GetColor: MaskGetColor,
GetClipper: MaskGetClipper,
ConcatT: MaskConcatT,
Scale2T: MaskScale2T,
RotateT: MaskRotateT,
TranslateT: MaskTranslateT,
Move: MaskMove,
SetXY: MaskSetXY,
SetXYRel: MaskSetXYRel,
Show: MaskShow,
ShowText: MaskShowText,
StartUnderline: MaskStartUnderline,
MaskUnderline: MaskMaskUnderline,
CorrectMask: MaskCorrectMask,
CorrectSpace: MaskCorrectSpace,
Space: MaskSpace,
SetCorrectMeasure: MaskSetCorrectMeasure,
SetCorrectTolerance: MaskSetCorrectTolerance,
Correct: MaskCorrect,
DontCorrect: MaskDontCorrect,
SetGray: MaskSetGray,
SetSampledColor: MaskSetSampledColor,
SetSampledBlack: MaskSetSampledBlack,
MaskFill: MaskMaskFill,
MaskStroke: MaskMaskStroke,
MaskDashedStroke: MaskMaskDashedStroke,
MaskRectangle: MaskMaskRectangle,
MaskRectangleI: MaskMaskRectangleI,
MaskVector: MaskMaskVector,
MaskPixel: MaskMaskPixel,
MaskBits: MaskMaskBits,
DrawBits: MaskDrawBits,
Clip: MaskClip,
ClipRectangle: MaskClipRectangle,
ClipRectangleI: MaskClipRectangleI,
GetCP: MaskGetCP,
GetBoundingRectangle: MaskGetBoundingRectangle,
propList: Atom.PutPropOnList[NIL, $viewOperations, forkViewClass]
]];
Create: PUBLIC PROC [context: Imager.Context, maskColor: Imager.Color, active:BOOLEANTRUE] RETURNS [maskContext: Imager.Context] ~ {
data: Data ← NEW[DataRec ← [context, maskColor, maskColor, active]];
RETURN[NEW[Imager.ContextRep ← [class: forkClass, state: NIL, data: data]]];
};
GetChildContext: PUBLIC PROC [context: Imager.Context] RETURNS [child: Imager.Context ← NIL] ~ {
WITH context.data SELECT FROM
data: Data => {
child ← data.context;
};
ENDCASE;
};
SetMaskColor: PUBLIC PROC [context: Imager.Context, maskColor: Imager.Color] ~ {
WITH context.data SELECT FROM
data: Data => {
data.maskColor ← maskColor;
};
ENDCASE;
};
Activated: PUBLIC PROC [context: Imager.Context, active:BOOLEANTRUE] ~ {
WITH context.data SELECT FROM
data: Data => {
class: Class ← data.context.class;
data.active ← active;
IF data.active THEN
class.SetColor[context: data.context, color: data.maskColor]
ELSE
class.SetColor[context: data.context, color: data.lastColorRequested];
};
ENDCASE;
};
MaskDoSave: PROC[context: Context, action: PROC, all: BOOL] ~ {
data: Data ← NARROW[context.data];
active: BOOLEAN ← data.active;
lastColorRequested: Imager.Color ← data.lastColorRequested;
maskColor: Imager.Color ← data.maskColor;
class: Class ← data.context.class;
class.DoSave[context: data.context, action: action, all: all];
data.maskColor ← maskColor;
data.lastColorRequested ← lastColorRequested;
data.active ← active;
};
MaskSetInt: PROC[context: Context, key: IntKey, val: INT] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.SetInt[context: data.context, key: key, val: val];
};
MaskSetReal: PROC[context: Context, key: RealKey, val: REAL]
~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.SetReal[context: data.context, key: key, val: val];
};
MaskSetT: PROC[context: Context, m: Transformation] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.SetT[context: data.context, m: m];
};
MaskSetFont: PROC[context: Context, font: Font] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.SetFont[context: data.context, font: font];
};
MaskSetColor: PROC[context: Context, color: Color] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
data.lastColorRequested ← color;
IF data.active THEN
class.SetColor[context: data.context, color: data.maskColor]
ELSE
class.SetColor[context: data.context, color: color];
};
MaskSetClipper: PROC[context: Context, clipper: Clipper] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.SetClipper[context: data.context, clipper: clipper];
};
MaskGetInt: PROC[context: Context, key: IntKey] RETURNS[INT] ~ {
data: Data ← NARROW[context.data];
result: INT;
class: Class ← data.context.class;
result ← class.GetInt[context: data.context, key: key];
RETURN [result]
};
MaskGetReal: PROC[context: Context, key: RealKey] RETURNS[REAL] ~ {
data: Data ← NARROW[context.data];
result: REAL;
class: Class ← data.context.class;
result ← class.GetReal[context: data.context, key: key];
RETURN [result]
};
MaskGetT: PROC[context: Context] RETURNS[Transformation] ~ {
data: Data ← NARROW[context.data];
result: Transformation;
class: Class ← data.context.class;
result ← class.GetT[context: data.context];
RETURN [result]
};
MaskGetFont: PROC[context: Context] RETURNS[Font] ~ {
data: Data ← NARROW[context.data];
result: Font;
class: Class ← data.context.class;
result ← class.GetFont[context: data.context];
RETURN [result]
};
MaskGetColor: PROC[context: Context] RETURNS[Color] ~ {
data: Data ← NARROW[context.data];
result: Color;
class: Class ← data.context.class;
result ← class.GetColor[context: data.context];
RETURN [result]
};
MaskGetClipper: PROC[context: Context] RETURNS[Clipper] ~ {
data: Data ← NARROW[context.data];
result: Clipper;
class: Class ← data.context.class;
result ← class.GetClipper[context: data.context];
RETURN [result]
};
MaskConcatT: PROC[context: Context, m: Transformation] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.ConcatT[context: data.context, m: m];
};
MaskScale2T: PROC[context: Context, s: VEC] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.Scale2T[context: data.context, s: s];
};
MaskRotateT: PROC[context: Context, a: REAL] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.RotateT[context: data.context, a: a];
};
MaskTranslateT: PROC[context: Context, t: VEC] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.TranslateT[context: data.context, t: t];
};
MaskMove: PROC[context: Context, rounded: BOOL] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.Move[context: data.context, rounded: rounded];
};
MaskSetXY: PROC[context: Context, p: VEC] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.SetXY[context: data.context, p: p];
};
MaskSetXYRel: PROC[context: Context, v: VEC] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.SetXYRel[context: data.context, v: v];
};
MaskGetCP: PROC[context: Context, rounded: BOOL] RETURNS[VEC] ~ {
data: Data ← NARROW[context.data];
result: VEC;
class: Class ← data.context.class;
result ← class.GetCP[context: data.context, rounded: rounded];
RETURN [result]
};
MaskStartUnderline: PROC[context: Context] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.StartUnderline[context: data.context];
};
MaskMaskUnderline: PROC[context: Context, dy, h: REAL] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.MaskUnderline[context: data.context, dy: dy, h: h];
};
MaskCorrectMask: PROC[context: Context] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.CorrectMask[context: data.context];
};
MaskCorrectSpace: PROC[context: Context, v: VEC] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.CorrectSpace[context: data.context, v: v];
};
MaskSpace: PROC[context: Context, x: REAL] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.Space[context: data.context, x: x];
};
MaskSetCorrectMeasure: PROC[context: Context, v: VEC] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.SetCorrectMeasure[context: data.context, v: v];
};
MaskSetCorrectTolerance: PROC[context: Context, v: VEC] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.SetCorrectTolerance[context: data.context, v: v];
};
MaskCorrect: PROC[context: Context, action: PROC] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.Correct[context: data.context, action: action];
};
MaskDontCorrect: PROC[context: Context, action: PROC, saveCP: BOOL] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.DontCorrect[context: data.context, action: action, saveCP: saveCP];
};
MaskSetGray: PROC[context: Context, f: REAL] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
data.lastColorRequested ← ImagerColor.ColorFromGray[f];
IF data.active THEN
class.SetColor[context: data.context, color: data.maskColor]
ELSE
class.SetGray[context: data.context, f: f];
};
MaskSetSampledColor: PROC[context: Context, pa: PixelArray, m: Transformation, colorOperator: ColorOperator] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
data.lastColorRequested ← ImagerColor.MakeSampledColor[pa, m, colorOperator];
IF data.active THEN
class.SetColor[context: data.context, color: data.maskColor]
ELSE
class.SetSampledColor[context: data.context, pa: pa, m: m, colorOperator: colorOperator];
};
MaskSetSampledBlack: PROC[context: Context, pa: PixelArray, m: Transformation, clear: BOOL] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
data.lastColorRequested ← ImagerColor.MakeSampledBlack[pa, m, clear];
IF data.active THEN
class.SetColor[context: data.context, color: data.maskColor]
ELSE
class.SetSampledBlack[context: data.context, pa: pa, m: m, clear: clear];
};
MaskClip: PROC[context: Context, path: PathProc, oddWrap: BOOL, exclude: BOOL] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.Clip[context: data.context, path: path, oddWrap: oddWrap, exclude: exclude];
};
MaskClipRectangle: PROC[context: Context, r: Rectangle, exclude: BOOL] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.ClipRectangle[context: data.context, r: r, exclude: exclude];
};
MaskClipRectangleI: PROC[context: Context, x, y, w, h: INTEGER, exclude: BOOL] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.ClipRectangleI[context: data.context, x: x, y: y, w: w, h: h, exclude: exclude];
};
MaskShow: PROC [context: Context, string: XStringProc, xrel: BOOL] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.Show[context: data.context, string: string, xrel: xrel];
};
MaskShowText: PROC [context: Context, text: REF READONLY TEXT, start, len: NAT, xrel: BOOL] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.ShowText[context: data.context, text: text, start: start, len: len, xrel: xrel];
};
MaskMaskFill: PROC [context: Context, path: PathProc, oddWrap: BOOL] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.MaskFill[context: data.context, path: path, oddWrap: oddWrap];
};
MaskMaskRectangle: PROC [context: Context, r: Rectangle] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.MaskRectangle[context: data.context, r: r];
};
MaskMaskRectangleI: PROC [context: Context, x, y, w, h: INTEGER] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.MaskRectangleI[context: data.context, x: x, y: y, w: w, h: h];
};
MaskMaskStroke: PROC [context: Context, path: PathProc, closed: BOOL] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.MaskStroke[context: data.context, path: path, closed: closed];
};
MaskMaskVector: PROC [context: Context, p1, p2: VEC] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.MaskVector[context: data.context, p1: p1, p2: p2];
};
MaskMaskDashedStroke: PROC [context: Context, path: PathProc,
patternLen: NAT, pattern: PROC [i: NAT] RETURNS [REAL], offset, length: REAL] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.MaskDashedStroke[context: data.context, path: path,
patternLen: patternLen, pattern: pattern, offset: offset, length: length];
};
MaskMaskPixel: PROC [context: Context, pa: PixelArray] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.MaskPixel[context: data.context, pa: pa];
};
MaskMaskBits: PROC [context: Context, base: LONG POINTER, wordsPerLine: NAT,
sMin, fMin: NAT ← 0, sSize, fSize: NAT, tx, ty: INTEGER] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.MaskBits[context: data.context, base: base, wordsPerLine: wordsPerLine,
sMin: sMin, fMin: fMin, sSize: sSize, fSize: fSize, tx: tx, ty: ty];
};
MaskDrawBits: PROC [context: Context, base: LONG POINTER, wordsPerLine: NAT,
sMin, fMin: NAT ← 0, sSize, fSize: NAT, tx, ty: INTEGER] ~ {
data: Data ← NARROW[context.data];
class: Class ← data.context.class;
class.DrawBits[context: data.context, base: base, wordsPerLine: wordsPerLine,
sMin: sMin, fMin: fMin, sSize: sSize, fSize: fSize, tx: tx, ty: ty];
};
MaskGetBoundingRectangle: PROC [context: Context] RETURNS [Rectangle] ~ {
data: Data ← NARROW[context.data];
result: Rectangle;
class: Class ← data.context.class;
result ← class.GetBoundingRectangle[context: data.context];
RETURN [result]
};
ViewReset: PROC [context: Context] ~ {
data: Data ← NARROW[context.data];
ImagerBackdoor.ViewReset[context: data.context];
};
ViewTranslateI: PROC [context: Context, x, y: INTEGER] ~ {
data: Data ← NARROW[context.data];
ImagerBackdoor.ViewTranslateI[context: data.context, x:x, y:y];
};
ViewClip: PROC [context: Context, path: PathProc, parity: BOOL, exclude: BOOL] ~ {
data: Data ← NARROW[context.data];
ImagerBackdoor.ViewClip[context: data.context, path: path, parity: parity, exclude: exclude];
};
ViewClipRectangleI: PROC [context: Context, x, y, w, h: INTEGER, exclude: BOOL] ~ {
data: Data ← NARROW[context.data];
ImagerBackdoor.ViewClipRectangleI[context: data.context, x:x, y:y, w:w, h:h, exclude:exclude];
};
ViewFromClient: PROC [context: Context, p: VEC] RETURNS [v: VEC] ~ {
data: Data ← NARROW[context.data];
v ← ImagerBackdoor.ViewFromClient[context: data.context, p:p];
};
ClientFromView: PROC [context: Context, p: VEC] RETURNS [v: VEC] ~ {
data: Data ← NARROW[context.data];
v ← ImagerBackdoor.ClientFromView[context: data.context, p:p];
};
DeviceFromView: PROC [context: Context, p: VEC] RETURNS [v: VEC] ~ {
data: Data ← NARROW[context.data];
v ← ImagerBackdoor.DeviceFromView[context: data.context, p:p];
};
ViewFromDevice: PROC [context: Context, p: VEC] RETURNS [v: VEC] ~ {
data: Data ← NARROW[context.data];
v ← ImagerBackdoor.ViewFromDevice[context: data.context, p:p];
};
DeviceFromClient: PROC [context: Context, p: VEC] RETURNS [v: VEC] ~ {
data: Data ← NARROW[context.data];
v ← ImagerBackdoor.DeviceFromClient[context: data.context, p:p];
};
ClientFromDevice: PROC [context: Context, p: VEC] RETURNS [v: VEC] ~ {
data: Data ← NARROW[context.data];
v ← ImagerBackdoor.ClientFromDevice[context: data.context, p:p];
};
MoveViewRectangle: PROC [context: Context, width, height, fromX, fromY, toX, toY: INTEGER] ~ {
data: Data ← NARROW[context.data];
ImagerBackdoor.MoveViewRectangle[context: data.context, width:width, height:height, fromX:fromX, fromY:fromY, toX:toX, toY:toY];
};
TestViewRectangle: PROC [context: Context, x, y, w, h: INTEGER] RETURNS [vis: ImagerBackdoor.Visibility] ~ {
data: Data ← NARROW[context.data];
vis ← ImagerBackdoor.TestViewRectangle[context: data.context, x:x, y:y, w:w, h:h];
};
END.