summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2021-03-26 17:19:27 +0000
committerMoonchild <moonchild@palemoon.org>2021-03-26 17:19:27 +0000
commitb969ea3b9ced3eac51cd94c3390742ab57a4e520 (patch)
tree29b84a9d4dabb6383ee00ea861aa486914406d09
parent698b235b286f9e9d1121cd6d7c322772ce9babb9 (diff)
downloaduxp-b969ea3b9ced3eac51cd94c3390742ab57a4e520.tar.gz
Issue #1754 - Fix clip path overflow.
Resolves #1754.
-rw-r--r--layout/reftests/svg/svg-integration/clip-path/clip-path-circle-021-ref.html16
-rw-r--r--layout/reftests/svg/svg-integration/clip-path/clip-path-circle-021.html20
-rw-r--r--layout/reftests/svg/svg-integration/clip-path/reftest.list1
-rw-r--r--layout/svg/nsCSSClipPathInstance.cpp10
4 files changed, 44 insertions, 3 deletions
diff --git a/layout/reftests/svg/svg-integration/clip-path/clip-path-circle-021-ref.html b/layout/reftests/svg/svg-integration/clip-path/clip-path-circle-021-ref.html
new file mode 100644
index 0000000000..c87ded532f
--- /dev/null
+++ b/layout/reftests/svg/svg-integration/clip-path/clip-path-circle-021-ref.html
@@ -0,0 +1,16 @@
+<!--
+ Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<!DOCTYPE html>
+<html>
+<head>
+ <title>CSS Masking: Test clip-path property and circle function on circle 021</title>
+ <link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="http://www.mozilla.org/">
+</head>
+<body>
+ <p>The test passes if there is a green circle.</p>
+ <div style="width: 600px; height: 600px; background-color: green; clip-path: circle();"></div>
+</body>
+</html>
diff --git a/layout/reftests/svg/svg-integration/clip-path/clip-path-circle-021.html b/layout/reftests/svg/svg-integration/clip-path/clip-path-circle-021.html
new file mode 100644
index 0000000000..a9229e6ea7
--- /dev/null
+++ b/layout/reftests/svg/svg-integration/clip-path/clip-path-circle-021.html
@@ -0,0 +1,20 @@
+<!--
+ Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<!DOCTYPE html>
+<html>
+<head>
+ <title>CSS Masking: Test clip-path property and circle function on circle 021</title>
+ <link rel="author" title="Ting-Yu Lin" href="mailto:tlin@mozilla.com">
+ <link rel="author" title="Mozilla" href="http://www.mozilla.org/">
+ <link rel="help" href="http://www.w3.org/TR/css-masking-1/#clipping-paths">
+ <link rel="help" href="http://www.w3.org/TR/css-masking-1/#propdef-clip-path">
+ <link rel="match" href="clip-path-circle-021-ref.html">
+ <meta name="assert" content="The clip-path property takes the basic shape circle() with large reference box and percentage radius.">
+</head>
+<body>
+ <p>The test passes if there is a green circle.</p>
+ <div style="width: 600px; height: 600px; background-color: green; clip-path: circle(50%);"></div>
+</body>
+</html>
diff --git a/layout/reftests/svg/svg-integration/clip-path/reftest.list b/layout/reftests/svg/svg-integration/clip-path/reftest.list
index fbc0f37f79..a54e8cbf71 100644
--- a/layout/reftests/svg/svg-integration/clip-path/reftest.list
+++ b/layout/reftests/svg/svg-integration/clip-path/reftest.list
@@ -38,6 +38,7 @@ default-preferences pref(layout.css.clip-path-shapes.enabled,true)
== clip-path-circle-018.html clip-path-circle-010-ref.html
== clip-path-circle-019.html clip-path-circle-002-ref.html
== clip-path-circle-020.html clip-path-circle-002-ref.html
+== clip-path-circle-021.html clip-path-circle-021-ref.html
== clip-path-ellipse-001.html clip-path-ellipse-001-ref.html
== clip-path-ellipse-002.html clip-path-ellipse-001-ref.html
diff --git a/layout/svg/nsCSSClipPathInstance.cpp b/layout/svg/nsCSSClipPathInstance.cpp
index e923eaa0e7..ac522c91fa 100644
--- a/layout/svg/nsCSSClipPathInstance.cpp
+++ b/layout/svg/nsCSSClipPathInstance.cpp
@@ -12,6 +12,7 @@
#include "mozilla/gfx/PathHelpers.h"
#include "nsCSSRendering.h"
#include "nsIFrame.h"
+#include "nsMathUtils.h"
#include "nsRenderingContext.h"
#include "nsRuleNode.h"
@@ -135,8 +136,6 @@ nsCSSClipPathInstance::CreateClipPathCircle(DrawTarget* aDrawTarget,
const nsTArray<nsStyleCoord>& coords = basicShape->Coordinates();
MOZ_ASSERT(coords.Length() == 1, "wrong number of arguments");
- float referenceLength = sqrt((aRefBox.width * aRefBox.width +
- aRefBox.height * aRefBox.height) / 2.0);
nscoord r = 0;
if (coords[0].GetUnit() == eStyleUnit_Enumerated) {
nscoord horizontal, vertical;
@@ -150,7 +149,12 @@ nsCSSClipPathInstance::CreateClipPathCircle(DrawTarget* aDrawTarget,
r = horizontal < vertical ? horizontal : vertical;
}
} else {
- r = nsRuleNode::ComputeCoordPercentCalc(coords[0], referenceLength);
+ // We resolve percent <shape-radius> value for circle() as defined here:
+ // https://drafts.csswg.org/css-shapes/#funcdef-circle
+ const double sqrt2 = std::sqrt(2.0);
+ double referenceLength = NS_hypot(aRefBox.width, aRefBox.height) / sqrt2;
+ r = nsRuleNode::ComputeCoordPercentCalc(coords[0],
+ NSToCoordRound(referenceLength));
}
nscoord appUnitsPerDevPixel =