wxStringTokenizer tokenizer(s, _T(";"));
wxString encid = tokenizer.GetNextToken();
+
+ // we support 2 formats: the old one (and still used if !wxUSE_FONTMAP)
+ // used the raw encoding values but the new one uses the encoding names
long enc;
- if ( !encid.ToLong(&enc) )
- return FALSE;
- encoding = (wxFontEncoding)enc;
+ if ( encid.ToLong(&enc) )
+ {
+ // old format, intepret as encoding -- but after minimal checks
+ if ( enc < 0 || enc >= wxFONTENCODING_MAX )
+ return false;
+
+ encoding = (wxFontEncoding)enc;
+ }
+ else // not a number, interpret as an encoding name
+ {
+#if wxUSE_FONTMAP
+ encoding = wxFontMapper::GetEncodingFromName(encid);
+ if ( encoding == wxFONTENCODING_MAX )
+#endif // wxUSE_FONTMAP
+ {
+ // failed to parse the name (or couldn't even try...)
+ return false;
+ }
+ }
facename = tokenizer.GetNextToken();
{
wxString s;
- s << (long)encoding << _T(';') << facename;
+ s
+#if wxUSE_FONTMAP
+ // use the encoding names as this is safer than using the numerical
+ // values which may change with time (because new encodings are
+ // inserted...)
+ << wxFontMapper::GetEncodingName(encoding)
+#else // !wxUSE_FONTMAP
+ // we don't have any choice but to use the raw value
+ << (long)encoding
+#endif // wxUSE_FONTMAP/!wxUSE_FONTMAP
+ << _T(';') << facename;
// ANSI_CHARSET is assumed anyhow
if ( charset != ANSI_CHARSET )
switch ( cs )
{
default:
- // assume the system charset
+ wxFAIL_MSG( _T("unexpected Win32 charset") );
+ // fall through and assume the system charset
+
+ case DEFAULT_CHARSET:
fontEncoding = wxFONTENCODING_SYSTEM;
break;
fontEncoding = wxFONTENCODING_CP1252;
break;
+ case SYMBOL_CHARSET:
+ // what can we do here?
+ fontEncoding = wxFONTENCODING_MAX;
+ break;
+
#if defined(__WIN32__) && !defined(__WXMICROWIN__)
case EASTEUROPE_CHARSET:
fontEncoding = wxFONTENCODING_CP1250;