summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm8
-rw-r--r--src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h2
-rw-r--r--tests/auto/gui/text/qrawfont/tst_qrawfont.cpp39
3 files changed, 48 insertions, 1 deletions
diff --git a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
index 66baf162d9..d96158d8f6 100644
--- a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
+++ b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm
@@ -192,6 +192,14 @@ public:
: QCoreTextFontEngine(font, def)
, m_fontData(fontData)
{}
+ QFontEngine *cloneWithSize(qreal pixelSize) const
+ {
+ QFontDef newFontDef = fontDef;
+ newFontDef.pixelSize = pixelSize;
+ newFontDef.pointSize = pixelSize * 72.0 / qt_defaultDpi();
+
+ return new QCoreTextRawFontEngine(cgFont, newFontDef, m_fontData);
+ }
QByteArray m_fontData;
};
diff --git a/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h b/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h
index 2986f0aaec..d4c5e70cc1 100644
--- a/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h
+++ b/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h
@@ -125,7 +125,7 @@ public:
static QFontEngine::GlyphFormat defaultGlyphFormat;
static QCoreTextFontEngine *create(const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference);
-private:
+protected:
void init();
QImage imageForGlyph(glyph_t glyph, QFixed subPixelPosition, bool colorful, const QTransform &m);
CTFontRef ctfont;
diff --git a/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp b/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp
index 37f94d0278..373ad7fef9 100644
--- a/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp
+++ b/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp
@@ -93,6 +93,9 @@ private slots:
void fallbackFontsOrder();
+ void qtbug65923_partal_clone_data();
+ void qtbug65923_partal_clone();
+
private:
QString testFont;
QString testFontBoldItalic;
@@ -1044,6 +1047,42 @@ void tst_QRawFont::fallbackFontsOrder()
fontDatabase.removeApplicationFont(id);
}
+void tst_QRawFont::qtbug65923_partal_clone_data()
+{
+ QTest::addColumn<bool>("shouldClone");
+
+ QTest::newRow("Without cloning font engine") << false;
+ QTest::newRow("Cloning font engine") << true;
+}
+
+void tst_QRawFont::qtbug65923_partal_clone()
+{
+ QFile file(testFont);
+ file.open(QIODevice::ReadOnly);
+ QByteArray fontData = file.readAll();
+
+ QRawFont outerFont;
+
+ {
+ QRawFont innerFont(fontData, 16, QFont::PreferDefaultHinting);
+
+ QFETCH(bool, shouldClone);
+ if (shouldClone) {
+ // This will trigger QFontEngine::cloneWithSize
+ innerFont.setPixelSize(innerFont.pixelSize() + 1);
+ }
+
+ outerFont = innerFont;
+ }
+
+ // This will detach if data is shared with the raw font. If the raw font has
+ // a naked reference to the data, without informing Qt of it via the ref count
+ // of the byte array, this will result in clearing 'live' data.
+ fontData.fill('\0');
+
+ QVERIFY(!outerFont.boundingRect(42).isEmpty());
+}
+
#endif // QT_NO_RAWFONT
QTEST_MAIN(tst_QRawFont)