gdi32: Cache font enum info.
Cache the enum info so that repeated calls to EnumFontFamiles and such does not have to repeatedly load the font file.
This commit is contained in:
parent
67271dcf3b
commit
3c9e7aba75
|
@ -259,6 +259,11 @@ typedef struct tagFace {
|
||||||
Bitmap_Size size; /* set if face is a bitmap */
|
Bitmap_Size size; /* set if face is a bitmap */
|
||||||
BOOL external; /* TRUE if we should manually add this font to the registry */
|
BOOL external; /* TRUE if we should manually add this font to the registry */
|
||||||
struct tagFamily *family;
|
struct tagFamily *family;
|
||||||
|
/* Cached data for Enum */
|
||||||
|
BOOL cache_valid;
|
||||||
|
ENUMLOGFONTEXW elf;
|
||||||
|
NEWTEXTMETRICEXW ntm;
|
||||||
|
DWORD type;
|
||||||
} Face;
|
} Face;
|
||||||
|
|
||||||
typedef struct tagFamily {
|
typedef struct tagFamily {
|
||||||
|
@ -1234,6 +1239,7 @@ static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
face = HeapAlloc(GetProcessHeap(), 0, sizeof(*face));
|
face = HeapAlloc(GetProcessHeap(), 0, sizeof(*face));
|
||||||
|
face->cache_valid = FALSE;
|
||||||
list_add_tail(&family->faces, &face->entry);
|
list_add_tail(&family->faces, &face->entry);
|
||||||
face->StyleName = StyleW;
|
face->StyleName = StyleW;
|
||||||
if (file)
|
if (file)
|
||||||
|
@ -3253,6 +3259,15 @@ static void GetEnumStructs(Face *face, LPENUMLOGFONTEXW pelf,
|
||||||
GdiFont *font = alloc_font();
|
GdiFont *font = alloc_font();
|
||||||
LONG width, height;
|
LONG width, height;
|
||||||
|
|
||||||
|
if (face->cache_valid)
|
||||||
|
{
|
||||||
|
TRACE("Cached\n");
|
||||||
|
memcpy(pelf,&face->elf,sizeof(ENUMLOGFONTEXW));
|
||||||
|
memcpy(pntm,&face->ntm,sizeof(NEWTEXTMETRICEXW));
|
||||||
|
*ptype = face->type;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(face->scalable) {
|
if(face->scalable) {
|
||||||
height = 100;
|
height = 100;
|
||||||
width = 0;
|
width = 0;
|
||||||
|
@ -3348,6 +3363,11 @@ static void GetEnumStructs(Face *face, LPENUMLOGFONTEXW pelf,
|
||||||
|
|
||||||
pelf->elfScript[0] = '\0'; /* This will get set in WineEngEnumFonts */
|
pelf->elfScript[0] = '\0'; /* This will get set in WineEngEnumFonts */
|
||||||
|
|
||||||
|
memcpy(&face->elf,pelf,sizeof(ENUMLOGFONTEXW));
|
||||||
|
memcpy(&face->ntm,pntm,sizeof(NEWTEXTMETRICEXW));
|
||||||
|
face->type = *ptype;
|
||||||
|
face->cache_valid = TRUE;
|
||||||
|
|
||||||
free_font(font);
|
free_font(font);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue