/***************************************************************************** * GdipGetFontCollectionFamilyList [GDIPLUS.@] */ GpStatus WINGDIPAPI GdipGetFontCollectionFamilyList( GpFontCollection* fontCollection, INT numSought, GpFontFamily* gpfamilies[], INT* numFound) { INT i; GpStatus stat=Ok; TRACE("%p, %d, %p, %p\n", fontCollection, numSought, gpfamilies, numFound); if (!(fontCollection && gpfamilies && numFound)) return InvalidParameter; memset(gpfamilies, 0, sizeof(*gpfamilies) * numSought); for (i = 0; i < numSought && i < fontCollection->count && stat == Ok; i++) { stat = GdipCloneFontFamily(fontCollection->FontFamilies[i], &gpfamilies[i]); } if (stat == Ok) *numFound = i; else { int numToFree=i; for (i=0; i<numToFree; i++) { GdipDeleteFontFamily(gpfamilies[i]); gpfamilies[i] = NULL; } } return stat; }
/******************************************************************************* * GdipGetFamily [GDIPLUS.@] * * Returns the FontFamily for the specified Font * * PARAMS * font [I] Font to request from * family [O] Resulting FontFamily object * * RETURNS * SUCCESS: Ok * FAILURE: An element of GpStatus */ GpStatus WINGDIPAPI GdipGetFamily(GpFont *font, GpFontFamily **family) { TRACE("%p %p\n", font, family); if (!(font && family)) return InvalidParameter; return GdipCloneFontFamily(font->family, family); }
static void test_fontfamily (void) { GpFontFamily *family, *clonedFontFamily; WCHAR itsName[LF_FACESIZE]; GpStatus stat; /* FontFamily cannot be NULL */ stat = GdipCreateFontFamilyFromName (arial , NULL, NULL); expect (InvalidParameter, stat); /* FontFamily must be able to actually find the family. * If it can't, any subsequent calls should fail. */ stat = GdipCreateFontFamilyFromName (nonexistent, NULL, &family); expect (FontFamilyNotFound, stat); /* Bitmap fonts are not found */ todo_wine { stat = GdipCreateFontFamilyFromName (MSSansSerif, NULL, &family); expect (FontFamilyNotFound, stat); } stat = GdipCreateFontFamilyFromName (arial, NULL, &family); if(stat == FontFamilyNotFound) { skip("Arial not installed\n"); return; } expect (Ok, stat); stat = GdipGetFamilyName (family, itsName, LANG_NEUTRAL); expect (Ok, stat); expect (0, lstrcmpiW(itsName, arial)); if (0) { /* Crashes on Windows XP SP2, Vista, and so Wine as well */ stat = GdipGetFamilyName (family, NULL, LANG_NEUTRAL); expect (Ok, stat); } /* Make sure we don't read old data */ ZeroMemory (itsName, sizeof(itsName)); stat = GdipCloneFontFamily(family, &clonedFontFamily); expect (Ok, stat); GdipDeleteFontFamily(family); stat = GdipGetFamilyName(clonedFontFamily, itsName, LANG_NEUTRAL); expect(Ok, stat); expect(0, lstrcmpiW(itsName, arial)); GdipDeleteFontFamily(clonedFontFamily); }
/******************************************************************************* * GdipCloneFont [GDIPLUS.@] */ GpStatus WINGDIPAPI GdipCloneFont(GpFont *font, GpFont **cloneFont) { GpStatus stat; TRACE("(%p, %p)\n", font, cloneFont); if(!font || !cloneFont) return InvalidParameter; *cloneFont = GdipAlloc(sizeof(GpFont)); if(!*cloneFont) return OutOfMemory; **cloneFont = *font; stat = GdipCloneFontFamily(font->family, &(*cloneFont)->family); if (stat != Ok) GdipFree(*cloneFont); return stat; }