Fix styleName support in QPA font database
Font styleName support was disconnected since Qt switched to QPA
fontdatabase. Now add the code from Qt 4.8 back to enable this in
QPA.
Change-Id: Iab2cbfd5468f87542183348c2123ca4b2c270692
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
(cherry picked from commit fa7661d8b2
)
This commit is contained in:
parent
22929c5dfc
commit
133bbf6ea9
@ -274,27 +274,15 @@ struct QtFontFoundry
|
||||
QtFontStyle *QtFontFoundry::style(const QtFontStyle::Key &key, const QString &styleName, bool create)
|
||||
{
|
||||
int pos = 0;
|
||||
if (count) {
|
||||
// if styleName for searching first if possible
|
||||
if (!styleName.isEmpty()) {
|
||||
for (; pos < count; pos++) {
|
||||
if (styles[pos]->styleName == styleName)
|
||||
return styles[pos];
|
||||
}
|
||||
}
|
||||
int low = 0;
|
||||
int high = count;
|
||||
pos = count / 2;
|
||||
while (high > low) {
|
||||
for (; pos < count; pos++) {
|
||||
bool hasStyleName = !styleName.isEmpty(); // search styleName first if available
|
||||
if (hasStyleName && !styles[pos]->styleName.isEmpty()) {
|
||||
if (styles[pos]->styleName == styleName)
|
||||
return styles[pos];
|
||||
} else {
|
||||
if (styles[pos]->key == key)
|
||||
return styles[pos];
|
||||
if (styles[pos]->key < key)
|
||||
low = pos + 1;
|
||||
else
|
||||
high = pos;
|
||||
pos = (high + low) / 2;
|
||||
}
|
||||
pos = low;
|
||||
}
|
||||
if (!create)
|
||||
return 0;
|
||||
@ -309,7 +297,6 @@ QtFontStyle *QtFontFoundry::style(const QtFontStyle::Key &key, const QString &st
|
||||
|
||||
QtFontStyle *style = new QtFontStyle(key);
|
||||
style->styleName = styleName;
|
||||
memmove(styles + pos + 1, styles + pos, (count-pos)*sizeof(QtFontStyle *));
|
||||
styles[pos] = style;
|
||||
count++;
|
||||
return styles[pos];
|
||||
|
@ -52,7 +52,8 @@
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
Q_GUI_EXPORT void qt_registerFont(const QString &familyName, const QString &foundryname, int weight,
|
||||
Q_GUI_EXPORT void qt_registerFont(const QString &familyName, const QString &stylename,
|
||||
const QString &foundryname, int weight,
|
||||
QFont::Style style, int stretch, bool antialiased,
|
||||
bool scalable, int pixelSize, bool fixedPitch,
|
||||
const QSupportedWritingSystems &writingSystems, void *handle)
|
||||
@ -75,7 +76,7 @@ Q_GUI_EXPORT void qt_registerFont(const QString &familyName, const QString &fou
|
||||
}
|
||||
|
||||
QtFontFoundry *foundry = f->foundry(foundryname, true);
|
||||
QtFontStyle *fontStyle = foundry->style(styleKey, QString(), true);
|
||||
QtFontStyle *fontStyle = foundry->style(styleKey, stylename, true);
|
||||
fontStyle->smoothScalable = scalable;
|
||||
fontStyle->antialiased = antialiased;
|
||||
QtFontSize *size = fontStyle->pixelSize(pixelSize ? pixelSize : SMOOTH_SCALABLE, true);
|
||||
|
@ -47,7 +47,8 @@
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
extern void qt_registerFont(const QString &familyname, const QString &foundryname, int weight,
|
||||
extern void qt_registerFont(const QString &familyname, const QString &stylename,
|
||||
const QString &foundryname, int weight,
|
||||
QFont::Style style, int stretch, bool antialiased,
|
||||
bool scalable, int pixelSize, bool fixedPitch,
|
||||
const QSupportedWritingSystems &writingSystems, void *hanlde);
|
||||
@ -89,7 +90,7 @@ void QPlatformFontDatabase::registerQPF2Font(const QByteArray &dataArray, void *
|
||||
}
|
||||
}
|
||||
QFont::Stretch stretch = QFont::Unstretched;
|
||||
registerFont(fontName,QString(),fontWeight,fontStyle,stretch,true,false,pixelSize,false,writingSystems,handle);
|
||||
registerFont(fontName,QString(),QString(),fontWeight,fontStyle,stretch,true,false,pixelSize,false,writingSystems,handle);
|
||||
}
|
||||
} else {
|
||||
qDebug() << "header verification of QPF2 font failed. maybe it is corrupt?";
|
||||
@ -117,7 +118,8 @@ void QPlatformFontDatabase::registerQPF2Font(const QByteArray &dataArray, void *
|
||||
|
||||
\sa registerQPF2Font()
|
||||
*/
|
||||
void QPlatformFontDatabase::registerFont(const QString &familyname, const QString &foundryname, QFont::Weight weight,
|
||||
void QPlatformFontDatabase::registerFont(const QString &familyname, const QString &stylename,
|
||||
const QString &foundryname, QFont::Weight weight,
|
||||
QFont::Style style, QFont::Stretch stretch, bool antialiased,
|
||||
bool scalable, int pixelSize, bool fixedPitch,
|
||||
const QSupportedWritingSystems &writingSystems, void *usrPtr)
|
||||
@ -125,7 +127,7 @@ void QPlatformFontDatabase::registerFont(const QString &familyname, const QStrin
|
||||
if (scalable)
|
||||
pixelSize = 0;
|
||||
|
||||
qt_registerFont(familyname, foundryname, weight, style,
|
||||
qt_registerFont(familyname, stylename, foundryname, weight, style,
|
||||
stretch, antialiased, scalable, pixelSize,
|
||||
fixedPitch, writingSystems, usrPtr);
|
||||
}
|
||||
|
@ -116,7 +116,8 @@ public:
|
||||
|
||||
//callback
|
||||
static void registerQPF2Font(const QByteArray &dataArray, void *handle);
|
||||
static void registerFont(const QString &familyname, const QString &foundryname, QFont::Weight weight,
|
||||
static void registerFont(const QString &familyname, const QString &stylename,
|
||||
const QString &foundryname, QFont::Weight weight,
|
||||
QFont::Style style, QFont::Stretch stretch, bool antialiased,
|
||||
bool scalable, int pixelSize, bool fixedPitch,
|
||||
const QSupportedWritingSystems &writingSystems, void *handle);
|
||||
|
@ -452,7 +452,7 @@ QStringList QBasicFontDatabase::addTTFile(const QByteArray &fontData, const QByt
|
||||
|
||||
QFont::Stretch stretch = QFont::Unstretched;
|
||||
|
||||
registerFont(family,QString(),weight,style,stretch,true,true,0,fixedPitch,writingSystems,fontFile);
|
||||
registerFont(family,QString::fromLatin1(face->style_name),QString(),weight,style,stretch,true,true,0,fixedPitch,writingSystems,fontFile);
|
||||
|
||||
families.append(family);
|
||||
|
||||
|
@ -318,6 +318,7 @@ void QFontconfigDatabase::populateFontDatabase()
|
||||
FcChar8 *file_value;
|
||||
int indexValue;
|
||||
FcChar8 *foundry_value;
|
||||
FcChar8 *style_value;
|
||||
FcBool scalable;
|
||||
FcBool antialias;
|
||||
|
||||
@ -325,7 +326,7 @@ void QFontconfigDatabase::populateFontDatabase()
|
||||
FcObjectSet *os = FcObjectSetCreate();
|
||||
FcPattern *pattern = FcPatternCreate();
|
||||
const char *properties [] = {
|
||||
FC_FAMILY, FC_WEIGHT, FC_SLANT,
|
||||
FC_FAMILY, FC_STYLE, FC_WEIGHT, FC_SLANT,
|
||||
FC_SPACING, FC_FILE, FC_INDEX,
|
||||
FC_LANG, FC_CHARSET, FC_FOUNDRY, FC_SCALABLE, FC_PIXEL_SIZE, FC_WEIGHT,
|
||||
FC_WIDTH,
|
||||
@ -371,6 +372,8 @@ void QFontconfigDatabase::populateFontDatabase()
|
||||
scalable = FcTrue;
|
||||
if (FcPatternGetString(fonts->fonts[i], FC_FOUNDRY, 0, &foundry_value) != FcResultMatch)
|
||||
foundry_value = 0;
|
||||
if (FcPatternGetString(fonts->fonts[i], FC_STYLE, 0, &style_value) != FcResultMatch)
|
||||
style_value = 0;
|
||||
if(FcPatternGetBool(fonts->fonts[i],FC_ANTIALIAS,0,&antialias) != FcResultMatch)
|
||||
antialias = true;
|
||||
|
||||
@ -438,7 +441,8 @@ void QFontconfigDatabase::populateFontDatabase()
|
||||
|
||||
bool fixedPitch = spacing_value >= FC_MONO;
|
||||
QFont::Stretch stretch = QFont::Unstretched;
|
||||
QPlatformFontDatabase::registerFont(familyName,QLatin1String((const char *)foundry_value),weight,style,stretch,antialias,scalable,pixel_size,fixedPitch,writingSystems,fontFile);
|
||||
QString styleName = style_value ? QString::fromUtf8((const char *) style_value) : QString();
|
||||
QPlatformFontDatabase::registerFont(familyName,styleName,QLatin1String((const char *)foundry_value),weight,style,stretch,antialias,scalable,pixel_size,fixedPitch,writingSystems,fontFile);
|
||||
// qDebug() << familyName << (const char *)foundry_value << weight << style << &writingSystems << scalable << true << pixel_size;
|
||||
}
|
||||
|
||||
@ -462,9 +466,9 @@ void QFontconfigDatabase::populateFontDatabase()
|
||||
|
||||
while (f->qtname) {
|
||||
QString familyQtName = QString::fromLatin1(f->qtname);
|
||||
registerFont(familyQtName,QString(),QFont::Normal,QFont::StyleNormal,QFont::Unstretched,true,true,0,f->fixed,ws,0);
|
||||
registerFont(familyQtName,QString(),QFont::Normal,QFont::StyleItalic,QFont::Unstretched,true,true,0,f->fixed,ws,0);
|
||||
registerFont(familyQtName,QString(),QFont::Normal,QFont::StyleOblique,QFont::Unstretched,true,true,0,f->fixed,ws,0);
|
||||
registerFont(familyQtName,QString(),QString(),QFont::Normal,QFont::StyleNormal,QFont::Unstretched,true,true,0,f->fixed,ws,0);
|
||||
registerFont(familyQtName,QString(),QString(),QFont::Normal,QFont::StyleItalic,QFont::Unstretched,true,true,0,f->fixed,ws,0);
|
||||
registerFont(familyQtName,QString(),QString(),QFont::Normal,QFont::StyleOblique,QFont::Unstretched,true,true,0,f->fixed,ws,0);
|
||||
++f;
|
||||
}
|
||||
|
||||
|
@ -227,6 +227,7 @@ void QCoreTextFontDatabase::populateFontDatabase()
|
||||
for (int i = 0; i < numFonts; ++i) {
|
||||
CTFontDescriptorRef font = (CTFontDescriptorRef) CFArrayGetValueAtIndex(fonts, i);
|
||||
QCFString familyName = (CFStringRef) CTFontDescriptorCopyLocalizedAttribute(font, kCTFontFamilyNameAttribute, NULL);
|
||||
QCFString styleName = (CFStringRef)CTFontDescriptorCopyLocalizedAttribute(font, kCTFontStyleNameAttribute, NULL);
|
||||
QCFType<CFDictionaryRef> styles = (CFDictionaryRef) CTFontDescriptorCopyAttribute(font, kCTFontTraitsAttribute);
|
||||
QFont::Weight weight = QFont::Normal;
|
||||
QFont::Style style = QFont::StyleNormal;
|
||||
@ -285,7 +286,7 @@ void QCoreTextFontDatabase::populateFontDatabase()
|
||||
}
|
||||
|
||||
CFRetain(font);
|
||||
QPlatformFontDatabase::registerFont(familyName, foundryName, weight, style, stretch,
|
||||
QPlatformFontDatabase::registerFont(familyName, styleName, foundryName, weight, style, stretch,
|
||||
true /* antialiased */, true /* scalable */,
|
||||
pixelSize, fixedPitch, writingSystems, (void *) font);
|
||||
CFStringRef psName = (CFStringRef) CTFontDescriptorCopyAttribute(font, kCTFontNameAttribute);
|
||||
|
@ -1033,17 +1033,17 @@ static bool addFontToDatabase(QString familyName, const QString &scriptName,
|
||||
writingSystems.setSupported(ws);
|
||||
}
|
||||
|
||||
QPlatformFontDatabase::registerFont(familyName, foundryName, weight,
|
||||
QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, weight,
|
||||
style, stretch, antialias, scalable, size, fixed, writingSystems, 0);
|
||||
// add fonts windows can generate for us:
|
||||
if (weight <= QFont::DemiBold)
|
||||
QPlatformFontDatabase::registerFont(familyName, foundryName, QFont::Bold,
|
||||
QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, QFont::Bold,
|
||||
style, stretch, antialias, scalable, size, fixed, writingSystems, 0);
|
||||
if (style != QFont::StyleItalic)
|
||||
QPlatformFontDatabase::registerFont(familyName, foundryName, weight,
|
||||
QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, weight,
|
||||
QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, 0);
|
||||
if (weight <= QFont::DemiBold && style != QFont::StyleItalic)
|
||||
QPlatformFontDatabase::registerFont(familyName, foundryName, QFont::Bold,
|
||||
QPlatformFontDatabase::registerFont(familyName, QString(), foundryName, QFont::Bold,
|
||||
QFont::StyleItalic, stretch, antialias, scalable, size, fixed, writingSystems, 0);
|
||||
|
||||
if (!englishName.isEmpty())
|
||||
|
@ -279,20 +279,20 @@ static bool addFontToDatabase(QString familyName, const QString &scriptName,
|
||||
if (!QDir::isAbsolutePath(value))
|
||||
value.prepend(QString::fromLocal8Bit(qgetenv("windir") + "\\Fonts\\"));
|
||||
|
||||
QPlatformFontDatabase::registerFont(faceName, foundryName, weight, style, stretch,
|
||||
QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, weight, style, stretch,
|
||||
antialias, scalable, size, fixed, writingSystems, createFontFile(value, index));
|
||||
|
||||
// add fonts windows can generate for us:
|
||||
if (weight <= QFont::DemiBold)
|
||||
QPlatformFontDatabase::registerFont(faceName, foundryName, QFont::Bold, style, stretch,
|
||||
QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, QFont::Bold, style, stretch,
|
||||
antialias, scalable, size, fixed, writingSystems, createFontFile(value, index));
|
||||
|
||||
if (style != QFont::StyleItalic)
|
||||
QPlatformFontDatabase::registerFont(faceName, foundryName, weight, QFont::StyleItalic, stretch,
|
||||
QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, weight, QFont::StyleItalic, stretch,
|
||||
antialias, scalable, size, fixed, writingSystems, createFontFile(value, index));
|
||||
|
||||
if (weight <= QFont::DemiBold && style != QFont::StyleItalic)
|
||||
QPlatformFontDatabase::registerFont(faceName, foundryName, QFont::Bold, QFont::StyleItalic, stretch,
|
||||
QPlatformFontDatabase::registerFont(faceName, QString(), foundryName, QFont::Bold, QFont::StyleItalic, stretch,
|
||||
antialias, scalable, size, fixed, writingSystems, createFontFile(value, index));
|
||||
|
||||
if (!englishName.isEmpty())
|
||||
|
Loading…
Reference in New Issue
Block a user