/*
 * Copyright 2013, 2020 Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		John Scipione, jscipione@gmail.com
 *		Niels Sascha Reedijk, niels.reedijk@gmail.com
 *
 * Corresponds to:
 *		headers/os/interface/GraphicsDefs.h	hrev57597
 *		src/kits/interface/GraphicsDefs.cpp	hrev49977
 */


/*!
	\file GraphicsDefs.h
	\ingroup interface
	\ingroup libbe
	\brief Graphics-related functions and variables used by the Interface Kit.
*/


///// Pattern /////


/*!
	\name Patterns
*/


//! @{


/*!
	\struct pattern
	\ingroup interface
	\ingroup libbe
	\brief A pattern to use when drawing.

	\since BeOS R3
*/


/*!
	\fn bool operator==(const pattern &a, const pattern &b)
	\brief Comparison operator for two patterns

	\retval true The patterns match
	\retval false The patterns do not match

	\since Haiku R1
*/


/*!
	\fn bool operator!=(const pattern &a, const pattern &b)
	\brief Comparison operator for two patterns

	\retval true The patterns do not match
	\retval false The patterns match

	\since Haiku R1
*/


/*!
	\var B_SOLID_HIGH

	Draw using the view's high color.

	\since BeOS R3
*/


/*!
	\var B_MIXED_COLORS

	Draw a pattern of the view's high and low colors.

	\since BeOS R3
*/


/*!
	\var B_SOLID_LOW

	Draw using the view's low color.

	\since BeOS R3
*/

//! @}


///// struct rgb_color /////


/*!
	\name RGB Colors
*/


//! @{


/*!
	\struct rgb_color
	\ingroup interface
	\ingroup libbe
	\brief Structure representing a 32 bit RGBA color.

	\since BeOS R3
*/


/*!
	\var uint8 rgb_color::red
	\brief Red value for the color.

	\since BeOS R3
*/


/*!
	\var uint8 rgb_color::green
	\brief Green value for the color.

	\since BeOS R3
*/


/*!
	\var uint8 rgb_color::blue
	\brief Blue value for the color.

	\since BeOS R3
*/


/*!
	\var uint8 rgb_color::alpha
	\brief Alpha value for the color.

	\since BeOS R3
*/


/*!
	\fn rgb_color& rgb_color::set_to(uint8 r, uint8 g, uint8 b, uint8 a=255)
	\brief Helper method to set all values of the color.

	\param r Red value.
	\param g Green value.
	\param b Blue value.
	\param a Alpha value.

	\return A reference to this object.

	\since Haiku R1
*/


/*!
	\fn bool rgb_color::operator==(const rgb_color &other) const
	\brief Comparison operator.

	\param other The other color to compare to.

	\retval true The colors match.
	\retval false The colors are different.

	\since Haiku R1
*/


/*!
	\fn bool rgb_color::operator!=(const rgb_color &other) const
	\brief Comparison operator.

	\param other The other color to compare to.

	\retval true The colors are different.
	\retval false The colors match.

	\since Haiku R1
*/


/*!
	\fn rgb_color& rgb_color::operator=(const rgb_color &other)
	\brief Assign values from another color object.

	\param other The other color to copy.

	\return A reference to this object.

	\since Haiku R1
*/


/*!
	\fn int32 rgb_color::Brightness() const
	\brief Calculates a value representing the brightness of this color.

	This method calculates the perceptual brightness of a color.

	\return A value representing the brightness. (0-255)

	\since Haiku R1
*/

/*!
	\fn bool rgb_color::IsLight() const
	\brief Determines if the color is light.

	A color is considered 'light' if its Brightness() is > 127.

	\since Haiku R1
*/

/*!
	\fn bool rgb_color::IsDark() const
	\brief Determines if the color is dark.

	A color is considered 'dark' if its Brightness() is <= 127.

	\since Haiku R1
*/

/*!
	\fn static int32 rgb_color::Contrast(rgb_color colorA, rgb_color colorB)
	\brief Calculates the contrast between two colors.

	This method compares the Brightness of colorA and colorB and returns
	the Contrast that is between them.

	For example this can used to make sure a color combination is legible
	on a specifc background.

	\return A value representing the Contrast. (0-255)

	\since Haiku R1
*/

/*!
	\fn rgb_color make_color(uint8 red, uint8 green, uint8 blue, uint8 alpha=255)
	\brief Create a \a rgb_color from RGBA values.

	\param red The value for red.
	\param green The value for green.
	\param blue The value for blue.
	\param alpha The alpha value. Set to opaque by default.

	\return A new rgb_color set to the selected colors.

	\since Haiku R1
*/


/*!
	\fn rgb_color mix_color(rgb_color color1, rgb_color color2, uint8 amount)
	\brief Mix two colors without respect for their alpha values.

	\param color1 First color.
	\param color2 Second color.
	\param amount The relative weight of \a color1 to mix in.

	\return The newly-mixed \ref rgb_color.

	\since Haiku R1
*/


/*!
	\fn rgb_color blend_color(rgb_color color1, rgb_color color2, uint8 amount)
	\brief Mix two colors, respecting their alpha values.

	\param color1 First color.
	\param color2 Second color.
	\param amount The relative weight of \a color1 to mix in.

	\return The newly-mixed \ref rgb_color.

	\since Haiku R1
*/


/*!
	\fn rgb_color disable_color(rgb_color color, rgb_color background)
	\brief Calculate a color for a disabled look.

	\param color The color that it would be if the use of your color is \em not
		disabled.
	\param background The background on which will be drawn.

	\return A newly-mixed \ref rgb_color.

	\since Haiku R1
*/


/*!
	\var const rgb_color B_TRANSPARENT_COLOR
	\brief A transparent color.

	\since Haiku R1
*/


/*!
	\var const uint8 B_TRANSPARENT_MAGIC_CMAP8
	\brief Transparent color.

	\since Haiku R1
*/


/*!
	\var const uint16 B_TRANSPARENT_MAGIC_RGBA15
	\brief Transparent color.

	\since Haiku R1
*/


/*!
	\var const uint16 B_TRANSPARENT_MAGIC_RGBA15_BIG
	\brief Transparent color.

	\since Haiku R1
*/


/*!
	\var const uint32 B_TRANSPARENT_MAGIC_RGBA32
	\brief Transparent color.

	\since Haiku R1
*/


/*!
	\var const uint32 B_TRANSPARENT_MAGIC_RGBA32_BIG
	\brief Transparent color.

	\since Haiku R1
*/


/*!
	\var const uint8 B_TRANSPARENT_8_BIT
	\brief Transparent color.

	\since BeOS R3
*/


/*!
	\var const rgb_color B_TRANSPARENT_32_BIT
	\brief Transparent color.

	\since BeOS R3
*/


//! @}


///// Drawing modes /////


/*!
	\name Drawing Modes
*/


//! @{


/*!
	\enum source_alpha
	\ingroup interface

	Blending alpha mode constants.

	\since BeOS R3
*/


/*!
	\var source_alpha B_PIXEL_ALPHA

	Use the alpha value of each pixel when drawing a bitmap.

	\since BeOS R3
*/


/*!
	\var source_alpha B_CONSTANT_ALPHA

	Use the alpha channel of the view's high color.

	\since BeOS R3
*/


/*!
	\enum alpha_function
	\ingroup interface

	Blending alpha function constants.

	\since BeOS R3
*/


/*!
	\var alpha_function B_ALPHA_OVERLAY

	Used for drawing a image with transparency over an opaque background.

	\since BeOS R3
*/


/*!
	\var alpha_function B_ALPHA_COMPOSITE

	Used to composite two or more transparent images together offscreen to
	produce a new image drawn using \c B_ALPHA_OVERLAY mode.

	\since BeOS R3
*/


/*!
	\var alpha_function B_ALPHA_COMPOSITE_SOURCE_OVER

	Draws source over destination preserving transparency. Same as
	\c B_ALPHA_COMPOSITE.

	\image{inline} html B_ALPHA_COMPOSITE_SOURCE.png "Source"
	->
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION.png "Destination"
	=
	\image{inline} html B_ALPHA_COMPOSITE_SOURCE_OVER.png "Result"

	\since Haiku R1
*/


/*!
	\var alpha_function B_ALPHA_COMPOSITE_SOURCE_IN

	Draws source only where destination is not transparent.

	\image{inline} html B_ALPHA_COMPOSITE_SOURCE.png "Source"
	->
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION.png "Destination"
	=
	\image{inline} html B_ALPHA_COMPOSITE_SOURCE_IN.png "Result"

	\since Haiku R1
*/


/*!
	\var alpha_function B_ALPHA_COMPOSITE_SOURCE_OUT

	Draws source only where destination is transparent.

	\image{inline} html B_ALPHA_COMPOSITE_SOURCE.png "Source"
	->
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION.png "Destination"
	=
	\image{inline} html B_ALPHA_COMPOSITE_SOURCE_OUT.png "Result"

	\since Haiku R1
*/


/*!
	\var alpha_function B_ALPHA_COMPOSITE_SOURCE_ATOP

	Draws source only where destination is not transparent. Colors from both
	are used in the result.

	\image{inline} html B_ALPHA_COMPOSITE_SOURCE.png "Source"
	->
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION.png "Destination"
	=
	\image{inline} html B_ALPHA_COMPOSITE_SOURCE_ATOP.png "Result"

	\since Haiku R1
*/


/*!
	\var alpha_function B_ALPHA_COMPOSITE_DESTINATION_OVER

	Draws source where destination is transparent, making it appear as if it
	is drawn behind.

	\image{inline} html B_ALPHA_COMPOSITE_SOURCE.png "Source"
	->
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION.png "Destination"
	=
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION_OVER.png "Result"

	\since Haiku R1
*/


/*!
	\var alpha_function B_ALPHA_COMPOSITE_DESTINATION_IN

	Blends source alpha channel with destination.

	\image{inline} html B_ALPHA_COMPOSITE_SOURCE.png "Source"
	->
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION.png "Destination"
	=
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION_IN.png "Result"

	\since Haiku R1
*/


/*!
	\var alpha_function B_ALPHA_COMPOSITE_DESTINATION_OUT

	Blends inverse of source alpha channel with destination. Result appears as
	if source was cut out of destination.

	\image{inline} html B_ALPHA_COMPOSITE_SOURCE.png "Source"
	->
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION.png "Destination"
	=
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION_OUT.png "Result"

	\since Haiku R1
*/


/*!
	\var alpha_function B_ALPHA_COMPOSITE_DESTINATION_ATOP

	Draws source only where it is not transparent. Destination is blended on
	top of it. Colors from both are used in the result.

	\image{inline} html B_ALPHA_COMPOSITE_SOURCE.png "Source"
	->
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION.png "Destination"
	=
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION_ATOP.png "Result"

	\since Haiku R1
*/


/*!
	\var alpha_function B_ALPHA_COMPOSITE_XOR

	Result is transparent only where both source and destination are transparent
	or opaque.

	\image{inline} html B_ALPHA_COMPOSITE_SOURCE.png "Source"
	->
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION.png "Destination"
	=
	\image{inline} html B_ALPHA_COMPOSITE_XOR.png "Result"

	\since Haiku R1
*/


/*!
	\var alpha_function B_ALPHA_COMPOSITE_CLEAR

	Erases destination to full transparency, regardless of source alpha value.

	\image{inline} html B_ALPHA_COMPOSITE_SOURCE.png "Source"
	->
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION.png "Destination"
	=
	\image{inline} html B_ALPHA_COMPOSITE_CLEAR.png "Result"

	\since Haiku R1
*/


/*!
	\var alpha_function B_ALPHA_COMPOSITE_DIFFERENCE

	Subtracts both inputs in a way that always yields positive result.

	\image{inline} html B_ALPHA_COMPOSITE_SOURCE.png "Source"
	->
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION.png "Destination"
	=
	\image{inline} html B_ALPHA_COMPOSITE_DIFFERENCE.png "Result"

	\since Haiku R1
*/


/*!
	\var alpha_function B_ALPHA_COMPOSITE_LIGHTEN

	Retains lighter pixels of both inputs.

	\image{inline} html B_ALPHA_COMPOSITE_SOURCE.png "Source"
	->
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION.png "Destination"
	=
	\image{inline} html B_ALPHA_COMPOSITE_LIGHTEN.png "Result"

	\since Haiku R1
*/


/*!
	\var alpha_function B_ALPHA_COMPOSITE_DARKEN

	Retains darker pixels of both inputs.

	\image{inline} html B_ALPHA_COMPOSITE_SOURCE.png "Source"
	->
	\image{inline} html B_ALPHA_COMPOSITE_DESTINATION.png "Destination"
	=
	\image{inline} html B_ALPHA_COMPOSITE_DARKEN.png "Result"

	\since Haiku R1
*/


//! @}
