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

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

Issue 182413005: Return refererence from InlineBox::root() (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: re-upload because previous patch didn't upload correctly. 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) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 551
552 for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) { 552 for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling()) {
553 if (curr->isFloatingOrOutOfFlowPositioned()) 553 if (curr->isFloatingOrOutOfFlowPositioned())
554 continue; 554 continue;
555 555
556 // We want to get the margin box in the inline direction, and then use o ur font ascent/descent in the block 556 // We want to get the margin box in the inline direction, and then use o ur font ascent/descent in the block
557 // direction (aligned to the root box's baseline). 557 // direction (aligned to the root box's baseline).
558 if (curr->isBox()) { 558 if (curr->isBox()) {
559 RenderBox* currBox = toRenderBox(curr); 559 RenderBox* currBox = toRenderBox(curr);
560 if (currBox->inlineBoxWrapper()) { 560 if (currBox->inlineBoxWrapper()) {
561 RootInlineBox* rootBox = currBox->inlineBoxWrapper()->root(); 561 RootInlineBox& rootBox = currBox->inlineBoxWrapper()->root();
562 int logicalTop = rootBox->logicalTop() + (rootBox->renderer().st yle(rootBox->isFirstLineStyle())->font().fontMetrics().ascent() - container->sty le(rootBox->isFirstLineStyle())->font().fontMetrics().ascent()); 562 int logicalTop = rootBox.logicalTop() + (rootBox.renderer().styl e(rootBox.isFirstLineStyle())->font().fontMetrics().ascent() - container->style( rootBox.isFirstLineStyle())->font().fontMetrics().ascent());
563 int logicalHeight = container->style(rootBox->isFirstLineStyle() )->font().fontMetrics().height(); 563 int logicalHeight = container->style(rootBox.isFirstLineStyle()) ->font().fontMetrics().height();
564 if (isHorizontal) 564 if (isHorizontal)
565 yield(FloatRect(currBox->inlineBoxWrapper()->x() - currBox-> marginLeft(), logicalTop, currBox->width() + currBox->marginWidth(), logicalHeig ht)); 565 yield(FloatRect(currBox->inlineBoxWrapper()->x() - currBox-> marginLeft(), logicalTop, currBox->width() + currBox->marginWidth(), logicalHeig ht));
566 else 566 else
567 yield(FloatRect(logicalTop, currBox->inlineBoxWrapper()->y() - currBox->marginTop(), logicalHeight, currBox->height() + currBox->marginHeigh t())); 567 yield(FloatRect(logicalTop, currBox->inlineBoxWrapper()->y() - currBox->marginTop(), logicalHeight, currBox->height() + currBox->marginHeigh t()));
568 } 568 }
569 } else if (curr->isRenderInline()) { 569 } else if (curr->isRenderInline()) {
570 // If the child doesn't need line boxes either, then we can recur. 570 // If the child doesn't need line boxes either, then we can recur.
571 RenderInline* currInline = toRenderInline(curr); 571 RenderInline* currInline = toRenderInline(curr);
572 if (!currInline->alwaysCreateLineBoxes()) 572 if (!currInline->alwaysCreateLineBoxes())
573 currInline->generateCulledLineBoxRects(yield, container); 573 currInline->generateCulledLineBoxRects(yield, container);
574 else { 574 else {
575 for (InlineFlowBox* childLine = currInline->firstLineBox(); chil dLine; childLine = childLine->nextLineBox()) { 575 for (InlineFlowBox* childLine = currInline->firstLineBox(); chil dLine; childLine = childLine->nextLineBox()) {
576 RootInlineBox* rootBox = childLine->root(); 576 RootInlineBox& rootBox = childLine->root();
577 int logicalTop = rootBox->logicalTop() + (rootBox->renderer( ).style(rootBox->isFirstLineStyle())->font().fontMetrics().ascent() - container- >style(rootBox->isFirstLineStyle())->font().fontMetrics().ascent()); 577 int logicalTop = rootBox.logicalTop() + (rootBox.renderer(). style(rootBox.isFirstLineStyle())->font().fontMetrics().ascent() - container->st yle(rootBox.isFirstLineStyle())->font().fontMetrics().ascent());
578 int logicalHeight = container->style(rootBox->isFirstLineSty le())->font().fontMetrics().height(); 578 int logicalHeight = container->style(rootBox.isFirstLineStyl e())->font().fontMetrics().height();
579 if (isHorizontal) 579 if (isHorizontal)
580 yield(FloatRect(childLine->x() - childLine->marginLogica lLeft(), 580 yield(FloatRect(childLine->x() - childLine->marginLogica lLeft(),
581 logicalTop, 581 logicalTop,
582 childLine->logicalWidth() + childLine->marginLogical Left() + childLine->marginLogicalRight(), 582 childLine->logicalWidth() + childLine->marginLogical Left() + childLine->marginLogicalRight(),
583 logicalHeight)); 583 logicalHeight));
584 else 584 else
585 yield(FloatRect(logicalTop, 585 yield(FloatRect(logicalTop,
586 childLine->y() - childLine->marginLogicalLeft(), 586 childLine->y() - childLine->marginLogicalLeft(),
587 logicalHeight, 587 logicalHeight,
588 childLine->logicalWidth() + childLine->marginLogical Left() + childLine->marginLogicalRight())); 588 childLine->logicalWidth() + childLine->marginLogical Left() + childLine->marginLogicalRight()));
589 } 589 }
590 } 590 }
591 } else if (curr->isText()) { 591 } else if (curr->isText()) {
592 RenderText* currText = toRenderText(curr); 592 RenderText* currText = toRenderText(curr);
593 for (InlineTextBox* childText = currText->firstTextBox(); childText; childText = childText->nextTextBox()) { 593 for (InlineTextBox* childText = currText->firstTextBox(); childText; childText = childText->nextTextBox()) {
594 RootInlineBox* rootBox = childText->root(); 594 RootInlineBox& rootBox = childText->root();
595 int logicalTop = rootBox->logicalTop() + (rootBox->renderer().st yle(rootBox->isFirstLineStyle())->font().fontMetrics().ascent() - container->sty le(rootBox->isFirstLineStyle())->font().fontMetrics().ascent()); 595 int logicalTop = rootBox.logicalTop() + (rootBox.renderer().styl e(rootBox.isFirstLineStyle())->font().fontMetrics().ascent() - container->style( rootBox.isFirstLineStyle())->font().fontMetrics().ascent());
596 int logicalHeight = container->style(rootBox->isFirstLineStyle() )->font().fontMetrics().height(); 596 int logicalHeight = container->style(rootBox.isFirstLineStyle()) ->font().fontMetrics().height();
597 if (isHorizontal) 597 if (isHorizontal)
598 yield(FloatRect(childText->x(), logicalTop, childText->logic alWidth(), logicalHeight)); 598 yield(FloatRect(childText->x(), logicalTop, childText->logic alWidth(), logicalHeight));
599 else 599 else
600 yield(FloatRect(logicalTop, childText->y(), logicalHeight, c hildText->logicalWidth())); 600 yield(FloatRect(logicalTop, childText->y(), logicalHeight, c hildText->logicalWidth()));
601 } 601 }
602 } 602 }
603 } 603 }
604 } 604 }
605 605
606 namespace { 606 namespace {
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after
973 return LayoutRect(); 973 return LayoutRect();
974 974
975 // Return the width of the minimal left side and the maximal right side. 975 // Return the width of the minimal left side and the maximal right side.
976 LayoutUnit logicalLeftSide = LayoutUnit::max(); 976 LayoutUnit logicalLeftSide = LayoutUnit::max();
977 LayoutUnit logicalRightSide = LayoutUnit::min(); 977 LayoutUnit logicalRightSide = LayoutUnit::min();
978 for (InlineFlowBox* curr = firstLineBox(); curr; curr = curr->nextLineBox()) { 978 for (InlineFlowBox* curr = firstLineBox(); curr; curr = curr->nextLineBox()) {
979 logicalLeftSide = min(logicalLeftSide, curr->logicalLeftVisualOverflow() ); 979 logicalLeftSide = min(logicalLeftSide, curr->logicalLeftVisualOverflow() );
980 logicalRightSide = max(logicalRightSide, curr->logicalRightVisualOverflo w()); 980 logicalRightSide = max(logicalRightSide, curr->logicalRightVisualOverflo w());
981 } 981 }
982 982
983 RootInlineBox* firstRootBox = firstLineBox()->root(); 983 RootInlineBox& firstRootBox = firstLineBox()->root();
984 RootInlineBox* lastRootBox = lastLineBox()->root(); 984 RootInlineBox& lastRootBox = lastLineBox()->root();
985 985
986 LayoutUnit logicalTop = firstLineBox()->logicalTopVisualOverflow(firstRootBo x->lineTop()); 986 LayoutUnit logicalTop = firstLineBox()->logicalTopVisualOverflow(firstRootBo x.lineTop());
987 LayoutUnit logicalWidth = logicalRightSide - logicalLeftSide; 987 LayoutUnit logicalWidth = logicalRightSide - logicalLeftSide;
988 LayoutUnit logicalHeight = lastLineBox()->logicalBottomVisualOverflow(lastRo otBox->lineBottom()) - logicalTop; 988 LayoutUnit logicalHeight = lastLineBox()->logicalBottomVisualOverflow(lastRo otBox.lineBottom()) - logicalTop;
989 989
990 LayoutRect rect(logicalLeftSide, logicalTop, logicalWidth, logicalHeight); 990 LayoutRect rect(logicalLeftSide, logicalTop, logicalWidth, logicalHeight);
991 if (!style()->isHorizontalWritingMode()) 991 if (!style()->isHorizontalWritingMode())
992 rect = rect.transposedRect(); 992 rect = rect.transposedRect();
993 return rect; 993 return rect;
994 } 994 }
995 995
996 LayoutRect RenderInline::clippedOverflowRectForRepaint(const RenderLayerModelObj ect* repaintContainer) const 996 LayoutRect RenderInline::clippedOverflowRectForRepaint(const RenderLayerModelObj ect* repaintContainer) const
997 { 997 {
998 ASSERT(!view() || !view()->layoutStateEnabled() || LayoutRectRecorder::shoul dRecordLayoutRects()); 998 ASSERT(!view() || !view()->layoutStateEnabled() || LayoutRectRecorder::shoul dRecordLayoutRects());
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
1239 } 1239 }
1240 1240
1241 if (!alwaysCreateLineBoxes()) { 1241 if (!alwaysCreateLineBoxes()) {
1242 // We have to grovel into our children in order to dirty the appropriate lines. 1242 // We have to grovel into our children in order to dirty the appropriate lines.
1243 for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling() ) { 1243 for (RenderObject* curr = firstChild(); curr; curr = curr->nextSibling() ) {
1244 if (curr->isFloatingOrOutOfFlowPositioned()) 1244 if (curr->isFloatingOrOutOfFlowPositioned())
1245 continue; 1245 continue;
1246 if (curr->isBox() && !curr->needsLayout()) { 1246 if (curr->isBox() && !curr->needsLayout()) {
1247 RenderBox* currBox = toRenderBox(curr); 1247 RenderBox* currBox = toRenderBox(curr);
1248 if (currBox->inlineBoxWrapper()) 1248 if (currBox->inlineBoxWrapper())
1249 currBox->inlineBoxWrapper()->root()->markDirty(); 1249 currBox->inlineBoxWrapper()->root().markDirty();
1250 } else if (!curr->selfNeedsLayout()) { 1250 } else if (!curr->selfNeedsLayout()) {
1251 if (curr->isRenderInline()) { 1251 if (curr->isRenderInline()) {
1252 RenderInline* currInline = toRenderInline(curr); 1252 RenderInline* currInline = toRenderInline(curr);
1253 for (InlineFlowBox* childLine = currInline->firstLineBox(); childLine; childLine = childLine->nextLineBox()) 1253 for (InlineFlowBox* childLine = currInline->firstLineBox(); childLine; childLine = childLine->nextLineBox())
1254 childLine->root()->markDirty(); 1254 childLine->root().markDirty();
1255 } else if (curr->isText()) { 1255 } else if (curr->isText()) {
1256 RenderText* currText = toRenderText(curr); 1256 RenderText* currText = toRenderText(curr);
1257 for (InlineTextBox* childText = currText->firstTextBox(); ch ildText; childText = childText->nextTextBox()) 1257 for (InlineTextBox* childText = currText->firstTextBox(); ch ildText; childText = childText->nextTextBox())
1258 childText->root()->markDirty(); 1258 childText->root().markDirty();
1259 } 1259 }
1260 } 1260 }
1261 } 1261 }
1262 } else 1262 } else
1263 m_lineBoxes.dirtyLineBoxes(); 1263 m_lineBoxes.dirtyLineBoxes();
1264 } 1264 }
1265 1265
1266 void RenderInline::deleteLineBoxTree() 1266 void RenderInline::deleteLineBoxTree()
1267 { 1267 {
1268 m_lineBoxes.deleteLineBoxTree(); 1268 m_lineBoxes.deleteLineBoxTree();
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1417 if (graphicsContext->paintingDisabled()) 1417 if (graphicsContext->paintingDisabled())
1418 return; 1418 return;
1419 1419
1420 if (styleToUse->outlineStyleIsAuto() || styleToUse->outlineStyle() == BNONE) 1420 if (styleToUse->outlineStyleIsAuto() || styleToUse->outlineStyle() == BNONE)
1421 return; 1421 return;
1422 1422
1423 Vector<LayoutRect> rects; 1423 Vector<LayoutRect> rects;
1424 1424
1425 rects.append(LayoutRect()); 1425 rects.append(LayoutRect());
1426 for (InlineFlowBox* curr = firstLineBox(); curr; curr = curr->nextLineBox()) { 1426 for (InlineFlowBox* curr = firstLineBox(); curr; curr = curr->nextLineBox()) {
1427 RootInlineBox* root = curr->root(); 1427 RootInlineBox& root = curr->root();
1428 LayoutUnit top = max<LayoutUnit>(root->lineTop(), curr->logicalTop()); 1428 LayoutUnit top = max<LayoutUnit>(root.lineTop(), curr->logicalTop());
1429 LayoutUnit bottom = min<LayoutUnit>(root->lineBottom(), curr->logicalBot tom()); 1429 LayoutUnit bottom = min<LayoutUnit>(root.lineBottom(), curr->logicalBott om());
1430 rects.append(LayoutRect(curr->x(), top, curr->logicalWidth(), bottom - t op)); 1430 rects.append(LayoutRect(curr->x(), top, curr->logicalWidth(), bottom - t op));
1431 } 1431 }
1432 rects.append(LayoutRect()); 1432 rects.append(LayoutRect());
1433 1433
1434 Color outlineColor = resolveColor(styleToUse, CSSPropertyOutlineColor); 1434 Color outlineColor = resolveColor(styleToUse, CSSPropertyOutlineColor);
1435 bool useTransparencyLayer = outlineColor.hasAlpha(); 1435 bool useTransparencyLayer = outlineColor.hasAlpha();
1436 if (useTransparencyLayer) { 1436 if (useTransparencyLayer) {
1437 graphicsContext->beginTransparencyLayer(static_cast<float>(outlineColor. alpha()) / 255); 1437 graphicsContext->beginTransparencyLayer(static_cast<float>(outlineColor. alpha()) / 255);
1438 outlineColor = Color(outlineColor.red(), outlineColor.green(), outlineCo lor.blue()); 1438 outlineColor = Color(outlineColor.red(), outlineColor.green(), outlineCo lor.blue());
1439 } 1439 }
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
1572 container = this; 1572 container = this;
1573 1573
1574 FloatPoint absPos = container->localToAbsolute(); 1574 FloatPoint absPos = container->localToAbsolute();
1575 region.bounds.setX(absPos.x() + region.bounds.x()); 1575 region.bounds.setX(absPos.x() + region.bounds.x());
1576 region.bounds.setY(absPos.y() + region.bounds.y()); 1576 region.bounds.setY(absPos.y() + region.bounds.y());
1577 1577
1578 regions.append(region); 1578 regions.append(region);
1579 } 1579 }
1580 1580
1581 } // namespace WebCore 1581 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698