diff --git a/rostests/apitests/gdi32/ExampleFont.ttf b/rostests/apitests/gdi32/ExampleFont.ttf new file mode 100644 index 00000000000..72094599baa Binary files /dev/null and b/rostests/apitests/gdi32/ExampleFont.ttf differ diff --git a/rostests/apitests/gdi32/GetFontResourceInfoW.c b/rostests/apitests/gdi32/GetFontResourceInfoW.c index 7b185a30cbc..bb4d37900c4 100644 --- a/rostests/apitests/gdi32/GetFontResourceInfoW.c +++ b/rostests/apitests/gdi32/GetFontResourceInfoW.c @@ -5,6 +5,7 @@ * PROGRAMMERS: Katayama Hirofumi MZ */ #include +#include #include #include #include @@ -16,6 +17,7 @@ BOOL WINAPI GetFontResourceInfoW(LPCWSTR lpFileName, DWORD *pdwBufSize, void* lp typedef struct GFRI_ENTRY { LPCWSTR File; + BOOL Preinstalled; WCHAR FontInfo[64]; INT FontCount; WCHAR FaceNames[10][64]; @@ -24,9 +26,9 @@ typedef struct GFRI_ENTRY /* test entries */ static const GFRI_ENTRY TestEntries[] = { - { L"symbol.ttf", L"Symbol|", 1, { L"Symbol" } }, - { L"tahoma.ttf", L"Tahoma|", 1, { L"Tahoma" } }, - { L"tahomabd.ttf", L"Tahoma Bold|", 1, { L"Tahoma" } } + { L"symbol.ttf", TRUE, L"Symbol|", 1, { L"Symbol" } }, + { L"tahoma.ttf", TRUE, L"Tahoma|", 1, { L"Tahoma" } }, + { L"tahomabd.ttf", TRUE, L"Tahoma Bold|", 1, { L"Tahoma" } } }; /* Japanese */ @@ -34,7 +36,7 @@ static const GFRI_ENTRY AdditionalTestEntriesJapanese[] = { { /* MS Gothic & MS UI Gothic & MS PGothic */ - L"msgothic.ttc", + L"msgothic.ttc", TRUE, { 0xFF2D, 0xFF33, 0x0020, 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0x0020, 0x0026, 0x0020, 0x004D, 0x0053, 0x0020, 0x0055, 0x0049, 0x0020, @@ -51,6 +53,14 @@ static const GFRI_ENTRY AdditionalTestEntriesJapanese[] = { 0xFF2D, 0xFF33, 0x0020, 0xFF30, 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0 }, { L'@', 0xFF2D, 0xFF33, 0x0020, 0xFF30, 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0 } } + }, + { + L"ExampleFont.ttf", FALSE, + L"JapaneseDisplayName|", + 1, + { + L"JapaneseFamilyName" + } } }; @@ -59,7 +69,7 @@ static const GFRI_ENTRY AdditionalTestEntriesEnglish[] = { { /* MS Gothic & MS UI Gothic & MS PGothic */ - L"msgothic.ttc", + L"msgothic.ttc", TRUE, L"MS Gothic & MS UI Gothic & MS PGothic|", 6, { @@ -70,6 +80,14 @@ static const GFRI_ENTRY AdditionalTestEntriesEnglish[] = L"MS PGothic", L"@MS PGothic" } + }, + { + L"ExampleFont.ttf", FALSE, + L"EnglishDisplayName|", + 1, + { + L"EnglishFamilyName" + } } }; @@ -381,14 +399,56 @@ Test_GetFontResourceInfoW_case5(LPCWSTR pszFilePath, const GFRI_ENTRY *Entry) static void DoEntry(const GFRI_ENTRY *Entry) { - WCHAR szPath[MAX_PATH]; + WCHAR szPath[MAX_PATH], szTempPath[MAX_PATH]; + BOOL Installed = FALSE; - GetSystemFontPath(szPath, Entry->File); - printf("GetSystemFontPath: %S\n", szPath); - if (GetFileAttributesW(szPath) == 0xFFFFFFFF) + if (Entry->Preinstalled) { - skip("Font file \"%S\" was not found\n", szPath); - return; + GetSystemFontPath(szPath, Entry->File); + printf("GetSystemFontPath: %S\n", szPath); + if (GetFileAttributesW(szPath) == INVALID_FILE_ATTRIBUTES) + { + skip("Font file \"%S\" was not found\n", szPath); + return; + } + } + else + { + /* load font data from resource */ + HANDLE hFile; + HMODULE hMod = GetModuleHandleW(NULL); + HRSRC hRsrc = FindResourceW(hMod, Entry->File, (LPCWSTR)RT_RCDATA); + HGLOBAL hGlobal = LoadResource(hMod, hRsrc); + DWORD Size = SizeofResource(hMod, hRsrc); + LPVOID pFont = LockResource(hGlobal); + + /* get temporary file name */ + GetTempPathW(_countof(szTempPath), szTempPath); + GetTempFileNameW(szTempPath, L"FNT", 0, szPath); + printf("GetTempFileNameW: %S\n", szPath); + + /* write to file */ + hFile = CreateFileW(szPath, GENERIC_WRITE, FILE_SHARE_READ, NULL, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + WriteFile(hFile, pFont, Size, &Size, NULL); + CloseHandle(hFile); + + /* check existence */ + if (GetFileAttributesW(szPath) == INVALID_FILE_ATTRIBUTES) + { + skip("Font file \"%S\" was not stored\n", szPath); + return; + } + + /* install */ + Installed = !!AddFontResourceW(szPath); + if (!Installed) + { + skip("Font file \"%S\" was not installed\n", szPath); + RemoveFontResourceW(szPath); + DeleteFileW(szPath); + return; + } } Test_GetFontResourceInfoW_case0(szPath, Entry); @@ -397,6 +457,15 @@ DoEntry(const GFRI_ENTRY *Entry) Test_GetFontResourceInfoW_case3(szPath, Entry); Test_GetFontResourceInfoW_case4(szPath, Entry); Test_GetFontResourceInfoW_case5(szPath, Entry); + + if (!Entry->Preinstalled) + { + if (Installed) + { + RemoveFontResourceW(szPath); + DeleteFileW(szPath); + } + } } START_TEST(GetFontResourceInfoW) diff --git a/rostests/apitests/gdi32/resource.rc b/rostests/apitests/gdi32/resource.rc index 71ccce92193..3c758a78be2 100644 --- a/rostests/apitests/gdi32/resource.rc +++ b/rostests/apitests/gdi32/resource.rc @@ -4,3 +4,4 @@ ReactOSTestTahoma.ttf RCDATA ReactOSTestTahoma.ttf PanosePitchTest.ttf RCDATA PanosePitchTest.ttf TTCTestV.ttc RCDATA TTCTestV.ttc Shadows_Into_Light.ttf RCDATA Shadows_Into_Light.ttf +ExampleFont.ttf RCDATA ExampleFont.ttf