Generalize make_png and use it in /gen/4
authorMegaBrutal <code+git@megabrutal.com>
Fri, 23 Dec 2022 00:45:00 +0000 (01:45 +0100)
committerMegaBrutal <code+git@megabrutal.com>
Fri, 23 Dec 2022 00:45:00 +0000 (01:45 +0100)
src/main.rs

index 4b461b704ba952c742b5a7b9640b3275256fcd77..f6216842de50c5e12f24227466d1184fd2125606 100644 (file)
@@ -261,13 +261,15 @@ fn apply_to_canvas<'a, F>(f: F, canvas_option: &'a mut Option<Canvas>, dimension
     Ok(canvas_option.insert(f(canvas, percent_decode_str(data).into_iter().borrow_mut())?))
 }
 
-fn make_png(dim_x: u32, dim_y: u32, scale: u32, data: &mut dyn Iterator<Item = u8>) -> Result<Cursor<Vec<u8>>, ImageError> {
+fn make_png<F>(dim_x: u32, dim_y: u32, scale: u32, data: &mut dyn Iterator<Item = u8>, encode: F) -> Result<Cursor<Vec<u8>>, ImageError>
+    where F: Fn(RgbImage, &mut dyn Iterator<Item = u8>) -> Result<RgbImage, ImageError>
+{
     // Image must not be larger than 1 megapixel
     if dim_x * dim_y * scale > 1048576 {
         return Err(ImageError::dimension_error())
     }
 
-    let img: RgbImage = rgb_encode(ImageBuffer::new(dim_x, dim_y), data)?;
+    let img: RgbImage = encode(ImageBuffer::new(dim_x, dim_y), data)?;
     let cursor = image_to_cursor(img, scale)?;
     Ok(cursor)
 }
@@ -291,7 +293,7 @@ fn image_to_cursor(img: RgbImage, scale: u32) -> Result<Cursor<Vec<u8>>, ImageEr
 #[get("/gen/0/{data}")]
 async fn img_gen0(req: HttpRequest) -> Result<impl Responder> {
     let data = extract_data!(req, 3);
-    let cursor = make_png(32, 32, 16, percent_decode_str(data).into_iter().borrow_mut())?;
+    let cursor = make_png(32, 32, 16, percent_decode_str(data).into_iter().borrow_mut(), rgb_encode)?;
     Ok(response_image!(cursor))
 }
 
@@ -299,7 +301,7 @@ async fn img_gen0(req: HttpRequest) -> Result<impl Responder> {
 async fn img_gen1(req: HttpRequest, path: web::Path<(u32, u32, u32)>) -> Result<impl Responder> {
     let (dim_x, dim_y, scale) = path.into_inner();
     let data = extract_data!(req, 6);
-    let cursor = make_png(dim_x, dim_y, scale, percent_decode_str(data).into_iter().borrow_mut())?;
+    let cursor = make_png(dim_x, dim_y, scale, percent_decode_str(data).into_iter().borrow_mut(), rgb_encode)?;
     Ok(response_image!(cursor))
 }
 
@@ -307,7 +309,7 @@ async fn img_gen1(req: HttpRequest, path: web::Path<(u32, u32, u32)>) -> Result<
 async fn img_gen2(req: HttpRequest, path: web::Path<(u32, u32, u32)>) -> Result<impl Responder> {
     let (dim_x, dim_y, scale) = path.into_inner();
     let data = extract_header!(req, "user-agent");
-    let cursor = make_png(dim_x, dim_y, scale, &mut data.bytes())?;
+    let cursor = make_png(dim_x, dim_y, scale, &mut data.bytes(), rgb_encode)?;
     Ok(response_image!(cursor))
 }
 
@@ -334,8 +336,8 @@ async fn img_gen4(req: HttpRequest, path: web::Path<(u32, u32, u32, u32, u32, f3
     let wave_color = ToRgbIter::new(&mut percent_decode_str(wave_color)).next().unwrap_or(Rgb([255, 255, 255]));
     debug!("Decoded color: {:?}", wave_color);
     let signal = &mut percent_decode_str(extract_data!(req, 12));
-    let resimg = sine_encode(ImageBuffer::new(dim_x, dim_y), (wave_offset_x, wave_offset_y), amplitude, freq_base, run, wave_color, signal)?;
-    let cursor = image_to_cursor(resimg, scale)?;
+    let cursor = make_png(dim_x, dim_y, scale, signal,
+        |img, signal| sine_encode(img, (wave_offset_x, wave_offset_y), amplitude, freq_base, run, wave_color, signal))?;
     Ok(response_image!(cursor))
 }