Print random easter egg

This commit is contained in:
Joscha 2024-03-30 16:28:30 +01:00
parent b293408cbc
commit a9ba160c13
15 changed files with 106 additions and 3 deletions

View 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(())
}
}