/* * (c) Copyright Ascensio System SIA 2010-2023 * * This program is a free software product. You can redistribute it and/or * modify it under the terms of the GNU Affero General Public License (AGPL) * version 3 as published by the Free Software Foundation. In accordance with * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect * that Ascensio System SIA expressly excludes the warranty of non-infringement * of any third-party rights. * * This program is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish * street, Riga, Latvia, EU, LV-1050. * * The interactive user interfaces in modified source and object code versions * of the Program must display Appropriate Legal Notices, as required under * Section 5 of the GNU AGPL version 3. * * Pursuant to Section 7(b) of the License you must retain the original Product * logo when distributing the program. Pursuant to Section 7(e) we decline to * grant you any rights under trademark law for use of our trademarks. * * All the Product's GUI elements, including illustrations and icon sets, as * well as technical writing content are licensed under the terms of the * Creative Commons Attribution-ShareAlike 4.0 International. See the License * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * */ #ifndef _BUILD_APPLICATIONFONTS_H_ #define _BUILD_APPLICATIONFONTS_H_ #define UNKNOWN_CHARSET 3 // для случаев, когда задано значение DEFAULT_CHARSET, но // на самом деле charset не учитывается #include #include #include "FontManager.h" #include namespace NSFonts { class CLibrary_private { public: FT_Library m_library; }; } class CFontRange { public: std::wstring Name; int Start; int End; }; class CFontListNamePicker { private: std::map m_mapNamesToIndex; std::vector > m_listLikes; public: CFontListNamePicker() { // 0 [Cambria Math] m_mapNamesToIndex.insert(std::pair(L"Cambria Math", 0)); m_mapNamesToIndex.insert(std::pair(L"Asana Math", 0)); m_mapNamesToIndex.insert(std::pair(L"XITS Math", 0)); m_mapNamesToIndex.insert(std::pair(L"Latin Modern", 0)); std::vector ar0; ar0.push_back(L"Cambria Math"); ar0.push_back(L"Asana Math"); ar0.push_back(L"XITS Math"); ar0.push_back(L"Latin Modern"); m_listLikes.push_back(ar0); // 1 [Symbol] m_mapNamesToIndex.insert(std::pair(L"Symbol", 1)); m_mapNamesToIndex.insert(std::pair(L"Wingdings", 1)); std::vector ar1; ar1.push_back(L"OpenSymbol"); m_listLikes.push_back(ar1); // 2 [Arial] m_mapNamesToIndex.insert(std::pair(L"Arial", 2)); m_mapNamesToIndex.insert(std::pair(L"Liberation Sans", 2)); m_mapNamesToIndex.insert(std::pair(L"Helvetica", 2)); m_mapNamesToIndex.insert(std::pair(L"Nimbus Sans L", 2)); std::vector ar2; ar2.push_back(L"Arial"); ar2.push_back(L"Liberation Sans"); ar2.push_back(L"Helvetica"); ar2.push_back(L"Nimbus Sans L"); m_listLikes.push_back(ar2); // 3 [Times New Roman] m_mapNamesToIndex.insert(std::pair(L"Times New Roman", 3)); m_mapNamesToIndex.insert(std::pair(L"Liberation Serif", 3)); std::vector ar3; ar3.push_back(L"Times New Roman"); ar3.push_back(L"Liberation Serif"); m_listLikes.push_back(ar3); // 4 [Courier New] m_mapNamesToIndex.insert(std::pair(L"Courier New", 4)); m_mapNamesToIndex.insert(std::pair(L"Liberation Mono", 4)); std::vector ar4; ar4.push_back(L"Courier New"); ar4.push_back(L"Liberation Mono"); m_listLikes.push_back(ar4); // 5 [Segoe] m_mapNamesToIndex.insert(std::pair(L"Segoe", 5)); m_mapNamesToIndex.insert(std::pair(L"Segoe UI", 5)); std::vector ar5; ar5.push_back(L"Segoe"); ar5.push_back(L"Segoe UI"); m_listLikes.push_back(ar5); // 6 [Cambria] m_mapNamesToIndex.insert(std::pair(L"Cambria", 6)); m_mapNamesToIndex.insert(std::pair(L"Caladea", 6)); std::vector ar6; ar6.push_back(L"Cambria"); ar6.push_back(L"Caladea"); m_listLikes.push_back(ar6); } bool IsLikeFonts(const std::wstring& name, const std::wstring& req) { std::map::iterator pos = m_mapNamesToIndex.find(req); if (pos == m_mapNamesToIndex.end()) return false; const std::vector& names = m_listLikes.at(pos->second); for (std::vector::const_iterator iter = names.begin(); iter != names.end(); iter++) { if (name == *iter) return true; } return false; } int CheckEqualsFonts(const std::wstring& name, const std::wstring& req) { int lenName = (int)name.length(); int lenReq = (int)req.length(); if (lenName == lenReq) { const wchar_t* name_str = name.c_str(); const wchar_t* req_str = req.c_str(); int i = 0; wchar_t nameChar = 0; wchar_t reqChar = 0; while (i < lenName) { nameChar = *name_str++; reqChar = *req_str++; if (nameChar >= 'A' && nameChar <= 'Z') nameChar += ('a' - 'A'); if (reqChar >= 'A' && reqChar <= 'Z') reqChar += ('a' - 'A'); if (nameChar != reqChar) break; } if (i == lenName) return 1500; } return IsEqualsFontsAdvanced(name, req) ? 3000 : 10000; } // не учитываем регистр (латиница) и знаки /-/ /,/ static bool IsEqualsFontsAdvanced(const std::wstring& name, const std::wstring& req, bool* bIsOneInAnother = NULL) { int lenName = (int)name.length(); int lenReq = (int)req.length(); const wchar_t* name_str = name.c_str(); const wchar_t* req_str = req.c_str(); int curName = 0; int curReq = 0; wchar_t curNameChar = 0; wchar_t curReqChar = 0; while (true) { curNameChar = 0; while (curName < lenName) { curNameChar = *name_str++; ++curName; if (curNameChar == '-' || curNameChar == ' ' || curNameChar == ',') continue; if (curNameChar >= 'A' && curNameChar <= 'Z') curNameChar += ('a' - 'A'); break; } curReqChar = 0; while (curReq < lenReq) { curReqChar = *req_str++; ++curReq; if (curReqChar == '-' || curReqChar == ' ' || curReqChar == ',') continue; if (curReqChar >= 'A' && curReqChar <= 'Z') curReqChar += ('a' - 'A'); break; } if (curNameChar != curReqChar) { if (bIsOneInAnother) *bIsOneInAnother = (0 == curNameChar || 0 == curReqChar) ? true : false; return false; } else if (0 == curNameChar) break; } return true; } }; class CFontList : public NSFonts::IFontList { private: std::vector m_pList; std::wstring m_sDirectory; static CFontListNamePicker m_oPicker; CFontRange* m_pRanges; int m_nRangesCount; std::list m_listRanges; // последние использованные (найденные) public: CFontList() { m_pRanges = NULL; m_nRangesCount = 0; } ~CFontList() { for ( std::vector::iterator iter = m_pList.begin(); iter != m_pList.end(); iter++ ) { NSFonts::CFontInfo* pTemp = *iter; RELEASEOBJECT(pTemp); } m_pList.clear(); RELEASEARRAYOBJECTS(m_pRanges); } class CFontListToBufferSerializer { public: std::wstring m_strDirectory; bool m_bIsOnlynames; int m_nVersion; public: CFontListToBufferSerializer(const std::wstring& sDir, const bool& bIsOnlynames, const int& nVer = 2) { m_strDirectory = sDir; m_bIsOnlynames = bIsOnlynames; m_nVersion = nVer; } }; virtual std::vector* GetFonts() { return &m_pList; } private: int GetCharsetPenalty(UINT ulCandRanges[6], unsigned char unReqCharset); int GetSigPenalty(UINT ulCandRanges[6], UINT ulReqRanges[6], double dRangeWeight = 1, double dRangeWeightSuferflouous = 0); int GetFixedPitchPenalty(INT bCandFixed, INT bReqFixed); int GetFaceNamePenalty(const std::wstring& sCandName, const std::wstring& sReqName, bool bIsUseNamePicker = false); int GetFaceNamePenalty2(NSFonts::CFontInfo* pInfo, const std::wstring& sReqName, bool bIsUseNamePicker = false); int GetFamilyUnlikelyPenalty(SHORT nCandFamilyClass, SHORT nReqFamilyClass); int GetFamilyUnlikelyPenalty(int nCandFamilyClass, std::wstring sReqFamilyClass); int GetWidthPenalty(USHORT usCandWidth, USHORT usReqWidth); int GetWeightPenalty(USHORT usCandWeight, USHORT usReqWeight); int GetItalicPenalty(INT bCandItalic, INT bReqItalic); int GetBoldPenalty(INT bCandBold, INT bReqBold); int GetFontFormatPenalty(NSFonts::EFontFormat eCandFormat, NSFonts::EFontFormat eReqFormat); int GetPanosePenalty(BYTE *pCandPanose, BYTE *pReqPanose); int GetAvgWidthPenalty(SHORT shCandWidth, SHORT shReqWidth); int GetAscentPenalty(SHORT shCandAscent, SHORT shReqAscent); int GetDescentPenalty(SHORT shCandDescent, SHORT shReqDescent); int GetLineGapPenalty(SHORT shCandLineGap, SHORT shReqLineGap); int GetXHeightPenalty(SHORT shCandXHeight, SHORT shReqXHeight); int GetCapHeightPenalty(SHORT shCandCapHeight, SHORT shReqCapHeight); bool CheckEmbeddingRights(const USHORT* ushRights, const USHORT& fsType); void Add(FT_Library pLibrary, FT_Parameter* pParams, const std::wstring& sFontPath, CFontStream* pStream, int nFlag); public: static NSFonts::EFontFormat GetFontFormat(FT_Face pFace); virtual void ToBuffer(BYTE** pDstData, LONG* pLen, NSFonts::CFontListToBufferSerializer& oSerializer); public: void LoadFromArrayFiles (std::vector& arrFiles, int nFlag = 0); void LoadFromFolder (const std::wstring& strDirectory); bool CheckLoadFromFolderBin(const std::wstring& strDirectory); void CheckLoadFromSelectionBin(const std::wstring& strDirectory, BYTE* pData, DWORD len); void Add (const std::wstring& sFontPath, NSFonts::IFontStream* pStream, int nFlag = 0); void Add (NSFonts::CFontInfo* pInfo); NSFonts::CFontInfo* GetByParams (NSFonts::CFontSelectFormat& oSelect, bool bIsDictionaryUse = true); std::vector GetAllByName (const std::wstring& strFontName); std::wstring GetFontBySymbol(int symbol); void InitializeRanges(unsigned char* data); }; class CApplicationFonts : public NSFonts::IApplicationFonts { private: CApplicationFontStreams m_oStreams; CFontsCache m_oCache; CFontList m_oList; public: CApplicationFonts(); ~CApplicationFonts(); public: NSFonts::IFontsCache* GetCache(); NSFonts::IFontList* GetList(); NSFonts::IApplicationFontStreams* GetStreams(); void InitializeFromFolder(std::wstring strFolder, bool bIsCheckSelection = true); void Initialize(bool bIsCheckSelection = true); void InitializeFromBin(BYTE* pData, unsigned int nLen); void InitializeRanges(unsigned char* data); std::vector GetSetupFontFiles(const bool& bIsUseUserFonts = true); void InitializeFromArrayFiles(std::vector& files, int nFlag = 0); #if defined(_WIN32) || defined (_WIN64) void InitFromReg(); #endif #if defined(_MAC) && !defined(_IOS) std::set GetInstalledFontsMac(); #endif NSFonts::IFontManager* GenerateFontManager(); std::wstring GetFontBySymbol(int symbol); }; #endif