#ifndef GFX_IMAGE_PIXELBLEND_H__
#define GFX_IMAGE_PIXELBLEND_H__

#include "maxon/gfx_image_pixelformat.h"

namespace maxon
{

/// @addtogroup Graphics
/// @{

//----------------------------------------------------------------------------------------
/// This class allows to implement and use pixel blending methods.
/// Each pixel blending should has it's own implementation.
/// A enumeration of all available blending methods can be found under ImagePixelBlends registry.
//----------------------------------------------------------------------------------------
class ImagePixelBlendInterface : MAXON_INTERFACE_BASES(Object)
{
	MAXON_INTERFACE(ImagePixelBlendInterface, MAXON_REFERENCE_CONST, "net.maxon.image.interface.imagepixelblend");

public:
	//----------------------------------------------------------------------------------------
	/// @return												OK on success.
	//----------------------------------------------------------------------------------------
	MAXON_METHOD Result<void> BlendPixels(const ImageMutableBuffer& dst, const ImageConstBuffer& src) const;
};

// include autogenerated headerfile here
#include "gfx_image_pixelblend1.hxx"

MAXON_REGISTRY(ImagePixelBlend, ImagePixelBlends, "net.maxon.image.registry.imagepixelblends");

namespace ImagePixelBlends
{
	MAXON_DECLARATION(ImagePixelBlend, Normal, "net.maxon.image.imagepixelblend.normal");
	MAXON_DECLARATION(ImagePixelBlend, Darken, "net.maxon.image.imagepixelblend.darken");
	MAXON_DECLARATION(ImagePixelBlend, Lighten, "net.maxon.image.imagepixelblend.lighten");
	MAXON_DECLARATION(ImagePixelBlend, Multiply, "net.maxon.image.imagepixelblend.multiply");
	MAXON_DECLARATION(ImagePixelBlend, Screen, "net.maxon.image.imagepixelblend.screen");
	MAXON_DECLARATION(ImagePixelBlend, Lineardodge, "net.maxon.image.imagepixelblend.lineardodge");
	MAXON_DECLARATION(ImagePixelBlend, Add, "net.maxon.image.imagepixelblend.add");
	MAXON_DECLARATION(ImagePixelBlend, Dissolve, "net.maxon.image.imagepixelblend.dissolve");
	MAXON_DECLARATION(ImagePixelBlend, Difference, "net.maxon.image.imagepixelblend.difference");
	MAXON_DECLARATION(ImagePixelBlend, Passfolder, "net.maxon.image.imagepixelblend.passfolder");
	MAXON_DECLARATION(ImagePixelBlend, Hue, "net.maxon.image.imagepixelblend.hue");
	MAXON_DECLARATION(ImagePixelBlend, Saturation, "net.maxon.image.imagepixelblend.saturation");
	MAXON_DECLARATION(ImagePixelBlend, Color, "net.maxon.image.imagepixelblend.color");
	MAXON_DECLARATION(ImagePixelBlend, Luminance, "net.maxon.image.imagepixelblend.luminance");
	MAXON_DECLARATION(ImagePixelBlend, Overlay, "net.maxon.image.imagepixelblend.overlay");
	MAXON_DECLARATION(ImagePixelBlend, Hardlight, "net.maxon.image.imagepixelblend.hardlight");
	MAXON_DECLARATION(ImagePixelBlend, Softlight, "net.maxon.image.imagepixelblend.softlight");
	MAXON_DECLARATION(ImagePixelBlend, Colorburn, "net.maxon.image.imagepixelblend.colorburn");
	MAXON_DECLARATION(ImagePixelBlend, Colordodge, "net.maxon.image.imagepixelblend.colordodge");
	MAXON_DECLARATION(ImagePixelBlend, Exclusion, "net.maxon.image.imagepixelblend.exclusion");
	MAXON_DECLARATION(ImagePixelBlend, Stamp, "net.maxon.image.imagepixelblend.stamp");
	MAXON_DECLARATION(ImagePixelBlend, Linearburn, "net.maxon.image.imagepixelblend.linearburn");
	MAXON_DECLARATION(ImagePixelBlend, Pinlight, "net.maxon.image.imagepixelblend.pinlight");
	MAXON_DECLARATION(ImagePixelBlend, Hardmix, "net.maxon.image.imagepixelblend.hardmix");
}

// include autogenerated headerfile here
#include "gfx_image_pixelblend2.hxx"

/// @}

} // namespace maxon


#endif // GFX_IMAGE_PIXELBLEND_H__
