forked from enlightenment/efl
patch from: Mikhail Gusarov <dottedmag@dottedmag.net>
evas_common_font_utf8_get_prev currently works correctly only on an ASCII symbols. For non-ASCII it just returns random garbage somehow constructed from a string. Attached patch makes it work according to the comment at the start. SVN revision: 41292
This commit is contained in:
parent
8106bf6d44
commit
d6af88ef6c
|
@ -193,52 +193,19 @@ evas_common_font_utf8_get_prev(const unsigned char *buf, int *iindex)
|
||||||
*
|
*
|
||||||
* Returns 0 to indicate there is no prev char
|
* Returns 0 to indicate there is no prev char
|
||||||
*/
|
*/
|
||||||
int index = *iindex, len, r;
|
|
||||||
unsigned char d, d2, d3, d4;
|
|
||||||
|
|
||||||
|
int index = *iindex;
|
||||||
if (index <= 0)
|
if (index <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
d = buf[index--];
|
|
||||||
|
|
||||||
|
/* First obtain the codepoint at iindex */
|
||||||
|
int r = evas_common_font_utf8_get_next(buf, &index);
|
||||||
|
|
||||||
|
/* Next advance iindex to previous codepoint */
|
||||||
|
index = *iindex;
|
||||||
|
index--;
|
||||||
while ((index > 0) && ((buf[index] & 0xc0) == 0x80))
|
while ((index > 0) && ((buf[index] & 0xc0) == 0x80))
|
||||||
index--;
|
index--;
|
||||||
len = *iindex - index;
|
|
||||||
|
|
||||||
if (len == 1)
|
|
||||||
r = d;
|
|
||||||
else if (len == 2)
|
|
||||||
{
|
|
||||||
/* 2 bytes */
|
|
||||||
d2 = buf[index + 1];
|
|
||||||
r = d & 0x1f; /* copy lower 5 */
|
|
||||||
r <<= 6;
|
|
||||||
r |= (d2 & 0x3f); /* copy lower 6 */
|
|
||||||
}
|
|
||||||
else if (len == 3)
|
|
||||||
{
|
|
||||||
/* 3 bytes */
|
|
||||||
d2 = buf[index + 1];
|
|
||||||
d3 = buf[index + 2];
|
|
||||||
r = d & 0x0f; /* copy lower 4 */
|
|
||||||
r <<= 6;
|
|
||||||
r |= (d2 & 0x3f);
|
|
||||||
r <<= 6;
|
|
||||||
r |= (d3 & 0x3f);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* 4 bytes */
|
|
||||||
d2 = buf[index + 1];
|
|
||||||
d3 = buf[index + 2];
|
|
||||||
d4 = buf[index + 3];
|
|
||||||
r = d & 0x0f; /* copy lower 4 */
|
|
||||||
r <<= 6;
|
|
||||||
r |= (d2 & 0x3f);
|
|
||||||
r <<= 6;
|
|
||||||
r |= (d3 & 0x3f);
|
|
||||||
r <<= 6;
|
|
||||||
r |= (d4 & 0x3f);
|
|
||||||
}
|
|
||||||
|
|
||||||
*iindex = index;
|
*iindex = index;
|
||||||
return r;
|
return r;
|
||||||
|
|
Loading…
Reference in New Issue