WCHAR *msi_font_version_from_file( const WCHAR *filename ) { static const WCHAR fmtW[] = {'%','u','.','%','u','.','0','.','0',0}; WCHAR *version, *p, *q, *ret = NULL; if ((version = load_ttf_name_id( filename, NAME_ID_VERSION ))) { int len, major = 0, minor = 0; if ((p = strchrW( version, ';' ))) *p = 0; p = version; while (*p && !isdigitW( *p )) p++; if ((q = strchrW( p, '.' ))) { major = atoiW( p ); p = ++q; while (*q && isdigitW( *q )) q++; if (!*q || *q == ' ') minor = atoiW( p ); else major = 0; } len = strlenW( fmtW ) + 20; ret = msi_alloc( len * sizeof(WCHAR) ); sprintfW( ret, fmtW, major, minor ); msi_free( version ); } return ret; }
WCHAR *font_version_from_file( const WCHAR *filename ) { WCHAR *version, *p, *ret = NULL; if ((p = version = load_ttf_name_id( filename, NAME_ID_VERSION ))) { while (*p && !isdigitW( *p )) p++; ret = msi_alloc( (strlenW( p ) + 1) * sizeof(WCHAR) ); strcpyW( ret, p ); msi_free( version ); } return ret; }
static WCHAR *font_name_from_file( const WCHAR *filename ) { static const WCHAR truetypeW[] = {' ','(','T','r','u','e','T','y','p','e',')',0}; WCHAR *name, *ret = NULL; if ((name = load_ttf_name_id( filename, NAME_ID_FULL_FONT_NAME ))) { ret = msi_alloc( (strlenW( name ) + strlenW( truetypeW ) + 1 ) * sizeof(WCHAR) ); strcpyW( ret, name ); strcatW( ret, truetypeW ); msi_free( name ); } return ret; }
/***************************************************************************** * GdipPrivateAddMemoryFont [GDIPLUS.@] */ GpStatus WINGDIPAPI GdipPrivateAddMemoryFont(GpFontCollection* fontCollection, GDIPCONST void* memory, INT length) { WCHAR buf[32], *name; DWORD count = 0; HANDLE font; TRACE("%p, %p, %d\n", fontCollection, memory, length); if (!fontCollection || !memory || !length) return InvalidParameter; name = load_ttf_name_id(memory, length, NAME_ID_FULL_FONT_NAME, buf, sizeof(buf)/sizeof(*buf)); if (!name) return OutOfMemory; font = AddFontMemResourceEx((void*)memory, length, NULL, &count); TRACE("%s: %p/%u\n", debugstr_w(name), font, count); if (!font || !count) return InvalidParameter; if (count) { HDC hdc; LOGFONTW lfw; hdc = GetDC(0); lfw.lfCharSet = DEFAULT_CHARSET; lstrcpyW(lfw.lfFaceName, name); lfw.lfPitchAndFamily = 0; if (!EnumFontFamiliesExW(hdc, &lfw, add_font_proc, (LPARAM)fontCollection, 0)) { ReleaseDC(0, hdc); return OutOfMemory; } ReleaseDC(0, hdc); } return Ok; }