зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
7dcc2ffd89
Коммит
831bc3ff50
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче