From 946ed8d2dbae117d17e31587cf6b152a6a352e5a Mon Sep 17 00:00:00 2001 From: Stephen D <webmaster@scd31.com> Date: Fri, 21 Feb 2025 17:58:53 -0500 Subject: [PATCH] working --- build.rs | 12 +++++++++--- src/assets/cat.png | Bin 737 -> 4514 bytes src/assets/meow.png | Bin 0 -> 4805 bytes src/lib.rs | 31 ++++++++++++++++++++++++++----- 4 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 src/assets/meow.png diff --git a/build.rs b/build.rs index 2e1c2ff..56ecea4 100644 --- a/build.rs +++ b/build.rs @@ -5,10 +5,16 @@ use image::{GenericImageView, ImageReader}; // Example custom build script. fn main() { - println!("cargo::rerun-if-changed=assets/*"); println!("cargo::rerun-if-changed=build.rs"); - let img = ImageReader::open("src/assets/cat.png") + handle_image("cat"); + handle_image("meow"); +} + +fn handle_image(name: &str) { + println!("cargo::rerun-if-changed=src/assets/{name}.png"); + + let img = ImageReader::open(format!("src/assets/{name}.png")) .unwrap() .decode() .unwrap(); @@ -33,6 +39,6 @@ fn main() { let out_dir = env::var("OUT_DIR").unwrap(); - let mut f = File::create(Path::new(&out_dir).join("cat.bin")).unwrap(); + let mut f = File::create(Path::new(&out_dir).join(format!("{name}.bin"))).unwrap(); f.write_all(&out.as_raw_slice()).unwrap(); } diff --git a/src/assets/cat.png b/src/assets/cat.png index dbbbd271807ea0af13e2abc7b871f5a3fe618df8..3a6bea0ee6d2dbd8c938d53795e3e7a7845379a7 100644 GIT binary patch literal 4514 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 UQ2P~AB?gbnS>br`ft`E*3-3e!WdHyG delta 660 zcmV;F0&D%EBjE**8Gix*006Z62_66d0fT8nLr_UWLm+T+Z)Rz1WdHyuk$sUpNW(xJ z#a~mUA{7TKh;+zMo$TNT;;2<9LWNK(wCZ4T=@&F<NK#xJ1=oUuAB$B77iV1^Tm?b! z1H@f$Qgo3L|Cbb6#CUMrk9YSTckck9QDK_ZH4A9EZKjh6F@Kv|6+^EOFo+1o5tW%` z%t=xTzT@j20lwbFd6xgVKS!UMw-^u*iD#K%+Qb{g)0?)zd7n7KO0r6PPCRDP1&JTI zu6X>$x#+UMGb3guJx?4V7K<IMbTBKK8u1iyOx1MC7qT9!oVPe@l^Sc^lfN*W*H@Og zPBV%m7O?~gB7YRrP(}qd;<W0dSV+@;!pA@C`XzEH<SK)aV*yoYkX=9cAN=mtDojpz zN#O+0{o*(uBS2^uXx1I)``B@sCqVESxYFDHY6F=0B)#6&Vn;y#HgIv>)|5Tqat9cC zGGtSBr65hAPypV~=$mrDz%9_b=JnRv$LRx*p{`Olz#73JFj}PSb)R?lboTb|nO1*4 z%nEYK9SMZ{lV=bi2NX6F_7%?{laCN6f6PflK~!ko?byo>gCG!v;U2^Lzw&fp(ikch zVba9IKRXwa@HrPy5%D70u|WV(9+0H5RU}pK4liY!K@ssmk#u~t0-D^_cPc$SN-GNn zXpRHXv&5=R-Yv0<N0SW7?Xr75K3%G`XgW7`;pkCiCyit5o1bzR6k5sMlHbK;VoT}J zmNZ;7=BC(KV+N>h<THKUt;F_ggzJH@D}#R4&Vql}O3(4v;6R)J#J^X@JU{>e1kegV uOU*km-6=7E00IagfB*uB00<y}{vL1Tt5;tjEa}+*0000<MNUMnLSTY>Nh`Pj diff --git a/src/assets/meow.png b/src/assets/meow.png new file mode 100644 index 0000000000000000000000000000000000000000..b2f6a40efaa154c56adf842040100db2784b7486 GIT binary patch literal 4805 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 literal 0 HcmV?d00001 diff --git a/src/lib.rs b/src/lib.rs index f742757..ada07ff 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,7 @@ use bitvec::{order::Msb0, view::BitView}; -const WIDTH: usize = 96; -//const HEIGHT: usize = 38; +const WIDTH: i32 = 96; +const HEIGHT: i32 = 38; #[no_mangle] pub extern "C" fn next_frame(frame: u16, ptr: *mut u8) -> u8 { @@ -12,19 +12,40 @@ pub extern "C" fn next_frame(frame: u16, ptr: *mut u8) -> u8 { } let cat = include_bytes!(concat!(env!("OUT_DIR"), "/cat.bin")).view_bits::<Msb0>(); + let meow = include_bytes!(concat!(env!("OUT_DIR"), "/meow.bin")).view_bits::<Msb0>(); + + let thres = WIDTH / 4; + + let dx = (frame as i32 * 4 - thres).min(thres); for x in 0..96 { for y in 0..38 { let out_idx = index(x, y); - let in_idx = index((x - frame as usize * 4) % WIDTH, y); + let in_idx = index(x - dx, y); out.set(out_idx, cat[in_idx]); } } + if dx == thres && frame / 7 % 2 == 0 { + // make meow flash on and off every 4 frames for the remaining time + + for x in 0..96 { + for y in 0..38 { + let idx = index(x, y); + + out.set(idx, meow[idx] || out[idx]); + } + } + } + 0 } -fn index(x: usize, y: usize) -> usize { - x + y * WIDTH +fn index(x: i32, y: i32) -> usize { + if x < 0 || y < 0 || x >= WIDTH || y >= HEIGHT { + return 0; + } + + x as usize + y as usize * WIDTH as usize } -- GitLab