Save subdirectory names in cache files to save time. This completely restores the original fontconfig API, BTW. Note that directories without fonts don't get a cache file; but then how many files would it have in that directory...
This commit is contained in:
parent
5e678e9459
commit
2304e38f9b
|
@ -203,7 +203,7 @@ scanDirs (FcStrList *list, FcConfig *config, char *program, FcBool force, FcBool
|
|||
printf ("caching, %d fonts, %d dirs\n",
|
||||
set->nfont, nsubdirs (subdirs));
|
||||
|
||||
if (!FcDirSave (set, dir))
|
||||
if (!FcDirSave (set, subdirs, dir))
|
||||
{
|
||||
fprintf (stderr, "Can't save cache in \"%s\"\n", dir);
|
||||
ret++;
|
||||
|
|
|
@ -447,7 +447,7 @@ FcDirScan (FcFontSet *set,
|
|||
FcBool force);
|
||||
|
||||
FcBool
|
||||
FcDirSave (FcFontSet *set, const FcChar8 *dir);
|
||||
FcDirSave (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir);
|
||||
|
||||
/* fcfreetype.c */
|
||||
FcPattern *
|
||||
|
|
|
@ -46,7 +46,7 @@ static FcBool
|
|||
FcDirCacheConsume (int fd, FcFontSet *set);
|
||||
|
||||
static FcBool
|
||||
FcDirCacheRead (FcFontSet * set, const FcChar8 *dir);
|
||||
FcDirCacheRead (FcFontSet * set, FcStrSet * dirs, const FcChar8 *dir);
|
||||
|
||||
static int
|
||||
FcCacheNextOffset(off_t w);
|
||||
|
@ -543,27 +543,11 @@ FcCacheReadDirs (FcConfig * config, FcGlobalCache * cache,
|
|||
free (file);
|
||||
continue;
|
||||
}
|
||||
d = opendir ((char *) dir);
|
||||
if (!d)
|
||||
{
|
||||
FcStrSetDestroy (subdirs);
|
||||
free (file);
|
||||
continue;
|
||||
}
|
||||
while ((e = readdir (d)))
|
||||
{
|
||||
if (e->d_name[0] != '.' && strlen (e->d_name) < FC_MAX_FILE_LEN)
|
||||
{
|
||||
strcpy ((char *) base, (char *) e->d_name);
|
||||
if (FcFileIsDir (file) && !FcStrSetAdd (subdirs, file))
|
||||
ret++;
|
||||
}
|
||||
}
|
||||
closedir (d);
|
||||
if (!FcDirCacheValid (dir) || !FcDirCacheRead (set, dir))
|
||||
if (!FcDirCacheValid (dir) || !FcDirCacheRead (set, subdirs, dir))
|
||||
{
|
||||
if (FcDebug () & FC_DBG_FONTSET)
|
||||
printf ("scan dir %s\n", dir);
|
||||
|
||||
FcDirScanConfig (set, subdirs, cache,
|
||||
config->blanks, dir, FcFalse, config);
|
||||
}
|
||||
|
@ -602,13 +586,14 @@ FcCacheRead (FcConfig *config, FcGlobalCache * cache)
|
|||
|
||||
/* read serialized state from the cache file */
|
||||
static FcBool
|
||||
FcDirCacheRead (FcFontSet * set, const FcChar8 *dir)
|
||||
FcDirCacheRead (FcFontSet * set, FcStrSet * dirs, const FcChar8 *dir)
|
||||
{
|
||||
FcChar8 *cache_file = FcStrPlus (dir, (FcChar8 *) "/" FC_DIR_CACHE_FILE);
|
||||
int fd;
|
||||
char * current_arch_machine_name;
|
||||
char candidate_arch_machine_name[9+MACHINE_SIGNATURE_SIZE];
|
||||
off_t current_arch_start = 0;
|
||||
FcChar8 subdirName[FC_MAX_FILE_LEN + 1 + 12 + 1];
|
||||
|
||||
if (!cache_file)
|
||||
goto bail;
|
||||
|
@ -627,6 +612,9 @@ FcDirCacheRead (FcFontSet * set, const FcChar8 *dir)
|
|||
sizeof (candidate_arch_machine_name)) == 0)
|
||||
goto bail1;
|
||||
|
||||
while (strlen(FcCacheReadString (fd, subdirName, sizeof (subdirName))) > 0)
|
||||
FcStrSetAdd (dirs, subdirName);
|
||||
|
||||
if (!FcDirCacheConsume (fd, set))
|
||||
goto bail1;
|
||||
|
||||
|
@ -635,7 +623,7 @@ FcDirCacheRead (FcFontSet * set, const FcChar8 *dir)
|
|||
return FcTrue;
|
||||
|
||||
bail1:
|
||||
close(fd);
|
||||
close (fd);
|
||||
bail:
|
||||
free (cache_file);
|
||||
return FcFalse;
|
||||
|
@ -710,10 +698,10 @@ FcDirCacheProduce (FcFontSet *set, FcCache *metadata)
|
|||
|
||||
/* write serialized state to the cache file */
|
||||
FcBool
|
||||
FcDirCacheWrite (FcFontSet *set, const FcChar8 *dir)
|
||||
FcDirCacheWrite (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir)
|
||||
{
|
||||
FcChar8 *cache_file = FcStrPlus (dir, (FcChar8 *) "/" FC_DIR_CACHE_FILE);
|
||||
int fd;
|
||||
int fd, i;
|
||||
FcCache metadata;
|
||||
off_t current_arch_start = 0, truncate_to;
|
||||
char * current_arch_machine_name, * header;
|
||||
|
@ -763,6 +751,10 @@ FcDirCacheWrite (FcFontSet *set, const FcChar8 *dir)
|
|||
if (!FcCacheWriteString (fd, header))
|
||||
goto bail1;
|
||||
|
||||
for (i = 0; i < dirs->size; i++)
|
||||
FcCacheWriteString (fd, dirs->strs[i]);
|
||||
FcCacheWriteString (fd, "");
|
||||
|
||||
write (fd, &metadata, sizeof(FcCache));
|
||||
lseek (fd, FcCacheNextOffset (lseek(fd, 0, SEEK_END)), SEEK_SET);
|
||||
write (fd, current_dir_block, metadata.count);
|
||||
|
|
|
@ -212,7 +212,7 @@ FcDirScan (FcFontSet *set,
|
|||
}
|
||||
|
||||
FcBool
|
||||
FcDirSave (FcFontSet *set, const FcChar8 *dir)
|
||||
FcDirSave (FcFontSet *set, FcStrSet * dirs, const FcChar8 *dir)
|
||||
{
|
||||
return FcDirCacheWrite (set, dir);
|
||||
return FcDirCacheWrite (set, dirs, dir);
|
||||
}
|
||||
|
|
|
@ -442,7 +442,7 @@ FcFontSet *
|
|||
FcCacheRead (FcConfig *config, FcGlobalCache * cache);
|
||||
|
||||
FcBool
|
||||
FcDirCacheWrite (FcFontSet *set, const FcChar8 *dir);
|
||||
FcDirCacheWrite (FcFontSet *set, FcStrSet * dirs, const FcChar8 *dir);
|
||||
|
||||
int
|
||||
FcCacheBankToIndex (int bank);
|
||||
|
|
Loading…
Reference in New Issue