diff options
author | Moonchild <moonchild@palemoon.org> | 2021-03-26 17:19:27 +0000 |
---|---|---|
committer | Moonchild <moonchild@palemoon.org> | 2021-03-26 17:19:27 +0000 |
commit | b969ea3b9ced3eac51cd94c3390742ab57a4e520 (patch) | |
tree | 29b84a9d4dabb6383ee00ea861aa486914406d09 /layout | |
parent | 698b235b286f9e9d1121cd6d7c322772ce9babb9 (diff) | |
download | uxp-b969ea3b9ced3eac51cd94c3390742ab57a4e520.tar.gz |
Issue #1754 - Fix clip path overflow.
Resolves #1754.
Diffstat (limited to 'layout')
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 = |