LibWeb: Ensure drawImage() always uses the first image frame

This commit is contained in:
Tim Ledbetter 2025-10-21 21:29:43 +01:00 committed by Jelle Raaijmakers
parent 2c78fd5b89
commit f1571c4217
4 changed files with 44 additions and 2 deletions

View File

@ -136,10 +136,14 @@ WebIDL::ExceptionOr<void> CanvasRenderingContext2D::draw_image_internal(CanvasIm
auto bitmap = image.visit(
[](GC::Root<HTMLImageElement> const& source) -> RefPtr<Gfx::ImmutableBitmap> {
return source->immutable_bitmap();
auto width = source->intrinsic_width().value_or({}).to_int();
auto height = source->intrinsic_height().value_or({}).to_int();
return source->default_image_bitmap_sized({ width, height });
},
[](GC::Root<SVG::SVGImageElement> const& source) -> RefPtr<Gfx::ImmutableBitmap> {
return source->current_image_bitmap();
auto width = source->intrinsic_width().value_or({}).to_int();
auto height = source->intrinsic_height().value_or({}).to_int();
return source->default_image_bitmap_sized({ width, height });
},
[](GC::Root<OffscreenCanvas> const& source) -> RefPtr<Gfx::ImmutableBitmap> { return Gfx::ImmutableBitmap::create(*source->bitmap()); },
[](GC::Root<HTMLCanvasElement> const& source) -> RefPtr<Gfx::ImmutableBitmap> {

View File

@ -0,0 +1,6 @@
Harness status: OK
Found 1 tests
1 Pass
Pass drawImage() of an animated GIF draws the first frame

View File

@ -0,0 +1,32 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
<meta charset="UTF-8">
<title>Canvas test: 2d.drawImage.animated.gif</title>
<script src="../../../../resources/testharness.js"></script>
<script src="../../../../resources/testharnessreport.js"></script>
<script src="../../../../html/canvas/resources/canvas-tests.js"></script>
<link rel="stylesheet" href="../../../../html/canvas/resources/canvas-tests.css">
<body class="show_output">
<h1>2d.drawImage.animated.gif</h1>
<p class="desc">drawImage() of an animated GIF draws the first frame</p>
<p class="output">Actual output:</p>
<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
<p class="output expectedtext">Expected output:<p><img src="../../../../images/green-100x50.png" class="output expected" id="expected" alt="">
<ul id="d"></ul>
<script>
var t = async_test("drawImage() of an animated GIF draws the first frame");
_addTest(function(canvas, ctx) {
deferTest();
step_timeout(t.step_func_done(function () {
ctx.drawImage(document.getElementById('anim-gr.gif'), 0, 0);
_assertPixelApprox(canvas, 50,25, 0,255,0,255, 2);
}), 500);
});
</script>
<img src="../../../../images/anim-gr.gif" id="anim-gr.gif" class="resource">

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 B