summaryrefslogtreecommitdiffstats
path: root/layout/generic/WritingModes.h
diff options
context:
space:
mode:
Diffstat (limited to 'layout/generic/WritingModes.h')
-rw-r--r--layout/generic/WritingModes.h415
1 files changed, 200 insertions, 215 deletions
diff --git a/layout/generic/WritingModes.h b/layout/generic/WritingModes.h
index e84c5e276d..4f6e9eaec1 100644
--- a/layout/generic/WritingModes.h
+++ b/layout/generic/WritingModes.h
@@ -11,10 +11,8 @@
#include "mozilla/intl/BidiEmbeddingLevel.h"
#include "mozilla/ComputedStyle.h"
-#include "mozilla/EnumeratedRange.h"
-
+#include "mozilla/EnumSet.h"
#include "nsRect.h"
-#include "nsBidiUtils.h"
#include "nsStyleStruct.h"
// It is the caller's responsibility to operate on logical-coordinate objects
@@ -46,21 +44,18 @@ struct IMENotification;
} // namespace widget
// Logical axis, edge, side and corner constants for use in various places.
-enum LogicalAxis : uint8_t {
- eLogicalAxisBlock = 0x0,
- eLogicalAxisInline = 0x1
+enum class LogicalAxis : uint8_t {
+ Block,
+ Inline,
};
-enum LogicalEdge { eLogicalEdgeStart = 0x0, eLogicalEdgeEnd = 0x1 };
-enum LogicalSide : uint8_t {
- eLogicalSideBStart = (eLogicalAxisBlock << 1) | eLogicalEdgeStart, // 0x0
- eLogicalSideBEnd = (eLogicalAxisBlock << 1) | eLogicalEdgeEnd, // 0x1
- eLogicalSideIStart = (eLogicalAxisInline << 1) | eLogicalEdgeStart, // 0x2
- eLogicalSideIEnd = (eLogicalAxisInline << 1) | eLogicalEdgeEnd // 0x3
+enum class LogicalEdge : uint8_t { Start, End };
+
+enum class LogicalSide : uint8_t {
+ BStart,
+ BEnd,
+ IStart,
+ IEnd,
};
-constexpr auto AllLogicalSides() {
- return mozilla::MakeInclusiveEnumeratedRange(eLogicalSideBStart,
- eLogicalSideIEnd);
-}
enum class LogicalCorner : uint8_t {
BStartIStart,
@@ -70,7 +65,7 @@ enum class LogicalCorner : uint8_t {
};
// Physical axis constants.
-enum PhysicalAxis { eAxisVertical = 0x0, eAxisHorizontal = 0x1 };
+enum class PhysicalAxis : uint8_t { Vertical, Horizontal };
// Represents zero or more physical axes.
enum class PhysicalAxes : uint8_t {
@@ -82,51 +77,50 @@ enum class PhysicalAxes : uint8_t {
MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(PhysicalAxes)
inline LogicalAxis GetOrthogonalAxis(LogicalAxis aAxis) {
- return aAxis == eLogicalAxisBlock ? eLogicalAxisInline : eLogicalAxisBlock;
+ return aAxis == LogicalAxis::Block ? LogicalAxis::Inline : LogicalAxis::Block;
+}
+
+inline bool IsInline(LogicalSide aSide) {
+ return (aSide == LogicalSide::IStart) || (aSide == LogicalSide::IEnd);
}
-inline bool IsInline(LogicalSide aSide) { return aSide & 0x2; }
inline bool IsBlock(LogicalSide aSide) { return !IsInline(aSide); }
-inline bool IsEnd(LogicalSide aSide) { return aSide & 0x1; }
+
+inline bool IsEnd(LogicalSide aSide) {
+ return (aSide == LogicalSide::BEnd) || (aSide == LogicalSide::IEnd);
+}
+
inline bool IsStart(LogicalSide aSide) { return !IsEnd(aSide); }
inline LogicalAxis GetAxis(LogicalSide aSide) {
- return IsInline(aSide) ? eLogicalAxisInline : eLogicalAxisBlock;
+ return IsInline(aSide) ? LogicalAxis::Inline : LogicalAxis::Block;
}
inline LogicalEdge GetEdge(LogicalSide aSide) {
- return IsEnd(aSide) ? eLogicalEdgeEnd : eLogicalEdgeStart;
+ return IsEnd(aSide) ? LogicalEdge::End : LogicalEdge::Start;
}
inline LogicalEdge GetOppositeEdge(LogicalEdge aEdge) {
- // This relies on the only two LogicalEdge enum values being 0 and 1.
- return LogicalEdge(1 - aEdge);
+ return aEdge == LogicalEdge::Start ? LogicalEdge::End : LogicalEdge::Start;
}
inline LogicalSide MakeLogicalSide(LogicalAxis aAxis, LogicalEdge aEdge) {
- return LogicalSide((aAxis << 1) | aEdge);
+ if (aAxis == LogicalAxis::Inline) {
+ return aEdge == LogicalEdge::Start ? LogicalSide::IStart
+ : LogicalSide::IEnd;
+ }
+ return aEdge == LogicalEdge::Start ? LogicalSide::BStart : LogicalSide::BEnd;
}
inline LogicalSide GetOppositeSide(LogicalSide aSide) {
return MakeLogicalSide(GetAxis(aSide), GetOppositeEdge(GetEdge(aSide)));
}
-enum LogicalSideBits {
- eLogicalSideBitsNone = 0,
- eLogicalSideBitsBStart = 1 << eLogicalSideBStart,
- eLogicalSideBitsBEnd = 1 << eLogicalSideBEnd,
- eLogicalSideBitsIEnd = 1 << eLogicalSideIEnd,
- eLogicalSideBitsIStart = 1 << eLogicalSideIStart,
- eLogicalSideBitsBBoth = eLogicalSideBitsBStart | eLogicalSideBitsBEnd,
- eLogicalSideBitsIBoth = eLogicalSideBitsIStart | eLogicalSideBitsIEnd,
- eLogicalSideBitsAll = eLogicalSideBitsBBoth | eLogicalSideBitsIBoth
-};
-
-enum LineRelativeDir {
- eLineRelativeDirOver = eLogicalSideBStart,
- eLineRelativeDirUnder = eLogicalSideBEnd,
- eLineRelativeDirLeft = eLogicalSideIStart,
- eLineRelativeDirRight = eLogicalSideIEnd
+enum class LineRelativeDir : uint8_t {
+ Over = static_cast<uint8_t>(LogicalSide::BStart),
+ Under = static_cast<uint8_t>(LogicalSide::BEnd),
+ Left = static_cast<uint8_t>(LogicalSide::IStart),
+ Right = static_cast<uint8_t>(LogicalSide::IEnd)
};
/**
@@ -146,54 +140,41 @@ class WritingMode {
/**
* Absolute inline flow direction
*/
- enum InlineDir {
- eInlineLTR = 0x00, // text flows horizontally left to right
- eInlineRTL = 0x02, // text flows horizontally right to left
- eInlineTTB = 0x01, // text flows vertically top to bottom
- eInlineBTT = 0x03, // text flows vertically bottom to top
+ enum class InlineDir : uint8_t {
+ LTR, // text flows horizontally left to right
+ RTL, // text flows horizontally right to left
+ TTB, // text flows vertically top to bottom
+ BTT, // text flows vertically bottom to top
};
/**
* Absolute block flow direction
*/
- enum BlockDir {
- eBlockTB = 0x00, // horizontal lines stack top to bottom
- eBlockRL = 0x01, // vertical lines stack right to left
- eBlockLR = 0x05, // vertical lines stack left to right
+ enum class BlockDir : uint8_t {
+ TB, // horizontal lines stack top to bottom
+ RL, // vertical lines stack right to left
+ LR, // vertical lines stack left to right
};
/**
- * Line-relative (bidi-relative) inline flow direction
- */
- enum BidiDir {
- eBidiLTR = 0x00, // inline flow matches bidi LTR text
- eBidiRTL = 0x10, // inline flow matches bidi RTL text
- };
-
- /**
- * Unknown writing mode (should never actually be stored or used anywhere).
- */
- enum { eUnknownWritingMode = 0xff };
-
- /**
* Return the absolute inline flow direction as an InlineDir
*/
InlineDir GetInlineDir() const {
- return InlineDir(mWritingMode._0 & eInlineMask);
+ if (IsVertical()) {
+ return IsInlineReversed() ? InlineDir::BTT : InlineDir::TTB;
+ }
+ return IsInlineReversed() ? InlineDir::RTL : InlineDir::LTR;
}
/**
* Return the absolute block flow direction as a BlockDir
*/
BlockDir GetBlockDir() const {
- return BlockDir(mWritingMode._0 & eBlockMask);
- }
-
- /**
- * Return the line-relative inline flow direction as a BidiDir
- */
- BidiDir GetBidiDir() const {
- return BidiDir((mWritingMode & StyleWritingMode::RTL)._0);
+ if (IsVertical()) {
+ return mWritingMode & StyleWritingMode::VERTICAL_LR ? BlockDir::LR
+ : BlockDir::RL;
+ }
+ return BlockDir::TB;
}
/**
@@ -207,14 +188,14 @@ class WritingMode {
}
/**
- * Return true if bidi direction is LTR. (Convenience method)
+ * Return true if bidi direction is LTR.
*/
- bool IsBidiLTR() const { return eBidiLTR == GetBidiDir(); }
+ bool IsBidiLTR() const { return !IsBidiRTL(); }
/**
- * Return true if bidi direction is RTL. (Convenience method)
+ * Return true if bidi direction is RTL.
*/
- bool IsBidiRTL() const { return eBidiRTL == GetBidiDir(); }
+ bool IsBidiRTL() const { return !!(mWritingMode & StyleWritingMode::RTL); }
/**
* True if it is vertical and vertical-lr, or is horizontal and bidi LTR.
@@ -233,12 +214,12 @@ class WritingMode {
/**
* True if vertical-mode block direction is LR (convenience method).
*/
- bool IsVerticalLR() const { return eBlockLR == GetBlockDir(); }
+ bool IsVerticalLR() const { return GetBlockDir() == BlockDir::LR; }
/**
* True if vertical-mode block direction is RL (convenience method).
*/
- bool IsVerticalRL() const { return eBlockRL == GetBlockDir(); }
+ bool IsVerticalRL() const { return GetBlockDir() == BlockDir::RL; }
/**
* True if vertical writing mode, i.e. when
@@ -329,11 +310,13 @@ class WritingMode {
static_assert(uint8_t(StyleWritingModeProperty::HorizontalTb) == 0 &&
uint8_t(StyleWritingModeProperty::VerticalRl) == 1 &&
uint8_t(StyleWritingModeProperty::VerticalLr) == 3 &&
- eLogicalAxisBlock == 0 && eLogicalAxisInline == 1 &&
- eAxisVertical == 0 && eAxisHorizontal == 1,
+ uint8_t(LogicalAxis::Block) == 0 &&
+ uint8_t(LogicalAxis::Inline) == 1 &&
+ uint8_t(PhysicalAxis::Vertical) == 0 &&
+ uint8_t(PhysicalAxis::Horizontal) == 1,
"unexpected writing-mode, logical axis or physical axis "
"constant values");
- return mozilla::PhysicalAxis((aWritingModeValue ^ aAxis) & 0x1);
+ return mozilla::PhysicalAxis((aWritingModeValue ^ uint8_t(aAxis)) & 0x1);
}
mozilla::PhysicalAxis PhysicalAxis(LogicalAxis aAxis) const {
@@ -366,7 +349,7 @@ class WritingMode {
// What's left of the writing-mode should be in the range 0-3:
NS_ASSERTION(aWritingModeValue < 4, "invalid aWritingModeValue value");
- return kLogicalBlockSides[aWritingModeValue][aEdge];
+ return kLogicalBlockSides[aWritingModeValue][static_cast<uint8_t>(aEdge)];
}
mozilla::Side PhysicalSideForInlineAxis(LogicalEdge aEdge) const {
@@ -403,13 +386,13 @@ class WritingMode {
// StyleWritingMode::INLINE_REVERSED, StyleWritingMode::VERTICAL_LR and
// StyleWritingMode::LINE_INVERTED bits. Use these four bits to index into
// kLogicalInlineSides.
- MOZ_ASSERT(StyleWritingMode::VERTICAL._0 == 0x01 &&
- StyleWritingMode::INLINE_REVERSED._0 == 0x02 &&
- StyleWritingMode::VERTICAL_LR._0 == 0x04 &&
- StyleWritingMode::LINE_INVERTED._0 == 0x08,
- "unexpected mask values");
- int index = mWritingMode._0 & 0x0F;
- return kLogicalInlineSides[index][aEdge];
+ static_assert(StyleWritingMode::VERTICAL._0 == 0x01 &&
+ StyleWritingMode::INLINE_REVERSED._0 == 0x02 &&
+ StyleWritingMode::VERTICAL_LR._0 == 0x04 &&
+ StyleWritingMode::LINE_INVERTED._0 == 0x08,
+ "Unexpected values for StyleWritingMode constants!");
+ uint8_t index = mWritingMode._0 & 0x0F;
+ return kLogicalInlineSides[index][static_cast<uint8_t>(aEdge)];
}
/**
@@ -418,9 +401,9 @@ class WritingMode {
*/
mozilla::Side PhysicalSide(LogicalSide aSide) const {
if (IsBlock(aSide)) {
- MOZ_ASSERT(StyleWritingMode::VERTICAL._0 == 0x01 &&
- StyleWritingMode::VERTICAL_LR._0 == 0x04,
- "unexpected mask values");
+ static_assert(StyleWritingMode::VERTICAL._0 == 0x01 &&
+ StyleWritingMode::VERTICAL_LR._0 == 0x04,
+ "Unexpected values for StyleWritingMode constants!");
const uint8_t wm =
((mWritingMode & StyleWritingMode::VERTICAL_LR)._0 >> 1) |
(mWritingMode & StyleWritingMode::VERTICAL)._0;
@@ -445,47 +428,47 @@ class WritingMode {
static const LogicalSide kPhysicalToLogicalSides[][4] = {
// top right
// bottom left
- { eLogicalSideBStart, eLogicalSideIEnd,
- eLogicalSideBEnd, eLogicalSideIStart }, // horizontal-tb ltr
- { eLogicalSideIStart, eLogicalSideBStart,
- eLogicalSideIEnd, eLogicalSideBEnd }, // vertical-rl ltr
- { eLogicalSideBStart, eLogicalSideIStart,
- eLogicalSideBEnd, eLogicalSideIEnd }, // horizontal-tb rtl
- { eLogicalSideIEnd, eLogicalSideBStart,
- eLogicalSideIStart, eLogicalSideBEnd }, // vertical-rl rtl
- { eLogicalSideBEnd, eLogicalSideIStart,
- eLogicalSideBStart, eLogicalSideIEnd }, // (horizontal-bt) (inv) ltr
- { eLogicalSideIStart, eLogicalSideBEnd,
- eLogicalSideIEnd, eLogicalSideBStart }, // vertical-lr sw-left rtl
- { eLogicalSideBEnd, eLogicalSideIEnd,
- eLogicalSideBStart, eLogicalSideIStart }, // (horizontal-bt) (inv) rtl
- { eLogicalSideIEnd, eLogicalSideBEnd,
- eLogicalSideIStart, eLogicalSideBStart }, // vertical-lr sw-left ltr
- { eLogicalSideBStart, eLogicalSideIEnd,
- eLogicalSideBEnd, eLogicalSideIStart }, // horizontal-tb (inv) rtl
- { eLogicalSideIStart, eLogicalSideBStart,
- eLogicalSideIEnd, eLogicalSideBEnd }, // vertical-rl sw-left rtl
- { eLogicalSideBStart, eLogicalSideIStart,
- eLogicalSideBEnd, eLogicalSideIEnd }, // horizontal-tb (inv) ltr
- { eLogicalSideIEnd, eLogicalSideBStart,
- eLogicalSideIStart, eLogicalSideBEnd }, // vertical-rl sw-left ltr
- { eLogicalSideBEnd, eLogicalSideIEnd,
- eLogicalSideBStart, eLogicalSideIStart }, // (horizontal-bt) ltr
- { eLogicalSideIStart, eLogicalSideBEnd,
- eLogicalSideIEnd, eLogicalSideBStart }, // vertical-lr ltr
- { eLogicalSideBEnd, eLogicalSideIStart,
- eLogicalSideBStart, eLogicalSideIEnd }, // (horizontal-bt) rtl
- { eLogicalSideIEnd, eLogicalSideBEnd,
- eLogicalSideIStart, eLogicalSideBStart }, // vertical-lr rtl
+ { LogicalSide::BStart, LogicalSide::IEnd,
+ LogicalSide::BEnd, LogicalSide::IStart }, // horizontal-tb ltr
+ { LogicalSide::IStart, LogicalSide::BStart,
+ LogicalSide::IEnd, LogicalSide::BEnd }, // vertical-rl ltr
+ { LogicalSide::BStart, LogicalSide::IStart,
+ LogicalSide::BEnd, LogicalSide::IEnd }, // horizontal-tb rtl
+ { LogicalSide::IEnd, LogicalSide::BStart,
+ LogicalSide::IStart, LogicalSide::BEnd }, // vertical-rl rtl
+ { LogicalSide::BEnd, LogicalSide::IStart,
+ LogicalSide::BStart, LogicalSide::IEnd }, // (horizontal-bt) (inv) ltr
+ { LogicalSide::IStart, LogicalSide::BEnd,
+ LogicalSide::IEnd, LogicalSide::BStart }, // vertical-lr sw-left rtl
+ { LogicalSide::BEnd, LogicalSide::IEnd,
+ LogicalSide::BStart, LogicalSide::IStart }, // (horizontal-bt) (inv) rtl
+ { LogicalSide::IEnd, LogicalSide::BEnd,
+ LogicalSide::IStart, LogicalSide::BStart }, // vertical-lr sw-left ltr
+ { LogicalSide::BStart, LogicalSide::IEnd,
+ LogicalSide::BEnd, LogicalSide::IStart }, // horizontal-tb (inv) rtl
+ { LogicalSide::IStart, LogicalSide::BStart,
+ LogicalSide::IEnd, LogicalSide::BEnd }, // vertical-rl sw-left rtl
+ { LogicalSide::BStart, LogicalSide::IStart,
+ LogicalSide::BEnd, LogicalSide::IEnd }, // horizontal-tb (inv) ltr
+ { LogicalSide::IEnd, LogicalSide::BStart,
+ LogicalSide::IStart, LogicalSide::BEnd }, // vertical-rl sw-left ltr
+ { LogicalSide::BEnd, LogicalSide::IEnd,
+ LogicalSide::BStart, LogicalSide::IStart }, // (horizontal-bt) ltr
+ { LogicalSide::IStart, LogicalSide::BEnd,
+ LogicalSide::IEnd, LogicalSide::BStart }, // vertical-lr ltr
+ { LogicalSide::BEnd, LogicalSide::IStart,
+ LogicalSide::BStart, LogicalSide::IEnd }, // (horizontal-bt) rtl
+ { LogicalSide::IEnd, LogicalSide::BEnd,
+ LogicalSide::IStart, LogicalSide::BStart }, // vertical-lr rtl
};
// clang-format on
- MOZ_ASSERT(StyleWritingMode::VERTICAL._0 == 0x01 &&
- StyleWritingMode::INLINE_REVERSED._0 == 0x02 &&
- StyleWritingMode::VERTICAL_LR._0 == 0x04 &&
- StyleWritingMode::LINE_INVERTED._0 == 0x08,
- "unexpected mask values");
- int index = mWritingMode._0 & 0x0F;
+ static_assert(StyleWritingMode::VERTICAL._0 == 0x01 &&
+ StyleWritingMode::INLINE_REVERSED._0 == 0x02 &&
+ StyleWritingMode::VERTICAL_LR._0 == 0x04 &&
+ StyleWritingMode::LINE_INVERTED._0 == 0x08,
+ "Unexpected values for StyleWritingMode constants!");
+ uint8_t index = mWritingMode._0 & 0x0F;
return kPhysicalToLogicalSides[index][aSide];
}
@@ -570,7 +553,7 @@ class WritingMode {
bool ParallelAxisStartsOnSameSide(LogicalAxis aLogicalAxis,
const WritingMode& aOther) const {
mozilla::Side myStartSide =
- this->PhysicalSide(MakeLogicalSide(aLogicalAxis, eLogicalEdgeStart));
+ this->PhysicalSide(MakeLogicalSide(aLogicalAxis, LogicalEdge::Start));
// Figure out which of aOther's axes is parallel to |this| WritingMode's
// aLogicalAxis, and get its physical start side as well.
@@ -578,7 +561,7 @@ class WritingMode {
? GetOrthogonalAxis(aLogicalAxis)
: aLogicalAxis;
mozilla::Side otherWMStartSide =
- aOther.PhysicalSide(MakeLogicalSide(otherWMAxis, eLogicalEdgeStart));
+ aOther.PhysicalSide(MakeLogicalSide(otherWMAxis, LogicalEdge::Start));
NS_ASSERTION(myStartSide % 2 == otherWMStartSide % 2,
"Should end up with sides in the same physical axis");
@@ -601,10 +584,15 @@ class WritingMode {
friend struct widget::IMENotification;
/**
+ * Unknown writing mode (should never actually be stored or used anywhere).
+ */
+ static constexpr uint8_t kUnknownWritingMode = 0xff;
+
+ /**
* Return a WritingMode representing an unknown value.
*/
static inline WritingMode Unknown() {
- return WritingMode(eUnknownWritingMode);
+ return WritingMode(kUnknownWritingMode);
}
/**
@@ -614,12 +602,6 @@ class WritingMode {
explicit WritingMode(uint8_t aValue) : mWritingMode{aValue} {}
StyleWritingMode mWritingMode;
-
- enum Masks {
- // Masks for output enums
- eInlineMask = 0x03, // VERTICAL | INLINE_REVERSED
- eBlockMask = 0x05, // VERTICAL | VERTICAL_LR
- };
};
inline std::ostream& operator<<(std::ostream& aStream, const WritingMode& aWM) {
@@ -732,7 +714,7 @@ class LogicalPoint {
return mPoint.y;
}
nscoord Pos(LogicalAxis aAxis, WritingMode aWM) const {
- return aAxis == eLogicalAxisInline ? I(aWM) : B(aWM);
+ return aAxis == LogicalAxis::Inline ? I(aWM) : B(aWM);
}
nscoord LineRelative(WritingMode aWritingMode,
const nsSize& aContainerSize) const // line-axis
@@ -761,7 +743,7 @@ class LogicalPoint {
return mPoint.y;
}
nscoord& Pos(LogicalAxis aAxis, WritingMode aWM) {
- return aAxis == eLogicalAxisInline ? I(aWM) : B(aWM);
+ return aAxis == LogicalAxis::Inline ? I(aWM) : B(aWM);
}
/**
@@ -808,7 +790,7 @@ class LogicalPoint {
LogicalPoint operator+(const LogicalPoint& aOther) const {
CHECK_WRITING_MODE(aOther.GetWritingMode());
// In non-debug builds, LogicalPoint does not store the WritingMode,
- // so the first parameter here (which will always be eUnknownWritingMode)
+ // so the first parameter here (which will always be WritingMode::Unknown())
// is ignored.
return LogicalPoint(GetWritingMode(), mPoint.x + aOther.mPoint.x,
mPoint.y + aOther.mPoint.y);
@@ -824,7 +806,7 @@ class LogicalPoint {
LogicalPoint operator-(const LogicalPoint& aOther) const {
CHECK_WRITING_MODE(aOther.GetWritingMode());
// In non-debug builds, LogicalPoint does not store the WritingMode,
- // so the first parameter here (which will always be eUnknownWritingMode)
+ // so the first parameter here (which will always be WritingMode::Unknown())
// is ignored.
return LogicalPoint(GetWritingMode(), mPoint.x - aOther.mPoint.x,
mPoint.y - aOther.mPoint.y);
@@ -847,7 +829,7 @@ class LogicalPoint {
/**
* NOTE that in non-DEBUG builds, GetWritingMode() always returns
- * eUnknownWritingMode, as the current mode is not stored in the logical-
+ * WritingMode::Unknown(), as the current mode is not stored in the logical-
* geometry classes. Therefore, this method is private; it is used ONLY
* by the DEBUG-mode checking macros in this class and its friends;
* other code is not allowed to ask a logical point for its writing mode,
@@ -952,7 +934,7 @@ class LogicalSize {
return mSize.height;
}
nscoord Size(LogicalAxis aAxis, WritingMode aWM) const {
- return aAxis == eLogicalAxisInline ? ISize(aWM) : BSize(aWM);
+ return aAxis == LogicalAxis::Inline ? ISize(aWM) : BSize(aWM);
}
nscoord Width(WritingMode aWritingMode) const {
@@ -978,7 +960,7 @@ class LogicalSize {
return mSize.height;
}
nscoord& Size(LogicalAxis aAxis, WritingMode aWM) {
- return aAxis == eLogicalAxisInline ? ISize(aWM) : BSize(aWM);
+ return aAxis == LogicalAxis::Inline ? ISize(aWM) : BSize(aWM);
}
/**
@@ -1097,48 +1079,51 @@ class LogicalSize {
* LogicalSides represents a set of logical sides.
*/
struct LogicalSides final {
+ static constexpr EnumSet<LogicalSide> BBoth{LogicalSide::BStart,
+ LogicalSide::BEnd};
+ static constexpr EnumSet<LogicalSide> IBoth{LogicalSide::IStart,
+ LogicalSide::IEnd};
+ static constexpr EnumSet<LogicalSide> All{
+ LogicalSide::BStart, LogicalSide::BEnd, LogicalSide::IStart,
+ LogicalSide::IEnd};
+
explicit LogicalSides(WritingMode aWritingMode)
+#ifdef DEBUG
+ : mWritingMode(aWritingMode)
+#endif
+ {
+ }
+ LogicalSides(WritingMode aWritingMode, LogicalSides aSides)
:
#ifdef DEBUG
mWritingMode(aWritingMode),
#endif
- mBits(0) {
+ mSides(aSides.mSides) {
}
- LogicalSides(WritingMode aWritingMode, LogicalSideBits aSideBits)
+ LogicalSides(WritingMode aWritingMode, EnumSet<LogicalSide> aSides)
:
#ifdef DEBUG
mWritingMode(aWritingMode),
#endif
- mBits(aSideBits) {
- MOZ_ASSERT((aSideBits & ~eLogicalSideBitsAll) == 0, "illegal side bits");
- }
- bool IsEmpty() const { return mBits == 0; }
- bool BStart() const { return mBits & eLogicalSideBitsBStart; }
- bool BEnd() const { return mBits & eLogicalSideBitsBEnd; }
- bool IStart() const { return mBits & eLogicalSideBitsIStart; }
- bool IEnd() const { return mBits & eLogicalSideBitsIEnd; }
- bool Contains(LogicalSideBits aSideBits) const {
- MOZ_ASSERT((aSideBits & ~eLogicalSideBitsAll) == 0, "illegal side bits");
- return (mBits & aSideBits) == aSideBits;
- }
- LogicalSides operator|(LogicalSides aOther) const {
- CHECK_WRITING_MODE(aOther.GetWritingMode());
- return *this | LogicalSideBits(aOther.mBits);
- }
- LogicalSides operator|(LogicalSideBits aSideBits) const {
- return LogicalSides(GetWritingMode(), LogicalSideBits(mBits | aSideBits));
- }
- LogicalSides& operator|=(LogicalSides aOther) {
- CHECK_WRITING_MODE(aOther.GetWritingMode());
- return *this |= LogicalSideBits(aOther.mBits);
+ mSides(aSides) {
+ }
+ bool IsEmpty() const { return mSides.isEmpty(); }
+ bool BStart() const { return mSides.contains(LogicalSide::BStart); }
+ bool BEnd() const { return mSides.contains(LogicalSide::BEnd); }
+ bool IStart() const { return mSides.contains(LogicalSide::IStart); }
+ bool IEnd() const { return mSides.contains(LogicalSide::IEnd); }
+ bool Contains(LogicalSide aSide) const { return mSides.contains(aSide); }
+ LogicalSides& operator+=(LogicalSides aOther) {
+ mSides += aOther.mSides;
+ return *this;
}
- LogicalSides& operator|=(LogicalSideBits aSideBits) {
- mBits |= aSideBits;
+ LogicalSides& operator+=(LogicalSide aOther) {
+ mSides += aOther;
return *this;
}
bool operator==(LogicalSides aOther) const {
CHECK_WRITING_MODE(aOther.GetWritingMode());
- return mBits == aOther.mBits;
+ return mSides == aOther.mSides;
}
bool operator!=(LogicalSides aOther) const {
CHECK_WRITING_MODE(aOther.GetWritingMode());
@@ -1155,7 +1140,7 @@ struct LogicalSides final {
#ifdef DEBUG
WritingMode mWritingMode;
#endif
- uint8_t mBits;
+ EnumSet<LogicalSide> mSides;
};
/**
@@ -1234,10 +1219,10 @@ class LogicalMargin {
return mMargin.bottom;
}
nscoord Start(LogicalAxis aAxis, WritingMode aWM) const {
- return aAxis == eLogicalAxisInline ? IStart(aWM) : BStart(aWM);
+ return aAxis == LogicalAxis::Inline ? IStart(aWM) : BStart(aWM);
}
nscoord End(LogicalAxis aAxis, WritingMode aWM) const {
- return aAxis == eLogicalAxisInline ? IEnd(aWM) : BEnd(aWM);
+ return aAxis == LogicalAxis::Inline ? IEnd(aWM) : BEnd(aWM);
}
nscoord& IStart(WritingMode aWritingMode) // inline-start margin
@@ -1261,10 +1246,10 @@ class LogicalMargin {
return mMargin.bottom;
}
nscoord& Start(LogicalAxis aAxis, WritingMode aWM) {
- return aAxis == eLogicalAxisInline ? IStart(aWM) : BStart(aWM);
+ return aAxis == LogicalAxis::Inline ? IStart(aWM) : BStart(aWM);
}
nscoord& End(LogicalAxis aAxis, WritingMode aWM) {
- return aAxis == eLogicalAxisInline ? IEnd(aWM) : BEnd(aWM);
+ return aAxis == LogicalAxis::Inline ? IEnd(aWM) : BEnd(aWM);
}
nscoord IStartEnd(WritingMode aWritingMode) const // inline margins
@@ -1278,18 +1263,18 @@ class LogicalMargin {
return mMargin.TopBottom();
}
nscoord StartEnd(LogicalAxis aAxis, WritingMode aWM) const {
- return aAxis == eLogicalAxisInline ? IStartEnd(aWM) : BStartEnd(aWM);
+ return aAxis == LogicalAxis::Inline ? IStartEnd(aWM) : BStartEnd(aWM);
}
nscoord Side(LogicalSide aSide, WritingMode aWM) const {
switch (aSide) {
- case eLogicalSideBStart:
+ case LogicalSide::BStart:
return BStart(aWM);
- case eLogicalSideBEnd:
+ case LogicalSide::BEnd:
return BEnd(aWM);
- case eLogicalSideIStart:
+ case LogicalSide::IStart:
return IStart(aWM);
- case eLogicalSideIEnd:
+ case LogicalSide::IEnd:
return IEnd(aWM);
}
@@ -1298,13 +1283,13 @@ class LogicalMargin {
}
nscoord& Side(LogicalSide aSide, WritingMode aWM) {
switch (aSide) {
- case eLogicalSideBStart:
+ case LogicalSide::BStart:
return BStart(aWM);
- case eLogicalSideBEnd:
+ case LogicalSide::BEnd:
return BEnd(aWM);
- case eLogicalSideIStart:
+ case LogicalSide::IStart:
return IStart(aWM);
- case eLogicalSideIEnd:
+ case LogicalSide::IEnd:
return IEnd(aWM);
}
@@ -1646,13 +1631,13 @@ class LogicalRect {
}
nscoord Start(LogicalAxis aAxis, WritingMode aWM) const {
- return aAxis == eLogicalAxisInline ? IStart(aWM) : BStart(aWM);
+ return aAxis == LogicalAxis::Inline ? IStart(aWM) : BStart(aWM);
}
nscoord End(LogicalAxis aAxis, WritingMode aWM) const {
- return aAxis == eLogicalAxisInline ? IEnd(aWM) : BEnd(aWM);
+ return aAxis == LogicalAxis::Inline ? IEnd(aWM) : BEnd(aWM);
}
nscoord Size(LogicalAxis aAxis, WritingMode aWM) const {
- return aAxis == eLogicalAxisInline ? ISize(aWM) : BSize(aWM);
+ return aAxis == LogicalAxis::Inline ? ISize(aWM) : BSize(aWM);
}
/**
@@ -1680,10 +1665,10 @@ class LogicalRect {
return mBSize;
}
nscoord& Start(LogicalAxis aAxis, WritingMode aWM) {
- return aAxis == eLogicalAxisInline ? IStart(aWM) : BStart(aWM);
+ return aAxis == LogicalAxis::Inline ? IStart(aWM) : BStart(aWM);
}
nscoord& Size(LogicalAxis aAxis, WritingMode aWM) {
- return aAxis == eLogicalAxisInline ? ISize(aWM) : BSize(aWM);
+ return aAxis == LogicalAxis::Inline ? ISize(aWM) : BSize(aWM);
}
/**
@@ -2055,22 +2040,22 @@ const T& StyleRect<T>::Get(WritingMode aWM, LogicalSide aSide) const {
template <typename T>
const T& StyleRect<T>::GetIStart(WritingMode aWM) const {
- return Get(aWM, eLogicalSideIStart);
+ return Get(aWM, LogicalSide::IStart);
}
template <typename T>
const T& StyleRect<T>::GetBStart(WritingMode aWM) const {
- return Get(aWM, eLogicalSideBStart);
+ return Get(aWM, LogicalSide::BStart);
}
template <typename T>
const T& StyleRect<T>::GetIEnd(WritingMode aWM) const {
- return Get(aWM, eLogicalSideIEnd);
+ return Get(aWM, LogicalSide::IEnd);
}
template <typename T>
const T& StyleRect<T>::GetBEnd(WritingMode aWM) const {
- return Get(aWM, eLogicalSideBEnd);
+ return Get(aWM, LogicalSide::BEnd);
}
template <typename T>
@@ -2080,38 +2065,38 @@ T& StyleRect<T>::Get(WritingMode aWM, LogicalSide aSide) {
template <typename T>
T& StyleRect<T>::GetIStart(WritingMode aWM) {
- return Get(aWM, eLogicalSideIStart);
+ return Get(aWM, LogicalSide::IStart);
}
template <typename T>
T& StyleRect<T>::GetBStart(WritingMode aWM) {
- return Get(aWM, eLogicalSideBStart);
+ return Get(aWM, LogicalSide::BStart);
}
template <typename T>
T& StyleRect<T>::GetIEnd(WritingMode aWM) {
- return Get(aWM, eLogicalSideIEnd);
+ return Get(aWM, LogicalSide::IEnd);
}
template <typename T>
T& StyleRect<T>::GetBEnd(WritingMode aWM) {
- return Get(aWM, eLogicalSideBEnd);
+ return Get(aWM, LogicalSide::BEnd);
}
template <typename T>
const T& StyleRect<T>::Start(mozilla::LogicalAxis aAxis,
mozilla::WritingMode aWM) const {
- return Get(aWM, aAxis == mozilla::eLogicalAxisInline
- ? mozilla::eLogicalSideIStart
- : mozilla::eLogicalSideBStart);
+ return Get(aWM, aAxis == mozilla::LogicalAxis::Inline
+ ? mozilla::LogicalSide::IStart
+ : mozilla::LogicalSide::BStart);
}
template <typename T>
const T& StyleRect<T>::End(mozilla::LogicalAxis aAxis,
mozilla::WritingMode aWM) const {
- return Get(aWM, aAxis == mozilla::eLogicalAxisInline
- ? mozilla::eLogicalSideIEnd
- : mozilla::eLogicalSideBEnd);
+ return Get(aWM, aAxis == mozilla::LogicalAxis::Inline
+ ? mozilla::LogicalSide::IEnd
+ : mozilla::LogicalSide::BEnd);
}
inline AspectRatio AspectRatio::ConvertToWritingMode(
@@ -2147,15 +2132,15 @@ inline const mozilla::StyleMaxSize& nsStylePosition::MaxBSize(
}
inline const mozilla::StyleSize& nsStylePosition::Size(
mozilla::LogicalAxis aAxis, WritingMode aWM) const {
- return aAxis == mozilla::eLogicalAxisInline ? ISize(aWM) : BSize(aWM);
+ return aAxis == mozilla::LogicalAxis::Inline ? ISize(aWM) : BSize(aWM);
}
inline const mozilla::StyleSize& nsStylePosition::MinSize(
mozilla::LogicalAxis aAxis, WritingMode aWM) const {
- return aAxis == mozilla::eLogicalAxisInline ? MinISize(aWM) : MinBSize(aWM);
+ return aAxis == mozilla::LogicalAxis::Inline ? MinISize(aWM) : MinBSize(aWM);
}
inline const mozilla::StyleMaxSize& nsStylePosition::MaxSize(
mozilla::LogicalAxis aAxis, WritingMode aWM) const {
- return aAxis == mozilla::eLogicalAxisInline ? MaxISize(aWM) : MaxBSize(aWM);
+ return aAxis == mozilla::LogicalAxis::Inline ? MaxISize(aWM) : MaxBSize(aWM);
}
inline bool nsStylePosition::ISizeDependsOnContainer(WritingMode aWM) const {
@@ -2205,26 +2190,26 @@ inline bool nsStyleMargin::HasInlineAxisAuto(mozilla::WritingMode aWM) const {
}
inline bool nsStyleMargin::HasAuto(mozilla::LogicalAxis aAxis,
mozilla::WritingMode aWM) const {
- return aAxis == mozilla::eLogicalAxisInline ? HasInlineAxisAuto(aWM)
- : HasBlockAxisAuto(aWM);
+ return aAxis == mozilla::LogicalAxis::Inline ? HasInlineAxisAuto(aWM)
+ : HasBlockAxisAuto(aWM);
}
inline mozilla::StyleAlignFlags nsStylePosition::UsedSelfAlignment(
mozilla::LogicalAxis aAxis, const mozilla::ComputedStyle* aParent) const {
- return aAxis == mozilla::eLogicalAxisBlock ? UsedAlignSelf(aParent)._0
- : UsedJustifySelf(aParent)._0;
+ return aAxis == mozilla::LogicalAxis::Block ? UsedAlignSelf(aParent)._0
+ : UsedJustifySelf(aParent)._0;
}
inline mozilla::StyleContentDistribution nsStylePosition::UsedContentAlignment(
mozilla::LogicalAxis aAxis) const {
- return aAxis == mozilla::eLogicalAxisBlock ? mAlignContent : mJustifyContent;
+ return aAxis == mozilla::LogicalAxis::Block ? mAlignContent : mJustifyContent;
}
inline mozilla::StyleContentDistribution nsStylePosition::UsedTracksAlignment(
mozilla::LogicalAxis aAxis, uint32_t aIndex) const {
using T = mozilla::StyleAlignFlags;
const auto& tracksAlignment =
- aAxis == mozilla::eLogicalAxisBlock ? mAlignTracks : mJustifyTracks;
+ aAxis == mozilla::LogicalAxis::Block ? mAlignTracks : mJustifyTracks;
if (MOZ_LIKELY(tracksAlignment.IsEmpty())) {
// An empty array encodes the initial value, 'normal', which behaves as
// 'start' for Grid containers.