Changeset 270145 in webkit
- Timestamp:
- Nov 21, 2020 6:02:00 AM (3 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r270144 r270145 1 2020-11-21 Zalan Bujtas <zalan@apple.com> 2 3 [LFC][Integration] Remove redundant lineBoxWidth from Line 4 https://bugs.webkit.org/show_bug.cgi?id=219208 5 6 Reviewed by Antti Koivisto. 7 8 Line::lineBoxWidth() is incorrectly returning the content logical width. By definition it is the available horizontal space 9 for the content and therefore it equals to Line::rect().width(). 10 1. Replace lineLogicalRect with lineBoxLogicalRect. 11 2. Remove redundant lineBoxWidth() from Line. 12 13 * display/css/DisplayBoxFactory.cpp: 14 (WebCore::Display::BoxFactory::displayBoxForTextRun const): 15 * layout/FormattingContextGeometry.cpp: 16 (WebCore::Layout::FormattingContext::Geometry::contentHeightForFormattingContextRoot const): 17 * layout/blockformatting/BlockFormattingContextGeometry.cpp: 18 (WebCore::Layout::BlockFormattingContext::Geometry::inFlowNonReplacedContentHeightAndMargin): 19 * layout/inlineformatting/InlineFormattingContext.cpp: 20 (WebCore::Layout::InlineFormattingContext::computeGeometryForLineContent): 21 * layout/inlineformatting/InlineFormattingContext.h: 22 * layout/inlineformatting/InlineFormattingContextGeometry.cpp: 23 (WebCore::Layout::LineBoxBuilder::constructInlineLevelBoxes): 24 (WebCore::Layout::InlineFormattingContext::Geometry::computedLineLogicalRect const): Deleted. 25 * layout/inlineformatting/InlineLineBox.h: 26 (WebCore::Layout::LineBox::logicalRect const): 27 (WebCore::Layout::LineBox::logicalTopLeft const): 28 (WebCore::Layout::LineBox::logicalSize const): 29 * layout/inlineformatting/InlineLineGeometry.h: 30 (WebCore::Layout::InlineLineGeometry::lineBoxLogicalRect const): 31 (WebCore::Layout::InlineLineGeometry::moveVertically): 32 (WebCore::Layout::InlineLineGeometry::InlineLineGeometry): 33 (WebCore::Layout::InlineLineGeometry::logicalRect const): Deleted. 34 (WebCore::Layout::InlineLineGeometry::lineBoxLogicalSize const): Deleted. 35 * layout/integration/LayoutIntegrationInlineContentBuilder.cpp: 36 (WebCore::LayoutIntegration::lineOverflowWidth): 37 (WebCore::LayoutIntegration::InlineContentBuilder::computeLineLevelVisualAdjustmentsForRuns const): 38 (WebCore::LayoutIntegration::InlineContentBuilder::createDisplayLineRuns const): 39 (WebCore::LayoutIntegration::InlineContentBuilder::createDisplayLines const): 40 * layout/integration/LayoutIntegrationLine.h: 41 (WebCore::LayoutIntegration::Line::Line): 42 (WebCore::LayoutIntegration::Line::rect const): 43 (WebCore::LayoutIntegration::Line::lineBoxWidth const): Deleted. 44 * layout/integration/LayoutIntegrationPagination.cpp: 45 (WebCore::LayoutIntegration::makeAdjustedContent): 46 * layout/layouttree/LayoutTreeBuilder.cpp: 47 (WebCore::Layout::showInlineTreeAndRuns): 48 1 49 2020-11-21 Zalan Bujtas <zalan@apple.com> 2 50 -
trunk/Source/WebCore/display/css/DisplayBoxFactory.cpp
r269822 r270145 136 136 { 137 137 ASSERT(run.text()); 138 auto lineRect = lineGeometry.l ogicalRect();138 auto lineRect = lineGeometry.lineBoxLogicalRect(); 139 139 auto lineLayoutRect = LayoutRect { lineRect.left(), lineRect.top(), lineRect.width(), lineRect.height() }; 140 140 -
trunk/Source/WebCore/layout/FormattingContextGeometry.cpp
r270144 r270145 198 198 // Even empty containers generate one line. 199 199 ASSERT(!lines.isEmpty()); 200 top = lines.first().l ogicalRect().top();201 bottom = lines.last().l ogicalRect().bottom() + inlineFormattingState.clearGapAfterLastLine();200 top = lines.first().lineBoxLogicalRect().top(); 201 bottom = lines.last().lineBoxLogicalRect().bottom() + inlineFormattingState.clearGapAfterLastLine(); 202 202 } else if (formattingContextRoot.establishesFlexFormattingContext()) { 203 203 auto& lines = layoutState.establishedFlexFormattingState(formattingContextRoot).lines(); -
trunk/Source/WebCore/layout/blockformatting/BlockFormattingContextGeometry.cpp
r270144 r270145 82 82 // Even empty containers generate one line. 83 83 ASSERT(!lines.isEmpty()); 84 return { toLayoutUnit(lines.last().l ogicalRect().bottom() + inlineFormattingState.clearGapAfterLastLine()) - borderAndPaddingTop, nonCollapsedMargin };84 return { toLayoutUnit(lines.last().lineBoxLogicalRect().bottom() + inlineFormattingState.clearGapAfterLastLine()) - borderAndPaddingTop, nonCollapsedMargin }; 85 85 } 86 86 -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.cpp
r270143 r270145 411 411 formattingState.addLineBox(geometry.lineBoxForLineContent(lineContent)); 412 412 const auto& lineBox = formattingState.lineBoxes().last(); 413 auto lineLogicalRect = geometry.computedLineLogicalRect(lineBox, lineContent);413 auto& lineBoxLogicalRect = lineBox.logicalRect(); 414 414 415 415 auto updateFloatGeometry = [&] { … … 422 422 auto& boxGeometry = formattingState.boxGeometry(floatBox); 423 423 // Set static position first. 424 auto verticalStaticPosition = floatCandidate.isIntrusive ? line LogicalRect.top() : lineLogicalRect.bottom();425 boxGeometry.setLogicalTopLeft({ line LogicalRect.left(), verticalStaticPosition });424 auto verticalStaticPosition = floatCandidate.isIntrusive ? lineBoxLogicalRect.top() : lineBoxLogicalRect.bottom(); 425 boxGeometry.setLogicalTopLeft({ lineBoxLogicalRect.left(), verticalStaticPosition }); 426 426 // Float it. 427 427 boxGeometry.setLogicalTopLeft(floatingContext.positionForFloat(floatBox, horizontalConstraints)); … … 458 458 auto logicalRect = lineBox.logicalMarginRectForInlineLevelBox(layoutBox); 459 459 // Inline box height includes the margin box. Let's account for that. 460 auto borderBoxLogicalTopLeft = line LogicalRect.topLeft();460 auto borderBoxLogicalTopLeft = lineBoxLogicalRect.topLeft(); 461 461 borderBoxLogicalTopLeft.move(logicalRect.left(), logicalRect.top() + boxGeometry.marginBefore()); 462 462 … … 494 494 495 495 auto constructLineGeometry = [&] { 496 formattingState.addLine({ line LogicalRect, lineBox.logicalSize(), lineBox.alignmentBaseline(), lineBox.horizontalAlignmentOffset().valueOr(InlineLayoutUnit { }), lineContent.contentLogicalWidth });496 formattingState.addLine({ lineBoxLogicalRect, lineBox.alignmentBaseline(), lineBox.horizontalAlignmentOffset().valueOr(InlineLayoutUnit { }), lineContent.contentLogicalWidth }); 497 497 }; 498 498 constructLineGeometry(); 499 499 500 return line LogicalRect;500 return lineBoxLogicalRect; 501 501 } 502 502 -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContext.h
r268974 r270145 68 68 public: 69 69 LineBox lineBoxForLineContent(const LineBuilder::LineContent&); 70 InlineRect computedLineLogicalRect(const LineBox&, const LineBuilder::LineContent&) const;71 70 InlineLayoutUnit logicalTopForNextLine(const LineBuilder::LineContent&, InlineLayoutUnit previousLineLogicalBottom, const FloatingContext&) const; 72 71 -
trunk/Source/WebCore/layout/inlineformatting/InlineFormattingContextGeometry.cpp
r270144 r270145 260 260 auto& formattingState = layoutState().establishedInlineFormattingState(downcast<ContainerBox>(layoutBox)); 261 261 auto& lastLine = formattingState.lines().last(); 262 auto inlineBlockBaseline = lastLine.l ogicalRect().top() + lastLine.baseline();262 auto inlineBlockBaseline = lastLine.lineBoxLogicalRect().top() + lastLine.baseline(); 263 263 ascent = inlineLevelBoxGeometry.marginBefore() + inlineLevelBoxGeometry.borderTop() + inlineLevelBoxGeometry.paddingTop().valueOr(0) + inlineBlockBaseline; 264 264 } else if (layoutBox.isReplacedBox()) … … 529 529 } 530 530 531 InlineRect InlineFormattingContext::Geometry::computedLineLogicalRect(const LineBox& lineBox, const LineBuilder::LineContent& lineContent) const532 {533 return { lineBox.logicalTopLeft(), lineContent.lineLogicalWidth, lineBox.logicalHeight() };534 }535 536 531 InlineLayoutUnit InlineFormattingContext::Geometry::logicalTopForNextLine(const LineBuilder::LineContent& lineContent, InlineLayoutUnit previousLineLogicalBottom, const FloatingContext& floatingContext) const 537 532 { -
trunk/Source/WebCore/layout/inlineformatting/InlineLineBox.h
r270135 r270145 132 132 LineBox(const InlineLayoutPoint& logicalTopLeft, InlineLayoutUnit logicalWidth, IsLineConsideredEmpty); 133 133 134 const InlineRect& logicalRect() const { return m_logicalRect; } 134 135 InlineLayoutUnit logicalWidth() const { return logicalSize().width(); } 135 136 InlineLayoutUnit logicalHeight() const { return logicalSize().height(); } 136 InlineLayoutPoint logicalTopLeft() const { return m_logicalRect.topLeft(); }137 InlineLayoutSize logicalSize() const { return m_logicalRect.size(); }137 InlineLayoutPoint logicalTopLeft() const { return logicalRect().topLeft(); } 138 InlineLayoutSize logicalSize() const { return logicalRect().size(); } 138 139 139 140 Optional<InlineLayoutUnit> horizontalAlignmentOffset() const { return m_horizontalAlignmentOffset; } -
trunk/Source/WebCore/layout/inlineformatting/InlineLineGeometry.h
r270144 r270145 36 36 WTF_MAKE_FAST_ALLOCATED; 37 37 public: 38 InlineLineGeometry(const InlineRect& line LogicalRect, const InlineLayoutSize& lineBoxLogicalSize, InlineLayoutUnit aligmentBaseline, InlineLayoutUnit contentLogicalLeftOffset, InlineLayoutUnit contentLogicalWidth);38 InlineLineGeometry(const InlineRect& lineBoxLogicalRect, InlineLayoutUnit aligmentBaseline, InlineLayoutUnit contentLogicalLeftOffset, InlineLayoutUnit contentLogicalWidth); 39 39 40 const InlineRect& logicalRect() const { return m_logicalRect; } 41 const InlineLayoutSize& lineBoxLogicalSize() const { return m_lineBoxLogicalSize; } 40 const InlineRect& lineBoxLogicalRect() const { return m_lineBoxLogicalRect; } 42 41 43 42 InlineLayoutUnit baseline() const { return m_aligmentBaseline; } … … 46 45 InlineLayoutUnit contentLogicalWidth() const { return m_contentLogicalWidth; } 47 46 48 void moveVertically(InlineLayoutUnit offset) { m_l ogicalRect.moveVertically(offset); }47 void moveVertically(InlineLayoutUnit offset) { m_lineBoxLogicalRect.moveVertically(offset); } 49 48 50 49 private: 51 InlineRect m_logicalRect; 52 InlineLayoutSize m_lineBoxLogicalSize; 50 InlineRect m_lineBoxLogicalRect; 53 51 InlineLayoutUnit m_aligmentBaseline { 0 }; 54 52 InlineLayoutUnit m_contentLogicalLeftOffset { 0 }; … … 56 54 }; 57 55 58 inline InlineLineGeometry::InlineLineGeometry(const InlineRect& lineLogicalRect, const InlineLayoutSize& lineBoxLogicalSize, InlineLayoutUnit aligmentBaseline, InlineLayoutUnit contentLogicalLeftOffset, InlineLayoutUnit contentLogicalWidth) 59 : m_logicalRect(lineLogicalRect) 60 , m_lineBoxLogicalSize(lineBoxLogicalSize) 56 inline InlineLineGeometry::InlineLineGeometry(const InlineRect& lineBoxLogicalRect, InlineLayoutUnit aligmentBaseline, InlineLayoutUnit contentLogicalLeftOffset, InlineLayoutUnit contentLogicalWidth) 57 : m_lineBoxLogicalRect(lineBoxLogicalRect) 61 58 , m_aligmentBaseline(aligmentBaseline) 62 59 , m_contentLogicalLeftOffset(contentLogicalLeftOffset) -
trunk/Source/WebCore/layout/integration/LayoutIntegrationInlineContentBuilder.cpp
r270144 r270145 49 49 }; 50 50 51 inline static float lineOverflowWidth(const RenderBlockFlow& flow, InlineLayoutUnit line LogicalWidth, InlineLayoutUnit lineBoxLogicalWidth)51 inline static float lineOverflowWidth(const RenderBlockFlow& flow, InlineLayoutUnit lineBoxLogicalWidth, InlineLayoutUnit lineContentLogicalWidth) 52 52 { 53 53 // FIXME: It's the copy of the lets-adjust-overflow-for-the-caret behavior from ComplexLineLayout::addOverflowFromInlineChildren. … … 57 57 if (flow.hasOverflowClip() && !endPadding && flow.element() && flow.element()->isRootEditableElement()) 58 58 endPadding = 1; 59 line BoxLogicalWidth += endPadding;60 return std::max(line LogicalWidth, lineBoxLogicalWidth);59 lineContentLogicalWidth += endPadding; 60 return std::max(lineBoxLogicalWidth, lineContentLogicalWidth); 61 61 } 62 62 … … 187 187 if (shouldCheckHorizontalOverflowForContentReplacement) { 188 188 auto& line = lines[lineIndex]; 189 auto & lineLogicalRect = line.logicalRect();190 auto overflowWidth = lineOverflowWidth(m_blockFlow, line LogicalRect.width(), line.lineBoxLogicalSize().width());191 lineLevelVisualAdjustmentsForRuns[lineIndex].needsTrailingContentReplacement = overflowWidth > line LogicalRect.width();189 auto lineBoxLogicalWidth = line.lineBoxLogicalRect().width(); 190 auto overflowWidth = lineOverflowWidth(m_blockFlow, lineBoxLogicalWidth, line.contentLogicalWidth()); 191 lineLevelVisualAdjustmentsForRuns[lineIndex].needsTrailingContentReplacement = overflowWidth > lineBoxLogicalWidth; 192 192 } 193 193 } … … 214 214 auto& layoutBox = lineRun.layoutBox(); 215 215 auto lineIndex = lineRun.lineIndex(); 216 auto& line LogicalRect = lines[lineIndex].logicalRect();216 auto& lineBoxLogicalRect = lines[lineIndex].lineBoxLogicalRect(); 217 217 // Inline boxes are relative to the line box while final Runs need to be relative to the parent Box 218 218 // FIXME: Shouldn't we just leave them be relative to the line box? … … 220 220 // Line runs are margin box based, let's convert them to border box. 221 221 auto& geometry = m_layoutState.geometryForBox(layoutBox); 222 runRect.moveBy({ line LogicalRect.left() + std::max(geometry.marginStart(), 0_lu), lineLogicalRect.top() + geometry.marginBefore() });222 runRect.moveBy({ lineBoxLogicalRect.left() + std::max(geometry.marginStart(), 0_lu), lineBoxLogicalRect.top() + geometry.marginBefore() }); 223 223 runRect.setSize({ geometry.borderBoxWidth(), geometry.borderBoxHeight() }); 224 224 if (lineLevelVisualAdjustmentsForRuns[lineIndex].needsIntegralPosition) … … 233 233 auto& layoutBox = lineRun.layoutBox(); 234 234 auto lineIndex = lineRun.lineIndex(); 235 auto& line LogicalRect = lines[lineIndex].logicalRect();235 auto& lineBoxLogicalRect = lines[lineIndex].lineBoxLogicalRect(); 236 236 auto runRect = FloatRect { lineRun.logicalRect() }; 237 237 // Inline boxes are relative to the line box while final Runs need to be relative to the parent Box 238 238 // FIXME: Shouldn't we just leave them be relative to the line box? 239 runRect.moveBy({ line LogicalRect.left(), lineLogicalRect.top() });239 runRect.moveBy({ lineBoxLogicalRect.left(), lineBoxLogicalRect.top() }); 240 240 if (lineLevelVisualAdjustmentsForRuns[lineIndex].needsIntegralPosition) 241 241 runRect.setY(roundToInt(runRect.y())); … … 255 255 auto runLogicalRect = lineRun.logicalRect(); 256 256 auto ellipsisWidth = style.fontCascade().width(WebCore::TextRun { &horizontalEllipsis }); 257 if (runLogicalRect.right() + ellipsisWidth > line LogicalRect.right()) {257 if (runLogicalRect.right() + ellipsisWidth > lineBoxLogicalRect.right()) { 258 258 // The next run with ellipsis would surely overflow. So let's just add it to this run even if 259 259 // it makes the run wider than it originally was. 260 260 hasAdjustedTrailingLineList[lineIndex] = true; 261 261 float resultWidth = 0; 262 auto maxWidth = line LogicalRect.width() - runLogicalRect.left();262 auto maxWidth = lineBoxLogicalRect.width() - runLogicalRect.left(); 263 263 return StringTruncator::rightTruncate(originalContent, maxWidth, style.fontCascade(), resultWidth, true); 264 264 } … … 308 308 for (size_t lineIndex = 0; lineIndex < lines.size(); ++lineIndex) { 309 309 auto& line = lines[lineIndex]; 310 auto& lineLogicalRect = line.logicalRect(); 311 auto lineBoxLogicalSize = line.lineBoxLogicalSize(); 310 auto& lineBoxLogicalRect = line.lineBoxLogicalRect(); 312 311 // FIXME: This is where the logical to physical translate should happen. 313 auto scrollableOverflowRect = FloatRect { line LogicalRect.left(), lineLogicalRect.top(), lineOverflowWidth(m_blockFlow, lineLogicalRect.width(), lineBoxLogicalSize.width()), lineLogicalRect.height() };312 auto scrollableOverflowRect = FloatRect { lineBoxLogicalRect.left(), lineBoxLogicalRect.top(), lineOverflowWidth(m_blockFlow, lineBoxLogicalRect.width(), line.contentLogicalWidth()), lineBoxLogicalRect.height() }; 314 313 315 314 auto firstRunIndex = runIndex; … … 318 317 lineInkOverflowRect.unite(runs[runIndex++].inkOverflow()); 319 318 auto runCount = runIndex - firstRunIndex; 320 auto lineRect = FloatRect { lineLogicalRect };321 319 auto enclosingTopAndBottom = [&] { 322 320 // Let's (vertically)enclose all the inline level boxes. 323 // This mostly matches 'line Rect', unless line-height triggers line box overflow (not to be confused with ink or scroll overflow).321 // This mostly matches 'line box rect', unless line-height triggers line box overflow (not to be confused with ink or scroll overflow). 324 322 auto enclosingTop = Optional<float> { }; 325 323 auto enclosingBottom = Optional<float> { }; … … 339 337 ASSERT(enclosingBottom && enclosingTop); 340 338 // inline boxes are relative to the line, let's make them relative to the root's content box. 341 return Line::EnclosingTopAndBottom { line Rect.y() + *enclosingTop, lineRect.y() + *enclosingBottom };339 return Line::EnclosingTopAndBottom { lineBoxLogicalRect.top() + *enclosingTop, lineBoxLogicalRect.top() + *enclosingBottom }; 342 340 }(); 341 auto adjustedLineBoxRect = FloatRect { lineBoxLogicalRect }; 343 342 if (lineLevelVisualAdjustmentsForRuns[lineIndex].needsIntegralPosition) { 344 lineRect.setY(roundToInt(lineRect.y()));343 adjustedLineBoxRect.setY(roundToInt(adjustedLineBoxRect.y())); 345 344 enclosingTopAndBottom.top = roundToInt(enclosingTopAndBottom.top); 346 345 enclosingTopAndBottom.bottom = roundToInt(enclosingTopAndBottom.bottom); 347 346 } 348 inlineContent.lines.append({ firstRunIndex, runCount, lineRect, lineBoxLogicalSize.width(), enclosingTopAndBottom, scrollableOverflowRect, lineInkOverflowRect, line.baseline(), line.contentLogicalLeftOffset(), line.contentLogicalWidth() });347 inlineContent.lines.append({ firstRunIndex, runCount, adjustedLineBoxRect, enclosingTopAndBottom, scrollableOverflowRect, lineInkOverflowRect, line.baseline(), line.contentLogicalLeftOffset(), line.contentLogicalWidth() }); 349 348 } 350 349 } -
trunk/Source/WebCore/layout/integration/LayoutIntegrationLine.h
r270143 r270145 41 41 float bottom { 0 }; 42 42 }; 43 Line(size_t firstRunIndex, size_t runCount, const FloatRect& line Rect, float lineBoxWidth, EnclosingTopAndBottom enclosingTopAndBottom, const FloatRect& scrollableOverflow, const FloatRect& inkOverflow, float baseline, float contentLeftOffset, float contentWidth)43 Line(size_t firstRunIndex, size_t runCount, const FloatRect& lineBoxRect, EnclosingTopAndBottom enclosingTopAndBottom, const FloatRect& scrollableOverflow, const FloatRect& inkOverflow, float baseline, float contentLeftOffset, float contentWidth) 44 44 : m_firstRunIndex(firstRunIndex) 45 45 , m_runCount(runCount) 46 , m_lineRect(lineRect) 47 , m_lineBoxWidth(lineBoxWidth) 46 , m_lineBoxRect(lineBoxRect) 48 47 , m_enclosingTopAndBottom(enclosingTopAndBottom) 49 48 , m_scrollableOverflow(scrollableOverflow) … … 57 56 size_t firstRunIndex() const { return m_firstRunIndex; } 58 57 size_t runCount() const { return m_runCount; } 59 const FloatRect& rect() const { return m_lineRect; } 60 float lineBoxWidth() const { return m_lineBoxWidth; } 58 const FloatRect& rect() const { return m_lineBoxRect; } 61 59 float enclosingContentTop() const { return m_enclosingTopAndBottom.top; } 62 60 float enclosingContentBottom() const { return m_enclosingTopAndBottom.bottom; } … … 70 68 size_t m_firstRunIndex { 0 }; 71 69 size_t m_runCount { 0 }; 72 // Line is always as tall as the line box is. However they may differ in width.73 // While line box encloses all the inline level boxes on the line horizontally, the line itself may be shorter (and trigger horizontal overflow).70 // This is line box geometry (see https://www.w3.org/TR/css-inline-3/#line-box). 71 FloatRect m_lineBoxRect; 74 72 // Enclosing top and bottom includes all inline level boxes (border box) vertically. In certain cases (see line-height property) 75 73 // the line (and the line box) is not as tall as the inline level boxes on the line. 76 FloatRect m_lineRect;77 float m_lineBoxWidth { 0 };78 74 EnclosingTopAndBottom m_enclosingTopAndBottom; 79 75 FloatRect m_scrollableOverflow; -
trunk/Source/WebCore/layout/integration/LayoutIntegrationPagination.cpp
r270143 r270145 131 131 line.runCount(), 132 132 moveVertically(line.rect(), offset), 133 line.rect().width(),134 133 { line.enclosingContentTop() + offset, line.enclosingContentBottom() + offset }, 135 134 moveVertically(line.scrollableOverflow(), offset), -
trunk/Source/WebCore/layout/layouttree/LayoutTreeBuilder.cpp
r270144 r270145 395 395 addSpacing(); 396 396 auto& line = lines[lineIndex]; 397 auto& line LogicalRect = line.logicalRect();398 stream << "line at (" << line LogicalRect.left() << "," << lineLogicalRect.top() << ") size (" << lineLogicalRect.width() << "x" << lineLogicalRect.height() << ") baseline (" << line.baseline() << ")";397 auto& lineBoxLogicalRect = line.lineBoxLogicalRect(); 398 stream << "line at (" << lineBoxLogicalRect.left() << "," << lineBoxLogicalRect.top() << ") size (" << lineBoxLogicalRect.width() << "x" << lineBoxLogicalRect.height() << ") baseline (" << line.baseline() << ")"; 399 399 stream.nextLine(); 400 400
Note: See TracChangeset
for help on using the changeset viewer.