DIRECTORY Args, Commander, G2dOutline, G2dTool, Imager, ImagerBox, ImagerColor, ImagerFont, ImagerInterpress, IO, RealFns, Rope; G2dStrokeCmdsImpl: CEDAR PROGRAM -- some text processing commands IMPORTS Args, G2dOutline, G2dTool, Imager, ImagerBox, ImagerColor, ImagerFont, ImagerInterpress, IO, RealFns, Rope ~ BEGIN Context: TYPE ~ Imager.Context; Color: TYPE ~ Imager.Color; Font: TYPE ~ Imager.Font; ROPE: TYPE ~ Rope.ROPE; metersPerPoint: REAL ~ 0.0254/72.0; CircleData: TYPE ~ RECORD [radius, xScale, yScale: REAL ¬ 1, ccw: BOOL ¬ TRUE]; CircleCommand: Commander.CommandProc ~ { textA, ipOutA, radiusA, yScaleA, fontA, sizeA, ccwA, rangeA: Args.Arg; [textA, ipOutA, radiusA, yScaleA, fontA, sizeA, rangeA, ccwA] ¬ Args.ArgsGet[cmd, "%ss-radius%r-yScale%r-font%s-size%r-range%r-ccw%b" ! Args.Error => {msg ¬ reason; GOTO Bad}]; { size: REAL ¬ IF sizeA.ok THEN sizeA.real ELSE 14.0; color: Color ¬ ImagerColor.ColorFromGray[1.0]; fName: ROPE ¬ IF fontA.ok THEN fontA.rope ELSE "helvetica-mrr"; font: Font ¬ Imager.FindFontScaled[Rope.Concat["xerox/pressfonts/", fName], size]; radius: REAL ¬ IF radiusA.ok THEN radiusA.real ELSE 1.0; yScale: REAL ¬ IF yScaleA.ok THEN yScaleA.real ELSE 1.0; range: REAL ¬ IF rangeA.ok THEN rangeA.real ELSE 360.0; Circularize[textA.rope, ipOutA.rope, font, color, radius, yScale, range, ccwA.ok ! Imager.Warning => {msg ¬ IO.PutFR1["no font: %g", IO.rope[fName]]; GOTO Bad}]; }; EXITS Bad => RETURN[$Failure, msg]; }; Circularize: PROC [ text, out: ROPE, font: Font, color: Color, radius, yScale, range: REAL, ccw: BOOL] ~ { IPAction: PROC [context: Context] ~ { Imager.ScaleT[context, metersPerPoint]; Imager.TranslateT[context, [0.0, 0.5*11.0*Imager.pointsPerInch]]; G2dOutline.TransformRope[text, CircleTransform, context, 0, 0, font, color, 0.05, d]; }; b: Imager.Box ¬ ImagerBox.BoxFromExtents[ImagerFont.RopeBoundingBox[font, text]]; ref: ImagerInterpress.Ref ¬ ImagerInterpress.Create[out]; d: REF CircleData ¬ NEW[CircleData ¬ [radius, (2.0*3.1415926535)*(range/360.0)/(b.xmax-b.xmin), yScale, ccw]]; ImagerInterpress.DoPage[ref, IPAction]; ImagerInterpress.Close[ref]; }; CircleTransform: G2dOutline.TransformProc ~ { data: REF CircleData ¬ NARROW[clientData]; a: REAL ¬ data.xScale*v.x; r: REAL ¬ data.radius+data.yScale*(IF data.ccw THEN -v.y ELSE v.y); IF data.ccw THEN a ¬ 3.1415926535-a; xv ¬ [r*RealFns.Sin[a], r*RealFns.Cos[a]]; }; G2dTool.Register["Circularize", CircleCommand, " Circularize [-option]; options include: -radius (default = 1> -yScale (default = 1> -ccw (default = cw) -range (default = 360> -font (default = helvetica-mrr> -size (default = 14>"]; END. Δ G2dStrokeCmdsImpl.mesa Copyright Σ 1985, 1992 by Xerox Corporation. All rights reserved. Bloomenthal, October 29, 1992 6:03 pm PST Types and Constants Circularizing Linear Text Start Code ΚΫ•NewlineDelimiter –"cedarcode" style™šœ™Jšœ Οeœ6™BJ™)J˜JšΟk œžœe˜€J˜—šΟnœžœžœΟc ˜AJšžœk˜rJ˜—Jšœž˜headšΟl™Jšœ žœ˜!Jšœžœ˜Jšœžœ˜Jšžœžœžœ˜Jšœžœ˜#—š‘™šœ Οsž’œ’ž’œ’œ’žœ’œ’žœžœ˜OJ˜—šŸ œ˜(J˜F˜?šœE˜EJšœžœ˜*——Jšœ˜Jš œžœžœ žœ žœ˜3J˜.Jš œžœžœ žœ žœ˜?J˜RJš œžœžœ žœžœ˜8Jš œžœžœ žœžœ˜8Jš œžœžœ žœ žœ˜7šœP˜PJšœžœžœžœ˜P—J˜Jšžœžœ˜#J˜J˜—šŸ œžœ˜Jšœ žœ3žœžœ˜RJšœ˜šŸœžœ˜%Jšœ'˜'JšœA˜AJšœU˜UJ˜—J˜QJ˜9šœžœžœ ˜$JšœI˜I—Jšœ'˜'J˜J˜J˜—šŸœ˜-Jšœžœžœ ˜*Jšœžœ˜Jš œžœžœ žœžœ˜CJšžœ žœ˜$J˜*J˜——š‘ ™ J˜©—J˜Jšžœ˜J˜J˜—…— ”3