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_CPP_COMPOSITOR_H_
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define PPAPI_CPP_COMPOSITOR_H_
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/c/ppb_compositor.h"
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/cpp/completion_callback.h"
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/cpp/compositor_layer.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ppapi/cpp/resource.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)/// @file
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)/// This file defines the API to create a compositor in the browser.
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace pp {
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)/// The <code>Compositor</code> interface is used for setting
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)/// <code>CompositorLayer</code> layers to the Chromium compositor for
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)/// compositing. This allows a plugin to combine different sources of visual
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)/// data efficiently, such as <code>ImageData</code> images and OpenGL textures.
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)/// See also <code>CompositorLayer</code> for more information.
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class Compositor : public Resource {
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// Default constructor for creating an is_null()
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// <code>Compositor</code> object.
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  Compositor();
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// A constructor for creating and initializing a compositor.
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ///
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// On failure, the object will be is_null().
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  explicit Compositor(const InstanceHandle& instance);
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// The copy constructor for <code>Compositor</code>.
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ///
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// @param[in] other A reference to a <code>Compositor</code>.
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  Compositor(const Compositor& other);
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// Constructs a <code>Compositor</code> from a <code>Resource</code>.
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ///
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// @param[in] resource A <code>PPB_Compositor</code> resource.
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  explicit Compositor(const Resource& resource);
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// A constructor used when you have received a <code>PP_Resource</code> as a
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// return value that has had 1 ref added on behalf of the caller.
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ///
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// @param[in] resource A <code>PPB_Compositor</code> resource.
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  Compositor(PassRef, PP_Resource resource);
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// Destructor.
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ~Compositor();
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// Creates a new <code>CompositorLayer</code> and adds it to the end of the
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// layer stack. A <code>CompositorLayer</code> containing the layer is
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// returned. It is uninitialized, <code>SetColor()</code>,
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// <code>SetTexture</code> or <code>SetImage</code> should be used to
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// initialize it. The layer will appear above other pre-existing layers.
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// If <code>ResetLayers</code> is called or the <code>PPB_Compositor</code>
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// is released, the returned layer will be invalidated, and any further calls
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// on the layer will return <code>PP_ERROR_BADRESOURCE</code>.
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ///
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// @return A <code>CompositorLayer</code> containing the compositor layer
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// resource.
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CompositorLayer AddLayer();
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// Commits layers added by <code>AddLayer()</code> to the chromium
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// compositor.
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ///
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// @param[in] cc A <code>CompletionCallback</code> to be called when
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// layers have been represented on screen.
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ///
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// @return An int32_t containing a result code from <code>pp_errors.h</code>.
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int32_t CommitLayers(const CompletionCallback& cc);
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// Resets layers added by <code>AddLayer()</code>
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ///
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// @return An int32_t containing a result code from <code>pp_errors.h</code>.
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int32_t ResetLayers();
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// Checks whether a <code>Resource</code> is a compositor, to test whether
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// it is appropriate for use with the <code>Compositor</code> constructor.
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ///
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// @param[in] resource A <code>Resource</code> to test.
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ///
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  /// @return True if <code>resource</code> is a compositor.
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  static bool IsCompositor(const Resource& resource);
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace pp
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif  // PPAPI_CPP_COMPOSITOR_H_
91