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

Side by Side Diff: Source/core/rendering/compositing/CompositedLayerMapping.cpp

Issue 266453008: Get rid of extra clipping of composited layers in CompositedLayerMapping::updateCompositedBounds(). (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebased. Created 6 years, 7 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
« no previous file with comments | « Source/core/rendering/compositing/CompositedLayerMapping.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 } 328 }
329 } 329 }
330 330
331 static bool hasNonZeroTransformOrigin(const RenderObject* renderer) 331 static bool hasNonZeroTransformOrigin(const RenderObject* renderer)
332 { 332 {
333 RenderStyle* style = renderer->style(); 333 RenderStyle* style = renderer->style();
334 return (style->transformOriginX().type() == Fixed && style->transformOriginX ().value()) 334 return (style->transformOriginX().type() == Fixed && style->transformOriginX ().value())
335 || (style->transformOriginY().type() == Fixed && style->transformOriginY ().value()); 335 || (style->transformOriginY().type() == Fixed && style->transformOriginY ().value());
336 } 336 }
337 337
338 static bool layerOrAncestorIsTransformedOrUsingCompositedScrolling(RenderLayer* layer)
339 {
340 for (RenderLayer* curr = layer; curr; curr = curr->parent()) {
341 if (curr->hasTransform() || curr->needsCompositedScrolling())
342 return true;
343 }
344
345 return false;
346 }
347
348 bool CompositedLayerMapping::shouldClipCompositedBounds() const
349 {
350 // Scrollbar layers use this layer for relative positioning, so don't clip.
351 if (layerForHorizontalScrollbar() || layerForVerticalScrollbar())
352 return false;
353
354 if (layerOrAncestorIsTransformedOrUsingCompositedScrolling(&m_owningLayer))
355 return false;
356
357 // Scrolled composited layers are clipped by their ancestor clipping layer,
358 // so don't clip these, either.
359 if (compositor()->clippedByNonAncestorInStackingTree(&m_owningLayer)
360 && m_owningLayer.renderer()->containingBlock()->enclosingLayer() == m_ow ningLayer.ancestorScrollingLayer())
361 return false;
362
363 return true;
364 }
365
366 void CompositedLayerMapping::updateCompositedBounds(GraphicsLayerUpdater::Update Type updateType) 338 void CompositedLayerMapping::updateCompositedBounds(GraphicsLayerUpdater::Update Type updateType)
367 { 339 {
368 if (!shouldUpdateGraphicsLayer(updateType)) 340 if (!shouldUpdateGraphicsLayer(updateType))
369 return; 341 return;
370 342
371 // We need to know if we draw content in order to update our bounds (this ha s an effect 343 // We need to know if we draw content in order to update our bounds (this ha s an effect
372 // on whether or not descendands will paint into our backing). Update this v alue now. 344 // on whether or not descendands will paint into our backing). Update this v alue now.
373 updateDrawsContent(); 345 updateDrawsContent();
374 346
375 LayoutRect layerBounds = m_owningLayer.boundingBoxForCompositing(); 347 LayoutRect layerBounds = m_owningLayer.boundingBoxForCompositing();
376 348
377 // Clip to the size of the document or enclosing overflow-scroll layer.
378 // If this or an ancestor is transformed, we can't currently compute the cor rect rect to intersect with.
379 // We'd need RenderObject::convertContainerToLocalQuad(), which doesn't yet exist.
380 if (shouldClipCompositedBounds()) {
381 RenderView* view = m_owningLayer.renderer()->view();
382 RenderLayer* rootLayer = view->layer();
383
384 LayoutRect clippingBounds;
385 if (renderer()->style()->position() == FixedPosition && renderer()->cont ainer() == view)
386 clippingBounds = view->frameView()->viewportConstrainedVisibleConten tRect();
387 else
388 clippingBounds = view->unscaledDocumentRect();
389
390 if (&m_owningLayer != rootLayer)
391 clippingBounds.intersect(m_owningLayer.clipper().backgroundClipRect( ClipRectsContext(rootLayer, AbsoluteClipRects)).rect());
392
393 LayoutPoint delta;
394 m_owningLayer.convertToLayerCoords(rootLayer, delta);
395 clippingBounds.move(-delta.x(), -delta.y());
396
397 layerBounds.intersect(clippingBounds);
398 }
399
400 // If the element has a transform-origin that has fixed lengths, and the ren derer has zero size, 349 // If the element has a transform-origin that has fixed lengths, and the ren derer has zero size,
401 // then we need to ensure that the compositing layer has non-zero size so th at we can apply 350 // then we need to ensure that the compositing layer has non-zero size so th at we can apply
402 // the transform-origin via the GraphicsLayer anchorPoint (which is expresse d as a fractional value). 351 // the transform-origin via the GraphicsLayer anchorPoint (which is expresse d as a fractional value).
403 if (layerBounds.isEmpty() && hasNonZeroTransformOrigin(renderer())) { 352 if (layerBounds.isEmpty() && hasNonZeroTransformOrigin(renderer())) {
404 layerBounds.setWidth(1); 353 layerBounds.setWidth(1);
405 layerBounds.setHeight(1); 354 layerBounds.setHeight(1);
406 m_artificiallyInflatedBounds = true; 355 m_artificiallyInflatedBounds = true;
407 } else { 356 } else {
408 m_artificiallyInflatedBounds = false; 357 m_artificiallyInflatedBounds = false;
409 } 358 }
(...skipping 1745 matching lines...) Expand 10 before | Expand all | Expand 10 after
2155 } else if (graphicsLayer == m_scrollingContentsLayer.get()) { 2104 } else if (graphicsLayer == m_scrollingContentsLayer.get()) {
2156 name = "Scrolling Contents Layer"; 2105 name = "Scrolling Contents Layer";
2157 } else { 2106 } else {
2158 ASSERT_NOT_REACHED(); 2107 ASSERT_NOT_REACHED();
2159 } 2108 }
2160 2109
2161 return name; 2110 return name;
2162 } 2111 }
2163 2112
2164 } // namespace WebCore 2113 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/rendering/compositing/CompositedLayerMapping.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698