[teklib-general] changeset in /hg/teklib/current: added font management prototype
Franciska Schulze
fschulze at neoscientists.org
Mon Nov 26 16:22:11 CET 2007
changeset cb5bb7aad318 in /hg/teklib/current
details: http://teklib.org:8001/hg/teklib/current?cmd=changeset;node=cb5bb7aad318
description:
added font management prototype
diffs (truncated from 583 to 300 lines):
diff -r abc590b59b5d -r cb5bb7aad318 src/visual/posix/visual_host.c
--- a/src/visual/posix/visual_host.c Sat Sep 01 16:53:09 2007 +0200
+++ b/src/visual/posix/visual_host.c Sat Sep 01 17:03:20 2007 +0200
@@ -12,82 +12,181 @@
#include <tek/proto/hal.h>
#include "visual_mod.h"
-#include <sys/time.h>
-#include <unistd.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/keysym.h>
-
-#include <sys/shm.h>
-#include <X11/extensions/XShm.h>
-
-/*****************************************************************************/
-
-typedef struct
-{
- TINT winwidth, winheight;
- TINT fontwidth, fontheight;
- TINT textwidth, textheight;
- TSTRPTR title;
-
- TUINT flags;
- TUINT pixfmt;
- TINT depth, bpp;
-
- TAPTR HalBase;
- THALO lock;
- TINT sigPending;
-
- Display *display;
- int screen;
- Visual *visual;
- Window window;
+#include <stdio.h>
+#include <string.h>
+#include "visual_host.h"
+
+static TBOOL shm_available;
+
+struct attrdata
+{
+ TMOD_VIS *mod;
+ VISUAL *v;
+ TAPTR font;
+ TINT num;
+};
+
+/*****************************************************************************/
+#define FNT_LENGTH 41 /* "-*-fname-medium-r-*-*-xxx-*-*-*-*-*-iso8859-1" */
+#define FNT_DEFNAME "fixed"
+#define FNT_WGHT_MEDIUM "medium"
+#define FNT_WGHT_BOLD "bold"
+#define FNT_SLANT_R "r"
+#define FNT_SLANT_I "i"
+#define FNT_DEFPXSIZE 14
+#define FNT_DEFREGENC "iso8859-1"
+
+struct FontNode
+{
+ struct TNode node;
XFontStruct *font;
- XTextProperty title_prop;
- Colormap colormap;
- GC gc;
-
- TINT shm, shmevent;
- XShmSegmentInfo shminfo;
- TBOOL shmpending;
-
- Atom atom_wm_delete_win;
-
- TINT keyqual;
- TINT mousex, mousey;
- TUINT base_mask;
- TUINT eventmask;
-
- struct TList imsgpool;
-
- TVPEN bgpen, fgpen;
-
- int fd_display;
- int fd_sigpipe_read;
- int fd_sigpipe_write;
- int fd_max;
-
- XImage *image;
- char *tempbuf;
- int imw, imh;
-
- XSizeHints *sizehints;
-
-} VISUAL;
-
-#define DEFFONTNAME "-misc-fixed-medium-r-normal-*-14-*-*-*-*-*-*-*"
-
-#define PIXFMT_UNDEFINED 0
-#define PIXFMT_RGB 1
-#define PIXFMT_RBG 2
-#define PIXFMT_BRG 3
-#define PIXFMT_BGR 4
-#define PIXFMT_GRB 5
-#define PIXFMT_GBR 6
-
-#define TVISF_SWAPBYTEORDER 0x00000001
-
-static TBOOL shm_available;
+};
+
+static TAPTR
+openfont(TMOD_VIS *mod, VISUAL *v, TTAGITEM *tags)
+{
+ TINT fpxsize;
+ TBOOL fitalic, fbold;
+ TAPTR font = TNULL;
+ TSTRPTR fname = TNULL;
+ TSTRPTR fquery = TNULL;
+ struct FontNode *fn;
+ TAPTR exec = TGetExecBase(mod);
+
+ /* fetch user specified attributes */
+ fname = (TSTRPTR) TGetTag(tags, TVisual_FontName, (TTAG) FNT_DEFNAME);
+ fpxsize = (TINT) TGetTag(tags, TVisual_FontPxSize, (TTAG) FNT_DEFPXSIZE);
+ fitalic = (TBOOL) TGetTag(tags, TVisual_FontItalic, (TTAG) TFALSE);
+ fbold = (TBOOL) TGetTag(tags, TVisual_FontBold, (TTAG) TFALSE);
+
+ fquery = (TSTRPTR) TExecAlloc0(exec, mod->vis_MMU, FNT_LENGTH + strlen(fname));
+ if (fquery)
+ {
+ /* build fontquery name */
+ sprintf(fquery, "-*-%s-%s-%s-*-*-%d-*-*-*-*-*-%s",
+ fname,
+ fbold ? FNT_WGHT_BOLD : FNT_WGHT_MEDIUM,
+ fitalic ? FNT_SLANT_I : FNT_SLANT_R,
+ fpxsize,
+ FNT_DEFREGENC
+ );
+
+ TDBPRINTF(10, ("fquery = %s\n", fquery));
+
+ /* allocate new font node */
+ fn = TExecAlloc0(exec, mod->vis_MMU, sizeof(struct FontNode));
+ if (fn)
+ {
+ fn->font = XLoadQueryFont(v->display, fquery);
+ if (fn->font)
+ {
+ /* append to the list of open fonts */
+ TDBPRINTF(10, ("'%s' successfully loaded\n", fname));
+ TAddTail(&v->fm.openfonts, &fn->node);
+ font = (TAPTR)fn;
+ }
+ else
+ {
+ /* query failed, return pointer to default font */
+ TDBPRINTF(10, ("unable to load '%s'\n", fname));
+ TDBPRINTF(10, ("defaulting to '%s'\n", DEFFONTNAME));
+ TExecFree(exec, fn);
+ font = v->fm.deffont;
+ v->fm.defref++;
+ }
+ }
+
+ TExecFree(exec, fquery);
+ }
+
+ return font;
+}
+
+static TVOID
+setfont(TMOD_VIS *mod, VISUAL *v, TAPTR font)
+{
+ XGCValues gcv;
+ struct FontNode *fn = (struct FontNode *) font;
+ gcv.font = fn->font->fid;
+ XChangeGC(v->display, v->gc, GCFont, &gcv);
+ v->fm.curfont = font;
+}
+
+static TVOID
+closefont(TMOD_VIS *mod, VISUAL *v, TAPTR font)
+{
+ struct FontNode *fn = (struct FontNode *) font;
+ TAPTR exec = TGetExecBase(mod);
+
+ if (font == v->fm.deffont)
+ {
+ if (v->fm.defref)
+ {
+ /* prevent freeing of default font if it's */
+ /* still referenced */
+ v->fm.defref--;
+ return;
+ }
+ }
+ else
+ {
+ /* the font we're going to free is currently */
+ /* in use -> replace it with the default font */
+ if (font == v->fm.curfont)
+ setfont(mod, v, v->fm.deffont);
+ }
+
+ /* free xfont */
+ if (fn->font)
+ XFreeFont(v->display, fn->font);
+
+ /* remove from openfonts list */
+ TRemove(&fn->node);
+
+ /* free fontnode itself */
+ TExecFree(exec, fn);
+}
+
+static TINT
+textsize(TMOD_VIS *mod, VISUAL *v, TAPTR font, TSTRPTR text)
+{
+ TINT len;
+ struct FontNode *fn = (struct FontNode *) font;
+ len = XTextWidth(fn->font, text, strlen(text));
+ return len;
+}
+
+static THOOKENTRY TTAG
+getfattrfunc(struct THook *hook, TAPTR obj, TTAG msg)
+{
+ struct attrdata *data = hook->thk_Data;
+ TTAGITEM *item = obj;
+ struct FontNode *fn = (struct FontNode *) data->font;
+
+ switch (item->tti_Tag)
+ {
+ default:
+ return TTRUE;
+
+ case TVisual_FontAscent:
+ *((TINT *) item->tti_Value) = fn->font->ascent;
+ break;
+
+ case TVisual_FontDescent:
+ *((TINT *) item->tti_Value) = fn->font->descent;
+ break;
+
+ case TVisual_FontHeight:
+ *((TINT *) item->tti_Value) =
+ fn->font->ascent + fn->font->descent;
+ break;
+
+ /* ... */
+ }
+ data->num++;
+ return TTRUE;
+}
+
/*****************************************************************************/
@@ -224,8 +323,9 @@ static TVOID
static TVOID
drawtext1(TMOD_VIS *mod, VISUAL *v, TINT x, TINT y, TSTRPTR text, TINT len)
{
+ XFontStruct *f = ((struct FontNode *) v->fm.curfont)->font;
XDrawString(v->display, v->window, v->gc,
- x, y + v->font->ascent, (char *) text, len);
+ x, y + f->ascent, (char *) text, len);
}
/*****************************************************************************/
@@ -233,8 +333,9 @@ static TVOID
static TVOID
drawtext2(TMOD_VIS *mod, VISUAL *v, TINT x, TINT y, TSTRPTR text, TINT len)
{
+ XFontStruct *f = ((struct FontNode *) v->fm.curfont)->font;
XDrawImageString(v->display, v->window, v->gc,
- x, y + v->font->ascent, (char *) text, len);
+ x, y + f->ascent, (char *) text, len);
}
/*****************************************************************************/
@@ -507,13 +608,6 @@ drawrgb(TMOD_VIS *mod, VISUAL *v, TUINT
}
/*****************************************************************************/
-
-struct attrdata
-{
- TMOD_VIS *mod;
- VISUAL *v;
- TINT num;
-};
static THOOKENTRY TTAG
getattrfunc(struct THook *hook, TAPTR obj, TTAG msg)
@@ -1084,7 +1178,8 @@ LOCAL TBOOL
LOCAL TBOOL
vis_init(TMOD_VIS *mod)
{
More information about the teklib-general
mailing list