summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/layout/geometry/writing_mode_converter.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/core/layout/geometry/writing_mode_converter.cc')
-rw-r--r--chromium/third_party/blink/renderer/core/layout/geometry/writing_mode_converter.cc90
1 files changed, 90 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/core/layout/geometry/writing_mode_converter.cc b/chromium/third_party/blink/renderer/core/layout/geometry/writing_mode_converter.cc
new file mode 100644
index 00000000000..4de9df959bf
--- /dev/null
+++ b/chromium/third_party/blink/renderer/core/layout/geometry/writing_mode_converter.cc
@@ -0,0 +1,90 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/core/layout/geometry/writing_mode_converter.h"
+
+namespace blink {
+
+LogicalOffset WritingModeConverter::SlowToLogical(
+ const PhysicalOffset& offset,
+ const PhysicalSize& inner_size) const {
+ switch (GetWritingMode()) {
+ case WritingMode::kHorizontalTb:
+ DCHECK(!IsLtr()); // LTR is in the fast code path.
+ return LogicalOffset(outer_size_.width - offset.left - inner_size.width,
+ offset.top);
+ case WritingMode::kVerticalRl:
+ case WritingMode::kSidewaysRl:
+ if (IsLtr()) {
+ return LogicalOffset(
+ offset.top, outer_size_.width - offset.left - inner_size.width);
+ }
+ return LogicalOffset(outer_size_.height - offset.top - inner_size.height,
+ outer_size_.width - offset.left - inner_size.width);
+ case WritingMode::kVerticalLr:
+ if (IsLtr())
+ return LogicalOffset(offset.top, offset.left);
+ return LogicalOffset(outer_size_.height - offset.top - inner_size.height,
+ offset.left);
+ case WritingMode::kSidewaysLr:
+ if (IsLtr()) {
+ return LogicalOffset(
+ outer_size_.height - offset.top - inner_size.height, offset.left);
+ }
+ return LogicalOffset(offset.top, offset.left);
+ }
+ NOTREACHED();
+ return LogicalOffset();
+}
+
+PhysicalOffset WritingModeConverter::SlowToPhysical(
+ const LogicalOffset& offset,
+ const PhysicalSize& inner_size) const {
+ switch (GetWritingMode()) {
+ case WritingMode::kHorizontalTb:
+ DCHECK(!IsLtr()); // LTR is in the fast code path.
+ return PhysicalOffset(
+ outer_size_.width - offset.inline_offset - inner_size.width,
+ offset.block_offset);
+ case WritingMode::kVerticalRl:
+ case WritingMode::kSidewaysRl:
+ if (IsLtr()) {
+ return PhysicalOffset(
+ outer_size_.width - offset.block_offset - inner_size.width,
+ offset.inline_offset);
+ }
+ return PhysicalOffset(
+ outer_size_.width - offset.block_offset - inner_size.width,
+ outer_size_.height - offset.inline_offset - inner_size.height);
+ case WritingMode::kVerticalLr:
+ if (IsLtr())
+ return PhysicalOffset(offset.block_offset, offset.inline_offset);
+ return PhysicalOffset(
+ offset.block_offset,
+ outer_size_.height - offset.inline_offset - inner_size.height);
+ case WritingMode::kSidewaysLr:
+ if (IsLtr()) {
+ return PhysicalOffset(
+ offset.block_offset,
+ outer_size_.height - offset.inline_offset - inner_size.height);
+ }
+ return PhysicalOffset(offset.block_offset, offset.inline_offset);
+ }
+ NOTREACHED();
+ return PhysicalOffset();
+}
+
+LogicalRect WritingModeConverter::SlowToLogical(
+ const PhysicalRect& rect) const {
+ return LogicalRect(SlowToLogical(rect.offset, rect.size),
+ ToLogical(rect.size));
+}
+
+PhysicalRect WritingModeConverter::SlowToPhysical(
+ const LogicalRect& rect) const {
+ const PhysicalSize size = ToPhysical(rect.size);
+ return PhysicalRect(SlowToPhysical(rect.offset, size), size);
+}
+
+} // namespace blink