[GDI32][GDI32_APITEST][SDK] Support GetGlyphOutlineWow (#9210)

Add 16-bit support and refactor.
JIRA issue: CORE-8466
- Refactor GetGlyphOutlineA/W.
- Implement GetGlyphOutlineWow.
- Modify gdi32.spec.
- Add prototype into <undocgdi.h>.
- Enhance GetGlyphOutline testcase.
This commit is contained in:
Katayama Hirofumi MZ
2026-06-27 11:36:36 +09:00
committed by GitHub
parent 8e865cb39d
commit d47cdbbdff
4 changed files with 191 additions and 84 deletions
+1 -1
View File
@@ -385,7 +385,7 @@
385 stdcall GetGlyphOutline(long long long ptr long ptr ptr) GetGlyphOutlineA
386 stdcall GetGlyphOutlineA(long long long ptr long ptr ptr)
387 stdcall GetGlyphOutlineW(long long long ptr long ptr ptr)
388 stdcall GetGlyphOutlineWow(long long long long long long long)
388 stdcall GetGlyphOutlineWow(long long long ptr long ptr ptr)
389 stdcall GetGraphicsMode(long)
390 stdcall GetHFONT(ptr)
391 stdcall GetICMProfileA(long ptr ptr)
+96 -69
View File
@@ -13,6 +13,7 @@
#include <math.h>
#include <strsafe.h>
#include <cjkcode.h>
#define NDEBUG
#include <debug.h>
@@ -1127,94 +1128,120 @@ GetGlyphIndicesA(
return Ret;
}
/*
* @implemented
*/
DWORD
WINAPI
GetGlyphOutlineA(
HDC hdc,
UINT uChar,
UINT uFormat,
LPGLYPHMETRICS lpgm,
DWORD cbBuffer,
LPVOID lpvBuffer,
CONST MAT2 *lpmat2
)
static __inline DWORD APIENTRY
IntGetGlyphOutlineW(
HDC hdc,
UINT uChar,
UINT fuFormat,
LPGLYPHMETRICS lpgm,
DWORD cbBuffer,
LPVOID lpvBuffer,
CONST MAT2 *lpmat2,
BOOL bIgnoreRotation)
{
if (!lpmat2 || !lpgm)
return GDI_ERROR;
if (!lpvBuffer)
cbBuffer = 0;
return NtGdiGetGlyphOutline(hdc, uChar, fuFormat, lpgm, cbBuffer, lpvBuffer, lpmat2,
bIgnoreRotation);
}
LPWSTR p = NULL;
DWORD ret;
UINT c;
DPRINT("GetGlyphOutlineA uChar %x\n", uChar);
if (!lpgm || !lpmat2) return GDI_ERROR;
if(!(uFormat & GGO_GLYPH_INDEX))
static DWORD APIENTRY
IntGetGlyphOutlineA(
HDC hdc,
UINT uChar,
UINT fuFormat,
LPGLYPHMETRICS lpgm,
DWORD cbBuffer,
LPVOID lpvBuffer,
CONST MAT2 *lpmat2,
BOOL bIgnoreRotation)
{
UINT nCodePage, cchAnsi;
CHAR szAnsi[4];
WCHAR szWide[2];
if (fuFormat & GGO_GLYPH_INDEX)
{
int len;
char mbchs[2];
if(uChar > 0xff) /* but, 2 bytes character only */
{
len = 2;
mbchs[0] = (uChar & 0xff00) >> 8;
mbchs[1] = (uChar & 0xff);
}
else
{
len = 1;
mbchs[0] = (uChar & 0xff);
}
p = FONT_mbtowc(hdc, mbchs, len, NULL, NULL);
if(!p)
return GDI_ERROR;
c = p[0];
szWide[0] = (WCHAR)uChar;
return IntGetGlyphOutlineW(hdc, szWide[0], fuFormat, lpgm, cbBuffer, lpvBuffer, lpmat2,
bIgnoreRotation);
}
nCodePage = GdiGetCodePage(hdc);
if ((nCodePage == CP_SHIFTJIS ||
nCodePage == CP_HANGUL ||
nCodePage == CP_BIG5 ||
nCodePage == CP_GB2312) && IsDBCSLeadByteEx(nCodePage, HIBYTE(uChar)))
{
szAnsi[0] = HIBYTE(uChar);
szAnsi[1] = LOBYTE(uChar);
cchAnsi = 2;
}
else
c = uChar;
ret = NtGdiGetGlyphOutline(hdc, c, uFormat, lpgm, cbBuffer, lpvBuffer, (CONST LPMAT2)lpmat2, TRUE);
HeapFree(GetProcessHeap(), 0, p);
return ret;
{
szAnsi[0] = LOBYTE(uChar);
cchAnsi = 1;
}
if (!MultiByteToWideChar(nCodePage, 0, szAnsi, cchAnsi, szWide, _countof(szWide)))
{
GdiSetLastError(ERROR_INVALID_PARAMETER);
return 0;
}
return IntGetGlyphOutlineW(hdc, szWide[0], fuFormat, lpgm, cbBuffer, lpvBuffer, lpmat2,
bIgnoreRotation);
}
/*
* @implemented
*/
DWORD WINAPI
GetGlyphOutlineA(
_In_ HDC hdc,
_In_ UINT uChar,
_In_ UINT fuFormat,
_Out_ LPGLYPHMETRICS lpgm,
_In_ DWORD cbBuffer,
_Out_writes_bytes_opt_(cbBuffer) LPVOID lpvBuffer,
_In_ CONST MAT2 *lpmat2)
{
return IntGetGlyphOutlineA(hdc, uChar, fuFormat, lpgm, cbBuffer, lpvBuffer, lpmat2, FALSE);
}
/*
* @implemented
*/
DWORD
WINAPI
DWORD WINAPI
GetGlyphOutlineW(
HDC hdc,
UINT uChar,
UINT uFormat,
LPGLYPHMETRICS lpgm,
DWORD cbBuffer,
LPVOID lpvBuffer,
CONST MAT2 *lpmat2
)
_In_ HDC hdc,
_In_ UINT uChar,
_In_ UINT fuFormat,
_Out_ LPGLYPHMETRICS lpgm,
_In_ DWORD cbBuffer,
_Out_writes_bytes_opt_(cbBuffer) LPVOID lpvBuffer,
_In_ CONST MAT2 *lpmat2)
{
DPRINT("GetGlyphOutlineW uChar %x\n", uChar);
if (!lpgm || !lpmat2) return GDI_ERROR;
if (!lpvBuffer) cbBuffer = 0;
return NtGdiGetGlyphOutline ( hdc, uChar, uFormat, lpgm, cbBuffer, lpvBuffer, (CONST LPMAT2)lpmat2, TRUE);
return IntGetGlyphOutlineW(hdc, uChar, fuFormat, lpgm, cbBuffer, lpvBuffer, lpmat2, FALSE);
}
/*
* @unimplemented
* @implemented
*/
DWORD
WINAPI
DWORD WINAPI
GetGlyphOutlineWow(
DWORD a0,
DWORD a1,
DWORD a2,
DWORD a3,
DWORD a4,
DWORD a5,
DWORD a6
)
_In_ HDC hdc,
_In_ UINT uChar,
_In_ UINT fuFormat,
_Out_ LPGLYPHMETRICS lpgm,
_In_ DWORD cbBuffer,
_Out_writes_bytes_opt_(cbBuffer) LPVOID lpvBuffer,
_In_ CONST MAT2 *lpmat2)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
return IntGetGlyphOutlineA(hdc, uChar, fuFormat, lpgm, cbBuffer, lpvBuffer, lpmat2, TRUE);
}
/*