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