summaryrefslogtreecommitdiff
path: root/firmware/drivers/lcd-bitmap-common.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/lcd-bitmap-common.c')
-rw-r--r--firmware/drivers/lcd-bitmap-common.c33
1 files changed, 15 insertions, 18 deletions
diff --git a/firmware/drivers/lcd-bitmap-common.c b/firmware/drivers/lcd-bitmap-common.c
index 4a711d5378..78ceb848d5 100644
--- a/firmware/drivers/lcd-bitmap-common.c
+++ b/firmware/drivers/lcd-bitmap-common.c
@@ -83,11 +83,10 @@ static void lcd_gradient_rect(int x1, int x2, int y, unsigned h,
83/* put a string at a given pixel position, skipping first ofs pixel columns */ 83/* put a string at a given pixel position, skipping first ofs pixel columns */
84static void LCDFN(putsxyofs)(int x, int y, int ofs, const unsigned char *str) 84static void LCDFN(putsxyofs)(int x, int y, int ofs, const unsigned char *str)
85{ 85{
86 unsigned short ch, *ucs; 86 unsigned short *ucs;
87 struct font* pf = font_get(current_vp->font); 87 struct font* pf = font_get(current_vp->font);
88 int vp_flags = current_vp->flags; 88 int vp_flags = current_vp->flags;
89 unsigned i; 89 int rtl_next_non_diac_width, last_non_diacritic_width;
90 static int rtl_next_non_diacritic_width, last_non_diacritic_width;
91 90
92 if ((vp_flags & VP_FLAG_ALIGNMENT_MASK) != 0) 91 if ((vp_flags & VP_FLAG_ALIGNMENT_MASK) != 0)
93 { 92 {
@@ -109,25 +108,23 @@ static void LCDFN(putsxyofs)(int x, int y, int ofs, const unsigned char *str)
109 } 108 }
110 } 109 }
111 110
112 ucs = bidi_l2v(str, 1); 111 rtl_next_non_diac_width = 0;
113
114 rtl_next_non_diacritic_width = 0;
115 last_non_diacritic_width = 0; 112 last_non_diacritic_width = 0;
116 /* Mark diacritic and rtl flags for each character */ 113 /* Mark diacritic and rtl flags for each character */
117 for (i = 0; i < SCROLL_LINE_SIZE && (ch = ucs[i]); i++) 114 for (ucs = bidi_l2v(str, 1); *ucs; ucs++)
118 { 115 {
119 bool is_rtl, is_diac; 116 bool is_rtl, is_diac;
120 const unsigned char *bits; 117 const unsigned char *bits;
121 int width, base_width, drawmode = 0, base_ofs = 0; 118 int width, base_width, drawmode = 0, base_ofs = 0;
122 unsigned short next_ch = ucs[i + 1]; 119 const unsigned short next_ch = ucs[1];
123 120
124 if (x >= current_vp->width) 121 if (x >= current_vp->width)
125 break; 122 break;
126 123
127 is_diac = is_diacritic(ch, &is_rtl); 124 is_diac = is_diacritic(*ucs, &is_rtl);
128 125
129 /* Get proportional width and glyph bits */ 126 /* Get proportional width and glyph bits */
130 width = font_get_width(pf, ch); 127 width = font_get_width(pf, *ucs);
131 128
132 /* Calculate base width */ 129 /* Calculate base width */
133 if (is_rtl) 130 if (is_rtl)
@@ -135,20 +132,20 @@ static void LCDFN(putsxyofs)(int x, int y, int ofs, const unsigned char *str)
135 /* Forward-seek the next non-diacritic character for base width */ 132 /* Forward-seek the next non-diacritic character for base width */
136 if (is_diac) 133 if (is_diac)
137 { 134 {
138 if (!rtl_next_non_diacritic_width) 135 if (!rtl_next_non_diac_width)
139 { 136 {
140 unsigned j; 137 const unsigned short *u;
141 138
142 /* Jump to next non-diacritic char, and calc its width */ 139 /* Jump to next non-diacritic char, and calc its width */
143 for (j = i + 1; ucs[j] && is_diacritic(ucs[j], NULL); j++); 140 for (u = &ucs[1]; *u && is_diacritic(*u, NULL); u++);
144 rtl_next_non_diacritic_width = ucs[j] ? 141
145 font_get_width(pf, ucs[j]) : 0; 142 rtl_next_non_diac_width = *u ? font_get_width(pf, *u) : 0;
146 } 143 }
147 base_width = rtl_next_non_diacritic_width; 144 base_width = rtl_next_non_diac_width;
148 } 145 }
149 else 146 else
150 { 147 {
151 rtl_next_non_diacritic_width = 0; /* Mark */ 148 rtl_next_non_diac_width = 0; /* Mark */
152 base_width = width; 149 base_width = width;
153 } 150 }
154 } 151 }
@@ -188,7 +185,7 @@ static void LCDFN(putsxyofs)(int x, int y, int ofs, const unsigned char *str)
188 base_ofs = (base_width - width) / 2; 185 base_ofs = (base_width - width) / 2;
189 } 186 }
190 187
191 bits = font_get_bits(pf, ch); 188 bits = font_get_bits(pf, *ucs);
192 LCDFN(mono_bitmap_part)(bits, ofs, 0, width, MAX(x + base_ofs, 0), y, 189 LCDFN(mono_bitmap_part)(bits, ofs, 0, width, MAX(x + base_ofs, 0), y,
193 width - ofs, pf->height); 190 width - ofs, pf->height);
194 191