Add environment variable QT_DISTANCEFIELD

DistanceField technique was not intended for rendering very large glyph.
In some case need the qEnvironmentVariable.

Change-Id: Ied11ed00f0c67bae3c92155e17721d8d2f224cca
Task-number: QTBUG-51714
Reviewed-by: Aram So <aram.so@lge.com>
Reviewed-by: Yoann Lopes <yoann.lopes@theqtcompany.com>
This commit is contained in:
Aram So 2016-03-07 11:15:12 +09:00
parent 2ec7f2cfed
commit a7fc1cef91
2 changed files with 93 additions and 19 deletions

View File

@ -45,6 +45,8 @@
QT_BEGIN_NAMESPACE
Q_LOGGING_CATEGORY(lcDistanceField, "qt.distanceField");
namespace
{
enum FillHDir
@ -732,8 +734,45 @@ static bool imageHasNarrowOutlines(const QImage &im)
return minHThick == 1 || minVThick == 1;
}
static int QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE = 54;
static int QT_DISTANCEFIELD_DEFAULT_TILESIZE = 64;
static int QT_DISTANCEFIELD_DEFAULT_SCALE = 16;
static int QT_DISTANCEFIELD_DEFAULT_RADIUS = 80;
static int QT_DISTANCEFIELD_DEFAULT_HIGHGLYPHCOUNT = 2000;
static void initialDistanceFieldFactor()
{
static bool initialized = false;
if (initialized)
return;
initialized = true;
if (qEnvironmentVariableIsSet("QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE")) {
QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE = qEnvironmentVariableIntValue("QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE");
qCDebug(lcDistanceField) << "set the QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE:" << QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE;
}
if (qEnvironmentVariableIsSet("QT_DISTANCEFIELD_DEFAULT_TILESIZE")) {
QT_DISTANCEFIELD_DEFAULT_TILESIZE = qEnvironmentVariableIntValue("QT_DISTANCEFIELD_DEFAULT_TILESIZE");
qCDebug(lcDistanceField) << "set the QT_DISTANCEFIELD_DEFAULT_TILESIZE:" << QT_DISTANCEFIELD_DEFAULT_TILESIZE;
}
if (qEnvironmentVariableIsSet("QT_DISTANCEFIELD_DEFAULT_SCALE")) {
QT_DISTANCEFIELD_DEFAULT_SCALE = qEnvironmentVariableIntValue("QT_DISTANCEFIELD_DEFAULT_SCALE");
qCDebug(lcDistanceField) << "set the QT_DISTANCEFIELD_DEFAULT_SCALE:" << QT_DISTANCEFIELD_DEFAULT_SCALE;
}
if (qEnvironmentVariableIsSet("QT_DISTANCEFIELD_DEFAULT_RADIUS")) {
QT_DISTANCEFIELD_DEFAULT_RADIUS = qEnvironmentVariableIntValue("QT_DISTANCEFIELD_DEFAULT_RADIUS");
qDebug(lcDistanceField) << "set the QT_DISTANCEFIELD_DEFAULT_RADIUS:" << QT_DISTANCEFIELD_DEFAULT_RADIUS;
}
if (qEnvironmentVariableIsSet("QT_DISTANCEFIELD_DEFAULT_HIGHGLYPHCOUNT")) {
QT_DISTANCEFIELD_DEFAULT_HIGHGLYPHCOUNT = qEnvironmentVariableIntValue("QT_DISTANCEFIELD_DEFAULT_HIGHGLYPHCOUNT");
qCDebug(lcDistanceField) << "set the QT_DISTANCEFIELD_DEFAULT_HIGHGLYPHCOUNT:" << QT_DISTANCEFIELD_DEFAULT_HIGHGLYPHCOUNT;
}
}
bool qt_fontHasNarrowOutlines(QFontEngine *fontEngine)
{
initialDistanceFieldFactor();
QFontEngine *fe = fontEngine->cloneWithSize(QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE);
if (!fe)
return false;
@ -753,6 +792,7 @@ bool qt_fontHasNarrowOutlines(QFontEngine *fontEngine)
bool qt_fontHasNarrowOutlines(const QRawFont &f)
{
QRawFont font = f;
initialDistanceFieldFactor();
font.setPixelSize(QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE);
if (!font.isValid())
return false;
@ -765,6 +805,51 @@ bool qt_fontHasNarrowOutlines(const QRawFont &f)
QRawFont::PixelAntialiasing));
}
int QT_DISTANCEFIELD_BASEFONTSIZE(bool narrowOutlineFont)
{
initialDistanceFieldFactor();
if (Q_UNLIKELY(narrowOutlineFont))
return QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE * 2;
else
return QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE;
}
int QT_DISTANCEFIELD_TILESIZE(bool narrowOutlineFont)
{
initialDistanceFieldFactor();
if (Q_UNLIKELY(narrowOutlineFont))
return QT_DISTANCEFIELD_DEFAULT_TILESIZE * 2;
else
return QT_DISTANCEFIELD_DEFAULT_TILESIZE;
}
int QT_DISTANCEFIELD_SCALE(bool narrowOutlineFont)
{
initialDistanceFieldFactor();
if (Q_UNLIKELY(narrowOutlineFont))
return QT_DISTANCEFIELD_DEFAULT_SCALE / 2;
else
return QT_DISTANCEFIELD_DEFAULT_SCALE;
}
int QT_DISTANCEFIELD_RADIUS(bool narrowOutlineFont)
{
initialDistanceFieldFactor();
if (Q_UNLIKELY(narrowOutlineFont))
return QT_DISTANCEFIELD_DEFAULT_RADIUS / 2;
else
return QT_DISTANCEFIELD_DEFAULT_RADIUS;
}
int QT_DISTANCEFIELD_HIGHGLYPHCOUNT()
{
initialDistanceFieldFactor();
return QT_DISTANCEFIELD_DEFAULT_HIGHGLYPHCOUNT;
}
QDistanceFieldData::QDistanceFieldData(const QDistanceFieldData &other)
: QSharedData(other)

View File

@ -54,31 +54,20 @@
#include <qrawfont.h>
#include <private/qfontengine_p.h>
#include <QtCore/qshareddata.h>
#include <QtCore/qglobal.h>
#include <QLoggingCategory>
QT_BEGIN_NAMESPACE
#define QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE 54
#define QT_DISTANCEFIELD_DEFAULT_TILESIZE 64
#define QT_DISTANCEFIELD_DEFAULT_SCALE 16
#define QT_DISTANCEFIELD_DEFAULT_RADIUS 80
#define QT_DISTANCEFIELD_HIGHGLYPHCOUNT 2000
#define QT_DISTANCEFIELD_BASEFONTSIZE(NarrowOutlineFont) \
(NarrowOutlineFont ? QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE * 2 : \
QT_DISTANCEFIELD_DEFAULT_BASEFONTSIZE)
#define QT_DISTANCEFIELD_TILESIZE(NarrowOutlineFont) \
(NarrowOutlineFont ? QT_DISTANCEFIELD_DEFAULT_TILESIZE * 2 : \
QT_DISTANCEFIELD_DEFAULT_TILESIZE)
#define QT_DISTANCEFIELD_SCALE(NarrowOutlineFont) \
(NarrowOutlineFont ? QT_DISTANCEFIELD_DEFAULT_SCALE / 2 : \
QT_DISTANCEFIELD_DEFAULT_SCALE)
#define QT_DISTANCEFIELD_RADIUS(NarrowOutlineFont) \
(NarrowOutlineFont ? QT_DISTANCEFIELD_DEFAULT_RADIUS / 2 : \
QT_DISTANCEFIELD_DEFAULT_RADIUS)
bool Q_GUI_EXPORT qt_fontHasNarrowOutlines(const QRawFont &f);
bool Q_GUI_EXPORT qt_fontHasNarrowOutlines(QFontEngine *fontEngine);
int Q_GUI_EXPORT QT_DISTANCEFIELD_BASEFONTSIZE(bool narrowOutlineFont);
int Q_GUI_EXPORT QT_DISTANCEFIELD_TILESIZE(bool narrowOutlineFont);
int Q_GUI_EXPORT QT_DISTANCEFIELD_SCALE(bool narrowOutlineFont);
int Q_GUI_EXPORT QT_DISTANCEFIELD_RADIUS(bool narrowOutlineFont);
int Q_GUI_EXPORT QT_DISTANCEFIELD_HIGHGLYPHCOUNT();
class Q_GUI_EXPORT QDistanceFieldData : public QSharedData
{
public: