mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 07:22:58 +00:00
Win32k/Gdi32
- Use Batch with SetBrushOrgEx now, removed NtGdiGetBrushOrgEx, update all related files. - Fixed WinDC DCE death to all window DCE's. This will move to gdiobj as a check to see if a object handle is on deaths door. This prevents exceptions. - Implemented NtgdiGet/ABCCharWidth/sW, updated all related files. Float and Indices not supported yet. - Added Brush, Region and Font user attribute structures. Based on Yuan book. - All tested with linux qemu with AbiWord 2.4.1. svn path=/trunk/; revision=30244
This commit is contained in:
parent
53a432f25e
commit
9a0cb042b7
11 changed files with 436 additions and 273 deletions
|
@ -1551,25 +1551,6 @@ GetBrushAttributes(HBRUSH hbr)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
BOOL
|
|
||||||
STDCALL
|
|
||||||
GetCharWidthI(HDC hdc,
|
|
||||||
UINT giFirst,
|
|
||||||
UINT cgi,
|
|
||||||
LPWORD pgi,
|
|
||||||
LPINT lpBuffer
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
|
@ -2381,30 +2362,6 @@ GetBkMode(HDC hdc)
|
||||||
return NtGdiGetBkMode(hdc);
|
return NtGdiGetBkMode(hdc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
BOOL
|
|
||||||
STDCALL
|
|
||||||
GetBrushOrgEx(HDC hdc,LPPOINT pt)
|
|
||||||
{
|
|
||||||
/* FIXME some part are done in user mode */
|
|
||||||
return NtGdiGetBrushOrgEx(hdc,pt);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
BOOL
|
|
||||||
STDCALL
|
|
||||||
GetCharABCWidthsFloatW(HDC hdc,UINT FirstChar,UINT LastChar,LPABCFLOAT abcF)
|
|
||||||
{
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
*
|
*
|
||||||
|
@ -2445,52 +2402,6 @@ GetClipBox(HDC hdc,
|
||||||
return NtGdiGetClipBox(hdc, lprc);
|
return NtGdiGetClipBox(hdc, lprc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
BOOL
|
|
||||||
STDCALL
|
|
||||||
GetCharWidthFloatW(HDC hdc,
|
|
||||||
UINT iFirstChar,
|
|
||||||
UINT iLastChar,
|
|
||||||
PFLOAT pxBuffer)
|
|
||||||
{
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
BOOL
|
|
||||||
STDCALL
|
|
||||||
GetCharWidth32W(HDC hdc,
|
|
||||||
UINT iFirstChar,
|
|
||||||
UINT iLastChar,
|
|
||||||
LPINT lpBuffer)
|
|
||||||
{
|
|
||||||
/* FIXME some part need be done in user mode */
|
|
||||||
return NtGdiGetCharWidth32(hdc, iFirstChar, iLastChar, lpBuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
BOOL
|
|
||||||
STDCALL
|
|
||||||
GetCharABCWidths(HDC hdc,
|
|
||||||
UINT uFirstChar,
|
|
||||||
UINT uLastChar,
|
|
||||||
LPABC lpabc)
|
|
||||||
{
|
|
||||||
/* FIXME some part need be done in user mode */
|
|
||||||
return NtGdiGetCharABCWidths(hdc, uFirstChar, uLastChar, lpabc);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
*
|
*
|
||||||
|
|
|
@ -255,6 +255,25 @@ SetROP2(HDC hdc,
|
||||||
return Old_ROP2;
|
return Old_ROP2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
BOOL
|
||||||
|
STDCALL
|
||||||
|
GetBrushOrgEx(HDC hdc,LPPOINT pt)
|
||||||
|
{
|
||||||
|
PDC_ATTR Dc_Attr;
|
||||||
|
|
||||||
|
if (!GdiGetHandleUserData((HGDIOBJ) hdc, (PVOID) &Dc_Attr)) return FALSE;
|
||||||
|
if (pt)
|
||||||
|
{
|
||||||
|
pt->x = Dc_Attr->ptlBrushOrigin.x;
|
||||||
|
pt->y = Dc_Attr->ptlBrushOrigin.y;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
|
@ -265,6 +284,7 @@ SetBrushOrgEx(HDC hdc,
|
||||||
int nYOrg,
|
int nYOrg,
|
||||||
LPPOINT lppt)
|
LPPOINT lppt)
|
||||||
{
|
{
|
||||||
|
PDC_ATTR Dc_Attr;
|
||||||
#if 0
|
#if 0
|
||||||
// Handle something other than a normal dc object.
|
// Handle something other than a normal dc object.
|
||||||
if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC)
|
if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC)
|
||||||
|
@ -282,9 +302,6 @@ SetBrushOrgEx(HDC hdc,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if 0
|
|
||||||
PDC_ATTR Dc_Attr;
|
|
||||||
|
|
||||||
if (GdiGetHandleUserData((HGDIOBJ) hdc, (PVOID) &Dc_Attr))
|
if (GdiGetHandleUserData((HGDIOBJ) hdc, (PVOID) &Dc_Attr))
|
||||||
{
|
{
|
||||||
PTEB pTeb = NtCurrentTeb();
|
PTEB pTeb = NtCurrentTeb();
|
||||||
|
@ -313,12 +330,17 @@ SetBrushOrgEx(HDC hdc,
|
||||||
pTeb->GdiTebBatch.Offset += sizeof(GDIBSSETBRHORG);
|
pTeb->GdiTebBatch.Offset += sizeof(GDIBSSETBRHORG);
|
||||||
pTeb->GdiTebBatch.HDC = (ULONG)hdc;
|
pTeb->GdiTebBatch.HDC = (ULONG)hdc;
|
||||||
pTeb->GdiBatchCount++;
|
pTeb->GdiBatchCount++;
|
||||||
if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush();
|
DPRINT("Loading the Flush!! COUNT-> %d\n", pTeb->GdiBatchCount);
|
||||||
|
|
||||||
|
if (pTeb->GdiBatchCount >= GDI_BatchLimit)
|
||||||
|
{
|
||||||
|
DPRINT("Call GdiFlush!!\n");
|
||||||
|
NtGdiFlush();
|
||||||
|
DPRINT("Exit GdiFlush!!\n");
|
||||||
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
return NtGdiSetBrushOrg(hdc,nXOrg,nYOrg,lppt);
|
return NtGdiSetBrushOrg(hdc,nXOrg,nYOrg,lppt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -419,88 +419,6 @@ EnumFontFamiliesA(HDC hdc, LPCSTR lpszFamily, FONTENUMPROCA lpEnumFontFamProc,
|
||||||
return IntEnumFontFamilies(hdc, &LogFont, lpEnumFontFamProc, lParam, FALSE);
|
return IntEnumFontFamilies(hdc, &LogFont, lpEnumFontFamProc, lParam, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
BOOL
|
|
||||||
STDCALL
|
|
||||||
GetCharWidthA (
|
|
||||||
HDC hdc,
|
|
||||||
UINT iFirstChar,
|
|
||||||
UINT iLastChar,
|
|
||||||
LPINT lpBuffer
|
|
||||||
)
|
|
||||||
{
|
|
||||||
DPRINT1("GCWA iFirstChar %x\n",iFirstChar);
|
|
||||||
|
|
||||||
return GetCharWidth32A ( hdc, iFirstChar, iLastChar, lpBuffer );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
BOOL
|
|
||||||
STDCALL
|
|
||||||
GetCharWidth32A(
|
|
||||||
HDC hdc,
|
|
||||||
UINT iFirstChar,
|
|
||||||
UINT iLastChar,
|
|
||||||
LPINT lpBuffer
|
|
||||||
)
|
|
||||||
{
|
|
||||||
INT i, wlen, count = (INT)(iLastChar - iFirstChar + 1);
|
|
||||||
LPSTR str;
|
|
||||||
LPWSTR wstr;
|
|
||||||
BOOL ret = TRUE;
|
|
||||||
DPRINT1("GCW32A iFirstChar %x\n",iFirstChar);
|
|
||||||
|
|
||||||
if(count <= 0) return FALSE;
|
|
||||||
|
|
||||||
str = HeapAlloc(GetProcessHeap(), 0, count);
|
|
||||||
for(i = 0; i < count; i++)
|
|
||||||
str[i] = (BYTE)(iFirstChar + i);
|
|
||||||
|
|
||||||
wstr = FONT_mbtowc(NULL, str, count, &wlen, NULL);
|
|
||||||
|
|
||||||
for(i = 0; i < wlen; i++)
|
|
||||||
{
|
|
||||||
/* FIXME should be NtGdiGetCharWidthW */
|
|
||||||
if(!NtGdiGetCharWidth32 (hdc, wstr[i], wstr[i], lpBuffer))
|
|
||||||
{
|
|
||||||
ret = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
lpBuffer++;
|
|
||||||
}
|
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, str);
|
|
||||||
HeapFree(GetProcessHeap(), 0, wstr);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
BOOL
|
|
||||||
STDCALL
|
|
||||||
GetCharWidthW (
|
|
||||||
HDC hdc,
|
|
||||||
UINT iFirstChar,
|
|
||||||
UINT iLastChar,
|
|
||||||
LPINT lpBuffer
|
|
||||||
)
|
|
||||||
{
|
|
||||||
DPRINT1("GCW32w uFirstChar %x\n",iFirstChar);
|
|
||||||
|
|
||||||
/* FIXME should be NtGdiGetCharWidthW */
|
|
||||||
return NtGdiGetCharWidth32 ( hdc, iFirstChar, iLastChar, lpBuffer );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
|
@ -518,6 +436,7 @@ GetCharacterPlacementW(
|
||||||
DWORD ret=0;
|
DWORD ret=0;
|
||||||
SIZE size;
|
SIZE size;
|
||||||
UINT i, nSet;
|
UINT i, nSet;
|
||||||
|
DPRINT("GetCharacterPlacementW\n");
|
||||||
|
|
||||||
if(dwFlags&(~GCP_REORDER)) DPRINT("flags 0x%08lx ignored\n", dwFlags);
|
if(dwFlags&(~GCP_REORDER)) DPRINT("flags 0x%08lx ignored\n", dwFlags);
|
||||||
if(lpResults->lpClass) DPRINT("classes not implemented\n");
|
if(lpResults->lpClass) DPRINT("classes not implemented\n");
|
||||||
|
@ -558,7 +477,7 @@ GetCharacterPlacementW(
|
||||||
int c;
|
int c;
|
||||||
for (i = 0; i < nSet; i++)
|
for (i = 0; i < nSet; i++)
|
||||||
{
|
{
|
||||||
if (NtGdiGetCharWidth32(hdc, lpString[i], lpString[i], &c))
|
if (GetCharWidth32W(hdc, lpString[i], lpString[i], &c))
|
||||||
lpResults->lpDx[i]= c;
|
lpResults->lpDx[i]= c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -582,9 +501,212 @@ GetCharacterPlacementW(
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
BOOL
|
||||||
|
STDCALL
|
||||||
|
GetCharABCWidthsFloatW(HDC hdc,
|
||||||
|
UINT FirstChar,
|
||||||
|
UINT LastChar,
|
||||||
|
LPABCFLOAT abcF)
|
||||||
|
{
|
||||||
|
DPRINT("GetCharABCWidthsFloatW\n");
|
||||||
|
if ((!abcF) || (FirstChar > LastChar))
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return NtGdiGetCharABCWidthsW( hdc,
|
||||||
|
FirstChar,
|
||||||
|
(ULONG)(LastChar - FirstChar + 1),
|
||||||
|
(PWCHAR) NULL,
|
||||||
|
0,
|
||||||
|
(PVOID)abcF);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
BOOL
|
||||||
|
STDCALL
|
||||||
|
GetCharWidthFloatW(HDC hdc,
|
||||||
|
UINT iFirstChar,
|
||||||
|
UINT iLastChar,
|
||||||
|
PFLOAT pxBuffer)
|
||||||
|
{
|
||||||
|
DPRINT("GetCharWidthsFloatW\n");
|
||||||
|
if ((!pxBuffer) || (iFirstChar > iLastChar))
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return NtGdiGetCharWidthW( hdc,
|
||||||
|
iFirstChar,
|
||||||
|
(ULONG)(iLastChar - iFirstChar + 1),
|
||||||
|
(PWCHAR) NULL,
|
||||||
|
0,
|
||||||
|
(PVOID) pxBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
BOOL
|
||||||
|
STDCALL
|
||||||
|
GetCharWidthW(HDC hdc,
|
||||||
|
UINT iFirstChar,
|
||||||
|
UINT iLastChar,
|
||||||
|
LPINT lpBuffer)
|
||||||
|
{
|
||||||
|
DPRINT("GetCharWidthsW\n");
|
||||||
|
if ((!lpBuffer) || (iFirstChar > iLastChar))
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return NtGdiGetCharWidthW( hdc,
|
||||||
|
iFirstChar,
|
||||||
|
(ULONG)(iLastChar - iFirstChar + 1),
|
||||||
|
(PWCHAR) NULL,
|
||||||
|
GCW_NOFLOAT,
|
||||||
|
(PVOID) lpBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
BOOL
|
||||||
|
STDCALL
|
||||||
|
GetCharWidth32W(HDC hdc,
|
||||||
|
UINT iFirstChar,
|
||||||
|
UINT iLastChar,
|
||||||
|
LPINT lpBuffer)
|
||||||
|
{
|
||||||
|
DPRINT("GetCharWidths32W\n");
|
||||||
|
if ((!lpBuffer) || (iFirstChar > iLastChar))
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return NtGdiGetCharWidthW( hdc,
|
||||||
|
iFirstChar,
|
||||||
|
(ULONG)(iLastChar - iFirstChar + 1),
|
||||||
|
(PWCHAR) NULL,
|
||||||
|
GCW_NOFLOAT|GCW_WIN32,
|
||||||
|
(PVOID) lpBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
BOOL
|
||||||
|
STDCALL
|
||||||
|
GetCharABCWidthsW(HDC hdc,
|
||||||
|
UINT FirstChar,
|
||||||
|
UINT LastChar,
|
||||||
|
LPABC lpabc)
|
||||||
|
{
|
||||||
|
DPRINT("GetCharABCWidthsW\n");
|
||||||
|
if ((!lpabc) || (FirstChar > LastChar))
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return NtGdiGetCharABCWidthsW( hdc,
|
||||||
|
FirstChar,
|
||||||
|
(ULONG)(LastChar - FirstChar + 1),
|
||||||
|
(PWCHAR) NULL,
|
||||||
|
GCABCW_NOFLOAT,
|
||||||
|
(PVOID)lpabc);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
BOOL
|
||||||
|
STDCALL
|
||||||
|
GetCharWidthA(
|
||||||
|
HDC hdc,
|
||||||
|
UINT iFirstChar,
|
||||||
|
UINT iLastChar,
|
||||||
|
LPINT lpBuffer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
DPRINT("GetCharWidthsA\n");
|
||||||
|
INT i, wlen, count = (INT)(iLastChar - iFirstChar + 1);
|
||||||
|
LPSTR str;
|
||||||
|
LPWSTR wstr;
|
||||||
|
BOOL ret = TRUE;
|
||||||
|
|
||||||
|
if(count <= 0) return FALSE;
|
||||||
|
|
||||||
|
str = HeapAlloc(GetProcessHeap(), 0, count);
|
||||||
|
for(i = 0; i < count; i++)
|
||||||
|
str[i] = (BYTE)(iFirstChar + i);
|
||||||
|
|
||||||
|
wstr = FONT_mbtowc(NULL, str, count, &wlen, NULL);
|
||||||
|
|
||||||
|
ret = NtGdiGetCharWidthW( hdc,
|
||||||
|
wstr[0],
|
||||||
|
(ULONG) count,
|
||||||
|
(PWCHAR) wstr,
|
||||||
|
GCW_NOFLOAT,
|
||||||
|
(PVOID) lpBuffer);
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, str);
|
||||||
|
HeapFree(GetProcessHeap(), 0, wstr);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
BOOL
|
||||||
|
STDCALL
|
||||||
|
GetCharWidth32A(
|
||||||
|
HDC hdc,
|
||||||
|
UINT iFirstChar,
|
||||||
|
UINT iLastChar,
|
||||||
|
LPINT lpBuffer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
DPRINT("GetCharWidths32A\n");
|
||||||
|
INT i, wlen, count = (INT)(iLastChar - iFirstChar + 1);
|
||||||
|
LPSTR str;
|
||||||
|
LPWSTR wstr;
|
||||||
|
BOOL ret = TRUE;
|
||||||
|
|
||||||
|
if(count <= 0) return FALSE;
|
||||||
|
|
||||||
|
str = HeapAlloc(GetProcessHeap(), 0, count);
|
||||||
|
for(i = 0; i < count; i++)
|
||||||
|
str[i] = (BYTE)(iFirstChar + i);
|
||||||
|
|
||||||
|
wstr = FONT_mbtowc(NULL, str, count, &wlen, NULL);
|
||||||
|
|
||||||
|
ret = NtGdiGetCharWidthW( hdc,
|
||||||
|
wstr[0],
|
||||||
|
(ULONG) count,
|
||||||
|
(PWCHAR) wstr,
|
||||||
|
GCW_NOFLOAT|GCW_WIN32,
|
||||||
|
(PVOID) lpBuffer);
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, str);
|
||||||
|
HeapFree(GetProcessHeap(), 0, wstr);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
*/
|
*/
|
||||||
BOOL
|
BOOL
|
||||||
APIENTRY
|
APIENTRY
|
||||||
|
@ -595,10 +717,27 @@ GetCharWidthFloatA(
|
||||||
PFLOAT pxBuffer
|
PFLOAT pxBuffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
/* FIXME what to do with iFirstChar and iLastChar ??? */
|
DPRINT("GetCharWidthsFloatA\n");
|
||||||
return FALSE;
|
INT i, wlen, count = (INT)(iLastChar - iFirstChar + 1);
|
||||||
}
|
LPSTR str;
|
||||||
|
LPWSTR wstr;
|
||||||
|
BOOL ret = TRUE;
|
||||||
|
|
||||||
|
if(count <= 0) return FALSE;
|
||||||
|
|
||||||
|
str = HeapAlloc(GetProcessHeap(), 0, count);
|
||||||
|
for(i = 0; i < count; i++)
|
||||||
|
str[i] = (BYTE)(iFirstChar + i);
|
||||||
|
|
||||||
|
wstr = FONT_mbtowc(NULL, str, count, &wlen, NULL);
|
||||||
|
|
||||||
|
ret = NtGdiGetCharWidthW( hdc, wstr[0], (ULONG) count, (PWCHAR) wstr, 0, (PVOID) pxBuffer);
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, str);
|
||||||
|
HeapFree(GetProcessHeap(), 0, wstr);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
|
@ -612,14 +751,35 @@ GetCharABCWidthsA(
|
||||||
LPABC lpabc
|
LPABC lpabc
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DPRINT1("GCABCWA uFirstChar %x\n",uFirstChar);
|
DPRINT("GetCharABCWidthsA\n");
|
||||||
|
INT i, wlen, count = (INT)(uLastChar - uFirstChar + 1);
|
||||||
|
LPSTR str;
|
||||||
|
LPWSTR wstr;
|
||||||
|
BOOL ret = TRUE;
|
||||||
|
|
||||||
return NtGdiGetCharABCWidths(hdc, uFirstChar, uLastChar, lpabc);
|
if(count <= 0) return FALSE;
|
||||||
|
|
||||||
|
str = HeapAlloc(GetProcessHeap(), 0, count);
|
||||||
|
for(i = 0; i < count; i++)
|
||||||
|
str[i] = (BYTE)(uFirstChar + i);
|
||||||
|
|
||||||
|
wstr = FONT_mbtowc(hdc, str, count, &wlen, NULL);
|
||||||
|
|
||||||
|
ret = NtGdiGetCharABCWidthsW( hdc,
|
||||||
|
wstr[0],
|
||||||
|
(ULONG)count,
|
||||||
|
(PWCHAR)wstr,
|
||||||
|
GCABCW_NOFLOAT,
|
||||||
|
(PVOID)lpabc);
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, str);
|
||||||
|
HeapFree(GetProcessHeap(), 0, wstr);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
BOOL
|
BOOL
|
||||||
APIENTRY
|
APIENTRY
|
||||||
|
@ -630,10 +790,27 @@ GetCharABCWidthsFloatA(
|
||||||
LPABCFLOAT lpABCF
|
LPABCFLOAT lpABCF
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DPRINT1("GCABCWFA iFirstChar %x\n",iFirstChar);
|
DPRINT("GetCharABCWidthsFloatA\n");
|
||||||
|
INT i, wlen, count = (INT)(iLastChar - iFirstChar + 1);
|
||||||
|
LPSTR str;
|
||||||
|
LPWSTR wstr;
|
||||||
|
BOOL ret = TRUE;
|
||||||
|
|
||||||
/* FIXME what to do with iFirstChar and iLastChar ??? */
|
if (count <= 0) return FALSE;
|
||||||
return FALSE;
|
|
||||||
|
str = HeapAlloc(GetProcessHeap(), 0, count);
|
||||||
|
|
||||||
|
for(i = 0; i < count; i++)
|
||||||
|
str[i] = (BYTE)(iFirstChar + i);
|
||||||
|
|
||||||
|
wstr = FONT_mbtowc( hdc, str, count, &wlen, NULL );
|
||||||
|
|
||||||
|
ret = NtGdiGetCharABCWidthsW( hdc,wstr[0],(ULONG)count, (PWCHAR)wstr, 0, (PVOID)lpABCF);
|
||||||
|
|
||||||
|
HeapFree( GetProcessHeap(), 0, str );
|
||||||
|
HeapFree( GetProcessHeap(), 0, wstr );
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -645,10 +822,42 @@ GetCharABCWidthsI(HDC hdc,
|
||||||
UINT giFirst,
|
UINT giFirst,
|
||||||
UINT cgi,
|
UINT cgi,
|
||||||
LPWORD pgi,
|
LPWORD pgi,
|
||||||
LPABC lpabc
|
LPABC lpabc)
|
||||||
|
{
|
||||||
|
DPRINT("GetCharABCWidthsI\n");
|
||||||
|
return NtGdiGetCharABCWidthsW( hdc,
|
||||||
|
giFirst,
|
||||||
|
(ULONG) cgi,
|
||||||
|
(PWCHAR) pgi,
|
||||||
|
GCABCW_NOFLOAT|GCABCW_INDICES,
|
||||||
|
(PVOID)lpabc);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
BOOL
|
||||||
|
STDCALL
|
||||||
|
GetCharWidthI(HDC hdc,
|
||||||
|
UINT giFirst,
|
||||||
|
UINT cgi,
|
||||||
|
LPWORD pgi,
|
||||||
|
LPINT lpBuffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return NtGdiGetCharABCWidthsW( hdc, giFirst, (ULONG) cgi, (PWCHAR) pgi, 3, (PVOID)lpabc);
|
DPRINT("GetCharWidthsI\n");
|
||||||
|
if (!lpBuffer || (!pgi && (giFirst == MAXUSHORT))) // Cannot be at max.
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (!cgi) return TRUE;
|
||||||
|
return NtGdiGetCharWidthW( hdc,
|
||||||
|
giFirst,
|
||||||
|
cgi,
|
||||||
|
(PWCHAR) pgi,
|
||||||
|
GCW_INDICES|GCW_NOFLOAT|GCW_WIN32,
|
||||||
|
(PVOID) lpBuffer );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -730,7 +939,9 @@ GetGlyphOutlineW(
|
||||||
CONST MAT2 *lpmat2
|
CONST MAT2 *lpmat2
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DPRINT1("GetGlyphOutlineW uChar %x\n", uChar);
|
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 NtGdiGetGlyphOutline ( hdc, uChar, uFormat, lpgm, cbBuffer, lpvBuffer, (CONST LPMAT2)lpmat2, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,15 +79,6 @@ NtGdiGetTextExtentPoint32(
|
||||||
LPSIZE
|
LPSIZE
|
||||||
);
|
);
|
||||||
|
|
||||||
BOOL
|
|
||||||
STDCALL
|
|
||||||
NtGdiGetCharWidth32(
|
|
||||||
HDC hDC,
|
|
||||||
UINT FirstChar,
|
|
||||||
UINT LastChar,
|
|
||||||
LPINT Buffer
|
|
||||||
);
|
|
||||||
|
|
||||||
/* Use NtGdiAddFontResourceW */
|
/* Use NtGdiAddFontResourceW */
|
||||||
int
|
int
|
||||||
STDCALL
|
STDCALL
|
||||||
|
@ -211,9 +202,6 @@ COLORREF STDCALL NtGdiGetBkColor(HDC hDC);
|
||||||
/* Should be done in user-mode using shared GDI Objects. */
|
/* Should be done in user-mode using shared GDI Objects. */
|
||||||
INT STDCALL NtGdiGetBkMode(HDC hDC);
|
INT STDCALL NtGdiGetBkMode(HDC hDC);
|
||||||
|
|
||||||
/* Should be done in user-mode using shared GDI Objects. */
|
|
||||||
BOOL STDCALL NtGdiGetBrushOrgEx(HDC hDC, LPPOINT brushOrg);
|
|
||||||
|
|
||||||
/* Use NtGdiGetCharABCWidthsW */
|
/* Use NtGdiGetCharABCWidthsW */
|
||||||
BOOL
|
BOOL
|
||||||
STDCALL
|
STDCALL
|
||||||
|
|
|
@ -283,4 +283,26 @@ typedef struct _DC_ATTR
|
||||||
RGNATTR VisRectRegion;
|
RGNATTR VisRectRegion;
|
||||||
} DC_ATTR, *PDC_ATTR;
|
} DC_ATTR, *PDC_ATTR;
|
||||||
|
|
||||||
|
typedef struct _BRUSH_ATTR
|
||||||
|
{
|
||||||
|
LOGBRUSH logbrush;
|
||||||
|
DWORD dwUnused[3];
|
||||||
|
} BRUSH_ATTR, *PBRUSH_ATTR;
|
||||||
|
|
||||||
|
typedef struct _REGION_ATTR
|
||||||
|
{
|
||||||
|
DWORD dwUnknown1;
|
||||||
|
DWORD dwUnknown2;
|
||||||
|
LONG right;
|
||||||
|
LONG bottom;
|
||||||
|
LONG left;
|
||||||
|
LONG top;
|
||||||
|
} REGION_ATTR, *PREGION_ATTR;
|
||||||
|
|
||||||
|
typedef struct _FONT_ATTR
|
||||||
|
{
|
||||||
|
DWORD dwUnknown;
|
||||||
|
void *pCharWidthData;
|
||||||
|
} FONT_ATTR, *PFONT_ATTR;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -77,8 +77,6 @@ typedef enum _GETDCPOINT
|
||||||
GdiGetDCOrg = 6,
|
GdiGetDCOrg = 6,
|
||||||
} GETDCPOINT, *PGETDCPOINT;
|
} GETDCPOINT, *PGETDCPOINT;
|
||||||
|
|
||||||
#define GDIBATCHBUFSIZE 0x136*4
|
|
||||||
#define GDI_BATCH_LIMIT 20
|
|
||||||
|
|
||||||
typedef enum _GDIBATCHCMD
|
typedef enum _GDIBATCHCMD
|
||||||
{
|
{
|
||||||
|
@ -105,6 +103,21 @@ typedef enum _TRANSFORMTYPE
|
||||||
typedef DWORD FULLSCREENCONTROL;
|
typedef DWORD FULLSCREENCONTROL;
|
||||||
typedef DWORD LFTYPE;
|
typedef DWORD LFTYPE;
|
||||||
|
|
||||||
|
/* DEFINES *******************************************************************/
|
||||||
|
|
||||||
|
#define GDIBATCHBUFSIZE 0x136*4
|
||||||
|
#define GDI_BATCH_LIMIT 20
|
||||||
|
|
||||||
|
// NtGdiGetCharWidthW Flags
|
||||||
|
#define GCW_WIN32 0x0001
|
||||||
|
#define GCW_NOFLOAT 0x0002
|
||||||
|
#define GCW_INDICES 0x0008
|
||||||
|
|
||||||
|
// NtGdiGetCharABCWidthW Flags
|
||||||
|
#define GCABCW_NOFLOAT 0x0001
|
||||||
|
#define GCABCW_INDICES 0x0002
|
||||||
|
|
||||||
|
|
||||||
/* TYPES *********************************************************************/
|
/* TYPES *********************************************************************/
|
||||||
|
|
||||||
typedef PVOID KERNEL_PVOID;
|
typedef PVOID KERNEL_PVOID;
|
||||||
|
|
|
@ -55,7 +55,7 @@ __inline static PUSER_HANDLE_ENTRY alloc_user_entry(PUSER_HANDLE_TABLE ht)
|
||||||
{
|
{
|
||||||
PUSER_HANDLE_ENTRY entry;
|
PUSER_HANDLE_ENTRY entry;
|
||||||
|
|
||||||
// DPRINT1("handles used %i\n",usedHandles);
|
DPRINT("handles used %i\n",usedHandles);
|
||||||
|
|
||||||
if (ht->freelist)
|
if (ht->freelist)
|
||||||
{
|
{
|
||||||
|
|
|
@ -678,7 +678,18 @@ DceFreeDCE(PDCE pdce, BOOLEAN Force)
|
||||||
if(Force && !GDIOBJ_OwnedByCurrentProcess(GdiHandleTable, pdce->hDC))
|
if(Force && !GDIOBJ_OwnedByCurrentProcess(GdiHandleTable, pdce->hDC))
|
||||||
{
|
{
|
||||||
DPRINT1("Change ownership for DCE!\n");
|
DPRINT1("Change ownership for DCE!\n");
|
||||||
DC_SetOwnership( pdce->hDC, PsGetCurrentProcess());
|
INT Index = GDI_HANDLE_GET_INDEX(pdce->hDC);
|
||||||
|
PGDI_TABLE_ENTRY Entry = &GdiHandleTable->Entries[Index];
|
||||||
|
|
||||||
|
// Must take control of handles that are not in the process of going away.
|
||||||
|
if ((Entry->Type & ~GDI_ENTRY_REUSE_MASK) != 0 && Entry->KernelData != NULL)
|
||||||
|
{
|
||||||
|
DC_SetOwnership( pdce->hDC, PsGetCurrentProcess());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DPRINT1("Attempted to change ownership of an DCEhDC 0x%x currently being destroyed!!!\n",pdce->hDC);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NtGdiDeleteObjectApp(pdce->hDC);
|
NtGdiDeleteObjectApp(pdce->hDC);
|
||||||
|
|
|
@ -1137,7 +1137,6 @@ NtGdiEnumObjects(
|
||||||
|
|
||||||
DC_GET_VAL( COLORREF, NtGdiGetBkColor, Dc_Attr.crBackgroundClr )
|
DC_GET_VAL( COLORREF, NtGdiGetBkColor, Dc_Attr.crBackgroundClr )
|
||||||
DC_GET_VAL( INT, NtGdiGetBkMode, Dc_Attr.jBkMode )
|
DC_GET_VAL( INT, NtGdiGetBkMode, Dc_Attr.jBkMode )
|
||||||
DC_GET_VAL_EX( GetBrushOrgEx, Dc_Attr.ptlBrushOrigin.x, Dc_Attr.ptlBrushOrigin.y, POINT, x, y )
|
|
||||||
|
|
||||||
HANDLE
|
HANDLE
|
||||||
STDCALL
|
STDCALL
|
||||||
|
|
|
@ -2130,12 +2130,18 @@ fail:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
BOOL
|
BOOL
|
||||||
STDCALL
|
STDCALL
|
||||||
NtGdiGetCharABCWidths(HDC hDC,
|
NtGdiGetCharABCWidthsW(
|
||||||
UINT FirstChar,
|
IN HDC hDC,
|
||||||
UINT LastChar,
|
IN UINT FirstChar,
|
||||||
LPABC abc)
|
IN ULONG Count,
|
||||||
|
IN OPTIONAL PWCHAR pwch,
|
||||||
|
IN FLONG fl,
|
||||||
|
OUT PVOID Buffer)
|
||||||
{
|
{
|
||||||
LPABC SafeBuffer;
|
LPABC SafeBuffer;
|
||||||
PDC dc;
|
PDC dc;
|
||||||
|
@ -2146,14 +2152,21 @@ NtGdiGetCharABCWidths(HDC hDC,
|
||||||
UINT i, glyph_index, BufferSize;
|
UINT i, glyph_index, BufferSize;
|
||||||
HFONT hFont = 0;
|
HFONT hFont = 0;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
LPABC abc = NULL;
|
||||||
|
LPABCFLOAT abcf = NULL;
|
||||||
|
|
||||||
if (LastChar < FirstChar)
|
if (!fl)
|
||||||
{
|
{
|
||||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
abcf = (LPABCFLOAT) Buffer;
|
||||||
|
// Not supported yet!
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
abc = (LPABC) Buffer;
|
||||||
|
|
||||||
BufferSize = (LastChar - FirstChar + 1) * sizeof(ABC);
|
if (fl & GCABCW_INDICES) return FALSE; // Not supported yet!
|
||||||
|
|
||||||
|
BufferSize = Count * sizeof(ABC);
|
||||||
SafeBuffer = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_GDITEXT);
|
SafeBuffer = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_GDITEXT);
|
||||||
if (SafeBuffer == NULL)
|
if (SafeBuffer == NULL)
|
||||||
{
|
{
|
||||||
|
@ -2214,7 +2227,7 @@ NtGdiGetCharABCWidths(HDC hDC,
|
||||||
(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight < 0 ? - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight :
|
(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight < 0 ? - TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight :
|
||||||
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? 11 : TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight));
|
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? 11 : TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight));
|
||||||
|
|
||||||
for (i = FirstChar; i <= LastChar; i++)
|
for (i = FirstChar; i < FirstChar+Count; i++)
|
||||||
{
|
{
|
||||||
int adv, lsb, bbx, left, right;
|
int adv, lsb, bbx, left, right;
|
||||||
|
|
||||||
|
@ -2252,45 +2265,17 @@ NtGdiGetCharABCWidths(HDC hDC,
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
|
||||||
BOOL
|
|
||||||
STDCALL
|
|
||||||
NtGdiGetCharABCWidthsW(
|
|
||||||
IN HDC hdc,
|
|
||||||
IN UINT wchFirst,
|
|
||||||
IN ULONG cwch,
|
|
||||||
IN OPTIONAL PWCHAR pwch,
|
|
||||||
IN FLONG fl,
|
|
||||||
OUT PVOID pvBuf)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
*/
|
||||||
BOOL
|
BOOL
|
||||||
STDCALL
|
STDCALL
|
||||||
NtGdiGetCharWidthW(
|
NtGdiGetCharWidthW(
|
||||||
IN HDC hdc,
|
IN HDC hDC,
|
||||||
IN UINT wcFirst,
|
IN UINT FirstChar,
|
||||||
IN UINT cwc,
|
IN UINT Count,
|
||||||
IN OPTIONAL PWCHAR pwc,
|
IN OPTIONAL PWCHAR pwc,
|
||||||
IN FLONG fl,
|
IN FLONG fl,
|
||||||
OUT PVOID pvBuf)
|
OUT PVOID Buffer)
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
STDCALL
|
|
||||||
NtGdiGetCharWidth32(HDC hDC,
|
|
||||||
UINT FirstChar,
|
|
||||||
UINT LastChar,
|
|
||||||
LPINT Buffer)
|
|
||||||
{
|
{
|
||||||
LPINT SafeBuffer;
|
LPINT SafeBuffer;
|
||||||
PDC dc;
|
PDC dc;
|
||||||
|
@ -2300,14 +2285,20 @@ NtGdiGetCharWidth32(HDC hDC,
|
||||||
FT_CharMap charmap, found = NULL;
|
FT_CharMap charmap, found = NULL;
|
||||||
UINT i, glyph_index, BufferSize;
|
UINT i, glyph_index, BufferSize;
|
||||||
HFONT hFont = 0;
|
HFONT hFont = 0;
|
||||||
|
PFLOAT BufF = NULL;
|
||||||
|
LPINT Buf = NULL;
|
||||||
|
|
||||||
if (LastChar < FirstChar)
|
if (fl == 0)
|
||||||
{
|
{
|
||||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
BufF = (PFLOAT) Buffer;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
Buf = (LPINT) Buffer;
|
||||||
|
|
||||||
BufferSize = (LastChar - FirstChar + 1) * sizeof(INT);
|
if (fl & GCW_INDICES) return FALSE;
|
||||||
|
|
||||||
|
BufferSize = Count * sizeof(INT);
|
||||||
SafeBuffer = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_GDITEXT);
|
SafeBuffer = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_GDITEXT);
|
||||||
if (SafeBuffer == NULL)
|
if (SafeBuffer == NULL)
|
||||||
{
|
{
|
||||||
|
@ -2369,7 +2360,7 @@ NtGdiGetCharWidth32(HDC hDC,
|
||||||
- TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight :
|
- TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight :
|
||||||
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? 11 : TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight));
|
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? 11 : TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight));
|
||||||
|
|
||||||
for (i = FirstChar; i <= LastChar; i++)
|
for (i = FirstChar; i < FirstChar+Count; i++)
|
||||||
{
|
{
|
||||||
glyph_index = FT_Get_Char_Index(face, i);
|
glyph_index = FT_Get_Char_Index(face, i);
|
||||||
FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
|
FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
|
||||||
|
@ -2410,7 +2401,7 @@ NtGdiGetGlyphIndicesW(
|
||||||
OUTLINETEXTMETRICW *potm;
|
OUTLINETEXTMETRICW *potm;
|
||||||
INT i;
|
INT i;
|
||||||
FT_Face face;
|
FT_Face face;
|
||||||
WCHAR DefChar = 0, tmDefaultChar;
|
WCHAR DefChar = 0;
|
||||||
PWSTR Buffer = NULL;
|
PWSTR Buffer = NULL;
|
||||||
ULONG Size;
|
ULONG Size;
|
||||||
|
|
||||||
|
@ -2441,18 +2432,20 @@ NtGdiGetGlyphIndicesW(
|
||||||
return GDI_ERROR;
|
return GDI_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Size = IntGetOutlineTextMetrics(FontGDI, 0, NULL);
|
|
||||||
potm = ExAllocatePoolWithTag(PagedPool, Size, TAG_GDITEXT);
|
|
||||||
if (!potm)
|
|
||||||
{
|
|
||||||
Status = ERROR_NOT_ENOUGH_MEMORY;
|
|
||||||
goto ErrorRet;
|
|
||||||
}
|
|
||||||
IntGetOutlineTextMetrics(FontGDI, Size, potm);
|
|
||||||
tmDefaultChar = potm->otmTextMetrics.tmDefaultChar; // May need this.
|
|
||||||
ExFreePool(potm);
|
|
||||||
|
|
||||||
if (iMode & GGI_MARK_NONEXISTING_GLYPHS) DefChar = 0x001f; /* Indicate non existence */
|
if (iMode & GGI_MARK_NONEXISTING_GLYPHS) DefChar = 0x001f; /* Indicate non existence */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Size = IntGetOutlineTextMetrics(FontGDI, 0, NULL);
|
||||||
|
potm = ExAllocatePoolWithTag(PagedPool, Size, TAG_GDITEXT);
|
||||||
|
if (!potm)
|
||||||
|
{
|
||||||
|
Status = ERROR_NOT_ENOUGH_MEMORY;
|
||||||
|
goto ErrorRet;
|
||||||
|
}
|
||||||
|
IntGetOutlineTextMetrics(FontGDI, Size, potm);
|
||||||
|
DefChar = potm->otmTextMetrics.tmDefaultChar; // May need this.
|
||||||
|
ExFreePool(potm);
|
||||||
|
}
|
||||||
|
|
||||||
_SEH_TRY
|
_SEH_TRY
|
||||||
{
|
{
|
||||||
|
@ -2474,11 +2467,7 @@ NtGdiGetGlyphIndicesW(
|
||||||
for (i = 0; i < cwc; i++)
|
for (i = 0; i < cwc; i++)
|
||||||
{
|
{
|
||||||
Buffer[i] = FT_Get_Char_Index(face, UnSafepwc[i]);
|
Buffer[i] = FT_Get_Char_Index(face, UnSafepwc[i]);
|
||||||
if (Buffer[i] == 0)
|
if (Buffer[i] == 0) Buffer[i] = DefChar;
|
||||||
{
|
|
||||||
if (!DefChar) DefChar = tmDefaultChar;
|
|
||||||
Buffer[i] = DefChar;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IntUnLockFreeType;
|
IntUnLockFreeType;
|
||||||
|
|
|
@ -746,9 +746,6 @@ NtGdiGdiComment 3
|
||||||
NtGdiGetAspectRatioFilterEx 2
|
NtGdiGetAspectRatioFilterEx 2
|
||||||
NtGdiGetBkColor 1
|
NtGdiGetBkColor 1
|
||||||
NtGdiGetBkMode 1
|
NtGdiGetBkMode 1
|
||||||
NtGdiGetBrushOrgEx 2
|
|
||||||
NtGdiGetCharABCWidths 4
|
|
||||||
NtGdiGetCharWidth32 4
|
|
||||||
NtGdiGetClipBox 2
|
NtGdiGetClipBox 2
|
||||||
NtGdiGetColorSpace 1
|
NtGdiGetColorSpace 1
|
||||||
NtGdiGetCurrentPositionEx 2
|
NtGdiGetCurrentPositionEx 2
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue