You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
7.4 KiB
219 lines
7.4 KiB
2 years ago
|
/**
|
||
|
* @file lv_draw.h
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef LV_DRAW_H
|
||
|
#define LV_DRAW_H
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/*********************
|
||
|
* INCLUDES
|
||
|
*********************/
|
||
|
#include "../lv_conf_internal.h"
|
||
|
|
||
|
#include "../misc/lv_style.h"
|
||
|
#include "../misc/lv_txt.h"
|
||
|
#include "lv_img_decoder.h"
|
||
|
#include "lv_img_cache.h"
|
||
|
|
||
|
#include "lv_draw_rect.h"
|
||
|
#include "lv_draw_label.h"
|
||
|
#include "lv_draw_img.h"
|
||
|
#include "lv_draw_line.h"
|
||
|
#include "lv_draw_triangle.h"
|
||
|
#include "lv_draw_arc.h"
|
||
|
#include "lv_draw_mask.h"
|
||
|
#include "lv_draw_transform.h"
|
||
|
#include "lv_draw_layer.h"
|
||
|
|
||
|
/*********************
|
||
|
* DEFINES
|
||
|
*********************/
|
||
|
|
||
|
/**********************
|
||
|
* TYPEDEFS
|
||
|
**********************/
|
||
|
|
||
|
typedef struct {
|
||
|
void * user_data;
|
||
|
} lv_draw_mask_t;
|
||
|
|
||
|
typedef struct _lv_draw_layer_ctx_t {
|
||
|
lv_area_t area_full;
|
||
|
lv_area_t area_act;
|
||
|
lv_coord_t max_row_with_alpha;
|
||
|
lv_coord_t max_row_with_no_alpha;
|
||
|
void * buf;
|
||
|
struct {
|
||
|
const lv_area_t * clip_area;
|
||
|
lv_area_t * buf_area;
|
||
|
void * buf;
|
||
|
bool screen_transp;
|
||
|
} original;
|
||
|
} lv_draw_layer_ctx_t;
|
||
|
|
||
|
typedef struct _lv_draw_ctx_t {
|
||
|
/**
|
||
|
* Pointer to a buffer to draw into
|
||
|
*/
|
||
|
void * buf;
|
||
|
|
||
|
/**
|
||
|
* The position and size of `buf` (absolute coordinates)
|
||
|
*/
|
||
|
lv_area_t * buf_area;
|
||
|
|
||
|
/**
|
||
|
* The current clip area with absolute coordinates, always the same or smaller than `buf_area`
|
||
|
*/
|
||
|
const lv_area_t * clip_area;
|
||
|
|
||
|
|
||
|
void (*draw_rect)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords);
|
||
|
|
||
|
void (*draw_arc)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * dsc, const lv_point_t * center,
|
||
|
uint16_t radius, uint16_t start_angle, uint16_t end_angle);
|
||
|
|
||
|
void (*draw_img_decoded)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc,
|
||
|
const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format);
|
||
|
|
||
|
lv_res_t (*draw_img)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc,
|
||
|
const lv_area_t * coords, const void * src);
|
||
|
|
||
|
void (*draw_letter)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p,
|
||
|
uint32_t letter);
|
||
|
|
||
|
|
||
|
void (*draw_line)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1,
|
||
|
const lv_point_t * point2);
|
||
|
|
||
|
|
||
|
void (*draw_polygon)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc,
|
||
|
const lv_point_t * points, uint16_t point_cnt);
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Get an area of a transformed image (zoomed and/or rotated)
|
||
|
* @param draw_ctx pointer to a draw context
|
||
|
* @param dest_area get this area of the result image. It assumes that the original image is placed to the 0;0 position.
|
||
|
* @param src_buf the source image
|
||
|
* @param src_w width of the source image in [px]
|
||
|
* @param src_h height of the source image in [px]
|
||
|
* @param src_stride the stride in [px].
|
||
|
* @param draw_dsc an `lv_draw_img_dsc_t` descriptor containing the transformation parameters
|
||
|
* @param cf the color format of `src_buf`
|
||
|
* @param cbuf place the colors of the pixels on `dest_area` here in RGB format
|
||
|
* @param abuf place the opacity of the pixels on `dest_area` here
|
||
|
*/
|
||
|
void (*draw_transform)(struct _lv_draw_ctx_t * draw_ctx, const lv_area_t * dest_area, const void * src_buf,
|
||
|
lv_coord_t src_w, lv_coord_t src_h, lv_coord_t src_stride,
|
||
|
const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t cf, lv_color_t * cbuf, lv_opa_t * abuf);
|
||
|
|
||
|
/**
|
||
|
* Replace the buffer with a rect without decoration like radius or borders
|
||
|
*/
|
||
|
void (*draw_bg)(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc, const lv_area_t * coords);
|
||
|
|
||
|
/**
|
||
|
* Wait until all background operations are finished. (E.g. GPU operations)
|
||
|
*/
|
||
|
void (*wait_for_finish)(struct _lv_draw_ctx_t * draw_ctx);
|
||
|
|
||
|
/**
|
||
|
* Copy an area from buffer to an other
|
||
|
* @param draw_ctx pointer to a draw context
|
||
|
* @param dest_buf copy the buffer into this buffer
|
||
|
* @param dest_stride the width of the dest_buf in pixels
|
||
|
* @param dest_area the destination area
|
||
|
* @param src_buf copy from this buffer
|
||
|
* @param src_stride the width of src_buf in pixels
|
||
|
* @param src_area the source area.
|
||
|
*
|
||
|
* @note dest_area and src_area must have the same width and height
|
||
|
* but can have different x and y position.
|
||
|
* @note dest_area and src_area must be clipped to the real dimensions of the buffers
|
||
|
*/
|
||
|
void (*buffer_copy)(struct _lv_draw_ctx_t * draw_ctx, void * dest_buf, lv_coord_t dest_stride,
|
||
|
const lv_area_t * dest_area,
|
||
|
void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area);
|
||
|
|
||
|
/**
|
||
|
* Initialize a new layer context.
|
||
|
* The original buffer and area data are already saved from `draw_ctx` to `layer_ctx`
|
||
|
* @param draw_ctx pointer to the current draw context
|
||
|
* @param layer_area the coordinates of the layer
|
||
|
* @param flags OR-ed flags from @lv_draw_layer_flags_t
|
||
|
* @return pointer to the layer context, or NULL on error
|
||
|
*/
|
||
|
struct _lv_draw_layer_ctx_t * (*layer_init)(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
|
||
|
lv_draw_layer_flags_t flags);
|
||
|
|
||
|
/**
|
||
|
* Adjust the layer_ctx and/or draw_ctx based on the `layer_ctx->area_act`.
|
||
|
* It's called only if flags has `LV_DRAW_LAYER_FLAG_CAN_SUBDIVIDE`
|
||
|
* @param draw_ctx pointer to the current draw context
|
||
|
* @param layer_ctx pointer to a layer context
|
||
|
* @param flags OR-ed flags from @lv_draw_layer_flags_t
|
||
|
*/
|
||
|
void (*layer_adjust)(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
|
||
|
lv_draw_layer_flags_t flags);
|
||
|
|
||
|
/**
|
||
|
* Blend a rendered layer to `layer_ctx->area_act`
|
||
|
* @param draw_ctx pointer to the current draw context
|
||
|
* @param layer_ctx pointer to a layer context
|
||
|
* @param draw_dsc pointer to an image draw descriptor
|
||
|
*/
|
||
|
void (*layer_blend)(struct _lv_draw_ctx_t * draw_ctx, struct _lv_draw_layer_ctx_t * layer_ctx,
|
||
|
const lv_draw_img_dsc_t * draw_dsc);
|
||
|
|
||
|
/**
|
||
|
* Destroy a layer context. The original buffer and area data of the `draw_ctx` will be restored
|
||
|
* and the `layer_ctx` itself will be freed automatically.
|
||
|
* @param draw_ctx pointer to the current draw context
|
||
|
* @param layer_ctx pointer to a layer context
|
||
|
*/
|
||
|
void (*layer_destroy)(struct _lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx);
|
||
|
|
||
|
/**
|
||
|
* Size of a layer context in bytes.
|
||
|
*/
|
||
|
size_t layer_instance_size;
|
||
|
|
||
|
#if LV_USE_USER_DATA
|
||
|
void * user_data;
|
||
|
#endif
|
||
|
|
||
|
} lv_draw_ctx_t;
|
||
|
|
||
|
/**********************
|
||
|
* GLOBAL PROTOTYPES
|
||
|
**********************/
|
||
|
|
||
|
void lv_draw_init(void);
|
||
|
|
||
|
|
||
|
void lv_draw_wait_for_finish(lv_draw_ctx_t * draw_ctx);
|
||
|
|
||
|
/**********************
|
||
|
* GLOBAL VARIABLES
|
||
|
**********************/
|
||
|
|
||
|
/**********************
|
||
|
* MACROS
|
||
|
**********************/
|
||
|
|
||
|
/**********************
|
||
|
* POST INCLUDES
|
||
|
*********************/
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
} /*extern "C"*/
|
||
|
#endif
|
||
|
|
||
|
#endif /*LV_DRAW_H*/
|