mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-26 19:33:31 +00:00
[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:
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user