Print random easter egg
This commit is contained in:
parent
b293408cbc
commit
a9ba160c13
15 changed files with 106 additions and 3 deletions
82
showbits-thermal-printer/src/drawer/egg.rs
Normal file
82
showbits-thermal-printer/src/drawer/egg.rs
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
use image::{imageops, RgbaImage};
|
||||
use rand::Rng;
|
||||
use showbits_assets::{EGG_COVER, EGG_PATTERNS};
|
||||
use showbits_common::{
|
||||
color::{self, WHITE},
|
||||
widgets::{Image, Text},
|
||||
Node, Tree, WidgetExt,
|
||||
};
|
||||
use taffy::{style_helpers::percent, AlignItems, Display, FlexDirection};
|
||||
|
||||
use crate::printer::Printer;
|
||||
|
||||
use super::{Context, Drawing};
|
||||
|
||||
pub struct EggDrawing;
|
||||
|
||||
fn load_image(bytes: &[u8]) -> anyhow::Result<RgbaImage> {
|
||||
Ok(image::load_from_memory(bytes)?.into_rgba8())
|
||||
}
|
||||
|
||||
impl Drawing for EggDrawing {
|
||||
fn draw(&self, printer: &mut Printer, ctx: &mut Context) -> anyhow::Result<()> {
|
||||
// Load image data from memory
|
||||
let cover = load_image(EGG_COVER)?;
|
||||
let mut patterns = vec![];
|
||||
for pattern in EGG_PATTERNS {
|
||||
patterns.push(load_image(pattern)?);
|
||||
}
|
||||
|
||||
// Prepare egg image
|
||||
let mut image =
|
||||
RgbaImage::from_pixel(cover.width(), cover.height(), color::to_image_color(WHITE));
|
||||
|
||||
// Draw patterns onto egg
|
||||
let mut last_idx = None;
|
||||
let mut y = rand::thread_rng().gen_range(-100_i64..0);
|
||||
while y < image.height().into() {
|
||||
let idx = loop {
|
||||
let idx = rand::thread_rng().gen_range(0..patterns.len());
|
||||
if Some(idx) != last_idx {
|
||||
break idx;
|
||||
}
|
||||
};
|
||||
|
||||
let paint = &patterns[idx];
|
||||
imageops::overlay(&mut image, paint, 0, y);
|
||||
y += <_ as Into<i64>>::into(paint.height());
|
||||
last_idx = Some(idx);
|
||||
}
|
||||
|
||||
// Finally, draw the cover
|
||||
imageops::overlay(&mut image, &cover, 0, 0);
|
||||
|
||||
let mut tree = Tree::<Context>::new(WHITE);
|
||||
|
||||
let image = Image::new(image)
|
||||
.with_grow(false)
|
||||
.with_shrink(false)
|
||||
.node()
|
||||
.register(&mut tree)?;
|
||||
|
||||
let text = Text::new()
|
||||
.with_metrics(Text::default_metrics().scale(2.0))
|
||||
.and_plain("Frohe Ostern!")
|
||||
.widget(&mut ctx.font_stuff)
|
||||
.node()
|
||||
.register(&mut tree)?;
|
||||
|
||||
let root = Node::empty()
|
||||
.with_size_width(percent(1.0))
|
||||
.with_display(Display::Flex)
|
||||
.with_flex_direction(FlexDirection::Column)
|
||||
.with_align_items(Some(AlignItems::Center))
|
||||
.and_child(image)
|
||||
.and_child(text)
|
||||
.register(&mut tree)?;
|
||||
|
||||
printer.print_tree(&mut tree, ctx, root)?;
|
||||
printer.feed()?;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue