diff options
Diffstat (limited to 'firmware/drivers/lcd-bitmap-common.c')
-rw-r--r-- | firmware/drivers/lcd-bitmap-common.c | 33 |
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 */ |
84 | static void LCDFN(putsxyofs)(int x, int y, int ofs, const unsigned char *str) | 84 | static 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 | ||