1 /**
2  * @file lv_draw_vglite_layer.c
3  *
4  */
5 
6 /**
7  * Copyright 2023-2024 NXP
8  *
9  * SPDX-License-Identifier: MIT
10  */
11 
12 /*********************
13  *      INCLUDES
14  *********************/
15 
16 #include "lv_draw_vglite.h"
17 
18 #if LV_USE_DRAW_VGLITE
19 
20 #include "../../../stdlib/lv_string.h"
21 #include "../../../core/lv_global.h"
22 
23 /*********************
24  *      DEFINES
25  *********************/
26 
27 /**********************
28  *      TYPEDEFS
29  **********************/
30 
31 /**********************
32  *  STATIC PROTOTYPES
33  **********************/
34 
35 /**********************
36  *  STATIC VARIABLES
37  **********************/
38 
39 #define _draw_info LV_GLOBAL_DEFAULT()->draw_info
40 
41 /**********************
42  *      MACROS
43  **********************/
44 
45 /**********************
46  *   GLOBAL FUNCTIONS
47  **********************/
48 
lv_draw_vglite_layer(lv_draw_unit_t * draw_unit,const lv_draw_image_dsc_t * draw_dsc,const lv_area_t * coords)49 void lv_draw_vglite_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc,
50                           const lv_area_t * coords)
51 {
52     lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src;
53     const lv_draw_buf_t * draw_buf = layer_to_draw->draw_buf;
54 
55     /* It can happen that nothing was draw on a layer and therefore its buffer is not allocated.
56      * In this case just return.
57      */
58     if(draw_buf == NULL)
59         return;
60 
61     if(_draw_info.unit_cnt > 1) {
62         const lv_area_t area_to_draw = {
63             .x1 = 0,
64             .y1 = 0,
65             .x2 = draw_buf->header.w - 1,
66             .y2 = draw_buf->header.h - 1
67         };
68         lv_draw_buf_invalidate_cache(draw_buf, &area_to_draw);
69     }
70 
71     lv_draw_image_dsc_t new_draw_dsc = *draw_dsc;
72     new_draw_dsc.src = draw_buf;
73     lv_draw_vglite_img(draw_unit, &new_draw_dsc, coords);
74 
75 #if LV_USE_LAYER_DEBUG || LV_USE_PARALLEL_DRAW_DEBUG
76     lv_area_t area_rot;
77     lv_area_copy(&area_rot, coords);
78     bool has_transform = (draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE ||
79                           draw_dsc->scale_y != LV_SCALE_NONE);
80 
81     if(has_transform) {
82         int32_t w = lv_area_get_width(coords);
83         int32_t h = lv_area_get_height(coords);
84 
85         lv_image_buf_get_transformed_area(&area_rot, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y,
86                                           &draw_dsc->pivot);
87 
88         area_rot.x1 += coords->x1;
89         area_rot.y1 += coords->y1;
90         area_rot.x2 += coords->x1;
91         area_rot.y2 += coords->y1;
92     }
93     lv_area_t draw_area;
94     if(!lv_area_intersect(&draw_area, &area_rot, draw_unit->clip_area)) return;
95 #endif
96 
97 #if LV_USE_LAYER_DEBUG
98     lv_draw_fill_dsc_t fill_dsc;
99     lv_draw_fill_dsc_init(&fill_dsc);
100     fill_dsc.color = lv_color_hex(layer_to_draw->color_format == LV_COLOR_FORMAT_ARGB8888 ? 0xff0000 : 0x00ff00);
101     fill_dsc.opa = LV_OPA_20;
102     lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot);
103 
104     lv_draw_border_dsc_t border_dsc;
105     lv_draw_border_dsc_init(&border_dsc);
106     border_dsc.color = fill_dsc.color;
107     border_dsc.opa = LV_OPA_60;
108     border_dsc.width = 2;
109     lv_draw_sw_border(draw_unit, &border_dsc, &area_rot);
110 
111 #endif
112 
113 #if LV_USE_PARALLEL_DRAW_DEBUG
114     uint32_t idx = 0;
115     lv_draw_unit_t * draw_unit_tmp = _draw_info.unit_head;
116     while(draw_unit_tmp != draw_unit) {
117         draw_unit_tmp = draw_unit_tmp->next;
118         idx++;
119     }
120 
121     lv_draw_fill_dsc_t fill_dsc;
122     lv_draw_rect_dsc_init(&fill_dsc);
123     fill_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST);
124     fill_dsc.opa = LV_OPA_10;
125     lv_draw_sw_fill(draw_unit, &fill_dsc, &area_rot);
126 
127     lv_draw_border_dsc_t border_dsc;
128     lv_draw_border_dsc_init(&border_dsc);
129     border_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST);
130     border_dsc.opa = LV_OPA_100;
131     border_dsc.width = 2;
132     lv_draw_sw_border(draw_unit, &border_dsc, &area_rot);
133 
134     lv_point_t txt_size;
135     lv_text_get_size(&txt_size, "W", LV_FONT_DEFAULT, 0, 0, 100, LV_TEXT_FLAG_NONE);
136 
137     lv_area_t txt_area;
138     txt_area.x1 = draw_area.x1;
139     txt_area.x2 = draw_area.x1 + txt_size.x - 1;
140     txt_area.y2 = draw_area.y2;
141     txt_area.y1 = draw_area.y2 - txt_size.y + 1;
142 
143     lv_draw_fill_dsc_init(&fill_dsc);
144     fill_dsc.color = lv_color_black();
145     lv_draw_sw_fill(draw_unit, &fill_dsc, &txt_area);
146 
147     char buf[8];
148     lv_snprintf(buf, sizeof(buf), "%d", idx);
149     lv_draw_label_dsc_t label_dsc;
150     lv_draw_label_dsc_init(&label_dsc);
151     label_dsc.color = lv_color_white();
152     label_dsc.text = buf;
153     lv_draw_sw_label(draw_unit, &label_dsc, &txt_area);
154 #endif
155 }
156 
157 #endif /*LV_USE_DRAW_VGLITE*/
158