266 lines
6.5 KiB
C
266 lines
6.5 KiB
C
/**
|
|
* @file lv_eve.c
|
|
*
|
|
*/
|
|
|
|
/* Created on: 8 jun 2023
|
|
* Author: juanj
|
|
*
|
|
* Modified by LVGL
|
|
*/
|
|
|
|
/*********************
|
|
* INCLUDES
|
|
*********************/
|
|
#include "lv_draw_eve.h"
|
|
#if LV_USE_DRAW_EVE
|
|
#include "lv_eve.h"
|
|
#include "../../libs/FT800-FT813/EVE_commands.h"
|
|
|
|
|
|
/*********************
|
|
* DEFINES
|
|
*********************/
|
|
|
|
/**********************
|
|
* TYPEDEFS
|
|
**********************/
|
|
|
|
/**********************
|
|
* STATIC PROTOTYPES
|
|
**********************/
|
|
|
|
/**********************
|
|
* STATIC VARIABLES
|
|
**********************/
|
|
|
|
static uint16_t scissor_x1 = 0;
|
|
static uint16_t scissor_y1 = 0;
|
|
static uint16_t scissor_x2 = 0;
|
|
static uint16_t scissor_y2 = 0;
|
|
|
|
static lv_eve_drawing_context_t ct = {
|
|
.primitive = LV_EVE_PRIMITIVE_ZERO_VALUE,
|
|
.color = {0xff, 0xff, 0xff},
|
|
.opa = 255,
|
|
.line_width = 1, /* for format(0) */
|
|
.point_size = 1,
|
|
.color_mask = {1, 1, 1, 1},
|
|
.stencil_func = {EVE_ALWAYS, 0, 255},
|
|
.stencil_op = {EVE_KEEP, EVE_KEEP},
|
|
.blend_func = {EVE_SRC_ALPHA, EVE_ONE_MINUS_SRC_ALPHA},
|
|
.scx = 0,
|
|
.scy = 0,
|
|
};
|
|
|
|
static lv_eve_drawing_context_t ct_temp;
|
|
|
|
static lv_eve_drawing_state_t st;
|
|
|
|
/**********************
|
|
* MACROS
|
|
**********************/
|
|
|
|
/**********************
|
|
* GLOBAL FUNCTIONS
|
|
**********************/
|
|
|
|
void lv_eve_save_context(void)
|
|
{
|
|
EVE_cmd_dl_burst(DL_SAVE_CONTEXT);
|
|
ct_temp = ct;
|
|
}
|
|
|
|
void lv_eve_restore_context(void)
|
|
{
|
|
EVE_cmd_dl_burst(DL_RESTORE_CONTEXT);
|
|
ct = ct_temp;
|
|
}
|
|
|
|
|
|
void lv_eve_primitive(uint8_t context)
|
|
{
|
|
if(context != ct.primitive && context != LV_EVE_PRIMITIVE_ZERO_VALUE) {
|
|
EVE_cmd_dl_burst(DL_BEGIN | context);
|
|
ct.primitive = context;
|
|
}
|
|
}
|
|
|
|
void lv_eve_scissor(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
|
|
{
|
|
if(x1 != scissor_x1 || y1 != scissor_y1) {
|
|
int16_t adjusted_x1 = x1 > 0 ? x1 - 1 : 0;
|
|
int16_t adjusted_y1 = y1 > 0 ? y1 - 1 : 0;
|
|
EVE_cmd_dl_burst(SCISSOR_XY(adjusted_x1, adjusted_y1));
|
|
scissor_x1 = x1;
|
|
scissor_y1 = y1;
|
|
}
|
|
|
|
if(x2 != scissor_x2 || y2 != scissor_y2) {
|
|
uint16_t w = x2 - x1 + 3;
|
|
uint16_t h = y2 - y1 + 3;
|
|
EVE_cmd_dl_burst(SCISSOR_SIZE(w, h));
|
|
scissor_x2 = x2;
|
|
scissor_y2 = y2;
|
|
}
|
|
}
|
|
|
|
void lv_eve_color(lv_color_t color)
|
|
{
|
|
if((ct.color.red != color.red) || (ct.color.green != color.green) || (ct.color.blue != color.blue)) {
|
|
EVE_cmd_dl_burst(COLOR_RGB(color.red, color.green, color.blue));
|
|
ct.color = color;
|
|
}
|
|
}
|
|
|
|
void lv_eve_color_mask(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
|
|
{
|
|
if((ct.color_mask[0] != r) ||
|
|
(ct.color_mask[1] != g) ||
|
|
(ct.color_mask[2] != b) ||
|
|
(ct.color_mask[3] != a)) {
|
|
|
|
EVE_cmd_dl_burst(COLOR_MASK(r, g, b, a));
|
|
ct.color_mask[0] = r;
|
|
ct.color_mask[1] = g;
|
|
ct.color_mask[2] = b;
|
|
ct.color_mask[3] = a;
|
|
}
|
|
}
|
|
|
|
void lv_eve_stencil_func(uint8_t func, uint8_t ref, uint8_t mask)
|
|
{
|
|
if(func != ct.stencil_func[0] || ref != ct.stencil_func[1] || mask != ct.stencil_func[2]) {
|
|
|
|
EVE_cmd_dl_burst(STENCIL_FUNC(func, ref, mask));
|
|
ct.stencil_func[0] = func;
|
|
ct.stencil_func[1] = ref;
|
|
ct.stencil_func[2] = mask;
|
|
}
|
|
}
|
|
|
|
void lv_eve_stencil_op(uint8_t sfail, uint8_t spass)
|
|
{
|
|
if(sfail != ct.stencil_op[0] || spass != ct.stencil_op[1]) {
|
|
EVE_cmd_dl_burst(STENCIL_OP(sfail, spass));
|
|
ct.stencil_op[0] = sfail;
|
|
ct.stencil_op[1] = spass;
|
|
|
|
}
|
|
}
|
|
|
|
void lv_eve_blend_func(uint8_t src, uint8_t dst)
|
|
{
|
|
if(src != ct.blend_func[0] || dst != ct.blend_func[1]) {
|
|
EVE_cmd_dl_burst(BLEND_FUNC(src, dst));
|
|
ct.blend_func[0] = src;
|
|
ct.blend_func[1] = dst;
|
|
}
|
|
}
|
|
|
|
void lv_eve_color_opa(lv_opa_t opa)
|
|
{
|
|
if(opa != ct.opa) {
|
|
EVE_cmd_dl_burst(COLOR_A(opa));
|
|
ct.opa = opa;
|
|
}
|
|
}
|
|
|
|
void lv_eve_line_width(int32_t width)
|
|
{
|
|
if(width != ct.line_width) {
|
|
EVE_cmd_dl_burst(LINE_WIDTH(width));
|
|
ct.line_width = width;
|
|
}
|
|
}
|
|
|
|
void lv_eve_point_size(uint16_t radius)
|
|
{
|
|
if(radius != ct.point_size) {
|
|
EVE_cmd_dl_burst(POINT_SIZE(radius * 16));
|
|
ct.point_size = radius;
|
|
}
|
|
}
|
|
|
|
void lv_eve_vertex_2f(int16_t x, int16_t y)
|
|
{
|
|
EVE_cmd_dl_burst(VERTEX2F(x, y));
|
|
}
|
|
|
|
void lv_eve_draw_circle_simple(int16_t coord_x1, int16_t coord_y1, uint16_t radius_t)
|
|
{
|
|
lv_eve_primitive(LV_EVE_PRIMITIVE_POINTS);
|
|
lv_eve_point_size(radius_t);
|
|
lv_eve_vertex_2f(coord_x1, coord_y1);
|
|
}
|
|
|
|
|
|
void lv_eve_draw_rect_simple(int16_t coord_x1, int16_t coord_y1, int16_t coord_x2, int16_t coord_y2, uint16_t radius)
|
|
{
|
|
lv_eve_primitive(LV_EVE_PRIMITIVE_RECTS);
|
|
if(radius > 1) {
|
|
lv_eve_line_width(radius * 16);
|
|
}
|
|
|
|
lv_eve_vertex_2f(coord_x1 + radius, coord_y1 + radius);
|
|
lv_eve_vertex_2f(coord_x2 - radius, coord_y2 - radius);
|
|
}
|
|
|
|
void lv_eve_mask_round(int16_t coord_x1, int16_t coord_y1, int16_t coord_x2, int16_t coord_y2, int16_t radius)
|
|
{
|
|
lv_eve_color_mask(0, 0, 0, 1);
|
|
EVE_cmd_dl_burst(CLEAR(1, 1, 1));
|
|
|
|
|
|
lv_eve_draw_rect_simple(coord_x1, coord_y1, coord_x2, coord_y2, radius);
|
|
lv_eve_color_mask(1, 1, 1, 0);
|
|
lv_eve_blend_func(EVE_DST_ALPHA, EVE_ONE_MINUS_DST_ALPHA);
|
|
}
|
|
|
|
void lv_eve_bitmap_source(uint32_t addr)
|
|
{
|
|
uint32_t bitmap_source = BITMAP_SOURCE(addr);
|
|
if(st.bitmap_source != bitmap_source) {
|
|
EVE_cmd_dl_burst(bitmap_source);
|
|
st.bitmap_source = bitmap_source;
|
|
}
|
|
}
|
|
|
|
void lv_eve_bitmap_size(uint8_t filter, uint8_t wrapx, uint8_t wrapy, uint16_t width, uint16_t height)
|
|
{
|
|
uint32_t bitmap_size = BITMAP_SIZE(filter, wrapx, wrapy, width, height);
|
|
if(st.bitmap_size != bitmap_size) {
|
|
EVE_cmd_dl_burst(bitmap_size);
|
|
st.bitmap_size = bitmap_size;
|
|
}
|
|
/* set the high bits too, of the width and height */
|
|
uint32_t bitmap_size_h = BITMAP_SIZE_H(width, height);
|
|
if(st.bitmap_size_h != bitmap_size_h) {
|
|
EVE_cmd_dl_burst(bitmap_size_h);
|
|
st.bitmap_size_h = bitmap_size_h;
|
|
}
|
|
}
|
|
|
|
void lv_eve_bitmap_layout(uint8_t format, uint16_t linestride, uint16_t height)
|
|
{
|
|
uint32_t bitmap_layout = BITMAP_LAYOUT(format, linestride, height);
|
|
if(st.bitmap_layout != bitmap_layout) {
|
|
EVE_cmd_dl_burst(bitmap_layout);
|
|
st.bitmap_layout = bitmap_layout;
|
|
}
|
|
/* set the high bits too, of the linestride and height */
|
|
uint32_t bitmap_layout_h = BITMAP_LAYOUT_H(linestride, height);
|
|
if(st.bitmap_layout_h != bitmap_layout_h) {
|
|
EVE_cmd_dl_burst(bitmap_layout_h);
|
|
st.bitmap_layout_h = bitmap_layout_h;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**********************
|
|
* STATIC FUNCTIONS
|
|
**********************/
|
|
|
|
#endif /*LV_USE_DRAW_EVE*/
|