Docsv3.10.0
Back to API Reference
Class

ArcModifier

sealed

Places glyphs on concentric circular arcs while preserving each glyph's shape.

Remarks

The circle is authored one of two ways, and they mean different things. Left at Fill, Circle says nothing and the sweep decides: the radius becomes the one that makes the range span exactly Angle, the bend happens where the layout put the text, and Origin chooses the point that stays put. A label then holds its sweep and flattens as its text grows. Given a box of its own, Circle takes over: the circle inscribed in that box is the rail the text rides, and the text is laid on the near side of it. The box is placed against the text's layout box the way any RectPlacement is placed against its parent, so the rail belongs to the artwork rather than to the text — no change of font size, line metric or line count moves it, which is what a label on a fixed ring needs. Its turn carries the text round the circle, which is what a turn can mean to a shape that has no orientation of its own. Angle and Origin are then unused: nothing is bent about a point. The circle is also what the text is laid out in: its circumference is offered as the width, so wrapping, ellipsis and auto-sizing measure against the arc the circle has rather than against a box the text no longer occupies, and the text sits where its alignment puts it along that circumference — centred at the top of the circle, carried round from there by the turn. A range still wider than the circle laps and crosses itself, which auto-sizing is the cure for; a wrapped tail lands on the next concentric ring. Ranges of every arc modifier resolve into one per-cluster axis, so a glyph rides the arc of the range applied last rather than being bent once per modifier.

Nested Types

public float Angle{ get; set }

Arc sweep in degrees: zero is straight, positive arches upward, and negative downward. Unused while Circle carries a box of its own.

public ArcOrigin Origin{ get; set }

Which point of the range stays on its straight baseline while the rest turns away from it. Unused while Circle carries a box of its own.

public RectPlacement Circle{ get; set }

Box the rail is inscribed in, placed against the text's layout box; filling it leaves the circle to Angle instead. Its position offsets the rail, its smaller side gives the diameter.

public float Sweep{ get }

How far around its circle the last rebuild carried this modifier's widest ring, in degrees. Past 360 the text has lapped and crosses itself, which is the sign that the box it is laid out in is wider than the arc the circle has to give. Zero while the modifier bends nothing.

protected string AttributeKey{ get }
protected override Shape ResolveShape()
protected override bool Bends()
protected override void OnEnable()
protected override void OnDisable()
protected override void BeginPrepare()
protected override bool BeginRange()
protected override Ring AddLine()
protected override void Place()
public static void Rail()

The rail placement describes inside box: the centre of the rectangle it resolves to and the radius of the circle inscribed in that rectangle. Answered in box's own coordinates, so an editor drawing the rail and the text riding it read the same circle.

See Also