summaryrefslogtreecommitdiff
path: root/src/client/fontConfig.c
diff options
context:
space:
mode:
authorDusan Durech <dusan@debian.debian>2009-04-01 22:49:05 +0200
committerDusan Durech <dusan@debian.debian>2009-04-01 22:49:05 +0200
commit43a0c9e57cfdf03ce9e12dd64ce3825337dfb75b (patch)
treeceb30162405644459d3f1aaa08409034737be43e /src/client/fontConfig.c
parent285f01f09c226d23148f515e5262ab243f88befb (diff)
Support libfontconfig
Diffstat (limited to 'src/client/fontConfig.c')
-rw-r--r--src/client/fontConfig.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/client/fontConfig.c b/src/client/fontConfig.c
new file mode 100644
index 0000000..fcf77e2
--- /dev/null
+++ b/src/client/fontConfig.c
@@ -0,0 +1,136 @@
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fontconfig/fontconfig.h>
+
+#include "fontConfig.h"
+
+int fontconfig_init()
+{
+ int res;
+
+ res = FcInit();
+
+ if( res == 0 )
+ {
+ fprintf(stderr, "Can't init font config library\n");
+ return 1;
+ }
+
+ return 0;
+}
+
+font_config_t* fontconfig_find(char **arg)
+{
+ FcObjectSet *os;
+ FcFontSet *fs;
+ FcPattern *pat;
+ font_config_t *ret;
+ int i;
+
+ os = NULL;
+ ret = NULL;
+
+ for( i = 0 ; arg[i] != NULL ; i++ )
+ {
+ //printf("arg %s\n", arg[i]);
+
+ if( i == 0 )
+ {
+ pat = FcNameParse ((FcChar8 *) arg[i]);
+ }
+
+ if( os == NULL )
+ {
+ os = FcObjectSetCreate();
+ }
+
+ FcObjectSetAdd (os, arg[i]);
+ }
+
+ if( os == NULL )
+ {
+ os = FcObjectSetBuild (FC_FAMILY, FC_STYLE, (char *) 0);
+ }
+
+ fs = FcFontList (0, pat, os);
+ FcObjectSetDestroy(os);
+
+ if( pat != NULL )
+ {
+ FcPatternDestroy(pat);
+ }
+
+ if( fs != NULL )
+ {
+ int j;
+
+ ret = malloc( (fs->nfont+1) * sizeof(font_config_t) );
+
+ for( j = 0; j < fs->nfont ; j++ )
+ {
+ FcChar8 *font;
+ FcChar8 *file;
+
+ font = FcNameUnparse(fs->fonts[j]);
+
+ if( FcPatternGetString(fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch )
+ {
+ ret[j].path = strdup((char *)file);
+ }
+
+ ret[j].flag = strdup((char *)font);
+ free(font);
+ }
+
+ ret[fs->nfont].path = NULL;
+ ret[fs->nfont].flag = NULL;
+
+ FcFontSetDestroy(fs);
+ }
+
+ return ret;
+}
+
+void fontconfig_del_list(font_config_t *list)
+{
+ int i;
+
+ for( i = 0 ; list[i].path != NULL ; i++ )
+ {
+ free(list[i].path);
+ free(list[i].flag);
+ }
+
+ free(list);
+}
+
+int fontconfig_quit()
+{
+ FcFini();
+ return 0;
+}
+
+int fc_test_main(int argc, char **argv)
+{
+ char *arg[] = {":lang=he:outline=true", "family", "style", "weight", "file", NULL};
+ font_config_t *res;
+ int i;
+
+ fontconfig_init();
+
+ res = fontconfig_find(arg);
+
+ for( i = 0 ; res[i].path != NULL ; i++ )
+ {
+ printf("path=%s\nflag=%s\n\n", res[i].path, res[i].flag);
+ }
+
+ fontconfig_del_list(res);
+
+ fontconfig_quit();
+
+ return 0;
+}