fix text size calculation

This commit is contained in:
Daniel Bulant 2024-02-24 20:56:31 +01:00
parent 389b147bfb
commit 24481bed2a
3 changed files with 38 additions and 31 deletions

View file

@ -52,8 +52,6 @@ struct ReactiveBlock {
#[proc_macro]
/// If you have syntax errors because of attributes, wrap the default value in parentheses.
pub fn make_component(item: TokenStream) -> TokenStream {
dbg!(&item);
let mut last_identifier = None;
let mut item = item.into_iter();
let name = item.next().unwrap();
@ -64,8 +62,6 @@ pub fn make_component(item: TokenStream) -> TokenStream {
};
let str_name = name_ident.to_string();
dbg!(&name_ident);
let mut attributes: Vec<Attribute> = Vec::new();
// let mut struct_values = Vec::new();
@ -586,8 +582,7 @@ pub fn make_component(item: TokenStream) -> TokenStream {
if attributes.len() > 0 {
set_stream.extend(TokenStream::from(quote!(let mut to_update = [0; Self::UPDATE_LENGTH];)));
let mut i = 0;
for attribute in &attributes {
for (i, attribute) in attributes.iter().enumerate() {
set_stream.extend(TokenStream::from(quote!(if let Some)));
let mut some_inner = TokenStream::new();
@ -608,16 +603,14 @@ pub fn make_component(item: TokenStream) -> TokenStream {
let mut to_update_stream = TokenStream::new();
to_update_stream.extend(Some(TokenTree::Literal(Literal::u32_unsuffixed(i / 32))));
to_update_stream.extend(Some(TokenTree::Literal(Literal::u32_unsuffixed(i as u32 / 32))));
set_stream_inner.extend(Some(TokenTree::Group(Group::new(proc_macro::Delimiter::Bracket, to_update_stream))));
set_stream_inner.extend(TokenStream::from(quote!(|= )));
set_stream_inner.extend(Some(TokenTree::Literal(Literal::u32_unsuffixed(1 << i % 32))));
set_stream_inner.extend(Some(TokenTree::Literal(Literal::u32_unsuffixed(1 << (i as u32 % 32)))));
set_stream.extend(Some(TokenTree::Group(Group::new(proc_macro::Delimiter::Brace, set_stream_inner))));
i+=1;
}
set_stream.extend(TokenStream::from(quote!(if to_update.into_iter().reduce(|a,b| a+b).unwrap() != 0 { self.tick(Some(&to_update)); })));
@ -683,7 +676,26 @@ pub fn make_component(item: TokenStream) -> TokenStream {
let mut node_insert_stream = TokenStream::new();
node_insert_stream.extend(TokenStream::from(quote!(parent,)));
match component.parent {
Some(parent) => {
let parent_ident = Ident::new(&format!("comp{}", parent), Span::call_site());
let mut node_insert_self_stream = TokenStream::new();
node_insert_self_stream.extend(TokenStream::from(quote!(self.)));
node_insert_self_stream.extend(Some(TokenTree::Ident(parent_ident)));
node_insert_self_stream.extend(TokenStream::from(quote!(.clone())));
let node_insert_self_group = Group::new(proc_macro::Delimiter::Brace, node_insert_self_stream);
node_insert_stream.extend(TokenStream::from(quote!(&)));
node_insert_stream.extend(Some(TokenTree::Group(node_insert_self_group)));
},
None => {
node_insert_stream.extend(TokenStream::from(quote!(parent)));
}
}
node_insert_stream.extend(TokenStream::from(quote!(,)));
node_insert_stream.extend(TokenStream::from(quote!(&)));
let mut node_insert_self_stream = TokenStream::new();
@ -872,7 +884,7 @@ pub fn make_component(item: TokenStream) -> TokenStream {
let component_set_some_stream = replace_variables(block.contents.clone()).1;
let mut component_set_group = Group::new(proc_macro::Delimiter::Parenthesis, component_set_some_stream);
let component_set_group = Group::new(proc_macro::Delimiter::Parenthesis, component_set_some_stream);
component_set_stream.extend(Some(TokenTree::Group(component_set_group)));
component_set_stream.extend(TokenStream::from(quote!(, ..Default::default())));
@ -948,13 +960,6 @@ pub fn make_component(item: TokenStream) -> TokenStream {
output.extend(Some(TokenTree::Group(Group::new(proc_macro::Delimiter::Brace, component_impl_stream))));
// dbg!(&output);
dbg!(attributes);
dbg!(reactive_variables);
println!("{}", output.to_string());
println!();
@ -1079,8 +1084,6 @@ fn parse_components(name: Ident, group: Group, next: usize, parent: Option<usize
let mut group = group.stream().into_iter();
let mut self_stream = TokenStream::new();
// dbg!(&name);
let name_starts_lowercase = name.to_string().chars().next().unwrap().is_lowercase();
let this_component = ComponentUsed {
@ -1114,7 +1117,7 @@ fn parse_components(name: Ident, group: Group, next: usize, parent: Option<usize
_ => panic!("Expected group after ident")
};
let components = parse_components(ident, group, next + components_found.len() + 1, Some(next));
let components = parse_components(ident, group, next + components_found.len(), Some(next));
components_found.extend(components);
},
TokenTree::Punct(punct) if punct.as_char() == '$' => {

View file

@ -304,16 +304,16 @@ pub fn run_event_loop(entry: MainEntry) -> () {
_ => {}
},
Event::NewEvents(_) => {
if let Some(monitor) = window.current_monitor() {
if let Some(refresh_rate) = monitor.refresh_rate_millihertz() {
// if let Some(monitor) = window.current_monitor() {
// if let Some(refresh_rate) = monitor.refresh_rate_millihertz() {
// dbg!(refresh_rate);
// some leeway before vsync
target.set_control_flow(ControlFlow::wait_duration(Duration::from_millis(1000 / refresh_rate as u64 - 100/refresh_rate as u64)));
// target.set_control_flow(ControlFlow::wait_duration(Duration::from_millis(1000 / refresh_rate as u64 - 100/refresh_rate as u64)));
if let Ok(_) = entry.render.try_recv() {
window.request_redraw();
}
}
}
// }
// }
},
// In the future, window should be created after resuming from suspend (for android support)
_ => {}

View file

@ -60,7 +60,7 @@ impl Node for Text {
context.canvas.draw_glyph_commands(cmds, &self.paint, 1.0);
}
fn measure(&mut self, _context: &mut MeasureContext, known_dimensions: Size<Option<f32>>, available_space: Size<AvailableSpace>) -> Size<f32> {
fn measure(&mut self, context: &mut MeasureContext, known_dimensions: Size<Option<f32>>, available_space: Size<AvailableSpace>) -> Size<f32> {
let width_constraint = known_dimensions.width.unwrap_or(match available_space.width {
AvailableSpace::MinContent => 0.0,
AvailableSpace::MaxContent => f32::INFINITY,
@ -69,16 +69,20 @@ impl Node for Text {
// yes, this can crash if someone removes `buffer` during render from another thread.
// though they're asking for it, so let them crash.
let buf = self.buffer.as_mut().unwrap();
buf.set_size(&mut FONT_SYSTEM.lock().unwrap(), width_constraint, f32::INFINITY);
let mut font = FONT_SYSTEM.lock().unwrap();
buf.set_size(&mut font, width_constraint, f32::INFINITY);
buf.set_metrics(&mut font, self.metrics.scale(context.scale_factor));
// Compute layout
buf.shape_until_scroll(&mut FONT_SYSTEM.lock().unwrap(), false);
buf.shape_until_scroll(&mut font, false);
drop(font);
// Determine measured size of text
let (width, total_lines) = buf
.layout_runs()
.fold((0.0, 0usize), |(width, total_lines), run| (run.line_w.max(width), total_lines + 1));
let height = total_lines as f32 * buf.metrics().line_height;
// fixes text not rendering in some cases (??????)
let height = total_lines as f32 * buf.metrics().line_height + 1.0;
// fixes flickering of text on devices with non-integer scale factors due to loss of precision
let width = width + 0.5;