Enlightenment CVS committal Author : kwo Project : e16 Module : e
Dir : e16/e/src Modified Files: tclass.h text.c ttfont.c Log Message: Font drawing code refactoring continued. =================================================================== RCS file: /cvs/e/e16/e/src/tclass.h,v retrieving revision 1.15 retrieving revision 1.16 diff -u -3 -r1.15 -r1.16 --- tclass.h 20 Oct 2006 20:41:13 -0000 1.15 +++ tclass.h 21 Oct 2006 16:41:20 -0000 1.16 @@ -41,19 +41,6 @@ #define FONT_TYPE_XFS 2 /* XFontSet */ #define FONT_TYPE_XFONT 0 /* XFontStruct */ -#if FONT_TYPE_IFT -typedef void EFont; -#endif - -typedef struct -{ - Win win; - EImage *im; - Drawable draw; - GC gc; - int r, g, b; -} FontDrawContext; - typedef struct { int (*Load) (TextState * ts); @@ -62,14 +49,12 @@ int *width, int *height, int *ascent); void (*TextFit) (TextState * ts, char **ptext, int *pwidth, int textwidth_limit); - void (*TextDraw) (TextState * ts, FontDrawContext * ctx, - int x, int y, const char *text, int len); - int (*FdcInit) (TextState * ts, FontDrawContext * ctx, - Win win, Drawable draw); - void (*FdcSetDrawable) (TextState * ts, FontDrawContext * ctx, - Drawable draw); - void (*FdcSetColor) (TextState * ts, FontDrawContext * ctx, - XColor * xc); + void (*TextDraw) (TextState * ts, int x, int y, + const char *text, int len); + int (*FdcInit) (TextState * ts, Win win, Drawable draw); + void (*FdcFini) (TextState * ts); + void (*FdcSetDrawable) (TextState * ts, unsigned long draw); + void (*FdcSetColor) (TextState * ts, XColor * xc); } FontOps; struct _textstate @@ -85,28 +70,7 @@ } style; XColor fg_col; XColor bg_col; - union - { -#if FONT_TYPE_IFT - struct - { - EFont *font; - } ift; -#endif -#if FONT_TYPE_XFS - struct - { - XFontSet font; - int ascent; - } xfs; -#endif -#if FONT_TYPE_XFONT - struct - { - XFontStruct *font; - } xf; -#endif - } f; + void *fdc; const FontOps *ops; }; =================================================================== RCS file: /cvs/e/e16/e/src/text.c,v retrieving revision 1.76 retrieving revision 1.77 diff -u -3 -r1.76 -r1.77 --- text.c 20 Oct 2006 20:41:13 -0000 1.76 +++ text.c 21 Oct 2006 16:41:20 -0000 1.77 @@ -260,79 +260,99 @@ */ extern const FontOps FontOpsXfs; +typedef struct +{ + XFontSet font; + int ascent; + Win win; + Drawable draw; + GC gc; +} FontCtxXfs; + static int -XfsLoad(TextState * ts) +_xfs_Load(TextState * ts) { + XFontSet font; + FontCtxXfs *fdc; int i, missing_cnt, font_cnt; char **missing_list, *def_str, **fn; XFontStruct **fs; - ts->f.xfs.font = XCreateFontSet(disp, ts->fontname, &missing_list, - &missing_cnt, &def_str); + font = XCreateFontSet(disp, ts->fontname, &missing_list, + &missing_cnt, &def_str); if (missing_cnt) XFreeStringList(missing_list); - if (!ts->f.xfs.font) + if (!font) { - ts->f.xfs.font = XCreateFontSet(disp, "fixed", &missing_list, - &missing_cnt, &def_str); + font = XCreateFontSet(disp, "fixed", &missing_list, + &missing_cnt, &def_str); if (missing_cnt) XFreeStringList(missing_list); } - if (!ts->f.xfs.font) + if (!font) return -1; if (EventDebug(EDBUG_TYPE_FONTS)) { Eprintf("- XBaseFontNameListOfFontSet %s\n", - XBaseFontNameListOfFontSet(ts->f.xfs.font)); - font_cnt = XFontsOfFontSet(ts->f.xfs.font, &fs, &fn); + XBaseFontNameListOfFontSet(font)); + font_cnt = XFontsOfFontSet(font, &fs, &fn); for (i = 0; i < font_cnt; i++) Eprintf("- XFontsOfFontSet %d: %s\n", i, fn[i]); } - ts->f.xfs.ascent = 0; - font_cnt = XFontsOfFontSet(ts->f.xfs.font, &fs, &fn); + fdc = Emalloc(sizeof(FontCtxXfs)); + if (!fdc) + return -1; + fdc->font = font; + ts->fdc = fdc; + fdc->ascent = 0; + font_cnt = XFontsOfFontSet(font, &fs, &fn); for (i = 0; i < font_cnt; i++) - ts->f.xfs.ascent = MAX(fs[i]->ascent, ts->f.xfs.ascent); - + fdc->ascent = MAX(fs[i]->ascent, fdc->ascent); ts->type = FONT_TYPE_XFS; ts->ops = &FontOpsXfs; return 0; } static void -XfsUnload(TextState * ts) +_xfs_Unload(TextState * ts) { - XFreeFontSet(disp, ts->f.xfs.font); + FontCtxXfs *fdc = (FontCtxXfs *) ts->fdc; + + XFreeFontSet(disp, fdc->font); } static void -XfsTextSize(TextState * ts, const char *text, int len, - int *width, int *height, int *ascent) +_xfs_TextSize(TextState * ts, const char *text, int len, + int *width, int *height, int *ascent) { + FontCtxXfs *fdc = (FontCtxXfs *) ts->fdc; XRectangle ret2; if (len == 0) len = strlen(text); - XmbTextExtents(ts->f.xfs.font, text, len, NULL, &ret2); + XmbTextExtents(fdc->font, text, len, NULL, &ret2); *height = ret2.height; *width = ret2.width; - *ascent = ts->f.xfs.ascent; + *ascent = fdc->ascent; } static void -XfsTextDraw(TextState * ts, FontDrawContext * fdc, int x, int y, - const char *text, int len) +_xfs_TextDraw(TextState * ts, int x, int y, const char *text, int len) { - XmbDrawString(disp, fdc->draw, ts->f.xfs.font, fdc->gc, x, y, text, len); + FontCtxXfs *fdc = (FontCtxXfs *) ts->fdc; + + XmbDrawString(disp, fdc->draw, fdc->font, fdc->gc, x, y, text, len); } static int -XfsFdcInit(TextState * ts __UNUSED__, FontDrawContext * fdc, Win win, - Drawable draw) +_xfs_FdcInit(TextState * ts, Win win, Drawable draw) { + FontCtxXfs *fdc = (FontCtxXfs *) ts->fdc; + fdc->win = win; fdc->draw = draw; fdc->gc = _get_gc(win); @@ -340,22 +360,25 @@ } static void -XfsFdcSetDrawable(TextState * ts __UNUSED__, FontDrawContext * fdc, - Drawable draw) +_xfs_FdcSetDrawable(TextState * ts, unsigned long draw) { + FontCtxXfs *fdc = (FontCtxXfs *) ts->fdc; + fdc->draw = draw; } static void -XfsFdcSetColor(TextState * ts __UNUSED__, FontDrawContext * fdc, XColor * xc) +_xfs_FdcSetColor(TextState * ts, XColor * xc) { + FontCtxXfs *fdc = (FontCtxXfs *) ts->fdc; + EAllocColor(WinGetCmap(fdc->win), xc); XSetForeground(disp, fdc->gc, xc->pixel); } const FontOps FontOpsXfs = { - XfsLoad, XfsUnload, XfsTextSize, TextstateTextFitMB, XfsTextDraw, - XfsFdcInit, XfsFdcSetDrawable, XfsFdcSetColor + _xfs_Load, _xfs_Unload, _xfs_TextSize, TextstateTextFitMB, _xfs_TextDraw, + _xfs_FdcInit, NULL, _xfs_FdcSetDrawable, _xfs_FdcSetColor }; #endif /* FONT_TYPE_XFS */ @@ -365,94 +388,119 @@ */ extern const FontOps FontOpsXfont; +typedef struct +{ + XFontStruct *font; + Win win; + Drawable draw; + GC gc; +} FontCtxXfont; + static int -XfontLoad(TextState * ts) +_xfont_Load(TextState * ts) { + XFontStruct *font = NULL; + FontCtxXfont *fdc; + if (strchr(ts->fontname, ',') == NULL) - ts->f.xf.font = XLoadQueryFont(disp, ts->fontname); - if (ts->f.xf.font) + font = XLoadQueryFont(disp, ts->fontname); + if (font) goto done; /* This one really should succeed! */ - ts->f.xf.font = XLoadQueryFont(disp, "fixed"); - if (ts->f.xf.font) + font = XLoadQueryFont(disp, "fixed"); + if (font) goto done; return -1; /* Failed */ done: + fdc = Emalloc(sizeof(FontCtxXfont)); + if (!fdc) + return -1; + fdc->font = font; + ts->fdc = fdc; ts->type = FONT_TYPE_XFONT; ts->ops = &FontOpsXfont; return -1; } static void -XfontUnload(TextState * ts __UNUSED__) +_xfont_Unload(TextState * ts __UNUSED__) { - if (ts->f.xf.font) - XFreeFont(disp, ts->f.xf.font); + FontCtxXfont *fdc = (FontCtxXfont *) ts->fdc; + + XFreeFont(disp, fdc->font); } static void -XfontTextSize(TextState * ts, const char *text, int len, - int *width, int *height, int *ascent) +_xfont_TextSize(TextState * ts, const char *text, int len, + int *width, int *height, int *ascent) { + FontCtxXfont *fdc = (FontCtxXfont *) ts->fdc; + if (len == 0) len = strlen(text); - if (ts->f.xf.font->min_byte1 == 0 && ts->f.xf.font->max_byte1 == 0) - *width = XTextWidth(ts->f.xf.font, text, len); + if (fdc->font->min_byte1 == 0 && fdc->font->max_byte1 == 0) + *width = XTextWidth(fdc->font, text, len); else - *width = XTextWidth16(ts->f.xf.font, (XChar2b *) text, len / 2); - *height = ts->f.xf.font->ascent + ts->f.xf.font->descent; - *ascent = ts->f.xf.font->ascent; + *width = XTextWidth16(fdc->font, (XChar2b *) text, len / 2); + *height = fdc->font->ascent + fdc->font->descent; + *ascent = fdc->font->ascent; } static void -XfontTextDraw(TextState * ts, FontDrawContext * fdc, int x, int y, - const char *text, int len) +_xfont_TextDraw(TextState * ts, int x, int y, const char *text, int len) { - if (ts->f.xf.font->min_byte1 == 0 && ts->f.xf.font->max_byte1 == 0) + FontCtxXfont *fdc = (FontCtxXfont *) ts->fdc; + + if (fdc->font->min_byte1 == 0 && fdc->font->max_byte1 == 0) XDrawString(disp, fdc->draw, fdc->gc, x, y, text, len); else XDrawString16(disp, fdc->draw, fdc->gc, x, y, (XChar2b *) text, len); } static int -XfontFdcInit(TextState * ts __UNUSED__, FontDrawContext * fdc, Win win, - Drawable draw) +_xfont_FdcInit(TextState * ts, Win win, Drawable draw) { + FontCtxXfont *fdc = (FontCtxXfont *) ts->fdc; + fdc->win = win; fdc->draw = draw; fdc->gc = _get_gc(win); - XSetFont(disp, fdc->gc, ts->f.xf.font->fid); + XSetFont(disp, fdc->gc, fdc->font->fid); return 0; } static void -XfontFdcSetDrawable(TextState * ts __UNUSED__, FontDrawContext * fdc, - Drawable draw) +_xfont_FdcSetDrawable(TextState * ts, unsigned long draw) { + FontCtxXfont *fdc = (FontCtxXfont *) ts->fdc; + fdc->draw = draw; } static void -XfontFdcSetColor(TextState * ts __UNUSED__, FontDrawContext * fdc, XColor * xc) +_xfont_FdcSetColor(TextState * ts, XColor * xc) { + FontCtxXfont *fdc = (FontCtxXfont *) ts->fdc; + EAllocColor(WinGetCmap(fdc->win), xc); XSetForeground(disp, fdc->gc, xc->pixel); } static void -XfontTextFit(TextState * ts, char **ptext, int *pw, int textwidth_limit) +_xfont_TextFit(TextState * ts, char **ptext, int *pw, int textwidth_limit) { + FontCtxXfont *fdc = (FontCtxXfont *) ts->fdc; char *text = *ptext; int hh, ascent; char *new_line; int nuke_count = 0; int len; - if (1) + if (fdc->font->min_byte1 == 0 && fdc->font->max_byte1 == 0) { len = strlen(text); new_line = Emalloc(len + 10); @@ -505,30 +553,29 @@ } const FontOps FontOpsXfont = { - XfontLoad, XfontUnload, XfontTextSize, XfontTextFit, XfontTextDraw, - XfontFdcInit, XfontFdcSetDrawable, XfontFdcSetColor + _xfont_Load, _xfont_Unload, _xfont_TextSize, _xfont_TextFit, _xfont_TextDraw, + _xfont_FdcInit, NULL, _xfont_FdcSetDrawable, _xfont_FdcSetColor }; #endif /* FONT_TYPE_XFONT */ static void -TsTextDraw(TextState * ts, FontDrawContext * fdc, int x, int y, - const char *text, int len) +TsTextDraw(TextState * ts, int x, int y, const char *text, int len) { if (ts->style.effect == 1) { - ts->ops->FdcSetColor(ts, fdc, &(ts->bg_col)); - ts->ops->TextDraw(ts, fdc, x + 1, y + 1, text, len); + ts->ops->FdcSetColor(ts, &(ts->bg_col)); + ts->ops->TextDraw(ts, x + 1, y + 1, text, len); } else if (ts->style.effect == 2) { - ts->ops->FdcSetColor(ts, fdc, &(ts->bg_col)); - ts->ops->TextDraw(ts, fdc, x - 1, y, text, len); - ts->ops->TextDraw(ts, fdc, x + 1, y, text, len); - ts->ops->TextDraw(ts, fdc, x, y - 1, text, len); - ts->ops->TextDraw(ts, fdc, x, y + 1, text, len); + ts->ops->FdcSetColor(ts, &(ts->bg_col)); + ts->ops->TextDraw(ts, x - 1, y, text, len); + ts->ops->TextDraw(ts, x + 1, y, text, len); + ts->ops->TextDraw(ts, x, y - 1, text, len); + ts->ops->TextDraw(ts, x, y + 1, text, len); } - ts->ops->FdcSetColor(ts, fdc, &(ts->fg_col)); - ts->ops->TextDraw(ts, fdc, x, y, text, len); + ts->ops->FdcSetColor(ts, &(ts->fg_col)); + ts->ops->TextDraw(ts, x, y, text, len); } static void @@ -696,7 +743,6 @@ int textwidth_limit, offset_x, offset_y; int xx, yy, ww, hh, ascent; Pixmap drawable; - FontDrawContext fdc; if (w <= 0 || h <= 0) return; @@ -747,7 +793,7 @@ xx = x; yy = y; - if (ts->ops->FdcInit(ts, &fdc, win, draw)) + if (ts->ops->FdcInit(ts, win, draw)) return; #if FONT_TYPE_IFT @@ -755,6 +801,8 @@ { for (i = 0; i < num_lines; i++) { + EImage *im; + ts->ops->TextSize(ts, lines[i], 0, &ww, &hh, &ascent); if (ww > textwidth_limit) ts->ops->TextFit(ts, &lines[i], &ww, textwidth_limit); @@ -763,18 +811,19 @@ yy += ascent; xx = x + (((textwidth_limit - ww) * justification) >> 10); - fdc.im = TextImageGet(win, draw, xx - 1, yy - 1 - ascent, - ww + 2, hh + 2, ts); - if (!fdc.im) + im = TextImageGet(win, draw, xx - 1, yy - 1 - ascent, + ww + 2, hh + 2, ts); + if (!im) break; offset_x = 1; offset_y = ascent + 1; - TsTextDraw(ts, &fdc, offset_x, offset_y, lines[i], - strlen(lines[i])); + ts->ops->FdcSetDrawable(ts, (unsigned long)im); + + TsTextDraw(ts, offset_x, offset_y, lines[i], strlen(lines[i])); - TextImagePut(fdc.im, win, draw, xx - 1, yy - 1 - ascent, + TextImagePut(im, win, draw, xx - 1, yy - 1 - ascent, ww + 2, hh + 2, ts); yy += hh; @@ -812,10 +861,9 @@ } if (drawable != draw) - ts->ops->FdcSetDrawable(ts, &fdc, drawable); + ts->ops->FdcSetDrawable(ts, drawable); - TsTextDraw(ts, &fdc, offset_x, offset_y, lines[i], - strlen(lines[i])); + TsTextDraw(ts, offset_x, offset_y, lines[i], strlen(lines[i])); TextDrawRotBack(win, draw, drawable, xx - 1, yy - 1 - ascent, ww + 2, hh + 2, ts); =================================================================== RCS file: /cvs/e/e16/e/src/ttfont.c,v retrieving revision 1.54 retrieving revision 1.55 diff -u -3 -r1.54 -r1.55 --- ttfont.c 20 Oct 2006 20:41:13 -0000 1.54 +++ ttfont.c 21 Oct 2006 16:41:20 -0000 1.55 @@ -28,6 +28,8 @@ #if FONT_TYPE_IFT +typedef void EFont; + static void EFonts_Init(void) { @@ -102,26 +104,40 @@ */ extern const FontOps FontOpsIft; +typedef struct +{ + EFont *font; + EImage *im; + int r, g, b; +} FontCtxIft; + static int -IftLoad(TextState * ts) +_ift_Load(TextState * ts) { - char s[4096], *s2, *ss; + EFont *font; + FontCtxIft *fdc; + char s[1024], *ss; + int len; - s2 = Estrdup(ts->fontname); - if (!s2) + ss = strchr(ts->fontname, '/'); + if (!ss) + return -1; + len = ss - ts->fontname; + if (len > 1000) return -1; - ss = strchr(s2, '/'); - if (ss) - { - *ss++ = '\0'; - Esnprintf(s, sizeof(s), "%s.ttf", s2); - ts->f.ift.font = Efont_load(s2, atoi(ss)); - } - Efree(s2); - if (!ts->f.ift.font) + Esnprintf(s, sizeof(s) - 8, "%s.ttf", ts->fontname); + strncpy(s, ts->fontname, len); + strcpy(s + len, ".ttf"); + font = Efont_load(s, atoi(ss + 1)); + if (!font) return -1; + fdc = Emalloc(sizeof(FontCtxIft)); + if (!fdc) + return -1; + fdc->font = font; + ts->fdc = fdc; ts->need_utf8 = 1; ts->type = FONT_TYPE_IFT; ts->ops = &FontOpsIft; @@ -129,42 +145,57 @@ } static void -IftUnload(TextState * ts) +_ift_Unload(TextState * ts) { - Efont_free(ts->f.ift.font); + FontCtxIft *fdc = (FontCtxIft *) ts->fdc; + + Efont_free(fdc->font); } static void -IftTextSize(TextState * ts, const char *text, int len, - int *width, int *height, int *ascent) +_ift_TextSize(TextState * ts, const char *text, int len, + int *width, int *height, int *ascent) { - Efont_extents(ts->f.ift.font, text, len, width, height, ascent); + FontCtxIft *fdc = (FontCtxIft *) ts->fdc; + + Efont_extents(fdc->font, text, len, width, height, ascent); } static void -IftTextDraw(TextState * ts, FontDrawContext * fdc, int x, int y, - const char *text, int len __UNUSED__) +_ift_TextDraw(TextState * ts, int x, int y, const char *text, + int len __UNUSED__) { - EFont_draw_string(fdc->im, ts->f.ift.font, x, y, fdc->r, fdc->g, fdc->b, - text); + FontCtxIft *fdc = (FontCtxIft *) ts->fdc; + + EFont_draw_string(fdc->im, fdc->font, x, y, fdc->r, fdc->g, fdc->b, text); } static int -IftFdcInit(TextState * ts __UNUSED__, FontDrawContext * fdc __UNUSED__, - Win win __UNUSED__, Drawable draw __UNUSED__) +_ift_FdcInit(TextState * ts __UNUSED__, Win win __UNUSED__, + Drawable draw __UNUSED__) { return 0; } static void -IftFdcSetColor(TextState * ts __UNUSED__, FontDrawContext * fdc, XColor * xc) +_ift_FdcSetDrawable(TextState * ts, unsigned long draw) +{ + FontCtxIft *fdc = (FontCtxIft *) ts->fdc; + + fdc->im = (EImage *) draw; +} + +static void +_ift_FdcSetColor(TextState * ts __UNUSED__, XColor * xc) { + FontCtxIft *fdc = (FontCtxIft *) ts->fdc; + EGetColor(xc, &(fdc->r), &(fdc->g), &(fdc->b)); } const FontOps FontOpsIft = { - IftLoad, IftUnload, IftTextSize, TextstateTextFitMB, IftTextDraw, - IftFdcInit, NULL, IftFdcSetColor + _ift_Load, _ift_Unload, _ift_TextSize, TextstateTextFitMB, _ift_TextDraw, + _ift_FdcInit, NULL, _ift_FdcSetDrawable, _ift_FdcSetColor }; #if TEST_TTFONT ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs