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

Side by Side Diff: Source/core/rendering/InlineFlowBox.cpp

Issue 176953008: Include the outline into the visual overflow (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: 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 | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3 * 3 *
4 * This library is free software; you can redistribute it and/or 4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public 5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either 6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version. 7 * version 2 of the License, or (at your option) any later version.
8 * 8 *
9 * This library is distributed in the hope that it will be useful, 9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 if (!child->renderer()->isOutOfFlowPositioned()) { 157 if (!child->renderer()->isOutOfFlowPositioned()) {
158 if (child->isText()) { 158 if (child->isText()) {
159 RenderStyle* childStyle = child->renderer()->style(isFirstLineStyle( )); 159 RenderStyle* childStyle = child->renderer()->style(isFirstLineStyle( ));
160 if (childStyle->letterSpacing() < 0 || childStyle->textShadow() || c hildStyle->textEmphasisMark() != TextEmphasisMarkNone || childStyle->textStrokeW idth()) 160 if (childStyle->letterSpacing() < 0 || childStyle->textShadow() || c hildStyle->textEmphasisMark() != TextEmphasisMarkNone || childStyle->textStrokeW idth())
161 child->clearKnownToHaveNoOverflow(); 161 child->clearKnownToHaveNoOverflow();
162 } else if (child->renderer()->isReplaced()) { 162 } else if (child->renderer()->isReplaced()) {
163 RenderBox* box = toRenderBox(child->renderer()); 163 RenderBox* box = toRenderBox(child->renderer());
164 if (box->hasRenderOverflow() || box->hasSelfPaintingLayer()) 164 if (box->hasRenderOverflow() || box->hasSelfPaintingLayer())
165 child->clearKnownToHaveNoOverflow(); 165 child->clearKnownToHaveNoOverflow();
166 } else if (!child->renderer()->isBR() && (child->renderer()->style(isFir stLineStyle())->boxShadow() || child->boxModelObject()->hasSelfPaintingLayer() 166 } else if (!child->renderer()->isBR() && (child->renderer()->style(isFir stLineStyle())->boxShadow() || child->boxModelObject()->hasSelfPaintingLayer()
167 || (child->renderer()->isListMarker() && !toRenderListMarker( child->renderer())->isInside()) 167 || (child->renderer()->isListMarker() && !toRenderListMarker(child-> renderer())->isInside())
168 || child->renderer()->style(isFirstLineStyle())->hasBorderIma geOutsets())) 168 || child->renderer()->style(isFirstLineStyle())->hasBorderImageOutse ts()
169 || child->renderer()->style(isFirstLineStyle())->hasOutline()))
169 child->clearKnownToHaveNoOverflow(); 170 child->clearKnownToHaveNoOverflow();
170 171
171 if (knownToHaveNoOverflow() && child->isInlineFlowBox() && !toInlineFlow Box(child)->knownToHaveNoOverflow()) 172 if (knownToHaveNoOverflow() && child->isInlineFlowBox() && !toInlineFlow Box(child)->knownToHaveNoOverflow())
172 clearKnownToHaveNoOverflow(); 173 clearKnownToHaveNoOverflow();
173 } 174 }
174 175
175 checkConsistency(); 176 checkConsistency();
176 } 177 }
177 178
178 void InlineFlowBox::removeChild(InlineBox* child) 179 void InlineFlowBox::removeChild(InlineBox* child)
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after
822 LayoutUnit outsetLogicalLeft = includeLogicalLeftEdge() ? borderOutsetLogica lLeft : LayoutUnit(); 823 LayoutUnit outsetLogicalLeft = includeLogicalLeftEdge() ? borderOutsetLogica lLeft : LayoutUnit();
823 LayoutUnit outsetLogicalRight = includeLogicalRightEdge() ? borderOutsetLogi calRight : LayoutUnit(); 824 LayoutUnit outsetLogicalRight = includeLogicalRightEdge() ? borderOutsetLogi calRight : LayoutUnit();
824 825
825 LayoutUnit logicalLeftVisualOverflow = min(pixelSnappedLogicalLeft() - outse tLogicalLeft, logicalVisualOverflow.x()); 826 LayoutUnit logicalLeftVisualOverflow = min(pixelSnappedLogicalLeft() - outse tLogicalLeft, logicalVisualOverflow.x());
826 LayoutUnit logicalRightVisualOverflow = max(pixelSnappedLogicalRight() + out setLogicalRight, logicalVisualOverflow.maxX()); 827 LayoutUnit logicalRightVisualOverflow = max(pixelSnappedLogicalRight() + out setLogicalRight, logicalVisualOverflow.maxX());
827 828
828 logicalVisualOverflow = LayoutRect(logicalLeftVisualOverflow, logicalTopVisu alOverflow, 829 logicalVisualOverflow = LayoutRect(logicalLeftVisualOverflow, logicalTopVisu alOverflow,
829 logicalRightVisualOverflow - logicalLeftV isualOverflow, logicalBottomVisualOverflow - logicalTopVisualOverflow); 830 logicalRightVisualOverflow - logicalLeftV isualOverflow, logicalBottomVisualOverflow - logicalTopVisualOverflow);
830 } 831 }
831 832
833 inline void InlineFlowBox::addOutlineVisualOverflow(LayoutRect& logicalVisualOve rflow)
834 {
835 // outline on root line boxes is applying to the block and not to the lines.
leviw_travelin_and_unemployed 2014/03/11 22:51:10 Nit: is applied.
Julien - ping for review 2014/03/12 03:18:58 Done.
836 if (!parent())
837 return;
838
839 RenderStyle* style = renderer()->style(isFirstLineStyle());
840 if (!style->hasOutline())
841 return;
842
843 unsigned short outlineSize = style->outlineSize();
844 logicalVisualOverflow.inflate(outlineSize);
845 }
846
832 inline void InlineFlowBox::addTextBoxVisualOverflow(InlineTextBox* textBox, Glyp hOverflowAndFallbackFontsMap& textBoxDataMap, LayoutRect& logicalVisualOverflow) 847 inline void InlineFlowBox::addTextBoxVisualOverflow(InlineTextBox* textBox, Glyp hOverflowAndFallbackFontsMap& textBoxDataMap, LayoutRect& logicalVisualOverflow)
833 { 848 {
834 if (textBox->knownToHaveNoOverflow()) 849 if (textBox->knownToHaveNoOverflow())
835 return; 850 return;
836 851
837 RenderStyle* style = textBox->renderer()->style(isFirstLineStyle()); 852 RenderStyle* style = textBox->renderer()->style(isFirstLineStyle());
838 853
839 GlyphOverflowAndFallbackFontsMap::iterator it = textBoxDataMap.find(textBox) ; 854 GlyphOverflowAndFallbackFontsMap::iterator it = textBoxDataMap.find(textBox) ;
840 GlyphOverflow* glyphOverflow = it == textBoxDataMap.end() ? 0 : &it->value.s econd; 855 GlyphOverflow* glyphOverflow = it == textBoxDataMap.end() ? 0 : &it->value.s econd;
841 bool isFlippedLine = style->isFlippedLinesWritingMode(); 856 bool isFlippedLine = style->isFlippedLinesWritingMode();
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
917 return; 932 return;
918 933
919 // Visual overflow just includes overflow for stuff we need to repaint ourse lves. Self-painting layers are ignored. 934 // Visual overflow just includes overflow for stuff we need to repaint ourse lves. Self-painting layers are ignored.
920 // Layout overflow is used to determine scrolling extent, so it still includ es child layers and also factors in 935 // Layout overflow is used to determine scrolling extent, so it still includ es child layers and also factors in
921 // transforms, relative positioning, etc. 936 // transforms, relative positioning, etc.
922 LayoutRect logicalLayoutOverflow(enclosingLayoutRect(logicalFrameRectIncludi ngLineHeight(lineTop, lineBottom))); 937 LayoutRect logicalLayoutOverflow(enclosingLayoutRect(logicalFrameRectIncludi ngLineHeight(lineTop, lineBottom)));
923 LayoutRect logicalVisualOverflow(logicalLayoutOverflow); 938 LayoutRect logicalVisualOverflow(logicalLayoutOverflow);
924 939
925 addBoxShadowVisualOverflow(logicalVisualOverflow); 940 addBoxShadowVisualOverflow(logicalVisualOverflow);
926 addBorderOutsetVisualOverflow(logicalVisualOverflow); 941 addBorderOutsetVisualOverflow(logicalVisualOverflow);
942 addOutlineVisualOverflow(logicalVisualOverflow);
927 943
928 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { 944 for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) {
929 if (curr->renderer()->isOutOfFlowPositioned()) 945 if (curr->renderer()->isOutOfFlowPositioned())
930 continue; // Positioned placeholders don't affect calculations. 946 continue; // Positioned placeholders don't affect calculations.
931 947
932 if (curr->renderer()->isText()) { 948 if (curr->renderer()->isText()) {
933 InlineTextBox* text = toInlineTextBox(curr); 949 InlineTextBox* text = toInlineTextBox(curr);
934 RenderText* rt = toRenderText(text->renderer()); 950 RenderText* rt = toRenderText(text->renderer());
935 if (rt->isBR()) 951 if (rt->isBR())
936 continue; 952 continue;
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 if (!result.addNodeToRectBasedTestResult(renderer()->node(), request, lo cationInContainer, rect)) 1074 if (!result.addNodeToRectBasedTestResult(renderer()->node(), request, lo cationInContainer, rect))
1059 return true; 1075 return true;
1060 } 1076 }
1061 1077
1062 return false; 1078 return false;
1063 } 1079 }
1064 1080
1065 void InlineFlowBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset, LayoutUnit lineTop, LayoutUnit lineBottom) 1081 void InlineFlowBox::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset, LayoutUnit lineTop, LayoutUnit lineBottom)
1066 { 1082 {
1067 LayoutRect overflowRect(visualOverflowRect(lineTop, lineBottom)); 1083 LayoutRect overflowRect(visualOverflowRect(lineTop, lineBottom));
1068 overflowRect.inflate(renderer()->maximalOutlineSize(paintInfo.phase));
1069 flipForWritingMode(overflowRect); 1084 flipForWritingMode(overflowRect);
1070 overflowRect.moveBy(paintOffset); 1085 overflowRect.moveBy(paintOffset);
1071 1086
1072 if (!paintInfo.rect.intersects(pixelSnappedIntRect(overflowRect))) 1087 if (!paintInfo.rect.intersects(pixelSnappedIntRect(overflowRect)))
1073 return; 1088 return;
1074 1089
1075 if (paintInfo.phase != PaintPhaseChildOutlines) { 1090 if (paintInfo.phase != PaintPhaseChildOutlines) {
1076 if (paintInfo.phase == PaintPhaseOutline || paintInfo.phase == PaintPhas eSelfOutline) { 1091 if (paintInfo.phase == PaintPhaseOutline || paintInfo.phase == PaintPhas eSelfOutline) {
1077 // Add ourselves to the paint info struct's list of inlines that nee d to paint their 1092 // Add ourselves to the paint info struct's list of inlines that nee d to paint their
1078 // outlines. 1093 // outlines.
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after
1634 ASSERT(child->prevOnLine() == prev); 1649 ASSERT(child->prevOnLine() == prev);
1635 prev = child; 1650 prev = child;
1636 } 1651 }
1637 ASSERT(prev == m_lastChild); 1652 ASSERT(prev == m_lastChild);
1638 #endif 1653 #endif
1639 } 1654 }
1640 1655
1641 #endif 1656 #endif
1642 1657
1643 } // namespace WebCore 1658 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698