Use generic Content in Text to avoid reallocation in fill_text
This commit is contained in:
parent
c7a4fad4a2
commit
6216c513d5
10 changed files with 22 additions and 20 deletions
|
|
@ -67,7 +67,7 @@ impl text::Renderer for () {
|
||||||
|
|
||||||
fn fill_text(
|
fn fill_text(
|
||||||
&mut self,
|
&mut self,
|
||||||
_paragraph: Text<'_, Self::Font>,
|
_paragraph: Text,
|
||||||
_position: Point,
|
_position: Point,
|
||||||
_color: Color,
|
_color: Color,
|
||||||
_clip_bounds: Rectangle,
|
_clip_bounds: Rectangle,
|
||||||
|
|
@ -78,11 +78,11 @@ impl text::Renderer for () {
|
||||||
impl text::Paragraph for () {
|
impl text::Paragraph for () {
|
||||||
type Font = Font;
|
type Font = Font;
|
||||||
|
|
||||||
fn with_text(_text: Text<'_, Self::Font>) -> Self {}
|
fn with_text(_text: Text<&str>) -> Self {}
|
||||||
|
|
||||||
fn resize(&mut self, _new_bounds: Size) {}
|
fn resize(&mut self, _new_bounds: Size) {}
|
||||||
|
|
||||||
fn compare(&self, _text: Text<'_, Self::Font>) -> text::Difference {
|
fn compare(&self, _text: Text<&str>) -> text::Difference {
|
||||||
text::Difference::None
|
text::Difference::None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,9 @@ use std::hash::{Hash, Hasher};
|
||||||
|
|
||||||
/// A paragraph.
|
/// A paragraph.
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub struct Text<'a, Font> {
|
pub struct Text<Content = String, Font = crate::Font> {
|
||||||
/// The content of the paragraph.
|
/// The content of the paragraph.
|
||||||
pub content: &'a str,
|
pub content: Content,
|
||||||
|
|
||||||
/// The bounds of the paragraph.
|
/// The bounds of the paragraph.
|
||||||
pub bounds: Size,
|
pub bounds: Size,
|
||||||
|
|
@ -219,7 +219,7 @@ pub trait Renderer: crate::Renderer {
|
||||||
/// [`Color`].
|
/// [`Color`].
|
||||||
fn fill_text(
|
fn fill_text(
|
||||||
&mut self,
|
&mut self,
|
||||||
text: Text<'_, Self::Font>,
|
text: Text<String, Self::Font>,
|
||||||
position: Point,
|
position: Point,
|
||||||
color: Color,
|
color: Color,
|
||||||
clip_bounds: Rectangle,
|
clip_bounds: Rectangle,
|
||||||
|
|
|
||||||
|
|
@ -8,14 +8,14 @@ pub trait Paragraph: Sized + Default {
|
||||||
type Font: Copy + PartialEq;
|
type Font: Copy + PartialEq;
|
||||||
|
|
||||||
/// Creates a new [`Paragraph`] laid out with the given [`Text`].
|
/// Creates a new [`Paragraph`] laid out with the given [`Text`].
|
||||||
fn with_text(text: Text<'_, Self::Font>) -> Self;
|
fn with_text(text: Text<&str, Self::Font>) -> Self;
|
||||||
|
|
||||||
/// Lays out the [`Paragraph`] with some new boundaries.
|
/// Lays out the [`Paragraph`] with some new boundaries.
|
||||||
fn resize(&mut self, new_bounds: Size);
|
fn resize(&mut self, new_bounds: Size);
|
||||||
|
|
||||||
/// Compares the [`Paragraph`] with some desired [`Text`] and returns the
|
/// Compares the [`Paragraph`] with some desired [`Text`] and returns the
|
||||||
/// [`Difference`].
|
/// [`Difference`].
|
||||||
fn compare(&self, text: Text<'_, Self::Font>) -> Difference;
|
fn compare(&self, text: Text<&str, Self::Font>) -> Difference;
|
||||||
|
|
||||||
/// Returns the horizontal alignment of the [`Paragraph`].
|
/// Returns the horizontal alignment of the [`Paragraph`].
|
||||||
fn horizontal_alignment(&self) -> alignment::Horizontal;
|
fn horizontal_alignment(&self) -> alignment::Horizontal;
|
||||||
|
|
@ -35,7 +35,7 @@ pub trait Paragraph: Sized + Default {
|
||||||
fn grapheme_position(&self, line: usize, index: usize) -> Option<Point>;
|
fn grapheme_position(&self, line: usize, index: usize) -> Option<Point>;
|
||||||
|
|
||||||
/// Updates the [`Paragraph`] to match the given [`Text`], if needed.
|
/// Updates the [`Paragraph`] to match the given [`Text`], if needed.
|
||||||
fn update(&mut self, text: Text<'_, Self::Font>) {
|
fn update(&mut self, text: Text<&str, Self::Font>) {
|
||||||
match self.compare(text) {
|
match self.compare(text) {
|
||||||
Difference::None => {}
|
Difference::None => {}
|
||||||
Difference::Bounds => {
|
Difference::Bounds => {
|
||||||
|
|
|
||||||
|
|
@ -163,13 +163,13 @@ where
|
||||||
|
|
||||||
fn fill_text(
|
fn fill_text(
|
||||||
&mut self,
|
&mut self,
|
||||||
text: Text<'_, Self::Font>,
|
text: Text,
|
||||||
position: Point,
|
position: Point,
|
||||||
color: Color,
|
color: Color,
|
||||||
clip_bounds: Rectangle,
|
clip_bounds: Rectangle,
|
||||||
) {
|
) {
|
||||||
self.primitives.push(Primitive::Text {
|
self.primitives.push(Primitive::Text {
|
||||||
content: text.content.to_string(),
|
content: text.content,
|
||||||
bounds: Rectangle::new(position, text.bounds),
|
bounds: Rectangle::new(position, text.bounds),
|
||||||
size: text.size,
|
size: text.size,
|
||||||
line_height: text.line_height,
|
line_height: text.line_height,
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ impl Paragraph {
|
||||||
impl core::text::Paragraph for Paragraph {
|
impl core::text::Paragraph for Paragraph {
|
||||||
type Font = Font;
|
type Font = Font;
|
||||||
|
|
||||||
fn with_text(text: Text<'_, Font>) -> Self {
|
fn with_text(text: Text<&str>) -> Self {
|
||||||
log::trace!("Allocating paragraph: {}", text.content);
|
log::trace!("Allocating paragraph: {}", text.content);
|
||||||
|
|
||||||
let mut font_system =
|
let mut font_system =
|
||||||
|
|
@ -146,7 +146,7 @@ impl core::text::Paragraph for Paragraph {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn compare(&self, text: Text<'_, Font>) -> core::text::Difference {
|
fn compare(&self, text: Text<&str>) -> core::text::Difference {
|
||||||
let font_system = text::font_system().read().expect("Read font system");
|
let font_system = text::font_system().read().expect("Read font system");
|
||||||
let paragraph = self.internal();
|
let paragraph = self.internal();
|
||||||
let metrics = paragraph.buffer.metrics();
|
let metrics = paragraph.buffer.metrics();
|
||||||
|
|
|
||||||
|
|
@ -115,7 +115,7 @@ where
|
||||||
|
|
||||||
fn fill_text(
|
fn fill_text(
|
||||||
&mut self,
|
&mut self,
|
||||||
text: core::Text<'_, Self::Font>,
|
text: core::Text<String, Self::Font>,
|
||||||
position: Point,
|
position: Point,
|
||||||
color: Color,
|
color: Color,
|
||||||
clip_bounds: Rectangle,
|
clip_bounds: Rectangle,
|
||||||
|
|
|
||||||
|
|
@ -340,7 +340,7 @@ where
|
||||||
if self.is_checked {
|
if self.is_checked {
|
||||||
renderer.fill_text(
|
renderer.fill_text(
|
||||||
text::Text {
|
text::Text {
|
||||||
content: &code_point.to_string(),
|
content: code_point.to_string(),
|
||||||
font: *font,
|
font: *font,
|
||||||
size,
|
size,
|
||||||
line_height: *line_height,
|
line_height: *line_height,
|
||||||
|
|
|
||||||
|
|
@ -526,7 +526,7 @@ where
|
||||||
|
|
||||||
renderer.fill_text(
|
renderer.fill_text(
|
||||||
Text {
|
Text {
|
||||||
content: &option.to_string(),
|
content: option.to_string(),
|
||||||
bounds: Size::new(f32::INFINITY, bounds.height),
|
bounds: Size::new(f32::INFINITY, bounds.height),
|
||||||
size: text_size,
|
size: text_size,
|
||||||
line_height: self.text_line_height,
|
line_height: self.text_line_height,
|
||||||
|
|
|
||||||
|
|
@ -479,7 +479,7 @@ where
|
||||||
|
|
||||||
renderer.fill_text(
|
renderer.fill_text(
|
||||||
Text {
|
Text {
|
||||||
content: &code_point.to_string(),
|
content: code_point.to_string(),
|
||||||
size,
|
size,
|
||||||
line_height,
|
line_height,
|
||||||
font,
|
font,
|
||||||
|
|
@ -502,7 +502,7 @@ where
|
||||||
|
|
||||||
let label = selected.map(ToString::to_string);
|
let label = selected.map(ToString::to_string);
|
||||||
|
|
||||||
if let Some(label) = label.as_deref().or(self.placeholder.as_deref()) {
|
if let Some(label) = label.or_else(|| self.placeholder.clone()) {
|
||||||
let text_size =
|
let text_size =
|
||||||
self.text_size.unwrap_or_else(|| renderer.default_size());
|
self.text_size.unwrap_or_else(|| renderer.default_size());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -232,7 +232,7 @@ where
|
||||||
let placeholder_text = Text {
|
let placeholder_text = Text {
|
||||||
font,
|
font,
|
||||||
line_height: self.line_height,
|
line_height: self.line_height,
|
||||||
content: &self.placeholder,
|
content: self.placeholder.as_str(),
|
||||||
bounds: Size::new(f32::INFINITY, text_bounds.height),
|
bounds: Size::new(f32::INFINITY, text_bounds.height),
|
||||||
size: text_size,
|
size: text_size,
|
||||||
horizontal_alignment: alignment::Horizontal::Left,
|
horizontal_alignment: alignment::Horizontal::Left,
|
||||||
|
|
@ -251,9 +251,11 @@ where
|
||||||
});
|
});
|
||||||
|
|
||||||
if let Some(icon) = &self.icon {
|
if let Some(icon) = &self.icon {
|
||||||
|
let mut content = [0; 4];
|
||||||
|
|
||||||
let icon_text = Text {
|
let icon_text = Text {
|
||||||
line_height: self.line_height,
|
line_height: self.line_height,
|
||||||
content: &icon.code_point.to_string(),
|
content: icon.code_point.encode_utf8(&mut content) as &_,
|
||||||
font: icon.font,
|
font: icon.font,
|
||||||
size: icon.size.unwrap_or_else(|| renderer.default_size()),
|
size: icon.size.unwrap_or_else(|| renderer.default_size()),
|
||||||
bounds: Size::new(f32::INFINITY, text_bounds.height),
|
bounds: Size::new(f32::INFINITY, text_bounds.height),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue