Coverage Report

Created: 2023-02-22 06:06

/src/wxwidgets/src/common/fmapbase.cpp
Line
Count
Source (jump to first uncovered line)
1
///////////////////////////////////////////////////////////////////////////////
2
// Name:        src/common/fmapbase.cpp
3
// Purpose:     wxFontMapperBase class implementation
4
// Author:      Vadim Zeitlin
5
// Modified by:
6
// Created:     21.06.2003 (extracted from common/fontmap.cpp)
7
// Copyright:   (c) 1999-2003 Vadim Zeitlin <vadim@wxwidgets.org>
8
// Licence:     wxWindows licence
9
///////////////////////////////////////////////////////////////////////////////
10
11
// ============================================================================
12
// declarations
13
// ============================================================================
14
15
// ----------------------------------------------------------------------------
16
// headers
17
// ----------------------------------------------------------------------------
18
19
// for compilers that support precompilation, includes "wx.h".
20
#include "wx/wxprec.h"
21
22
23
#if wxUSE_FONTMAP
24
25
#ifndef WX_PRECOMP
26
    #include "wx/app.h"
27
    #include "wx/log.h"
28
    #include "wx/intl.h"
29
    #include "wx/module.h"
30
    #include "wx/wxcrtvararg.h"
31
#endif //WX_PRECOMP
32
33
#if defined(__WINDOWS__)
34
    #include  "wx/msw/private.h"  // includes windows.h for LOGFONT
35
    #include  "wx/msw/winundef.h"
36
#endif
37
38
#include "wx/fontmap.h"
39
#include "wx/fmappriv.h"
40
41
#include "wx/apptrait.h"
42
43
// wxMemoryConfig uses wxFileConfig
44
#if wxUSE_CONFIG && wxUSE_FILECONFIG
45
    #include "wx/config.h"
46
    #include "wx/memconf.h"
47
#endif
48
49
// ----------------------------------------------------------------------------
50
// constants
51
// ----------------------------------------------------------------------------
52
53
// encodings supported by GetEncodingDescription
54
static const wxFontEncoding gs_encodings[] =
55
{
56
    wxFONTENCODING_ISO8859_1,
57
    wxFONTENCODING_ISO8859_2,
58
    wxFONTENCODING_ISO8859_3,
59
    wxFONTENCODING_ISO8859_4,
60
    wxFONTENCODING_ISO8859_5,
61
    wxFONTENCODING_ISO8859_6,
62
    wxFONTENCODING_ISO8859_7,
63
    wxFONTENCODING_ISO8859_8,
64
    wxFONTENCODING_ISO8859_9,
65
    wxFONTENCODING_ISO8859_10,
66
    wxFONTENCODING_ISO8859_11,
67
    wxFONTENCODING_ISO8859_12,
68
    wxFONTENCODING_ISO8859_13,
69
    wxFONTENCODING_ISO8859_14,
70
    wxFONTENCODING_ISO8859_15,
71
    wxFONTENCODING_KOI8,
72
    wxFONTENCODING_KOI8_U,
73
    wxFONTENCODING_CP866,
74
    wxFONTENCODING_CP874,
75
    wxFONTENCODING_CP932,
76
    wxFONTENCODING_CP936,
77
    wxFONTENCODING_CP949,
78
    wxFONTENCODING_CP950,
79
    wxFONTENCODING_CP1250,
80
    wxFONTENCODING_CP1251,
81
    wxFONTENCODING_CP1252,
82
    wxFONTENCODING_CP1253,
83
    wxFONTENCODING_CP1254,
84
    wxFONTENCODING_CP1255,
85
    wxFONTENCODING_CP1256,
86
    wxFONTENCODING_CP1257,
87
    wxFONTENCODING_CP1258,
88
    wxFONTENCODING_CP1361,
89
    wxFONTENCODING_CP437,
90
    wxFONTENCODING_UTF7,
91
    wxFONTENCODING_UTF8,
92
    wxFONTENCODING_UTF16BE,
93
    wxFONTENCODING_UTF16LE,
94
    wxFONTENCODING_UTF32BE,
95
    wxFONTENCODING_UTF32LE,
96
    wxFONTENCODING_EUC_JP,
97
    wxFONTENCODING_DEFAULT,
98
    wxFONTENCODING_ISO2022_JP,
99
100
    wxFONTENCODING_MACROMAN,
101
    wxFONTENCODING_MACJAPANESE,
102
    wxFONTENCODING_MACCHINESETRAD,
103
    wxFONTENCODING_MACKOREAN,
104
    wxFONTENCODING_MACARABIC,
105
    wxFONTENCODING_MACHEBREW,
106
    wxFONTENCODING_MACGREEK,
107
    wxFONTENCODING_MACCYRILLIC,
108
    wxFONTENCODING_MACDEVANAGARI,
109
    wxFONTENCODING_MACGURMUKHI,
110
    wxFONTENCODING_MACGUJARATI,
111
    wxFONTENCODING_MACORIYA,
112
    wxFONTENCODING_MACBENGALI,
113
    wxFONTENCODING_MACTAMIL,
114
    wxFONTENCODING_MACTELUGU,
115
    wxFONTENCODING_MACKANNADA,
116
    wxFONTENCODING_MACMALAJALAM,
117
    wxFONTENCODING_MACSINHALESE,
118
    wxFONTENCODING_MACBURMESE,
119
    wxFONTENCODING_MACKHMER,
120
    wxFONTENCODING_MACTHAI,
121
    wxFONTENCODING_MACLAOTIAN,
122
    wxFONTENCODING_MACGEORGIAN,
123
    wxFONTENCODING_MACARMENIAN,
124
    wxFONTENCODING_MACCHINESESIMP,
125
    wxFONTENCODING_MACTIBETAN,
126
    wxFONTENCODING_MACMONGOLIAN,
127
    wxFONTENCODING_MACETHIOPIC,
128
    wxFONTENCODING_MACCENTRALEUR,
129
    wxFONTENCODING_MACVIATNAMESE,
130
    wxFONTENCODING_MACARABICEXT,
131
    wxFONTENCODING_MACSYMBOL,
132
    wxFONTENCODING_MACDINGBATS,
133
    wxFONTENCODING_MACTURKISH,
134
    wxFONTENCODING_MACCROATIAN,
135
    wxFONTENCODING_MACICELANDIC,
136
    wxFONTENCODING_MACROMANIAN,
137
    wxFONTENCODING_MACCELTIC,
138
    wxFONTENCODING_MACGAELIC,
139
    wxFONTENCODING_MACKEYBOARD
140
};
141
142
// the descriptions for them
143
static const char* const gs_encodingDescs[] =
144
{
145
    wxTRANSLATE( "Western European (ISO-8859-1)" ),
146
    wxTRANSLATE( "Central European (ISO-8859-2)" ),
147
    wxTRANSLATE( "Esperanto (ISO-8859-3)" ),
148
    wxTRANSLATE( "Baltic (old) (ISO-8859-4)" ),
149
    wxTRANSLATE( "Cyrillic (ISO-8859-5)" ),
150
    wxTRANSLATE( "Arabic (ISO-8859-6)" ),
151
    wxTRANSLATE( "Greek (ISO-8859-7)" ),
152
    wxTRANSLATE( "Hebrew (ISO-8859-8)" ),
153
    wxTRANSLATE( "Turkish (ISO-8859-9)" ),
154
    wxTRANSLATE( "Nordic (ISO-8859-10)" ),
155
    wxTRANSLATE( "Thai (ISO-8859-11)" ),
156
    wxTRANSLATE( "Indian (ISO-8859-12)" ),
157
    wxTRANSLATE( "Baltic (ISO-8859-13)" ),
158
    wxTRANSLATE( "Celtic (ISO-8859-14)" ),
159
    wxTRANSLATE( "Western European with Euro (ISO-8859-15)" ),
160
    wxTRANSLATE( "KOI8-R" ),
161
    wxTRANSLATE( "KOI8-U" ),
162
    wxTRANSLATE( "Windows/DOS OEM Cyrillic (CP 866)" ),
163
    wxTRANSLATE( "Windows Thai (CP 874)" ),
164
    wxTRANSLATE( "Windows Japanese (CP 932) or Shift-JIS" ),
165
    wxTRANSLATE( "Windows Chinese Simplified (CP 936) or GB-2312" ),
166
    wxTRANSLATE( "Windows Korean (CP 949)" ),
167
    wxTRANSLATE( "Windows Chinese Traditional (CP 950) or Big-5" ),
168
    wxTRANSLATE( "Windows Central European (CP 1250)" ),
169
    wxTRANSLATE( "Windows Cyrillic (CP 1251)" ),
170
    wxTRANSLATE( "Windows Western European (CP 1252)" ),
171
    wxTRANSLATE( "Windows Greek (CP 1253)" ),
172
    wxTRANSLATE( "Windows Turkish (CP 1254)" ),
173
    wxTRANSLATE( "Windows Hebrew (CP 1255)" ),
174
    wxTRANSLATE( "Windows Arabic (CP 1256)" ),
175
    wxTRANSLATE( "Windows Baltic (CP 1257)" ),
176
    wxTRANSLATE( "Windows Vietnamese (CP 1258)" ),
177
    wxTRANSLATE( "Windows Johab (CP 1361)" ),
178
    wxTRANSLATE( "Windows/DOS OEM (CP 437)" ),
179
    wxTRANSLATE( "Unicode 7 bit (UTF-7)" ),
180
    wxTRANSLATE( "Unicode 8 bit (UTF-8)" ),
181
#ifdef WORDS_BIGENDIAN
182
    wxTRANSLATE( "Unicode 16 bit (UTF-16)" ),
183
    wxTRANSLATE( "Unicode 16 bit Little Endian (UTF-16LE)" ),
184
    wxTRANSLATE( "Unicode 32 bit (UTF-32)" ),
185
    wxTRANSLATE( "Unicode 32 bit Little Endian (UTF-32LE)" ),
186
#else // WORDS_BIGENDIAN
187
    wxTRANSLATE( "Unicode 16 bit Big Endian (UTF-16BE)" ),
188
    wxTRANSLATE( "Unicode 16 bit (UTF-16)" ),
189
    wxTRANSLATE( "Unicode 32 bit Big Endian (UTF-32BE)" ),
190
    wxTRANSLATE( "Unicode 32 bit (UTF-32)" ),
191
#endif // WORDS_BIGENDIAN
192
    wxTRANSLATE( "Extended Unix Codepage for Japanese (EUC-JP)" ),
193
    wxTRANSLATE( "US-ASCII" ),
194
    wxTRANSLATE( "ISO-2022-JP" ),
195
196
    wxTRANSLATE( "MacRoman" ),
197
    wxTRANSLATE( "MacJapanese" ),
198
    wxTRANSLATE( "MacChineseTrad" ),
199
    wxTRANSLATE( "MacKorean" ),
200
    wxTRANSLATE( "MacArabic" ),
201
    wxTRANSLATE( "MacHebrew" ),
202
    wxTRANSLATE( "MacGreek" ),
203
    wxTRANSLATE( "MacCyrillic" ),
204
    wxTRANSLATE( "MacDevanagari" ),
205
    wxTRANSLATE( "MacGurmukhi" ),
206
    wxTRANSLATE( "MacGujarati" ),
207
    wxTRANSLATE( "MacOriya" ),
208
    wxTRANSLATE( "MacBengali" ),
209
    wxTRANSLATE( "MacTamil" ),
210
    wxTRANSLATE( "MacTelugu" ),
211
    wxTRANSLATE( "MacKannada" ),
212
    wxTRANSLATE( "MacMalayalam" ),
213
    wxTRANSLATE( "MacSinhalese" ),
214
    wxTRANSLATE( "MacBurmese" ),
215
    wxTRANSLATE( "MacKhmer" ),
216
    wxTRANSLATE( "MacThai" ),
217
    wxTRANSLATE( "MacLaotian" ),
218
    wxTRANSLATE( "MacGeorgian" ),
219
    wxTRANSLATE( "MacArmenian" ),
220
    wxTRANSLATE( "MacChineseSimp" ),
221
    wxTRANSLATE( "MacTibetan" ),
222
    wxTRANSLATE( "MacMongolian" ),
223
    wxTRANSLATE( "MacEthiopic" ),
224
    wxTRANSLATE( "MacCentralEurRoman" ),
225
    wxTRANSLATE( "MacVietnamese" ),
226
    wxTRANSLATE( "MacExtArabic" ),
227
    wxTRANSLATE( "MacSymbol" ),
228
    wxTRANSLATE( "MacDingbats" ),
229
    wxTRANSLATE( "MacTurkish" ),
230
    wxTRANSLATE( "MacCroatian" ),
231
    wxTRANSLATE( "MacIcelandic" ),
232
    wxTRANSLATE( "MacRomanian" ),
233
    wxTRANSLATE( "MacCeltic" ),
234
    wxTRANSLATE( "MacGaelic" ),
235
    wxTRANSLATE( "MacKeyboardGlyphs" )
236
};
237
238
// and the internal names (these are not translated on purpose!)
239
static const wxChar* const gs_encodingNames[][9] =
240
{
241
    // names from the columns correspond to these OS:
242
    //      Linux        Solaris and IRIX       HP-UX             AIX
243
    { wxT("ISO-8859-1"),  wxT("ISO8859-1"),  wxT("iso88591"),  wxT("8859-1"), wxT("iso_8859_1"), nullptr },
244
    { wxT("ISO-8859-2"),  wxT("ISO8859-2"),  wxT("iso88592"),  wxT("8859-2"), nullptr },
245
    { wxT("ISO-8859-3"),  wxT("ISO8859-3"),  wxT("iso88593"),  wxT("8859-3"), nullptr },
246
    { wxT("ISO-8859-4"),  wxT("ISO8859-4"),  wxT("iso88594"),  wxT("8859-4"), nullptr },
247
    { wxT("ISO-8859-5"),  wxT("ISO8859-5"),  wxT("iso88595"),  wxT("8859-5"), nullptr },
248
    { wxT("ISO-8859-6"),  wxT("ISO8859-6"),  wxT("iso88596"),  wxT("8859-6"), nullptr },
249
    { wxT("ISO-8859-7"),  wxT("ISO8859-7"),  wxT("iso88597"),  wxT("8859-7"), nullptr },
250
    { wxT("ISO-8859-8"),  wxT("ISO8859-8"),  wxT("iso88598"),  wxT("8859-8"), nullptr },
251
    { wxT("ISO-8859-9"),  wxT("ISO8859-9"),  wxT("iso88599"),  wxT("8859-9"), nullptr },
252
    { wxT("ISO-8859-10"), wxT("ISO8859-10"), wxT("iso885910"), wxT("8859-10"), nullptr },
253
    { wxT("ISO-8859-11"), wxT("ISO8859-11"), wxT("iso885911"), wxT("8859-11"), nullptr },
254
    { wxT("ISO-8859-12"), wxT("ISO8859-12"), wxT("iso885912"), wxT("8859-12"), nullptr },
255
    { wxT("ISO-8859-13"), wxT("ISO8859-13"), wxT("iso885913"), wxT("8859-13"), nullptr },
256
    { wxT("ISO-8859-14"), wxT("ISO8859-14"), wxT("iso885914"), wxT("8859-14"), nullptr },
257
    { wxT("ISO-8859-15"), wxT("ISO8859-15"), wxT("iso885915"), wxT("8859-15"), nullptr },
258
259
    // although koi8-ru is not strictly speaking the same as koi8-r,
260
    // they are similar enough to make mapping it to koi8 better than
261
    // not recognizing it at all
262
    { wxT( "KOI8-R" ), wxT( "KOI8-RU" ), nullptr },
263
    { wxT( "KOI8-U" ), nullptr },
264
265
    { wxT( "WINDOWS-866" ), wxT( "CP866" ), nullptr },
266
267
    { wxT( "WINDOWS-874" ), wxT( "CP874" ), wxT( "MS874" ), wxT( "IBM-874" ), nullptr },
268
    { wxT( "WINDOWS-932" ), wxT( "CP932" ), wxT( "MS932" ), wxT( "IBM-932" ), wxT( "SJIS" ), wxT( "SHIFT-JIS" ), wxT( "SHIFT_JIS" ), nullptr },
269
    { wxT( "WINDOWS-936" ), wxT( "CP936" ), wxT( "MS936" ), wxT( "IBM-936" ), wxT( "GB2312" ), wxT( "gbk" ),wxT( "GBK" ), nullptr },
270
    { wxT( "WINDOWS-949" ), wxT( "CP949" ), wxT( "MS949" ), wxT( "IBM-949" ), wxT( "EUC-KR" ), wxT( "eucKR" ), wxT( "euc_kr" ), nullptr },
271
    { wxT( "WINDOWS-950" ), wxT( "CP950" ), wxT( "MS950" ), wxT( "IBM-950" ), wxT( "BIG5" ), wxT( "BIG-5" ), wxT( "BIG-FIVE" ), nullptr },
272
    { wxT( "WINDOWS-1250" ),wxT( "CP1250" ),wxT( "MS1250" ),wxT( "IBM-1250" ),nullptr },
273
    { wxT( "WINDOWS-1251" ),wxT( "CP1251" ),wxT( "MS1251" ),wxT( "IBM-1251" ),nullptr },
274
    { wxT( "WINDOWS-1252" ),wxT( "CP1252" ),wxT( "MS1252" ),wxT( "IBM-1252" ),nullptr },
275
    { wxT( "WINDOWS-1253" ),wxT( "CP1253" ),wxT( "MS1253" ),wxT( "IBM-1253" ),nullptr },
276
    { wxT( "WINDOWS-1254" ),wxT( "CP1254" ),wxT( "MS1254" ),wxT( "IBM-1254" ),nullptr },
277
    { wxT( "WINDOWS-1255" ),wxT( "CP1255" ),wxT( "MS1255" ),wxT( "IBM-1255" ),nullptr },
278
    { wxT( "WINDOWS-1256" ),wxT( "CP1256" ),wxT( "MS1256" ),wxT( "IBM-1256" ),nullptr },
279
    { wxT( "WINDOWS-1257" ),wxT( "CP1257" ),wxT( "MS1257" ),wxT( "IBM-1257" ),nullptr },
280
    { wxT( "WINDOWS-1258" ),wxT( "CP1258" ),wxT( "MS1258" ),wxT( "IBM-1258" ),nullptr },
281
    { wxT( "WINDOWS-1361" ),wxT( "CP1361" ),wxT( "MS1361" ),wxT( "IBM-1361" ), wxT( "JOHAB" ), nullptr },
282
    { wxT( "WINDOWS-437" ), wxT( "CP437" ), wxT( "MS437" ), wxT( "IBM-437" ), nullptr },
283
284
    { wxT( "UTF-7" ), wxT("UTF7"), nullptr },
285
    { wxT( "UTF-8" ), wxT("UTF8"), nullptr },
286
#ifdef WORDS_BIGENDIAN
287
    { wxT( "UTF-16BE" ), wxT("UTF16BE"), wxT("UCS-2BE"), wxT("UCS2BE"), wxT("UTF-16"), wxT("UTF16"), wxT("UCS-2"), wxT("UCS2"), nullptr },
288
    { wxT( "UTF-16LE" ), wxT("UTF16LE"), wxT("UCS-2LE"), wxT("UCS2LE"), nullptr },
289
    { wxT( "UTF-32BE" ), wxT("UTF32BE"), wxT("UCS-4BE" ), wxT("UTF-32"), wxT("UTF32"), wxT("UCS-4"), wxT("UCS4"), nullptr },
290
    { wxT( "UTF-32LE" ), wxT("UTF32LE"), wxT("UCS-4LE"), wxT("UCS4LE"), nullptr },
291
#else // WORDS_BIGENDIAN
292
    { wxT("UTF-16BE"), wxT("UTF16BE"), wxT("UCS-2BE"), wxT("UCS2BE"), nullptr },
293
    { wxT("UTF-16LE"), wxT("UTF16LE"), wxT("UCS-2LE"), wxT("UTF-16"), wxT("UTF16"), wxT("UCS-2"), wxT("UCS2"), nullptr },
294
    { wxT("UTF-32BE"), wxT("UTF32BE"), wxT("UCS-4BE"), wxT("UCS4BE"), nullptr },
295
    { wxT("UTF-32LE"), wxT("UTF32LE"), wxT("UCS-4LE"), wxT("UCS4LE"), wxT("UTF-32"), wxT("UTF32"), wxT("UCS-4"), wxT("UCS4"), nullptr },
296
#endif // WORDS_BIGENDIAN
297
298
    { wxT( "EUC-JP" ), wxT( "eucJP" ), wxT( "euc_jp" ), wxT( "IBM-eucJP" ), nullptr },
299
300
    // 646 is for Solaris, roman8 -- for HP-UX
301
    { wxT( "US-ASCII" ), wxT( "ASCII" ), wxT("C"), wxT("POSIX"), wxT("ANSI_X3.4-1968"),
302
      wxT("646"), wxT("roman8"), wxT( "" ), nullptr },
303
304
    { wxT( "ISO-2022-JP" ), nullptr },
305
306
307
    { wxT( "MacRoman" ), nullptr },
308
    { wxT( "MacJapanese" ), nullptr },
309
    { wxT( "MacChineseTrad" ), nullptr },
310
    { wxT( "MacKorean" ), nullptr },
311
    { wxT( "MacArabic" ), nullptr },
312
    { wxT( "MacHebrew" ), nullptr },
313
    { wxT( "MacGreek" ), nullptr },
314
    { wxT( "MacCyrillic" ), nullptr },
315
    { wxT( "MacDevanagari" ), nullptr },
316
    { wxT( "MacGurmukhi" ), nullptr },
317
    { wxT( "MacGujarati" ), nullptr },
318
    { wxT( "MacOriya" ), nullptr },
319
    { wxT( "MacBengali" ), nullptr },
320
    { wxT( "MacTamil" ), nullptr },
321
    { wxT( "MacTelugu" ), nullptr },
322
    { wxT( "MacKannada" ), nullptr },
323
    { wxT( "MacMalayalam" ), nullptr },
324
    { wxT( "MacSinhalese" ), nullptr },
325
    { wxT( "MacBurmese" ), nullptr },
326
    { wxT( "MacKhmer" ), nullptr },
327
    { wxT( "MacThai" ), nullptr },
328
    { wxT( "MacLaotian" ), nullptr },
329
    { wxT( "MacGeorgian" ), nullptr },
330
    { wxT( "MacArmenian" ), nullptr },
331
    { wxT( "MacChineseSimp" ), nullptr },
332
    { wxT( "MacTibetan" ), nullptr },
333
    { wxT( "MacMongolian" ), nullptr },
334
    { wxT( "MacEthiopic" ), nullptr },
335
    { wxT( "MacCentralEurRoman" ), nullptr },
336
    { wxT( "MacVietnamese" ), nullptr },
337
    { wxT( "MacExtArabic" ), nullptr },
338
    { wxT( "MacSymbol" ), nullptr },
339
    { wxT( "MacDingbats" ), nullptr },
340
    { wxT( "MacTurkish" ), nullptr },
341
    { wxT( "MacCroatian" ), nullptr },
342
    { wxT( "MacIcelandic" ), nullptr },
343
    { wxT( "MacRomanian" ), nullptr },
344
    { wxT( "MacCeltic" ), nullptr },
345
    { wxT( "MacGaelic" ), nullptr },
346
    { wxT( "MacKeyboardGlyphs" ), nullptr }
347
};
348
349
wxCOMPILE_TIME_ASSERT( WXSIZEOF(gs_encodingDescs) == WXSIZEOF(gs_encodings), EncodingsArraysNotInSync );
350
wxCOMPILE_TIME_ASSERT( WXSIZEOF(gs_encodingNames) == WXSIZEOF(gs_encodings), EncodingsArraysNotInSync );
351
352
// ----------------------------------------------------------------------------
353
// private classes
354
// ----------------------------------------------------------------------------
355
356
// clean up the font mapper object
357
class wxFontMapperModule : public wxModule
358
{
359
public:
360
0
    wxFontMapperModule() : wxModule() { }
361
362
    virtual bool OnInit() override
363
0
    {
364
        // a dummy wxFontMapperBase object could have been created during the
365
        // program startup before wxApp was created, we have to delete it to
366
        // allow creating the real font mapper next time it is needed now that
367
        // we can create it (when the modules are initialized, wxApp object
368
        // already exists)
369
0
        wxFontMapperBase *fm = wxFontMapperBase::Get();
370
0
        if ( fm && fm->IsDummy() )
371
0
            wxFontMapperBase::Reset();
372
373
0
        return true;
374
0
    }
375
376
    virtual void OnExit() override
377
0
    {
378
0
        wxFontMapperBase::Reset();
379
0
    }
380
381
    wxDECLARE_DYNAMIC_CLASS(wxFontMapperModule);
382
};
383
384
wxIMPLEMENT_DYNAMIC_CLASS(wxFontMapperModule, wxModule);
385
386
387
// ============================================================================
388
// wxFontMapperBase implementation
389
// ============================================================================
390
391
wxFontMapper *wxFontMapperBase::sm_instance = nullptr;
392
393
// ----------------------------------------------------------------------------
394
// ctor and dtor
395
// ----------------------------------------------------------------------------
396
397
wxFontMapperBase::wxFontMapperBase()
398
0
{
399
0
#if wxUSE_CONFIG && wxUSE_FILECONFIG
400
0
    m_configDummy = nullptr;
401
0
#endif // wxUSE_CONFIG
402
0
}
403
404
wxFontMapperBase::~wxFontMapperBase()
405
0
{
406
0
#if wxUSE_CONFIG && wxUSE_FILECONFIG
407
0
    delete m_configDummy;
408
0
#endif // wxUSE_CONFIG
409
0
}
410
411
/* static */
412
wxFontMapperBase *wxFontMapperBase::Get()
413
0
{
414
0
    if ( !sm_instance )
415
0
    {
416
0
        wxAppTraits *traits = wxApp::GetTraitsIfExists();
417
0
        if ( traits )
418
0
        {
419
0
            sm_instance = traits->CreateFontMapper();
420
421
0
            wxASSERT_MSG( sm_instance,
422
0
                            wxT("wxAppTraits::CreateFontMapper() failed") );
423
0
        }
424
425
0
        if ( !sm_instance )
426
0
        {
427
            // last resort: we must create something because the existing code
428
            // relies on always having a valid font mapper object
429
0
            sm_instance = (wxFontMapper *)new wxFontMapperBase;
430
0
        }
431
0
    }
432
433
0
    return (wxFontMapperBase*)sm_instance;
434
0
}
435
436
/* static */
437
wxFontMapper *wxFontMapperBase::Set(wxFontMapper *mapper)
438
0
{
439
0
    wxFontMapper *old = sm_instance;
440
0
    sm_instance = mapper;
441
0
    return old;
442
0
}
443
444
/* static */
445
void wxFontMapperBase::Reset()
446
0
{
447
0
    if ( sm_instance )
448
0
    {
449
        // we need a cast as wxFontMapper is not fully declared here and so the
450
        // compiler can't know that it derives from wxFontMapperBase (but
451
        // run-time behaviour will be correct because the dtor is virtual)
452
0
        delete (wxFontMapperBase *)sm_instance;
453
0
        sm_instance = nullptr;
454
0
    }
455
0
}
456
457
#if wxUSE_CONFIG && wxUSE_FILECONFIG
458
459
// ----------------------------------------------------------------------------
460
// config usage customisation
461
// ----------------------------------------------------------------------------
462
463
464
static wxString gs_defaultConfigPath(FONTMAPPER_ROOT_PATH);
465
466
/* static */
467
const wxString& wxFontMapperBase::GetDefaultConfigPath()
468
0
{
469
    // NB: we return const wxString& and not wxString for compatibility
470
    //     with 2.8 that returned const wxChar*
471
0
    return gs_defaultConfigPath;
472
0
}
473
474
void wxFontMapperBase::SetConfigPath(const wxString& prefix)
475
0
{
476
0
    wxCHECK_RET( !prefix.empty() && prefix[0] == wxCONFIG_PATH_SEPARATOR,
477
0
                 wxT("an absolute path should be given to wxFontMapper::SetConfigPath()") );
478
479
0
    m_configRootPath = prefix;
480
0
}
481
482
// ----------------------------------------------------------------------------
483
// get config object and path for it
484
// ----------------------------------------------------------------------------
485
486
wxConfigBase *wxFontMapperBase::GetConfig()
487
0
{
488
0
    wxConfigBase *config = wxConfig::Get(false);
489
490
    // If there is no global configuration, use an internal memory configuration
491
0
    if ( !config )
492
0
    {
493
0
        if ( !m_configDummy )
494
0
            m_configDummy = new wxMemoryConfig;
495
0
        config = m_configDummy;
496
497
        // FIXME: ideally, we should add keys from dummy config to a real one later,
498
        //        but it is a low-priority task because typical wxWin application
499
        //        either doesn't use wxConfig at all or creates wxConfig object in
500
        //        wxApp::OnInit(), before any real interaction with the user takes
501
        //        place...
502
0
    }
503
504
0
    return config;
505
0
}
506
507
const wxString& wxFontMapperBase::GetConfigPath()
508
0
{
509
0
    if ( !m_configRootPath )
510
0
    {
511
        // use the default
512
0
        m_configRootPath = GetDefaultConfigPath();
513
0
    }
514
515
0
    return m_configRootPath;
516
0
}
517
518
// ----------------------------------------------------------------------------
519
// config helpers
520
// ----------------------------------------------------------------------------
521
522
bool wxFontMapperBase::ChangePath(const wxString& pathNew, wxString *pathOld)
523
0
{
524
0
    wxConfigBase *config = GetConfig();
525
0
    if ( !config )
526
0
        return false;
527
528
0
    *pathOld = config->GetPath();
529
530
0
    wxString path = GetConfigPath();
531
0
    if ( path.empty() || path.Last() != wxCONFIG_PATH_SEPARATOR )
532
0
    {
533
0
        path += wxCONFIG_PATH_SEPARATOR;
534
0
    }
535
536
0
    wxASSERT_MSG( !pathNew || (pathNew[0] != wxCONFIG_PATH_SEPARATOR),
537
0
                  wxT("should be a relative path") );
538
539
0
    path += pathNew;
540
541
0
    config->SetPath(path);
542
543
0
    return true;
544
0
}
545
546
void wxFontMapperBase::RestorePath(const wxString& pathOld)
547
0
{
548
0
    GetConfig()->SetPath(pathOld);
549
0
}
550
551
#endif
552
553
// ----------------------------------------------------------------------------
554
// charset/encoding correspondence
555
// ----------------------------------------------------------------------------
556
557
wxFontEncoding
558
wxFontMapperBase::CharsetToEncoding(const wxString& charset,
559
                                    bool WXUNUSED(interactive))
560
0
{
561
0
    int enc = NonInteractiveCharsetToEncoding(charset);
562
0
    if ( enc == wxFONTENCODING_UNKNOWN )
563
0
    {
564
        // we should return wxFONTENCODING_SYSTEM from here for unknown
565
        // encodings
566
0
        enc = wxFONTENCODING_SYSTEM;
567
0
    }
568
569
0
    return (wxFontEncoding)enc;
570
0
}
571
572
int
573
wxFontMapperBase::NonInteractiveCharsetToEncoding(const wxString& charset)
574
0
{
575
0
    wxFontEncoding encoding = wxFONTENCODING_SYSTEM;
576
577
    // we're going to modify it, make a copy
578
0
    wxString cs = charset;
579
580
0
#if wxUSE_CONFIG && wxUSE_FILECONFIG
581
    // first try the user-defined settings
582
0
    wxFontMapperPathChanger path(this, FONTMAPPER_CHARSET_PATH);
583
0
    if ( path.IsOk() )
584
0
    {
585
0
        wxConfigBase *config = GetConfig();
586
587
        // do we have an encoding for this charset?
588
0
        long value = config->Read(charset, -1l);
589
0
        if ( value != -1 )
590
0
        {
591
0
            if ( value == wxFONTENCODING_UNKNOWN )
592
0
            {
593
                // don't try to find it, in particular don't ask the user
594
0
                return value;
595
0
            }
596
597
0
            if ( value >= 0 && value <= wxFONTENCODING_MAX )
598
0
            {
599
0
                encoding = (wxFontEncoding)value;
600
0
            }
601
0
            else
602
0
            {
603
0
                wxLogDebug(wxT("corrupted config data: invalid encoding %ld for charset '%s' ignored"),
604
0
                           value, charset.c_str());
605
0
            }
606
0
        }
607
608
0
        if ( encoding == wxFONTENCODING_SYSTEM )
609
0
        {
610
            // may be we have an alias?
611
0
            config->SetPath(FONTMAPPER_CHARSET_ALIAS_PATH);
612
613
0
            wxString alias = config->Read(charset);
614
0
            if ( !alias.empty() )
615
0
            {
616
                // yes, we do - use it instead
617
0
                cs = alias;
618
0
            }
619
0
        }
620
0
    }
621
0
#endif // wxUSE_CONFIG
622
623
    // if didn't find it there, try to recognize it ourselves
624
0
    if ( encoding == wxFONTENCODING_SYSTEM )
625
0
    {
626
        // trim any spaces
627
0
        cs.Trim(true);
628
0
        cs.Trim(false);
629
630
        // discard the optional quotes
631
0
        if ( !cs.empty() )
632
0
        {
633
0
            if ( cs[0u] == wxT('"') && cs.Last() == wxT('"') )
634
0
            {
635
0
                cs = wxString(cs.c_str(), cs.length() - 1);
636
0
            }
637
0
        }
638
639
0
        for ( size_t i = 0; i < WXSIZEOF(gs_encodingNames); ++i )
640
0
        {
641
0
            for ( const wxChar* const* encName = gs_encodingNames[i]; *encName; ++encName )
642
0
            {
643
0
                if ( cs.CmpNoCase(*encName) == 0 )
644
0
                    return gs_encodings[i];
645
0
            }
646
0
        }
647
648
0
        cs.MakeUpper();
649
650
0
        if ( cs.Left(3) == wxT("ISO") )
651
0
        {
652
            // the dash is optional (or, to be exact, it is not, but
653
            // several broken programs "forget" it)
654
0
            const wxChar *p = cs.c_str() + 3;
655
0
            if ( *p == wxT('-') )
656
0
                p++;
657
658
0
            unsigned int value;
659
0
            if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 )
660
0
            {
661
                // make it 0 based and check that it is strictly positive in
662
                // the process (no such thing as iso8859-0 encoding)
663
0
                if ( (value-- > 0) &&
664
0
                     (value < wxFONTENCODING_ISO8859_MAX -
665
0
                              wxFONTENCODING_ISO8859_1) )
666
0
                {
667
                    // it's a valid ISO8859 encoding
668
0
                    value += wxFONTENCODING_ISO8859_1;
669
0
                    encoding = (wxFontEncoding)value;
670
0
                }
671
0
            }
672
0
        }
673
0
        else if ( cs.Left(4) == wxT("8859") )
674
0
        {
675
0
            const wxChar *p = cs.c_str();
676
677
0
            unsigned int value;
678
0
            if ( wxSscanf(p, wxT("8859-%u"), &value) == 1 )
679
0
            {
680
                // make it 0 based and check that it is strictly positive in
681
                // the process (no such thing as iso8859-0 encoding)
682
0
                if ( (value-- > 0) &&
683
0
                     (value < wxFONTENCODING_ISO8859_MAX -
684
0
                              wxFONTENCODING_ISO8859_1) )
685
0
                {
686
                    // it's a valid ISO8859 encoding
687
0
                    value += wxFONTENCODING_ISO8859_1;
688
0
                    encoding = (wxFontEncoding)value;
689
0
                }
690
0
            }
691
0
        }
692
0
        else // check for Windows charsets
693
0
        {
694
0
            size_t len;
695
0
            if ( cs.Left(7) == wxT("WINDOWS") )
696
0
            {
697
0
                len = 7;
698
0
            }
699
0
            else if ( cs.Left(2) == wxT("CP") )
700
0
            {
701
0
                len = 2;
702
0
            }
703
0
            else // not a Windows encoding
704
0
            {
705
0
                len = 0;
706
0
            }
707
708
0
            if ( len )
709
0
            {
710
0
                const wxChar *p = cs.c_str() + len;
711
0
                if ( *p == wxT('-') )
712
0
                    p++;
713
714
0
                unsigned int value;
715
0
                if ( wxSscanf(p, wxT("%u"), &value) == 1 )
716
0
                {
717
0
                    if ( value >= 1250 )
718
0
                    {
719
0
                        value -= 1250;
720
0
                        if ( value < wxFONTENCODING_CP12_MAX -
721
0
                                     wxFONTENCODING_CP1250 )
722
0
                        {
723
                            // a valid Windows code page
724
0
                            value += wxFONTENCODING_CP1250;
725
0
                            encoding = (wxFontEncoding)value;
726
0
                        }
727
0
                    }
728
729
0
                    switch ( value )
730
0
                    {
731
0
                        case 866:
732
0
                            encoding = wxFONTENCODING_CP866;
733
0
                            break;
734
735
0
                        case 874:
736
0
                            encoding = wxFONTENCODING_CP874;
737
0
                            break;
738
739
0
                        case 932:
740
0
                            encoding = wxFONTENCODING_CP932;
741
0
                            break;
742
743
0
                        case 936:
744
0
                            encoding = wxFONTENCODING_CP936;
745
0
                            break;
746
747
0
                        case 949:
748
0
                            encoding = wxFONTENCODING_CP949;
749
0
                            break;
750
751
0
                        case 950:
752
0
                            encoding = wxFONTENCODING_CP950;
753
0
                            break;
754
755
0
                        case 1258:
756
0
                            encoding = wxFONTENCODING_CP1258;
757
0
                            break;
758
759
0
                        case 1361:
760
0
                            encoding = wxFONTENCODING_CP1361;
761
0
                            break;
762
0
                    }
763
0
                }
764
0
            }
765
0
        }
766
        //else: unknown
767
0
    }
768
769
0
    return encoding;
770
0
}
771
772
/* static */
773
size_t wxFontMapperBase::GetSupportedEncodingsCount()
774
0
{
775
0
    return WXSIZEOF(gs_encodings);
776
0
}
777
778
/* static */
779
wxFontEncoding wxFontMapperBase::GetEncoding(size_t n)
780
0
{
781
0
    wxCHECK_MSG( n < WXSIZEOF(gs_encodings), wxFONTENCODING_SYSTEM,
782
0
                    wxT("wxFontMapper::GetEncoding(): invalid index") );
783
784
0
    return gs_encodings[n];
785
0
}
786
787
/* static */
788
wxString wxFontMapperBase::GetEncodingDescription(wxFontEncoding encoding)
789
0
{
790
0
    if ( encoding == wxFONTENCODING_DEFAULT )
791
0
    {
792
0
        return _("Default encoding");
793
0
    }
794
795
0
    const size_t count = WXSIZEOF(gs_encodingDescs);
796
797
0
    for ( size_t i = 0; i < count; i++ )
798
0
    {
799
0
        if ( gs_encodings[i] == encoding )
800
0
        {
801
0
            return wxGetTranslation(gs_encodingDescs[i]);
802
0
        }
803
0
    }
804
805
0
    wxString str;
806
0
    str.Printf(_("Unknown encoding (%d)"), encoding);
807
808
0
    return str;
809
0
}
810
811
/* static */
812
wxString wxFontMapperBase::GetEncodingName(wxFontEncoding encoding)
813
4
{
814
4
    if ( encoding == wxFONTENCODING_DEFAULT )
815
0
    {
816
0
        return _("default");
817
0
    }
818
819
4
    const size_t count = WXSIZEOF(gs_encodingNames);
820
821
4
    for ( size_t i = 0; i < count; i++ )
822
4
    {
823
4
        if ( gs_encodings[i] == encoding )
824
4
        {
825
4
            return gs_encodingNames[i][0];
826
4
        }
827
4
    }
828
829
0
    wxString str;
830
0
    str.Printf(_("unknown-%d"), encoding);
831
832
0
    return str;
833
4
}
834
835
/* static */
836
const wxChar** wxFontMapperBase::GetAllEncodingNames(wxFontEncoding encoding)
837
0
{
838
0
    static const wxChar* const dummy[] = { nullptr };
839
840
0
    for ( size_t i = 0; i < WXSIZEOF(gs_encodingNames); i++ )
841
0
    {
842
0
        if ( gs_encodings[i] == encoding )
843
0
        {
844
0
            return const_cast<const wxChar**>(gs_encodingNames[i]);
845
0
        }
846
0
    }
847
848
0
    return const_cast<const wxChar**>(dummy);
849
0
}
850
851
/* static */
852
wxFontEncoding wxFontMapperBase::GetEncodingFromName(const wxString& name)
853
2
{
854
2
    const size_t count = WXSIZEOF(gs_encodingNames);
855
856
84
    for ( size_t i = 0; i < count; i++ )
857
84
    {
858
440
        for ( const wxChar* const* encName = gs_encodingNames[i]; *encName; ++encName )
859
358
        {
860
358
            if ( name.CmpNoCase(*encName) == 0 )
861
2
                return gs_encodings[i];
862
358
        }
863
84
    }
864
865
0
    return wxFONTENCODING_MAX;
866
2
}
867
868
#endif // wxUSE_FONTMAP