Hans Leidekker : usp10: Store original font in the script cache and reselect it on successive calls .

Alexandre Julliard julliard at winehq.org
Mon Dec 10 08:54:19 CST 2007


Module: wine
Branch: master
Commit: 68efae1615aa2e40672bd0b1955c871a276cc64c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=68efae1615aa2e40672bd0b1955c871a276cc64c

Author: Hans Leidekker <hans at it.vu.nl>
Date:   Sun Dec  9 21:39:19 2007 +0100

usp10: Store original font in the script cache and reselect it on successive calls.

---

 dlls/usp10/usp10.c |   59 ++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 48 insertions(+), 11 deletions(-)

diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
index a7bbf16..fb0d4da 100644
--- a/dlls/usp10/usp10.c
+++ b/dlls/usp10/usp10.c
@@ -147,6 +147,7 @@ typedef struct {
     HDC hdc;
     LONG height;
     WCHAR default_char;
+    LOGFONTW lf;
 } ScriptCache;
 
 typedef struct {
@@ -212,6 +213,8 @@ static HRESULT init_script_cache(const HDC hdc, ScriptCache *sc)
     TEXTMETRICW metric;
 
     if (!GetTextMetricsW(hdc, &metric)) return E_INVALIDARG;
+    if (!GetObjectW(GetCurrentObject(hdc, OBJ_FONT), sizeof(LOGFONTW), &sc->lf)) return E_INVALIDARG;
+
     sc->height = metric.tmHeight;
     sc->default_char = metric.tmDefaultChar;
     sc->hdc = hdc;
@@ -239,6 +242,21 @@ static HRESULT get_script_cache(const HDC hdc, SCRIPT_CACHE *psc)
     return S_OK;
 }
 
+static HFONT select_cached_font(SCRIPT_CACHE *psc)
+{
+    HFONT old_font;
+    ScriptCache *sc = *psc;
+
+    old_font = SelectObject(sc->hdc, CreateFontIndirectW(&sc->lf));
+    return old_font;
+}
+
+static void unselect_cached_font(SCRIPT_CACHE *psc, HFONT old_font)
+{
+    ScriptCache *sc = *psc;
+    DeleteObject(SelectObject(sc->hdc, old_font));
+}
+
 /***********************************************************************
  *      DllMain
  *
@@ -1228,6 +1246,7 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars,
 {
     int cnt;
     HRESULT hr;
+    HFONT hfont;
     *pcGlyphs = cChars;
 
     TRACE("(%p, %p, %p, %d, %d, %p)\n",  hdc, psc, pwcChars, cChars, cMaxGlyphs, psa);
@@ -1237,6 +1256,8 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars,
     if (cChars > cMaxGlyphs) return E_OUTOFMEMORY;
     if ((hr = get_script_cache(hdc, psc))) return hr;
 
+    hfont = select_cached_font(psc);
+
     TRACE("Before: ");
     for (cnt = 0; cnt < cChars; cnt++)
          TRACE("%4x",pwcChars[cnt]);
@@ -1270,6 +1291,7 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars,
          psva[cnt].fZeroWidth = 0;
          pwLogClust[cnt] = cnt;
     }
+    unselect_cached_font(psc, hfont);
     return S_OK;
 }
 
@@ -1300,12 +1322,15 @@ HRESULT WINAPI ScriptPlace(HDC hdc, SCRIPT_CACHE *psc, const WORD *pwGlyphs,
     int wcnt;
     HRESULT hr;
     LPABC lpABC;
+    HFONT hfont;
 
     TRACE("(%p, %p, %p, %s, %d, %p, %p, %p)\n",  hdc, psc, pwGlyphs,
           debugstr_wn(pwGlyphs, cGlyphs), cGlyphs, psva, psa, piAdvance);
 
     if ((hr = get_script_cache(hdc, psc))) return hr;
 
+    hfont = select_cached_font(psc);
+
     /*   Here we need to calculate the width of the run unit.  At this point the input string
      *   has been converted to glyphs and we still need to translate back to the original chars
      *   to get the correct ABC widths.   */
@@ -1315,8 +1340,8 @@ 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(get_cache_hdc(psc), 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++) {
              piAdvance[wcnt] = 0;
@@ -1346,8 +1371,9 @@ HRESULT WINAPI ScriptPlace(HDC hdc, SCRIPT_CACHE *psc, const WORD *pwGlyphs,
      if (pABC)
         TRACE("Total for run:   abcA=%d,  abcB=%d,  abcC=%d\n", pABC->abcA, pABC->abcB, pABC->abcC);
 
-     usp_free(lpABC);
-     return S_OK;
+    usp_free(lpABC);
+    unselect_cached_font(psc, hfont);
+    return S_OK;
 }
 
 /***********************************************************************
@@ -1372,12 +1398,15 @@ HRESULT WINAPI ScriptGetCMap(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcInChars
 {
     int cnt;
     HRESULT hr;
+    HFONT hfont;
 
     TRACE("(%p,%p,%s,%d,0x%x,%p)\n", hdc, psc, debugstr_wn(pwcInChars, cChars),
           cChars, dwFlags, pwOutGlyphs);
 
     if ((hr = get_script_cache(hdc, psc))) return hr;
 
+    hfont = select_cached_font(psc);
+
     TRACE("Before: ");
     for (cnt = 0; cnt < cChars; cnt++)
          TRACE("%4x",pwcInChars[cnt]);
@@ -1391,6 +1420,7 @@ HRESULT WINAPI ScriptGetCMap(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcInChars
     }
     TRACE("\n");
 
+    unselect_cached_font(psc, hfont);
     return S_OK;
 }
 
@@ -1403,7 +1433,8 @@ HRESULT WINAPI ScriptTextOut(const HDC hdc, SCRIPT_CACHE *psc, int x, int y, UIN
                              int iReserved, const WORD *pwGlyphs, int cGlyphs, const int *piAdvance,
                              const int *piJustify, const GOFFSET *pGoffset)
 {
-    HRESULT hr;
+    HFONT hfont;
+    HRESULT hr = S_OK;
 
     TRACE("(%p, %p, %d, %d, %04x, %p, %p, %p, %d, %p, %d, %p, %p, %p)\n",
          hdc, psc, x, y, fuOptions, lprc, psa, pwcReserved, iReserved, pwGlyphs, cGlyphs,
@@ -1413,14 +1444,17 @@ HRESULT WINAPI ScriptTextOut(const HDC hdc, SCRIPT_CACHE *psc, int x, int y, UIN
     if (!piAdvance || !psa || !pwGlyphs) return E_INVALIDARG;
     if ((hr = get_script_cache(hdc, psc))) return hr;
 
+    hfont = select_cached_font(psc);
+
     fuOptions &= ETO_CLIPPED + ETO_OPAQUE;
     if  (!psa->fNoGlyphIndex)                                     /* Have Glyphs?                      */
         fuOptions |= ETO_GLYPH_INDEX;                             /* Say don't do translation to glyph */
 
     if (!ExtTextOutW(get_cache_hdc(psc), x, y, fuOptions, lprc, pwGlyphs, cGlyphs, NULL))
-        return S_FALSE;
+        hr = S_FALSE;
 
-    return S_OK;
+    unselect_cached_font(psc, hfont);
+    return hr;
 }
 
 /***********************************************************************
@@ -1467,15 +1501,18 @@ HRESULT WINAPI ScriptCacheGetHeight(HDC hdc, SCRIPT_CACHE *psc, LONG *height)
  */
 HRESULT WINAPI ScriptGetGlyphABCWidth(HDC hdc, SCRIPT_CACHE *psc, WORD glyph, ABC *abc)
 {
-    HRESULT hr;
+    HFONT hfont;
+    HRESULT hr = S_OK;
 
     TRACE("(%p, %p, 0x%04x, %p)\n", hdc, psc, glyph, abc);
 
     if ((hr = get_script_cache(hdc, psc))) return hr;
 
-    /* FIXME: get this from the cache */
-    if (!GetCharABCWidthsI(get_cache_hdc(psc), 0, 1, &glyph, abc)) return E_HANDLE;
-    return S_OK;
+    hfont = select_cached_font(psc);
+    if (!GetCharABCWidthsI(get_cache_hdc(psc), 0, 1, &glyph, abc)) hr = E_HANDLE;
+
+    unselect_cached_font(psc, hfont);
+    return hr;
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list