mirror of
https://github.com/reactos/reactos.git
synced 2024-10-15 13:45:58 +00:00
NtGdiGetChar/ABCWidth/sW now fully functional and tested good with AbiWord. Text looks very nice.
svn path=/trunk/; revision=30260
This commit is contained in:
parent
84c30a0495
commit
623bdd6fe3
|
@ -2143,7 +2143,8 @@ NtGdiGetCharABCWidthsW(
|
|||
IN FLONG fl,
|
||||
OUT PVOID Buffer)
|
||||
{
|
||||
LPABC SafeBuffer;
|
||||
LPABC SafeBuff;
|
||||
LPABCFLOAT SafeBuffF = NULL;
|
||||
PDC dc;
|
||||
PTEXTOBJ TextObj;
|
||||
PFONTGDI FontGDI;
|
||||
|
@ -2151,24 +2152,32 @@ NtGdiGetCharABCWidthsW(
|
|||
FT_CharMap charmap, found = NULL;
|
||||
UINT i, glyph_index, BufferSize;
|
||||
HFONT hFont = 0;
|
||||
NTSTATUS Status;
|
||||
LPABC abc = NULL;
|
||||
LPABCFLOAT abcf = NULL;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
|
||||
if (!fl)
|
||||
if(pwch)
|
||||
{
|
||||
abcf = (LPABCFLOAT) Buffer;
|
||||
// Not supported yet!
|
||||
_SEH_TRY
|
||||
{
|
||||
ProbeForRead(pwch,
|
||||
sizeof(PWSTR),
|
||||
1);
|
||||
}
|
||||
_SEH_HANDLE
|
||||
{
|
||||
Status = _SEH_GetExceptionCode();
|
||||
}
|
||||
_SEH_END;
|
||||
}
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastWin32Error(Status);
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
abc = (LPABC) Buffer;
|
||||
|
||||
if (fl & GCABCW_INDICES) return FALSE; // Not supported yet!
|
||||
|
||||
BufferSize = Count * sizeof(ABC);
|
||||
SafeBuffer = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_GDITEXT);
|
||||
if (SafeBuffer == NULL)
|
||||
BufferSize = Count * sizeof(ABC); // Same size!
|
||||
SafeBuff = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_GDITEXT);
|
||||
if (!fl) SafeBuffF = (LPABCFLOAT) SafeBuff;
|
||||
if (SafeBuff == NULL)
|
||||
{
|
||||
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
|
||||
return FALSE;
|
||||
|
@ -2177,7 +2186,7 @@ NtGdiGetCharABCWidthsW(
|
|||
dc = DC_LockDc(hDC);
|
||||
if (dc == NULL)
|
||||
{
|
||||
ExFreePool(SafeBuffer);
|
||||
ExFreePool(SafeBuff);
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -2187,7 +2196,7 @@ NtGdiGetCharABCWidthsW(
|
|||
|
||||
if (TextObj == NULL)
|
||||
{
|
||||
ExFreePool(SafeBuffer);
|
||||
ExFreePool(SafeBuff);
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -2210,7 +2219,7 @@ NtGdiGetCharABCWidthsW(
|
|||
if (!found)
|
||||
{
|
||||
DPRINT1("WARNING: Could not find desired charmap!\n");
|
||||
ExFreePool(SafeBuffer);
|
||||
ExFreePool(SafeBuff);
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -2231,7 +2240,20 @@ NtGdiGetCharABCWidthsW(
|
|||
{
|
||||
int adv, lsb, bbx, left, right;
|
||||
|
||||
glyph_index = FT_Get_Char_Index(face, i);
|
||||
if (pwch)
|
||||
{
|
||||
if (fl & GCABCW_INDICES)
|
||||
glyph_index = pwch[i - FirstChar];
|
||||
else
|
||||
glyph_index = FT_Get_Char_Index(face, pwch[i - FirstChar]);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (fl & GCABCW_INDICES)
|
||||
glyph_index = i;
|
||||
else
|
||||
glyph_index = FT_Get_Char_Index(face, i);
|
||||
}
|
||||
FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
|
||||
|
||||
left = (INT)face->glyph->metrics.horiBearingX & -64;
|
||||
|
@ -2246,20 +2268,29 @@ NtGdiGetCharABCWidthsW(
|
|||
/*
|
||||
DPRINT1("lsb %d and bbx %d\n", lsb, bbx );
|
||||
*/
|
||||
SafeBuffer[i - FirstChar].abcA = lsb;
|
||||
SafeBuffer[i - FirstChar].abcB = bbx;
|
||||
SafeBuffer[i - FirstChar].abcC = adv - lsb - bbx;
|
||||
if (!fl)
|
||||
{
|
||||
SafeBuffF[i - FirstChar].abcfA = (FLOAT) lsb;
|
||||
SafeBuffF[i - FirstChar].abcfB = (FLOAT) bbx;
|
||||
SafeBuffF[i - FirstChar].abcfC = (FLOAT) (adv - lsb - bbx);
|
||||
}
|
||||
else
|
||||
{
|
||||
SafeBuff[i - FirstChar].abcA = lsb;
|
||||
SafeBuff[i - FirstChar].abcB = bbx;
|
||||
SafeBuff[i - FirstChar].abcC = adv - lsb - bbx;
|
||||
}
|
||||
}
|
||||
IntUnLockFreeType;
|
||||
TEXTOBJ_UnlockText(TextObj);
|
||||
Status = MmCopyToCaller(abc, SafeBuffer, BufferSize);
|
||||
Status = MmCopyToCaller(Buffer, SafeBuff, BufferSize);
|
||||
if (! NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastNtError(Status);
|
||||
ExFreePool(SafeBuffer);
|
||||
ExFreePool(SafeBuff);
|
||||
return FALSE;
|
||||
}
|
||||
ExFreePool(SafeBuffer);
|
||||
ExFreePool(SafeBuff);
|
||||
DPRINT("NtGdiGetCharABCWidths Worked!\n");
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -2277,7 +2308,9 @@ NtGdiGetCharWidthW(
|
|||
IN FLONG fl,
|
||||
OUT PVOID Buffer)
|
||||
{
|
||||
LPINT SafeBuffer;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
LPINT SafeBuff;
|
||||
PFLOAT SafeBuffF = NULL;
|
||||
PDC dc;
|
||||
PTEXTOBJ TextObj;
|
||||
PFONTGDI FontGDI;
|
||||
|
@ -2285,22 +2318,31 @@ NtGdiGetCharWidthW(
|
|||
FT_CharMap charmap, found = NULL;
|
||||
UINT i, glyph_index, BufferSize;
|
||||
HFONT hFont = 0;
|
||||
PFLOAT BufF = NULL;
|
||||
LPINT Buf = NULL;
|
||||
|
||||
if (fl == 0)
|
||||
if(pwc)
|
||||
{
|
||||
BufF = (PFLOAT) Buffer;
|
||||
_SEH_TRY
|
||||
{
|
||||
ProbeForRead(pwc,
|
||||
sizeof(PWSTR),
|
||||
1);
|
||||
}
|
||||
_SEH_HANDLE
|
||||
{
|
||||
Status = _SEH_GetExceptionCode();
|
||||
}
|
||||
_SEH_END;
|
||||
}
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastWin32Error(Status);
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
Buf = (LPINT) Buffer;
|
||||
|
||||
if (fl & GCW_INDICES) return FALSE;
|
||||
|
||||
BufferSize = Count * sizeof(INT);
|
||||
SafeBuffer = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_GDITEXT);
|
||||
if (SafeBuffer == NULL)
|
||||
BufferSize = Count * sizeof(INT); // Same size!
|
||||
SafeBuff = ExAllocatePoolWithTag(PagedPool, BufferSize, TAG_GDITEXT);
|
||||
if (!fl) SafeBuffF = (PFLOAT) SafeBuff;
|
||||
if (SafeBuff == NULL)
|
||||
{
|
||||
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
|
||||
return FALSE;
|
||||
|
@ -2309,7 +2351,7 @@ NtGdiGetCharWidthW(
|
|||
dc = DC_LockDc(hDC);
|
||||
if (dc == NULL)
|
||||
{
|
||||
ExFreePool(SafeBuffer);
|
||||
ExFreePool(SafeBuff);
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -2319,7 +2361,7 @@ NtGdiGetCharWidthW(
|
|||
|
||||
if (TextObj == NULL)
|
||||
{
|
||||
ExFreePool(SafeBuffer);
|
||||
ExFreePool(SafeBuff);
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -2342,7 +2384,7 @@ NtGdiGetCharWidthW(
|
|||
if (!found)
|
||||
{
|
||||
DPRINT1("WARNING: Could not find desired charmap!\n");
|
||||
ExFreePool(SafeBuffer);
|
||||
ExFreePool(SafeBuff);
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -2362,14 +2404,30 @@ NtGdiGetCharWidthW(
|
|||
|
||||
for (i = FirstChar; i < FirstChar+Count; i++)
|
||||
{
|
||||
glyph_index = FT_Get_Char_Index(face, i);
|
||||
if (pwc)
|
||||
{
|
||||
if (fl & GCW_INDICES)
|
||||
glyph_index = pwc[i - FirstChar];
|
||||
else
|
||||
glyph_index = FT_Get_Char_Index(face, pwc[i - FirstChar]);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (fl & GCW_INDICES)
|
||||
glyph_index = i;
|
||||
else
|
||||
glyph_index = FT_Get_Char_Index(face, i);
|
||||
}
|
||||
FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
|
||||
SafeBuffer[i - FirstChar] = (face->glyph->advance.x + 32) >> 6;
|
||||
if (!fl)
|
||||
SafeBuffF[i - FirstChar] = (FLOAT) ((face->glyph->advance.x + 32) >> 6);
|
||||
else
|
||||
SafeBuff[i - FirstChar] = (face->glyph->advance.x + 32) >> 6;
|
||||
}
|
||||
IntUnLockFreeType;
|
||||
TEXTOBJ_UnlockText(TextObj);
|
||||
MmCopyToCaller(Buffer, SafeBuffer, BufferSize);
|
||||
ExFreePool(SafeBuffer);
|
||||
MmCopyToCaller(Buffer, SafeBuff, BufferSize);
|
||||
ExFreePool(SafeBuff);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue