]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/encconv.cpp
fixed wrong handling of magenta (patch #882201)
[wxWidgets.git] / src / common / encconv.cpp
index 03dc30ffb9942e700a10d08e4b4360bd1294e472..e3327c909a317f18a071e3f4bcbd2fdc838878fe 100644 (file)
@@ -42,8 +42,48 @@ typedef char tchar;
 #define LINKAGEMODE __cdecl
 #endif
 
+#ifdef __WXMAC__
+
+#include "ATSUnicode.h"
+#include "TextCommon.h"
+#include "TextEncodingConverter.h"
+
+#include "wx/fontutil.h"
+#include "wx/mac/private.h"  // includes mac headers
+
+wxUint16 gMacEncodings[wxFONTENCODING_MACMAX-wxFONTENCODING_MACMIN+1][128] ;
+bool gMacEncodingsInited[wxFONTENCODING_MACMAX-wxFONTENCODING_MACMIN+1] ;
+
+#endif
+
 static wxUint16* LINKAGEMODE GetEncTable(wxFontEncoding enc)
 {
+#ifdef __WXMAC__
+    if( enc >= wxFONTENCODING_MACMIN && enc <= wxFONTENCODING_MACMAX )
+    {
+        int i = enc-wxFONTENCODING_MACMIN ;
+        if ( gMacEncodingsInited[i] == false )
+        {
+            TECObjectRef converter ;
+            TextEncodingBase code = wxMacGetSystemEncFromFontEnc( enc ) ;
+               TextEncodingBase unicode = CreateTextEncoding(kTextEncodingUnicodeDefault,0,kUnicode16BitFormat) ;
+           OSStatus status = TECCreateConverter(&converter,code,unicode);
+           char s[2] ;
+           s[1] = 0 ;
+           ByteCount byteInLen, byteOutLen ;
+           for( char c = 255 ; c >= 128 ; --c )
+           {
+               s[0] = c ;
+                status = TECConvertText(converter, (ConstTextPtr) &s , 1, &byteInLen,
+                (TextPtr) &gMacEncodings[i][c-128] , 2, &byteOutLen);
+           }
+            status = TECDisposeConverter(converter);
+            gMacEncodingsInited[i]=true;       
+        }
+        return gMacEncodings[i] ;
+    }
+#endif
+
     for (int i = 0; encodings_list[i].table != NULL; i++)
     {
         if (encodings_list[i].encoding == enc)
@@ -89,7 +129,7 @@ wxEncodingConverter::wxEncodingConverter()
 bool wxEncodingConverter::Init(wxFontEncoding input_enc, wxFontEncoding output_enc, int method)
 {
     unsigned i;
-    wxUint16 *in_tbl = NULL, *out_tbl = NULL;
+    wxUint16 *in_tbl, *out_tbl = NULL;
 
     if (m_Table) {delete[] m_Table; m_Table = NULL;}
 
@@ -173,7 +213,7 @@ bool wxEncodingConverter::Init(wxFontEncoding input_enc, wxFontEncoding output_e
 
 
 
-void wxEncodingConverter::Convert(const char* input, char* output)
+void wxEncodingConverter::Convert(const char* input, char* output) const
 {
     wxASSERT_MSG(!m_UnicodeOutput, wxT("You cannot convert to unicode if output is const char*!"));
     wxASSERT_MSG(!m_UnicodeInput, wxT("You cannot convert from unicode if input is const char*!"));
@@ -197,7 +237,7 @@ void wxEncodingConverter::Convert(const char* input, char* output)
 
 #if wxUSE_WCHAR_T
 
-void wxEncodingConverter::Convert(const char* input, wchar_t* output)
+void wxEncodingConverter::Convert(const char* input, wchar_t* output) const
 {
     wxASSERT_MSG(m_UnicodeOutput, wxT("You cannot convert to 8-bit if output is const wchar_t*!"));
     wxASSERT_MSG(!m_UnicodeInput, wxT("You cannot convert from unicode if input is const char*!"));
@@ -222,7 +262,7 @@ void wxEncodingConverter::Convert(const char* input, wchar_t* output)
 
 
 
-void wxEncodingConverter::Convert(const wchar_t* input, char* output)
+void wxEncodingConverter::Convert(const wchar_t* input, char* output) const
 {
     wxASSERT_MSG(!m_UnicodeOutput, wxT("You cannot convert to unicode if output is const char*!"));
     wxASSERT_MSG(m_UnicodeInput, wxT("You cannot convert from 8-bit if input is const wchar_t*!"));
@@ -247,7 +287,7 @@ void wxEncodingConverter::Convert(const wchar_t* input, char* output)
 
 
 
-void wxEncodingConverter::Convert(const wchar_t* input, wchar_t* output)
+void wxEncodingConverter::Convert(const wchar_t* input, wchar_t* output) const
 {
     wxASSERT_MSG(m_UnicodeOutput, wxT("You cannot convert to 8-bit if output is const wchar_t*!"));
     wxASSERT_MSG(m_UnicodeInput, wxT("You cannot convert from 8-bit if input is const wchar_t*!"));
@@ -274,7 +314,7 @@ void wxEncodingConverter::Convert(const wchar_t* input, wchar_t* output)
 #endif // wxUSE_WCHAR_T
 
 
-wxString wxEncodingConverter::Convert(const wxString& input)
+wxString wxEncodingConverter::Convert(const wxString& input) const
 {
     if (m_JustCopy) return input;
 
@@ -324,7 +364,7 @@ static wxFontEncoding
         /* unix    */ {wxFONTENCODING_ISO8859_1, wxFONTENCODING_ISO8859_15, STOP},
         /* windows */ {wxFONTENCODING_CP1252, STOP},
         /* os2     */ {STOP},
-        /* mac     */ {STOP}
+        /* mac     */ {wxFONTENCODING_MACROMAN, STOP}
     },
 
     // Central European
@@ -332,7 +372,7 @@ static wxFontEncoding
         /* unix    */ {wxFONTENCODING_ISO8859_2, STOP},
         /* windows */ {wxFONTENCODING_CP1250, STOP},
         /* os2     */ {STOP},
-        /* mac     */ {STOP}
+        /* mac     */ {wxFONTENCODING_MACCENTRALEUR, STOP}
     },
 
     // Baltic
@@ -348,7 +388,7 @@ static wxFontEncoding
         /* unix    */ {wxFONTENCODING_ISO8859_8, STOP},
         /* windows */ {wxFONTENCODING_CP1255, STOP},
         /* os2     */ {STOP},
-        /* mac     */ {STOP}
+        /* mac     */ {wxFONTENCODING_MACHEBREW, STOP}
     },
 
     // Greek
@@ -356,7 +396,7 @@ static wxFontEncoding
         /* unix    */ {wxFONTENCODING_ISO8859_7, STOP},
         /* windows */ {wxFONTENCODING_CP1253, STOP},
         /* os2     */ {STOP},
-        /* mac     */ {STOP}
+        /* mac     */ {wxFONTENCODING_MACGREEK, STOP}
     },
 
     // Arabic
@@ -364,7 +404,7 @@ static wxFontEncoding
         /* unix    */ {wxFONTENCODING_ISO8859_6, STOP},
         /* windows */ {wxFONTENCODING_CP1256, STOP},
         /* os2     */ {STOP},
-        /* mac     */ {STOP}
+        /* mac     */ {wxFONTENCODING_MACARABIC, STOP}
     },
 
     // Turkish
@@ -372,7 +412,7 @@ static wxFontEncoding
         /* unix    */ {wxFONTENCODING_ISO8859_9, STOP},
         /* windows */ {wxFONTENCODING_CP1254, STOP},
         /* os2     */ {STOP},
-        /* mac     */ {STOP}
+        /* mac     */ {wxFONTENCODING_MACTURKISH, STOP}
     },
 
     // Cyrillic
@@ -380,7 +420,7 @@ static wxFontEncoding
         /* unix    */ {wxFONTENCODING_KOI8, wxFONTENCODING_ISO8859_5, STOP},
         /* windows */ {wxFONTENCODING_CP1251, STOP},
         /* os2     */ {STOP},
-        /* mac     */ {STOP}
+        /* mac     */ {wxFONTENCODING_MACCYRILLIC, STOP}
     },
 
     {{STOP},{STOP},{STOP},{STOP}} /* Terminator */