diff --git a/layout/generic/WritingModes.h b/layout/generic/WritingModes.h index fe1bca8856f4..38efa34d9667 100644 --- a/layout/generic/WritingModes.h +++ b/layout/generic/WritingModes.h @@ -36,14 +36,79 @@ #define CHECK_WRITING_MODE(param) \ NS_ASSERTION(param == mWritingMode, "writing-mode mismatch") -#define LOGICAL_SIDE_B_START 1 -#define LOGICAL_SIDE_I_START 2 -#define LOGICAL_SIDE_B_END 4 -#define LOGICAL_SIDE_I_END 8 -#define LOGICAL_SIDES_I_BOTH (LOGICAL_SIDE_I_START | LOGICAL_SIDE_I_END) -#define LOGICAL_SIDES_B_BOTH (LOGICAL_SIDE_B_START | LOGICAL_SIDE_B_END) -#define LOGICAL_SIDES_ALL (LOGICAL_SIDE_I_START | LOGICAL_SIDE_I_END | \ - LOGICAL_SIDE_B_START | LOGICAL_SIDE_B_END) +namespace mozilla { +// Logical side constants for use in various places. +enum LogicalSide { eLogicalSideBStart, eLogicalSideBEnd, + eLogicalSideIStart, eLogicalSideIEnd }; + +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 +}; + +#define LOGICAL_SIDE_B_START mozilla::eLogicalSideBitsBStart +#define LOGICAL_SIDE_I_START mozilla::eLogicalSideBitsIStart +#define LOGICAL_SIDE_B_END mozilla::eLogicalSideBitsBEnd +#define LOGICAL_SIDE_I_END mozilla::eLogicalSideBitsIEnd +#define LOGICAL_SIDES_I_BOTH mozilla::eLogicalSideBitsIBoth +#define LOGICAL_SIDES_B_BOTH mozilla::eLogicalSideBitsBBoth +#define LOGICAL_SIDES_ALL mozilla::eLogicalSideBitsAll + +/** + * LogicalSides represents a set of logical sides. + */ +struct LogicalSides MOZ_FINAL { + LogicalSides() : mBits(0) {} + explicit LogicalSides(LogicalSideBits aSideBits) + { + MOZ_ASSERT((aSideBits & ~eLogicalSideBitsAll) == 0, "illegal side bits"); + mBits = aSideBits; + } + 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 + { + return LogicalSides(LogicalSideBits(mBits | aOther.mBits)); + } + LogicalSides operator|(LogicalSideBits aSideBits) const + { + return *this | LogicalSides(aSideBits); + } + LogicalSides& operator|=(LogicalSides aOther) + { + mBits |= aOther.mBits; + return *this; + } + LogicalSides& operator|=(LogicalSideBits aSideBits) + { + return *this |= LogicalSides(aSideBits); + } + bool operator==(LogicalSides aOther) const + { + return mBits == aOther.mBits; + } + bool operator!=(LogicalSides aOther) const + { + return !(*this == aOther); + } + +private: + uint8_t mBits; +}; /** * mozilla::WritingMode is an immutable class representing a @@ -57,9 +122,6 @@ * See CSS3 Writing Modes for more information * http://www.w3.org/TR/css3-writing-modes/ */ - -namespace mozilla { - class WritingMode { public: /** @@ -842,18 +904,18 @@ public: *this : LogicalMargin(aToMode, GetPhysicalMargin(aFromMode)); } - void ApplySkipSides(int aSkipSides) + void ApplySkipSides(LogicalSides aSkipSides) { - if (aSkipSides & LOGICAL_SIDE_B_START) { + if (aSkipSides.BStart()) { BStart() = 0; } - if (aSkipSides & LOGICAL_SIDE_B_END) { + if (aSkipSides.BEnd()) { BEnd() = 0; } - if (aSkipSides & LOGICAL_SIDE_I_START) { + if (aSkipSides.IStart()) { IStart() = 0; } - if (aSkipSides & LOGICAL_SIDE_I_END) { + if (aSkipSides.IEnd()) { IEnd() = 0; } }