1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-14 06:42:58 +08:00
lvgl/libs/nema_gfx/include/nema_blender.h
2024-11-18 10:49:33 +08:00

189 lines
8.0 KiB
C

/* 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__