From e44a97e5085659c78952b4accd678681e85e3bae Mon Sep 17 00:00:00 2001 From: Psychpsyo Date: Mon, 10 Nov 2025 15:05:11 +0100 Subject: [PATCH] LibWeb: Pass 3D transforms to Skia --- .../LibWeb/Painting/DisplayListPlayerSkia.cpp | 40 +++++++++++++------ .../transform3d-rotatex-ref.html | 13 ++++++ .../transform3d-rotatex-perspective-001.html | 19 +++++++++ 3 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 Tests/LibWeb/Ref/expected/wpt-import/css/css-transforms/transform3d-rotatex-ref.html create mode 100644 Tests/LibWeb/Ref/input/wpt-import/css/css-transforms/transform3d-rotatex-perspective-001.html diff --git a/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp b/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp index 536d98e151d..3976148c84b 100644 --- a/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp +++ b/Libraries/LibWeb/Painting/DisplayListPlayerSkia.cpp @@ -71,6 +71,26 @@ static SkMatrix to_skia_matrix(Gfx::AffineTransform const& affine_transform) matrix.setAffine(affine); return matrix; } +static SkM44 to_skia_matrix4x4(Gfx::FloatMatrix4x4 const& matrix) +{ + return SkM44( + matrix[0, 0], + matrix[0, 1], + matrix[0, 2], + matrix[0, 3], + matrix[1, 0], + matrix[1, 1], + matrix[1, 2], + matrix[1, 3], + matrix[2, 0], + matrix[2, 1], + matrix[2, 2], + matrix[2, 3], + matrix[3, 0], + matrix[3, 1], + matrix[3, 2], + matrix[3, 3]); +} void DisplayListPlayerSkia::flush() { @@ -204,12 +224,10 @@ void DisplayListPlayerSkia::push_stacking_context(PushStackingContext const& com { auto& canvas = surface().canvas(); - auto affine_transform = Gfx::extract_2d_affine_transform(command.transform.matrix); - auto new_transform = Gfx::AffineTransform {} - .translate(command.transform.origin) - .multiply(affine_transform) - .translate(-command.transform.origin); - auto matrix = to_skia_matrix(new_transform); + auto new_transform = Gfx::translation_matrix(Vector3(command.transform.origin.x(), command.transform.origin.y(), 0)); + new_transform = new_transform * command.transform.matrix; + new_transform = new_transform * Gfx::translation_matrix(Vector3(-command.transform.origin.x(), -command.transform.origin.y(), 0)); + auto matrix = to_skia_matrix4x4(new_transform); surface().canvas().save(); if (command.clip_path.has_value()) @@ -959,12 +977,10 @@ void DisplayListPlayerSkia::apply_filters(ApplyFilter const& command) void DisplayListPlayerSkia::apply_transform(ApplyTransform const& command) { - auto affine_transform = Gfx::extract_2d_affine_transform(command.matrix); - auto new_transform = Gfx::AffineTransform {} - .translate(command.origin) - .multiply(affine_transform) - .translate(-command.origin); - auto matrix = to_skia_matrix(new_transform); + auto new_transform = Gfx::translation_matrix(Vector3(command.origin.x(), command.origin.y(), 0)); + new_transform = new_transform * command.matrix; + new_transform = new_transform * Gfx::translation_matrix(Vector3(-command.origin.x(), -command.origin.y(), 0)); + auto matrix = to_skia_matrix4x4(new_transform); surface().canvas().concat(matrix); } diff --git a/Tests/LibWeb/Ref/expected/wpt-import/css/css-transforms/transform3d-rotatex-ref.html b/Tests/LibWeb/Ref/expected/wpt-import/css/css-transforms/transform3d-rotatex-ref.html new file mode 100644 index 00000000000..ca8789cfdc9 --- /dev/null +++ b/Tests/LibWeb/Ref/expected/wpt-import/css/css-transforms/transform3d-rotatex-ref.html @@ -0,0 +1,13 @@ + + + + CSS Reftest Reference + + + + + +
+ + diff --git a/Tests/LibWeb/Ref/input/wpt-import/css/css-transforms/transform3d-rotatex-perspective-001.html b/Tests/LibWeb/Ref/input/wpt-import/css/css-transforms/transform3d-rotatex-perspective-001.html new file mode 100644 index 00000000000..b1a84949cbb --- /dev/null +++ b/Tests/LibWeb/Ref/input/wpt-import/css/css-transforms/transform3d-rotatex-perspective-001.html @@ -0,0 +1,19 @@ + + + + CSS Test (Transforms): perspective(1000px) rotatex(45deg) + + + + + + + + + +
+ +