Aric Stewart : usp10: In ScriptTextOut make use of piAdvance and pGoffset to position glyphs.

Alexandre Julliard julliard at winehq.org
Mon Jul 16 14:14:30 CDT 2012


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Mon Jul 16 07:24:02 2012 -0500

usp10: In ScriptTextOut make use of piAdvance and pGoffset to position glyphs.

---

 dlls/usp10/usp10.c |   47 +++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
index 0b53599..9659e66 100644
--- a/dlls/usp10/usp10.c
+++ b/dlls/usp10/usp10.c
@@ -3176,6 +3176,8 @@ HRESULT WINAPI ScriptTextOut(const HDC hdc, SCRIPT_CACHE *psc, int x, int y, UIN
                              const int *piJustify, const GOFFSET *pGoffset)
 {
     HRESULT hr = S_OK;
+    INT i;
+    INT *lpDx;
 
     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,
@@ -3189,6 +3191,45 @@ 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 */
 
+    lpDx = heap_alloc(cGlyphs * sizeof(INT) * 2);
+
+    if (pGoffset)
+    {
+        for (i = 0; i < cGlyphs; i++)
+            if (!(fuOptions&ETO_PDY) && pGoffset[i].dv)
+                fuOptions |= ETO_PDY;
+    }
+    for (i = 0; i < cGlyphs; i++)
+    {
+        int idx = i;
+        if (fuOptions&ETO_PDY)
+        {
+            idx *=2;
+            lpDx[idx+1] = 0;
+        }
+        lpDx[idx] = piAdvance[i];
+    }
+    if (pGoffset)
+    {
+        for (i = 1; i < cGlyphs; i++)
+        {
+            int idx = i;
+            int prev_idx = i-1;
+            if (fuOptions&ETO_PDY)
+            {
+                idx*=2;
+                prev_idx = idx-2;
+            }
+            lpDx[prev_idx] += pGoffset[i].du;
+            lpDx[idx] -= pGoffset[i].du;
+            if (fuOptions&ETO_PDY)
+            {
+                lpDx[prev_idx+1] += pGoffset[i].dv;
+                lpDx[idx+1] -= pGoffset[i].dv;
+            }
+        }
+    }
+
     if (psa->fRTL && psa->fLogicalOrder)
     {
         int i;
@@ -3201,14 +3242,16 @@ HRESULT WINAPI ScriptTextOut(const HDC hdc, SCRIPT_CACHE *psc, int x, int y, UIN
         for (i = 0; i < cGlyphs; i++)
             rtlGlyphs[i] = pwGlyphs[cGlyphs-1-i];
 
-        if (!ExtTextOutW(hdc, x, y, fuOptions, lprc, rtlGlyphs, cGlyphs, NULL))
+        if (!ExtTextOutW(hdc, x, y, fuOptions, lprc, rtlGlyphs, cGlyphs, lpDx))
             hr = S_FALSE;
         heap_free(rtlGlyphs);
     }
     else
-        if (!ExtTextOutW(hdc, x, y, fuOptions, lprc, pwGlyphs, cGlyphs, NULL))
+        if (!ExtTextOutW(hdc, x, y, fuOptions, lprc, pwGlyphs, cGlyphs, lpDx))
             hr = S_FALSE;
 
+    heap_free(lpDx);
+
     return hr;
 }
 




More information about the wine-cvs mailing list