added in loading froms from memory buffers at the engine level, and now an

api to set a font "source" (blank is normal filing system) but the source can
be a device or file etc. in this case it currently supports eet files as the
source and then the font name is used as a key in th eet file as to where to
find the font - edb support would be trivial to add. :) if the font is not
found in the "source" it falls back to the font path etc.


SVN revision: 8625
This commit is contained in:
Carsten Haitzler 2004-01-23 02:14:45 +00:00
parent a9cfdc0688
commit 8523421b7c
19 changed files with 458 additions and 92 deletions

View File

@ -95,7 +95,7 @@ suggested configure options for evas for a P2/AMD/P3/P4 desktop X display:
make CFLAGS="-O9 -mpentiumpro -march=pentiumpro -mcpu=pentiumpro"
for those that want eet and edb image loading ability:
for those that want eet and edb image loading ability and eet font loading:
./configure \
--enable-software-x11 \
@ -103,6 +103,7 @@ for those that want eet and edb image loading ability:
--enable-image-loader-jpeg \
--enable-image-loader-eet \
--enable-image-loader-edb \
--enable-font-loader-eet \
--enable-cpu-p2-only \
--enable-cpu-mmx \
--enable-cpu-sse \

View File

@ -9,6 +9,7 @@ rm config.cache
--enable-image-loader-jpeg \
--enable-image-loader-eet \
--enable-image-loader-edb \
--enable-font-loader-eet \
--enable-cpu-mmx \
--enable-cpu-sse \
--enable-cpu-c \

View File

@ -405,6 +405,34 @@ if test "x$have_jpeg" = "xyes"; then
)
fi
have_eet_fonts="";
AC_MSG_CHECKING(whether to enable eet font loader)
AC_ARG_ENABLE(font-loader-eet,
[ --enable-font-loader-eet enable eet font loader], [
if [ test "$enableval" = "yes" ]; then
AC_MSG_RESULT(yes)
have_eet_fonts="yes"
else
AC_MSG_RESULT(no)
fi
], [
AC_MSG_RESULT(yes)
have_eet_fonts="yes"
]
)
if test "x$have_eet_fonts" = "xyes"; then
AC_CHECK_LIB(eet, eet_open,
[
AC_DEFINE(BUILD_FONT_LOADER_EET, 1, [EET Font Loader Support])
eet_cflags=`eet-config --cflags`
eet_libs=`eet-config --libs`
]
)
fi
have_eet="";
AC_MSG_CHECKING(whether to enable eet image loader)

View File

@ -248,7 +248,8 @@ Suggested configure options for evas for a P2/AMD/P3/P4 desktop X display:
make CFLAGS="-O9 -mpentiumpro -march=pentiumpro -mcpu=pentiumpro"
@endverbatim
For those that want eet and edb image loading ability:
For those that want eet and edb image loading ability and eet font loading
ability:
@verbatim
./configure \
@ -257,6 +258,7 @@ For those that want eet and edb image loading ability:
--enable-image-loader-jpeg \
--enable-image-loader-eet \
--enable-image-loader-edb \
--enable-font-loader-eet \
--enable-cpu-p2-only \
--enable-cpu-mmx \
--enable-cpu-sse \

View File

@ -359,6 +359,8 @@ extern "C" {
int evas_image_cache_get (Evas *e);
Evas_Object *evas_object_text_add (Evas *e);
void evas_object_text_font_source_set (Evas_Object *obj, const char *font);
const char *evas_object_text_font_source_get (Evas_Object *obj);
void evas_object_text_font_set (Evas_Object *obj, const char *font, Evas_Font_Size size);
void evas_object_text_font_get (Evas_Object *obj, char **font, Evas_Font_Size *size);
void evas_object_text_text_set (Evas_Object *obj, const char *text);

View File

@ -1,6 +1,9 @@
#include "evas_common.h"
#include "evas_private.h"
#include "Evas.h"
#ifdef BUILD_FONT_LOADER_EET
#include <Eet.h>
#endif
/* private magic number for text objects */
static const char o_type[] = "text";
@ -15,6 +18,7 @@ struct _Evas_Object_Text
struct {
char *text;
char *font;
char *source;
Evas_Font_Size size;
} cur, prev;
char changed : 1;
@ -500,6 +504,53 @@ evas_object_text_add(Evas *e)
return obj;
}
/**
* To be documented.
*
* FIXME: To be fixed.
*
*/
void
evas_object_text_font_source_set(Evas_Object *obj, const char *font_source)
{
Evas_Object_Text *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return;
MAGIC_CHECK_END();
o = (Evas_Object_Text *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
return;
MAGIC_CHECK_END();
if ((o->cur.source) && (font_source) &&
(!strcmp(o->cur.source, font_source)))
return;
if (o->cur.source) free(o->cur.source);
if (font_source) o->cur.source = strdup(font_source);
else o->cur.source = NULL;
}
/**
* To be documented.
*
* FIXME: To be fixed.
*
*/
const char *
evas_object_text_font_source_get(Evas_Object *obj)
{
Evas_Object_Text *o;
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
return NULL;
MAGIC_CHECK_END();
o = (Evas_Object_Text *)(obj->object_data);
MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT);
return NULL;
MAGIC_CHECK_END();
return o->cur.source;
}
/**
* To be documented.
*
@ -542,18 +593,61 @@ evas_object_text_font_set(Evas_Object *obj, const char *font, Evas_Font_Size siz
{
Evas_List *l;
for (l = obj->layer->evas->font_path; l; l = l->next)
#ifdef BUILD_FONT_LOADER_EET
if (o->cur.source)
{
char *f_file;
f_file = object_text_font_cache_find(l->data, (char *)font);
if (f_file)
Eet_File *ef;
char *fake_name;
fake_name = evas_file_path_join(o->cur.source, font);
if (fake_name)
{
o->engine_data = obj->layer->evas->engine.func->font_load(obj->layer->evas->engine.data.output,
f_file, size);
if (o->engine_data) break;
o->engine_data =
obj->layer->evas->engine.func->font_load
(obj->layer->evas->engine.data.output, fake_name,
size);
if (!o->engine_data)
{
/* read original!!! */
ef = eet_open(o->cur.source, EET_FILE_MODE_READ);
if (ef)
{
void *fdata;
int fsize = 0;
fdata = eet_read(ef, font, &fsize);
if ((fdata) && (fsize > 0))
{
o->engine_data =
obj->layer->evas->engine.func->font_memory_load
(obj->layer->evas->engine.data.output,
fake_name, size, fdata, fsize);
free(fdata);
}
eet_close(ef);
}
}
free(fake_name);
}
}
if (!o->engine_data)
{
#endif
for (l = obj->layer->evas->font_path; l; l = l->next)
{
char *f_file;
f_file = object_text_font_cache_find(l->data, (char *)font);
if (f_file)
{
o->engine_data = obj->layer->evas->engine.func->font_load(obj->layer->evas->engine.data.output,
f_file, size);
if (o->engine_data) break;
}
}
#ifdef BUILD_FONT_LOADER_EET
}
#endif
}
if (o->cur.font) free(o->cur.font);
if (font) o->cur.font = strdup(font);
@ -1206,6 +1300,7 @@ evas_object_text_free(Evas_Object *obj)
/* free obj */
if (o->cur.text) free(o->cur.text);
if (o->cur.font) free(o->cur.font);
if (o->cur.source) free(o->cur.source);
if (o->engine_data)
obj->layer->evas->engine.func->font_free(obj->layer->evas->engine.data.output,
o->engine_data);

View File

@ -69,6 +69,7 @@ static void evas_engine_buffer_image_cache_flush(void *data);
static void evas_engine_buffer_image_cache_set(void *data, int bytes);
static int evas_engine_buffer_image_cache_get(void *data);
static void *evas_engine_buffer_font_load(void *data, char *name, int size);
static void *evas_engine_buffer_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size);
static void evas_engine_buffer_font_free(void *data, void *font);
static int evas_engine_buffer_font_ascent_get(void *data, void *font);
static int evas_engine_buffer_font_descent_get(void *data, void *font);
@ -154,6 +155,7 @@ Evas_Func evas_engine_buffer_func =
evas_engine_buffer_image_cache_get,
/* font draw functions */
evas_engine_buffer_font_load,
evas_engine_buffer_font_memory_load,
evas_engine_buffer_font_free,
evas_engine_buffer_font_ascent_get,
evas_engine_buffer_font_descent_get,
@ -925,6 +927,15 @@ evas_engine_buffer_font_load(void *data, char *name, int size)
return evas_common_font_load(name, size);
}
static void *
evas_engine_buffer_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size)
{
Render_Engine *re;
re = (Render_Engine *)data;
return evas_common_font_memory_load(name, size, fdata, fdata_size);
}
static void
evas_engine_buffer_font_free(void *data, void *font)
{

View File

@ -17,14 +17,14 @@ evas_common_font_cache_glyph_get(RGBA_Font *fn, FT_UInt index)
fg = evas_hash_find(fn->glyphs, key);
if (fg) return fg;
error = FT_Load_Glyph(fn->ft.face, index, FT_LOAD_NO_BITMAP);
error = FT_Load_Glyph(fn->src->ft.face, index, FT_LOAD_NO_BITMAP);
if (error) return NULL;
fg = malloc(sizeof(struct _RGBA_Font_Glyph));
if (!fg) return NULL;
memset(fg, 0, (sizeof(struct _RGBA_Font_Glyph)));
error = FT_Get_Glyph(fn->ft.face->glyph, &(fg->glyph));
error = FT_Get_Glyph(fn->src->ft.face->glyph, &(fg->glyph));
if (error)
{
free(fg);
@ -90,7 +90,8 @@ evas_common_font_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int
pen_x = x << 8;
pen_y = y << 8;
use_kerning = FT_HAS_KERNING(fn->ft.face);
evas_common_font_size_use(fn);
use_kerning = FT_HAS_KERNING(fn->src->ft.face);
prev_index = 0;
func = evas_common_draw_func_blend_alpha_get(dst);
for (c = 0, chr = 0; text[chr];)
@ -102,12 +103,12 @@ evas_common_font_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int
gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr);
if (gl == 0) break;
index = FT_Get_Char_Index(fn->ft.face, gl);
index = FT_Get_Char_Index(fn->src->ft.face, gl);
if ((use_kerning) && (prev_index) && (index))
{
FT_Vector delta;
FT_Get_Kerning(fn->ft.face, prev_index, index,
FT_Get_Kerning(fn->src->ft.face, prev_index, index,
ft_kerning_default, &delta);
pen_x += delta.x << 2;
}

View File

@ -4,94 +4,236 @@ extern FT_Library evas_ft_lib;
static int font_cache_usage = 0;
static int font_cache = 0;
static Evas_Object_List * fonts_src = NULL;
static Evas_Object_List * fonts = NULL;
static int font_modify_cache_cb(Evas_Hash *hash, const char *key, void *data, void *fdata);
static int font_flush_free_glyph_cb(Evas_Hash *hash, const char *key, void *data, void *fdata);
/* FIXME: */
/* we should share face handles and have different ft sizes from the same */
/* face (if applicable) */
RGBA_Font *
evas_common_font_load(const char *name, int size)
RGBA_Font_Source *
evas_common_font_source_memory_load(const char *name, const void *data, int data_size)
{
int error;
RGBA_Font_Source *fs;
fs = malloc(sizeof(RGBA_Font_Source));
if (!fs) return NULL;
fs->name = strdup(name);
fs->file = NULL;
fs->data = malloc(data_size);
if (!fs->data)
{
if (fs->name) free(fs->name);
free(fs);
return NULL;
}
memcpy(fs->data, data, data_size);
fs->data_size = data_size;
error = FT_New_Memory_Face(evas_ft_lib, fs->data, fs->data_size, 0, &(fs->ft.face));
if (error)
{
if (fs->name) free(fs->name);
if (fs->data) free(fs->data);
free(fs);
return NULL;
}
fs->references = 1;
fonts_src = evas_object_list_prepend(fonts_src, fs);
return fs;
}
RGBA_Font_Source *
evas_common_font_source_load(const char *name)
{
int error;
RGBA_Font_Source *fs;
fs = malloc(sizeof(RGBA_Font_Source));
if (!fs) return NULL;
fs->name = strdup(name);
fs->file = strdup(name);
error = FT_New_Face(evas_ft_lib, fs->file, 0, &(fs->ft.face));
if (error)
{
if (fs->name) free(fs->name);
if (fs->file) free(fs->file);
free(fs);
return NULL;
}
fs->references = 1;
fonts_src = evas_object_list_prepend(fonts_src, fs);
return fs;
}
RGBA_Font_Source *
evas_common_font_source_find(const char *name)
{
Evas_Object_List *l;
if (!name) return NULL;
for (l = fonts_src; l; l = l->next)
{
RGBA_Font_Source *fs;
fs = (RGBA_Font_Source *)l;
if ((fs->name) && (!strcmp(name, fs->name)))
{
fs->references++;
fonts_src = evas_object_list_remove(fonts_src, fs);
fonts_src = evas_object_list_prepend(fonts_src, fs);
return fs;
}
}
return NULL;
}
void
evas_common_font_source_free(RGBA_Font_Source *fs)
{
fs->references--;
if (fs->references > 0) return;
fonts_src = evas_object_list_remove(fonts_src, fs);
if (fs->name) free(fs->name);
if (fs->file) free(fs->file);
if (fs->data) free(fs->data);
FT_Done_Face(fs->ft.face);
free(fs);
}
void
evas_common_font_size_use(RGBA_Font *fn)
{
if (fn->src->current_size == fn->real_size) return;
FT_Set_Char_Size(fn->src->ft.face, 0, fn->real_size, 96, 96);
fn->src->current_size = fn->real_size;
}
RGBA_Font *
evas_common_font_memory_load(const char *name, int size, const void *data, int data_size)
{
RGBA_Font *fn;
char *file;
fn = evas_common_font_find(name, size);
if (fn) return fn;
fn = malloc(sizeof(RGBA_Font));
file = (char *)name;
if (!fn) return NULL;
error = FT_New_Face(evas_ft_lib, file, 0, &(fn->ft.face));
if (error)
fn->src = evas_common_font_source_find(name);
if (!fn->src) fn->src = evas_common_font_source_memory_load(name, data, data_size);
if (!fn->src)
{
free(fn);
return NULL;
}
error = FT_Set_Char_Size(fn->ft.face, 0, (size * 64), 96, 96);
fn->size = size;
return evas_common_font_load_init(fn);
}
RGBA_Font *
evas_common_font_load(const char *name, int size)
{
RGBA_Font *fn;
fn = evas_common_font_find(name, size);
if (fn) return fn;
fn = malloc(sizeof(RGBA_Font));
if (!fn) return NULL;
fn->src = evas_common_font_source_find(name);
if (!fn->src) fn->src = evas_common_font_source_load(name);
if (!fn->src)
{
free(fn);
return NULL;
}
fn->size = size;
return evas_common_font_load_init(fn);
}
RGBA_Font *
evas_common_font_load_init(RGBA_Font *fn)
{
int error;
fn->real_size = fn->size * 64;
error = FT_Set_Char_Size(fn->src->ft.face, 0, (fn->size * 64), 96, 96);
if (error)
error = FT_Set_Pixel_Sizes(fn->ft.face, 0, size);
{
error = FT_Set_Pixel_Sizes(fn->src->ft.face, 0, fn->size);
fn->real_size = fn->size;
}
if (error)
{
int i;
int chosen_size = 0;
int chosen_width = 0;
for (i = 0; i < fn->ft.face->num_fixed_sizes; i++)
for (i = 0; i < fn->src->ft.face->num_fixed_sizes; i++)
{
int s;
int d, cd;
s = fn->ft.face->available_sizes[i].height;
cd = chosen_size - size;
s = fn->src->ft.face->available_sizes[i].height;
cd = chosen_size - fn->size;
if (cd < 0) cd = -cd;
d = s - size;
d = s - fn->size;
if (d < 0) d = -d;
if (d < cd)
{
chosen_width = fn->ft.face->available_sizes[i].width;
chosen_width = fn->src->ft.face->available_sizes[i].width;
chosen_size = s;
}
if (d == 0) break;
}
error = FT_Set_Pixel_Sizes(fn->ft.face, chosen_width, chosen_size);
error = FT_Set_Pixel_Sizes(fn->src->ft.face, chosen_width, chosen_size);
if (error)
{
/* couldn't choose the size anyway... what now? */
}
fn->real_size = chosen_size;
}
fn->src->current_size = fn->real_size;
#if 0 /* debugging to look at charmaps in a ttf */
printf("%i\n", fn->ft.face->num_charmaps);
printf("%i\n", fn->src->ft.face->num_charmaps);
{
int i;
for (i = 0; i < fn->ft.face->num_charmaps; i++)
for (i = 0; i < fn->src->ft.face->num_charmaps; i++)
{
printf("%i: %x, %c\n",
i, fn->ft.face->charmaps[i]->encoding,
fn->ft.face->charmaps[i]->encoding);
i, fn->src->ft.face->charmaps[i]->encoding,
fn->src->ft.face->charmaps[i]->encoding);
}
}
#endif
error = FT_Select_Charmap(fn->ft.face, ft_encoding_unicode);
error = FT_Select_Charmap(fn->src->ft.face, ft_encoding_unicode);
if (error)
{
/* disable this for now...
error = FT_Select_Charmap(fn->ft.face, ft_encoding_latin_2);
error = FT_Select_Charmap(fn->src->ft.face, ft_encoding_latin_2);
if (error)
{
error = FT_Select_Charmap(fn->ft.face, ft_encoding_sjis);
error = FT_Select_Charmap(fn->src->ft.face, ft_encoding_sjis);
if (error)
{
error = FT_Select_Charmap(fn->ft.face, ft_encoding_gb2312);
error = FT_Select_Charmap(fn->src->ft.face, ft_encoding_gb2312);
if (error)
{
error = FT_Select_Charmap(fn->ft.face, ft_encoding_big5);
error = FT_Select_Charmap(fn->src->ft.face, ft_encoding_big5);
if (error)
{
}
@ -101,16 +243,9 @@ evas_common_font_load(const char *name, int size)
*/
}
fn->file = strdup(file);
fn->name = strdup(file);
fn->size = size;
fn->glyphs = NULL;
fn->usage = 0;
fn->references = 1;
fonts = evas_object_list_prepend(fonts, fn);
return fn;
}
@ -145,13 +280,11 @@ font_modify_cache_cb(Evas_Hash *hash, const char *key, void *data, void *fdata)
void
evas_common_font_modify_cache_by(RGBA_Font *fn, int dir)
{
int sz_name = 0, sz_file = 0, sz_hash = 0;
int sz_hash = 0;
if (fn->name) sz_name = strlen(fn->name);
if (fn->file) sz_file = strlen(fn->file);
if (fn->glyphs) sz_hash = sizeof(Evas_Hash);
evas_hash_foreach(fn->glyphs, font_modify_cache_cb, &dir);
font_cache_usage += dir * (sizeof(RGBA_Font) + sz_name + sz_file + sz_hash +
font_cache_usage += dir * (sizeof(RGBA_Font) + sz_hash +
sizeof(FT_FaceRec) + 16384); /* fudge values */
}
@ -212,9 +345,8 @@ evas_common_font_flush_last(void)
evas_hash_foreach(fn->glyphs, font_flush_free_glyph_cb, NULL);
evas_hash_free(fn->glyphs);
if (fn->file) free(fn->file);
if (fn->name) free(fn->name);
FT_Done_Face(fn->ft.face);
evas_common_font_source_free(fn->src);
free(fn);
}
@ -228,7 +360,7 @@ evas_common_font_find(const char *name, int size)
RGBA_Font *fn;
fn = (RGBA_Font *)l;
if ((fn->size == size) && (!strcmp(name, fn->name)))
if ((fn->size == size) && (!strcmp(name, fn->src->name)))
{
if (fn->references == 0) evas_common_font_modify_cache_by(fn, -1);
fn->references++;

View File

@ -34,9 +34,9 @@ evas_common_font_ascent_get(RGBA_Font *fn)
int val;
int ret;
val = (int)fn->ft.face->ascender;
fn->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */
ret = (val * fn->ft.face->size->metrics.y_scale) / (fn->ft.face->units_per_EM * fn->ft.face->units_per_EM);
val = (int)fn->src->ft.face->ascender;
fn->src->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */
ret = (val * fn->src->ft.face->size->metrics.y_scale) / (fn->src->ft.face->units_per_EM * fn->src->ft.face->units_per_EM);
return ret;
}
@ -46,9 +46,10 @@ evas_common_font_descent_get(RGBA_Font *fn)
int val;
int ret;
val = -(int)fn->ft.face->descender;
fn->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */
ret = (val * fn->ft.face->size->metrics.y_scale) / (fn->ft.face->units_per_EM * fn->ft.face->units_per_EM);
evas_common_font_size_use(fn);
val = -(int)fn->src->ft.face->descender;
fn->src->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */
ret = (val * fn->src->ft.face->size->metrics.y_scale) / (fn->src->ft.face->units_per_EM * fn->src->ft.face->units_per_EM);
return ret;
}
@ -58,9 +59,10 @@ evas_common_font_max_ascent_get(RGBA_Font *fn)
int val;
int ret;
val = (int)fn->ft.face->bbox.yMax;
fn->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */
ret = (val * fn->ft.face->size->metrics.y_scale) / (fn->ft.face->units_per_EM * fn->ft.face->units_per_EM);
evas_common_font_size_use(fn);
val = (int)fn->src->ft.face->bbox.yMax;
fn->src->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */
ret = (val * fn->src->ft.face->size->metrics.y_scale) / (fn->src->ft.face->units_per_EM * fn->src->ft.face->units_per_EM);
return ret;
}
@ -70,9 +72,10 @@ evas_common_font_max_descent_get(RGBA_Font *fn)
int val;
int ret;
val = -(int)fn->ft.face->bbox.yMin;
fn->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */
ret = (val * fn->ft.face->size->metrics.y_scale) / (fn->ft.face->units_per_EM * fn->ft.face->units_per_EM);
evas_common_font_size_use(fn);
val = -(int)fn->src->ft.face->bbox.yMin;
fn->src->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */
ret = (val * fn->src->ft.face->size->metrics.y_scale) / (fn->src->ft.face->units_per_EM * fn->src->ft.face->units_per_EM);
return ret;
}
@ -82,9 +85,10 @@ evas_common_font_get_line_advance(RGBA_Font *fn)
int val;
int ret;
val = (int)fn->ft.face->height;
fn->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */
ret = (val * fn->ft.face->size->metrics.y_scale) / (fn->ft.face->units_per_EM * fn->ft.face->units_per_EM);
evas_common_font_size_use(fn);
val = (int)fn->src->ft.face->height;
fn->src->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */
ret = (val * fn->src->ft.face->size->metrics.y_scale) / (fn->src->ft.face->units_per_EM * fn->src->ft.face->units_per_EM);
return ret;
}

View File

@ -14,7 +14,8 @@ evas_common_font_query_size(RGBA_Font *fn, const char *text, int *w, int *h)
end_x = 0;
pen_x = 0;
pen_y = 0;
use_kerning = FT_HAS_KERNING(fn->ft.face);
evas_common_font_size_use(fn);
use_kerning = FT_HAS_KERNING(fn->src->ft.face);
prev_index = 0;
for (chr = 0; text[chr];)
{
@ -25,12 +26,12 @@ evas_common_font_query_size(RGBA_Font *fn, const char *text, int *w, int *h)
gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr);
if (gl == 0) break;
index = FT_Get_Char_Index(fn->ft.face, gl);
index = FT_Get_Char_Index(fn->src->ft.face, gl);
if ((use_kerning) && (prev_index) && (index))
{
FT_Vector delta;
FT_Get_Kerning(fn->ft.face, prev_index, index,
FT_Get_Kerning(fn->src->ft.face, prev_index, index,
ft_kerning_default, &delta);
pen_x += delta.x << 2;
}
@ -64,7 +65,8 @@ evas_common_font_query_inset(RGBA_Font *fn, const char *text)
if (!text[0]) return 0;
gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr);
if (gl == 0) return 0;
index = FT_Get_Char_Index(fn->ft.face, gl);
evas_common_font_size_use(fn);
index = FT_Get_Char_Index(fn->src->ft.face, gl);
fg = evas_common_font_cache_glyph_get(fn, index);
if (!fg) return 0;
return fg->glyph_out->left;
@ -83,7 +85,8 @@ evas_common_font_query_advance(RGBA_Font *fn, const char *text, int *h_adv, int
start_x = 0;
pen_x = 0;
pen_y = 0;
use_kerning = FT_HAS_KERNING(fn->ft.face);
evas_common_font_size_use(fn);
use_kerning = FT_HAS_KERNING(fn->src->ft.face);
prev_index = 0;
for (chr = 0; text[chr];)
{
@ -94,12 +97,12 @@ evas_common_font_query_advance(RGBA_Font *fn, const char *text, int *h_adv, int
gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr);
if (gl == 0) break;
index = FT_Get_Char_Index(fn->ft.face, gl);
index = FT_Get_Char_Index(fn->src->ft.face, gl);
if ((use_kerning) && (prev_index) && (index))
{
FT_Vector delta;
FT_Get_Kerning(fn->ft.face, prev_index, index,
FT_Get_Kerning(fn->src->ft.face, prev_index, index,
ft_kerning_default, &delta);
pen_x += delta.x << 2;
}
@ -130,7 +133,8 @@ evas_common_font_query_char_coords(RGBA_Font *fn, const char *text, int pos, int
pen_x = 0;
pen_y = 0;
use_kerning = FT_HAS_KERNING(fn->ft.face);
evas_common_font_size_use(fn);
use_kerning = FT_HAS_KERNING(fn->src->ft.face);
prev_index = 0;
prev_chr_end = 0;
asc = evas_common_font_max_ascent_get(fn);
@ -147,11 +151,11 @@ evas_common_font_query_char_coords(RGBA_Font *fn, const char *text, int pos, int
pchr = chr;
gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr);
if (gl == 0) break;
index = FT_Get_Char_Index(fn->ft.face, gl);
index = FT_Get_Char_Index(fn->src->ft.face, gl);
kern = 0;
if ((use_kerning) && (prev_index) && (index))
{
FT_Get_Kerning(fn->ft.face, prev_index, index,
FT_Get_Kerning(fn->src->ft.face, prev_index, index,
ft_kerning_default, &delta);
kern = delta.x << 2;
pen_x += kern;
@ -203,7 +207,8 @@ evas_common_font_query_text_at_pos(RGBA_Font *fn, const char *text, int x, int y
pen_x = 0;
pen_y = 0;
use_kerning = FT_HAS_KERNING(fn->ft.face);
evas_common_font_size_use(fn);
use_kerning = FT_HAS_KERNING(fn->src->ft.face);
prev_index = 0;
prev_chr_end = 0;
asc = evas_common_font_max_ascent_get(fn);
@ -220,11 +225,11 @@ evas_common_font_query_text_at_pos(RGBA_Font *fn, const char *text, int x, int y
pchr = chr;
gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr);
if (gl == 0) break;
index = FT_Get_Char_Index(fn->ft.face, gl);
index = FT_Get_Char_Index(fn->src->ft.face, gl);
kern = 0;
if ((use_kerning) && (prev_index) && (index))
{
FT_Get_Kerning(fn->ft.face, prev_index, index,
FT_Get_Kerning(fn->src->ft.face, prev_index, index,
ft_kerning_default, &delta);
kern = delta.x << 2;
pen_x += kern;

View File

@ -62,6 +62,7 @@ Evas_Func evas_engine_directfb_func = {
evas_engine_directfb_image_cache_get,
/* more to come */
evas_engine_directfb_font_load,
evas_engine_directfb_font_memory_load,
evas_engine_directfb_font_free,
evas_engine_directfb_font_ascent_get,
evas_engine_directfb_font_descent_get,
@ -759,6 +760,15 @@ evas_engine_directfb_font_load(void *data, char *name, int size)
return evas_common_font_load(name, size);
}
void *
evas_engine_directfb_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size)
{
Render_Engine *re;
re = (Render_Engine *) data;
return evas_common_font_memory_load(name, size, fdata, fdata_size);
}
void
evas_engine_directfb_font_free(void *data, void *font)
{

View File

@ -133,6 +133,11 @@ void evas_engine_directfb_gradient_draw(void *data,
double angle);
void *evas_engine_directfb_font_load(void *data, char *name,
int size);
void *evas_engine_directfb_font_memory_load(void *data,
char *name,
int size,
const void *fdata,
int fdata_size);
void evas_engine_directfb_font_free(void *data, void *font);
int evas_engine_directfb_font_ascent_get(void *data,
void *font);

View File

@ -57,6 +57,7 @@ static void evas_engine_fb_image_cache_flush(void *data);
static void evas_engine_fb_image_cache_set(void *data, int bytes);
static int evas_engine_fb_image_cache_get(void *data);
static void *evas_engine_fb_font_load(void *data, char *name, int size);
static void *evas_engine_fb_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size);
static void evas_engine_fb_font_free(void *data, void *font);
static int evas_engine_fb_font_ascent_get(void *data, void *font);
static int evas_engine_fb_font_descent_get(void *data, void *font);
@ -142,6 +143,7 @@ Evas_Func evas_engine_fb_func =
evas_engine_fb_image_cache_get,
/* font draw functions */
evas_engine_fb_font_load,
evas_engine_fb_font_memory_load,
evas_engine_fb_font_free,
evas_engine_fb_font_ascent_get,
evas_engine_fb_font_descent_get,
@ -844,6 +846,15 @@ evas_engine_fb_font_load(void *data, char *name, int size)
return evas_common_font_load(name, size);
}
static void *
evas_engine_fb_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size)
{
Render_Engine *re;
re = (Render_Engine *)data;
return evas_common_font_memory_load(name, size, fdata, fdata_size);
}
static void
evas_engine_fb_font_free(void *data, void *font)
{

View File

@ -58,6 +58,7 @@ static void evas_engine_gl_x11_image_cache_flush(void *data);
static void evas_engine_gl_x11_image_cache_set(void *data, int bytes);
static int evas_engine_gl_x11_image_cache_get(void *data);
static void *evas_engine_gl_x11_font_load(void *data, char *name, int size);
static void *evas_engine_gl_x11_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size);
static void evas_engine_gl_x11_font_free(void *data, void *font);
static int evas_engine_gl_x11_font_ascent_get(void *data, void *font);
static int evas_engine_gl_x11_font_descent_get(void *data, void *font);
@ -148,6 +149,7 @@ Evas_Func evas_engine_gl_x11_func =
evas_engine_gl_x11_image_cache_get,
/* font draw functions */
evas_engine_gl_x11_font_load,
evas_engine_gl_x11_font_memory_load,
evas_engine_gl_x11_font_free,
evas_engine_gl_x11_font_ascent_get,
evas_engine_gl_x11_font_descent_get,
@ -851,6 +853,15 @@ evas_engine_gl_x11_font_load(void *data, char *name, int size)
return evas_common_font_load(name, size);
}
static void *
evas_engine_gl_x11_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size)
{
Render_Engine *re;
re = (Render_Engine *)data;
return evas_common_font_memory_load(name, size, fdata, fdata_size);
}
static void
evas_engine_gl_x11_font_free(void *data, void *font)
{

View File

@ -57,6 +57,7 @@ static void evas_engine_software_qtopia_image_cache_flush(void *data);
static void evas_engine_software_qtopia_image_cache_set(void *data, int bytes);
static int evas_engine_software_qtopia_image_cache_get(void *data);
static void *evas_engine_software_qtopia_font_load(void *data, char *name, int size);
static void *evas_engine_software_qtopia_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size);
static void evas_engine_software_qtopia_font_free(void *data, void *font);
static int evas_engine_software_qtopia_font_ascent_get(void *data, void *font);
static int evas_engine_software_qtopia_font_descent_get(void *data, void *font);
@ -145,6 +146,7 @@ Evas_Func evas_engine_software_qtopia_func =
evas_engine_software_qtopia_image_cache_get,
/* font draw functions */
evas_engine_software_qtopia_font_load,
evas_engine_software_qtopia_font_memory_load,
evas_engine_software_qtopia_font_free,
evas_engine_software_qtopia_font_ascent_get,
evas_engine_software_qtopia_font_descent_get,
@ -867,6 +869,15 @@ evas_engine_software_qtopia_font_load(void *data, char *name, int size)
return evas_common_font_load(name, size);
}
static void *
evas_engine_software_qtopia_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size)
{
Render_Engine *re;
re = (Render_Engine *)data;
return evas_common_font_load(name, size, fdata, fdata_size);
}
static void
evas_engine_software_qtopia_font_free(void *data, void *font)
{

View File

@ -57,6 +57,7 @@ static void evas_engine_software_x11_image_cache_flush(void *data);
static void evas_engine_software_x11_image_cache_set(void *data, int bytes);
static int evas_engine_software_x11_image_cache_get(void *data);
static void *evas_engine_software_x11_font_load(void *data, char *name, int size);
static void *evas_engine_software_x11_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size);
static void evas_engine_software_x11_font_free(void *data, void *font);
static int evas_engine_software_x11_font_ascent_get(void *data, void *font);
static int evas_engine_software_x11_font_descent_get(void *data, void *font);
@ -157,6 +158,7 @@ Evas_Func evas_engine_software_x11_func =
evas_engine_software_x11_image_cache_get,
/* font draw functions */
evas_engine_software_x11_font_load,
evas_engine_software_x11_font_memory_load,
evas_engine_software_x11_font_free,
evas_engine_software_x11_font_ascent_get,
evas_engine_software_x11_font_descent_get,
@ -911,6 +913,15 @@ evas_engine_software_x11_font_load(void *data, char *name, int size)
return evas_common_font_load(name, size);
}
static void *
evas_engine_software_x11_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size)
{
Render_Engine *re;
re = (Render_Engine *)data;
return evas_common_font_memory_load(name, size, fdata, fdata_size);
}
static void
evas_engine_software_x11_font_free(void *data, void *font)
{

View File

@ -165,6 +165,7 @@ typedef struct _RGBA_Gradient RGBA_Gradient;
typedef struct _RGBA_Gradient_Color RGBA_Gradient_Color;
typedef struct _RGBA_Polygon_Point RGBA_Polygon_Point;
typedef struct _RGBA_Font RGBA_Font;
typedef struct _RGBA_Font_Source RGBA_Font_Source;
typedef struct _RGBA_Font_Glyph RGBA_Font_Glyph;
typedef struct _Cutout_Rect Cutout_Rect;
@ -332,13 +333,11 @@ struct _RGBA_Polygon_Point
struct _RGBA_Font
{
Evas_Object_List _list_data;
char *name;
char *file;
int size;
struct {
FT_Face face;
} ft;
RGBA_Font_Source *src;
int size;
int real_size;
Evas_Hash *glyphs;
@ -347,6 +346,25 @@ struct _RGBA_Font
int references;
};
struct _RGBA_Font_Source
{
Evas_Object_List _list_data;
char *name;
char *file;
void *data;
int data_size;
int current_size;
struct {
FT_Face face;
} ft;
int references;
};
struct _RGBA_Font_Glyph
{
FT_Glyph glyph;
@ -805,8 +823,14 @@ void evas_common_blit_rectangle (RGBA_Image *src, RGBA_Image *
/****/
void evas_common_font_init (void);
void evas_common_font_shutdown (void);
RGBA_Font_Source *evas_common_font_source_memory_load(const char *name, const void *data, int data_size);
RGBA_Font_Source *evas_common_font_source_load (const char *name);
RGBA_Font_Source *evas_common_font_source_find (const char *name);
void evas_common_font_source_free (RGBA_Font_Source *fs);
void evas_common_font_size_use (RGBA_Font *fn);
RGBA_Font *evas_common_font_memory_load (const char *name, int size, const void *data, int data_size);
RGBA_Font *evas_common_font_load (const char *name, int size);
RGBA_Font *evas_common_font_load_init (RGBA_Font *fn);
void evas_common_font_free (RGBA_Font *fn);
void evas_common_font_modify_cache_by (RGBA_Font *fn, int dir);
int evas_common_font_cache_get (void);

View File

@ -524,6 +524,7 @@ struct _Evas_Func
int (*image_cache_get) (void *data);
void *(*font_load) (void *data, char *name, int size);
void *(*font_memory_load) (void *data, char *name, int size, const void *fdata, int fdata_size);
void (*font_free) (void *data, void *font);
int (*font_ascent_get) (void *data, void *font);
int (*font_descent_get) (void *data, void *font);