From d2f9ba7db1d8dd1dd611e6a3f40b9125b5aa054d Mon Sep 17 00:00:00 2001 From: circl Date: Fri, 14 Jun 2024 15:04:14 +0200 Subject: [PATCH] Revert "LibWeb: Use memcpy() in CanvasRenderingContext2D.getImageData()" This reverts commit 59cb7994c676a79c70c3b37c93b424d58b591769. This change caused a bug where getImageData returned the image in BGRA8888 format instead of RGBA8888. --- .../Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp b/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp index 93867a6b488..fd876d9b1a2 100644 --- a/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp +++ b/Userland/Libraries/LibWeb/HTML/CanvasRenderingContext2D.cpp @@ -360,9 +360,10 @@ WebIDL::ExceptionOr> CanvasRenderingContext2D::get_image_da // 6. Set the pixel values of imageData to be the pixels of this's output bitmap in the area specified by the source rectangle in the bitmap's coordinate space units, converted from this's color space to imageData's colorSpace using 'relative-colorimetric' rendering intent. // FIXME: Can't use a Gfx::Painter + blit() here as it doesn't support ImageData bitmap's RGBA8888 format. for (int target_y = 0; target_y < source_rect_intersected.height(); ++target_y) { - auto* dst = image_data->bitmap().scanline(target_y); - auto const* src = bitmap.scanline(target_y + y) + x; - memcpy(dst, src, source_rect_intersected.width() * sizeof(Gfx::ARGB32)); + for (int target_x = 0; target_x < source_rect_intersected.width(); ++target_x) { + auto pixel = bitmap.get_pixel(target_x + x, target_y + y); + image_data->bitmap().set_pixel(target_x, target_y, pixel); + } } // 7. Set the pixels values of imageData for areas of the source rectangle that are outside of the output bitmap to transparent black.