set default values in the patterns myself, especially important for dpi
authorDana Jansens <danakj@orodu.net>
Thu, 29 May 2003 03:15:21 +0000 (03:15 +0000)
committerDana Jansens <danakj@orodu.net>
Thu, 29 May 2003 03:15:21 +0000 (03:15 +0000)
glft/font.c
glft/font.h
glft/glft.h
glft/test.c

index a48f702d8ed24907be3f97d2dffd714d40a6f49a..beba1544fc0f465ee2440c31fa07a51da15c20ce 100644 (file)
@@ -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;
 
index 7f6ef746210b9e91944178b75138d3510fcc9612..5b149561f9b82b662ad04e4add5598a73e818cf3 100644 (file)
@@ -7,9 +7,13 @@
 #include FT_FREETYPE_H
 #include <fontconfig/fcfreetype.h>
 
+#include <X11/Xlib.h>
 #include <glib.h>
 
 struct GlftFont {
+    Display *display;
+    int screen;
+
     FcPattern *pat;
     FcCharSet *chars;
 
index 9adfe8e6a36601b3bf4e0c857b00972f6023466a..55834539665c7e5e2280c4eb2a6e4dc5a4b6546d 100644 (file)
@@ -2,6 +2,7 @@
 #define __glft_h__
 
 #include <fontconfig/fontconfig.h>
+#include <X11/Xlib.h>
 
 /* 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);
 
index 58f901f78ba5a5974e6219ecb0e7dcfa0e5c6cf1..296d8bc6b9a86d781a2b5f13e0aaf6aaead3901f 100644 (file)
@@ -11,6 +11,7 @@
 #include "render.h"
 #include <glib.h>
 #include <GL/glx.h>
+#include <assert.h>
 
 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) {