Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
983e15cd9a | ||
|
|
338f10f070 | ||
|
|
234abb8052 | ||
|
|
80b28fff1a | ||
|
|
2026e5d088 | ||
|
|
15a156595b |
No files matched your search
Generated
+1
@@ -1189,6 +1189,7 @@ dependencies = [
|
||||
"bytemuck",
|
||||
"fxhash",
|
||||
"image",
|
||||
"log",
|
||||
"parley",
|
||||
"swash",
|
||||
"wgpu",
|
||||
|
||||
@@ -35,6 +35,7 @@ image = "0.25.6"
|
||||
parley = "0.11.1"
|
||||
swash = "0.2.10"
|
||||
fxhash = "0.2.1"
|
||||
log = "0.4.29"
|
||||
arboard = "3.6.1"
|
||||
iris-core = { path = "core" }
|
||||
iris-macro = { path = "macro" }
|
||||
|
||||
@@ -1,19 +1,6 @@
|
||||
images
|
||||
settings (sampler)
|
||||
|
||||
text
|
||||
figure out ways to speed up / what costs the most
|
||||
resizing (per frame) is really slow (assuming painter isn't griefing)
|
||||
j is weird / fix x offset
|
||||
|
||||
masks r just made to bare minimum work
|
||||
|
||||
scaling
|
||||
could be just a simple scaling factor that multiplies abs
|
||||
and need to ensure text uses raw abs and not scaled abs
|
||||
naming? (pt, px)
|
||||
want to keep (drawn) regions using px? or should I add another field to UiScalar/Vec
|
||||
field could be best solution so redrawing stuff isn't needed & you can specify both as user
|
||||
consider typed TextureHandle<T> variants for distinct texture uses
|
||||
|
||||
WidgetRef<W> or smth instead of Id
|
||||
enum that's either an Id or an actual concrete instance of W
|
||||
@@ -24,17 +11,6 @@ WidgetRef<W> or smth instead of Id
|
||||
maybe introduce InnerWidget trait to allow for editors to expose & modify inner type
|
||||
maybe could also store a parent widget and keep using InnerWidget trait? unsure if possible
|
||||
|
||||
really weird limitation:
|
||||
I don't think you can currently remove an element from a parent and put it in a child of the same parent
|
||||
because it removes the unused children after the entire parent redraw
|
||||
but the child gets drawn during that, so it will think the child is still active !!!
|
||||
or something like that idk, maybe I need a special enum for parent that includes a undecided state where it may or may not get redrawn by the parent
|
||||
or just do ref counting and ensure all drawn things == 1 afterwards (seems like best way)
|
||||
ok so I'm removing the limit for now
|
||||
|
||||
don't forget I'm streaming
|
||||
|
||||
tags
|
||||
vecs for each widget type?
|
||||
|
||||
POTENTIAL BUG: closures that store IDs will not decrement the id!!! need to not increment id if moved into closure somehow??? wait no, need to decrement ID every time an event fn is added...... only if the id is used in it..??
|
||||
@@ -10,3 +10,4 @@ image = { workspace = true }
|
||||
parley = { workspace = true }
|
||||
swash = { workspace = true }
|
||||
fxhash = { workspace = true }
|
||||
log = { workspace = true }
|
||||
@@ -185,7 +185,7 @@ impl TextData {
|
||||
subpixel,
|
||||
coords: coords_hash,
|
||||
};
|
||||
let entry = self.glyph_entry(
|
||||
let Some(entry) = self.glyph_entry(
|
||||
GlyphRaster {
|
||||
key,
|
||||
font: font_ref,
|
||||
@@ -195,8 +195,9 @@ impl TextData {
|
||||
glyph_id: glyph.id,
|
||||
},
|
||||
textures,
|
||||
);
|
||||
let Some(entry) = entry else { continue };
|
||||
) else {
|
||||
continue;
|
||||
};
|
||||
placed.push(PlacedGlyph {
|
||||
entry,
|
||||
offset: Vec2::new(
|
||||
@@ -265,9 +266,8 @@ fn glyph_size_key(font_size: f32) -> u32 {
|
||||
(font_size * GLYPH_SIZE_STEPS_PER_PIXEL).round() as u32
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct RenderedText {
|
||||
pub glyphs: std::sync::Arc<Vec<PlacedGlyph>>,
|
||||
pub glyphs: Vec<PlacedGlyph>,
|
||||
pub size: Vec2,
|
||||
pub color: UiColor,
|
||||
}
|
||||
@@ -283,7 +283,7 @@ impl TextData {
|
||||
buffer.shape(self, attrs, width);
|
||||
let glyphs = self.place(buffer, textures);
|
||||
RenderedText {
|
||||
glyphs: std::sync::Arc::new(glyphs),
|
||||
glyphs,
|
||||
size: buffer.size(),
|
||||
color: attrs.color,
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
use crate::{
|
||||
GlyphPrimitive, PatchRect, TextureHandle, Textures,
|
||||
PatchRect, TextureHandle, Textures,
|
||||
util::{HashMap, Vec2},
|
||||
};
|
||||
use image::RgbaImage;
|
||||
@@ -40,12 +40,10 @@ pub struct GlyphEntry {
|
||||
}
|
||||
|
||||
impl GlyphEntry {
|
||||
const IS_COLORED: u32 = 1;
|
||||
|
||||
pub(crate) fn flags(&self) -> u32 {
|
||||
if self.is_colored {
|
||||
GlyphPrimitive::IS_COLORED
|
||||
} else {
|
||||
0
|
||||
}
|
||||
if self.is_colored { Self::IS_COLORED } else { 0 }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,10 +76,20 @@ impl GlyphAtlas {
|
||||
let w = image.placement.width;
|
||||
let h = image.placement.height;
|
||||
if w == 0 || h == 0 {
|
||||
log::warn!(
|
||||
"glyph {} in font {} rasterized at {w}x{h}; skipping it",
|
||||
key.glyph,
|
||||
key.font,
|
||||
);
|
||||
self.entries.insert(key, None);
|
||||
return None;
|
||||
}
|
||||
if w + PAD * 2 > PAGE || h + PAD * 2 > PAGE {
|
||||
if w > PAGE - PAD * 2 || h > PAGE - PAD * 2 {
|
||||
log::warn!(
|
||||
"glyph {} in font {} rasterized at {w}x{h}, too large for the {PAGE}x{PAGE} atlas; skipping it",
|
||||
key.glyph,
|
||||
key.font,
|
||||
);
|
||||
self.entries.insert(key, None);
|
||||
return None;
|
||||
}
|
||||
|
||||
@@ -243,10 +243,6 @@ pub struct GlyphPrimitive {
|
||||
pub flags: u32,
|
||||
}
|
||||
|
||||
impl GlyphPrimitive {
|
||||
pub const IS_COLORED: u32 = 1;
|
||||
}
|
||||
|
||||
pub struct PrimitiveVec<T> {
|
||||
vec: Vec<T>,
|
||||
free: Vec<usize>,
|
||||
|
||||
+19
-22
@@ -52,25 +52,19 @@ impl TextView {
|
||||
.align(self.align)
|
||||
}
|
||||
|
||||
fn render(&mut self, ctx: &mut SizeCtx) -> RenderedText {
|
||||
fn render(&mut self, ctx: &mut SizeCtx) -> &RenderedText {
|
||||
let width = if self.attrs.wrap {
|
||||
Some(ctx.px_size().x)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
if width == self.width
|
||||
&& let Some(tex) = &self.tex
|
||||
&& !self.attrs.changed
|
||||
&& !self.buf.changed
|
||||
{
|
||||
return tex.clone();
|
||||
if width != self.width || self.tex.is_none() || self.attrs.changed || self.buf.changed {
|
||||
self.width = width;
|
||||
self.tex = Some(ctx.draw_text(&mut self.buf, &self.attrs, width));
|
||||
self.attrs.changed = false;
|
||||
self.buf.changed = false;
|
||||
}
|
||||
self.width = width;
|
||||
let tex = ctx.draw_text(&mut self.buf, &self.attrs, width);
|
||||
self.tex = Some(tex.clone());
|
||||
self.attrs.changed = false;
|
||||
self.buf.changed = false;
|
||||
tex
|
||||
self.tex.as_ref().unwrap()
|
||||
}
|
||||
pub fn tex(&self) -> Option<&RenderedText> {
|
||||
self.tex.as_ref()
|
||||
@@ -94,16 +88,19 @@ impl TextView {
|
||||
}
|
||||
}
|
||||
pub fn draw(&mut self, painter: &mut Painter) -> UiRegion {
|
||||
let tex = self.render(&mut painter.size_ctx());
|
||||
let region = tex.size.align(self.align);
|
||||
if self.is_empty()
|
||||
&& let Some(hint) = &self.hint
|
||||
{
|
||||
painter.widget(hint);
|
||||
} else {
|
||||
let within = region.within(&painter.region());
|
||||
painter.glyphs(&tex, within);
|
||||
let align = self.align;
|
||||
if self.is_empty() && self.hint.is_some() {
|
||||
let region = self.render(&mut painter.size_ctx()).size.align(align);
|
||||
if let Some(hint) = &self.hint {
|
||||
painter.widget(hint);
|
||||
}
|
||||
return region;
|
||||
}
|
||||
|
||||
let tex = self.render(&mut painter.size_ctx());
|
||||
let region = tex.size.align(align);
|
||||
let within = region.within(&painter.region());
|
||||
painter.glyphs(tex, within);
|
||||
region
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user