Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(39)

Side by Side Diff: Source/core/rendering/line/BreakingContextInlineHeaders.h

Issue 209443007: Remove shape-inside support (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix Zoltan's comments Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ight reserved. 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ight reserved.
4 * Copyright (C) 2010 Google Inc. All rights reserved. 4 * Copyright (C) 2010 Google Inc. All rights reserved.
5 * Copyright (C) 2013 Adobe Systems Incorporated. 5 * Copyright (C) 2013 Adobe Systems Incorporated.
6 * 6 *
7 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public 8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
(...skipping 18 matching lines...) Expand all
29 #include "core/rendering/RenderCombineText.h" 29 #include "core/rendering/RenderCombineText.h"
30 #include "core/rendering/RenderInline.h" 30 #include "core/rendering/RenderInline.h"
31 #include "core/rendering/RenderLayer.h" 31 #include "core/rendering/RenderLayer.h"
32 #include "core/rendering/RenderListMarker.h" 32 #include "core/rendering/RenderListMarker.h"
33 #include "core/rendering/RenderRubyRun.h" 33 #include "core/rendering/RenderRubyRun.h"
34 #include "core/rendering/break_lines.h" 34 #include "core/rendering/break_lines.h"
35 #include "core/rendering/line/LineBreaker.h" 35 #include "core/rendering/line/LineBreaker.h"
36 #include "core/rendering/line/LineInfo.h" 36 #include "core/rendering/line/LineInfo.h"
37 #include "core/rendering/line/LineWidth.h" 37 #include "core/rendering/line/LineWidth.h"
38 #include "core/rendering/line/TrailingObjects.h" 38 #include "core/rendering/line/TrailingObjects.h"
39 #include "core/rendering/shapes/ShapeInsideInfo.h"
40 #include "core/rendering/svg/RenderSVGInlineText.h" 39 #include "core/rendering/svg/RenderSVGInlineText.h"
41 40
42 namespace WebCore { 41 namespace WebCore {
43 42
44 // We don't let our line box tree for a single line get any deeper than this. 43 // We don't let our line box tree for a single line get any deeper than this.
45 const unsigned cMaxLineDepth = 200; 44 const unsigned cMaxLineDepth = 200;
46 45
47 class WordMeasurement { 46 class WordMeasurement {
48 public: 47 public:
49 WordMeasurement() 48 WordMeasurement()
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 499
501 inline float firstPositiveWidth(const WordMeasurements& wordMeasurements) 500 inline float firstPositiveWidth(const WordMeasurements& wordMeasurements)
502 { 501 {
503 for (size_t i = 0; i < wordMeasurements.size(); ++i) { 502 for (size_t i = 0; i < wordMeasurements.size(); ++i) {
504 if (wordMeasurements[i].width > 0) 503 if (wordMeasurements[i].width > 0)
505 return wordMeasurements[i].width; 504 return wordMeasurements[i].width;
506 } 505 }
507 return 0; 506 return 0;
508 } 507 }
509 508
510 inline void updateSegmentsForShapes(RenderBlockFlow* block, const FloatingObject * lastFloatFromPreviousLine, const WordMeasurements& wordMeasurements, LineWidth & width, bool isFirstLine)
511 {
512 ASSERT(lastFloatFromPreviousLine);
513
514 ShapeInsideInfo* shapeInsideInfo = block->layoutShapeInsideInfo();
515 if (!lastFloatFromPreviousLine->isPlaced() || !shapeInsideInfo)
516 return;
517
518 bool isHorizontalWritingMode = block->isHorizontalWritingMode();
519 LayoutUnit logicalOffsetFromShapeContainer = block->logicalOffsetFromShapeAn cestorContainer(&shapeInsideInfo->owner()).height();
520
521 LayoutUnit lineLogicalTop = block->logicalHeight() + logicalOffsetFromShapeC ontainer;
522 LayoutUnit lineLogicalHeight = block->lineHeight(isFirstLine, isHorizontalWr itingMode ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes);
523 LayoutUnit lineLogicalBottom = lineLogicalTop + lineLogicalHeight;
524
525 LayoutUnit floatLogicalTop = block->logicalTopForFloat(lastFloatFromPrevious Line);
526 LayoutUnit floatLogicalBottom = block->logicalBottomForFloat(lastFloatFromPr eviousLine);
527
528 bool lineOverlapsWithFloat = (floatLogicalTop < lineLogicalBottom) && (lineL ogicalTop < floatLogicalBottom);
529 if (!lineOverlapsWithFloat)
530 return;
531
532 // FIXME: We need to remove this once we support multiple-segment polygons
533 if (shapeInsideInfo->segments().size() > 1)
534 return;
535
536 float minSegmentWidth = firstPositiveWidth(wordMeasurements);
537
538 LayoutUnit floatLogicalWidth = block->logicalWidthForFloat(lastFloatFromPrev iousLine);
539 LayoutUnit availableLogicalWidth = block->logicalWidth() - block->logicalRig htForFloat(lastFloatFromPreviousLine);
540 if (availableLogicalWidth < minSegmentWidth)
541 block->setLogicalHeight(floatLogicalBottom);
542
543 if (block->logicalHeight() < floatLogicalTop) {
544 shapeInsideInfo->adjustLogicalLineTop(minSegmentWidth + floatLogicalWidt h);
545 block->setLogicalHeight(shapeInsideInfo->logicalLineTop() - logicalOffse tFromShapeContainer);
546 }
547
548 lineLogicalTop = block->logicalHeight() + logicalOffsetFromShapeContainer;
549
550 shapeInsideInfo->updateSegmentsForLine(lineLogicalTop, lineLogicalHeight);
551 width.updateCurrentShapeSegment();
552 width.updateAvailableWidth();
553 }
554
555 inline float measureHyphenWidth(RenderText* renderer, const Font& font, TextDire ction textDirection) 509 inline float measureHyphenWidth(RenderText* renderer, const Font& font, TextDire ction textDirection)
556 { 510 {
557 RenderStyle* style = renderer->style(); 511 RenderStyle* style = renderer->style();
558 return font.width(RenderBlockFlow::constructTextRun(renderer, font, 512 return font.width(RenderBlockFlow::constructTextRun(renderer, font,
559 style->hyphenString().string(), style, style->direction())); 513 style->hyphenString().string(), style, style->direction()));
560 } 514 }
561 515
562 ALWAYS_INLINE TextDirection textDirectionFromUnicode(WTF::Unicode::Direction dir ection) 516 ALWAYS_INLINE TextDirection textDirectionFromUnicode(WTF::Unicode::Direction dir ection)
563 { 517 {
564 return direction == WTF::Unicode::RightToLeft 518 return direction == WTF::Unicode::RightToLeft
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 additionalTmpW = textWidth(renderText, lastSpace, m_current.offs et() - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpa ce, &wordMeasurement.fallbackFonts); 666 additionalTmpW = textWidth(renderText, lastSpace, m_current.offs et() - lastSpace, font, m_width.currentWidth(), isFixedPitch, m_collapseWhiteSpa ce, &wordMeasurement.fallbackFonts);
713 667
714 wordMeasurement.width = additionalTmpW + wordSpacingForWordMeasureme nt; 668 wordMeasurement.width = additionalTmpW + wordSpacingForWordMeasureme nt;
715 additionalTmpW += lastSpaceWordSpacing; 669 additionalTmpW += lastSpaceWordSpacing;
716 m_width.addUncommittedWidth(additionalTmpW); 670 m_width.addUncommittedWidth(additionalTmpW);
717 if (!m_appliedStartWidth) { 671 if (!m_appliedStartWidth) {
718 m_width.addUncommittedWidth(inlineLogicalWidth(m_current.object( ), true, false).toFloat()); 672 m_width.addUncommittedWidth(inlineLogicalWidth(m_current.object( ), true, false).toFloat());
719 m_appliedStartWidth = true; 673 m_appliedStartWidth = true;
720 } 674 }
721 675
722 if (m_lastFloatFromPreviousLine)
723 updateSegmentsForShapes(m_block, m_lastFloatFromPreviousLine, wo rdMeasurements, m_width, m_lineInfo.isFirstLine());
724
725 applyWordSpacing = wordSpacing && m_currentCharacterIsSpace; 676 applyWordSpacing = wordSpacing && m_currentCharacterIsSpace;
726 677
727 if (!m_width.committedWidth() && m_autoWrap && !m_width.fitsOnLine() ) 678 if (!m_width.committedWidth() && m_autoWrap && !m_width.fitsOnLine() )
728 m_width.fitBelowFloats(m_lineInfo.isFirstLine()); 679 m_width.fitBelowFloats(m_lineInfo.isFirstLine());
729 680
730 if (m_autoWrap || breakWords) { 681 if (m_autoWrap || breakWords) {
731 // If we break only after white-space, consider the current char acter 682 // If we break only after white-space, consider the current char acter
732 // as candidate width for this line. 683 // as candidate width for this line.
733 bool lineWasTooWide = false; 684 bool lineWasTooWide = false;
734 if (m_width.fitsOnLine() && m_currentCharacterIsSpace && m_curre ntStyle->breakOnlyAfterWhiteSpace() && !midWordBreak) { 685 if (m_width.fitsOnLine() && m_currentCharacterIsSpace && m_curre ntStyle->breakOnlyAfterWhiteSpace() && !midWordBreak) {
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
951 return IndentText; 902 return IndentText;
952 if (isAfterHardLineBreak && style->textIndentLine() == TextIndentEachLine) 903 if (isAfterHardLineBreak && style->textIndentLine() == TextIndentEachLine)
953 return IndentText; 904 return IndentText;
954 905
955 return DoNotIndentText; 906 return DoNotIndentText;
956 } 907 }
957 908
958 } 909 }
959 910
960 #endif // BreakingContextInlineHeaders_h 911 #endif // BreakingContextInlineHeaders_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698