// Copyright 2017 The Chromium Authors // 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_PLATFORM_TEXT_WRITING_MODE_UTILS_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_TEXT_WRITING_MODE_UTILS_H_ #include "third_party/blink/renderer/platform/text/writing_direction_mode.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" namespace blink { // Templates to map values between logical orientations and physical // orientations. See https://www.w3.org/TR/css-writing-modes-3/ and // https://www.w3.org/TR/css-logical-1/ for definitions of logical orientations. // This file provides two types of templates: // // - Simple value mappers (PhysicalToLogical and LogicalToPhysical): they take // 4 input values in physical or logical orientations, and provide accessors // to get values in logical or physical orientations. As the inputs may be // evaluated even if not used (in case that the compiler is unable to remove // unused evaluations, e.g. containing non-inlined function calls), for // performance-senstive code, the evaluation of the inputs should be simple // and/or be fully inlined. // // - Value mappers based on getter/setter methods (PhysicalToLogicalGetter, // LogicalToPhysicalGetter, PhysicalToLogicalSetter and // LogicalToPhysicalSetter): they take 4 method pointers as inputs pointing to // methods accessing values in physical or logical orientations, and provide // accessors to get or set values in logical or physical orientations. They // are suitable for mapping of setters, or getters implemented with non- // inlined functions. Evaluation of the input values are delayed when they are // actually needed. // // See WritingModeUtilsTest.cpp, LayoutBoxModelObject.h and ComputedStyle.h for // examples. template <typename Value> class PhysicalToLogical { … }; template <typename Value> class LogicalToPhysical { … }; template <typename Value> class LogicalToLogical { … }; template <typename Value, typename Object> class LogicalToPhysicalGetter { … }; template <typename Value, typename Object> class PhysicalToLogicalGetter { … }; template <typename Value, typename Object> class LogicalToPhysicalSetter { … }; } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_TEXT_WRITING_MODE_UTILS_H_