[teklib-general] changeset in /hg/teklib/current: added quick hack for pens and x...
Franciska Schulze
fschulze at neoscientists.org
Mon Nov 26 16:24:19 CET 2007
changeset 384c51311419 in /hg/teklib/current
details: http://teklib.org:8001/hg/teklib/current?cmd=changeset;node=384c51311419
description:
added quick hack for pens and xft version of drawtext2
diffs (286 lines):
diff -r 71b0cbacc2a4 -r 384c51311419 src/visual/posix/visual_host.c
--- a/src/visual/posix/visual_host.c Mon Sep 24 12:31:49 2007 +0200
+++ b/src/visual/posix/visual_host.c Mon Sep 24 12:34:14 2007 +0200
@@ -8,7 +8,6 @@
#include <stdio.h>
#include <string.h>
-#include <dlfcn.h>
#include <tek/debug.h>
#include <tek/teklib.h>
@@ -16,9 +15,9 @@
#include "visual_mod.h"
#include "visual_host.h"
-#include "visual_font.h"
static TBOOL shm_available;
+TBOOL initlibxft(TMOD_VIS *mod);
/*****************************************************************************/
@@ -54,6 +53,35 @@ static TVPEN
static TVPEN
allocpen(TMOD_VIS *mod, VISUAL *v, TUINT rgb)
{
+ TINT ret = v->ctidx;
+ GLOBAL *g = mod->vis_HostGlobal;
+ XColor *col = &v->coltab[v->ctidx].xcolor;
+
+ col->red = ((rgb >> 16) & 0xff) << 8;
+ col->green = ((rgb >> 8) & 0xff) << 8;
+ col->blue = (rgb & 0xff) << 8;
+ col->flags = DoRed | DoGreen | DoBlue;
+
+ if (!XAllocColor(v->display, v->colormap, col))
+ {
+ col->pixel = 0xffffffff;
+ }
+
+ if (g->use_xft == TTRUE)
+ {
+ XRenderColor xrcolor = { red: ((rgb >> 16) & 0xff) << 8,
+ green: ((rgb >> 8) & 0xff) << 8,
+ blue: (rgb & 0xff) << 8,
+ alpha: 0xffff };
+
+ (*g->xftiface.XftColorAllocValue)(v->display, v->visual, v->colormap,
+ &xrcolor, &v->coltab[v->ctidx].xftcolor);
+ }
+
+ v->ctidx++;
+ return (TVPEN) ret;
+
+#if 0
XColor color;
color.red = ((rgb >> 16) & 0xff) << 8;
color.green = ((rgb >> 8) & 0xff) << 8;
@@ -64,6 +92,8 @@ allocpen(TMOD_VIS *mod, VISUAL *v, TUINT
return (TVPEN) 0xffffffff;
}
return (TVPEN) color.pixel;
+#endif
+
}
/*****************************************************************************/
@@ -71,8 +101,20 @@ static TVOID
static TVOID
freepen(TMOD_VIS *mod, VISUAL *v, TVPEN pen)
{
+ GLOBAL *g = mod->vis_HostGlobal;
+
+ XFreeColors(v->display, v->colormap, &v->coltab[pen].xcolor.pixel, 1, 0);
+
+ if (g->use_xft == TTRUE)
+ {
+ (*g->xftiface.XftColorFree)(v->display, v->visual, v->colormap,
+ &v->coltab[pen].xftcolor);
+ }
+
+#if 0
unsigned long color = (unsigned long) pen;
XFreeColors(v->display, v->colormap, &color, 1, 0);
+#endif
}
/*****************************************************************************/
@@ -83,7 +125,8 @@ setbgpen(TMOD_VIS *mod, VISUAL *v, TVPEN
if (pen != v->bgpen)
{
XGCValues gcv;
- gcv.background = (long) pen;
+ //gcv.background = (long) pen;
+ gcv.background = v->coltab[pen].xcolor.pixel;
XChangeGC(v->display, v->gc, GCBackground, &gcv);
v->bgpen = pen;
}
@@ -94,6 +137,18 @@ static TVPEN
static TVPEN
setfgpen(TMOD_VIS *mod, VISUAL *v, TVPEN pen)
{
+ TVPEN oldpen = v->fgpen;
+ if (pen != oldpen)
+ {
+ XGCValues gcv;
+ gcv.foreground = v->coltab[pen].xcolor.pixel;
+ XChangeGC(v->display, v->gc, GCForeground, &gcv);
+ v->fgpen = pen;
+ if (v->coltab[oldpen].xcolor.pixel == 0xffffffff) oldpen = pen;
+ }
+ return oldpen;
+
+#if 0
TVPEN oldpen = v->fgpen;
if (pen != oldpen)
{
@@ -104,6 +159,7 @@ setfgpen(TMOD_VIS *mod, VISUAL *v, TVPEN
if (oldpen == (TVPEN) 0xffffffff) oldpen = pen;
}
return oldpen;
+#endif
}
/*****************************************************************************/
@@ -161,9 +217,8 @@ drawtext1(TMOD_VIS *mod, VISUAL *v, TINT
{
XftFont *f = ((struct FontNode *) v->curfont)->xftfont;
- if (v->draw && f)
- (*g->xftiface.XftDrawStringUtf8)(v->draw, &v->xftwhite, f, x, y + f->ascent,
- (FcChar8 *)text, len);
+ (*g->xftiface.XftDrawStringUtf8)(v->draw, &v->coltab[v->fgpen].xftcolor,
+ f, x, y + f->ascent, (FcChar8 *)text, len);
}
else
{
@@ -181,8 +236,14 @@ drawtext2(TMOD_VIS *mod, VISUAL *v, TINT
GLOBAL *g = mod->vis_HostGlobal;
if (g->use_xft == TTRUE)
{
- /* TODO: implement me! */
-
+ XftFont *f = ((struct FontNode *) v->curfont)->xftfont;
+ TINT w = vis_hosttextsize(mod, v->curfont, text);
+
+ (*g->xftiface.XftDrawRect)(v->draw, &v->coltab[v->bgpen].xftcolor,
+ x-1, y, w+2, f->ascent + f->descent);
+
+ (*g->xftiface.XftDrawStringUtf8)(v->draw, &v->coltab[v->fgpen].xftcolor,
+ f, x, y + f->ascent, (FcChar8 *)text, len);
}
else
{
@@ -1088,41 +1149,8 @@ vis_init(TMOD_VIS *mod)
if (g->display == TNULL) break;
g->screen = DefaultScreen(g->display);
- /* try to open libXft, if it fails, there
- will be no font antialiasing at all :( */
- g->libxfthandle = dlopen("libXft.so", RTLD_NOW);
- if (g->libxfthandle)
- {
- TINT i;
-
- /* clear any old error conditions */
- dlerror();
-
- for (i = 0; i < LIBXFT_NUMSYMS; i++)
- {
- ((void **) &g->xftiface)[i] = dlsym(g->libxfthandle, libxftsyms[i]);
- if (dlerror()) break;
- }
-
- #if 0
- if (i == LIBXFT_NUMSYMS)
- {
- g->use_xft = TTRUE;
- TDBPRINTF(10, ("libXft successfully initialised\n"));
- }
- else
- {
- /* missing symbols */
- TDBPRINTF(10, ("libXft initialisation failed\n"));
- TDBPRINTF(10, ("defaulting to xlib based font rendering\n"));
- }
- #endif
- }
- else
- {
- TDBPRINTF(10, ("failed to open libXft\n"));
- TDBPRINTF(10, ("defaulting to xlib based font rendering\n"));
- }
+
+ initlibxft(mod);
ftags[0].tti_Tag = TVisual_FontName;
ftags[0].tti_Value = (TTAG) FNT_DEFNAME;
@@ -1192,7 +1220,6 @@ vis_open(TMOD_VIS *mod)
for (;;)
{
TBOOL popup = TFALSE;
- XRenderColor white = { red:0xffff, green:0xffff, blue:0xffff, alpha:0x4fff };
XSetWindowAttributes swa;
TUINT swa_mask;
XGCValues gcv;
@@ -1211,8 +1238,9 @@ vis_open(TMOD_VIS *mod)
v->sizehints = XAllocSizeHints();
if (v->sizehints == TNULL) break;
- v->display = XOpenDisplay(TNULL);
- if (v->display == TNULL) break;
+ //v->display = XOpenDisplay(TNULL);
+ //if (v->display == TNULL) break;
+ v->display = g->display;
v->fd_display = ConnectionNumber(v->display);
if (pipe(pipefd) != 0) break;
@@ -1311,15 +1339,6 @@ vis_open(TMOD_VIS *mod)
XMapWindow(v->display, v->window);
- if (g->use_xft == TTRUE)
- {
- /* FIXME: quick hack! */
- (*g->xftiface.XftColorAllocValue)(v->display, v->visual, v->colormap,
- &white, &v->xftwhite);
- v->draw = (*g->xftiface.XftDrawCreate)(v->display, v->window,
- v->visual, v->colormap);
- if (!v->draw) break;
- }
#if 0
for (;;)
{
@@ -1330,8 +1349,27 @@ vis_open(TMOD_VIS *mod)
#endif
v->base_mask = swa.event_mask;
- v->bgpen = (TVPEN) 0xffffffff;
- v->fgpen = (TVPEN) 0xffffffff;
+
+ //v->bgpen = (TVPEN) 0xffffffff;
+ //v->fgpen = (TVPEN) 0xffffffff;
+ v->coltab[0].xcolor.pixel = 0xffffffff;
+ v->bgpen = (TVPEN) 0;
+ v->fgpen = (TVPEN) 0;
+ v->ctidx++;
+
+ if (g->use_xft == TTRUE)
+ {
+ /* init fallback xftcolor and xftdraw */
+ XRenderColor xrcolor = { red:0xffff, green:0xffff, blue:0xffff, alpha:0xffff };
+
+ (*g->xftiface.XftColorAllocValue)(v->display, v->visual, v->colormap,
+ &xrcolor, &v->coltab[0].xftcolor);
+
+ v->draw = (*g->xftiface.XftDrawCreate)(v->display, v->window,
+ v->visual, v->colormap);
+
+ if (!v->draw) break;
+ }
shm_available = TTRUE;
/* will be reverted on first attempt if untrue */
@@ -1366,8 +1404,8 @@ vis_close(TMOD_VIS *mod)
if (g->use_xft == TTRUE)
{
- (*g->xftiface.XftColorFree)(v->display, v->visual, v->colormap, &v->xftwhite);
- if (v->draw) (*g->xftiface.XftDrawDestroy)(v->draw);
+ if (v->draw)
+ (*g->xftiface.XftDrawDestroy)(v->draw);
}
if (v->window)
@@ -1378,8 +1416,8 @@ vis_close(TMOD_VIS *mod)
XDestroyWindow(v->display, v->window);
if (v->colormap)
XFreeColormap(v->display, v->colormap);
- if (v->display)
- XCloseDisplay(v->display);
+ //if (v->display)
+ // XCloseDisplay(v->display);
if (v->sizehints)
XFree(v->sizehints);
More information about the teklib-general
mailing list