DIRECTORY CD, CDVScale; CDVScaleImpl: CEDAR PROGRAM IMPORTS CDVScale EXPORTS CDVScale = BEGIN ScaleRange: TYPE = CDVScale.ScaleRange; ScaleRec: TYPE = CDVScale.ScaleRec; MakeScale: PUBLIC PROC [off: CD.Position_[0, 0], nscale: ScaleRange_4, grid: INTEGER_-1] RETURNS [s: ScaleRec] = BEGIN sE: INTEGER; noDivisionScale: ScaleRange = 8; scaleE: ARRAY ScaleRange OF INTEGER = --scale for factors [24, 16, 12, 8, 6, 4, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; scaleF: ARRAY ScaleRange OF INTEGER = --scale for divisors [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]; scaleS: ARRAY ScaleRange OF NAT = --scale for shifts [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; s.nscale _ nscale; --MIN[MAX[nscale, 0], CDVScale.scaleNum-1]; s.grid _ MAX[1, grid]; sE _ scaleE[s.nscale]; s.sA _ scaleF[s.nscale]; s.sB _ (s.grid/2)*sE+sE/2; s.sC _ sE*s.grid; s.sD _ s.grid; s.sS _ scaleS[s.nscale]; s.off.x _ off.x/s.grid*s.grid; s.off.y _ off.y/s.grid*s.grid; IF s.useMultiply _ s.nscale™>JšœA™A—J˜šÏk ˜ Jšžœ ˜ —J˜šÏb œžœž˜Jšžœ˜Jšžœ ˜—Jšž˜J˜Jšœ'˜'Jšœ#˜#J˜š Ïn œž œžœ.žœžœ˜pJšœW™WJšž˜Jšœ@™@Jšœ%™%Jšœ2™2Jšœ?™?JšœL™LJšœ:™:Jšœ8™8Jšœžœ˜ Jšœ ˜ šœžœ žœžœÏc˜9J˜=—šœžœ žœžœ¡˜:J˜G—šœžœ žœžœ¡˜4J˜;—Jšœ¡+˜>Jšœ žœ ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜šžœ*žœ˜2Jšœ ˜ Jšœ˜J˜—šžœ˜Jšœ ˜ Jšœžœ ˜"J˜—Jšžœ˜—J˜š  œžœžœ žœ˜DJšžœžœ˜JšœV™VJšœZ™ZJšž˜J˜š œžœžœžœžœžœ žœ˜fJš œžœžœžœ žœ˜8Jšžœžœžœ ˜3Jšœ˜—J˜šžœžœ˜Jšœ8˜8Jšœ8˜8Jšœ>˜>Jšœ>˜>Jšœ˜—Jšžœ˜—J˜Jšžœ˜J˜J˜—…—¾ /