DIRECTORY Basics USING [bitsPerWord, LongMult], CD, CDBasics, CDDraw, CDProperties, CDSequencer USING [Command], CDVPrivate, CDVScale, CDVTicks, PrincOps USING [BBptr, BitAddress, BitBltFlags, SrcDesc, GrayParm], PrincOpsUtils USING [BITBLT], RuntimeError USING [UNCAUGHT], Terminal, ViewerClasses USING [Viewer]; CDVTicksImpl: CEDAR MONITOR IMPORTS Basics, CDDraw, CDBasics, CDProperties, CDVPrivate, CDVScale, PrincOpsUtils, RuntimeError, Terminal EXPORTS CDVTicks = BEGIN black: REF CARDINAL = NEW[CARDINAL_LAST[CARDINAL]]; virtual: Terminal.Virtual = Terminal.Current[]; PaintTicks: CDVPrivate.PainterProc = BEGIN ENABLE RuntimeError.UNCAUGHT => { IF CDVPrivate.catchAny THEN GOTO SomeError ELSE REJECT }; ModUp: PROC [x, md: CD.Number] RETURNS [CD.Number] = INLINE { RETURN [( IF x>0 THEN (x+md-1) ELSE (x) ) / md * md] }; -- division rounds towards 0 ModDown: PROC [x, md: CD.Number] RETURNS [CD.Number] = INLINE { RETURN [( IF x>=0 THEN (x) ELSE (x-md+1) ) / md * md] }; -- division rounds towards 0 dTicks: CD.Number = NARROW[paintRef.data, REF CD.Number]^; IF dTicks>0 THEN { vTicks: CD.Number = CDVScale.DesignToViewerScalar[me.scale, dTicks]; IF vTicks>6 AND vTicks<=512 THEN TRUSTED { x, xStop, xMod, xInc: INT; yStart, yStop, yInc, yCur: LONG CARDINAL; dr: CD.Rect = CDBasics.Intersection[me.deviceDrawRef.interestClip, paintRef.rect]; -- design coords vr: CD.Rect _ CDVScale.DesignToViewerRect[me.scale, CD.Rect[ -- viewer coords x1: ModDown[dr.x1, dTicks], y1: ModDown[dr.y1, dTicks], x2: ModUp[dr.x2, dTicks], y2: ModUp[dr.y2, dTicks] ]]; vx1, vy1, vx2, vy2: CARDINAL; -- rect in V-coords; snapped to tick positions vx1 _ IF vr.x1>=0 THEN vr.x1 ELSE vr.x1 + ModUp[-vr.x1, vTicks]; vy1 _ IF vr.y1>=0 THEN vr.y1 ELSE vr.y1 + ModUp[-vr.y1, vTicks]; vx2 _ IF vr.x2<=me.viewer.cw THEN vr.x2 ELSE vr.x2-ModUp[vr.x2-me.viewer.cw, vTicks]; vy2 _ IF vr.y2<=me.viewer.ch THEN vr.y2 ELSE vr.y2-ModUp[vr.y2-me.viewer.ch, vTicks]; me.xBBptr.width _ me.bpp; me.xBBptr.height _ 1; me.xBBptr.src _ [LOOPHOLE[black],,0]; me.xBBptr.srcDesc _ PrincOps.SrcDesc[gray[PrincOps.GrayParm[ yOffset: 0, widthMinusOne: 0, --words heightMinusOne: 0 --lines ]]]; me.xBBptr.flags _ PrincOps.BitBltFlags[ direction: forward, disjoint: TRUE, disjointItems: TRUE, gray: TRUE, srcFunc: null, dstFunc: or ]; xInc _ vTicks*me.bpp; x _ Basics.LongMult[vx1+me.vx, me.bpp]; --x start xStop _ Basics.LongMult[vx2+me.vx, me.bpp]; yInc _ vTicks*me.scWidthWords; yStart _ LOOPHOLE[me.screen + Basics.LongMult[(me.vy-vy2), me.scWidthWords] ]; yStop _ LOOPHOLE[me.screen + Basics.LongMult[(me.vy-vy1), me.scWidthWords] + xStop/Basics.bitsPerWord]; BEGIN DoIt: PROC [] = TRUSTED BEGIN WHILE x<=xStop DO yCur _ yStart+LOOPHOLE[(x/Basics.bitsPerWord), LONG CARDINAL]; xMod _ x MOD Basics.bitsPerWord; WHILE yCur<=yStop DO me.xBBptr.dst _ [LOOPHOLE[yCur],, xMod]; PrincOpsUtils.BITBLT[me.xBBptr]; yCur _ yCur+yInc ENDLOOP; x _ x+xInc; ENDLOOP; END; IF me.bpp=1 THEN DoIt[] ELSE Terminal.ModifyColorFrame[virtual, DoIt]; END; }; } EXITS SomeError => NULL END; ShowTicks: PUBLIC PROC [onto: REF, value: INT_0] = BEGIN me: CDVPrivate.MyGraphicRef; WITH onto SELECT FROM x: CDVPrivate.MyGraphicRef => me _ x; c: CDSequencer.Command => {ShowTicks[onto: c.ref, value: value]; RETURN}; v: ViewerClasses.Viewer => {ShowTicks[onto: v.data, value: value]; RETURN}; ENDCASE => RETURN; IF me#NIL THEN { pr: REF CDVPrivate.PainterRec = GetAPainterRec[me]; value _ MIN[4096, MAX[0, value]]; pr.data _ NEW[CD.Number_value]; IF value=0 THEN CDVPrivate.RemoveAPainterRec[me, pr] ELSE CDVPrivate.IncludeAPainterRec[me, pr]; CDDraw.InsertCommand[me.ct, CDDraw.Comm[cmd: rect, erase: TRUE, rect: CDBasics.universe, ref: NIL]] } END; GetAPainterRec: ENTRY PROC [me: CDVPrivate.MyGraphicRef] RETURNS [pr: REF CDVPrivate.PainterRec] = BEGIN ENABLE UNWIND => NULL; x: REF = CDProperties.GetPropFromList[me.properties, $CDxTickProc]; IF x#NIL THEN pr _ NARROW[x] ELSE { pr _ NEW[CDVPrivate.PainterRec_[proc: PaintTicks, rect: CDBasics.universe]]; me.properties _ Atom.PutPropOnList[me.properties, $CDxTickProc, pr] } END; END. ÊCDVTicksImpl.mesa (part of ChipNDale) Copyright c 1984 by Xerox Corporation. All rights reserved. by Christian Jacobi, August 30, 1984 10:21:27 am PDT last edited by Christian Jacobi, September 4, 1985 2:32:15 pm PDT -- implement ticks for ChipNDale viewers -- PROC [me: MyGraphicRef, paintRef: REF PainterRec, interrestRect: CD.Rect]; -- Now v.. denotes area for ticks; vTicks denote increment; in viewer coordinates --called from client Êߘšœ,™,Jšœ Ïmœ1™Jšœ žœ˜ šžœ ž˜Jšœžœ˜(Jšœžœ ˜ Jšœ˜Jšžœ˜—Jšœ ˜ Jšžœ˜—Jšžœ˜—J˜Jšžœ žœžœ*˜FJšžœ˜—Jšœ˜—J˜—Jšžœž˜Jšžœ˜—J˜J˜š   œžœžœžœ žœ˜2Jšœ™Jšž˜Jšœ˜šžœžœž˜Jšœ%˜%JšœAžœ˜IJšœCžœ˜KJšžœžœ˜—šžœžœžœ˜Jšœžœ,˜3Jšœžœžœ ˜!Jšœ žœžœ˜Jšžœ žœ%˜4Jšžœ'˜+šœ˜Jšœžœ žœ˜G—J˜—Jšžœ˜—J˜š œž œžœžœ˜bJšž˜Jšœžœ=˜CJšžœžœžœžœ˜šžœ˜JšœžœD˜LJšœC˜CJšœ˜—Jšžœ˜—J˜Jšžœ˜J˜J˜J˜—…—ü¥