summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/layout/geometry/writing_mode_converter.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/core/layout/geometry/writing_mode_converter.h')
-rw-r--r--chromium/third_party/blink/renderer/core/layout/geometry/writing_mode_converter.h124
1 files changed, 124 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/core/layout/geometry/writing_mode_converter.h b/chromium/third_party/blink/renderer/core/layout/geometry/writing_mode_converter.h
new file mode 100644
index 00000000000..54a1f8a7a1e
--- /dev/null
+++ b/chromium/third_party/blink/renderer/core/layout/geometry/writing_mode_converter.h
@@ -0,0 +1,124 @@
+// 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.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_GEOMETRY_WRITING_MODE_CONVERTER_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_GEOMETRY_WRITING_MODE_CONVERTER_H_
+
+#include "third_party/blink/renderer/core/core_export.h"
+#include "third_party/blink/renderer/core/layout/geometry/logical_rect.h"
+#include "third_party/blink/renderer/core/layout/geometry/physical_rect.h"
+#include "third_party/blink/renderer/platform/text/writing_direction_mode.h"
+
+namespace blink {
+
+// This class represents CSS property values to convert between logical and
+// physical coordinate systems. See:
+// https://drafts.csswg.org/css-writing-modes-3/#logical-to-physical
+class CORE_EXPORT WritingModeConverter {
+ STACK_ALLOCATED();
+
+ public:
+ // @param writing_direction |WritingMode| and |TextDirection|.
+ // @param outer_size the size of the rect (typically a fragment). Some
+ // combinations of |WritingMode| and |TextDirection| require the size of the
+ // container to make the offset relative to the right or the bottom edges.
+ WritingModeConverter(WritingDirectionMode writing_direction,
+ const PhysicalSize& outer_size)
+ : writing_direction_(writing_direction), outer_size_(outer_size) {}
+
+ // Construct without |outer_size|. Caller should call |SetOuterSize| before
+ // conversions.
+ explicit WritingModeConverter(WritingDirectionMode writing_direction)
+ : writing_direction_(writing_direction) {}
+
+ // Conversion properties and utilities.
+ WritingDirectionMode GetWritingDirection() const {
+ return writing_direction_;
+ }
+ WritingMode GetWritingMode() const {
+ return writing_direction_.GetWritingMode();
+ }
+ TextDirection Direction() const { return writing_direction_.Direction(); }
+ bool IsLtr() const { return writing_direction_.IsLtr(); }
+
+ void SetOuterSize(const PhysicalSize& outer_size) {
+ outer_size_ = outer_size;
+ }
+
+ // |LogicalOffset| and |PhysicalOffset| conversions.
+ // PhysicalOffset will be the physical top left point of the rectangle
+ // described by offset + inner_size. Setting inner_size to 0,0 will return
+ // the same point.
+ // @param inner_size the size of the inner rect (typically a child fragment).
+ LogicalOffset ToLogical(const PhysicalOffset& offset,
+ const PhysicalSize& inner_size) const;
+ PhysicalOffset ToPhysical(const LogicalOffset& offset,
+ const PhysicalSize& inner_size) const;
+
+ // |LogicalSize| and |PhysicalSize| conversions.
+ LogicalSize ToLogical(const PhysicalSize& size) const;
+ PhysicalSize ToPhysical(const LogicalSize& size) const;
+
+ // |LogicalRect| and |PhysicalRect| conversions.
+ LogicalRect ToLogical(const PhysicalRect& rect) const;
+ PhysicalRect ToPhysical(const LogicalRect& rect) const;
+
+ private:
+ LogicalOffset SlowToLogical(const PhysicalOffset& offset,
+ const PhysicalSize& inner_size) const;
+ PhysicalOffset SlowToPhysical(const LogicalOffset& offset,
+ const PhysicalSize& inner_size) const;
+
+ LogicalRect SlowToLogical(const PhysicalRect& rect) const;
+ PhysicalRect SlowToPhysical(const LogicalRect& rect) const;
+
+ WritingDirectionMode writing_direction_;
+ PhysicalSize outer_size_;
+};
+
+inline LogicalOffset WritingModeConverter::ToLogical(
+ const PhysicalOffset& offset,
+ const PhysicalSize& inner_size) const {
+ if (writing_direction_.IsHorizontalLtr())
+ return LogicalOffset(offset.left, offset.top);
+ return SlowToLogical(offset, inner_size);
+}
+
+inline PhysicalOffset WritingModeConverter::ToPhysical(
+ const LogicalOffset& offset,
+ const PhysicalSize& inner_size) const {
+ if (writing_direction_.IsHorizontalLtr())
+ return PhysicalOffset(offset.inline_offset, offset.block_offset);
+ return SlowToPhysical(offset, inner_size);
+}
+
+inline LogicalSize WritingModeConverter::ToLogical(
+ const PhysicalSize& size) const {
+ return size.ConvertToLogical(GetWritingMode());
+}
+
+inline PhysicalSize WritingModeConverter::ToPhysical(
+ const LogicalSize& size) const {
+ return ToPhysicalSize(size, GetWritingMode());
+}
+
+inline LogicalRect WritingModeConverter::ToLogical(
+ const PhysicalRect& rect) const {
+ if (writing_direction_.IsHorizontalLtr())
+ return LogicalRect(rect.X(), rect.Y(), rect.Width(), rect.Height());
+ return SlowToLogical(rect);
+}
+
+inline PhysicalRect WritingModeConverter::ToPhysical(
+ const LogicalRect& rect) const {
+ if (writing_direction_.IsHorizontalLtr()) {
+ return PhysicalRect(rect.offset.inline_offset, rect.offset.block_offset,
+ rect.size.inline_size, rect.size.block_size);
+ }
+ return SlowToPhysical(rect);
+}
+
+} // namespace blink
+
+#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_GEOMETRY_WRITING_MODE_CONVERTER_H_