Commit b38c2a97 authored by Aleks Totic's avatar Aleks Totic Committed by Commit Bot

Implement NGBoxStrut::ConvertToPhysical with tests

Bug: 740993
Change-Id: I742b2aa94048e55204d204e0ce6fcaee7b0af6d8
Reviewed-on: https://chromium-review.googlesource.com/567776
Commit-Queue: Aleks Totic <atotic@chromium.org>
Reviewed-by: default avatarChristian Biesinger <cbiesinger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#486196}
parent 644df1dc
......@@ -18,6 +18,33 @@ bool NGBoxStrut::operator==(const NGBoxStrut& other) const {
std::tie(inline_start, inline_end, block_start, block_end);
}
NGPhysicalBoxStrut NGBoxStrut::ConvertToPhysical(
NGWritingMode writing_mode,
TextDirection direction) const {
LayoutUnit direction_start = inline_start;
LayoutUnit direction_end = inline_end;
if (direction == TextDirection::kRtl)
std::swap(direction_start, direction_end);
switch (writing_mode) {
case kHorizontalTopBottom:
return NGPhysicalBoxStrut(block_start, direction_end, block_end,
direction_start);
case kVerticalRightLeft:
case kSidewaysRightLeft:
return NGPhysicalBoxStrut(direction_start, block_start, direction_end,
block_end);
case kVerticalLeftRight:
return NGPhysicalBoxStrut(direction_start, block_end, direction_end,
block_start);
case kSidewaysLeftRight:
return NGPhysicalBoxStrut(direction_end, block_end, direction_start,
block_start);
default:
NOTREACHED();
return NGPhysicalBoxStrut();
}
}
// Converts physical dimensions to logical ones per
// https://drafts.csswg.org/css-writing-modes-3/#logical-to-physical
NGBoxStrut NGPhysicalBoxStrut::ConvertToLogical(NGWritingMode writing_mode,
......
......@@ -13,6 +13,8 @@
namespace blink {
struct NGPhysicalBoxStrut;
// This struct is used for storing margins, borders or padding of a box on all
// four edges.
struct CORE_EXPORT NGBoxStrut {
......@@ -42,6 +44,8 @@ struct CORE_EXPORT NGBoxStrut {
bool IsEmpty() const;
NGPhysicalBoxStrut ConvertToPhysical(NGWritingMode, TextDirection) const;
// The following two operators exist primarily to have an easy way to access
// the sum of border and padding.
NGBoxStrut& operator+=(const NGBoxStrut& other) {
......@@ -86,6 +90,9 @@ struct CORE_EXPORT NGPhysicalBoxStrut {
NGBoxStrut ConvertToLogical(NGWritingMode, TextDirection) const;
NGPixelSnappedPhysicalBoxStrut SnapToDevicePixels() const;
LayoutUnit HorizontalSum() const { return left + right; }
LayoutUnit VerticalSum() const { return top + bottom; }
LayoutUnit top;
LayoutUnit right;
LayoutUnit bottom;
......
......@@ -43,6 +43,43 @@ TEST(NGGeometryUnitsTest, ConvertPhysicalStrutToLogical) {
EXPECT_EQ(right, logical.block_start);
}
TEST(NGGeometryUnitsTest, ConvertLogicalStrutToPhysical) {
LayoutUnit left{5}, right{10}, top{15}, bottom{20};
NGBoxStrut logical(left, right, top, bottom);
NGBoxStrut converted =
logical.ConvertToPhysical(kHorizontalTopBottom, TextDirection::kLtr)
.ConvertToLogical(kHorizontalTopBottom, TextDirection::kLtr);
EXPECT_EQ(logical, converted);
converted =
logical.ConvertToPhysical(kHorizontalTopBottom, TextDirection::kRtl)
.ConvertToLogical(kHorizontalTopBottom, TextDirection::kRtl);
EXPECT_EQ(logical, converted);
converted = logical.ConvertToPhysical(kVerticalLeftRight, TextDirection::kLtr)
.ConvertToLogical(kVerticalLeftRight, TextDirection::kLtr);
EXPECT_EQ(logical, converted);
converted = logical.ConvertToPhysical(kVerticalLeftRight, TextDirection::kRtl)
.ConvertToLogical(kVerticalLeftRight, TextDirection::kRtl);
EXPECT_EQ(logical, converted);
converted = logical.ConvertToPhysical(kVerticalRightLeft, TextDirection::kLtr)
.ConvertToLogical(kVerticalRightLeft, TextDirection::kLtr);
EXPECT_EQ(logical, converted);
converted = logical.ConvertToPhysical(kVerticalRightLeft, TextDirection::kRtl)
.ConvertToLogical(kVerticalRightLeft, TextDirection::kRtl);
EXPECT_EQ(logical, converted);
converted = logical.ConvertToPhysical(kSidewaysRightLeft, TextDirection::kLtr)
.ConvertToLogical(kSidewaysRightLeft, TextDirection::kLtr);
EXPECT_EQ(logical, converted);
converted = logical.ConvertToPhysical(kSidewaysRightLeft, TextDirection::kRtl)
.ConvertToLogical(kSidewaysRightLeft, TextDirection::kRtl);
EXPECT_EQ(logical, converted);
converted = logical.ConvertToPhysical(kSidewaysLeftRight, TextDirection::kLtr)
.ConvertToLogical(kSidewaysLeftRight, TextDirection::kLtr);
EXPECT_EQ(logical, converted);
converted = logical.ConvertToPhysical(kSidewaysLeftRight, TextDirection::kRtl)
.ConvertToLogical(kSidewaysLeftRight, TextDirection::kRtl);
EXPECT_EQ(logical, converted);
}
} // namespace
} // namespace blink
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment