[Libreoffice-commits] core.git: vcl/inc vcl/source vcl/win

Khaled Hosny khaledhosny at eglug.org
Fri Mar 3 13:23:37 UTC 2017


 vcl/inc/CommonSalLayout.hxx        |    1 +
 vcl/source/gdi/CommonSalLayout.cxx |   14 ++++++++------
 vcl/win/gdi/winlayout.cxx          |   31 ++++++++-----------------------
 3 files changed, 17 insertions(+), 29 deletions(-)

New commits:
commit a51b7a1c3a7e7cf7b0c733e1dec40288278c1884
Author: Khaled Hosny <khaledhosny at eglug.org>
Date:   Fri Mar 3 05:15:14 2017 +0200

    tdf#103831, tdf#100986: Force using GDI when needed
    
    Our DirectWrite renderer is incomplete and can’t handle rotated text or text
    with horizontal scaling, so route these two through GDI for now.
    
    Change-Id: I87b85796a29e3acce782e01b4c629fec6f1a9e25
    Reviewed-on: https://gerrit.libreoffice.org/34848
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Khaled Hosny <khaledhosny at eglug.org>

diff --git a/vcl/inc/CommonSalLayout.hxx b/vcl/inc/CommonSalLayout.hxx
index c9af545..591cb78 100644
--- a/vcl/inc/CommonSalLayout.hxx
+++ b/vcl/inc/CommonSalLayout.hxx
@@ -70,6 +70,7 @@ public:
     const FontSelectPattern& getFontSelData() const { return mrFontSelData; };
     HFONT                   getHFONT() const { return mhFont; }
     WinFontInstance&        getWinFontInstance() const { return mrWinFontInstance; }
+    bool                    hasHScale() const;
 #elif defined(MACOSX) || defined(IOS)
     explicit                CommonSalLayout(const CoreTextStyle&);
     const CoreTextStyle&    getFontData() const { return mrCoreTextStyle; };
diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx
index 220b3b1..af79404 100644
--- a/vcl/source/gdi/CommonSalLayout.cxx
+++ b/vcl/source/gdi/CommonSalLayout.cxx
@@ -38,11 +38,6 @@ T lround(T x)
 }
 #endif
 
-#ifdef _WIN32
-#  include <vcl/opengl/OpenGLHelper.hxx>
-#endif
-
-
 static hb_blob_t* getFontTable(hb_face_t* /*face*/, hb_tag_t nTableTag, void* pUserData)
 {
     char pTagName[5];
@@ -189,7 +184,7 @@ CommonSalLayout::CommonSalLayout(HDC hDC, WinFontInstance& rWinFontInstance, con
     }
 
     // Calculate the mnAveWidthFactor, see the comment where it is used.
-    if (mrFontSelData.mnWidth && ! OpenGLHelper::isVCLOpenGLEnabled())
+    if (mrFontSelData.mnWidth)
     {
         double nUPEM = hb_face_get_upem(hb_font_get_face(mpHbFont));
 
@@ -213,6 +208,13 @@ CommonSalLayout::CommonSalLayout(HDC hDC, WinFontInstance& rWinFontInstance, con
     }
 }
 
+bool CommonSalLayout::hasHScale() const
+{
+    int nHeight(mrFontSelData.mnHeight);
+    int nWidth(mrFontSelData.mnWidth ? mrFontSelData.mnWidth * mnAveWidthFactor : nHeight);
+    return nWidth != nHeight;
+}
+
 #elif defined(MACOSX) || defined(IOS)
 CommonSalLayout::CommonSalLayout(const CoreTextStyle& rCoreTextStyle)
 :   mrFontSelData(rCoreTextStyle.maFontSelData)
diff --git a/vcl/win/gdi/winlayout.cxx b/vcl/win/gdi/winlayout.cxx
index 54c00af..193d4b6 100644
--- a/vcl/win/gdi/winlayout.cxx
+++ b/vcl/win/gdi/winlayout.cxx
@@ -77,26 +77,6 @@ bool WinFontInstance::CacheGlyphToAtlas(HDC hDC, HFONT hFont, int nGlyphIndex, S
         return false;
     }
 
-    // Bail for non-horizontal text.
-    {
-        wchar_t sFaceName[200];
-        int nFaceNameLen = GetTextFaceW(hNewDC, SAL_N_ELEMENTS(sFaceName), sFaceName);
-
-        if (!nFaceNameLen)
-            SAL_WARN("vcl.gdi", "GetTextFace failed: " << WindowsErrorString(GetLastError()));
-
-        LOGFONTW aLogFont;
-        GetObjectW(hFont, sizeof(LOGFONTW), &aLogFont);
-
-        SelectObject(hNewDC, hOrigFont);
-        DeleteDC(hNewDC);
-
-        if (sFaceName[0] == '@' || aLogFont.lfOrientation != 0 || aLogFont.lfEscapement != 0)
-        {
-            pTxt->ReleaseFont();
-            return false;
-        }
-    }
     std::vector<WORD> aGlyphIndices(1);
     aGlyphIndices[0] = nGlyphIndex;
     // Fetch the ink boxes and calculate the size of the atlas.
@@ -725,13 +705,18 @@ void WinSalGraphics::DrawTextLayout(const CommonSalLayout& rLayout, HDC hDC, boo
 void WinSalGraphics::DrawTextLayout(const CommonSalLayout& rLayout)
 {
     HDC hDC = getHDC();
+
+    // Our DirectWrite renderer is incomplete, skip it for non-horizontal or
+    // stretched text.
+    bool bForceGDI = rLayout.GetOrientation() || rLayout.hasHScale();
+
     bool bUseOpenGL = OpenGLHelper::isVCLOpenGLEnabled() && !mbPrinter;
     if (!bUseOpenGL)
     {
         // no OpenGL, just classic rendering
-        DrawTextLayout(rLayout, hDC, false);
+        DrawTextLayout(rLayout, hDC, !bForceGDI);
     }
-    else if (CacheGlyphs(rLayout) &&
+    else if (!bForceGDI && CacheGlyphs(rLayout) &&
              DrawCachedGlyphs(rLayout))
     {
         // Nothing
@@ -798,7 +783,7 @@ void WinSalGraphics::DrawTextLayout(const CommonSalLayout& rLayout)
             SalColor salColor = MAKE_SALCOLOR(GetRValue(color), GetGValue(color), GetBValue(color));
 
             // the actual drawing
-            DrawTextLayout(rLayout, aDC.getCompatibleHDC(), true);
+            DrawTextLayout(rLayout, aDC.getCompatibleHDC(), !bForceGDI);
 
             std::unique_ptr<OpenGLTexture> xTexture(aDC.getTexture());
             if (xTexture)


More information about the Libreoffice-commits mailing list