Reuse TextLayoutInfo in queue_text (#14997)
# Objective Don't reallocate `TextLayoutInfo` every time it needs to be updated. ## Solution Reuse existing allocation.
This commit is contained in:
		
							parent
							
								
									f02d76a44d
								
							
						
					
					
						commit
						2b94a108ae
					
				| @ -145,6 +145,7 @@ impl TextPipeline { | |||||||
|     #[allow(clippy::too_many_arguments)] |     #[allow(clippy::too_many_arguments)] | ||||||
|     pub fn queue_text( |     pub fn queue_text( | ||||||
|         &mut self, |         &mut self, | ||||||
|  |         layout_info: &mut TextLayoutInfo, | ||||||
|         fonts: &Assets<Font>, |         fonts: &Assets<Font>, | ||||||
|         sections: &[TextSection], |         sections: &[TextSection], | ||||||
|         scale_factor: f64, |         scale_factor: f64, | ||||||
| @ -156,9 +157,12 @@ impl TextPipeline { | |||||||
|         textures: &mut Assets<Image>, |         textures: &mut Assets<Image>, | ||||||
|         y_axis_orientation: YAxisOrientation, |         y_axis_orientation: YAxisOrientation, | ||||||
|         buffer: &mut CosmicBuffer, |         buffer: &mut CosmicBuffer, | ||||||
|     ) -> Result<TextLayoutInfo, TextError> { |     ) -> Result<(), TextError> { | ||||||
|  |         layout_info.glyphs.clear(); | ||||||
|  |         layout_info.size = Default::default(); | ||||||
|  | 
 | ||||||
|         if sections.is_empty() { |         if sections.is_empty() { | ||||||
|             return Ok(TextLayoutInfo::default()); |             return Ok(()); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         self.update_buffer( |         self.update_buffer( | ||||||
| @ -175,14 +179,14 @@ impl TextPipeline { | |||||||
|         let font_system = &mut self.font_system.0; |         let font_system = &mut self.font_system.0; | ||||||
|         let swash_cache = &mut self.swash_cache.0; |         let swash_cache = &mut self.swash_cache.0; | ||||||
| 
 | 
 | ||||||
|         let glyphs = buffer |         buffer | ||||||
|             .layout_runs() |             .layout_runs() | ||||||
|             .flat_map(|run| { |             .flat_map(|run| { | ||||||
|                 run.glyphs |                 run.glyphs | ||||||
|                     .iter() |                     .iter() | ||||||
|                     .map(move |layout_glyph| (layout_glyph, run.line_y)) |                     .map(move |layout_glyph| (layout_glyph, run.line_y)) | ||||||
|             }) |             }) | ||||||
|             .map(|(layout_glyph, line_y)| { |             .try_for_each(|(layout_glyph, line_y)| { | ||||||
|                 let section_index = layout_glyph.metadata; |                 let section_index = layout_glyph.metadata; | ||||||
| 
 | 
 | ||||||
|                 let font_handle = sections[section_index].style.font.clone_weak(); |                 let font_handle = sections[section_index].style.font.clone_weak(); | ||||||
| @ -224,14 +228,12 @@ impl TextPipeline { | |||||||
|                 // when glyphs are not limited to single byte representation, relevant for #1319
 |                 // when glyphs are not limited to single byte representation, relevant for #1319
 | ||||||
|                 let pos_glyph = |                 let pos_glyph = | ||||||
|                     PositionedGlyph::new(position, glyph_size.as_vec2(), atlas_info, section_index); |                     PositionedGlyph::new(position, glyph_size.as_vec2(), atlas_info, section_index); | ||||||
|                 Ok(pos_glyph) |                 layout_info.glyphs.push(pos_glyph); | ||||||
|             }) |                 Ok(()) | ||||||
|             .collect::<Result<Vec<_>, _>>()?; |             })?; | ||||||
| 
 | 
 | ||||||
|         Ok(TextLayoutInfo { |         layout_info.size = box_size; | ||||||
|             glyphs, |         Ok(()) | ||||||
|             size: box_size, |  | ||||||
|         }) |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Queues text for measurement
 |     /// Queues text for measurement
 | ||||||
|  | |||||||
| @ -170,7 +170,7 @@ pub fn update_text2d_layout( | |||||||
| 
 | 
 | ||||||
|     let inverse_scale_factor = scale_factor.recip(); |     let inverse_scale_factor = scale_factor.recip(); | ||||||
| 
 | 
 | ||||||
|     for (entity, text, bounds, mut text_layout_info, mut buffer) in &mut text_query { |     for (entity, text, bounds, text_layout_info, mut buffer) in &mut text_query { | ||||||
|         if factor_changed || text.is_changed() || bounds.is_changed() || queue.remove(&entity) { |         if factor_changed || text.is_changed() || bounds.is_changed() || queue.remove(&entity) { | ||||||
|             let text_bounds = TextBounds { |             let text_bounds = TextBounds { | ||||||
|                 width: if text.linebreak_behavior == BreakLineOn::NoWrap { |                 width: if text.linebreak_behavior == BreakLineOn::NoWrap { | ||||||
| @ -183,7 +183,9 @@ pub fn update_text2d_layout( | |||||||
|                     .map(|height| scale_value(height, scale_factor)), |                     .map(|height| scale_value(height, scale_factor)), | ||||||
|             }; |             }; | ||||||
| 
 | 
 | ||||||
|  |             let text_layout_info = text_layout_info.into_inner(); | ||||||
|             match text_pipeline.queue_text( |             match text_pipeline.queue_text( | ||||||
|  |                 text_layout_info, | ||||||
|                 &fonts, |                 &fonts, | ||||||
|                 &text.sections, |                 &text.sections, | ||||||
|                 scale_factor.into(), |                 scale_factor.into(), | ||||||
| @ -204,10 +206,11 @@ pub fn update_text2d_layout( | |||||||
|                 Err(e @ (TextError::FailedToAddGlyph(_) | TextError::FailedToGetGlyphImage(_))) => { |                 Err(e @ (TextError::FailedToAddGlyph(_) | TextError::FailedToGetGlyphImage(_))) => { | ||||||
|                     panic!("Fatal error when processing text: {e}."); |                     panic!("Fatal error when processing text: {e}."); | ||||||
|                 } |                 } | ||||||
|                 Ok(mut info) => { |                 Ok(()) => { | ||||||
|                     info.size.x = scale_value(info.size.x, inverse_scale_factor); |                     text_layout_info.size.x = | ||||||
|                     info.size.y = scale_value(info.size.y, inverse_scale_factor); |                         scale_value(text_layout_info.size.x, inverse_scale_factor); | ||||||
|                     *text_layout_info = info; |                     text_layout_info.size.y = | ||||||
|  |                         scale_value(text_layout_info.size.y, inverse_scale_factor); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -224,7 +224,7 @@ fn queue_text( | |||||||
|     text: &Text, |     text: &Text, | ||||||
|     node: Ref<Node>, |     node: Ref<Node>, | ||||||
|     mut text_flags: Mut<TextFlags>, |     mut text_flags: Mut<TextFlags>, | ||||||
|     mut text_layout_info: Mut<TextLayoutInfo>, |     text_layout_info: Mut<TextLayoutInfo>, | ||||||
|     buffer: &mut CosmicBuffer, |     buffer: &mut CosmicBuffer, | ||||||
| ) { | ) { | ||||||
|     // Skip the text node if it is waiting for a new measure func
 |     // Skip the text node if it is waiting for a new measure func
 | ||||||
| @ -240,7 +240,9 @@ fn queue_text( | |||||||
|             ) |             ) | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|  |         let text_layout_info = text_layout_info.into_inner(); | ||||||
|         match text_pipeline.queue_text( |         match text_pipeline.queue_text( | ||||||
|  |             text_layout_info, | ||||||
|             fonts, |             fonts, | ||||||
|             &text.sections, |             &text.sections, | ||||||
|             scale_factor.into(), |             scale_factor.into(), | ||||||
| @ -260,10 +262,11 @@ fn queue_text( | |||||||
|             Err(e @ (TextError::FailedToAddGlyph(_) | TextError::FailedToGetGlyphImage(_))) => { |             Err(e @ (TextError::FailedToAddGlyph(_) | TextError::FailedToGetGlyphImage(_))) => { | ||||||
|                 panic!("Fatal error when processing text: {e}."); |                 panic!("Fatal error when processing text: {e}."); | ||||||
|             } |             } | ||||||
|             Ok(mut info) => { |             Ok(()) => { | ||||||
|                 info.size.x = scale_value(info.size.x, inverse_scale_factor); |                 text_layout_info.size.x = | ||||||
|                 info.size.y = scale_value(info.size.y, inverse_scale_factor); |                     scale_value(text_layout_info.size.x, inverse_scale_factor); | ||||||
|                 *text_layout_info = info; |                 text_layout_info.size.y = | ||||||
|  |                     scale_value(text_layout_info.size.y, inverse_scale_factor); | ||||||
|                 text_flags.needs_recompute = false; |                 text_flags.needs_recompute = false; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 UkoeHB
						UkoeHB