| Index: sky/engine/core/rendering/RenderParagraph.h
|
| diff --git a/sky/engine/core/rendering/RenderParagraph.h b/sky/engine/core/rendering/RenderParagraph.h
|
| index 739e964791291ee451be9f928412cb42f27800cd..1913492c71e944b4c7c29a71f80545e2ab91d15e 100644
|
| --- a/sky/engine/core/rendering/RenderParagraph.h
|
| +++ b/sky/engine/core/rendering/RenderParagraph.h
|
| @@ -6,30 +6,64 @@
|
| #define SKY_ENGINE_CORE_RENDERING_RENDERPARAGRAPH_H_
|
|
|
| #include "sky/engine/core/dom/ContainerNode.h"
|
| -#include "sky/engine/core/rendering/RenderBlockFlow.h"
|
| +#include "sky/engine/core/rendering/RenderBlock.h"
|
| +#include "sky/engine/core/rendering/line/TrailingObjects.h"
|
|
|
| namespace blink {
|
|
|
| +struct BidiRun;
|
| class ContainerNode;
|
| +// class InlineBidiResolver;
|
| +class InlineIterator;
|
|
|
| -class RenderParagraph final : public RenderBlockFlow {
|
| +class RenderParagraph final : public RenderBlock {
|
| public:
|
| explicit RenderParagraph(ContainerNode*);
|
| virtual ~RenderParagraph();
|
|
|
| static RenderParagraph* createAnonymous(Document&);
|
|
|
| - bool isRenderParagraph() const override { return true; }
|
| + bool isRenderParagraph() const final { return true; }
|
| +
|
| + void layout() final;
|
| +
|
| + LayoutUnit logicalRightOffsetForLine(bool shouldIndentText) const
|
| + {
|
| + LayoutUnit right = logicalRightOffsetForContent();
|
| + if (shouldIndentText && !style()->isLeftToRightDirection())
|
| + right -= textIndentOffset();
|
| + return right;
|
| + }
|
| + LayoutUnit logicalLeftOffsetForLine(bool shouldIndentText) const
|
| + {
|
| + LayoutUnit left = logicalLeftOffsetForContent();
|
| + if (shouldIndentText && style()->isLeftToRightDirection())
|
| + left += textIndentOffset();
|
| + return left;
|
| + }
|
| +
|
| + LayoutUnit logicalLeftSelectionOffset(RenderBlock* rootBlock, LayoutUnit position) final;
|
| + LayoutUnit logicalRightSelectionOffset(RenderBlock* rootBlock, LayoutUnit position) final;
|
|
|
| virtual RootInlineBox* lineAtIndex(int) const;
|
| virtual int lineCount(const RootInlineBox* = 0, bool* = 0) const;
|
|
|
| + void deleteLineBoxTree() final;
|
| +
|
| GapRects inlineSelectionGaps(RenderBlock* rootBlock, const LayoutPoint& rootBlockPhysicalPosition, const LayoutSize& offsetFromRootBlock,
|
| LayoutUnit& lastLogicalTop, LayoutUnit& lastLogicalLeft, LayoutUnit& lastLogicalRight, const PaintInfo*);
|
|
|
| -protected:
|
| - void layoutChildren(bool relayoutChildren, SubtreeLayoutScope&, LayoutUnit beforeEdge, LayoutUnit afterEdge) final;
|
| + static bool shouldSkipCreatingRunsForObject(RenderObject* obj)
|
| + {
|
| + return obj->isOutOfFlowPositioned() && !obj->style()->isOriginalDisplayInlineType() && !obj->container()->isRenderInline();
|
| + }
|
|
|
| + // TODO(ojan): Remove the need for these.
|
| + using RenderBlock::lineBoxes;
|
| + using RenderBlock::firstLineBox;
|
| + using RenderBlock::lastRootBox;
|
| +
|
| +protected:
|
| void addOverflowFromChildren() final;
|
|
|
| void simplifiedNormalFlowLayout() final;
|
| @@ -48,9 +82,16 @@ protected:
|
| private:
|
| virtual const char* renderName() const override;
|
|
|
| + void layoutChildren(bool relayoutChildren, SubtreeLayoutScope&, LayoutUnit beforeEdge, LayoutUnit afterEdge);
|
| +
|
| void markLinesDirtyInBlockRange(LayoutUnit logicalTop, LayoutUnit logicalBottom, RootInlineBox* highest = 0);
|
|
|
| + void updateLogicalWidthForAlignment(const ETextAlign&, const RootInlineBox*, BidiRun* trailingSpaceRun, float& logicalLeft, float& totalLogicalWidth, float& availableLogicalWidth, unsigned expansionOpportunityCount);
|
| +
|
| + RootInlineBox* createAndAppendRootInlineBox();
|
| + RootInlineBox* createRootInlineBox();
|
| InlineFlowBox* createLineBoxes(RenderObject*, const LineInfo&, InlineBox* childBox);
|
| + InlineBox* createInlineBoxForRenderer(RenderObject*, bool isRootLineBox, bool isOnlyRun = false);
|
| RootInlineBox* constructLine(BidiRunList<BidiRun>&, const LineInfo&);
|
| void computeInlineDirectionPositionsForLine(RootInlineBox*, const LineInfo&, BidiRun* firstRun, BidiRun* trailingSpaceRun, bool reachedEnd, GlyphOverflowAndFallbackFontsMap&, VerticalPositionCache&, WordMeasurements&);
|
| BidiRun* computeInlineDirectionPositionsForSegment(RootInlineBox*, const LineInfo&, ETextAlign, float& logicalLeft,
|
| @@ -62,7 +103,6 @@ private:
|
| void layoutRunsAndFloatsInRange(LineLayoutState&, InlineBidiResolver&,
|
| const InlineIterator& cleanLineStart, const BidiStatus& cleanLineBidiStatus);
|
| void linkToEndLineIfNeeded(LineLayoutState&);
|
| - void checkFloatsInCleanLine(RootInlineBox*, Vector<FloatWithRect>&, size_t& floatIndex, bool& encounteredNewFloat, bool& dirtiedByFloat);
|
| RootInlineBox* determineStartPosition(LineLayoutState&, InlineBidiResolver&);
|
| void determineEndPosition(LineLayoutState&, RootInlineBox* startBox, InlineIterator& cleanLineStart, BidiStatus& cleanLineBidiStatus);
|
| bool checkPaginationAndFloatsAtEndLine(LineLayoutState&);
|
|
|