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;
602bool QRawFont::advancesForGlyphIndexes(
const quint32 *glyphIndexes, QPointF *advances,
int numGlyphs, LayoutFlags layoutFlags)
const
604 if (!d->isValid() || numGlyphs <= 0)
606 Q_ASSERT(glyphIndexes && advances);
608 QVarLengthArray<QFixed> tmpAdvances(numGlyphs);
611 glyphs.glyphs =
const_cast<glyph_t *>(glyphIndexes);
612 glyphs.numGlyphs = numGlyphs;
613 glyphs.advances = tmpAdvances.data();
615 bool design = layoutFlags & UseDesignMetrics;
617 d->fontEngine->recalcAdvances(&glyphs, design ? QFontEngine::DesignMetrics : QFontEngine::ShaperFlag(0));
618 if (layoutFlags & KernedAdvances)
619 d->fontEngine->doKerning(&glyphs, design ? QFontEngine::DesignMetrics : QFontEngine::ShaperFlag(0));
621 for (
int i=0; i<numGlyphs; ++i)
622 advances[i] = QPointF(tmpAdvances[i].toReal(), 0.0);
638bool QRawFont::advancesForGlyphIndexes(
const quint32 *glyphIndexes, QPointF *advances,
int numGlyphs)
const
640 return QRawFont::advancesForGlyphIndexes(glyphIndexes, advances, numGlyphs, SeparateAdvances);
694QList<QFontDatabase::WritingSystem> QRawFont::supportedWritingSystems()
const
696 QList<QFontDatabase::WritingSystem> writingSystems;
698 QByteArray os2Table = fontTable(
"OS/2");
699 if (os2Table.size() > 86) {
700 const uchar *
const data =
reinterpret_cast<
const uchar *>(os2Table.constData());
701 const uchar *
const bigEndianUnicodeRanges = data + 42;
702 const uchar *
const bigEndianCodepageRanges = data + 78;
704 quint32 unicodeRanges[4];
705 quint32 codepageRanges[2];
707 for (size_t i = 0; i <
sizeof unicodeRanges /
sizeof *unicodeRanges; ++i)
708 unicodeRanges[i] = qFromBigEndian<quint32>(bigEndianUnicodeRanges + i *
sizeof(quint32));
710 for (size_t i = 0; i <
sizeof codepageRanges /
sizeof *codepageRanges; ++i)
711 codepageRanges[i] = qFromBigEndian<quint32>(bigEndianCodepageRanges + i *
sizeof(quint32));
713 QSupportedWritingSystems ws = QPlatformFontDatabase::writingSystemsFromTrueTypeBits(unicodeRanges, codepageRanges);
714 for (
int i = 0; i < QFontDatabase::WritingSystemsCount; ++i) {
715 if (ws.supported(QFontDatabase::WritingSystem(i)))
716 writingSystems.append(QFontDatabase::WritingSystem(i));
721 return writingSystems;
756QRawFont QRawFont::fromFont(
const QFont &font, QFontDatabase::WritingSystem writingSystem)
759 const QFontPrivate *font_d = QFontPrivate::get(font);
760 int script = qt_script_for_writing_system(writingSystem);
761 QFontEngine *fe = font_d->engineForScript(script);
763 if (fe !=
nullptr && fe->type() == QFontEngine::Multi) {
764 QFontEngineMulti *multiEngine =
static_cast<QFontEngineMulti *>(fe);
765 fe = multiEngine->engine(0);
767 if (script > QChar::Script_Latin) {
769 QFontDef request(multiEngine->fontDef);
770 request.styleStrategy |= QFont::NoFontMerging;
772 if (QFontEngine *engine = QFontDatabasePrivate::findFont(request, script,
true)) {
773 if (request.weight > QFont::Normal)
774 engine->fontDef.weight = request.weight;
775 if (request.style > QFont::StyleNormal)
776 engine->fontDef.style = request.style;
784 rawFont.d.data()->setFontEngine(fe);
785 rawFont.d.data()->hintingPreference = font.hintingPreference();
805void QRawFontPrivate::loadFromData(
const QByteArray &fontData, qreal pixelSize,
806 QFont::HintingPreference hintingPreference)
808 Q_ASSERT(fontEngine ==
nullptr);
810 QPlatformFontDatabase *pfdb = QGuiApplicationPrivate::platformIntegration()->fontDatabase();
811 setFontEngine(pfdb->fontEngine(fontData, pixelSize, hintingPreference));
819QRectF QRawFont::boundingRect(quint32 glyphIndex)
const
824 glyph_metrics_t gm = d->fontEngine->boundingBox(glyphIndex);
825 return QRectF(gm.x.toReal(), gm.y.toReal(), gm.width.toReal(), gm.height.toReal());