/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "BasicLayersImpl.h" #include "BasicContainerLayer.h" using namespace mozilla::gfx; namespace mozilla { namespace layers { BasicContainerLayer::~BasicContainerLayer() { while (mFirstChild) { ContainerRemoveChild(mFirstChild, this); } MOZ_COUNT_DTOR(BasicContainerLayer); } bool BasicContainerLayer::ChildrenPartitionVisibleRegion(const nsIntRect& aInRect) { gfxMatrix transform; if (!GetEffectiveTransform().CanDraw2D(&transform) || transform.HasNonIntegerTranslation()) return false; nsIntPoint offset(int32_t(transform.x0), int32_t(transform.y0)); nsIntRect rect = aInRect.Intersect(GetEffectiveVisibleRegion().GetBounds() + offset); nsIntRegion covered; for (Layer* l = mFirstChild; l; l = l->GetNextSibling()) { if (ToData(l)->IsHidden()) continue; gfxMatrix childTransform; if (!l->GetEffectiveTransform().CanDraw2D(&childTransform) || childTransform.HasNonIntegerTranslation() || l->GetEffectiveOpacity() != 1.0) return false; nsIntRegion childRegion = l->GetEffectiveVisibleRegion(); childRegion.MoveBy(int32_t(childTransform.x0), int32_t(childTransform.y0)); childRegion.And(childRegion, rect); if (l->GetClipRect()) { childRegion.And(childRegion, *l->GetClipRect() + offset); } nsIntRegion intersection; intersection.And(covered, childRegion); if (!intersection.IsEmpty()) return false; covered.Or(covered, childRegion); } return covered.Contains(rect); } already_AddRefed BasicLayerManager::CreateContainerLayer() { NS_ASSERTION(InConstruction(), "Only allowed in construction phase"); nsRefPtr layer = new BasicContainerLayer(this); return layer.forget(); } } }