diff --git a/components/canvas/canvas_data.rs b/components/canvas/canvas_data.rs index db59419f345..dcacddae8b1 100644 --- a/components/canvas/canvas_data.rs +++ b/components/canvas/canvas_data.rs @@ -458,11 +458,7 @@ impl<'a> CanvasData<'a> { canvas_size: Size2D, chan: IpcSender, ) { - let mut dest_data = self.read_pixels(dest_rect, canvas_size); - - // bgra -> rgba - byte_swap(&mut dest_data); - chan.send(dest_data.into()).unwrap(); + chan.send(self.read_pixels(dest_rect, canvas_size).into()).unwrap(); } // https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index 67cbceab896..e362fe40a05 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -1115,12 +1115,12 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { self.send_canvas_2d_msg(Canvas2dMsg::GetImageData(dest_rect, canvas_size, sender)); let mut data = receiver.recv().unwrap(); - // Un-premultiply alpha + // Byte swap and unmultiply alpha. for chunk in data.chunks_mut(4) { - let alpha = chunk[3] as usize; - chunk[0] = UNPREMULTIPLY_TABLE[256 * alpha + chunk[0] as usize]; - chunk[1] = UNPREMULTIPLY_TABLE[256 * alpha + chunk[1] as usize]; - chunk[2] = UNPREMULTIPLY_TABLE[256 * alpha + chunk[2] as usize]; + let (b, g, r, a) = (chunk[0], chunk[1], chunk[2], chunk[3]); + chunk[0] = UNPREMULTIPLY_TABLE[256 * (a as usize) + r as usize]; + chunk[1] = UNPREMULTIPLY_TABLE[256 * (a as usize) + g as usize]; + chunk[2] = UNPREMULTIPLY_TABLE[256 * (a as usize) + b as usize]; } ImageData::new(&self.global(), sw, sh, Some(data.to_vec()))