usp10: Have ScriptShape respect fLogicalOrder and fRTL when ordering glyphs.

This commit is contained in:
Aric Stewart 2010-04-14 10:00:37 -05:00 committed by Alexandre Julliard
parent 6aeffb53ee
commit 51bbd9299f
1 changed files with 17 additions and 6 deletions

View File

@ -1332,6 +1332,7 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars,
{ {
HRESULT hr; HRESULT hr;
unsigned int i; unsigned int i;
BOOL rtl;
TRACE("(%p, %p, %s, %d, %d, %p, %p, %p, %p, %p)\n", hdc, psc, debugstr_wn(pwcChars, cChars), TRACE("(%p, %p, %s, %d, %d, %p, %p, %p, %p, %p)\n", hdc, psc, debugstr_wn(pwcChars, cChars),
cChars, cMaxGlyphs, psa, pwOutGlyphs, pwLogClust, psva, pcGlyphs); cChars, cMaxGlyphs, psa, pwOutGlyphs, pwLogClust, psva, pcGlyphs);
@ -1341,6 +1342,7 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars,
if (!psva || !pcGlyphs) return E_INVALIDARG; if (!psva || !pcGlyphs) return E_INVALIDARG;
if (cChars > cMaxGlyphs) return E_OUTOFMEMORY; if (cChars > cMaxGlyphs) return E_OUTOFMEMORY;
rtl = (!psa->fLogicalOrder && psa->fRTL);
*pcGlyphs = cChars; *pcGlyphs = cChars;
if ((hr = init_script_cache(hdc, psc)) != S_OK) return hr; if ((hr = init_script_cache(hdc, psc)) != S_OK) return hr;
@ -1350,33 +1352,42 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars,
{ {
for (i = 0; i < cChars; i++) for (i = 0; i < cChars; i++)
{ {
if (!(pwOutGlyphs[i] = get_cache_glyph(psc, pwcChars[i]))) int idx = i;
if (rtl) idx = cChars - 1 - i;
if (!(pwOutGlyphs[i] = get_cache_glyph(psc, pwcChars[idx])))
{ {
WORD glyph; WORD glyph;
if (!hdc) return E_PENDING; if (!hdc) return E_PENDING;
if (GetGlyphIndicesW(hdc, &pwcChars[i], 1, &glyph, 0) == GDI_ERROR) return S_FALSE; if (GetGlyphIndicesW(hdc, &pwcChars[idx], 1, &glyph, 0) == GDI_ERROR) return S_FALSE;
pwOutGlyphs[i] = set_cache_glyph(psc, pwcChars[i], glyph); pwOutGlyphs[i] = set_cache_glyph(psc, pwcChars[idx], glyph);
} }
} }
} }
else else
{ {
TRACE("no glyph translation\n"); TRACE("no glyph translation\n");
for (i = 0; i < cChars; i++) pwOutGlyphs[i] = pwcChars[i]; for (i = 0; i < cChars; i++)
{
int idx = i;
if (rtl) idx = cChars - 1 - i;
pwOutGlyphs[i] = pwcChars[idx];
}
} }
/* set up a valid SCRIPT_VISATTR and LogClust for each char in this run */ /* set up a valid SCRIPT_VISATTR and LogClust for each char in this run */
for (i = 0; i < cChars; i++) for (i = 0; i < cChars; i++)
{ {
int idx = i;
if (rtl) idx = cChars - 1 - i;
/* FIXME: set to better values */ /* FIXME: set to better values */
psva[i].uJustification = (pwcChars[i] == ' ') ? SCRIPT_JUSTIFY_BLANK : SCRIPT_JUSTIFY_CHARACTER; psva[i].uJustification = (pwcChars[idx] == ' ') ? SCRIPT_JUSTIFY_BLANK : SCRIPT_JUSTIFY_CHARACTER;
psva[i].fClusterStart = 1; psva[i].fClusterStart = 1;
psva[i].fDiacritic = 0; psva[i].fDiacritic = 0;
psva[i].fZeroWidth = 0; psva[i].fZeroWidth = 0;
psva[i].fReserved = 0; psva[i].fReserved = 0;
psva[i].fShapeReserved = 0; psva[i].fShapeReserved = 0;
pwLogClust[i] = i; pwLogClust[i] = idx;
} }
return S_OK; return S_OK;
} }