diff options
Diffstat (limited to '')
-rw-r--r-- | vcl/inc/font/DirectFontSubstitution.hxx | 68 | ||||
-rw-r--r-- | vcl/inc/font/FeatureCollector.hxx | 52 | ||||
-rw-r--r-- | vcl/inc/font/FontSelectPattern.hxx | 86 | ||||
-rw-r--r-- | vcl/inc/font/OpenTypeFeatureDefinitionList.hxx | 41 | ||||
-rw-r--r-- | vcl/inc/font/OpenTypeFeatureStrings.hrc | 103 | ||||
-rw-r--r-- | vcl/inc/font/PhysicalFontCollection.hxx | 103 | ||||
-rw-r--r-- | vcl/inc/font/PhysicalFontFace.hxx | 85 | ||||
-rw-r--r-- | vcl/inc/font/PhysicalFontFaceCollection.hxx | 50 | ||||
-rw-r--r-- | vcl/inc/font/PhysicalFontFamily.hxx | 115 | ||||
-rw-r--r-- | vcl/inc/font/fontsubstitution.hxx | 70 | ||||
-rw-r--r-- | vcl/inc/fontattributes.hxx | 126 | ||||
-rw-r--r-- | vcl/inc/fontinstance.hxx | 158 | ||||
-rw-r--r-- | vcl/inc/fontsubset.hxx | 97 |
13 files changed, 1154 insertions, 0 deletions
diff --git a/vcl/inc/font/DirectFontSubstitution.hxx b/vcl/inc/font/DirectFontSubstitution.hxx new file mode 100644 index 000000000..4abfb8832 --- /dev/null +++ b/vcl/inc/font/DirectFontSubstitution.hxx @@ -0,0 +1,68 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <sal/config.h> + +#include <rtl/ustring.hxx> + +#include <vcl/rendercontext/AddFontSubstituteFlags.hxx> + +#include <font/fontsubstitution.hxx> + +#include <string> +#include <string_view> +#include <vector> + +namespace vcl::font +{ +struct FontSubstEntry +{ + FontSubstEntry(std::u16string_view rFontName, std::u16string_view rSubstFontName, + AddFontSubstituteFlags nSubstFlags) + : maSearchName(GetEnglishSearchFontName(rFontName)) + , maSearchReplaceName(GetEnglishSearchFontName(rSubstFontName)) + , mnFlags(nSubstFlags) + { + } + + OUString maSearchName; + OUString maSearchReplaceName; + AddFontSubstituteFlags mnFlags; +}; + +/** DirectFontSubstitution is for Tools->Options->FontReplacement and PsPrinter substitutions + The class is just a simple port of the unmaintainable manual-linked-list based mechanism + */ +// TODO: get rid of this class when the Tools->Options->FontReplacement tabpage is gone for good +class DirectFontSubstitution final : public FontSubstitution +{ +private: + std::vector<FontSubstEntry> maFontSubstList; + +public: + void AddFontSubstitute(const OUString& rFontName, const OUString& rSubstName, + AddFontSubstituteFlags nFlags); + void RemoveFontsSubstitute(); + bool FindFontSubstitute(OUString& rSubstName, std::u16string_view rFontName) const; +}; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/vcl/inc/font/FeatureCollector.hxx b/vcl/inc/font/FeatureCollector.hxx new file mode 100644 index 000000000..9148048f1 --- /dev/null +++ b/vcl/inc/font/FeatureCollector.hxx @@ -0,0 +1,52 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + */ + +#ifndef INCLUDED_VCL_INC_FONT_FEATURECOLLECTOR_HXX +#define INCLUDED_VCL_INC_FONT_FEATURECOLLECTOR_HXX + +#include <vcl/font/Feature.hxx> +#include <hb.h> +#include <i18nlangtag/lang.h> + +namespace vcl::font +{ +class FeatureCollector +{ +private: + hb_face_t* m_pHbFace; + std::vector<vcl::font::Feature>& m_rFontFeatures; + LanguageType m_eLanguageType; + +public: + FeatureCollector(hb_face_t* pHbFace, std::vector<vcl::font::Feature>& rFontFeatures, + LanguageType eLanguageType) + : m_pHbFace(pHbFace) + , m_rFontFeatures(rFontFeatures) + , m_eLanguageType(eLanguageType) + { + } + +private: + void collectForLanguage(hb_tag_t aTableTag, sal_uInt32 nScript, hb_tag_t aScriptTag, + sal_uInt32 nLanguage, hb_tag_t aLanguageTag); + + void collectForScript(hb_tag_t aTableTag, sal_uInt32 nScript, hb_tag_t aScriptTag); + void collectForTable(hb_tag_t aTableTag); + bool collectGraphite(); + +public: + bool collect(); +}; + +} // namespace vcl::font + +#endif // INCLUDED_VCL_INC_FONT_FEATURECOLLECTOR_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/font/FontSelectPattern.hxx b/vcl/inc/font/FontSelectPattern.hxx new file mode 100644 index 000000000..7cf1506b8 --- /dev/null +++ b/vcl/inc/font/FontSelectPattern.hxx @@ -0,0 +1,86 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <i18nlangtag/lang.h> +#include <tools/degree.hxx> + +#include <vcl/vclenum.hxx> + +#include <fontattributes.hxx> + +#include <ostream> + +namespace vcl { class Font; } + +class LogicalFontInstance; +class Size; + +namespace vcl::font +{ +class PhysicalFontFace; + +class VCL_DLLPUBLIC FontSelectPattern : public FontAttributes +{ +public: + FontSelectPattern(const vcl::Font&, const OUString& rSearchName, + const Size&, float fExactHeight, bool bNonAntialias = false); +#ifdef _WIN32 + FontSelectPattern( const PhysicalFontFace&, const Size&, + float fExactHeight, int nOrientation, bool bVertical ); +#endif + + size_t hashCode() const; + bool operator==(const FontSelectPattern& rOther) const; + bool operator!=(const FontSelectPattern& rOther) const + { + return !(*this == rOther); + } + + static const char FEAT_PREFIX; + static const char FEAT_SEPARATOR; + +public: + OUString maTargetName; // name of the font name token that is chosen + OUString maSearchName; // name of the font that matches best + int mnWidth; // width of font in pixel units + int mnHeight; // height of font in pixel units + float mfExactHeight; // requested height (in pixels with subpixel details) + Degree10 mnOrientation; // text orientation in 1/10 degree (0-3600) + LanguageType meLanguage; // text language + bool mbVertical; // vertical mode of requested font + bool mbNonAntialiased; // true if antialiasing is disabled + + bool mbEmbolden; // Force emboldening + ItalicMatrix maItalicMatrix; // Force matrix for slant +}; +} + +template< typename charT, typename traits > +inline std::basic_ostream<charT, traits> & operator <<( + std::basic_ostream<charT, traits> & stream, const vcl::font::FontSelectPattern & rFSP) +{ + stream << (rFSP.maTargetName.isEmpty() ? "<default>" : rFSP.maTargetName) + << " (" << rFSP.maSearchName << ") w: " << rFSP.mnWidth << " h: " + << rFSP.mnHeight << " alias: " << rFSP.mbNonAntialiased; + return stream; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/font/OpenTypeFeatureDefinitionList.hxx b/vcl/inc/font/OpenTypeFeatureDefinitionList.hxx new file mode 100644 index 000000000..52dbcfb5b --- /dev/null +++ b/vcl/inc/font/OpenTypeFeatureDefinitionList.hxx @@ -0,0 +1,41 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#pragma once + +#include <vcl/dllapi.h> +#include <vcl/font/Feature.hxx> +#include <vector> +#include <unordered_map> + +namespace vcl::font +{ +class OpenTypeFeatureDefinitionListPrivate +{ +private: + std::vector<FeatureDefinition> m_aFeatureDefinition; + std::unordered_map<sal_uInt32, size_t> m_aCodeToIndex; + std::vector<sal_uInt32> m_aRequiredFeatures; + + void init(); + + static bool isSpecialFeatureCode(sal_uInt32 nFeatureCode); + static FeatureDefinition handleSpecialFeatureCode(sal_uInt32 nFeatureCode); + +public: + OpenTypeFeatureDefinitionListPrivate(); + FeatureDefinition getDefinition(sal_uInt32 nFeatureCode); + bool isRequired(sal_uInt32 nFeatureCode); +}; + +VCL_DLLPUBLIC OpenTypeFeatureDefinitionListPrivate& OpenTypeFeatureDefinitionList(); + +} // namespace vcl::font + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/font/OpenTypeFeatureStrings.hrc b/vcl/inc/font/OpenTypeFeatureStrings.hrc new file mode 100644 index 000000000..15876c956 --- /dev/null +++ b/vcl/inc/font/OpenTypeFeatureStrings.hrc @@ -0,0 +1,103 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_VCL_INC_FONT_OPENTYPEFEATRESTRINGS_HRC +#define INCLUDED_VCL_INC_FONT_OPENTYPEFEATRESTRINGS_HRC + +#define NC_(Context, String) TranslateId(Context, reinterpret_cast<char const *>(u8##String)) + +#define STR_FONT_FEATURE_ID_AALT NC_("STR_FONT_FEATURE_ID_AALT", "Access All Alternates") +#define STR_FONT_FEATURE_ID_AFRC NC_("STR_FONT_FEATURE_ID_AFRC", "Alternative (Vertical) Fractions") +#define STR_FONT_FEATURE_ID_ALIG NC_("STR_FONT_FEATURE_ID_ALIG", "Ancient Ligatures") +#define STR_FONT_FEATURE_ID_C2PC NC_("STR_FONT_FEATURE_ID_C2PC", "Capitals to Petite Capitals") +#define STR_FONT_FEATURE_ID_C2SC NC_("STR_FONT_FEATURE_ID_C2SC", "Capitals to Small Capitals") +#define STR_FONT_FEATURE_ID_CALT NC_("STR_FONT_FEATURE_ID_CALT", "Contextual Alternates") +#define STR_FONT_FEATURE_ID_CASE NC_("STR_FONT_FEATURE_ID_CASE", "Case-Sensitive Forms") +#define STR_FONT_FEATURE_ID_CLIG NC_("STR_FONT_FEATURE_ID_CLIG", "Contextual Ligatures") +#define STR_FONT_FEATURE_ID_CPCT NC_("STR_FONT_FEATURE_ID_CPCT", "Centered CJK Punctuation") +#define STR_FONT_FEATURE_ID_CPSP NC_("STR_FONT_FEATURE_ID_CPSP", "Capital Spacing") +#define STR_FONT_FEATURE_ID_CSWH NC_("STR_FONT_FEATURE_ID_CSWH", "Contextual Swash") +#define STR_FONT_FEATURE_ID_CVXX NC_("STR_FONT_FEATURE_ID_CVXX", "Character Variant %1") +#define STR_FONT_FEATURE_ID_DCAP NC_("STR_FONT_FEATURE_ID_DCAP", "Drop Caps") +#define STR_FONT_FEATURE_ID_DLIG NC_("STR_FONT_FEATURE_ID_DLIG", "Discretionary Ligatures") +#define STR_FONT_FEATURE_ID_DNOM NC_("STR_FONT_FEATURE_ID_DNOM", "Denominators") +#define STR_FONT_FEATURE_ID_DPNG NC_("STR_FONT_FEATURE_ID_DPNG", "Diphthongs (Obsolete)") +#define STR_FONT_FEATURE_ID_EXPT NC_("STR_FONT_FEATURE_ID_EXPT", "Expert Forms") +#define STR_FONT_FEATURE_ID_FALT NC_("STR_FONT_FEATURE_ID_FALT", "Final Glyph on Line Alternates") +#define STR_FONT_FEATURE_ID_FRAC NC_("STR_FONT_FEATURE_ID_FRAC", "Fraction style:") +#define STR_FONT_FEATURE_ID_FWID NC_("STR_FONT_FEATURE_ID_FWID", "Full Widths") +#define STR_FONT_FEATURE_ID_HALT NC_("STR_FONT_FEATURE_ID_HALT", "Alternate Half Widths") +#define STR_FONT_FEATURE_ID_HIST NC_("STR_FONT_FEATURE_ID_HIST", "Historical Forms") +#define STR_FONT_FEATURE_ID_HKNA NC_("STR_FONT_FEATURE_ID_HKNA", "Horizontal Kana Alternates") +#define STR_FONT_FEATURE_ID_HLIG NC_("STR_FONT_FEATURE_ID_HLIG", "Historical Ligatures") +#define STR_FONT_FEATURE_ID_HNGL NC_("STR_FONT_FEATURE_ID_HNGL", "Hanja to Hangul (Obsolete)") +#define STR_FONT_FEATURE_ID_HOJO NC_("STR_FONT_FEATURE_ID_HOJO", "Hojo Kanji Forms (JIS X 0212-1990 Kanji Forms)") +#define STR_FONT_FEATURE_ID_HWID NC_("STR_FONT_FEATURE_ID_HWID", "Half Widths") +#define STR_FONT_FEATURE_ID_ITAL NC_("STR_FONT_FEATURE_ID_ITAL", "Italics") +#define STR_FONT_FEATURE_ID_JALT NC_("STR_FONT_FEATURE_ID_JALT", "Justification Alternates") +#define STR_FONT_FEATURE_ID_JP04 NC_("STR_FONT_FEATURE_ID_JP04", "JIS2004 Forms") +#define STR_FONT_FEATURE_ID_JP78 NC_("STR_FONT_FEATURE_ID_JP78", "JIS78 Forms") +#define STR_FONT_FEATURE_ID_JP83 NC_("STR_FONT_FEATURE_ID_JP83", "JIS83 Forms") +#define STR_FONT_FEATURE_ID_JP90 NC_("STR_FONT_FEATURE_ID_JP90", "JIS90 Forms") +#define STR_FONT_FEATURE_ID_KERN NC_("STR_FONT_FEATURE_ID_KERN", "Horizontal Kerning") +#define STR_FONT_FEATURE_ID_LFBD NC_("STR_FONT_FEATURE_ID_LFBD", "Left Bounds") +#define STR_FONT_FEATURE_ID_LIGA NC_("STR_FONT_FEATURE_ID_LIGA", "Standard Ligatures") +#define STR_FONT_FEATURE_ID_LNUM NC_("STR_FONT_FEATURE_ID_LNUM", "Lining Figures") +#define STR_FONT_FEATURE_ID_MGRK NC_("STR_FONT_FEATURE_ID_MGRK", "Mathematical Greek") +#define STR_FONT_FEATURE_ID_NALT NC_("STR_FONT_FEATURE_ID_NALT", "Alternate Annotation Forms") +#define STR_FONT_FEATURE_ID_NLCK NC_("STR_FONT_FEATURE_ID_NLCK", "NLC Kanji Forms") +#define STR_FONT_FEATURE_ID_NUMR NC_("STR_FONT_FEATURE_ID_NUMR", "Numerators") +#define STR_FONT_FEATURE_ID_ONUM NC_("STR_FONT_FEATURE_ID_ONUM", "Oldstyle Figures") +#define STR_FONT_FEATURE_ID_OPBD NC_("STR_FONT_FEATURE_ID_OPBD", "Optical Bounds") +#define STR_FONT_FEATURE_ID_ORDN NC_("STR_FONT_FEATURE_ID_ORDN", "Ordinals") +#define STR_FONT_FEATURE_ID_ORNM NC_("STR_FONT_FEATURE_ID_ORNM", "Ornaments") +#define STR_FONT_FEATURE_ID_PALT NC_("STR_FONT_FEATURE_ID_PALT", "Proportional Alternate Metrics") +#define STR_FONT_FEATURE_ID_PCAP NC_("STR_FONT_FEATURE_ID_PCAP", "Lowercase to Petite Capitals") +#define STR_FONT_FEATURE_ID_PKNA NC_("STR_FONT_FEATURE_ID_PKNA", "Proportional Kana") +#define STR_FONT_FEATURE_ID_PNUM NC_("STR_FONT_FEATURE_ID_PNUM", "Proportional Numbers") +#define STR_FONT_FEATURE_ID_PWID NC_("STR_FONT_FEATURE_ID_PWID", "Proportional Widths") +#define STR_FONT_FEATURE_ID_QWID NC_("STR_FONT_FEATURE_ID_QWID", "Quarter Widths") +#define STR_FONT_FEATURE_ID_RTBD NC_("STR_FONT_FEATURE_ID_RTBD", "Right Bounds") +#define STR_FONT_FEATURE_ID_RUBY NC_("STR_FONT_FEATURE_ID_RUBY", "Ruby Notation Forms") +#define STR_FONT_FEATURE_ID_SALT NC_("STR_FONT_FEATURE_ID_SALT", "Stylistic Alternates") +#define STR_FONT_FEATURE_ID_SINF NC_("STR_FONT_FEATURE_ID_SINF", "Scientific Inferiors") +#define STR_FONT_FEATURE_ID_SMCP NC_("STR_FONT_FEATURE_ID_SMCP", "Lowercase to Small Capitals") +#define STR_FONT_FEATURE_ID_SMPL NC_("STR_FONT_FEATURE_ID_SMPL", "Simplified Forms") +#define STR_FONT_FEATURE_ID_SSXX NC_("STR_FONT_FEATURE_ID_SSXX", "Stylistic Set %1") +#define STR_FONT_FEATURE_ID_SUBS NC_("STR_FONT_FEATURE_ID_SUBS", "Subscript") +#define STR_FONT_FEATURE_ID_SUPS NC_("STR_FONT_FEATURE_ID_SUPS", "Superscript") +#define STR_FONT_FEATURE_ID_SWSH NC_("STR_FONT_FEATURE_ID_SWSH", "Swash") +#define STR_FONT_FEATURE_ID_TITL NC_("STR_FONT_FEATURE_ID_TITL", "Titling") +#define STR_FONT_FEATURE_ID_TNAM NC_("STR_FONT_FEATURE_ID_TNAM", "Traditional Name Forms") +#define STR_FONT_FEATURE_ID_TNUM NC_("STR_FONT_FEATURE_ID_TNUM", "Tabular Numbers") +#define STR_FONT_FEATURE_ID_TRAD NC_("STR_FONT_FEATURE_ID_TRAD", "Traditional Forms") +#define STR_FONT_FEATURE_ID_TWID NC_("STR_FONT_FEATURE_ID_TWID", "Third Widths") +#define STR_FONT_FEATURE_ID_UNIC NC_("STR_FONT_FEATURE_ID_UNIC", "Unicase") +#define STR_FONT_FEATURE_ID_VALT NC_("STR_FONT_FEATURE_ID_VALT", "Alternate Vertical Metrics") +#define STR_FONT_FEATURE_ID_VHAL NC_("STR_FONT_FEATURE_ID_VHAL", "Alternate Vertical Half Metrics") +#define STR_FONT_FEATURE_ID_VKNA NC_("STR_FONT_FEATURE_ID_VKNA", "Vertical Kana Alternates") +#define STR_FONT_FEATURE_ID_VKRN NC_("STR_FONT_FEATURE_ID_VKRN", "Vertical Kerning") +#define STR_FONT_FEATURE_ID_VPAL NC_("STR_FONT_FEATURE_ID_VPAL", "Proportional Alternate Vertical Metrics") +#define STR_FONT_FEATURE_ID_VRT2 NC_("STR_FONT_FEATURE_ID_VRT2", "Vertical Alternates and Rotation") +#define STR_FONT_FEATURE_ID_VRTR NC_("STR_FONT_FEATURE_ID_VRTR", "Vertical Alternates for Rotation") +#define STR_FONT_FEATURE_ID_ZERO NC_("STR_FONT_FEATURE_ID_ZERO", "Slashed Zero") + +#endif // INCLUDED_VCL_INC_STRINGS_HRC + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/font/PhysicalFontCollection.hxx b/vcl/inc/font/PhysicalFontCollection.hxx new file mode 100644 index 000000000..22ceaf8f0 --- /dev/null +++ b/vcl/inc/font/PhysicalFontCollection.hxx @@ -0,0 +1,103 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <sal/config.h> + +#include <vcl/dllapi.h> + +#include <fontinstance.hxx> + +#include "PhysicalFontFamily.hxx" + +#include <array> +#include <string_view> + +#define MAX_GLYPHFALLBACK 16 + +namespace vcl::font +{ +class GlyphFallbackFontSubstitution; +class PreMatchFontSubstitution; +} + +// TODO: merge with ImplFontCache +// TODO: rename to LogicalFontManager + +namespace vcl::font +{ + +class VCL_PLUGIN_PUBLIC PhysicalFontCollection final +{ +public: + explicit PhysicalFontCollection(); + ~PhysicalFontCollection(); + + // fill the list with device font faces + void Add( vcl::font::PhysicalFontFace* ); + void Clear(); + int Count() const { return maPhysicalFontFamilies.size(); } + + // find the device font family + vcl::font::PhysicalFontFamily* FindFontFamily( std::u16string_view rFontName ) const; + vcl::font::PhysicalFontFamily* FindOrCreateFontFamily( const OUString &rFamilyName ); + vcl::font::PhysicalFontFamily* FindFontFamily( vcl::font::FontSelectPattern& ) const; + vcl::font::PhysicalFontFamily* FindFontFamilyByTokenNames(std::u16string_view rTokenStr) const; + vcl::font::PhysicalFontFamily* FindFontFamilyByAttributes(ImplFontAttrs nSearchType, FontWeight, FontWidth, + FontItalic, const OUString& rSearchFamily) const; + + // suggest fonts for glyph fallback + vcl::font::PhysicalFontFamily* GetGlyphFallbackFont( vcl::font::FontSelectPattern&, + LogicalFontInstance* pLogicalFont, + OUString& rMissingCodes, int nFallbackLevel ) const; + + // prepare platform specific font substitutions + void SetPreMatchHook( vcl::font::PreMatchFontSubstitution* ); + void SetFallbackHook( vcl::font::GlyphFallbackFontSubstitution* ); + + // misc utilities + std::shared_ptr<PhysicalFontCollection> Clone() const; + std::unique_ptr<vcl::font::PhysicalFontFaceCollection> GetFontFaceCollection() const; + +private: + mutable bool mbMatchData; // true if matching attributes are initialized + + typedef std::unordered_map<OUString, std::unique_ptr<vcl::font::PhysicalFontFamily>> PhysicalFontFamilies; + PhysicalFontFamilies maPhysicalFontFamilies; + + vcl::font::PreMatchFontSubstitution* mpPreMatchHook; // device specific prematch substitution + vcl::font::GlyphFallbackFontSubstitution* mpFallbackHook; // device specific glyph fallback substitution + + mutable std::unique_ptr<std::array<vcl::font::PhysicalFontFamily*,MAX_GLYPHFALLBACK>> mpFallbackList; + mutable int mnFallbackCount; + + void ImplInitMatchData() const; + void ImplInitGenericGlyphFallback() const; + + vcl::font::PhysicalFontFamily* ImplFindFontFamilyBySearchName( const OUString& ) const; + vcl::font::PhysicalFontFamily* ImplFindFontFamilyBySubstFontAttr( const utl::FontNameAttr& ) const; + + vcl::font::PhysicalFontFamily* ImplFindFontFamilyOfDefaultFont() const; + +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/vcl/inc/font/PhysicalFontFace.hxx b/vcl/inc/font/PhysicalFontFace.hxx new file mode 100644 index 000000000..bd3093562 --- /dev/null +++ b/vcl/inc/font/PhysicalFontFace.hxx @@ -0,0 +1,85 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <sal/config.h> + +#include <salhelper/simplereferenceobject.hxx> +#include <rtl/ref.hxx> +#include <tools/long.hxx> +#include <vcl/dllapi.h> +#include <vcl/fontcharmap.hxx> + +#include <fontattributes.hxx> + +class LogicalFontInstance; +struct FontMatchStatus; +namespace vcl::font +{ +class FontSelectPattern; +} + +namespace vcl +{ +struct FontCapabilities; +class PhysicalFontFamily; +} + +namespace vcl::font +{ +class FontSelectPattern; + +struct FontMatchStatus +{ +public: + int mnFaceMatch; + const OUString* mpTargetStyleName; +}; + +// TODO: no more direct access to members +// TODO: get rid of height/width for scalable fonts +// TODO: make cloning cheaper + +/** + * abstract base class for physical font faces + * + * It acts as a factory for its corresponding LogicalFontInstances and + * can be extended to cache device and font instance specific data. + */ +class VCL_PLUGIN_PUBLIC PhysicalFontFace : public FontAttributes, public salhelper::SimpleReferenceObject +{ +public: + virtual rtl::Reference<LogicalFontInstance> CreateFontInstance(const vcl::font::FontSelectPattern&) const = 0; + + virtual sal_IntPtr GetFontId() const = 0; + virtual FontCharMapRef GetFontCharMap() const = 0; + virtual bool GetFontCapabilities(vcl::FontCapabilities&) const = 0; + + bool IsBetterMatch( const vcl::font::FontSelectPattern&, FontMatchStatus& ) const; + sal_Int32 CompareIgnoreSize( const PhysicalFontFace& ) const; + +protected: + explicit PhysicalFontFace(const FontAttributes&); +}; + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ + diff --git a/vcl/inc/font/PhysicalFontFaceCollection.hxx b/vcl/inc/font/PhysicalFontFaceCollection.hxx new file mode 100644 index 000000000..c9e3e64b6 --- /dev/null +++ b/vcl/inc/font/PhysicalFontFaceCollection.hxx @@ -0,0 +1,50 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <sal/config.h> + +#include <vcl/dllapi.h> + +#include "PhysicalFontFace.hxx" + +#include <vector> + +/** + A PhysicalFontFaceCollection is created by a PhysicalFontCollection and + becomes invalid when original PhysicalFontCollection is modified. + */ + +namespace vcl::font +{ +class PhysicalFontFaceCollection +{ +private: + std::vector<rtl::Reference<PhysicalFontFace>> maDevFontVector; + +public: + PhysicalFontFaceCollection() { maDevFontVector.reserve(1024); } + void Add(PhysicalFontFace* pFace) { maDevFontVector.push_back(pFace); } + PhysicalFontFace* Get(int nIndex) const { return maDevFontVector[nIndex].get(); } + int Count() const { return maDevFontVector.size(); } +}; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/vcl/inc/font/PhysicalFontFamily.hxx b/vcl/inc/font/PhysicalFontFamily.hxx new file mode 100644 index 000000000..fa0036b85 --- /dev/null +++ b/vcl/inc/font/PhysicalFontFamily.hxx @@ -0,0 +1,115 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <sal/config.h> + +#include <vcl/dllapi.h> +#include <vcl/outdev.hxx> + +#include <o3tl/sorted_vector.hxx> + +#include <unotools/fontcfg.hxx> + +namespace vcl::font +{ +// flags for mnTypeFaces member +enum class FontTypeFaces +{ + NONE = 0x00, + Scalable = 0x01, + Symbol = 0x02, + NoneSymbol = 0x04, + Light = 0x08, + Bold = 0x10, + Normal = 0x20, + NoneItalic = 0x40, + Italic = 0x80 +}; +} +namespace o3tl +{ +template <> +struct typed_flags<vcl::font::FontTypeFaces> : is_typed_flags<vcl::font::FontTypeFaces, 0xff> +{ +}; +}; + +namespace vcl::font +{ +class FontSelectPattern; +class PhysicalFontCollection; +class PhysicalFontFace; +class PhysicalFontFaceCollection; + +class VCL_PLUGIN_PUBLIC PhysicalFontFamily +{ +public: + PhysicalFontFamily(const OUString& rSearchName); + ~PhysicalFontFamily(); + + // Avoid implicitly defined copy constructors/assignments for the DLLPUBLIC class (they may + // require forward-declared classes used internally to be defined in places using this) + PhysicalFontFamily(const PhysicalFontFamily&) = delete; + PhysicalFontFamily(PhysicalFontFamily&&) = delete; + PhysicalFontFamily& operator=(const PhysicalFontFamily&) = delete; + PhysicalFontFamily& operator=(PhysicalFontFamily&&) = delete; + + const OUString& GetFamilyName() const { return maFamilyName; } + const OUString& GetSearchName() const { return maSearchName; } + const OUString& GetAliasNames() const { return maMapNames; } + int GetMinQuality() const { return mnMinQuality; } + FontTypeFaces GetTypeFaces() const { return mnTypeFaces; } + + const OUString& GetMatchFamilyName() const { return maMatchFamilyName; } + ImplFontAttrs GetMatchType() const { return mnMatchType; } + FontWeight GetMatchWeight() const { return meMatchWeight; } + FontWidth GetMatchWidth() const { return meMatchWidth; } + void InitMatchData(const utl::FontSubstConfiguration&, const OUString& rSearchName); + + void AddFontFace(PhysicalFontFace*); + + PhysicalFontFace* FindBestFontFace(const vcl::font::FontSelectPattern& rFSD) const; + + void UpdateDevFontList(PhysicalFontFaceCollection&) const; + void UpdateCloneFontList(PhysicalFontCollection&) const; + + static void CalcType(ImplFontAttrs& rType, FontWeight& rWeight, FontWidth& rWidth, + FontFamily eFamily, const utl::FontNameAttr* pFontAttr); + +private: + std::vector<rtl::Reference<PhysicalFontFace>> maFontFaces; + + OUString maFamilyName; // original font family name + OUString maSearchName; // normalized font family name + OUString maMapNames; // fontname aliases + FontTypeFaces mnTypeFaces; // Typeface Flags + FontFamily meFamily; + FontPitch mePitch; + int mnMinQuality; // quality of the worst font face + + ImplFontAttrs mnMatchType; // MATCH - Type + OUString maMatchFamilyName; // MATCH - FamilyName + FontWeight meMatchWeight; // MATCH - Weight + FontWidth meMatchWidth; // MATCH - Width +}; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/vcl/inc/font/fontsubstitution.hxx b/vcl/inc/font/fontsubstitution.hxx new file mode 100644 index 000000000..d721c9348 --- /dev/null +++ b/vcl/inc/font/fontsubstitution.hxx @@ -0,0 +1,70 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +// nowadays these substitutions are needed for backward compatibility and tight platform integration: +// - substitutions from configuration entries (Tools->Options->FontReplacement and/or fontconfig) +// - device specific substitutions (e.g. for PS printer builtin fonts) +// - substitutions for missing fonts defined by configuration entries (generic and/or platform dependent fallbacks) +// - substitutions for missing fonts defined by multi-token fontnames (e.g. fontname="SpecialFont;FallbackA;FallbackB") +// - substitutions for incomplete fonts (implicit, generic, EUDC and/or platform dependent fallbacks) +// - substitutions for missing symbol fonts by translating code points into other symbol fonts + +#pragma once + +#include <sal/config.h> + +#include <rtl/ustring.hxx> + +#include <vcl/rendercontext/AddFontSubstituteFlags.hxx> + +#include <font/FontSelectPattern.hxx> + +namespace vcl::font +{ +class FontSelectPattern; + +class FontSubstitution +{ + // TODO: there is more commonality between the different substitutions +protected: + virtual ~FontSubstitution() {} +}; + +/// Abstracts the concept of finding the best font to support an incomplete font +class GlyphFallbackFontSubstitution : public FontSubstitution +{ +public: + virtual bool FindFontSubstitute(vcl::font::FontSelectPattern&, + LogicalFontInstance* pLogicalFont, + OUString& rMissingCodes) const = 0; +}; + +/** Abstracts the concept of a configured font substitution before the + availability of the originally selected font has been checked. + */ +class PreMatchFontSubstitution : public FontSubstitution +{ +public: + virtual bool FindFontSubstitute(vcl::font::FontSelectPattern&) const = 0; +}; + +void ImplFontSubstitute(OUString& rFontName); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/vcl/inc/fontattributes.hxx b/vcl/inc/fontattributes.hxx new file mode 100644 index 000000000..352ea10e3 --- /dev/null +++ b/vcl/inc/fontattributes.hxx @@ -0,0 +1,126 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_VCL_INC_FONTATTRIBUTES_HXX +#define INCLUDED_VCL_INC_FONTATTRIBUTES_HXX + +#include <vcl/dllapi.h> +#include <rtl/ustring.hxx> +#include <sal/log.hxx> +#include <tools/fontenum.hxx> + + +/* The following class is extraordinarily similar to ImplFont. */ + +class VCL_DLLPUBLIC FontAttributes +{ +public: + explicit FontAttributes(); + + // device independent font functions + const OUString& GetFamilyName() const { return maFamilyName; } + FontFamily GetFamilyType() const { return meFamily; } + const OUString& GetStyleName() const { return maStyleName; } + + FontWeight GetWeight() const { return meWeight; } + FontItalic GetItalic() const { return meItalic; } + FontPitch GetPitch() const { return mePitch; } + FontWidth GetWidthType() const { return meWidthType; } + rtl_TextEncoding GetCharSet() const { return meCharSet; } + + bool IsSymbolFont() const { return mbSymbolFlag; } + + void SetFamilyName(const OUString& sFamilyName) { maFamilyName = sFamilyName; } + void SetStyleName( const OUString& sStyleName) { maStyleName = sStyleName; } + void SetFamilyType(const FontFamily eFontFamily) { meFamily = eFontFamily; } + + void SetPitch(const FontPitch ePitch ) { mePitch = ePitch; } + void SetItalic(const FontItalic eItalic ) { meItalic = eItalic; } + void SetWeight(const FontWeight eWeight ) { meWeight = eWeight; } + void SetWidthType(const FontWidth eWidthType) { meWidthType = eWidthType; } + + void SetSymbolFlag(const bool ); + + bool CompareDeviceIndependentFontAttributes(const FontAttributes& rOther) const; + + // Device dependent functions + int GetQuality() const { return mnQuality; } + const OUString& GetMapNames() const { return maMapNames; } + + + void SetQuality( int nQuality ) { mnQuality = nQuality; } + void IncreaseQualityBy( int nQualityAmount ) { mnQuality += nQualityAmount; } + void AddMapName( OUString const& ); + +private: + // device independent variables + OUString maFamilyName; // Font Family Name + OUString maStyleName; // Font Style Name + FontWeight meWeight; // Weight Type + FontFamily meFamily; // Family Type + FontPitch mePitch; // Pitch Type + FontWidth meWidthType; // Width Type + FontItalic meItalic; // Slant Type + rtl_TextEncoding meCharSet; // RTL_TEXTENCODING_SYMBOL or RTL_TEXTENCODING_UNICODE + bool mbSymbolFlag; // Is font a symbol? + + // device dependent variables + OUString maMapNames; // List of family name aliases separated with ';' + int mnQuality; // Quality (used when similar fonts compete) + +}; + +inline void FontAttributes::SetSymbolFlag( const bool bSymbolFlag ) +{ + mbSymbolFlag = bSymbolFlag; + if ( bSymbolFlag ) + { + meCharSet = RTL_TEXTENCODING_SYMBOL; + } + else + { + // if the symbol flag is unset, but it was a symbol font before then + // until the character set encoding is set via SetCharSet then we + // can't know what the characterset is! + if ( meCharSet == RTL_TEXTENCODING_SYMBOL ) + { + meCharSet = RTL_TEXTENCODING_DONTKNOW; + } + } +} + +inline void FontAttributes::AddMapName( OUString const & aMapName ) +{ + if( maMapNames.getLength() > 0 ) + { + maMapNames += ";"; + } + + if (aMapName.getLength() == 0) + { + SAL_WARN("vcl.fonts", "New map name is empty"); + return; + } + + maMapNames += aMapName; +} + +#endif // INCLUDED_VCL_INC_FONTATTRIBUTES_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/fontinstance.hxx b/vcl/inc/fontinstance.hxx new file mode 100644 index 000000000..5cb05b1d3 --- /dev/null +++ b/vcl/inc/fontinstance.hxx @@ -0,0 +1,158 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <sal/config.h> + +#include <basegfx/polygon/b2dpolypolygon.hxx> +#include <o3tl/hash_combine.hxx> +#include <rtl/ref.hxx> +#include <salhelper/simplereferenceobject.hxx> +#include <tools/gen.hxx> +#include <tools/fontenum.hxx> +#include <tools/degree.hxx> + +#include "font/FontSelectPattern.hxx" +#include "impfontmetricdata.hxx" +#include "glyphid.hxx" + +#include <optional> +#include <unordered_map> +#include <memory> + +#include <hb.h> + +class ConvertChar; +class ImplFontCache; + +// extend std namespace to add custom hash needed for LogicalFontInstance + +namespace std +{ + template <> struct hash< pair< sal_UCS4, FontWeight > > + { + size_t operator()(const pair< sal_UCS4, FontWeight >& rData) const + { + std::size_t seed = 0; + o3tl::hash_combine(seed, rData.first); + o3tl::hash_combine(seed, rData.second); + return seed; + } + }; +} + +// TODO: allow sharing of metrics for related fonts + +class VCL_PLUGIN_PUBLIC LogicalFontInstance : public salhelper::SimpleReferenceObject +{ + // just declaring the factory function doesn't work AKA + // friend LogicalFontInstance* PhysicalFontFace::CreateFontInstance(const FontSelectPattern&) const; + friend class vcl::font::PhysicalFontFace; + friend class ImplFontCache; + +public: // TODO: make data members private + virtual ~LogicalFontInstance() override; + + ImplFontMetricDataRef mxFontMetric; // Font attributes + const ConvertChar* mpConversion; // used e.g. for StarBats->StarSymbol + + tools::Long mnLineHeight; + Degree10 mnOwnOrientation; // text angle if lower layers don't rotate text themselves + Degree10 mnOrientation; // text angle in 3600 system + bool mbInit; // true if maFontMetric member is valid + + void AddFallbackForUnicode(sal_UCS4 cChar, FontWeight eWeight, const OUString& rFontName, + bool bEmbolden, const ItalicMatrix& rMatrix); + bool GetFallbackForUnicode(sal_UCS4 cInChar, FontWeight eInWeight, + OUString* pOutFontName, bool* pOutEmbolden, ItalicMatrix* pOutItalicMatrix) const; + void IgnoreFallbackForUnicode( sal_UCS4, FontWeight eWeight, std::u16string_view rFontName ); + + inline hb_font_t* GetHbFont(); + bool IsGraphiteFont(); + // NeedOffsetCorrection: Return if the font need offset correction in TTB direction. + // nYOffset is the original offset. It is used to check if the correction is necessary. + bool NeedOffsetCorrection(sal_Int32 nYOffset); + void SetAverageWidthFactor(double nFactor) { m_nAveWidthFactor = std::abs(nFactor); } + double GetAverageWidthFactor() const { return m_nAveWidthFactor; } + const vcl::font::FontSelectPattern& GetFontSelectPattern() const { return m_aFontSelData; } + + const vcl::font::PhysicalFontFace* GetFontFace() const { return m_pFontFace.get(); } + vcl::font::PhysicalFontFace* GetFontFace() { return m_pFontFace.get(); } + const ImplFontCache* GetFontCache() const { return mpFontCache; } + + bool GetGlyphBoundRect(sal_GlyphId, tools::Rectangle&, bool) const; + virtual bool GetGlyphOutline(sal_GlyphId, basegfx::B2DPolyPolygon&, bool) const = 0; + + int GetKashidaWidth() const; + + void GetScale(double* nXScale, double* nYScale) const; + static inline void DecodeOpenTypeTag(const uint32_t nTableTag, char* pTagName); + +protected: + explicit LogicalFontInstance(const vcl::font::PhysicalFontFace&, const vcl::font::FontSelectPattern&); + + virtual bool ImplGetGlyphBoundRect(sal_GlyphId, tools::Rectangle&, bool) const = 0; + + // Takes ownership of pHbFace. + static hb_font_t* InitHbFont(hb_face_t* pHbFace); + virtual hb_font_t* ImplInitHbFont() { assert(false); return hb_font_get_empty(); } + +private: + struct MapEntry + { + OUString sFontName; + bool bEmbolden; + ItalicMatrix aItalicMatrix; + }; + // cache of Unicode characters and replacement font names and attributes + // TODO: a fallback map can be shared with many other ImplFontEntries + // TODO: at least the ones which just differ in orientation, stretching or height + typedef ::std::unordered_map< ::std::pair<sal_UCS4,FontWeight>, MapEntry > UnicodeFallbackList; + UnicodeFallbackList maUnicodeFallbackList; + mutable ImplFontCache * mpFontCache; + const vcl::font::FontSelectPattern m_aFontSelData; + hb_font_t* m_pHbFont; + double m_nAveWidthFactor; + rtl::Reference<vcl::font::PhysicalFontFace> m_pFontFace; + std::optional<bool> m_xbIsGraphiteFont; + + enum class FontFamilyEnum { Unclassified, DFKaiSB }; + + // The value is initialized and used in NeedOffsetCorrection(). + std::optional<FontFamilyEnum> m_xeFontFamilyEnum; +}; + +inline hb_font_t* LogicalFontInstance::GetHbFont() +{ + if (!m_pHbFont) + m_pHbFont = ImplInitHbFont(); + return m_pHbFont; +} + +inline void LogicalFontInstance::DecodeOpenTypeTag(const uint32_t nTableTag, char* pTagName) +{ + pTagName[0] = static_cast<char>(nTableTag >> 24); + pTagName[1] = static_cast<char>(nTableTag >> 16); + pTagName[2] = static_cast<char>(nTableTag >> 8); + pTagName[3] = static_cast<char>(nTableTag); + pTagName[4] = 0; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/fontsubset.hxx b/vcl/inc/fontsubset.hxx new file mode 100644 index 000000000..2aed0a393 --- /dev/null +++ b/vcl/inc/fontsubset.hxx @@ -0,0 +1,97 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_VCL_INC_FONTSUBSET_HXX +#define INCLUDED_VCL_INC_FONTSUBSET_HXX + +#include <rtl/ustring.hxx> +#include <tools/gen.hxx> +#include <o3tl/typed_flags_set.hxx> + +#include <vcl/dllapi.h> + +#include "glyphid.hxx" + +namespace vcl { class TrueTypeFont; } ///< SFT's idea of a TTF font + +enum class FontType { + NO_FONT = 0, + SFNT_TTF = 1<<1, ///< SFNT container with TrueType glyphs + SFNT_CFF = 1<<2, ///< SFNT container with CFF-container + TYPE1_PFA = 1<<3, ///< PSType1 Postscript Font Ascii + TYPE1_PFB = 1<<4, ///< PSType1 Postscript Font Binary + CFF_FONT = 1<<5, ///< CFF-container with PSType2 glyphs + TYPE3_FONT = 1<<6, ///< PSType3 Postscript font + TYPE42_FONT = 1<<7, ///< PSType42 wrapper for an SFNT_TTF + ANY_SFNT = SFNT_TTF | SFNT_CFF, + ANY_TYPE1 = TYPE1_PFA | TYPE1_PFB +}; +namespace o3tl { + template<> struct typed_flags<FontType> : is_typed_flags<FontType, (1<<8)-1> {}; +} + +class VCL_DLLPUBLIC FontSubsetInfo final +{ +public: + explicit FontSubsetInfo(); + ~FontSubsetInfo(); + + void LoadFont( FontType eInFontType, + const unsigned char* pFontBytes, int nByteLength ); + void LoadFont( vcl::TrueTypeFont* pSftTrueTypeFont ); + + bool CreateFontSubset( FontType nOutFontTypeMask, + FILE* pOutFile, const char* pOutFontName, + const sal_GlyphId* pGlyphIds, const sal_uInt8* pEncodedIds, + int nReqGlyphCount, sal_Int32* pOutGlyphWidths = nullptr ); + +public: // TODO: make subsetter results private and provide accessor methods instead + // subsetter-provided subset details needed by e.g. Postscript or PDF + OUString m_aPSName; + int m_nAscent; ///< all metrics in PS font units + int m_nDescent; + int m_nCapHeight; + tools::Rectangle m_aFontBBox; + FontType m_nFontType; ///< font-type of subset result + +private: + // input-font-specific details + unsigned const char* mpInFontBytes; + int mnInByteLength; + FontType meInFontType; ///< allowed mask of input font-types + vcl::TrueTypeFont* mpSftTTFont; + + // subset-request details + FontType mnReqFontTypeMask; ///< allowed subset-target font types + FILE* mpOutFile; + const char* mpReqFontName; + const sal_GlyphId* mpReqGlyphIds; + const sal_uInt8* mpReqEncodedIds; + int mnReqGlyphCount; + + bool CreateFontSubsetFromCff( sal_Int32* pOutGlyphWidths ); + bool CreateFontSubsetFromSfnt( sal_Int32* pOutGlyphWidths ); + static bool CreateFontSubsetFromType1( const sal_Int32* pOutGlyphWidths ); +}; + +int VCL_DLLPUBLIC TestFontSubset(const void* data, sal_uInt32 size); + +#endif // INCLUDED_VCL_INC_FONTSUBSET_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |