InlineLineBreaker.h [plain text]
#pragma once
#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
#include "LayoutUnits.h"
namespace WebCore {
class RenderStyle;
namespace Layout {
class InlineItem;
class InlineTextItem;
struct ContinuousContent;
struct WrappedTextContent;
class LineBreaker {
public:
struct PartialRun {
unsigned length { 0 };
InlineLayoutUnit logicalWidth { 0 };
bool needsHyphen { false };
};
enum class IsEndOfLine { No, Yes };
struct Result {
enum class Action {
Keep, Split, Push, RevertToLastWrapOpportunity };
struct PartialTrailingContent {
size_t trailingRunIndex { 0 };
Optional<PartialRun> partialRun; };
Action action { Action::Keep };
IsEndOfLine isEndOfLine { IsEndOfLine::No };
Optional<PartialTrailingContent> partialTrailingContent { };
const InlineItem* lastWrapOpportunityItem { nullptr };
};
struct Run {
Run(const InlineItem&, InlineLayoutUnit);
Run(const Run&);
Run& operator=(const Run&);
const InlineItem& inlineItem;
InlineLayoutUnit logicalWidth { 0 };
};
using RunList = Vector<Run, 3>;
struct LineStatus {
InlineLayoutUnit availableWidth { 0 };
InlineLayoutUnit collapsibleWidth { 0 };
bool lineHasFullyCollapsibleTrailingRun { false };
bool lineIsEmpty { true };
};
Result shouldWrapInlineContent(const RunList& candidateRuns, InlineLayoutUnit candidateContentLogicalWidth, const LineStatus&);
void setHyphenationDisabled() { n_hyphenationIsDisabled = true; }
private:
Optional<WrappedTextContent> wrapTextContent(const RunList&, const LineStatus&) const;
Result tryWrappingInlineContent(const RunList&, InlineLayoutUnit candidateContentLogicalWidth, const LineStatus&) const;
Optional<PartialRun> tryBreakingTextRun(const Run& overflowRun, InlineLayoutUnit availableWidth) const;
enum class WordBreakRule {
NoBreak,
AtArbitraryPosition,
OnlyHyphenationAllowed
};
WordBreakRule wordBreakBehavior(const RenderStyle&) const;
bool shouldKeepEndOfLineWhitespace(const ContinuousContent&) const;
bool isContentWrappingAllowed(const ContinuousContent&) const;
bool n_hyphenationIsDisabled { false };
bool m_hasWrapOpportunityAtPreviousPosition { false };
};
inline LineBreaker::Run::Run(const InlineItem& inlineItem, InlineLayoutUnit logicalWidth)
: inlineItem(inlineItem)
, logicalWidth(logicalWidth)
{
}
inline LineBreaker::Run::Run(const Run& other)
: inlineItem(other.inlineItem)
, logicalWidth(other.logicalWidth)
{
}
}
}
#endif