mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
This also fixes the C++ side to give the right baseline information. Previously it was giving the baseline distance for the font, but not for the actual laid-out text. I considered also providing a "defaultBaseline" accessor that returns the distance for the actual dominant baseline, but it turns out right now we never decide the baseline is ideographic. We always use the alphabetic baseline. We should probably fix that... R=eseidel@chromium.org Review URL: https://codereview.chromium.org/1200233002.
117 lines
5.5 KiB
C++
117 lines
5.5 KiB
C++
// 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_
|