[Libreoffice-commits] core.git: Branch 'feature/fixes7' - 3 commits - vcl/win

Tor Lillqvist tml at collabora.com
Fri Aug 21 08:10:41 PDT 2015


 vcl/win/source/gdi/winlayout.cxx |  128 ++++++++++++++++++++++++++++++---------
 1 file changed, 100 insertions(+), 28 deletions(-)

New commits:
commit 48cf2c4e271f9fd59d7352475add2df1866ed416
Author: Tor Lillqvist <tml at collabora.com>
Date:   Fri Aug 21 16:29:13 2015 +0300

    Let's not overdo the verboseness in this SAL_INFO
    
    Change-Id: I7b06d0ffe53c6ebf2b479951321dcb37cb22c355

diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx
index b0575a6..85b1e97 100644
--- a/vcl/win/source/gdi/winlayout.cxx
+++ b/vcl/win/source/gdi/winlayout.cxx
@@ -307,53 +307,6 @@ bool ImplWinFontEntry::AddChunkOfGlyphs(int nGlyphIndex, const WinLayout& rLayou
     }
     aChunk.mnAscentPlusIntLeading = aTextMetric.tmAscent + aTextMetric.tmInternalLeading;
 
-    UINT nAlign = GetTextAlign(hDC);
-    if (nAlign == GDI_ERROR)
-    {
-        SAL_WARN("vcl.gdi", "GetTextAlign failed: " << WindowsErrorString(GetLastError()));
-        SelectObject(hDC, hOrigFont);
-        DeleteDC(hDC);
-        return false;
-    }
-
-    OUString sAlign;
-    switch ((TA_LEFT|TA_CENTER|TA_RIGHT) & nAlign)
-    {
-    case TA_LEFT:
-        sAlign = "LEFT";
-        break;
-    case TA_CENTER:
-        sAlign = "CENTER";
-        break;
-    case TA_RIGHT:
-        sAlign = "RIGHT";
-        break;
-    default:
-        sAlign = "0x" + OUString::number((TA_LEFT|TA_CENTER|TA_RIGHT) & nAlign,16);
-        break;
-    }
-    sAlign += "|";
-    switch ((TA_BOTTOM|TA_BASELINE|TA_TOP) & nAlign)
-    {
-    case TA_BOTTOM:
-        sAlign += "BOTTOM";
-        break;
-    case TA_BASELINE:
-        sAlign += "BASELINE";
-        break;
-    case TA_TOP:
-        sAlign += "TOP";
-        break;
-    default:
-        sAlign += "0x" + OUString::number((TA_BOTTOM|TA_BASELINE|TA_TOP) & nAlign,16);
-        break;
-    }
-    sAlign += "|";
-    if (TA_UPDATECP & nAlign)
-        sAlign += "UPDATECP";
-    else
-        sAlign += "NOUPDATECP";
-
     LOGFONTW aLogfont;
     if (!GetObjectW(rLayout.mhFont, sizeof(aLogfont), &aLogfont))
     {
@@ -374,8 +327,7 @@ bool ImplWinFontEntry::AddChunkOfGlyphs(int nGlyphIndex, const WinLayout& rLayou
     }
 
     SAL_INFO("vcl.gdi.opengl", OUString(sFaceName, nFaceNameLen) <<
-             ": " << sAlign <<
-             " Escapement=" << aLogfont.lfEscapement <<
+             ": Escapement=" << aLogfont.lfEscapement <<
              " Orientation=" << aLogfont.lfOrientation <<
              " Ascent=" << aTextMetric.tmAscent <<
              " InternalLeading=" << aTextMetric.tmInternalLeading <<
commit c05e5d3657892a8b2451c730f3354c3a675b6b01
Author: Tor Lillqvist <tml at collabora.com>
Date:   Fri Aug 21 16:19:31 2015 +0300

    Error handling
    
    Change-Id: I46e5463aaa5cab41cd69c13314ee98a0c73e7ba2

diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx
index 964ff99..b0575a6 100644
--- a/vcl/win/source/gdi/winlayout.cxx
+++ b/vcl/win/source/gdi/winlayout.cxx
@@ -271,6 +271,8 @@ bool ImplWinFontEntry::AddChunkOfGlyphs(int nGlyphIndex, const WinLayout& rLayou
     if (!GetCharABCWidthsI(hDC, 0, nCount, aGlyphIndices.data(), aABC.data()))
     {
         SAL_WARN("vcl.gdi", "GetCharABCWidthsI failed: " << WindowsErrorString(GetLastError()));
+        SelectObject(hDC, hOrigFont);
+        DeleteDC(hDC);
         return false;
     }
 
@@ -296,10 +298,24 @@ bool ImplWinFontEntry::AddChunkOfGlyphs(int nGlyphIndex, const WinLayout& rLayou
     }
 
     TEXTMETRICW aTextMetric;
-    GetTextMetricsW(hDC, &aTextMetric);
+    if (!GetTextMetricsW(hDC, &aTextMetric))
+    {
+        SAL_WARN("vcl.gdi", "GetTextMetrics failed: " << WindowsErrorString(GetLastError()));
+        SelectObject(hDC, hOrigFont);
+        DeleteDC(hDC);
+        return false;
+    }
     aChunk.mnAscentPlusIntLeading = aTextMetric.tmAscent + aTextMetric.tmInternalLeading;
 
     UINT nAlign = GetTextAlign(hDC);
+    if (nAlign == GDI_ERROR)
+    {
+        SAL_WARN("vcl.gdi", "GetTextAlign failed: " << WindowsErrorString(GetLastError()));
+        SelectObject(hDC, hOrigFont);
+        DeleteDC(hDC);
+        return false;
+    }
+
     OUString sAlign;
     switch ((TA_LEFT|TA_CENTER|TA_RIGHT) & nAlign)
     {
@@ -339,10 +355,24 @@ bool ImplWinFontEntry::AddChunkOfGlyphs(int nGlyphIndex, const WinLayout& rLayou
         sAlign += "NOUPDATECP";
 
     LOGFONTW aLogfont;
-    GetObjectW(rLayout.mhFont, sizeof(aLogfont), &aLogfont);
+    if (!GetObjectW(rLayout.mhFont, sizeof(aLogfont), &aLogfont))
+    {
+        SAL_WARN("vcl.gdi", "GetObject failed: " << WindowsErrorString(GetLastError()));
+        SelectObject(hDC, hOrigFont);
+        DeleteDC(hDC);
+        return false;
+    }
 
     wchar_t sFaceName[200];
     int nFaceNameLen = GetTextFaceW(hDC, SAL_N_ELEMENTS(sFaceName), sFaceName);
+    if (!nFaceNameLen)
+    {
+        SAL_WARN("vcl.gdi", "GetTextFace failed: " << WindowsErrorString(GetLastError()));
+        SelectObject(hDC, hOrigFont);
+        DeleteDC(hDC);
+        return false;
+    }
+
     SAL_INFO("vcl.gdi.opengl", OUString(sFaceName, nFaceNameLen) <<
              ": " << sAlign <<
              " Escapement=" << aLogfont.lfEscapement <<
commit e655a4b71e4e74f81faaf8c62da864f9030e595e
Author: Tor Lillqvist <tml at collabora.com>
Date:   Fri Aug 21 16:04:07 2015 +0300

    Make vertical fonts show up when using OpenGL glyph caching
    
    Change-Id: I6b19873eef48b625dc3d4f7b3a9afdb348189b38

diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx
index d445506..964ff99 100644
--- a/vcl/win/source/gdi/winlayout.cxx
+++ b/vcl/win/source/gdi/winlayout.cxx
@@ -65,6 +65,7 @@ struct OpenGLGlyphCacheChunk
     std::vector<Rectangle> maLocation;
     std::shared_ptr<OpenGLTexture> mpTexture;
     int mnAscentPlusIntLeading;
+    bool mbVertical;
 };
 
 // win32 specific physical font instance
@@ -130,13 +131,18 @@ OUString DumpGlyphBitmap(OpenGLGlyphCacheChunk& rChunk, HDC hDC)
     }
 
     std::cerr << "Bitmap " << hBitmap << ": " << aBitmap.bmWidth << "x" << aBitmap.bmHeight << ":" << std::endl;
+
+    // Print out start pos of each glyph only in the horizontal font case
     int nPos = 0;
-    for (int i = 1; i < rChunk.mnGlyphCount && nPos < 75; i++)
+    if (rChunk.mnGlyphCount > 1 && rChunk.maLocation[1].Left() > rChunk.maLocation[0].Left())
     {
-        for (int j = nPos; j < rChunk.maLocation[i].Left(); j++)
-            std::cerr << " ";
-        std::cerr << "!";
-        nPos = rChunk.maLocation[i].Left() + 1;
+        for (int i = 1; i < rChunk.mnGlyphCount && nPos < 75; i++)
+        {
+            for (int j = nPos; j < rChunk.maLocation[i].Left(); j++)
+                std::cerr << " ";
+            std::cerr << "!";
+            nPos = rChunk.maLocation[i].Left() + 1;
+        }
     }
     std::cerr << std::endl;
 
@@ -289,7 +295,61 @@ bool ImplWinFontEntry::AddChunkOfGlyphs(int nGlyphIndex, const WinLayout& rLayou
         totWidth += aDX[i];
     }
 
-    SAL_INFO("vcl.gdi.opengl", "aSize=(" << aSize.cx << "," << aSize.cy << ") totWidth=" << totWidth);
+    TEXTMETRICW aTextMetric;
+    GetTextMetricsW(hDC, &aTextMetric);
+    aChunk.mnAscentPlusIntLeading = aTextMetric.tmAscent + aTextMetric.tmInternalLeading;
+
+    UINT nAlign = GetTextAlign(hDC);
+    OUString sAlign;
+    switch ((TA_LEFT|TA_CENTER|TA_RIGHT) & nAlign)
+    {
+    case TA_LEFT:
+        sAlign = "LEFT";
+        break;
+    case TA_CENTER:
+        sAlign = "CENTER";
+        break;
+    case TA_RIGHT:
+        sAlign = "RIGHT";
+        break;
+    default:
+        sAlign = "0x" + OUString::number((TA_LEFT|TA_CENTER|TA_RIGHT) & nAlign,16);
+        break;
+    }
+    sAlign += "|";
+    switch ((TA_BOTTOM|TA_BASELINE|TA_TOP) & nAlign)
+    {
+    case TA_BOTTOM:
+        sAlign += "BOTTOM";
+        break;
+    case TA_BASELINE:
+        sAlign += "BASELINE";
+        break;
+    case TA_TOP:
+        sAlign += "TOP";
+        break;
+    default:
+        sAlign += "0x" + OUString::number((TA_BOTTOM|TA_BASELINE|TA_TOP) & nAlign,16);
+        break;
+    }
+    sAlign += "|";
+    if (TA_UPDATECP & nAlign)
+        sAlign += "UPDATECP";
+    else
+        sAlign += "NOUPDATECP";
+
+    LOGFONTW aLogfont;
+    GetObjectW(rLayout.mhFont, sizeof(aLogfont), &aLogfont);
+
+    wchar_t sFaceName[200];
+    int nFaceNameLen = GetTextFaceW(hDC, SAL_N_ELEMENTS(sFaceName), sFaceName);
+    SAL_INFO("vcl.gdi.opengl", OUString(sFaceName, nFaceNameLen) <<
+             ": " << sAlign <<
+             " Escapement=" << aLogfont.lfEscapement <<
+             " Orientation=" << aLogfont.lfOrientation <<
+             " Ascent=" << aTextMetric.tmAscent <<
+             " InternalLeading=" << aTextMetric.tmInternalLeading <<
+             " Size=(" << aSize.cx << "," << aSize.cy << ") totWidth=" << totWidth);
 
     if (SelectObject(hDC, hOrigFont) == NULL)
         SAL_WARN("vcl.gdi", "SelectObject failed: " << WindowsErrorString(GetLastError()));
@@ -297,7 +357,21 @@ bool ImplWinFontEntry::AddChunkOfGlyphs(int nGlyphIndex, const WinLayout& rLayou
         SAL_WARN("vcl.gdi", "DeleteDC failed: " << WindowsErrorString(GetLastError()));
 
     // Leave two pixels of extra space also at top and bottom
-    OpenGLCompatibleDC aDC(rGraphics, 0, 0, totWidth, aSize.cy + 4);
+    int nBitmapWidth, nBitmapHeight;
+    if (sFaceName[0] == '@')
+    {
+        nBitmapWidth = aSize.cy + 4;
+        nBitmapHeight = totWidth;
+        aChunk.mbVertical = true;
+    }
+    else
+    {
+        nBitmapWidth = totWidth;
+        nBitmapHeight = aSize.cy + 4;
+        aChunk.mbVertical = false;
+    }
+
+    OpenGLCompatibleDC aDC(rGraphics, 0, 0, nBitmapWidth, nBitmapHeight);
 
     HFONT hNonAntialiasedFont = NULL;
 
@@ -305,12 +379,6 @@ bool ImplWinFontEntry::AddChunkOfGlyphs(int nGlyphIndex, const WinLayout& rLayou
     static bool bNoAntialias = (std::getenv("VCL_GLYPH_CACHING_HACK_NO_ANTIALIAS") != NULL);
     if (bNoAntialias)
     {
-        LOGFONTW aLogfont;
-        if (!GetObjectW(rLayout.mhFont, sizeof(aLogfont), &aLogfont))
-        {
-            SAL_WARN("vcl.gdi", "GetObject failed: " << WindowsErrorString(GetLastError()));
-            return false;
-        }
         aLogfont.lfQuality = NONANTIALIASED_QUALITY;
         hNonAntialiasedFont = CreateFontIndirectW(&aLogfont);
         if (hNonAntialiasedFont == NULL)
@@ -334,7 +402,11 @@ bool ImplWinFontEntry::AddChunkOfGlyphs(int nGlyphIndex, const WinLayout& rLayou
     aDC.fill(MAKE_SALCOLOR(0xff, 0xff, 0xff));
 
     // The 2,2 is for the extra space
-    if (!ExtTextOutW(aDC.getCompatibleHDC(), 2, 2, ETO_GLYPH_INDEX, NULL, aGlyphIndices.data(), nCount, aDX.data()))
+    int nY = 2;
+    int nX = 2;
+    if (aChunk.mbVertical)
+        nX += aDX[0];
+    if (!ExtTextOutW(aDC.getCompatibleHDC(), nX, nY, ETO_GLYPH_INDEX, NULL, aGlyphIndices.data(), nCount, aDX.data()))
     {
         SAL_WARN("vcl.gdi", "ExtTextOutW failed: " << WindowsErrorString(GetLastError()));
         SelectFont(aDC.getCompatibleHDC(), hOrigFont);
@@ -347,19 +419,26 @@ bool ImplWinFontEntry::AddChunkOfGlyphs(int nGlyphIndex, const WinLayout& rLayou
     UINT nPos = 0;
     for (int i = 0; i < nCount; i++)
     {
-        aChunk.maLocation[i].Left() = nPos;
-        aChunk.maLocation[i].Right() = nPos + aDX[i];
-        nPos = aChunk.maLocation[i].Right();
-        aChunk.maLocation[i].Top() = 0;
-        aChunk.maLocation[i].Bottom() = aSize.cy + 4;
+        if (aChunk.mbVertical)
+        {
+            aChunk.maLocation[i].Left() = 0;
+            aChunk.maLocation[i].Right() = nBitmapWidth;
+            aChunk.maLocation[i].Top() = nPos;
+            aChunk.maLocation[i].Bottom() = nPos + aDX[i];
+            nPos = aChunk.maLocation[i].Bottom();
+        }
+        else
+        {
+            aChunk.maLocation[i].Left() = nPos;
+            aChunk.maLocation[i].Right() = nPos + aDX[i];
+            nPos = aChunk.maLocation[i].Right();
+            aChunk.maLocation[i].Top() = 0;
+            aChunk.maLocation[i].Bottom() = aSize.cy + 4;
+        }
     }
 
     aChunk.mpTexture = std::unique_ptr<OpenGLTexture>(aDC.getTexture());
 
-    TEXTMETRICW aTextMetric;
-    GetTextMetricsW(aDC.getCompatibleHDC(), &aTextMetric);
-    aChunk.mnAscentPlusIntLeading = aTextMetric.tmAscent + aTextMetric.tmInternalLeading;
-
     maOpenGLGlyphCache.insert(n, aChunk);
 
     SelectFont(aDC.getCompatibleHDC(), hOrigFont);
@@ -1670,11 +1749,22 @@ bool UniscribeLayout::DrawCachedGlyphs(SalGraphics& rGraphics) const
             const OpenGLGlyphCacheChunk& rChunk = mrWinFontEntry.GetCachedGlyphChunkFor(mpOutGlyphs[i]);
             const int n = mpOutGlyphs[i] - rChunk.mnFirstGlyph;
 
-            SalTwoRect a2Rects(rChunk.maLocation[n].Left(), rChunk.maLocation[n].Top(),
-                               rChunk.maLocation[n].getWidth(), rChunk.maLocation[n].getHeight(),
-                               nAdvance + aPos.X() + mpGlyphOffsets[i].du, aPos.Y() + mpGlyphOffsets[i].dv - rChunk.mnAscentPlusIntLeading,
-                               rChunk.maLocation[n].getWidth(), rChunk.maLocation[n].getHeight()); // ???
-            pImpl->DrawMask(*rChunk.mpTexture, salColor, a2Rects);
+            if (rChunk.mbVertical)
+            {
+                SalTwoRect a2Rects(rChunk.maLocation[n].Left(), rChunk.maLocation[n].Top(),
+                                   rChunk.maLocation[n].getWidth(), rChunk.maLocation[n].getHeight(),
+                                   aPos.X(), nAdvance + aPos.Y(),
+                                   rChunk.maLocation[n].getWidth(), rChunk.maLocation[n].getHeight()); // ???
+                pImpl->DrawMask(*rChunk.mpTexture, salColor, a2Rects);
+            }
+            else
+            {
+                SalTwoRect a2Rects(rChunk.maLocation[n].Left(), rChunk.maLocation[n].Top(),
+                                   rChunk.maLocation[n].getWidth(), rChunk.maLocation[n].getHeight(),
+                                   nAdvance + aPos.X() + mpGlyphOffsets[i].du, aPos.Y() + mpGlyphOffsets[i].dv - rChunk.mnAscentPlusIntLeading,
+                                   rChunk.maLocation[n].getWidth(), rChunk.maLocation[n].getHeight()); // ???
+                pImpl->DrawMask(*rChunk.mpTexture, salColor, a2Rects);
+            }
             nAdvance += mpGlyphAdvances[i];
         }
     }


More information about the Libreoffice-commits mailing list