1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
/* //// fn make_image( &mut self, width: usize, height: usize, buf: &[u8], format: ImageFormat, ) -> Result<Self::Image, Error> { let embedded_graphics_fmt = match format { ImageFormat::Rgb => Format::Rgb24, ImageFormat::RgbaSeparate | ImageFormat::RgbaPremul => Format::ARgb32, _ => return Err(new_error(ErrorKind::NotSupported)), }; let mut image = ImageSurface::create(embedded_graphics_fmt, width as i32, height as i32).wrap()?; // Confident no borrow errors because we just created it. let bytes_per_pixel = format.bytes_per_pixel(); let bytes_per_row = width * bytes_per_pixel; let stride = image.get_stride() as usize; { let mut data = image.get_data().wrap()?; for y in 0..height { let src_off = y * bytes_per_row; let dst_off = y * stride; match format { ImageFormat::Rgb => { for x in 0..width { data[dst_off + x * 4 + 0] = buf[src_off + x * 3 + 2]; data[dst_off + x * 4 + 1] = buf[src_off + x * 3 + 1]; data[dst_off + x * 4 + 2] = buf[src_off + x * 3 + 0]; } } ImageFormat::RgbaPremul => { // It's annoying that Embed exposes only ARGB. Ah well. Let's // hope that LLVM generates pretty good code for this. // TODO: consider adding BgraPremul format. for x in 0..width { data[dst_off + x * 4 + 0] = buf[src_off + x * 4 + 2]; data[dst_off + x * 4 + 1] = buf[src_off + x * 4 + 1]; data[dst_off + x * 4 + 2] = buf[src_off + x * 4 + 0]; data[dst_off + x * 4 + 3] = buf[src_off + x * 4 + 3]; } } ImageFormat::RgbaSeparate => { fn premul(x: u8, a: u8) -> u8 { let y = (x as u16) * (a as u16); ((y + (y >> 8) + 0x80) >> 8) as u8 } for x in 0..width { let a = buf[src_off + x * 4 + 3]; data[dst_off + x * 4 + 0] = premul(buf[src_off + x * 4 + 2], a); data[dst_off + x * 4 + 1] = premul(buf[src_off + x * 4 + 1], a); data[dst_off + x * 4 + 2] = premul(buf[src_off + x * 4 + 0], a); data[dst_off + x * 4 + 3] = a; } } _ => return Err(new_error(ErrorKind::NotSupported)), } } } Ok(image) } fn draw_image( &mut self, image: &Self::Image, rect: impl Into<Rect>, interp: InterpolationMode, ) { let _ = self.with_save(|rc| { let surface_pattern = SurfacePattern::create(image); let filter = match interp { InterpolationMode::NearestNeighbor => Filter::Nearest, InterpolationMode::Bilinear => Filter::Bilinear, }; surface_pattern.set_filter(filter); let rect = rect.into(); rc.ctx.translate(rect.x0, rect.y0); rc.ctx.scale( rect.width() / (image.get_width() as f64), rect.height() / (image.get_height() as f64), ); rc.ctx.set_source(&surface_pattern); rc.ctx.paint(); Ok(()) }); } */ ////