Skip to content

Commit e3f27a2

Browse files
committed
refactor: simplify text diagnostics flow
1 parent f441514 commit e3f27a2

3 files changed

Lines changed: 9 additions & 32 deletions

File tree

quickthumb/_diagnostics.py

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
visible_leaf_layers,
2626
)
2727
from quickthumb._effects import EffectsEngine
28-
from quickthumb._fonts import FontEngine
2928
from quickthumb._groups import GroupEngine
3029
from quickthumb._images import ImageEngine
3130
from quickthumb._measurements import LayerMeasurement, measure_layers
@@ -59,7 +58,6 @@ def __init__(
5958
ctx: RenderContext,
6059
canvas: "Canvas",
6160
effects: EffectsEngine,
62-
fonts: FontEngine,
6361
images: ImageEngine,
6462
shapes: ShapeEngine,
6563
text: TextEngine,
@@ -68,7 +66,6 @@ def __init__(
6866
self._ctx = ctx
6967
self._canvas = canvas
7068
self._effects = effects
71-
self._fonts = fonts
7269
self._images = images
7370
self._shapes = shapes
7471
self._text = text
@@ -421,23 +418,8 @@ def _find_overflowing_word(self, layer: TextLayer) -> tuple[str, int, int] | Non
421418

422419
max_width_px = parse_coordinate(layer.max_width, self._ctx.width)
423420

424-
if isinstance(layer.content, str):
425-
font = self._fonts.load_font(layer)
426-
return self._first_word_wider_than(
427-
layer.content, font, layer.letter_spacing or 0, max_width_px
428-
)
429-
430-
for part in layer.content:
431-
font = self._fonts.load_font_variant(
432-
part.font or layer.font,
433-
self._text.resolve_size(part, layer),
434-
self._text.resolve_bold(part, layer),
435-
self._text.resolve_italic(part, layer),
436-
self._text.resolve_weight(part, layer),
437-
)
438-
word = self._first_word_wider_than(
439-
part.text, font, self._text.resolve_letter_spacing(part, layer), max_width_px
440-
)
421+
for text, font, letter_spacing in self._text.iter_text_runs(layer):
422+
word = self._first_word_wider_than(text, font, letter_spacing, max_width_px)
441423
if word is not None:
442424
return word
443425
return None
@@ -506,7 +488,7 @@ def _canvas_overflow(self, box) -> dict[str, int]:
506488
def _find_missing_glyphs(self, layer: TextLayer) -> list[str]:
507489
missing: list[str] = []
508490
seen: set[str] = set()
509-
for text, font in self._text.iter_font_runs(layer):
491+
for text, font, _letter_spacing in self._text.iter_text_runs(layer):
510492
missing_signatures = self._missing_glyph_signatures(font)
511493
for char in text:
512494
if (
@@ -517,7 +499,8 @@ def _find_missing_glyphs(self, layer: TextLayer) -> list[str]:
517499
):
518500
continue
519501
seen.add(char)
520-
if self._renders_as_missing_glyph(font, char, missing_signatures):
502+
signature = self._glyph_signature(font, char)
503+
if signature is not None and signature in missing_signatures:
521504
missing.append(char)
522505
return missing
523506

@@ -528,12 +511,6 @@ def _missing_glyph_signatures(self, font) -> set:
528511
if (signature := self._glyph_signature(font, probe)) is not None
529512
}
530513

531-
def _renders_as_missing_glyph(self, font, char: str, missing_signatures: set) -> bool:
532-
signature = self._glyph_signature(font, char)
533-
if signature is None:
534-
return False
535-
return signature in missing_signatures
536-
537514
def _glyph_signature(self, font, char: str):
538515
try:
539516
mask = font.getmask(char)

quickthumb/_text.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,10 @@ def measure_text_layout(self, layer: TextLayer) -> TextLayoutMetadata:
173173
return self._measure_rich_text_layout(layer)
174174
return self._measure_simple_text_layout(layer)
175175

176-
def iter_font_runs(self, layer: TextLayer) -> Iterable[tuple[str, FontType]]:
177-
"""Yield text with the font variant that renders it."""
176+
def iter_text_runs(self, layer: TextLayer) -> Iterable[tuple[str, FontType, int]]:
177+
"""Yield text with the font variant and spacing that render it."""
178178
if isinstance(layer.content, str):
179-
yield layer.content, self._fonts.load_font(layer)
179+
yield layer.content, self._fonts.load_font(layer), layer.letter_spacing or 0
180180
return
181181

182182
for part in layer.content:
@@ -189,6 +189,7 @@ def iter_font_runs(self, layer: TextLayer) -> Iterable[tuple[str, FontType]]:
189189
self.resolve_italic(part, layer),
190190
self.resolve_weight(part, layer),
191191
),
192+
self.resolve_letter_spacing(part, layer),
192193
)
193194

194195
def _measure_simple_text_layout(self, layer: TextLayer) -> TextLayoutMetadata:

quickthumb/canvas.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,6 @@ def __init__(
161161
self._ctx,
162162
self,
163163
self._effects,
164-
self._fonts,
165164
self._images,
166165
self._shapes,
167166
self._text,

0 commit comments

Comments
 (0)