From a9ba160c130ee883ea631582e2be7467a43bcb4b Mon Sep 17 00:00:00 2001 From: Joscha Date: Sat, 30 Mar 2024 16:28:30 +0100 Subject: [PATCH] Print random easter egg --- Cargo.lock | 1 + showbits-assets/data/egg.xcf | Bin 0 -> 37264 bytes showbits-assets/data/egg_cover.png | Bin 0 -> 3394 bytes showbits-assets/data/egg_pattern_0.png | Bin 0 -> 673 bytes showbits-assets/data/egg_pattern_1.png | Bin 0 -> 1960 bytes showbits-assets/data/egg_pattern_2.png | Bin 0 -> 1602 bytes showbits-assets/data/egg_pattern_3.png | Bin 0 -> 1255 bytes showbits-assets/data/egg_pattern_4.png | Bin 0 -> 694 bytes showbits-assets/data/egg_pattern_5.png | Bin 0 -> 901 bytes showbits-assets/data/egg_pattern_6.png | Bin 0 -> 1624 bytes showbits-assets/src/lib.rs | 11 +++ showbits-thermal-printer/Cargo.toml | 1 + showbits-thermal-printer/src/drawer.rs | 3 +- showbits-thermal-printer/src/drawer/egg.rs | 82 +++++++++++++++++++++ showbits-thermal-printer/src/server.rs | 11 ++- 15 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 showbits-assets/data/egg.xcf create mode 100644 showbits-assets/data/egg_cover.png create mode 100644 showbits-assets/data/egg_pattern_0.png create mode 100644 showbits-assets/data/egg_pattern_1.png create mode 100644 showbits-assets/data/egg_pattern_2.png create mode 100644 showbits-assets/data/egg_pattern_3.png create mode 100644 showbits-assets/data/egg_pattern_4.png create mode 100644 showbits-assets/data/egg_pattern_5.png create mode 100644 showbits-assets/data/egg_pattern_6.png create mode 100644 showbits-thermal-printer/src/drawer/egg.rs diff --git a/Cargo.lock b/Cargo.lock index 0a3029b..118bf97 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1388,6 +1388,7 @@ dependencies = [ "rand", "rust-embed", "serde", + "showbits-assets", "showbits-common", "taffy", "time", diff --git a/showbits-assets/data/egg.xcf b/showbits-assets/data/egg.xcf new file mode 100644 index 0000000000000000000000000000000000000000..5b617452806091d0fe7830efe136f23f2acf0174 GIT binary patch literal 37264 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 literal 0 HcmV?d00001 diff --git a/showbits-assets/data/egg_cover.png b/showbits-assets/data/egg_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..5169947cdb3dda93d918ceec31fb3727c6d6f0ac GIT binary patch literal 3394 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 S=U)Z}1_n=8KbLh*2~7aIjn~`& literal 0 HcmV?d00001 diff --git a/showbits-assets/data/egg_pattern_0.png b/showbits-assets/data/egg_pattern_0.png new file mode 100644 index 0000000000000000000000000000000000000000..d73318ef66fdd9a9032d34fb6a4d20d1ef150eb3 GIT binary patch literal 673 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 HDWM4f5{7w+ literal 0 HcmV?d00001 diff --git a/showbits-assets/data/egg_pattern_2.png b/showbits-assets/data/egg_pattern_2.png new file mode 100644 index 0000000000000000000000000000000000000000..941ac33db06fb57bfc689d863b5bf331b721eac3 GIT binary patch literal 1602 zcmeAS@N?(olHy`uVBq!ia0y~yU~FJuU~uPPV_;z5i=DvEz`)p?>FgZf>FlgfP?VpR znUl)EpfRy_qOHea2brVsm%Egv@|6h)o(!1#W|30gRxZ~S0$HtLvOao$o78wcySf)Y zh${Gyyz$k8M{8C$uU6owYp}4k(A?$G`QMvMH_680-SOSk{kzK>F03&+%caWTyZx+> zmgcihtCQYqH%Yj%FgY1*?y>arI$U0JSNXv8-4^FR*?)g75x_0R%%oJWdOdWmn|v{KMt_;`r# z@*2hG8&6esZw_0#`J3%e?!&CLsWV@jxKB8wG)=*=rO8Tb#UZyjVRJ>eC2#rv`q3V{ z-$k!AM%184X8{}Urq}HMoA2L^I=a$RUvmyiRh-Q8WS$pyS)+K5|FkQcbB$A=hHc%K zzWvu&((FC+OSaq)6u8Nzx6XRjCia+j49@;-Ij7c%EYTF{KJZ(zHdsz#59_b%d+y!( zZBfgx=}PD?HVX@uW8PEtzWe-c-@AMNY%jli&#o$3)Na|iUWNX4zUcW>uCQ4nywxa{fw|4-*F z_Xsrcyu~+T*P6dpi~AZ^6>IQR?1@`{otfc6-*P<$1~vwU1d!XnRD+ew=DLiYkB|4? z&S7C-<$YlOvHtsi15Sn={r38ddzIf<*Ksp!xWEv`VJ6Jb@PKVY(2C;{Jq!$D#V=(K z#6Ge)#_==mLC){Jw;2Q`7Jk!PAZz^DgQ;rkU!MhzMxDGNW({*s8wpN&vi|M#7cTKR z3PQ*4Hr}(mXg_UBPN%5w{iAFG>zFze{#j2>4*$KF`%q8aNv*2YNllyzA*>0{?6>`U zyQ0Zpb-d9$h3(F~p#|arA6)u1%*yS8mwdZDucu7(z^R}xBg3OQQv<%QJ#YN`kWu(Y zt^*9$=diwy<9q#S`{J3$_t~rW z9c$NVNgR^ni#1SxP%r$m{QH05`V!glbVUh=mksB0n359jEm3ghc@y(1iRpWy^oz48 z+<9%KxjmgTW@M)`#InE3*(BVti|I)%zfs{Dj(L8M!gj6=Z+YNTA0jNZ?B4AkMt%Q_ z!`;I?>Nx*@|JNPHTe|RzkR;QzTdX^`|s3UTq+;e$F`=*-+%s!&+2pZOnuMangSjB zXWAEiJ-)kgx~+Y`r0i4Wi`h(jntz0gdM=w^JZJrv+Gp=;WOiHWzIrfwYpj34btQrS z>!x1#e@xeTcPy)*3FF*NJ-7AaZ@;{~ZSPTgV>?dC4MHbuxNDXRtx(|7zV+aMatOm& z?Z#K}Q#RQIt$y@--K&@X;taZfu4G^eWtz%z?oIzo;d;@ACq6P?CeF+Jx_QNqBX`zx zX$bQy*!Ux*a@#5;&p+9n^==XeIv>OcE|6@hdu}ZBU+%o5*xy>A%(-?UJ;n?!o@-Vtw5aC2X>q+~ z`(#5i2?i&X=>{g}uKFrG`OU}HaQCDt%j^E~XSws1u8wA7XsG-u{Qvl2vjB#(JBqc7 zzx*_1W;nnib@rDe1B2QIk0r)ySMBDLa>y2b@#ig*CG=H)$Gz-5YzEMn+a literal 0 HcmV?d00001 diff --git a/showbits-assets/data/egg_pattern_3.png b/showbits-assets/data/egg_pattern_3.png new file mode 100644 index 0000000000000000000000000000000000000000..cc75e5359094ea6b39ce5ead047ef31dd94d73a3 GIT binary patch literal 1255 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 anyhow::Result { + 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>::into(paint.height()); + last_idx = Some(idx); + } + + // Finally, draw the cover + imageops::overlay(&mut image, &cover, 0, 0); + + let mut tree = Tree::::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(()) + } +} diff --git a/showbits-thermal-printer/src/server.rs b/showbits-thermal-printer/src/server.rs index 79318d9..dfe1777 100644 --- a/showbits-thermal-printer/src/server.rs +++ b/showbits-thermal-printer/src/server.rs @@ -13,8 +13,8 @@ use serde::Deserialize; use tokio::{net::TcpListener, sync::mpsc}; use crate::drawer::{ - CalendarDrawing, CellsDrawing, ChatMessageDrawing, Command, ImageDrawing, PhotoDrawing, - TextDrawing, + CalendarDrawing, CellsDrawing, ChatMessageDrawing, Command, EggDrawing, ImageDrawing, + PhotoDrawing, TextDrawing, }; use self::{r#static::get_static_file, statuscode::status_code}; @@ -29,6 +29,7 @@ pub async fn run(tx: mpsc::Sender, addr: String) -> anyhow::Result<()> .route("/calendar", post(post_calendar)) .route("/cells", post(post_cells)) .route("/chat_message", post(post_chat_message)) + .route("/egg", post(post_egg)) .route("/image", post(post_image).fallback(get_static_file)) .route("/photo", post(post_photo).fallback(get_static_file)) .route("/text", post(post_text)) @@ -97,6 +98,12 @@ async fn post_chat_message(server: State, request: Form) { + let _ = server.tx.send(Command::draw(EggDrawing)).await; +} + // /image async fn post_image(server: State, mut multipart: Multipart) -> somehow::Result {