diff --git a/lv_conf_template.h b/lv_conf_template.h index c4fb695d65..c864ecc206 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -86,12 +86,18 @@ /*======================== * RENDERING CONFIGURATION *========================*/ +/* Select a draw buffer implementation. Possible values: + * - LV_DRAW_BUF_BASIC: LVGL's built in implementation + * - LV_DRAW_BUF_CUSTOM: Implement teh function of lv_draw_buf.h externally + */ +#define LV_USE_DRAW_BUF LV_DRAW_BUF_BASIC -/*Align the stride of all layers and images to this bytes*/ -#define LV_DRAW_BUF_STRIDE_ALIGN 1 - -/*Align the start address of draw_buf addresses to this bytes*/ -#define LV_DRAW_BUF_ALIGN 4 +#if LV_USE_DRAW_BUF == LV_DRAW_BUF_BASIC + /*Align the stride of all layers and images to this bytes*/ + #define LV_DRAW_BUF_STRIDE_ALIGN 1 /*Multiple of these Bytes*/ + /*Align the start address of draw_buf addresses to this bytes*/ + #define LV_DRAW_BUF_ALIGN 4 +#endif /* Max. memory to be used for layers */ #define LV_LAYER_MAX_MEMORY_USAGE 150 /*[kB]*/ diff --git a/src/draw/draw_buf/lv_draw_buf.h b/src/draw/draw_buf/lv_draw_buf.h index 18f5d98361..581de5e6cf 100644 --- a/src/draw/draw_buf/lv_draw_buf.h +++ b/src/draw/draw_buf/lv_draw_buf.h @@ -25,36 +25,106 @@ extern "C" { **********************/ typedef struct { void * buf; - lv_coord_t width; lv_coord_t height; lv_color_format_t color_format; + uint32_t usage_cnt; + uint32_t flags; } lv_draw_buf_t; -void lv_draw_buf_init(lv_draw_buf_t * draw_buf, lv_coord_t w, lv_coord_t h, lv_color_format_t color_format); -void lv_draw_buf_malloc(lv_draw_buf_t * draw_buf); -void lv_draw_buf_realloc(lv_draw_buf_t * buf, lv_coord_t w, lv_coord_t h, lv_color_format_t color_format); -void lv_draw_buf_free(lv_draw_buf_t * buf); -void * lv_draw_buf_get_buf(lv_draw_buf_t * draw_buf); -void lv_draw_buf_invalidate_cache(lv_draw_buf_t * buf); - -uint32_t lv_draw_buf_get_stride(const lv_draw_buf_t * draw_buf); -void * lv_draw_buf_go_to_xy(lv_draw_buf_t * draw_buf, lv_coord_t x, lv_coord_t y); -void lv_draw_buf_clear(lv_draw_buf_t * draw_buf, const lv_area_t * a); - -void lv_draw_buf_copy(void * dest_buf, uint32_t dest_stride, const lv_area_t * dest_area, - void * src_buf, uint32_t src_stride, const lv_area_t * src_area, lv_color_format_t color_format); - -static inline uint32_t lv_draw_buf_width_to_stride(uint32_t w, lv_color_format_t color_format) -{ - uint32_t width_byte = w * lv_color_format_get_size(color_format); - return (width_byte + LV_DRAW_BUF_STRIDE_ALIGN - 1) & ~(LV_DRAW_BUF_STRIDE_ALIGN - 1); -} /********************** * GLOBAL PROTOTYPES **********************/ +/** + * Initialize a draw buffer object. The buffer won't be allocated + * @param draw_buf pointer to a draw buffer + * @param w the width of the buffer in pixel + * @param h the height of the buffer in pixel + * @param color_format the color format of the buffer + */ +void lv_draw_buf_init(lv_draw_buf_t * draw_buf, lv_coord_t w, lv_coord_t h, lv_color_format_t color_format); + +/** + * Allocate a buffer in the draw_buf, considering the set width, height and color format + * @param draw_buf pointer to a draw buffer + */ +void lv_draw_buf_malloc(lv_draw_buf_t * draw_buf); + +/** + * Realloacte the buffer with a new width, height and color format + * @param draw_buf pointer to a draw buffer + * @param w the new width of the buffer in pixel + * @param h the new height of the buffer in pixel + * @param color_format the new color format of the buffer + */ +void lv_draw_buf_realloc(lv_draw_buf_t * draw_buf, lv_coord_t w, lv_coord_t h, lv_color_format_t color_format); + +/** + * Free the allocated buffer + * @param draw_buf pointer to draw buffer + */ +void lv_draw_buf_free(lv_draw_buf_t * draw_buf); + +/** + * Get the buffer of the draw_buf. + * Never get the buffer as draw_buf->buf adn this function might align the buffer + * @param draw_buf pointer to a draw buffer + * @return pointer to the buffer + */ +void * lv_draw_buf_get_buf(lv_draw_buf_t * draw_buf); + +/** + * Invalidate the cache of the buffer + * @param draw_buf pointer to a draw buffer + */ +void lv_draw_buf_invalidate_cache(lv_draw_buf_t * draw_buf); + + +/** + * Calculate the stride in bytes based on a width and color format + * @param w the width in pixels + * @param color_format the color format + * @return the stride in bytes + */ +uint32_t lv_draw_buf_width_to_stride(uint32_t w, lv_color_format_t color_format); + +/** + * Get the stride of a draw buffer using the set width and color format + * @param draw_buf pointer to draw buffer + * @return the stride in bytes + */ +uint32_t lv_draw_buf_get_stride(const lv_draw_buf_t * draw_buf); + +/** + * Go to the X, Y coordinate on the buffer. + * @param draw_buf pointer to draw buffer + * @param x the X coordinate to seek + * @param y the Y coordinate to seek + */ +void * lv_draw_buf_go_to_xy(lv_draw_buf_t * draw_buf, lv_coord_t x, lv_coord_t y); + +/** + * Clear an area on the buffer + * @param draw_buf pointer to draw buffer + * @param a the area to clear, or NULL to clear the whole buffer + */ +void lv_draw_buf_clear(lv_draw_buf_t * draw_buf, const lv_area_t * a); + +/** + * Copy an area from a buffer to an other + * @param dest_buf pointer to the destination buffer (not draw_buf) + * @param dest_stride the stride of the destination buffer in bytes + * @param dest_area pointer to the destination area + * @param src_buf pointer to the source buffer (not draw_buf) + * @param src_stride the stride of the source buffer in bytes + * @param src_area pointer to the source area + * @param color_format the color format (should be the same for the source and destination) + */ +void lv_draw_buf_copy(void * dest_buf, uint32_t dest_stride, const lv_area_t * dest_area, + void * src_buf, uint32_t src_stride, const lv_area_t * src_area, lv_color_format_t color_format); + /********************** * MACROS **********************/ diff --git a/src/draw/draw_buf/lv_draw_buf.c b/src/draw/draw_buf/lv_draw_buf_basic.c similarity index 89% rename from src/draw/draw_buf/lv_draw_buf.c rename to src/draw/draw_buf/lv_draw_buf_basic.c index 71c0460089..5afed99f40 100644 --- a/src/draw/draw_buf/lv_draw_buf.c +++ b/src/draw/draw_buf/lv_draw_buf_basic.c @@ -1,14 +1,18 @@ /** - * @file lv_draw_buf.c + * @file lv_draw_buf_basic.c * */ /********************* * INCLUDES *********************/ +#include "../../misc/lv_types.h" #include "lv_draw_buf.h" +#if LV_USE_DRAW_BUF == LV_DRAW_BUF_BASIC + #include "../../stdlib/lv_string.h" + /********************* * DEFINES *********************/ @@ -74,7 +78,12 @@ void * lv_draw_buf_get_buf(lv_draw_buf_t * draw_buf) void lv_draw_buf_invalidate_cache(lv_draw_buf_t * draw_buf) { LV_UNUSED(draw_buf); +} +uint32_t lv_draw_buf_width_to_stride(uint32_t w, lv_color_format_t color_format) +{ + uint32_t width_byte = w * lv_color_format_get_size(color_format); + return (width_byte + LV_DRAW_BUF_STRIDE_ALIGN - 1) & ~(LV_DRAW_BUF_STRIDE_ALIGN - 1); } uint32_t lv_draw_buf_get_stride(const lv_draw_buf_t * draw_buf) @@ -93,9 +102,9 @@ void * lv_draw_buf_go_to_xy(lv_draw_buf_t * draw_buf, lv_coord_t x, lv_coord_t y return buf_tmp; } - void lv_draw_buf_clear(lv_draw_buf_t * draw_buf, const lv_area_t * a) { + //TODO clear the area LV_UNUSED(a); uint32_t stride = lv_draw_buf_get_stride(draw_buf); uint8_t * buf = lv_draw_buf_get_buf(draw_buf); @@ -139,3 +148,6 @@ static uint8_t * buf_alloc(void * old_buf, lv_coord_t w, lv_coord_t h) return buf; } + + +#endif /*LV_USE DRAW_BUF == LV_DRAW_BUF_BASIC*/ diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index 1d126731a5..c8369923b6 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -214,26 +214,38 @@ /*======================== * RENDERING CONFIGURATION *========================*/ - -/*Align the stride of all layers and images to this bytes*/ -#ifndef LV_DRAW_BUF_STRIDE_ALIGN - #ifdef _LV_KCONFIG_PRESENT - #ifdef CONFIG_LV_DRAW_BUF_STRIDE_ALIGN - #define LV_DRAW_BUF_STRIDE_ALIGN CONFIG_LV_DRAW_BUF_STRIDE_ALIGN - #else - #define LV_DRAW_BUF_STRIDE_ALIGN 0 - #endif +/* Select a draw buffer implementation. Possible values: + * - LV_DRAW_BUF_BASIC: LVGL's built in implementation + * - LV_DRAW_BUF_CUSTOM: Implement teh function of lv_draw_buf.h externally + */ +#ifndef LV_USE_DRAW_BUF + #ifdef CONFIG_LV_USE_DRAW_BUF + #define LV_USE_DRAW_BUF CONFIG_LV_USE_DRAW_BUF #else - #define LV_DRAW_BUF_STRIDE_ALIGN 1 + #define LV_USE_DRAW_BUF LV_DRAW_BUF_BASIC #endif #endif -/*Align the start address of draw_buf addresses to this bytes*/ -#ifndef LV_DRAW_BUF_ALIGN - #ifdef CONFIG_LV_DRAW_BUF_ALIGN - #define LV_DRAW_BUF_ALIGN CONFIG_LV_DRAW_BUF_ALIGN - #else - #define LV_DRAW_BUF_ALIGN 4 +#if LV_USE_DRAW_BUF == LV_DRAW_BUF_BASIC + /*Align the stride of all layers and images to this bytes*/ + #ifndef LV_DRAW_BUF_STRIDE_ALIGN + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_BUF_STRIDE_ALIGN + #define LV_DRAW_BUF_STRIDE_ALIGN CONFIG_LV_DRAW_BUF_STRIDE_ALIGN + #else + #define LV_DRAW_BUF_STRIDE_ALIGN 0 + #endif + #else + #define LV_DRAW_BUF_STRIDE_ALIGN 1 /*Multiple of these Bytes*/ + #endif + #endif + /*Align the start address of draw_buf addresses to this bytes*/ + #ifndef LV_DRAW_BUF_ALIGN + #ifdef CONFIG_LV_DRAW_BUF_ALIGN + #define LV_DRAW_BUF_ALIGN CONFIG_LV_DRAW_BUF_ALIGN + #else + #define LV_DRAW_BUF_ALIGN 4 + #endif #endif #endif diff --git a/src/misc/lv_types.h b/src/misc/lv_types.h index 216d437fd3..abbcbc2278 100644 --- a/src/misc/lv_types.h +++ b/src/misc/lv_types.h @@ -44,6 +44,9 @@ extern "C" { #define LV_STDLIB_MICROPYTHON 2 #define LV_STDLIB_CUSTOM 255 +#define LV_DRAW_BUF_BASIC 0 +#define LV_DRAW_BUF_CUSTOM 255 + /********************** * TYPEDEFS **********************/