41 #include <private/qfontengine_p.h>
42 #include <private/qfontengineglyphcache_p.h>
43 #include <private/qguiapplication_p.h>
45 #include <qpa/qplatformfontdatabase.h>
46 #include <qpa/qplatformintegration.h>
54 #include <private/qstringiterator_p.h>
56 #if QT_CONFIG(harfbuzz)
76 return a.m11() ==
b.m11()
79 &&
a.m22() ==
b.m22();
89 *output = qFromBigEndian<T>(
source);
95 #if QT_CONFIG(harfbuzz)
98 bool qt_useHarfbuzzNG()
100 return *useHarfbuzzNG();
122 #ifdef QT_BUILD_INTERNAL
128 delete enginesCollector;
136 delete enginesCollector;
137 enginesCollector =
nullptr;
145 #define kBearingNotInitialized std::numeric_limits<qreal>::max()
151 m_heightMetricsQueried(
false),
166 #ifdef QT_BUILD_INTERNAL
167 if (enginesCollector)
168 enginesCollector->
append(
this);
174 #ifdef QT_BUILD_INTERNAL
175 if (enginesCollector)
184 int lw = score / 700;
187 if (lw < 2 && score >= 1050) lw = 2;
201 #if QT_CONFIG(harfbuzz)
202 if (qt_useHarfbuzzNG())
211 #if QT_CONFIG(harfbuzz)
212 if (qt_useHarfbuzzNG())
229 #if QT_CONFIG(harfbuzz)
230 if (qt_useHarfbuzzNG()) {
232 uint lenMort = 0, lenMorx = 0;
233 if (
getSfntTableData(
MAKE_TAG(
'm',
'o',
'r',
't'),
nullptr, &lenMort) ||
getSfntTableData(
MAKE_TAG(
'm',
'o',
'r',
'x'),
nullptr, &lenMorx))
255 while (
it.hasNext()) {
322 int totalKashidas = 0;
348 positions[current].x = gpos_x;
349 positions[current].y = gpos_y;
350 glyphs_out[current] = glyphs.
glyphs[
i];
360 g.glyphs = &kashidaGlyph;
361 g.advances = &kashidaWidth;
365 xpos -= kashidaWidth;
375 positions[current].x = gpos_x;
376 positions[current].y = gpos_y;
377 glyphs_out[current] = kashidaGlyph;
392 positions[current].x = xpos + glyphs.
offsets[
i].
x;
393 positions[current].y = ypos + glyphs.
offsets[
i].
y;
394 glyphs_out[current] = glyphs.
glyphs[
i];
409 glyphs_out[current] = glyphs.
glyphs[
i];
417 positions.
resize(current);
418 glyphs_out.
resize(current);
425 if (leftBearing !=
nullptr)
427 if (rightBearing !=
nullptr)
434 if (hhea.
size() >= 10) {
457 bool hasEmbeddedBitmaps =
461 if (!hasEmbeddedBitmaps) {
475 if (os2.
size() >= 78) {
483 enum { USE_TYPO_METRICS = 0x80 };
485 if (fsSelection & USE_TYPO_METRICS) {
487 if (typoAscent == 0 && typoDescent == 0)
494 if (winAscent == 0 && winDescent == 0)
535 return m_minLeftBearing;
538 #define q16Dot16ToFloat(i) ((i) / 65536.0)
540 #define kMinLeftSideBearingOffset 12
541 #define kMinRightSideBearingOffset 14
566 static const int largestValidBearing = 4 * unitsPerEm;
568 if (
qAbs(minLeftSideBearing) < largestValidBearing)
569 m_minLeftBearing = minLeftSideBearing * funitToPixelFactor;
570 if (
qAbs(minRightSideBearing) < largestValidBearing)
571 m_minRightBearing = minRightSideBearing * funitToPixelFactor;
580 static const ushort characterSubset[] = {
581 '(',
'C',
'F',
'K',
'V',
'X',
'Y',
']',
'_',
'f',
'r',
'|',
582 127, 205, 645, 884, 922, 1070, 12386
586 m_minLeftBearing = m_minRightBearing = std::numeric_limits<qreal>::max();
588 for (
uint i = 0;
i < (
sizeof(characterSubset) /
sizeof(
ushort)); ++
i) {
605 qWarning() <<
"Failed to compute left/right minimum bearings for"
609 return m_minRightBearing;
625 overall.
x = qMin(overall.
x,
x);
626 overall.
y = qMin(overall.
y,
y);
633 overall.
width = xmax - overall.
x;
640 QTextItem::RenderFlags
flags)
652 #define GRID(x, y) grid[(y)*(w+1) + (x)]
653 #define SET(x, y) (*(image_data + (y)*bpl + ((x) >> 3)) & (0x80 >> ((x) & 7)))
704 path->closeSubpath();
711 for (
int y = 0;
y <=
h; ++
y) {
712 for (
int x = 0;
x <=
w; ++
x) {
713 bool topLeft = (
x == 0 ||
y == 0) ?
false :
SET(
x - 1,
y - 1);
714 bool topRight = (
x ==
w ||
y == 0) ?
false :
SET(
x,
y - 1);
715 bool bottomLeft = (
x == 0 ||
y ==
h) ?
false :
SET(
x - 1,
y);
716 bool bottomRight = (
x ==
w ||
y ==
h) ?
false :
SET(
x,
y);
719 if ((!topRight) & bottomRight)
721 if ((!bottomRight) & bottomLeft)
723 if ((!bottomLeft) & topLeft)
725 if ((!topLeft) & topRight)
731 for (
int y = 0;
y <
h; ++
y) {
732 for (
int x = 0;
x <
w; ++
x) {
761 const int w = alphaMask.
width();
762 const int h = alphaMask.
height();
765 if (alphaMask.
depth() == 1) {
773 for (
int yi = 0; yi <
h; ++yi) {
775 uchar *
dst = bitmapData + yi*destBpl;
776 for (
int xi = 0; xi <
w; ++xi) {
777 const int byte = xi / 8;
778 const int bit = xi % 8;
782 dst[byte] |= 128 >> bit;
802 for (
int i = 0;
i < nGlyphs - 1; ++
i) {
803 g.glyphs[
i] = glyphs[
i];
804 g.advances[
i] = positions[
i + 1].
x - positions[
i].
x;
806 g.glyphs[nGlyphs - 1] = glyphs[nGlyphs - 1];
846 for (
int y=0;
y<alphaMask.
height(); ++
y) {
849 for (
int x=0;
x<alphaMask.
width(); ++
x) {
898 int glyph_width =
qCeil((gm.
x + gm.
width).toReal()) - glyph_x;
899 int glyph_height =
qCeil((gm.
y + gm.
height).toReal()) - glyph_y;
901 if (glyph_width <= 0 || glyph_height <= 0)
943 p.emSquare =
p.ascent;
946 p.capHeight =
p.ascent;
1002 if (
cache ==
e.cache.data())
1011 GlyphCacheEntry
entry;
1030 && qtransform_equals_no_translate(
cache->m_transform,
transform)) {
1046 if (pairs[middle].left_right == left_right)
1047 return pairs[middle].
adjust;
1049 if (pairs[middle].left_right < left_right)
1095 if (!qSafeFromBigEndian(
table + 2,
end, &numTables))
1100 for(
int i = 0;
i < numTables; ++
i) {
1112 if (!qSafeFromBigEndian(
header + 4,
end, &coverage))
1116 if (
version == 0 && coverage == 0x0001) {
1124 if (!qSafeFromBigEndian(
data,
end, &nPairs))
1127 if (nPairs * 6 + 8 >
length - 6) {
1134 for(
int i = 0;
i < nPairs; ++
i) {
1138 if (!qSafeFromBigEndian(
data + off,
end, &tmp))
1141 p.left_right =
uint(tmp) << 16;
1142 if (!qSafeFromBigEndian(
data + off + 2,
end, &tmp))
1145 p.left_right |= tmp;
1147 if (!qSafeFromBigEndian(
data + off + 4,
end, &tmp))
1150 p.adjust =
QFixed(
int(
short(tmp))) / scalingFactor;
1168 if (maxpTable.
size() < 6)
1195 if (!qSafeFromBigEndian(
header + 2, endPtr, &numTables))
1207 MicrosoftUnicodeExtended
1210 int symbolTable = -1;
1211 int tableToUse = -1;
1213 for (
int n = 0;
n < numTables; ++
n) {
1215 if (!qSafeFromBigEndian(maps + 8 *
n, endPtr, &platformId))
1218 quint16 platformSpecificId = 0;
1219 if (!qSafeFromBigEndian(maps + 8 *
n + 2, endPtr, &platformSpecificId))
1222 switch (platformId) {
1224 if (score < Unicode &&
1225 (platformSpecificId == 0 ||
1226 platformSpecificId == 2 ||
1227 platformSpecificId == 3)) {
1230 }
else if (score < Unicode11 && platformSpecificId == 1) {
1236 if (score < AppleRoman && platformSpecificId == 0) {
1242 switch (platformSpecificId) {
1251 if (score < MicrosoftUnicode) {
1253 score = MicrosoftUnicode;
1257 if (score < MicrosoftUnicodeExtended) {
1259 score = MicrosoftUnicodeExtended;
1273 *isSymbolFont = (symbolTable > -1);
1276 if (!qSafeFromBigEndian(maps + 8 * tableToUse + 4, endPtr, &unicode_table))
1292 if (!qSafeFromBigEndian(
header + 2, endPtr, &tmp))
1307 if (symbolTable > -1 && ((score == Unicode) || (score == Unicode11))) {
1308 const uchar *selectedTable =
table + unicode_table;
1311 bool unicodeTableHasLatin1 =
false;
1312 for (
int uc=0x00; uc<0x100; ++uc) {
1314 unicodeTableHasLatin1 =
true;
1320 bool unicodeTableHasSymbols =
false;
1321 if (!unicodeTableHasLatin1) {
1322 for (
int uc=0xf000; uc<0xf100; ++uc) {
1324 unicodeTableHasSymbols =
true;
1331 if (!unicodeTableHasLatin1 && unicodeTableHasSymbols) {
1332 tableToUse = symbolTable;
1338 return table + unicode_table;
1343 const uchar *
end = cmap + cmapSize;
1345 if (!qSafeFromBigEndian(cmap,
end, &
format))
1349 const uchar *ptr = cmap + 6 + unicode;
1350 if (unicode < 256 && ptr <
end)
1352 }
else if (
format == 4) {
1358 if (unicode >= 0xffff)
1362 if (!qSafeFromBigEndian(cmap + 6,
end, &segCountX2))
1365 const unsigned char *ends = cmap + 14;
1368 for (;
i < segCountX2/2; ++
i) {
1370 if (!qSafeFromBigEndian(ends + 2 *
i,
end, &codePoint))
1372 if (codePoint >= unicode)
1376 const unsigned char *
idx = ends + segCountX2 + 2 + 2*
i;
1379 if (!qSafeFromBigEndian(
idx,
end, &startIndex))
1381 if (startIndex > unicode)
1387 if (!qSafeFromBigEndian(
idx,
end, &tmp))
1394 if (!qSafeFromBigEndian(
idx,
end, &idRangeoffset_t))
1398 if (idRangeoffset_t) {
1400 if (!qSafeFromBigEndian(idRangeoffset_t + 2 * (unicode - startIndex) +
idx,
end, &
id))
1411 }
else if (
format == 6) {
1413 if (!qSafeFromBigEndian(cmap + 2,
end, &tableSize))
1417 if (!qSafeFromBigEndian(cmap + 6,
end, &firstCode6))
1419 if (unicode < firstCode6)
1423 if (!qSafeFromBigEndian(cmap + 8,
end, &entryCount6))
1425 if (entryCount6 * 2 + 10 > tableSize)
1428 quint16 sentinel6 = firstCode6 + entryCount6;
1429 if (unicode >= sentinel6)
1432 quint16 entryIndex6 = unicode - firstCode6;
1435 qSafeFromBigEndian(cmap + 10 + (entryIndex6 * 2),
end, &
index);
1437 }
else if (
format == 12) {
1439 if (!qSafeFromBigEndian(cmap + 12,
end, &nGroups))
1449 if (!qSafeFromBigEndian(cmap + 12 * middle,
end, &startCharCode))
1452 if (unicode < startCharCode)
1456 if (!qSafeFromBigEndian(cmap + 12 * middle + 4,
end, &endCharCode))
1459 if (unicode <= endCharCode) {
1461 if (!qSafeFromBigEndian(cmap + 12 * middle + 8,
end, &
index))
1464 return index + unicode - startCharCode;
1470 qDebug(
"cmap table of format %d not implemented",
format);
1514 QFontEngine::GlyphCacheEntry::GlyphCacheEntry()
1518 QFontEngine::GlyphCacheEntry::GlyphCacheEntry(
const GlyphCacheEntry &
o)
1523 QFontEngine::GlyphCacheEntry::~GlyphCacheEntry()
1527 QFontEngine::GlyphCacheEntry &QFontEngine::GlyphCacheEntry::operator=(
const GlyphCacheEntry &
o)
1564 if (*nglyphs <
len) {
1571 while (
it.hasNext()) {
1573 glyphs->
glyphs[ucs4Length++] = 1;
1576 *nglyphs = ucs4Length;
1601 QSize s(_size - 3, _size - 3);
1602 for (
int k = 0; k < positions.
size(); k++)
1603 path->addRect(
QRectF(positions[k].toPointF(),
s));
1621 QSize s(_size - 3, _size - 3);
1627 if (glyphs.
size() == 0)
1637 for (
int k = 0; k < positions.
size(); k++)
1690 for (
int i=2;
i <= _size-3; ++
i) {
1692 bits[
i + (_size - 3) *
image.bytesPerLine()] = 255;
1694 bits[_size - 3 +
i *
image.bytesPerLine()] = 255;
1704 {
return glyph >> 24; }
1708 {
return glyph & 0x00ffffff; }
1712 m_fallbackFamilies(fallbackFamilies),
1714 m_fallbackFamiliesQueried(!m_fallbackFamilies.isEmpty())
1718 if (m_fallbackFamilies.isEmpty()) {
1720 m_fallbackFamilies <<
QString();
1723 m_engines.
resize(m_fallbackFamilies.size() + 1);
1734 for (
int i = 0;
i < m_engines.
size(); ++
i) {
1736 if (fontEngine && !fontEngine->
ref.
deref())
1756 Q_ASSERT(!m_fallbackFamiliesQueried);
1758 m_fallbackFamilies = fallbackFamilies;
1759 if (m_fallbackFamilies.isEmpty()) {
1767 m_engines.
resize(m_fallbackFamilies.size() + 1);
1770 m_fallbackFamiliesQueried =
true;
1775 if (!m_fallbackFamiliesQueried &&
at > 0)
1778 if (!m_engines.
at(
at)) {
1817 if (!m_fallbackFamiliesQueried)
1819 for (
int x = 1,
n = qMin(m_engines.
size(), 256);
x <
n; ++
x) {
1845 QFontEngine::ShaperFlags
flags)
const
1853 int lastFallback = -1;
1854 while (
it.hasNext()) {
1855 const char32_t ucs4 =
it.peekNext();
1860 if (lastFallback >= 0 && (ucs4 == 0x200d || ucs4 == 0x200c)) {
1864 glyphs->
glyphs[glyph_pos] = glyph;
1871 glyphs->
glyphs[glyph_pos] |= (lastFallback << 24);
1879 if (glyphs->
glyphs[glyph_pos] == 0
1884 if (!m_fallbackFamiliesQueried)
1886 for (
int x = 1,
n = qMin(m_engines.
size(), 256);
x <
n; ++
x) {
1902 glyphs->
glyphs[glyph_pos] = glyph;
1911 glyphs->
glyphs[glyph_pos] |= (
x << 24);
1921 *nglyphs = glyph_pos;
1956 overall.
x = qMin(overall.
x, gm.
x);
1957 overall.
y = qMin(overall.
y, gm.
y);
1960 qMin(overall.
y, gm.
y);
1965 const int hi = which << 24;
1981 overall.
x = qMin(overall.
x, gm.
x);
1982 overall.
y = qMin(overall.
y, gm.
y);
1985 qMin(overall.
y, gm.
y);
1990 const int hi = which << 24;
2014 for (
int gl = 0; gl < glyphs.
numGlyphs; gl++)
2032 const int hi = which << 24;
2058 const int hi = which << 24;
2084 const int hi = which << 24;
2101 const int hi = which << 24;
2127 const int hi = which << 24;
2144 const int hi = which << 24;
2214 g.numGlyphs = nglyphs;
2215 g.glyphs = glyphs.
data();
2219 for (
int i = 0;
i < nglyphs;
i++) {
small capitals from c petite p scientific f u
small capitals from c petite p scientific i
[1]
xD9 x84 xD8 xAD xD9 x80 xF0 x90 xAC x9A xE0 xA7 xA6 xE0 xA7 xAA xF0 x91 x84 xA4 xF0 x91 x84 x89 xF0 x91 x84 x9B xF0 x90 x8A xAB xF0 x90 x8B x89 xE2 xB2 x9E xE2 xB2 x9F xD0 xBE xD0 x9E xF0 x90 x90 x84 xF0 x90 x90 xAC xE1 x83 x98 xE1 x83 x94 xE1 x83 x90 xE1 xB2 xBF xE2 xB0 x95 xE2 xB1 x85 xCE xBF xCE x9F xE0 xA8 xA0 xE0 xA8 xB0 xE0 xA9 xA6 Kayah xEA xA4 x8D xEA xA4 x80 Khmer xE1 xA7 xA1 xE1 xA7 xAA xE0 xBB x90 Latin Subscript xE2 x82 x92 xE2 x82 x80 xEA x93 xB3 xF0 x96 xB9 xA1 xF0 x96 xB9 x9B xF0 x96 xB9 xAF xE1 x80 x9D xE1 x80 x84 xE1 x80 x82 no script
The QByteArray class provides an array of bytes.
qsizetype size() const noexcept
const char * constData() const noexcept
bool isEmpty() const noexcept
static QByteArray number(int, int base=10)
QByteArray & replace(qsizetype index, qsizetype len, const char *s, qsizetype alen)
The QChar class provides a 16-bit Unicode character.
The QColor class provides colors based on RGB, HSV or CMYK values.
The QFlag class is a helper data type for QFlags.
static QFontCache * instance()
void updateHitCountAndTimeStamp(Engine &value)
void insertEngine(const Key &key, QFontEngine *engine, bool insertMulti=false)
static QFontEngine * findFont(const QFontDef &request, int script, bool preferScriptOverFamily=false)
void draw(QPaintEngine *p, qreal x, qreal y, const QTextItemInt &si)
virtual QImage alphaMapForGlyph(glyph_t) override
virtual qreal maxCharWidth() const override
virtual QFontEngine * cloneWithSize(qreal pixelSize) const override
virtual QFixed leading() const override
virtual bool canRender(const QChar *string, int len) const override
virtual glyph_t glyphIndex(uint ucs4) const override
virtual QFixed descent() const override
virtual bool stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, ShaperFlags flags) const override
virtual void recalcAdvances(QGlyphLayout *, ShaperFlags) const override
virtual glyph_metrics_t boundingBox(const QGlyphLayout &glyphs) override
virtual void addOutlineToPath(qreal x, qreal y, const QGlyphLayout &glyphs, QPainterPath *path, QTextItem::RenderFlags flags) override
virtual QFixed ascent() const override
virtual QFixed capHeight() const override
glyph_metrics_t tightBoundingBox(const QGlyphLayout &glyphs)
virtual bool supportsHorizontalSubPixelPositions() const
virtual QFixed capHeight() const =0
virtual QFixed descent() const
void setGlyphCache(const void *key, QFontEngineGlyphCache *data)
virtual int getPointInOutline(glyph_t glyph, int flags, quint32 point, QFixed *xpos, QFixed *ypos, quint32 *nPoints)
virtual Properties properties() const
void loadKerningPairs(QFixed scalingFactor)
QFixed calculatedCapHeight() const
static const uchar * getCMap(const uchar *table, uint tableSize, bool *isSymbolFont, int *cmapSize)
virtual int glyphCount() const
virtual QImage bitmapForGlyph(glyph_t, const QFixedPoint &subPixelPosition, const QTransform &t, const QColor &color=QColor())
virtual Qt::HANDLE handle() const
virtual qreal minRightBearing() const
static QByteArray convertToPostscriptFontFamilyName(const QByteArray &fontFamily)
virtual bool expectsGammaCorrectedBlending() const
virtual glyph_metrics_t boundingBox(const QGlyphLayout &glyphs)=0
int m_subPixelPositionCount
virtual qreal minLeftBearing() const
bool m_heightMetricsQueried
virtual void addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions, int nglyphs, QPainterPath *path, QTextItem::RenderFlags flags)
virtual FaceId faceId() const
virtual void getGlyphBearings(glyph_t glyph, qreal *leftBearing=nullptr, qreal *rightBearing=nullptr)
virtual Glyph * glyphData(glyph_t glyph, const QFixedPoint &subPixelPosition, GlyphFormat neededFormat, const QTransform &t)
bool supportsScript(QChar::Script script) const
virtual qreal maxCharWidth() const =0
virtual void getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_metrics_t *metrics)
void * harfbuzzFont() const
virtual QFixed ascent() const
bool canRender(uint ucs4) const
virtual QImage alphaMapForGlyph(glyph_t)
struct QFontEngine::FaceData faceData
virtual QImage alphaRGBMapForGlyph(glyph_t, const QFixedPoint &subPixelPosition, const QTransform &t)
QByteArray getSfntTable(uint tag) const
virtual QFixed averageCharWidth() const
virtual void removeGlyphFromCache(glyph_t)
virtual void initializeHeightMetrics() const
virtual void addOutlineToPath(qreal, qreal, const QGlyphLayout &, QPainterPath *, QTextItem::RenderFlags flags)
virtual bool supportsVerticalSubPixelPositions() const
static bool scriptRequiresOpenType(QChar::Script script)
bool processOS2Table() const
virtual void doKerning(QGlyphLayout *, ShaperFlags) const
bool processHheaTable() const
void getGlyphPositions(const QGlyphLayout &glyphs, const QTransform &matrix, QTextItem::RenderFlags flags, QVarLengthArray< glyph_t > &glyphs_out, QVarLengthArray< QFixedPoint > &positions)
void clearGlyphCache(const void *key)
virtual glyph_t glyphIndex(uint ucs4) const =0
virtual QFixed lineThickness() const
virtual QFixed underlinePosition() const
void addBitmapFontToPath(qreal x, qreal y, const QGlyphLayout &, QPainterPath *, QTextItem::RenderFlags)
virtual bool getSfntTableData(uint tag, uchar *buffer, uint *length) const
virtual bool supportsTransformation(const QTransform &transform) const
static quint32 getTrueTypeGlyphIndex(const uchar *cmap, int cmapSize, uint unicode)
QFixed lastRightBearing(const QGlyphLayout &glyphs)
virtual void recalcAdvances(QGlyphLayout *, ShaperFlags) const
QList< KernPair > kerning_pairs
QFontEngineGlyphCache * glyphCache(const void *key, GlyphFormat format, const QTransform &transform, const QColor &color=QColor()) const
virtual QFixed leading() const
void * harfbuzzFace() const
virtual bool hasUnreliableGlyphOutline() const
virtual QFixed xHeight() const
virtual QFixed emSquareSize() const
virtual QFixedPoint subPixelPositionFor(const QFixedPoint &position) const
void ensureEngineAt(int at)
virtual glyph_t glyphIndex(uint ucs4) const override
virtual bool shouldLoadFontEngineForCharacter(int at, uint ucs4) const
virtual bool stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, ShaperFlags flags) const override
virtual void recalcAdvances(QGlyphLayout *, ShaperFlags) const override
virtual QFixed ascent() const override
virtual QFixed capHeight() const override
QString fallbackFamilyAt(int at) const
virtual glyph_metrics_t boundingBox(const QGlyphLayout &glyphs) override
virtual QFixed descent() const override
virtual QFixed leading() const override
virtual QFixed lineThickness() const override
virtual bool canRender(const QChar *string, int len) const override
virtual qreal maxCharWidth() const override
virtual QFixed xHeight() const override
static QFontEngine * createMultiFontEngine(QFontEngine *fe, int script)
virtual void ensureFallbackFamiliesQueried()
virtual void addOutlineToPath(qreal, qreal, const QGlyphLayout &, QPainterPath *, QTextItem::RenderFlags flags) override
QFontEngine * engine(int at) const
virtual qreal minLeftBearing() const override
virtual void doKerning(QGlyphLayout *, ShaperFlags) const override
void setFallbackFamiliesList(const QStringList &fallbackFamilies)
virtual qreal minRightBearing() const override
virtual QFixed underlinePosition() const override
virtual void getGlyphBearings(glyph_t glyph, qreal *leftBearing=nullptr, qreal *rightBearing=nullptr) override
virtual QImage alphaMapForGlyph(glyph_t) override
QFontEngineMulti(QFontEngine *engine, int script, const QStringList &fallbackFamilies=QStringList())
virtual QFontEngine * loadEngine(int at)
virtual QFixed averageCharWidth() const override
static uchar highByte(glyph_t glyph)
virtual QImage alphaRGBMapForGlyph(glyph_t, const QFixedPoint &subPixelPosition, const QTransform &t) override
static QPlatformIntegration * platformIntegration()
static QGuiApplicationPrivate * instance()
The QHash class is a template class that provides a hash-table-based dictionary.
bool remove(const Key &key)
const_iterator constFind(const Key &key) const noexcept
const_iterator cend() const noexcept
The QImage class provides a hardware-independent image representation that allows direct access to th...
qsizetype bytesPerLine() const
@ Format_ARGB32_Premultiplied
const uchar * constScanLine(int) const
qsizetype size() const noexcept
bool removeOne(const AT &t)
const_reference at(qsizetype i) const noexcept
void resize(qsizetype size)
void append(parameter_type t)
iterator find(const Key &key)
The QPaintEngine class provides an abstract definition of how QPainter draws to a given device on a g...
The QPainter class performs low-level painting on widgets and other paint devices.
void drawRect(const QRectF &rect)
void setPen(const QColor &color)
void setBrush(const QBrush &brush)
The QPainterPath class provides a container for painting operations, enabling graphical shapes to be ...
The QPen class defines how a QPainter should draw lines and outlines of shapes.
void setWidthF(qreal width)
The QPointF class defines a point in the plane using floating point precision.
constexpr qreal x() const noexcept
constexpr qreal y() const noexcept
The QRectF class defines a finite rectangle in the plane using floating point precision.
The QSize class defines the size of a two-dimensional object using integer point precision.
The QString class provides a Unicode character string.
The QStringList class provides a list of strings.
QTestFontEngine(int size)
constexpr size_type size() const noexcept
void resize(qsizetype sz)
QCache< int, Employee > cache
[0]
HB_EXTERN hb_tag_t const hb_tag_t * script_tags
hb_bool_t hb_ot_layout_table_select_script(hb_face_t *face, hb_tag_t table_tag, unsigned int script_count, const hb_tag_t *script_tags, unsigned int *script_index, hb_tag_t *chosen_script)
QHighDpiScaling::Point position(T, QHighDpiScaling::Point::Kind)
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp *numpix else pixst endif endm macro vuzp8 reg2 vuzp d d ®2 endm macro vzip8 reg2 vzip d d ®2 endm macro pixdeinterleave basereg basereg basereg basereg basereg endif endm macro pixinterleave basereg basereg basereg basereg basereg endif endm macro PF boost_increment endif if endif PF tst PF addne PF subne PF cmp ORIG_W if endif if endif if endif PF subge ORIG_W PF subges if endif if endif if endif endif endm macro cache_preload_simple endif if dst_r_bpp pld[DST_R, #(PREFETCH_DISTANCE_SIMPLE *dst_r_bpp/8)] endif if mask_bpp pld if[MASK, #(PREFETCH_DISTANCE_SIMPLE *mask_bpp/8)] endif endif endm macro ensure_destination_ptr_alignment process_pixblock_tail_head if beq irp skip1(dst_w_bpp<=(lowbit *8)) &&((lowbit *8)<(pixblock_size *dst_w_bpp)) .if lowbit< 16 tst DST_R
[3]
QList< QString > QStringList
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
int qRound(qfloat16 d) noexcept
QStringList qt_fallbacksForFamily(const QString &family, QFont::Style style, QFont::StyleHint styleHint, QChar::Script script)
Q_GUI_EXPORT void qt_addBitmapToPath(qreal x0, qreal y0, const uchar *image_data, int bpl, int w, int h, QPainterPath *path)
#define kBearingNotInitialized
#define kMinLeftSideBearingOffset
#define q16Dot16ToFloat(i)
#define kMinRightSideBearingOffset
#define MAKE_TAG(ch1, ch2, ch3, ch4)
QT_BEGIN_INCLUDE_NAMESPACE typedef unsigned char uchar
#define Q_AUTOTEST_EXPORT
QT_END_INCLUDE_NAMESPACE typedef double qreal
#define Q_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ARGS)
hb_face_t * hb_qt_face_get_for_engine(QFontEngine *fe)
hb_font_t * hb_qt_font_get_for_engine(QFontEngine *fe)
hb_script_t hb_qt_script_to_script(QChar::Script script)
GLenum GLuint GLenum GLsizei length
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLint GLint GLint GLint GLint x
[0]
GLfloat GLfloat GLfloat w
[0]
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum GLenum GLsizei count
GLsizei GLenum const void GLuint GLsizei GLfloat * metrics
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLintptr offset
GLint GLsizei GLsizei GLenum format
GLuint GLfloat GLfloat y0
GLfloat GLfloat GLfloat GLfloat h
GLsizei GLsizei GLchar * source
GLuint GLenum GLenum transform
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
GLsizei GLfixed GLfixed GLfixed GLfixed const GLubyte * bitmap
GLsizei const GLchar *const * path
GLenum GLenum GLsizei void * table
constexpr QRgb qRgb(int r, int g, int b)
constexpr int qAlpha(QRgb rgb)
#define HB_LANGUAGE_INVALID
HB_EXTERN hb_font_get_glyph_func_t void * user_data
HB_EXTERN void hb_ot_tags_from_script_and_language(hb_script_t script, hb_language_t language, unsigned int *script_count, hb_tag_t *script_tags, unsigned int *language_count, hb_tag_t *language_tags)
#define HB_OT_MAX_TAGS_PER_SCRIPT
QHttpRequestHeader header("GET", QUrl::toPercentEncoding("/index.html"))
[1]
QNetworkRequest request(url)
constexpr static QFixed fromReal(qreal r)
constexpr int toInt() const
constexpr QFixed ceil() const
constexpr qreal toReal() const
constexpr static QFixed fromFixed(int fixed)
qt_get_font_table_func_t get_font_table
QGlyphJustification * justifications
QFixed effectiveAdvance(int item) const
QGlyphAttributes * attributes
QGlyphLayout mid(int position, int n=-1) const
QFixed rightBearing() const
QFixed leftBearing() const
QThreadStorage< QCache< QString, SomeClass > > caches
[7]
FT_UInt FT_UInt FT_Vector * kerning
XmlOutput::xml_output tag(const QString &name)