56 void computeSize(
const QFontDef &fontDef,
int *xsize,
int *ysize,
bool *outline_drawing, QFixed *scalableBitmapScaleFactor);
57 QFontEngine::Properties properties()
const;
58 bool getSfntTable(uint tag, uchar *buffer, uint *length)
const;
60 static QFreetypeFace *getFace(
const QFontEngine::FaceId &face_id,
61 const QByteArray &fontData = QByteArray());
62 void release(
const QFontEngine::FaceId &face_id);
64 static int getFaceIndexByStyleName(
const QString &faceFileName,
const QString &styleName);
81 FT_CharMap unicode_map;
82 FT_CharMap symbol_map;
84 enum { cmapCacheSize = 0x200 };
85 glyph_t cmapCache[cmapCacheSize];
89 int getPointInOutline(glyph_t glyph,
int flags, quint32 point, QFixed *xpos, QFixed *ypos, quint32 *nPoints);
91 bool isScalableBitmap()
const;
93 static void addGlyphToPath(FT_Face face, FT_GlyphSlot g,
const QFixedPoint &point, QPainterPath *path, FT_Fixed x_scale, FT_Fixed y_scale);
94 static void addBitmapToPath(FT_GlyphSlot slot,
const QFixedPoint &point, QPainterPath *path);
96 inline QList<QFontVariableAxis> variableAxes()
const
98 return variableAxisList;
102 friend class QFontEngineFT;
103 friend class QtFreetypeData;
104 QFreetypeFace() =
default;
108 QRecursiveMutex _lock;
111 QFontEngine::Holder hbFace;
112 QList<QFontVariableAxis> variableAxisList;
120 unsigned short width;
121 unsigned short height;
128 struct GlyphAndSubPixelPosition
130 GlyphAndSubPixelPosition(glyph_t g,
const QFixedPoint spp) : glyph(g), subPixelPosition(spp) {}
132 bool operator==(
const GlyphAndSubPixelPosition &other)
const
134 return glyph == other.glyph && subPixelPosition == other.subPixelPosition;
138 QFixedPoint subPixelPosition;
145 FT_Matrix transformationMatrix;
146 bool outline_drawing;
148 void removeGlyphFromCache(glyph_t index,
const QFixedPoint &subPixelPosition);
150 inline bool useFastGlyphData(glyph_t index,
const QFixedPoint &subPixelPosition)
const {
151 return (index < 256 && subPixelPosition.x == 0 && subPixelPosition.y == 0);
153 inline Glyph *getGlyph(glyph_t index,
154 const QFixedPoint &subPixelPositionX = QFixedPoint())
const;
155 void setGlyph(glyph_t index,
const QFixedPoint &spp, Glyph *glyph);
157 inline bool isGlyphMissing(glyph_t index)
const {
return missing_glyphs.contains(index); }
158 inline void setGlyphMissing(glyph_t index)
const { missing_glyphs.insert(index); }
160 Q_DISABLE_COPY(QGlyphSet);
161 mutable QHash<GlyphAndSubPixelPosition, Glyph *> glyph_data;
162 mutable QSet<glyph_t> missing_glyphs;
163 mutable Glyph *fast_glyph_data[256];
164 mutable int fast_glyph_count;
167 QFontEngine::FaceId faceId()
const override;
168 QFontEngine::Properties properties()
const override;
169 QFixed emSquareSize()
const override;
170 bool supportsHorizontalSubPixelPositions()
const override
172 return default_hint_style == HintLight ||
173 default_hint_style == HintNone;
176 bool supportsVerticalSubPixelPositions()
const override
178 return supportsHorizontalSubPixelPositions();
181 bool getSfntTableData(uint tag, uchar *buffer, uint *length)
const override;
182 int synthesized()
const override;
184 void initializeHeightMetrics()
const override;
185 QFixed capHeight()
const override;
186 QFixed xHeight()
const override;
187 QFixed averageCharWidth()
const override;
189 qreal maxCharWidth()
const override;
190 QFixed lineThickness()
const override;
191 QFixed underlinePosition()
const override;
193 glyph_t glyphIndex(uint ucs4)
const override;
194 QString glyphName(glyph_t index)
const override;
195 void doKerning(QGlyphLayout *, ShaperFlags)
const override;
197 void getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_metrics_t *metrics) override;
199 bool supportsTransformation(
const QTransform &transform)
const override;
201 void addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions,
int nglyphs,
202 QPainterPath *path, QTextItem::RenderFlags flags) override;
203 void addOutlineToPath(qreal x, qreal y,
const QGlyphLayout &glyphs,
204 QPainterPath *path, QTextItem::RenderFlags flags) override;
206 int stringToCMap(
const QChar *str,
int len, QGlyphLayout *glyphs,
int *nglyphs, ShaperFlags flags)
const override;
208 glyph_metrics_t boundingBox(
const QGlyphLayout &glyphs) override;
209 glyph_metrics_t boundingBox(glyph_t glyph) override;
210 glyph_metrics_t boundingBox(glyph_t glyph,
const QTransform &matrix) override;
212 void recalcAdvances(QGlyphLayout *glyphs, ShaperFlags flags)
const override;
213 QImage alphaMapForGlyph(glyph_t g) override {
return alphaMapForGlyph(g, QFixedPoint()); }
214 QImage alphaMapForGlyph(glyph_t,
const QFixedPoint &) override;
215 QImage alphaMapForGlyph(glyph_t glyph,
const QFixedPoint &subPixelPosition,
const QTransform &t) override;
216 QImage alphaRGBMapForGlyph(glyph_t,
const QFixedPoint &subPixelPosition,
const QTransform &t) override;
217 QImage bitmapForGlyph(glyph_t,
const QFixedPoint &subPixelPosition,
const QTransform &t,
const QColor &color) override;
218 glyph_metrics_t alphaMapBoundingBox(glyph_t glyph,
219 const QFixedPoint &subPixelPosition,
220 const QTransform &matrix,
221 QFontEngine::GlyphFormat format) override;
222 Glyph *glyphData(glyph_t glyph,
223 const QFixedPoint &subPixelPosition,
224 GlyphFormat neededFormat,
225 const QTransform &t) override;
226 bool hasInternalCaching()
const override {
return cacheEnabled; }
227 bool expectsGammaCorrectedBlending()
const override;
229 void removeGlyphFromCache(glyph_t glyph) override;
230 int glyphMargin(QFontEngine::GlyphFormat ) override {
return 0; }
232 int glyphCount()
const override;
234 QList<QFontVariableAxis> variableAxes()
const override;
240 FT_Face lockFace(Scaling scale = Scaled)
const;
241 void unlockFace()
const;
243 FT_Face non_locked_face()
const;
245 inline bool drawAntialiased()
const {
return antialias; }
246 inline bool invalid()
const {
return xsize == 0 && ysize == 0; }
247 inline bool isBitmapFont()
const {
return defaultFormat == Format_Mono; }
248 inline bool isScalableBitmap()
const {
return freetype->isScalableBitmap(); }
250 inline Glyph *loadGlyph(uint glyph,
251 const QFixedPoint &subPixelPosition,
252 GlyphFormat format = Format_None,
253 bool fetchMetricsOnly =
false,
254 bool disableOutlineDrawing =
false)
const
256 return loadGlyph(cacheEnabled ? &defaultGlyphSet :
nullptr,
262 disableOutlineDrawing);
264 Glyph *loadGlyph(QGlyphSet *set,
266 const QFixedPoint &subPixelPosition,
268 GlyphFormat = Format_None,
269 bool fetchMetricsOnly =
false,
270 bool disableOutlineDrawing =
false)
const;
271 Glyph *loadGlyphFor(glyph_t g,
272 const QFixedPoint &subPixelPosition,
276 bool fetchBoundingBox =
false,
277 bool disableOutlineDrawing =
false);
279 QGlyphSet *loadGlyphSet(
const QTransform &matrix);
281 QFontEngineFT(
const QFontDef &fd);
282 virtual ~QFontEngineFT();
284 bool init(FaceId faceId,
bool antiaalias, GlyphFormat defaultFormat = Format_None,
285 const QByteArray &fontData = QByteArray());
286 bool init(FaceId faceId,
bool antialias, GlyphFormat format,
287 QFreetypeFace *freetypeFace);
289 int getPointInOutline(glyph_t glyph,
int flags, quint32 point, QFixed *xpos, QFixed *ypos, quint32 *nPoints) override;
291 void setQtDefaultHintStyle(QFont::HintingPreference hintingPreference);
292 void setDefaultHintStyle(HintStyle style) override;
294 QFontEngine *cloneWithSize(qreal pixelSize)
const override;
295 Qt::HANDLE handle()
const override;
296 bool initFromFontEngine(
const QFontEngineFT *fontEngine);
298 HintStyle defaultHintStyle()
const {
return default_hint_style; }
300 static QFontEngineFT *create(
const QFontDef &fontDef, FaceId faceId,
const QByteArray &fontData = QByteArray());
301 static QFontEngineFT *create(
const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference,
const QMap<QFont::Tag,
float> &variableAxisValue);
305 QFreetypeFace *freetype;
306 mutable int default_load_flags;
307 HintStyle default_hint_style;
312 SubpixelAntialiasingType subpixelType;
317 bool stemDarkeningDriver;
320 friend class QFontEngineFTRawFont;
321 friend class QFontconfigDatabase;
322 friend class QFreeTypeFontDatabase;
323 friend class QFontEngineMultiFontConfig;
325 int loadFlags(QGlyphSet *set, GlyphFormat format,
int flags,
bool &hsubpixel,
int &vfactor)
const;
326 bool shouldUseDesignMetrics(ShaperFlags flags)
const;
327 QFixed scaledBitmapMetrics(QFixed m)
const;
328 glyph_metrics_t scaledBitmapMetrics(
const glyph_metrics_t &m,
const QTransform &matrix)
const;
330#if defined(QFONTENGINE_FT_SUPPORT_COLRV1)
331 Glyph *loadColrv1Glyph(QGlyphSet *set,
335 bool fetchMetricsOnly)
const;
337 bool traverseColr1(FT_OpaquePaint paint,
338 QSet<std::pair<FT_Byte *, FT_Bool> > *loops,
339 QColor foregroundColor,
342 QColrPaintGraphRenderer *paintGraphRenderer)
const;
343 mutable glyph_t colrv1_bounds_cache_id = 0;
344 mutable QRect colrv1_bounds_cache;
347 GlyphFormat defaultFormat;
350 struct TransformedGlyphSets {
352 QGlyphSet *sets[nSets];
354 QGlyphSet *findSet(
const QTransform &matrix,
const QFontDef &fontDef);
355 TransformedGlyphSets() { std::fill(&sets[0], &sets[nSets],
nullptr); }
356 ~TransformedGlyphSets() { qDeleteAll(&sets[0], &sets[nSets]); }
358 void moveToFront(
int i);
359 Q_DISABLE_COPY(TransformedGlyphSets);
361 TransformedGlyphSets transformedGlyphSets;
362 mutable QGlyphSet defaultGlyphSet;
364 QFontEngine::FaceId face_id;
369 QFixed line_thickness;
370 QFixed underline_position;
372 FT_Size_Metrics metrics;
373 mutable bool kerning_pairs_loaded;
374 QFixed scalableBitmapScaleFactor;