int* piAdvance;
SCRIPT_VISATTR* psva;
GOFFSET* pGoffset;
- ABC* abc;
+ ABC abc;
int iMaxPosX;
HFONT fallbackFont;
} StringGlyphs;
+enum stringanalysis_flags
+{
+ SCRIPT_STRING_ANALYSIS_FLAGS_SIZE = 0x1,
+ SCRIPT_STRING_ANALYSIS_FLAGS_INVALID = 0x2,
+};
+
typedef struct {
HDC hdc;
- DWORD dwFlags;
- BOOL invalid;
+ DWORD ssa_flags;
+ DWORD flags;
int clip_len;
int cItems;
int cMaxGlyphs;
int numItems;
StringGlyphs* glyphs;
SCRIPT_LOGATTR* logattrs;
- SIZE* sz;
+ SIZE sz;
int* logical2visual;
} StringAnalysis;
/* TODO Fix font properties on Arabic locale */
static inline BOOL set_cache_font_properties(const HDC hdc, ScriptCache *sc)
{
+ sc->sfp.cBytes = sizeof(sc->sfp);
+
if (!sc->sfnt)
{
sc->sfp.wgBlank = sc->tm.tmBreakChar;
static inline void get_cache_font_properties(SCRIPT_FONTPROPERTIES *sfp, ScriptCache *sc)
{
- sfp->wgBlank = sc->sfp.wgBlank;
- sfp->wgDefault = sc->sfp.wgDefault;
- sfp->wgInvalid = sc->sfp.wgInvalid;
- sfp->wgKashida = sc->sfp.wgKashida;
- sfp->iKashidaWidth = sc->sfp.iKashidaWidth;
+ *sfp = sc->sfp;
}
static inline LONG get_cache_height(SCRIPT_CACHE *psc)
/* FIXME: handle clipping */
analysis->clip_len = cString;
analysis->hdc = hdc;
- analysis->dwFlags = dwFlags;
+ analysis->ssa_flags = dwFlags;
if (psState)
sState = *psState;
int *piAdvance = heap_alloc_zero(sizeof(int) * numGlyphs);
SCRIPT_VISATTR *psva = heap_alloc_zero(sizeof(SCRIPT_VISATTR) * numGlyphs);
GOFFSET *pGoffset = heap_alloc_zero(sizeof(GOFFSET) * numGlyphs);
- ABC *abc = heap_alloc_zero(sizeof(ABC));
int numGlyphsReturned;
HFONT originalFont = 0x0;
const WCHAR* pStr = (const WCHAR*)pString;
analysis->glyphs[i].fallbackFont = NULL;
- if (!glyphs || !pwLogClust || !piAdvance || !psva || !pGoffset || !abc)
+ if (!glyphs || !pwLogClust || !piAdvance || !psva || !pGoffset)
{
heap_free (BidiLevel);
heap_free (glyphs);
heap_free (piAdvance);
heap_free (psva);
heap_free (pGoffset);
- heap_free (abc);
hr = E_OUTOFMEMORY;
goto error;
}
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);
+ piAdvance, pGoffset, &analysis->glyphs[i].abc);
if (originalFont)
SelectObject(hdc,originalFont);
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;
ssa, iX, iY, uOptions, wine_dbgstr_rect(prc), iMinSel, iMaxSel, fDisabled);
if (!(analysis = ssa)) return E_INVALIDARG;
- if (!(analysis->dwFlags & SSA_GLYPHS)) return E_INVALIDARG;
+ if (!(analysis->ssa_flags & SSA_GLYPHS)) return E_INVALIDARG;
for (item = 0; item < analysis->numItems; item++)
{
TRACE("(%p), %d, %d, (%p)\n", ssa, icp, fTrailing, pX);
if (!ssa || !pX) return S_FALSE;
- if (!(analysis->dwFlags & SSA_GLYPHS)) return S_FALSE;
+ if (!(analysis->ssa_flags & SSA_GLYPHS)) return S_FALSE;
/* icp out of range */
if(icp < 0)
{
- analysis->invalid = TRUE;
+ analysis->flags |= SCRIPT_STRING_ANALYSIS_FLAGS_INVALID;
return E_INVALIDARG;
}
}
/* icp out of range */
- analysis->invalid = TRUE;
+ analysis->flags |= SCRIPT_STRING_ANALYSIS_FLAGS_INVALID;
return E_INVALIDARG;
}
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;
+ if (!(analysis->ssa_flags & SSA_GLYPHS)) return S_FALSE;
/* out of range */
if(iX < 0)
if (!pssa || !(analysis = *pssa)) return E_INVALIDARG;
- invalid = analysis->invalid;
+ invalid = analysis->flags & SCRIPT_STRING_ANALYSIS_FLAGS_INVALID;
if (analysis->glyphs)
{
heap_free(analysis->glyphs[i].piAdvance);
heap_free(analysis->glyphs[i].psva);
heap_free(analysis->glyphs[i].pGoffset);
- heap_free(analysis->glyphs[i].abc);
if (analysis->glyphs[i].fallbackFont)
DeleteObject(analysis->glyphs[i].fallbackFont);
ScriptFreeCache((SCRIPT_CACHE *)&analysis->glyphs[i].sc);
heap_free(analysis->pItem);
heap_free(analysis->logattrs);
- heap_free(analysis->sz);
heap_free(analysis->logical2visual);
heap_free(analysis);
iPosX = 0.0;
for (item=0; item < iCP && item < cChars; item++)
{
- if (iSpecial == -1 && (iCluster == -1 || (iCluster != -1 && iCluster+clust_size <= item)))
+ if (iSpecial == -1 && (iCluster == -1 || iCluster+clust_size <= item))
{
int check;
int clust = pwLogClust[item];
for (i = 0; i < len; i+=consumed)
{
- if (i >= len)
- break;
-
if ((flag & SIC_ASCIIDIGIT) && chars[i] >= 0x30 && chars[i] <= 0x39)
return S_OK;
TRACE("%p, %p\n", ssa, piDx);
if (!analysis) return S_FALSE;
- if (!(analysis->dwFlags & SSA_GLYPHS)) return S_FALSE;
+ if (!(analysis->ssa_flags & SSA_GLYPHS)) return S_FALSE;
for (i = 0; i < analysis->numItems; i++)
{
TRACE("(%p)\n", ssa);
if (!analysis) return E_INVALIDARG;
- return (analysis->invalid) ? S_FALSE : S_OK;
+ return analysis->flags & SCRIPT_STRING_ANALYSIS_FLAGS_INVALID ? S_FALSE : S_OK;
}
/***********************************************************************
TRACE("(%p)\n", ssa);
if (!analysis) return NULL;
- if (!(analysis->dwFlags & SSA_GLYPHS)) return NULL;
+ if (!(analysis->ssa_flags & SSA_GLYPHS)) return NULL;
- if (!analysis->sz)
+ if (!(analysis->flags & SCRIPT_STRING_ANALYSIS_FLAGS_SIZE))
{
- if (!(analysis->sz = heap_alloc(sizeof(SIZE)))) return NULL;
- analysis->sz->cy = analysis->glyphs[0].sc->tm.tmHeight;
+ analysis->sz.cy = analysis->glyphs[0].sc->tm.tmHeight;
- analysis->sz->cx = 0;
+ analysis->sz.cx = 0;
for (i = 0; i < analysis->numItems; i++)
{
- if (analysis->glyphs[i].sc->tm.tmHeight > analysis->sz->cy)
- analysis->sz->cy = analysis->glyphs[i].sc->tm.tmHeight;
+ if (analysis->glyphs[i].sc->tm.tmHeight > analysis->sz.cy)
+ analysis->sz.cy = analysis->glyphs[i].sc->tm.tmHeight;
for (j = 0; j < analysis->glyphs[i].numGlyphs; j++)
- analysis->sz->cx += analysis->glyphs[i].piAdvance[j];
+ analysis->sz.cx += analysis->glyphs[i].piAdvance[j];
}
}
- return analysis->sz;
+ return &analysis->sz;
}
/***********************************************************************
TRACE("(%p)\n", ssa);
if (!analysis) return NULL;
- if (!(analysis->dwFlags & SSA_BREAK)) return NULL;
+ if (!(analysis->ssa_flags & SSA_BREAK)) return NULL;
return analysis->logattrs;
}
TRACE("(%p)\n", ssa);
if (!analysis) return S_FALSE;
- if (!(analysis->dwFlags & SSA_GLYPHS)) return S_FALSE;
+ if (!(analysis->ssa_flags & SSA_GLYPHS)) return S_FALSE;
/* FIXME: handle RTL scripts */
for (i = 0, k = 0; i < analysis->numItems; i++)