// Copyright 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "cc/picture_layer.h" #include "cc/layer_tree_impl.h" #include "cc/picture_layer_impl.h" #include "ui/gfx/rect_conversions.h" namespace cc { scoped_refptr PictureLayer::create(ContentLayerClient* client) { return make_scoped_refptr(new PictureLayer(client)); } PictureLayer::PictureLayer(ContentLayerClient* client) : client_(client) { } PictureLayer::~PictureLayer() { } bool PictureLayer::drawsContent() const { return Layer::drawsContent() && client_; } scoped_ptr PictureLayer::createLayerImpl(LayerTreeImpl* treeImpl) { return PictureLayerImpl::create(treeImpl, id()).PassAs(); } void PictureLayer::pushPropertiesTo(LayerImpl* base_layer) { Layer::pushPropertiesTo(base_layer); PictureLayerImpl* layer_impl = static_cast(base_layer); layer_impl->tilings_.SetLayerBounds(bounds()); layer_impl->invalidation_.Clear(); layer_impl->invalidation_.Swap(pile_invalidation_); pile_.PushPropertiesTo(layer_impl->pile_); // TODO(enne): Remove this once syncing happens to the pending tree rather // than the active one. if (layer_impl->layerTreeImpl()->IsActiveTree()) { layer_impl->tilings_.Invalidate(layer_impl->invalidation_); return; } layer_impl->SyncFromActiveLayer(); } void PictureLayer::setNeedsDisplayRect(const gfx::RectF& layer_rect) { gfx::Rect rect = gfx::ToEnclosedRect(layer_rect); pending_invalidation_.Union(rect); Layer::setNeedsDisplayRect(layer_rect); } void PictureLayer::update(ResourceUpdateQueue&, const OcclusionTracker*, RenderingStats& stats) { if (pile_.size() == bounds() && pending_invalidation_.IsEmpty()) return; pile_.Resize(bounds()); // Calling paint in WebKit can sometimes cause invalidations, so save // off the invalidation prior to calling update. pile_invalidation_.Swap(pending_invalidation_); pending_invalidation_.Clear(); pile_.Update(client_, pile_invalidation_, stats); } } // namespace cc