Skip to content

Commit

Permalink
chore:Comparison of individual characters to obtain monospaced font
Browse files Browse the repository at this point in the history
optimization

Description: Comparison of individual characters to obtain monospaced
font optimization

Log: 将一个个字符比较获取等宽字体方法优化

link: null
  • Loading branch information
feixiang.ren committed Jun 10, 2020
1 parent 691beae commit 7317280
Showing 1 changed file with 37 additions and 150 deletions.
187 changes: 37 additions & 150 deletions src/settings/settings.cpp
Expand Up @@ -286,84 +286,13 @@ QPair<QWidget *, QWidget *> Settings::createFontComBoBoxHandle(QObject *obj)
DSettingsWidgetFactory::createStandardItem(QByteArray(), option, comboBox);

/******** Modify by nt001000 renfeixiang 2020-05-12:将非等宽字体和特殊符号字体屏蔽 2020-06-05:优化增加黑白名单,减少for循环 ***********×****/
//在REPCHAR中增加了一个空格,空格在非等宽字体中长度和字符长度不同
// char REPCHAR[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
// "abcdefgjijklmnopqrstuvwxyz"
// "0123456789 ./+@";
// QFontDatabase fontDatabase;
// QStringList fontLst = fontDatabase.families();
// QStringList Whitelist;
// Whitelist << "Courier 10 Pitch" << "DejaVu Sans Mono" << "Liberation Mono" << "Monospace"
// << "Noto Mono" << "Noto Sans Mono" << "Noto Sans Mono CJK JP" << "Noto Sans Mono CJK JP Bold"
// << "Noto Sans Mono CJK KR" << "Noto Sans Mono CJK KR Bold" << "Noto Sans Mono CJK SC"
// << "Noto Sans Mono CJK SC Bold" << "Noto Sans Mono CJK TC" << "Noto Sans Mono CJK TC Bold" << "Unifont";


// QStringList Blacklist;
// Blacklist << "webdings" << "Symbol" << "MT Extra [unknown]" << "Bitstream Charter" << "CESI仿宋-GB13000" << "CESI仿宋-GB18030"
// << "CESI仿宋-GB2312" << "CESI宋体-GB13000" << "CESI宋体-GB18030" << "CESI宋体-GB2312" << "CESI小标宋-GB13000"
// << "CESI小标宋-GB18030" << "CESI小标宋-GB2312" << "CESI楷体-GB13000" << "CESI楷体-GB18030" << "CESI楷体-GB2312" << "CESI黑体-GB13000"
// << "CESI黑体-GB18030" << "CESI黑体-GB2312" << "DejaVu Math TeX Gyre" << "DejaVu Sans" << "DejaVu Serif" << "Liberation Sans"
// << "Liberation Sans Narrow" << "Liberation Serif" << "Lohit Devanagari" << "MT Extra [PfEd]" << "Noto Kufi Arabic" << "Noto Music"
// << "Noto Naskh Arabic" << "Noto Nastaliq Urdu" << "Noto Sans" << "Noto Sans Adlam" << "Noto Sans Adlam Unjoined"
// << "Noto Sans Anatolian Hieroglyphs" << "Noto Sans Arabic" << "Noto Sans Armenian" << "Noto Sans Avestan" << "Noto Sans Bamum"
// << "Noto Sans Bassa Vah" << "Noto Sans Batak" << "Noto Sans Bengali" << "Noto Sans Bhaiksuki" << "Noto Sans Brahmi"
// << "Noto Sans Buginese" << "Noto Sans Buhid" << "Noto Sans Canadian Aboriginal" << "Noto Sans Carian" << "Noto Sans Caucasian Albanian"
// << "Noto Sans Chakma" << "Noto Sans Cham" << "Noto Sans Cherokee" << "Noto Sans CJK JP" << "Noto Sans CJK JP Bold" << "Noto Sans CJK KR"
// << "Noto Sans CJK KR Bold" << "Noto Sans CJK SC" << "Noto Sans CJK SC Bold" << "Noto Sans CJK TC" << "Noto Sans CJK TC Bold"
// << "Noto Sans Coptic" << "Noto Sans Cuneiform" << "Noto Sans Cypriot" << "Noto Sans Deseret" << "Noto Sans Devanagari" << "Noto Sans Display"
// << "Noto Sans Duployan" << "Noto Sans Egyptian Hieroglyphs" << "Noto Sans Elbasan" << "Noto Sans Ethiopic" << "Noto Sans Georgian"
// << "Noto Sans Glagolitic" << "Noto Sans Gothic" << "Noto Sans Grantha" << "Noto Sans Gujarati" << "Noto Sans Gurmukhi" << "Noto Sans Hanunoo"
// << "Noto Sans Hatran" << "Noto Sans Hebrew" << "Noto Sans Imperial Aramaic" << "Noto Sans Inscriptional Pahlavi" << "Noto Sans Inscriptional Parthian"
// << "Noto Sans Javanese" << "Noto Sans Kaithi" << "Noto Sans Kannada" << "Noto Sans Kayah Li" << "Noto Sans Kharoshthi" << "Noto Sans Khmer"
// << "Noto Sans Khojki" << "Noto Sans Khudawadi" << "Noto Sans Lao" << "Noto Sans Lepcha" << "Noto Sans Limbu" << "Noto Sans Linear A"
// << "Noto Sans Linear B" << "Noto Sans Lisu" << "Noto Sans Lycian" << "Noto Sans Lydian" << "Noto Sans Mahajani" << "Noto Sans Malayalam"
// << "Noto Sans Mandaic" << "Noto Sans Manichaean" << "Noto Sans Marchen" << "Noto Sans Math" << "Noto Sans Meetei Mayek" << "Noto Sans Mende Kikakui"
// << "Noto Sans Meroitic" << "Noto Sans Miao" << "Noto Sans Modi" << "Noto Sans Mongolian" << "Noto Sans Mro" << "Noto Sans Multani" << "Noto Sans Myanmar"
// << "Noto Sans Nabataean" << "Noto Sans New Tai Lue" << "Noto Sans Newa" << "Noto Sans NKo" << "Noto Sans Ogham" << "Noto Sans Ol Chiki"
// << "Noto Sans Old Hungarian" << "Noto Sans Old Italic" << "Noto Sans Old North Arabian" << "Noto Sans Old Permic" << "Noto Sans Old Persian"
// << "Noto Sans Old South Arabian" << "Noto Sans Old Turkic" << "Noto Sans Oriya" << "Noto Sans Osage" << "Noto Sans Osmanya" << "Noto Sans Pahawh Hmong"
// << "Noto Sans Palmyrene" << "Noto Sans Pau Cin Hau" << "Noto Sans PhagsPa" << "Noto Sans Phoenician" << "Noto Sans Psalter Pahlavi" << "Noto Sans Rejang"
// << "Noto Sans Runic" << "Noto Sans Samaritan" << "Noto Sans Saurashtra" << "Noto Sans Sharada" << "Noto Sans Shavian" << "Noto Sans Sinhala"
// << "Noto Sans Sora Sompeng" << "Noto Sans Sundanese" << "Noto Sans Syloti Nagri" << "Noto Sans Symbols" << "Noto Sans Symbols2" << "Noto Sans Syriac"
// << "Noto Sans Syriac Eastern" << "Noto Sans Syriac Estrangela" << "Noto Sans Syriac Western" << "Noto Sans Tagalog" << "Noto Sans Tagbanwa"
// << "Noto Sans Tai Le" << "Noto Sans Tai Tham" << "Noto Sans Tai Viet" << "Noto Sans Takri" << "Noto Sans Tamil" << "Noto Sans Telugu" << "Noto Sans Thaana"
// << "Noto Sans Thai" << "Noto Sans Tibetan" << "Noto Sans Tifinagh" << "Noto Sans Tirhuta" << "Noto Sans Ugaritic" << "Noto Sans Vai"
// << "Noto Sans Warang Citi" << "Noto Sans Yi" << "Noto Serif" << "Noto Serif Ahom" << "Noto Serif Armenian" << "Noto Serif Balinese"
// << "Noto Serif Bengali" << "Noto Serif CJK JP" << "Noto Serif CJK KR" << "Noto Serif CJK SC" << "Noto Serif CJK TC" << "Noto Serif Devanagari"
// << "Noto Serif Display" << "Noto Serif Ethiopic" << "Noto Serif Georgian" << "Noto Serif Gujarati" << "Noto Serif Gurmukhi" << "Noto Serif Hebrew"
// << "Noto Serif Kannada" << "Noto Serif Khmer" << "Noto Serif Lao" << "Noto Serif Malayalam" << "Noto Serif Myanmar" << "Noto Serif Sinhala"
// << "Noto Serif Tamil" << "Noto Serif Tamil Slanted" << "Noto Serif Telugu" << "Noto Serif Thai" << "Noto Serif Tibetan" << "Sans Serif" << "Serif"
// << "Symbola" << "Unifont CSUR" << "Unifont Upper" << "Wingdings" << "Wingdings 2" << "Wingdings 3";
// for (QString sfont : fontLst) {
// if (Whitelist.contains(sfont) || Blacklist.contains(sfont)) {
// continue;
// }
// bool fixedFont = true;
// QFont font(sfont);
// QFontMetrics fm(font);
// int fw = fm.width(REPCHAR[0]);
// //qDebug() << "sfont" << sfont;

// //for (unsigned int i = 1; i < qstrlen(REPCHAR); i++) {
// if (fw != fm.width(" ")) {
// fixedFont = false;
// break;
// }
// //}
// if (fixedFont) {
// Whitelist.append(sfont);
// }

// }
QStringList Whitelist;
/******** Add by ut001000 renfeixiang 2020-06-08:增加 Begin***************/
Whitelist = DBusManager::callAppearanceFont("monospacefont");
qDebug() << "createFontComBoBoxHandle get system monospacefont" << Whitelist;
if (Whitelist.size() <= 0) {
//一般不会走这个分支,除非DBUS出现问题
qDebug() << "DBusManager::callAppearanceFont failed, get control font failed.";
/******** Add by ut001000 renfeixiang 2020-06-08:增加 End***************/
//在REPCHAR中增加了一个空格,空格在非等宽字体中长度和字符长度不同
char REPCHAR[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefgjijklmnopqrstuvwxyz"
Expand Down Expand Up @@ -417,95 +346,53 @@ QPair<QWidget *, QWidget *> Settings::createFontComBoBoxHandle(QObject *obj)
WhiteFontPath.mkpath(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation));
}

QString WhiteFontFilePath(WhiteFontPath.filePath("whitefont-config.conf"));
QString blackFontFilePath(WhiteFontPath.filePath("blackfont-config.conf"));
QFile file(WhiteFontFilePath);
QString strWhiteFont = "";
if (file.open(QIODevice::ReadWrite)) {
strWhiteFont = file.readAll();
file.close();
}
QFile blackfile(blackFontFilePath);
QString strBlackFont = "";
if (blackfile.open(QIODevice::ReadWrite)) {
strBlackFont = blackfile.readAll();
blackfile.close();
QString FontFilePath(WhiteFontPath.filePath("fontList.conf"));
QSettings mSettings(FontFilePath, QSettings::IniFormat);
if (!mSettings.value("List/White").isNull()) {
Whitelist.clear();
Whitelist = mSettings.value("List/White").toStringList();
}
if (strBlackFont.size() > 0) {
if (!mSettings.value("List/Black").isNull()) {
Blacklist.clear();
Blacklist = strBlackFont.split(",");
Blacklist = mSettings.value("List/Black").toStringList();
}
if (strWhiteFont.size() > 0) {
Whitelist.clear();
Whitelist = strWhiteFont.split(",");
}
bool bflag = false;
// for (QString sfont : fontLst) {
// if (Whitelist.contains(sfont) | Blacklist.contains(sfont)) {
// continue;
// }
// bflag = true;
// break;
// }
if (!bflag) {
QStringList tmpWhitelist;
QStringList tmpBlacklist;
for (QString sfont : fontLst) {
if (Whitelist.contains(sfont)) {
tmpWhitelist.append(sfont);
continue;
}
if (Blacklist.contains(sfont)) {
tmpBlacklist.append(sfont);
continue;
}
bool fixedFont = true;
QFont font(sfont);
QFontMetrics fm(font);
int fw = fm.width(REPCHAR[0]);
//qDebug() << "sfont" << sfont;

//for (unsigned int i = 1; i < qstrlen(REPCHAR); i++) {
if (fw != fm.width(" ")) {
fixedFont = false;
break;
}
//}
if (fixedFont) {
tmpWhitelist.append(sfont);
}
}
strWhiteFont = "";
//if (tmpWhitelist.size() != Whitelist.size()) {
for (int j = 0; j < tmpWhitelist.size(); j++) {
if (j != 0) {
strWhiteFont += ",";
}
strWhiteFont += tmpWhitelist.at(j);

QStringList tmpWhitelist;
QStringList tmpBlacklist;
for (QString sfont : fontLst) {
if (Whitelist.contains(sfont)) {
tmpWhitelist.append(sfont);
continue;
}
//}
if (file.open(QIODevice::ReadWrite | QIODevice::Text)) {
file.write(strWhiteFont.toLocal8Bit().data());
file.close();
if (Blacklist.contains(sfont)) {
tmpBlacklist.append(sfont);
continue;
}

strBlackFont = "";
//if (tmpBlacklist.size() != Blacklist.size()) {
for (int j = 0; j < tmpBlacklist.size(); j++) {
if (j != 0) {
strBlackFont += ",";
bool fixedFont = true;
QFont font(sfont);
QFontMetrics fm(font);
int fw = fm.width(REPCHAR[0]);
qDebug() << "sfont" << sfont;

for (unsigned int i = 1; i < qstrlen(REPCHAR); i++) {
if (fw != fm.width(QLatin1Char(REPCHAR[i]))) {
fixedFont = false;
break;
}
strBlackFont += tmpBlacklist.at(j);
}
//}
if (blackfile.open(QIODevice::ReadWrite | QIODevice::Text)) {
blackfile.write(strBlackFont.toLocal8Bit().data());
blackfile.close();
if (fixedFont) {
tmpWhitelist.append(sfont);
} else {
tmpBlacklist.append(sfont);
}
}

Whitelist = tmpWhitelist;
mSettings.beginGroup("List");
mSettings.setValue("White", tmpWhitelist);
mSettings.setValue("Black", tmpBlacklist);
mSettings.endGroup();

}
Whitelist = tmpWhitelist;

}
/******** Modify by ut001000 renfeixiang 2020-06-08:修改 End***************/
Expand Down

0 comments on commit 7317280

Please sign in to comment.