From 06ed81ecc0b4b9aada4d439a94c43e2411680dce Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Tue, 23 Jan 2007 11:03:12 +0100 Subject: [PATCH] usp10: Move text metrics into the script cache. Start using accessor functions. --- dlls/usp10/usp10.c | 80 +++++++++++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 32 deletions(-) diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c index 4aab525eeec..c03db35eb37 100644 --- a/dlls/usp10/usp10.c +++ b/dlls/usp10/usp10.c @@ -145,6 +145,8 @@ static const SCRIPT_PROPERTIES *script_props[] = typedef struct { HDC hdc; + LONG height; + WCHAR default_char; } ScriptCache; typedef struct { @@ -190,15 +192,50 @@ static inline void usp_free(LPVOID mem) HeapFree(GetProcessHeap(), 0, mem); } +static HDC get_cache_hdc(SCRIPT_CACHE *psc) +{ + return ((ScriptCache *)*psc)->hdc; +} + +static WCHAR get_cache_default_char(SCRIPT_CACHE *psc) +{ + return ((ScriptCache *)*psc)->default_char; +} + +static LONG get_cache_height(SCRIPT_CACHE *psc) +{ + return ((ScriptCache *)*psc)->height; +} + +static HRESULT init_script_cache(const HDC hdc, ScriptCache *sc) +{ + TEXTMETRICW metric; + + if (!GetTextMetricsW(hdc, &metric)) return E_INVALIDARG; + sc->height = metric.tmHeight; + sc->default_char = metric.tmDefaultChar; + sc->hdc = hdc; + return S_OK; +} + static HRESULT get_script_cache(const HDC hdc, SCRIPT_CACHE *psc) { if (!psc) return E_INVALIDARG; if (!*psc) { + HRESULT ret; + ScriptCache *sc; + if (!hdc) return E_PENDING; - if (!(*psc = usp_alloc(sizeof(ScriptCache)))) return E_OUTOFMEMORY; - ((ScriptCache *)*psc)->hdc = hdc; + if (!(sc = usp_zero_alloc(sizeof(ScriptCache)))) return E_OUTOFMEMORY; + if ((ret = init_script_cache(hdc, sc))) + { + usp_free(sc); + return ret; + } + *psc = sc; } + TRACE("<- %p\n", *psc); return S_OK; } @@ -284,7 +321,6 @@ HRESULT WINAPI ScriptGetProperties(const SCRIPT_PROPERTIES ***props, int *num) HRESULT WINAPI ScriptGetFontProperties(HDC hdc, SCRIPT_CACHE *psc, SCRIPT_FONTPROPERTIES *sfp) { HRESULT hr; - TEXTMETRICW ptm; TRACE("%p,%p,%p\n", hdc, psc, sfp); @@ -296,10 +332,7 @@ HRESULT WINAPI ScriptGetFontProperties(HDC hdc, SCRIPT_CACHE *psc, SCRIPT_FONTPR /* return something sensible? */ sfp->wgBlank = 0; - if (GetTextMetricsW(((ScriptCache *)*psc)->hdc, &ptm)) - sfp->wgDefault = ptm.tmDefaultChar; - else - sfp->wgDefault = 0; + sfp->wgDefault = get_cache_default_char(psc); sfp->wgInvalid = 0; sfp->wgKashida = 0xffff; sfp->iKashidaWidth = 0; @@ -1191,7 +1224,7 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars, TRACE("\n"); if (!psa->fNoGlyphIndex) { /* Glyph translate */ - if (!(GetGlyphIndicesW(((ScriptCache *)*psc)->hdc, pwcChars, cChars, pwOutGlyphs, 0))) + if (!(GetGlyphIndicesW(get_cache_hdc(psc), pwcChars, cChars, pwOutGlyphs, 0))) return S_FALSE; TRACE("After: "); @@ -1247,7 +1280,7 @@ HRESULT WINAPI ScriptPlace(HDC hdc, SCRIPT_CACHE *psc, const WORD *pwGlyphs, memset(pABC, 0, sizeof(ABC)); /* FIXME: set pGoffset to more reasonable values */ - if (!GetCharABCWidthsI(((ScriptCache *)*psc)->hdc, 0, cGlyphs, (WORD *) pwGlyphs, lpABC )) + if (!GetCharABCWidthsI(get_cache_hdc(psc), 0, cGlyphs, (WORD *) pwGlyphs, lpABC )) { WARN("Could not get ABC values\n"); for (wcnt = 0; wcnt < cGlyphs; wcnt++) { @@ -1311,7 +1344,7 @@ HRESULT WINAPI ScriptGetCMap(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcInChars TRACE("%4x",pwcInChars[cnt]); TRACE("\n"); - GetGlyphIndicesW(((ScriptCache *)*psc)->hdc, pwcInChars, cChars, pwOutGlyphs, 0); + GetGlyphIndicesW(get_cache_hdc(psc), pwcInChars, cChars, pwOutGlyphs, 0); TRACE("After: "); for (cnt = 0; cnt < cChars; cnt++) { @@ -1345,7 +1378,7 @@ HRESULT WINAPI ScriptTextOut(const HDC hdc, SCRIPT_CACHE *psc, int x, int y, UIN if (!psa->fNoGlyphIndex) /* Have Glyphs? */ fuOptions |= ETO_GLYPH_INDEX; /* Say don't do translation to glyph */ - if (!ExtTextOutW(((ScriptCache *)*psc)->hdc, x, y, fuOptions, lprc, pwGlyphs, cGlyphs, NULL)) + if (!ExtTextOutW(get_cache_hdc(psc), x, y, fuOptions, lprc, pwGlyphs, cGlyphs, NULL)) return S_FALSE; return S_OK; @@ -1368,17 +1401,13 @@ HRESULT WINAPI ScriptTextOut(const HDC hdc, SCRIPT_CACHE *psc, int x, int y, UIN HRESULT WINAPI ScriptCacheGetHeight(HDC hdc, SCRIPT_CACHE *psc, LONG *height) { HRESULT hr; - TEXTMETRICW metric; TRACE("(%p, %p, %p)\n", hdc, psc, height); if (!height) return E_INVALIDARG; if ((hr = get_script_cache(hdc, psc))) return hr; - /* FIXME: get this from the cache */ - if (!GetTextMetricsW(((ScriptCache *)*psc)->hdc, &metric)) return E_INVALIDARG; - - *height = metric.tmHeight; + *height = get_cache_height(psc); return S_OK; } @@ -1406,7 +1435,7 @@ HRESULT WINAPI ScriptGetGlyphABCWidth(HDC hdc, SCRIPT_CACHE *psc, WORD glyph, AB if ((hr = get_script_cache(hdc, psc))) return hr; /* FIXME: get this from the cache */ - if (!GetCharABCWidthsW(((ScriptCache *)*psc)->hdc, glyph, glyph, abc)) return E_HANDLE; + if (!GetCharABCWidthsW(get_cache_hdc(psc), glyph, glyph, abc)) return E_HANDLE; return S_OK; } @@ -1529,7 +1558,6 @@ const SIZE * WINAPI ScriptString_pSize(SCRIPT_STRING_ANALYSIS ssa) { unsigned int i, j; StringAnalysis *analysis = ssa; - TEXTMETRICW metric; TRACE("(%p)\n", ssa); @@ -1537,20 +1565,8 @@ const SIZE * WINAPI ScriptString_pSize(SCRIPT_STRING_ANALYSIS ssa) if (!analysis->sz) { - if (!(analysis->sz = usp_alloc(sizeof(SIZE)))) - return NULL; - - /* FIXME: These values should be calculated at a more - * appropriate place so that we can just pass cached - * values here. - */ - if (!GetTextMetricsW(analysis->sc->hdc, &metric)) - { - usp_free(analysis->sz); - analysis->sz = NULL; - return NULL; - } - analysis->sz->cy = metric.tmHeight; + if (!(analysis->sz = usp_alloc(sizeof(SIZE)))) return NULL; + analysis->sz->cy = analysis->sc->height; analysis->sz->cx = 0; for (i = 0; i < analysis->numItems; i++)