Use IpcSharedMemory for Canvas2dMsg::DrawImage (#30544)

* Use `IpcSharedMemory` for `Canvas2DMsg::DrawImage`

* Fix `Canvas2dMsg::DrawEmptyImage` crashes

* Do not premultiply canvas image data

* Move `image_data` back to its original position
This commit is contained in:
Ennui Langeweile 2023-10-18 10:39:58 -03:00 committed by GitHub
parent 66258bfbbd
commit 2d7dfb06c0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 37 additions and 25 deletions

View file

@ -175,22 +175,27 @@ impl<'a> CanvasPaintThread<'a> {
.canvas(canvas_id)
.is_point_in_path(x, y, fill_rule, chan),
Canvas2dMsg::DrawImage(
imagedata,
ref image_data,
image_size,
dest_rect,
source_rect,
smoothing_enabled,
) => {
let data = imagedata.map_or_else(
|| vec![0; image_size.width as usize * image_size.height as usize * 4],
|bytes| bytes.into_vec(),
);
) => self.canvas(canvas_id).draw_image(
&*image_data,
image_size,
dest_rect,
source_rect,
smoothing_enabled,
true,
),
Canvas2dMsg::DrawEmptyImage(image_size, dest_rect, source_rect) => {
self.canvas(canvas_id).draw_image(
data,
&vec![0; image_size.area() as usize * 4],
image_size,
dest_rect,
source_rect,
smoothing_enabled,
false,
false,
)
},
Canvas2dMsg::DrawImageInOther(
@ -204,11 +209,12 @@ impl<'a> CanvasPaintThread<'a> {
.canvas(canvas_id)
.read_pixels(source_rect.to_u64(), image_size.to_u64());
self.canvas(other_canvas_id).draw_image(
image_data.into(),
&image_data,
source_rect.size,
dest_rect,
source_rect,
smoothing,
false,
);
},
Canvas2dMsg::MoveTo(ref point) => self.canvas(canvas_id).move_to(point),