File indexing completed on 2024-12-01 05:19:21

0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 // SPDX-FileCopyrightText: 2010 Dominik Seichter <domseichter@web.de>
0003 
0004 #include "fontplugin.h"
0005 #include "batchrenamer.h"
0006 #include "tokenhelpdialog.h"
0007 
0008 #include <ft2build.h>
0009 #include FT_FREETYPE_H
0010 
0011 #include <KLocalizedString>
0012 
0013 FontPlugin::FontPlugin(PluginLoader *loader)
0014     : FilePlugin(loader)
0015 {
0016     this->addSupportedToken("fontpostscript");
0017     this->addSupportedToken("fontfamily");
0018     this->addSupportedToken("fontstyle");
0019     m_help.append("[fontPostscript]" + TokenHelpDialog::getTokenSeparator() + i18n("Insert the PostScript name for Type1 and TrueType fonts."));
0020     m_help.append("[fontFamily]" + TokenHelpDialog::getTokenSeparator() + i18n("Insert the (usually English) name of the font family."));
0021     m_help.append("[fontStyle]" + TokenHelpDialog::getTokenSeparator() + i18n("Insert the (usually English) name of the font style."));
0022 
0023     m_name = i18n("Font (FreeType2) Plugin");
0024     m_comment = i18n("<qt>This plugin supports reading tags from "
0025                      "font files.</qt>");
0026 
0027     m_icon = "application-x-font-ttf";
0028 
0029     FT_Error error = FT_Init_FreeType(&m_library);
0030     if (error) {
0031         qDebug("Freetype initialization error %i.", error);
0032         m_library = nullptr;
0033     }
0034 }
0035 
0036 FontPlugin::~FontPlugin()
0037 {
0038     FT_Done_FreeType(m_library);
0039     m_library = nullptr;
0040 
0041 }
0042 
0043 QString FontPlugin::processFile(BatchRenamer *b, int index, const QString &filenameOrToken, EPluginType)
0044 {
0045     QString token(filenameOrToken.toLower());
0046     QString filename = (*b->files())[index].srcUrl().path();
0047 
0048     if (!this->supports(token)) {
0049         return QString("");
0050     }
0051 
0052     if (!m_library) {
0053         return QString("Cannot initialize FreeType");
0054     }
0055 
0056     FT_Face face;
0057     FT_Error error = FT_New_Face(m_library,
0058                                  filename.toUtf8().data(),
0059                                  0,
0060                                  &face);
0061     QString result = QString("");
0062 
0063     if (error == FT_Err_Unknown_File_Format) {
0064         face = nullptr;
0065         result = QString("Unknown font file format error: %1").arg(error);
0066     } else if (error) {
0067         face = nullptr;
0068         result = QString("Unknown error: %1.").arg(error);
0069     } else {
0070         if (token == "fontpostscript") {
0071             result = QString::fromLocal8Bit(FT_Get_Postscript_Name(face));
0072         } else if (token == "fontfamily" && face->family_name) {
0073             result = QString::fromLocal8Bit(face->family_name);
0074         } else if (token == "fontstyle" && face->style_name) {
0075             result = QString::fromLocal8Bit(face->style_name);
0076         }
0077     }
0078 
0079     if (face) {
0080         FT_Done_Face(face);
0081     }
0082 
0083     return result;
0084 }