* codestyle hotfix
* GlyphPathExtractor Core Text Line and Run used to exctract CGPath
* README.MD updated
* Extract glyph path pipeline into GlyphPathProvider
Moves cached extraction + layout resolution out of GlyphView into a shared
internal helper so an upcoming GlyphShape can reuse it. No behavior change.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Add GlyphShape: glyph outline as a SwiftUI Shape
GlyphShape reuses GlyphPathProvider and offsets the cached path by the
rect's origin. Previews mirror GlyphView's. GlyphPathCache docs updated
for the shared pipeline.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Add GlyphShape tests
Covers tight/fontMetrics bounds, non-zero rect origin, parity with
GlyphPathProvider, and empty path for outline-less characters.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Add GlyphShape previews showcasing Shape capabilities
Strokes, gradient fills, content clipping, and trim animation.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Document GlyphShape in README and CLAUDE.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Deprecate GlyphView in favor of GlyphShape
GlyphView stays functional but is marked deprecated, pointing to
GlyphShape(...).fill(color). Its previews are removed (GlyphShape has
equivalents). README examples, DocC landing page, and CLAUDE.md now
use GlyphShape, with a short migration note in the README.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Conform GlyphShape to InsettableShape
inset(by:) shrinks the layout rect the glyph is fitted into, enabling
strokeBorder. path(in:) returns an empty path when the inset rect has
no area.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Add GlyphShape inset(by:) tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Document and preview GlyphShape strokeBorder
Adds a stroke vs strokeBorder preview, a README example, and a CLAUDE.md
note on InsettableShape. Documents that miter joins on sharp glyph
corners can extend past the frame; examples use round joins.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Cache resolved CTFont in a font tier of GlyphPathCache
Font construction was ~96% of a render-tier miss. GlyphPathProvider now
reads the CTFont through GlyphPathCache.ctFont(for:), which caches
successfully resolved fonts only.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Add GlyphPathCache font tier tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Document GlyphPathCache font tier in CLAUDE.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Add render tier micro-benchmark
Measures steady-state lookups for identical cells and a per-step
breakdown of a render-tier miss. Prints ns/call; run in Release.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Resolve GlyphKitFont with Core Text instead of UIKit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Add GlyphKitFont custom font and bold trait tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Use cross-platform colors in GlyphShape previews
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Run tests on macOS in CI and document macOS support
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>