summaryrefslogtreecommitdiffstats
path: root/src/platformsupport/fontdatabases
diff options
context:
space:
mode:
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2017-08-16 13:20:33 +0200
committerEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2017-08-16 12:48:15 +0000
commita26a3cfbc7cd5c87afeda63eb324a2ba2a4c8192 (patch)
tree27edd18c2a4544a57440007e78f7c26956558b1b /src/platformsupport/fontdatabases
parentf9f5b35e7321fded3fdd887fce656475c3d83f31 (diff)
macOS: Fix matching of font weights for application fonts
5ad2e1cea1b2c08950c91174840f542806954d99 exposed a latent bug when matching font weights that do not exactly match any of the canonical weights in the system . It seems that when we registered the font with FontManager, it would modify the font weight to match a system weight, while we now get raw values from the font instead. So for Roboto Medium, for instance, we would now get 0.2 instead of 0.23, and since our conversion logic would convert everything between Light (-0.4) to Medium (0.23) to QFont::Normal, we would regard this as normal weight instead of medium. But on a linear scale, it makes more sense to match to the closest canonical weight instead of requiring exact matches. Note that the definition says that the middle between two weights should tend upwards, therefore we do the comparisons in decreasing order. [ChangeLog][QtGui][Text] Fixed matching of non-regular font weights for application fonts on macOS. Task-number: QTBUG-61520 Change-Id: Ieda4927c2c69ec72125257340cf06c683b031d05 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/platformsupport/fontdatabases')
-rw-r--r--src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm45
1 files changed, 26 insertions, 19 deletions
diff --git a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
index 49a6049c4b..66baf162d9 100644
--- a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
+++ b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
@@ -112,25 +112,32 @@ bool QCoreTextFontEngine::ct_getSfntTable(void *user_data, uint tag, uchar *buff
QFont::Weight QCoreTextFontEngine::qtWeightFromCFWeight(float value)
{
- if (value >= kCTFontWeightBlack)
- return QFont::Black;
- if (value >= kCTFontWeightHeavy)
- return QFont::ExtraBold;
- if (value >= kCTFontWeightBold)
- return QFont::Bold;
- if (value >= kCTFontWeightSemibold)
- return QFont::DemiBold;
- if (value >= kCTFontWeightMedium)
- return QFont::Medium;
- if (value == kCTFontWeightRegular)
- return QFont::Normal;
- if (value <= kCTFontWeightUltraLight)
- return QFont::Thin;
- if (value <= kCTFontWeightThin)
- return QFont::ExtraLight;
- if (value <= kCTFontWeightLight)
- return QFont::Light;
- return QFont::Normal;
+#define COMPARE_WEIGHT_DISTANCE(ct_weight, qt_weight) \
+ { \
+ float d; \
+ if ((d = qAbs(value - ct_weight)) < distance) { \
+ distance = d; \
+ ret = qt_weight; \
+ } \
+ }
+
+ float distance = qAbs(value - kCTFontWeightBlack);
+ QFont::Weight ret = QFont::Black;
+
+ // Compare distance to system weight to find the closest match.
+ // (Note: Must go from high to low, so that midpoints are rounded up)
+ COMPARE_WEIGHT_DISTANCE(kCTFontWeightHeavy, QFont::ExtraBold);
+ COMPARE_WEIGHT_DISTANCE(kCTFontWeightBold, QFont::Bold);
+ COMPARE_WEIGHT_DISTANCE(kCTFontWeightSemibold, QFont::DemiBold);
+ COMPARE_WEIGHT_DISTANCE(kCTFontWeightMedium, QFont::Medium);
+ COMPARE_WEIGHT_DISTANCE(kCTFontWeightRegular, QFont::Normal);
+ COMPARE_WEIGHT_DISTANCE(kCTFontWeightLight, QFont::Light);
+ COMPARE_WEIGHT_DISTANCE(kCTFontWeightThin, QFont::ExtraLight);
+ COMPARE_WEIGHT_DISTANCE(kCTFontWeightUltraLight, QFont::Thin);
+
+#undef COMPARE_WEIGHT_DISTANCE
+
+ return ret;
}
static void loadAdvancesForGlyphs(CTFontRef ctfont,