gdiplus: Populate the installed font collection.
This commit is contained in:
parent
80dfd00530
commit
ef4d0d970d
|
@ -844,6 +844,7 @@ GpStatus WINGDIPAPI GdipNewPrivateFontCollection(GpFontCollection** fontCollecti
|
||||||
|
|
||||||
(*fontCollection)->FontFamilies = NULL;
|
(*fontCollection)->FontFamilies = NULL;
|
||||||
(*fontCollection)->count = 0;
|
(*fontCollection)->count = 0;
|
||||||
|
(*fontCollection)->allocated = 0;
|
||||||
return Ok;
|
return Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -930,14 +931,77 @@ GpStatus WINGDIPAPI GdipGetFontCollectionFamilyList(
|
||||||
return Ok;
|
return Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void free_installed_fonts(void)
|
||||||
|
{
|
||||||
|
while (installedFontCollection.count)
|
||||||
|
GdipDeleteFontFamily(installedFontCollection.FontFamilies[--installedFontCollection.count]);
|
||||||
|
HeapFree(GetProcessHeap(), 0, installedFontCollection.FontFamilies);
|
||||||
|
installedFontCollection.FontFamilies = NULL;
|
||||||
|
installedFontCollection.allocated = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static INT CALLBACK add_font_proc(const LOGFONTW *lfw, const TEXTMETRICW *ntm,
|
||||||
|
DWORD type, LPARAM lParam)
|
||||||
|
{
|
||||||
|
GpFontCollection* fonts = (GpFontCollection*)lParam;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* skip duplicates */
|
||||||
|
for (i=0; i<fonts->count; i++)
|
||||||
|
if (strcmpiW(lfw->lfFaceName, fonts->FontFamilies[i]->FamilyName) == 0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (fonts->allocated == fonts->count)
|
||||||
|
{
|
||||||
|
INT new_alloc_count = fonts->allocated+50;
|
||||||
|
GpFontFamily** new_family_list = HeapAlloc(GetProcessHeap(), 0, new_alloc_count*sizeof(void*));
|
||||||
|
|
||||||
|
if (!new_family_list)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
memcpy(new_family_list, fonts->FontFamilies, fonts->count*sizeof(void*));
|
||||||
|
HeapFree(GetProcessHeap(), 0, fonts->FontFamilies);
|
||||||
|
fonts->FontFamilies = new_family_list;
|
||||||
|
fonts->allocated = new_alloc_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GdipCreateFontFamilyFromName(lfw->lfFaceName, NULL, &fonts->FontFamilies[fonts->count]) == Ok)
|
||||||
|
fonts->count++;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
GpStatus WINGDIPAPI GdipNewInstalledFontCollection(
|
GpStatus WINGDIPAPI GdipNewInstalledFontCollection(
|
||||||
GpFontCollection** fontCollection)
|
GpFontCollection** fontCollection)
|
||||||
{
|
{
|
||||||
FIXME("stub: %p\n",fontCollection);
|
TRACE("(%p)\n",fontCollection);
|
||||||
|
|
||||||
if (!fontCollection)
|
if (!fontCollection)
|
||||||
return InvalidParameter;
|
return InvalidParameter;
|
||||||
|
|
||||||
|
if (installedFontCollection.count == 0)
|
||||||
|
{
|
||||||
|
HDC hdc;
|
||||||
|
LOGFONTW lfw;
|
||||||
|
|
||||||
|
hdc = GetDC(0);
|
||||||
|
|
||||||
|
lfw.lfCharSet = DEFAULT_CHARSET;
|
||||||
|
lfw.lfFaceName[0] = 0;
|
||||||
|
lfw.lfPitchAndFamily = 0;
|
||||||
|
|
||||||
|
if (!EnumFontFamiliesExW(hdc, &lfw, add_font_proc, (LPARAM)&installedFontCollection, 0))
|
||||||
|
{
|
||||||
|
free_installed_fonts();
|
||||||
|
ReleaseDC(0, hdc);
|
||||||
|
return OutOfMemory;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReleaseDC(0, hdc);
|
||||||
|
}
|
||||||
|
|
||||||
*fontCollection = &installedFontCollection;
|
*fontCollection = &installedFontCollection;
|
||||||
|
|
||||||
return Ok;
|
return Ok;
|
||||||
|
|
|
@ -64,6 +64,10 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID reserved)
|
||||||
case DLL_PROCESS_ATTACH:
|
case DLL_PROCESS_ATTACH:
|
||||||
DisableThreadLibraryCalls( hinst );
|
DisableThreadLibraryCalls( hinst );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DLL_PROCESS_DETACH:
|
||||||
|
free_installed_fonts();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,8 @@ extern void calc_curve_bezier(CONST GpPointF *pts, REAL tension, REAL *x1,
|
||||||
extern void calc_curve_bezier_endp(REAL xend, REAL yend, REAL xadj, REAL yadj,
|
extern void calc_curve_bezier_endp(REAL xend, REAL yend, REAL xadj, REAL yadj,
|
||||||
REAL tension, REAL *x, REAL *y);
|
REAL tension, REAL *x, REAL *y);
|
||||||
|
|
||||||
|
extern void free_installed_fonts(void);
|
||||||
|
|
||||||
extern BOOL lengthen_path(GpPath *path, INT len);
|
extern BOOL lengthen_path(GpPath *path, INT len);
|
||||||
|
|
||||||
extern GpStatus trace_path(GpGraphics *graphics, GpPath *path);
|
extern GpStatus trace_path(GpGraphics *graphics, GpPath *path);
|
||||||
|
@ -245,6 +247,7 @@ struct GpStringFormat{
|
||||||
struct GpFontCollection{
|
struct GpFontCollection{
|
||||||
GpFontFamily **FontFamilies;
|
GpFontFamily **FontFamilies;
|
||||||
INT count;
|
INT count;
|
||||||
|
INT allocated;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GpFontFamily{
|
struct GpFontFamily{
|
||||||
|
|
Loading…
Reference in New Issue