+#[get("/pgen/1/{dim_x}/{dim_y}/{scale}/{data}")]
+async fn img_pgen1(req: HttpRequest, path: web::Path<(u32, u32, u32)>, canvas1: web::Data<Arc<Mutex<Option<Canvas>>>>) -> Result<impl Responder> {
+ let (dim_x, dim_y, scale) = path.into_inner();
+ let data = req.uri().path().split("/").skip(6).next().unwrap();
+ let img: RgbImage = {
+ let canvas_option = &mut *canvas1.lock().unwrap();
+ let canvas = canvas_option.take().unwrap_or_else( || Canvas::new(dim_x, dim_y) );
+ if (dim_x, dim_y) == canvas.img.dimensions() {
+ let canvas = rgb_encode_to_canvas(canvas, percent_decode_str(&data).into_iter().borrow_mut())?;
+ canvas_option.insert(canvas).img.clone()
+ }
+ else {
+ canvas_option.insert(canvas);
+ drop(canvas_option);
+ return Err(CanvasError::DimensionMismatch)?
+ }
+ };
+ let (tdim_x, tdim_y) = img.dimensions();
+ let (tdim_x, tdim_y) = (tdim_x * scale, tdim_y * scale);
+ let img = resize(&img, tdim_x, tdim_y, FilterType::Nearest);
+ let mut cursor = Cursor::new(Vec::new());
+ to_imageresult(write_buffer_with_format(&mut cursor, &img, tdim_x, tdim_y, ColorType::Rgb8, Png))?;
+ Ok(HttpResponse::build(StatusCode::OK)
+ .content_type("image/png")
+ .body(cursor.into_inner()))
+}
+
+