gdiplus: Populate the installed font collection.

This commit is contained in:
Vincent Povirk 2009-04-27 18:56:56 -05:00 committed by Alexandre Julliard
parent 80dfd00530
commit ef4d0d970d
3 changed files with 72 additions and 1 deletions

View File

@ -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;

View File

@ -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;
} }

View File

@ -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{