]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/fontutil.cpp
Committing in .
[wxWidgets.git] / src / unix / fontutil.cpp
index db1939e352a72d3a9e63a0b54688b866093f9ded..3b3444b4abcb17719aea9329ea36b1d327389c62 100644 (file)
 #endif // PCH
 
 #ifdef __X__
 #endif // PCH
 
 #ifdef __X__
-#ifdef __VMS__
-#pragma message disable nosimpint
-#endif
-#include <X11/Xlib.h>
-#ifdef __VMS__
-#pragma message enable nosimpint
-#endif
+    #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/utils.h"       // for wxGetDisplay()
 #elif defined(__WXGTK__)
-    #include "gdk/gdk.h"
+    // we have to declare struct tm to avoid problems with first forward
+    // declaring it in C code (glib.h included from gdk.h does it) and then
+    // defining it when time.h is included from the headers below - this is
+    // known not to work at least with Sun CC 6.01
+    #include <time.h>
+
+    #include <gdk/gdk.h>
 #endif
 
 #include "wx/fontutil.h"
 #endif
 
 #include "wx/fontutil.h"
@@ -95,7 +103,8 @@ static wxNativeFont wxLoadQueryFont(int pointSize,
                                     bool underlined,
                                     const wxString& facename,
                                     const wxString& xregistry,
                                     bool underlined,
                                     const wxString& facename,
                                     const wxString& xregistry,
-                                    const wxString& xencoding);
+                                    const wxString& xencoding,
+                                    wxString* xFontName);
 
 // ============================================================================
 // implementation
 
 // ============================================================================
 // implementation
@@ -106,10 +115,17 @@ static wxNativeFont wxLoadQueryFont(int pointSize,
 // ----------------------------------------------------------------------------
 
 // convert to/from the string representation: format is
 // ----------------------------------------------------------------------------
 
 // convert to/from the string representation: format is
-//      registry-encoding[-facename]
+//      encodingid;registry;encoding[;facename]
 bool wxNativeEncodingInfo::FromString(const wxString& s)
 {
 bool wxNativeEncodingInfo::FromString(const wxString& s)
 {
-    wxStringTokenizer tokenizer(s, _T("-"));
+    // use ";", not "-" because it may be part of encoding name
+    wxStringTokenizer tokenizer(s, _T(";"));
+
+    wxString encid = tokenizer.GetNextToken();
+    long enc;
+    if ( !encid.ToLong(&enc) )
+        return FALSE;
+    encoding = (wxFontEncoding)enc;
 
     xregistry = tokenizer.GetNextToken();
     if ( !xregistry )
 
     xregistry = tokenizer.GetNextToken();
     if ( !xregistry )
@@ -128,10 +144,10 @@ bool wxNativeEncodingInfo::FromString(const wxString& s)
 wxString wxNativeEncodingInfo::ToString() const
 {
     wxString s;
 wxString wxNativeEncodingInfo::ToString() const
 {
     wxString s;
-    s << xregistry << _T('-') << xencoding;
+    s << (long)encoding << _T(';') << xregistry << _T(';') << xencoding;
     if ( !!facename )
     {
     if ( !!facename )
     {
-        s << _T('-') << facename;
+        s << _T(';') << facename;
     }
 
     return s;
     }
 
     return s;
@@ -164,6 +180,7 @@ bool wxGetNativeFontEncoding(wxFontEncoding encoding,
         case wxFONTENCODING_ISO8859_9:
         case wxFONTENCODING_ISO8859_10:
         case wxFONTENCODING_ISO8859_11:
         case wxFONTENCODING_ISO8859_9:
         case wxFONTENCODING_ISO8859_10:
         case wxFONTENCODING_ISO8859_11:
+        case wxFONTENCODING_ISO8859_12:
         case wxFONTENCODING_ISO8859_13:
         case wxFONTENCODING_ISO8859_14:
         case wxFONTENCODING_ISO8859_15:
         case wxFONTENCODING_ISO8859_13:
         case wxFONTENCODING_ISO8859_14:
         case wxFONTENCODING_ISO8859_15:
@@ -174,6 +191,13 @@ bool wxGetNativeFontEncoding(wxFontEncoding encoding,
             }
             break;
 
             }
             break;
 
+        case wxFONTENCODING_UTF8:
+            // FIXME: this is probably false, but this is how they are called on
+            //        my system and I don't know what the standard XFLD is (VZ)
+            info->xregistry = wxT("iso646.1991");
+            info->xencoding = wxT("*");
+            break;
+
         case wxFONTENCODING_KOI8:
             info->xregistry = wxT("koi8");
 
         case wxFONTENCODING_KOI8:
             info->xregistry = wxT("koi8");
 
@@ -232,7 +256,8 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize,
                                     int weight,
                                     bool underlined,
                                     const wxString &facename,
                                     int weight,
                                     bool underlined,
                                     const wxString &facename,
-                                    wxFontEncoding encoding)
+                                    wxFontEncoding encoding,
+                                    wxString* xFontName)
 {
     if ( encoding == wxFONTENCODING_DEFAULT )
     {
 {
     if ( encoding == wxFONTENCODING_DEFAULT )
     {
@@ -264,11 +289,40 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize,
             }
         }
     }
             }
         }
     }
-    
+
     // OK, 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,
+    wxNativeFont font = 0;
+
+    // if we already have the X font name, try to use it
+    if( xFontName && !xFontName->IsEmpty() )
+    {
+        //
+        //  Make sure point size is correct for scale factor.
+        //
+        wxStringTokenizer tokenizer(*xFontName, _T("-"), wxTOKEN_RET_DELIMS);
+        wxString newFontName;
+
+        for(int i = 0; i < 8; i++)
+          newFontName += tokenizer.NextToken();
+
+        (void) tokenizer.NextToken();
+
+        newFontName += wxString::Format("%d-", pointSize);
+
+        while(tokenizer.HasMoreTokens())
+          newFontName += tokenizer.GetNextToken();
+
+        font = wxLoadFont(newFontName);
+
+        if(font)
+          *xFontName = newFontName;
+    }
+
+    if( !font )
+        font = wxLoadQueryFont( pointSize, family, style, weight,
                                          underlined, facename,
                                          underlined, facename,
-                                         info.xregistry, info.xencoding );
+                                info.xregistry, info.xencoding,
+                                xFontName );
 
     if ( !font )
     {
 
     if ( !font )
     {
@@ -282,14 +336,16 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize,
         for ( i = pointSize - 10; !font && i >= 10 && i >= min_size; i -= 10 )
         {
             font = wxLoadQueryFont(i, family, style, weight, underlined,
         for ( i = pointSize - 10; !font && i >= 10 && i >= min_size; i -= 10 )
         {
             font = wxLoadQueryFont(i, family, style, weight, underlined,
-                                   facename, info.xregistry, info.xencoding);
+                                   facename, info.xregistry, info.xencoding,
+                                   xFontName);
         }
 
         // Search for larger size (approx.)
         for ( i = pointSize + 10; !font && i <= max_size; i += 10 )
         {
             font = wxLoadQueryFont(i, family, style, weight, underlined,
         }
 
         // Search for larger size (approx.)
         for ( i = pointSize + 10; !font && i <= max_size; i += 10 )
         {
             font = wxLoadQueryFont(i, family, style, weight, underlined,
-                                   facename, info.xregistry, info.xencoding);
+                                   facename, info.xregistry, info.xencoding,
+                                   xFontName);
         }
 
         // Try default family
         }
 
         // Try default family
@@ -297,7 +353,8 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize,
         {
             font = wxLoadQueryFont(pointSize, wxDEFAULT, style, weight,
                                    underlined, facename,
         {
             font = wxLoadQueryFont(pointSize, wxDEFAULT, style, weight,
                                    underlined, facename,
-                                   info.xregistry, info.xencoding );
+                                   info.xregistry, info.xencoding,
+                                   xFontName );
         }
 
         // Bogus font I
         }
 
         // Bogus font I
@@ -305,7 +362,8 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize,
         {
             font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL,
                                    underlined, facename,
         {
             font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL,
                                    underlined, facename,
-                                   info.xregistry, info.xencoding);
+                                   info.xregistry, info.xencoding,
+                                   xFontName);
         }
 
         // Bogus font II
         }
 
         // Bogus font II
@@ -313,7 +371,8 @@ wxNativeFont wxLoadQueryNearestFont(int pointSize,
         {
             font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL,
                                    underlined, wxEmptyString,
         {
             font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL,
                                    underlined, wxEmptyString,
-                                   info.xregistry, info.xencoding);
+                                   info.xregistry, info.xencoding,
+                                   xFontName);
         }
     }
 
         }
     }
 
@@ -337,13 +396,12 @@ static bool wxTestFontSpec(const wxString& fontspec)
     wxNativeFont test = (wxNativeFont) g_fontHash->Get( fontspec );
     if (test)
     {
     wxNativeFont test = (wxNativeFont) g_fontHash->Get( fontspec );
     if (test)
     {
-//        printf( "speed up\n" );
         return TRUE;
     }
 
     test = wxLoadFont(fontspec);
     g_fontHash->Put( fontspec, (wxObject*) test );
         return TRUE;
     }
 
     test = wxLoadFont(fontspec);
     g_fontHash->Put( fontspec, (wxObject*) test );
-    
+
     if ( test )
     {
         wxFreeFont(test);
     if ( test )
     {
         wxFreeFont(test);
@@ -363,7 +421,8 @@ static wxNativeFont wxLoadQueryFont(int pointSize,
                                     bool WXUNUSED(underlined),
                                     const wxString& facename,
                                     const wxString& xregistry,
                                     bool WXUNUSED(underlined),
                                     const wxString& facename,
                                     const wxString& xregistry,
-                                    const wxString& xencoding)
+                                    const wxString& xencoding,
+                                    wxString* xFontName)
 {
     wxString xfamily;
     switch (family)
 {
     wxString xfamily;
     switch (family)
@@ -537,6 +596,9 @@ static wxNativeFont wxLoadQueryFont(int pointSize,
                     xfamily.c_str(), xweight.c_str(), xstyle.c_str(),
                     pointSize, xregistry.c_str(), xencoding.c_str());
 
                     xfamily.c_str(), xweight.c_str(), xstyle.c_str(),
                     pointSize, xregistry.c_str(), xencoding.c_str());
 
+    if( xFontName )
+        *xFontName = fontSpec;
+
     return wxLoadFont(fontSpec);
 }
 
     return wxLoadFont(fontSpec);
 }