Efficiency refactorings

This commit is contained in:
Stephen Seo 2021-12-15 19:19:35 +09:00
parent 1dd1f49bec
commit 01ca9d146e

View file

@ -6,11 +6,8 @@ use ggez::graphics::{
self, Color, DrawMode, DrawParam, Drawable, Font, Image, Mesh, MeshBuilder, PxScale, Rect,
Text, TextFragment, Transform,
};
use ggez::timer;
use ggez::Context;
use ggez::GameError;
use ggez::{timer, Context, GameError, GameResult};
use image::io::Reader as ImageReader;
use image::GenericImageView;
use std::io::Cursor;
use std::sync::atomic::AtomicBool;
use std::sync::{atomic::Ordering, Arc, RwLock};
@ -62,18 +59,15 @@ pub struct MPDDisplay {
album_art_draw_transform: Option<Transform>,
filename_text: Text,
filename_transform: Transform,
filename_y: f32,
artist_text: Text,
artist_transform: Transform,
artist_y: f32,
title_text: Text,
title_transform: Transform,
title_y: f32,
timer_text: Text,
timer_transform: Transform,
timer_y: f32,
timer: f64,
length: f64,
text_bg_mesh: Option<Mesh>,
}
impl MPDDisplay {
@ -92,18 +86,15 @@ impl MPDDisplay {
album_art_draw_transform: None,
filename_text: Text::new(""),
filename_transform: Transform::default(),
filename_y: 1.0,
artist_text: Text::new(""),
artist_transform: Transform::default(),
artist_y: 1.0,
title_text: Text::new(""),
title_transform: Transform::default(),
title_y: 1.0,
timer_text: Text::new("0"),
timer_transform: Transform::default(),
timer_y: 1.0,
timer: 0.0,
length: 0.0,
text_bg_mesh: None,
}
}
@ -183,11 +174,16 @@ impl MPDDisplay {
Ok(())
}
fn refresh_text_transforms(&mut self, ctx: &mut Context) {
fn refresh_text_transforms(&mut self, ctx: &mut Context) -> GameResult<()> {
let screen_coords: Rect = graphics::screen_coordinates(ctx);
let mut offset_y: f32 = screen_coords.h;
let mut filename_y: f32 = 0.0;
let mut artist_y: f32 = 0.0;
let mut title_y: f32 = 0.0;
let mut timer_y: f32 = 0.0;
let set_transform = |text: &mut Text,
transform: &mut Transform,
offset_y: &mut f32,
@ -255,7 +251,7 @@ impl MPDDisplay {
&mut self.filename_text,
&mut self.filename_transform,
&mut offset_y,
&mut self.filename_y,
&mut filename_y,
true,
false,
);
@ -268,7 +264,7 @@ impl MPDDisplay {
&mut self.artist_text,
&mut self.artist_transform,
&mut offset_y,
&mut self.artist_y,
&mut artist_y,
true,
true,
);
@ -281,7 +277,7 @@ impl MPDDisplay {
&mut self.title_text,
&mut self.title_transform,
&mut offset_y,
&mut self.title_y,
&mut title_y,
true,
false,
);
@ -293,10 +289,62 @@ impl MPDDisplay {
&mut self.timer_text,
&mut self.timer_transform,
&mut offset_y,
&mut self.timer_y,
&mut timer_y,
false,
false,
);
let filename_dimensions = self.filename_text.dimensions(ctx);
let artist_dimensions = self.artist_text.dimensions(ctx);
let title_dimensions = self.title_text.dimensions(ctx);
let timer_dimensions = self.timer_text.dimensions(ctx);
let mesh: Mesh = MeshBuilder::new()
.rectangle(
DrawMode::fill(),
Rect {
x: TEXT_X_OFFSET,
y: filename_y,
w: filename_dimensions.w,
h: filename_dimensions.h,
},
Color::from_rgba(0, 0, 0, 160),
)?
.rectangle(
DrawMode::fill(),
Rect {
x: TEXT_X_OFFSET,
y: artist_y,
w: artist_dimensions.w,
h: artist_dimensions.h,
},
Color::from_rgba(0, 0, 0, 160),
)?
.rectangle(
DrawMode::fill(),
Rect {
x: TEXT_X_OFFSET,
y: title_y,
w: title_dimensions.w,
h: title_dimensions.h,
},
Color::from_rgba(0, 0, 0, 160),
)?
.rectangle(
DrawMode::fill(),
Rect {
x: TEXT_X_OFFSET,
y: timer_y,
w: timer_dimensions.w,
h: timer_dimensions.h,
},
Color::from_rgba(0, 0, 0, 160),
)?
.build(ctx)?;
self.text_bg_mesh = Some(mesh);
Ok(())
}
}
@ -353,6 +401,9 @@ impl EventHandler for MPDDisplay {
.store(true, Ordering::Relaxed);
}
if !shared.filename.is_empty() {
if self.filename_text.contents() != shared.filename {
self.album_art = None;
}
self.filename_text = Text::new(shared.filename.clone());
} else {
self.dirty_flag
@ -362,10 +413,11 @@ impl EventHandler for MPDDisplay {
}
self.timer = shared.pos;
self.length = shared.length;
self.refresh_text_transforms(ctx);
self.refresh_text_transforms(ctx)?;
} else {
log("Failed to acquire read lock for getting shared data");
}
if self.album_art.is_none() {
let album_art_data_result =
MPDHandler::get_art_data(self.mpd_handler.clone().unwrap());
if let Ok(art_data) = album_art_data_result {
@ -383,6 +435,7 @@ impl EventHandler for MPDDisplay {
}
}
}
}
let delta = timer::delta(ctx);
self.timer += delta.as_secs_f64();
@ -416,53 +469,9 @@ impl EventHandler for MPDDisplay {
self.notice_text.draw(ctx, DrawParam::default())?;
if self.is_valid && self.is_initialized {
let filename_dimensions = self.filename_text.dimensions(ctx);
let artist_dimensions = self.artist_text.dimensions(ctx);
let title_dimensions = self.title_text.dimensions(ctx);
let timer_dimensions = self.timer_text.dimensions(ctx);
let mesh: Mesh = MeshBuilder::new()
.rectangle(
DrawMode::fill(),
Rect {
x: TEXT_X_OFFSET,
y: self.filename_y,
w: filename_dimensions.w,
h: filename_dimensions.h,
},
Color::from_rgba(0, 0, 0, 160),
)?
.rectangle(
DrawMode::fill(),
Rect {
x: TEXT_X_OFFSET,
y: self.artist_y,
w: artist_dimensions.w,
h: artist_dimensions.h,
},
Color::from_rgba(0, 0, 0, 160),
)?
.rectangle(
DrawMode::fill(),
Rect {
x: TEXT_X_OFFSET,
y: self.title_y,
w: title_dimensions.w,
h: title_dimensions.h,
},
Color::from_rgba(0, 0, 0, 160),
)?
.rectangle(
DrawMode::fill(),
Rect {
x: TEXT_X_OFFSET,
y: self.timer_y,
w: timer_dimensions.w,
h: timer_dimensions.h,
},
Color::from_rgba(0, 0, 0, 160),
)?
.build(ctx)?;
if let Some(mesh) = &self.text_bg_mesh {
mesh.draw(ctx, DrawParam::default())?;
}
self.filename_text.draw(
ctx,
@ -540,6 +549,7 @@ impl EventHandler for MPDDisplay {
fn resize_event(&mut self, ctx: &mut Context, _width: f32, _height: f32) {
self.get_album_art_transform(ctx, false);
self.refresh_text_transforms(ctx);
self.refresh_text_transforms(ctx)
.expect("Failed to set text transforms");
}
}