1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CC_BLINK_WEB_EXTERNAL_TEXTURE_LAYER_IMPL_H_
6#define CC_BLINK_WEB_EXTERNAL_TEXTURE_LAYER_IMPL_H_
7
8#include "base/bind.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/memory/scoped_vector.h"
11#include "cc/blink/cc_blink_export.h"
12#include "cc/layers/texture_layer_client.h"
13#include "third_party/WebKit/public/platform/WebExternalTextureLayer.h"
14
15namespace blink {
16struct WebFloatRect;
17struct WebExternalTextureMailbox;
18}
19
20namespace cc {
21class SingleReleaseCallback;
22class TextureMailbox;
23}
24
25namespace cc_blink {
26
27class WebLayerImpl;
28class WebExternalBitmapImpl;
29
30class WebExternalTextureLayerImpl
31    : public blink::WebExternalTextureLayer,
32      public cc::TextureLayerClient,
33      public base::SupportsWeakPtr<WebExternalTextureLayerImpl> {
34 public:
35  CC_BLINK_EXPORT explicit WebExternalTextureLayerImpl(
36      blink::WebExternalTextureLayerClient*);
37  virtual ~WebExternalTextureLayerImpl();
38
39  // blink::WebExternalTextureLayer implementation.
40  virtual blink::WebLayer* layer();
41  virtual void clearTexture();
42  virtual void setOpaque(bool opaque);
43  virtual void setPremultipliedAlpha(bool premultiplied);
44  virtual void setBlendBackgroundColor(bool blend);
45  virtual void setRateLimitContext(bool rate_limit);
46
47  // TextureLayerClient implementation.
48  virtual bool PrepareTextureMailbox(
49      cc::TextureMailbox* mailbox,
50      scoped_ptr<cc::SingleReleaseCallback>* release_callback,
51      bool use_shared_memory) OVERRIDE;
52
53 private:
54  static void DidReleaseMailbox(
55      base::WeakPtr<WebExternalTextureLayerImpl> layer,
56      const blink::WebExternalTextureMailbox& mailbox,
57      WebExternalBitmapImpl* bitmap,
58      unsigned sync_point,
59      bool lost_resource);
60
61  WebExternalBitmapImpl* AllocateBitmap();
62
63  blink::WebExternalTextureLayerClient* client_;
64  scoped_ptr<WebLayerImpl> layer_;
65  ScopedVector<WebExternalBitmapImpl> free_bitmaps_;
66
67  DISALLOW_COPY_AND_ASSIGN(WebExternalTextureLayerImpl);
68};
69
70}  // namespace cc_blink
71
72#endif  // CC_BLINK_WEB_EXTERNAL_TEXTURE_LAYER_IMPL_H_
73