// Copyright 2013 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. #ifndef CC_LAYERS_DELEGATED_FRAME_PROVIDER_H_ #define CC_LAYERS_DELEGATED_FRAME_PROVIDER_H_ #include #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "cc/base/cc_export.h" #include "cc/resources/return_callback.h" #include "cc/resources/returned_resource.h" #include "ui/gfx/rect_f.h" #include "ui/gfx/size.h" namespace cc { class DelegatedFrameData; class DelegatedFrameResourceCollection; class DelegatedRendererLayer; // Only one observing layer has ownership of the DelegatedFrameProvider. Only // the active observer should call GetFrameDataAndRefResources(). All frames // provided by a single DelegatedFrameProvider must have the same size. A new // provider must be used for frames of a different size. class CC_EXPORT DelegatedFrameProvider : public base::RefCounted { public: explicit DelegatedFrameProvider( const scoped_refptr& resource_collection, scoped_ptr frame); void AddObserver(DelegatedRendererLayer* layer); void RemoveObserver(DelegatedRendererLayer* layer); void SetFrameData(scoped_ptr frame); // The DelegatedFrameData returned here must be displayed in order to not // lose track of damage. DelegatedFrameData* GetFrameDataAndRefResources( DelegatedRendererLayer* observer, gfx::RectF* damage); ReturnCallback GetReturnResourcesCallbackForImplThread(); void UnrefResourcesOnMainThread(const ReturnedResourceArray& unused); gfx::Size frame_size() const { return frame_size_; } private: friend class base::RefCounted; ~DelegatedFrameProvider(); scoped_refptr resource_collection_; scoped_ptr frame_; struct Observer { DelegatedRendererLayer* layer; gfx::RectF damage; Observer(DelegatedRendererLayer* layer, const gfx::RectF& damage) : layer(layer), damage(damage) {} }; std::vector observers_; gfx::Size frame_size_; DISALLOW_COPY_AND_ASSIGN(DelegatedFrameProvider); }; } // namespace cc #endif // CC_LAYERS_DELEGATED_FRAME_PROVIDER_H_