blob: b8fc2efebbb17123f56a38e6c17d214aeb3eb978 [file] [log] [blame]
// Copyright 2019 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_CSS_PROPERTIES_CSS_DIRECTION_AWARE_RESOLVER_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_PROPERTIES_CSS_DIRECTION_AWARE_RESOLVER_H_
#include "third_party/blink/renderer/platform/text/text_direction.h"
#include "third_party/blink/renderer/platform/text/writing_mode.h"
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
namespace blink {
enum class CSSPropertyID;
class CSSProperty;
class StylePropertyShorthand;
class CSSDirectionAwareResolver {
STATIC_ONLY(CSSDirectionAwareResolver);
private:
template <size_t size>
class Group {
public:
explicit Group(const StylePropertyShorthand&);
explicit Group(const CSSProperty* (&properties)[size]);
const CSSProperty& GetProperty(size_t index) const;
bool Contains(CSSPropertyID) const;
private:
const CSSProperty** properties_;
};
public:
// A group of logical properties that's used by the 'Resolve*' functions
// to convert a physical property into a direction-aware property.
// It represents the properties in a logical property group [1] with
// a flow-relative mapping logic [2].
// [1]: https://drafts.csswg.org/css-logical/#logical-property-group
// [2]: https://drafts.csswg.org/css-logical/#mapping-logic
template <size_t size>
class LogicalMapping : public Group<size> {
using Group<size>::Group;
};
// A group of physical properties that's used by the 'Resolve*' functions
// to convert a direction-aware property into a physical property.
// It represents the properties in a logical property group [1] with
// a physical mapping logic [2].
// [1]: https://drafts.csswg.org/css-logical/#logical-property-group
// [2]: https://drafts.csswg.org/css-logical/#mapping-logic
template <size_t size>
class PhysicalMapping : public Group<size> {
using Group<size>::Group;
};
static LogicalMapping<4> LogicalBorderMapping();
static LogicalMapping<4> LogicalBorderColorMapping();
static LogicalMapping<4> LogicalBorderRadiusMapping();
static LogicalMapping<4> LogicalBorderStyleMapping();
static LogicalMapping<4> LogicalBorderWidthMapping();
static LogicalMapping<4> LogicalInsetMapping();
static LogicalMapping<4> LogicalMarginMapping();
static LogicalMapping<2> LogicalMaxSizeMapping();
static LogicalMapping<2> LogicalMinSizeMapping();
static LogicalMapping<2> LogicalOverflowMapping();
static LogicalMapping<2> LogicalOverscrollBehaviorMapping();
static LogicalMapping<4> LogicalPaddingMapping();
static LogicalMapping<4> LogicalScrollMarginMapping();
static LogicalMapping<4> LogicalScrollPaddingMapping();
static LogicalMapping<2> LogicalSizeMapping();
static LogicalMapping<4> LogicalVisitedBorderColorMapping();
static PhysicalMapping<4> PhysicalBorderMapping();
static PhysicalMapping<4> PhysicalBorderColorMapping();
static PhysicalMapping<4> PhysicalBorderRadiusMapping();
static PhysicalMapping<4> PhysicalBorderStyleMapping();
static PhysicalMapping<4> PhysicalBorderWidthMapping();
static PhysicalMapping<4> PhysicalInsetMapping();
static PhysicalMapping<4> PhysicalMarginMapping();
static PhysicalMapping<2> PhysicalMaxSizeMapping();
static PhysicalMapping<2> PhysicalMinSizeMapping();
static PhysicalMapping<2> PhysicalOverflowMapping();
static PhysicalMapping<2> PhysicalOverscrollBehaviorMapping();
static PhysicalMapping<4> PhysicalPaddingMapping();
static PhysicalMapping<4> PhysicalScrollMarginMapping();
static PhysicalMapping<4> PhysicalScrollPaddingMapping();
static PhysicalMapping<2> PhysicalSizeMapping();
static PhysicalMapping<4> PhysicalVisitedBorderColorMapping();
// These resolvers expect a PhysicalMapping with box sides, in the following
// order: top, right, bottom, left.
static const CSSProperty& ResolveInlineStart(TextDirection,
WritingMode,
const PhysicalMapping<4>&);
static const CSSProperty& ResolveInlineEnd(TextDirection,
WritingMode,
const PhysicalMapping<4>&);
static const CSSProperty& ResolveBlockStart(TextDirection,
WritingMode,
const PhysicalMapping<4>&);
static const CSSProperty& ResolveBlockEnd(TextDirection,
WritingMode,
const PhysicalMapping<4>&);
// These resolvers expect a LogicalMapping with box sides, in the following
// order: block-start, block-end, inline-start, inline-end.
// TODO(layout-dev): Implement them, if needed.
static const CSSProperty& ResolveTop(TextDirection,
WritingMode,
const LogicalMapping<4>&);
static const CSSProperty& ResolveBottom(TextDirection,
WritingMode,
const LogicalMapping<4>&);
static const CSSProperty& ResolveLeft(TextDirection,
WritingMode,
const LogicalMapping<4>&);
static const CSSProperty& ResolveRight(TextDirection,
WritingMode,
const LogicalMapping<4>&);
// These resolvers expect a PhysicalMapping with dimensions, in the following
// order: horizontal, vertical.
static const CSSProperty& ResolveInline(TextDirection,
WritingMode,
const PhysicalMapping<2>&);
static const CSSProperty& ResolveBlock(TextDirection,
WritingMode,
const PhysicalMapping<2>&);
// These resolvers expect a LogicalMapping with dimensions, in the following
// order: block, inline.
// TODO(layout-dev): Implement them, if needed.
static const CSSProperty& ResolveHorizontal(TextDirection,
WritingMode,
const LogicalMapping<2>&);
static const CSSProperty& ResolveVertical(TextDirection,
WritingMode,
const LogicalMapping<2>&);
// These resolvers expect a a PhysicalMapping with box corners, in the
// following order: top-left, top-right, bottom-right, bottom-left.
static const CSSProperty& ResolveStartStart(TextDirection,
WritingMode,
const PhysicalMapping<4>&);
static const CSSProperty& ResolveStartEnd(TextDirection,
WritingMode,
const PhysicalMapping<4>&);
static const CSSProperty& ResolveEndStart(TextDirection,
WritingMode,
const PhysicalMapping<4>&);
static const CSSProperty& ResolveEndEnd(TextDirection,
WritingMode,
const PhysicalMapping<4>&);
// These resolvers expect a a LogicalMapping with box corners, in the
// following order: start-start, start-end, end-start, end-end.
// TODO(layout-dev): Implement them, if needed.
static const CSSProperty& ResolveTopLeft(TextDirection,
WritingMode,
const LogicalMapping<4>&);
static const CSSProperty& ResolveTopRight(TextDirection,
WritingMode,
const LogicalMapping<4>&);
static const CSSProperty& ResolveBottomRight(TextDirection,
WritingMode,
const LogicalMapping<4>&);
static const CSSProperty& ResolveBottomLeft(TextDirection,
WritingMode,
const LogicalMapping<4>&);
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_CSS_PROPERTIES_CSS_DIRECTION_AWARE_RESOLVER_H_