diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2016-11-21 13:33:55 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-01-24 20:42:32 +0000 |
commit | 21f27c9a4d0f2ab0976c144f631c9171c899014b (patch) | |
tree | 01270b13f790565a30ba1a6931e3b786901d9f42 /src/gui/text | |
parent | d2758b2f1dd88d273ff70864a0dd03a7c4e9dc78 (diff) |
Enable gamma-correction on a face-by-face basis
Changes how we control if gamma-correction is done, and enables it for
the freetype CFF engine when stem-darkening is available.
The new code replaces existing hacks to force gamma-correction off
when using Freetype on X11 and Windows.
Change-Id: Ic703ca6965a3d81b204349e10f406c991b292edd
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Diffstat (limited to 'src/gui/text')
-rw-r--r-- | src/gui/text/qfontengine.cpp | 5 | ||||
-rw-r--r-- | src/gui/text/qfontengine_ft.cpp | 36 | ||||
-rw-r--r-- | src/gui/text/qfontengine_ft_p.h | 2 | ||||
-rw-r--r-- | src/gui/text/qfontengine_p.h | 1 |
4 files changed, 38 insertions, 6 deletions
diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp index 0b2972f189..8d8ca1ba2c 100644 --- a/src/gui/text/qfontengine.cpp +++ b/src/gui/text/qfontengine.cpp @@ -445,6 +445,11 @@ bool QFontEngine::supportsTransformation(const QTransform &transform) const return transform.type() < QTransform::TxProject; } +bool QFontEngine::expectsGammaCorrectedBlending() const +{ + return true; +} + void QFontEngine::getGlyphPositions(const QGlyphLayout &glyphs, const QTransform &matrix, QTextItem::RenderFlags flags, QVarLengthArray<glyph_t> &glyphs_out, QVarLengthArray<QFixedPoint> &positions) { diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp index de6da88245..03e72546eb 100644 --- a/src/gui/text/qfontengine_ft.cpp +++ b/src/gui/text/qfontengine_ft.cpp @@ -61,17 +61,19 @@ #include FT_TRUETYPE_TABLES_H #include FT_TYPE1_TABLES_H #include FT_GLYPH_H +#include FT_MODULE_H #if defined(FT_LCD_FILTER_H) #include FT_LCD_FILTER_H +#define QT_USE_FREETYPE_LCDFILTER #endif #if defined(FT_CONFIG_OPTIONS_H) #include FT_CONFIG_OPTIONS_H #endif -#if defined(FT_LCD_FILTER_H) -#define QT_USE_FREETYPE_LCDFILTER +#if defined(FT_FONT_FORMATS_H) +#include FT_FONT_FORMATS_H #endif #ifdef QT_LINUXBASE @@ -151,6 +153,14 @@ QtFreetypeData *qt_getFreetypeData() QtFreetypeData *&freetypeData = theFreetypeData()->localData(); if (!freetypeData) freetypeData = new QtFreetypeData; + if (!freetypeData->library) { + FT_Init_FreeType(&freetypeData->library); +#if defined(FT_FONT_FORMATS_H) + // Freetype defaults to disabling stem-darkening on CFF, we re-enable it. + FT_Bool no_darkening = false; + FT_Property_Set(freetypeData->library, "cff", "no-stem-darkening", &no_darkening); +#endif + } return freetypeData; } #endif @@ -158,8 +168,7 @@ QtFreetypeData *qt_getFreetypeData() FT_Library qt_getFreetype() { QtFreetypeData *freetypeData = qt_getFreetypeData(); - if (!freetypeData->library) - FT_Init_FreeType(&freetypeData->library); + Q_ASSERT(freetypeData->library); return freetypeData->library; } @@ -218,8 +227,6 @@ QFreetypeFace *QFreetypeFace::getFace(const QFontEngine::FaceId &face_id, return 0; QtFreetypeData *freetypeData = qt_getFreetypeData(); - if (!freetypeData->library) - FT_Init_FreeType(&freetypeData->library); QFreetypeFace *freetype = freetypeData->faces.value(face_id, 0); if (freetype) { @@ -687,6 +694,7 @@ QFontEngineFT::QFontEngineFT(const QFontDef &fd) cacheEnabled = env.isEmpty() || env.toInt() == 0; m_subPixelPositionCount = 4; forceAutoHint = false; + stemDarkeningDriver = false; } QFontEngineFT::~QFontEngineFT() @@ -798,6 +806,17 @@ bool QFontEngineFT::init(FaceId faceId, bool antialias, GlyphFormat format, } } } +#if defined(FT_FONT_FORMATS_H) + const char *fmt = FT_Get_Font_Format(face); + if (fmt && qstrncmp(fmt, "CFF", 4) == 0) { + FT_Bool no_stem_darkening = true; + FT_Error err = FT_Property_Get(qt_getFreetype(), "cff", "no-stem-darkening", &no_stem_darkening); + if (err == FT_Err_Ok) + stemDarkeningDriver = !no_stem_darkening; + else + stemDarkeningDriver = false; + } +#endif fontDef.styleName = QString::fromUtf8(face->style_name); @@ -841,6 +860,11 @@ void QFontEngineFT::setDefaultHintStyle(HintStyle style) default_hint_style = style; } +bool QFontEngineFT::expectsGammaCorrectedBlending() const +{ + return stemDarkeningDriver; +} + int QFontEngineFT::loadFlags(QGlyphSet *set, GlyphFormat format, int flags, bool &hsubpixel, int &vfactor) const { diff --git a/src/gui/text/qfontengine_ft_p.h b/src/gui/text/qfontengine_ft_p.h index 32357d0076..47f13eb274 100644 --- a/src/gui/text/qfontengine_ft_p.h +++ b/src/gui/text/qfontengine_ft_p.h @@ -252,6 +252,7 @@ private: QPoint *offset) Q_DECL_OVERRIDE; bool hasInternalCaching() const Q_DECL_OVERRIDE { return cacheEnabled; } void unlockAlphaMapForGlyph() Q_DECL_OVERRIDE; + bool expectsGammaCorrectedBlending() const Q_DECL_OVERRIDE; void removeGlyphFromCache(glyph_t glyph) Q_DECL_OVERRIDE; int glyphMargin(QFontEngine::GlyphFormat /* format */) Q_DECL_OVERRIDE { return 0; } @@ -311,6 +312,7 @@ protected: bool embeddedbitmap; bool cacheEnabled; bool forceAutoHint; + bool stemDarkeningDriver; private: friend class QFontEngineFTRawFont; diff --git a/src/gui/text/qfontengine_p.h b/src/gui/text/qfontengine_p.h index c0e350f755..514e9424b2 100644 --- a/src/gui/text/qfontengine_p.h +++ b/src/gui/text/qfontengine_p.h @@ -254,6 +254,7 @@ public: static QByteArray convertToPostscriptFontFamilyName(const QByteArray &fontFamily); virtual bool hasUnreliableGlyphOutline() const; + virtual bool expectsGammaCorrectedBlending() const; enum HintStyle { HintNone, |