Skip to content

Commit f930d9c

Browse files
Merge pull request #2670 from nikolas-sapa/perf/gpui-fast-thumbnail-fit
perf(desktop-gpui): fast row blit for opaque picker thumbnails
2 parents 0bc36e0 + 8ba8f91 commit f930d9c

1 file changed

Lines changed: 17 additions & 3 deletions

File tree

‎apps/desktop-gpui/kernels/src/thumbnail.rs‎

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,26 @@ pub fn fit_centered(image: &RgbaImage, target_width: u32, target_height: u32) ->
3535
))
3636
};
3737

38-
let mut canvas = RgbaImage::from_pixel(target_width, target_height, image::Rgba([0, 0, 0, 0]));
39-
4038
let offset_x = (target_width - scaled_width) / 2;
4139
let offset_y = (target_height - scaled_height) / 2;
4240

43-
image::imageops::overlay(&mut canvas, &*resized, offset_x as i64, offset_y as i64);
41+
let mut canvas = RgbaImage::from_pixel(target_width, target_height, image::Rgba([0, 0, 0, 0]));
42+
43+
let target_stride = target_width as usize * 4;
44+
let row_bytes = scaled_width as usize * 4;
45+
let canvas_raw = canvas.as_mut();
46+
let resized_raw = resized.as_raw();
47+
48+
if crate::screenshot::is_opaque(resized_raw) {
49+
for y in 0..scaled_height as usize {
50+
let canvas_start = (y + offset_y as usize) * target_stride + offset_x as usize * 4;
51+
let resized_start = y * row_bytes;
52+
canvas_raw[canvas_start..canvas_start + row_bytes]
53+
.copy_from_slice(&resized_raw[resized_start..resized_start + row_bytes]);
54+
}
55+
} else {
56+
image::imageops::overlay(&mut canvas, &*resized, offset_x as i64, offset_y as i64);
57+
}
4458

4559
canvas
4660
}

0 commit comments

Comments
 (0)