262QImage QRawFont::alphaMapForGlyph(quint32 glyphIndex, AntialiasingType antialiasingType,
263 const QTransform &transform)
const
268 if (d->fontEngine->glyphFormat == QFontEngine::Format_ARGB)
269 return d->fontEngine->bitmapForGlyph(glyphIndex, QFixedPoint(), transform);
271 if (antialiasingType == SubPixelAntialiasing)
272 return d->fontEngine->alphaRGBMapForGlyph(glyphIndex, QFixedPoint(), transform);
274 return d->fontEngine->alphaMapForGlyph(glyphIndex, QFixedPoint(), transform);
508QList<quint32> QRawFont::glyphIndexesForString(
const QString &text)
const
510 QList<quint32> glyphIndexes;
511 if (!d->isValid() || text.isEmpty())
514 int numGlyphs = text.size();
515 glyphIndexes.resize(numGlyphs);
518 glyphs.numGlyphs = numGlyphs;
519 glyphs.glyphs = glyphIndexes.data();
520 if (d->fontEngine->stringToCMap(text.data(), text.size(), &glyphs, &numGlyphs, QFontEngine::GlyphIndicesOnly) < 0)
523 glyphIndexes.resize(numGlyphs);
537bool QRawFont::glyphIndexesForChars(
const QChar *chars,
int numChars, quint32 *glyphIndexes,
int *numGlyphs)
const
540 if (!d->isValid() || numChars <= 0) {
545 if (*numGlyphs <= 0 || !glyphIndexes) {
546 *numGlyphs = numChars;
551 glyphs.numGlyphs = *numGlyphs;
552 glyphs.glyphs = glyphIndexes;
553 return d->fontEngine->stringToCMap(chars, numChars, &glyphs, numGlyphs, QFontEngine::GlyphIndicesOnly) >= 0;
572QList<QPointF> QRawFont::advancesForGlyphIndexes(
const QList<quint32> &glyphIndexes, QRawFont::LayoutFlags layoutFlags)
const
575 if (advancesForGlyphIndexes(glyphIndexes.constData(), advances.data(),
int(glyphIndexes.size()), layoutFlags))
609bool QRawFont::advancesForGlyphIndexes(
const quint32 *glyphIndexes, QPointF *advances,
int numGlyphs, LayoutFlags layoutFlags)
const
611 if (!d->isValid() || numGlyphs <= 0)
613 Q_ASSERT(glyphIndexes && advances);
615 QVarLengthArray<QFixed> tmpAdvances(numGlyphs);
618 glyphs.glyphs =
const_cast<glyph_t *>(glyphIndexes);
619 glyphs.numGlyphs = numGlyphs;
620 glyphs.advances = tmpAdvances.data();
622 bool design = layoutFlags & UseDesignMetrics;
624 d->fontEngine->recalcAdvances(&glyphs, design ? QFontEngine::DesignMetrics : QFontEngine::ShaperFlag(0));
625 if (layoutFlags & KernedAdvances)
626 d->fontEngine->doKerning(&glyphs, design ? QFontEngine::DesignMetrics : QFontEngine::ShaperFlag(0));
628 for (
int i=0; i<numGlyphs; ++i)
629 advances[i] = QPointF(tmpAdvances[i].toReal(), 0.0);
645bool QRawFont::advancesForGlyphIndexes(
const quint32 *glyphIndexes, QPointF *advances,
int numGlyphs)
const
647 return QRawFont::advancesForGlyphIndexes(glyphIndexes, advances, numGlyphs, SeparateAdvances);
701QList<QFontDatabase::WritingSystem> QRawFont::supportedWritingSystems()
const
703 QList<QFontDatabase::WritingSystem> writingSystems;
705 QByteArray os2Table = fontTable(
"OS/2");
706 if (os2Table.size() > 86) {
707 const uchar *
const data =
reinterpret_cast<
const uchar *>(os2Table.constData());
708 const uchar *
const bigEndianUnicodeRanges = data + 42;
709 const uchar *
const bigEndianCodepageRanges = data + 78;
711 quint32 unicodeRanges[4];
712 quint32 codepageRanges[2];
714 for (size_t i = 0; i <
sizeof unicodeRanges /
sizeof *unicodeRanges; ++i)
715 unicodeRanges[i] = qFromBigEndian<quint32>(bigEndianUnicodeRanges + i *
sizeof(quint32));
717 for (size_t i = 0; i <
sizeof codepageRanges /
sizeof *codepageRanges; ++i)
718 codepageRanges[i] = qFromBigEndian<quint32>(bigEndianCodepageRanges + i *
sizeof(quint32));
720 QSupportedWritingSystems ws = QPlatformFontDatabase::writingSystemsFromTrueTypeBits(unicodeRanges, codepageRanges);
721 for (
int i = 0; i < QFontDatabase::WritingSystemsCount; ++i) {
722 if (ws.supported(QFontDatabase::WritingSystem(i)))
723 writingSystems.append(QFontDatabase::WritingSystem(i));
728 return writingSystems;
763QRawFont QRawFont::fromFont(
const QFont &font, QFontDatabase::WritingSystem writingSystem)
766 const QFontPrivate *font_d = QFontPrivate::get(font);
767 int script = qt_script_for_writing_system(writingSystem);
768 QFontEngine *fe = font_d->engineForScript(script);
770 if (fe !=
nullptr && fe->type() == QFontEngine::Multi) {
771 QFontEngineMulti *multiEngine =
static_cast<QFontEngineMulti *>(fe);
772 fe = multiEngine->engine(0);
774 if (script > QChar::Script_Latin) {
776 QFontDef request(multiEngine->fontDef);
777 request.styleStrategy |= QFont::NoFontMerging;
779 if (QFontEngine *engine = QFontDatabasePrivate::findFont(request, script,
true)) {
780 if (request.weight > QFont::Normal)
781 engine->fontDef.weight = request.weight;
782 if (request.style > QFont::StyleNormal)
783 engine->fontDef.style = request.style;
791 rawFont.d.data()->setFontEngine(fe);
792 rawFont.d.data()->hintingPreference = font.hintingPreference();
812void QRawFontPrivate::loadFromData(
const QByteArray &fontData, qreal pixelSize,
813 QFont::HintingPreference hintingPreference)
815 Q_ASSERT(fontEngine ==
nullptr);
817 QPlatformFontDatabase *pfdb = QGuiApplicationPrivate::platformIntegration()->fontDatabase();
818 setFontEngine(pfdb->fontEngine(fontData, pixelSize, hintingPreference));
826QRectF QRawFont::boundingRect(quint32 glyphIndex)
const
831 glyph_metrics_t gm = d->fontEngine->boundingBox(glyphIndex);
832 return QRectF(gm.x.toReal(), gm.y.toReal(), gm.width.toReal(), gm.height.toReal());