We have a working build that is performant enough for text_svg
Some checks failed
/ test (push) Has been cancelled
Some checks failed
/ test (push) Has been cancelled
This commit is contained in:
parent
fae83aedc5
commit
9971ccdf30
2 changed files with 74 additions and 65 deletions
|
@ -202,15 +202,19 @@ impl Presenter {
|
||||||
// ));
|
// ));
|
||||||
}
|
}
|
||||||
Message::SlideChange(slide) => {
|
Message::SlideChange(slide) => {
|
||||||
debug!(?slide, "slide changed");
|
let slide_text = slide.text();
|
||||||
let old_background =
|
debug!(slide_text, "slide changed");
|
||||||
self.current_slide.background().clone();
|
debug!("comparing background...");
|
||||||
|
let backgrounds_match =
|
||||||
|
self.current_slide.background()
|
||||||
|
== slide.background();
|
||||||
// self.current_slide_index = slide;
|
// self.current_slide_index = slide;
|
||||||
|
debug!("cloning slide...");
|
||||||
self.current_slide = slide.clone();
|
self.current_slide = slide.clone();
|
||||||
let _ =
|
let _ =
|
||||||
self.update(Message::ChangeFont(slide.font()));
|
self.update(Message::ChangeFont(slide.font()));
|
||||||
if self.current_slide.background() != &old_background
|
debug!("changing video now...");
|
||||||
{
|
if !backgrounds_match {
|
||||||
if let Some(video) = &mut self.video {
|
if let Some(video) = &mut self.video {
|
||||||
let _ = video.restart_stream();
|
let _ = video.restart_stream();
|
||||||
}
|
}
|
||||||
|
@ -228,6 +232,7 @@ impl Presenter {
|
||||||
},
|
},
|
||||||
y: 0.0,
|
y: 0.0,
|
||||||
};
|
};
|
||||||
|
debug!(?offset);
|
||||||
let mut tasks = vec![];
|
let mut tasks = vec![];
|
||||||
tasks.push(scroll_to(self.scroll_id.clone(), offset));
|
tasks.push(scroll_to(self.scroll_id.clone(), offset));
|
||||||
|
|
||||||
|
@ -249,12 +254,12 @@ impl Presenter {
|
||||||
Some(current_audio)
|
Some(current_audio)
|
||||||
if current_audio != *new_audio =>
|
if current_audio != *new_audio =>
|
||||||
{
|
{
|
||||||
self.audio = Some(new_audio.clone());
|
|
||||||
debug!(
|
debug!(
|
||||||
?new_audio,
|
?new_audio,
|
||||||
?current_audio,
|
?current_audio,
|
||||||
"audio needs to change"
|
"audio needs to change"
|
||||||
);
|
);
|
||||||
|
self.audio = Some(new_audio.clone());
|
||||||
tasks.push(self.start_audio());
|
tasks.push(self.start_audio());
|
||||||
}
|
}
|
||||||
Some(current_audio) => {
|
Some(current_audio) => {
|
||||||
|
@ -395,7 +400,7 @@ impl Presenter {
|
||||||
|
|
||||||
pub fn view(&self) -> Element<Message> {
|
pub fn view(&self) -> Element<Message> {
|
||||||
slide_view(
|
slide_view(
|
||||||
self.current_slide.clone(),
|
&self.current_slide,
|
||||||
&self.video,
|
&self.video,
|
||||||
self.current_font,
|
self.current_font,
|
||||||
false,
|
false,
|
||||||
|
@ -405,7 +410,7 @@ impl Presenter {
|
||||||
|
|
||||||
pub fn view_preview(&self) -> Element<Message> {
|
pub fn view_preview(&self) -> Element<Message> {
|
||||||
slide_view(
|
slide_view(
|
||||||
self.current_slide.clone(),
|
&self.current_slide,
|
||||||
&self.video,
|
&self.video,
|
||||||
self.current_font,
|
self.current_font,
|
||||||
false,
|
false,
|
||||||
|
@ -441,7 +446,7 @@ impl Presenter {
|
||||||
);
|
);
|
||||||
|
|
||||||
let container = slide_view(
|
let container = slide_view(
|
||||||
slide.clone(),
|
&slide,
|
||||||
&self.video,
|
&self.video,
|
||||||
font,
|
font,
|
||||||
true,
|
true,
|
||||||
|
@ -695,55 +700,54 @@ fn scale_font(font_size: f32, width: f32) -> f32 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn slide_view(
|
pub(crate) fn slide_view<'a>(
|
||||||
slide: Slide,
|
slide: &'a Slide,
|
||||||
video: &Option<Video>,
|
video: &'a Option<Video>,
|
||||||
font: Font,
|
font: Font,
|
||||||
delegate: bool,
|
delegate: bool,
|
||||||
hide_mouse: bool,
|
hide_mouse: bool,
|
||||||
) -> Element<'_, Message> {
|
) -> Element<'a, Message> {
|
||||||
let res = responsive(move |size| {
|
let res = responsive(move |size| {
|
||||||
let width = size.height * 16.0 / 9.0;
|
let width = size.height * 16.0 / 9.0;
|
||||||
let slide_text = slide.text();
|
// let slide_text = slide.text();
|
||||||
|
|
||||||
// let font = SvgFont::from(font).size(font_size.floor() as u8);
|
// let font = SvgFont::from(font).size(font_size.floor() as u8);
|
||||||
// let text_container = if delegate {
|
// let text_container = if delegate {
|
||||||
// // text widget based
|
// // text widget based
|
||||||
// let font_size =
|
// let font_size = scale_font(slide.font_size() as f32, width);
|
||||||
// scale_font(slide.font_size() as f32, width);
|
// let lines = slide_text.lines();
|
||||||
// let lines = slide_text.lines();
|
// let text: Vec<Element<Message>> = lines
|
||||||
// let text: Vec<Element<Message>> = lines
|
// .map(|t| {
|
||||||
// .map(|t| {
|
// rich_text([span(format!("{}\n", t))
|
||||||
// rich_text([span(format!("{}\n", t))
|
// .background(
|
||||||
// .background(
|
// Background::Color(Color::BLACK)
|
||||||
// Background::Color(Color::BLACK)
|
// .scale_alpha(0.4),
|
||||||
// .scale_alpha(0.4),
|
// )
|
||||||
// )
|
// .border(border::rounded(10))
|
||||||
// .border(border::rounded(10))
|
// .padding(10)])
|
||||||
// .padding(10)])
|
// .size(font_size)
|
||||||
// .size(font_size)
|
// .font(font)
|
||||||
// .font(font)
|
// .center()
|
||||||
// .center()
|
// .into()
|
||||||
// .into()
|
// // let chars: Vec<Span> = t
|
||||||
// // let chars: Vec<Span> = t
|
// // .chars()
|
||||||
// // .chars()
|
// // .map(|c| -> Span {
|
||||||
// // .map(|c| -> Span {
|
// // let character: String = format!("{}/n", c);
|
||||||
// // let character: String = format!("{}/n", c);
|
// // span(character)
|
||||||
// // span(character)
|
// // .size(font_size)
|
||||||
// // .size(font_size)
|
// // .font(font)
|
||||||
// // .font(font)
|
// // .background(
|
||||||
// // .background(
|
// // Background::Color(Color::BLACK)
|
||||||
// // Background::Color(Color::BLACK)
|
// // .scale_alpha(0.4),
|
||||||
// // .scale_alpha(0.4),
|
// // )
|
||||||
// // )
|
// // .border(border::rounded(10))
|
||||||
// // .border(border::rounded(10))
|
// // .padding(10)
|
||||||
// // .padding(10)
|
// })
|
||||||
// })
|
// .collect();
|
||||||
// .collect();
|
// let text = Column::with_children(text).spacing(26);
|
||||||
// let text = Column::with_children(text).spacing(26);
|
// let text = Container::new(text)
|
||||||
// Container::new(text)
|
// .center(Length::Fill)
|
||||||
// .center(Length::Fill)
|
// .align_x(Horizontal::Left);
|
||||||
// .align_x(Horizontal::Left)
|
|
||||||
// } else {
|
// } else {
|
||||||
// // SVG based
|
// // SVG based
|
||||||
// let text: Element<Message> =
|
// let text: Element<Message> =
|
||||||
|
@ -813,7 +817,7 @@ pub(crate) fn slide_view(
|
||||||
if let Some(text) = &slide.text_svg {
|
if let Some(text) = &slide.text_svg {
|
||||||
if let Some(handle) = &text.handle {
|
if let Some(handle) = &text.handle {
|
||||||
image(handle)
|
image(handle)
|
||||||
.content_fit(ContentFit::Cover)
|
.content_fit(ContentFit::ScaleDown)
|
||||||
.width(width)
|
.width(width)
|
||||||
.height(size.height)
|
.height(size.height)
|
||||||
.into()
|
.into()
|
||||||
|
|
|
@ -244,20 +244,20 @@ impl TextSvg {
|
||||||
pub fn build(mut self) -> Self {
|
pub fn build(mut self) -> Self {
|
||||||
debug!("starting...");
|
debug!("starting...");
|
||||||
|
|
||||||
let mut path = dirs::data_local_dir().unwrap();
|
// let mut path = dirs::data_local_dir().unwrap();
|
||||||
path.push(PathBuf::from("lumina"));
|
// path.push(PathBuf::from("lumina"));
|
||||||
path.push(PathBuf::from("temp"));
|
// path.push(PathBuf::from("temp"));
|
||||||
let file_title =
|
// let file_title =
|
||||||
&self.text.lines().next().unwrap().trim_end();
|
// &self.text.lines().next().unwrap().trim_end();
|
||||||
path.push(PathBuf::from(file_title));
|
// path.push(PathBuf::from(file_title));
|
||||||
path.set_extension("png");
|
// path.set_extension("png");
|
||||||
|
|
||||||
if path.exists() {
|
// if path.exists() {
|
||||||
debug!("cached");
|
// debug!("cached");
|
||||||
let handle = Handle::from_path(path);
|
// let handle = Handle::from_path(path);
|
||||||
self.handle = Some(handle);
|
// self.handle = Some(handle);
|
||||||
return self;
|
// return self;
|
||||||
}
|
// }
|
||||||
let shadow = if let Some(shadow) = &self.shadow {
|
let shadow = if let Some(shadow) = &self.shadow {
|
||||||
format!("<filter id=\"shadow\"><feDropShadow dx=\"{}\" dy=\"{}\" stdDeviation=\"{}\" flood-color=\"{}\"/></filter>",
|
format!("<filter id=\"shadow\"><feDropShadow dx=\"{}\" dy=\"{}\" stdDeviation=\"{}\" flood-color=\"{}\"/></filter>",
|
||||||
shadow.offset_x,
|
shadow.offset_x,
|
||||||
|
@ -322,10 +322,15 @@ impl TextSvg {
|
||||||
Pixmap::new(size.width as u32, size.height as u32)
|
Pixmap::new(size.width as u32, size.height as u32)
|
||||||
.expect("opops");
|
.expect("opops");
|
||||||
resvg::render(&resvg_tree, transform, &mut pixmap.as_mut());
|
resvg::render(&resvg_tree, transform, &mut pixmap.as_mut());
|
||||||
let _ = pixmap.save_png(&path);
|
// let _ = pixmap.save_png(&path);
|
||||||
|
|
||||||
debug!("rendered");
|
debug!("rendered");
|
||||||
let handle = Handle::from_path(path);
|
// let handle = Handle::from_path(path);
|
||||||
|
let handle = Handle::from_rgba(
|
||||||
|
size.width as u32,
|
||||||
|
size.height as u32,
|
||||||
|
pixmap.take(),
|
||||||
|
);
|
||||||
self.handle = Some(handle);
|
self.handle = Some(handle);
|
||||||
debug!("stored");
|
debug!("stored");
|
||||||
self
|
self
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue