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:
Jiang Jiang 2011-05-10 13:30:33 +02:00
parent df4d7f1811
commit 3032ba0f8e
2 changed files with 55 additions and 5 deletions

View File

@ -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.

View File

@ -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,