Skip to content

Commit

Permalink
LibWeb: Make new ImageData() use unpremultiplied color data
Browse files Browse the repository at this point in the history
This was already the case for `context.createImageData()`, but I forgot
to do the same for `new ImageData()`. Add a regression test for both
cases.
  • Loading branch information
gmta committed Aug 20, 2024
1 parent 4a4845a commit 781a9f5
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
PASS
PASS
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<script src="../include.js"></script>
<body><canvas id=c width=1 height=2></div>
<script>
test(() => {
// Test createImageData + putImageData
let ctx1 = c.getContext('2d');
let img1 = ctx1.createImageData(1, 1);
img1.data[0] = 50;
img1.data[1] = 100;
img1.data[2] = 200;
img1.data[3] = 0;
ctx1.putImageData(img1, 0, 0);
let buf1 = ctx1.getImageData(0, 0, 1, 1);
if (buf1.data[0] === 0 && buf1.data[1] === 0 && buf1.data[2] === 0 && buf1.data[3] === 0)
println("PASS");
else
println("FAIL");

// Test new ImageData + putImageData
let ctx2 = c.getContext('2d');
let img2 = new ImageData(new Uint8ClampedArray([50, 100, 200, 0]), 1, 1);
ctx2.putImageData(img2, 0, 0);
let buf2 = ctx2.getImageData(0, 0, 1, 1);
if (buf2.data[0] === 0 && buf2.data[1] === 0 && buf2.data[2] === 0 && buf2.data[3] === 0)
println("PASS");
else
println("FAIL");
});
</script>
2 changes: 1 addition & 1 deletion Userland/Libraries/LibWeb/HTML/ImageData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<ImageData>> ImageData::create(JS::Realm& re
return WebIDL::IndexSizeError::create(realm, "Source height must be equal to the calculated height of the data."_fly_string);

// 7. Initialize this given sw, sh, settings set to settings, and source set to data.
auto bitmap = TRY_OR_THROW_OOM(vm, Gfx::Bitmap::create_wrapper(Gfx::BitmapFormat::RGBA8888, Gfx::AlphaType::Premultiplied, Gfx::IntSize(sw, height), sw * sizeof(u32), uint8_clamped_array_data.data().data()));
auto bitmap = TRY_OR_THROW_OOM(vm, Gfx::Bitmap::create_wrapper(Gfx::BitmapFormat::RGBA8888, Gfx::AlphaType::Unpremultiplied, Gfx::IntSize(sw, height), sw * sizeof(u32), uint8_clamped_array_data.data().data()));

return realm.heap().allocate<ImageData>(realm, realm, bitmap, uint8_clamped_array_data);
}
Expand Down

0 comments on commit 781a9f5

Please sign in to comment.