2002-11-08 00:02:15 -08:00
|
|
|
#include "evas_common.h"
|
2009-09-21 09:08:51 -07:00
|
|
|
#include "evas_private.h"
|
2010-07-28 05:00:41 -07:00
|
|
|
#include "evas_encoding.h"
|
|
|
|
|
2010-07-20 05:09:46 -07:00
|
|
|
#include "evas_font_private.h"
|
|
|
|
|
2004-01-15 06:58:03 -08:00
|
|
|
FT_Library evas_ft_lib = 0;
|
2004-01-12 10:12:41 -08:00
|
|
|
static int initialised = 0;
|
2002-11-08 00:02:15 -08:00
|
|
|
|
2010-05-30 20:31:49 -07:00
|
|
|
LK(lock_font_draw); // for freetype2 API calls
|
|
|
|
LK(lock_fribidi); // for fribidi API calls
|
|
|
|
|
2006-09-06 00:33:40 -07:00
|
|
|
EAPI void
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_font_init(void)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
|
|
|
int error;
|
|
|
|
|
2004-01-12 15:48:10 -08:00
|
|
|
initialised++;
|
|
|
|
if (initialised != 1) return;
|
2004-01-15 06:58:03 -08:00
|
|
|
error = FT_Init_FreeType(&evas_ft_lib);
|
2010-05-17 21:22:33 -07:00
|
|
|
if (error) return;
|
2009-06-15 08:07:13 -07:00
|
|
|
evas_common_font_load_init();
|
2010-05-21 00:10:45 -07:00
|
|
|
evas_common_font_draw_init();
|
2010-05-30 20:31:49 -07:00
|
|
|
LKI(lock_font_draw);
|
|
|
|
LKI(lock_fribidi);
|
2002-11-08 00:02:15 -08:00
|
|
|
}
|
|
|
|
|
2006-09-06 00:33:40 -07:00
|
|
|
EAPI void
|
2004-01-12 10:12:41 -08:00
|
|
|
evas_common_font_shutdown(void)
|
|
|
|
{
|
|
|
|
int error;
|
|
|
|
|
2010-05-17 21:22:33 -07:00
|
|
|
if (initialised < 1) return;
|
2004-01-12 15:48:10 -08:00
|
|
|
initialised--;
|
|
|
|
if (initialised != 0) return;
|
2008-02-15 06:43:51 -08:00
|
|
|
|
2010-05-30 20:40:48 -07:00
|
|
|
LKD(lock_font_draw);
|
|
|
|
LKD(lock_fribidi);
|
|
|
|
|
2009-06-15 08:07:13 -07:00
|
|
|
evas_common_font_load_shutdown();
|
2008-02-15 06:43:51 -08:00
|
|
|
evas_common_font_cache_set(0);
|
|
|
|
evas_common_font_flush();
|
|
|
|
|
2004-01-15 06:58:03 -08:00
|
|
|
error = FT_Done_FreeType(evas_ft_lib);
|
2010-05-21 00:10:45 -07:00
|
|
|
#ifdef EVAS_FRAME_QUEUING
|
|
|
|
evas_common_font_draw_finish();
|
|
|
|
#endif
|
2008-02-15 06:43:51 -08:00
|
|
|
evas_ft_lib = 0;
|
2004-01-12 10:12:41 -08:00
|
|
|
}
|
|
|
|
|
2010-04-12 01:23:53 -07:00
|
|
|
EAPI void
|
|
|
|
evas_common_font_font_all_unload(void)
|
|
|
|
{
|
|
|
|
evas_common_font_all_clear();
|
|
|
|
}
|
|
|
|
|
2006-09-06 00:33:40 -07:00
|
|
|
EAPI int
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_font_ascent_get(RGBA_Font *fn)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
2010-08-16 03:46:56 -07:00
|
|
|
int val;
|
2005-03-20 07:57:55 -08:00
|
|
|
RGBA_Font_Int *fi;
|
2005-05-21 19:49:48 -07:00
|
|
|
|
2010-02-03 03:18:00 -08:00
|
|
|
// evas_common_font_size_use(fn);
|
2010-04-25 04:35:41 -07:00
|
|
|
#if 0
|
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(fn->fonts, l, fi)
|
|
|
|
{
|
|
|
|
if (!fi->src->ft.face) continue;
|
|
|
|
if (fi->src->current_size != fi->size)
|
|
|
|
{
|
2010-07-20 05:09:46 -07:00
|
|
|
FTLOCK();
|
2010-04-25 04:35:41 -07:00
|
|
|
FT_Activate_Size(fi->ft.size);
|
2010-07-20 05:09:46 -07:00
|
|
|
FTUNLOCK();
|
2010-04-25 04:35:41 -07:00
|
|
|
fi->src->current_size = fi->size;
|
|
|
|
}
|
|
|
|
val = (int)fi->src->ft.face->size->metrics.ascender;
|
|
|
|
if (fi->src->ft.face->units_per_EM == 0)
|
|
|
|
return val;
|
|
|
|
dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
|
|
|
|
ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
|
|
|
|
printf(" ==== %p: %i\n", fi, ret);
|
|
|
|
}
|
|
|
|
}
|
2010-05-01 07:08:14 -07:00
|
|
|
#endif
|
2005-03-20 07:57:55 -08:00
|
|
|
fi = fn->fonts->data;
|
2010-02-03 03:18:00 -08:00
|
|
|
if (fi->src->current_size != fi->size)
|
|
|
|
{
|
2010-07-20 05:09:46 -07:00
|
|
|
FTLOCK();
|
2010-02-03 03:18:00 -08:00
|
|
|
FT_Activate_Size(fi->ft.size);
|
2010-07-20 05:09:46 -07:00
|
|
|
FTUNLOCK();
|
2010-02-03 03:18:00 -08:00
|
|
|
fi->src->current_size = fi->size;
|
|
|
|
}
|
2010-05-01 07:08:14 -07:00
|
|
|
if (!FT_IS_SCALABLE(fi->src->ft.face))
|
|
|
|
{
|
|
|
|
printf("NOT SCALABLE!\n");
|
|
|
|
}
|
2005-03-20 07:57:55 -08:00
|
|
|
val = (int)fi->src->ft.face->size->metrics.ascender;
|
2010-05-01 07:08:14 -07:00
|
|
|
return val >> 6;
|
|
|
|
// printf("%i | %i\n", val, val >> 6);
|
|
|
|
// if (fi->src->ft.face->units_per_EM == 0)
|
|
|
|
// return val;
|
|
|
|
// dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
|
|
|
|
// ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
|
|
|
|
// return ret;
|
2002-11-08 00:02:15 -08:00
|
|
|
}
|
|
|
|
|
2006-09-06 00:33:40 -07:00
|
|
|
EAPI int
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_font_descent_get(RGBA_Font *fn)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
2010-08-16 03:46:56 -07:00
|
|
|
int val;
|
2005-03-20 07:57:55 -08:00
|
|
|
RGBA_Font_Int *fi;
|
2005-05-21 19:49:48 -07:00
|
|
|
|
2010-02-03 03:18:00 -08:00
|
|
|
// evas_common_font_size_use(fn);
|
2005-03-20 07:57:55 -08:00
|
|
|
fi = fn->fonts->data;
|
2010-02-03 03:18:00 -08:00
|
|
|
if (fi->src->current_size != fi->size)
|
|
|
|
{
|
2010-07-20 05:09:46 -07:00
|
|
|
FTLOCK();
|
2010-02-03 03:18:00 -08:00
|
|
|
FT_Activate_Size(fi->ft.size);
|
2010-07-20 05:09:46 -07:00
|
|
|
FTUNLOCK();
|
2010-02-03 03:18:00 -08:00
|
|
|
fi->src->current_size = fi->size;
|
|
|
|
}
|
2005-03-20 07:57:55 -08:00
|
|
|
val = -(int)fi->src->ft.face->size->metrics.descender;
|
2010-05-01 07:08:14 -07:00
|
|
|
return val >> 6;
|
|
|
|
// if (fi->src->ft.face->units_per_EM == 0)
|
|
|
|
// return val;
|
|
|
|
// dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
|
|
|
|
// ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
|
|
|
|
// return ret;
|
2002-11-08 00:02:15 -08:00
|
|
|
}
|
|
|
|
|
2006-09-06 00:33:40 -07:00
|
|
|
EAPI int
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_font_max_ascent_get(RGBA_Font *fn)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
2004-01-26 00:21:00 -08:00
|
|
|
int val, dv;
|
2002-11-08 00:02:15 -08:00
|
|
|
int ret;
|
2005-03-20 07:57:55 -08:00
|
|
|
RGBA_Font_Int *fi;
|
2005-05-21 19:49:48 -07:00
|
|
|
|
2010-02-03 03:18:00 -08:00
|
|
|
// evas_common_font_size_use(fn);
|
2005-03-20 07:57:55 -08:00
|
|
|
fi = fn->fonts->data;
|
2010-02-03 03:18:00 -08:00
|
|
|
if (fi->src->current_size != fi->size)
|
|
|
|
{
|
2010-07-20 05:09:46 -07:00
|
|
|
FTLOCK();
|
2010-02-03 03:18:00 -08:00
|
|
|
FT_Activate_Size(fi->ft.size);
|
2010-07-20 05:09:46 -07:00
|
|
|
FTUNLOCK();
|
2010-02-03 03:18:00 -08:00
|
|
|
fi->src->current_size = fi->size;
|
|
|
|
}
|
2005-03-20 07:57:55 -08:00
|
|
|
val = (int)fi->src->ft.face->bbox.yMax;
|
2006-03-19 02:50:33 -08:00
|
|
|
if (fi->src->ft.face->units_per_EM == 0)
|
2009-04-23 21:35:52 -07:00
|
|
|
return val;
|
2005-05-21 19:49:48 -07:00
|
|
|
dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
|
2005-03-20 07:57:55 -08:00
|
|
|
ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
|
2002-11-08 00:02:15 -08:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2006-09-06 00:33:40 -07:00
|
|
|
EAPI int
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_font_max_descent_get(RGBA_Font *fn)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
2004-01-26 00:21:00 -08:00
|
|
|
int val, dv;
|
2002-11-08 00:02:15 -08:00
|
|
|
int ret;
|
2005-03-20 07:57:55 -08:00
|
|
|
RGBA_Font_Int *fi;
|
2005-05-21 19:49:48 -07:00
|
|
|
|
2010-02-03 03:18:00 -08:00
|
|
|
// evas_common_font_size_use(fn);
|
2005-03-20 07:57:55 -08:00
|
|
|
fi = fn->fonts->data;
|
2010-02-03 03:18:00 -08:00
|
|
|
if (fi->src->current_size != fi->size)
|
|
|
|
{
|
2010-07-20 05:09:46 -07:00
|
|
|
FTLOCK();
|
2010-02-03 03:18:00 -08:00
|
|
|
FT_Activate_Size(fi->ft.size);
|
2010-07-20 05:09:46 -07:00
|
|
|
FTUNLOCK();
|
2010-02-03 03:18:00 -08:00
|
|
|
fi->src->current_size = fi->size;
|
|
|
|
}
|
2005-03-20 07:57:55 -08:00
|
|
|
val = -(int)fi->src->ft.face->bbox.yMin;
|
2006-03-19 02:50:33 -08:00
|
|
|
if (fi->src->ft.face->units_per_EM == 0)
|
2009-04-23 21:35:52 -07:00
|
|
|
return val;
|
2005-05-21 19:49:48 -07:00
|
|
|
dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
|
2005-03-20 07:57:55 -08:00
|
|
|
ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
|
2002-11-08 00:02:15 -08:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2006-09-06 00:33:40 -07:00
|
|
|
EAPI int
|
2002-11-13 21:38:10 -08:00
|
|
|
evas_common_font_get_line_advance(RGBA_Font *fn)
|
2002-11-08 00:02:15 -08:00
|
|
|
{
|
2010-08-16 03:46:56 -07:00
|
|
|
int val;
|
2005-03-20 07:57:55 -08:00
|
|
|
RGBA_Font_Int *fi;
|
2005-05-21 19:49:48 -07:00
|
|
|
|
2010-02-03 03:18:00 -08:00
|
|
|
// evas_common_font_size_use(fn);
|
2005-03-20 07:57:55 -08:00
|
|
|
fi = fn->fonts->data;
|
2010-02-03 03:18:00 -08:00
|
|
|
if (fi->src->current_size != fi->size)
|
|
|
|
{
|
2010-07-20 05:09:46 -07:00
|
|
|
FTLOCK();
|
2010-02-03 03:18:00 -08:00
|
|
|
FT_Activate_Size(fi->ft.size);
|
2010-07-20 05:09:46 -07:00
|
|
|
FTUNLOCK();
|
2010-02-03 03:18:00 -08:00
|
|
|
fi->src->current_size = fi->size;
|
|
|
|
}
|
2005-03-20 07:57:55 -08:00
|
|
|
val = (int)fi->src->ft.face->size->metrics.height;
|
2006-03-19 02:50:33 -08:00
|
|
|
if (fi->src->ft.face->units_per_EM == 0)
|
2009-04-23 21:35:52 -07:00
|
|
|
return val;
|
2010-05-01 07:08:14 -07:00
|
|
|
return val >> 6;
|
|
|
|
// dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
|
|
|
|
// ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
|
|
|
|
// return ret;
|
2002-11-08 00:02:15 -08:00
|
|
|
}
|
|
|
|
|