Aric Stewart : usp10: Respect the presence or absence of the SSA_GLYPHS flag.
Alexandre Julliard
julliard at winehq.org
Fri Sep 9 10:56:45 CDT 2011
Module: wine
Branch: master
Commit: 7ae0b72e2fd5ec97d3d8fde61b4626ec76880ee1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7ae0b72e2fd5ec97d3d8fde61b4626ec76880ee1
Author: Aric Stewart <aric at codeweavers.com>
Date: Thu Sep 8 12:50:10 2011 -0500
usp10: Respect the presence or absence of the SSA_GLYPHS flag.
---
dlls/usp10/usp10.c | 99 ++++++++++++++++++++++++++++++---------------------
1 files changed, 58 insertions(+), 41 deletions(-)
diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
index e2a1756..9095fe3 100644
--- a/dlls/usp10/usp10.c
+++ b/dlls/usp10/usp10.c
@@ -972,45 +972,53 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString,
goto error;
}
- if (!(analysis->glyphs = heap_alloc_zero(sizeof(StringGlyphs) * analysis->numItems)))
- goto error;
-
if (!(analysis->logical2visual = heap_alloc_zero(sizeof(int) * analysis->numItems)))
goto error;
if (!(BidiLevel = heap_alloc_zero(analysis->numItems)))
goto error;
- for (i = 0; i < analysis->numItems; i++)
+ if (dwFlags & SSA_GLYPHS)
{
- SCRIPT_CACHE *sc = (SCRIPT_CACHE *)&analysis->sc;
- int cChar = analysis->pItem[i+1].iCharPos - analysis->pItem[i].iCharPos;
- int numGlyphs = 1.5 * cChar + 16;
- WORD *glyphs = heap_alloc_zero(sizeof(WORD) * numGlyphs);
- WORD *pwLogClust = heap_alloc_zero(sizeof(WORD) * cChar);
- int *piAdvance = heap_alloc_zero(sizeof(int) * numGlyphs);
- SCRIPT_VISATTR *psva = heap_alloc_zero(sizeof(SCRIPT_VISATTR) * cChar);
- GOFFSET *pGoffset = heap_alloc_zero(sizeof(GOFFSET) * numGlyphs);
- ABC *abc = heap_alloc_zero(sizeof(ABC));
- int numGlyphsReturned;
-
- /* FIXME: non unicode strings */
- const WCHAR* pStr = (const WCHAR*)pString;
- hr = ScriptShape(hdc, sc, &pStr[analysis->pItem[i].iCharPos],
- cChar, numGlyphs, &analysis->pItem[i].a,
- glyphs, pwLogClust, psva, &numGlyphsReturned);
- hr = ScriptPlace(hdc, sc, glyphs, numGlyphsReturned, psva, &analysis->pItem[i].a,
- piAdvance, pGoffset, abc);
-
- analysis->glyphs[i].numGlyphs = numGlyphsReturned;
- analysis->glyphs[i].glyphs = glyphs;
- analysis->glyphs[i].pwLogClust = pwLogClust;
- analysis->glyphs[i].piAdvance = piAdvance;
- analysis->glyphs[i].psva = psva;
- analysis->glyphs[i].pGoffset = pGoffset;
- analysis->glyphs[i].abc = abc;
- analysis->glyphs[i].iMaxPosX= -1;
-
- BidiLevel[i] = analysis->pItem[i].a.s.uBidiLevel;
+ if (!(analysis->glyphs = heap_alloc_zero(sizeof(StringGlyphs) * analysis->numItems)))
+ goto error;
+
+ for (i = 0; i < analysis->numItems; i++)
+ {
+ SCRIPT_CACHE *sc = (SCRIPT_CACHE *)&analysis->sc;
+ int cChar = analysis->pItem[i+1].iCharPos - analysis->pItem[i].iCharPos;
+ int numGlyphs = 1.5 * cChar + 16;
+ WORD *glyphs = heap_alloc_zero(sizeof(WORD) * numGlyphs);
+ WORD *pwLogClust = heap_alloc_zero(sizeof(WORD) * cChar);
+ int *piAdvance = heap_alloc_zero(sizeof(int) * numGlyphs);
+ SCRIPT_VISATTR *psva = heap_alloc_zero(sizeof(SCRIPT_VISATTR) * cChar);
+ GOFFSET *pGoffset = heap_alloc_zero(sizeof(GOFFSET) * numGlyphs);
+ ABC *abc = heap_alloc_zero(sizeof(ABC));
+ int numGlyphsReturned;
+
+ /* FIXME: non unicode strings */
+ const WCHAR* pStr = (const WCHAR*)pString;
+ hr = ScriptShape(hdc, sc, &pStr[analysis->pItem[i].iCharPos],
+ cChar, numGlyphs, &analysis->pItem[i].a,
+ glyphs, pwLogClust, psva, &numGlyphsReturned);
+ hr = ScriptPlace(hdc, sc, glyphs, numGlyphsReturned, psva, &analysis->pItem[i].a,
+ piAdvance, pGoffset, abc);
+
+ analysis->glyphs[i].numGlyphs = numGlyphsReturned;
+ analysis->glyphs[i].glyphs = glyphs;
+ analysis->glyphs[i].pwLogClust = pwLogClust;
+ analysis->glyphs[i].piAdvance = piAdvance;
+ analysis->glyphs[i].psva = psva;
+ analysis->glyphs[i].pGoffset = pGoffset;
+ analysis->glyphs[i].abc = abc;
+ analysis->glyphs[i].iMaxPosX= -1;
+
+ BidiLevel[i] = analysis->pItem[i].a.s.uBidiLevel;
+ }
+ }
+ else
+ {
+ for (i = 0; i < analysis->numItems; i++)
+ BidiLevel[i] = analysis->pItem[i].a.s.uBidiLevel;
}
ScriptLayout(analysis->numItems, BidiLevel, NULL, analysis->logical2visual);
@@ -1165,6 +1173,7 @@ HRESULT WINAPI ScriptStringOut(SCRIPT_STRING_ANALYSIS ssa,
ssa, iX, iY, uOptions, prc, iMinSel, iMaxSel, fDisabled);
if (!(analysis = ssa)) return E_INVALIDARG;
+ if (!(analysis->dwFlags & SSA_GLYPHS)) return E_INVALIDARG;
for (item = 0; item < analysis->numItems; item++)
{
@@ -1201,6 +1210,7 @@ HRESULT WINAPI ScriptStringCPtoX(SCRIPT_STRING_ANALYSIS ssa, int icp, BOOL fTrai
TRACE("(%p), %d, %d, (%p)\n", ssa, icp, fTrailing, pX);
if (!ssa || !pX) return S_FALSE;
+ if (!(analysis->dwFlags & SSA_GLYPHS)) return S_FALSE;
/* icp out of range */
if(icp < 0)
@@ -1262,6 +1272,7 @@ HRESULT WINAPI ScriptStringXtoCP(SCRIPT_STRING_ANALYSIS ssa, int iX, int* piCh,
TRACE("(%p), %d, (%p), (%p)\n", ssa, iX, piCh, piTrailing);
if (!ssa || !piCh || !piTrailing) return S_FALSE;
+ if (!(analysis->dwFlags & SSA_GLYPHS)) return S_FALSE;
/* out of range */
if(iX < 0)
@@ -1348,17 +1359,20 @@ HRESULT WINAPI ScriptStringFree(SCRIPT_STRING_ANALYSIS *pssa)
invalid = analysis->invalid;
ScriptFreeCache((SCRIPT_CACHE *)&analysis->sc);
- for (i = 0; i < analysis->numItems; i++)
+ if (analysis->glyphs)
{
- heap_free(analysis->glyphs[i].glyphs);
- heap_free(analysis->glyphs[i].pwLogClust);
- heap_free(analysis->glyphs[i].piAdvance);
- heap_free(analysis->glyphs[i].psva);
- heap_free(analysis->glyphs[i].pGoffset);
- heap_free(analysis->glyphs[i].abc);
+ for (i = 0; i < analysis->numItems; i++)
+ {
+ heap_free(analysis->glyphs[i].glyphs);
+ heap_free(analysis->glyphs[i].pwLogClust);
+ heap_free(analysis->glyphs[i].piAdvance);
+ heap_free(analysis->glyphs[i].psva);
+ heap_free(analysis->glyphs[i].pGoffset);
+ heap_free(analysis->glyphs[i].abc);
+ }
+ heap_free(analysis->glyphs);
}
- heap_free(analysis->glyphs);
heap_free(analysis->pItem);
heap_free(analysis->logattrs);
heap_free(analysis->sz);
@@ -2271,6 +2285,7 @@ HRESULT WINAPI ScriptStringGetLogicalWidths(SCRIPT_STRING_ANALYSIS ssa, int *piD
TRACE("%p, %p\n", ssa, piDx);
if (!analysis) return S_FALSE;
+ if (!(analysis->dwFlags & SSA_GLYPHS)) return S_FALSE;
for (i = 0; i < analysis->numItems; i++)
{
@@ -2326,6 +2341,7 @@ const SIZE * WINAPI ScriptString_pSize(SCRIPT_STRING_ANALYSIS ssa)
TRACE("(%p)\n", ssa);
if (!analysis) return NULL;
+ if (!(analysis->dwFlags & SSA_GLYPHS)) return NULL;
if (!analysis->sz)
{
@@ -2407,6 +2423,7 @@ HRESULT WINAPI ScriptStringGetOrder(SCRIPT_STRING_ANALYSIS ssa, UINT *order)
TRACE("(%p)\n", ssa);
if (!analysis) return S_FALSE;
+ if (!(analysis->dwFlags & SSA_GLYPHS)) return S_FALSE;
/* FIXME: handle RTL scripts */
for (i = 0, k = 0; i < analysis->numItems; i++)
More information about the wine-cvs
mailing list