| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SKY_ENGINE_CORE_RENDERING_RENDERPARAGRAPH_H_ |
| #define SKY_ENGINE_CORE_RENDERING_RENDERPARAGRAPH_H_ |
| |
| #include "sky/engine/core/dom/ContainerNode.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 RenderBlock { |
| public: |
| explicit RenderParagraph(ContainerNode*); |
| virtual ~RenderParagraph(); |
| |
| 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*); |
| |
| 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; |
| |
| void paintChildren(PaintInfo&, const LayoutPoint&, Vector<RenderBox*>& layers) final; |
| |
| bool hitTestContents(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset) final; |
| |
| virtual ETextAlign textAlignmentForLine(bool endsWithSoftBreak) const; |
| |
| void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const final; |
| |
| int firstLineBoxBaseline(FontBaselineOrAuto baselineType) const final; |
| int lastLineBoxBaseline(LineDirectionMode) const final; |
| |
| 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, |
| float& availableLogicalWidth, BidiRun* firstRun, BidiRun* trailingSpaceRun, GlyphOverflowAndFallbackFontsMap& textBoxDataMap, VerticalPositionCache&, WordMeasurements&); |
| void computeBlockDirectionPositionsForLine(RootInlineBox*, BidiRun*, GlyphOverflowAndFallbackFontsMap&, VerticalPositionCache&); |
| // Helper function for layoutChildren() |
| RootInlineBox* createLineBoxesFromBidiRuns(unsigned bidiLevel, BidiRunList<BidiRun>&, const InlineIterator& end, LineInfo&, VerticalPositionCache&, BidiRun* trailingSpaceRun, WordMeasurements&); |
| void layoutRunsAndFloats(LineLayoutState&); |
| void layoutRunsAndFloatsInRange(LineLayoutState&, InlineBidiResolver&, |
| const InlineIterator& cleanLineStart, const BidiStatus& cleanLineBidiStatus); |
| void linkToEndLineIfNeeded(LineLayoutState&); |
| RootInlineBox* determineStartPosition(LineLayoutState&, InlineBidiResolver&); |
| void determineEndPosition(LineLayoutState&, RootInlineBox* startBox, InlineIterator& cleanLineStart, BidiStatus& cleanLineBidiStatus); |
| bool checkPaginationAndFloatsAtEndLine(LineLayoutState&); |
| bool matchedEndLine(LineLayoutState&, const InlineBidiResolver&, const InlineIterator& endLineStart, const BidiStatus& endLineStatus); |
| void deleteEllipsisLineBoxes(); |
| void checkLinesForTextOverflow(); |
| }; |
| |
| DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderParagraph, isRenderParagraph()); |
| |
| } // namespace blink |
| |
| #endif // SKY_ENGINE_CORE_RENDERING_RENDERPARAGRAPH_H_ |