On Sat, 19 May 2007 20:34:41 +0200 Kim Woelders <[EMAIL PROTECTED]> babbled:
thats fine. problems didnt show up in my initial quick test, so i put the patch
in. i did wait until after aspara to get it time to settle and test :)
> 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
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
>
--
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler) [EMAIL PROTECTED]
裸好多
Tokyo, Japan (東京 日本)
-------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel