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 ||
177 bool supportsVerticalSubPixelPositions()
const override
179 return supportsHorizontalSubPixelPositions();
182 bool getSfntTableData(uint tag, uchar *buffer, uint *length)
const override;
183 int synthesized()
const override;
185 void initializeHeightMetrics()
const override;
186 QFixed capHeight()
const override;
187 QFixed xHeight()
const override;
188 QFixed averageCharWidth()
const override;
190 qreal maxCharWidth()
const override;
191 QFixed lineThickness()
const override;
192 QFixed underlinePosition()
const override;
194 glyph_t glyphIndex(uint ucs4)
const override;
195 QString glyphName(glyph_t index)
const override;
196 void doKerning(QGlyphLayout *, ShaperFlags)
const override;
198 void getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_metrics_t *metrics) override;
200 bool supportsTransformation(
const QTransform &transform)
const override;
202 void addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions,
int nglyphs,
203 QPainterPath *path, QTextItem::RenderFlags flags) override;
204 void addOutlineToPath(qreal x, qreal y,
const QGlyphLayout &glyphs,
205 QPainterPath *path, QTextItem::RenderFlags flags) override;
207 int stringToCMap(
const QChar *str,
int len, QGlyphLayout *glyphs,
int *nglyphs, ShaperFlags flags)
const override;
209 glyph_metrics_t boundingBox(
const QGlyphLayout &glyphs) override;
210 glyph_metrics_t boundingBox(glyph_t glyph) override;
211 glyph_metrics_t boundingBox(glyph_t glyph,
const QTransform &matrix) override;
213 void recalcAdvances(QGlyphLayout *glyphs, ShaperFlags flags)
const override;
214 QImage alphaMapForGlyph(glyph_t g) override {
return alphaMapForGlyph(g, QFixedPoint()); }
215 QImage alphaMapForGlyph(glyph_t,
const QFixedPoint &) override;
216 QImage alphaMapForGlyph(glyph_t glyph,
const QFixedPoint &subPixelPosition,
const QTransform &t) override;
217 QImage alphaRGBMapForGlyph(glyph_t,
const QFixedPoint &subPixelPosition,
const QTransform &t) override;
218 QImage bitmapForGlyph(glyph_t,
const QFixedPoint &subPixelPosition,
const QTransform &t,
const QColor &color) override;
219 glyph_metrics_t alphaMapBoundingBox(glyph_t glyph,
220 const QFixedPoint &subPixelPosition,
221 const QTransform &matrix,
222 QFontEngine::GlyphFormat format) override;
223 Glyph *glyphData(glyph_t glyph,
224 const QFixedPoint &subPixelPosition,
225 GlyphFormat neededFormat,
226 const QTransform &t) override;
227 bool hasInternalCaching()
const override {
return cacheEnabled; }
228 bool expectsGammaCorrectedBlending(QFontEngine::GlyphFormat format)
const override;
230 void removeGlyphFromCache(glyph_t glyph) override;
231 int glyphMargin(QFontEngine::GlyphFormat ) override {
return 0; }
233 int glyphCount()
const override;
235 QList<QFontVariableAxis> variableAxes()
const override;
241 FT_Face lockFace(Scaling scale = Scaled)
const;
242 void unlockFace()
const;
244 FT_Face non_locked_face()
const;
246 inline bool drawAntialiased()
const {
return antialias; }
247 inline bool invalid()
const {
return xsize == 0 && ysize == 0; }
248 inline bool isBitmapFont()
const {
return defaultFormat == Format_Mono; }
249 inline bool isScalableBitmap()
const {
return freetype->isScalableBitmap(); }
251 inline Glyph *loadGlyph(uint glyph,
252 const QFixedPoint &subPixelPosition,
253 GlyphFormat format = Format_None,
254 bool fetchMetricsOnly =
false,
255 bool disableOutlineDrawing =
false)
const
257 return loadGlyph(cacheEnabled ? &defaultGlyphSet :
nullptr,
263 disableOutlineDrawing);
265 Glyph *loadGlyph(QGlyphSet *set,
267 const QFixedPoint &subPixelPosition,
269 GlyphFormat = Format_None,
270 bool fetchMetricsOnly =
false,
271 bool disableOutlineDrawing =
false)
const;
272 Glyph *loadGlyphFor(glyph_t g,
273 const QFixedPoint &subPixelPosition,
277 bool fetchBoundingBox =
false,
278 bool disableOutlineDrawing =
false);
280 QGlyphSet *loadGlyphSet(
const QTransform &matrix);
282 QFontEngineFT(
const QFontDef &fd);
283 virtual ~QFontEngineFT();
285 bool init(FaceId faceId,
bool antiaalias, GlyphFormat defaultFormat = Format_None,
286 const QByteArray &fontData = QByteArray());
287 bool init(FaceId faceId,
bool antialias, GlyphFormat format,
288 QFreetypeFace *freetypeFace);
290 int getPointInOutline(glyph_t glyph,
int flags, quint32 point, QFixed *xpos, QFixed *ypos, quint32 *nPoints) override;
292 void setQtDefaultHintStyle(QFont::HintingPreference hintingPreference);
293 void setDefaultHintStyle(HintStyle style) override;
294 bool setVerticalHintingOnly();
296 QFontEngine *cloneWithSize(qreal pixelSize)
const override;
297 Qt::HANDLE handle()
const override;
298 bool initFromFontEngine(
const QFontEngineFT *fontEngine);
300 HintStyle defaultHintStyle()
const {
return default_hint_style; }
302 static QFontEngineFT *create(
const QFontDef &fontDef, FaceId faceId,
const QByteArray &fontData = QByteArray());
303 static QFontEngineFT *create(
const QByteArray &fontData, qreal pixelSize, QFont::HintingPreference hintingPreference,
const QMap<QFont::Tag,
float> &variableAxisValue,
int instanceIndex = 0);
307 QFreetypeFace *freetype;
308 mutable int default_load_flags;
309 HintStyle default_hint_style;
314 SubpixelAntialiasingType subpixelType;
319 bool stemDarkeningDriver;
320 bool verticalHintingOnly;
323 friend class QFontEngineFTRawFont;
324 friend class QFontconfigDatabase;
325 friend class QFreeTypeFontDatabase;
326 friend class QFontEngineMultiFontConfig;
328 int loadFlags(QGlyphSet *set, GlyphFormat format,
int flags,
bool &hsubpixel,
int &vfactor)
const;
329 void setFaceSize(
int xsize,
int ysize)
const;
330 bool shouldUseDesignMetrics(ShaperFlags flags)
const;
331 QFixed scaledBitmapMetrics(QFixed m)
const;
332 glyph_metrics_t scaledBitmapMetrics(
const glyph_metrics_t &m,
const QTransform &matrix)
const;
334#if defined(QFONTENGINE_FT_SUPPORT_COLRV1)
335 Glyph *loadColrv1Glyph(QGlyphSet *set,
339 bool fetchMetricsOnly)
const;
341 bool traverseColr1(FT_OpaquePaint paint,
342 QSet<std::pair<FT_Byte *, FT_Bool> > *loops,
343 QColor foregroundColor,
346 QColrPaintGraphRenderer *paintGraphRenderer)
const;
347 mutable glyph_t colrv1_bounds_cache_id = 0;
348 mutable QRect colrv1_bounds_cache;
351 GlyphFormat defaultFormat;
354 struct TransformedGlyphSets {
356 QGlyphSet *sets[nSets];
358 QGlyphSet *findSet(
const QTransform &matrix,
const QFontDef &fontDef);
359 TransformedGlyphSets() { std::fill(&sets[0], &sets[nSets],
nullptr); }
360 ~TransformedGlyphSets() { qDeleteAll(&sets[0], &sets[nSets]); }
362 void moveToFront(
int i);
363 Q_DISABLE_COPY(TransformedGlyphSets);
365 TransformedGlyphSets transformedGlyphSets;
366 mutable QGlyphSet defaultGlyphSet;
368 QFontEngine::FaceId face_id;
373 QFixed line_thickness;
374 QFixed underline_position;
376 FT_Size_Metrics metrics;
377 mutable bool kerning_pairs_loaded;
378 QFixed scalableBitmapScaleFactor;