DIRECTORY Imager, ImagerBasic, ImagerColor, ImagerTransform, LFUtil, Rope, UnifiedFonts; ImagerTest: CEDAR PROGRAM IMPORTS Imager, ImagerColor, ImagerTransform, UnifiedFonts, LFUtil = BEGIN Pair: TYPE ~ Imager.Pair; Context: TYPE ~ Imager.Context; Path: TYPE ~ Imager.Path; mercuryPath: Path _ NEW[ImagerBasic.PathRep _ [ generateProc: MercuryProc, data: NIL ]]; MercuryProc: PROC [path: Path, move: PROC [Pair], line: PROC [Pair], curve: PROC [Pair, Pair, Pair]] = { Move: PROC [x, y: REAL] ~ INLINE {move[[x, y]]}; Curve: PROC [a,b,c,d,e,f: REAL] ~ INLINE {curve[[a, b], [c, d], [e, f]]}; Move[192.0, 413.353]; Curve[237.5415, 425.809, 255.3458, 401.7666, 288.0, 399.5085]; Curve[297.9937, 398.8174, 308.0844, 403.6591, 318.0, 404.5501]; Curve[331.9086, 405.7998, 448.1434, 401.3464, 450.8684, 396.0001]; Curve[453.3393, 391.1521, 435.2951, 383.4805, 431.9999, 383.0218]; Curve[428.5259, 382.538, 410.233, 382.6307, 409.5, 378.0]; Curve[409.8045, 379.9238, 421.3876, 370.5168, 402.0001, 363.6874]; Curve[386.3301, 358.1678, 345.4535, 362.3779, 345.5, 359.9999]; Curve[345.4942, 360.2959, 368.3762, 359.2238, 372.0, 358.0435]; Curve[389.1935, 352.4433, 364.4147, 343.7253, 364.875, 336.0]; Curve[365.5193, 325.1856, 382.3762, 294.0994, 390.0, 285.675]; Curve[408.286, 265.4687, 417.344, 272.0564, 438.0001, 263.8696]; Curve[454.6547, 257.2686, 417.2523, 242.3468, 408.0, 243.5193]; Curve[383.1711, 246.6655, 383.3985, 232.3274, 366.0, 219.439]; Curve[352.0869, 209.1325, 366.6143, 208.1149, 372.0, 208.9024]; Curve[374.2727, 209.2348, 386.2989, 214.7218, 380.8284, 204.0]; Curve[378.6221, 199.6753, 364.5704, 185.5353, 360.0, 184.8125]; Curve[351.8828, 183.5287, 332.7219, 196.0891, 329.1539, 192.0]; Curve[321.1773, 182.8585, 343.6019, 183.1676, 340.0227, 174.0]; Curve[335.0409, 161.2398, 311.5035, 158.2857, 310.4737, 126.0]; Curve[310.1649, 116.3195, 313.5754, 76.22575, 312.75, 72.0]; Curve[310.7936, 61.98325, 261.8854, 53.60412, 252.0, 52.62712]; Curve[238.5165, 51.29451, 155.6176, 53.91593, 152.55, 65.99998]; Curve[146.1258, 91.30679, 146.1964, 75.57425, 114.0, 83.08163]; Curve[101.5249, 85.9905, 85.49357, 98.83845, 93.0, 114.0]; Curve[96.9852, 122.0493, 101.4202, 118.0211, 96.0, 128.775]; Curve[92.91811, 134.8897, 92.05819, 140.964, 90.00001, 147.577]; Curve[85.48869, 162.0718, 88.40478, 162.2188, 86.83928, 168.0]; Curve[84.31547, 177.3202, 68.65387, 174.0181, 70.27779, 186.0]; Curve[71.84946, 197.5966, 93.93316, 251.462, 87.75, 258.0]; Curve[83.8855, 262.0863, 74.20536, 262.4716, 73.98215, 270.0]; Curve[73.80345, 276.027, 80.97349, 281.9097, 79.26, 288.0]; Curve[76.91487, 296.3353, 44.77308, 305.2533, 60.08572, 324.0]; Curve[64.14451, 328.969, 78.96831, 335.1704, 67.77274, 342.0]; Curve[60.79922, 346.254, -5.558746, 358.62, 30.00002, 372.3488]; Curve[45.19923, 378.2171, 84.23178, 361.5336, 114.0, 376.1087]; Curve[140.1327, 388.9037, 163.6664, 405.2124, 192.0, 413.3529]; }; CrossHatch: PROC [context: Context, area: ImagerBasic.IntRectangle] ~ TRUSTED { crossHatch: ARRAY [0..8) OF CARDINAL _ [ 8080h, 4040h, 2020h, 1010h, 0808h, 0404h, 0202h, 0101h ]; context.MaskBits[base: @crossHatch, area: area, tile: [0, 0, 16, 8], raster: 1]; }; dx, dy: REAL _ 438.0/2; dTheta: REAL _ 1.0; SpinMerc: PROC [context: Context, n: INT] = { buffer: Context _ Imager.CreateBuffer[$LFDisplay, [0, 0, 200, 200]]; rotation: REAL _ 0; MaskMerc: PROC ~ { buffer.SetColor[Imager.white]; buffer.MaskIntRectangle[[-400,-400,800,800]]; buffer.TranslateT[100, 100]; buffer.RotateT[rotation]; buffer.ScaleT[200.0/438, 200.0/438]; buffer.TranslateT[-dx, -dy]; buffer.SetColor[Imager.black]; buffer.MaskFill[mercuryPath]; }; FOR i: INT IN [0..n) DO buffer.DoSave[MaskMerc]; context.TransferBuffer[buffer]; rotation _ rotation + dTheta; ENDLOOP; }; SpinText: PROC [context: Context, text: Rope.ROPE, n: INT] = { buffer: Context _ Imager.CreateBuffer[$LFDisplay, [0, 0, 200, 200]]; save: Context _ Imager.CreateBuffer[$LFDisplay, [0, 0, 200, 200]]; transform: ImagerBasic.Transformation _ ImagerTransform.Scale[textSize, textSize]; font: UnifiedFonts.FONT _ UnifiedFonts.Create[fontName, transform, $Ideal]; textWidth: REAL _ font.TextWidth[text]; rotation: REAL _ 0; MaskText: PROC ~ { buffer.TransferBuffer[save]; buffer.TranslateT[100, 100]; buffer.RotateT[rotation]; buffer.TranslateT[0, -textSize/3]; buffer.SetCP[[-textWidth/2, 0]]; buffer.MaskCharacters[font, text]; }; save.TransferBuffer[context]; FOR i: INT IN [0..n) DO buffer.DoSave[MaskText]; context.TransferBuffer[buffer]; rotation _ rotation + dTheta; ENDLOOP; context.TransferBuffer[save]; }; SpinMonk: PROC [context: Context, n: INT] = { buffers: ARRAY [0..60) OF Context; color: ImagerBasic.SampledColor _ NARROW[ImagerColor.AISToColor["monk.ais"]]; FOR i: INT IN [0..n) DO FOR r: INT IN [0..60) DO IF buffers[r] = NIL THEN { buffers[r] _ Imager.CreateBuffer[$LFDisplay, [235, 535, 223, 239]]; color.m _ ImagerTransform.Concat[ImagerTransform.Concat[ImagerTransform.Translate[-346,-654],ImagerTransform.Rotate[r*6]],ImagerTransform.Translate[346,654]]; buffers[r].SetColor[color]; buffers[r].MaskIntRectangle[[235, 535, 223, 239]]; }; context.TransferBuffer[buffers[r]]; ENDLOOP; ENDLOOP; IF n > 0 THEN context.TransferBuffer[buffers[0]]; }; RotMerc1: PROC [context: Context] = { gray: Imager.Color _ ImagerColor.MakeGray[0.5]; {action: PROC = { context.TranslateT[4.25*72, 5.5*72]; context.ScaleT[0.333, 0.333]; context.MaskFill[mercuryPath]; FOR i:NAT IN [0..9) DO context.SetColor[gray]; context.RotateT[-10]; context.MaskFill[mercuryPath]; context.SetColor[Imager.black]; context.RotateT[-10]; context.MaskFill[mercuryPath]; ENDLOOP; }; context.DoSave[action]}; }; RotMerc: PROC [context: Context] = { gray: Imager.Color _ ImagerColor.MakeGray[0.5]; context.TranslateT[4.25*72, 5.5*72]; context.ScaleT[0.333, 0.333]; {action: PROC = { context.SetColor[Imager.black]; context.MaskFill[mercuryPath]; FOR i: NAT _ 0, i+2 WHILE i<9 DO context.SetColor[gray]; context.RotateT[-20]; context.MaskFill[mercuryPath]; context.SetColor[Imager.black]; context.RotateT[-20]; context.MaskFill[mercuryPath]; ENDLOOP; }; context.DoSave[action]}; {action: PROC = { FOR i: NAT IN [0..2) DO context.ClipPath[mercuryPath, TRUE]; context.RotateT[-20]; ENDLOOP; context.RotateT[-160]; FOR i: NAT _ 10, i+2 WHILE i<18 DO context.SetColor[gray]; context.RotateT[-20]; context.MaskFill[mercuryPath]; context.SetColor[Imager.black]; context.RotateT[-20]; context.MaskFill[mercuryPath]; ENDLOOP; }; context.DoSave[action]}; }; textSize: REAL _ 12.0; Times: PROC [size: REAL] RETURNS [UnifiedFonts.FONT] ~ { transform: ImagerBasic.Transformation _ ImagerTransform.Scale[size, size]; RETURN [UnifiedFonts.Create["Xerox/PressFonts/TimesRoman/MRR", transform, $Ideal]] }; fontName: Rope.ROPE _ "Xerox/PressFonts/TimesRoman/MRR"; MaskTxt: PROC[context: Context, ropes: LIST OF REF] = { transform: ImagerBasic.Transformation _ ImagerTransform.Scale[textSize, textSize]; row: INT _ 0; font: UnifiedFonts.FONT _ UnifiedFonts.Create[fontName, transform, $Ideal]; {action: PROC = { context.TranslateT[72, 720]; FOR list: LIST OF REF _ ropes, list.rest UNTIL list=NIL DO row _ row + 1; context.SetCP[[0, -row * textSize]]; context.MaskCharacters[font, list.first]; ENDLOOP; }; context.DoSave[action]}; }; MaskText: PROC[context: Context, ropes: LIST OF REF] = { transform: ImagerBasic.Transformation _ ImagerTransform.Scale[textSize, textSize]; curfont: UnifiedFonts.FONT _ UnifiedFonts.Create["Xerox/PressFonts/TimesRoman/MRR", transform, $Ideal]; altfont: UnifiedFonts.FONT _ UnifiedFonts.Create["Xerox/PressFonts/Helvetica/MRR", transform, $Ideal]; row: INT _ 0; {action: PROC = { context.TranslateT[72, 720]; FOR list: LIST OF REF _ ropes, list.rest UNTIL list=NIL DO tempfont: UnifiedFonts.FONT ~ curfont; row _ row + 1; context.SetCP[[0, -row * textSize]]; context.MaskCharacters[tempfont, list.first]; curfont _ altfont; altfont _ tempfont; ENDLOOP; }; context.DoSave[action]}; }; Text: PROC RETURNS [ropes: LIST OF REF] = { new: LIST OF REF _ NIL; txt: LIST OF Rope.ROPE _ text; WHILE txt # NIL DO new _ CONS[txt.first, new]; txt _ txt.rest ENDLOOP; WHILE new # NIL DO tt: LIST OF REF _ new; new _ new.rest; tt.rest _ ropes; ropes _ tt ENDLOOP; }; text: LIST OF Rope.ROPE _ LIST["In olden times when wishing still", "helped one, there lived a king", "whose daughters were all", "beautiful, but the youngest was", "so beautiful that the sun itself,", "which has seen so much, was", "astonished whenever it shone in", "her face. Close by the king's", "castle lay a great dark forest,", "and under an old lime-tree in", "the forest was a well, and when", "the day was very warm, the", "king's child went out into the", "forest and sat down by the side", "of the cool fountain, and when", "she was bored she took a golden", "ball, and threw it up on high", "and caught it, and this ball was", "her favorite plaything."]; Msr: PROC [context: Context] RETURNS [worked: BOOLEAN] = { sMin, fMin, sSize, fSize, sMinDest, fMinDest: INTEGER; [sMin, fMin, sSize, fSize] _ LFUtil.GetArea[]; [sMin: sMinDest, fMin: fMinDest] _ LFUtil.GetArea[]; worked _ Imager.MoveSurfaceRectangle[context, [fMin, 808-sMin-sSize, fSize, sSize], [fMinDest, 808-sMinDest-sSize]]; }; END. >ImagerTest.mesa Michael Plass, August 3, 1983 10:07 am Êœ˜Jšœ™J™&šÏk ˜ J˜J˜ J˜ J˜J˜J˜J˜ —šœ œ˜Jšœ;˜B—Jšœ˜Jšœœ˜Jšœ œ˜Jšœœ˜šœœ˜/Jšœ˜Jšœ˜ Jšœ˜—š œ œœœœ˜hJšÏnœœœœ˜0Jšžœœœœ!˜IJšœ˜Jšœ>˜>Jšœ?˜?JšœB˜BJšœB˜BJšœ:˜:JšœB˜BJšœ?˜?Jšœ?˜?Jšœ>˜>Jšœ>˜>Jšœ@˜@Jšœ?˜?Jšœ>˜>Jšœ?˜?Jšœ?˜?Jšœ?˜?Jšœ?˜?Jšœ?˜?Jšœ?˜?Jšœ<˜˜>Jšœ;˜;Jšœ?˜?Jšœ>˜>Jšœ@˜@Jšœ?˜?Jšœ?˜?Jšœ˜—šž œœ6œ˜Ošœ œœœ˜(J˜J˜J˜J˜J˜J˜J˜J˜Jšœ˜—JšœP˜PJšœ˜—Jšœœ ˜Jšœœ˜šžœœœ˜-JšœD˜DJšœ œ˜šœ œ˜Jšœ˜Jšœ-˜-Jšœ˜Jšœ˜Jšœ$˜$Jšœ˜Jšœ˜Jšœ˜Jšœ˜—šœœœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšœ˜—šžœœœœ˜>JšœD˜DJšœB˜BJšœR˜RJšœœ4˜KJšœ œ˜'Jšœ œ˜šœ œ˜Jšœ˜Jšœ˜Jšœ˜Jšœ"˜"Jšœ ˜ Jšœ"˜"Jšœ˜—Jšœ˜šœœœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšœ˜Jšœ˜—šžœœœ˜-Jšœ œ œ ˜"Jšœ"œ%˜Mšœœœ˜Jšœœœ ˜šœœœ˜JšœC˜CJšœž˜žJšœ˜Jšœ2˜2Jšœ˜Jšœ#˜#Jšœ˜—Jšœ˜—Jšœœ$˜1Jšœ˜—šžœœ˜%J˜/šœ œ˜J˜$J˜Jšœ˜šœœœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jš˜—Jšœ˜—Jšœ˜—šžœœ˜$J˜/J˜$J˜šœ œ˜Jšœ˜Jšœ˜šœœ œ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšœ˜—šœ œ˜šœœœ˜Jšœœ˜$Jšœ˜Jš˜—Jšœ˜šœœ œ˜"Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jš˜—Jšœ˜—Jšœ˜—Jšœ œ˜š žœœœœœ˜8JšœJ˜JJšœ3œ˜RJšœ˜—Jšœœ%˜8š žœœœœœ˜7JšœR˜RJšœœ˜ Jšœœ4˜Kšœ œ˜Jšœ˜š œœœœœœ˜:Jšœ˜Jšœ$˜$Jšœ)˜)Jš˜—Jšœ˜—Jšœ˜—š žœœœœœ˜8JšœR˜RJšœœ4œ˜gJšœœ3œ˜fJšœœ˜ šœ œ˜Jšœ˜š œœœœœœ˜:Jšœœ ˜&Jšœ˜Jšœ$˜$Jšœ-˜-Jšœ&˜&Jš˜—Jšœ˜—Jšœ˜—š žœœœ œœœ˜+Jš œœœœœ˜Jšœœœœ˜Jš œœœœ!œ˜FJšœœœœœœ4œ˜^Jšœ˜—Jš œœœœœÿ˜šžœœœ œ˜:Jšœ.œ˜6Jšœ.˜.Jšœ4˜4Jšœt˜tJšœ˜—Jšœ˜J˜—…—#ò,Ì