From 30193c10354759c7be36ff1a960bbcb0098adda9 Mon Sep 17 00:00:00 2001 From: Liam <30486941+liamHowatt@users.noreply.github.com> Date: Sun, 13 Oct 2024 08:13:56 +0200 Subject: [PATCH] feat(draw): add NemaGFX rendering backend (#7002) Co-authored-by: Ioannis Markopoulos --- docs/integration/chip/stm32.rst | 4 + docs/overview/renderers/index.rst | 1 + docs/overview/renderers/nema_gfx.rst | 73 ++ libs/nema_gfx/include/build_version.h | 1 + libs/nema_gfx/include/nema_blender.h | 178 +++ libs/nema_gfx/include/nema_cmdlist.h | 208 ++++ libs/nema_gfx/include/nema_core.h | 41 + libs/nema_gfx/include/nema_easing.h | 369 ++++++ libs/nema_gfx/include/nema_error.h | 69 ++ libs/nema_gfx/include/nema_font.h | 184 +++ libs/nema_gfx/include/nema_graphics.h | 1017 +++++++++++++++++ libs/nema_gfx/include/nema_hal.h | 218 ++++ libs/nema_gfx/include/nema_interpolators.h | 122 ++ libs/nema_gfx/include/nema_math.h | 278 +++++ libs/nema_gfx/include/nema_matrix3x3.h | 230 ++++ libs/nema_gfx/include/nema_matrix4x4.h | 232 ++++ libs/nema_gfx/include/nema_provisional.h | 124 ++ libs/nema_gfx/include/nema_raster.h | 107 ++ libs/nema_gfx/include/nema_sys_defs.h | 58 + libs/nema_gfx/include/nema_transitions.h | 210 ++++ libs/nema_gfx/include/nema_utils.h | 50 + libs/nema_gfx/include/nema_vg.h | 218 ++++ libs/nema_gfx/include/nema_vg_context.h | 187 +++ libs/nema_gfx/include/nema_vg_font.h | 184 +++ libs/nema_gfx/include/nema_vg_paint.h | 241 ++++ libs/nema_gfx/include/nema_vg_path.h | 143 +++ libs/nema_gfx/include/nema_vg_tsvg.h | 56 + libs/nema_gfx/include/nema_vg_version.h | 55 + libs/nema_gfx/include/tsi_malloc.h | 64 ++ .../gcc/libnemagfx-float-abi-hard-wc16.a | Bin 0 -> 304526 bytes .../gcc/libnemagfx-float-abi-hard.a | Bin 0 -> 304526 bytes .../lib/core/cortex_m33/gcc/libnemagfx-wc16.a | Bin 0 -> 306054 bytes .../lib/core/cortex_m33/gcc/libnemagfx.a | Bin 0 -> 306054 bytes lv_conf_template.h | 16 + src/draw/nema_gfx/lv_draw_nema_gfx.c | 382 +++++++ src/draw/nema_gfx/lv_draw_nema_gfx.h | 122 ++ src/draw/nema_gfx/lv_draw_nema_gfx_arc.c | 92 ++ src/draw/nema_gfx/lv_draw_nema_gfx_border.c | 223 ++++ src/draw/nema_gfx/lv_draw_nema_gfx_fill.c | 146 +++ src/draw/nema_gfx/lv_draw_nema_gfx_hal.c | 263 +++++ src/draw/nema_gfx/lv_draw_nema_gfx_img.c | 223 ++++ src/draw/nema_gfx/lv_draw_nema_gfx_label.c | 608 ++++++++++ src/draw/nema_gfx/lv_draw_nema_gfx_layer.c | 57 + src/draw/nema_gfx/lv_draw_nema_gfx_line.c | 93 ++ src/draw/nema_gfx/lv_draw_nema_gfx_triangle.c | 168 +++ src/draw/nema_gfx/lv_draw_nema_gfx_utils.c | 112 ++ src/draw/nema_gfx/lv_draw_nema_gfx_utils.h | 125 ++ src/lv_conf_internal.h | 46 + src/lv_init.c | 7 + 49 files changed, 7605 insertions(+) create mode 100644 docs/overview/renderers/nema_gfx.rst create mode 100644 libs/nema_gfx/include/build_version.h create mode 100644 libs/nema_gfx/include/nema_blender.h create mode 100644 libs/nema_gfx/include/nema_cmdlist.h create mode 100644 libs/nema_gfx/include/nema_core.h create mode 100644 libs/nema_gfx/include/nema_easing.h create mode 100644 libs/nema_gfx/include/nema_error.h create mode 100644 libs/nema_gfx/include/nema_font.h create mode 100644 libs/nema_gfx/include/nema_graphics.h create mode 100644 libs/nema_gfx/include/nema_hal.h create mode 100644 libs/nema_gfx/include/nema_interpolators.h create mode 100644 libs/nema_gfx/include/nema_math.h create mode 100644 libs/nema_gfx/include/nema_matrix3x3.h create mode 100644 libs/nema_gfx/include/nema_matrix4x4.h create mode 100644 libs/nema_gfx/include/nema_provisional.h create mode 100644 libs/nema_gfx/include/nema_raster.h create mode 100644 libs/nema_gfx/include/nema_sys_defs.h create mode 100644 libs/nema_gfx/include/nema_transitions.h create mode 100644 libs/nema_gfx/include/nema_utils.h create mode 100644 libs/nema_gfx/include/nema_vg.h create mode 100644 libs/nema_gfx/include/nema_vg_context.h create mode 100644 libs/nema_gfx/include/nema_vg_font.h create mode 100644 libs/nema_gfx/include/nema_vg_paint.h create mode 100644 libs/nema_gfx/include/nema_vg_path.h create mode 100644 libs/nema_gfx/include/nema_vg_tsvg.h create mode 100644 libs/nema_gfx/include/nema_vg_version.h create mode 100644 libs/nema_gfx/include/tsi_malloc.h create mode 100644 libs/nema_gfx/lib/core/cortex_m33/gcc/libnemagfx-float-abi-hard-wc16.a create mode 100644 libs/nema_gfx/lib/core/cortex_m33/gcc/libnemagfx-float-abi-hard.a create mode 100644 libs/nema_gfx/lib/core/cortex_m33/gcc/libnemagfx-wc16.a create mode 100644 libs/nema_gfx/lib/core/cortex_m33/gcc/libnemagfx.a create mode 100644 src/draw/nema_gfx/lv_draw_nema_gfx.c create mode 100644 src/draw/nema_gfx/lv_draw_nema_gfx.h create mode 100644 src/draw/nema_gfx/lv_draw_nema_gfx_arc.c create mode 100644 src/draw/nema_gfx/lv_draw_nema_gfx_border.c create mode 100644 src/draw/nema_gfx/lv_draw_nema_gfx_fill.c create mode 100644 src/draw/nema_gfx/lv_draw_nema_gfx_hal.c create mode 100644 src/draw/nema_gfx/lv_draw_nema_gfx_img.c create mode 100644 src/draw/nema_gfx/lv_draw_nema_gfx_label.c create mode 100644 src/draw/nema_gfx/lv_draw_nema_gfx_layer.c create mode 100644 src/draw/nema_gfx/lv_draw_nema_gfx_line.c create mode 100644 src/draw/nema_gfx/lv_draw_nema_gfx_triangle.c create mode 100644 src/draw/nema_gfx/lv_draw_nema_gfx_utils.c create mode 100644 src/draw/nema_gfx/lv_draw_nema_gfx_utils.h diff --git a/docs/integration/chip/stm32.rst b/docs/integration/chip/stm32.rst index 2e9c5fbeb..4e7ce7fa5 100644 --- a/docs/integration/chip/stm32.rst +++ b/docs/integration/chip/stm32.rst @@ -270,6 +270,8 @@ A minimal example using STM32CubeIDE, HAL, and CMSISv1 (FreeRTOS). lv_display_flush_ready(display); } +.. _dma2d: + DMA2D Support ------------- @@ -289,3 +291,5 @@ instead of "busywait" while waiting for a DMA2D transfer to complete. If ``LV_USE_DRAW_DMA2D_INTERRUPT`` is enabled then you are required to call :cpp:expr:`lv_draw_dma2d_transfer_complete_interrupt_handler` whenever the DMA2D "transfer complete" global interrupt is received. + +If your STM device has a Nema GPU, you can use the :ref:`Nema GFX renderer ` instead. diff --git a/docs/overview/renderers/index.rst b/docs/overview/renderers/index.rst index 7232e4e95..a68dedf90 100644 --- a/docs/overview/renderers/index.rst +++ b/docs/overview/renderers/index.rst @@ -12,3 +12,4 @@ Renderers and GPUs stm32_dma2d vglite vg_lite + nema_gfx diff --git a/docs/overview/renderers/nema_gfx.rst b/docs/overview/renderers/nema_gfx.rst new file mode 100644 index 000000000..913c3cac3 --- /dev/null +++ b/docs/overview/renderers/nema_gfx.rst @@ -0,0 +1,73 @@ +.. _stm32_nema_gfx: + +=================================== +NemaGFX Acceleration (AKA NeoChrom) +=================================== + +Some of the more powerful STM32 MCUs such as the +STM32U5 feature a 2.5D GPU which can natively draw most +LVGL primitives. + +Get Started with the Riverdi STM32U5 5-inch Display +*************************************************** + +`lv_port_riverdi_stm32u5 `__ +is a ready-to-use port for the Riverdi STM32 5.0" Embedded Display +(STM32U599NJH6Q or STM32U5A9NJH6Q) which has Nema enabled. +Follow the instructions in the readme to get started. + +Usage and Configuration +*********************** + +Enable the renderer by setting :c:macro:`LV_USE_NEMA_GFX` to ``1`` in +lv_conf.h. If using :c:macro:`LV_USE_NEMA_VG`, +set :c:macro:`LV_NEMA_GFX_MAX_RESX` and :c:macro:`LV_NEMA_GFX_MAX_RESY` +to the size of the display you will be using so that enough static +memory will be reserved for VG. Without VG, more task types will be +performed by the software renderer. + +"libs/nema_gfx" contains pre-compiled binaries for the Nema GPU +drivers. In `lv_port_riverdi_stm32u5 `__ +the project is already configured to link the binaries when building. +With a different STM32CubeIDE project, you can configure the libraries to be linked +by right-clicking the project in the "Project Explorer" sidebar, clicking +"Properties", navigating to "C/C++ Build", "Settings", "MCU G++ Linker", and then +"Libraries". Add an entry under "Libraries (-l)" that is "nemagfx-float-abi-hard". +Add an entry under "Library search path (-L)" which is a path to +"libs/nema_gfx/lib/core/cortex_m33/gcc" e.g. +"${workspace_loc:/${ProjName}/Middlewares/LVGL/lvgl/libs/nema_gfx/lib/core/cortex_m33/gcc}". +You will also want to add the "libs/nema_gfx/include" directory to your include +search paths. Under "MCU GCC Compiler", "Include paths", add an entry to "Include paths (-I)" +which is a path to "libs/nema_gfx/include" e.g. +"${workspace_loc:/${ProjName}/Middlewares/LVGL/lvgl/libs/nema_gfx/include}". +Click "Apply and Close". + +32 and 16 bit :c:macro:`LV_COLOR_DEPTH` is supported. + +At the time of writing, :c:macro:`LV_USE_OS` support is experimental +and not yet working in +`lv_port_riverdi_stm32u5 `__ + +"src/draw/nema_gfx/lv_draw_nema_gfx_hal.c" implements the HAL functionality +required by Nema to allocate memory and lock resources (in this implementation, +no locking is done). It may conflict with existing definitions +if you have an existing Nema HAL implementation. You may +simply be able to remove yours. + +DMA2D +***** + +The Nema renderer uses DMA2D to flush in parallel with rendering in +`lv_port_riverdi_stm32u5 `__. + +If your STM does not have the Nema GPU, it may still support +DMA2D. DMA2D is a simple peripheral which can draw fills +and images independently of the CPU. +See the LVGL :ref:`DMA2D support `. + +API +*** + +:ref:`lv_draw_nema_gfx_h` + +:ref:`lv_draw_nema_gfx_utils_h` diff --git a/libs/nema_gfx/include/build_version.h b/libs/nema_gfx/include/build_version.h new file mode 100644 index 000000000..401fd6ec6 --- /dev/null +++ b/libs/nema_gfx/include/build_version.h @@ -0,0 +1 @@ +// Build Hash: f02602a9bc58957911babb1a647e6b0019983cb7 diff --git a/libs/nema_gfx/include/nema_blender.h b/libs/nema_gfx/include/nema_blender.h new file mode 100644 index 000000000..49377af9e --- /dev/null +++ b/libs/nema_gfx/include/nema_blender.h @@ -0,0 +1,178 @@ +/* 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_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 (0xffe00000U) + +/** \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 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__ diff --git a/libs/nema_gfx/include/nema_cmdlist.h b/libs/nema_gfx/include/nema_cmdlist.h new file mode 100644 index 000000000..1f13adef3 --- /dev/null +++ b/libs/nema_gfx/include/nema_cmdlist.h @@ -0,0 +1,208 @@ +/* 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_CMDLIST_H__ +#define NEMA_CMDLIST_H__ + +#include "nema_sys_defs.h" +#include "nema_hal.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define CL_NOP 0x010000U +#define CL_PUSH 0x020000U +#define CL_RETURN 0x040000U +#define CL_ABORT 0x080000U + +#define CL_BATCH_SHIFT 12 +#define CL_BATCH_LOOP 0x8000 + +#define SUBMISSION_ID_MASK 0xffffff + +#define CL_ALIGNMENT_MASK (0x00000007U) // CL buffer must be 8 byte aligned + +//--------------------------------------------------------------------------- +typedef struct nema_cmdlist_t_ { + nema_buffer_t bo; + int size; /**< Number of entries in the command list */ + int offset; /**< Points to the next address to write */ + uint32_t flags; /**< Flags */ + int32_t submission_id; + struct nema_cmdlist_t_ *next; /**< Points to next command list */ + struct nema_cmdlist_t_ *root; /**< Points to the head of the list */ +} nema_cmdlist_t; + +/** \brief Create a new Command List into a preallocated space + * + * \param addr_virt Command List's address (preallocated) + * \param size_bytes Command List's size in bytes + * \return The instance of the new Command List + * + */ +nema_cmdlist_t nema_cl_create_prealloc(nema_buffer_t *bo); + +/** \brief Create a new, non expandable Command List of specific size + * + * \param size_bytes Command List's size in bytes + * \return The instance of the new Command List + * + */ +nema_cmdlist_t nema_cl_create_sized(int size_bytes); + +/** \brief Create a new expandable Command List + * + * \return The instance of the new Command List + * + */ +nema_cmdlist_t nema_cl_create(void); + +/** \brief Destroy/Free a Command List + * + * \param cl Pointer to the Command List + * + */ +void nema_cl_destroy(nema_cmdlist_t *cl); + +/** \brief Reset position of next command to be written to the beginning. Doesn't clear the List's contents. + * + * \param cl Pointer to the Command List + * + */ +void nema_cl_rewind(nema_cmdlist_t *cl); + +/** \brief Define in which Command List each subsequent commands are going to be inserted. + * + * \param cl Pointer to the Command List + * + */ +void nema_cl_bind(nema_cmdlist_t *cl); + +/** \brief Define in which Command List each subsequent commands are going to be inserted. + * Bind this command list as Circular. It never gets full, it never expands, + * it may get implicitly submitted, it cannot be reused. No other CL should be submitted + * while a circular CL is bound + * + * \param cl Pointer to the Command List + * + */ +void nema_cl_bind_circular(nema_cmdlist_t *cl); + +/** \brief Unbind current bound Command List, if any. + * + * + */ +void nema_cl_unbind(void); + + +/** \brief Get bound Command List + * + * \return Pointer to the bound Command List + * + */ +nema_cmdlist_t *nema_cl_get_bound(void); + +/** \private */ +void nema_cl_submit_no_irq(nema_cmdlist_t *cl); + +/** \brief Enqueue Command List to the Ring Buffer for execution + * + * \param cl Pointer to the Command List + * + */ +void nema_cl_submit(nema_cmdlist_t *cl); + +/** \brief Wait for Command List to finish + * + * \param cl Pointer to the Command List + * \return 0 if no error has occurred + * + */ +int nema_cl_wait(nema_cmdlist_t *cl); + +/** \brief Add a command to the bound Command List + * + * \param reg Hardware register to be written + * \param data Data to be written + * + */ +void nema_cl_add_cmd(uint32_t reg, uint32_t data); + +/** \brief Add multiple commands to the bound Command List + * + * \param cmd_no Numbers of commands to add + * \param cmd Pointer to the commands to be added + * \return 0 if no error has occurred + * + */ +int nema_cl_add_multiple_cmds(int cmd_no, uint32_t *cmd); + +/** private */ +uint32_t * nema_cl_get_space(int cmd_no); + +/** \brief Branch from the bound Command List to a different one. Return is implied. + * + * \param cl Pointer to the Command List to branch to + * + */ +void nema_cl_branch(nema_cmdlist_t *cl); + +/** \brief Jump from the bound Command List to a different one. No return is implied. + * + * \param cl Pointer to the Command List to jump to + * + */ +void nema_cl_jump(nema_cmdlist_t *cl); + +/** \brief Add an explicit return command to the bound Command List + * + * + */ +void nema_cl_return(void); + +/** \brief Returns positive number if the Command List is almost full, otherwise returns 0. + * + * \param cl Pointer to the Command List + * + */ +int nema_cl_almost_full(nema_cmdlist_t *cl); + +/** \brief Check if there is enough space or expansion can be performed for + * required commands. + * + * \param cmd_no Numbers of commands to be checked if they fit + * \reurn zero is commands fit or expansion xan be performed else return negative + */ +int nema_cl_enough_space(int cmd_no); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libs/nema_gfx/include/nema_core.h b/libs/nema_gfx/include/nema_core.h new file mode 100644 index 000000000..2942e9ece --- /dev/null +++ b/libs/nema_gfx/include/nema_core.h @@ -0,0 +1,41 @@ +/* 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_CORE_H__ +#define NEMA_CORE_H__ + +#include "nema_hal.h" +#include "nema_cmdlist.h" +#include "nema_graphics.h" +#include "nema_interpolators.h" +#include "nema_blender.h" +#include "nema_math.h" +#include "nema_matrix3x3.h" +#include "nema_matrix4x4.h" + +#endif diff --git a/libs/nema_gfx/include/nema_easing.h b/libs/nema_gfx/include/nema_easing.h new file mode 100644 index 000000000..936b1c0c2 --- /dev/null +++ b/libs/nema_gfx/include/nema_easing.h @@ -0,0 +1,369 @@ +/* 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_EASING_H__ +#define NEMA_EASING_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +//Linear + +// Modeled after the line y = x +/** \brief Linear easing, no acceleration + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_linear(float p); + +//Quadratic + +// Modeled after the parabola y = x^2 +/** \brief Quadratic easing in, accelerate from zero + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_quad_in(float p); + +// Modeled after the parabola y = -x^2 + 2x +/** \brief Quadratic easing out, decelerate to zero velocity + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_quad_out(float p); + +// Modeled after the piecewise quadratic +// y = (1/2)((2x)^2) ; [0, 0.5) +// y = -(1/2)((2x-1)*(2x-3) - 1) ; [0.5, 1] +/** \brief Quadratic easing in and out, accelerate to halfway, then decelerate + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_quad_in_out(float p); + +//Cubic + +// Modeled after the cubic y = x^3 +/** \brief Cubic easing in, accelerate from zero + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_cub_in(float p); + +// Modeled after the cubic y = (x - 1)^3 + 1 +/** \brief Cubic easing out, decelerate to zero velocity + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_cub_out(float p); + +// Modeled after the piecewise cubic +// y = (1/2)((2x)^3) ; [0, 0.5) +// y = (1/2)((2x-2)^3 + 2) ; [0.5, 1] +/** \brief Cubic easing in and out, accelerate to halfway, then decelerate + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_cub_in_out(float p); + +//Quartic + +// Modeled after the quartic x^4 +/** \brief Quartic easing in, accelerate from zero + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_quar_in(float p); + +// Modeled after the quartic y = 1 - (x - 1)^4 +/** \brief Quartic easing out, decelerate to zero velocity + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_quar_out(float p); + +// Modeled after the piecewise quartic +// y = (1/2)((2x)^4) ; [0, 0.5) +// y = -(1/2)((2x-2)^4 - 2) ; [0.5, 1] +/** \brief Quartic easing in and out, accelerate to halfway, then decelerate + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_quar_in_out(float p); + +//Quintic + +// Modeled after the quintic y = x^5 +/** \brief Quintic easing in, accelerate from zero + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_quin_in(float p); + +// Modeled after the quintic y = (x - 1)^5 + 1 +/** \brief Quintic easing out, decelerate to zero velocity + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_quin_out(float p); + +// Modeled after the piecewise quintic +// y = (1/2)((2x)^5) ; [0, 0.5) +// y = (1/2)((2x-2)^5 + 2) ; [0.5, 1] +/** \brief Quintic easing in and out, accelerate to halfway, then decelerate + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_quin_in_out(float p); + +//Sin + +// Modeled after quarter-cycle of sine wave +/** \brief Sinusoidal easing in, accelerate from zero + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_sin_in(float p); + +// Modeled after quarter-cycle of sine wave (different phase) +/** \brief Sinusoidal easing out, decelerate to zero velocity + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_sin_out(float p); + +// Modeled after half sine wave +/** \brief Sinusoidal easing in and out, accelerate to halfway, then decelerate + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_sin_in_out(float p); + +//Circular + +// Modeled after shifted quadrant IV of unit circle +/** \brief Circular easing in, accelerate from zero + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_circ_in(float p); + +// Modeled after shifted quadrant II of unit circle +/** \brief Circular easing out, decelerate to zero velocity + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_circ_out(float p); + +// Modeled after the piecewise circular function +// y = (1/2)(1 - sqrt(1 - 4x^2)) ; [0, 0.5) +// y = (1/2)(sqrt(-(2x - 3)*(2x - 1)) + 1) ; [0.5, 1] +/** \brief Circular easing in and out, accelerate to halfway, then decelerate + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_circ_in_out(float p); + +//Exponential + +// Modeled after the exponential function y = 2^(10(x - 1)) +/** \brief Exponential easing in, accelerate from zero + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_exp_in(float p); + +// Modeled after the exponential function y = -2^(-10x) + 1 +/** \brief Exponential easing out, decelerate to zero velocity + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_exp_out(float p); + +// Modeled after the piecewise exponential +// y = (1/2)2^(10(2x - 1)) ; [0,0.5) +// y = -(1/2)*2^(-10(2x - 1))) + 1 ; [0.5,1] +/** \brief Exponential easing in and out, accelerate to halfway, then decelerate + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_exp_in_out(float p); + +//Elastic +// Modeled after the damped sine wave y = sin(13pi/2*x)*pow(2, 10 * (x - 1)) + +/** \brief Elastic easing in, accelerate from zero + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_elast_in(float p); + +// Modeled after the damped sine wave y = sin(-13pi/2*(x + 1))*pow(2, -10x) + 1 +/** \brief Elastic easing out, decelerate to zero velocity + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_elast_out(float p); + +// Modeled after the piecewise exponentially-damped sine wave: +// y = (1/2)*sin(13pi/2*(2*x))*pow(2, 10 * ((2*x) - 1)) ; [0,0.5) +// y = (1/2)*(sin(-13pi/2*((2x-1)+1))*pow(2,-10(2*x-1)) + 2) ; [0.5, 1] +/** \brief Elastic easing in and out, accelerate to halfway, then decelerate + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_elast_in_out(float p); + +//Back + +// Modeled after the overshooting cubic y = x^3-x*sin(x*pi) +/** \brief Overshooting easing in, accelerate from zero + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_back_in(float p); + +// Modeled after overshooting cubic y = 1-((1-x)^3-(1-x)*sin((1-x)*pi)) +/** \brief Overshooting easing out, decelerate to zero velocity + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_back_out(float p); + +// Modeled after the piecewise overshooting cubic function: +// y = (1/2)*((2x)^3-(2x)*sin(2*x*pi)) ; [0, 0.5) +// y = (1/2)*(1-((1-x)^3-(1-x)*sin((1-x)*pi))+1) ; [0.5, 1] +/** \brief Overshooting easing in and out, accelerate to halfway, then decelerate + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_back_in_out(float p); + +//Bounce + +/** \brief Bouncing easing in, accelerate from zero + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_bounce_out(float p); + +/** \brief Bouncing easing out, decelerate to zero velocity + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_bounce_in(float p); + +/** \brief Bouncing easing in and out, accelerate to halfway, then decelerate + * + * \param p Input value, typically within the [0, 1] range + * \return Eased value + * + */ +float nema_ez_bounce_in_out(float p); + + +/** \brief Convenience function to perform easing between two values given number of steps, current step and easing function + * + * \param A Initial value within range [0, 1] + * \param B Finale value within range [0, 1] + * \param steps Total number of steps + * \param cur_step Current Step + * \param ez_func pointer to the desired easing function + * \return Eased value + * + */ + + +float nema_ez(float A, float B, float steps, float cur_step, float (*ez_func)(float p)); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libs/nema_gfx/include/nema_error.h b/libs/nema_gfx/include/nema_error.h new file mode 100644 index 000000000..0bb922811 --- /dev/null +++ b/libs/nema_gfx/include/nema_error.h @@ -0,0 +1,69 @@ +/* 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_ERROR_H__ +#define NEMA_ERROR_H__ + +#include "nema_sys_defs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Error Handling + +#define NEMA_ERR_NO_ERROR (0x00000000U) /**< No error has occured */ +#define NEMA_ERR_SYS_INIT_FAILURE (0x00000001U) /**< System initialization failure */ +#define NEMA_ERR_GPU_ABSENT (0x00000002U) /**< Nema GPU is absent */ +#define NEMA_ERR_RB_INIT_FAILURE (0x00000004U) /**< Ring buffer initialization failure */ +#define NEMA_ERR_NON_EXPANDABLE_CL_FULL (0x00000008U) /**< Non expandable command list is full*/ +#define NEMA_ERR_CL_EXPANSION (0x00000010U) /**< Command list expansion error */ +#define NEMA_ERR_OUT_OF_GFX_MEMORY (0x00000020U) /**< Graphics memory is full */ +#define NEMA_ERR_OUT_OF_HOST_MEMORY (0x00000040U) /**< Host memory is full */ +#define NEMA_ERR_NO_BOUND_CL (0x00000080U) /**< There is no bound command list */ +#define NEMA_ERR_NO_BOUND_FONT (0x00000100U) /**< There is no bound font */ +#define NEMA_ERR_GFX_MEMORY_INIT (0x00000200U) /**< Graphics memory initialization failure */ +#define NEMA_ERR_DRIVER_FAILURE (0x00000400U) /**< Nema GPU Kernel Driver failure*/ +#define NEMA_ERR_MUTEX_INIT (0x00000800U) /**< Mutex initialization failure*/ +#define NEMA_ERR_INVALID_BO (0x00001000U) /**< Invalid buffer provided*/ +#define NEMA_ERR_INVALID_CL (0x00002000U) /**< Invalid CL provided*/ +#define NEMA_ERR_INVALID_CL_ALIGMENT (0x00004000U) /**< Invalid CL buffer alignment*/ +#define NEMA_ERR_NO_INIT (0x00008000U) /**< GFX uninitialised*/ + +/** \brief Return Error Id + * + * \return 0 if no error exists + * + */ +uint32_t nema_get_error(void); + + +#ifdef __cplusplus +} +#endif + +#endif // NEMA_ERROR_H__ diff --git a/libs/nema_gfx/include/nema_font.h b/libs/nema_gfx/include/nema_font.h new file mode 100644 index 000000000..7ce79db0b --- /dev/null +++ b/libs/nema_gfx/include/nema_font.h @@ -0,0 +1,184 @@ +/* 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_FONT_H__ +#define NEMA_FONT_H__ + +#include "nema_hal.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define NEMA_ALIGNX_LEFT (0x00U) /**< Align horizontally to the left */ +#define NEMA_ALIGNX_RIGHT (0x01U) /**< Align horizontally to the right */ +#define NEMA_ALIGNX_CENTER (0x02U) /**< Align horizontally centered */ +#define NEMA_ALIGNX_JUSTIFY (0x03U) /**< Justify horizontally */ +#define NEMA_ALIGNX_MASK (0x03U) /**< Horizontal alignment mask */ +#define NEMA_ALIGNY_TOP (0x00U) /**< Align vertically to the top */ +#define NEMA_ALIGNY_BOTTOM (0x04U) /**< Align vertically to the bottom */ +#define NEMA_ALIGNY_CENTER (0x08U) /**< Align vertically centered */ +#define NEMA_ALIGNY_JUSTIFY (0x0cU) /**< Justify vertically */ +#define NEMA_ALIGNY_MASK (0x0cU) /**< Vertical alignment mask */ +#define NEMA_TEXT_WRAP (0x10U) /**< Use text wrapping */ + +typedef struct { + uint32_t left; /**< Neighbor character to the left of the current one (Unicode value) */ + int8_t x_offset; /**< Kerning offset (horizontally) */ +} nema_kern_pair_t; + +typedef struct { + uint32_t bitmapOffset; + uint8_t width; + uint8_t xAdvance; + int8_t xOffset; + int8_t yOffset; + uint32_t kern_offset; + uint8_t kern_length; +} nema_glyph_t; + +typedef struct { + int bitmapOffset; + uint8_t width; + uint8_t xAdvance; + int8_t xOffset; + int8_t yOffset; + int id; +} nema_glyph_indexed_t; + +typedef struct { + uint32_t first, last; + const nema_glyph_t *glyphs; +} nema_font_range_t; + +typedef struct { + nema_buffer_t bo; + const nema_font_range_t *ranges; + const int bitmap_size; + const uint8_t *bitmap; + uint32_t flags; + uint8_t xAdvance; //default xAdvance + uint8_t yAdvance; + uint8_t max_ascender; + uint8_t bpp; + const nema_kern_pair_t *kern_pairs; + const nema_glyph_indexed_t *indexed_glyphs; +} nema_font_t; + +/** \brief Bind the font to use in future nema_print() calls + * + * \param font Pointer to font + * + */ +void nema_bind_font(nema_font_t *font); + +/** \brief Get the bounding box's width and height of a string. + * + * \param str Pointer to string + * \param w Pointer to variable where width should be written + * \param h Pointer to variable where height should be written + * \param max_w Max allowed width + * \return Number of carriage returns + * + */ +int nema_string_get_bbox(const char *str, int *w, int *h, int max_w, uint32_t wrap); + +/** \brief Print pre-formatted text + * + * \param str Pointer to string + * \param x X coordinate of text-area's top-left corner + * \param y Y coordinate of text-area's top-left corner + * \param w Width of the text area + * \param h Height of the text area + * \param fg_col Foreground color of text + * \param align Alignment and wrapping mode + * + */ +void nema_print(const char *str, int x, int y, int w, int h, uint32_t fg_col, uint32_t align); + +/** \brief Print pre-formatted text + * + * \param *str Pointer to string + * \param *cursor_x X position of next character to be drawn. Usually initialized to 0 by the user and then updated internally by the library + * \param *cursor_y Y position of next character to be drawn. Usually initialized to 0 by the user and then updated internally by the library + * \param x X coordinate of text-area's top-left corner + * \param y Y coordinate of text-area's top-left corner + * \param w Width of the text area + * \param h Height of the text area + * \param fg_col Foreground color of text + * \param align Alignment and wrapping mode + * + */ +void nema_print_to_position(const char *str, int *pos_x, int *pos_y, int x, int y, int w, int h, uint32_t fg_col, uint32_t align); + + +/** \brief Print text (not formated) with indexed glyphs. Text is printed in a single line, from left to right + * + * \param ids Array with the glyphs indices + * \param id_count Count of the characters to be drawn + * \param x X coordinate of the text-area's top-left corner + * \param y Y coordinate of the text-area's top-left corner + * \param fg_col Foreground color of text + * + */ +void nema_print_indexed(const int *ids, int id_count, int x, int y, uint32_t fg_col); + +/** \brief Print a single character with indexed glyph + * + * \param id Array with the glyphs indices + * \param x X coordinate of the character's top-left corner + * \param y Y coordinate of the character's top-left corner + * \param fg_col Character's color + * + */ +void nema_print_char_indexed(const int id, int x, int y, uint32_t fg_col); + +/** \brief Returns the bounding box's width and height of a string with indexed glyphs + * + * \details The string must be specified as a single line text, due to the restriction + * that the characters are described by respective glyph indices. The height of the + * bounding box will be equal to the height of the bound font. + * + * \param ids Array with the glyphs indices + * \param id_count Count of the characters contained in the array with the glyphs indices + * \param w Pointer to variable where width should be written + * \param h Pointer to variable where height should be written + * \param max_w Maximum allowed width (if w is greater than this value, it will saturate to this) + */ +void nema_string_indexed_get_bbox(const int *ids, int id_count, int *w, int *h, int max_w); + +/** \brief Returns the horizontal advance (in pixels) of the bound font + * + */ +int nema_font_get_x_advance(); + +#ifdef __cplusplus +} +#endif + +#endif // NEMA_FONT_H__ diff --git a/libs/nema_gfx/include/nema_graphics.h b/libs/nema_gfx/include/nema_graphics.h new file mode 100644 index 000000000..00f240df7 --- /dev/null +++ b/libs/nema_gfx/include/nema_graphics.h @@ -0,0 +1,1017 @@ +/* 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_GRAPHICS_H__ +#define NEMA_GRAPHICS_H__ + +#include "nema_sys_defs.h" +#include "nema_hal.h" +#include "nema_matrix3x3.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _img_obj_ { + nema_buffer_t bo; + uint16_t w; + uint16_t h; + int stride; + uint32_t color; + uint8_t format; + uint8_t sampling_mode; // NEMA_FILTER* +} img_obj_t; + +typedef img_obj_t nema_img_obj_t; + +typedef enum { + NEMA_NOTEX = -1, /**< No Texture */ + NEMA_TEX0 = 0, /**< Texture 0 */ + NEMA_TEX1 = 1, /**< Texture 1 */ + NEMA_TEX2 = 2, /**< Texture 2 */ + NEMA_TEX3 = 3 /**< Texture 3 */ +} nema_tex_t; + +#define NEMA_RGBX8888 0x00U /**< RGBX8888 */ +#define NEMA_RGBA8888 0x01U /**< RGBA8888 */ +#define NEMA_XRGB8888 0x02U /**< XRGB8888 */ +#define NEMA_ARGB8888 0x03U /**< ARGB8888 */ +#define NEMA_RGB565 0x04U /**< RGBA5650 */ +#define NEMA_RGBA5650 0x04U /**< RGBA5650 */ +#define NEMA_RGBA5551 0x05U /**< RGBA5551 */ +#define NEMA_RGBA4444 0x06U /**< RGBA4444 */ +#define NEMA_RGBA0800 0x07U /**< RGBA0800 */ +#define NEMA_A8 0x08U /**< RGBA0008 */ +#define NEMA_RGBA0008 0x08U /**< RGBA0008 */ +#define NEMA_L8 0x09U /**< L8 */ +#define NEMA_RGBA3320 0x38U /**< RGBA3320 (source only) */ +#define NEMA_RGB332 0x38U /**< RGBA3320 (source only) */ +#define NEMA_BW1 0x0CU /**< A1 (source only) */ +#define NEMA_A1 0x0CU /**< A1 (source only) */ +#define NEMA_L1 0x0BU /**< L1 (source only) */ +#define NEMA_UYVY 0x0DU /**< UYVY */ +#define NEMA_ABGR8888 0x0EU /**< ABGR8888 */ +#define NEMA_XBGR8888 0x0FU /**< XBGR8888 */ +#define NEMA_BGRA8888 0x10U /**< BGRA */ +#define NEMA_BGRX8888 0x11U /**< BGRX */ +#define NEMA_TSC4 0x12U /**< TSC4 */ +#define NEMA_TSC6 0x16U /**< TSC6 */ +#define NEMA_TSC6A 0x17U /**< TSC6A */ +#define NEMA_RV 0x18U /**< RV */ +#define NEMA_GU 0x19U /**< GU */ +#define NEMA_BY 0x1AU /**< BY */ +#define NEMA_YUV 0x1BU /**< YUV */ +#define NEMA_Z24_8 0x1cU /**< Z24_8 */ +#define NEMA_Z16 0x1dU /**< Z16 */ +#define NEMA_UV 0x1eU /**< UV */ +#define NEMA_A1LE 0x27U /**< A1LE (source only) */ +#define NEMA_A2LE 0x28U /**< A2LE (source only) */ +#define NEMA_A4LE 0x29U /**< A4LE (source only) */ +#define NEMA_L1LE 0x2AU /**< L1LE (source only) */ +#define NEMA_L2LE 0x2BU /**< L2LE (source only) */ +#define NEMA_L4LE 0x2CU /**< L4LE (source only) */ +#define NEMA_A2 0x30U /**< A2 (source only) */ +#define NEMA_A4 0x34U /**< A4 (source only) */ +#define NEMA_L2 0x31U /**< L2 (source only) */ +#define NEMA_L4 0x35U /**< L4 (source only) */ +#define NEMA_BGR24 0x39U /**< BGR24 */ +#define NEMA_RGB24 0x3CU /**< RGB24 */ +#define NEMA_RV10 0x3DU /**< RV-10bit */ +#define NEMA_GU10 0x3EU /**< GU-10bit */ +#define NEMA_BY10 0x3FU /**< BY-10bit */ +#define NEMA_RGBA2222 0x40U /**< RGBA2222 (Available if HW enabled - check HW manual) */ +#define NEMA_ABGR2222 0x41U /**< ABGR2222 (Available if HW enabled - check HW manual) */ +#define NEMA_BGRA2222 0x42U /**< BGRA2222 (Available if HW enabled - check HW manual) */ +#define NEMA_ARGB2222 0x43U /**< ARGB2222 (Available if HW enabled - check HW manual) */ +#define NEMA_AL88 0x44U /**< AL88 (Available if HW enabled - check HW manual) */ +#define NEMA_AL44 0x45U /**< AL44 (Available if HW enabled - check HW manual) */ +#define NEMA_ARGB1555 0x46U /**< ARGB1555 (Available if HW enabled - check HW manual) */ +#define NEMA_ARGB4444 0x47U /**< ARGB4444 (Available if HW enabled - check HW manual) */ +#define NEMA_BGRA5650 0x13U /**< BGRA5650 (Available if HW enabled - check HW manual) */ +#define NEMA_BGR565 0x13U /**< BGRA5650 (Available if HW enabled - check HW manual) */ +#define NEMA_BGRA5551 0x48U /**< BGRA5551 (Available if HW enabled - check HW manual) */ +#define NEMA_ABGR1555 0x49U /**< ABGR1555 (Available if HW enabled - check HW manual) */ +#define NEMA_BGRA4444 0x4aU /**< BGRA4444 (Available if HW enabled - check HW manual) */ +#define NEMA_ABGR4444 0x4bU /**< ABGR4444 (Available if HW enabled - check HW manual) */ +#define NEMA_TSC12 0x4cU /**< TSC12 (Available if HW enabled - check HW manual) */ +#define NEMA_TSC12A 0x4dU /**< TSC12A (Available if HW enabled - check HW manual) */ + +#define NEMA_DITHER 0x80U /**< Nema Dithering */ +#define NEMA_FORMAT_MASK 0x7FU /**< Format Mask */ + +typedef uint32_t nema_tex_format_t; + +//----------------------------------------------------------------------------------------------------------------------- + +// Texture Unit Parameters +//----------------------------------------------------------------------------------------- + // Filtering - 0:0 + //---------------------- +#define NEMA_FILTER_PS 0x00U /**< Point Sampling. */ +#define NEMA_FILTER_BL 0x01U /**< Bilinear filtering. */ + + // Wrapping Mode 3:2 + //---------------------- +#define NEMA_TEX_CLAMP (0x00U) /**< Clamp */ +#define NEMA_TEX_REPEAT (0x01U<<2) /**< Repeat */ +#define NEMA_TEX_BORDER (0x02U<<2) /**< Border */ +#define NEMA_TEX_MIRROR (0x03U<<2) /**< Mirror */ + + // Texture Coordinates Ordering 4:4 + //---------------------- +#define NEMA_TEX_MORTON_ORDER (0x10U) + + // Texture Coordinates Format 6:5 + //---------------------- +#define NEMA_TEX_RANGE_0_1 (0x1U<<5) /**< Interpolated Coordinates range: 0-1 */ +#define NEMA_TEX_LEFT_HANDED (0x1U<<6) /**< (0,0) is bottom left corner */ + +typedef uint8_t nema_tex_mode_t; + +// Triangle Culling +//----------------------------------------------------------------------------------------- +typedef enum { + NEMA_CULL_NONE = 0 , /**< Disable Triangle/Quadrilateral Culling */ + NEMA_CULL_CW = (1U<<28), /**< Cull clockwise Triangles/Quadrilaterals */ + NEMA_CULL_CCW = (1U<<29), /**< Cull anti-clockwise Triangles/Quadrilaterals */ + NEMA_CULL_ALL = NEMA_CULL_CW | NEMA_CULL_CCW /**< Cull all */ +} nema_tri_cull_t; + +// Rotation Modes +//----------------------------------------------------------------------------------------------------------------------- + +#define NEMA_ROT_000_CCW (0x0U) /**< No rotation */ +#define NEMA_ROT_090_CCW (0x1U) /**< Rotate 90 degrees counter-clockwise */ +#define NEMA_ROT_180_CCW (0x2U) /**< Rotate 180 degrees counter-clockwise */ +#define NEMA_ROT_270_CCW (0x3U) /**< Rotate 270 degrees counter-clockwise */ +#define NEMA_ROT_000_CW (0x0U) /**< No rotation */ +#define NEMA_ROT_270_CW (0x1U) /**< Rotate 270 degrees clockwise */ +#define NEMA_ROT_180_CW (0x2U) /**< Rotate 180 degrees clockwise */ +#define NEMA_ROT_090_CW (0x3U) /**< Rotate 90 degrees clockwise */ +#define NEMA_MIR_VERT (0x4U) /**< Mirror Vertically */ +#define NEMA_MIR_HOR (0x8U) /**< Mirror Horizontally */ + + +/** \brief Check if a known GPU is present + * + * \return -1 if no known GPU is present + * + */ +int nema_checkGPUPresence(void); + +// ------------------------------ TEXTURES ------------------------------------- + +/** \brief Program a Texture Unit + * + * \param texid Texture unit to be programmed + * \param addr_gpu Texture's address as seen by the GPU + * \param width Texture's width + * \param height Texture's height + * \param format Texture's format + * \param stride Texture's stride. If stride < 0, it's left to be calculated + * \param wrap_mode Wrap/Repeat mode to be used. When using 'repeat' or 'mirror', texture dimensions must be a power of two. Otherwise the behavior is undefined. + * + */ +void nema_bind_tex(nema_tex_t texid, uintptr_t addr_gpu, + uint32_t width, uint32_t height, + nema_tex_format_t format, int32_t stride, nema_tex_mode_t wrap_mode); + +/** \brief Set Texture Mapping default color + * + * \param color default color in 32-bit RGBA format + * \see nema_rgba() + * + */ +void nema_set_tex_color(uint32_t color); + +// ------------------------------ CONSTREGS ------------------------------------ + +/** \brief Write a value to a Constant Register of the GPU + * + * \param reg Constant Register to be written + * \param value Value to be written + * + */ +void nema_set_const_reg(int reg, uint32_t value); + +// --------------------------------- CLIP -------------------------------------- + +/** \brief Sets the drawing area's Clipping Rectangle + * + * \param x Clip Window top-left x coordinate + * \param y Clip Window minimum y + * \param w Clip Window width + * \param h Clip Window height + * + */ +void nema_set_clip(int32_t x, int32_t y, uint32_t w, uint32_t h); + +void nema_enable_gradient(int enable); + +void nema_enable_depth(int enable); + +/** \brief Enables MSAA per edge + * + * \param e0 Enable MSAA for edge 0 (vertices 0-1) + * \param e1 Enable MSAA for edge 1 (vertices 1-2) + * \param e2 Enable MSAA for edge 2 (vertices 2-3) + * \param e3 Enable MSAA for edge 3 (vertices 3-0) + * \return previous AA flags (may be ignored) + * + */ +uint32_t nema_enable_aa(uint8_t e0, uint8_t e1, uint8_t e2, uint8_t e3); + +// ------------------------------- DIRTY REGIONS ------------------------------------ + +/** \brief Returns the bounding rectangle of all the pixels that have been modified since its previous call. + * Available only on Nema|P and Nema|PVG GPUs. + * + * \param minx x coordinate of the upper left corner of the dirty region + * \param miny y coordinate of the upper left corner of the dirty region + * \param maxx x coordinate of the lower right corner of the dirty region + * \param maxy y coordinate of the lower right corner of the dirty region + * + */ +void nema_get_dirty_region(int *minx, int *miny, int *maxx, int *maxy); + +/** \brief Clear dirty region information - runs via the bound command-list + * Available only on Nema|P and Nema|PVG GPUs. + * + * \see nema_get_dirty_region() + * \see nema_clear_dirty_region_imm() + * + */ +void nema_clear_dirty_region(void); + +/** \brief Clear dirty region information immediately, no command-list involved + * Available only on Nema|P and Nema|PVG GPUs. + * + * \see nema_get_dirty_region() + * \see nema_clear_dirty_region() + * + */ +void nema_clear_dirty_region_imm(void); + +// -------------------------------- UTILS -------------------------------------- + +/** \brief Set triangle/quadrilateral culling mode + * + * \param cull Culling mode + * + */ +void nema_tri_cull(nema_tri_cull_t cull); + +/** \brief Return pixel size in bytes + * + * \param format Color format + * \return Pixel size in bytes + * + */ +int nema_format_size (nema_tex_format_t format); + +/** \brief Return stride in bytes + * + * \param format Color format + * \param wrap_mode Wrap/Repeat mode to be used. When using 'repeat' or 'mirror', texture dimensions must be a power of two. Otherwise the behavior is undefined. + * \param width Texture color format + * \return Stride in bytes + * + */ +int nema_stride_size(nema_tex_format_t format, nema_tex_mode_t wrap_mode, int width); + + +/** \brief Return texture size in bytes + * + * \param format Texture color format + * \param wrap_mode Wrap/Repeat mode to be used. When using 'repeat' or 'mirror', texture dimensions must be a power of two. Otherwise the behavior is undefined. + * \param width Texture width + * \param height Texture height + * \return Texture size in bytes + * + */ +int nema_texture_size(nema_tex_format_t format, nema_tex_mode_t wrap_mode, int width, int height); + +/** \brief Return Nema internal RGBA color + * + * \param R Red component + * \param G Green component + * \param B Blue component + * \param A Alpha component + * \return RGBA value + * + */ +uint32_t nema_rgba(unsigned char R, + unsigned char G, + unsigned char B, + unsigned char A); + +/** \brief Premultiply RGB channels with Alpha channel + * + * \param rgba RGBA color + * \return Premultiplied RGBA color + * + */ +uint32_t nema_premultiply_rgba(uint32_t rgba); + +/** \brief Initialize NemaGFX library + * + * \return negative value on error + * + */ +int nema_init(void); + +/** \brief Reinitialize NemaGFX library + * + * \details This function reinitializes the NemaGFX library after a GPU poweroff + * No memory allocation for ringbuffer etc is performed. + * + * \return negative value on error + * + */ +int nema_reinit(void); + +// ------------------------------- CONTEXT ------------------------------------- + +/** \brief Program Texture Unit with a foreground (source) texture (NEMA_TEX1) + * + * \param baseaddr_phys Address of the source texture, as seen by the GPU + * \param width Texture width + * \param height Texture hight + * \param format Texture format + * \param stride Texture stride. If negative, it's calculated internally. + * \param wrap_mode Wrap/Repeat mode to be used. When using 'repeat' or 'mirror', texture dimensions must be a power of two. Otherwise the behavior is undefined. + * + */ +void nema_bind_src_tex(uintptr_t baseaddr_phys, + uint32_t width, uint32_t height, + nema_tex_format_t format, int32_t stride, nema_tex_mode_t mode); + +/** \brief Program Texture Unit with a background texture ((NEMA_TEX2) + * + * \param baseaddr_phys Address of the source2 texture, as seen by the GPU + * \param width Texture width + * \param height Texture hight + * \param format Texture format + * \param stride Texture stride. If negative, it's calculated internally. + * \param wrap_mode Wrap/Repeat mode to be used. When using 'repeat' or 'mirror', texture dimensions must be a power of two. Otherwise the behavior is undefined. + * + */ +void nema_bind_src2_tex(uintptr_t baseaddr_phys, + uint32_t width, uint32_t height, + nema_tex_format_t format, int32_t stride, nema_tex_mode_t mode); + +/** \brief Program Texture Unit with a destination texture (NEMA_TEX0) + * + * \param baseaddr_phys Address of the destination texture, as seen by the GPU + * \param width Texture width + * \param height Texture hight + * \param format Texture format + * \param stride Texture stride. If negative, it's calculated internally. + * + */ +void nema_bind_dst_tex(uintptr_t baseaddr_phys, + uint32_t width, uint32_t height, + nema_tex_format_t format, int32_t stride); + +/** \brief Program Texture Unit with a lut/palette texture (NEMA_TEX2) and index texture (NEMA_TEX1_) + * + * \param baseaddr_phys Address of the index texture + * \param width Index texture width + * \param height Index texture hight + * \param format Index texture format + * \param stride Index texture stride. If negative, it's calculated internally. + * \param mode Index texture sampling mode. When using 'NEMA_TEX_REPEAT' or 'NEMA_TEX_MIRROR' wrapping mode, + * texture dimensions must be a power of two, otherwise the behavior is undefined. NEMA_FILTER_BL is not supported. + * \param palette_baseaddr_phys Address of the lut/palette texture + * \param palette_format lut/palette texture format + * + */ +void nema_bind_lut_tex( uintptr_t baseaddr_phys, + uint32_t width, uint32_t height, + nema_tex_format_t format, int32_t stride, nema_tex_mode_t mode, + uintptr_t palette_baseaddr_phys, + nema_tex_format_t palette_format); + +/** \brief Bind Depth Buffer + * + * \param baseaddr_phys Address of the depth buffer, as seen by the GPU + * \param width Buffer width + * \param height Buffer hight + * + */ +void nema_bind_depth_buffer(uintptr_t baseaddr_phys, + uint32_t width, uint32_t height); + +/** \private */ +// -------------------------------- DEPTH -------------------------------------- +void nema_set_depth(float start, float dx, float dy); + +// ------------------------------ GRADIENT ------------------------------------- +/** \private */ +void nema_set_gradient(float r_init, float g_init, float b_init, float a_init, + float r_dx, float r_dy, + float g_dx, float g_dy, + float b_dx, float b_dy, + float a_dx, float a_dy); + +// ------------------------------- DRAWING ------------------------------------- +/** \brief Clear destination texture with color + * + * \param rgba8888 32-bit RGBA color + * \see nema_rgba() + * + */ +void nema_clear(uint32_t rgba8888); + +/** \brief Clear depth buffer with specified value + * + * \param val Clear value + * + */ +void nema_clear_depth(uint32_t val); + +/** \brief Draw a colored line + * + * \param x0 x coordinate at the beginning of the line + * \param y0 y coordinate at the beginning of the line + * \param x1 x coordinate at the end of the line + * \param y1 y coordinate at the end of the line + * \param rgba8888 Color to be used + * \see nema_set_blend_fill() + * \see nema_rgba() + * + */ +void nema_draw_line(int x0, int y0, int x1, int y1, uint32_t rgba8888); + + +/** \brief Draw a line with width. Apply AA if available + * + * \param x0 x coordinate at the beginning of the line + * \param y0 y coordinate at the beginning of the line + * \param x1 x coordinate at the end of the line + * \param y1 y coordinate at the end of the line + * \param w line width + * \param rgba8888 Color to be used + * \see nema_draw_line() + * \see nema_set_blend_fill() + * \see nema_rgba() + * + */ +void +nema_draw_line_aa(float x0, float y0, float x1, float y1, float w, + uint32_t rgba8888); + +/** \brief Draw a colored circle with 1 pixel width + * + * \param x x coordinate of the circle's center + * \param y y coordinate of the circle's center + * \param r circle's radius + * \param rgba8888 Color to be used + * \see nema_set_blend_fill() + * \see nema_rgba() + * + */ +void nema_draw_circle(int x, int y, int r, uint32_t rgba8888); + +/** \brief Draw a colored circle with Anti-Aliasing (if available) and specified width + * + * \param x x coordinate of the circle's center + * \param y y coordinate of the circle's center + * \param r circle's radius + * \param w pencil width + * \param rgba8888 Color to be used + * \see nema_set_blend_fill() + * \see nema_rgba() + * + */ +void nema_draw_circle_aa(float x, float y, float r, float w, uint32_t rgba8888); + +/** \brief Draw a colored rectangle with rounded edges + * + * \param x0 x coordinate of the upper left vertex of the rectangle + * \param y0 y coordinate at the upper left vertex of the rectangle + * \param w width of the rectangle + * \param h height of the rectangle + * \param r corner radius + * \param rgba8888 + * \see nema_set_blend_fill() + * \see nema_rgba() + * + */ +void nema_draw_rounded_rect(int x0, int y0, int w, int h, int r, uint32_t rgba8888); + +/** \brief Draw a colored rectangle + * + * \param x x coordinate of the upper left vertex of the rectangle + * \param y y coordinate at the upper left vertex of the rectangle + * \param w width of the rectangle + * \param h height of the rectangle + * \param rgba8888 Color to be used + * \see nema_set_blend_fill() + * \see nema_rgba() + * + */ +void nema_draw_rect(int x, int y, int w, int h, uint32_t rgba8888); + +/** \brief Fill a circle with color + * + * \param x x coordinate of the circle's center + * \param y y coordinate of the circle's center + * \param r circle's radius + * \param rgba8888 Color to be used + * \see nema_set_blend_fill() + * \see nema_rgba() + * + */ +void nema_fill_circle(int x, int y, int r, uint32_t rgba8888); + +/** \brief Fill a circle with color, use Anti-Aliasing if available + * + * \param x x coordinate of the circle's center + * \param y y coordinate of the circle's center + * \param r circle's radius + * \param rgba8888 Color to be used + * \see nema_set_blend_fill() + * \see nema_rgba() + * + */ +void nema_fill_circle_aa(float x, float y, float r, uint32_t rgba8888); + +/** \brief Fill a triangle with color + * + * \param x0 x coordinate at the first vertex of the triangle + * \param y0 y coordinate at the first vertex of the triangle + * \param x1 x coordinate at the second vertex of the triangle + * \param y1 y coordinate at the second vertex of the triangle + * \param x2 x coordinate at the third vertex of the triangle + * \param y2 y coordinate at the third vertex of the triangle + * \param rgba8888 Color to be used + * \see nema_set_blend_fill() + * + */ +void nema_fill_triangle(int x0, int y0, int x1, int y1, int x2, int y2, uint32_t rgba8888); + +/** \brief Fill a rectangle with rounded edges with color + * + * \param x0 x coordinate of the upper left vertex of the rectangle + * \param y0 y coordinate at the upper left vertex of the rectangle + * \param w width of the rectangle + * \param h height of the rectangle + * \param r corner radius + * \param rgba8888 + * \see nema_set_blend_fill() + * \see nema_rgba() + * + */ +void nema_fill_rounded_rect(int x0, int y0, int w, int h, int r, uint32_t rgba8888); + +/** \brief Fill a rectangle with color + * + * \param x x coordinate of the upper left vertex of the rectangle + * \param y y coordinate at the upper left vertex of the rectangle + * \param w width of the rectangle + * \param h height of the rectangle + * \param rgba8888 Color to be used + * \see nema_set_blend_fill() + * \see nema_rgba() + * + */ +void nema_fill_rect(int x, int y, int w, int h, uint32_t rgba8888); + +/** \brief Fill a quadrilateral with color + * + * \param x0 x coordinate at the first vertex of the quadrilateral + * \param y0 y coordinate at the first vertex of the quadrilateral + * \param x1 x coordinate at the second vertex of the quadrilateral + * \param y1 y coordinate at the second vertex of the quadrilateral + * \param x2 x coordinate at the third vertex of the quadrilateral + * \param y2 y coordinate at the third vertex of the quadrilateral + * \param x3 x coordinate at the fourth vertex of the quadrilateral + * \param y3 y coordinate at the fourth vertex of the quadrilateral + * \param rgba8888 Color to be used + * \see nema_set_blend_fill() + * \see nema_rgba() + * + */ +void nema_fill_quad(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3, uint32_t rgba8888); + + +/** \brief Fill a rectangle with color (float coordinates) + * + * \param x x coordinate of the upper left vertex of the rectangle + * \param y y coordinate at the upper left vertex of the rectangle + * \param w width of the rectangle + * \param h height of the rectangle + * \param rgba8888 Color to be used + * \see nema_set_blend_fill() + * \see nema_rgba() + * + */ +void nema_fill_rect_f(float x, float y, float w, float h, uint32_t rgba8888); + + +/** \brief Fill a quadrilateral with color (float coordinates) + * + * \param x0 x coordinate at the first vertex of the quadrilateral + * \param y0 y coordinate at the first vertex of the quadrilateral + * \param x1 x coordinate at the second vertex of the quadrilateral + * \param y1 y coordinate at the second vertex of the quadrilateral + * \param x2 x coordinate at the third vertex of the quadrilateral + * \param y2 y coordinate at the third vertex of the quadrilateral + * \param x3 x coordinate at the fourth vertex of the quadrilateral + * \param y3 y coordinate at the fourth vertex of the quadrilateral + * \param rgba8888 Color to be used + * \see nema_set_blend_fill() + * \see nema_rgba() + * + */ +void nema_fill_quad_f(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, uint32_t rgba8888); + + +/** \brief Fill a triangle with color (float coordinates) + * + * \param x0 x coordinate at the first vertex of the triangle + * \param y0 y coordinate at the first vertex of the triangle + * \param x1 x coordinate at the second vertex of the triangle + * \param y1 y coordinate at the second vertex of the triangle + * \param x2 x coordinate at the third vertex of the triangle + * \param y2 y coordinate at the third vertex of the triangle + * \param rgba8888 Color to be used + * \see nema_set_blend_fill() + * + */ +void nema_fill_triangle_f(float x0, float y0, float x1, float y1, float x2, float y2, uint32_t rgba8888); + + +// ------------------------------- BLITTING ------------------------------------ + +/** \brief Blit source texture to destination texture + * + * \param x destination x coordinate + * \param y destination y coordinate + * \see nema_set_blend_fill() + * + */ +void nema_blit (int x, int y); + + +/** \brief Blit source texture to destination texture with rounded corners + * + * \param x destination x coordinate + * \param y destination y coordinate + * \param r destination corner radius + * \see nema_set_blend_fill() + * + */ +void nema_blit_rounded (int x, int y, int r); + +/** \brief Blit source texture to destination's specified rectangle (crop or wrap when needed) + * + * \param x destination x coordinate + * \param y destination y coordinate + * \param w destination width + * \param h destination height + * \see nema_set_blend_blit() + * + */ +void nema_blit_rect (int x, int y, int w, int h); + +/** \brief Blit part of a source texture to destination's specified rectangle (crop or wrap when needed) + * + * \param x destination x coordinate + * \param y destination y coordinate + * \param w destination width + * \param h destination height + * \param x source x coordinate + * \param y source y coordinate + * \see nema_blit_subrect() + * \see nema_set_blend_blit() + * + */ +void nema_blit_subrect(int dst_x, int dst_y, int w, int h, int src_x, int src_y); + +/** \brief Blit source texture to destination. Fit (scale) texture to specified rectangle. + * + * \param x destination x coordinate + * \param y destination y coordinate + * \param w destination width + * \param h destination height + * \see nema_set_blend_blit() + * + */ +void nema_blit_rect_fit(int x, int y, int w, int h); + + +/** \brief Blit part of source texture to destination. Fit (scale) texture to specified rectangle. + * + * \param x destination x coordinate + * \param y destination y coordinate + * \param w destination width + * \param h destination height + * \param x source x coordinate + * \param y source y coordinate + * \param w source width + * \param h source height + * \see nema_blit_rect_fit() + * \see nema_set_blend_blit() + * + */ +void nema_blit_subrect_fit( int dst_x, int dst_y, int dst_w, int dst_h, + int src_x, int src_y, int src_w, int src_h); + +/** \brief Rotate around pivot point and Blit source texture. + * + * \param cx destination rotation center x coordinate + * \param cy destination rotation center y coordinate + * \param px source pivot point x coordinate + * \param py source pivot point y coordinate + * \param degrees_cw degrees of clockwise rotation in range [0, 360] + * \see nema_set_blend_blit() + * + */ +void nema_blit_rotate_pivot( float cx, float cy, + float px, float py, float degrees_cw ); + +/** \brief Rotate and Blit source texture to destination. + * + * \param x destination x coordinate + * \param y destination y coordinate + * \param rotation Rotation to be done + * \see nema_set_blend_blit() + * + */ +void nema_blit_rotate(int x, int y, uint32_t rotation); + +/** \brief Rotate and Blit partial source texture to destination. + * + * \param sx source upper left x coordinate + * \param sy source upper left y coordinate + * \param sw source width of partial region + * \param sh source height of partial region + * \param x destination x coordinate + * \param y destination y coordinate + * \param rotation Rotation to be done + * \see nema_set_blend_blit() + * + */ +void nema_blit_rotate_partial(int sx, int sy, + int sw, int sh, + int x, int y, + uint32_t rotation); + + +/** \brief Blit source texture to destination. Fit texture to specified triangle. + * + * \param dx0 x coordinate at the first vertex of the triangle + * \param dy0 y coordinate at the first vertex of the triangle + * \param v0 in [0, 3] indicates the corner of the texture that fits to the first vertex of the triangle + * 0 _ _ 1 + * |_ _| + * 3 2 + * \param dx1 x coordinate at the second vertex of the triangle + * \param dy1 y coordinate at the second vertex of the triangle + * \param v1 in [0, 3] indicates the corner of the texture that fits to the second vertex of the triangle + * \param dx2 x coordinate at the third vertex of the triangle + * \param dy2 y coordinate at the third vertex of the triangle + * \param v2 in [0, 3] indicates the corner of the texture that fits to the third vertex of the triangle + * \see nema_set_blend_blit() + * + */ +void nema_blit_tri_fit (float dx0, float dy0, int v0, + float dx1, float dy1, int v1, + float dx2, float dy2, int v2); + +/** \brief Blit a triangular part of the source tecture to a triangular destination area + * + * \param dx0 x coordinate at the first vertex of the destination triangle + * \param dy0 y coordinate at the first vertex of the destination triangle + * \param dw0 w coordinate at the first vertex of the destination triangle + * \param dx1 x coordinate at the second vertex of the destination triangle + * \param dy1 y coordinate at the second vertex of the destination triangle + * \param dw1 w coordinate at the second vertex of the destination triangle + * \param dx2 x coordinate at the third vertex of the destination triangle + * \param dy2 y coordinate at the third vertex of the destination triangle + * \param dw2 w coordinate at the third vertex of the destination triangle + * \param sx0 x coordinate at the first vertex of the source triangle + * \param sy0 y coordinate at the first vertex of the source triangle + * \param sx1 x coordinate at the second vertex of the source triangle + * \param sy1 y coordinate at the second vertex of the source triangle + * \param sx2 x coordinate at the third vertex of the source triangle + * \param sy2 y coordinate at the third vertex of the source triangle + * \see nema_set_blend_blit() + * + */ +void nema_blit_tri_uv (float dx0, float dy0, float dw0, + float dx1, float dy1, float dw1, + float dx2, float dy2, float dw2, + float sx0, float sy0, + float sx1, float sy1, + float sx2, float sy2 + ); + +/** \brief Blit source texture to destination. Fit texture to specified quadrilateral. + * + * \param dx0 x coordinate at the first vertex of the quadrilateral + * \param dy0 y coordinate at the first vertex of the quadrilateral + * \param dx1 x coordinate at the second vertex of the quadrilateral + * \param dy1 y coordinate at the second vertex of the quadrilateral + * \param dx2 x coordinate at the third vertex of the quadrilateral + * \param dy2 y coordinate at the third vertex of the quadrilateral + * \param dx3 x coordinate at the fourth vertex of the quadrilateral + * \param dy3 y coordinate at the fourth vertex of the quadrilateral + * \see nema_set_blend_blit() + * \see nema_blit_subrect_quad_fit() + * + */ +void nema_blit_quad_fit (float dx0, float dy0, + float dx1, float dy1, + float dx2, float dy2, + float dx3, float dy3); + +/** \brief Blit source texture to destination. Fit rectangulare area of texture to specified quadrilateral. + * + * \param dx0 x coordinate at the first vertex of the quadrilateral + * \param dy0 y coordinate at the first vertex of the quadrilateral + * \param dx1 x coordinate at the second vertex of the quadrilateral + * \param dy1 y coordinate at the second vertex of the quadrilateral + * \param dx2 x coordinate at the third vertex of the quadrilateral + * \param dy2 y coordinate at the third vertex of the quadrilateral + * \param dx3 x coordinate at the fourth vertex of the quadrilateral + * \param dy3 y coordinate at the fourth vertex of the quadrilateral + * \param sx x coordinate of the top left corner of the texture's rectangular area to be blitted + * \param sy y coordinate of the top left corner of the texture's rectangular area to be blitted + * \param sw width of the texture's rectangular area to be blitted + * \param sh height of the texture's rectangular area to be blitted + * \see nema_set_blend_blit() + * \see nema_blit_quad_fit() + * + */ +void nema_blit_subrect_quad_fit(float dx0, float dy0, + float dx1, float dy1, + float dx2, float dy2, + float dx3, float dy3, + int sx, int sy, + int sw, int sh); + +/** \brief Blit source texture to destination. Use the matrix provided by the user. + * + * \param dx0 x coordinate at the first vertex of the quadrilateral + * \param dy0 y coordinate at the first vertex of the quadrilateral + * \param dx1 x coordinate at the second vertex of the quadrilateral + * \param dy1 y coordinate at the second vertex of the quadrilateral + * \param dx2 x coordinate at the third vertex of the quadrilateral + * \param dy2 y coordinate at the third vertex of the quadrilateral + * \param dx3 x coordinate at the fourth vertex of the quadrilateral + * \param dy3 y coordinate at the fourth vertex of the quadrilateral + * \param m 3x3 matrix (screen coordinates to texture coordinates) + * \see nema_set_blend_blit() + * + */ +void nema_blit_quad_m(float dx0, float dy0, + float dx1, float dy1, + float dx2, float dy2, + float dx3, float dy3, nema_matrix3x3_t m); + + + + +/** \brief Enable breakpoints + * + * \see nema_brk_disable() + * + */ +void nema_brk_enable(void); + +/** \brief Disable breakpoints + * + * \see nema_brk_enable() + * + */ +void nema_brk_disable(void); + + +/** \brief Add a breakpoint to the current Command List + * + * \return Breakpoint ID + * + */ +int nema_brk_add(void); + +/** \brief Add a breakpoint to the current Command List + * + * \param brk_id Breakpoint ID to wait for. If zero (0), wait until next Breakpoint + * \return ID of reached Breakpoint + * + */ +int nema_brk_wait(int brk_id); + +/** \brief Instruct the GPU to resume execution + * + * + */ +void nema_brk_continue(void); + +/** \brief Enable external hold signals + * + * \param hold_id Hold signals to be enabled [0-3] + * \see nema_ext_hold_disable() + * + */ +void nema_ext_hold_enable(uint32_t hold_id); + +/** \brief Disable external hold signals + * + * \param hold_id Hold signals to be disabled [0-3] + * \see nema_ext_hold_enable() + * + */ +void nema_ext_hold_disable(uint32_t hold_id); + +/** \brief Enable Interrupt Request when GPU reaches hold point + * + * \param hold_id Hold signals' IRQ to be enabled [0-3] + * \see nema_ext_hold_disable() + * + */ +void nema_ext_hold_irq_enable(uint32_t hold_id); + +/** \brief Disable external hold signals + * + * \param hold_id Hold signals' IRQ to be disabled [0-3] + * \see nema_ext_hold_enable() + * + */ +void nema_ext_hold_irq_disable(uint32_t hold_id); + + +/** \brief Assert hold signals internally via a Command List + * + * \param hold_id Hold signal to be asserted + * \param stop If not zero, force Command List Processor to wait for FLAG to be deasserted + * \see nema_ext_hold_deassert() + * + */ +void nema_ext_hold_assert(uint32_t hold_id, int stop); + +/** \brief Dessert hold signals internally via a Command List + * + * \param hold_id Hold signal to be deasserted + * \see nema_ext_hold_assert() + * + */ +void nema_ext_hold_deassert(uint32_t hold_id); + +/** \brief Assert hold signals from the CPU (no Command List) + * + * \param hold_id Hold signal to be asserted + * \see nema_ext_hold_deassert() + * + */ +void nema_ext_hold_assert_imm(uint32_t hold_id); + +/** \brief Dessert hold signals from the CPU (no Command List) + * + * \param hold_id Hold signal to be deasserted + * \see nema_ext_hold_assert() + * + */ +void nema_ext_hold_deassert_imm(uint32_t hold_id); + +/** \brief Check for which architeture is the library compiled + * + * \return Returns string with the architecture name + * + */ +const char* nema_get_sw_device_name(void); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libs/nema_gfx/include/nema_hal.h b/libs/nema_gfx/include/nema_hal.h new file mode 100644 index 000000000..af2389844 --- /dev/null +++ b/libs/nema_gfx/include/nema_hal.h @@ -0,0 +1,218 @@ +/* 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_HAL_H__ +#define NEMA_HAL_H__ + +#include "nema_sys_defs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct nema_buffer_t_ { + int size; /**< Size of buffer */ + int fd; /**< File Descriptor of buffer */ + void *base_virt; /**< Virtual address of buffer */ + uintptr_t base_phys; /**< Physical address of buffer */ +} nema_buffer_t; + +/** \brief Initialize system. Implementor defined. Called in nema_init() + * + * \param void + * \return 0 if no errors occurred + * \see nema_init() + * + */ +int32_t nema_sys_init(void); + + +/** \brief Wait for interrupt from the GPU + * + * \param void + * \return 0 on success + * + */ +int nema_wait_irq(void); + +/** \brief Wait for a Command List to finish + * + * \param cl_id Command List ID + * \return 0 on success + * + */ +int nema_wait_irq_cl(int cl_id); + +/** \brief Wait for a Breakpoint + * + * \param cl_id Breakpoint ID + * \return 0 on success + * + */ +int nema_wait_irq_brk(int brk_id); + +/** \brief Read Hardware register + * + * \param reg Register to read + * \return Value read from the register + * \see nema_reg_write + * + */ +uint32_t nema_reg_read(uint32_t reg); + +/** \brief Write Hardware Register + * + * \param reg Register to write + * \param value Value to be written + * \return void() + * \see nema_reg_read() + * + */ +void nema_reg_write(uint32_t reg, uint32_t value); + +/** \brief Create memory buffer + * + * \param size Size of buffer in bytes + * \return nema_buffer_t struct + * + */ +nema_buffer_t nema_buffer_create(int size); + +/** \brief Create memory buffer at a specific pool + * + * \param pool ID of the desired memory pool + * \param size Size of buffer in bytes + * \return nema_buffer_t struct + * + */ +nema_buffer_t nema_buffer_create_pool(int pool, int size); + +/** \brief Maps buffer + * + * \param bo Pointer to buffer struct + * \return Virtual pointer of the buffer (same as in bo->base_virt) + * + */ +void *nema_buffer_map(nema_buffer_t *bo); + +/** \brief Unmaps buffer + * + * \param bo Pointer to buffer struct + * \return void + * + */ +void nema_buffer_unmap(nema_buffer_t *bo); + +/** \brief Destroy/deallocate buffer + * + * \param bo Pointer to buffer struct + * \return void + * + */ +void nema_buffer_destroy(nema_buffer_t *bo); + +/** \brief Get physical (GPU) base address of a given buffer + * + * \param bo Pointer to buffer struct + * \return Physical base address of a given buffer + * + */ +uintptr_t nema_buffer_phys(nema_buffer_t *bo); + +/** \brief Write-back buffer from cache to main memory + * + * \param bo Pointer to buffer struct + * \return void + * + */ +void nema_buffer_flush(nema_buffer_t * bo); + +/** \brief Allocate memory for CPU to use (typically, standard malloc() is called) + * + * \param size Size in bytes + * \return Pointer to allocated memory (virtual) + * \see nema_host_free() + * + */ +void *nema_host_malloc(size_t size); + +/** \brief Free memory previously allocated with nema_host_malloc() + * + * \param ptr Pointer to allocated memory (virtual) + * \return void + * \see nema_host_malloc() + * + */ +void nema_host_free(void *ptr ); + +/** \private */ +typedef struct nema_ringbuffer_t_ { + nema_buffer_t bo; + int offset; //number of 32-bit entries + int last_submission_id; +} nema_ringbuffer_t; + + +/** \brief Initialize Ring Buffer. Should be called from inside nema_sys_init(). + * This is a private function, the user should never call it. + * + * \param *rb Pointer to nema_ring_buffer_t struct + * \param reset Resets the Ring Buffer if non-zero + * \return Negative number on error + * \see nema_sys_init() + * + */ +/** \private */ +int nema_rb_init(nema_ringbuffer_t *rb, int reset); + +#define MUTEX_RB 0 +#define MUTEX_MALLOC 1 +#define MUTEX_FLUSH 2 +#define MUTEX_MAX 2 + +/** \brief Mutex Lock for multiple processes/threads + * + * \param MUTEX_RB or MUTEX_MALLOC + * \return int + * + */ +int nema_mutex_lock(int mutex_id); + +/** \brief Mutex Unlock for multiple processes/threads + * + * \param MUTEX_RB or MUTEX_MALLOC + * \return int + * + */ +int nema_mutex_unlock(int mutex_id); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libs/nema_gfx/include/nema_interpolators.h b/libs/nema_gfx/include/nema_interpolators.h new file mode 100644 index 000000000..f3058a41e --- /dev/null +++ b/libs/nema_gfx/include/nema_interpolators.h @@ -0,0 +1,122 @@ +/* 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_INTERPOLATORS_H_ +#define _NEMA_INTERPOLATORS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "nema_sys_defs.h" + +typedef struct _color_var_t { + float r; /**< Red */ + float g; /**< Green */ + float b; /**< Blue */ + float a; /**< Alpha */ +} color_var_t; + +/** \brief Interpolate color gradient for rectangle + * + * \param x0 x coordinate of the upper left vertex of the rectangle + * \param y0 y coordinate at the upper left vertex of the rectangle + * \param w width of the rectangle + * \param h height of the rectangle + * \param col0 color for the first vertex + * \param col1 color for the second vertex + * \param col1 color for the third vertex + * + */ +void nema_interpolate_rect_colors(int x0, int y0, int w, int h, color_var_t* col0, color_var_t* col1, color_var_t* col2); + + +/** \brief Interpolate color gradient for triangle + * + * \details The upper left vertex of the triangle to be drawn + * must be in the vertex arguments as well. In addition, if + * clipping is applied for rendering a triangle with gradient, + * the upper left vertex must be within the clipping area. + * \param x0 x coordinate at the first vertex of the triangle + * \param y0 y coordinate at the first vertex of the triangle + * \param x1 x coordinate at the second vertex of the triangle + * \param y1 y coordinate at the second vertex of the triangle + * \param x2 x coordinate at the third vertex of the triangle + * \param y2 y coordinate at the third vertex of the triangle + * \param col0 color for the first vertex + * \param col1 color for the second vertex + * \param col1 color for the third vertex + * + */ +void nema_interpolate_tri_colors(float x0, float y0, float x1, float y1, float x2, float y2, color_var_t* col0, color_var_t* col1, color_var_t* col2); + +/** \brief Interpolate depth buffer values for triangle + * + * \param x0 x coordinate at the first vertex of the triangle + * \param y0 y coordinate at the first vertex of the triangle + * \param z0 z coordinate at the first vertex of the triangle + * \param x1 x coordinate at the second vertex of the triangle + * \param y1 y coordinate at the second vertex of the triangle + * \param z1 z coordinate at the second vertex of the triangle + * \param x2 x coordinate at the third vertex of the triangle + * \param y2 y coordinate at the third vertex of the triangle + * \param z2 z coordinate at the third vertex of the triangle + * + */ +void nema_interpolate_tri_depth(float x0, float y0, float z0, float x1, float y1, float z1, float x2, float y2, float z2); + +/** \brief Interpolate texture values for triangle + * + * \param x0 x coordinate at the first vertex of the triangle + * \param y0 y coordinate at the first vertex of the triangle + * \param w0 w coordinate at the first vertex of the triangle + * \param tx0 x texture coordinate at the first vertex of the triangle + * \param ty0 y texture coordinate at the first vertex of the triangle + * \param x1 x coordinate at the second vertex of the triangle + * \param y1 y coordinate at the second vertex of the triangle + * \param w1 w coordinate at the second vertex of the triangle + * \param tx1 x texture coordinate at the second vertex of the triangle + * \param ty1 y texture coordinate at the second vertex of the triangle + * \param x2 x coordinate at the third vertex of the triangle + * \param y2 y coordinate at the third vertex of the triangle + * \param w2 w coordinate at the third vertex of the triangle + * \param tx2 x texture coordinate at the third vertex of the triangle + * \param ty2 x texture coordinate at the third vertex of the triangle + * \param tex_width texture width + * \param tex_height texture height + * + */ +void nema_interpolate_tx_ty(float x0, float y0, float w0, float tx0, float ty0, + float x1, float y1, float w1, float tx1, float ty1, + float x2, float y2, float w2, float tx2, float ty2, + int tex_width, int tex_height ); +#ifdef __cplusplus +} +#endif + +#endif // _NEMA_INTERPOLATORS_H_ diff --git a/libs/nema_gfx/include/nema_math.h b/libs/nema_gfx/include/nema_math.h new file mode 100644 index 000000000..abc3d4ce4 --- /dev/null +++ b/libs/nema_gfx/include/nema_math.h @@ -0,0 +1,278 @@ +/* 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_MATH_H__ +#define NEMA_MATH_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define NEMA_E 2.71828182845904523536f /**< e */ +#define NEMA_LOG2E 1.44269504088896340736f /**< log2(e) */ +#define NEMA_LOG10E 0.434294481903251827651f /**< log10(e) */ +#define NEMA_LN2 0.693147180559945309417f /**< ln(2) */ +#define NEMA_LN10 2.30258509299404568402f /**< ln(10) */ +#define NEMA_PI 3.14159265358979323846f /**< pi */ +#define NEMA_PI_2 1.57079632679489661923f /**< pi/2 */ +#define NEMA_PI_4 0.785398163397448309616f /**< pi/4 */ +#define NEMA_1_PI 0.318309886183790671538f /**< 1/pi */ +#define NEMA_2_PI 0.636619772367581343076f /**< 2/pi */ +#define NEMA_2_SQRTPI 1.12837916709551257390f /**< 2/sqrt(pi) */ +#define NEMA_SQRT2 1.41421356237309504880f /**< sqrt(2) */ +#define NEMA_SQRT1_2 0.707106781186547524401f /**< 1/sqrt(2) */ + +/** \brief Fast sine approximation of a given angle + * + * \param angle_degrees Angle in degrees + * \return Sine of the given angle + * + */ +float nema_sin(float angle_degrees); + + +/** \brief Fast cosine approximation of a given angle + * + * \param angle_degrees Angle in degrees + * \return Cosine of the given angle + * + */ +float nema_cos(float angle_degrees); + +/** \brief Fast tangent approximation of a given angle + * + * \param angle_degrees Angle in degrees + * \return Tangent of the given angle + * + */ +float nema_tan(float angle_degrees); + + +/** \brief Fast sine approximation of a given angle + * + * \param angle_radians Angle in radians + * \return Sine of the given angle + * + */ +float nema_sin_r(float angle_radians); + + +/** \brief Fast cosine approximation of a given angle + * + * \param angle_radians Angle in radians + * \return Cosine of the given angle + * + */ +float nema_cos_r(float angle_radians); + +/** \brief Fast tangent approximation of a given angle + * + * \param angle_radians Angle in radians + * \return Tangent of the given angle + * + */ +float nema_tan_r(float angle_radians); + +/** \brief Fast arc tangent approximation of a y/x + * + * \param y value + * \param x value + * \return Arc tangent of the given y/x in degrees + * + */ +float nema_atan2(float y, float x); + +/** \brief Fast arc tangent approximation of a y/x + * + * \param y value + * \param x value + * \return Arc tangent of the given y/x in radians + * + */ +float nema_atan2_r(float y, float x); + +/** \brief A rough approximation of x raised to the power of y. USE WITH CAUTION! + * + * \param x base value. Must be non negative. + * \param y power value + * \return the result of raising x to the power y + * + */ +float nema_pow(float x, float y); + +/** \brief A rough approximation of the square root of x. USE WITH CAUTION! + * + * \param x X value. Must be non negative + * \param + * \return The square root of x + * + */ +float nema_sqrt(float x); + + +/** \brief A floating-point approximation of the inverse tangent of x + * + * \param x X value + * \return Inverse tangent (angle) of x in degrees + * + */ +float nema_atan(float x); + +/** \brief Find the minimum of two values + * + * \param a First value + * \param b Second value + * \return The minimum of a and b + * + */ +#define nema_min2(a,b) (((a)<(b))?( a):(b)) + +/** \brief Find the maximum of two values + * + * \param a First value + * \param b Second value + * \return The maximum of a and b + * + */ +#define nema_max2(a,b) (((a)>(b))?( a):(b)) + +/** \brief Clamp value + * + * \param val Value to clamp + * \param min Minimum value + * \param max Minimum value + * \return Clamped value + * + */ +#define nema_clamp(val, min, max) nema_min2((max), nema_max2((min), (val))) + +/** \brief Calculate the absolute value of int + * + * \param a Value + * \return The absolute value of a + * + */ +#define nema_abs(a) (((a)< 0 )?(-(a)):(a)) + +/** \brief Calculate the absolute value of float + * + * \param a Value + * \return The absolute value of a + * + */ +#define nema_absf(a) (((a)< 0.f )?(-(a)):(a)) + + +/** \brief Compare two floats + * + * \param x First float + * \param y Second float + * \return 1 if x == y, 0 if x != y + * + */ +#define nema_floats_equal(x, y) (nema_absf((x) - (y)) <= 0.00001f * nema_min2(nema_absf(x), nema_absf(y))) + +/** \brief Checks if value x is zero + * + * \param x X value + * \return 1 if x == 0, 0 if x != 0 + * + */ +#define nema_float_is_zero(x) (nema_absf(x) <= 0.00001f) + +/** \brief Convert degrees to radians + * + * \param d Angle in degrees + * \return Angle in radians + * + */ +#define nema_deg_to_rad(d) (0.0174532925199f * (d)) //rad = deg * pi / 180 + +/** \brief Convert radians to degries + * + * \param r Angle in radians + * \return Angle in degrees + * + */ +#define nema_rad_to_deg(r) (57.295779513f * (r)) //deg = rad * 180 / pi + +/** \brief Convert integer to 16.16 fixed point + * + * \param a Value to be converted + * \return 16.16 fixed point value + * + */ +#define nema_i2fx(a) ((a)*0x10000) + +/** \brief Convert float to 16.16 fixed point + * + * \param a Value to be converted + * \return 16.16 fixed point value + * + */ +// #define nema_f2fx(a) ((int)(((a)*((float)0x10000)+0.5f))) +int nema_f2fx(float f); // ((int)(((a)*((float)0x10000)+0.5f))) + +/** \brief Floor function + * + * \param a Value to be floored + * \return floored value + * + */ +#define nema_floor(f) ((int)(f) - ( (int)(f) > (f) )) + +/** \brief Ceiling function + * + * \param a Value to be ceiled + * \return ceiled value + * + */ +#define nema_ceil(f) ((int)(f) + ( (int)(f) < (f) )) + +/** \brief Truncate function + * + * \param x Value to be truncated + * \return truncated value + * + */ +#define nema_truncf(x) (x < 0.0f ? nema_ceil(x) : nema_floor(x)) + +/** \brief Float Modulo function + * + * \param x Dividend + * \param y Divisor + * \return Remainder + * + */ +#define nema_fmod(x, y) (x - nema_truncf(x / y) * y) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libs/nema_gfx/include/nema_matrix3x3.h b/libs/nema_gfx/include/nema_matrix3x3.h new file mode 100644 index 000000000..7686065b2 --- /dev/null +++ b/libs/nema_gfx/include/nema_matrix3x3.h @@ -0,0 +1,230 @@ +/* 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_MATRIX3X3_H__ +#define NEMA_MATRIX3X3_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef float nema_matrix3x3_t[3][3]; + + +/** \brief Load Identity Matrix + * + * \param m Matrix to be loaded + * + */ +void nema_mat3x3_load_identity(nema_matrix3x3_t m); + + +/** \brief Copy matrix _m to matrix m + * + * \param m Destination matrix + * \param m Source matrix + * + */ +void +nema_mat3x3_copy(nema_matrix3x3_t m, nema_matrix3x3_t _m); + +/** \brief Apply translate transformation + * + * \param m Matrix to apply transformation + * \param tx X translation factor + * \param ty Y translation factor + * + */ +void nema_mat3x3_translate (nema_matrix3x3_t m, float tx, float ty); + +/** \brief Apply scale transformation + * + * \param m Matrix to apply transformation + * \param sx X scaling factor + * \param sy Y scaling factor + * + */ +void nema_mat3x3_scale (nema_matrix3x3_t m, float sx, float sy); + +/** \brief Apply shear transformation + * + * \param m Matrix to apply transformation + * \param shx X shearing factor + * \param shy Y shearing factor + * + */ +void nema_mat3x3_shear (nema_matrix3x3_t m, float shx, float shy); + +/** \brief Apply mirror transformation + * + * \param m Matrix to apply transformation + * \param mx if non-zero, mirror horizontally + * \param my if non-zero, mirror vertically + * + */ +void nema_mat3x3_mirror (nema_matrix3x3_t m, int mx, int my); + +/** \brief Apply rotation transformation + * + * \param m Matrix to apply transformation + * \param angle_degrees Angle to rotate in degrees + * + */ +void nema_mat3x3_rotate (nema_matrix3x3_t m, float angle_degrees); + +/** \brief Apply rotation transformation + * + * \param m Matrix to apply transformation + * \param cosa Cos of angle to rotate + * \param sina Sin of angle to rotate + * + */ +void +nema_mat3x3_rotate2(nema_matrix3x3_t m, float cosa, float sina); + + +/** \brief Multiply two 3x3 matrices ( m = m*_m) + * + * \param m left matrix, will be overwritten by the result + * \param _m right matrix + * + */ +void nema_mat3x3_mul(nema_matrix3x3_t m, nema_matrix3x3_t _m); + +/** \brief Multiply vector with matrix + * + * \param m Matrix to multiply with + * \param x Vector x coefficient + * \param y Vector y coefficient + * + */ +void nema_mat3x3_mul_vec(nema_matrix3x3_t m, float *x, float *y); + +/** \brief Multiply vector with affine matrix + * + * \param m Matrix to multiply with + * \param x Vector x coefficient + * \param y Vector y coefficient + * + */ +void nema_mat3x3_mul_vec_affine(nema_matrix3x3_t m, float *x, float *y); + +/** \brief Calculate adjoint + * + * \param m Matrix + * + */ +void nema_mat3x3_adj(nema_matrix3x3_t m); + + +/** \brief Divide matrix with scalar value + * + * \param m Matrix to divide + * \param s scalar value + * + */ +void nema_mat3x3_div_scalar(nema_matrix3x3_t m, float s); + +/** \brief Invert matrix + * + * \param m Matrix to invert + * + */ +int nema_mat3x3_invert(nema_matrix3x3_t m); + +/** \private */ +int nema_mat3x3_square_to_quad(float dx0, float dy0, + float dx1, float dy1, + float dx2, float dy2, + float dx3, float dy3, + nema_matrix3x3_t m); + +/** \brief Map rectangle to quadrilateral + * + * \param width Rectangle width + * \param height Rectangle height + * \param sx0 x coordinate at the first vertex of the quadrilateral + * \param sy0 y coordinate at the first vertex of the quadrilateral + * \param sx1 x coordinate at the second vertex of the quadrilateral + * \param sy1 y coordinate at the second vertex of the quadrilateral + * \param sx2 x coordinate at the third vertex of the quadrilateral + * \param sy2 y coordinate at the third vertex of the quadrilateral + * \param sx3 x coordinate at the fourth vertex of the quadrilateral + * \param sy3 y coordinate at the fourth vertex of the quadrilateral + * \param m Mapping matrix + * + */ +int nema_mat3x3_quad_to_rect(int width, int height, + float sx0, float sy0, + float sx1, float sy1, + float sx2, float sy2, + float sx3, float sy3, + nema_matrix3x3_t m); + +/** \brief Apply rotation around a pivot point + * + * \param m Matrix to apply transformation + * \param angle_degrees Angle to rotate in degrees + * \param x X coordinate of the pivot point + * \param y Y coordinate of the pivot point + * + */ +void nema_mat3x3_rotate_pivot(nema_matrix3x3_t m, float angle_degrees, + float x, float y); + +/** \brief Apply scale and then rotation around a pivot point + * + * \param m Matrix to apply transformation +* \param sx X scaling factor + * \param sy Y scaling factor + * \param angle_degrees Angle to rotate in degrees + * \param x X coordinate of the pivot point + * \param y Y coordinate of the pivot point + * + */ +void nema_mat3x3_scale_rotate_pivot(nema_matrix3x3_t m, + float sx, float sy, + float angle_degrees, float x, float y); + + +/** \brief Copy matrix _m to matrix m + * + * \param m Destination matrix + * \param m Source matrix + * + */ + +void +nema_mat3x3_copy(nema_matrix3x3_t m, nema_matrix3x3_t _m); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libs/nema_gfx/include/nema_matrix4x4.h b/libs/nema_gfx/include/nema_matrix4x4.h new file mode 100644 index 000000000..2b968a6b1 --- /dev/null +++ b/libs/nema_gfx/include/nema_matrix4x4.h @@ -0,0 +1,232 @@ +/* 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_MATRIX4X4_H__ +#define NEMA_MATRIX4X4_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef float nema_matrix4x4_t[4][4]; + + +/** \brief Load a 4x4 Identity Matrix + * + * \param m Matrix to be loaded + * + */ +void nema_mat4x4_load_identity(nema_matrix4x4_t m); + +/** \brief Multiply two 4x4 matrices + * + * \param m Result Matrix + * \param m_l Left operand + * \param m_r Right operand + * + */ +void nema_mat4x4_mul(nema_matrix4x4_t m, + nema_matrix4x4_t m_l, + nema_matrix4x4_t m_r); + + +void nema_mat4x4_copy(nema_matrix4x4_t m_l, + nema_matrix4x4_t m_r); + +/** \brief Multiply a 4x1 vector with a 4x4 matrix + * + * \param m Matrix to be multiplied + * \param x Vector first element + * \param y Vector second element + * \param z Vector third element + * \param w Vector forth element + * + */ +void nema_mat4x4_mul_vec(nema_matrix4x4_t m, float *x, float *y, float *z, float *w); + +// ------------------------------------------------------------------------------------ +// Object Transformation - ModelView Matrix +// Object Coordinates to Eye Coordinates +// ------------------------------------------------------------------------------------ + +/** \brief Apply translate transformation + * + * \param m Matrix to apply transformation + * \param tx X translation factor + * \param ty Y translation factor + * \param tz Z translation factor + * + */ +void nema_mat4x4_translate(nema_matrix4x4_t m, float tx, float ty, float tz); + +/** \brief Apply scale transformation + * + * \param m Matrix to apply transformation + * \param sx X scaling factor + * \param sy Y scaling factor + * \param sz Z scaling factor + * + */ +void nema_mat4x4_scale(nema_matrix4x4_t m, float sx, float sy, float sz); + +/** \brief Apply rotate transformation around X axis + * + * \param m Matrix to apply transformation + * \param angle_degrees Angle to rotate in degrees + * + */ +void nema_mat4x4_rotate_X (nema_matrix4x4_t m, float angle_degrees); + +/** \brief Apply rotate transformation around Y axis + * + * \param m Matrix to apply transformation + * \param angle_degrees Angle to rotate in degrees + * + */ +void nema_mat4x4_rotate_Y (nema_matrix4x4_t m, float angle_degrees); + +/** \brief Apply rotate transformation around Z axis + * + * \param m Matrix to apply transformation + * \param angle_degrees Angle to rotate in degrees + * + */ +void nema_mat4x4_rotate_Z (nema_matrix4x4_t m, float angle_degrees); + +// ------------------------------------------------------------------------------------ +// Scene Transformation/Frustum - Projection Matrix +// Eye Coordinates to Clip Coordinates +// ------------------------------------------------------------------------------------ + +/** \brief Set up a perspective projection matrix + * + * \param m A 4x4 Matrix + * \param fovy_degrees Field of View in degrees + * \param aspect Aspect ratio that determines the field of view in the x direction. + * \param nearVal Distance from the viewer to the near clipping plane (always positive) + * \param farVal Distance from the viewer to the far clipping plane (always positive) + * + */ +void nema_mat4x4_load_perspective(nema_matrix4x4_t m, float fovy_degrees, float aspect, + float nearVal, float farVal); + + +/** \brief Set up a Right Hand perspective projection matrix + * + * \param m A 4x4 Matrix + * \param fovy_degrees Field of View in degrees + * \param aspect Aspect ratio that determines the field of view in the x direction. + * \param nearVal Distance from the viewer to the near clipping plane (always positive) + * \param farVal Distance from the viewer to the far clipping plane (always positive) + * + */ +void nema_mat4x4_load_perspective_rh(nema_matrix4x4_t m, float fovy_degrees, float aspect, + float nearVal, float farVal); + +/** \brief Set up an orthographic projection matrix + * + * \param m A 4x4 Matrix + * \param left Left vertical clipping plane + * \param right Right vertical clipping plane + * \param bottom bottom horizontal clipping plane + * \param top Top horizontal clipping plane + * \param nearVal Distance from the viewer to the near clipping plane (always positive) + * \param farVal Distance from the viewer to the far clipping plane (always positive) + * + */ +void nema_mat4x4_load_ortho(nema_matrix4x4_t m, + float left, float right, + float bottom, float top, + float nearVal, float farVal); + +/** \brief Set up a 2D orthographic projection matrix + * + * \param m A 4x4 Matrix + * \param left Left vertical clipping plane + * \param right Right vertical clipping plane + * \param bottom bottom horizontal clipping plane + * \param top Top horizontal clipping plane + * + */ +void nema_mat4x4_load_ortho_2d(nema_matrix4x4_t m, + float left, float right, + float bottom, float top); + +/** \brief Set up a Right Hand view matrix. + * + * \param m A 4x4 Matrix + * \param eye_x Eye position x. + * \param eye_y Eye position y. + * \param eye_z Eye position z. + * \param center_x Center x to look at + * \param center_y Center y to look at + * \param center_z Center z to look at + * \param up_x Up vector x. (Usually 0) + * \param up_y Up vector y. (Usually 1) + * \param up_z Up vector z. (Usually 0) + * + */ +void nema_mat4x4_look_at_rh(nema_matrix4x4_t m, + float eye_x, float eye_y, float eye_z, + float center_x, float center_y, float center_z, + float up_x, float up_y, float up_z); + +// ------------------------------------------------------------------------------------ +// Clip Coordinates to Window Coordinates +// ------------------------------------------------------------------------------------ + +/** \brief Convenience Function to calculate window coordinates from object coordinates + * + * \param mvp Model, View and Projection Matrix + * \param x_orig Window top left X coordinate + * \param y_orig Window top left Y coordinate + * \param width Window width + * \param height Window height + * \param nearVal Distance from the viewer to the near clipping plane (always positive) + * \param farVal Distance from the viewer to the far clipping plane (always positive) + * \param x X object coordinate + * \param y Y object coordinate + * \param z Z object coordinate + * \param w W object coordinate + * \return 1 if vertex is outside frustum (should be clipped) + * + */ +int nema_mat4x4_obj_to_win_coords(nema_matrix4x4_t mvp, + float x_orig, float y_orig, + int width, int height, + float nearVal, float farVal, + float *x, + float *y, + float *z, + float *w); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libs/nema_gfx/include/nema_provisional.h b/libs/nema_gfx/include/nema_provisional.h new file mode 100644 index 000000000..0ad05f331 --- /dev/null +++ b/libs/nema_gfx/include/nema_provisional.h @@ -0,0 +1,124 @@ +/* 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_PROVISIONAL_H__ +#define NEMA_PROVISIONAL_H__ + +#include "nema_sys_defs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** \brief Fill a triangle strip with color (float coordinates) + * + * \param vertices pointer to vertices coordinated (first x coordinate of vertex, + * then y coordinate of vertex) + * \param num_vertices number of vertices + * \param stride Distance between two vertices + * \param rgba8888 Color to be used + * + */ +void nema_fill_triangle_strip_f(float* vertices, int num_vertices, int stride, uint32_t rgba8888); + +/** \brief Fill a traingle fan with color (float coordinates) + * + * \param vertices pointer to vertices coordinated (first x coordinate of vertex, + * then y coordinate of vertex) + * \param num_vertices number of vertices + * \param stride Distance between two vertices + * \param rgba8888 Color to be used + * + */ +void nema_fill_triangle_fan_f(float* vertices, int num_vertices, int stride, uint32_t rgba8888); + +/** \brief Draws a triangle with specific border width. Apply AA if available. + * Degenerated triangles have undefined behavior. + * + * \param x0 x coordinate at the first vertex of the triangle + * \param y0 y coordinate at the first vertex of the triangle + * \param x1 x coordinate at the second vertex of the triangle + * \param y1 y coordinate at the second vertex of the triangle + * \param x2 x coordinate at the third vertex of the triangle + * \param y2 y coordinate at the third vertex of the triangle + * \param border_width triangle's border width + * \param color color of the triangle + * + */ +void nema_draw_triangle_aa(float x0, float y0, float x1, float y1, float x2, float y2, + float border_width, uint32_t color); + + +/** \brief Draw a colored rectangle with rounded edges and specific border width. Apply AA if available. + * + * \param x x coordinate of the upper left vertex of the rectangle + * \param y y coordinate at the upper left vertex of the rectangle + * \param w width of the rectangle + * \param h height of the rectangle + * \param r corner radius + * \param border_width border width + * \param rgba8888 rgba color of the rounded rectangle + * + */ +void nema_draw_rounded_rect_aa(float x, float y, float w, float h, float r, float border_width, uint32_t rgba8888); + + +/** \brief Draw a filled colored rectangle with rounded edges and specific border width. Apply AA if available. + * + * \param x x coordinate of the upper left vertex of the rectangle + * \param y y coordinate at the upper left vertex of the rectangle + * \param w width of the rectangle + * \param h height of the rectangle + * \param r corner radius + * \param rgba8888 rgba color of the rounded rectangle + * + */ +void nema_fill_rounded_rect_aa(float x, float y, float w, float h, float r, uint32_t rgba8888); + +/** \brief Draws a quadrilateral with specific border width. Apply AA if available. + * Only Convex quadrilaterals are supported. + * + * \param x0 x coordinate at the first vertex of the quadrilateral + * \param y0 y coordinate at the first vertex of the quadrilateral + * \param x1 x coordinate at the second vertex of the quadrilateral + * \param y1 y coordinate at the second vertex of the quadrilateral + * \param x2 x coordinate at the third vertex of the quadrilateral + * \param y2 y coordinate at the third vertex of the quadrilateral + * \param x3 x coordinate at the fourth vertex of the quadrilateral + * \param y3 y coordinate at the fourth vertex of the quadrilateral + * \param border_width trianquadrilateralgle's border width + * \param color color of the quadrilateral + * + */ +void nema_draw_quad_aa(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, + float border_width, uint32_t color); +#ifdef __cplusplus +} +#endif + +#endif // NEMA_PROVISIONAL_H__ diff --git a/libs/nema_gfx/include/nema_raster.h b/libs/nema_gfx/include/nema_raster.h new file mode 100644 index 000000000..c8cfa2f0a --- /dev/null +++ b/libs/nema_gfx/include/nema_raster.h @@ -0,0 +1,107 @@ +/* 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_RASTER_H__ +#define NEMA_RASTER_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** \private */ +void nema_set_raster_color(uint32_t rgba8888); + +/** \private */ +void nema_raster_pixel(int x, int y); + +/** \private */ +void nema_raster_line(int x0, int y0, int x1, int y1); + +/** \private */ +void nema_raster_triangle_fx(int x0fx, int y0fx, int x1fx, int y1fx, int x2fx, int y2fx); + + +/** \private */ +void nema_raster_rect(int x, int y, int w, int h); + +/** \private */ +void nema_raster_rounded_rect(int x0, int y0, int w, int h, int r); + + +/** \private */ +void nema_raster_quad_fx(int x0fx, int y0fx, + int x1fx, int y1fx, int x2fx, int y2fx, int x3fx, int y3fx); + +/** \private */ +void nema_raster_triangle (int x0, int y0, int x1, int y1, int x2, int y2); + +/** \private */ +void nema_raster_quad (int x0,int y0,int x1,int y1,int x2,int y2,int x3,int y3); + +/** \private */ +void nema_raster_circle_aa(float x, float y, float r); + +/** \private */ +void nema_raster_stroked_circle_aa(float x, float y, float r, float w); + +/** \private */ +void nema_raster_rect_fx(int xfx, int yfx, int wfx, int hfx); + +/** \private */ +void nema_raster_rect_f(float x, float y, float w, float h); + +/** \private */ +void +nema_raster_triangle_f(float x0, float y0, float x1, float y1, float x2, float y2); + +/** \private */ +void +nema_raster_triangle_p0_f(float x0, float y0); + +/** \private */ +void +nema_raster_triangle_p1_f(float x1, float y1); + +/** \private */ +void +nema_raster_triangle_p2_f(float x2, float y2); + +/** \private */ +void +nema_raster_quad_f(float x0, float y0, float x1, float y1, + float x2, float y2, float x3, float y3); + +/** \private */ +void +nema_raster_stroked_arc_aa( float x0, float y0, float r, float w, float start_angle, float end_angle); + +#ifdef __cplusplus +} +#endif + +#endif //NEMA_RASTER_H__ diff --git a/libs/nema_gfx/include/nema_sys_defs.h b/libs/nema_gfx/include/nema_sys_defs.h new file mode 100644 index 000000000..17174fbcd --- /dev/null +++ b/libs/nema_gfx/include/nema_sys_defs.h @@ -0,0 +1,58 @@ +/** + ****************************************************************************** + * @file nema_sys_defs.h + * @author MCD Application Team + * @brief Header file of NemaGFX System Definitions for STM32 Platforms. + * This file provides definition of types being used by the NemaGFX + * library. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef NEMA_SYS_DEFS_H__ +#define NEMA_SYS_DEFS_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Includes ------------------------------------------------------------------*/ +#include +#include +#include +#include + +/* Temporarily added by ST */ +#ifdef __ICCARM__ +#define FORCE_INLINE _Pragma("inline = forced") +#else +#define FORCE_INLINE +#endif + +/* No Multi-Thread support */ +#define TLS_VAR + +#ifdef NEMA_VG_INVALIDATE_CACHE +void platform_disable_cache(void); +void platform_invalidate_cache(void); + +#define NEMA_VG_DISABLE_CACHE platform_disable_cache() +#define NEMA_VG_ENABLE_INVALIDATE_CACHE platform_invalidate_cache() +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* NEMA_SYS_DEFS_H__ */ diff --git a/libs/nema_gfx/include/nema_transitions.h b/libs/nema_gfx/include/nema_transitions.h new file mode 100644 index 000000000..c8fd3f254 --- /dev/null +++ b/libs/nema_gfx/include/nema_transitions.h @@ -0,0 +1,210 @@ +/* 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_TRANSITIONS_H__ +#define NEMA_TRANSITIONS_H__ + +#include "nema_blender.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + NEMA_TRANS_LINEAR_H, + NEMA_TRANS_CUBE_H, + NEMA_TRANS_INNERCUBE_H, + NEMA_TRANS_STACK_H, + NEMA_TRANS_LINEAR_V, + NEMA_TRANS_CUBE_V, + NEMA_TRANS_INNERCUBE_V, + NEMA_TRANS_STACK_V, + NEMA_TRANS_FADE, + NEMA_TRANS_FADE_ZOOM, + NEMA_TRANS_MAX, + NEMA_TRANS_NONE, +} nema_transition_t; + +/** \brief Transition from 'initial' texture to 'final' texture. The transition is complete when 'step' is 0 or 1 + * + * \param effect Transition effect + * \param initial Initial texture + * \param final Final texture + * \param blending_mode Blending mode + * \param step Transition step within [0.f , 1.f] range + * \param width Texture width + * \param height Texture height + * + */ +void nema_transition(nema_transition_t effect, nema_tex_t initial, nema_tex_t final, + uint32_t blending_mode, float step, int width, int height); + + +/** \brief Linear transition horizontally. When 'step' changes from zero to one, textures move from right to left, +otherwise textures move from left to right. The transition is complete when 'step' is 0 or 1. + * + * \param left Texture on the left side + * \param right Texture on the right side + * \param blending_mode Blending mode + * \param step Current step within [0.f , 1.f] range + * \param width Texture width + * + */ +void nema_transition_linear_hor(nema_tex_t left, nema_tex_t right, + uint32_t blending_mode, float step, int width); + +/** \brief Linear transition vertically. When 'step' changes from zero to one, textures move from top to bottom, +otherwise textures move from bottom to top. The transition is complete when 'step' is 0 or 1. + * + * \param up Texture on the top side + * \param down Texture on the bottom side + * \param blending_mode Blending mode + * \param step Current step within [0.f , 1.f] range + * \param height Texture height + * + */ +void nema_transition_linear_ver(nema_tex_t up, nema_tex_t down, + uint32_t blending_mode, float step, int height); + +/** \brief Cubic (textures are mapped on the external faces of a cube) transition horizontally. When 'step' changes from zero to one, textures move from left to right, +otherwise textures move from right to left. The transition is complete when 'step' is 0 or 1. + * + * \param left Texture on the left side + * \param right Texture on the right side + * \param blending_mode Blending mode + * \param step Current step within [0.f , 1.f] range + * \param width Texture width + * \param height Texture height + * + */ +void nema_transition_cube_hor(nema_tex_t left, nema_tex_t right, + uint32_t blending_mode, float step, int width, int height); + +/** \brief Cube (textures are mapped on the external faces of a cube) transition vertically. When 'step' changes from zero to one, textures move from top to bottom, +otherwise textures move from bottom to top. The transition is complete when 'step' is 0 or 1. + * + * \param up Texture on the top side + * \param down Texture on the bottom side + * \param blending_mode Blending mode + * \param step Current step within [0.f , 1.f] range + * \param width Texture width + * \param height Texture height + * + */ +void nema_transition_cube_ver(nema_tex_t up, nema_tex_t down, + uint32_t blending_mode, float step, int width, int height); + +/** \brief Inner Cube (textures are mapped on the internal faces of a cube) transition horizontally. When 'step' changes from zero to one, textures move from left to right, +otherwise textures move from right to left. The transition is complete when 'step' is 0 or 1. + * + * \param left Texture on the left side + * \param right Texture on the right side + * \param blending_mode Blending mode + * \param step Current step within [0.f , 1.f] range + * \param width Texture width + * \param height Texture height + * + */ +void nema_transition_innercube_hor(nema_tex_t left, nema_tex_t right, + uint32_t blending_mode, float step, int width, int height); + +/** \brief Inner Cube (textures are mapped on the internal faces of a cube) transition vertically. When 'step' changes from zero to one, textures move from top to bottom, +otherwise textures move from bottom to top. The transition The transition is complete when 'step' is 0 or 1. + * + * \param up Texture on the top side + * \param down Texture on the bottom side + * \param blending_mode Blending mode + * \param step Current step within [0.f , 1.f] range + * \param width Texture width + * \param height Texture height + * + */ +void nema_transition_innercube_ver(nema_tex_t up, nema_tex_t down, + uint32_t blending_mode, float step, int width, int height); + +/** \brief Stack transition horizontally. When 'step' changes from zero to one, textures move from left to right, +otherwise textures move from right to left. The transition is complete when 'step' is 0 or 1. + * + * \param up Texture on the top side + * \param down Texture on the bottom side + * \param blending_mode Blending mode + * \param step Current step within [0.f , 1.f] range + * \param width Texture width + * \param height Texture height + * + */ +void nema_transition_stack_hor(nema_tex_t left, nema_tex_t right, float step, + int width, int height); + +/** \brief Stack transition vertically. When 'step' moves from zero to one, textures move from top to bottom, +otherwise textures move from bottom to top. The transition is complete when 'step' is 0 or 1. + * + * \param up Texture on the top side + * \param down Texture on the bottom side + * \param blending_mode Blending mode + * \param step Current step within [0.f , 1.f] range + * \param width Texture width + * \param height Texture height + * + */ +void nema_transition_stack_ver(nema_tex_t up, nema_tex_t down, float step, + int width, int height); + +/** \brief Fade transition. Initial texture is being faded out, while final texture is being faded in. +The transition is complete when 'step' is 0 or 1. + * + * \param left Texture on the left side + * \param right Texture on the right side + * \param blending_mode Blending mode + * \param step Current step within [0.f , 1.f] range + * \param width Texture width + * \param height Texture height + * + */ +void nema_transition_fade(nema_tex_t initial, nema_tex_t final, + uint32_t blending_mode, float step, int width, int height); + +/** \brief Fade-zoom transition. Initial texture is being zoomed and faded out, while final texture is being zoomed and faded in. +The transition is complete when 'step' is 0 or 1. + * + * \param initial Initial texture + * \param final Final texture + * \param blending_mode Blending mode + * \param step Current step within [0.f , 1.f] range + * \param width Texture width + * \param height Texture height + * + */ +void nema_transition_fade_zoom(nema_tex_t initial, nema_tex_t final, + uint32_t blending_mode, float step, int width, int height); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libs/nema_gfx/include/nema_utils.h b/libs/nema_gfx/include/nema_utils.h new file mode 100644 index 000000000..0bff05a91 --- /dev/null +++ b/libs/nema_gfx/include/nema_utils.h @@ -0,0 +1,50 @@ +/* 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_UTILS_H_ +#define NEMA_UTILS_H_ + +#include "nema_hal.h" + +#ifdef __cplusplus +extern "C" { +#endif + +float nema_get_time(void); +float nema_get_wall_time(void); +nema_buffer_t nema_load_file(const char *filename, int length, void *buffer); +int nema_save_file(const char *filename, int length, void *buffer); +unsigned int nema_rand(void); +void nema_calculate_fps(void); +void * nema_memcpy ( void * destination, const void * source, size_t num ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libs/nema_gfx/include/nema_vg.h b/libs/nema_gfx/include/nema_vg.h new file mode 100644 index 000000000..068559f3e --- /dev/null +++ b/libs/nema_gfx/include/nema_vg.h @@ -0,0 +1,218 @@ +/* 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. + ******************************************************************************/ + +/** + * @file + * @brief Core NemaVG API drawing and initialization functions. + * + */ + +#ifndef __NEMA_VG_H__ +#define __NEMA_VG_H__ + +#include "nema_core.h" +#include "nema_sys_defs.h" +#include "nema_vg_path.h" +#include "nema_vg_paint.h" +#include "nema_vg_context.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// ------------------------------------------------------------------------------- +// SETUP +// ------------------------------------------------------------------------------- + +/** \brief Initializes NemaVG library and allocates the stencil buffer to the default memory pool (NEMA_MEM_POOL_FB) + * Call either this or nema_vg_init_stencil_pool to allocate the stencil buffer to a different memory pool + * or nema_vg_init_stencil_prealloc to provide the stencil buffer + * \param width Framebuffer width + * \param height Framebuffer height + */ +void nema_vg_init(int width, int height); + +/** \brief Initializes NemaVG library and allocate the stencil buffer in a specific memory pool. + * Call either this or nema_vg_init to allocate the stencil buffer to the default memory pool (NEMA_MEM_POOL_FB) + * or nema_vg_init_stencil_prealloc to provide the stencil buffer + * \param width Framebuffer width + * \param height Framebuffer height + * \param pool Memory pool for allocating the stencil buffer (memory pools are platform specific and defined in nema_sys_defs.h file) + */ +void nema_vg_init_stencil_pool(int width, int height, int pool); + +/** \brief Initializes NemaVG library without allocating the stencil buffer which is provided by the user. + * Call either this or nema_vg_init to allocate the stencil buffer to the default memory pool (NEMA_MEM_POOL_FB) + * or nema_vg_init_stencil_pool to allocate the stencil buffer to a different memory pool + * \param width Framebuffer width + * \param height Framebuffer height + * \param stencil_bo stencil buffer + */ +void nema_vg_init_stencil_prealloc(int width, int height, nema_buffer_t stencil_bo); + + +/** \brief Reinitialize NemaVG library after a gpu powerofff + * + */ +void nema_vg_reinit(); + +/** \brief Deinitialize NemaVG library. Free memory from implicitly allocated objects (stencil buffer + * if created inside the library, lut buffer and tsvgs' path, paint and gradient buffers) + * + * + */ +void nema_vg_deinit(); + +// ------------------------------------------------------------------------------- +// PATH DRAW +// ------------------------------------------------------------------------------- + +/** \brief Draw a path using a specified paint object + * + * \param path Pointer (handle) to the path that will be drawn + * \param paint Pointer (handle) to the paint object that wil be used for drawing + + * \return Error code. See NEMA_VG_ERR_* defines in "nema_vg_context.h" header file for the error codes. + * + */ +uint32_t nema_vg_draw_path(NEMA_VG_PATH_HANDLE path, NEMA_VG_PAINT_HANDLE paint); + +/** \brief Draw a line shape + * + * \param x1 Upper left x coordinate + * \param y1 Upper left y coordinate + * \param x2 The width + * \param y2 The height + * \param m 3x3 affine transformation matrix + * \param paint The paint to draw + + * \return Error code. See NEMA_VG_ERR_* defines in "nema_vg_context.h" header file for the error codes. + * + */ +uint32_t nema_vg_draw_line(float x1, float y1, float x2, float y2, + nema_matrix3x3_t m, + NEMA_VG_PAINT_HANDLE paint); + +/** \brief Draw a rectangle shape + * + * \param x Upper left x coordinate + * \param y Upper left y coordinate + * \param width The width + * \param height The height + * \param m 3x3 affine transformation matrix + * \param paint The paint to draw + + * \return Error code + * + */ +uint32_t nema_vg_draw_rect(float x, float y, float width, float height, + nema_matrix3x3_t m, + NEMA_VG_PAINT_HANDLE paint); + +/** \brief Draw a rounded rectangle shape + * + * \param x Upper left x coordinate + * \param y Upper left y coordinate + * \param width The width + * \param height The height + * \param rx Horizontal cornel radius + * \param ry Vertical cornel radius + * \param m 3x3 affine transformation matrix + * \param paint The paint to draw + + * \return Error code. See NEMA_VG_ERR_* defines in "nema_vg_context.h" header file for the error codes. + * + */ +uint32_t nema_vg_draw_rounded_rect(float x, float y, float width, float height, + float rx, float ry, + nema_matrix3x3_t m, + NEMA_VG_PAINT_HANDLE paint); + +/** \brief Draw a ellipse shape + * + * \param cx The x position of the ellipse + * \param cy The y position of the ellipse + * \param rx Radius on the x axis + * \param ry Radius on the y axis + * \param m 3x3 affine transformation matrix + * \param paint The paint to draw + + * \return Error code. See NEMA_VG_ERR_* defines in "nema_vg_context.h" header file for the error codes. + * + */ +uint32_t nema_vg_draw_ellipse(float cx, float cy, float rx, float ry, + nema_matrix3x3_t m, + NEMA_VG_PAINT_HANDLE paint); + +/** \brief Draw a circle shape + * + * \param cx The x center of the circle + * \param cy The y center of the circle + * \param r Radius of the circle + * \param m 3x3 affine transformation matrix + * \param paint The paint to draw + + * \return Error code. See NEMA_VG_ERR_* defines in "nema_vg_context.h" header file for the error codes. + * + */ +uint32_t nema_vg_draw_circle(float cx, float cy, float r, + nema_matrix3x3_t m, + NEMA_VG_PAINT_HANDLE paint); + + +/** \brief Draw a filled ring with rounded caps shape. In case of a conical gradient paint type, + * the conical gradient center should be at the center of the ring(cx, cy). In other case, where the two centers do not match, + * the ring should be drawn with NEMA_VG_QUALITY_MAXIMUM. The ring width can be set with the paint's stroke_width. + * + * \param cx The center x coordinate of the ring + * \param cy The center y coordinate of the ring + * \param ring_radius The radius of the ring + * \param angle_start The angle in degrees of the ring + * \param angle_end The angle in degrees that ends this ring + * \param paint The paint to draw + + * \return Error code. See NEMA_VG_ERR_* defines in "nema_vg_context.h" header file for the error codes. + * + */ +uint32_t nema_vg_draw_ring(float cx, float cy, float ring_radius, float angle_start, float angle_end, + NEMA_VG_PAINT_HANDLE paint); + + +/** \brief Returns the minimum and maximum values for the coordinates that + * can be handled by the underlying hardware + * + * \param min_coord Minimum coordinate (x or y) value (pointer) + * \param max_coord Maximum coordinate (x or y) value (pointer) + * + */ +void nema_vg_get_coord_limits(float *min_coord, float *max_coord); + +#ifdef __cplusplus +} +#endif + +#endif //__NEMA_VG_H__ diff --git a/libs/nema_gfx/include/nema_vg_context.h b/libs/nema_gfx/include/nema_vg_context.h new file mode 100644 index 000000000..9f4fee794 --- /dev/null +++ b/libs/nema_gfx/include/nema_vg_context.h @@ -0,0 +1,187 @@ +/* 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. + ******************************************************************************/ + +/** + * @file + * @brief NemaVG Context interface. + * + * Contains NemaVG error codes, fill rules, rendering quality defines and functions for updating various rendering parameters. + * The functions defined here can be used to access the context parameters. The Context is an internal (opaque) struct of NemaVG. + */ + +#ifndef __NEMA_VG_CONTEXT_H__ +#define __NEMA_VG_CONTEXT_H__ + +#include "nema_graphics.h" +#include "nema_matrix3x3.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifndef NEMA_VG_HANDLE +#define NEMA_VG_HANDLE void* /**< NemaVG handle object (void pointer)*/ +#endif + +#define NEMA_VG_PATH_HANDLE NEMA_VG_HANDLE /**< NemaVG path handle (pointer to path object)*/ +#define NEMA_VG_PAINT_HANDLE NEMA_VG_HANDLE /**< NemaVG paint handle (pointer to paint object)*/ +#define NEMA_VG_GRAD_HANDLE NEMA_VG_HANDLE /**< NemaVG gradient handle (pointer to gradient object)*/ + +typedef float nema_vg_float_t; /**< Floating point data type (default is 'float') */ + +#define NEMA_VG_ERR_NO_ERROR (0x00000000U) /**< No Error */ +#define NEMA_VG_ERR_BAD_HANDLE (0x00000001U) /**< Bad handle */ +#define NEMA_VG_ERR_BAD_BUFFER (0x00000002U) /**< Bad buffer */ +#define NEMA_VG_ERR_INVALID_FILL_RULE (0x00000004U) /**< Invalid fill rule*/ +#define NEMA_VG_ERR_INVALID_PAINT_TYPE (0x00000008U) /**< Invalid paint type*/ +#define NEMA_VG_ERR_INVALID_VERTEX_DATA (0x00000010U) /**< Invalid vertex data*/ +#define NEMA_VG_ERR_NO_RADIAL_ENABLED (0x00000020U) /**< Radial not present in HW*/ +#define NEMA_VG_ERR_NO_BOUND_CL (0x00000040U) /**< No bound CL*/ +#define NEMA_VG_ERR_INVALID_ARGUMENTS (0x00000080U) /**< Invalid arguments*/ +#define NEMA_VG_ERR_INVALID_ARC_DATA (0x00000100U) /**< reserved */ +#define NEMA_VG_ERR_CL_FULL (0x00000200U) /**< reserved */ +#define NEMA_VG_ERR_DRAW_OUT_OF_BOUNDS (0x00000400U) /**< Path is out of the drawing area */ +#define NEMA_VG_ERR_INVALID_MASKING_OBJ (0x00000800U) /**< Masking object was not set */ +#define NEMA_VG_ERR_INVALID_MASKING_FORMAT (0x00001000U) /**< Invalid Masking object Format */ +#define NEMA_VG_ERR_INVALID_LUT_IDX_FORMAT (0x00002000U) /**< Invalid LUT indices object Format */ +#define NEMA_VG_ERR_COORDS_OUT_OF_RANGE (0x00004000U) /**< Path coordinates out of supported range */ +#define NEMA_VG_ERR_EMPTY_TSVG (0x00008000U) /**< Tsvg has no geometries */ +#define NEMA_VG_ERR_NO_BOUND_FONT (0x00010000U) /**< There is no bound font */ +#define NEMA_VG_ERR_UNSUPPORTED_FONT (0x00020000U) /**< The font is not supported (eg. older version) by NemaVG API */ +#define NEMA_VG_ERR_NON_INVERTIBLE_MATRIX (0x00040000U) /**< A matrix that needs to be inverted, is not invertible */ +#define NEMA_VG_ERR_INVALID_GRAD_STOPS (0x00080000U) /**< Gradient stops exceed maximum available stops */ +#define NEMA_VG_ERR_NO_INIT (0x00100000U) /**< VG uninitialized */ +#define NEMA_VG_ERR_INVALID_STROKE_WIDTH (0x00200000U) /**< Invalid stroke width */ +#define NEMA_VG_ERR_INVALID_OPACITY (0x00400000U) /**< Invalid opacity */ + +#define NEMA_VG_FILL_DRAW (0x00U) /**< DEPRECATED Stroke fill rule */ +#define NEMA_VG_STROKE (0x00U) /**< Stroke fill rule */ +#define NEMA_VG_FILL_EVEN_ODD (0x01U) /**< Evenodd fill rule */ +#define NEMA_VG_FILL_NON_ZERO (0x02U) /**< Non zero fill rule */ + +#define NEMA_VG_QUALITY_BETTER (0x00U) /**< Better rendering quality (default option, balances rendering quality and performance)*/ +#define NEMA_VG_QUALITY_FASTER (0x01U) /**< Faster rendering quality (favors performance over rendering quality)*/ +#define NEMA_VG_QUALITY_MAXIMUM (0x02U) /**< Maximum rendering quality (favors rendering quality over performance)*/ +#define NEMA_VG_QUALITY_NON_AA (0x10U) /**< Rendering quality without AA*/ + + +/** \brief Set the global transformation matrix. Global matrix will be applied in all NemaVG rendering operations that will follow. + * + * \param m transformation matrix + * + * \return Error code + */ +uint32_t nema_vg_set_global_matrix(nema_matrix3x3_t m); + + +/** \brief Disable the global transformation matrix. + * + */ +void nema_vg_reset_global_matrix(void); + +/** \brief Set the fill rule that will be applied when rendering a path. + * + * \param fill_rule fill rule (NEMA_VG_STROKE, NEMA_VG_FILL_EVEN_ODD, NEMA_VG_FILL_NON_ZERO) + * + */ +void nema_vg_set_fill_rule(uint8_t fill_rule); + +/** \brief Enable/Disable Masking. + * + * \param masking 1 to enable, 0 to disable + * + */ +void nema_vg_masking(uint8_t masking); + +/** \brief Set the mask object (texture) + * + * \param mask_obj Texture to be used as mask. Its format must be NEMA_A1, NEMA_A2, NEMA_A4 or Nema_A8, otherwise it will return an error. + * \return Error code. If no error occurs, NEMA_VG_ERR_NO_ERROR otherwise NEMA_VG_ERR_INVALID_MASKING_FORMAT. + * + */ +uint32_t nema_vg_set_mask(nema_img_obj_t *mask_obj); + +/** \brief Translate the mask object (texture) with respect to origin point (0, 0). Sets the position of the mask object. + * + * \param x Horizontal position to place the mask object + * \param y Horizontal position to place the mask object + * + */ +void nema_vg_set_mask_translation(float x, float y); + +/** \brief Set the rendering quality + * + * \param quality level (NEMA_VG_QUALITY_BETTER, NEMA_VG_QUALITY_FASTER, NEMA_VG_QUALITY_MAXIMUM, NEMA_VG_QUALITY_NON_AA) + * + */ +void nema_vg_set_quality(uint8_t quality); + +/** \brief Set the blending mode for VG operations (see nema_blender.h documentation in NemaGFX API Manual) + * Additional Blending Operations: only NEMA_BLOP_SRC_PREMULT is supported + * + * \param blend Blending mode + * \see nema_blending_mode() + * + */ +void nema_vg_set_blend(uint32_t blend); + +/** \brief Get the current error code. Clears the error afterwards. + * + * \return Error code. See NEMA_VG_ERR_* defines for all the possible error codes. + */ +uint32_t nema_vg_get_error(void); + +/** \brief Enable/disable large coordinates handling when rendering a TSVG, a path or a predefined shape + * + * \param enable 0 to disable, 1 to enable + * \param allow_internal_alloc 0 to not allow internal allocation, 1 to allow + * + */ +void nema_vg_handle_large_coords(uint8_t enable, uint8_t allow_internal_alloc); + +/** \brief Bind segment and data buffers to be used for handling large coordinates + * + * \param segs Pointer to segment buffer for large coordinates + * \param segs_size_bytes Segment buffer size in bytes + * \param data Pointer to data buffer for large coordinates + * \param data_size_bytes Data buffer size in bytes + * + */ +uint32_t nema_vg_bind_clip_coords_buf(void *segs, uint32_t segs_size_bytes, void *data, uint32_t data_size_bytes); + +/** \brief Unbind segment and data buffers to be used for handling large coordinates + * + * + */ +void nema_vg_unbind_clip_coords_buf(void); + +#ifdef __cplusplus +} +#endif + +#endif //__NEMA_VG_CONTEXT_H__ diff --git a/libs/nema_gfx/include/nema_vg_font.h b/libs/nema_gfx/include/nema_vg_font.h new file mode 100644 index 000000000..8739a7c03 --- /dev/null +++ b/libs/nema_gfx/include/nema_vg_font.h @@ -0,0 +1,184 @@ +/* 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. + ******************************************************************************/ + +/** + * @file + * @brief Vector font rendering + * + * This file includes the necessary structs and functions that are used for rendering text (strings and single characters), + * using vector fonts. The accompanying vector font converter utility, converts truetype fonts (ttf files) to instances + * of the structs defined here. A use case of this module is included in the respective examples (examples/NemaVG/render_vg_font). + */ + +#ifndef NEMA_VG_FONT_H_ +#define NEMA_VG_FONT_H_ + +#include "nema_matrix3x3.h" +#include "nema_vg.h" +#include "nema_vg_context.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define NEMA_VG_ALIGNX_LEFT (0x00U) /**< Align horizontally to the left */ +#define NEMA_VG_ALIGNX_RIGHT (0x01U) /**< Align horizontally to the right */ +#define NEMA_VG_ALIGNX_CENTER (0x02U) /**< Align horizontally centered */ +#define NEMA_VG_ALIGNX_JUSTIFY (0x03U) /**< Justify horizontally */ +#define NEMA_VG_ALIGNX_MASK (0x03U) /**< Horizontal alignment mask */ +#define NEMA_VG_ALIGNY_TOP (0x00U) /**< Align vertically to the top */ +#define NEMA_VG_ALIGNY_BOTTOM (0x04U) /**< Align vertically to the bottom */ +#define NEMA_VG_ALIGNY_CENTER (0x08U) /**< Align vertically centered */ +#define NEMA_VG_ALIGNY_JUSTIFY (0x0cU) /**< Justify vertically */ +#define NEMA_VG_ALIGNY_MASK (0x0cU) /**< Vertical alignment mask */ +#define NEMA_VG_TEXT_WRAP (0x10U) /**< Use text wrapping */ + +#define NEMA_VG_CHAR_LTR (0x00U) /**< Character follows left to right orientation */ +#define NEMA_VG_CHAR_RTL (0x01U) /**< Character follows right to left orientation */ +#define NEMA_VG_CHAR_TTB (0x00U) /**< Character follows top to bottom orientation */ +#define NEMA_VG_CHAR_BTT (0x02U) /**< Character follows bottom to top orientation */ + + +/** NemaVG Kerning pair information data struct */ +typedef struct { + const uint32_t left; /**< Neighbor character to the left of the current one (Unicode value) */ + const float x_offset; /**< Kerning offset value (horizontally) */ +} nema_vg_kern_pair_t; + +/** NemaVG data struct of a glyph in vector format*/ +typedef struct { + const uint32_t data_offset; /**< Offset value for the data of the glyph in the respective data array */ + const size_t data_length; /**< Length of the data in the respective data array */ + const uint32_t segment_offset; /**< Offset value for the segments of the glyph in the respective segment array */ + const size_t segment_length; /**< Length of the segments in the respective segment array */ + const float xAdvance; /**< Advance width*/ + const uint32_t kern_offset; /**< Kerning offset of the glyph in the respective kerning array */ + const uint8_t kern_length; /**< Length of the kerning information of the glyph */ + const int16_t bbox_xmin; /**< Minimum x of the glyph's bounding box */ + const int16_t bbox_ymin; /**< Minimum y of the glyph's bounding box */ + const int16_t bbox_xmax; /**< Maximum x of the glyph's bounding box */ + const int16_t bbox_ymax; /**< Maximum y of the glyph's bounding box */ +} nema_vg_glyph_t; + +/** NemaVG vector font range data struct */ +typedef struct { + const uint32_t first; /**< Unicode value of the first value of the range */ + const uint32_t last; /**< Unicode value of the last value of the range */ + const nema_vg_glyph_t *glyphs; /**< Pointer to the array of glyphs */ +} nema_vg_font_range_t; + +/** NemaVG vector font data struct*/ +typedef struct { + const uint32_t version; /**< Font version */ + const nema_vg_font_range_t *ranges; /**< Pointer to the array of ranges */ + const nema_vg_float_t *data; /**< Pointer to the data of the vector font */ + const size_t data_length; /**< Length of the vector font data*/ + const uint8_t *segment; /**< Pointer to the segments of the vector font */ + const size_t segment_length; /**< Length of the vector font segments */ + const float size; /**< Default font size (height) */ + const float xAdvance; /**< Default advance width. If the space character is included in the ranges, then its advance width is set */ + const float ascender; /**< Vertical distance from the baseline to the highest point of the font */ + const float descender; /**< Vertical distance from the baseline to the lowest point of the font */ + const nema_vg_kern_pair_t *kern_pairs; /**< Pointer to the array of the font's kerning pairs */ + uint32_t flags; /**< Bit field, reserved for future use */ +} nema_vg_font_t; + +/** \brief Bind the font to use in future nema_vg_print() calls. Sets error code if font is not supported. + * + * \param font Pointer to the vector font + * + */ +void nema_vg_bind_font(nema_vg_font_t *font); + +/** \brief Sets the size of the bound font. Future nema_vg_print() and nema_vg_print_char() calls will print using the last set size. + * + * \param font Pointer to the vector font + * + */ +void nema_vg_set_font_size(float size); + + +/** \brief Print pre-formatted text + * + * \param paint Pointer to the current paint object (contains the text color) + * \param str Pointer to string + * \param x X coordinate of text-area's top-left corner + * \param y Y coordinate of text-area's top-left corner + * \param w Max allowed width + * \param h Max allowed height + * \param align Alignment and wrapping mode + * \param m Transformation matrix + * + */ +void nema_vg_print(NEMA_VG_PAINT_HANDLE paint, const char *str, float x, float y, float w, float h, uint32_t align, nema_matrix3x3_t m); + + +/** \brief Get the bounding box's width and height of a vector string. Prior to calling this function, "nema_vg_set_font_size" must be called first. + * + * \param str Pointer to string + * \param w Pointer to variable where width should be written + * \param h Pointer to variable where height should be written + * \param max_w Max allowed width + * \param size font size + * \param wrap enable text wraping + * \return Number of carriage returns + * + */ +int nema_vg_string_get_bbox(const char *str, float *w, float *h, float max_w, uint32_t wrap); + + +/** \brief Get the text ascender value in point units. Font size must be set pror to calling this function. + * + * \return Ascender pt + * + */ +int nema_vg_get_ascender_pt(); + +/** \brief Print a single character + * + * \details The position of the character is determined by the 'orientation' argument. + * x and y arguments define a point on the baseline. If the orientation is left to right (LTR), + * the character will be placed to the right of the (x, y) point. Right to left (RTL) will place + * the character to the left of the (x, y) point. Top to bottom (TTB) will have the same effect as + * RTL and bottom to top (BTT) will place the character higher than the (x, y) point by an offset + * equal to the font height. + * + * \param paint Pointer to the current paint object (contains the text color) + * \param ch Character to be printed + * \param x X coordinate of character's top-left or top-right corner (controlled by the 'orientation' parameter) + * \param y Y coordinate of character's top-left or bottom-left corner (controlled by the 'orientation' parameter) + * \param m Transformation matrix + * \param orientation Character orientation (see NEMA_VG_CHAR_* defines) + * \return Character width in pixels + * + */ +float nema_vg_print_char(NEMA_VG_PAINT_HANDLE paint, char ch, float x, float y, nema_matrix3x3_t m, uint32_t orientation); + +#ifdef __cplusplus +} +#endif +#endif // NEMA_VG_FONT_H_ diff --git a/libs/nema_gfx/include/nema_vg_paint.h b/libs/nema_gfx/include/nema_vg_paint.h new file mode 100644 index 000000000..76f16bbbe --- /dev/null +++ b/libs/nema_gfx/include/nema_vg_paint.h @@ -0,0 +1,241 @@ +/* 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. + ******************************************************************************/ + +/** + * @file + * @brief Paint operation related fuctions. Paint is an internal (opaque) struct of NemaVG. + * The functions defined here can be used access its parameters. + * + */ + +#ifndef __NEMA_VG_PAINT_H__ +#define __NEMA_VG_PAINT_H__ + +#include "nema_interpolators.h" +#include "nema_matrix3x3.h" +#include "nema_vg_context.h" +#include "nema_graphics.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define NEMA_VG_PAINT_COLOR (0x00U) /**< Fill with color */ +#define NEMA_VG_PAINT_FILL (0x00U) /**< Deprecated - Fill with color (same as NEMA_VG_PAINT_COLOR) */ +#define NEMA_VG_PAINT_GRAD_LINEAR (0x01U) /**< Fill with linear gradient */ +#define NEMA_VG_PAINT_TEXTURE (0x02U) /**< Fill with texture */ +#define NEMA_VG_PAINT_GRAD_RADIAL (0x03U) /**< Fill with radial gradient */ +#define NEMA_VG_PAINT_GRAD_CONICAL (0x04U) /**< Fill with conical gradient */ + +#define NEMA_VG_PAINT_MAX_GRAD_STOPS (32) /**< Maximum gradient stops*/ + +/** \brief Create a paint object. + * + * \return Handle to the created paint object + * + */ +NEMA_VG_PAINT_HANDLE nema_vg_paint_create(); + +/** \brief Destroy a paint object. + * + * \param paint Handle to paint object that should be destroyed + * + */ +void nema_vg_paint_destroy(NEMA_VG_PAINT_HANDLE paint); + +/** \brief Clear the parameters of a paint object. + * + * \param paint Pointer (handle) to paint object + * + */ +void nema_vg_paint_clear(NEMA_VG_PAINT_HANDLE paint); + +/** \brief Set the paint type + * + * \param paint Pointer (handle) to paint + * \param type Paint type (NEMA_VG_PAINT_COLOR, NEMA_VG_PAINT_GRAD_LINEAR, NEMA_VG_PAINT_TEXTURE, NEMA_VG_PAINT_GRAD_RADIAL, NEMA_VG_PAINT_GRAD_CONICAL) + * + */ +void nema_vg_paint_set_type(NEMA_VG_PAINT_HANDLE paint, uint8_t type); + + +/** \brief Lock paint transformation to path. If locked, path and paint + * transformation will be in sync. + * + * \param paint Pointer to paint object + * \param locked 1 if locked (default), 0 if not locked + * + */ +void nema_vg_paint_lock_tran_to_path(NEMA_VG_PAINT_HANDLE paint, int locked); + +/** \brief Set linear gradient to a paint object + * + * \param paint Pointer to paint object + * \param grad Pointer to gradient object + * \param x0 Linear gradient start point x coordinate + * \param y0 Linear gradient start point y coordinate + * \param x1 Linear gradient end point x coordinate + * \param y1 Linear gradient end point y coordinate + * \param sampling_mode Sampling mode. NEMA_TEX_BORDER defaults to NEMA_TEX_CLAMP + * + */ +void nema_vg_paint_set_grad_linear(NEMA_VG_PAINT_HANDLE paint, + NEMA_VG_GRAD_HANDLE grad, + float x0, float y0, + float x1, float y1, + nema_tex_mode_t sampling_mode); + + /** \brief Set the paint color + * + * \param paint Pointer (handle) to paint object + * \param rgba Color to be set, in rgba (hex 0xAABBGGRR) format + * + */ +void nema_vg_paint_set_paint_color(NEMA_VG_PAINT_HANDLE paint, uint32_t rgba); + + /** \brief Set the paint opacity + * + * \param paint Pointer (pointer) to paint object + * \param opacity Opacity to be set, 1 is fully opaque and 0 is fully transparent + * + */ +void nema_vg_paint_set_opacity(NEMA_VG_PAINT_HANDLE paint, float opacity); + + /** \brief Set stroke width + * + * \param paint Pointer (handle) to paint object + * \param stroke_width Stroke width to be set + * + */ +void nema_vg_paint_set_stroke_width(NEMA_VG_PAINT_HANDLE paint, float stroke_width); + + /** \brief Set transformation matrix for texture + * + * \param paint Pointer (handle) to paint object + * \param m 3x3 transformation matrix + * + */ +void nema_vg_paint_set_tex_matrix(NEMA_VG_PAINT_HANDLE paint, nema_matrix3x3_t m); + + /** \brief Set texture to paint object + * + * \param paint Pointer (handle) to paint + * \param text Pointer to texture image object + * + */ +void nema_vg_paint_set_tex(NEMA_VG_PAINT_HANDLE paint, nema_img_obj_t* tex); + + /** \brief Set Lut-based (look-up-table) texture to paint object. See Nema Pixpresso User Manual regarding Lut formats + * + * \param paint Pointer (handle) to paint object + * \param lut_palette Pointer to the Palette of the Lut image object + * \param lut_indices Pointer to the indices of the Lut image object + * + */ +void nema_vg_paint_set_lut_tex(NEMA_VG_PAINT_HANDLE paint, nema_img_obj_t* lut_palette, nema_img_obj_t* lut_indices); + +/** \brief Set Conical gradient to paint object + * + * \param paint Pointer (handle) to paint + * \param grad Pointer (handle) to gradient + * \param cx Conical gradient center point x coordinate + * \param cy Conical gradient center point y coordinate + * \param sampling_mode Sampling mode + * + */ +void nema_vg_paint_set_grad_conical(NEMA_VG_PAINT_HANDLE paint, + NEMA_VG_GRAD_HANDLE grad, + float cx, float cy, + nema_tex_mode_t sampling_mode); + +/** \brief Set radial gradient to paint object + * + * \param paint Pointer (handle) to paint + * \param grad Pointer (handle) to gradient + * \param x0 Radial gradient center point x coordinate + * \param y0 Radial gradient center point y coordinate + * \param r Radial gradient radius + * \param sampling_mode Sampling mode + * + */ +void +nema_vg_paint_set_grad_radial(NEMA_VG_PAINT_HANDLE paint, + NEMA_VG_GRAD_HANDLE grad, + float x0, float y0, + float r, + nema_tex_mode_t sampling_mode); + + +/** \brief Set radial gradient to paint object, with different horizontal and vertical radius + * + * \param paint Pointer (handle) to paint + * \param grad Pointer (handle) to gradient + * \param x0 Radial gradient center point x coordinate + * \param y0 Radial gradient center point y coordinate + * \param rx Radial gradient radius on x axis + * \param ry Radial gradient radius on y axis + * \param sampling_mode Sampling mode + * + */ +void +nema_vg_paint_set_grad_radial2(NEMA_VG_PAINT_HANDLE paint, + NEMA_VG_GRAD_HANDLE grad, + float x0, float y0, + float rx, float ry, + nema_tex_mode_t sampling_mode); + +/** \brief Create gradient object + * + * \return Handle (pointer) to the created gradient object + */ +NEMA_VG_GRAD_HANDLE +nema_vg_grad_create(void); + +/** \brief Destroy gradient object + * + * \param grad Pointer to the gradient object + * + */ +void +nema_vg_grad_destroy(NEMA_VG_GRAD_HANDLE grad); + +/** \brief Set gradient parameters to a gradient object + * + * \param grad Pointer (handle) to gradient object + * \param stops_count Number of stop colors + * \param stops Pointer to stop colors coordinates + * \param colors Pointer to stop color values + * + */ +void +nema_vg_grad_set(NEMA_VG_GRAD_HANDLE grad, int stops_count, float *stops, color_var_t* colors); + +#ifdef __cplusplus +} +#endif + +#endif //__NEMA_VG_PAINT_H__ diff --git a/libs/nema_gfx/include/nema_vg_path.h b/libs/nema_gfx/include/nema_vg_path.h new file mode 100644 index 000000000..6a799c0a1 --- /dev/null +++ b/libs/nema_gfx/include/nema_vg_path.h @@ -0,0 +1,143 @@ +/* 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. + ******************************************************************************/ + +/** + * @file + * @brief Path operation related fuctions + * + */ + +#ifndef __NEMA_VG_PATH_H__ +#define __NEMA_VG_PATH_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +#include "nema_interpolators.h" +#include "nema_matrix3x3.h" +#include "nema_sys_defs.h" +#include "nema_vg_context.h" + +#define NEMA_VG_PRIM_CLOSE (0x00U) /**< Close segment */ +#define NEMA_VG_PRIM_MOVE (0x01U) /**< Move segment */ +#define NEMA_VG_PRIM_LINE (0x02U) /**< Line segment */ +#define NEMA_VG_PRIM_HLINE (0x03U) /**< Horizontal line segment */ +#define NEMA_VG_PRIM_VLINE (0x04U) /**< Vertical line segment */ +#define NEMA_VG_PRIM_BEZIER_QUAD (0x05U) /**< Quadratic bezier segment */ +#define NEMA_VG_PRIM_BEZIER_CUBIC (0x06U) /**< Cubic bezier segment */ +#define NEMA_VG_PRIM_BEZIER_SQUAD (0x07U) /**< Smooth quadratic bezier segment */ +#define NEMA_VG_PRIM_BEZIER_SCUBIC (0x08U) /**< Smooth cubic bezier segment */ +#define NEMA_VG_PRIM_ARC (0x09U) /**< Arc segment */ +#define NEMA_VG_PRIM_POLYGON (0x0AU) /**< Polygon segment */ +#define NEMA_VG_PRIM_POLYLINE (0x0BU) /**< Polyline segment */ +#define NEMA_VG_PRIM_MASK (0x0FU) /**< Mask for all segments */ +#define NEMA_VG_REL (0x10U) /**< Rel segment*/ +#define NEMA_VG_ARC_LARGE (0x20U) /**< Large arc segment */ +#define NEMA_VG_ARC_CW (0x40U) /**< Clockwise arc segment */ +#define NEMA_VG_PRIM_SCCWARC (NEMA_VG_PRIM_ARC ) /**< Small counterclockwise arc segment */ +#define NEMA_VG_PRIM_SCWARC (NEMA_VG_PRIM_ARC | NEMA_VG_ARC_CW ) /**< Small clockwise arc segment */ +#define NEMA_VG_PRIM_LCCWARC (NEMA_VG_PRIM_ARC | NEMA_VG_ARC_LARGE) /**< Large counterclockwise arc segment */ +#define NEMA_VG_PRIM_LCWARC (NEMA_VG_PRIM_ARC | NEMA_VG_ARC_CW |NEMA_VG_ARC_LARGE) /**< Large clockwise arc segment */ +#define NEMA_VG_PRIM_MOVE_REL (NEMA_VG_PRIM_MOVE | NEMA_VG_REL) /**< Relative move segment */ +#define NEMA_VG_PRIM_LINE_REL (NEMA_VG_PRIM_LINE | NEMA_VG_REL) /**< Relative line segment */ +#define NEMA_VG_PRIM_HLINE_REL (NEMA_VG_PRIM_HLINE | NEMA_VG_REL) /**< Relative horizontal line segment */ +#define NEMA_VG_PRIM_VLINE_REL (NEMA_VG_PRIM_VLINE | NEMA_VG_REL) /**< Relative vertical line segment */ +#define NEMA_VG_PRIM_BEZIER_QUAD_REL (NEMA_VG_PRIM_BEZIER_QUAD | NEMA_VG_REL) /**< Relative quadratic bezier segment */ +#define NEMA_VG_PRIM_BEZIER_CUBIC_REL (NEMA_VG_PRIM_BEZIER_CUBIC | NEMA_VG_REL) /**< Relative cubic bezier segment */ +#define NEMA_VG_PRIM_BEZIER_SQUAD_REL (NEMA_VG_PRIM_BEZIER_SQUAD | NEMA_VG_REL) /**< Relative smooth quadratic bezier segment */ +#define NEMA_VG_PRIM_BEZIER_SCUBIC_REL (NEMA_VG_PRIM_BEZIER_SCUBIC | NEMA_VG_REL) /**< Relative smooth cubic bezier segment */ +#define NEMA_VG_PRIM_SCCWARC_REL (NEMA_VG_PRIM_SCCWARC | NEMA_VG_REL) /**< Relative small counterclockwise arc segment */ +#define NEMA_VG_PRIM_SCWARC_REL (NEMA_VG_PRIM_SCWARC | NEMA_VG_REL) /**< Relative small clockwise arc segment */ +#define NEMA_VG_PRIM_LCCWARC_REL (NEMA_VG_PRIM_LCCWARC | NEMA_VG_REL) /**< Relative lareg counterclockwise arc segment */ +#define NEMA_VG_PRIM_LCWARC_REL (NEMA_VG_PRIM_LCWARC | NEMA_VG_REL) /**< Relative lareg rclockwise arc segment */ +#define NEMA_VG_PRIM_POLYGON_REL (NEMA_VG_PRIM_POLYGON | NEMA_VG_REL) /**< Relative polygon segment */ +#define NEMA_VG_PRIM_POLYLINE_REL (NEMA_VG_PRIM_POLYLINE | NEMA_VG_REL) /**< Relative polyline segment */ + + +/** \brief Create path + * + * \return Created path + * + */ +NEMA_VG_PATH_HANDLE nema_vg_path_create(); + +/** \brief Destroy path + * + * \param path Pointer to Path + * \return void + * + */ +void nema_vg_path_destroy(NEMA_VG_PATH_HANDLE path); + +/** \brief Clear path + * + * \param path Pointer to Path + * \return void + * + */ +void nema_vg_path_clear(NEMA_VG_PATH_HANDLE path); + +/** \brief Set path shape (vertex buffer) + * + * \param path Pointer to path + * \param seg_size Number of segments to be added + * \param seg Pointer to segments + * \param data_size Number of data to be added + * \param data Pointer to coordinates + * + */ +void nema_vg_path_set_shape(NEMA_VG_PATH_HANDLE path, const size_t seg_size , const uint8_t* seg, const size_t data_size, const nema_vg_float_t* data); + +/** \brief Set path shape (vertex buffer) and bounding box. Same functionality as nema_vg_path_set_shape() + * but bbox is given by user (reduces CPU utilization) + * + * \param path Pointer to path + * \param seg_size Number of segments to be added + * \param seg Pointer to segments + * \param data_size Number of data to be added + * \param data Pointer to coordinates + * \param bbox Pointer to shape bound box coordinates {min_x, min_y, max_x, max_y} + * + */ +void +nema_vg_path_set_shape_and_bbox(NEMA_VG_PATH_HANDLE path, const size_t seg_size, const uint8_t* seg, const size_t data_size, const nema_vg_float_t* data, const nema_vg_float_t *bbox); + +/** \brief Set affine transformation matrix + * + * \param path Pointer to path + * \param m 3x3 affine transformation matrix + * + */ +void nema_vg_path_set_matrix(NEMA_VG_PATH_HANDLE path, nema_matrix3x3_t m); + +#ifdef __cplusplus +} +#endif + +#endif //__NEMA_VG_PATH_H__ diff --git a/libs/nema_gfx/include/nema_vg_tsvg.h b/libs/nema_gfx/include/nema_vg_tsvg.h new file mode 100644 index 000000000..ca9b4ac35 --- /dev/null +++ b/libs/nema_gfx/include/nema_vg_tsvg.h @@ -0,0 +1,56 @@ +/* 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. + ******************************************************************************/ + +/** + * @file + * @brief API for rendering .tsvg images + * + */ + +#ifndef NEMA_VG_TSVG_H_ +#define NEMA_VG_TSVG_H_ + +#include "nema_vg_context.h" + +/** \brief Draws a TSVG buffer + * + * \param buffer Pointer to the TSVG buffer that will be drawn + * + */ +void +nema_vg_draw_tsvg(const void* buffer); + +/** \brief Get the width and height of tsvg + * + * \param buffer Tsvg buffer + * \param width return Tsvg width + * \param height return Tsvg height + * + */ +void nema_vg_get_tsvg_resolution(const void *buffer, uint32_t *width, uint32_t *height); + +#endif // NEMA_VG_TSVG_H_ diff --git a/libs/nema_gfx/include/nema_vg_version.h b/libs/nema_gfx/include/nema_vg_version.h new file mode 100644 index 000000000..f14c42648 --- /dev/null +++ b/libs/nema_gfx/include/nema_vg_version.h @@ -0,0 +1,55 @@ +/* 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. + ******************************************************************************/ + +/** + * @file + * @brief Contains version numbers for NemaVG API and the currently supported font version. + * + */ + +#ifndef NEMA_VG_VERSION_H__ +#define NEMA_VG_VERSION_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define NEMA_VG_MAJOR_VERSION 0x01U /**< NemaVG API version, major number */ +#define NEMA_VG_MINOR_VERSION 0x01U /**< NemaVG API version, minor number */ +#define NEMA_VG_REVISION_VERSION 0x05U /**< NemaVG API version, revision number */ +#define NEMA_VG_IMP_VERSION 0x00231000U /**< NemaVG API version, implementation in format 0x00YYMM00 (Y: year, M: month) */ + +#define NEMA_VG_API_VERSION ((NEMA_VG_MAJOR_VERSION << 16) + (NEMA_VG_MINOR_VERSION << 8) + (NEMA_VG_REVISION_VERSION)) /**< NemaVG API version in format 0x00MMmmrr (M:major, m:minor, r:revision if any) */ + +#define NEMA_VG_FONT_VERSION 0x01U /**< Current font version */ + + +#ifdef __cplusplus +} +#endif + +#endif //NEMA_VG_VERSION_H__ diff --git a/libs/nema_gfx/include/tsi_malloc.h b/libs/nema_gfx/include/tsi_malloc.h new file mode 100644 index 000000000..902b765d9 --- /dev/null +++ b/libs/nema_gfx/include/tsi_malloc.h @@ -0,0 +1,64 @@ +/* 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 TSI_MALLOC_H__ +#define TSI_MALLOC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +#define tsi_malloc_init(base_virt, base_phys, size, reset) \ + tsi_malloc_init_pool(0, base_virt, base_phys, size, reset) + +#define tsi_malloc(size) tsi_malloc_pool(0, size) + +int tsi_malloc_init_pool( int pool, + void *base_virt, + uintptr_t base_phys, + int size, + int reset); + +int tsi_malloc_init_pool_aligned( int pool, + void *base_virt, + uintptr_t base_phys, + int size, + int reset, + int alignment); /*alignment must be multiple of 4, otherwise it will be overwritten internaly to be multiple of 4*/ + +void *tsi_malloc_pool(int pool, int size); +void tsi_free(void *ptr); +uintptr_t tsi_virt2phys(void *addr); +void *tsi_phys2virt(uintptr_t addr); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/libs/nema_gfx/lib/core/cortex_m33/gcc/libnemagfx-float-abi-hard-wc16.a b/libs/nema_gfx/lib/core/cortex_m33/gcc/libnemagfx-float-abi-hard-wc16.a new file mode 100644 index 0000000000000000000000000000000000000000..3408727b5dcaf3aec99c3511b78b9a45f42de7c9 GIT binary patch literal 304526 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

n@GJcYXPs6g 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%0Au`k-FMblRC~5ZqM*UWUlel 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 W2<{{qhZNr8xnlwcE>lMMD)tB7l~F7J literal 0 HcmV?d00001 diff --git a/libs/nema_gfx/lib/core/cortex_m33/gcc/libnemagfx-wc16.a b/libs/nema_gfx/lib/core/cortex_m33/gcc/libnemagfx-wc16.a new file mode 100644 index 0000000000000000000000000000000000000000..65557188b88b68d89c85dbc547283fc640786285 GIT binary patch literal 306054 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%0DJKl+QY(_gihjb2<*0dfgmoNdoEMWo4 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

  • CGh@*v<%B$%-y?r${2e~ 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 literal 0 HcmV?d00001 diff --git a/libs/nema_gfx/lib/core/cortex_m33/gcc/libnemagfx.a b/libs/nema_gfx/lib/core/cortex_m33/gcc/libnemagfx.a new file mode 100644 index 0000000000000000000000000000000000000000..39f62f4f21ef6b43a0a618a54d9b7e5504e52e7e GIT binary patch literal 306054 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π9hMA7kt6XCN>4Qrf_&E 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 literal 0 HcmV?d00001 diff --git a/lv_conf_template.h b/lv_conf_template.h index 03ed16485..1df77b528 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -206,6 +206,22 @@ #define LV_USE_DRAW_SW_COMPLEX_GRADIENTS 0 #endif +/*Use TSi's aka (Think Silicon) NemaGFX */ +#define LV_USE_NEMA_GFX 0 + +#if LV_USE_NEMA_GFX + #define LV_NEMA_GFX_HAL_INCLUDE + + /*Enable Vector Graphics Operations. Available only if NemaVG library is present*/ + #define LV_USE_NEMA_VG 0 + + #if LV_USE_NEMA_VG + /*Define application's resolution used for VG related buffer allocation */ + #define LV_NEMA_GFX_MAX_RESX 800 + #define LV_NEMA_GFX_MAX_RESY 600 + #endif +#endif + /** Use NXP's VG-Lite GPU on iMX RTxxx platforms. */ #define LV_USE_DRAW_VGLITE 0 diff --git a/src/draw/nema_gfx/lv_draw_nema_gfx.c b/src/draw/nema_gfx/lv_draw_nema_gfx.c new file mode 100644 index 000000000..f6f2bac0c --- /dev/null +++ b/src/draw/nema_gfx/lv_draw_nema_gfx.c @@ -0,0 +1,382 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * 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. + * + */ + +/** + * @file lv_draw_nema_gfx.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_refr.h" + +#if LV_USE_NEMA_GFX + +#include "lv_draw_nema_gfx.h" +#include "../../font/lv_font.h" +#include "../../font/lv_font_fmt_txt.h" + +/********************* + * DEFINES + *********************/ + +#define DRAW_UNIT_ID_NEMA_GFX 7 + +/********************** + * TYPEDEFS + **********************/ + +#if LV_USE_OS +/** + * Structure of pending nema_gfx draw task + */ +typedef struct _nema_gfx_draw_task_t { + lv_draw_task_t * task; + bool flushed; +} nema_gfx_draw_task_t; +#endif + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if LV_USE_OS + static void nema_gfx_render_thread_cb(void * ptr); +#endif + +static void nema_gfx_execute_drawing(lv_draw_nema_gfx_unit_t * u); + +static int32_t nema_gfx_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + +static int32_t nema_gfx_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); + +static int32_t nema_gfx_delete(lv_draw_unit_t * draw_unit); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_nema_gfx_init(void) +{ + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = lv_draw_create_unit(sizeof(lv_draw_nema_gfx_unit_t)); + /*Initiallize NemaGFX*/ + nema_init(); +#if LV_USE_NEMA_VG + /*Initiallize NemaVG */ + nema_vg_init(LV_NEMA_GFX_MAX_RESX, LV_NEMA_GFX_MAX_RESY); + /* Allocate VG Buffers*/ + draw_nema_gfx_unit->paint = nema_vg_paint_create(); + draw_nema_gfx_unit->gradient = nema_vg_grad_create(); + draw_nema_gfx_unit->path = nema_vg_path_create(); +#endif + draw_nema_gfx_unit->base_unit.dispatch_cb = nema_gfx_dispatch; + draw_nema_gfx_unit->base_unit.evaluate_cb = nema_gfx_evaluate; + draw_nema_gfx_unit->base_unit.delete_cb = nema_gfx_delete; + /*Create GPU Command List*/ + draw_nema_gfx_unit->cl = nema_cl_create(); + /*Bind Command List*/ + nema_cl_bind_circular(&(draw_nema_gfx_unit->cl)); + + +#if LV_USE_OS + lv_thread_init(&draw_nema_gfx_unit->thread, LV_THREAD_PRIO_HIGH, nema_gfx_render_thread_cb, 2 * 1024, + draw_nema_gfx_unit); +#endif +} + +void lv_draw_nema_gfx_deinit(void) +{ + return; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static int32_t nema_gfx_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) +{ + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)draw_unit; + + switch(task->type) { + case LV_DRAW_TASK_TYPE_LAYER: { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } +#if LV_USE_NEMA_VG + case LV_DRAW_TASK_TYPE_TRIANGLE: + case LV_DRAW_TASK_TYPE_ARC: { + lv_draw_arc_dsc_t * draw_arc_dsc = (lv_draw_arc_dsc_t *) task->draw_dsc; + if(draw_arc_dsc->rounded == 0) break; + } + case LV_DRAW_TASK_TYPE_FILL: { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } +#else + case LV_DRAW_TASK_TYPE_FILL: { + lv_draw_fill_dsc_t * draw_fill_dsc = (lv_draw_fill_dsc_t *) task->draw_dsc; + if((draw_fill_dsc->grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE)) { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } + break; + } + case LV_DRAW_TASK_TYPE_TRIANGLE: { + lv_draw_triangle_dsc_t * draw_triangle_dsc = (lv_draw_triangle_dsc_t *) task->draw_dsc; + if((draw_triangle_dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE)) { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } + break; + } +#endif + case LV_DRAW_TASK_TYPE_IMAGE: { + lv_draw_image_dsc_t * draw_image_dsc = (lv_draw_image_dsc_t *) task->draw_dsc; + if(draw_image_dsc->blend_mode == LV_BLEND_MODE_NORMAL || draw_image_dsc->blend_mode == LV_BLEND_MODE_ADDITIVE) { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } + break; + } + case LV_DRAW_TASK_TYPE_LABEL: { + lv_draw_label_dsc_t * draw_label_dsc = (lv_draw_label_dsc_t *) task->draw_dsc; + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)(draw_label_dsc->font->dsc); + if(fdsc->bitmap_format != LV_FONT_FMT_TXT_COMPRESSED) { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } + break; + } + case LV_DRAW_TASK_TYPE_LINE: { + lv_draw_line_dsc_t * draw_line_dsc = (lv_draw_line_dsc_t *) task->draw_dsc; + bool is_dashed = (draw_line_dsc->dash_width && draw_line_dsc->dash_gap); + if(!is_dashed && !(draw_line_dsc->round_end || draw_line_dsc->round_start)) { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } + break; + } + case LV_DRAW_TASK_TYPE_BORDER: { + const lv_draw_border_dsc_t * draw_dsc = (lv_draw_border_dsc_t *) task->draw_dsc; + if((!(draw_dsc->side != (lv_border_side_t)LV_BORDER_SIDE_FULL && draw_dsc->radius > 0)) && + (draw_dsc->radius > draw_dsc->width)) { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } + break; + } + case LV_DRAW_TASK_TYPE_BOX_SHADOW: + case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: + case LV_DRAW_TASK_TYPE_MASK_BITMAP: + case LV_DRAW_TASK_TYPE_VECTOR: + default: + break; + } + nema_cl_wait(&(draw_nema_gfx_unit->cl)); + return 0; +} + +static int32_t nema_gfx_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *) draw_unit; + + /* Return immediately if it's busy with draw task. */ + if(draw_nema_gfx_unit->task_act) + return 0; + + /* Try to get an ready to draw. */ + lv_draw_task_t * t = lv_draw_get_next_available_task(layer, NULL, DRAW_UNIT_ID_NEMA_GFX); + + /* Return 0 is no selection, some tasks can be supported by other units. */ + if(t == NULL || t->preferred_draw_unit_id != DRAW_UNIT_ID_NEMA_GFX) + return 0; + + void * buf = lv_draw_layer_alloc_buf(layer); + if(buf == NULL) + return -1; + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + draw_nema_gfx_unit->base_unit.target_layer = layer; + draw_nema_gfx_unit->base_unit.clip_area = &t->clip_area; + draw_nema_gfx_unit->task_act = t; + +#if LV_USE_OS + /* Let the render thread work. */ + if(draw_nema_gfx_unit->inited) + lv_thread_sync_signal(&draw_nema_gfx_unit->sync); +#else + nema_gfx_execute_drawing(draw_nema_gfx_unit); + + draw_nema_gfx_unit->task_act->state = LV_DRAW_TASK_STATE_READY; + draw_nema_gfx_unit->task_act = NULL; + + /* The draw unit is free now. Request a new dispatching as it can get a new task. */ + lv_draw_dispatch_request(); +#endif + + return 1; +} + +static void nema_gfx_execute_drawing(lv_draw_nema_gfx_unit_t * u) +{ + lv_draw_task_t * t = u->task_act; + lv_draw_unit_t * draw_unit = (lv_draw_unit_t *)u; + + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: + lv_draw_nema_gfx_fill(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_IMAGE: + lv_draw_nema_gfx_img(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_TRIANGLE: + lv_draw_nema_gfx_triangle(draw_unit, t->draw_dsc); + break; + case LV_DRAW_TASK_TYPE_LABEL: + lv_draw_nema_gfx_label(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LAYER: + lv_draw_nema_gfx_layer(draw_unit, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LINE: + lv_draw_nema_gfx_line(draw_unit, t->draw_dsc); + break; +#if LV_USE_NEMA_VG + case LV_DRAW_TASK_TYPE_ARC: + lv_draw_nema_gfx_arc(draw_unit, t->draw_dsc, &t->area); + break; +#endif + case LV_DRAW_TASK_TYPE_BORDER: + lv_draw_nema_gfx_border(draw_unit, t->draw_dsc, &t->area); + break; + default: + break; + } +} + +static int32_t nema_gfx_delete(lv_draw_unit_t * draw_unit) +{ +#if LV_USE_NEMA_VG + /*Free VG Buffers*/ + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *) draw_unit; + nema_vg_paint_destroy(draw_nema_gfx_unit->paint); + nema_vg_path_destroy(draw_nema_gfx_unit->path); + nema_vg_grad_destroy(draw_nema_gfx_unit->gradient); +#endif + +#if LV_USE_OS + lv_draw_nema_gfx_unit_t * _draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *) draw_unit; + LV_LOG_INFO("Cancel NemaGFX draw thread."); + _draw_nema_gfx_unit->exit_status = true; + + if(_draw_nema_gfx_unit->inited) + lv_thread_sync_signal(&_draw_nema_gfx_unit->sync); + + lv_result_t res = lv_thread_delete(&_draw_nema_gfx_unit->thread); + + return res; +#endif + +#if LV_USE_NEMA_VG == 0 && LV_USE_OS == LV_OS_NONE + LV_UNUSED(draw_unit); +#endif + return 0; +} + +#if LV_USE_OS +static void nema_gfx_render_thread_cb(void * ptr) +{ + lv_draw_nema_gfx_unit_t * u = ptr; + + lv_thread_sync_init(&u->sync); + u->inited = true; + + while(1) { + /* Wait for sync if there is no task set. */ + while(u->task_act == NULL) { + if(u->exit_status) + break; + + lv_thread_sync_wait(&u->sync); + } + + if(u->exit_status) { + LV_LOG_INFO("Ready to exit NemaGFX draw thread."); + break; + } + + if(u->task_act) { + nema_gfx_execute_drawing(u); + } + /* Signal the ready state to dispatcher. */ + u->task_act->state = LV_DRAW_TASK_STATE_READY; + /* Cleanup. */ + u->task_act = NULL; + + /* The draw unit is free now. Request a new dispatching as it can get a new task. */ + lv_draw_dispatch_request(); + } + + u->inited = false; + lv_thread_sync_delete(&u->sync); + LV_LOG_INFO("Exit NemaGFX draw thread."); +} +#endif + +#endif diff --git a/src/draw/nema_gfx/lv_draw_nema_gfx.h b/src/draw/nema_gfx/lv_draw_nema_gfx.h new file mode 100644 index 000000000..e455bb77f --- /dev/null +++ b/src/draw/nema_gfx/lv_draw_nema_gfx.h @@ -0,0 +1,122 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * 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. + * + */ + +/** + * @file lv_draw_nema_gfx.h + * + */ + +#ifndef LV_DRAW_NEMA_GFX_H +#define LV_DRAW_NEMA_GFX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_NEMA_GFX + +#include "lv_draw_nema_gfx_utils.h" + +#include "../lv_draw_private.h" +#include "../lv_draw_buf_private.h" +#include "../lv_draw_image_private.h" +#include "../lv_image_decoder_private.h" +#include "../lv_draw_label_private.h" +#include "../lv_draw_mask_private.h" +#include "../lv_draw_rect_private.h" +#include "../lv_draw_triangle_private.h" +#include "../lv_draw_vector_private.h" + +#include "../../misc/lv_area_private.h" + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_draw_unit_t base_unit; + lv_draw_task_t * task_act; +#if LV_USE_OS + lv_thread_sync_t sync; + lv_thread_t thread; + volatile bool inited; + volatile bool exit_status; +#endif + uint32_t idx; + nema_cmdlist_t cl; +#if LV_USE_NEMA_VG + NEMA_VG_PAINT_HANDLE paint; + NEMA_VG_GRAD_HANDLE gradient; + NEMA_VG_PATH_HANDLE path; +#endif +} lv_draw_nema_gfx_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_nema_gfx_init(void); + +void lv_draw_nema_gfx_deinit(void); + +void lv_draw_nema_gfx_fill(lv_draw_unit_t * draw_unit, + const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_nema_gfx_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc); + +void lv_draw_nema_gfx_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_nema_gfx_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_nema_gfx_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); + +void lv_draw_nema_gfx_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); + +void lv_draw_nema_gfx_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_nema_gfx_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, + const lv_area_t * coords); + + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_NEMA_GFX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_NEMA_GFX_H*/ \ No newline at end of file diff --git a/src/draw/nema_gfx/lv_draw_nema_gfx_arc.c b/src/draw/nema_gfx/lv_draw_nema_gfx_arc.c new file mode 100644 index 000000000..9b02f4593 --- /dev/null +++ b/src/draw/nema_gfx/lv_draw_nema_gfx_arc.c @@ -0,0 +1,92 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * 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. + * + */ + +/** + * @file lv_draw_nema_gfx_arc.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX && LV_USE_NEMA_VG + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_nema_gfx_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords) +{ + + LV_UNUSED(coords); + + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + if(dsc->width == 0) + return; + if(dsc->start_angle == dsc->end_angle) + return; + + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)draw_unit; + + lv_layer_t * layer = draw_unit->target_layer; + lv_point_t center = {dsc->center.x - layer->buf_area.x1, dsc->center.y - layer->buf_area.y1}; + + lv_area_t clip_area; + lv_area_copy(&clip_area, draw_unit->clip_area); + lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + nema_set_clip(clip_area.x1, clip_area.y1, lv_area_get_width(&clip_area), lv_area_get_height(&clip_area)); + + lv_value_precise_t end_angle = dsc->end_angle; + + if(dsc->start_angle >= dsc->end_angle) + end_angle = dsc->end_angle + 360.f; + + nema_vg_paint_clear(draw_nema_gfx_unit->paint); + nema_vg_paint_set_type(draw_nema_gfx_unit->paint, NEMA_VG_PAINT_COLOR); + lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); + uint32_t bg_color = nema_rgba(col32.red, col32.green, col32.blue, col32.alpha); + nema_vg_paint_set_paint_color(draw_nema_gfx_unit->paint, bg_color); // green + nema_vg_paint_set_stroke_width(draw_nema_gfx_unit->paint, dsc->width); + nema_vg_set_blend(NEMA_BL_SRC_OVER | NEMA_BLOP_SRC_PREMULT); + + if(dsc->rounded == 1) { + nema_vg_draw_ring(center.x, center.y, (float)dsc->radius - (float)dsc->width * 0.5f, dsc->start_angle, end_angle, + draw_nema_gfx_unit->paint); + } + else { + /* nema_vg_draw_ring_generic(center.x, center.y, (float)dsc->radius - (float)dsc->width * 0.5f, dsc->start_angle, + end_angle, draw_nema_gfx_unit->paint, 0U); */ + } + + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + +} + +#endif + diff --git a/src/draw/nema_gfx/lv_draw_nema_gfx_border.c b/src/draw/nema_gfx/lv_draw_nema_gfx_border.c new file mode 100644 index 000000000..0d9ada422 --- /dev/null +++ b/src/draw/nema_gfx/lv_draw_nema_gfx_border.c @@ -0,0 +1,223 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * 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. + * + */ + +/** + * @file lv_draw_nema_gfx_fill.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX +#include + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_nema_gfx_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) + return; + if(dsc->width == 0) + return; + if(dsc->side == LV_BORDER_SIDE_NONE) + return; + + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)draw_unit; + + lv_layer_t * layer = draw_unit->target_layer; + lv_area_t inward_coords; + int32_t width = dsc->width; + + /* Move border inwards to align with software rendered border */ + inward_coords.x1 = coords->x1 + ceil(width / 2.0f); + inward_coords.x2 = coords->x2 - floor(width / 2.0f); + inward_coords.y1 = coords->y1 + ceil(width / 2.0f); + inward_coords.y2 = coords->y2 - floor(width / 2.0f); + + lv_area_move(&inward_coords, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t clip_area; + lv_area_copy(&clip_area, draw_unit->clip_area); + lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + nema_set_clip(clip_area.x1, clip_area.y1, lv_area_get_width(&clip_area), lv_area_get_height(&clip_area)); + + lv_area_t clipped_coords; + if(!lv_area_intersect(&clipped_coords, &inward_coords, &clip_area)) + return; /*Fully clipped, nothing to do*/ + + lv_color_format_t dst_cf = layer->draw_buf->header.cf; + uint32_t dst_nema_cf = lv_nemagfx_cf_to_nema(dst_cf); + + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(layer->draw_buf->data), lv_area_get_width(&(layer->buf_area)), + lv_area_get_height(&(layer->buf_area)), dst_nema_cf, + lv_area_get_width(&(layer->buf_area))*lv_color_format_get_size(dst_cf)); + + /* Recalculate float Dimensions */ + float x1 = (float)coords->x1 + ((float)width / 2.0f) - (float)layer->buf_area.x1; + float x2 = (float)coords->x2 - ((float)width / 2.0f) - (float)layer->buf_area.x1; + float y1 = (float)coords->y1 + ((float)width / 2.0f) - (float)layer->buf_area.y1; + float y2 = (float)coords->y2 - ((float)width / 2.0f) - (float)layer->buf_area.y1; + float coords_bg_w = x2 - x1 + 1; + float coords_bg_h = y2 - y1 + 1; + int32_t short_side = LV_MIN(coords_bg_w, coords_bg_h); + float radius = (float)LV_MIN(dsc->radius, short_side >> 1); + + lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); + uint32_t bg_color = nema_rgba(col32.red, col32.green, col32.blue, col32.alpha); + + if(col32.alpha < 255U) { + nema_set_blend_fill(NEMA_BL_SRC_OVER); + bg_color = nema_premultiply_rgba(bg_color); + } + else { + nema_set_blend_fill(NEMA_BL_SRC); + } + + if(radius > 0.0f) { + nema_draw_rounded_rect_aa(x1, y1, coords_bg_w, coords_bg_h, radius, width, bg_color); + } + else { + lv_area_t rect_coords = *coords; + lv_area_move(&rect_coords, -layer->buf_area.x1, -layer->buf_area.y1); + int32_t border_width = lv_area_get_width(&rect_coords); + int32_t border_height = lv_area_get_height(&rect_coords); + + if(dsc->side & LV_BORDER_SIDE_TOP) { + float x = rect_coords.x1 + width; + float y = rect_coords.y1; + float w = border_width - 2 * width; + float h = width; + nema_enable_aa(1, 0, 1, 0); + nema_fill_rect_f(x, y, w, h, bg_color); + } + + if(dsc->side & LV_BORDER_SIDE_BOTTOM) { + float x = rect_coords.x1 + width; + float y = rect_coords.y1 + border_height - width; + float w = border_width - 2 * width; + float h = width; + nema_enable_aa(1, 0, 1, 0); + nema_fill_rect_f(x, y, w, h, bg_color); + } + + if(dsc->side & LV_BORDER_SIDE_LEFT) { + float x = rect_coords.x1; + float y = rect_coords.y1 + width; + float w = width; + float h = border_height - 2 * width; + nema_enable_aa(0, 1, 0, 1); + nema_fill_rect_f(x, y, w, h, bg_color); + } + + if(dsc->side & LV_BORDER_SIDE_RIGHT) { + float x = rect_coords.x1 + border_width - width; + float y = rect_coords.y1 + width; + float w = width; + float h = border_height - 2 * width; + nema_enable_aa(0, 1, 0, 1); + nema_fill_rect_f(x, y, w, h, bg_color); + } + + /*Draw small corner rectangles + Top Left*/ + if(dsc->side & LV_BORDER_SIDE_TOP || dsc->side & LV_BORDER_SIDE_LEFT) { + float x = rect_coords.x1; + float y = rect_coords.y1; + float w = width; + float h = width; + + if(!(dsc->side & LV_BORDER_SIDE_TOP)) + nema_enable_aa(1, 1, 0, 1); + else if(!(dsc->side & LV_BORDER_SIDE_LEFT)) + nema_enable_aa(1, 0, 1, 1); + else + nema_enable_aa(1, 0, 0, 1); + + nema_fill_rect_f(x, y, w, h, bg_color); + } + + /*Top Right*/ + if(dsc->side & LV_BORDER_SIDE_TOP || dsc->side & LV_BORDER_SIDE_RIGHT) { + float x = rect_coords.x1 + border_width - width; + float y = rect_coords.y1; + float w = width; + float h = width; + + if(!(dsc->side & LV_BORDER_SIDE_TOP)) + nema_enable_aa(1, 1, 0, 1); + else if(!(dsc->side & LV_BORDER_SIDE_RIGHT)) + nema_enable_aa(1, 1, 1, 0); + else + nema_enable_aa(1, 1, 0, 0); + + nema_fill_rect_f(x, y, w, h, bg_color); + } + + /*Bottom Right*/ + if(dsc->side & LV_BORDER_SIDE_BOTTOM || dsc->side & LV_BORDER_SIDE_RIGHT) { + float x = rect_coords.x1 + border_width - width; + float y = rect_coords.y1 + border_height - width; + float w = width; + float h = width; + + if(!(dsc->side & LV_BORDER_SIDE_BOTTOM)) + nema_enable_aa(0, 1, 1, 1); + else if(!(dsc->side & LV_BORDER_SIDE_RIGHT)) + nema_enable_aa(1, 1, 1, 0); + else + nema_enable_aa(0, 1, 1, 0); + + nema_fill_rect_f(x, y, w, h, bg_color); + } + + /*Bottom Left*/ + if(dsc->side & LV_BORDER_SIDE_BOTTOM || dsc->side & LV_BORDER_SIDE_LEFT) { + float x = rect_coords.x1; + float y = rect_coords.y1 + border_height - width; + float w = width; + float h = width; + + if(!(dsc->side & LV_BORDER_SIDE_BOTTOM)) + nema_enable_aa(0, 1, 1, 1); + else if(!(dsc->side & LV_BORDER_SIDE_LEFT)) + nema_enable_aa(1, 0, 1, 1); + else + nema_enable_aa(0, 0, 1, 1); + + nema_fill_rect_f(x, y, w, h, bg_color); + } + + } + + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + +} +#endif diff --git a/src/draw/nema_gfx/lv_draw_nema_gfx_fill.c b/src/draw/nema_gfx/lv_draw_nema_gfx_fill.c new file mode 100644 index 000000000..cdd2de12e --- /dev/null +++ b/src/draw/nema_gfx/lv_draw_nema_gfx_fill.c @@ -0,0 +1,146 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * 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. + * + */ + +/** + * @file lv_draw_nema_gfx_fill.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_nema_gfx_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)draw_unit; + + lv_layer_t * layer = draw_unit->target_layer; + lv_area_t rel_coords; + lv_area_copy(&rel_coords, coords); + lv_area_move(&rel_coords, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_unit->clip_area); + lv_area_move(&rel_clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + nema_set_clip(rel_clip_area.x1, rel_clip_area.y1, lv_area_get_width(&rel_clip_area), + lv_area_get_height(&rel_clip_area)); + + lv_area_t clipped_coords; + if(!lv_area_intersect(&clipped_coords, &rel_coords, &rel_clip_area)) + return; /*Fully clipped, nothing to do*/ + + lv_color_format_t dst_cf = layer->draw_buf->header.cf; + uint32_t dst_nema_cf = lv_nemagfx_cf_to_nema(dst_cf); + + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(layer->draw_buf->data), lv_area_get_width(&(layer->buf_area)), + lv_area_get_height(&(layer->buf_area)), dst_nema_cf, + lv_area_get_width(&(layer->buf_area))*lv_color_format_get_size(dst_cf)); + + int32_t coords_bg_w = lv_area_get_width(&rel_coords); + int32_t coords_bg_h = lv_area_get_height(&rel_coords); + int32_t short_side = LV_MIN(coords_bg_w, coords_bg_h); + int32_t radius = LV_MIN(dsc->radius, short_side >> 1); + + if((dsc->grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE)) { + + lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); + uint32_t bg_color = nema_rgba(col32.red, col32.green, col32.blue, col32.alpha); + + if(col32.alpha < 255U) { + nema_set_blend_fill(NEMA_BL_SRC_OVER); + bg_color = nema_premultiply_rgba(bg_color); + } + else { + nema_set_blend_fill(NEMA_BL_SRC); + } + + if(radius > 0.f) + nema_fill_rounded_rect_aa(rel_coords.x1, rel_coords.y1, coords_bg_w, coords_bg_h, radius, bg_color); + else + nema_fill_rect(rel_coords.x1, rel_coords.y1, coords_bg_w, coords_bg_h, bg_color); + } +#if LV_USE_NEMA_VG + else { + + nema_vg_paint_clear(draw_nema_gfx_unit->paint); + + nema_vg_paint_set_type(draw_nema_gfx_unit->paint, NEMA_VG_PAINT_GRAD_LINEAR); + nema_vg_set_blend(NEMA_BL_SRC_OVER | NEMA_BLOP_SRC_PREMULT); + + float stops[LV_GRADIENT_MAX_STOPS]; + color_var_t colors[LV_GRADIENT_MAX_STOPS]; + + uint32_t cnt = LV_MAX(dsc->grad.stops_count, LV_GRADIENT_MAX_STOPS); + + for(uint8_t i = 0; i < cnt; i++) { + stops[i] = (float)(dsc->grad.stops[i].frac) / 255.f; + colors[i].a = LV_OPA_MIX2(dsc->grad.stops[i].opa, dsc->opa); + colors[i].r = dsc->grad.stops[i].color.red; + colors[i].g = dsc->grad.stops[i].color.green; + colors[i].b = dsc->grad.stops[i].color.blue; + } + + nema_vg_grad_set(draw_nema_gfx_unit->gradient, cnt, stops, colors); + + float x0, y0, x1, y1; + + if(dsc->grad.dir == LV_GRAD_DIR_HOR) { + x0 = rel_coords.x1; + x1 = rel_coords.x2; + y0 = rel_coords.y1; + y1 = rel_coords.y1; + } + else { + x0 = rel_coords.x1; + x1 = rel_coords.x1; + y0 = rel_coords.y1; + y1 = rel_coords.y2; + } + + nema_vg_paint_set_grad_linear(draw_nema_gfx_unit->paint, draw_nema_gfx_unit->gradient, x0, y0, x1, y1, + NEMA_TEX_CLAMP | NEMA_FILTER_BL); + + if(radius > 0.f) + nema_vg_draw_rounded_rect(rel_coords.x1, rel_coords.y1, coords_bg_w, coords_bg_h, radius, radius, NULL, + draw_nema_gfx_unit->paint); + else + nema_vg_draw_rect(rel_coords.x1, rel_coords.y1, coords_bg_w, coords_bg_h, NULL, draw_nema_gfx_unit->paint); + } +#endif + + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + +} +#endif diff --git a/src/draw/nema_gfx/lv_draw_nema_gfx_hal.c b/src/draw/nema_gfx/lv_draw_nema_gfx_hal.c new file mode 100644 index 000000000..c82d938b2 --- /dev/null +++ b/src/draw/nema_gfx/lv_draw_nema_gfx_hal.c @@ -0,0 +1,263 @@ +/** + * @file lv_draw_nema_gfx_hal.c + * + * Global functions that implement some HAL functionality + * which Nema will call directly. + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_NEMA_GFX + +#include "../../misc/lv_types.h" +#include "../../misc/lv_assert.h" +#include "../../stdlib/lv_string.h" + +#include "config.h" +#include +#include + +#include +#include + +#include LV_NEMA_GFX_HAL_INCLUDE + +#include + +#include "tsi_malloc.h" + +extern GPU2D_HandleTypeDef hgpu2d; + +/********************* + * DEFINES + *********************/ + +#define RING_SIZE 1024 /* Ring Buffer Size in byte */ + +/* NemaGFX byte pool size in bytes. + * One byte per peixel for masking/stencling plus 10240 for additional allocations. + */ +#if defined(LV_NEMA_GFX_MAX_RESX) && defined(LV_NEMA_GFX_MAX_RESY) + #define NEMAGFX_MEM_POOL_SIZE ((LV_NEMA_GFX_MAX_RESX * LV_NEMA_GFX_MAX_RESY) + 10240) +#else + /* LV_USE_NEMA_VG is 0 so masking/stencling memory is not needed. */ + #define NEMAGFX_MEM_POOL_SIZE 10240 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if (USE_HAL_GPU2D_REGISTER_CALLBACKS == 1) + static void GPU2D_CommandListCpltCallback(GPU2D_HandleTypeDef * hgpu2d, uint32_t CmdListID); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +LOCATION_PRAGMA_NOLOAD("Nemagfx_Memory_Pool_Buffer") +static uint8_t nemagfx_pool_mem[NEMAGFX_MEM_POOL_SIZE]; /* NemaGFX memory pool */ + +static nema_ringbuffer_t ring_buffer_str; +static volatile int last_cl_id = -1; + +//static osSemaphoreId_t nema_irq_sem = NULL; // Declare CL IRQ semaphore + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +#if (USE_HAL_GPU2D_REGISTER_CALLBACKS == 1) + static void GPU2D_CommandListCpltCallback(GPU2D_HandleTypeDef * hgpu2d, uint32_t CmdListID) +#else + void HAL_GPU2D_CommandListCpltCallback(GPU2D_HandleTypeDef * hgpu2d, uint32_t CmdListID) +#endif +{ + LV_UNUSED(hgpu2d); + + last_cl_id = CmdListID; + + /* Return a token back to a semaphore */ + // osSemaphoreRelease(nema_irq_sem); +} + +int32_t nema_sys_init(void) +{ + int error_code = 0; + + /* Setup GPU2D Callback */ +#if (USE_HAL_GPU2D_REGISTER_CALLBACKS == 1) + /* Register Command List Comlete Callback */ + HAL_GPU2D_RegisterCommandListCpltCallback(&hgpu2d, GPU2D_CommandListCpltCallback); +#endif + + /* Create IRQ semaphore */ + // nema_irq_sem = osSemaphoreNew(1, 1, NULL); + // assert(nema_irq_sem != NULL); + + /* Initialise Mem Space */ + error_code = tsi_malloc_init_pool_aligned(0, (void *)nemagfx_pool_mem, (uintptr_t)nemagfx_pool_mem, + NEMAGFX_MEM_POOL_SIZE, 1, 8); + LV_ASSERT(error_code == 0); + + /* Allocate ring_buffer memory */ + ring_buffer_str.bo = nema_buffer_create(RING_SIZE); + LV_ASSERT(ring_buffer_str.bo.base_virt); + + /* Initialize Ring Buffer */ + error_code = nema_rb_init(&ring_buffer_str, 1); + if(error_code < 0) { + return error_code; + } + + /* Reset last_cl_id counter */ + last_cl_id = 0; + + return error_code; +} + +uint32_t nema_reg_read(uint32_t reg) +{ + return HAL_GPU2D_ReadRegister(&hgpu2d, reg); +} + +void nema_reg_write(uint32_t reg, uint32_t value) +{ + HAL_GPU2D_WriteRegister(&hgpu2d, reg, value); +} + + + + +int nema_wait_irq(void) +{ + return 0; +} + + +int nema_wait_irq_cl(int cl_id) +{ + while(last_cl_id < cl_id) { + (void)nema_wait_irq(); + } + + return 0; +} + +int nema_wait_irq_brk(int brk_id) +{ + while(nema_reg_read(GPU2D_BREAKPOINT) == 0U) { + (void)nema_wait_irq(); + } + + return 0; +} + +void nema_host_free(void * ptr) +{ + tsi_free(ptr); +} + +void * nema_host_malloc(unsigned size) +{ + return tsi_malloc(size); +} + +nema_buffer_t nema_buffer_create(int size) +{ + nema_buffer_t bo; + lv_memset(&bo, 0, sizeof(bo)); + bo.base_virt = tsi_malloc(size); + bo.base_phys = (uint32_t)bo.base_virt; + bo.size = size; + LV_ASSERT_MSG(bo.base_virt != 0, "Unable to allocate memory in nema_buffer_create"); + + return bo; +} + +nema_buffer_t nema_buffer_create_pool(int pool, int size) +{ + LV_UNUSED(pool); + + return nema_buffer_create(size); +} + +void * nema_buffer_map(nema_buffer_t * bo) +{ + return bo->base_virt; +} + +void nema_buffer_unmap(nema_buffer_t * bo) +{ + LV_UNUSED(bo); +} + +void nema_buffer_destroy(nema_buffer_t * bo) +{ + if(bo->fd == -1) { + return; /* Buffer weren't allocated! */ + } + + tsi_free(bo->base_virt); + + bo->base_virt = (void *)0; + bo->base_phys = 0; + bo->size = 0; + bo->fd = -1; /* Buffer not allocated */ +} + +uintptr_t nema_buffer_phys(nema_buffer_t * bo) +{ + return bo->base_phys; +} + +void nema_buffer_flush(nema_buffer_t * bo) +{ + LV_UNUSED(bo); +} + +int nema_mutex_lock(int mutex_id) +{ + int retval = 0; + + LV_UNUSED(mutex_id); + + return retval; +} + +int nema_mutex_unlock(int mutex_id) +{ + int retval = 0; + + LV_UNUSED(mutex_id); + + return retval; +} + +void platform_disable_cache(void) +{ + +} + +void platform_invalidate_cache(void) +{ + +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /* LV_USE_NEMA_GFX */ diff --git a/src/draw/nema_gfx/lv_draw_nema_gfx_img.c b/src/draw/nema_gfx/lv_draw_nema_gfx_img.c new file mode 100644 index 000000000..e6eaa21b7 --- /dev/null +++ b/src/draw/nema_gfx/lv_draw_nema_gfx_img.c @@ -0,0 +1,223 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * 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. + * + */ + +/** + * @file lv_draw_nema_gfx_fill.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX + + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void _draw_nema_gfx_tile(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords); + +static void _draw_nema_gfx_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords); + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _draw_nema_gfx_tile(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords) +{ + + lv_image_decoder_dsc_t decoder_dsc; + lv_result_t res = lv_image_decoder_open(&decoder_dsc, dsc->src, NULL); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to open image"); + return; + } + + int32_t img_w = dsc->header.w; + int32_t img_h = dsc->header.h; + + lv_area_t tile_area; + if(lv_area_get_width(&dsc->image_area) >= 0) { + tile_area = dsc->image_area; + } + else { + tile_area = *coords; + } + lv_area_set_width(&tile_area, img_w); + lv_area_set_height(&tile_area, img_h); + + int32_t tile_x_start = tile_area.x1; + + while(tile_area.y1 <= draw_unit->clip_area->y2) { + while(tile_area.x1 <= draw_unit->clip_area->x2) { + + lv_area_t clipped_img_area; + if(lv_area_intersect(&clipped_img_area, &tile_area, draw_unit->clip_area)) { + _draw_nema_gfx_img(draw_unit, dsc, &tile_area); + } + + tile_area.x1 += img_w; + tile_area.x2 += img_w; + } + + tile_area.y1 += img_h; + tile_area.y2 += img_h; + tile_area.x1 = tile_x_start; + tile_area.x2 = tile_x_start + img_w - 1; + } + + lv_image_decoder_close(&decoder_dsc); +} + +static void _draw_nema_gfx_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)draw_unit; + + lv_layer_t * layer = draw_unit->target_layer; + const lv_image_dsc_t * img_dsc = dsc->src; + + lv_area_t blend_area; + /*Let's get the blend area which is the intersection of the area to fill and the clip area.*/ + if(!lv_area_intersect(&blend_area, coords, draw_unit->clip_area)) + return; /*Fully clipped, nothing to do*/ + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_unit->clip_area); + lv_area_move(&rel_clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + bool has_transform = (dsc->rotation != 0 || dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE); + /* bool recolor = (dsc->recolor_opa > LV_OPA_MIN); */ + + /*Make the blend area relative to the buffer*/ + lv_area_move(&blend_area, -layer->buf_area.x1, -layer->buf_area.y1); + + uint32_t tex_w = lv_area_get_width(coords); + uint32_t tex_h = lv_area_get_height(coords); + + nema_set_clip(rel_clip_area.x1, rel_clip_area.y1, lv_area_get_width(&rel_clip_area), + lv_area_get_height(&rel_clip_area)); + + lv_color_format_t dst_cf = layer->draw_buf->header.cf; + uint32_t dst_nema_cf = lv_nemagfx_cf_to_nema(dst_cf); + + const void * src_buf = img_dsc->data; + + uint32_t blending_mode = lv_nemagfx_blending_mode(dsc->blend_mode); + + lv_color_format_t src_cf = img_dsc->header.cf; + + /*Image contains Alpha*/ + if(src_cf == LV_COLOR_FORMAT_ARGB8888 || src_cf == LV_COLOR_FORMAT_XRGB8888) { + blending_mode |= NEMA_BLOP_SRC_PREMULT; + } + + uint32_t src_nema_cf = lv_nemagfx_cf_to_nema(src_cf); + uint32_t src_stride = img_dsc->header.stride; + + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(layer->draw_buf->data), lv_area_get_width(&(layer->buf_area)), + lv_area_get_height(&(layer->buf_area)), dst_nema_cf, + lv_area_get_width(&(layer->buf_area))*lv_color_format_get_size(dst_cf)); + + nema_bind_src_tex((uintptr_t)(src_buf), tex_w, tex_h, src_nema_cf, src_stride, + dsc->antialias ? NEMA_FILTER_BL : NEMA_FILTER_PS); + + /* if(recolor) { + lv_color32_t col32 = lv_color_to_32(dsc->recolor, LV_OPA_MIX2(dsc->recolor_opa, dsc->opa)); + uint32_t color = nema_rgba(col32.red, col32.green, col32.blue, col32.alpha); + nema_set_recolor_color(color); + blending_mode |= NEMA_BLOP_RECOLOR; + } */ + + if(dsc->opa < 255) { + uint32_t rgba = ((uint32_t)dsc->opa << 24U) | ((uint32_t)dsc->opa << 16U) | ((uint32_t)dsc->opa << 8U) | (( + uint32_t)dsc->opa); + nema_set_const_color(rgba); + blending_mode |= NEMA_BLOP_MODULATE_A; + } + + nema_set_blend_blit(blending_mode); + + if(!has_transform) { + nema_blit_rect((coords->x1 - layer->buf_area.x1), + (coords->y1 - layer->buf_area.y1), tex_w, tex_h); + } + else { + /*Calculate the transformed points*/ + float x0 = (coords->x1 - layer->buf_area.x1); + float y0 = (coords->y1 - layer->buf_area.y1); + float x1 = x0 + tex_w ; + float y1 = y0; + float x2 = x0 + tex_w ; + float y2 = y0 + tex_h; + float x3 = x0 ; + float y3 = y0 + tex_h; + + nema_matrix3x3_t m; + nema_mat3x3_load_identity(m); + nema_mat3x3_translate(m, -x0, -y0); + nema_mat3x3_translate(m, -(float)dsc->pivot.x, -(float)dsc->pivot.y); + nema_mat3x3_rotate(m, (dsc->rotation / 10.0f)); /* angle is 1/10 degree */ + float scale_x = 1.f * dsc->scale_x / LV_SCALE_NONE; + float scale_y = 1.f * dsc->scale_y / LV_SCALE_NONE; + nema_mat3x3_scale(m, (float)scale_x, (float)scale_y); + nema_mat3x3_translate(m, (float)dsc->pivot.x, (float)dsc->pivot.y); + nema_mat3x3_translate(m, x0, y0); + + /*Apply Transformation Matrix to Vertices*/ + nema_mat3x3_mul_vec(m, &x0, &y0); + nema_mat3x3_mul_vec(m, &x1, &y1); + nema_mat3x3_mul_vec(m, &x2, &y2); + nema_mat3x3_mul_vec(m, &x3, &y3); + + nema_blit_quad_fit(x0, y0, + x1, y1, + x2, y2, + x3, y3); + } + + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + +} +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_nema_gfx_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords) +{ + + if(!dsc->tile) { + _draw_nema_gfx_img(draw_unit, dsc, coords); + } + else { + _draw_nema_gfx_tile(draw_unit, dsc, coords); + } + +} +#endif diff --git a/src/draw/nema_gfx/lv_draw_nema_gfx_label.c b/src/draw/nema_gfx/lv_draw_nema_gfx_label.c new file mode 100644 index 000000000..45d093cf9 --- /dev/null +++ b/src/draw/nema_gfx/lv_draw_nema_gfx_label.c @@ -0,0 +1,608 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * 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. + * + */ + +/** + * @file lv_draw_nema_gfx_fill.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX +#include "../../font/lv_font.h" +#include "../../font/lv_font_fmt_txt.h" +#include "../../misc/lv_utils.h" +#include "../../misc/lv_text_private.h" + +/********************* + * DEFINES + *********************/ +#define LV_LABEL_HINT_UPDATE_TH 1024 /*Update the "hint" if the label's y coordinates have changed more then this*/ + +/*Forward declarations*/ +void nema_set_matrix(nema_matrix3x3_t m); +void nema_raster_rect(int x, int y, int w, int h); + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void _draw_nema_gfx_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area); + +static void _draw_label_iterate_characters(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords); + +static inline uint8_t _bpp_nema_gfx_format(lv_draw_glyph_dsc_t * glyph_draw_dsc); + +static void _draw_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * dsc, const lv_point_t * pos, + const lv_font_t * font, uint32_t letter); + +static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter); + +static int unicode_list_compare(const void * ref, const void * element) +{ + return ((int32_t)(*(uint16_t *)ref)) - ((int32_t)(*(uint16_t *)element)); +} + +static bool raw_bitmap = false; + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_nema_gfx_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + lv_layer_t * layer = draw_unit->target_layer; + + lv_area_t clip_area; + lv_area_copy(&clip_area, draw_unit->clip_area); + lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_color_format_t dst_cf = layer->draw_buf->header.cf; + uint32_t dst_nema_cf = lv_nemagfx_cf_to_nema(dst_cf); + + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(layer->draw_buf->data), lv_area_get_width(&(layer->buf_area)), + lv_area_get_height(&(layer->buf_area)), dst_nema_cf, + lv_area_get_width(&(layer->buf_area))*lv_color_format_get_size(dst_cf)); + + nema_set_clip(clip_area.x1, clip_area.y1, lv_area_get_width(&clip_area), lv_area_get_height(&clip_area)); + + _draw_label_iterate_characters(draw_unit, dsc, coords); + + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)draw_unit; + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + nema_cl_wait(&(draw_nema_gfx_unit->cl)); +} + +/********************** + * STATIC FUNCTIONS + **********************/ +static inline uint8_t _bpp_nema_gfx_format(lv_draw_glyph_dsc_t * glyph_draw_dsc) +{ + uint32_t format = glyph_draw_dsc->g->format; + + switch(format) { + case LV_FONT_GLYPH_FORMAT_A1: + return NEMA_A1; + case LV_FONT_GLYPH_FORMAT_A2: + return NEMA_A2; + case LV_FONT_GLYPH_FORMAT_A4: + return NEMA_A4; + default: + return NEMA_A8; + } +} + +static void _draw_nema_gfx_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area) +{ + if(glyph_draw_dsc) { + if(glyph_draw_dsc->format == LV_FONT_GLYPH_FORMAT_NONE) { +#if LV_USE_FONT_PLACEHOLDER + /* Draw a placeholder rectangle*/ + lv_draw_border_dsc_t border_draw_dsc; + lv_draw_border_dsc_init(&border_draw_dsc); + border_draw_dsc.opa = glyph_draw_dsc->opa; + border_draw_dsc.color = glyph_draw_dsc->color; + border_draw_dsc.width = 1; + lv_draw_nema_gfx_border(draw_unit, &border_draw_dsc, glyph_draw_dsc->bg_coords); +#endif + } + else if(glyph_draw_dsc->format >= LV_FONT_GLYPH_FORMAT_A1 && + glyph_draw_dsc->format <= LV_FONT_GLYPH_FORMAT_A8) { + /*Do not draw transparent things*/ + if(glyph_draw_dsc->opa <= LV_OPA_MIN) + return; + + lv_layer_t * layer = draw_unit->target_layer; + + lv_area_t blend_area; + if(!lv_area_intersect(&blend_area, glyph_draw_dsc->letter_coords, draw_unit->clip_area)) + return; + lv_area_move(&blend_area, -layer->buf_area.x1, -layer->buf_area.y1); + + const lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data; + const void * mask_buf = draw_buf->data; + + + int32_t x = glyph_draw_dsc->letter_coords->x1 - layer->buf_area.x1; + int32_t y = glyph_draw_dsc->letter_coords->y1 - layer->buf_area.y1; + int32_t w = glyph_draw_dsc->g->box_w; + int32_t h = glyph_draw_dsc->g->box_h; + + if(raw_bitmap) { + nema_bind_src_tex((uintptr_t)(mask_buf), w * h, 1, _bpp_nema_gfx_format(glyph_draw_dsc), 0, NEMA_FILTER_PS); + + nema_matrix3x3_t m = { + {1, w, -x - (y * w) - (0.5 * w)}, + {0, 1, 0}, + {0, 0, 1} + }; + + nema_set_matrix(m); + nema_raster_rect(x, y, w, h); + } + else { + nema_bind_src_tex((uintptr_t)(mask_buf), w, h, NEMA_A8, w, NEMA_FILTER_PS); + nema_blit(x, y); + } + } + else if(glyph_draw_dsc->format == LV_FONT_GLYPH_FORMAT_IMAGE) { +#if LV_USE_IMGFONT + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + img_dsc.angle = 0; + img_dsc.zoom = LV_ZOOM_NONE; + img_dsc.opa = glyph_draw_dsc->opa; + img_dsc.src = glyph_draw_dsc->glyph_data; + lv_draw_nema_gfx_img(draw_unit, &img_dsc, glyph_draw_dsc->letter_coords); +#endif + } + } + + if(fill_draw_dsc && fill_area) { + lv_draw_nema_gfx_fill(draw_unit, fill_draw_dsc, fill_area); + } + +} + +static inline void _set_color_blend(uint32_t color, uint8_t alpha) +{ + nema_set_tex_color(color); + + if(alpha < 255U) { + nema_set_blend_blit(NEMA_BL_SIMPLE | NEMA_BLOP_MODULATE_A); + nema_set_const_color(color); + } + else { + nema_set_blend_blit(NEMA_BL_SIMPLE); + } +} + +static void _draw_label_iterate_characters(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords) +{ + const lv_font_t * font = dsc->font; + int32_t w; + + lv_area_t clipped_area; + bool clip_ok = lv_area_intersect(&clipped_area, coords, draw_unit->clip_area); + if(!clip_ok) return; + + lv_text_align_t align = dsc->align; + lv_base_dir_t base_dir = dsc->bidi_dir; + + lv_bidi_calculate_align(&align, &base_dir, dsc->text); + + if((dsc->flag & LV_TEXT_FLAG_EXPAND) == 0) { + /*Normally use the label's width as width*/ + w = lv_area_get_width(coords); + } + else { + /*If EXPAND is enabled then not limit the text's width to the object's width*/ + lv_point_t p; + lv_text_get_size(&p, dsc->text, dsc->font, dsc->letter_space, dsc->line_space, LV_COORD_MAX, + dsc->flag); + w = p.x; + } + + int32_t line_height_font = lv_font_get_line_height(font); + int32_t line_height = line_height_font + dsc->line_space; + + /*Init variables for the first line*/ + int32_t line_width = 0; + lv_point_t pos; + lv_point_set(&pos, coords->x1, coords->y1); + + int32_t x_ofs = 0; + int32_t y_ofs = 0; + x_ofs = dsc->ofs_x; + y_ofs = dsc->ofs_y; + pos.y += y_ofs; + + uint32_t line_start = 0; + int32_t last_line_start = -1; + + /*Check the hint to use the cached info*/ + if(dsc->hint && y_ofs == 0 && coords->y1 < 0) { + /*If the label changed too much recalculate the hint.*/ + if(LV_ABS(dsc->hint->coord_y - coords->y1) > LV_LABEL_HINT_UPDATE_TH - 2 * line_height) { + dsc->hint->line_start = -1; + } + last_line_start = dsc->hint->line_start; + } + + /*Use the hint if it's valid*/ + if(dsc->hint && last_line_start >= 0) { + line_start = last_line_start; + pos.y += dsc->hint->y; + } + + uint32_t line_end = line_start + lv_text_get_next_line(&dsc->text[line_start], font, dsc->letter_space, w, NULL, + dsc->flag); + + /*Go the first visible line*/ + while(pos.y + line_height_font < draw_unit->clip_area->y1) { + /*Go to next line*/ + line_start = line_end; + line_end += lv_text_get_next_line(&dsc->text[line_start], font, dsc->letter_space, w, NULL, dsc->flag); + pos.y += line_height; + + /*Save at the threshold coordinate*/ + if(dsc->hint && pos.y >= -LV_LABEL_HINT_UPDATE_TH && dsc->hint->line_start < 0) { + dsc->hint->line_start = line_start; + dsc->hint->y = pos.y - coords->y1; + dsc->hint->coord_y = coords->y1; + } + + if(dsc->text[line_start] == '\0') return; + } + + /*Align to middle*/ + if(align == LV_TEXT_ALIGN_CENTER) { + line_width = lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, dsc->letter_space); + + pos.x += (lv_area_get_width(coords) - line_width) / 2; + + } + /*Align to the right*/ + else if(align == LV_TEXT_ALIGN_RIGHT) { + line_width = lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, dsc->letter_space); + pos.x += lv_area_get_width(coords) - line_width; + } + + uint32_t sel_start = dsc->sel_start; + uint32_t sel_end = dsc->sel_end; + if(sel_start > sel_end) { + uint32_t tmp = sel_start; + sel_start = sel_end; + sel_end = tmp; + } + + lv_area_t bg_coords; + lv_draw_glyph_dsc_t draw_letter_dsc; + lv_draw_glyph_dsc_init(&draw_letter_dsc); + draw_letter_dsc.opa = dsc->opa; + draw_letter_dsc.bg_coords = &bg_coords; + draw_letter_dsc.color = dsc->color; + + lv_draw_fill_dsc_t fill_dsc; + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.opa = dsc->opa; + int32_t underline_width = font->underline_thickness ? font->underline_thickness : 1; + int32_t line_start_x; + uint32_t i; + int32_t letter_w; + + lv_color32_t dsc_col32 = lv_color_to_32(dsc->color, dsc->opa); + uint32_t nema_dsc_color = nema_rgba(dsc_col32.red, dsc_col32.green, dsc_col32.blue, dsc_col32.alpha); + lv_color32_t dsc_sel_col32 = lv_color_to_32(dsc->sel_color, dsc->opa); + uint32_t nema_dsc_sel_color = nema_rgba(dsc_sel_col32.red, dsc_sel_col32.green, dsc_sel_col32.blue, + dsc_sel_col32.alpha); + + _set_color_blend(nema_dsc_color, dsc_col32.alpha); + + uint32_t is_dsc_color_enabled = 1U; + + /*Write out all lines*/ + while(dsc->text[line_start] != '\0') { + pos.x += x_ofs; + line_start_x = pos.x; + + /*Write all letter of a line*/ + i = 0; +#if LV_USE_BIDI + char * bidi_txt = lv_malloc(line_end - line_start + 1); + LV_ASSERT_MALLOC(bidi_txt); + _lv_bidi_process_paragraph(dsc->text + line_start, bidi_txt, line_end - line_start, base_dir, NULL, 0); +#else + const char * bidi_txt = dsc->text + line_start; +#endif + + while(i < line_end - line_start) { + uint32_t logical_char_pos = 0; + if(sel_start != 0xFFFF && sel_end != 0xFFFF) { +#if LV_USE_BIDI + logical_char_pos = lv_text_encoded_get_char_id(dsc->text, line_start); + uint32_t t = lv_text_encoded_get_char_id(bidi_txt, i); + logical_char_pos += _lv_bidi_get_logical_pos(bidi_txt, NULL, line_end - line_start, base_dir, t, NULL); +#else + logical_char_pos = lv_text_encoded_get_char_id(dsc->text, line_start + i); +#endif + } + + uint32_t letter; + uint32_t letter_next; + lv_text_encoded_letter_next_2(bidi_txt, &letter, &letter_next, &i); + + letter_w = lv_font_get_glyph_width(font, letter, letter_next); + + /*Always set the bg_coordinates for placeholder drawing*/ + bg_coords.x1 = pos.x; + bg_coords.y1 = pos.y; + bg_coords.x2 = pos.x + letter_w - 1; + bg_coords.y2 = pos.y + line_height - 1; + + if(i >= line_end - line_start) { + if(dsc->decor & LV_TEXT_DECOR_UNDERLINE) { + lv_area_t fill_area; + fill_area.x1 = line_start_x; + fill_area.x2 = pos.x + letter_w - 1; + fill_area.y1 = pos.y + font->line_height - font->base_line - font->underline_position; + fill_area.y2 = fill_area.y1 + underline_width - 1; + + fill_dsc.color = dsc->color; + lv_draw_nema_gfx_fill(draw_unit, &fill_dsc, &fill_area); + } + if(dsc->decor & LV_TEXT_DECOR_STRIKETHROUGH) { + lv_area_t fill_area; + fill_area.x1 = line_start_x; + fill_area.x2 = pos.x + letter_w - 1; + fill_area.y1 = pos.y + (font->line_height - font->base_line) * 2 / 3 + font->underline_thickness / 2; + fill_area.y2 = fill_area.y1 + underline_width - 1; + + fill_dsc.color = dsc->color; + lv_draw_nema_gfx_fill(draw_unit, &fill_dsc, &fill_area); + } + } + + if(sel_start != 0xFFFF && sel_end != 0xFFFF && logical_char_pos >= sel_start && logical_char_pos < sel_end) { + draw_letter_dsc.color = dsc->sel_color; + fill_dsc.color = dsc->sel_bg_color; + lv_draw_nema_gfx_fill(draw_unit, &fill_dsc, &bg_coords); + + if(is_dsc_color_enabled) { + _set_color_blend(nema_dsc_sel_color, dsc_sel_col32.alpha); + is_dsc_color_enabled = 0U; + } + } + else { + draw_letter_dsc.color = dsc->color; + if(!is_dsc_color_enabled) { + _set_color_blend(nema_dsc_color, dsc_col32.alpha); + is_dsc_color_enabled = 1U; + } + } + + _draw_letter(draw_unit, &draw_letter_dsc, &pos, font, letter); + + if(letter_w > 0) { + pos.x += letter_w + dsc->letter_space; + } + } + +#if LV_USE_BIDI + lv_free(bidi_txt); + bidi_txt = NULL; +#endif + /*Go to next line*/ + line_start = line_end; + line_end += lv_text_get_next_line(&dsc->text[line_start], font, dsc->letter_space, w, NULL, dsc->flag); + + pos.x = coords->x1; + /*Align to middle*/ + if(align == LV_TEXT_ALIGN_CENTER) { + line_width = + lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, dsc->letter_space); + + pos.x += (lv_area_get_width(coords) - line_width) / 2; + } + /*Align to the right*/ + else if(align == LV_TEXT_ALIGN_RIGHT) { + line_width = + lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, dsc->letter_space); + pos.x += lv_area_get_width(coords) - line_width; + } + + /*Go the next line position*/ + pos.y += line_height; + + if(pos.y > draw_unit->clip_area->y2) break; + } + + if(draw_letter_dsc._draw_buf) lv_draw_buf_destroy(draw_letter_dsc._draw_buf); + + LV_ASSERT_MEM_INTEGRITY(); +} + +static void _draw_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * dsc, const lv_point_t * pos, + const lv_font_t * font, uint32_t letter) +{ + lv_font_glyph_dsc_t g; + + if(lv_text_is_marker(letter)) /*Markers are valid letters but should not be rendered.*/ + return; + + LV_PROFILER_BEGIN; + bool g_ret = lv_font_get_glyph_dsc(font, &g, letter, '\0'); + if(g_ret == false) { + /*Add warning if the dsc is not found*/ + LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%" LV_PRIX32, letter); + } + + /*Don't draw anything if the character is empty. E.g. space*/ + if((g.box_h == 0) || (g.box_w == 0)) { + LV_PROFILER_END; + return; + } + + lv_area_t letter_coords; + letter_coords.x1 = pos->x + g.ofs_x; + letter_coords.x2 = letter_coords.x1 + g.box_w - 1; + letter_coords.y1 = pos->y + (font->line_height - font->base_line) - g.box_h - g.ofs_y; + letter_coords.y2 = letter_coords.y1 + g.box_h - 1; + + /*If the letter is completely out of mask don't draw it*/ + if(lv_area_is_out(&letter_coords, draw_unit->clip_area, 0) && + lv_area_is_out(dsc->bg_coords, draw_unit->clip_area, 0)) { + LV_PROFILER_END; + return; + } + + if(g.resolved_font) { + lv_draw_buf_t * draw_buf = NULL; + if(LV_FONT_GLYPH_FORMAT_NONE < g.format && g.format < LV_FONT_GLYPH_FORMAT_IMAGE) { + /*Only check draw buf for bitmap glyph*/ + draw_buf = lv_draw_buf_reshape(dsc->_draw_buf, 0, g.box_w, g.box_h, LV_STRIDE_AUTO); + if(draw_buf == NULL) { + if(dsc->_draw_buf) lv_draw_buf_destroy(dsc->_draw_buf); + + uint32_t h = g.box_h; + if(h * g.box_w < 64) h *= 2; /*Alloc a slightly larger buffer*/ + draw_buf = lv_draw_buf_create(g.box_w, h, LV_COLOR_FORMAT_A8, LV_STRIDE_AUTO); + LV_ASSERT_MALLOC(draw_buf); + draw_buf->header.h = g.box_h; + dsc->_draw_buf = draw_buf; + } + } + raw_bitmap = false; + /* Performance Optimization for lv_font_fmt_txt_dsc_t fonts */ + if(font->get_glyph_bitmap == lv_font_get_bitmap_fmt_txt) { + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + if(fdsc->bitmap_format == LV_FONT_FMT_TXT_PLAIN) { + const lv_font_t * font_p = g.resolved_font; + LV_ASSERT_NULL(font_p); + + if(letter == '\t') letter = ' '; + + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + uint32_t gid = get_glyph_dsc_id(font, letter); + if(!gid) dsc->glyph_data = NULL; + + const lv_font_fmt_txt_glyph_dsc_t * gdsc = &fdsc->glyph_dsc[gid]; + + int32_t gsize = (int32_t) gdsc->box_w * gdsc->box_h; + if(gsize == 0) dsc->glyph_data = NULL; + /*NemaGFX can handle A1, A2, A4 and A8 formats, no need to allocate A8 buffers. + We will use the original font bitmap, by rewriting the data in draw_buf + */ + if(draw_buf != NULL) { + const uint8_t * bitmap_in = &fdsc->glyph_bitmap[gdsc->bitmap_index]; + draw_buf->data = (uint8_t *) bitmap_in; + } + dsc->glyph_data = (void *)draw_buf; + raw_bitmap = true; + } + } + + if(!raw_bitmap) { + dsc->glyph_data = (void *)lv_font_get_glyph_bitmap(&g, draw_buf); + } + + dsc->format = dsc->glyph_data ? g.format : LV_FONT_GLYPH_FORMAT_NONE; + } + else { + dsc->format = LV_FONT_GLYPH_FORMAT_NONE; + } + + dsc->letter_coords = &letter_coords; + dsc->g = &g; + _draw_nema_gfx_letter(draw_unit, dsc, NULL, NULL); + + if(g.resolved_font && font->release_glyph) { + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)draw_unit; + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + nema_cl_wait(&(draw_nema_gfx_unit->cl)); + font->release_glyph(font, &g); + } + LV_PROFILER_END; +} + +static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter) +{ + if(letter == '\0') return 0; + + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + + uint16_t i; + for(i = 0; i < fdsc->cmap_num; i++) { + + /*Relative code point*/ + uint32_t rcp = letter - fdsc->cmaps[i].range_start; + if(rcp >= fdsc->cmaps[i].range_length) continue; + uint32_t glyph_id = 0; + if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY) { + glyph_id = fdsc->cmaps[i].glyph_id_start + rcp; + } + else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL) { + const uint8_t * gid_ofs_8 = fdsc->cmaps[i].glyph_id_ofs_list; + glyph_id = fdsc->cmaps[i].glyph_id_start + gid_ofs_8[rcp]; + } + else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_TINY) { + uint16_t key = rcp; + uint16_t * p = lv_utils_bsearch(&key, fdsc->cmaps[i].unicode_list, fdsc->cmaps[i].list_length, + sizeof(fdsc->cmaps[i].unicode_list[0]), unicode_list_compare); + + if(p) { + lv_uintptr_t ofs = p - fdsc->cmaps[i].unicode_list; + glyph_id = fdsc->cmaps[i].glyph_id_start + ofs; + } + } + else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_FULL) { + uint16_t key = rcp; + uint16_t * p = lv_utils_bsearch(&key, fdsc->cmaps[i].unicode_list, fdsc->cmaps[i].list_length, + sizeof(fdsc->cmaps[i].unicode_list[0]), unicode_list_compare); + + if(p) { + lv_uintptr_t ofs = p - fdsc->cmaps[i].unicode_list; + const uint16_t * gid_ofs_16 = fdsc->cmaps[i].glyph_id_ofs_list; + glyph_id = fdsc->cmaps[i].glyph_id_start + gid_ofs_16[ofs]; + } + } + + return glyph_id; + } + + return 0; + +} + +#endif /*LV_USE_NEMA_GFX*/ diff --git a/src/draw/nema_gfx/lv_draw_nema_gfx_layer.c b/src/draw/nema_gfx/lv_draw_nema_gfx_layer.c new file mode 100644 index 000000000..1d9f5c74c --- /dev/null +++ b/src/draw/nema_gfx/lv_draw_nema_gfx_layer.c @@ -0,0 +1,57 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * 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. + * + */ + +/** + * @file lv_draw_nema_gfx_fill.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_nema_gfx_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * coords) +{ + lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src; + + /*It can happen that nothing was draw on a layer and therefore its buffer is not allocated. + *In this case just return. */ + if(layer_to_draw->draw_buf == NULL) return; + + lv_draw_image_dsc_t new_draw_dsc = *draw_dsc; + new_draw_dsc.src = layer_to_draw->draw_buf; + + lv_draw_nema_gfx_img(draw_unit, &new_draw_dsc, coords); +} + +#endif /*LV_USE_NEMA_GFX*/ \ No newline at end of file diff --git a/src/draw/nema_gfx/lv_draw_nema_gfx_line.c b/src/draw/nema_gfx/lv_draw_nema_gfx_line.c new file mode 100644 index 000000000..6ca3f8362 --- /dev/null +++ b/src/draw/nema_gfx/lv_draw_nema_gfx_line.c @@ -0,0 +1,93 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * 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. + * + */ + +/** + * @file lv_draw_nema_gfx_fill.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_nema_gfx_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc) +{ + if(dsc->width == 0) + return; + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + if(dsc->p1.x == dsc->p2.x && dsc->p1.y == dsc->p2.y) + return; + + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)draw_unit; + + lv_layer_t * layer = draw_unit->target_layer; + lv_area_t clip_area; + clip_area.x1 = LV_MIN(dsc->p1.x, dsc->p2.x) - dsc->width / 2; + clip_area.x2 = LV_MAX(dsc->p1.x, dsc->p2.x) + dsc->width / 2; + clip_area.y1 = LV_MIN(dsc->p1.y, dsc->p2.y) - dsc->width / 2; + clip_area.y2 = LV_MAX(dsc->p1.y, dsc->p2.y) + dsc->width / 2; + + if(!lv_area_intersect(&clip_area, &clip_area, draw_unit->clip_area)) + return; /*Fully clipped, nothing to do*/ + + lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_point_t point1 = {dsc->p1.x - layer->buf_area.x1, dsc->p1.y - layer->buf_area.y1}; + lv_point_t point2 = {dsc->p2.x - layer->buf_area.x1, dsc->p2.y - layer->buf_area.y1}; + + nema_set_clip(clip_area.x1, clip_area.y1, lv_area_get_width(&clip_area), lv_area_get_height(&clip_area)); + + lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); + + uint32_t bg_color = nema_rgba(col32.red, col32.green, col32.blue, col32.alpha); + + lv_color_format_t dst_cf = layer->draw_buf->header.cf; + uint32_t dst_nema_cf = lv_nemagfx_cf_to_nema(dst_cf); + + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(layer->draw_buf->data), lv_area_get_width(&(layer->buf_area)), + lv_area_get_height(&(layer->buf_area)), dst_nema_cf, + lv_area_get_width(&(layer->buf_area))*lv_color_format_get_size(dst_cf)); + + if(col32.alpha < 255U) { + nema_set_blend_fill(NEMA_BL_SIMPLE); + } + else { + nema_set_blend_fill(NEMA_BL_SRC); + } + + nema_draw_line_aa(point1.x, point1.y, point2.x, point2.y, dsc->width, bg_color); + + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + +} +#endif \ No newline at end of file diff --git a/src/draw/nema_gfx/lv_draw_nema_gfx_triangle.c b/src/draw/nema_gfx/lv_draw_nema_gfx_triangle.c new file mode 100644 index 000000000..f500c5716 --- /dev/null +++ b/src/draw/nema_gfx/lv_draw_nema_gfx_triangle.c @@ -0,0 +1,168 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * 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. + * + */ + +/** + * @file lv_draw_nema_gfx_fill.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_nema_gfx_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc) +{ + if(dsc->bg_opa <= LV_OPA_MIN) return; + + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)draw_unit; + + lv_layer_t * layer = draw_unit->target_layer; + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_unit->clip_area); + lv_area_move(&rel_clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t coords; + coords.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + coords.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + coords.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + coords.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + + lv_area_move(&coords, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t clipped_coords; + if(!lv_area_intersect(&clipped_coords, &coords, &rel_clip_area)) + return; /* Fully clipped, nothing to do */ + + nema_set_clip(rel_clip_area.x1, rel_clip_area.y1, lv_area_get_width(&rel_clip_area), + lv_area_get_height(&rel_clip_area)); + + lv_color_format_t dst_cf = layer->draw_buf->header.cf; + uint32_t dst_nema_cf = lv_nemagfx_cf_to_nema(dst_cf); + + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(layer->draw_buf->data), lv_area_get_width(&(layer->buf_area)), + lv_area_get_height(&(layer->buf_area)), dst_nema_cf, + lv_area_get_width(&(layer->buf_area))*lv_color_format_get_size(dst_cf)); + + if(dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE) { + + lv_color32_t col32 = lv_color_to_32(dsc->bg_color, dsc->bg_opa); + + if(col32.alpha < 255U) { + nema_set_blend_fill(NEMA_BL_SIMPLE); + } + else { + nema_set_blend_fill(NEMA_BL_SRC); + } + + uint32_t bg_color = nema_rgba(col32.red, col32.green, col32.blue, col32.alpha); + + nema_enable_aa(1, 1, 1, 0); + nema_fill_triangle(dsc->p[0].x, dsc->p[0].y, dsc->p[1].x, dsc->p[1].y, dsc->p[2].x, dsc->p[2].y, bg_color); + } +#if LV_USE_NEMA_VG + else { + + nema_vg_path_clear(draw_nema_gfx_unit->path); + nema_vg_paint_clear(draw_nema_gfx_unit->paint); + + nema_vg_paint_set_type(draw_nema_gfx_unit->paint, NEMA_VG_PAINT_GRAD_LINEAR); + nema_vg_set_blend(NEMA_BL_SRC_OVER | NEMA_BLOP_SRC_PREMULT); + nema_vg_set_fill_rule(NEMA_VG_FILL_EVEN_ODD); + + + float stops[LV_GRADIENT_MAX_STOPS]; + color_var_t colors[LV_GRADIENT_MAX_STOPS]; + + uint32_t cnt = LV_MAX(dsc->bg_grad.stops_count, LV_GRADIENT_MAX_STOPS); + + for(uint8_t i = 0; i < cnt; i++) { + stops[i] = (float)(dsc->bg_grad.stops[i].frac) / 255.f; + colors[i].a = dsc->bg_grad.stops[i].opa; + colors[i].r = dsc->bg_grad.stops[i].color.red; + colors[i].g = dsc->bg_grad.stops[i].color.green; + colors[i].b = dsc->bg_grad.stops[i].color.blue; + } + + nema_vg_grad_set(draw_nema_gfx_unit->gradient, cnt, stops, colors); + + //Calculate Bounding Box + float min_x = LV_MIN(dsc->p[0].x, dsc->p[1].x); + min_x = LV_MIN(dsc->p[2].x, min_x); + + float min_y = LV_MIN(dsc->p[0].y, dsc->p[1].y); + min_y = LV_MIN(dsc->p[2].y, min_y); + + float max_x = LV_MAX(dsc->p[0].x, dsc->p[1].x); + max_x = LV_MAX(dsc->p[2].x, max_x); + + float max_y = LV_MAX(dsc->p[0].y, dsc->p[1].y); + max_y = LV_MAX(dsc->p[2].y, max_y); + + float x0, x1, y0, y1; + + if(dsc->bg_grad.dir == LV_GRAD_DIR_HOR) { + x0 = min_x; + x1 = max_x; + y0 = min_y; + y1 = min_y; + } + else { + x0 = min_x; + x1 = min_x; + y0 = min_y; + y1 = max_y; + } + + y0 -= (float) layer->buf_area.y1; + y1 -= (float) layer->buf_area.y1; + x0 -= (float) layer->buf_area.x1; + x1 -= (float) layer->buf_area.x1; + + uint8_t cmds_polygon[] = {NEMA_VG_PRIM_MOVE, NEMA_VG_PRIM_POLYGON}; + float triangle_coords[] = {dsc->p[0].x - layer->buf_area.x1, dsc->p[0].y - layer->buf_area.y1, + 4.0f, + dsc->p[1].x - layer->buf_area.x1, dsc->p[1].y - layer->buf_area.y1, + dsc->p[2].x - layer->buf_area.x1, dsc->p[2].y - layer->buf_area.y1 + }; + nema_enable_aa(0, 0, 0, 0); + nema_vg_paint_set_grad_linear(draw_nema_gfx_unit->paint, draw_nema_gfx_unit->gradient, x0, y0, x1, y1, + NEMA_TEX_CLAMP | NEMA_FILTER_BL); + nema_vg_path_set_shape(draw_nema_gfx_unit->path, 2, cmds_polygon, 7, triangle_coords); + nema_vg_draw_path(draw_nema_gfx_unit->path, draw_nema_gfx_unit->paint); + } +#endif + + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + +} +#endif diff --git a/src/draw/nema_gfx/lv_draw_nema_gfx_utils.c b/src/draw/nema_gfx/lv_draw_nema_gfx_utils.c new file mode 100644 index 000000000..db8deae68 --- /dev/null +++ b/src/draw/nema_gfx/lv_draw_nema_gfx_utils.c @@ -0,0 +1,112 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * 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. + * + */ + +/** + * @file lv_draw_nema_gfx_utils.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +uint32_t lv_nemagfx_cf_to_nema(lv_color_format_t cf) +{ + switch(cf) { + case LV_COLOR_FORMAT_A1: + return NEMA_A1; + case LV_COLOR_FORMAT_A2: + return NEMA_A2; + case LV_COLOR_FORMAT_A4: + return NEMA_A4; + case LV_COLOR_FORMAT_A8: + return NEMA_A8; + case LV_COLOR_FORMAT_I1: + return NEMA_L1; + case LV_COLOR_FORMAT_I2: + return NEMA_L2; + case LV_COLOR_FORMAT_I4: + return NEMA_L4; + case LV_COLOR_FORMAT_L8: + case LV_COLOR_FORMAT_I8: + return NEMA_L8; + case LV_COLOR_FORMAT_RGB565: + return NEMA_RGB565; + case LV_COLOR_FORMAT_RGB888: + return NEMA_BGR24; + case LV_COLOR_FORMAT_ARGB8888: + return NEMA_BGRA8888; + case LV_COLOR_FORMAT_XRGB8888: + return NEMA_BGRX8888; + default: + return LV_NEMA_GFX_COLOR_FORMAT; + } +} + +uint32_t lv_nemagfx_blending_mode(lv_blend_mode_t lv_blend_mode) +{ + uint32_t blending_mode; + switch(lv_blend_mode) { + case LV_BLEND_MODE_NORMAL: + blending_mode = NEMA_BL_SIMPLE; + break; + case LV_BLEND_MODE_ADDITIVE: + blending_mode = NEMA_BL_ADD; + break; + default: + blending_mode = NEMA_BL_SIMPLE; + break; + } + return blending_mode; +} + +void lv_nemagfx_grad_set(NEMA_VG_GRAD_HANDLE gradient, lv_grad_dsc_t lv_grad, lv_opa_t opa) +{ + + float stops[LV_GRADIENT_MAX_STOPS]; + color_var_t colors[LV_GRADIENT_MAX_STOPS]; + + uint32_t cnt = LV_MAX(lv_grad.stops_count, LV_GRADIENT_MAX_STOPS); + + for(uint8_t i = 0; i < cnt; i++) { + stops[i] = (float)(lv_grad.stops[i].frac) / 255.f; + colors[i].a = LV_OPA_MIX2(lv_grad.stops[i].opa, opa); + colors[i].r = lv_grad.stops[i].color.red; + colors[i].g = lv_grad.stops[i].color.green; + colors[i].b = lv_grad.stops[i].color.blue; + } + + nema_vg_grad_set(gradient, cnt, stops, colors); +} + +#endif /*LV_USE_NEMA_GFX*/ \ No newline at end of file diff --git a/src/draw/nema_gfx/lv_draw_nema_gfx_utils.h b/src/draw/nema_gfx/lv_draw_nema_gfx_utils.h new file mode 100644 index 000000000..f77807a11 --- /dev/null +++ b/src/draw/nema_gfx/lv_draw_nema_gfx_utils.h @@ -0,0 +1,125 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * 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. + * + */ + +/** + * @file lv_draw_nema_gfx.h + * + */ + +#ifndef LV_DRAW_NEMA_GFX_UTILS_H +#define LV_DRAW_NEMA_GFX_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_NEMA_GFX +#include "../sw/lv_draw_sw.h" + +#include "nema_core.h" +#include "nema_utils.h" +#include "nema_error.h" +#include "nema_provisional.h" +#include "nema_vg.h" + +/********************* + * DEFINES + *********************/ + +#ifndef NEMA_VIRT2PHYS +#define NEMA_VIRT2PHYS +#else +uintptr_t NEMA_VIRT2PHYS(void * addr); +#endif + +/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/ +#if LV_COLOR_DEPTH == 8 +#define LV_NEMA_GFX_COLOR_FORMAT NEMA_L8 +#define LV_NEMA_GFX_FORMAT_MULTIPLIER 1 +#elif LV_COLOR_DEPTH == 16 +#define LV_NEMA_GFX_COLOR_FORMAT NEMA_RGB565 +#define LV_NEMA_GFX_FORMAT_MULTIPLIER 2 +#elif LV_COLOR_DEPTH == 24 +#define LV_NEMA_GFX_COLOR_FORMAT NEMA_BGR24 +#define LV_NEMA_GFX_FORMAT_MULTIPLIER 3 +#elif LV_COLOR_DEPTH == 32 +#define LV_NEMA_GFX_COLOR_FORMAT NEMA_BGRA8888 +#define LV_NEMA_GFX_FORMAT_MULTIPLIER 4 +#else +/*Can't use GPU with other formats*/ +#error Selected Color Depth Not Supported +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Convert a `lv_color_format_t` to a Nema color format. + * @param cf The LVGL color format + * @return The Nema color format + */ +uint32_t lv_nemagfx_cf_to_nema(lv_color_format_t cf); + +/** + * Get NemaGFX blending mode + * + * @param[in] lv_blend_mode The LVGL blend mode + * + * @return NemaGFX blending mode + * + */ +uint32_t lv_nemagfx_blending_mode(lv_blend_mode_t lv_blend_mode); + + +/** + * Get NemaGFX blending mode + * + * @param[in] gradient NemaGFX Gradient Buffer + * + * @param[in] lv_grad Gradient descripto + * + * @param[in] opa Descriptor's opacity + * +*/ +void lv_nemagfx_grad_set(NEMA_VG_GRAD_HANDLE gradient, lv_grad_dsc_t lv_grad, lv_opa_t opa); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_NEMA_GFX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_NEMA_GFX_UTILS_H*/ \ No newline at end of file diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index 439e1ad62..fe29364b4 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -583,6 +583,52 @@ #endif #endif +/*Use TSi's aka (Think Silicon) NemaGFX */ +#ifndef LV_USE_NEMA_GFX + #ifdef CONFIG_LV_USE_NEMA_GFX + #define LV_USE_NEMA_GFX CONFIG_LV_USE_NEMA_GFX + #else + #define LV_USE_NEMA_GFX 0 + #endif +#endif + +#if LV_USE_NEMA_GFX + #ifndef LV_NEMA_GFX_HAL_INCLUDE + #ifdef CONFIG_LV_NEMA_GFX_HAL_INCLUDE + #define LV_NEMA_GFX_HAL_INCLUDE CONFIG_LV_NEMA_GFX_HAL_INCLUDE + #else + #define LV_NEMA_GFX_HAL_INCLUDE + #endif + #endif + + /*Enable Vector Graphics Operations. Available only if NemaVG library is present*/ + #ifndef LV_USE_NEMA_VG + #ifdef CONFIG_LV_USE_NEMA_VG + #define LV_USE_NEMA_VG CONFIG_LV_USE_NEMA_VG + #else + #define LV_USE_NEMA_VG 0 + #endif + #endif + + #if LV_USE_NEMA_VG + /*Define application's resolution used for VG related buffer allocation */ + #ifndef LV_NEMA_GFX_MAX_RESX + #ifdef CONFIG_LV_NEMA_GFX_MAX_RESX + #define LV_NEMA_GFX_MAX_RESX CONFIG_LV_NEMA_GFX_MAX_RESX + #else + #define LV_NEMA_GFX_MAX_RESX 800 + #endif + #endif + #ifndef LV_NEMA_GFX_MAX_RESY + #ifdef CONFIG_LV_NEMA_GFX_MAX_RESY + #define LV_NEMA_GFX_MAX_RESY CONFIG_LV_NEMA_GFX_MAX_RESY + #else + #define LV_NEMA_GFX_MAX_RESY 600 + #endif + #endif + #endif +#endif + /** Use NXP's VG-Lite GPU on iMX RTxxx platforms. */ #ifndef LV_USE_DRAW_VGLITE #ifdef CONFIG_LV_USE_DRAW_VGLITE diff --git a/src/lv_init.c b/src/lv_init.c index 15aa8fd2e..0939dd8a5 100644 --- a/src/lv_init.c +++ b/src/lv_init.c @@ -40,6 +40,9 @@ #include "misc/lv_fs.h" #include "osal/lv_os_private.h" +#if LV_USE_NEMA_GFX + #include "draw/nema_gfx/lv_draw_nema_gfx.h" +#endif #if LV_USE_DRAW_VGLITE #include "draw/nxp/vglite/lv_draw_vglite.h" #endif @@ -199,6 +202,10 @@ void lv_init(void) lv_draw_sw_init(); #endif +#if LV_USE_NEMA_GFX + lv_draw_nema_gfx_init(); +#endif + #if LV_USE_DRAW_VGLITE lv_draw_vglite_init(); #endif