Add some QRawFont related low level functions to avoid extra copying
Added functions: - QRawFont::glyphIndexesForChars(const QChar *chars, int numChars, quint32 *glyphIndexes, int *numGlyphs) const - QRawFont::advancesForGlyphIndexes(const quint32 *glyphIndexes, QPointF *advances, int numGlyphs) const Reviewed-by: Eskil (cherry picked from commit 965af9eb2932efae5d736df54c3859460017b6a5)
This commit is contained in:
parent
df4d7f1811
commit
3032ba0f8e
@ -428,7 +428,7 @@ int QRawFont::weight() const
|
||||
of the text. To get the correctly shaped text, you can use QTextLayout to lay out and shape the
|
||||
text, and then call QTextLayout::glyphRuns() to get the set of glyph index list and QRawFont pairs.
|
||||
|
||||
\sa advancesForGlyphIndexes(), QGlyphRun, QTextLayout::glyphRuns(), QTextFragment::glyphRuns()
|
||||
\sa advancesForGlyphIndexes(), glyphIndexesForChars(), QGlyphRun, QTextLayout::glyphRuns(), QTextFragment::glyphRuns()
|
||||
*/
|
||||
QVector<quint32> QRawFont::glyphIndexesForString(const QString &text) const
|
||||
{
|
||||
@ -437,11 +437,9 @@ QVector<quint32> QRawFont::glyphIndexesForString(const QString &text) const
|
||||
|
||||
int nglyphs = text.size();
|
||||
QVarLengthGlyphLayoutArray glyphs(nglyphs);
|
||||
if (!d->fontEngine->stringToCMap(text.data(), text.size(), &glyphs, &nglyphs,
|
||||
QTextEngine::GlyphIndicesOnly)) {
|
||||
if (!glyphIndexesForChars(text.data(), text.size(), glyphs.glyphs, &nglyphs)) {
|
||||
glyphs.resize(nglyphs);
|
||||
if (!d->fontEngine->stringToCMap(text.data(), text.size(), &glyphs, &nglyphs,
|
||||
QTextEngine::GlyphIndicesOnly)) {
|
||||
if (!glyphIndexesForChars(text.data(), text.size(), glyphs.glyphs, &nglyphs)) {
|
||||
Q_ASSERT_X(false, Q_FUNC_INFO, "stringToCMap shouldn't fail twice");
|
||||
return QVector<quint32>();
|
||||
}
|
||||
@ -454,6 +452,26 @@ QVector<quint32> QRawFont::glyphIndexesForString(const QString &text) const
|
||||
return glyphIndexes;
|
||||
}
|
||||
|
||||
/*!
|
||||
Converts a string of unicode points to glyph indexes using the CMAP table in the
|
||||
underlying font. The function works like glyphIndexesForString() except it take
|
||||
an array (\a chars), the results will be returned though \a glyphIndexes array
|
||||
and number of glyphs will be set in \a numGlyphs. The size of \a glyphIndexes array
|
||||
must be at least \a numChars, if that's still not enough, this function will return
|
||||
false, then you can resize \a glyphIndexes from the size returned in \a numGlyphs.
|
||||
|
||||
\sa glyphIndexesForString(), advancesForGlyphIndexes(), QGlyphs, QTextLayout::glyphs(), QTextFragment::glyphs()
|
||||
*/
|
||||
bool QRawFont::glyphIndexesForChars(const QChar *chars, int numChars, quint32 *glyphIndexes, int *numGlyphs) const
|
||||
{
|
||||
if (!isValid())
|
||||
return false;
|
||||
|
||||
QGlyphLayout glyphs;
|
||||
glyphs.glyphs = glyphIndexes;
|
||||
return d->fontEngine->stringToCMap(chars, numChars, &glyphs, numGlyphs, QTextEngine::GlyphIndicesOnly);
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the QRawFont's advances for each of the \a glyphIndexes in pixel units. The advances
|
||||
give the distance from the position of a given glyph to where the next glyph should be drawn
|
||||
@ -479,6 +497,36 @@ QVector<QPointF> QRawFont::advancesForGlyphIndexes(const QVector<quint32> &glyph
|
||||
return advances;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the QRawFont's advances for each of the \a glyphIndexes in pixel units. The advances
|
||||
give the distance from the position of a given glyph to where the next glyph should be drawn
|
||||
to make it appear as if the two glyphs are unspaced. The glyph indexes are given with the
|
||||
array \a glyphIndexes while the results are returned through \a advances, both of them must
|
||||
have \a numGlyphs elements.
|
||||
|
||||
\sa QTextLine::horizontalAdvance(), QFontMetricsF::width()
|
||||
*/
|
||||
bool QRawFont::advancesForGlyphIndexes(const quint32 *glyphIndexes, QPointF *advances, int numGlyphs) const
|
||||
{
|
||||
if (!isValid())
|
||||
return false;
|
||||
|
||||
QGlyphLayout glyphs;
|
||||
glyphs.glyphs = const_cast<HB_Glyph *>(glyphIndexes);
|
||||
glyphs.numGlyphs = numGlyphs;
|
||||
QVarLengthArray<QFixed> advances_x(numGlyphs);
|
||||
QVarLengthArray<QFixed> advances_y(numGlyphs);
|
||||
glyphs.advances_x = advances_x.data();
|
||||
glyphs.advances_y = advances_y.data();
|
||||
|
||||
d->fontEngine->recalcAdvances(&glyphs, 0);
|
||||
|
||||
for (int i=0; i<numGlyphs; ++i)
|
||||
advances[i] = QPointF(glyphs.advances_x[i].toReal(), glyphs.advances_y[i].toReal());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the hinting preference used to construct this QRawFont.
|
||||
|
||||
|
@ -90,6 +90,8 @@ public:
|
||||
|
||||
QVector<quint32> glyphIndexesForString(const QString &text) const;
|
||||
QVector<QPointF> advancesForGlyphIndexes(const QVector<quint32> &glyphIndexes) const;
|
||||
bool glyphIndexesForChars(const QChar *chars, int numChars, quint32 *glyphIndexes, int *numGlyphs) const;
|
||||
bool advancesForGlyphIndexes(const quint32 *glyphIndexes, QPointF *advances, int numGlyphs) const;
|
||||
|
||||
QImage alphaMapForGlyph(quint32 glyphIndex,
|
||||
AntialiasingType antialiasingType = SubPixelAntialiasing,
|
||||
|
Loading…
Reference in New Issue
Block a user