/* Generated by wayland-scanner 1.13.0 */

#ifndef ALPHA_COMPOSITING_UNSTABLE_V1_CLIENT_PROTOCOL_H
#define ALPHA_COMPOSITING_UNSTABLE_V1_CLIENT_PROTOCOL_H

#include <stdint.h>
#include <stddef.h>
#include "wayland-client.h"

#ifdef  __cplusplus
extern "C" {
#endif

/**
 * @page page_alpha_compositing_unstable_v1 The alpha_compositing_unstable_v1 protocol
 * Protocol for more advanced compositing and blending
 *
 * @section page_desc_alpha_compositing_unstable_v1 Description
 *
 * This protocol specifies a set of interfaces used to control the alpha
 * compositing and blending of contents.
 *
 * Warning! The protocol described in this file is experimental and backward
 * incompatible changes may be made. Backward compatible changes may be added
 * together with the corresponding interface version bump. Backward
 * incompatible changes are done by bumping the version number in the protocol
 * and interface names and resetting the interface version. Once the protocol
 * is to be declared stable, the 'z' prefix and the version number in the
 * protocol and interface names are removed and the interface version number is
 * reset.
 *
 * @section page_ifaces_alpha_compositing_unstable_v1 Interfaces
 * - @subpage page_iface_zcr_alpha_compositing_v1 - alpha_compositing
 * - @subpage page_iface_zcr_blending_v1 - blending interface to a wl_surface
 * @section page_copyright_alpha_compositing_unstable_v1 Copyright
 * <pre>
 *
 * Copyright 2016 The Chromium Authors.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 * </pre>
 */
struct wl_surface;
struct zcr_alpha_compositing_v1;
struct zcr_blending_v1;

/**
 * @page page_iface_zcr_alpha_compositing_v1 zcr_alpha_compositing_v1
 * @section page_iface_zcr_alpha_compositing_v1_desc Description
 *
 * The global interface exposing compositing and blending capabilities is
 * used to instantiate an interface extension for a wl_surface object.
 * This extended interface will then allow the client to specify the
 * blending equation and alpha value used for compositing the wl_surface.
 * @section page_iface_zcr_alpha_compositing_v1_api API
 * See @ref iface_zcr_alpha_compositing_v1.
 */
/**
 * @defgroup iface_zcr_alpha_compositing_v1 The zcr_alpha_compositing_v1 interface
 *
 * The global interface exposing compositing and blending capabilities is
 * used to instantiate an interface extension for a wl_surface object.
 * This extended interface will then allow the client to specify the
 * blending equation and alpha value used for compositing the wl_surface.
 */
extern const struct wl_interface zcr_alpha_compositing_v1_interface;
/**
 * @page page_iface_zcr_blending_v1 zcr_blending_v1
 * @section page_iface_zcr_blending_v1_desc Description
 *
 * An additional interface to a wl_surface object, which allows the
 * client to specify the blending equation used for compositing and
 * an alpha value applied to the whole surface.
 *
 * If the wl_surface associated with the bledning object is destroyed,
 * the blending object becomes inert.
 *
 * If the blending object is destroyed, the blending state is removed
 * from the wl_surface. The change will be applied on the next
 * wl_surface.commit.
 * @section page_iface_zcr_blending_v1_api API
 * See @ref iface_zcr_blending_v1.
 */
/**
 * @defgroup iface_zcr_blending_v1 The zcr_blending_v1 interface
 *
 * An additional interface to a wl_surface object, which allows the
 * client to specify the blending equation used for compositing and
 * an alpha value applied to the whole surface.
 *
 * If the wl_surface associated with the bledning object is destroyed,
 * the blending object becomes inert.
 *
 * If the blending object is destroyed, the blending state is removed
 * from the wl_surface. The change will be applied on the next
 * wl_surface.commit.
 */
extern const struct wl_interface zcr_blending_v1_interface;

#ifndef ZCR_ALPHA_COMPOSITING_V1_ERROR_ENUM
#define ZCR_ALPHA_COMPOSITING_V1_ERROR_ENUM
enum zcr_alpha_compositing_v1_error {
	/**
	 * the surface already has a blending object associated
	 */
	ZCR_ALPHA_COMPOSITING_V1_ERROR_BLENDING_EXISTS = 0,
};
#endif /* ZCR_ALPHA_COMPOSITING_V1_ERROR_ENUM */

#define ZCR_ALPHA_COMPOSITING_V1_DESTROY 0
#define ZCR_ALPHA_COMPOSITING_V1_GET_BLENDING 1


/**
 * @ingroup iface_zcr_alpha_compositing_v1
 */
#define ZCR_ALPHA_COMPOSITING_V1_DESTROY_SINCE_VERSION 1
/**
 * @ingroup iface_zcr_alpha_compositing_v1
 */
#define ZCR_ALPHA_COMPOSITING_V1_GET_BLENDING_SINCE_VERSION 1

/** @ingroup iface_zcr_alpha_compositing_v1 */
static inline void
zcr_alpha_compositing_v1_set_user_data(struct zcr_alpha_compositing_v1 *zcr_alpha_compositing_v1, void *user_data)
{
	wl_proxy_set_user_data((struct wl_proxy *) zcr_alpha_compositing_v1, user_data);
}

/** @ingroup iface_zcr_alpha_compositing_v1 */
static inline void *
zcr_alpha_compositing_v1_get_user_data(struct zcr_alpha_compositing_v1 *zcr_alpha_compositing_v1)
{
	return wl_proxy_get_user_data((struct wl_proxy *) zcr_alpha_compositing_v1);
}

static inline uint32_t
zcr_alpha_compositing_v1_get_version(struct zcr_alpha_compositing_v1 *zcr_alpha_compositing_v1)
{
	return wl_proxy_get_version((struct wl_proxy *) zcr_alpha_compositing_v1);
}

/**
 * @ingroup iface_zcr_alpha_compositing_v1
 *
 * Informs the server that the client will not be using this
 * protocol object anymore. This does not affect any other objects,
 * blending objects included.
 */
static inline void
zcr_alpha_compositing_v1_destroy(struct zcr_alpha_compositing_v1 *zcr_alpha_compositing_v1)
{
	wl_proxy_marshal((struct wl_proxy *) zcr_alpha_compositing_v1,
			 ZCR_ALPHA_COMPOSITING_V1_DESTROY);

	wl_proxy_destroy((struct wl_proxy *) zcr_alpha_compositing_v1);
}

/**
 * @ingroup iface_zcr_alpha_compositing_v1
 *
 * Instantiate an interface extension for the given wl_surface to
 * provide surface blending. If the given wl_surface already has
 * a blending object associated, the blending_exists protocol error
 * is raised.
 */
static inline struct zcr_blending_v1 *
zcr_alpha_compositing_v1_get_blending(struct zcr_alpha_compositing_v1 *zcr_alpha_compositing_v1, struct wl_surface *surface)
{
	struct wl_proxy *id;

	id = wl_proxy_marshal_constructor((struct wl_proxy *) zcr_alpha_compositing_v1,
			 ZCR_ALPHA_COMPOSITING_V1_GET_BLENDING, &zcr_blending_v1_interface, NULL, surface);

	return (struct zcr_blending_v1 *) id;
}

#ifndef ZCR_BLENDING_V1_BLENDING_EQUATION_ENUM
#define ZCR_BLENDING_V1_BLENDING_EQUATION_ENUM
/**
 * @ingroup iface_zcr_blending_v1
 * different blending equations for compositing
 *
 * Blending equations that can be used when compositing a surface.
 */
enum zcr_blending_v1_blending_equation {
	/**
	 * no blending
	 */
	ZCR_BLENDING_V1_BLENDING_EQUATION_NONE = 0,
	/**
	 * one / one_minus_src_alpha
	 */
	ZCR_BLENDING_V1_BLENDING_EQUATION_PREMULT = 1,
	/**
	 * src_alpha / one_minus_src_alpha
	 */
	ZCR_BLENDING_V1_BLENDING_EQUATION_COVERAGE = 2,
};
#endif /* ZCR_BLENDING_V1_BLENDING_EQUATION_ENUM */

#define ZCR_BLENDING_V1_DESTROY 0
#define ZCR_BLENDING_V1_SET_BLENDING 1
#define ZCR_BLENDING_V1_SET_ALPHA 2


/**
 * @ingroup iface_zcr_blending_v1
 */
#define ZCR_BLENDING_V1_DESTROY_SINCE_VERSION 1
/**
 * @ingroup iface_zcr_blending_v1
 */
#define ZCR_BLENDING_V1_SET_BLENDING_SINCE_VERSION 1
/**
 * @ingroup iface_zcr_blending_v1
 */
#define ZCR_BLENDING_V1_SET_ALPHA_SINCE_VERSION 1

/** @ingroup iface_zcr_blending_v1 */
static inline void
zcr_blending_v1_set_user_data(struct zcr_blending_v1 *zcr_blending_v1, void *user_data)
{
	wl_proxy_set_user_data((struct wl_proxy *) zcr_blending_v1, user_data);
}

/** @ingroup iface_zcr_blending_v1 */
static inline void *
zcr_blending_v1_get_user_data(struct zcr_blending_v1 *zcr_blending_v1)
{
	return wl_proxy_get_user_data((struct wl_proxy *) zcr_blending_v1);
}

static inline uint32_t
zcr_blending_v1_get_version(struct zcr_blending_v1 *zcr_blending_v1)
{
	return wl_proxy_get_version((struct wl_proxy *) zcr_blending_v1);
}

/**
 * @ingroup iface_zcr_blending_v1
 *
 * The associated wl_surface's blending state is removed.
 * The change is applied on the next wl_surface.commit.
 */
static inline void
zcr_blending_v1_destroy(struct zcr_blending_v1 *zcr_blending_v1)
{
	wl_proxy_marshal((struct wl_proxy *) zcr_blending_v1,
			 ZCR_BLENDING_V1_DESTROY);

	wl_proxy_destroy((struct wl_proxy *) zcr_blending_v1);
}

/**
 * @ingroup iface_zcr_blending_v1
 *
 * Set the blending equation for compositing the wl_surface.
 * See wp_alpha_compositing for the description.
 *
 * The blending equation state is double-buffered state,
 * and will be applied on the next wl_surface.commit.
 */
static inline void
zcr_blending_v1_set_blending(struct zcr_blending_v1 *zcr_blending_v1, uint32_t equation)
{
	wl_proxy_marshal((struct wl_proxy *) zcr_blending_v1,
			 ZCR_BLENDING_V1_SET_BLENDING, equation);
}

/**
 * @ingroup iface_zcr_blending_v1
 *
 * Set the alpha value applied to the whole surface for compositing.
 * See wp_alpha_compositing for the description.
 *
 * The alpha value state is double-buffered state,
 * and will be applied on the next wl_surface.commit.
 */
static inline void
zcr_blending_v1_set_alpha(struct zcr_blending_v1 *zcr_blending_v1, wl_fixed_t value)
{
	wl_proxy_marshal((struct wl_proxy *) zcr_blending_v1,
			 ZCR_BLENDING_V1_SET_ALPHA, value);
}

#ifdef  __cplusplus
}
#endif

#endif
