Bug 1028460 - part 2, Implement a mozilla::LogicalSides type that represents a set of logical sides that can be used for the GetLogicalSkipSides() result among other things. r=roc

This commit is contained in:
Mats Palmgren 2014-06-28 10:13:13 +00:00
Родитель 7dcc2ffd89
Коммит 831bc3ff50
1 изменённых файлов: 78 добавлений и 16 удалений

Просмотреть файл

@ -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;
}
}