146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#ifndef PPAPI_PROXY_COMPOSITOR_LAYER_RESOURCE_H_
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define PPAPI_PROXY_COMPOSITOR_LAYER_RESOURCE_H_
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/c/ppb_compositor_layer.h"
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/proxy/plugin_resource.h"
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/proxy/ppapi_proxy_export.h"
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ppapi/shared_impl/compositor_layer_data.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ppapi/shared_impl/scoped_pp_resource.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/thunk/ppb_compositor_layer_api.h"
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace ppapi {
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace proxy {
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class CompositorResource;
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class PPAPI_PROXY_EXPORT CompositorLayerResource
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : public PluginResource,
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      public thunk::PPB_CompositorLayer_API {
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Release callback for texture or image layer.
256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  typedef base::Callback<void(int32_t, uint32_t, bool)> ReleaseCallback;
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CompositorLayerResource(Connection connection,
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          PP_Instance instance,
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          const CompositorResource* compositor);
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const CompositorLayerData& data() const { return data_; }
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const ReleaseCallback& release_callback() const {
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return release_callback_;
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void ResetReleaseCallback() { release_callback_.Reset(); }
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void Invalidate() { compositor_ = NULL; }
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  enum LayerType {
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    TYPE_COLOR,
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    TYPE_TEXTURE,
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    TYPE_IMAGE,
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  };
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~CompositorLayerResource();
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Resource overrides:
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual thunk::PPB_CompositorLayer_API* AsPPB_CompositorLayer_API() OVERRIDE;
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // thunk::PPB_Compositor_API overrides:
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual int32_t SetColor(float red,
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                           float green,
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                           float blue,
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                           float alpha,
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                           const PP_Size* size) OVERRIDE;
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual int32_t SetTexture0_1(
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      PP_Resource context,
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      uint32_t texture,
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      const PP_Size* size,
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      const scoped_refptr<ppapi::TrackedCallback>& callback) OVERRIDE;
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual int32_t SetTexture(
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      PP_Resource context,
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      uint32_t target,
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      uint32_t texture,
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const PP_Size* size,
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const scoped_refptr<TrackedCallback>& callback) OVERRIDE;
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual int32_t SetImage(
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      PP_Resource image_data,
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const PP_Size* size,
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const scoped_refptr<TrackedCallback>& callback) OVERRIDE;
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual int32_t SetClipRect(const PP_Rect* rect) OVERRIDE;
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual int32_t SetTransform(const float matrix[16]) OVERRIDE;
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual int32_t SetOpacity(float opacity) OVERRIDE;
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual int32_t SetBlendMode(PP_BlendMode mode) OVERRIDE;
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual int32_t SetSourceRect(const PP_FloatRect* rect) OVERRIDE;
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual int32_t SetPremultipliedAlpha(PP_Bool premult) OVERRIDE;
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool SetType(LayerType type);
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int32_t CheckForSetTextureAndImage(
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      LayerType type,
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const scoped_refptr<TrackedCallback>& release_callback);
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The CompositorResource which own the layer. The layer is invalidated if
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // compositor_ is NULL.
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const CompositorResource* compositor_;
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Release callback for uncommitted texture or image. When CommitLayers() on
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // the compositor_ is called, the callback will be copied into a map in the
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // compositor_, and it will be reset to NULL.
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ReleaseCallback release_callback_;
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Size of texture or image. It is used to verify the rect arg of
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // SetSourceRect().
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PP_FloatSize source_size_;
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Layer data.
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CompositorLayerData data_;
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CompositorLayerResource);
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace proxy
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace ppapi
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif  // PPAPI_PROXY_COMPOSITOR_LAYER_RESOURCE_H_
106