Files
lvgl/libs/nema_gfx/include/nema_vg_path.h
2024-10-13 08:13:56 +02:00

144 lines
6.8 KiB
C

/* TSI 2023.xmo */
/*******************************************************************************
* Copyright (c) 2023 Think Silicon Single Member PC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this header file and/or associated documentation files to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Materials, and to permit persons to whom the Materials are furnished to do
* so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Materials.
*
* MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
* NEMAGFX API. THE UNMODIFIED, NORMATIVE VERSIONS OF THINK-SILICON NEMAGFX
* SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT:
* https://think-silicon.com/products/software/nemagfx-api
*
* The software is provided 'as is', without warranty of any kind, express or
* implied, including but not limited to the warranties of merchantability,
* fitness for a particular purpose and noninfringement. In no event shall
* Think Silicon Single Member PC be liable for any claim, damages or other
* liability, whether in an action of contract, tort or otherwise, arising
* from, out of or in connection with the software or the use or other dealings
* in the software.
******************************************************************************/
/**
* @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__