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

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: 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 rects.append(overflowRect);
1059 overflowRect.unite(curr->rectWithOutlineForPaintInvalidation(pai ntInvalidationContainer, outlineOutset)); 1058 addOutlineRectsForChildrenAndContinuations(rects, LayoutPoint());
1060 } 1059 overflowRect = unionRect(rects);
1061 1060 overflowRect.inflate(outlineOutset);
1062 if (continuation && !continuation->isInline() && continuation->parent())
1063 overflowRect.unite(continuation->rectWithOutlineForPaintInvalidation (paintInvalidationContainer, outlineOutset));
1064 } 1061 }
1065 1062
1063 mapRectToPaintInvalidationBacking(paintInvalidationContainer, overflowRect, paintInvalidationState);
1066 return overflowRect; 1064 return overflowRect;
1067 } 1065 }
1068 1066
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 1067 void LayoutInline::mapRectToPaintInvalidationBacking(const LayoutBoxModelObject* paintInvalidationContainer, LayoutRect& rect, const PaintInvalidationState* pai ntInvalidationState) const
1080 { 1068 {
1081 if (paintInvalidationState && paintInvalidationState->canMapToContainer(pain tInvalidationContainer)) { 1069 if (paintInvalidationState && paintInvalidationState->canMapToContainer(pain tInvalidationContainer)) {
1082 if (style()->hasInFlowPosition() && layer()) 1070 if (style()->hasInFlowPosition() && layer())
1083 rect.move(layer()->offsetForInFlowPosition()); 1071 rect.move(layer()->offsetForInFlowPosition());
1084 rect.move(paintInvalidationState->paintOffset()); 1072 rect.move(paintInvalidationState->paintOffset());
1085 if (paintInvalidationState->isClipped()) 1073 if (paintInvalidationState->isClipped())
1086 rect.intersect(paintInvalidationState->clipRect()); 1074 rect.intersect(paintInvalidationState->clipRect());
1087 return; 1075 return;
1088 } 1076 }
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
1371 { 1359 {
1372 if (!rect.isEmpty()) 1360 if (!rect.isEmpty())
1373 AbsoluteLayoutRectsGeneratorContext::operator()(rect); 1361 AbsoluteLayoutRectsGeneratorContext::operator()(rect);
1374 } 1362 }
1375 }; 1363 };
1376 1364
1377 } // unnamed namespace 1365 } // unnamed namespace
1378 1366
1379 void LayoutInline::addOutlineRects(Vector<LayoutRect>& rects, const LayoutPoint& additionalOffset) const 1367 void LayoutInline::addOutlineRects(Vector<LayoutRect>& rects, const LayoutPoint& additionalOffset) const
1380 { 1368 {
1381 // Add line boxes only if this object is the first object of addOutlineRects (). 1369 AbsoluteLayoutRectsIgnoringEmptyRectsGeneratorContext context(rects, additio nalOffset);
1382 // Otherwise the parent (LayoutBlockFlow or LayoutInline) should have added line box rects 1370 generateLineBoxRects(context);
1383 // covering those of this object.
1384 if (rects.isEmpty()) {
1385 AbsoluteLayoutRectsIgnoringEmptyRectsGeneratorContext context(rects, add itionalOffset);
1386 generateLineBoxRects(context);
1387 }
1388 1371
1372 addOutlineRectsForChildrenAndContinuations(rects, additionalOffset);
1373 }
1374
1375 void LayoutInline::addOutlineRectsForChildrenAndContinuations(Vector<LayoutRect> & rects, const LayoutPoint& additionalOffset) const
1376 {
1389 addOutlineRectsForNormalChildren(rects, additionalOffset); 1377 addOutlineRectsForNormalChildren(rects, additionalOffset);
1378 addOutlineRectsForContinuations(rects, additionalOffset);
1379 }
1390 1380
1381 void LayoutInline::addOutlineRectsForContinuations(Vector<LayoutRect>& rects, co nst LayoutPoint& additionalOffset) const
1382 {
1391 if (LayoutBoxModelObject* continuation = this->continuation()) { 1383 if (LayoutBoxModelObject* continuation = this->continuation()) {
1392 if (continuation->isInline()) 1384 if (continuation->isInline())
1393 continuation->addOutlineRects(rects, additionalOffset + (continuatio n->containingBlock()->location() - containingBlock()->location())); 1385 continuation->addOutlineRects(rects, additionalOffset + (continuatio n->containingBlock()->location() - containingBlock()->location()));
1394 else 1386 else
1395 continuation->addOutlineRects(rects, additionalOffset + (toLayoutBox (continuation)->location() - containingBlock()->location())); 1387 continuation->addOutlineRects(rects, additionalOffset + (toLayoutBox (continuation)->location() - containingBlock()->location()));
1396 } 1388 }
1397 } 1389 }
1398 1390
1399 void LayoutInline::computeSelfHitTestRects(Vector<LayoutRect>& rects, const Layo utPoint& layerOffset) const 1391 void LayoutInline::computeSelfHitTestRects(Vector<LayoutRect>& rects, const Layo utPoint& layerOffset) const
1400 { 1392 {
(...skipping 26 matching lines...) Expand all
1427 } 1419 }
1428 1420
1429 void LayoutInline::invalidateDisplayItemClients(const LayoutBoxModelObject& pain tInvalidationContainer) const 1421 void LayoutInline::invalidateDisplayItemClients(const LayoutBoxModelObject& pain tInvalidationContainer) const
1430 { 1422 {
1431 LayoutBoxModelObject::invalidateDisplayItemClients(paintInvalidationContaine r); 1423 LayoutBoxModelObject::invalidateDisplayItemClients(paintInvalidationContaine r);
1432 for (InlineFlowBox* box = firstLineBox(); box; box = box->nextLineBox()) 1424 for (InlineFlowBox* box = firstLineBox(); box; box = box->nextLineBox())
1433 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*box); 1425 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*box);
1434 } 1426 }
1435 1427
1436 } // namespace blink 1428 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698