2024-11-15 14:56:38 +01:00
/* TSI 2023.xmo */
/*******************************************************************************
* Copyright ( c ) 2023 Think Silicon Single Member PC
*
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this header file and / or associated documentation files to use , copy ,
* modify , merge , publish , distribute , sublicense , and / or sell copies of the
* Materials , and to permit persons to whom the Materials are furnished to do
* so , subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Materials .
*
* MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
* NEMAGFX API . THE UNMODIFIED , NORMATIVE VERSIONS OF THINK - SILICON NEMAGFX
* SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT :
* https : //think-silicon.com/products/software/nemagfx-api
*
* 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
* Think Silicon Single Member PC 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 .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# ifndef NEMA_BLENDER_H__
# define NEMA_BLENDER_H__
# include "nema_sys_defs.h"
# include "nema_graphics.h"
# ifdef __cplusplus
extern " C " {
# endif
// Blending Factor Selector
//-----------------------------------------------------------------------------------------------------------------------
# define NEMA_BF_ZERO (0x0U) /**< 0 */
# define NEMA_BF_ONE (0x1U) /**< 1 */
# define NEMA_BF_SRCCOLOR (0x2U) /**< Sc */
# define NEMA_BF_INVSRCCOLOR (0x3U) /**< (1-Sc) */
# define NEMA_BF_SRCALPHA (0x4U) /**< Sa */
# define NEMA_BF_INVSRCALPHA (0x5U) /**< (1-Sa) */
# define NEMA_BF_DESTALPHA (0x6U) /**< Da */
# define NEMA_BF_INVDESTALPHA (0x7U) /**< (1-Da) */
# define NEMA_BF_DESTCOLOR (0x8U) /**< Dc */
# define NEMA_BF_INVDESTCOLOR (0x9U) /**< (1-Dc) */
# define NEMA_BF_CONSTCOLOR (0xaU) /**< Cc */
# define NEMA_BF_CONSTALPHA (0xbU) /**< Ca */
/* source factor destination factor */
# define NEMA_BL_SIMPLE ( (uint32_t)NEMA_BF_SRCALPHA | ((uint32_t)NEMA_BF_INVSRCALPHA <<8) ) /**< Sa * Sa + Da * (1 - Sa) */
# define NEMA_BL_CLEAR ( (uint32_t)NEMA_BF_ZERO /*| ((uint32_t)NEMA_BF_ZERO <<8)*/ ) /**< 0 */
# define NEMA_BL_SRC ( (uint32_t)NEMA_BF_ONE /*| ((uint32_t)NEMA_BF_ZERO <<8)*/ ) /**< Sa */
# define NEMA_BL_SRC_OVER ( (uint32_t)NEMA_BF_ONE | ((uint32_t)NEMA_BF_INVSRCALPHA <<8) ) /**< Sa + Da * (1 - Sa) */
# define NEMA_BL_DST_OVER ( (uint32_t)NEMA_BF_INVDESTALPHA | ((uint32_t)NEMA_BF_ONE <<8) ) /**< Sa * (1 - Da) + Da */
# define NEMA_BL_SRC_IN ( (uint32_t)NEMA_BF_DESTALPHA /*| ((uint32_t)NEMA_BF_ZERO <<8)*/ ) /**< Sa * Da */
# define NEMA_BL_DST_IN ( /*(uint32_t)NEMA_BF_ZERO |*/ ((uint32_t)NEMA_BF_SRCALPHA <<8) ) /**< Da * Sa */
# define NEMA_BL_SRC_OUT ( (uint32_t)NEMA_BF_INVDESTALPHA /*| ((uint32_t)NEMA_BF_ZERO <<8)*/ ) /**< Sa * (1 - Da) */
# define NEMA_BL_DST_OUT ( /*(uint32_t)NEMA_BF_ZERO |*/ ((uint32_t)NEMA_BF_INVSRCALPHA <<8) ) /**< Da * (1 - Sa) */
# define NEMA_BL_SRC_ATOP ( (uint32_t)NEMA_BF_DESTALPHA | ((uint32_t)NEMA_BF_INVSRCALPHA <<8) ) /**< Sa * Da + Da * (1 - Sa) */
# define NEMA_BL_DST_ATOP ( (uint32_t)NEMA_BF_INVDESTALPHA | ((uint32_t)NEMA_BF_SRCALPHA <<8) ) /**< Sa * (1 - Da) + Da * Sa */
# define NEMA_BL_ADD ( (uint32_t)NEMA_BF_ONE | ((uint32_t)NEMA_BF_ONE <<8) ) /**< Sa + Da */
# define NEMA_BL_XOR ( (uint32_t)NEMA_BF_INVDESTALPHA | ((uint32_t)NEMA_BF_INVSRCALPHA <<8) ) /**< Sa * (1 - Da) + Da * (1 - Sa) */
# define NEMA_BLOP_NONE (0U) /**< No extra blending operation */
# define NEMA_BLOP_RECOLOR (0x00100000U) /**< Cconst*Aconst + Csrc*(1-Aconst). Overrides MODULATE_RGB. On NemaP GPU, recolor is available only when HW Rop Blender is enabled */
# define NEMA_BLOP_LUT (0x00200000U) /**< src_tex as index, src2_tex as palette */
# define NEMA_BLOP_STENCIL_XY (0x00400000U) /**< Use TEX3 as mask */
# define NEMA_BLOP_STENCIL_TXTY (0x00800000U) /**< Use TEX3 as mask */
# define NEMA_BLOP_NO_USE_ROPBL (0x01000000U) /**< Don't use Rop Blender even if present */
# define NEMA_BLOP_DST_CKEY_NEG (0x02000000U) /**< Apply Inverse Destination Color Keying - draw only when dst color doesn't match colorkey*/
# define NEMA_BLOP_SRC_PREMULT (0x04000000U) /**< Premultiply Source Color with Source Alpha (cannot be used with NEMA_BLOP_MODULATE_RGB) */
# define NEMA_BLOP_MODULATE_A (0x08000000U) /**< Modulate by Constant Alpha value*/
# define NEMA_BLOP_FORCE_A (0x10000000U) /**< Force Constant Alpha value */
# define NEMA_BLOP_MODULATE_RGB (0x20000000U) /**< Modulate by Constant Color (RGB) values */
# define NEMA_BLOP_SRC_CKEY (0x40000000U) /**< Apply Source Color Keying - draw only when src color doesn't match colorkey */
# define NEMA_BLOP_DST_CKEY (0x80000000U) /**< Apply Destination Color Keying - draw only when dst color matches colorkey */
# define NEMA_BLOP_MASK (0xfff00000U)
/** \brief Return blending mode given source and destination blending factors and additional blending operations
*
* \ param src Source Blending Factor
* \ param dst Destination Blending Factor
* \ param ops Additional Blending Operations
* \ return Final Blending Mode
*
*/
static inline uint32_t nema_blending_mode ( uint32_t src_bf , uint32_t dst_bf , uint32_t blops ) {
return ( ( src_bf ) | ( dst_bf < < 8 ) | ( blops & NEMA_BLOP_MASK ) ) ;
}
/** \brief Set blending mode
*
* \ param blending_mode Blending mode to be set
* \ param dst_tex Destination Texture
* \ param fg_tex Foreground ( source ) Texture
* \ param bg_tex Background ( source2 ) Texture
*
*/
void nema_set_blend ( uint32_t blending_mode , nema_tex_t dst_tex , nema_tex_t fg_tex , nema_tex_t bg_tex ) ;
/** \brief Set blending mode for filling
*
* \ param blending_mode Blending mode to be set
*
*/
static inline void nema_set_blend_fill ( uint32_t blending_mode ) {
nema_set_blend ( blending_mode , NEMA_TEX0 , NEMA_NOTEX , NEMA_NOTEX ) ;
}
/** \brief Set blending mode for filling with composing
*
* \ param blending_mode Blending mode to be set
*
*/
static inline void nema_set_blend_fill_compose ( uint32_t blending_mode ) {
nema_set_blend ( blending_mode , NEMA_TEX0 , NEMA_NOTEX , NEMA_TEX2 ) ;
}
/** \brief Set blending mode for blitting
*
* \ param blending_mode Blending mode to be set
*
*/
static inline void nema_set_blend_blit ( uint32_t blending_mode ) {
nema_set_blend ( blending_mode , NEMA_TEX0 , NEMA_TEX1 , NEMA_NOTEX ) ;
}
/** \brief Set blending mode for blitting with composing
*
* \ param blending_mode Blending mode to be set
*
*/
static inline void nema_set_blend_blit_compose ( uint32_t blending_mode ) {
nema_set_blend ( blending_mode , NEMA_TEX0 , NEMA_TEX1 , NEMA_TEX2 ) ;
}
/** \brief Set constant color
*
* \ param rgba RGBA color
* \ see nema_rgba ( )
*
*/
void nema_set_const_color ( uint32_t rgba ) ;
/** \brief Set recolor color. Overrides constant color
*
* \ param rgba RGBA color
* \ see nema_rgba ( ) , nema_set_const_color ( )
*
*/
void nema_set_recolor_color ( uint32_t rgba ) ;
/** \brief Set source color key
*
* \ param rgba RGBA color key
* \ see nema_rgba ( )
*
*/
void nema_set_src_color_key ( uint32_t rgba ) ;
/** \brief Set destination color key
*
* \ param rgba RGBA color key
* \ see nema_rgba ( )
*
*/
void nema_set_dst_color_key ( uint32_t rgba ) ;
/** \brief Enable/disable ovedraw debugging. Disables gradient and texture, forces blending mode to NEMA_BL_ADD
*
* \ param enable Enables overdraw debugging if non - zero
*
*/
void nema_debug_overdraws ( uint32_t enable ) ;
# ifdef __cplusplus
}
# endif
# endif // NEMA_BLENDER_H__