From 4a60b47050573156be41939a6284eeda7086937a Mon Sep 17 00:00:00 2001 From: Markus Stange Date: Sun, 19 Apr 2015 20:48:37 -0400 Subject: [PATCH] Bug 1156129 - Take border radius into account when calculating the bounds of border display items. r=roc --HG-- extra : rebase_source : 4fdf851e055514fcf1b3a7d894a158ce8b384e6a --- layout/base/nsDisplayList.cpp | 20 +++++++++++ layout/reftests/bugs/1156129-1-ref.html | 36 ++++++++++++++++++++ layout/reftests/bugs/1156129-1.html | 44 +++++++++++++++++++++++++ layout/reftests/bugs/reftest.list | 1 + 4 files changed, 101 insertions(+) create mode 100644 layout/reftests/bugs/1156129-1-ref.html create mode 100644 layout/reftests/bugs/1156129-1.html diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp index 4c2ab7b6df49..1c09793789c1 100644 --- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -3413,6 +3413,26 @@ nsDisplayBorder::CalculateBounds(const nsStyleBorder& aStyleBorder) result.UnionRect(result, nsRect(borderBounds.X(), borderBounds.Y(), border.left, borderBounds.Height())); } + nscoord radii[8]; + if (mFrame->GetBorderRadii(radii)) { + if (border.left > 0 || border.top > 0) { + nsSize cornerSize(radii[NS_CORNER_TOP_LEFT_X], radii[NS_CORNER_TOP_LEFT_Y]); + result.UnionRect(result, nsRect(borderBounds.TopLeft(), cornerSize)); + } + if (border.top > 0 || border.right > 0) { + nsSize cornerSize(radii[NS_CORNER_TOP_RIGHT_X], radii[NS_CORNER_TOP_RIGHT_Y]); + result.UnionRect(result, nsRect(borderBounds.TopRight() - nsPoint(cornerSize.width, 0), cornerSize)); + } + if (border.right > 0 || border.bottom > 0) { + nsSize cornerSize(radii[NS_CORNER_BOTTOM_RIGHT_X], radii[NS_CORNER_BOTTOM_RIGHT_Y]); + result.UnionRect(result, nsRect(borderBounds.BottomRight() - nsPoint(cornerSize.width, cornerSize.height), cornerSize)); + } + if (border.bottom > 0 || border.left > 0) { + nsSize cornerSize(radii[NS_CORNER_BOTTOM_LEFT_X], radii[NS_CORNER_BOTTOM_LEFT_Y]); + result.UnionRect(result, nsRect(borderBounds.BottomLeft() - nsPoint(0, cornerSize.height), cornerSize)); + } + } + return result; } } diff --git a/layout/reftests/bugs/1156129-1-ref.html b/layout/reftests/bugs/1156129-1-ref.html new file mode 100644 index 000000000000..461fea35382a --- /dev/null +++ b/layout/reftests/bugs/1156129-1-ref.html @@ -0,0 +1,36 @@ + + + +The bounds calculation for border display items needs to take the border radius into account + + + +
+
+
diff --git a/layout/reftests/bugs/1156129-1.html b/layout/reftests/bugs/1156129-1.html new file mode 100644 index 000000000000..58f82fe4f569 --- /dev/null +++ b/layout/reftests/bugs/1156129-1.html @@ -0,0 +1,44 @@ + + + +The bounds calculation for border display items needs to take the border radius into account + + + +
+
+
+ + diff --git a/layout/reftests/bugs/reftest.list b/layout/reftests/bugs/reftest.list index 8174d814967d..5ea1dca301a2 100644 --- a/layout/reftests/bugs/reftest.list +++ b/layout/reftests/bugs/reftest.list @@ -1875,3 +1875,4 @@ fuzzy-if(d2d,36,304) HTTP(..) == 1116480-1-fakeitalic-overflow.html 1116480-1-fa skip-if(B2G||Mulet) == 1150021-1.xul 1150021-1-ref.xul == 1151145-1.html 1151145-1-ref.html == 1151306-1.html 1151306-1-ref.html +== 1156129-1.html 1156129-1-ref.html