micro optimizations
use an inlined version of isValid() everywhere; don't detach where is non required; get rid of extra checks where possible Change-Id: I6815c1f7d7c03677d9c57dda2731ed2868ea92aa Merge-request: 1343 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com> Reviewed-on: http://codereview.qt.nokia.com/4144
This commit is contained in:
parent
f63993272f
commit
10354d71ae
@ -46,7 +46,6 @@
|
||||
#include "qrawfont.h"
|
||||
#include "qrawfont_p.h"
|
||||
|
||||
#include <QtCore/qthread.h>
|
||||
#include <QtCore/qendian.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
@ -190,8 +189,7 @@ QRawFont &QRawFont::operator=(const QRawFont &other)
|
||||
*/
|
||||
bool QRawFont::isValid() const
|
||||
{
|
||||
Q_ASSERT(d->thread == 0 || d->thread == QThread::currentThread());
|
||||
return d->fontEngine != 0;
|
||||
return d->isValid();
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -225,7 +223,7 @@ void QRawFont::loadFromData(const QByteArray &fontData,
|
||||
qreal pixelSize,
|
||||
QFont::HintingPreference hintingPreference)
|
||||
{
|
||||
detach();
|
||||
d.detach();
|
||||
d->cleanUp();
|
||||
d->hintingPreference = hintingPreference;
|
||||
d->thread = QThread::currentThread();
|
||||
@ -247,12 +245,12 @@ void QRawFont::loadFromData(const QByteArray &fontData,
|
||||
QImage QRawFont::alphaMapForGlyph(quint32 glyphIndex, AntialiasingType antialiasingType,
|
||||
const QTransform &transform) const
|
||||
{
|
||||
if (!isValid())
|
||||
if (!d->isValid())
|
||||
return QImage();
|
||||
|
||||
if (antialiasingType == SubPixelAntialiasing)
|
||||
return d->fontEngine->alphaRGBMapForGlyph(glyphIndex, QFixed(), 0, transform);
|
||||
else
|
||||
|
||||
return d->fontEngine->alphaMapForGlyph(glyphIndex, QFixed(), transform);
|
||||
}
|
||||
|
||||
@ -266,7 +264,7 @@ QImage QRawFont::alphaMapForGlyph(quint32 glyphIndex, AntialiasingType antialias
|
||||
*/
|
||||
QPainterPath QRawFont::pathForGlyph(quint32 glyphIndex) const
|
||||
{
|
||||
if (!isValid())
|
||||
if (!d->isValid())
|
||||
return QPainterPath();
|
||||
|
||||
QFixedPoint position;
|
||||
@ -296,10 +294,7 @@ bool QRawFont::operator==(const QRawFont &other) const
|
||||
*/
|
||||
qreal QRawFont::ascent() const
|
||||
{
|
||||
if (!isValid())
|
||||
return 0.0;
|
||||
|
||||
return d->fontEngine->ascent().toReal();
|
||||
return d->isValid() ? d->fontEngine->ascent().toReal() : 0.0;
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -309,10 +304,7 @@ qreal QRawFont::ascent() const
|
||||
*/
|
||||
qreal QRawFont::descent() const
|
||||
{
|
||||
if (!isValid())
|
||||
return 0.0;
|
||||
|
||||
return d->fontEngine->descent().toReal();
|
||||
return d->isValid() ? d->fontEngine->descent().toReal() : 0.0;
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -322,10 +314,7 @@ qreal QRawFont::descent() const
|
||||
*/
|
||||
qreal QRawFont::xHeight() const
|
||||
{
|
||||
if (!isValid())
|
||||
return 0.0;
|
||||
|
||||
return d->fontEngine->xHeight().toReal();
|
||||
return d->isValid() ? d->fontEngine->xHeight().toReal() : 0.0;
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -335,10 +324,7 @@ qreal QRawFont::xHeight() const
|
||||
*/
|
||||
qreal QRawFont::leading() const
|
||||
{
|
||||
if (!isValid())
|
||||
return 0.0;
|
||||
|
||||
return d->fontEngine->leading().toReal();
|
||||
return d->isValid() ? d->fontEngine->leading().toReal() : 0.0;
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -348,10 +334,7 @@ qreal QRawFont::leading() const
|
||||
*/
|
||||
qreal QRawFont::averageCharWidth() const
|
||||
{
|
||||
if (!isValid())
|
||||
return 0.0;
|
||||
|
||||
return d->fontEngine->averageCharWidth().toReal();
|
||||
return d->isValid() ? d->fontEngine->averageCharWidth().toReal() : 0.0;
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -361,10 +344,7 @@ qreal QRawFont::averageCharWidth() const
|
||||
*/
|
||||
qreal QRawFont::maxCharWidth() const
|
||||
{
|
||||
if (!isValid())
|
||||
return 0.0;
|
||||
|
||||
return d->fontEngine->maxCharWidth();
|
||||
return d->isValid() ? d->fontEngine->maxCharWidth() : 0.0;
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -376,10 +356,7 @@ qreal QRawFont::maxCharWidth() const
|
||||
*/
|
||||
qreal QRawFont::pixelSize() const
|
||||
{
|
||||
if (!isValid())
|
||||
return 0.0;
|
||||
|
||||
return d->fontEngine->fontDef.pixelSize;
|
||||
return d->isValid() ? d->fontEngine->fontDef.pixelSize : 0.0;
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -392,10 +369,7 @@ qreal QRawFont::pixelSize() const
|
||||
*/
|
||||
qreal QRawFont::unitsPerEm() const
|
||||
{
|
||||
if (!isValid())
|
||||
return 0.0;
|
||||
|
||||
return d->fontEngine->emSquareSize().toReal();
|
||||
return d->isValid() ? d->fontEngine->emSquareSize().toReal() : 0.0;
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -427,10 +401,7 @@ qreal QRawFont::underlinePosition() const
|
||||
*/
|
||||
QString QRawFont::familyName() const
|
||||
{
|
||||
if (!isValid())
|
||||
return QString();
|
||||
|
||||
return d->fontEngine->fontDef.family;
|
||||
return d->isValid() ? d->fontEngine->fontDef.family : QString();
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -440,10 +411,7 @@ QString QRawFont::familyName() const
|
||||
*/
|
||||
QString QRawFont::styleName() const
|
||||
{
|
||||
if (!isValid())
|
||||
return QString();
|
||||
|
||||
return d->fontEngine->fontDef.styleName;
|
||||
return d->isValid() ? d->fontEngine->fontDef.styleName : QString();
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -453,10 +421,7 @@ QString QRawFont::styleName() const
|
||||
*/
|
||||
QFont::Style QRawFont::style() const
|
||||
{
|
||||
if (!isValid())
|
||||
return QFont::StyleNormal;
|
||||
|
||||
return QFont::Style(d->fontEngine->fontDef.style);
|
||||
return d->isValid() ? QFont::Style(d->fontEngine->fontDef.style) : QFont::StyleNormal;
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -466,10 +431,7 @@ QFont::Style QRawFont::style() const
|
||||
*/
|
||||
int QRawFont::weight() const
|
||||
{
|
||||
if (!isValid())
|
||||
return -1;
|
||||
|
||||
return int(d->fontEngine->fontDef.weight);
|
||||
return d->isValid() ? int(d->fontEngine->fontDef.weight) : -1;
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -487,7 +449,7 @@ int QRawFont::weight() const
|
||||
*/
|
||||
QVector<quint32> QRawFont::glyphIndexesForString(const QString &text) const
|
||||
{
|
||||
if (!isValid())
|
||||
if (!d->isValid())
|
||||
return QVector<quint32>();
|
||||
|
||||
int nglyphs = text.size();
|
||||
@ -519,7 +481,7 @@ QVector<quint32> QRawFont::glyphIndexesForString(const QString &text) const
|
||||
*/
|
||||
bool QRawFont::glyphIndexesForChars(const QChar *chars, int numChars, quint32 *glyphIndexes, int *numGlyphs) const
|
||||
{
|
||||
if (!isValid())
|
||||
if (!d->isValid())
|
||||
return false;
|
||||
|
||||
QGlyphLayout glyphs;
|
||||
@ -536,7 +498,7 @@ bool QRawFont::glyphIndexesForChars(const QChar *chars, int numChars, quint32 *g
|
||||
*/
|
||||
QVector<QPointF> QRawFont::advancesForGlyphIndexes(const QVector<quint32> &glyphIndexes) const
|
||||
{
|
||||
if (!isValid())
|
||||
if (!d->isValid())
|
||||
return QVector<QPointF>();
|
||||
|
||||
int numGlyphs = glyphIndexes.size();
|
||||
@ -563,7 +525,7 @@ QVector<QPointF> QRawFont::advancesForGlyphIndexes(const QVector<quint32> &glyph
|
||||
*/
|
||||
bool QRawFont::advancesForGlyphIndexes(const quint32 *glyphIndexes, QPointF *advances, int numGlyphs) const
|
||||
{
|
||||
if (!isValid())
|
||||
if (!d->isValid())
|
||||
return false;
|
||||
|
||||
QGlyphLayout glyphs;
|
||||
@ -589,10 +551,7 @@ bool QRawFont::advancesForGlyphIndexes(const quint32 *glyphIndexes, QPointF *adv
|
||||
*/
|
||||
QFont::HintingPreference QRawFont::hintingPreference() const
|
||||
{
|
||||
if (!isValid())
|
||||
return QFont::PreferDefaultHinting;
|
||||
|
||||
return d->hintingPreference;
|
||||
return d->isValid() ? d->hintingPreference : QFont::PreferDefaultHinting;
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -603,7 +562,7 @@ QFont::HintingPreference QRawFont::hintingPreference() const
|
||||
*/
|
||||
QByteArray QRawFont::fontTable(const char *tagName) const
|
||||
{
|
||||
if (!isValid())
|
||||
if (!d->isValid())
|
||||
return QByteArray();
|
||||
|
||||
const quint32 *tagId = reinterpret_cast<const quint32 *>(tagName);
|
||||
@ -626,9 +585,9 @@ extern QList<QFontDatabase::WritingSystem> qt_determine_writing_systems_from_tru
|
||||
*/
|
||||
QList<QFontDatabase::WritingSystem> QRawFont::supportedWritingSystems() const
|
||||
{
|
||||
if (isValid()) {
|
||||
if (d->isValid()) {
|
||||
QByteArray os2Table = fontTable("OS/2");
|
||||
if (!os2Table.isEmpty() && os2Table.size() > 86) {
|
||||
if (os2Table.size() > 86) {
|
||||
char *data = os2Table.data();
|
||||
quint32 *bigEndianUnicodeRanges = reinterpret_cast<quint32 *>(data + 42);
|
||||
quint32 *bigEndianCodepageRanges = reinterpret_cast<quint32 *>(data + 78);
|
||||
@ -656,10 +615,7 @@ QList<QFontDatabase::WritingSystem> QRawFont::supportedWritingSystems() const
|
||||
*/
|
||||
bool QRawFont::supportsCharacter(const QChar &character) const
|
||||
{
|
||||
if (!isValid())
|
||||
return false;
|
||||
|
||||
return d->fontEngine->canRender(&character, 1);
|
||||
return d->isValid() && d->fontEngine->canRender(&character, 1);
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -669,7 +625,7 @@ bool QRawFont::supportsCharacter(const QChar &character) const
|
||||
*/
|
||||
bool QRawFont::supportsCharacter(quint32 ucs4) const
|
||||
{
|
||||
if (!isValid())
|
||||
if (!d->isValid())
|
||||
return false;
|
||||
|
||||
QString str = QString::fromUcs4(&ucs4, 1);
|
||||
@ -688,6 +644,7 @@ extern int qt_script_for_writing_system(QFontDatabase::WritingSystem writingSyst
|
||||
*/
|
||||
QRawFont QRawFont::fromFont(const QFont &font, QFontDatabase::WritingSystem writingSystem)
|
||||
{
|
||||
QRawFont rawFont;
|
||||
#if defined(Q_WS_MAC)
|
||||
QTextLayout layout(QFontDatabase::writingSystemSample(writingSystem), font);
|
||||
layout.beginLayout();
|
||||
@ -698,14 +655,12 @@ QRawFont QRawFont::fromFont(const QFont &font, QFontDatabase::WritingSystem writ
|
||||
// Pick the one matches the family name we originally requested,
|
||||
// if none of them match, just pick the first one
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
QGlyphRun glyphs = list.at(i);
|
||||
QRawFont rawfont = glyphs.rawFont();
|
||||
rawfont = list.at(i).rawFont();
|
||||
if (rawfont.familyName() == font.family())
|
||||
return rawfont;
|
||||
}
|
||||
return list.at(0).rawFont();
|
||||
}
|
||||
return QRawFont();
|
||||
#else
|
||||
QFontPrivate *font_d = QFontPrivate::get(font);
|
||||
int script = qt_script_for_writing_system(writingSystem);
|
||||
@ -721,15 +676,12 @@ QRawFont QRawFont::fromFont(const QFont &font, QFontDatabase::WritingSystem writ
|
||||
}
|
||||
|
||||
if (fe != 0) {
|
||||
QRawFont rawFont;
|
||||
rawFont.d.data()->fontEngine = fe;
|
||||
rawFont.d.data()->fontEngine->ref.ref();
|
||||
rawFont.d.data()->hintingPreference = font.hintingPreference();
|
||||
return rawFont;
|
||||
} else {
|
||||
return QRawFont();
|
||||
}
|
||||
#endif
|
||||
return rawFont;
|
||||
}
|
||||
|
||||
/*!
|
||||
@ -740,7 +692,7 @@ void QRawFont::setPixelSize(qreal pixelSize)
|
||||
if (d->fontEngine == 0)
|
||||
return;
|
||||
|
||||
detach();
|
||||
d.detach();
|
||||
QFontEngine *oldFontEngine = d->fontEngine;
|
||||
|
||||
d->fontEngine = d->fontEngine->cloneWithSize(pixelSize);
|
||||
@ -752,15 +704,6 @@ void QRawFont::setPixelSize(qreal pixelSize)
|
||||
delete oldFontEngine;
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
void QRawFont::detach()
|
||||
{
|
||||
if (d->ref != 1)
|
||||
d.detach();
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
|
@ -140,8 +140,6 @@ private:
|
||||
friend class QRawFontPrivate;
|
||||
friend class QTextLayout;
|
||||
|
||||
void detach();
|
||||
|
||||
QExplicitlySharedDataPointer<QRawFontPrivate> d;
|
||||
};
|
||||
|
||||
|
@ -54,7 +54,9 @@
|
||||
//
|
||||
|
||||
#include "qrawfont.h"
|
||||
|
||||
#include "qfontengine_p.h"
|
||||
#include <QtCore/qthread.h>
|
||||
#include <QtCore/qthreadstorage.h>
|
||||
|
||||
#if !defined(QT_NO_RAWFONT)
|
||||
@ -96,6 +98,12 @@ public:
|
||||
cleanUp();
|
||||
}
|
||||
|
||||
inline bool isValid() const
|
||||
{
|
||||
Q_ASSERT(thread == 0 || thread == QThread::currentThread());
|
||||
return fontEngine != 0;
|
||||
}
|
||||
|
||||
void cleanUp();
|
||||
void platformCleanUp();
|
||||
void platformLoadFromData(const QByteArray &fontData,
|
||||
|
Loading…
x
Reference in New Issue
Block a user