Source/WebCore/ChangeLog

 12011-11-14 Dana Jansens <danakj@chromium.org>
 2
 3 Use full opaque region to determine GraphicsLayer opaque flag
 4 https://bugs.webkit.org/show_bug.cgi?id=72298
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 * rendering/RenderLayerBacking.cpp:
 9 (WebCore::RenderLayerBacking::updateCompositedBounds): Use Region::occludes() to test if the backing is filled by opaque objects.
 10 * rendering/RenderLayerCompositor.cpp:
 11 (WebCore::RenderLayerCompositor::calculateCompositedBounds): Collect a Region rather than a Vector of IntRects.
 12 * rendering/RenderLayerCompositor.h:
 13
1142011-11-14 Adam Barth <abarth@webkit.org>
215
316 Unique origins shouldn't remember their scheme, host, or port

Source/WebCore/rendering/RenderLayerBacking.cpp

4545#include "InspectorInstrumentation.h"
4646#include "KeyframeList.h"
4747#include "PluginViewBase.h"
 48#include "Region.h"
4849#include "RenderApplet.h"
4950#include "RenderIFrame.h"
5051#include "RenderImage.h"

@@static bool layerOrAncestorIsFullScreen(RenderLayer* layer)
192193
193194void RenderLayerBacking::updateCompositedBounds()
194195{
195  Vector<IntRect> opaqueRegions;
196  LayoutRect layerBounds = compositor()->calculateCompositedBounds(m_owningLayer, m_owningLayer, opaqueRegions);
 196 Region opaqueRegion;
 197 LayoutRect layerBounds = compositor()->calculateCompositedBounds(m_owningLayer, m_owningLayer, opaqueRegion);
197198
198199 // Clip to the size of the document or enclosing overflow-scroll layer.
199200 // If this or an ancestor is transformed, we can't currently compute the correct rect to intersect with.

@@void RenderLayerBacking::updateCompositedBounds()
232233 m_artificiallyInflatedBounds = false;
233234
234235 // Determine if the entire compositing area will be filled with opaque data.
235  // FIXME: Consider the union of the opaque rects rather than any single rect.
236  bool opaque = false;
237  Vector<IntRect>::iterator it, end;
238  end = opaqueRegions.end();
239  for (it = opaqueRegions.begin(); it != end; ++it) {
240  if (it->contains(layerBounds)) {
241  opaque = true;
242  break;
243  }
244  }
245  m_graphicsLayer->setContentsOpaque(opaque);
 236 m_graphicsLayer->setContentsOpaque(opaqueRegion.contains(layerBounds));
246237
247238 setCompositedBounds(layerBounds);
248239}

Source/WebCore/rendering/RenderLayerCompositor.cpp

4242#include "HitTestResult.h"
4343#include "NodeList.h"
4444#include "Page.h"
 45#include "Region.h"
4546#include "RenderApplet.h"
4647#include "RenderEmbeddedObject.h"
4748#include "RenderFullScreen.h"

@@void RenderLayerCompositor::repaintOnCompositingChange(RenderLayer* layer)
449450
450451// The bounds of the GraphicsLayer created for a compositing layer is the union of the bounds of all the descendant
451452// RenderLayers that are rendered by the composited RenderLayer.
452 LayoutRect RenderLayerCompositor::calculateCompositedBounds(const RenderLayer* layer, const RenderLayer* ancestorLayer, Vector<IntRect>& opaqueRegions, LayoutPoint totalRelOffset)
 453LayoutRect RenderLayerCompositor::calculateCompositedBounds(const RenderLayer* layer, const RenderLayer* ancestorLayer, Region& opaqueRegion, LayoutPoint totalRelOffset)
453454{
454455 if (!canBeComposited(layer))
455456 return LayoutRect();

@@LayoutRect RenderLayerCompositor::calculateCompositedBounds(const RenderLayer* l
485486
486487 if (RenderLayer* reflection = layer->reflectionLayer()) {
487488 if (!reflection->isComposited()) {
488  LayoutRect childUnionBounds = calculateCompositedBounds(reflection, layer, opaqueRegions, totalRelOffset);
 489 LayoutRect childUnionBounds = calculateCompositedBounds(reflection, layer, opaqueRegion, totalRelOffset);
489490 unionBounds.unite(childUnionBounds);
490491 }
491492 }

@@LayoutRect RenderLayerCompositor::calculateCompositedBounds(const RenderLayer* l
497498 for (size_t i = 0; i < listSize; ++i) {
498499 RenderLayer* curLayer = negZOrderList->at(i);
499500 if (!curLayer->isComposited()) {
500  LayoutRect childUnionBounds = calculateCompositedBounds(curLayer, layer, opaqueRegions, totalRelOffset);
 501 LayoutRect childUnionBounds = calculateCompositedBounds(curLayer, layer, opaqueRegion, totalRelOffset);
501502 unionBounds.unite(childUnionBounds);
502503 }
503504 }

@@LayoutRect RenderLayerCompositor::calculateCompositedBounds(const RenderLayer* l
508509 for (size_t i = 0; i < listSize; ++i) {
509510 RenderLayer* curLayer = posZOrderList->at(i);
510511 if (!curLayer->isComposited()) {
511  LayoutRect childUnionBounds = calculateCompositedBounds(curLayer, layer, opaqueRegions, totalRelOffset);
 512 LayoutRect childUnionBounds = calculateCompositedBounds(curLayer, layer, opaqueRegion, totalRelOffset);
512513 unionBounds.unite(childUnionBounds);
513514 }
514515 }

@@LayoutRect RenderLayerCompositor::calculateCompositedBounds(const RenderLayer* l
519520 for (size_t i = 0; i < listSize; ++i) {
520521 RenderLayer* curLayer = normalFlowList->at(i);
521522 if (!curLayer->isComposited()) {
522  LayoutRect curAbsBounds = calculateCompositedBounds(curLayer, layer, opaqueRegions, totalRelOffset);
 523 LayoutRect curAbsBounds = calculateCompositedBounds(curLayer, layer, opaqueRegion, totalRelOffset);
523524 unionBounds.unite(curAbsBounds);
524525 }
525526 }

@@LayoutRect RenderLayerCompositor::calculateCompositedBounds(const RenderLayer* l
540541 // FIXME: Consider all the RenderObjects painting into this RenderLayer, not just the first.
541542 LayoutRect area = layer->renderer()->borderBoundingBox();
542543 if (layer->renderer()->isOpaqueInRect(area))
543  opaqueRegions.append(area);
 544 opaqueRegion.unite(area);
544545 }
545546
546547 return unionBounds;

Source/WebCore/rendering/RenderLayerCompositor.h

@@namespace WebCore {
3535#define PROFILE_LAYER_REBUILD 0
3636
3737class GraphicsLayer;
 38class Region;
3839class RenderEmbeddedObject;
3940class RenderPart;
4041#if ENABLE(VIDEO)

@@public:
118119 bool needsContentsCompositingLayer(const RenderLayer*) const;
119120 // Return the bounding box required for compositing layer and its childern, relative to ancestorLayer.
120121 // If layerBoundingBox is not 0, on return it contains the bounding box of this layer only.
121  LayoutRect calculateCompositedBounds(const RenderLayer*, const RenderLayer* ancestorLayer, Vector<IntRect>& opaqueRegions, LayoutPoint totalRelOffset = LayoutPoint());
 122 LayoutRect calculateCompositedBounds(const RenderLayer*, const RenderLayer* ancestorLayer, Region& opaqueRegion, LayoutPoint totalRelOffset = LayoutPoint());
122123
123124 // Repaint the appropriate layers when the given RenderLayer starts or stops being composited.
124125 void repaintOnCompositingChange(RenderLayer*);