[Libreoffice-commits] core.git: Branch 'libreoffice-6-4' - vcl/inc vcl/qt5 vcl/unx

Jan-Marek Glogowski (via logerrit) logerrit at kemper.freedesktop.org
Wed Mar 4 06:41:09 UTC 2020


 vcl/inc/qt5/Qt5FontFace.hxx |    7 ++
 vcl/qt5/Qt5Font.cxx         |  104 ++++++++++++++++++++++++++++++++------------
 vcl/qt5/Qt5FontFace.cxx     |  104 ++++++++++++++++++++++++--------------------
 vcl/unx/kf5/KF5SalFrame.cxx |   42 +----------------
 4 files changed, 144 insertions(+), 113 deletions(-)

New commits:
commit 1000169ebca79478a05b4c23e760d99bd77e739e
Author:     Jan-Marek Glogowski <glogow at fbihome.de>
AuthorDate: Mon Mar 2 10:04:24 2020 +0100
Commit:     Michael Weghorn <m.weghorn at posteo.de>
CommitDate: Wed Mar 4 07:40:37 2020 +0100

    Qt5 unify font attribute conversions
    
    Adds conversion functions for VCLs FontWeight, FontWidth and
    FontItalic to Qt5FontFace and remove the partial "switch"
    tables from KF5SalFrame.
    
    And correctly handle the FontWidth in Qt5Font as the stretch
    value, so the default font in qt5 gets the correct stretch and
    doesn't look bold.
    
    Also contains commit b9a124aae67cbd64917f07f2dca6603f149c018b
    ("Qt5 just ignore invalid font attributes").
    
    This ignores the *_DONTKNOW and _FORCE_EQUAL_SIZE values, except
    for the stretch, where we map DONTKNOW to QFont::AnyStretch.
    
    Change-Id: I698986416dff13e6dfaf9dfa7f95851b89e9137d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/89813
    Tested-by: Jenkins
    Reviewed-by: Jan-Marek Glogowski <glogow at fbihome.de>
    (cherry picked from commit 63ea1e811a3b3806b6b2408d759a449f4e086eb3)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/89797
    Reviewed-by: Michael Weghorn <m.weghorn at posteo.de>

diff --git a/vcl/inc/qt5/Qt5FontFace.hxx b/vcl/inc/qt5/Qt5FontFace.hxx
index c427a85445c3..ada4bbb5c1eb 100644
--- a/vcl/inc/qt5/Qt5FontFace.hxx
+++ b/vcl/inc/qt5/Qt5FontFace.hxx
@@ -19,6 +19,7 @@
 
 #pragma once
 
+#include <vclpluginapi.h>
 #include <PhysicalFontFace.hxx>
 
 #include <tools/ref.hxx>
@@ -26,10 +27,10 @@
 #include <vcl/fontcharmap.hxx>
 
 #include <QtCore/QString>
+#include <QtGui/QFont>
 
 class FontAttributes;
 class FontSelectPattern;
-class QFont;
 
 class Qt5FontFace : public PhysicalFontFace
 {
@@ -38,6 +39,10 @@ public:
     static Qt5FontFace* fromQFontDatabase(const QString& aFamily, const QString& aStyle);
     static void fillAttributesFromQFont(const QFont& rFont, FontAttributes& rFA);
 
+    VCLPLUG_QT5_PUBLIC static FontWeight toFontWeight(const int nWeight);
+    VCLPLUG_QT5_PUBLIC static FontWidth toFontWidth(const int nStretch);
+    VCLPLUG_QT5_PUBLIC static FontItalic toFontItalic(const QFont::Style eStyle);
+
     sal_IntPtr GetFontId() const override;
 
     int GetFontTable(const char pTagName[5], unsigned char*) const;
diff --git a/vcl/qt5/Qt5Font.cxx b/vcl/qt5/Qt5Font.cxx
index ee9d339266b2..2ab614043639 100644
--- a/vcl/qt5/Qt5Font.cxx
+++ b/vcl/qt5/Qt5Font.cxx
@@ -23,63 +23,111 @@
 #include <QtGui/QFont>
 #include <QtGui/QRawFont>
 
-static QFont::Weight GetQFontWeight(FontWeight eWeight)
+static inline void applyWeight(Qt5Font& rFont, FontWeight eWeight)
 {
     switch (eWeight)
     {
         case WEIGHT_THIN:
-            return QFont::Thin;
+            rFont.setWeight(QFont::Thin);
+            break;
         case WEIGHT_ULTRALIGHT:
-            return QFont::ExtraLight;
+            rFont.setWeight(QFont::ExtraLight);
+            break;
         case WEIGHT_LIGHT:
-            return QFont::Light;
+            rFont.setWeight(QFont::Light);
+            break;
         case WEIGHT_SEMILIGHT:
             [[fallthrough]];
-        case WEIGHT_DONTKNOW:
-            [[fallthrough]];
         case WEIGHT_NORMAL:
-            return QFont::Normal;
+            rFont.setWeight(QFont::Normal);
+            break;
         case WEIGHT_MEDIUM:
-            return QFont::Medium;
+            rFont.setWeight(QFont::Medium);
+            break;
         case WEIGHT_SEMIBOLD:
-            return QFont::DemiBold;
+            rFont.setWeight(QFont::DemiBold);
+            break;
         case WEIGHT_BOLD:
-            return QFont::Bold;
+            rFont.setWeight(QFont::Bold);
+            break;
         case WEIGHT_ULTRABOLD:
-            return QFont::ExtraBold;
+            rFont.setWeight(QFont::ExtraBold);
+            break;
         case WEIGHT_BLACK:
-            return QFont::Black;
-        case FontWeight_FORCE_EQUAL_SIZE:
-            assert(false && "FontWeight_FORCE_EQUAL_SIZE not implementable for QFont");
+            rFont.setWeight(QFont::Black);
+            break;
+        default:
+            break;
     }
-
-    // so we would get enum not handled warning
-    return QFont::Normal;
 }
 
-Qt5Font::Qt5Font(const PhysicalFontFace& rPFF, const FontSelectPattern& rFSP)
-    : LogicalFontInstance(rPFF, rFSP)
+static inline void applyStretch(Qt5Font& rFont, FontWidth eWidthType)
 {
-    setFamily(toQString(rPFF.GetFamilyName()));
-    setWeight(GetQFontWeight(rPFF.GetWeight()));
-    setPixelSize(rFSP.mnHeight);
-    switch (rFSP.GetItalic())
+    switch (eWidthType)
     {
-        case ITALIC_DONTKNOW:
-        case FontItalic_FORCE_EQUAL_SIZE:
+        case WIDTH_DONTKNOW:
+            rFont.setStretch(QFont::AnyStretch);
+            break;
+        case WIDTH_ULTRA_CONDENSED:
+            rFont.setStretch(QFont::UltraCondensed);
+            break;
+        case WIDTH_EXTRA_CONDENSED:
+            rFont.setStretch(QFont::ExtraCondensed);
+            break;
+        case WIDTH_CONDENSED:
+            rFont.setStretch(QFont::Condensed);
+            break;
+        case WIDTH_SEMI_CONDENSED:
+            rFont.setStretch(QFont::SemiCondensed);
             break;
+        case WIDTH_NORMAL:
+            rFont.setStretch(QFont::Unstretched);
+            break;
+        case WIDTH_SEMI_EXPANDED:
+            rFont.setStretch(QFont::SemiExpanded);
+            break;
+        case WIDTH_EXPANDED:
+            rFont.setStretch(QFont::Expanded);
+            break;
+        case WIDTH_EXTRA_EXPANDED:
+            rFont.setStretch(QFont::ExtraExpanded);
+            break;
+        case WIDTH_ULTRA_EXPANDED:
+            rFont.setStretch(QFont::UltraExpanded);
+            break;
+        default:
+            break;
+    }
+}
+
+static inline void applyStyle(Qt5Font& rFont, FontItalic eItalic)
+{
+    switch (eItalic)
+    {
         case ITALIC_NONE:
-            setStyle(Style::StyleNormal);
+            rFont.setStyle(QFont::Style::StyleNormal);
             break;
         case ITALIC_OBLIQUE:
-            setStyle(Style::StyleOblique);
+            rFont.setStyle(QFont::Style::StyleOblique);
             break;
         case ITALIC_NORMAL:
-            setStyle(Style::StyleItalic);
+            rFont.setStyle(QFont::Style::StyleItalic);
+            break;
+        default:
             break;
     }
 }
 
+Qt5Font::Qt5Font(const PhysicalFontFace& rPFF, const FontSelectPattern& rFSP)
+    : LogicalFontInstance(rPFF, rFSP)
+{
+    setFamily(toQString(rPFF.GetFamilyName()));
+    applyWeight(*this, rPFF.GetWeight());
+    setPixelSize(rFSP.mnHeight);
+    applyStretch(*this, rPFF.GetWidthType());
+    applyStyle(*this, rFSP.GetItalic());
+}
+
 static hb_blob_t* getFontTable(hb_face_t*, hb_tag_t nTableTag, void* pUserData)
 {
     char pTagName[5];
diff --git a/vcl/qt5/Qt5FontFace.cxx b/vcl/qt5/Qt5FontFace.cxx
index a7837667f1dd..8ac2f87d1843 100644
--- a/vcl/qt5/Qt5FontFace.cxx
+++ b/vcl/qt5/Qt5FontFace.cxx
@@ -46,40 +46,63 @@ Qt5FontFace::Qt5FontFace(const Qt5FontFace& rSrc)
         m_xCharMap = rSrc.m_xCharMap;
 }
 
-static FontWeight fromQFontWeight(int nWeight)
+FontWeight Qt5FontFace::toFontWeight(const int nWeight)
 {
-    FontWeight eWeight = WEIGHT_DONTKNOW;
-    switch (nWeight)
+    if (nWeight <= QFont::Thin)
+        return WEIGHT_THIN;
+    if (nWeight <= QFont::ExtraLight)
+        return WEIGHT_ULTRALIGHT;
+    if (nWeight <= QFont::Light)
+        return WEIGHT_LIGHT;
+    if (nWeight <= QFont::Normal)
+        return WEIGHT_NORMAL;
+    if (nWeight <= QFont::Medium)
+        return WEIGHT_MEDIUM;
+    if (nWeight <= QFont::DemiBold)
+        return WEIGHT_SEMIBOLD;
+    if (nWeight <= QFont::Bold)
+        return WEIGHT_BOLD;
+    if (nWeight <= QFont::ExtraBold)
+        return WEIGHT_ULTRABOLD;
+    return WEIGHT_BLACK;
+}
+
+FontWidth Qt5FontFace::toFontWidth(const int nStretch)
+{
+    if (nStretch == 0) // QFont::AnyStretch since Qt 5.8
+        return WIDTH_DONTKNOW;
+    if (nStretch <= QFont::UltraCondensed)
+        return WIDTH_ULTRA_CONDENSED;
+    if (nStretch <= QFont::ExtraCondensed)
+        return WIDTH_EXTRA_CONDENSED;
+    if (nStretch <= QFont::Condensed)
+        return WIDTH_CONDENSED;
+    if (nStretch <= QFont::SemiCondensed)
+        return WIDTH_SEMI_CONDENSED;
+    if (nStretch <= QFont::Unstretched)
+        return WIDTH_NORMAL;
+    if (nStretch <= QFont::SemiExpanded)
+        return WIDTH_SEMI_EXPANDED;
+    if (nStretch <= QFont::Expanded)
+        return WIDTH_EXPANDED;
+    if (nStretch <= QFont::ExtraExpanded)
+        return WIDTH_EXTRA_EXPANDED;
+    return WIDTH_ULTRA_EXPANDED;
+}
+
+FontItalic Qt5FontFace::toFontItalic(const QFont::Style eStyle)
+{
+    switch (eStyle)
     {
-        case QFont::Thin:
-            eWeight = WEIGHT_THIN;
-            break;
-        case QFont::ExtraLight:
-            eWeight = WEIGHT_ULTRALIGHT;
-            break;
-        case QFont::Light:
-            eWeight = WEIGHT_LIGHT;
-            break;
-        case QFont::Normal:
-            eWeight = WEIGHT_NORMAL;
-            break;
-        case QFont::Medium:
-            eWeight = WEIGHT_MEDIUM;
-            break;
-        case QFont::DemiBold:
-            eWeight = WEIGHT_SEMIBOLD;
-            break;
-        case QFont::Bold:
-            eWeight = WEIGHT_BOLD;
-            break;
-        case QFont::ExtraBold:
-            eWeight = WEIGHT_ULTRABOLD;
-            break;
-        case QFont::Black:
-            eWeight = WEIGHT_BLACK;
-            break;
+        case QFont::StyleNormal:
+            return ITALIC_NONE;
+        case QFont::StyleItalic:
+            return ITALIC_NORMAL;
+        case QFont::StyleOblique:
+            return ITALIC_OBLIQUE;
     }
-    return eWeight;
+
+    return ITALIC_NONE;
 }
 
 void Qt5FontFace::fillAttributesFromQFont(const QFont& rFont, FontAttributes& rFA)
@@ -91,20 +114,9 @@ void Qt5FontFace::fillAttributesFromQFont(const QFont& rFont, FontAttributes& rF
         rFA.SetSymbolFlag(true);
     rFA.SetStyleName(toOUString(aFontInfo.styleName()));
     rFA.SetPitch(aFontInfo.fixedPitch() ? PITCH_FIXED : PITCH_VARIABLE);
-    rFA.SetWeight(fromQFontWeight(aFontInfo.weight()));
-
-    switch (aFontInfo.style())
-    {
-        case QFont::StyleNormal:
-            rFA.SetItalic(ITALIC_NONE);
-            break;
-        case QFont::StyleItalic:
-            rFA.SetItalic(ITALIC_NORMAL);
-            break;
-        case QFont::StyleOblique:
-            rFA.SetItalic(ITALIC_OBLIQUE);
-            break;
-    }
+    rFA.SetWeight(Qt5FontFace::toFontWeight(aFontInfo.weight()));
+    rFA.SetItalic(Qt5FontFace::toFontItalic(aFontInfo.style()));
+    rFA.SetWidthType(Qt5FontFace::toFontWidth(rFont.stretch()));
 }
 
 Qt5FontFace* Qt5FontFace::fromQFont(const QFont& rFont)
@@ -123,7 +135,7 @@ Qt5FontFace* Qt5FontFace::fromQFontDatabase(const QString& aFamily, const QStrin
         aFA.SetSymbolFlag(true);
     aFA.SetStyleName(toOUString(aStyle));
     aFA.SetPitch(aFDB.isFixedPitch(aFamily, aStyle) ? PITCH_FIXED : PITCH_VARIABLE);
-    aFA.SetWeight(fromQFontWeight(aFDB.weight(aFamily, aStyle)));
+    aFA.SetWeight(Qt5FontFace::toFontWeight(aFDB.weight(aFamily, aStyle)));
     aFA.SetItalic(aFDB.italic(aFamily, aStyle) ? ITALIC_NORMAL : ITALIC_NONE);
     return new Qt5FontFace(aFA, aFamily + "," + aStyle);
 }
diff --git a/vcl/unx/kf5/KF5SalFrame.cxx b/vcl/unx/kf5/KF5SalFrame.cxx
index a212759aeb91..e4d294c5e35f 100644
--- a/vcl/unx/kf5/KF5SalFrame.cxx
+++ b/vcl/unx/kf5/KF5SalFrame.cxx
@@ -28,6 +28,7 @@
 #include <KConfigGroup>
 #include <KSharedConfig>
 
+#include <Qt5FontFace.hxx>
 #include "KF5SalFrame.hxx"
 
 #include <tools/color.hxx>
@@ -62,44 +63,9 @@ static vcl::Font toFont(const QFont& rQFont, const css::lang::Locale& rLocale)
                                    strlen(static_cast<const char*>(rQFont.family().toUtf8())),
                                    RTL_TEXTENCODING_UTF8);
 
-    // set italic
-    aInfo.m_eItalic = (qFontInfo.italic() ? ITALIC_NORMAL : ITALIC_NONE);
-
-    // set weight
-    int nWeight = qFontInfo.weight();
-    if (nWeight <= QFont::Light)
-        aInfo.m_eWeight = WEIGHT_LIGHT;
-    else if (nWeight <= QFont::Normal)
-        aInfo.m_eWeight = WEIGHT_NORMAL;
-    else if (nWeight <= QFont::DemiBold)
-        aInfo.m_eWeight = WEIGHT_SEMIBOLD;
-    else if (nWeight <= QFont::Bold)
-        aInfo.m_eWeight = WEIGHT_BOLD;
-    else
-        aInfo.m_eWeight = WEIGHT_ULTRABOLD;
-
-    // set width
-    int nStretch = rQFont.stretch();
-    if (nStretch == 0) // QFont::AnyStretch since Qt 5.8
-        aInfo.m_eWidth = WIDTH_DONTKNOW;
-    else if (nStretch <= QFont::UltraCondensed)
-        aInfo.m_eWidth = WIDTH_ULTRA_CONDENSED;
-    else if (nStretch <= QFont::ExtraCondensed)
-        aInfo.m_eWidth = WIDTH_EXTRA_CONDENSED;
-    else if (nStretch <= QFont::Condensed)
-        aInfo.m_eWidth = WIDTH_CONDENSED;
-    else if (nStretch <= QFont::SemiCondensed)
-        aInfo.m_eWidth = WIDTH_SEMI_CONDENSED;
-    else if (nStretch <= QFont::Unstretched)
-        aInfo.m_eWidth = WIDTH_NORMAL;
-    else if (nStretch <= QFont::SemiExpanded)
-        aInfo.m_eWidth = WIDTH_SEMI_EXPANDED;
-    else if (nStretch <= QFont::Expanded)
-        aInfo.m_eWidth = WIDTH_EXPANDED;
-    else if (nStretch <= QFont::ExtraExpanded)
-        aInfo.m_eWidth = WIDTH_EXTRA_EXPANDED;
-    else
-        aInfo.m_eWidth = WIDTH_ULTRA_EXPANDED;
+    aInfo.m_eItalic = Qt5FontFace::toFontItalic(qFontInfo.style());
+    aInfo.m_eWeight = Qt5FontFace::toFontWeight(qFontInfo.weight());
+    aInfo.m_eWidth = Qt5FontFace::toFontWidth(rQFont.stretch());
 
     SAL_INFO("vcl.kf5", "font name BEFORE system match: \"" << aInfo.m_aFamilyName << "\"");
 


More information about the Libreoffice-commits mailing list