forked from enlightenment/efl
clean up terminal char line drawing fallback to be more specific (fall
back only if 1 size and num glyphs < 513 and find failed). ALSO make lookup a binary-search for efficiency. SVN revision: 72710
This commit is contained in:
parent
309e29f9ee
commit
01c382407b
|
@ -508,41 +508,39 @@ struct _Font_Char_Index
|
||||||
EAPI FT_UInt
|
EAPI FT_UInt
|
||||||
evas_common_get_char_index(RGBA_Font_Int* fi, Eina_Unicode gl)
|
evas_common_get_char_index(RGBA_Font_Int* fi, Eina_Unicode gl)
|
||||||
{
|
{
|
||||||
static const Eina_Unicode mapfix[] =
|
static const unsigned short mapfix[] =
|
||||||
{
|
{
|
||||||
0x25c6, 0x1,
|
|
||||||
0x2592, 0x2,
|
|
||||||
0x2409, 0x3,
|
|
||||||
0x240c, 0x4,
|
|
||||||
0x240d, 0x5,
|
|
||||||
0x240a, 0x6,
|
|
||||||
0x00b0, 0x7,
|
0x00b0, 0x7,
|
||||||
0x00b1, 0x8,
|
0x00b1, 0x8,
|
||||||
0x2424, 0x9,
|
0x00b7, 0x1f,
|
||||||
0x240b, 0xa,
|
0x03c0, 0x1c,
|
||||||
0x2518, 0xb,
|
0x20a4, 0xa3,
|
||||||
0x2510, 0xc,
|
0x2260, 0x1d,
|
||||||
0x250c, 0xd,
|
|
||||||
0x2514, 0xe,
|
|
||||||
0x253c, 0xf,
|
|
||||||
0x23ba, 0x10,
|
|
||||||
0x23bb, 0x11,
|
|
||||||
0x2500, 0x12,
|
|
||||||
0x23bc, 0x13,
|
|
||||||
0x23bd, 0x14,
|
|
||||||
0x251c, 0x15,
|
|
||||||
0x2524, 0x16,
|
|
||||||
0x2534, 0x17,
|
|
||||||
0x252c, 0x18,
|
|
||||||
0x2502, 0x19,
|
|
||||||
0x2264, 0x1a,
|
0x2264, 0x1a,
|
||||||
0x2265, 0x1b,
|
0x2265, 0x1b,
|
||||||
0x03c0, 0x1c,
|
0x23ba, 0x10,
|
||||||
0x2260, 0x1d,
|
0x23bb, 0x11,
|
||||||
0x00a3, 0xa3,
|
0x23bc, 0x13,
|
||||||
0x00b7, 0x1f,
|
0x23bd, 0x14,
|
||||||
0x20a4, 0xa3,
|
0x2409, 0x3,
|
||||||
0x0000, 0x0
|
0x240a, 0x6,
|
||||||
|
0x240b, 0xa,
|
||||||
|
0x240c, 0x4,
|
||||||
|
0x240d, 0x5,
|
||||||
|
0x2424, 0x9,
|
||||||
|
0x2500, 0x12,
|
||||||
|
0x2502, 0x19,
|
||||||
|
0x250c, 0xd,
|
||||||
|
0x2510, 0xc,
|
||||||
|
0x2514, 0xe,
|
||||||
|
0x2518, 0xb,
|
||||||
|
0x251c, 0x15,
|
||||||
|
0x2524, 0x16,
|
||||||
|
0x252c, 0x18,
|
||||||
|
0x2534, 0x17,
|
||||||
|
0x253c, 0xf,
|
||||||
|
0x2592, 0x2,
|
||||||
|
0x25c6, 0x1,
|
||||||
};
|
};
|
||||||
Font_Char_Index result;
|
Font_Char_Index result;
|
||||||
//FT_UInt ret;
|
//FT_UInt ret;
|
||||||
|
@ -575,20 +573,48 @@ evas_common_get_char_index(RGBA_Font_Int* fi, Eina_Unicode gl)
|
||||||
#ifdef HAVE_PTHREAD
|
#ifdef HAVE_PTHREAD
|
||||||
// pthread_mutex_unlock(&fi->ft_mutex);
|
// pthread_mutex_unlock(&fi->ft_mutex);
|
||||||
#endif
|
#endif
|
||||||
if (result.index <= 0)
|
// this is a workaround freetype bugs where for a bitmap old style font
|
||||||
|
// even if it has unicode information and mappings, they are not used
|
||||||
|
// to find terminal line/drawing chars, so do this by hand with a table
|
||||||
|
if ((result.index <= 0) && (fi->src->ft.face->num_fixed_sizes == 1) &&
|
||||||
|
(fi->src->ft.face->num_glyphs < 512))
|
||||||
{
|
{
|
||||||
int i;
|
int i, min = 0, max;
|
||||||
|
|
||||||
for (i = 0; mapfix[i]; i += 2)
|
// binary search through sorted table of codepoints to new
|
||||||
|
// codepoints with a guess that bitmap font is playing the old
|
||||||
|
// game of putting line drawing chars in specific ranges
|
||||||
|
max = sizeof(mapfix) / (sizeof(mapfix[0]) * 2);
|
||||||
|
i = (min + max) / 2;
|
||||||
|
for (;;)
|
||||||
{
|
{
|
||||||
if (gl == mapfix[i])
|
unsigned short v;
|
||||||
|
|
||||||
|
v = mapfix[i << 1];
|
||||||
|
if (gl == v)
|
||||||
{
|
{
|
||||||
gl = mapfix[i + 1];
|
gl = mapfix[(i << 1) + 1];
|
||||||
FTLOCK();
|
FTLOCK();
|
||||||
result.index = FT_Get_Char_Index(fi->src->ft.face, gl);
|
result.index = FT_Get_Char_Index(fi->src->ft.face, gl);
|
||||||
FTUNLOCK();
|
FTUNLOCK();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// failure to find at all
|
||||||
|
if ((max - min) <= 2) break;
|
||||||
|
// if glyph above out position...
|
||||||
|
if (gl > v)
|
||||||
|
{
|
||||||
|
min = i;
|
||||||
|
if ((max - min) == 2) i = max;
|
||||||
|
else i = (min + max) / 2;
|
||||||
|
}
|
||||||
|
// if glyph below out position
|
||||||
|
else if (gl < v)
|
||||||
|
{
|
||||||
|
max = i;
|
||||||
|
if ((max - min) == 2) i = min;
|
||||||
|
else i = (min + max) / 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result.index;
|
return result.index;
|
||||||
|
|
Loading…
Reference in New Issue