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

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

Issue 1294233004: Subtree caching implementation in blink-core (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Add a complex-subtree-update test 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 * (C) 2000 Dirk Mueller (mueller@kde.org) 4 * (C) 2000 Dirk Mueller (mueller@kde.org)
5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) 5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed.
7 * Copyright (C) 2009 Google Inc. All rights reserved. 7 * Copyright (C) 2009 Google Inc. All rights reserved.
8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) 8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 1147 matching lines...) Expand 10 before | Expand all | Expand 10 after
1158 toLayoutView(&paintInvalidationContainer)->invalidatePaintForRectangle(r , invalidationReason); 1158 toLayoutView(&paintInvalidationContainer)->invalidatePaintForRectangle(r , invalidationReason);
1159 return; 1159 return;
1160 } 1160 }
1161 1161
1162 if (paintInvalidationContainer.view()->usesCompositing()) { 1162 if (paintInvalidationContainer.view()->usesCompositing()) {
1163 ASSERT(paintInvalidationContainer.isPaintInvalidationContainer()); 1163 ASSERT(paintInvalidationContainer.isPaintInvalidationContainer());
1164 paintInvalidationContainer.setBackingNeedsPaintInvalidationInRect(r, inv alidationReason); 1164 paintInvalidationContainer.setBackingNeedsPaintInvalidationInRect(r, inv alidationReason);
1165 } 1165 }
1166 } 1166 }
1167 1167
1168 void LayoutObject::invalidateDisplayItemClient(const DisplayItemClientWrapper& d isplayItemClient) const 1168 void LayoutObject::invalidateDisplayItemClient(const NonLayoutObjectDisplayItemC lientWrapper& displayItemClient)
1169 {
1170 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
1171 setChildNeedsRepaint();
1172 invalidateDisplayItemClientInternal(displayItemClient);
1173 }
1174
1175 void LayoutObject::invalidateDisplayItemClient(LayoutObject& object)
1176 {
1177 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
1178 object.setNeedsRepaint();
1179 invalidateDisplayItemClientInternal(object);
1180 }
1181
1182 void LayoutObject::invalidateDisplayItemClientInternal(const DisplayItemClientWr apper& displayItemClient)
1169 { 1183 {
1170 if (!RuntimeEnabledFeatures::slimmingPaintEnabled()) 1184 if (!RuntimeEnabledFeatures::slimmingPaintEnabled())
1171 return; 1185 return;
1172 1186
1173 // Not using enclosingCompositedContainer() directly because this object may be in an orphaned subtree. 1187 // Not using enclosingCompositedContainer() directly because this object may be in an orphaned subtree.
1174 if (const DeprecatedPaintLayer* enclosingLayer = this->enclosingLayer()) { 1188 if (const DeprecatedPaintLayer* enclosingLayer = this->enclosingLayer()) {
1175 // This is valid because we want to invalidate the client in the display item list of the current backing. 1189 // This is valid because we want to invalidate the client in the display item list of the current backing.
1176 DisableCompositingQueryAsserts disabler; 1190 DisableCompositingQueryAsserts disabler;
1177 if (const DeprecatedPaintLayer* paintInvalidationLayer = enclosingLayer- >enclosingLayerForPaintInvalidationCrossingFrameBoundaries()) 1191 if (const DeprecatedPaintLayer* paintInvalidationLayer = enclosingLayer- >enclosingLayerForPaintInvalidationCrossingFrameBoundaries())
1178 paintInvalidationLayer->layoutObject()->invalidateDisplayItemClientO nBacking(displayItemClient); 1192 paintInvalidationLayer->layoutObject()->invalidateDisplayItemClientO nBacking(displayItemClient);
1179 } 1193 }
1180 } 1194 }
1181 1195
1182 void LayoutObject::invalidateDisplayItemClients(const LayoutBoxModelObject& pain tInvalidationContainer) const 1196 void LayoutObject::invalidateDisplayItemClients(const LayoutBoxModelObject& pain tInvalidationContainer)
1183 { 1197 {
1184 ASSERT(RuntimeEnabledFeatures::slimmingPaintEnabled()); 1198 ASSERT(RuntimeEnabledFeatures::slimmingPaintEnabled());
1199 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
1200 setNeedsRepaint();
1185 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*this); 1201 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*this);
1186 } 1202 }
1187 1203
1204 void LayoutObject::setNeedsRepaint()
1205 {
1206 ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
1207 ASSERT(document().lifecycle().state() <= DocumentLifecycle::InPaintInvalidat ion);
1208
1209 if (!selfNeedsRepaint()) {
1210 m_bitfields.setSelfNeedsRepaint(true);
1211 markContainerChainForChildNeedsRepaint();
1212 }
1213 }
1214
1215 void LayoutObject::setChildNeedsRepaint()
1216 {
1217 ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
1218 ASSERT(document().lifecycle().state() <= DocumentLifecycle::InPaintInvalidat ion);
1219
1220 if (!childNeedsRepaint()) {
1221 m_bitfields.setChildNeedsRepaint(true);
1222 markContainerChainForChildNeedsRepaint();
1223 }
1224 }
1225
1226 void LayoutObject::markContainerChainForChildNeedsRepaint()
1227 {
1228 // TODO(wangxianzhu): This should be "markPaintContainerChainForChildNeedsRe paint"
1229 // (which returns the painting container instead of positioning container fo r fixed-pos)
1230 // when we remove DeprecatedPaintLayer. Currently DeprecatedPaintLayer paint s fixed-pos
1231 // object which is not fully controlled by normal LayoutBlock subtree repain t flags.
trchen 2015/08/25 06:30:38 Sorry I just realized that fixed-pos element is no
Xianzhu 2015/08/25 15:55:03 This is not too hard, but it'll need non-constant
chrishtr 2015/08/25 20:49:52 I'm not sure all the complexity of encoding paint
1232 ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
1233 for (LayoutObject* container = this->containerCrossingFrameBoundaries(); con tainer && !container->childNeedsRepaint(); container = container->containerCross ingFrameBoundaries())
1234 container->m_bitfields.setChildNeedsRepaint(true);
1235 }
1236
1237 void LayoutObject::clearRepaintFlagsRecursively()
1238 {
1239 ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
1240 ASSERT(document().lifecycle().state() == DocumentLifecycle::InPaintForSlimmi ngPaintV2);
1241
1242 m_bitfields.setSelfNeedsRepaint(false);
1243
1244 if (!m_bitfields.childNeedsRepaint())
1245 return;
1246
1247 clearRepaintFlagsOfSubtrees();
1248 m_bitfields.setChildNeedsRepaint(false);
1249 }
1250
1251 void LayoutObject::clearRepaintFlagsOfSubtrees()
1252 {
1253 ASSERT(RuntimeEnabledFeatures::slimmingPaintV2Enabled());
1254 for (LayoutObject* child = slowFirstChild(); child; child = child->nextSibli ng()) {
1255 if (!child->isOutOfFlowPositioned())
1256 child->clearRepaintFlagsRecursively();
1257 }
1258 }
1259
1188 LayoutRect LayoutObject::boundsRectForPaintInvalidation(const LayoutBoxModelObje ct* paintInvalidationContainer, const PaintInvalidationState* paintInvalidationS tate) const 1260 LayoutRect LayoutObject::boundsRectForPaintInvalidation(const LayoutBoxModelObje ct* paintInvalidationContainer, const PaintInvalidationState* paintInvalidationS tate) const
1189 { 1261 {
1190 if (!paintInvalidationContainer) 1262 if (!paintInvalidationContainer)
1191 return computePaintInvalidationRect(paintInvalidationContainer, paintInv alidationState); 1263 return computePaintInvalidationRect(paintInvalidationContainer, paintInv alidationState);
1192 return DeprecatedPaintLayer::computePaintInvalidationRect(this, paintInvalid ationContainer->layer(), paintInvalidationState); 1264 return DeprecatedPaintLayer::computePaintInvalidationRect(this, paintInvalid ationContainer->layer(), paintInvalidationState);
1193 } 1265 }
1194 1266
1195 const LayoutBoxModelObject* LayoutObject::invalidatePaintRectangleInternal(const LayoutRect& r) const 1267 const LayoutBoxModelObject* LayoutObject::invalidatePaintRectangleInternal(const LayoutRect& r)
1196 { 1268 {
1197 RELEASE_ASSERT(isRooted()); 1269 RELEASE_ASSERT(isRooted());
1198 1270
1199 if (r.isEmpty()) 1271 if (r.isEmpty())
1200 return nullptr; 1272 return nullptr;
1201 1273
1202 if (view()->document().printing()) 1274 if (view()->document().printing())
1203 return nullptr; // Don't invalidate paints if we're printing. 1275 return nullptr; // Don't invalidate paints if we're printing.
1204 1276
1205 LayoutRect dirtyRect(r); 1277 LayoutRect dirtyRect(r);
1206 1278
1207 const LayoutBoxModelObject& paintInvalidationContainer = containerForPaintIn validationOnRootedTree(); 1279 const LayoutBoxModelObject& paintInvalidationContainer = containerForPaintIn validationOnRootedTree();
1208 DeprecatedPaintLayer::mapRectToPaintInvalidationBacking(this, &paintInvalida tionContainer, dirtyRect); 1280 DeprecatedPaintLayer::mapRectToPaintInvalidationBacking(this, &paintInvalida tionContainer, dirtyRect);
1209 invalidatePaintUsingContainer(paintInvalidationContainer, dirtyRect, PaintIn validationRectangle); 1281 invalidatePaintUsingContainer(paintInvalidationContainer, dirtyRect, PaintIn validationRectangle);
1210 return &paintInvalidationContainer; 1282 return &paintInvalidationContainer;
1211 } 1283 }
1212 1284
1213 void LayoutObject::invalidatePaintRectangle(const LayoutRect& r) const 1285 void LayoutObject::invalidatePaintRectangle(const LayoutRect& r)
1214 { 1286 {
1215 if (const LayoutBoxModelObject* paintInvalidationContainer = invalidatePaint RectangleInternal(r)) { 1287 if (const LayoutBoxModelObject* paintInvalidationContainer = invalidatePaint RectangleInternal(r)) {
1216 if (RuntimeEnabledFeatures::slimmingPaintEnabled()) 1288 if (RuntimeEnabledFeatures::slimmingPaintEnabled())
1217 invalidateDisplayItemClients(*paintInvalidationContainer); 1289 invalidateDisplayItemClients(*paintInvalidationContainer);
1218 } 1290 }
1219 } 1291 }
1220 1292
1221 void LayoutObject::invalidateTreeIfNeeded(PaintInvalidationState& paintInvalidat ionState) 1293 void LayoutObject::invalidateTreeIfNeeded(PaintInvalidationState& paintInvalidat ionState)
1222 { 1294 {
1223 ASSERT(!needsLayout()); 1295 ASSERT(!needsLayout());
(...skipping 2042 matching lines...) Expand 10 before | Expand all | Expand 10 after
3266 3338
3267 // If a paint invalidation container is not a stacking context, 3339 // If a paint invalidation container is not a stacking context,
3268 // some of its descendants may belong to the parent container. 3340 // some of its descendants may belong to the parent container.
3269 findNonCompositedDescendantLayerToTraverse(*descendant, functor); 3341 findNonCompositedDescendantLayerToTraverse(*descendant, functor);
3270 descendant = descendant->nextInPreOrderAfterChildren(&object); 3342 descendant = descendant->nextInPreOrderAfterChildren(&object);
3271 } 3343 }
3272 } 3344 }
3273 3345
3274 } // unnamed namespace 3346 } // unnamed namespace
3275 3347
3276 void LayoutObject::invalidateDisplayItemClientForNonCompositingDescendantsOf(con st LayoutObject& object) const 3348 void LayoutObject::invalidateDisplayItemClientForNonCompositingDescendantsOf(Lay outObject& object)
3277 { 3349 {
3278 ASSERT(RuntimeEnabledFeatures::slimmingPaintEnabled()); 3350 ASSERT(RuntimeEnabledFeatures::slimmingPaintEnabled());
3279 3351
3280 // Not using enclosingCompositedContainer() directly because this object may be in an orphaned subtree. 3352 // Not using enclosingCompositedContainer() directly because this object may be in an orphaned subtree.
3281 const DeprecatedPaintLayer* enclosingLayer = this->enclosingLayer(); 3353 const DeprecatedPaintLayer* enclosingLayer = this->enclosingLayer();
3282 if (!enclosingLayer) 3354 if (!enclosingLayer)
3283 return; 3355 return;
3284 3356
3285 // This is valid because we want to invalidate the client in the display ite m list of the current backing. 3357 // This is valid because we want to invalidate the client in the display ite m list of the current backing.
3286 DisableCompositingQueryAsserts disabler; 3358 DisableCompositingQueryAsserts disabler;
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
3384 const blink::LayoutObject* root = object1; 3456 const blink::LayoutObject* root = object1;
3385 while (root->parent()) 3457 while (root->parent())
3386 root = root->parent(); 3458 root = root->parent();
3387 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0); 3459 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0);
3388 } else { 3460 } else {
3389 fprintf(stderr, "Cannot showLayoutTree. Root is (nil)\n"); 3461 fprintf(stderr, "Cannot showLayoutTree. Root is (nil)\n");
3390 } 3462 }
3391 } 3463 }
3392 3464
3393 #endif 3465 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698