54 void computeSize(
const QFontDef &fontDef,
int *xsize,
int *ysize,
bool *outline_drawing, QFixed *scalableBitmapScaleFactor);
55 QFontEngine::Properties properties()
const;
56 bool getSfntTable(uint tag, uchar *buffer, uint *length)
const;
58 static QFreetypeFace *getFace(
const QFontEngine::FaceId &face_id,
59 const QByteArray &fontData = QByteArray());
60 void release(
const QFontEngine::FaceId &face_id);
62 static int getFaceIndexByStyleName(
const QString &faceFileName,
const QString &styleName);
79 FT_CharMap unicode_map;
80 FT_CharMap symbol_map;
82 enum { cmapCacheSize = 0x200 };
83 glyph_t cmapCache[cmapCacheSize];
87 int getPointInOutline(glyph_t glyph,
int flags, quint32 point, QFixed *xpos, QFixed *ypos, quint32 *nPoints);
89 bool isScalableBitmap()
const;
91 static void addGlyphToPath(FT_Face face, FT_GlyphSlot g,
const QFixedPoint &point, QPainterPath *path, FT_Fixed x_scale, FT_Fixed y_scale);
92 static void addBitmapToPath(FT_GlyphSlot slot,
const QFixedPoint &point, QPainterPath *path);
94 inline QList<QFontVariableAxis> variableAxes()
const
96 return variableAxisList;
100 friend class QFontEngineFT;
101 friend class QtFreetypeData;
102 QFreetypeFace() =
default;
106 QRecursiveMutex _lock;
109 QFontEngine::Holder hbFace;
110 QList<QFontVariableAxis> variableAxisList;
118 unsigned short width;
119 unsigned short height;
126 struct GlyphAndSubPixelPosition
128 GlyphAndSubPixelPosition(glyph_t g,
const QFixedPoint spp) : glyph(g), subPixelPosition(spp) {}
130 bool operator==(
const GlyphAndSubPixelPosition &other)
const
132 return glyph == other.glyph && subPixelPosition == other.subPixelPosition;
136 QFixedPoint subPixelPosition;
143 FT_Matrix transformationMatrix;
144 bool outline_drawing;
146 void removeGlyphFromCache(glyph_t index,
const QFixedPoint &subPixelPosition);
148 inline bool useFastGlyphData(glyph_t index,
const QFixedPoint &subPixelPosition)
const {
149 return (index < 256 && subPixelPosition.x == 0 && subPixelPosition.y == 0);
151 inline Glyph *getGlyph(glyph_t index,
152 const QFixedPoint &subPixelPositionX = QFixedPoint())
const;
153 void setGlyph(glyph_t index,
const QFixedPoint &spp, Glyph *glyph);
155 inline bool isGlyphMissing(glyph_t index)
const {
return missing_glyphs.contains(index); }
156 inline void setGlyphMissing(glyph_t index)
const { missing_glyphs.insert(index); }
158 Q_DISABLE_COPY(QGlyphSet);
159 mutable QHash<GlyphAndSubPixelPosition, Glyph *> glyph_data;
160 mutable QSet<glyph_t> missing_glyphs;
161 mutable Glyph *fast_glyph_data[256];
162 mutable int fast_glyph_count;
165 QFontEngine::FaceId faceId()
const override;
166 QFontEngine::Properties properties()
const override;
167 QFixed emSquareSize()
const override;
168 bool supportsHorizontalSubPixelPositions()
const override
170 return default_hint_style == HintLight ||
171 default_hint_style == HintNone;
174 bool supportsVerticalSubPixelPositions()
const override
176 return supportsHorizontalSubPixelPositions();
179 bool getSfntTableData(uint tag, uchar *buffer, uint *length)
const override;
180 int synthesized()
const override;
182 void initializeHeightMetrics()
const override;
183 QFixed capHeight()
const override;
184 QFixed xHeight()
const override;
185 QFixed averageCharWidth()
const override;
187 qreal maxCharWidth()
const override;
188 QFixed lineThickness()
const override;
189 QFixed underlinePosition()
const override;
191 glyph_t glyphIndex(uint ucs4)
const override;
192 QString glyphName(glyph_t index)
const override;
193 void doKerning(QGlyphLayout *, ShaperFlags)
const override;
195 void getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_metrics_t *metrics) override;
197 bool supportsTransformation(
const QTransform &transform)
const override;
199 void addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions,
int nglyphs,
200 QPainterPath *path, QTextItem::RenderFlags flags) override;
201 void addOutlineToPath(qreal x, qreal y,
const QGlyphLayout &glyphs,
202 QPainterPath *path, QTextItem::RenderFlags flags) override;
204 int stringToCMap(
const QChar *str,
int len, QGlyphLayout *glyphs,
int *nglyphs, ShaperFlags flags)
const override;
206 glyph_metrics_t boundingBox(
const QGlyphLayout &glyphs) override;
207 glyph_metrics_t boundingBox(glyph_t glyph) override;
208 glyph_metrics_t boundingBox(glyph_t glyph,
const QTransform &matrix) override;
210 void recalcAdvances(QGlyphLayout *glyphs, ShaperFlags flags)
const override;
211 QImage alphaMapForGlyph(glyph_t g) override {
return alphaMapForGlyph(g, QFixedPoint()); }
212 QImage alphaMapForGlyph(glyph_t,
const QFixedPoint &) override;
213 QImage alphaMapForGlyph(glyph_t glyph,
const QFixedPoint &subPixelPosition,
const QTransform &t) override;
214 QImage alphaRGBMapForGlyph(glyph_t,
const QFixedPoint &subPixelPosition,
const QTransform &t) override;
215 QImage bitmapForGlyph(glyph_t,
const QFixedPoint &subPixelPosition,
const QTransform &t,
const QColor &color) override;
216 glyph_metrics_t alphaMapBoundingBox(glyph_t glyph,
217 const QFixedPoint &subPixelPosition,
218 const QTransform &matrix,
219 QFontEngine::GlyphFormat format) override;
220 Glyph *glyphData(glyph_t glyph,
221 const QFixedPoint &subPixelPosition,
222 GlyphFormat neededFormat,
223 const QTransform &t) override;
224 bool hasInternalCaching()
const override {
return cacheEnabled; }
225 bool expectsGammaCorrectedBlending()
const override;
227 void removeGlyphFromCache(glyph_t glyph) override;
228 int glyphMargin(QFontEngine::GlyphFormat ) override {
return 0; }
230 int glyphCount()
const override;
232 QList<QFontVariableAxis> variableAxes()
const override;
238 FT_Face lockFace(Scaling scale = Scaled)
const;
239 void unlockFace()
const;
241 FT_Face non_locked_face()
const;
243 inline bool drawAntialiased()
const {
return antialias; }
244 inline bool invalid()
const {
return xsize == 0 && ysize == 0; }
245 inline bool isBitmapFont()
const {
return defaultFormat == Format_Mono; }
246 inline bool isScalableBitmap()
const {
return freetype->isScalableBitmap(); }
248 inline Glyph *loadGlyph(uint glyph,
249 const QFixedPoint &subPixelPosition,
250 GlyphFormat format = Format_None,
251 bool fetchMetricsOnly =
false,
252 bool disableOutlineDrawing =
false)
const
254 return loadGlyph(cacheEnabled ? &defaultGlyphSet :
nullptr,
260 disableOutlineDrawing);
262 Glyph *loadGlyph(QGlyphSet *set,
264 const QFixedPoint &subPixelPosition,
266 GlyphFormat = Format_None,
267 bool fetchMetricsOnly =
false,
268 bool disableOutlineDrawing =
false)
const;
269 Glyph *loadGlyphFor(glyph_t g,
270 const QFixedPoint &subPixelPosition,
274 bool fetchBoundingBox =
false,
275 bool disableOutlineDrawing =
false);
277 QGlyphSet *loadGlyphSet(
const QTransform &matrix);
279 QFontEngineFT(
const QFontDef &fd);
280 virtual ~QFontEngineFT();
282 bool init(FaceId faceId,
bool antiaalias, GlyphFormat defaultFormat = Format_None,
283 const QByteArray &fontData = QByteArray());
284 bool init(FaceId faceId,
bool antialias, GlyphFormat format,
285 QFreetypeFace *freetypeFace);
287 int getPointInOutline(glyph_t glyph,
int flags, quint32 point, QFixed *xpos, QFixed *ypos, quint32 *nPoints) override;
289 void setQtDefaultHintStyle(QFont::HintingPreference hintingPreference);
290 void setDefaultHintStyle(HintStyle style) override;
292 QFontEngine *cloneWithSize(qreal pixelSize)
const override;
293 Qt::HANDLE handle()
const override;
294 bool initFromFontEngine(
const QFontEngineFT *fontEngine);
296 HintStyle defaultHintStyle()
const {
return default_hint_style; }
298 static QFontEngineFT *create(
const QFontDef &fontDef, FaceId faceId,
const QByteArray &fontData = QByteArray());
299 static QFontEngineFT *create(
const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference,
const QMap<QFont::Tag,
float> &variableAxisValue);
303 QFreetypeFace *freetype;
304 mutable int default_load_flags;
305 HintStyle default_hint_style;
310 SubpixelAntialiasingType subpixelType;
315 bool stemDarkeningDriver;
318 friend class QFontEngineFTRawFont;
319 friend class QFontconfigDatabase;
320 friend class QFreeTypeFontDatabase;
321 friend class QFontEngineMultiFontConfig;
323 int loadFlags(QGlyphSet *set, GlyphFormat format,
int flags,
bool &hsubpixel,
int &vfactor)
const;
324 bool shouldUseDesignMetrics(ShaperFlags flags)
const;
325 QFixed scaledBitmapMetrics(QFixed m)
const;
326 glyph_metrics_t scaledBitmapMetrics(
const glyph_metrics_t &m,
const QTransform &matrix)
const;
328#if defined(QFONTENGINE_FT_SUPPORT_COLRV1)
329 Glyph *loadColrv1Glyph(QGlyphSet *set,
333 bool fetchMetricsOnly)
const;
335 bool traverseColr1(FT_OpaquePaint paint,
336 QSet<QPair<FT_Byte *, FT_Bool> > *loops,
337 QColor foregroundColor,
340 QColrPaintGraphRenderer *paintGraphRenderer)
const;
341 mutable glyph_t colrv1_bounds_cache_id = 0;
342 mutable QRect colrv1_bounds_cache;
345 GlyphFormat defaultFormat;
348 struct TransformedGlyphSets {
350 QGlyphSet *sets[nSets];
352 QGlyphSet *findSet(
const QTransform &matrix,
const QFontDef &fontDef);
353 TransformedGlyphSets() { std::fill(&sets[0], &sets[nSets],
nullptr); }
354 ~TransformedGlyphSets() { qDeleteAll(&sets[0], &sets[nSets]); }
356 void moveToFront(
int i);
357 Q_DISABLE_COPY(TransformedGlyphSets);
359 TransformedGlyphSets transformedGlyphSets;
360 mutable QGlyphSet defaultGlyphSet;
362 QFontEngine::FaceId face_id;
367 QFixed line_thickness;
368 QFixed underline_position;
370 FT_Size_Metrics metrics;
371 mutable bool kerning_pairs_loaded;
372 QFixed scalableBitmapScaleFactor;