]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/fontutil.cpp
added wxUSE_NOTEBOOK to include/wx/msw/setup0.h, removed wxUSE_RADIOBUTTON (we
[wxWidgets.git] / src / unix / fontutil.cpp
index 774dd534bd46e8020038e41848d35e0d6572ea2e..db1939e352a72d3a9e63a0b54688b866093f9ded 100644 (file)
 #endif // PCH
 
 #ifdef __X__
-    #include <X11/Xlib.h>
+#ifdef __VMS__
+#pragma message disable nosimpint
+#endif
+#include <X11/Xlib.h>
+#ifdef __VMS__
+#pragma message enable nosimpint
+#endif
 
     #include "wx/utils.h"       // for wxGetDisplay()
 #elif defined(__WXGTK__)
 #include "wx/fontutil.h"
 #include "wx/fontmap.h"
 #include "wx/tokenzr.h"
+#include "wx/hash.h"
+#include "wx/module.h"
+
+// ----------------------------------------------------------------------------
+// private data
+// ----------------------------------------------------------------------------
+
+static wxHashTable *g_fontHash = (wxHashTable*) NULL;
 
 // ----------------------------------------------------------------------------
 // private functions
 
     static inline void wxFreeFont(wxNativeFont font)
     {
-        XFreeFont((Display *)wxGetDisplay(), font);
+        XFreeFont((Display *)wxGetDisplay(), (XFontStruct *)font);
     }
 #elif defined(__WXGTK__)
     static inline wxNativeFont wxLoadFont(const wxString& fontSpec)
     {
-        return gdk_font_load( wxConvertWX2MB(fontSpec) );
+       return gdk_font_load( wxConvertWX2MB(fontSpec) );
     }
 
     static inline void wxFreeFont(wxNativeFont font)
@@ -184,7 +198,7 @@ bool wxGetNativeFontEncoding(wxFontEncoding encoding,
 
         case wxFONTENCODING_SYSTEM:
             info->xregistry =
-            info->xencoding = wxT('*');
+            info->xencoding = wxT("*");
             break;
 
         default:
@@ -192,6 +206,8 @@ bool wxGetNativeFontEncoding(wxFontEncoding encoding,
             return FALSE;
     }
 
+   info->encoding = encoding;
+
     return TRUE;
 }
 
@@ -218,25 +234,38 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize,
                                     const wxString &facename,
                                     wxFontEncoding encoding)
 {
+    if ( encoding == wxFONTENCODING_DEFAULT )
+    {
+        encoding = wxFont::GetDefaultEncoding();
+    }
+
     // first determine the encoding - if the font doesn't exist at all in this
     // encoding, it's useless to do all other approximations (i.e. size,
     // family &c don't matter much)
     wxNativeEncodingInfo info;
-    if ( !wxGetNativeFontEncoding(encoding, &info) ||
-         !wxTestFontEncoding(info) )
+    if ( encoding == wxFONTENCODING_SYSTEM )
     {
-        if ( !wxTheFontMapper->GetAltForEncoding(encoding, &info) )
+        // This will always work so we don't test to save time
+        wxGetNativeFontEncoding(wxFONTENCODING_SYSTEM, &info);
+    }
+    else
+    {
+        if ( !wxGetNativeFontEncoding(encoding, &info) ||
+             !wxTestFontEncoding(info) )
         {
-            // unspported encoding - replace it with the default
-            //
-            // NB: we can't just return 0 from here because wxGTK code doesn't
-            //     check for it (i.e. it supposes that we'll always succeed),
-            //     so it would provoke a crash
-            wxGetNativeFontEncoding(wxFONTENCODING_SYSTEM, &info);
+            if ( !wxTheFontMapper->GetAltForEncoding(encoding, &info) )
+            {
+                // unspported encoding - replace it with the default
+                //
+                // NB: we can't just return 0 from here because wxGTK code doesn't
+                //     check for it (i.e. it supposes that we'll always succeed),
+                //     so it would provoke a crash
+                wxGetNativeFontEncoding(wxFONTENCODING_SYSTEM, &info);
+            }
         }
     }
-    //else: we have the correct xregistry/xencoding in info structure
-
+    
+    // OK, we have the correct xregistry/xencoding in info structure
     wxNativeFont font = wxLoadQueryFont( pointSize, family, style, weight,
                                          underlined, facename,
                                          info.xregistry, info.xencoding );
@@ -298,7 +327,23 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize,
 // returns TRUE if there are any fonts matching this font spec
 static bool wxTestFontSpec(const wxString& fontspec)
 {
-    wxNativeFont test = wxLoadFont(fontspec);
+    // some X servers will fail to load this font because there are too many
+    // matches so we must test explicitly for this
+    if ( fontspec == _T("-*-*-*-*-*-*-*-*-*-*-*-*-*-*") )
+    {
+        return TRUE;
+    }
+
+    wxNativeFont test = (wxNativeFont) g_fontHash->Get( fontspec );
+    if (test)
+    {
+//        printf( "speed up\n" );
+        return TRUE;
+    }
+
+    test = wxLoadFont(fontspec);
+    g_fontHash->Put( fontspec, (wxObject*) test );
+    
     if ( test )
     {
         wxFreeFont(test);
@@ -348,10 +393,47 @@ static wxNativeFont wxLoadQueryFont(int pointSize,
     wxString xstyle;
     switch (style)
     {
-        case wxITALIC:     xstyle = wxT("i"); break;
-        case wxSLANT:      xstyle = wxT("o"); break;
-        case wxNORMAL:     xstyle = wxT("r"); break;
-        default:           xstyle = wxT("*"); break;
+        case wxSLANT:
+            fontSpec.Printf(wxT("-*-%s-*-o-*-*-*-*-*-*-*-*-*-*"),
+                    xfamily.c_str());
+            if ( wxTestFontSpec(fontSpec) )
+            {
+                xstyle = wxT("o");
+                break;
+            }
+            // fall through - try wxITALIC now
+
+        case wxITALIC:
+            fontSpec.Printf(wxT("-*-%s-*-i-*-*-*-*-*-*-*-*-*-*"),
+                    xfamily.c_str());
+            if ( wxTestFontSpec(fontSpec) )
+            {
+                xstyle = wxT("i");
+            }
+            else if ( style == wxITALIC ) // and not wxSLANT
+            {
+                // try wxSLANT
+                fontSpec.Printf(wxT("-*-%s-*-o-*-*-*-*-*-*-*-*-*-*"),
+                        xfamily.c_str());
+                if ( wxTestFontSpec(fontSpec) )
+                {
+                    xstyle = wxT("o");
+                }
+                else
+                {
+                    // no italic, no slant - leave default
+                    xstyle = wxT("*");
+                }
+            }
+            break;
+
+        default:
+            wxFAIL_MSG(_T("unknown font style"));
+            // fall back to normal
+
+        case wxNORMAL:
+            xstyle = wxT("r");
+            break;
     }
 
     wxString xweight;
@@ -458,3 +540,32 @@ static wxNativeFont wxLoadQueryFont(int pointSize,
     return wxLoadFont(fontSpec);
 }
 
+// ----------------------------------------------------------------------------
+// wxFontModule
+// ----------------------------------------------------------------------------
+
+class wxFontModule : public wxModule
+{
+public:
+    bool OnInit();
+    void OnExit();
+
+private:
+    DECLARE_DYNAMIC_CLASS(wxFontModule)
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxFontModule, wxModule)
+
+bool wxFontModule::OnInit()
+{
+    g_fontHash = new wxHashTable( wxKEY_STRING );
+
+    return TRUE;
+}
+
+void wxFontModule::OnExit()
+{
+    delete g_fontHash;
+
+    g_fontHash = (wxHashTable *)NULL;
+}