Resolve a text draw's glyph origin once
This commit is contained in:
1 parent
7601aa2a5d
commit
a7307d95fd
2 files changed
+93
-5
No files matched your search
+24
-5
@@ -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),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user