/src/libreoffice/include/unotools/fontcfg.hxx
Line | Count | Source |
1 | | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 | | /* |
3 | | * This file is part of the LibreOffice project. |
4 | | * |
5 | | * This Source Code Form is subject to the terms of the Mozilla Public |
6 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
7 | | * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
8 | | * |
9 | | * This file incorporates work covered by the following license notice: |
10 | | * |
11 | | * Licensed to the Apache Software Foundation (ASF) under one or more |
12 | | * contributor license agreements. See the NOTICE file distributed |
13 | | * with this work for additional information regarding copyright |
14 | | * ownership. The ASF licenses this file to you under the Apache |
15 | | * License, Version 2.0 (the "License"); you may not use this file |
16 | | * except in compliance with the License. You may obtain a copy of |
17 | | * the License at http://www.apache.org/licenses/LICENSE-2.0 . |
18 | | */ |
19 | | #ifndef INCLUDED_UNOTOOLS_FONTCFG_HXX |
20 | | #define INCLUDED_UNOTOOLS_FONTCFG_HXX |
21 | | |
22 | | #include <config_options.h> |
23 | | #include <unotools/unotoolsdllapi.h> |
24 | | #include <tools/fontenum.hxx> |
25 | | #include <com/sun/star/uno/Reference.hxx> |
26 | | #include <o3tl/typed_flags_set.hxx> |
27 | | #include <i18nlangtag/languagetag.hxx> |
28 | | |
29 | | #include <unordered_map> |
30 | | #include <unordered_set> |
31 | | #include <vector> |
32 | | |
33 | | namespace com::sun::star::container { class XNameAccess; } |
34 | | namespace com::sun::star::lang { class XMultiServiceFactory; } |
35 | | |
36 | | enum class DefaultFontType; |
37 | | |
38 | | // If you think the below concept of classifying a font (typeface) as possibly being one or several |
39 | | // of "Default", "Standard", and "Normal", etc, is madness, you are probably right. On the other |
40 | | // hand we have in officecfg/registry/data/org/openoffice/VCL.xcu carefully (or not) assigned to |
41 | | // each font mentioned in that file what its attributes are, so it is quite possible that touching |
42 | | // this would cause a regression that nobody would notice until after many years. |
43 | | |
44 | | // Note that the bit flags must match the entries in the pAttribNames array in |
45 | | // unotools/source/config/fontcfg.cxx. |
46 | | |
47 | | enum class ImplFontAttrs : sal_uInt32 |
48 | | { |
49 | | None = 0x00000000, |
50 | | Default = 0x00000001, ///< Default-Font like Andale Sans UI, Palace Script, Albany, Thorndale, Cumberland, ... |
51 | | Standard = 0x00000002, ///< Standard-Font like Arial, Times, Courier, ... |
52 | | Normal = 0x00000004, ///< Normal Font for writing text like Arial, Verdana, Arial Narrow, Trebuchet, Times, Courier, ... |
53 | | Symbol = 0x00000008, ///< Font with symbols |
54 | | Fixed = 0x00000010, |
55 | | SansSerif = 0x00000020, |
56 | | Serif = 0x00000040, |
57 | | Decorative = 0x00000080, ///< Readable and normally used for drawings |
58 | | Special = 0x00000100, ///< Very special design |
59 | | Italic = 0x00000200, |
60 | | Titling = 0x00000400, ///< Only uppercase characters |
61 | | Capitals = 0x00000800, ///< Only uppercase characters, but lowercase characters smaller as the uppercase characters |
62 | | CJK = 0x00001000, |
63 | | CJK_JP = 0x00002000, |
64 | | CJK_SC = 0x00004000, |
65 | | CJK_TC = 0x00008000, |
66 | | CJK_KR = 0x00010000, |
67 | | CTL = 0x00020000, |
68 | | NoneLatin = 0x00040000, |
69 | | Full = 0x00080000, ///< Font with normally all characters |
70 | | Outline = 0x00100000, |
71 | | Shadow = 0x00200000, |
72 | | Rounded = 0x00400000, |
73 | | Typewriter = 0x00800000, ///< Like a typewriter: Courier, ... |
74 | | Script = 0x01000000, ///< Handwriting or Script |
75 | | Handwriting = 0x02000000, ///< More Handwriting with normal letters |
76 | | Chancery = 0x04000000, ///< Like Zapf Chancery |
77 | | Comic = 0x08000000, ///< Like Comic Sans MS |
78 | | BrushScript = 0x10000000, ///< More Script |
79 | | Gothic = 0x20000000, |
80 | | Schoolbook = 0x40000000, |
81 | | OtherStyle = 0x80000000, ///< OldStyle, ... so negative points |
82 | | CJK_AllLang = CJK_JP | CJK_SC | CJK_TC | CJK_KR, |
83 | | AllScript = Script | Handwriting | Chancery | Comic | BrushScript, |
84 | | AllSubscript = Handwriting | Chancery | Comic | BrushScript, |
85 | | AllSerifStyle = AllScript | SansSerif | Serif | Fixed | Italic | Gothic | Schoolbook | Shadow | Outline, |
86 | | }; |
87 | | namespace o3tl |
88 | | { |
89 | | template<> struct typed_flags<ImplFontAttrs> : is_typed_flags<ImplFontAttrs, 0xffffffff> {}; |
90 | | } |
91 | | |
92 | | |
93 | | namespace utl |
94 | | { |
95 | | |
96 | | class UNOTOOLS_DLLPUBLIC DefaultFontConfiguration |
97 | | { |
98 | | css::uno::Reference< css::lang::XMultiServiceFactory > |
99 | | m_xConfigProvider; |
100 | | css::uno::Reference< css::container::XNameAccess > |
101 | | m_xConfigAccess; |
102 | | |
103 | | struct LocaleAccess |
104 | | { |
105 | | // the real string used in the configuration |
106 | | // used to get rid of upper/lower case problems |
107 | | OUString aConfigLocaleString; |
108 | | // xAccess is mutable to be able to be filled on demand |
109 | | mutable css::uno::Reference< css::container::XNameAccess > xAccess; |
110 | | }; |
111 | | |
112 | | std::unordered_map< OUString, LocaleAccess > m_aConfig; |
113 | | |
114 | | OUString tryLocale( const OUString& rBcp47, const OUString& rType ) const; |
115 | | |
116 | | public: |
117 | | DefaultFontConfiguration(); |
118 | | ~DefaultFontConfiguration(); |
119 | | |
120 | | static DefaultFontConfiguration& get(); |
121 | | |
122 | | OUString getDefaultFont( const LanguageTag& rLanguageTag, DefaultFontType nType ) const; |
123 | | OUString getUserInterfaceFont( const LanguageTag& rLanguageTag ) const; |
124 | | }; |
125 | | |
126 | | struct UNOTOOLS_DLLPUBLIC FontNameAttr |
127 | | { |
128 | | OUString Name; |
129 | | ::std::vector< OUString > Substitutions; |
130 | | ::std::vector< OUString > MSSubstitutions; |
131 | | FontWeight Weight; |
132 | | FontWidth Width; |
133 | | ImplFontAttrs Type; |
134 | | }; |
135 | | |
136 | | class UNLESS_MERGELIBS(UNOTOOLS_DLLPUBLIC) FontSubstConfiguration |
137 | | { |
138 | | private: |
139 | | css::uno::Reference< css::lang::XMultiServiceFactory > |
140 | | m_xConfigProvider; |
141 | | css::uno::Reference< css::container::XNameAccess > |
142 | | m_xConfigAccess; |
143 | | struct LocaleSubst |
144 | | { |
145 | | OUString aConfigLocaleString; |
146 | | mutable bool bConfigRead; |
147 | | // note: aSubstAttributes must be sorted alphabetically by Name |
148 | | // searches on the substitutes are done with Name as key, where |
149 | | // a minimal match is sufficient (that is e.g. "Thorndale" will match |
150 | | // "Thorndale BlaBlub"). Also names must be lower case. |
151 | | mutable std::vector< FontNameAttr > aSubstAttributes; |
152 | | |
153 | 0 | LocaleSubst() : bConfigRead( false ) {} |
154 | | }; |
155 | | std::unordered_map< OUString, LocaleSubst > m_aSubst; |
156 | | typedef std::unordered_set< OUString > UniqueSubstHash; |
157 | | mutable UniqueSubstHash maSubstHash; |
158 | | LanguageTag maLanguageTag; |
159 | | |
160 | | void fillSubstVector( const css::uno::Reference< css::container::XNameAccess >& rFont, |
161 | | const OUString& rType, |
162 | | std::vector< OUString >& rSubstVector ) const; |
163 | | static FontWeight getSubstWeight( const css::uno::Reference< css::container::XNameAccess >& rFont, |
164 | | const OUString& rType ); |
165 | | static FontWidth getSubstWidth( const css::uno::Reference< css::container::XNameAccess >& rFont, |
166 | | const OUString& rType ); |
167 | | static ImplFontAttrs getSubstType( const css::uno::Reference< css::container::XNameAccess >& rFont, |
168 | | const OUString& rType ); |
169 | | void readLocaleSubst( const OUString& rBcp47 ) const; |
170 | | public: |
171 | | FontSubstConfiguration(); |
172 | | ~FontSubstConfiguration(); |
173 | | |
174 | | static FontSubstConfiguration& get(); |
175 | | |
176 | | const FontNameAttr* getSubstInfo( const OUString& rFontName ) const; |
177 | | static void getMapName( const OUString& rOrgName, OUString& rShortName, OUString& rFamilyName, FontWeight& rWeight, FontWidth& rWidth, ImplFontAttrs& rType ); |
178 | | }; |
179 | | |
180 | | } // namespace utl |
181 | | |
182 | | #endif // INCLUDED_UNOTOOLS_FONTCFG_HXX |
183 | | |
184 | | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |