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 PPAPI_PROXY_COMPOSITOR_LAYER_RESOURCE_H_
6#define PPAPI_PROXY_COMPOSITOR_LAYER_RESOURCE_H_
7
8#include "ppapi/c/ppb_compositor_layer.h"
9#include "ppapi/proxy/plugin_resource.h"
10#include "ppapi/proxy/ppapi_proxy_export.h"
11#include "ppapi/shared_impl/compositor_layer_data.h"
12#include "ppapi/shared_impl/scoped_pp_resource.h"
13#include "ppapi/thunk/ppb_compositor_layer_api.h"
14
15namespace ppapi {
16namespace proxy {
17
18class CompositorResource;
19
20class PPAPI_PROXY_EXPORT CompositorLayerResource
21    : public PluginResource,
22      public thunk::PPB_CompositorLayer_API {
23 public:
24  // Release callback for texture or image layer.
25  typedef base::Callback<void(int32_t, uint32_t, bool)> ReleaseCallback;
26
27  CompositorLayerResource(Connection connection,
28                          PP_Instance instance,
29                          const CompositorResource* compositor);
30
31  const CompositorLayerData& data() const { return data_; }
32  const ReleaseCallback& release_callback() const {
33    return release_callback_;
34  }
35  void ResetReleaseCallback() { release_callback_.Reset(); }
36  void Invalidate() { compositor_ = NULL; }
37
38 private:
39  enum LayerType {
40    TYPE_COLOR,
41    TYPE_TEXTURE,
42    TYPE_IMAGE,
43  };
44
45  virtual ~CompositorLayerResource();
46
47  // Resource overrides:
48  virtual thunk::PPB_CompositorLayer_API* AsPPB_CompositorLayer_API() OVERRIDE;
49
50  // thunk::PPB_Compositor_API overrides:
51  virtual int32_t SetColor(float red,
52                           float green,
53                           float blue,
54                           float alpha,
55                           const PP_Size* size) OVERRIDE;
56  virtual int32_t SetTexture(
57      PP_Resource context,
58      uint32_t texture,
59      const PP_Size* size,
60      const scoped_refptr<TrackedCallback>& callback) OVERRIDE;
61  virtual int32_t SetImage(
62      PP_Resource image_data,
63      const PP_Size* size,
64      const scoped_refptr<TrackedCallback>& callback) OVERRIDE;
65  virtual int32_t SetClipRect(const PP_Rect* rect) OVERRIDE;
66  virtual int32_t SetTransform(const float matrix[16]) OVERRIDE;
67  virtual int32_t SetOpacity(float opacity) OVERRIDE;
68  virtual int32_t SetBlendMode(PP_BlendMode mode) OVERRIDE;
69  virtual int32_t SetSourceRect(const PP_FloatRect* rect) OVERRIDE;
70  virtual int32_t SetPremultipliedAlpha(PP_Bool premult) OVERRIDE;
71
72  bool SetType(LayerType type);
73  int32_t CheckForSetTextureAndImage(
74      LayerType type,
75      const scoped_refptr<TrackedCallback>& release_callback);
76
77  // The CompositorResource which own the layer. The layer is invalidated if
78  // compositor_ is NULL.
79  const CompositorResource* compositor_;
80
81  // Release callback for uncommitted texture or image. When CommitLayers() on
82  // the compositor_ is called, the callback will be copied into a map in the
83  // compositor_, and it will be reset to NULL.
84  ReleaseCallback release_callback_;
85
86  // Size of texture or image. It is used to verify the rect arg of
87  // SetSourceRect().
88  PP_FloatSize source_size_;
89
90  // Layer data.
91  CompositorLayerData data_;
92
93  DISALLOW_COPY_AND_ASSIGN(CompositorLayerResource);
94};
95
96}  // namespace proxy
97}  // namespace ppapi
98
99#endif  // PPAPI_PROXY_COMPOSITOR_LAYER_RESOURCE_H_
100