10.1_demo/lvgl/src/misc/lv_grad.h

183 lines
7.3 KiB
C
Executable File

/**
* @file lv_grad.h
*
*/
#ifndef LV_GRAD_H
#define LV_GRAD_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include "../lv_conf_internal.h"
#include "lv_color.h"
#include "lv_area.h"
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
/**
* The direction of the gradient.
*/
typedef enum {
LV_GRAD_DIR_NONE, /**< No gradient (the `grad_color` property is ignored)*/
LV_GRAD_DIR_VER, /**< Simple vertical (top to bottom) gradient*/
LV_GRAD_DIR_HOR, /**< Simple horizontal (left to right) gradient*/
LV_GRAD_DIR_LINEAR, /**< Linear gradient defined by start and end points. Can be at any angle.*/
LV_GRAD_DIR_RADIAL, /**< Radial gradient defined by start and end circles*/
LV_GRAD_DIR_CONICAL, /**< Conical gradient defined by center point, start and end angles*/
} lv_grad_dir_t;
/**
* Gradient behavior outside the defined range.
*/
typedef enum {
LV_GRAD_EXTEND_PAD, /**< Repeat the same color*/
LV_GRAD_EXTEND_REPEAT, /**< Repeat the pattern*/
LV_GRAD_EXTEND_REFLECT, /**< Repeat the pattern mirrored*/
} lv_grad_extend_t;
/** A gradient stop definition.
* This matches a color and a position in a virtual 0-255 scale.
*/
typedef struct {
lv_color_t color; /**< The stop color */
lv_opa_t opa; /**< The opacity of the color*/
uint8_t frac; /**< The stop position in 1/255 unit */
} lv_grad_stop_t;
/** A descriptor of a gradient. */
typedef struct {
lv_grad_stop_t stops[LV_GRADIENT_MAX_STOPS]; /**< A gradient stop array */
uint8_t stops_count; /**< The number of used stops in the array */
lv_grad_dir_t dir : 4; /**< The gradient direction.
* Any of LV_GRAD_DIR_NONE, LV_GRAD_DIR_VER, LV_GRAD_DIR_HOR,
* LV_GRAD_TYPE_LINEAR, LV_GRAD_TYPE_RADIAL, LV_GRAD_TYPE_CONICAL */
lv_grad_extend_t extend : 3; /**< Behaviour outside the defined range.
* LV_GRAD_EXTEND_NONE, LV_GRAD_EXTEND_PAD, LV_GRAD_EXTEND_REPEAT, LV_GRAD_EXTEND_REFLECT */
#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS
union {
/*Linear gradient parameters*/
struct {
lv_point_t start; /**< Linear gradient vector start point */
lv_point_t end; /**< Linear gradient vector end point */
} linear;
/*Radial gradient parameters*/
struct {
lv_point_t focal; /**< Center of the focal (starting) circle in local coordinates */
/* (can be the same as the ending circle to create concentric circles) */
lv_point_t focal_extent; /**< Point on the circle (can be the same as the center) */
lv_point_t end; /**< Center of the ending circle in local coordinates */
lv_point_t end_extent; /**< Point on the circle determining the radius of the gradient */
} radial;
/*Conical gradient parameters*/
struct {
lv_point_t center; /**< Conical gradient center point */
int16_t start_angle; /**< Start angle 0..3600 */
int16_t end_angle; /**< End angle 0..3600 */
} conical;
} params;
void * state;
#endif
} lv_grad_dsc_t;
/**********************
* GLOBAL PROTOTYPES
**********************/
/**
* Initialize gradient color map from a table
* @param grad pointer to a gradient descriptor
* @param colors color array
* @param fracs position array (0..255): if NULL, then colors are distributed evenly
* @param opa opacity array: if NULL, then LV_OPA_COVER is assumed
* @param num_stops number of gradient stops (1..LV_GRADIENT_MAX_STOPS)
*/
void lv_grad_init_stops(lv_grad_dsc_t * grad, const lv_color_t colors[], const lv_opa_t opa[],
const uint8_t fracs[], int num_stops);
/**
* Helper function to initialize a horizontal gradient.
* @param dsc gradient descriptor
*/
void lv_grad_horizontal_init(lv_grad_dsc_t * dsc);
/**
* Helper function to initialize a vertical gradient.
* @param dsc gradient descriptor
*/
void lv_grad_vertical_init(lv_grad_dsc_t * dsc);
#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS
/**
* Helper function to initialize linear gradient
* @param dsc gradient descriptor
* @param from_x start x position: can be a coordinate or an lv_pct() value
* predefined constants LV_GRAD_LEFT, LV_GRAD_RIGHT, LV_GRAD_TOP, LV_GRAD_BOTTOM, LV_GRAD_CENTER can be used as well
* @param from_y start y position
* @param to_x end x position
* @param to_y end y position
* @param extend one of LV_GRAD_EXTEND_PAD, LV_GRAD_EXTEND_REPEAT or LV_GRAD_EXTEND_REFLECT
*/
void lv_grad_linear_init(lv_grad_dsc_t * dsc, int32_t from_x, int32_t from_y, int32_t to_x, int32_t to_y,
lv_grad_extend_t extend);
/**
* Helper function to initialize radial gradient
* @param dsc gradient descriptor
* @param center_x center x position: can be a coordinate or an lv_pct() value
* predefined constants LV_GRAD_LEFT, LV_GRAD_RIGHT, LV_GRAD_TOP, LV_GRAD_BOTTOM, LV_GRAD_CENTER can be used as well
* @param center_y center y position
* @param to_x point on the end circle x position
* @param to_y point on the end circle y position
* @param extend one of LV_GRAD_EXTEND_PAD, LV_GRAD_EXTEND_REPEAT or LV_GRAD_EXTEND_REFLECT
*/
void lv_grad_radial_init(lv_grad_dsc_t * dsc, int32_t center_x, int32_t center_y, int32_t to_x, int32_t to_y,
lv_grad_extend_t extend);
/**
* Set focal (starting) circle of a radial gradient
* @param dsc gradient descriptor
* @param center_x center x position: can be a coordinate or an lv_pct() value
* predefined constants LV_GRAD_LEFT, LV_GRAD_RIGHT, LV_GRAD_TOP, LV_GRAD_BOTTOM, LV_GRAD_CENTER can be used as well
* @param center_y center y position
* @param radius radius of the starting circle (NOTE: this must be a scalar number, not percentage)
*/
void lv_grad_radial_set_focal(lv_grad_dsc_t * dsc, int32_t center_x, int32_t center_y, int32_t radius);
/**
* Helper function to initialize conical gradient
* @param dsc gradient descriptor
* @param center_x center x position: can be a coordinate or an lv_pct() value
* predefined constants LV_GRAD_LEFT, LV_GRAD_RIGHT, LV_GRAD_TOP, LV_GRAD_BOTTOM, LV_GRAD_CENTER can be used as well
* @param center_y center y position
* @param start_angle start angle in degrees
* @param end_angle end angle in degrees
* @param extend one of LV_GRAD_EXTEND_PAD, LV_GRAD_EXTEND_REPEAT or LV_GRAD_EXTEND_REFLECT
*/
void lv_grad_conical_init(lv_grad_dsc_t * dsc, int32_t center_x, int32_t center_y, int32_t start_angle,
int32_t end_angle, lv_grad_extend_t extend);
#endif /*LV_USE_DRAW_SW_COMPLEX_GRADIENTS*/
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /*extern "C"*/
#endif
#endif /*LV_GRAD_H*/