/**************************************************************************** ** ** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved. ** ** This file is part of the QtGui module of the Qt Toolkit. ** ** This file may be used under the terms of the GNU General Public ** License version 2.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of ** this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** http://trolltech.com/products/qt/licenses/licensing/opensource/ ** ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview ** or contact the sales department at sales@trolltech.com. ** ** In addition, as a special exception, Trolltech gives you certain ** additional rights. These rights are described in the Trolltech GPL ** Exception version 1.0, which can be found at ** http://www.trolltech.com/products/qt/gplexception/ and in the file ** GPL_EXCEPTION.txt in this package. ** ** In addition, as a special exception, Trolltech, as the sole copyright ** holder for Qt Designer, grants users of the Qt/Eclipse Integration ** plug-in the right for the Qt/Eclipse Integration to link to ** functionality provided by Qt Designer and its related libraries. ** ** Trolltech reserves all rights not expressly granted herein. ** ** Trolltech ASA (c) 2007 ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ #ifndef QFONTENGINE_FT_P_H #define QFONTENGINE_FT_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include "qfontengine_p.h" #ifndef QT_NO_FREETYPE #include #include FT_FREETYPE_H #if defined(Q_WS_X11) #include #endif #include #ifndef QT_NO_FONTCONFIG #include #endif #include struct QFreetypeFace { void computeSize(const QFontDef &fontDef, int *xsize, int *ysize, bool *outline_drawing); QFontEngine::Properties properties() const; QByteArray getSfntTable(uint tag) const; static QFreetypeFace *getFace(const QFontEngine::FaceId &face_id); void release(const QFontEngine::FaceId &face_id); void lock() { _lock.lock(); } void unlock() { _lock.unlock(); } FT_Face face; #ifndef QT_NO_FONTCONFIG FcCharSet *charset; #endif int xsize; // 26.6 int ysize; // 26.6 FT_Matrix matrix; FT_CharMap unicode_map; FT_CharMap symbol_map; enum { cmapCacheSize = 0x200 }; glyph_t cmapCache[cmapCacheSize]; int fsType() const; static void addGlyphToPath(FT_Face face, FT_GlyphSlot g, const QFixedPoint &point, QPainterPath *path, FT_Fixed x_scale, FT_Fixed y_scale); static void addBitmapToPath(FT_GlyphSlot slot, const QFixedPoint &point, QPainterPath *path, bool = false); private: QFreetypeFace() {} ~QFreetypeFace() {} QAtomic ref; QMutex _lock; QByteArray fontData; }; class Q_GUI_EXPORT QFontEngineFT : public QFontEngine { public: enum GlyphFormat { Format_None, Format_Render = Format_None, Format_Mono, Format_A8, Format_A32 }; /* we don't cache glyphs that are too large anyway, so we can make this struct rather small */ struct Glyph { ~Glyph(); short linearAdvance; unsigned char width; unsigned char height; signed char x; signed char y; signed char advance; signed char format; uchar *data; unsigned int uploadedToServer : 1; }; enum SubpixelAntialiasingType { Subpixel_None, Subpixel_RGB, Subpixel_BGR, Subpixel_VRGB, Subpixel_VBGR }; #if defined(Q_WS_X11) && !defined(QT_NO_XRENDER) typedef XGlyphInfo GlyphInfo; #else struct GlyphInfo { unsigned short width; unsigned short height; short x; short y; short xOff; short yOff; }; #endif struct QGlyphSet { QGlyphSet(); ~QGlyphSet(); FT_Matrix transformationMatrix; unsigned long id; // server sided id, GlyphSet for X11 mutable QHash glyph_data; // maps from glyph index to glyph data }; QFontEngine::FaceId faceId() const; QFontEngine::Properties properties() const; QByteArray getSfntTable(uint tag) const; int synthesized() const; QFixed ascent() const; QFixed descent() const; QFixed leading() const; QFixed xHeight() const; QFixed averageCharWidth() const; qreal maxCharWidth() const; qreal minLeftBearing() const; qreal minRightBearing() const; QFixed lineThickness() const; QFixed underlinePosition() const; void doKerning(int , QGlyphLayout *, QTextEngine::ShaperFlags) const; inline Type type() const { return QFontEngine::Freetype; } inline const char *name() const { return "freetype"; } void getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_metrics_t *metrics); bool canRender(const QChar *string, int len); void addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions, int nglyphs, QPainterPath *path, QTextItem::RenderFlags flags); void addOutlineToPath(qreal x, qreal y, const QGlyphLayout *glyphs, int numGlyphs, QPainterPath *path, QTextItem::RenderFlags flags); bool stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, QTextEngine::ShaperFlags flags) const; glyph_metrics_t boundingBox(const QGlyphLayout *glyphs, int numGlyphs); glyph_metrics_t boundingBox(glyph_t glyph); void recalcAdvances(int len, QGlyphLayout *glyphs, QTextEngine::ShaperFlags flags) const; virtual QImage alphaMapForGlyph(glyph_t); virtual void removeGlyphFromCache(glyph_t glyph); virtual int glyphCount() const; enum Scaling { Scaled, Unscaled }; FT_Face lockFace(Scaling scale = Scaled) const; void unlockFace() const; FT_Face non_locked_face() const; inline bool drawAsOutline() const { return outline_drawing; } inline bool drawAntialiased() const { return antialias; } inline bool invalid() const { return xsize == 0 && ysize == 0; } inline bool isBitmapFont() const { return defaultGlyphFormat == Format_Mono; } QOpenType *openType() const; inline Glyph *loadGlyph(uint glyph, GlyphFormat format = Format_None) const { return loadGlyph(&defaultGlyphSet, glyph, format); } Glyph *loadGlyph(QGlyphSet *set, uint glyph, GlyphFormat = Format_None) const; QGlyphSet *defaultGlyphs() { return &defaultGlyphSet; } inline Glyph *cachedGlyph(glyph_t g) const { return defaultGlyphSet.glyph_data.value(g); } QGlyphSet *loadTransformedGlyphSet(glyph_t *glyphs, int num_glyphs, const QTransform &matrix, GlyphFormat format = Format_Render); #if defined(Q_WS_QWS) virtual void draw(QPaintEngine * /*p*/, qreal /*x*/, qreal /*y*/, const QTextItemInt & /*si*/) {} #endif QFontEngineFT(const QFontDef &fd); virtual ~QFontEngineFT(); bool init(FaceId faceId, bool antiaalias, GlyphFormat defaultFormat = Format_None); protected: void freeGlyphSets(); virtual bool uploadGlyphToServer(QGlyphSet *set, uint glyphid, Glyph *g, GlyphInfo *info, int glyphDataSize) const; virtual unsigned long allocateServerGlyphSet(); virtual void freeServerGlyphSet(unsigned long id); QFreetypeFace *freetype; int default_load_flags; bool antialias; bool outline_drawing; bool transform; SubpixelAntialiasingType subpixelType; bool canUploadGlyphsToServer; private: GlyphFormat defaultGlyphFormat; FT_Matrix matrix; QList transformedGlyphSets; mutable QGlyphSet defaultGlyphSet; QFontEngine::FaceId face_id; int xsize; int ysize; mutable QFixed lbearing; mutable QFixed rbearing; QFixed line_thickness; QFixed underline_position; mutable QOpenType *_openType; FT_Size_Metrics metrics; mutable bool kerning_pairs_loaded; }; #endif // QT_NO_FREETYPE #endif // QFONTENGINE_FT_P_H