1 #include "lv_draw_dave2d.h"
2 #if LV_USE_DRAW_DAVE2D
3 
4 #include "../../lv_draw_label_private.h"
5 #include "../../../misc/lv_area_private.h"
6 
7 static void lv_draw_dave2d_draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc,
8                                           lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area);
9 
10 static lv_draw_dave2d_unit_t * unit = NULL;
11 
lv_draw_dave2d_label(lv_draw_dave2d_unit_t * u,const lv_draw_label_dsc_t * dsc,const lv_area_t * coords)12 void lv_draw_dave2d_label(lv_draw_dave2d_unit_t * u, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords)
13 {
14     if(dsc->opa <= LV_OPA_MIN) return;
15 
16     unit = u;
17 
18     lv_draw_label_iterate_characters(&u->base_unit, dsc, coords, lv_draw_dave2d_draw_letter_cb);
19 
20 }
21 
lv_draw_dave2d_draw_letter_cb(lv_draw_unit_t * u,lv_draw_glyph_dsc_t * glyph_draw_dsc,lv_draw_fill_dsc_t * fill_draw_dsc,const lv_area_t * fill_area)22 static void lv_draw_dave2d_draw_letter_cb(lv_draw_unit_t * u, lv_draw_glyph_dsc_t * glyph_draw_dsc,
23                                           lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area)
24 {
25 
26     d2_u8 current_fillmode;
27     lv_area_t clip_area;
28     lv_area_t letter_coords;
29 
30     int32_t x;
31     int32_t y;
32 
33     letter_coords = *glyph_draw_dsc->letter_coords;
34 
35     bool is_common;
36     is_common = lv_area_intersect(&clip_area, glyph_draw_dsc->letter_coords, u->clip_area);
37     if(!is_common) return;
38 
39     x = 0 - unit->base_unit.target_layer->buf_area.x1;
40     y = 0 - unit->base_unit.target_layer->buf_area.y1;
41 
42     lv_area_move(&clip_area, x, y);
43     lv_area_move(&letter_coords, x, y);
44 
45 #if LV_USE_OS
46     lv_result_t  status;
47     status = lv_mutex_lock(unit->pd2Mutex);
48     LV_ASSERT(LV_RESULT_OK == status);
49 #endif
50 
51 #if D2_RENDER_EACH_OPERATION
52     d2_selectrenderbuffer(unit->d2_handle, unit->renderbuffer);
53 #endif
54 
55     //
56     // Generate render operations
57     //
58 
59     d2_framebuffer_from_layer(unit->d2_handle, unit->base_unit.target_layer);
60 
61     current_fillmode = d2_getfillmode(unit->d2_handle);
62 
63     d2_cliprect(unit->d2_handle, (d2_border)clip_area.x1, (d2_border)clip_area.y1, (d2_border)clip_area.x2,
64                 (d2_border)clip_area.y2);
65 
66     if(glyph_draw_dsc) {
67         switch(glyph_draw_dsc->format) {
68             case LV_FONT_GLYPH_FORMAT_NONE: {
69 #if LV_USE_FONT_PLACEHOLDER
70                     /* Draw a placeholder rectangle*/
71                     lv_draw_border_dsc_t border_draw_dsc;
72                     lv_draw_border_dsc_init(&border_draw_dsc);
73                     border_draw_dsc.opa = glyph_draw_dsc->opa;
74                     border_draw_dsc.color = glyph_draw_dsc->color;
75                     border_draw_dsc.width = 1;
76                     //lv_draw_sw_border(u, &border_draw_dsc, glyph_draw_dsc->bg_coords);
77                     lv_draw_dave2d_border(unit, &border_draw_dsc, glyph_draw_dsc->bg_coords);
78 #endif
79                 }
80                 break;
81             case LV_FONT_GLYPH_FORMAT_A1 ... LV_FONT_GLYPH_FORMAT_A8_ALIGNED: {
82                     glyph_draw_dsc->glyph_data = lv_font_get_glyph_bitmap(glyph_draw_dsc->g, glyph_draw_dsc->_draw_buf);
83                     lv_area_t mask_area = letter_coords;
84                     mask_area.x2 = mask_area.x1 + lv_draw_buf_width_to_stride(lv_area_get_width(&mask_area), LV_COLOR_FORMAT_A8) - 1;
85                     //            lv_draw_sw_blend_dsc_t blend_dsc;
86                     //            lv_memzero(&blend_dsc, sizeof(blend_dsc));
87                     //            blend_dsc.color = glyph_draw_dsc->color;
88                     //            blend_dsc.opa = glyph_draw_dsc->opa;
89                     //            blend_dsc.mask_buf = glyph_draw_dsc->glyph_data;
90                     //            blend_dsc.mask_area = &mask_area;
91                     //            blend_dsc.blend_area = glyph_draw_dsc->letter_coords;
92                     //            blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED;
93                     //lv_draw_sw_blend(u, &blend_dsc);
94 
95                     lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data;
96 
97 #if defined(RENESAS_CORTEX_M85)
98 #if (BSP_CFG_DCACHE_ENABLED)
99                     d1_cacheblockflush(unit->d2_handle, 0, draw_buf->data, draw_buf->data_size);
100 #endif
101 #endif
102                     d2_settexture(unit->d2_handle, (void *)draw_buf->data,
103                                   (d2_s32)lv_draw_buf_width_to_stride((uint32_t)lv_area_get_width(&letter_coords), LV_COLOR_FORMAT_A8),
104                                   lv_area_get_width(&letter_coords),  lv_area_get_height(&letter_coords), d2_mode_alpha8);
105                     d2_settexopparam(unit->d2_handle, d2_cc_red, glyph_draw_dsc->color.red, 0);
106                     d2_settexopparam(unit->d2_handle, d2_cc_green, glyph_draw_dsc->color.green, 0);
107                     d2_settexopparam(unit->d2_handle, d2_cc_blue, glyph_draw_dsc->color.blue, 0);
108                     d2_settexopparam(unit->d2_handle, d2_cc_alpha, glyph_draw_dsc->opa, 0);
109 
110                     d2_settextureoperation(unit->d2_handle, d2_to_multiply, d2_to_multiply, d2_to_multiply, d2_to_multiply);
111 
112                     d2_settexturemapping(unit->d2_handle, D2_FIX4(letter_coords.x1), D2_FIX4(letter_coords.y1), D2_FIX16(0), D2_FIX16(0),
113                                          D2_FIX16(1), D2_FIX16(0), D2_FIX16(0), D2_FIX16(1));
114 
115                     d2_settexturemode(unit->d2_handle, d2_tm_filter);
116 
117                     d2_setfillmode(unit->d2_handle, d2_fm_texture);
118 
119                     d2_renderbox(unit->d2_handle, (d2_point)D2_FIX4(letter_coords.x1),
120                                  (d2_point)D2_FIX4(letter_coords.y1),
121                                  (d2_point)D2_FIX4(lv_area_get_width(&letter_coords)),
122                                  (d2_point)D2_FIX4(lv_area_get_height(&letter_coords)));
123 
124                     d2_setfillmode(unit->d2_handle, current_fillmode);
125                 }
126                 break;
127             case LV_FONT_GLYPH_FORMAT_IMAGE: {
128 #if LV_USE_IMGFONT
129                     glyph_draw_dsc->glyph_data = lv_font_get_glyph_bitmap(glyph_draw_dsc->g, glyph_draw_dsc->_draw_buf);
130                     lv_draw_image_dsc_t img_dsc;
131                     lv_draw_image_dsc_init(&img_dsc);
132                     img_dsc.rotation = 0;
133                     img_dsc.scale_x = LV_SCALE_NONE;
134                     img_dsc.scale_y = LV_SCALE_NONE;
135                     img_dsc.opa = glyph_draw_dsc->opa;
136                     img_dsc.src = glyph_draw_dsc->glyph_data;
137                     //lv_draw_sw_image(draw_unit, &img_dsc, glyph_draw_dsc->letter_coords);
138 #endif
139                 }
140                 break;
141             default:
142                 break;
143         }
144     }
145 
146     //
147     // Execute render operations
148     //
149 #if D2_RENDER_EACH_OPERATION
150     d2_executerenderbuffer(unit->d2_handle, unit->renderbuffer, 0);
151     d2_flushframe(unit->d2_handle);
152 #endif
153 
154     if(fill_draw_dsc && fill_area) {
155         //lv_draw_sw_fill(u, fill_draw_dsc, fill_area);
156         lv_draw_dave2d_fill(unit, fill_draw_dsc, fill_area);
157     }
158 
159 #if LV_USE_OS
160     status = lv_mutex_unlock(unit->pd2Mutex);
161     LV_ASSERT(LV_RESULT_OK == status);
162 #endif
163 }
164 
165 #endif /*LV_USE_DRAW_DAVE2D*/
166