[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