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

Side by Side Diff: Source/core/layout/LayoutInline.cpp

Issue 1278543002: Include the whole outline into visual overflow (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase Created 5 years, 4 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) 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 1032 matching lines...) Expand 10 before | Expand all | Expand 10 after
1043 return clippedOverflowRect(paintInvalidationContainer); 1043 return clippedOverflowRect(paintInvalidationContainer);
1044 } 1044 }
1045 1045
1046 LayoutRect LayoutInline::clippedOverflowRect(const LayoutBoxModelObject* paintIn validationContainer, const PaintInvalidationState* paintInvalidationState) const 1046 LayoutRect LayoutInline::clippedOverflowRect(const LayoutBoxModelObject* paintIn validationContainer, const PaintInvalidationState* paintInvalidationState) const
1047 { 1047 {
1048 const LayoutBoxModelObject* continuation = this->continuation(); 1048 const LayoutBoxModelObject* continuation = this->continuation();
1049 if ((!firstLineBoxIncludingCulling() && !continuation) || style()->visibilit y() != VISIBLE) 1049 if ((!firstLineBoxIncludingCulling() && !continuation) || style()->visibilit y() != VISIBLE)
1050 return LayoutRect(); 1050 return LayoutRect();
1051 1051
1052 LayoutRect overflowRect(linesVisualOverflowBoundingBox()); 1052 LayoutRect overflowRect(linesVisualOverflowBoundingBox());
1053 mapRectToPaintInvalidationBacking(paintInvalidationContainer, overflowRect, paintInvalidationState);
1054 1053
1055 LayoutUnit outlineOutset = style()->outlineOutsetExtent(); 1054 LayoutUnit outlineOutset = style()->outlineOutsetExtent();
1056 if (outlineOutset) { 1055 if (outlineOutset) {
1057 for (LayoutObject* curr = firstChild(); curr; curr = curr->nextSibling() ) { 1056 Vector<LayoutRect> rects;
1058 if (!curr->isText()) 1057 addOutlineRectsForChildrenAndContinuations(rects, LayoutPoint());
1059 overflowRect.unite(curr->rectWithOutlineForPaintInvalidation(pai ntInvalidationContainer, outlineOutset)); 1058 LayoutRect outlineRect = unionRect(rects);
1059 if (!outlineRect.isEmpty()) {
1060 outlineRect.inflate(outlineOutset);
1061 overflowRect.unite(outlineRect);
1060 } 1062 }
1061
1062 if (continuation && !continuation->isInline() && continuation->parent())
1063 overflowRect.unite(continuation->rectWithOutlineForPaintInvalidation (paintInvalidationContainer, outlineOutset));
1064 } 1063 }
1065 1064
1065 mapRectToPaintInvalidationBacking(paintInvalidationContainer, overflowRect, paintInvalidationState);
1066 return overflowRect; 1066 return overflowRect;
1067 } 1067 }
1068 1068
1069 LayoutRect LayoutInline::rectWithOutlineForPaintInvalidation(const LayoutBoxMode lObject* paintInvalidationContainer, LayoutUnit outlineWidth, const PaintInvalid ationState* paintInvalidationState) const
1070 {
1071 LayoutRect r(LayoutBoxModelObject::rectWithOutlineForPaintInvalidation(paint InvalidationContainer, outlineWidth, paintInvalidationState));
1072 for (LayoutObject* curr = firstChild(); curr; curr = curr->nextSibling()) {
1073 if (!curr->isText())
1074 r.unite(curr->rectWithOutlineForPaintInvalidation(paintInvalidationC ontainer, outlineWidth, paintInvalidationState));
1075 }
1076 return r;
1077 }
1078
1079 void LayoutInline::mapRectToPaintInvalidationBacking(const LayoutBoxModelObject* paintInvalidationContainer, LayoutRect& rect, const PaintInvalidationState* pai ntInvalidationState) const 1069 void LayoutInline::mapRectToPaintInvalidationBacking(const LayoutBoxModelObject* paintInvalidationContainer, LayoutRect& rect, const PaintInvalidationState* pai ntInvalidationState) const
1080 { 1070 {
1081 if (paintInvalidationState && paintInvalidationState->canMapToContainer(pain tInvalidationContainer)) { 1071 if (paintInvalidationState && paintInvalidationState->canMapToContainer(pain tInvalidationContainer)) {
1082 if (style()->hasInFlowPosition() && layer()) 1072 if (style()->hasInFlowPosition() && layer())
1083 rect.move(layer()->offsetForInFlowPosition()); 1073 rect.move(layer()->offsetForInFlowPosition());
1084 rect.move(paintInvalidationState->paintOffset()); 1074 rect.move(paintInvalidationState->paintOffset());
1085 if (paintInvalidationState->isClipped()) 1075 if (paintInvalidationState->isClipped())
1086 rect.intersect(paintInvalidationState->clipRect()); 1076 rect.intersect(paintInvalidationState->clipRect());
1087 return; 1077 return;
1088 } 1078 }
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
1371 { 1361 {
1372 if (!rect.isEmpty()) 1362 if (!rect.isEmpty())
1373 AbsoluteLayoutRectsGeneratorContext::operator()(rect); 1363 AbsoluteLayoutRectsGeneratorContext::operator()(rect);
1374 } 1364 }
1375 }; 1365 };
1376 1366
1377 } // unnamed namespace 1367 } // unnamed namespace
1378 1368
1379 void LayoutInline::addOutlineRects(Vector<LayoutRect>& rects, const LayoutPoint& additionalOffset) const 1369 void LayoutInline::addOutlineRects(Vector<LayoutRect>& rects, const LayoutPoint& additionalOffset) const
1380 { 1370 {
1381 // Add line boxes only if this object is the first object of addOutlineRects (). 1371 AbsoluteLayoutRectsIgnoringEmptyRectsGeneratorContext context(rects, additio nalOffset);
1382 // Otherwise the parent (LayoutBlockFlow or LayoutInline) should have added line box rects 1372 generateLineBoxRects(context);
1383 // covering those of this object.
1384 if (rects.isEmpty()) {
1385 AbsoluteLayoutRectsIgnoringEmptyRectsGeneratorContext context(rects, add itionalOffset);
1386 generateLineBoxRects(context);
1387 }
1388 1373
1374 addOutlineRectsForChildrenAndContinuations(rects, additionalOffset);
1375 }
1376
1377 void LayoutInline::addOutlineRectsForChildrenAndContinuations(Vector<LayoutRect> & rects, const LayoutPoint& additionalOffset) const
1378 {
1389 addOutlineRectsForNormalChildren(rects, additionalOffset); 1379 addOutlineRectsForNormalChildren(rects, additionalOffset);
1380 addOutlineRectsForContinuations(rects, additionalOffset);
1381 }
1390 1382
1383 void LayoutInline::addOutlineRectsForContinuations(Vector<LayoutRect>& rects, co nst LayoutPoint& additionalOffset) const
1384 {
1391 if (LayoutBoxModelObject* continuation = this->continuation()) { 1385 if (LayoutBoxModelObject* continuation = this->continuation()) {
1392 if (continuation->isInline()) 1386 if (continuation->isInline())
1393 continuation->addOutlineRects(rects, additionalOffset + (continuatio n->containingBlock()->location() - containingBlock()->location())); 1387 continuation->addOutlineRects(rects, additionalOffset + (continuatio n->containingBlock()->location() - containingBlock()->location()));
1394 else 1388 else
1395 continuation->addOutlineRects(rects, additionalOffset + (toLayoutBox (continuation)->location() - containingBlock()->location())); 1389 continuation->addOutlineRects(rects, additionalOffset + (toLayoutBox (continuation)->location() - containingBlock()->location()));
1396 } 1390 }
1397 } 1391 }
1398 1392
1399 void LayoutInline::computeSelfHitTestRects(Vector<LayoutRect>& rects, const Layo utPoint& layerOffset) const 1393 void LayoutInline::computeSelfHitTestRects(Vector<LayoutRect>& rects, const Layo utPoint& layerOffset) const
1400 { 1394 {
(...skipping 26 matching lines...) Expand all
1427 } 1421 }
1428 1422
1429 void LayoutInline::invalidateDisplayItemClients(const LayoutBoxModelObject& pain tInvalidationContainer) const 1423 void LayoutInline::invalidateDisplayItemClients(const LayoutBoxModelObject& pain tInvalidationContainer) const
1430 { 1424 {
1431 LayoutBoxModelObject::invalidateDisplayItemClients(paintInvalidationContaine r); 1425 LayoutBoxModelObject::invalidateDisplayItemClients(paintInvalidationContaine r);
1432 for (InlineFlowBox* box = firstLineBox(); box; box = box->nextLineBox()) 1426 for (InlineFlowBox* box = firstLineBox(); box; box = box->nextLineBox())
1433 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*box); 1427 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*box);
1434 } 1428 }
1435 1429
1436 } // namespace blink 1430 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698