DIRECTORY Basics USING [BITAND, BITOR], Imager USING [Color, ColorOperator, Context, Font, PathProc, PixelArray, Rectangle, Transformation, VEC], ImagerBackdoor USING [Clipper, IntKey, RealKey], ImagerClipper USING [Clipper], ImagerDeviceVector USING [DVec], Real USING [LargestNumber]; ImagerState: CEDAR DEFINITIONS IMPORTS Basics ~ BEGIN OPEN ImagerBackdoor, Imager; ChangeFlags: TYPE ~ MACHINE DEPENDENT RECORD [ T: BOOL ¬ FALSE, clipper: BOOL ¬ FALSE, font: BOOL ¬ FALSE, color: BOOL ¬ FALSE, priority: BOOL ¬ FALSE, unused: [0..LAST[CARDINAL]/32] ¬ 0 ]; bits: [BITS[WORD]..BITS[WORD]] = BITS[ChangeFlags]; notChanged: ChangeFlags ~ []; OrChangeFlags: PROC[c1, c2: ChangeFlags] RETURNS[ChangeFlags] ~ INLINE { RETURN[LOOPHOLE[Basics.BITOR[LOOPHOLE[c1], LOOPHOLE[c2]]]]; }; AndChangeFlags: PROC[c1, c2: ChangeFlags] RETURNS[ChangeFlags] ~ INLINE { RETURN[LOOPHOLE[Basics.BITAND[LOOPHOLE[c1], LOOPHOLE[c2]]]]; }; PersistentVariables: TYPE ~ RECORD [ correctMeasure: VEC ¬ [0, 0], -- target line measure for Correct, device coords correctMaskCount: INT ¬ 0, -- tally number of CorrectMask calls in pass 1 correctSum: VEC ¬ [0, 0], -- tally adjustable space from CorrectSpace calls in pass 1 correctMask: VEC ¬ [0, 0], -- space inserted by each CorrectMask call in pass 2 correctSpace: VEC ¬ [0, 0] -- adjustment factors for each CorrectSpace call in pass 2 ]; NonPersistentVariables: TYPE ~ RECORD [ changed: ChangeFlags ¬ notChanged, -- changes since np variables were saved priorityImportant: INT ¬ 0, -- if nonzero, priority of masks is important mediumSize: VEC ¬ [0, 0], -- size of medium, in meters fieldMin: VEC ¬ [0, 0], -- minimum x and y of field, in meters fieldMax: VEC ¬ [0, 0], -- maximum x and y of field, in meters noImage: INT ¬ 0, -- if nonzero, don't image masks strokeWidth: REAL ¬ 0, -- stroke width, client coords strokeEnd: INT ¬ 0, -- stroke end treatment strokeJoint: INT ¬ 0, -- stroke joint treatment underlineStart: REAL ¬ 0, -- starting x position for underline, client coords amplifySpace: REAL ¬ 1.0, -- multiplies width of amplified characters correctPass: INT ¬ 0, -- which pass, during Correct correctShrink: REAL ¬ 0.5, -- allowable space shrink correctStretch: REAL ¬ Real.LargestNumber, -- allowable space stretch correctTolerance: VEC ¬ [0, 0], -- tolerable deviation from correctMeasure, device coords miterLimit: REAL ¬ 0.0, -- miter limit on strokes warn: INT ¬ 0 -- Control over Imager.Warning ]; RasterData: TYPE ~ REF RasterDataRep; RasterDataRep: TYPE; State: TYPE ~ REF StateRep; StateRep: TYPE ~ RECORD [ restoreAll: BOOL ¬ FALSE, -- TRUE iff upon Restore, should restore all state variables, or only NonPersistentVariables changed: ChangeFlags ¬ notChanged, p: PersistentVariables ¬ [], -- persistent variables, other than cp np: NonPersistentVariables ¬ [], -- non-persistent variables other than REFs below cp: ImagerDeviceVector.DVec ¬ NIL, -- current position, in device coordinates. clientToDevice: Transformation ¬ NIL, -- current transformation (client to device) (mutable!) viewToDevice: Transformation ¬ NIL, -- current view to device transformation (mutable!) font: Font ¬ NIL, -- current "showVec" color: Color ¬ NIL, -- current color clipper: ImagerClipper.Clipper ¬ NIL, -- current clipping outline previous: State ¬ NIL, -- next lower State on the state stack avail: State ¬ NIL, -- list of available StateReps rasterData: RasterData ¬ NIL -- data for the common raster implementation ]; CreateState: PROC RETURNS [State]; StateSave: PROC[context: Context, all: BOOL] RETURNS [REF]; StateRestore: PROC[context: Context, ref: REF]; StateSetInt: PROC[context: Context, key: IntKey, val: INT]; StateSetReal: PROC[context: Context, key: RealKey, val: REAL]; StateSetT: PROC[context: Context, m: Transformation]; StateSetFont: PROC[context: Context, font: Font]; StateSetColor: PROC[context: Context, color: Color]; StateSetClipper: PROC[context: Context, clipper: Clipper]; StateGetInt: PROC[context: Context, key: IntKey] RETURNS[INT]; StateGetReal: PROC[context: Context, key: RealKey] RETURNS[REAL]; StateGetT: PROC[context: Context] RETURNS[Transformation]; StateGetFont: PROC[context: Context] RETURNS[Font]; StateGetColor: PROC[context: Context] RETURNS[Color]; StateGetClipper: PROC[context: Context] RETURNS[Clipper]; StateConcatT: PROC[context: Context, m: Transformation]; StateScale2T: PROC[context: Context, s: VEC]; StateRotateT: PROC[context: Context, a: REAL]; StateTranslateT: PROC[context: Context, t: VEC]; StateMove: PROC[context: Context, rounded: BOOL]; StateSetXY: PROC[context: Context, p: VEC]; StateSetXYRel: PROC[context: Context, v: VEC]; StateGetCP: PROC[context: Context, rounded: BOOL] RETURNS[VEC]; StateStartUnderline: PROC[context: Context]; StateMaskUnderline: PROC[context: Context, dy, h: REAL]; StateCorrectMask: PROC[context: Context]; StateCorrectSpace: PROC[context: Context, v: VEC]; StateSpace: PROC[context: Context, x: REAL]; StateSetCorrectMeasure: PROC[context: Context, v: VEC]; StateSetCorrectTolerance: PROC[context: Context, v: VEC]; StateCorrect: PROC[context: Context, action: PROC]; StateDontCorrect: PROC[context: Context, action: PROC, saveCP: BOOL]; StateSetGray: PROC[context: Context, f: REAL]; StateSetSampledColor: PROC[context: Context, pa: PixelArray, m: Transformation, colorOperator: ColorOperator]; StateSetSampledBlack: PROC[context: Context, pa: PixelArray, m: Transformation, clear: BOOL]; StateClip: PROC[context: Context, path: PathProc, oddWrap: BOOL, exclude: BOOL]; StateClipRectangle: PROC[context: Context, r: Rectangle, exclude: BOOL]; StateClipRectangleI: PROC[context: Context, x, y, w, h: INTEGER, exclude: BOOL]; END. Michael Plass, October 4, 1988: Added StateSave, StateRestore, removed: StateDoSave: PROC[context: Context, action: PROC, all: BOOL]; Michael Plass, September 1, 1989 9:31:22 am PDT Changed show variables to be in device coordintes rather than view coordinates. Added warn to NonPersistentVariables  ImagerState.mesa Copyright Σ 1984, 1985, 1987, 1989, 1991, 1992 by Xerox Corporation. All rights reserved. Doug Wyatt, November 11, 1985 4:59:36 pm PST Michael Plass, January 21, 1992 11:11 am PST Contains no REFs, so can be copied with block transfers. Κ•NewlineDelimiter –(cedarcode) style™codešœ™Kšœ ΟeœO™ZKšœ,™,K™,K™—šΟk ˜ Kšœžœžœžœ˜KšœžœXžœ˜iKšœžœ˜0Kšœžœ œœ˜Kšœžœ˜ Kšœžœ˜—K˜KšΠbl œžœž ˜Kšžœ˜šœžœžœ˜$K˜š œ žœžœž œžœ˜.Kšœžœžœ˜Kšœ žœžœ˜Kšœžœžœ˜Kšœžœžœ˜Kšœ žœžœ˜Kšœ žœžœ ˜"K˜K˜—š œžœžœžœžœžœ˜3K˜—šœ˜K˜—šΟn œžœžœžœ˜HKš žœžœžœžœžœ˜;K˜K˜—š œžœžœžœ˜IKš žœžœžœžœžœ˜Kšœ žœ ‘&˜>Kšœ žœ‘ ˜2Kšœ žœ‘˜5Kšœ žœ‘˜+Kšœ žœ‘˜/Kšœžœ‘3˜MKšœžœ‘+˜EKšœ žœ‘˜3Kšœžœ‘˜4Kšœžœ‘˜EKšœžœ ‘9˜YKšœ žœ‘˜1Kšœžœ‘˜,K˜Kšœ8™8K™—Kšœ žœžœ˜%šœžœ˜K˜—Kšœžœžœ ˜šœ žœžœ˜Kšœ žœžœ‘\˜wKšœ"˜"Kšœ‘&˜CKšœ!‘1˜RKšœžœ‘+˜NKšœ!žœ‘7˜]Kšœžœ‘3˜WKšœ žœ‘˜&Kšœžœ‘˜$Kšœ!žœ‘˜AKšœžœ‘&˜>Kšœžœ‘˜3Kšœžœ‘,˜IK˜K˜—K˜š  œžœžœ ˜"K˜—Kš   œžœžœžœžœ˜;Kš  œžœžœ˜/Kš  œžœ%žœ˜;Kš  œžœ&žœ˜>Kš  œžœ&˜5Kš  œžœ˜1Kš  œžœ!˜4Kš œžœ%˜:Kš  œžœ žœžœ˜>Kš  œžœ!žœžœ˜AKš  œžœžœ˜:Kš  œžœžœ˜3Kš  œžœžœ˜5Kš œžœžœ ˜9Kš  œžœ&˜8Kš  œžœžœ˜-Kš  œžœžœ˜.Kš œžœžœ˜0Kš  œžœžœ˜1Kš  œžœžœ˜+Kš  œžœžœ˜.Kš   œžœžœžœžœ˜?Kš œžœ˜,Kš œžœžœ˜8Kš œžœ˜)Kš œžœžœ˜2Kš  œžœžœ˜,Kš œžœžœ˜7Kš œžœžœ˜9Kš  œžœžœ˜3Kš œžœžœ žœ˜EKš  œžœžœ˜.Kš œžœU˜oKš œžœ>žœ˜^Kš  œžœ,žœ žœ˜PKš œžœ*žœ˜HKš œžœžœ žœ˜PK˜—Kšžœ˜˜K˜'Kš  œžœžœžœ˜=—šœ,ž˜/K˜OKšœ$˜$—K™—…—Xd