Module: wine Branch: master Commit: 06ed81ecc0b4b9aada4d439a94c43e2411680dce URL: http://source.winehq.org/git/wine.git/?a=commit;h=06ed81ecc0b4b9aada4d439a94...
Author: Hans Leidekker hans@it.vu.nl Date: Tue Jan 23 11:03:12 2007 +0100
usp10: Move text metrics into the script cache. Start using accessor functions.
---
dlls/usp10/usp10.c | 80 +++++++++++++++++++++++++++++++--------------------- 1 files changed, 48 insertions(+), 32 deletions(-)
diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c index 4aab525..c03db35 100644 --- a/dlls/usp10/usp10.c +++ b/dlls/usp10/usp10.c @@ -145,6 +145,8 @@ static const SCRIPT_PROPERTIES *script_p
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 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(H
/* 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, SCRI 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, SCRI 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, SC 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 h 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 h 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(HD 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(S { unsigned int i, j; StringAnalysis *analysis = ssa; - TEXTMETRICW metric;
TRACE("(%p)\n", ssa);
@@ -1537,20 +1565,8 @@ const SIZE * WINAPI ScriptString_pSize(S
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++)