[LPK] Refactoring (#622).

- Moved lpDx and lpGlyphs operations to seperate brackets.
- lpGlyphs == NULL checks + memory managment additions.

CORE-14732
This commit is contained in:
Baruch Rutman 2018-06-18 12:07:16 +03:00 committed by Hermès Bélusca-Maïto
parent bfc6b719cf
commit 33d3e56cf4
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0

View file

@ -63,9 +63,6 @@ LpkExtTextOut(
const INT *lpDx, const INT *lpDx,
INT unknown) INT unknown)
{ {
LPWORD glyphs = NULL;
INT cGlyphs;
UNREFERENCED_PARAMETER(unknown); UNREFERENCED_PARAMETER(unknown);
if (!(fuOptions & ETO_IGNORELANGUAGE)) if (!(fuOptions & ETO_IGNORELANGUAGE))
@ -81,16 +78,30 @@ LpkExtTextOut(
/* Check if the string requires complex script processing and not a "glyph indices" array */ /* Check if the string requires complex script processing and not a "glyph indices" array */
if (ScriptIsComplex(lpString, uCount, SIC_COMPLEX) == S_OK && !(fuOptions & ETO_GLYPH_INDEX)) if (ScriptIsComplex(lpString, uCount, SIC_COMPLEX) == S_OK && !(fuOptions & ETO_GLYPH_INDEX))
{ {
LPWORD glyphs = NULL;
LPWSTR reordered_str = HeapAlloc(GetProcessHeap(), 0, uCount * sizeof(WCHAR));
INT cGlyphs;
BOOL bResult;
BIDI_Reorder(hdc, lpString, uCount, GCP_REORDER, BIDI_Reorder(hdc, lpString, uCount, GCP_REORDER,
(fuOptions & ETO_RTLREADING) ? WINE_GCPW_FORCE_RTL : WINE_GCPW_FORCE_LTR, (fuOptions & ETO_RTLREADING) ? WINE_GCPW_FORCE_RTL : WINE_GCPW_FORCE_LTR,
NULL, uCount, NULL, &glyphs, &cGlyphs); reordered_str, uCount, NULL, &glyphs, &cGlyphs);
fuOptions |= ETO_GLYPH_INDEX; if (glyphs)
{
fuOptions |= ETO_GLYPH_INDEX;
if (uCount > cGlyphs) if (uCount != cGlyphs)
cGlyphs = uCount; uCount = cGlyphs;
}
return ExtTextOutW(hdc, x, y, fuOptions, lprc, (LPWSTR)glyphs, cGlyphs, lpDx); bResult = ExtTextOutW(hdc, x, y, fuOptions, lprc,
glyphs ? (LPWSTR)glyphs : reordered_str, uCount, lpDx);
HeapFree(GetProcessHeap(), 0, glyphs);
HeapFree(GetProcessHeap(), 0, reordered_str);
return bResult;
} }
return ExtTextOutW(hdc, x, y, fuOptions, lprc, lpString, uCount, lpDx); return ExtTextOutW(hdc, x, y, fuOptions, lprc, lpString, uCount, lpDx);
@ -132,28 +143,38 @@ LpkGetCharacterPlacement(
lpResults->nGlyphs = (UINT)cGlyphs; lpResults->nGlyphs = (UINT)cGlyphs;
if (lpResults->lpGlyphs) if (lpResults->lpGlyphs)
wcscpy(lpResults->lpGlyphs, lpGlyphs);
if (lpResults->lpDx && !(dwFlags & GCP_GLYPHSHAPE))
{ {
int c; if (lpGlyphs)
for (i = 0; i < nSet; i++) wcscpy(lpResults->lpGlyphs, lpGlyphs);
{
if (GetCharWidth32W(hdc, lpResults->lpOutString[i], lpResults->lpOutString[i], &c)) else if (lpResults->lpOutString)
lpResults->lpDx[i] = c; GetGlyphIndicesW(hdc, lpResults->lpOutString, nSet, lpResults->lpGlyphs, 0);
}
} }
/* If glyph shaping was requested */ if (lpResults->lpDx)
else if (lpResults->lpDx && (dwFlags & GCP_GLYPHSHAPE))
{ {
int c; /* If glyph shaping was requested */
if(dwFlags & GCP_GLYPHSHAPE)
if (lpResults->lpGlyphs)
{ {
for (i = 0; i < lpResults->nGlyphs; i++) int c;
if (lpResults->lpGlyphs)
{ {
if (GetCharWidth32W(hdc, lpGlyphs[i], lpGlyphs[i], &c)) for (i = 0; i < lpResults->nGlyphs; i++)
{
if (GetCharWidth32W(hdc, lpResults->lpGlyphs[i], lpResults->lpGlyphs[i], &c))
lpResults->lpDx[i] = c;
}
}
}
else
{
int c;
for (i = 0; i < nSet; i++)
{
if (GetCharWidth32W(hdc, lpResults->lpOutString[i], lpResults->lpOutString[i], &c))
lpResults->lpDx[i] = c; lpResults->lpDx[i] = c;
} }
} }