#define TRUNC(x) ((x) >> 6)
#define ROUND(x) (((x)+32) & -64)
+#define GLFT_SHADOW "shadow"
+#define GLFT_SHADOW_OFFSET "shadowoffset"
+#define GLFT_SHADOW_ALPHA "shadowalpha"
+
void dest_glyph_map_value(gpointer key, gpointer val, gpointer data)
{
struct GlftGlyph *g = val;
free(g);
}
-struct GlftFont *GlftFontOpen(const char *name)
+static void GlftDefaultSubstitute(Display *d, int s, FcPattern *pat)
+{
+ FcValue v;
+ double dpi;
+
+ if (FcPatternGet(pat, FC_DPI, 0, &v) == FcResultNoMatch) {
+ dpi = DisplayHeight(d, s) * 25.4 / (double)DisplayHeightMM(d, s);
+ FcPatternAddDouble(pat, FC_DPI, dpi);
+ }
+ if (FcPatternGet(pat, FC_ANTIALIAS, 0, &v) == FcResultNoMatch)
+ FcPatternAddBool(pat, FC_ANTIALIAS, FcTrue);
+ if (FcPatternGet(pat, FC_HINTING, 0, &v) == FcResultNoMatch)
+ FcPatternAddBool(pat, FC_HINTING, FcTrue);
+ if (FcPatternGet(pat, FC_AUTOHINT, 0, &v) == FcResultNoMatch)
+ FcPatternAddBool(pat, FC_AUTOHINT, FcFalse);
+ if (FcPatternGet(pat, FC_GLOBAL_ADVANCE, 0, &v) == FcResultNoMatch)
+ FcPatternAddBool(pat, FC_GLOBAL_ADVANCE, FcTrue);
+ if (FcPatternGet(pat, FC_SPACING, 0, &v) == FcResultNoMatch)
+ FcPatternAddInteger(pat, FC_SPACING, FC_PROPORTIONAL);
+ if (FcPatternGet(pat, FC_MINSPACE, 0, &v) == FcResultNoMatch)
+ FcPatternAddBool(pat, FC_MINSPACE, FcTrue);
+ if (FcPatternGet(pat, FC_CHAR_WIDTH, 0, &v) == FcResultNoMatch)
+ FcPatternAddInteger(pat, FC_CHAR_WIDTH, 0);
+ if (FcPatternGet(pat, GLFT_SHADOW, 0, &v) == FcResultNoMatch)
+ FcPatternAddBool(pat, GLFT_SHADOW, FcFalse);
+ if (FcPatternGet(pat, GLFT_SHADOW_OFFSET, 0, &v) == FcResultNoMatch)
+ FcPatternAddInteger(pat, GLFT_SHADOW_OFFSET, 2);
+ if (FcPatternGet(pat, GLFT_SHADOW_ALPHA, 0, &v) == FcResultNoMatch)
+ FcPatternAddDouble(pat, GLFT_SHADOW_ALPHA, 0.5);
+
+ FcDefaultSubstitute(pat);
+}
+
+struct GlftFont *GlftFontOpen(Display *d, int screen, const char *name)
{
struct GlftFont *font;
FcPattern *pat, *match;
/* XXX read our extended attributes here? (if failing below..) */
FcConfigSubstitute(NULL, pat, FcMatchPattern);
- FcDefaultSubstitute(pat);
+ GlftDefaultSubstitute(d, screen, pat);
match = FcFontMatch(NULL, pat, &res);
printf("Pattern ");
}
font = malloc(sizeof(struct GlftFont));
+ font->display = d;
+ font->screen = screen;
font->pat = match;
font->ftflags = FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP;
switch (FcPatternGetBool(match, FC_MINSPACE, 0, &font->minspace)) {
case FcResultNoMatch:
- font->minspace = FcFalse;
+ font->minspace = FcTrue;
break;
case FcResultMatch:
break;
goto openfail0;
font->ftcharsize = (FT_F26Dot6) psize * 64;
- if (FcPatternGetBool(match, "shadow", 0, &font->shadow) != FcResultMatch)
+ if (FcPatternGetBool(match, GLFT_SHADOW, 0, &font->shadow) != FcResultMatch)
font->shadow = FcFalse;
- if (FcPatternGetInteger(match, "shadowoffset", 0, &font->shadow_offset) !=
+ if (FcPatternGetInteger(match,GLFT_SHADOW_OFFSET,0,&font->shadow_offset) !=
FcResultMatch)
font->shadow_offset = 2;
- if (FcPatternGetDouble(match, "shadowalpha", 0, &alpha) != FcResultMatch)
+ if (FcPatternGetDouble(match, GLFT_SHADOW_ALPHA,0,&alpha) != FcResultMatch)
alpha = 0.5;
font->shadow_alpha = (float)alpha;
#include "render.h"
#include <glib.h>
#include <GL/glx.h>
+#include <assert.h>
static int x_error_handler(Display * disp, XErrorEvent * error)
{
if (!GlftInit()) return 1;
- font = GlftFontOpen(argv[1]);
-
if (!(display = XOpenDisplay(NULL))) {
fprintf(stderr, "couldn't connect to X server in DISPLAY\n");
return EXIT_FAILURE;
}
+
+ font = GlftFontOpen(display, DefaultScreen(display), argv[1]);
+ assert(font);
+
XSetErrorHandler(x_error_handler);
win = XCreateWindow(display, RootWindow(display, DefaultScreen(display)),
X, Y, W, H, 0,
- chint.res_name = "rendertest";
- chint.res_class = "Rendertest";
+ chint.res_name = "glfttest";
+ chint.res_class = "Glfttest";
XSetClassHint(display, win, &chint);
delete_win = XInternAtom(display, "WM_DELETE_WINDOW", False);
glOrtho(0, W, -100, H+100, 0, 10);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_LINE_SMOOTH);
+ glLineWidth(0.5);
quit = 0;
while (!quit) {