]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/fontutil.cpp
another segfault fix
[wxWidgets.git] / src / msw / fontutil.cpp
index b8daf3dcdb01bce1cba14102824a8c85ae0b2134..5fdf917e370e22c06289625248f5d867a6370d7a 100644 (file)
 
 #include "wx/tokenzr.h"
 
 
 #include "wx/tokenzr.h"
 
-// If 1, use the screen resolution to calculate font sizes.
-// This is OK for screen fonts but might have implications when the
-// same font is used for printing.
-// If 0, assume 96 DPI.
-#define wxUSE_SCREEN_DPI 1
+// for MSVC5 and old w32api
+#ifndef HANGUL_CHARSET
+#    define HANGUL_CHARSET  129
+#endif
 
 // ============================================================================
 // implementation
 
 // ============================================================================
 // implementation
@@ -69,8 +68,6 @@ bool wxNativeEncodingInfo::FromString(const wxString& s)
     encoding = (wxFontEncoding)enc;
 
     facename = tokenizer.GetNextToken();
     encoding = (wxFontEncoding)enc;
 
     facename = tokenizer.GetNextToken();
-    if ( !facename )
-        return FALSE;
 
     wxString tmp = tokenizer.GetNextToken();
     if ( !tmp )
 
     wxString tmp = tokenizer.GetNextToken();
     if ( !tmp )
@@ -129,7 +126,26 @@ bool wxGetNativeFontEncoding(wxFontEncoding encoding,
             info->charset = ANSI_CHARSET;
             break;
 
             info->charset = ANSI_CHARSET;
             break;
 
-#if !defined(__WIN16__)
+#if !defined(__WIN16__) && !defined(__WXMICROWIN__)
+
+        // The following four fonts are multi-byte charsets
+        case wxFONTENCODING_CP932:
+            info->charset = SHIFTJIS_CHARSET;
+            break;
+
+        case wxFONTENCODING_CP936:
+            info->charset = GB2312_CHARSET;
+            break;
+
+        case wxFONTENCODING_CP949:
+            info->charset = HANGUL_CHARSET;
+            break;
+
+        case wxFONTENCODING_CP950:
+            info->charset = CHINESEBIG5_CHARSET;
+            break;
+
+        // The rest are single byte encodings
         case wxFONTENCODING_CP1250:
             info->charset = EASTEUROPE_CHARSET;
             break;
         case wxFONTENCODING_CP1250:
             info->charset = EASTEUROPE_CHARSET;
             break;
@@ -161,6 +177,8 @@ bool wxGetNativeFontEncoding(wxFontEncoding encoding,
         case wxFONTENCODING_CP874:
             info->charset = THAI_CHARSET;
             break;
         case wxFONTENCODING_CP874:
             info->charset = THAI_CHARSET;
             break;
+
+
 #endif // !Win16
 
         case wxFONTENCODING_CP437:
 #endif // !Win16
 
         case wxFONTENCODING_CP437:
@@ -219,7 +237,7 @@ wxFontEncoding wxGetFontEncFromCharSet(int cs)
             fontEncoding = wxFONTENCODING_CP1252;
             break;
 
             fontEncoding = wxFONTENCODING_CP1252;
             break;
 
-#ifdef __WIN32__
+#if defined(__WIN32__) && !defined(__WXMICROWIN__)
         case EASTEUROPE_CHARSET:
             fontEncoding = wxFONTENCODING_CP1250;
             break;
         case EASTEUROPE_CHARSET:
             fontEncoding = wxFONTENCODING_CP1250;
             break;
@@ -251,6 +269,23 @@ wxFontEncoding wxGetFontEncFromCharSet(int cs)
         case THAI_CHARSET:
             fontEncoding = wxFONTENCODING_CP437;
             break;
         case THAI_CHARSET:
             fontEncoding = wxFONTENCODING_CP437;
             break;
+
+        case SHIFTJIS_CHARSET:
+            fontEncoding = wxFONTENCODING_CP932;
+            break;
+
+        case GB2312_CHARSET:
+            fontEncoding = wxFONTENCODING_CP936;
+            break;
+
+        case HANGUL_CHARSET:
+            fontEncoding = wxFONTENCODING_CP949;
+            break;
+
+        case CHINESEBIG5_CHARSET:
+            fontEncoding = wxFONTENCODING_CP950;
+            break;
+
 #endif // Win32
 
         case OEM_CHARSET:
 #endif // Win32
 
         case OEM_CHARSET:
@@ -339,24 +374,28 @@ void wxFillLogFont(LOGFONT *logFont, const wxFont *font)
             break;
     }
 
             break;
     }
 
-#if wxUSE_SCREEN_DPI
-    HDC dc = ::GetDC(NULL);
-    static const int ppInch = ::GetDeviceCaps(dc, LOGPIXELSY);
-    ::ReleaseDC(NULL, dc);
-#else
+    // VZ: I'm reverting this as we clearly must use the real screen
+    //     resolution instead of hardcoded one or it surely will fail to work
+    //     in some cases.
+    //
+    //     If there are any problems with this code, please let me know about
+    //     it instead of reverting this change, thanks!
+#if 1 // wxUSE_SCREEN_DPI
+    const int ppInch = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY);
+#else // 0
     // New behaviour: apparently ppInch varies according to Large/Small Fonts
     // setting in Windows. This messes up fonts. So, set ppInch to a constant
     // 96 dpi.
     static const int ppInch = 96;
     // New behaviour: apparently ppInch varies according to Large/Small Fonts
     // setting in Windows. This messes up fonts. So, set ppInch to a constant
     // 96 dpi.
     static const int ppInch = 96;
-#endif // 0/1
+#endif // 1/0
 
 
+    int pointSize = font->GetPointSize();
 #if wxFONT_SIZE_COMPATIBILITY
     // Incorrect, but compatible with old wxWindows behaviour
 #if wxFONT_SIZE_COMPATIBILITY
     // Incorrect, but compatible with old wxWindows behaviour
-    int nHeight = (font->GetPointSize()*ppInch/72);
+    int nHeight = (pointSize*ppInch)/72;
 #else
     // Correct for Windows compatibility
 #else
     // Correct for Windows compatibility
-//    int nHeight = - (font->GetPointSize()*ppInch/72);
-    int nHeight = - (int) ( (font->GetPointSize()*((double)ppInch)/72.0) + 0.5);
+    int nHeight = -(int)((pointSize*((double)ppInch)/72.0) + 0.5);
 #endif
 
     wxString facename = font->GetFaceName();
 #endif
 
     wxString facename = font->GetFaceName();
@@ -371,7 +410,9 @@ void wxFillLogFont(LOGFONT *logFont, const wxFont *font)
     wxFontEncoding encoding = font->GetEncoding();
     if ( !wxGetNativeFontEncoding(encoding, &info) )
     {
     wxFontEncoding encoding = font->GetEncoding();
     if ( !wxGetNativeFontEncoding(encoding, &info) )
     {
+#if wxUSE_FONTMAP
         if ( !wxTheFontMapper->GetAltForEncoding(encoding, &info) )
         if ( !wxTheFontMapper->GetAltForEncoding(encoding, &info) )
+#endif // wxUSE_FONTMAP
         {
             // unsupported encoding, replace with the default
             info.charset = ANSI_CHARSET;
         {
             // unsupported encoding, replace with the default
             info.charset = ANSI_CHARSET;