Imported Upstream version 2.13.1
[platform/upstream/fontconfig.git] / src / fcdir.c
index fd62a34..93f220c 100644 (file)
@@ -23,9 +23,6 @@
  */
 
 #include "fcint.h"
-#include "fcftint.h"
-#include <ft2build.h>
-#include FT_FREETYPE_H
 #include <dirent.h>
 
 FcBool
@@ -64,51 +61,35 @@ FcFileIsFile (const FcChar8 *file)
 
 static FcBool
 FcFileScanFontConfig (FcFontSet                *set,
-                     FcBlanks          *blanks,
                      const FcChar8     *file,
                      FcConfig          *config)
 {
-    FT_Library ftLibrary;
-    FT_Face    face;
-    FcPattern  *font;
+    int                i;
     FcBool     ret = FcTrue;
-    int                num_faces = 0;
-    int                num_instances = 0;
-    int                face_num = 0;
-    int                instance_num = 0;
-    int                id;
+    int                old_nfont = set->nfont;
     const FcChar8 *sysroot = FcConfigGetSysRoot (config);
 
-    if (FT_Init_FreeType (&ftLibrary))
+    if (FcDebug () & FC_DBG_SCAN)
+    {
+       printf ("\tScanning file %s...", file);
+       fflush (stdout);
+    }
+
+    if (!FcFreeTypeQueryAll (file, -1, NULL, NULL, set))
        return FcFalse;
 
-    do
-    {
-       font = 0;
-       /*
-        * Nothing in the cache, scan the file
-        */
-       if (FcDebug () & FC_DBG_SCAN)
-       {
-           printf ("\tScanning file %s...", file);
-           fflush (stdout);
-       }
+    if (FcDebug () & FC_DBG_SCAN)
+       printf ("done\n");
 
-       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);
+    for (i = old_nfont; i < set->nfont; i++)
+    {
+       FcPattern *font = set->fonts[i];
 
-       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 (font && sysroot)
+       if (sysroot)
        {
            size_t len = strlen ((const char *)sysroot);
            FcChar8 *f = NULL;
@@ -130,43 +111,15 @@ FcFileScanFontConfig (FcFontSet           *set,
        /*
         * Edit pattern with user-defined rules
         */
-       if (font && config && !FcConfigSubstitute (config, font, FcMatchScan))
-       {
-           FcPatternDestroy (font);
-           font = NULL;
+       if (config && !FcConfigSubstitute (config, font, FcMatchScan))
            ret = FcFalse;
-       }
 
-       /*
-        * Add the font
-        */
-       if (font)
+       if (FcDebug() & FC_DBG_SCANV)
        {
-           if (FcDebug() & FC_DBG_SCANV)
-           {
-               printf ("Final font pattern:\n");
-               FcPatternPrint (font);
-           }
-           if (!FcFontSetAdd (set, font))
-           {
-               FcPatternDestroy (font);
-               font = NULL;
-               ret = FcFalse;
-           }
-       }
-       else
-           ret = FcFalse;
-
-       if (instance_num < num_instances)
-           instance_num++;
-       else
-       {
-           face_num++;
-           instance_num = 0;
+           printf ("Final font pattern:\n");
+           FcPatternPrint (font);
        }
-    } while (font && ret && face_num < num_faces);
-
-    FT_Done_FreeType (ftLibrary);
+    }
 
     return ret;
 }
@@ -174,7 +127,6 @@ FcFileScanFontConfig (FcFontSet             *set,
 FcBool
 FcFileScanConfig (FcFontSet    *set,
                  FcStrSet      *dirs,
-                 FcBlanks      *blanks,
                  const FcChar8 *file,
                  FcConfig      *config)
 {
@@ -201,7 +153,7 @@ FcFileScanConfig (FcFontSet *set,
     else
     {
        if (set)
-           return FcFileScanFontConfig (set, blanks, file, config);
+           return FcFileScanFontConfig (set, file, config);
        else
            return FcTrue;
     }
@@ -211,11 +163,11 @@ FcBool
 FcFileScan (FcFontSet      *set,
            FcStrSet        *dirs,
            FcFileCache     *cache FC_UNUSED,
-           FcBlanks        *blanks,
+           FcBlanks        *blanks FC_UNUSED,
            const FcChar8   *file,
            FcBool          force FC_UNUSED)
 {
-    return FcFileScanConfig (set, dirs, blanks, file, FcConfigGetCurrent ());
+    return FcFileScanConfig (set, dirs, file, FcConfigGetCurrent ());
 }
 
 /*
@@ -230,7 +182,6 @@ cmpstringp(const void *p1, const void *p2)
 FcBool
 FcDirScanConfig (FcFontSet     *set,
                 FcStrSet       *dirs,
-                FcBlanks       *blanks,
                 const FcChar8  *dir,
                 FcBool         force, /* XXX unused */
                 FcConfig       *config)
@@ -249,9 +200,6 @@ FcDirScanConfig (FcFontSet  *set,
     if (!set && !dirs)
        return FcTrue;
 
-    if (!blanks)
-       blanks = FcConfigGetBlanks (config);
-
     /* freed below */
     file = (FcChar8 *) malloc (strlen ((char *) dir) + 1 + FC_MAX_FILE_LEN + 1);
     if (!file) {
@@ -302,7 +250,7 @@ FcDirScanConfig (FcFontSet  *set,
      * Scan file files to build font patterns
      */
     for (i = 0; i < files->num; i++)
-       FcFileScanConfig (set, dirs, blanks, files->strs[i], config);
+       FcFileScanConfig (set, dirs, files->strs[i], config);
 
 bail2:
     FcStrSetDestroy (files);
@@ -318,15 +266,15 @@ bail:
 FcBool
 FcDirScan (FcFontSet       *set,
           FcStrSet         *dirs,
-          FcFileCache      *cache, /* XXX unused */
-          FcBlanks         *blanks,
+          FcFileCache      *cache FC_UNUSED,
+          FcBlanks         *blanks FC_UNUSED,
           const FcChar8    *dir,
-          FcBool           force /* XXX unused */)
+          FcBool           force FC_UNUSED)
 {
     if (cache || !force)
        return FcFalse;
 
-    return FcDirScanConfig (set, dirs, blanks, dir, force, FcConfigGetCurrent ());
+    return FcDirScanConfig (set, dirs, dir, force, FcConfigGetCurrent ());
 }
 
 /*
@@ -341,7 +289,9 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config)
     struct stat                dir_stat;
     const FcChar8      *sysroot = FcConfigGetSysRoot (config);
     FcChar8            *d;
+#ifndef _WIN32
     int                        fd = -1;
+#endif
 
     if (sysroot)
        d = FcStrBuildFilename (sysroot, dir, NULL);
@@ -362,11 +312,13 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config)
     if (!dirs)
        goto bail1;
 
+#ifndef _WIN32
     fd = FcDirCacheLock (dir, config);
+#endif
     /*
      * Scan the dir
      */
-    if (!FcDirScanConfig (set, dirs, NULL, d, FcTrue, config))
+    if (!FcDirScanConfig (set, dirs, d, FcTrue, config))
        goto bail2;
 
     /*
@@ -382,7 +334,9 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config)
     FcDirCacheWrite (cache, config);
 
  bail2:
+#ifndef _WIN32
     FcDirCacheUnlock (fd);
+#endif
     FcStrSetDestroy (dirs);
  bail1:
     FcFontSetDestroy (set);
@@ -401,7 +355,9 @@ FcDirCacheRescan (const FcChar8 *dir, FcConfig *config)
     FcStrSet *dirs;
     const FcChar8 *sysroot = FcConfigGetSysRoot (config);
     FcChar8 *d = NULL;
+#ifndef _WIN32
     int fd = -1;
+#endif
 
     cache = FcDirCacheLoad (dir, config, NULL);
     if (!cache)
@@ -417,11 +373,13 @@ FcDirCacheRescan (const FcChar8 *dir, FcConfig *config)
     if (!dirs)
        goto bail;
 
+#ifndef _WIN32
     fd = FcDirCacheLock (dir, config);
+#endif
     /*
      * Scan the dir
      */
-    if (!FcDirScanConfig (NULL, dirs, NULL, d, FcTrue, config))
+    if (!FcDirScanConfig (NULL, dirs, d, FcTrue, config))
        goto bail1;
     /*
      * Rebuild the cache object
@@ -436,7 +394,9 @@ FcDirCacheRescan (const FcChar8 *dir, FcConfig *config)
     FcDirCacheWrite (new, config);
 
 bail1:
+#ifndef _WIN32
     FcDirCacheUnlock (fd);
+#endif
     FcStrSetDestroy (dirs);
 bail:
     if (d)
@@ -453,6 +413,7 @@ FcDirCacheRead (const FcChar8 *dir, FcBool force, FcConfig *config)
 {
     FcCache            *cache = NULL;
 
+    FcDirCacheCreateUUID ((FcChar8 *) dir, FcFalse, config);
     /* Try to use existing cache file */
     if (!force)
        cache = FcDirCacheLoad (dir, config, NULL);
@@ -460,6 +421,13 @@ FcDirCacheRead (const FcChar8 *dir, FcBool force, FcConfig *config)
     /* Not using existing cache file, construct new cache */
     if (!cache)
        cache = FcDirCacheScan (dir, config);
+    if (cache)
+    {
+       FcFontSet *fs = FcCacheSet (cache);
+
+       if (cache->dirs_count == 0 && (!fs || fs->nfont == 0))
+           FcDirCacheDeleteUUID (dir, config);
+    }
 
     return cache;
 }