From 55708d2502bd06c6408a92fc8f3d138aa4039dcc Mon Sep 17 00:00:00 2001 From: Jiang Jiang Date: Mon, 22 Nov 2010 13:21:42 +0100 Subject: [PATCH] Experimental patch for raw font --- src/gui/text/qfont.cpp | 7 +++++++ src/gui/text/qfont.h | 3 +++ src/gui/text/qfont_p.h | 4 +++- src/gui/text/qfontdatabase.cpp | 1 - src/gui/text/qfontdatabase.h | 15 +++++++++++++++ src/gui/text/qfontdatabase_mac.cpp | 33 +++++++++++++++++++++++++++++++++ src/gui/text/qfontengine_mac.mm | 25 +++++++++++++++++++++++++ src/gui/text/qfontengine_p.h | 1 + 8 files changed, 87 insertions(+), 2 deletions(-) diff --git a/src/gui/text/qfont.cpp b/src/gui/text/qfont.cpp index bdba10d..c495393 100644 --- a/src/gui/text/qfont.cpp +++ b/src/gui/text/qfont.cpp @@ -866,6 +866,13 @@ QFont &QFont::operator=(const QFont &font) return *this; } +void QFont::setRawFontData(const QRawFontData &data) +{ + detach(); + d->request.rawFontData = data.d; + resolve_mask |= QFont::FamilyResolved; +} + /*! Returns the requested font family name, i.e. the name set in the constructor or the last setFont() call. diff --git a/src/gui/text/qfont.h b/src/gui/text/qfont.h index d6f4dc5..71e9795 100644 --- a/src/gui/text/qfont.h +++ b/src/gui/text/qfont.h @@ -60,6 +60,7 @@ class QFontPrivate; /* don't touch */ class QStringList; class QVariant; class Q3TextFormatCollection; +class QRawFontData; class Q_GUI_EXPORT QFont { @@ -157,6 +158,8 @@ public: QFont(const QFont &); ~QFont(); + void setRawFontData(const QRawFontData &); + QString family() const; void setFamily(const QString &); diff --git a/src/gui/text/qfont_p.h b/src/gui/text/qfont_p.h index 646a8b8..cdf6c07 100644 --- a/src/gui/text/qfont_p.h +++ b/src/gui/text/qfont_p.h @@ -65,11 +65,12 @@ QT_BEGIN_NAMESPACE // forwards class QFontCache; class QFontEngine; +struct QRawFontDataPrivate; struct QFontDef { inline QFontDef() - : pointSize(-1.0), pixelSize(-1), + : rawFontData(NULL), pointSize(-1.0), pixelSize(-1), styleStrategy(QFont::PreferDefault), styleHint(QFont::AnyStyle), weight(50), fixedPitch(false), style(QFont::StyleNormal), stretch(100), ignorePitch(true) @@ -80,6 +81,7 @@ struct QFontDef } QString family; + const QRawFontDataPrivate *rawFontData; #ifdef Q_WS_X11 QString addStyle; diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp index bae2a20..5bef235 100644 --- a/src/gui/text/qfontdatabase.cpp +++ b/src/gui/text/qfontdatabase.cpp @@ -2659,6 +2659,5 @@ QStringList QFontDatabase::applicationFontFamilies(int id) \sa {Thread-Support in Qt Modules#Painting In Threads}{Painting In Threads} */ - QT_END_NAMESPACE diff --git a/src/gui/text/qfontdatabase.h b/src/gui/text/qfontdatabase.h index f31c19c..97d866f 100644 --- a/src/gui/text/qfontdatabase.h +++ b/src/gui/text/qfontdatabase.h @@ -62,6 +62,7 @@ struct QFontDef; class QFontEngine; class QFontDatabasePrivate; +class QRawFontData; class Q_GUI_EXPORT QFontDatabase { @@ -172,6 +173,20 @@ private: QFontDatabasePrivate *d; }; +struct QRawFontDataPrivate; + +class Q_GUI_EXPORT QRawFontData +{ +public: + QRawFontData(const QByteArray &fontData); + ~QRawFontData(); + +private: + friend class QFont; + friend class QFontDatabase; + QRawFontDataPrivate *d; +}; + QT_END_NAMESPACE QT_END_HEADER diff --git a/src/gui/text/qfontdatabase_mac.cpp b/src/gui/text/qfontdatabase_mac.cpp index 712bdb4..b0f3eb0 100644 --- a/src/gui/text/qfontdatabase_mac.cpp +++ b/src/gui/text/qfontdatabase_mac.cpp @@ -51,6 +51,10 @@ QT_BEGIN_NAMESPACE int qt_mac_pixelsize(const QFontDef &def, int dpi); //qfont_mac.cpp int qt_mac_pointsize(const QFontDef &def, int dpi); //qfont_mac.cpp +struct QRawFontDataPrivate { + CGFontRef cgFontRef; +}; + #ifndef QT_MAC_USE_COCOA static void initWritingSystems(QtFontFamily *family, ATSFontRef atsFont) { @@ -282,6 +286,14 @@ void QFontDatabase::load(const QFontPrivate *d, int script) return; // the font info and fontdef should already be filled } + if (req.rawFontData) { + QFontEngine *engine = new QCoreTextFontEngineMulti(req.rawFontData->cgFontRef, req, d->kerning); + d->engineData->engine = engine; + engine->ref.ref(); + QFontCache::instance()->insertEngine(key, engine); + return; + } + //find the font QStringList family_list = familyList(req); @@ -456,4 +468,25 @@ bool QFontDatabase::supportsThreadedFontRendering() return true; } +QRawFontData::QRawFontData(const QByteArray &fontData) +{ + QCFType dataProvider = CGDataProviderCreateWithData(NULL, + fontData.constData(), fontData.size(), NULL); + + CGFontRef cgFontRef = CGFontCreateWithDataProvider(dataProvider); + if (cgFontRef) { + d = new QRawFontDataPrivate(); + d->cgFontRef = cgFontRef; + } else + d = NULL; +} + +QRawFontData::~QRawFontData() +{ + if (d->cgFontRef) + CGFontRelease(d->cgFontRef); + + delete d; +} + QT_END_NAMESPACE diff --git a/src/gui/text/qfontengine_mac.mm b/src/gui/text/qfontengine_mac.mm index 3c6f3b2..fe9b72f 100644 --- a/src/gui/text/qfontengine_mac.mm +++ b/src/gui/text/qfontengine_mac.mm @@ -187,7 +187,32 @@ QCoreTextFontEngineMulti::QCoreTextFontEngineMulti(const QCFString &name, const QCoreTextFontEngine *fe = new QCoreTextFontEngine(ctfont, fontDef, this); fe->ref.ref(); engines.append(fe); +} + +QCoreTextFontEngineMulti::QCoreTextFontEngineMulti(CGFontRef cgFontRef, const QFontDef &fontDef, bool kerning) + : QFontEngineMulti(0) +{ + this->fontDef = fontDef; + + transform = CGAffineTransformIdentity; + if (fontDef.stretch != 100) { + transform = CGAffineTransformMakeScale(float(fontDef.stretch) / float(100), 1); + } + ctfont = CTFontCreateWithGraphicsFont(cgFontRef, fontDef.pixelSize, &transform, NULL); + attributeDict = CFDictionaryCreateMutable(0, 2, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + CFDictionaryAddValue(attributeDict, NSFontAttributeName, ctfont); + if (!kerning) { + float zero = 0.0; + QCFType noKern = CFNumberCreate(kCFAllocatorDefault, kCFNumberFloatType, &zero); + CFDictionaryAddValue(attributeDict, kCTKernAttributeName, noKern); + } + + QCoreTextFontEngine *fe = new QCoreTextFontEngine(ctfont, fontDef, this); + fe->ref.ref(); + engines.append(fe); } QCoreTextFontEngineMulti::~QCoreTextFontEngineMulti() diff --git a/src/gui/text/qfontengine_p.h b/src/gui/text/qfontengine_p.h index be9f48d..5da38a8 100644 --- a/src/gui/text/qfontengine_p.h +++ b/src/gui/text/qfontengine_p.h @@ -495,6 +495,7 @@ class QCoreTextFontEngineMulti : public QFontEngineMulti { public: QCoreTextFontEngineMulti(const QCFString &name, const QFontDef &fontDef, bool kerning); + QCoreTextFontEngineMulti(CGFontRef cgFontRef, const QFontDef &fontDef, bool kerning); ~QCoreTextFontEngineMulti(); virtual bool stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, -- 1.7.2.3