[varfonts] Share lang across named-instances

Makes VotoSerifGX scanning another 40% faster...  Down to 36ms now.
This commit is contained in:
Behdad Esfahbod 2017-09-27 18:55:50 -04:00
parent 161c738547
commit 01f781a9a4
3 changed files with 34 additions and 10 deletions

View File

@ -1189,7 +1189,8 @@ static FcPattern *
FcFreeTypeQueryFaceInternal (const FT_Face face, FcFreeTypeQueryFaceInternal (const FT_Face face,
const FcChar8 *file, const FcChar8 *file,
unsigned int id, unsigned int id,
FcCharSet *cs) FcCharSet **cs_share,
FcLangSet **ls_share)
{ {
FcPattern *pat; FcPattern *pat;
int slant = -1; int slant = -1;
@ -1200,7 +1201,8 @@ FcFreeTypeQueryFaceInternal (const FT_Face face,
FcBool variable_weight = FcFalse; FcBool variable_weight = FcFalse;
FcBool variable_width = FcFalse; FcBool variable_width = FcFalse;
FcBool variable_size = FcFalse; FcBool variable_size = FcFalse;
FcLangSet *ls; FcCharSet *cs;
FcLangSet *ls;
#if 0 #if 0
FcChar8 *family = 0; FcChar8 *family = 0;
#endif #endif
@ -1938,10 +1940,14 @@ FcFreeTypeQueryFaceInternal (const FT_Face face,
/* /*
* Compute the unicode coverage for the font * Compute the unicode coverage for the font
*/ */
if (cs) if (cs_share && *cs_share)
cs = FcCharSetCopy (cs); cs = FcCharSetCopy (*cs_share);
else else
{
cs = FcFreeTypeCharSet (face, NULL); cs = FcFreeTypeCharSet (face, NULL);
if (cs_share)
*cs_share = FcCharSetCopy (cs);
}
if (!cs) if (!cs)
goto bail1; goto bail1;
@ -1985,7 +1991,14 @@ FcFreeTypeQueryFaceInternal (const FT_Face face,
if (!symbol) if (!symbol)
{ {
ls = FcFreeTypeLangSet (cs, exclusiveLang); if (ls_share && *ls_share)
ls = FcLangSetCopy (*ls_share);
else
{
ls = FcFreeTypeLangSet (cs, exclusiveLang);
if (ls_share)
*ls_share = FcLangSetCopy (ls);
}
if (!ls) if (!ls)
goto bail2; goto bail2;
} }
@ -2061,7 +2074,7 @@ FcFreeTypeQueryFace (const FT_Face face,
unsigned int id, unsigned int id,
FcBlanks *blanks FC_UNUSED) FcBlanks *blanks FC_UNUSED)
{ {
return FcFreeTypeQueryFaceInternal (face, file, id, NULL); return FcFreeTypeQueryFaceInternal (face, file, id, NULL, NULL);
} }
FcPattern * FcPattern *
@ -2083,7 +2096,7 @@ FcFreeTypeQuery(const FcChar8 *file,
if (count) if (count)
*count = face->num_faces; *count = face->num_faces;
pat = FcFreeTypeQueryFaceInternal (face, file, id, NULL); pat = FcFreeTypeQueryFaceInternal (face, file, id, NULL, NULL);
FT_Done_Face (face); FT_Done_Face (face);
bail: bail:
@ -2101,6 +2114,7 @@ FcFreeTypeQueryAll(const FcChar8 *file,
FT_Face face = NULL; FT_Face face = NULL;
FT_Library ftLibrary = NULL; FT_Library ftLibrary = NULL;
FcCharSet *cs = NULL; FcCharSet *cs = NULL;
FcLangSet *ls = NULL;
FT_MM_Var *mm_var = NULL; FT_MM_Var *mm_var = NULL;
FcBool index_set = id != (unsigned int) -1; FcBool index_set = id != (unsigned int) -1;
unsigned int set_face_num = index_set ? id & 0xFFFF : 0; unsigned int set_face_num = index_set ? id & 0xFFFF : 0;
@ -2120,7 +2134,6 @@ FcFreeTypeQueryAll(const FcChar8 *file,
if (FT_New_Face (ftLibrary, (const char *) file, face_num, &face)) if (FT_New_Face (ftLibrary, (const char *) file, face_num, &face))
goto bail; goto bail;
cs = FcFreeTypeCharSet (face, blanks);
num_faces = face->num_faces; num_faces = face->num_faces;
num_instances = face->style_flags >> 16; num_instances = face->style_flags >> 16;
@ -2160,7 +2173,7 @@ FcFreeTypeQueryAll(const FcChar8 *file,
} }
id = ((instance_num << 16) + face_num); id = ((instance_num << 16) + face_num);
pat = FcFreeTypeQueryFaceInternal (face, (const FcChar8 *) file, id, cs); pat = FcFreeTypeQueryFaceInternal (face, (const FcChar8 *) file, id, &cs, &ls);
if (pat) if (pat)
{ {
@ -2179,6 +2192,8 @@ skip:
instance_num = 0x8000; /* variable font */ instance_num = 0x8000; /* variable font */
else else
{ {
FcLangSetDestroy (ls);
ls = NULL;
FcCharSetDestroy (cs); FcCharSetDestroy (cs);
cs = NULL; cs = NULL;
FT_Done_Face (face); FT_Done_Face (face);
@ -2189,11 +2204,11 @@ skip:
if (FT_New_Face (ftLibrary, (const char *) file, face_num, &face)) if (FT_New_Face (ftLibrary, (const char *) file, face_num, &face))
break; break;
cs = FcFreeTypeCharSet (face, blanks);
} }
} while (!err && (!index_set || face_num == set_face_num) && face_num < num_faces); } while (!err && (!index_set || face_num == set_face_num) && face_num < num_faces);
bail: bail:
FcLangSetDestroy (ls);
FcCharSetDestroy (cs); FcCharSetDestroy (cs);
if (face) if (face)
FT_Done_Face (face); FT_Done_Face (face);

View File

@ -485,6 +485,9 @@ FcLangSetCreate (void)
void void
FcLangSetDestroy (FcLangSet *ls) FcLangSetDestroy (FcLangSet *ls)
{ {
if (!ls)
return;
if (ls->extra) if (ls->extra)
FcStrSetDestroy (ls->extra); FcStrSetDestroy (ls->extra);
free (ls); free (ls);
@ -495,6 +498,9 @@ FcLangSetCopy (const FcLangSet *ls)
{ {
FcLangSet *new; FcLangSet *new;
if (!ls)
return NULL;
new = FcLangSetCreate (); new = FcLangSetCreate ();
if (!new) if (!new)
goto bail0; goto bail0;

View File

@ -1113,6 +1113,9 @@ FcPatternDuplicate (const FcPattern *orig)
int i; int i;
FcValueListPtr l; FcValueListPtr l;
if (!orig)
return NULL;
new = FcPatternCreate (); new = FcPatternCreate ();
if (!new) if (!new)
goto bail0; goto bail0;