*/
#include "fcint.h"
+#include "fcftint.h"
+#include <ft2build.h>
+#include FT_FREETYPE_H
#include <dirent.h>
FcBool
const FcChar8 *file,
FcConfig *config)
{
+ FT_Library ftLibrary;
+ FT_Face face;
FcPattern *font;
FcBool ret = FcTrue;
+ int num_faces = 0;
+ int num_instances = 0;
+ int face_num = 0;
+ int instance_num = 0;
int id;
- int count = 0;
const FcChar8 *sysroot = FcConfigGetSysRoot (config);
- id = 0;
+ if (FT_Init_FreeType (&ftLibrary))
+ return FcFalse;
+
do
{
font = 0;
printf ("\tScanning file %s...", file);
fflush (stdout);
}
- font = FcFreeTypeQuery (file, id, blanks, &count);
+
+ id = ((instance_num << 16) + face_num);
+ if (FT_New_Face (ftLibrary, (char *) file, id, &face))
+ return FcFalse;
+ num_faces = face->num_faces;
+ num_instances = face->style_flags >> 16;
+ font = FcFreeTypeQueryFace (face, file, id, blanks);
+ FT_Done_Face (face);
+
if (FcDebug () & FC_DBG_SCAN)
printf ("done\n");
/*
* Get rid of sysroot here so that targeting scan rule may contains FC_FILE pattern
* and they should usually expect without sysroot.
*/
- if (sysroot)
+ if (font && sysroot)
{
size_t len = strlen ((const char *)sysroot);
FcChar8 *f = NULL;
ret = FcFalse;
}
}
- else if (font)
- FcPatternDestroy (font);
- id++;
- } while (font && ret && id < count);
+ else
+ ret = FcFalse;
+
+ if (instance_num < num_instances)
+ instance_num++;
+ else
+ {
+ face_num++;
+ instance_num = 0;
+ }
+ } while (font && ret && face_num < num_faces);
+
+ FT_Done_FreeType (ftLibrary);
+
return ret;
}
FcBlanks *blanks,
const FcChar8 *dir,
FcBool force, /* XXX unused */
- FcConfig *config,
- FcBool scanOnly)
+ FcConfig *config)
{
DIR *d;
struct dirent *e;
if (!set && !dirs)
return FcTrue;
- if (!blanks && !scanOnly)
+ if (!blanks)
blanks = FcConfigGetBlanks (config);
/* freed below */
goto bail;
}
- files = FcStrSetCreate ();
+ files = FcStrSetCreateEx (FCSS_ALLOW_DUPLICATES | FCSS_GROW_BY_64);
if (!files)
{
ret = FcFalse;
* Scan file files to build font patterns
*/
for (i = 0; i < files->num; i++)
- {
- if (scanOnly)
- {
- if (FcFileIsDir (files->strs[i]))
- FcFileScanConfig (NULL, dirs, NULL, files->strs[i], config);
- }
- else
- {
- FcFileScanConfig (set, dirs, blanks, files->strs[i], config);
- }
- }
+ FcFileScanConfig (set, dirs, blanks, files->strs[i], config);
bail2:
FcStrSetDestroy (files);
if (cache || !force)
return FcFalse;
- return FcDirScanConfig (set, dirs, blanks, dir, force, FcConfigGetCurrent (), FcFalse);
-}
-
-FcBool
-FcDirScanOnly (FcStrSet *dirs,
- const FcChar8 *dir,
- FcConfig *config)
-{
- return FcDirScanConfig (NULL, dirs, NULL, dir, FcTrue, config, FcTrue);
+ return FcDirScanConfig (set, dirs, blanks, dir, force, FcConfigGetCurrent ());
}
/*
struct stat dir_stat;
const FcChar8 *sysroot = FcConfigGetSysRoot (config);
FcChar8 *d;
+ int fd = -1;
if (sysroot)
d = FcStrBuildFilename (sysroot, dir, NULL);
if (!set)
goto bail;
- dirs = FcStrSetCreate ();
+ dirs = FcStrSetCreateEx (FCSS_GROW_BY_64);
if (!dirs)
goto bail1;
+ fd = FcDirCacheLock (dir, config);
/*
* Scan the dir
*/
- if (!FcDirScanConfig (set, dirs, NULL, d, FcTrue, config, FcFalse))
+ if (!FcDirScanConfig (set, dirs, NULL, d, FcTrue, config))
goto bail2;
/*
FcDirCacheWrite (cache, config);
bail2:
+ FcDirCacheUnlock (fd);
FcStrSetDestroy (dirs);
bail1:
FcFontSetDestroy (set);
FcStrSet *dirs;
const FcChar8 *sysroot = FcConfigGetSysRoot (config);
FcChar8 *d = NULL;
+ int fd = -1;
cache = FcDirCacheLoad (dir, config, NULL);
if (!cache)
d = FcStrdup (dir);
if (FcStatChecksum (d, &dir_stat) < 0)
goto bail;
- dirs = FcStrSetCreate ();
+ dirs = FcStrSetCreateEx (FCSS_GROW_BY_64);
if (!dirs)
goto bail;
+ fd = FcDirCacheLock (dir, config);
/*
* Scan the dir
*/
- if (!FcDirScanConfig (NULL, dirs, NULL, d, FcTrue, config, FcFalse))
+ if (!FcDirScanConfig (NULL, dirs, NULL, d, FcTrue, config))
goto bail1;
/*
* Rebuild the cache object
FcDirCacheWrite (new, config);
bail1:
+ FcDirCacheUnlock (fd);
FcStrSetDestroy (dirs);
bail:
if (d)