Resolve a text draw's glyph origin once

This commit is contained in:
iris-ai committed 2026-09-17 16:17:47 -04:00
1 parent 7601aa2a5d
commit a7307d95fd
2 files changed
+93 -5

No files matched your search

+24 -5
View File
@@ -80,6 +80,21 @@ impl<'a> Painter<'a> {
/// Takes the kind, for a caller writing many of one primitive.
fn write<P: Primitive>(&mut self, kind: PrimitiveKind<P>, primitive: P, region: DrawRegion) {
self.write_resolved(
kind,
primitive,
region,
region.resolve(self.region, self.placement),
);
}
fn write_resolved<P: Primitive>(
&mut self,
kind: PrimitiveKind<P>,
primitive: P,
region: DrawRegion,
resolved: UiRegion,
) {
#[cfg(feature = "layout-diagnostics")]
diag::bump(Counter::PrimitiveWrites);
let h = self.state.layers.write(
@@ -88,7 +103,7 @@ impl<'a> Painter<'a> {
kind,
id: self.id,
primitive,
region: region.resolve(self.region, self.placement),
region: resolved,
mask_idx: self.mask,
move_idx: self.move_idx,
},
@@ -404,9 +419,12 @@ impl<'a> Painter<'a> {
// TODO: merge the text methods into the primitive ones.
pub fn glyphs(&mut self, text: &RenderedText, origin: impl Into<DrawRegion>) {
let origin = origin.into();
// Glyph offsets and sizes are pixels, which compose additively.
// Only the shared origin needs the frame/extent composition.
let resolved = origin.resolve(self.region, self.placement);
let kind = self.rsc.ui_mut().primitives.kind::<GlyphPrimitive>();
for glyph in text.glyphs.iter() {
let region = origin.map(|mut region| {
let place = |mut region: UiRegion| {
region.x.end = region.x.start;
region.y.end = region.y.start;
let mut region = region.offset(UiVec2::from_px(glyph.offset));
@@ -417,8 +435,8 @@ impl<'a> Painter<'a> {
region.x.end = region.x.start.offset(size.x);
region.y.end = region.y.start.offset(size.y);
region
});
self.write(
};
self.write_resolved(
kind,
GlyphPrimitive {
uv_min: glyph.entry.uv_min,
@@ -427,7 +445,8 @@ impl<'a> Painter<'a> {
color: text.color,
flags: glyph.entry.flags(),
},
region,
origin.map(place),
place(resolved),
);
}
}