1 /////////////////////////////////////////////////////////////////////////////
2 // Name: common/fontmap.cpp
3 // Purpose: wxFontMapper class
4 // Author: Vadim Zeitlin
8 // Copyright: (c) Vadim Zeitlin
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
21 #pragma implementation "fontmap.h"
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
39 #include "wx/module.h"
40 #include "wx/fontmap.h"
43 #include "wx/config.h"
44 #include "wx/memconf.h"
48 #include "wx/fontutil.h"
49 #include "wx/msgdlg.h"
50 #include "wx/fontdlg.h"
51 #include "wx/choicdlg.h"
54 #include "wx/encconv.h"
56 // ----------------------------------------------------------------------------
58 // ----------------------------------------------------------------------------
60 // the config paths we use
62 static const wxChar
* FONTMAPPER_ROOT_PATH
= wxT("/wxWindows/FontMapper");
63 static const wxChar
* FONTMAPPER_CHARSET_PATH
= wxT("Charsets");
64 static const wxChar
* FONTMAPPER_CHARSET_ALIAS_PATH
= wxT("Aliases");
66 // we only ask questions in GUI mode
68 static const wxChar
* FONTMAPPER_FONT_FROM_ENCODING_PATH
= wxT("Encodings");
69 static const wxChar
* FONTMAPPER_FONT_DONT_ASK
= wxT("none");
71 #endif // wxUSE_CONFIG
73 // encodings supported by GetEncodingDescription
74 static wxFontEncoding gs_encodings
[] =
76 wxFONTENCODING_ISO8859_1
,
77 wxFONTENCODING_ISO8859_2
,
78 wxFONTENCODING_ISO8859_3
,
79 wxFONTENCODING_ISO8859_4
,
80 wxFONTENCODING_ISO8859_5
,
81 wxFONTENCODING_ISO8859_6
,
82 wxFONTENCODING_ISO8859_7
,
83 wxFONTENCODING_ISO8859_8
,
84 wxFONTENCODING_ISO8859_9
,
85 wxFONTENCODING_ISO8859_10
,
86 wxFONTENCODING_ISO8859_11
,
87 wxFONTENCODING_ISO8859_12
,
88 wxFONTENCODING_ISO8859_13
,
89 wxFONTENCODING_ISO8859_14
,
90 wxFONTENCODING_ISO8859_15
,
96 wxFONTENCODING_CP1250
,
97 wxFONTENCODING_CP1251
,
98 wxFONTENCODING_CP1252
,
99 wxFONTENCODING_CP1253
,
100 wxFONTENCODING_CP1254
,
101 wxFONTENCODING_CP1255
,
102 wxFONTENCODING_CP1256
,
103 wxFONTENCODING_CP1257
,
104 wxFONTENCODING_CP437
,
109 // the descriptions for them
110 static const wxChar
* gs_encodingDescs
[] =
112 wxTRANSLATE( "Western European (ISO-8859-1)" ),
113 wxTRANSLATE( "Central European (ISO-8859-2)" ),
114 wxTRANSLATE( "Esperanto (ISO-8859-3)" ),
115 wxTRANSLATE( "Baltic (old) (ISO-8859-4)" ),
116 wxTRANSLATE( "Cyrillic (ISO-8859-5)" ),
117 wxTRANSLATE( "Arabic (ISO-8859-6)" ),
118 wxTRANSLATE( "Greek (ISO-8859-7)" ),
119 wxTRANSLATE( "Hebrew (ISO-8859-8)" ),
120 wxTRANSLATE( "Turkish (ISO-8859-9)" ),
121 wxTRANSLATE( "Nordic (ISO-8859-10)" ),
122 wxTRANSLATE( "Thai (ISO-8859-11)" ),
123 wxTRANSLATE( "Indian (ISO-8859-12)" ),
124 wxTRANSLATE( "Baltic (ISO-8859-13)" ),
125 wxTRANSLATE( "Celtic (ISO-8859-14)" ),
126 wxTRANSLATE( "Western European with Euro (ISO-8859-15)" ),
127 wxTRANSLATE( "KOI8-R" ),
128 wxTRANSLATE( "Windows Japanese (CP 932)" ),
129 wxTRANSLATE( "Windows Chinese Simplified (CP 936)" ),
130 wxTRANSLATE( "Windows Korean (CP 949)" ),
131 wxTRANSLATE( "Windows Chinese Traditional (CP 950)" ),
132 wxTRANSLATE( "Windows Central European (CP 1250)" ),
133 wxTRANSLATE( "Windows Cyrillic (CP 1251)" ),
134 wxTRANSLATE( "Windows Western European (CP 1252)" ),
135 wxTRANSLATE( "Windows Greek (CP 1253)" ),
136 wxTRANSLATE( "Windows Turkish (CP 1254)" ),
137 wxTRANSLATE( "Windows Hebrew (CP 1255)" ),
138 wxTRANSLATE( "Windows Arabic (CP 1256)" ),
139 wxTRANSLATE( "Windows Baltic (CP 1257)" ),
140 wxTRANSLATE( "Windows/DOS OEM (CP 437)" ),
141 wxTRANSLATE( "Unicode 7 bit (UTF-7)" ),
142 wxTRANSLATE( "Unicode 8 bit (UTF-8)" ),
145 // and the internal names (these are not translated on purpose!)
146 static const wxChar
* gs_encodingNames
[] =
157 wxT( "iso-8859-10" ),
158 wxT( "iso-8859-11" ),
159 wxT( "iso-8859-12" ),
160 wxT( "iso-8859-13" ),
161 wxT( "iso-8859-14" ),
162 wxT( "iso-8859-15" ),
164 wxT( "windows-932" ),
165 wxT( "windows-936" ),
166 wxT( "windows-949" ),
167 wxT( "windows-950" ),
168 wxT( "windows-1250" ),
169 wxT( "windows-1251" ),
170 wxT( "windows-1252" ),
171 wxT( "windows-1253" ),
172 wxT( "windows-1254" ),
173 wxT( "windows-1255" ),
174 wxT( "windows-1256" ),
175 wxT( "windows-1257" ),
176 wxT( "windows-437" ),
181 // ----------------------------------------------------------------------------
183 // ----------------------------------------------------------------------------
185 wxFontMapper
* wxTheFontMapper
= NULL
;
187 class wxFontMapperModule
: public wxModule
190 wxFontMapperModule() : wxModule() { }
191 virtual bool OnInit() { wxTheFontMapper
= new wxFontMapper
; return TRUE
; }
192 virtual void OnExit()
194 delete wxTheFontMapper
;
195 wxTheFontMapper
= NULL
;
198 DECLARE_DYNAMIC_CLASS(wxFontMapperModule
)
201 IMPLEMENT_DYNAMIC_CLASS(wxFontMapperModule
, wxModule
)
203 // ----------------------------------------------------------------------------
205 // ----------------------------------------------------------------------------
207 // change the config path during the lifetime of this object
208 class wxFontMapperPathChanger
211 wxFontMapperPathChanger(wxFontMapper
*fontMapper
, const wxString
& path
)
213 m_fontMapper
= fontMapper
;
214 m_ok
= m_fontMapper
->ChangePath(path
, &m_pathOld
);
217 bool IsOk() const { return m_ok
; }
219 ~wxFontMapperPathChanger()
222 m_fontMapper
->RestorePath(m_pathOld
);
226 wxFontMapper
*m_fontMapper
;
231 // ============================================================================
233 // ============================================================================
235 // ----------------------------------------------------------------------------
237 // ----------------------------------------------------------------------------
239 wxFontMapper::wxFontMapper()
243 m_configIsDummy
= FALSE
;
244 #endif // wxUSE_CONFIG
247 m_windowParent
= NULL
;
251 wxFontMapper::~wxFontMapper()
254 if ( m_configIsDummy
)
256 #endif // wxUSE_CONFIG
259 // ----------------------------------------------------------------------------
261 // ----------------------------------------------------------------------------
265 /* static */ const wxChar
*wxFontMapper::GetDefaultConfigPath()
267 return FONTMAPPER_ROOT_PATH
;
270 void wxFontMapper::SetConfigPath(const wxString
& prefix
)
272 wxCHECK_RET( !prefix
.IsEmpty() && prefix
[0] == wxCONFIG_PATH_SEPARATOR
,
273 wxT("an absolute path should be given to wxFontMapper::SetConfigPath()") );
275 m_configRootPath
= prefix
;
278 // ----------------------------------------------------------------------------
279 // get config object and path for it
280 // ----------------------------------------------------------------------------
282 wxConfigBase
*wxFontMapper::GetConfig()
287 m_config
= wxConfig::Get(FALSE
/*don't create on demand*/ );
291 // we still want to have a config object because otherwise we would
292 // keep asking the user the same questions in the interactive mode,
293 // so create a dummy config which won't write to any files/registry
294 // but will allow us to remember the results of the questions at
295 // least during this run
296 m_config
= new wxMemoryConfig
;
297 m_configIsDummy
= TRUE
;
298 // VS: we can't call wxConfig::Set(m_config) here because that would
299 // disable automatic wxConfig instance creation if this code was
300 // called before wxApp::OnInit (this happens in wxGTK -- it sets
301 // default wxFont encoding in wxApp::Initialize())
305 if ( m_configIsDummy
&& wxConfig::Get(FALSE
) != NULL
)
307 // VS: in case we created dummy m_config (see above), we want to switch back
308 // to the real one as soon as one becomes available.
310 m_config
= wxConfig::Get(FALSE
);
311 m_configIsDummy
= FALSE
;
312 // FIXME: ideally, we should add keys from dummy config to the real one now,
313 // but it is a low-priority task because typical wxWin application
314 // either doesn't use wxConfig at all or creates wxConfig object in
315 // wxApp::OnInit(), before any real interaction with the user takes
322 const wxString
& wxFontMapper::GetConfigPath()
324 if ( !m_configRootPath
)
327 m_configRootPath
= GetDefaultConfigPath();
330 return m_configRootPath
;
334 bool wxFontMapper::ChangePath(const wxString
& pathNew
, wxString
*pathOld
)
337 wxConfigBase
*config
= GetConfig();
341 *pathOld
= config
->GetPath();
343 wxString path
= GetConfigPath();
344 if ( path
.IsEmpty() || path
.Last() != wxCONFIG_PATH_SEPARATOR
)
346 path
+= wxCONFIG_PATH_SEPARATOR
;
349 wxASSERT_MSG( !pathNew
|| (pathNew
[0] != wxCONFIG_PATH_SEPARATOR
),
350 wxT("should be a relative path") );
354 config
->SetPath(path
);
362 void wxFontMapper::RestorePath(const wxString
& pathOld
)
365 GetConfig()->SetPath(pathOld
);
370 // ----------------------------------------------------------------------------
371 // charset/encoding correspondence
372 // ----------------------------------------------------------------------------
375 wxString
wxFontMapper::GetEncodingDescription(wxFontEncoding encoding
)
377 if ( encoding
== wxFONTENCODING_DEFAULT
)
379 return _("Default encoding");
382 size_t count
= WXSIZEOF(gs_encodingDescs
);
384 wxASSERT_MSG( count
== WXSIZEOF(gs_encodings
),
385 wxT("inconsitency detected - forgot to update one of the arrays?") );
387 for ( size_t i
= 0; i
< count
; i
++ )
389 if ( gs_encodings
[i
] == encoding
)
391 return wxGetTranslation(gs_encodingDescs
[i
]);
396 str
.Printf(_("Unknown encoding (%d)"), encoding
);
402 wxString
wxFontMapper::GetEncodingName(wxFontEncoding encoding
)
404 if ( encoding
== wxFONTENCODING_DEFAULT
)
409 size_t count
= WXSIZEOF(gs_encodingNames
);
411 wxASSERT_MSG( count
== WXSIZEOF(gs_encodings
),
412 wxT("inconsistency detected - forgot to update one of the arrays?") );
414 for ( size_t i
= 0; i
< count
; i
++ )
416 if ( gs_encodings
[i
] == encoding
)
418 return gs_encodingNames
[i
];
423 str
.Printf(_("unknown-%d"), encoding
);
428 wxFontEncoding
wxFontMapper::CharsetToEncoding(const wxString
& charset
,
431 // a special pseudo encoding which means "don't ask me about this charset
432 // any more" - we need it to avoid driving the user crazy with asking him
433 // time after time about the same charset which he [presumably] doesn't
434 // have the fonts fot
435 static const int wxFONTENCODING_UNKNOWN
= -2;
437 wxFontEncoding encoding
= wxFONTENCODING_SYSTEM
;
439 // we're going to modify it, make a copy
440 wxString cs
= charset
;
443 // first try the user-defined settings
445 if ( ChangePath(FONTMAPPER_CHARSET_PATH
, &pathOld
) )
447 wxConfigBase
*config
= GetConfig();
449 // do we have an encoding for this charset?
450 long value
= config
->Read(charset
, -1l);
453 if ( value
== wxFONTENCODING_UNKNOWN
)
455 // don't try to find it, in particular don't ask the user
456 return wxFONTENCODING_SYSTEM
;
459 if ( value
>= 0 && value
<= wxFONTENCODING_MAX
)
461 encoding
= (wxFontEncoding
)value
;
465 wxLogDebug(wxT("corrupted config data: invalid encoding %ld for charset '%s' ignored"),
466 value
, charset
.c_str());
470 if ( encoding
== wxFONTENCODING_SYSTEM
)
472 // may be we have an alias?
473 config
->SetPath(FONTMAPPER_CHARSET_ALIAS_PATH
);
475 wxString alias
= config
->Read(charset
);
478 // yes, we do - use it instead
483 RestorePath(pathOld
);
485 #endif // wxUSE_CONFIG
487 // if didn't find it there, try to recognize it ourselves
488 if ( encoding
== wxFONTENCODING_SYSTEM
)
494 // discard the optional quotes
497 if ( cs
[0u] == _T('"') && cs
.Last() == _T('"') )
499 cs
= wxString(cs
.c_str(), cs
.length() - 1);
505 if ( cs
.empty() || cs
== _T("US-ASCII") )
507 encoding
= wxFONTENCODING_DEFAULT
;
509 else if ( cs
== wxT("UTF-7") )
511 encoding
= wxFONTENCODING_UTF7
;
513 else if ( cs
== wxT("UTF-8") )
515 encoding
= wxFONTENCODING_UTF8
;
517 else if ( cs
== wxT("KOI8-R") ||
518 cs
== wxT("KOI8-U") ||
519 cs
== wxT("KOI8-RU") )
521 // although koi8-ru is not strictly speaking the same as koi8-r,
522 // they are similar enough to make mapping it to koi8 better than
523 // not reckognizing it at all
524 encoding
= wxFONTENCODING_KOI8
;
526 else if ( cs
.Left(3) == wxT("ISO") )
528 // the dash is optional (or, to be exact, it is not, but
529 // several brokenmails "forget" it)
530 const wxChar
*p
= cs
.c_str() + 3;
531 if ( *p
== wxT('-') )
535 if ( wxSscanf(p
, wxT("8859-%u"), &value
) == 1 )
537 // make it 0 based and check that it is strictly positive in
538 // the process (no such thing as iso8859-0 encoding)
539 if ( (value
-- > 0) &&
540 (value
< wxFONTENCODING_ISO8859_MAX
-
541 wxFONTENCODING_ISO8859_1
) )
543 // it's a valid ISO8859 encoding
544 value
+= wxFONTENCODING_ISO8859_1
;
545 encoding
= (wxFontEncoding
)value
;
549 else // check for Windows charsets
552 if ( cs
.Left(7) == wxT("WINDOWS") )
556 else if ( cs
.Left(2) == wxT("CP") )
560 else // not a Windows encoding
567 const wxChar
*p
= cs
.c_str() + len
;
568 if ( *p
== wxT('-') )
572 if ( wxSscanf(p
, wxT("%u"), &value
) == 1 )
577 if ( value
< wxFONTENCODING_CP12_MAX
-
578 wxFONTENCODING_CP1250
)
580 // a valid Windows code page
581 value
+= wxFONTENCODING_CP1250
;
582 encoding
= (wxFontEncoding
)value
;
589 encoding
= wxFONTENCODING_CP932
;
593 encoding
= wxFONTENCODING_CP936
;
597 encoding
= wxFONTENCODING_CP949
;
601 encoding
= wxFONTENCODING_CP950
;
611 // if still no luck, ask the user - unless disabled
612 if ( (encoding
== wxFONTENCODING_SYSTEM
) && interactive
)
614 // prepare the dialog data
617 wxString
title(m_titleDialog
);
619 title
<< wxTheApp
->GetAppName() << _(": unknown charset");
623 msg
.Printf(_("The charset '%s' is unknown. You may select\nanother charset to replace it with or choose\n[Cancel] if it cannot be replaced"), charset
.c_str());
625 // the list of choices
626 size_t count
= WXSIZEOF(gs_encodingDescs
);
628 wxASSERT_MSG( count
== WXSIZEOF(gs_encodings
),
629 wxT("inconsitency detected - forgot to update one of the arrays?") );
631 wxString
*encodingNamesTranslated
= new wxString
[count
];
633 for ( size_t i
= 0; i
< count
; i
++ )
635 encodingNamesTranslated
[i
] = wxGetTranslation(gs_encodingDescs
[i
]);
639 wxWindow
*parent
= m_windowParent
;
641 parent
= wxTheApp
->GetTopWindow();
643 // do ask the user and get back the index in encodings table
644 int n
= wxGetSingleChoiceIndex(msg
, title
,
646 encodingNamesTranslated
,
649 delete [] encodingNamesTranslated
;
653 encoding
= gs_encodings
[n
];
657 // save the result in the config now
658 if ( ChangePath(FONTMAPPER_CHARSET_PATH
, &pathOld
) )
660 wxConfigBase
*config
= GetConfig();
662 // remember the alt encoding for this charset - or remember that
664 long value
= n
== -1 ? wxFONTENCODING_UNKNOWN
: (long)encoding
;
665 if ( !config
->Write(charset
, value
) )
667 wxLogError(_("Failed to remember the encoding for the charset '%s'."), charset
.c_str());
670 RestorePath(pathOld
);
672 #endif // wxUSE_CONFIG
679 // ----------------------------------------------------------------------------
680 // support for unknown encodings: we maintain a map between the
681 // (platform-specific) strings identifying them and our wxFontEncodings they
682 // correspond to which is used by GetFontForEncoding() function
683 // ----------------------------------------------------------------------------
687 bool wxFontMapper::TestAltEncoding(const wxString
& configEntry
,
688 wxFontEncoding encReplacement
,
689 wxNativeEncodingInfo
*info
)
691 if ( wxGetNativeFontEncoding(encReplacement
, info
) &&
692 wxTestFontEncoding(*info
) )
695 // remember the mapping in the config
696 wxFontMapperPathChanger
path(this, FONTMAPPER_FONT_FROM_ENCODING_PATH
);
700 GetConfig()->Write(configEntry
, info
->ToString());
702 #endif // wxUSE_CONFIG
710 class ReentrancyBlocker
713 ReentrancyBlocker(bool& b
) : m_b(b
) { m_b
= TRUE
; }
714 ~ReentrancyBlocker() { m_b
= FALSE
; }
721 bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding
,
722 wxNativeEncodingInfo
*info
,
723 const wxString
& facename
,
727 // we need a flag to prevent infinite recursion which happens, for
728 // example, when GetAltForEncoding() is called from an OnPaint() handler:
729 // in this case, wxYield() which is called from wxMessageBox() we use here
730 // will lead to another call of OnPaint() and hence to another call of
731 // GetAltForEncoding() - and it is impossible to catch this from the user
732 // code because we are called from wxFont ctor implicitly.
734 // assume we're always called from the main thread, so that it is safe to
736 static bool s_inGetAltForEncoding
= FALSE
;
738 if ( interactive
&& s_inGetAltForEncoding
)
741 ReentrancyBlocker
blocker(s_inGetAltForEncoding
);
744 wxCHECK_MSG( info
, FALSE
, wxT("bad pointer in GetAltForEncoding") );
746 info
->facename
= facename
;
748 if ( encoding
== wxFONTENCODING_DEFAULT
)
750 encoding
= wxFont::GetDefaultEncoding();
753 // if we failed to load the system default encoding, something is really
754 // wrong and we'd better stop now - otherwise we will go into endless
755 // recursion trying to create the font in the msg box with the error
757 if ( encoding
== wxFONTENCODING_SYSTEM
)
759 wxLogFatalError(_("can't load any font, aborting"));
761 // wxLogFatalError doesn't return
764 wxString configEntry
,
765 encName
= GetEncodingName(encoding
);
768 configEntry
= facename
+ _T("_");
770 configEntry
+= encName
;
773 // do we have a font spec for this encoding?
775 if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH
, &pathOld
) )
777 wxConfigBase
*config
= GetConfig();
779 wxString fontinfo
= config
->Read(configEntry
);
781 RestorePath(pathOld
);
783 // this special value means that we don't know of fonts for this
784 // encoding but, moreover, have already asked the user as well and he
785 // didn't specify any font neither
786 if ( fontinfo
== FONTMAPPER_FONT_DONT_ASK
)
790 else // use the info entered the last time
792 if ( !!fontinfo
&& !!facename
)
794 // we tried to find a match with facename - now try without it
795 fontinfo
= config
->Read(encName
);
800 if ( info
->FromString(fontinfo
) )
802 if ( wxTestFontEncoding(*info
) )
807 //else: no such fonts, look for something else
808 // (should we erase the outdated value?)
812 wxLogDebug(wxT("corrupted config data: string '%s' is not a valid font encoding info"),
816 //else: there is no information in config about this encoding
819 #endif // wxUSE_CONFIG
821 // now try to map this encoding to a compatible one which we have on this
823 wxFontEncodingArray equiv
= wxEncodingConverter::GetAllEquivalents(encoding
);
824 size_t count
= equiv
.GetCount();
825 bool foundEquivEncoding
= FALSE
;
826 wxFontEncoding equivEncoding
= wxFONTENCODING_SYSTEM
;
829 for ( size_t i
= 0; i
< count
&& !foundEquivEncoding
; i
++ )
831 // don't test for encoding itself, we already know we don't have it
832 if ( equiv
[i
] == encoding
)
835 if ( TestAltEncoding(configEntry
, equiv
[i
], info
) )
837 equivEncoding
= equiv
[i
];
839 foundEquivEncoding
= TRUE
;
848 wxString
title(m_titleDialog
);
850 title
<< wxTheApp
->GetAppName() << _(": unknown encoding");
853 wxString encDesc
= GetEncodingDescription(encoding
),
855 if ( foundEquivEncoding
)
857 // ask the user if he wants to override found alternative encoding
858 msg
.Printf(_("No font for displaying text in encoding '%s' found,\nbut an alternative encoding '%s' is available.\nDo you want to use this encoding (otherwise you will have to choose another one)?"),
859 encDesc
.c_str(), GetEncodingDescription(equivEncoding
).c_str());
863 msg
.Printf(_("No font for displaying text in encoding '%s' found.\nWould you like to select a font to be used for this encoding\n(otherwise the text in this encoding will not be shown correctly)?"),
867 // the question is different in 2 cases so the answer has to be
868 // interpreted differently as well
869 int answer
= foundEquivEncoding
? wxNO
: wxYES
;
871 if ( wxMessageBox(msg
, title
,
872 wxICON_QUESTION
| wxYES_NO
,
873 m_windowParent
) == answer
)
876 data
.SetEncoding(encoding
);
877 data
.EncodingInfo() = *info
;
878 wxFontDialog
dialog(m_windowParent
, &data
);
879 if ( dialog
.ShowModal() == wxID_OK
)
881 wxFontData retData
= dialog
.GetFontData();
882 wxFont font
= retData
.GetChosenFont();
884 *info
= retData
.EncodingInfo();
885 info
->encoding
= retData
.GetEncoding();
888 // remember this in the config
889 if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH
, &pathOld
) )
891 GetConfig()->Write(configEntry
, info
->ToString());
893 RestorePath(pathOld
);
895 #endif // wxUSE_CONFIG
899 //else: the user canceled the font selection dialog
903 // the user doesn't want to select a font for this encoding
904 // or selected to use equivalent encoding
906 // remember it to avoid asking the same question again later
908 if ( ChangePath(FONTMAPPER_FONT_FROM_ENCODING_PATH
, &pathOld
) )
913 foundEquivEncoding
? info
->ToString().c_str()
914 : FONTMAPPER_FONT_DONT_ASK
917 RestorePath(pathOld
);
919 #endif // wxUSE_CONFIG
922 //else: we're in non-interactive mode
923 #endif // wxUSE_FONTDLG
925 return foundEquivEncoding
;
928 bool wxFontMapper::GetAltForEncoding(wxFontEncoding encoding
,
929 wxFontEncoding
*alt_encoding
,
930 const wxString
& facename
,
933 wxNativeEncodingInfo info
;
934 bool r
= GetAltForEncoding(encoding
, &info
, facename
, interactive
);
935 *alt_encoding
= info
.encoding
;
939 bool wxFontMapper::IsEncodingAvailable(wxFontEncoding encoding
,
940 const wxString
& facename
)
942 wxNativeEncodingInfo info
;
944 if (wxGetNativeFontEncoding(encoding
, &info
))
946 info
.facename
= facename
;
947 return wxTestFontEncoding(info
);
955 #endif // wxUSE_FONTMAP