diff options
Diffstat (limited to 'kcontrol/kfontinst/kfile-plugin')
-rw-r--r-- | kcontrol/kfontinst/kfile-plugin/KFileFont.cpp | 422 | ||||
-rw-r--r-- | kcontrol/kfontinst/kfile-plugin/KFileFont.h | 58 | ||||
-rw-r--r-- | kcontrol/kfontinst/kfile-plugin/Makefile.am | 13 | ||||
-rw-r--r-- | kcontrol/kfontinst/kfile-plugin/kfile_font.desktop | 86 |
4 files changed, 579 insertions, 0 deletions
diff --git a/kcontrol/kfontinst/kfile-plugin/KFileFont.cpp b/kcontrol/kfontinst/kfile-plugin/KFileFont.cpp new file mode 100644 index 000000000..31fbaa83e --- /dev/null +++ b/kcontrol/kfontinst/kfile-plugin/KFileFont.cpp @@ -0,0 +1,422 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Class Name : KFI::KFileFont +// Author : Craig Drummond +// Project : K Font Installer +// Creation Date : 20/03/2003 +// Version : $Revision$ $Date$ +// +//////////////////////////////////////////////////////////////////////////////// +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +//////////////////////////////////////////////////////////////////////////////// +// (C) Craig Drummond, 2003, 2004 +//////////////////////////////////////////////////////////////////////////////// + +#include "KFileFont.h" +#include "KfiConstants.h" +#include <qfile.h> +#include <qtextstream.h> +#include <kgenericfactory.h> +#include <kio/netaccess.h> + +static void addEntry(int face, QString &existing, const QString &add) +{ + if(face>0) + existing.append(", "); + existing.append(add); +} + +static int strToWeight(const QString &str) +{ + if(NULL==str) + return FC_WEIGHT_MEDIUM; + else if(str.contains("Bold", false)) + return FC_WEIGHT_BOLD; + else if(str.contains("Heavy", false)) + return FC_WEIGHT_HEAVY; + else if(str.contains("Black", false)) + return FC_WEIGHT_BLACK; + else if(str.contains("ExtraBold", false)) + return FC_WEIGHT_EXTRABOLD; + else if(str.contains("UltraBold", false)) + return FC_WEIGHT_ULTRABOLD; + else if(str.contains("ExtraLight", false)) + return FC_WEIGHT_EXTRALIGHT; + else if(str.contains("UltraLight", false)) + return FC_WEIGHT_ULTRALIGHT; + else if(str.contains("Light", false)) + return FC_WEIGHT_LIGHT; + else if(str.contains("Medium", false) || str.contains("Normal", false) || str.contains("Roman", false)) + return FC_WEIGHT_MEDIUM; + else if(str.contains("Regular", false)) + return FC_WEIGHT_REGULAR; + else if(str.contains("SemiBold", false)) + return FC_WEIGHT_SEMIBOLD; + else if(str.contains("DemiBold", false)) + return FC_WEIGHT_DEMIBOLD; + else if(str.contains("Thin", false)) + return FC_WEIGHT_THIN; + else if(str.contains("Book", false)) + return FC_WEIGHT_NORMAL; + else if(str.contains("Demi", false)) + return FC_WEIGHT_NORMAL; + else + return FC_WEIGHT_MEDIUM; +} + +#ifndef KFI_FC_NO_WIDTHS +static int strToWidth(const QString &str) +{ + if(str.isEmpty()) + return FC_WIDTH_NORMAL; + else if(str.contains("UltraCondensed", false)) + return FC_WIDTH_ULTRACONDENSED; + else if(str.contains("ExtraCondensed", false)) + return FC_WIDTH_EXTRACONDENSED; + else if(str.contains("SemiCondensed", false)) + return FC_WIDTH_SEMICONDENSED; + else if(str.contains("Condensed", false)) + return FC_WIDTH_CONDENSED; + else if(str.contains("SemiExpanded", false)) + return FC_WIDTH_SEMIEXPANDED; + else if(str.contains("UltraExpanded", false)) + return FC_WIDTH_ULTRAEXPANDED; + else if(str.contains("ExtraExpanded", false)) + return FC_WIDTH_EXTRAEXPANDED; + else if(str.contains("Expanded", false)) + return FC_WIDTH_EXPANDED; + else + return FC_WIDTH_NORMAL; +} +#endif + +struct FoundryMap +{ + const char *noticeStr, + *foundry; + unsigned short len; +}; + +static const FoundryMap map[]= // These are (mainly) taken from type1inst +{ + { "Bigelow", "B&H", 3}, + { "Adobe", "Adobe", 5}, + { "Bitstream", "Bitstream", 9}, + { "Monotype", "Monotype", 8}, + { "Linotype", "Linotype", 8}, + { "LINOTYPE-HELL", "Linotype", 0}, + { "IBM", "IBM", 3}, + { "URW", "URW", 3}, + { "International Typeface Corporation", "ITC", 3}, + { "Tiro Typeworks", "Tiro", 4}, + { "XFree86", "XFree86", 7}, + { "Microsoft", "Microsoft", 9}, + { "Omega", "Omega", 5}, + { "Font21", "Hwan", 4}, + { "HanYang System", "Hanyang", 7}, + { "Richard Mitchell", "Mitchell", 8}, + { "Doug Miles", "Miles", 5}, + { "Hank Gillette", "Gillette", 8}, + { "Three Islands Press", "3ip", 3}, + { "MacroMind", "Macromind", 9}, + { "MWSoft", "MWSoft", 6}, + { "Digiteyes Multimedia", "DigitEyes", 9}, + { "ZSoft", "ZSoft", 5}, + { "Title Wave", "Titlewave", 9}, + { "Southern Software", "Southern", 8}, + { "Reasonable Solutions", "Reasonable", 10}, + { "David Rakowski", "Rakowski", 8}, + { "D. Rakowski", "Rakowski", 0}, + { "S. G. Moye", "Moye", 4}, + { "S.G. Moye", "Moye", 0}, + { "Andrew s. Meit", "Meit", 4}, + { "A.S.Meit", "Meit", 0}, + { "Hershey", "Hershey", 7}, + { "FontBank", "FontBank", 8}, + { "A. Carr", "Carr", 4}, + { "Brendel Informatik", "Brendel", 7}, + { "Jonathan Brecher", "Brecher", 7}, + { "SoftMaker", "Softmaker", 9}, + { "LETRASET", "Letraset", 8}, + { "Corel Corp", "Corel", 5}, + { "PUBLISHERS PARADISE", "Paradise", 8}, + { "Publishers Paradise", "Paradise", 0}, + { "Allied Corporation", "Allied", 6}, + { NULL, NULL, 0} +}; + +static const char * getFoundry(const char *notice) +{ + const FoundryMap *entry; + + if(notice) + for(entry=map; NULL!=entry->foundry; entry++) + if(NULL!=strstr(notice, entry->noticeStr)) + return entry->foundry; + + return NULL; +} + +static bool readAfm(const QString &file, QString &full, QString &family, QString &foundry, QString &weight, +#ifndef KFI_FC_NO_WIDTHS + QString &width, +#endif + QString &spacing, QString &slant) +{ + QFile f(file); + bool foundName=false, + foundFamily=false; + int intSpacing=FC_PROPORTIONAL, +#ifndef KFI_FC_NO_WIDTHS + intWidth=FC_WIDTH_NORMAL, +#endif + intWeight=FC_WEIGHT_NORMAL, + intSlant=FC_SLANT_ROMAN, + intItalic=FC_SLANT_ROMAN; + + if(f.open(IO_ReadOnly)) + { + QTextStream stream(&f); + QString line; + bool inMetrics=false; + + while(!stream.atEnd()) + { + line=stream.readLine(); + line=line.simplifyWhiteSpace(); + + if(inMetrics) + { + if(0==line.find("FullName ")) + { + full=line.mid(9); +#ifndef KFI_FC_NO_WIDTHS + intWidth=strToWidth(full); +#endif + foundName=true; + } + else if(0==line.find("FamilyName ")) + { + family=line.mid(11); + foundFamily=true; + } + else if(0==line.find("Weight ")) + intWeight=strToWeight(line.mid(7)); + else if(0==line.find("ItalicAngle ")) + intSlant=0.0f==line.mid(12).toFloat() ? FC_SLANT_ROMAN : FC_SLANT_ITALIC; + else if(0==line.find("IsFixedPitch ")) + intSpacing=0==line.mid(13).find("false", 0, false) ? FC_PROPORTIONAL : FC_MONO; + else if(0==line.find("Notice ")) + foundry=getFoundry(line.mid(7).latin1()); + else if(0==line.find("StartCharMetrics")) + break; + } + else + if(0==line.find("StartFontMetrics")) + inMetrics=true; + }; + f.close(); + + if(!foundFamily && foundName) + { + family=full; + foundFamily=true; + } + + if(foundName && FC_SLANT_ITALIC==intItalic && (-1!=full.find("Oblique") || -1!=full.find("Slanted"))) + intItalic=FC_SLANT_OBLIQUE; + } + + if(foundName && foundFamily) + { + weight=KFI::CFcEngine::weightStr(intWeight, false); +#ifndef KFI_FC_NO_WIDTHS + width=KFI::CFcEngine::widthStr(intWidth, false); +#endif + slant=KFI::CFcEngine::slantStr(intSlant, false); + spacing=KFI::CFcEngine::spacingStr(intSpacing); + + if(foundry.isEmpty()) + foundry=i18n(KFI_UNKNOWN_FOUNDRY); + + return true; + } + + return false; +} + +typedef KGenericFactory<KFI::KFileFontPlugin> KFileFontPluginFactory; +K_EXPORT_COMPONENT_FACTORY(kfile_font, KFileFontPluginFactory("kfontinst")) + +namespace KFI +{ + +KFileFontPlugin::KFileFontPlugin(QObject *parent, const char *name, const QStringList& args) + : KFilePlugin(parent, name, args) +{ + KGlobal::locale()->insertCatalogue(KFI_CATALOGUE); + + addMimeType("application/x-font-ttf"), + addMimeType("application/x-font-type1"); + //addMimeType("application/x-font-speedo"); + addMimeType("application/x-font-bdf"); + addMimeType("application/x-font-pcf"); + //addMimeType("application/x-font-snf"); + addMimeType("application/x-font-otf"); + addMimeType("application/x-font-ttc"); + addMimeType("application/x-afm"); +} + +void KFileFontPlugin::addMimeType(const char *mime) +{ + KFileMimeTypeInfo *info=addMimeTypeInfo(mime); + KFileMimeTypeInfo::GroupInfo *group=addGroupInfo(info, "General", i18n("General")); + + addItemInfo(group, "Full", i18n("Full Name"), QVariant::String); + addItemInfo(group, "Family", i18n("Family"), QVariant::String); + addItemInfo(group, "Foundry", i18n("Foundry"), QVariant::String); + addItemInfo(group, "Weight", i18n("Weight"), QVariant::String); +#ifndef KFI_FC_NO_WIDTHS + addItemInfo(group, "Width", i18n("Width"), QVariant::String); +#endif + addItemInfo(group, "Spacing", i18n("Spacing"), QVariant::String); + addItemInfo(group, "Slant", i18n("Slant"), QVariant::String); +} + +bool KFileFontPlugin::readInfo(KFileMetaInfo& info, uint what) +{ + QString full, + lastFull, + family, + foundry, + weight, +#ifndef KFI_FC_NO_WIDTHS + width, +#endif + spacing, + slant, + fullAll, + familyAll, + foundryAll, + weightAll, +#ifndef KFI_FC_NO_WIDTHS + widthAll, +#endif + spacingAll, + slantAll; + KURL url(info.url()); + QString fName; + bool fontsProt = KFI_KIO_FONTS_PROTOCOL == url.protocol(), + fileProt = "file" == url.protocol(), + downloaded = false, + status = false; + + what=0; + + if(!fontsProt && !fileProt && KIO::NetAccess::download(url, fName, NULL)) + { + downloaded=true; + url=KURL(fName); + } + + if(downloaded || fontsProt || fileProt) + { + if("application/x-afm"==info.mimeType()) // Then fontconfig can't give us the data :-( + status=readAfm(url.path(), fullAll, familyAll, foundryAll, weightAll, +#ifndef KFI_FC_NO_WIDTHS + widthAll, +#endif + spacingAll, slantAll); + else + for(int face=0; face<10; ++face) // How to get num faces from fontconfig? don't know - so just try 1st 10... + { + if(itsEngine.getInfo(url, face, full, family, foundry, weight, +#ifndef KFI_FC_NO_WIDTHS + width, +#endif + spacing, slant) && + !full.isEmpty() && full!=lastFull) + { + addEntry(face, fullAll, full); + lastFull=full; + + if(KFileMetaInfo::Fastest!=what) + { + addEntry(face, familyAll, family); + if(0==face) + { + foundryAll=foundry; + + if(foundryAll.isEmpty()) + foundryAll=i18n(KFI_UNKNOWN_FOUNDRY); + else + { + // Try to make sure foundry is capitalised, and looks the same as that of + // any AFM. + foundryAll[0]=foundryAll[0].upper(); + + const FoundryMap *entry; + + for(entry=map; NULL!=entry->foundry; entry++) + if(foundryAll.length()==entry->len && foundryAll.contains(entry->foundry, false)) + { + foundryAll=entry->foundry; + break; + } + } + } + addEntry(face, weightAll, weight); +#ifndef KFI_FC_NO_WIDTHS + addEntry(face, widthAll, width); +#endif + addEntry(face, spacingAll, spacing); + addEntry(face, slantAll, slant); + } + status=true; + } + else + break; + } + + if(status) + { + KFileMetaInfoGroup group; + + group=appendGroup(info, "General"); + appendItem(group, "Full", fullAll); + + if(KFileMetaInfo::Fastest!=what) + { + appendItem(group, "Family", familyAll); + appendItem(group, "Foundry", foundryAll); + appendItem(group, "Weight", weightAll); +#ifndef KFI_FC_NO_WIDTHS + appendItem(group, "Width", widthAll); +#endif + appendItem(group, "Spacing", spacingAll); + appendItem(group, "Slant", slantAll); + } + } + + if(downloaded) + KIO::NetAccess::removeTempFile(fName); + } + + return status; +} + +} diff --git a/kcontrol/kfontinst/kfile-plugin/KFileFont.h b/kcontrol/kfontinst/kfile-plugin/KFileFont.h new file mode 100644 index 000000000..b06ab2a57 --- /dev/null +++ b/kcontrol/kfontinst/kfile-plugin/KFileFont.h @@ -0,0 +1,58 @@ +#ifndef __KFILE_FONT_H__ +#define __KFILE_FONT_H__ + +//////////////////////////////////////////////////////////////////////////////// +// +// Class Name : KFileFont +// Author : Craig Drummond +// Project : K Font Installer +// Creation Date : 20/03/2003 +// Version : $Revision$ $Date$ +// +//////////////////////////////////////////////////////////////////////////////// +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +//////////////////////////////////////////////////////////////////////////////// +// (C) Craig Drummond, 2003, 2004 +//////////////////////////////////////////////////////////////////////////////// + +#include <kfilemetainfo.h> +#include "FcEngine.h" + +namespace KFI +{ + +class KFileFontPlugin : public KFilePlugin +{ + public: + + KFileFontPlugin(QObject *parent, const char *name, const QStringList& args); + virtual ~KFileFontPlugin() {} + + bool readInfo(KFileMetaInfo& info, uint what = KFileMetaInfo::Fastest); + + private: + + void addMimeType(const char *mime); + + private: + + CFcEngine itsEngine; +}; + +} + +#endif diff --git a/kcontrol/kfontinst/kfile-plugin/Makefile.am b/kcontrol/kfontinst/kfile-plugin/Makefile.am new file mode 100644 index 000000000..7f136357f --- /dev/null +++ b/kcontrol/kfontinst/kfile-plugin/Makefile.am @@ -0,0 +1,13 @@ +kde_module_LTLIBRARIES = kfile_font.la + +kfile_font_la_SOURCES = KFileFont.cpp +kfile_font_la_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(LIBFREETYPE_RPATH) -module $(KDE_PLUGIN) +kfile_font_la_LIBADD = $(LIB_KIO) $(LIBFREETYPE_LIBS) ../lib/libkfontinst.la + +kdelnkdir = $(kde_servicesdir) +kde_services_DATA = kfile_font.desktop + +AM_CPPFLAGS = -I$(srcdir)/../lib -I$(srcdir)/../../fonts $(all_includes) $(LIBFREETYPE_CFLAGS) + +METASOURCES = AUTO +noinst_HEADERS = KFileFont.h diff --git a/kcontrol/kfontinst/kfile-plugin/kfile_font.desktop b/kcontrol/kfontinst/kfile-plugin/kfile_font.desktop new file mode 100644 index 000000000..7ac0a499f --- /dev/null +++ b/kcontrol/kfontinst/kfile-plugin/kfile_font.desktop @@ -0,0 +1,86 @@ +[Desktop Entry] +Type=Service +Name=Font Information +Name[af]=Skrif tipe Informasie +Name[ar]=معلومات المحرف +Name[az]=Yazı Növü Mə'lumatı +Name[be]=Інфармацыя аб шрыфце +Name[bg]=Информация за шрифт +Name[bn]=ফন্ট তথ্য +Name[br]=Titouroù diwar-benn ar font +Name[bs]=Informacije o fontu +Name[ca]=Informació de la lletra +Name[cs]=Informace o písmu +Name[csb]=Wëdowiédzô ò fòntach +Name[cy]=Gwybodaeth Ffont +Name[da]=Skrifttypeinformation +Name[de]=Schriftarteninformation +Name[el]=Πληροφορίες γραμματοσειράς +Name[eo]=Tiparinformo +Name[es]=Información del tipo de letra +Name[et]=Fondi info +Name[eu]=Letra-tipoei buruzko informazioa +Name[fa]=اطلاعات قلم +Name[fi]=Kirjasintiedot +Name[fr]=Informations sur les polices +Name[fy]=Lettertype-Ynformaasje +Name[ga]=Eolas Clófhoirne +Name[gl]=Información da Fonte +Name[he]=מידע גופנים +Name[hi]=फ़ॉन्ट जानकारी +Name[hr]=Podaci o fontu +Name[hu]=Betűtípus-jellemzők +Name[id]=Informasi Font +Name[is]=Leturupplýsingar +Name[it]=Informazioni caratteri +Name[ja]=フォント情報 +Name[ka]=ინფორმაცია ფონტის შესახებ +Name[kk]=Қаріп мәліметі +Name[km]=ព័ត៌មានពុម្ពអក្សរ +Name[ko]=연락처 정보 +Name[lo]=ຂໍ້ມູນຕ່າງໆ +Name[lt]=Šrifto(-ų) informacija +Name[lv]=Fontu Informācija +Name[mk]=Информации за фонтовите +Name[mn]=Бичиг-Мэдээлэл +Name[ms]=Maklumat Fon +Name[mt]=Informazzjoni dwar font +Name[nb]=Skriftinformasjon +Name[nds]=Schriftoort-Informatschoon +Name[ne]=फन्ट सूचना +Name[nl]=Lettertype-informatie +Name[nn]=Skriftinformasjon +Name[nso]=Tshedimoso ya Fonto +Name[pa]=ਫੋਂਟ ਜਾਣਕਾਰੀ +Name[pl]=Informacje o czcionkach +Name[pt]=Informação do Tipo de Letra +Name[pt_BR]=Informações sobre a Fonte +Name[ro]=Informații font +Name[ru]=Сведения о шрифте +Name[rw]=Amakuru y'Imyandikire +Name[se]=Fontadieđut +Name[sk]=Informácie o písmach +Name[sl]=Informacije o pisavi +Name[sr]=Информације о фонту +Name[sr@Latn]=Informacije o fontu +Name[sv]=Teckensnittsinformation +Name[ta]=எழுத்துரு தகவல் +Name[tg]=Иттилооти ҳарфҳо +Name[th]=ข้อมูลแบบอักษร +Name[tr]=Yazıtipi Bilgisi +Name[tt]=Yazu Turında +Name[uk]=Інформація про шрифти +Name[uz]=Shrift haqida maʼlumot +Name[uz@cyrillic]=Шрифт ҳақида маълумот +Name[ven]=Mafhungo a fontu +Name[vi]=Thông tin về Phông chữ +Name[wa]=Informåcion sol fonte +Name[xh]=Ulwazi Lohlobo lwamagama +Name[zh_CN]=字体信息 +Name[zh_TW]=字型資訊 +Name[zu]=Ulwazi lohlobo lwamagama +ServiceTypes=KFilePlugin +X-KDE-Library=kfile_font +MimeType=application/x-font-ttf;application/x-font-type1;application/x-font-bdf;application/x-font-pcf;application/x-font-otf;application/x-font-ttc;application/x-afm +PreferredGroups=General +PreferredItems=Full,Family,Foundry,Weight,Width,Spacing,Slant |