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, 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, 2048, 4096, 8192]; 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, 11, 12, 13]; 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™>Kšœ@™@K˜—šΟk ˜ Kšžœ ˜ —K˜šΠbl œžœž˜Kšžœ˜Kšžœ ˜—Kšž˜K˜Kšœ'˜'Kšœ#˜#K˜š Οn œž œžœ.žœžœ˜pKšœW™WKšž˜Kšœ@™@Kšœ%™%Kšœ2™2Kšœ?™?KšœL™LKšœ:™:Kšœ8™8Kšœžœ˜ Kšœ ˜ šœžœ žœžœΟc˜9K˜F—šœžœ žœžœ‘˜:K˜Y—šœžœ žœžœ‘˜4K˜G—Kšœ‘+˜>Kšœ žœ ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜šžœ*žœ˜2Kšœ ˜ Kšœ˜K˜—šžœ˜Kšœ ˜ Kšœžœ ˜"K˜—Kšžœ˜—K˜š  œžœžœ žœ˜DKšžœžœ˜KšœV™VKšœZ™ZKšž˜K˜š œžœžœžœžœžœ žœ˜fKš œžœžœžœ žœ˜8Kšžœžœžœ ˜3Kšœ˜—K˜šžœžœ˜Kšœ8˜8Kšœ8˜8Kšœ>˜>Kšœ>˜>Kšœ˜—Kšžœ˜—K˜Kšžœ˜K˜K˜—…—ζ ]