This commit is contained in:
treeform 2022-03-21 19:56:42 -07:00
parent 897ca0bc7c
commit 0dda63d66d
2 changed files with 11 additions and 20 deletions

View file

@ -500,30 +500,27 @@ proc parseSvgFont*(buf: string): Typeface {.raises: [PixieError].} =
result = Typeface() result = Typeface()
result.svgFont = svgfont.parseSvgFont(buf) result.svgFont = svgfont.parseSvgFont(buf)
proc computePaths( proc computePaths(arrangement: Arrangement): seq[Path] =
arrangement: Arrangement
): seq[Path] =
## Takes an Arrangement and computes Paths for drawing. ## Takes an Arrangement and computes Paths for drawing.
## Returns a seq of paths that match the seq of Spans in the arrangement. ## Returns a seq of paths that match the seq of Spans in the arrangement.
## If you only have one Span you will only get one Path. ## If you only have one Span you will only get one Path.
var line: int var line: int
for spanIndex, (start, stop) in arrangement.spans: for spanIndex, (start, stop) in arrangement.spans:
var spanPath = Path()
let let
spanPath = newPath()
font = arrangement.fonts[spanIndex] font = arrangement.fonts[spanIndex]
underlineThickness = font.typeface.underlineThickness * font.scale underlineThickness = font.typeface.underlineThickness * font.scale
underlinePosition = font.typeface.underlinePosition * font.scale underlinePosition = font.typeface.underlinePosition * font.scale
strikeoutThickness = font.typeface.strikeoutThickness * font.scale strikeoutThickness = font.typeface.strikeoutThickness * font.scale
strikeoutPosition = font.typeface.strikeoutPosition * font.scale strikeoutPosition = font.typeface.strikeoutPosition * font.scale
for runeIndex in start .. stop: for runeIndex in start .. stop:
let position = arrangement.positions[runeIndex] let
position = arrangement.positions[runeIndex]
let path = font.typeface.getGlyphPath(arrangement.runes[runeIndex]) path = font.typeface.getGlyphPath(arrangement.runes[runeIndex])
path.transform( path.transform(
translate(position) * translate(position) *
scale(vec2(font.scale)) scale(vec2(font.scale))
) )
var applyDecoration = true var applyDecoration = true
if runeIndex == arrangement.lines[line][1]: if runeIndex == arrangement.lines[line][1]:
inc line inc line
@ -564,7 +561,7 @@ proc textUber(
stroke: static[bool] = false stroke: static[bool] = false
) = ) =
let spanPaths = arrangement.computePaths() let spanPaths = arrangement.computePaths()
for spanIndex, (start, stop) in arrangement.spans: for spanIndex in 0 ..< arrangement.spans.len:
let path = spanPaths[spanIndex] let path = spanPaths[spanIndex]
when stroke: when stroke:
when type(target) is Image: when type(target) is Image:
@ -594,7 +591,6 @@ proc textUber(
when type(target) is Image: when type(target) is Image:
let font = arrangement.fonts[spanIndex] let font = arrangement.fonts[spanIndex]
for paint in font.paints: for paint in font.paints:
#echo transform
target.fillPath(path, paint, transform) target.fillPath(path, paint, transform)
else: # target is Mask else: # target is Mask
target.fillPath(path, transform) target.fillPath(path, transform)
@ -603,7 +599,7 @@ proc computeBounds*(
arrangement: Arrangement, arrangement: Arrangement,
transform = mat3() transform = mat3()
): Rect = ): Rect =
var fullPath = newPath() let fullPath = newPath()
for path in arrangement.computePaths(): for path in arrangement.computePaths():
fullPath.addPath(path) fullPath.addPath(path)
fullPath.transform(transform) fullPath.transform(transform)

View file

@ -1015,15 +1015,10 @@ block:
ctx.fillStyle = "#FFD6D6" ctx.fillStyle = "#FFD6D6"
ctx.fillRect(rect(40, 170, 320, 60)) ctx.fillRect(rect(40, 170, 320, 60))
let arrangement = typeset(spans, bounds = vec2(320, 60)) let
arrangement = typeset(spans, bounds = vec2(320, 60))
echo arrangement.layoutBounds() snappedBounds = arrangement.computeBounds().snapToPixels()
echo arrangement.computeBounds() textImage = newImage(snappedBounds.w.int, snappedBounds.h.int)
echo arrangement.computeBounds().snapToPixels()
let snappedBounds = arrangement.computeBounds().snapToPixels()
let textImage = newImage(snappedBounds.w.int, snappedBounds.h.int)
textImage.fillText(arrangement, translate(-snappedBounds.xy)) textImage.fillText(arrangement, translate(-snappedBounds.xy))
image.draw(textImage, translate(snappedBounds.xy + vec2(40, 170))) image.draw(textImage, translate(snappedBounds.xy + vec2(40, 170)))