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

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

Issue 889563002: Make RenderObject::style() return a const object (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Blind fix for Mac. Created 5 years, 10 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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 if (child->isText()) { 113 if (child->isText()) {
114 if (child->renderer().parent() == renderer()) 114 if (child->renderer().parent() == renderer())
115 m_hasTextChildren = true; 115 m_hasTextChildren = true;
116 setHasTextDescendantsOnAncestors(this); 116 setHasTextDescendantsOnAncestors(this);
117 } else if (child->isInlineFlowBox()) { 117 } else if (child->isInlineFlowBox()) {
118 if (toInlineFlowBox(child)->hasTextDescendants()) 118 if (toInlineFlowBox(child)->hasTextDescendants())
119 setHasTextDescendantsOnAncestors(this); 119 setHasTextDescendantsOnAncestors(this);
120 } 120 }
121 121
122 if (descendantsHaveSameLineHeightAndBaseline() && !child->renderer().isOutOf FlowPositioned()) { 122 if (descendantsHaveSameLineHeightAndBaseline() && !child->renderer().isOutOf FlowPositioned()) {
123 RenderStyle* parentStyle = renderer().style(isFirstLineStyle()); 123 const RenderStyle* parentStyle = renderer().style(isFirstLineStyle());
124 RenderStyle* childStyle = child->renderer().style(isFirstLineStyle()); 124 const RenderStyle* childStyle = child->renderer().style(isFirstLineStyle ());
125 bool shouldClearDescendantsHaveSameLineHeightAndBaseline = false; 125 bool shouldClearDescendantsHaveSameLineHeightAndBaseline = false;
126 if (child->renderer().isReplaced()) 126 if (child->renderer().isReplaced())
127 shouldClearDescendantsHaveSameLineHeightAndBaseline = true; 127 shouldClearDescendantsHaveSameLineHeightAndBaseline = true;
128 else if (child->isText()) { 128 else if (child->isText()) {
129 if (child->renderer().isBR() || child->renderer().parent() != render er()) { 129 if (child->renderer().isBR() || child->renderer().parent() != render er()) {
130 if (!parentStyle->font().fontMetrics().hasIdenticalAscentDescent AndLineGap(childStyle->font().fontMetrics()) 130 if (!parentStyle->font().fontMetrics().hasIdenticalAscentDescent AndLineGap(childStyle->font().fontMetrics())
131 || parentStyle->lineHeight() != childStyle->lineHeight() 131 || parentStyle->lineHeight() != childStyle->lineHeight()
132 || (parentStyle->verticalAlign() != BASELINE && !isRootInlin eBox()) || childStyle->verticalAlign() != BASELINE) 132 || (parentStyle->verticalAlign() != BASELINE && !isRootInlin eBox()) || childStyle->verticalAlign() != BASELINE)
133 shouldClearDescendantsHaveSameLineHeightAndBaseline = true; 133 shouldClearDescendantsHaveSameLineHeightAndBaseline = true;
134 } 134 }
(...skipping 16 matching lines...) Expand all
151 shouldClearDescendantsHaveSameLineHeightAndBaseline = true; 151 shouldClearDescendantsHaveSameLineHeightAndBaseline = true;
152 } 152 }
153 } 153 }
154 154
155 if (shouldClearDescendantsHaveSameLineHeightAndBaseline) 155 if (shouldClearDescendantsHaveSameLineHeightAndBaseline)
156 clearDescendantsHaveSameLineHeightAndBaseline(); 156 clearDescendantsHaveSameLineHeightAndBaseline();
157 } 157 }
158 158
159 if (!child->renderer().isOutOfFlowPositioned()) { 159 if (!child->renderer().isOutOfFlowPositioned()) {
160 if (child->isText()) { 160 if (child->isText()) {
161 RenderStyle* childStyle = child->renderer().style(isFirstLineStyle() ); 161 const RenderStyle* childStyle = child->renderer().style(isFirstLineS tyle());
162 if (childStyle->letterSpacing() < 0 || childStyle->textShadow() || c hildStyle->textEmphasisMark() != TextEmphasisMarkNone || childStyle->textStrokeW idth()) 162 if (childStyle->letterSpacing() < 0 || childStyle->textShadow() || c hildStyle->textEmphasisMark() != TextEmphasisMarkNone || childStyle->textStrokeW idth())
163 child->clearKnownToHaveNoOverflow(); 163 child->clearKnownToHaveNoOverflow();
164 } else if (child->renderer().isReplaced()) { 164 } else if (child->renderer().isReplaced()) {
165 RenderBox& box = toRenderBox(child->renderer()); 165 RenderBox& box = toRenderBox(child->renderer());
166 if (box.hasRenderOverflow() || box.hasSelfPaintingLayer()) 166 if (box.hasRenderOverflow() || box.hasSelfPaintingLayer())
167 child->clearKnownToHaveNoOverflow(); 167 child->clearKnownToHaveNoOverflow();
168 } else if (!child->renderer().isBR() && (child->renderer().style(isFirst LineStyle())->boxShadow() || child->boxModelObject()->hasSelfPaintingLayer() 168 } else if (!child->renderer().isBR() && (child->renderer().style(isFirst LineStyle())->boxShadow() || child->boxModelObject()->hasSelfPaintingLayer()
169 || (child->renderer().isListMarker() && !toRenderListMarker(child->r enderer()).isInside()) 169 || (child->renderer().isListMarker() && !toRenderListMarker(child->r enderer()).isInside())
170 || child->renderer().style(isFirstLineStyle())->hasBorderImageOutset s() 170 || child->renderer().style(isFirstLineStyle())->hasBorderImageOutset s()
171 || child->renderer().style(isFirstLineStyle())->hasOutline())) { 171 || child->renderer().style(isFirstLineStyle())->hasOutline())) {
(...skipping 604 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 curr->setLogicalTop(lineBottom - (curr->logicalTop() - lineTop) - cu rr->logicalHeight()); 776 curr->setLogicalTop(lineBottom - (curr->logicalTop() - lineTop) - cu rr->logicalHeight());
777 } 777 }
778 } 778 }
779 779
780 inline void InlineFlowBox::addBoxShadowVisualOverflow(LayoutRect& logicalVisualO verflow) 780 inline void InlineFlowBox::addBoxShadowVisualOverflow(LayoutRect& logicalVisualO verflow)
781 { 781 {
782 // box-shadow on root line boxes is applying to the block and not to the lin es. 782 // box-shadow on root line boxes is applying to the block and not to the lin es.
783 if (!parent()) 783 if (!parent())
784 return; 784 return;
785 785
786 RenderStyle* style = renderer().style(isFirstLineStyle()); 786 const RenderStyle* style = renderer().style(isFirstLineStyle());
787 WritingMode writingMode = style->writingMode(); 787 WritingMode writingMode = style->writingMode();
788 ShadowList* boxShadow = style->boxShadow(); 788 ShadowList* boxShadow = style->boxShadow();
789 if (!boxShadow) 789 if (!boxShadow)
790 return; 790 return;
791 791
792 LayoutRectOutsets outsets(boxShadow->rectOutsetsIncludingOriginal()); 792 LayoutRectOutsets outsets(boxShadow->rectOutsetsIncludingOriginal());
793 // Similar to how glyph overflow works, if our lines are flipped, then it's actually the opposite shadow that applies, since 793 // Similar to how glyph overflow works, if our lines are flipped, then it's actually the opposite shadow that applies, since
794 // the line is "upside down" in terms of block coordinates. 794 // the line is "upside down" in terms of block coordinates.
795 LayoutRectOutsets logicalOutsets(outsets.logicalOutsetsWithFlippedLines(writ ingMode)); 795 LayoutRectOutsets logicalOutsets(outsets.logicalOutsetsWithFlippedLines(writ ingMode));
796 796
797 LayoutRect shadowBounds(logicalFrameRect().toLayoutRect()); 797 LayoutRect shadowBounds(logicalFrameRect().toLayoutRect());
798 shadowBounds.expand(logicalOutsets); 798 shadowBounds.expand(logicalOutsets);
799 logicalVisualOverflow.unite(shadowBounds); 799 logicalVisualOverflow.unite(shadowBounds);
800 } 800 }
801 801
802 inline void InlineFlowBox::addBorderOutsetVisualOverflow(LayoutRect& logicalVisu alOverflow) 802 inline void InlineFlowBox::addBorderOutsetVisualOverflow(LayoutRect& logicalVisu alOverflow)
803 { 803 {
804 // border-image-outset on root line boxes is applying to the block and not t o the lines. 804 // border-image-outset on root line boxes is applying to the block and not t o the lines.
805 if (!parent()) 805 if (!parent())
806 return; 806 return;
807 807
808 RenderStyle* style = renderer().style(isFirstLineStyle()); 808 const RenderStyle* style = renderer().style(isFirstLineStyle());
809 if (!style->hasBorderImageOutsets()) 809 if (!style->hasBorderImageOutsets())
810 return; 810 return;
811 811
812 // Similar to how glyph overflow works, if our lines are flipped, then it's actually the opposite border that applies, since 812 // Similar to how glyph overflow works, if our lines are flipped, then it's actually the opposite border that applies, since
813 // the line is "upside down" in terms of block coordinates. vertical-rl and horizontal-bt are the flipped line modes. 813 // the line is "upside down" in terms of block coordinates. vertical-rl and horizontal-bt are the flipped line modes.
814 LayoutRectOutsets logicalOutsets = style->borderImageOutsets().logicalOutset sWithFlippedLines(style->writingMode()); 814 LayoutRectOutsets logicalOutsets = style->borderImageOutsets().logicalOutset sWithFlippedLines(style->writingMode());
815 815
816 if (!includeLogicalLeftEdge()) 816 if (!includeLogicalLeftEdge())
817 logicalOutsets.setLeft(LayoutUnit()); 817 logicalOutsets.setLeft(LayoutUnit());
818 if (!includeLogicalRightEdge()) 818 if (!includeLogicalRightEdge())
819 logicalOutsets.setRight(LayoutUnit()); 819 logicalOutsets.setRight(LayoutUnit());
820 820
821 LayoutRect borderOutsetBounds(logicalFrameRect().toLayoutRect()); 821 LayoutRect borderOutsetBounds(logicalFrameRect().toLayoutRect());
822 borderOutsetBounds.expand(logicalOutsets); 822 borderOutsetBounds.expand(logicalOutsets);
823 logicalVisualOverflow.unite(borderOutsetBounds); 823 logicalVisualOverflow.unite(borderOutsetBounds);
824 } 824 }
825 825
826 inline void InlineFlowBox::addOutlineVisualOverflow(LayoutRect& logicalVisualOve rflow) 826 inline void InlineFlowBox::addOutlineVisualOverflow(LayoutRect& logicalVisualOve rflow)
827 { 827 {
828 // Outline on root line boxes is applied to the block and not to the lines. 828 // Outline on root line boxes is applied to the block and not to the lines.
829 if (!parent()) 829 if (!parent())
830 return; 830 return;
831 831
832 RenderStyle* style = renderer().style(isFirstLineStyle()); 832 const RenderStyle* style = renderer().style(isFirstLineStyle());
833 if (!style->hasOutline()) 833 if (!style->hasOutline())
834 return; 834 return;
835 835
836 logicalVisualOverflow.inflate(style->outlineSize()); 836 logicalVisualOverflow.inflate(style->outlineSize());
837 } 837 }
838 838
839 inline void InlineFlowBox::addTextBoxVisualOverflow(InlineTextBox* textBox, Glyp hOverflowAndFallbackFontsMap& textBoxDataMap, LayoutRect& logicalVisualOverflow) 839 inline void InlineFlowBox::addTextBoxVisualOverflow(InlineTextBox* textBox, Glyp hOverflowAndFallbackFontsMap& textBoxDataMap, LayoutRect& logicalVisualOverflow)
840 { 840 {
841 if (textBox->knownToHaveNoOverflow()) 841 if (textBox->knownToHaveNoOverflow())
842 return; 842 return;
843 843
844 RenderStyle* style = textBox->renderer().style(isFirstLineStyle()); 844 const RenderStyle* style = textBox->renderer().style(isFirstLineStyle());
845 845
846 GlyphOverflowAndFallbackFontsMap::iterator it = textBoxDataMap.find(textBox) ; 846 GlyphOverflowAndFallbackFontsMap::iterator it = textBoxDataMap.find(textBox) ;
847 GlyphOverflow* glyphOverflow = it == textBoxDataMap.end() ? 0 : &it->value.s econd; 847 GlyphOverflow* glyphOverflow = it == textBoxDataMap.end() ? 0 : &it->value.s econd;
848 bool isFlippedLine = style->isFlippedLinesWritingMode(); 848 bool isFlippedLine = style->isFlippedLinesWritingMode();
849 849
850 int topGlyphEdge = glyphOverflow ? (isFlippedLine ? glyphOverflow->bottom : glyphOverflow->top) : 0; 850 int topGlyphEdge = glyphOverflow ? (isFlippedLine ? glyphOverflow->bottom : glyphOverflow->top) : 0;
851 int bottomGlyphEdge = glyphOverflow ? (isFlippedLine ? glyphOverflow->top : glyphOverflow->bottom) : 0; 851 int bottomGlyphEdge = glyphOverflow ? (isFlippedLine ? glyphOverflow->top : glyphOverflow->bottom) : 0;
852 int leftGlyphEdge = glyphOverflow ? glyphOverflow->left : 0; 852 int leftGlyphEdge = glyphOverflow ? glyphOverflow->left : 0;
853 int rightGlyphEdge = glyphOverflow ? glyphOverflow->right : 0; 853 int rightGlyphEdge = glyphOverflow ? glyphOverflow->right : 0;
854 854
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
1189 } else { 1189 } else {
1190 LayoutUnit bottomOfLastRubyTextLine = rubyText->logicalTop() + ( rubyText->lastRootBox() ? rubyText->lastRootBox()->lineBottom() : rubyText->logi calHeight()); 1190 LayoutUnit bottomOfLastRubyTextLine = rubyText->logicalTop() + ( rubyText->lastRootBox() ? rubyText->lastRootBox()->lineBottom() : rubyText->logi calHeight());
1191 if (bottomOfLastRubyTextLine <= curr->logicalHeight()) 1191 if (bottomOfLastRubyTextLine <= curr->logicalHeight())
1192 continue; 1192 continue;
1193 bottomOfLastRubyTextLine += curr->logicalTop(); 1193 bottomOfLastRubyTextLine += curr->logicalTop();
1194 result = std::max(result, bottomOfLastRubyTextLine - allowedPosi tion); 1194 result = std::max(result, bottomOfLastRubyTextLine - allowedPosi tion);
1195 } 1195 }
1196 } 1196 }
1197 1197
1198 if (curr->isInlineTextBox()) { 1198 if (curr->isInlineTextBox()) {
1199 RenderStyle* style = curr->renderer().style(isFirstLineStyle()); 1199 const RenderStyle* style = curr->renderer().style(isFirstLineStyle() );
1200 TextEmphasisPosition emphasisMarkPosition; 1200 TextEmphasisPosition emphasisMarkPosition;
1201 if (style->textEmphasisMark() != TextEmphasisMarkNone && toInlineTex tBox(curr)->getEmphasisMarkPosition(style, emphasisMarkPosition) && emphasisMark Position == TextEmphasisPositionOver) { 1201 if (style->textEmphasisMark() != TextEmphasisMarkNone && toInlineTex tBox(curr)->getEmphasisMarkPosition(style, emphasisMarkPosition) && emphasisMark Position == TextEmphasisPositionOver) {
1202 if (!style->isFlippedLinesWritingMode()) { 1202 if (!style->isFlippedLinesWritingMode()) {
1203 int topOfEmphasisMark = curr->logicalTop() - style->font().e mphasisMarkHeight(style->textEmphasisMarkString()); 1203 int topOfEmphasisMark = curr->logicalTop() - style->font().e mphasisMarkHeight(style->textEmphasisMarkString());
1204 result = std::max(result, allowedPosition - topOfEmphasisMar k); 1204 result = std::max(result, allowedPosition - topOfEmphasisMar k);
1205 } else { 1205 } else {
1206 int bottomOfEmphasisMark = curr->logicalBottom() + style->fo nt().emphasisMarkHeight(style->textEmphasisMarkString()); 1206 int bottomOfEmphasisMark = curr->logicalBottom() + style->fo nt().emphasisMarkHeight(style->textEmphasisMarkString());
1207 result = std::max(result, bottomOfEmphasisMark - allowedPosi tion); 1207 result = std::max(result, bottomOfEmphasisMark - allowedPosi tion);
1208 } 1208 }
1209 } 1209 }
(...skipping 27 matching lines...) Expand all
1237 } else { 1237 } else {
1238 LayoutUnit bottomOfLastRubyTextLine = rubyText->logicalTop() + ( rubyText->lastRootBox() ? rubyText->lastRootBox()->lineBottom() : rubyText->logi calHeight()); 1238 LayoutUnit bottomOfLastRubyTextLine = rubyText->logicalTop() + ( rubyText->lastRootBox() ? rubyText->lastRootBox()->lineBottom() : rubyText->logi calHeight());
1239 if (bottomOfLastRubyTextLine <= curr->logicalHeight()) 1239 if (bottomOfLastRubyTextLine <= curr->logicalHeight())
1240 continue; 1240 continue;
1241 bottomOfLastRubyTextLine += curr->logicalTop(); 1241 bottomOfLastRubyTextLine += curr->logicalTop();
1242 result = std::max(result, bottomOfLastRubyTextLine - allowedPosi tion); 1242 result = std::max(result, bottomOfLastRubyTextLine - allowedPosi tion);
1243 } 1243 }
1244 } 1244 }
1245 1245
1246 if (curr->isInlineTextBox()) { 1246 if (curr->isInlineTextBox()) {
1247 RenderStyle* style = curr->renderer().style(isFirstLineStyle()); 1247 const RenderStyle* style = curr->renderer().style(isFirstLineStyle() );
1248 if (style->textEmphasisMark() != TextEmphasisMarkNone && style->text EmphasisPosition() == TextEmphasisPositionUnder) { 1248 if (style->textEmphasisMark() != TextEmphasisMarkNone && style->text EmphasisPosition() == TextEmphasisPositionUnder) {
1249 if (!style->isFlippedLinesWritingMode()) { 1249 if (!style->isFlippedLinesWritingMode()) {
1250 LayoutUnit bottomOfEmphasisMark = curr->logicalBottom() + st yle->font().emphasisMarkHeight(style->textEmphasisMarkString()); 1250 LayoutUnit bottomOfEmphasisMark = curr->logicalBottom() + st yle->font().emphasisMarkHeight(style->textEmphasisMarkString());
1251 result = std::max(result, bottomOfEmphasisMark - allowedPosi tion); 1251 result = std::max(result, bottomOfEmphasisMark - allowedPosi tion);
1252 } else { 1252 } else {
1253 LayoutUnit topOfEmphasisMark = curr->logicalTop() - style->f ont().emphasisMarkHeight(style->textEmphasisMarkString()); 1253 LayoutUnit topOfEmphasisMark = curr->logicalTop() - style->f ont().emphasisMarkHeight(style->textEmphasisMarkString());
1254 result = std::max(result, allowedPosition - topOfEmphasisMar k); 1254 result = std::max(result, allowedPosition - topOfEmphasisMar k);
1255 } 1255 }
1256 } 1256 }
1257 } 1257 }
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1339 ASSERT(child->prevOnLine() == prev); 1339 ASSERT(child->prevOnLine() == prev);
1340 prev = child; 1340 prev = child;
1341 } 1341 }
1342 ASSERT(prev == m_lastChild); 1342 ASSERT(prev == m_lastChild);
1343 #endif 1343 #endif
1344 } 1344 }
1345 1345
1346 #endif 1346 #endif
1347 1347
1348 } // namespace blink 1348 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698