G2dStrokeCmdsImpl.mesa
Copyright Ó 1985, 1992 by Xerox Corporation. All rights reserved.
Bloomenthal, October 29, 1992 6:03 pm PST
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
Types and Constants
Context:   TYPE ~ Imager.Context;
Color:    TYPE ~ Imager.Color;
Font:    TYPE ~ Imager.Font;
ROPE:    TYPE ~ Rope.ROPE;
metersPerPoint: REAL ~ 0.0254/72.0;
Circularizing Linear Text
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]];
};
Start Code
G2dTool.Register["Circularize", CircleCommand, "
Circularize <text> <ip-out> [-option]; options include:
 -radius <real> (default = 1>
 -yScale <real> (default = 1>
 -ccw (default = cw)
 -range <real> (default = 360>
 -font <fontName> (default = helvetica-mrr>
 -size <pointSize> (default = 14>"];
END.