Sorry, but I'm backing this out. After having spent about half a day trying to fix it I give up.
There is a problem with font sizing, at least for certain fonts, e.g. /usr/share/e16/E-docs/rothwell.ttf, where the font size seems to get scaled down somewhere along the way. I got as far as to find out that if I remove the call to FT_Set_Char_Size in imlib_font_find_face_in_fontset, things seem to work, with one font in a font set, anyway. I have no idea what I'm doing, so I think the author should have a look at it. Was this benchmarked in any way? I have a suspicion that imlib_font_find_face_in_fontset is called all over the place and does somewhat more work than the corresponding old code. Also, I find the logic in imlib_font_find_face_in_fontset "somewhat" unclear: imlib_font_find_face_in_fontset() { ... repeat_upto_invalid: while(something1) { maybe return; } if (something2) goto repeat_upto_invalid; return imlib_font_find_face_in_fontset() <-- recursive!!! } If this patch goes in again I strongly suggest to first 1) Make it work. 2) Clean up the code logic so it's possible to actually read what is going on. 3) Fix up indentation so that the code can actually be read. 4) Fix up indentation so it's consistent with the rest of imlib2. Furthermore I suggest to 5) Many places, if not all - Not change fn to fn_list. This patch makes ImlibFont a list by nature, and changing the parameter name most places just adds noise making it harder to evaluate the changes. Finally I suggest to 6) Commit unrelated changes separately. The polygon.c change is (I guess) about removing some (probably bogus?) warnings. 7) Not make useless changes in unrelated code. In color_helpers.c math.h is already included by color_helpers.h. raster - You are most likely busy elsewhere. If you like I can handle things if winfred(?) wants to have another go at it. /Kim Enlightenment CVS wrote: > Enlightenment CVS committal > > Author : raster > Project : e17 > Module : libs/imlib2 > > Dir : e17/libs/imlib2/src/lib > > > Modified Files: > api.c color_helpers.c font.h font_draw.c font_load.c > font_main.c font_query.c polygon.c > > > Log Message: > > > fontset patch from winfred > > =================================================================== > RCS file: /cvs/e/e17/libs/imlib2/src/lib/api.c,v > retrieving revision 1.11 > retrieving revision 1.12 > diff -u -3 -r1.11 -r1.12 > --- api.c 15 Feb 2007 04:15:03 -0000 1.11 > +++ api.c 6 May 2007 13:54:43 -0000 1.12 > @@ -3078,16 +3078,21 @@ > * @return NULL if no font found. > * > * Loads a truetype font from the first directory in the font path that > - * contains that font. The font name @p font_name format is > "font_name/size". For > - * example. If there is a font file called blum.ttf somewhere in the > + * contains that font. The font name @p font_name format is "font_name/size" > + * or a comma separated list of "font_name/size" elements. > + * For example: if there is a font file called blum.ttf somewhere in the > * font path you might use "blum/20" to load a 20 pixel sized font of > - * blum. If the font cannot be found NULL is returned. > + * blum; or "blum/20, vera/20, mono/20" to load one or all fonts > + * of the comma separated list. If the font cannot be found NULL is > returned. > * > **/ > EAPI Imlib_Font > imlib_load_font(const char *font_name) > { > - return imlib_font_load_joined(font_name); > + if(strchr(font_name, ',') != NULL) > + return imlib_font_load_fontset(font_name); > + else > + return imlib_font_load_joined(font_name); > } > > /** > @@ -3096,11 +3101,20 @@ > EAPI void > imlib_free_font(void) > { > + ImlibFont *fn; > + > if (!ctx) > ctx = imlib_context_new(); > CHECK_PARAM_POINTER("imlib_free_font", "font", ctx->font); > - imlib_font_free(ctx->font); > - ctx->font = NULL; > + > + fn = (ImlibFont*)ctx->font; ctx->font = NULL; > + > + if(fn->next_in_set == NULL) > + { > + imlib_font_free(fn); > + return; > + } > + imlib_font_free_fontset(fn); > } > > /** > =================================================================== > RCS file: /cvs/e/e17/libs/imlib2/src/lib/color_helpers.c,v > retrieving revision 1.3 > retrieving revision 1.4 > diff -u -3 -r1.3 -r1.4 > --- color_helpers.c 23 Feb 2005 03:02:41 -0000 1.3 > +++ color_helpers.c 6 May 2007 13:54:43 -0000 1.4 > @@ -1,3 +1,4 @@ > +#include <math.h> > #include "color_helpers.h" > /* > * Color space conversion helper routines > =================================================================== > RCS file: /cvs/e/e17/libs/imlib2/src/lib/font.h,v > retrieving revision 1.1 > retrieving revision 1.2 > diff -u -3 -r1.1 -r1.2 > --- font.h 1 Nov 2004 09:45:31 -0000 1.1 > +++ font.h 6 May 2007 13:54:43 -0000 1.2 > @@ -50,6 +50,7 @@ > > int references; > > + struct _Imlib_Font *next_in_set; > }; > > struct _Imlib_Font_Glyph > @@ -83,6 +84,12 @@ > void imlib_font_modify_cache_by(ImlibFont * fn, int dir); > void imlib_font_flush_last(void); > ImlibFont *imlib_font_find(const char *name, int size); > +ImlibFont *imlib_font_load_fontset(const char *font_name); > +void imlib_font_free_fontset(ImlibFont *fn_list); > +ImlibFont *imlib_font_find_face_in_fontset(ImlibFont *fn, > + ImlibFont *fn_list, unsigned long uni_id, > + int encoding_id, int force_missing_glyph, > + FT_UInt *out_glyph_id, int *out_missing); > > void imlib_font_query_size(ImlibFont * fn, const char *text, > int *w, int *h); > =================================================================== > RCS file: /cvs/e/e17/libs/imlib2/src/lib/font_draw.c,v > retrieving revision 1.6 > retrieving revision 1.7 > diff -u -3 -r1.6 -r1.7 > --- font_draw.c 13 Nov 2006 11:20:00 -0000 1.6 > +++ font_draw.c 6 May 2007 13:54:43 -0000 1.7 > @@ -67,7 +67,7 @@ > } > > void > -imlib_render_str(ImlibImage * im, ImlibFont * fn, int drx, int dry, > +imlib_render_str(ImlibImage * im, ImlibFont *fn_list, int drx, int dry, > const char *text, DATA8 r, DATA8 g, DATA8 b, DATA8 a, > char dir, double angle, int *retw, int *reth, int blur, > int *nextx, int *nexty, ImlibOp op, int clx, int cly, > @@ -78,8 +78,9 @@ > DATA32 *data, col; > int nx, ny; > > - imlib_font_query_advance(fn, text, &w, NULL); > - h = imlib_font_max_ascent_get(fn) - imlib_font_max_descent_get(fn); > + imlib_font_query_advance(fn_list, text, &w, NULL); > + h = imlib_font_max_ascent_get(fn_list) > + - imlib_font_max_descent_get(fn_list); > > data = malloc(w * h * sizeof(DATA32)); > if (!data) > @@ -97,10 +98,10 @@ > /* TODO check for endianess */ > col = (a << 24) | (r << 16) | (g << 8) | b; > > - ascent = imlib_font_max_ascent_get(fn); > - > - imlib_font_draw(im2, col, fn, 0, ascent, text, &nx, &ny, 0, 0, w, h); > + ascent = imlib_font_max_ascent_get(fn_list); > > + imlib_font_draw(im2, col, fn_list, 0, ascent, text, &nx, &ny, clx, cly, > + clw, clh); > /* OK, now we have small ImlibImage with text rendered, > * have to blend it on im */ > > @@ -246,13 +247,13 @@ > } > > void > -imlib_font_draw(ImlibImage * dst, DATA32 col, ImlibFont * fn, int x, int y, > +imlib_font_draw(ImlibImage * dst, DATA32 col, ImlibFont *fn_list, int x, int > y, > const char *text, int *nextx, int *nexty, int clx, int cly, > int clw, int clh) > { > - int use_kerning; > + ImlibFont *fn; > int pen_x, pen_y; > - int chr; > + int chr, missing_glyph; > FT_UInt prev_index; > int ext_x, ext_y, ext_w, ext_h; > DATA32 *im; > @@ -304,8 +305,8 @@ > > pen_x = x << 8; > pen_y = y << 8; > - use_kerning = FT_HAS_KERNING(fn->ft.face); > - prev_index = 0; > + prev_index = 0; fn = NULL; missing_glyph = 1; > + > for (chr = 0; text[chr];) > { > FT_UInt index; > @@ -316,18 +317,24 @@ > gl = imlib_font_utf8_get_next((unsigned char *)text, &chr); > if (gl == 0) > break; > - index = FT_Get_Char_Index(fn->ft.face, gl); > - if ((use_kerning) && (prev_index) && (index)) > + if(missing_glyph) > + fn = fn_list; > + fn = > + imlib_font_find_face_in_fontset(fn, fn_list, gl, > + FT_ENCODING_UNICODE, 0, &index, &missing_glyph); > + > + if(FT_HAS_KERNING(fn->ft.face) && (prev_index) && (index)) > { > - FT_Vector delta; > + FT_Vector delta; > > - FT_Get_Kerning(fn->ft.face, prev_index, index, > ft_kerning_default, > - &delta); > - pen_x += delta.x << 2; > + FT_Get_Kerning(fn->ft.face, prev_index, index, > ft_kerning_default, > + &delta); > + pen_x += delta.x << 2; > } > + > fg = imlib_font_cache_glyph_get(fn, index); > - if (!fg) > - continue; > + if(!fg) > + continue; > > chr_x = (pen_x + (fg->glyph_out->left << 8)) >> 8; > chr_y = (pen_y + (fg->glyph_out->top << 8)) >> 8; > @@ -418,5 +425,5 @@ > if (nextx) > *nextx = (pen_x >> 8) - x; > if (nexty) > - *nexty = imlib_font_get_line_advance(fn); > + *nexty = imlib_font_get_line_advance(fn_list); > } > =================================================================== > RCS file: /cvs/e/e17/libs/imlib2/src/lib/font_load.c,v > retrieving revision 1.1 > retrieving revision 1.2 > diff -u -3 -r1.1 -r1.2 > --- font_load.c 1 Nov 2004 09:45:31 -0000 1.1 > +++ font_load.c 6 May 2007 13:54:43 -0000 1.2 > @@ -30,13 +30,13 @@ > > /* FIXME now! listdir() from evas_object_text.c */ > > -/* separate fontname and size, find font file, start imlib_font_load() then > */ > -ImlibFont * > -imlib_font_load_joined(const char *fontname) > +/* separate fontname and size, find font file > +*/ > +static char* > +imlib_font_find_file(const char *fontname, int *out_size) > { > int j, size; > char *name = NULL, *file = NULL, *tmp = NULL; > - ImlibFont *fn; > > /* split font name (in format name/size) */ > for (j = strlen(fontname) - 1; (j >= 0) && (fontname[j] != '/'); j--); > @@ -103,7 +103,20 @@ > free(tmp); > } > } > - free(name); > + free(name); *out_size = size; > + return file; > +} > + > +/* find font file, start imlib_font_load() */ > +ImlibFont * > +imlib_font_load_joined(const char *fontname) > +{ > + char *file; > + ImlibFont *fn; > + int size; > + > + file = imlib_font_find_file(fontname, &size); > + > /* didnt find a file? abort */ > if (!file) > return NULL; > @@ -112,17 +125,13 @@ > return fn; > } > > -ImlibFont * > -imlib_font_load(const char *name, int size) > +static ImlibFont * > +imlib_font_create_font_struct(const char *name, int size) > { > int error; > ImlibFont *fn; > char *file; > > - fn = imlib_font_find(name, size); > - if (fn) > - return fn; > - > imlib_font_init(); > > fn = malloc(sizeof(ImlibFont)); > @@ -180,13 +189,191 @@ > fn->size = size; > > fn->glyphs = NULL; > - > + fn->next_in_set = NULL; > fn->usage = 0; > > fn->references = 1; > > - fonts = imlib_object_list_prepend(fonts, fn); > return fn; > +} > + > +ImlibFont * > +imlib_font_load(const char *name, int size) > +{ > + ImlibFont *fn; > + > + fn = imlib_font_find(name, size); > + if (fn) > + return fn; > + > + if((fn = imlib_font_create_font_struct(name, size)) != NULL) > + fonts = imlib_object_list_prepend(fonts, fn); > + > + return fn; > +} > + > +#define MAX_FONTNAMES 31 > + > +static char *skip_white(char *s) > +{ > + while(isspace(*s)) ++s; > + return s; > +} > + > +/* Skip duplicates */ > +static void collect_fontnames(const char *fon_s, char *names[]) > +{ > + char *s, *comma, *buf, *last, *name; > + int i, j; > + > + buf = strdup(fon_s); > + i = 0; > + s = skip_white(buf); > + while(*s) > + { > + names[i] = NULL; > + if((comma = strchr(s, ','))) > + *comma = 0; > + last = s + strlen(s) - 1; > + while(last > s && isspace(*last)) --last; *++last = 0; > + j = 0; > + while((name = names[j]) != NULL) > + { > + if(strcmp(name, s) == 0) > + break; > + ++j; > + } > + if(name == NULL) > + { > + names[i] = strdup(s); > + if(++i > MAX_FONTNAMES) > + break; > + } > + if(comma == NULL) > + break; > + s = skip_white(comma + 1); > + } > + names[i] = NULL; free(buf); > +} > + > +/* font_name contains a comma separated list of "name/size" elements. > + * sets must be disjoint: if two sets begin with the same font, > + * the existing set's chain would be destroyed. > +*/ > +ImlibFont * > +imlib_font_load_fontset(const char *font_name) > +{ > + ImlibFont *head, *tail, *fn; > + char *name, *file; > + int i, size; > + char *names[MAX_FONTNAMES + 1]; > + > + collect_fontnames(font_name, names); > + > + if(names[0] == NULL) > + return NULL; > + head = tail = NULL; i = 0; > + > + while((name = names[i])) > + { > + if((file = imlib_font_find_file(name, &size)) != NULL) > + { > + if((fn = imlib_font_create_font_struct(file, size)) != NULL) > + { > + if(tail) > + tail->next_in_set = fn; > + else > + head = fn; > + tail = fn; > + } > + free(file); > + } > + free(name); ++i; > + } > + return head; > +} > + > +ImlibFont * > +imlib_font_find_face_in_fontset(ImlibFont *fn, ImlibFont *fn_list, > + unsigned long uni_id, int encoding_id, > + int force_missing_glyph, FT_UInt *out_glyph_id, > + int *out_missing) > +{ > + FT_Face face; > + FT_UInt glyph_id; > + ImlibFont *first_invalid; > + > + if(!fn) > + fn = fn_list; > + if(out_missing) > + *out_missing = 0; > + if(fn->ft.face == NULL) > + { > + FT_New_Face(ft_lib, fn->file, 0, &face); > + fn->ft.face = face; > + } > + first_invalid = NULL; > +repeat_upto_invalid: > + while(fn) > + { > + if(fn == first_invalid) > + { > + first_invalid = NULL; > + break; > + } > + face = fn->ft.face; > + > + if(face->charmap != NULL > + || FT_Select_Charmap(face, encoding_id) == 0 > + ) > + { > + FT_Set_Char_Size(face, 0, fn->size * 64, 96, 96); > + > + if(force_missing_glyph) > + glyph_id = 0; > + else > + glyph_id = FT_Get_Char_Index(face, uni_id); > + > + if(glyph_id || force_missing_glyph) > + { > + *out_glyph_id = glyph_id; > + return fn; > + } > + if(first_invalid == NULL) > + first_invalid = fn; > + } > + fn = fn->next_in_set; > + }/* while(fn) */ > + if(first_invalid) > + { > + fn = fn_list; > + goto repeat_upto_invalid; > + } > + if(out_missing) > + *out_missing = 1; > + return > + imlib_font_find_face_in_fontset(NULL, fn_list, 0, encoding_id, 1, > + out_glyph_id, NULL); > +} > + > +void > +imlib_font_free_fontset(ImlibFont *fn_list) > +{ > + ImlibFont *fn; > + > + while((fn = fn_list)) > + { > + fn_list = fn_list->next_in_set; > +/* imlib_font_free(fn); */ > + imlib_hash_free(fn->glyphs); > + > + if (fn->file) > + free(fn->file); > + if (fn->name) > + free(fn->name); > + FT_Done_Face(fn->ft.face); > + free(fn); > + } > } > > void > =================================================================== > RCS file: /cvs/e/e17/libs/imlib2/src/lib/font_main.c,v > retrieving revision 1.4 > retrieving revision 1.5 > diff -u -3 -r1.4 -r1.5 > --- font_main.c 18 May 2006 17:36:08 -0000 1.4 > +++ font_main.c 6 May 2007 13:54:43 -0000 1.5 > @@ -38,78 +38,130 @@ > } > > int > -imlib_font_ascent_get(ImlibFont * fn) > +imlib_font_ascent_get(ImlibFont *fn_list) > { > - int val; > - int ret; > + ImlibFont *fn; > + int val; > + int ret, maxret; > > + maxret = 0; fn = fn_list; > + > + while(fn) > + { > val = (int)fn->ft.face->ascender; > - fn->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct > + fn->ft.face->units_per_EM = 2048; /* nasty 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); > - return ret; > + if(ret > maxret) > + maxret = ret; > + fn = fn->next_in_set; > + } > + return maxret; > } > > int > -imlib_font_descent_get(ImlibFont * fn) > +imlib_font_descent_get(ImlibFont *fn_list) > { > - int val; > - int ret; > + ImlibFont *fn; > + int val; > + int ret, maxret; > + > + maxret = 0; fn = fn_list; > > + while(fn) > + { > val = -(int)fn->ft.face->descender; > - fn->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct > + fn->ft.face->units_per_EM = 2048; /* nasty 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); > - return ret; > +/* NOTE by szukw000: as long as the descent value is positive: > + * 'ret > maxret'; otherwise 'ret < maxret'. > +*/ > + if(ret > maxret) > + maxret = ret; > + fn = fn->next_in_set; > + } > + return maxret; > } > > int > -imlib_font_max_ascent_get(ImlibFont * fn) > +imlib_font_max_ascent_get(ImlibFont *fn_list) > { > - int val; > - int ret; > + ImlibFont *fn; > + int val; > + int ret, maxret; > > + maxret = 0; fn = fn_list; > + > + while(fn) > + { > val = (int)fn->ft.face->bbox.yMax; > - fn->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct > + fn->ft.face->units_per_EM = 2048; /* nasty 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); > - return ret; > + if(ret > maxret) > + maxret = ret; > + fn = fn->next_in_set; > + } > + return maxret; > } > > int > -imlib_font_max_descent_get(ImlibFont * fn) > +imlib_font_max_descent_get(ImlibFont *fn_list) > { > - int val; > - int ret; > + ImlibFont *fn; > + int val; > + int ret, maxret; > + > + maxret = 0; fn = fn_list; > > + while(fn) > + { > val = (int)fn->ft.face->bbox.yMin; > - fn->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct > + fn->ft.face->units_per_EM = 2048; /* nasty 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); > - return ret; > +/* NOTE by szukw000: as long as the max_descent value is negative: > + * 'ret < maxret'; otherwise: 'ret > maxret'. > +*/ > + if(ret < maxret) > + maxret = ret; > + fn = fn->next_in_set; > + } > + return maxret; > } > > int > -imlib_font_get_line_advance(ImlibFont * fn) > +imlib_font_get_line_advance(ImlibFont * fn_list) > { > - int val; > - int ret; > + ImlibFont *fn; > + int val, maxret, 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); > - return ret; > + maxret = 0; > + fn = fn_list; > + while(fn) > + { > + val = (int)fn->ft.face->height; > +/* nasty hack - need to have correct val */ > + fn->ft.face->units_per_EM = 2048; > + > + ret = > + (val * fn->ft.face->size->metrics.y_scale) / > + (fn->ft.face->units_per_EM * fn->ft.face->units_per_EM); > + > + if(ret > maxret) > + maxret = ret; > + fn = fn->next_in_set; > + } > + return maxret; > } > > int > =================================================================== > RCS file: /cvs/e/e17/libs/imlib2/src/lib/font_query.c,v > retrieving revision 1.1 > retrieving revision 1.2 > diff -u -3 -r1.1 -r1.2 > --- font_query.c 1 Nov 2004 09:45:31 -0000 1.1 > +++ font_query.c 6 May 2007 13:54:43 -0000 1.2 > @@ -19,20 +19,20 @@ > > /* string extents */ > void > -imlib_font_query_size(ImlibFont * fn, const char *text, int *w, int *h) > +imlib_font_query_size(ImlibFont *fn_list, const char *text, int *w, int *h) > { > - int use_kerning; > + ImlibFont *fn; > int pen_x, pen_y; > int start_x, end_x; > - int chr; > + int chr, missing_glyph; > FT_UInt prev_index; > > start_x = 0; > end_x = 0; > pen_x = 0; > pen_y = 0; > - use_kerning = FT_HAS_KERNING(fn->ft.face); > - prev_index = 0; > + prev_index = 0; fn = NULL; missing_glyph = 1; > + > for (chr = 0; text[chr];) > { > FT_UInt index; > @@ -43,8 +43,13 @@ > gl = imlib_font_utf8_get_next((unsigned char *)text, &chr); > if (gl == 0) > break; > - index = FT_Get_Char_Index(fn->ft.face, gl); > - if ((use_kerning) && (prev_index) && (index)) > + if(missing_glyph) > + fn = fn_list; > + fn = > + imlib_font_find_face_in_fontset(fn, fn_list, gl, > + FT_ENCODING_UNICODE, 0, &index, &missing_glyph); > + > + if(FT_HAS_KERNING(fn->ft.face) && (prev_index) && (index)) > { > FT_Vector delta; > > @@ -71,16 +76,18 @@ > if (w) > *w = (pen_x >> 8) - start_x; > if (h) > - *h = imlib_font_max_ascent_get(fn) - imlib_font_max_descent_get(fn); > + *h = imlib_font_max_ascent_get(fn_list) > + - imlib_font_max_descent_get(fn_list); > } > > /* text x inset */ > int > -imlib_font_query_inset(ImlibFont * fn, const char *text) > +imlib_font_query_inset(ImlibFont *fn_list, const char *text) > { > + ImlibFont *fn; > FT_UInt index; > Imlib_Font_Glyph *fg; > - int chr; > + int chr, missing_glyph; > int gl; > > chr = 0; > @@ -89,7 +96,11 @@ > gl = imlib_font_utf8_get_next((unsigned char *)text, &chr); > if (gl == 0) > return 0; > - index = FT_Get_Char_Index(fn->ft.face, gl); > + missing_glyph = 1; > + fn = > + imlib_font_find_face_in_fontset(fn_list, fn_list, gl, > + FT_ENCODING_UNICODE, 0, &index, &missing_glyph); > + > fg = imlib_font_cache_glyph_get(fn, index); > if (!fg) > return 0; > @@ -97,76 +108,82 @@ > } > > /* h & v advance */ > -void > -imlib_font_query_advance(ImlibFont * fn, const char *text, int *h_adv, > - int *v_adv) > +void imlib_font_query_advance(ImlibFont *fn_list, const char *text, > + int *h_adv, int *v_adv) > { > - int use_kerning; > - int pen_x, pen_y; > - int start_x; > - int chr; > - FT_UInt prev_index; > - > - start_x = 0; > - pen_x = 0; > - pen_y = 0; > - use_kerning = FT_HAS_KERNING(fn->ft.face); > - prev_index = 0; > - for (chr = 0; text[chr];) > - { > - FT_UInt index; > - Imlib_Font_Glyph *fg; > - int chr_x, chr_y, chr_w; > - int gl; > - > - gl = imlib_font_utf8_get_next((unsigned char *)text, &chr); > - if (gl == 0) > - break; > - index = FT_Get_Char_Index(fn->ft.face, gl); > - if ((use_kerning) && (prev_index) && (index)) > - { > - FT_Vector delta; > - > - FT_Get_Kerning(fn->ft.face, prev_index, index, > ft_kerning_default, > - &delta); > - pen_x += delta.x << 2; > - } > - fg = imlib_font_cache_glyph_get(fn, index); > - if (!fg) > - continue; > - > - chr_x = (pen_x >> 8) + fg->glyph_out->left; > - chr_y = (pen_y >> 8) + fg->glyph_out->top; > - chr_w = fg->glyph_out->bitmap.width; > - > - pen_x += fg->glyph->advance.x >> 8; > - prev_index = index; > - } > - if (v_adv) > - *v_adv = imlib_font_get_line_advance(fn); > - if (h_adv) > + ImlibFont *fn; > + int pen_x, pen_y; > + int start_x; > + int chr, missing_glyph; > + FT_UInt prev_index; > + > + start_x = 0; > + pen_x = 0; > + pen_y = 0; > + > + prev_index = 0; fn = NULL; missing_glyph = 1; > + > + for (chr = 0; text[chr];) > + { > + FT_UInt index; > + Imlib_Font_Glyph *fg; > + int chr_x, chr_y, chr_w; > + int gl; > + > + gl = imlib_font_utf8_get_next((unsigned char *)text, &chr); > + if (gl == 0) > + break; > + if(missing_glyph) > + fn = fn_list; > + fn = > + imlib_font_find_face_in_fontset(fn, fn_list, gl, > + FT_ENCODING_UNICODE, 0, &index, &missing_glyph); > + > + if(FT_HAS_KERNING(fn->ft.face) && (prev_index) && (index)) > + { > + FT_Vector delta; > + > + FT_Get_Kerning(fn->ft.face, prev_index, index, ft_kerning_default, > + &delta); > + pen_x += delta.x << 2; > + } > + fg = imlib_font_cache_glyph_get(fn, index); > + if (!fg) > + continue; > + > + chr_x = (pen_x >> 8) + fg->glyph_out->left; > + chr_y = (pen_y >> 8) + fg->glyph_out->top; > + chr_w = fg->glyph_out->bitmap.width; > + > + pen_x += fg->glyph->advance.x >> 8; > + prev_index = index; > + } > + if (v_adv) > + *v_adv = imlib_font_get_line_advance(fn_list); > + if (h_adv) > *h_adv = (pen_x >> 8) - start_x; > } > > /* x y w h for char at char pos */ > int > -imlib_font_query_char_coords(ImlibFont * fn, const char *text, int pos, > +imlib_font_query_char_coords(ImlibFont *fn_list, const char *text, int pos, > int *cx, int *cy, int *cw, int *ch) > { > - int use_kerning; > + ImlibFont *fn; > int pen_x, pen_y; > int prev_chr_end; > - int chr; > + int chr, missing_glyph; > int asc, desc; > FT_UInt prev_index; > > pen_x = 0; > pen_y = 0; > - use_kerning = FT_HAS_KERNING(fn->ft.face); > - prev_index = 0; > + > + prev_index = 0; fn = NULL; missing_glyph = 1; > prev_chr_end = 0; > - asc = imlib_font_max_ascent_get(fn); > - desc = imlib_font_max_descent_get(fn); > + asc = imlib_font_max_ascent_get(fn_list); > + desc = imlib_font_max_descent_get(fn_list); > + > for (chr = 0; text[chr];) > { > int pchr; > @@ -180,9 +197,14 @@ > gl = imlib_font_utf8_get_next((unsigned char *)text, &chr); > if (gl == 0) > break; > - index = FT_Get_Char_Index(fn->ft.face, gl); > + if(missing_glyph) > + fn = fn_list; > + fn = > + imlib_font_find_face_in_fontset(fn, fn_list, gl, > + FT_ENCODING_UNICODE, 0, &index, &missing_glyph); > + > kern = 0; > - if ((use_kerning) && (prev_index) && (index)) > + if(FT_HAS_KERNING(fn->ft.face) && (prev_index) && (index)) > { > FT_Get_Kerning(fn->ft.face, prev_index, index, > ft_kerning_default, > &delta); > @@ -232,23 +254,24 @@ > > /* char pos of text at xy pos */ > int > -imlib_font_query_text_at_pos(ImlibFont * fn, const char *text, int x, int y, > +imlib_font_query_text_at_pos(ImlibFont *fn_list, const char *text, int x, > int y, > int *cx, int *cy, int *cw, int *ch) > { > - int use_kerning; > + ImlibFont *fn; > int pen_x, pen_y; > int prev_chr_end; > - int chr; > + int chr, missing_glyph; > int asc, desc; > FT_UInt prev_index; > > pen_x = 0; > pen_y = 0; > - use_kerning = FT_HAS_KERNING(fn->ft.face); > - prev_index = 0; > + > + prev_index = 0; fn = NULL; missing_glyph = 1; > prev_chr_end = 0; > - asc = imlib_font_max_ascent_get(fn); > - desc = imlib_font_max_descent_get(fn); > + asc = imlib_font_max_ascent_get(fn_list); > + desc = imlib_font_max_descent_get(fn_list); > + > for (chr = 0; text[chr];) > { > int pchr; > @@ -262,9 +285,14 @@ > gl = imlib_font_utf8_get_next((unsigned char *)text, &chr); > if (gl == 0) > break; > - index = FT_Get_Char_Index(fn->ft.face, gl); > + if(missing_glyph) > + fn = fn_list; > + fn = > + imlib_font_find_face_in_fontset(fn, fn_list, gl, > + FT_ENCODING_UNICODE, 0, &index, &missing_glyph); > + > kern = 0; > - if ((use_kerning) && (prev_index) && (index)) > + if(FT_HAS_KERNING(fn->ft.face) && (prev_index) && (index)) > { > FT_Get_Kerning(fn->ft.face, prev_index, index, > ft_kerning_default, > &delta); > =================================================================== > RCS file: /cvs/e/e17/libs/imlib2/src/lib/polygon.c,v > retrieving revision 1.2 > retrieving revision 1.3 > diff -u -3 -r1.2 -r1.3 > --- polygon.c 20 Sep 2005 17:22:04 -0000 1.2 > +++ polygon.c 6 May 2007 13:54:43 -0000 1.3 > @@ -536,7 +536,7 @@ > while (j < nactive_edges) > { > int lx, rx; > - int e_lx, e_rx; > + int e_lx = 0, e_rx = 0; > PolyEdge *e; > > e = edge + j; > @@ -760,7 +760,7 @@ > while (j < nactive_edges) > { > int lx, rx; > - int e_lx, e_rx; > + int e_lx = 0, e_rx = 0; > PolyEdge *e; > > e = edge + j; > @@ -1107,8 +1107,8 @@ > while (j < nactive_edges) > { > int lx, rx; > - int le_lx, le_rx; > - int re_lx, re_rx; > + int le_lx = 0, le_rx = 0; > + int re_lx = 0, re_rx = 0; > PolyEdge *le, *re; > > if (j < (nactive_edges - 1)) > @@ -1395,8 +1395,8 @@ > while (j < nactive_edges) > { > int lx, rx; > - int le_lx, le_rx; > - int re_lx, re_rx; > + int le_lx = 0, le_rx = 0; > + int re_lx = 0, re_rx = 0; > PolyEdge *le, *re; > > if (j < (nactive_edges - 1)) > > > > ------------------------------------------------------------------------- > This SF.net email is sponsored by DB2 Express > Download DB2 Express C - the FREE version of DB2 express and take > control of your XML. No limits. Just data. Click to get it now. > http://sourceforge.net/powerbar/db2/ > _______________________________________________ > enlightenment-cvs mailing list > [EMAIL PROTECTED] > https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs > > ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel