#ifndef WritingMode_h
#define WritingMode_h
namespace WebCore {
enum TextDirection { LTR, RTL };
inline bool isLeftToRightDirection(TextDirection direction)
{
return direction == LTR;
}
enum WritingMode {
TopToBottomWritingMode = 0, BottomToTopWritingMode = 1, LeftToRightWritingMode = 2, RightToLeftWritingMode = 3, };
#define MAKE_TEXT_FLOW(writingMode, direction) ((writingMode) << 1 | (direction))
enum TextFlow {
InlineEastBlockSouth = MAKE_TEXT_FLOW(TopToBottomWritingMode, LTR),
InlineWestBlockSouth = MAKE_TEXT_FLOW(TopToBottomWritingMode, RTL),
InlineEastBlockNorth = MAKE_TEXT_FLOW(BottomToTopWritingMode, LTR),
InlineWestBlockNorth = MAKE_TEXT_FLOW(BottomToTopWritingMode, RTL),
InlineSouthBlockEast = MAKE_TEXT_FLOW(LeftToRightWritingMode, LTR),
InlineSouthBlockWest = MAKE_TEXT_FLOW(LeftToRightWritingMode, RTL),
InlineNorthBlockEast = MAKE_TEXT_FLOW(RightToLeftWritingMode, LTR),
InlineNorthBlockWest = MAKE_TEXT_FLOW(RightToLeftWritingMode, RTL)
};
inline TextFlow makeTextFlow(WritingMode writingMode, TextDirection direction)
{
return static_cast<TextFlow>(MAKE_TEXT_FLOW(writingMode, direction));
}
#undef MAKE_TEXT_FLOW
const unsigned TextFlowReversedMask = 1;
const unsigned TextFlowFlippedMask = 2;
const unsigned TextFlowVerticalMask = 4;
inline bool isReversedTextFlow(TextFlow textflow)
{
return textflow & TextFlowReversedMask;
}
inline bool isFlippedTextFlow(TextFlow textflow)
{
return textflow & TextFlowFlippedMask;
}
inline bool isVerticalTextFlow(TextFlow textflow)
{
return textflow & TextFlowVerticalMask;
}
inline bool isVerticalWritingMode(WritingMode writingMode)
{
return isVerticalTextFlow(makeTextFlow(writingMode, LTR));
}
inline bool isFlippedWritingMode(WritingMode writingMode)
{
return isFlippedTextFlow(makeTextFlow(writingMode, LTR));
}
inline bool isHorizontalWritingMode(WritingMode writingMode)
{
return !isVerticalWritingMode(writingMode);
}
inline bool isFlippedLinesWritingMode(WritingMode writingMode)
{
return isVerticalWritingMode(writingMode) != isFlippedWritingMode(writingMode);
}
enum LogicalBoxSide {
BeforeSide,
EndSide,
AfterSide,
StartSide
};
enum PhysicalBoxSide {
NilSide = -1,
TopSide,
RightSide,
BottomSide,
LeftSide
};
inline bool isHorizontalPhysicalSide(PhysicalBoxSide physicalSide)
{
return physicalSide == LeftSide || physicalSide == RightSide;
}
inline PhysicalBoxSide mirrorPhysicalSide(PhysicalBoxSide physicalSide)
{
return static_cast<PhysicalBoxSide>((static_cast<int>(physicalSide) + 2) % 4);
}
inline PhysicalBoxSide rotatePhysicalSide(PhysicalBoxSide physicalSide)
{
bool horizontalSide = isHorizontalPhysicalSide(physicalSide);
return static_cast<PhysicalBoxSide>((static_cast<int>(physicalSide) + (horizontalSide ? 1 : 3)) % 4);
}
inline PhysicalBoxSide mapLogicalSideToPhysicalSide(TextFlow textflow, LogicalBoxSide logicalSide)
{
PhysicalBoxSide physicalSide = static_cast<PhysicalBoxSide>(logicalSide);
bool horizontalSide = isHorizontalPhysicalSide(physicalSide);
if (isVerticalTextFlow(textflow))
physicalSide = rotatePhysicalSide(physicalSide);
if ((horizontalSide && isReversedTextFlow(textflow)) || (!horizontalSide && isFlippedTextFlow(textflow)))
physicalSide = mirrorPhysicalSide(physicalSide);
return physicalSide;
}
inline PhysicalBoxSide mapLogicalSideToPhysicalSide(WritingMode writingMode, LogicalBoxSide logicalSide)
{
TextDirection direction = isFlippedWritingMode(writingMode) ? RTL : LTR;
return mapLogicalSideToPhysicalSide(makeTextFlow(writingMode, direction), logicalSide);
}
}
#endif // WritingMode_h