From 14fe323019bdbf668d3c2f7beaefb59bbf1e4c96 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Thu, 29 May 2003 03:15:21 +0000 Subject: [PATCH] set default values in the patterns myself, especially important for dpi --- glft/font.c | 51 +++++++++++++++++++++++++++++++++++++++++++++------ glft/font.h | 4 ++++ glft/glft.h | 3 ++- glft/test.c | 12 ++++++++---- 4 files changed, 59 insertions(+), 11 deletions(-) diff --git a/glft/font.c b/glft/font.c index a48f702d..beba1544 100644 --- a/glft/font.c +++ b/glft/font.c @@ -14,6 +14,10 @@ struct GHashTable *glyph_map = NULL; #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; @@ -21,7 +25,40 @@ void dest_glyph_map_value(gpointer key, gpointer val, gpointer data) 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; @@ -37,7 +74,7 @@ struct GlftFont *GlftFontOpen(const char *name) /* 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 "); @@ -51,6 +88,8 @@ struct GlftFont *GlftFontOpen(const char *name) } font = malloc(sizeof(struct GlftFont)); + font->display = d; + font->screen = screen; font->pat = match; font->ftflags = FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP; @@ -131,7 +170,7 @@ struct GlftFont *GlftFontOpen(const char *name) switch (FcPatternGetBool(match, FC_MINSPACE, 0, &font->minspace)) { case FcResultNoMatch: - font->minspace = FcFalse; + font->minspace = FcTrue; break; case FcResultMatch: break; @@ -157,14 +196,14 @@ struct GlftFont *GlftFontOpen(const char *name) 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; diff --git a/glft/font.h b/glft/font.h index 7f6ef746..5b149561 100644 --- a/glft/font.h +++ b/glft/font.h @@ -7,9 +7,13 @@ #include FT_FREETYPE_H #include +#include #include struct GlftFont { + Display *display; + int screen; + FcPattern *pat; FcCharSet *chars; diff --git a/glft/glft.h b/glft/glft.h index 9adfe8e6..55834539 100644 --- a/glft/glft.h +++ b/glft/glft.h @@ -2,6 +2,7 @@ #define __glft_h__ #include +#include /* initialization */ @@ -11,7 +12,7 @@ FcBool GlftInit(); struct GlftFont; -struct GlftFont *GlftFontOpen(const char *name); +struct GlftFont *GlftFontOpen(Display *d, int screen, const char *name); void GlftFontClose(struct GlftFont *font); diff --git a/glft/test.c b/glft/test.c index 58f901f7..296d8bc6 100644 --- a/glft/test.c +++ b/glft/test.c @@ -11,6 +11,7 @@ #include "render.h" #include #include +#include static int x_error_handler(Display * disp, XErrorEvent * error) { @@ -47,12 +48,14 @@ int main(int argc, char **argv) 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, @@ -74,8 +77,8 @@ int main(int argc, char **argv) - 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); @@ -87,6 +90,7 @@ int main(int argc, char **argv) glOrtho(0, W, -100, H+100, 0, 10); glMatrixMode(GL_MODELVIEW); glEnable(GL_LINE_SMOOTH); + glLineWidth(0.5); quit = 0; while (!quit) { -- 2.34.1