]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/core/cfstring.cpp
using statically allocated font objects for speedup
[wxWidgets.git] / src / osx / core / cfstring.cpp
index f99511c1b6fb117ee87ffcd334f14206b4c4cab4..96bc244d381ca567aef84654fc46312a36f766aa 100644 (file)
@@ -24,6 +24,7 @@
 
 #include <CoreFoundation/CoreFoundation.h>
 
+
 void wxMacConvertNewlines13To10( char * data )
 {
     char * buf = data ;
@@ -185,8 +186,8 @@ wxUint32 wxMacGetSystemEncFromFontEnc(wxFontEncoding encoding)
 #if 0
     case wxFONTENCODING_UTF7 :
         enc = CreateTextEncoding(kCFStringEncodingUnicodeDefault,0,kUnicodeUTF7Format) ;
-#endif
         break ;
+#endif
     case wxFONTENCODING_UTF8 :
         enc = kCFStringEncodingUTF8;
         break ;
@@ -608,29 +609,22 @@ wxCFStringRef::wxCFStringRef( const wxString &st , wxFontEncoding WXUNUSED_IN_UN
         wxString str = st ;
         wxMacConvertNewlines13To10( &str ) ;
 #if wxUSE_UNICODE
-#if SIZEOF_WCHAR_T == 2
-        reset( CFStringCreateWithCharacters( kCFAllocatorDefault,
-            (UniChar*)str.wc_str() , str.Len() ) );
+#if wxUSE_UNICODE_WCHAR
+        // native = wchar_t 4 bytes for us
+        const wchar_t * const data = str.wc_str();
+        const size_t size = str.length()*sizeof(wchar_t);
+        CFStringBuiltInEncodings cfencoding = kCFStringEncodingUTF32Native;
+#elif wxUSE_UNICODE_UTF8
+        // native = utf8
+        const char * const data = str.utf8_str();
+        const size_t size = str.utf8_length();
+        CFStringBuiltInEncodings cfencoding = kCFStringEncodingUTF8;
 #else
-        wxMBConvUTF16 converter ;
-        size_t unicharbytes = converter.FromWChar( NULL , 0 , str.wc_str() , str.Length() ) ;
-        wxASSERT( unicharbytes != wxCONV_FAILED );
-        if ( unicharbytes == wxCONV_FAILED )
-        {
-            // create an empty string
-            reset( wxCFRetain( CFSTR("") ) );
-        }
-        else
-        {
-            // unicharbytes: number of bytes needed for UTF-16 encoded string (without terminating null)
-            // unichars: number of UTF-16 characters (without terminating null)
-            size_t unichars = unicharbytes /  sizeof(UniChar) ;
-            UniChar *unibuf = new UniChar[ unichars ] ;
-            converter.FromWChar( (char*)unibuf , unicharbytes , str.wc_str() , str.Length() ) ;
-            reset( CFStringCreateWithCharacters( kCFAllocatorDefault , unibuf , unichars ) ) ;
-            delete[] unibuf ;
-        }
+    #error "unsupported Unicode representation"
 #endif
+
+        reset( CFStringCreateWithBytes( kCFAllocatorDefault,
+            (const UInt8*)data, size, cfencoding, false /* no BOM */ ) );
 #else // not wxUSE_UNICODE
         reset( CFStringCreateWithCString( kCFAllocatorSystemDefault , str.c_str() ,
             wxMacGetSystemEncFromFontEnc( encoding ) ) );
@@ -638,49 +632,64 @@ wxCFStringRef::wxCFStringRef( const wxString &st , wxFontEncoding WXUNUSED_IN_UN
     }
 }
 
-wxString wxCFStringRef::AsString(wxFontEncoding WXUNUSED_IN_UNICODE(encoding))
+wxString wxCFStringRef::AsString( CFStringRef ref, wxFontEncoding WXUNUSED_IN_UNICODE(encoding) )
 {
-    if ( !get() )
+    if ( !ref )
         return wxEmptyString ;
 
-    Size cflen = CFStringGetLength( get() )  ;
-    size_t noChars ;
-    wxChar* buf = NULL ;
+    Size cflen = CFStringGetLength( ref )  ;
 
+    CFStringEncoding cfencoding;
+    wxString result;
 #if wxUSE_UNICODE
-#if SIZEOF_WCHAR_T == 2
-    buf = new wxChar[ cflen + 1 ] ;
-    CFStringGetCharacters( get() , CFRangeMake( 0 , cflen ) , (UniChar*) buf ) ;
-    noChars = cflen ;
+  #if wxUSE_UNICODE_WCHAR
+    cfencoding = kCFStringEncodingUTF32Native;
+  #elif wxUSE_UNICODE_UTF8
+    cfencoding = kCFStringEncodingUTF8;
+  #else
+    #error "unsupported unicode representation"
+  #endif
 #else
-    UniChar* unibuf = new UniChar[ cflen + 1 ] ;
-    CFStringGetCharacters( get() , CFRangeMake( 0 , cflen ) , (UniChar*) unibuf ) ;
-    unibuf[cflen] = 0 ;
-    wxMBConvUTF16 converter ;
-    noChars = converter.MB2WC( NULL , (const char*)unibuf , 0 ) ;
-    wxASSERT_MSG( noChars != wxCONV_FAILED, _T("Unable to count the number of characters in this string!") );
-    buf = new wxChar[ noChars + 1 ] ;
-    noChars = converter.MB2WC( buf , (const char*)unibuf , noChars + 1 ) ;
-    wxASSERT_MSG( noChars != wxCONV_FAILED, _T("Conversion of string failed!") );
-    delete[] unibuf ;
+    cfencoding = wxMacGetSystemEncFromFontEnc( encoding );
 #endif
-#else
+
     CFIndex cStrLen ;
-    CFStringGetBytes( get() , CFRangeMake(0, cflen) , wxMacGetSystemEncFromFontEnc( encoding ) ,
+    CFStringGetBytes( ref , CFRangeMake(0, cflen) , cfencoding ,
         '?' , false , NULL , 0 , &cStrLen ) ;
-    buf = new wxChar[ cStrLen + 1 ] ;
-    CFStringGetBytes( get() , CFRangeMake(0, cflen) , wxMacGetSystemEncFromFontEnc( encoding ) ,
+    char* buf = new char[cStrLen];
+    CFStringGetBytes( ref , CFRangeMake(0, cflen) , cfencoding,
         '?' , false , (unsigned char*) buf , cStrLen , &cStrLen) ;
-    noChars = cStrLen ;
+
+#if wxUSE_UNICODE
+  #if wxUSE_UNICODE_WCHAR
+    result = wxString( (const wchar_t*) buf , cStrLen/4);
+  #elif wxUSE_UNICODE_UTF8
+    result = wxString::FromUTF8( buf, cStrLen );
+  #else
+    #error "unsupported unicode representation"
+  #endif
+#else
+    result = wxString(buf, cStrLen) ;
 #endif
 
-    buf[noChars] = 0 ;
-    wxString result(buf) ;
     delete[] buf ;
     wxMacConvertNewlines10To13( &result);
     return result ;
 }
 
+wxString wxCFStringRef::AsString(wxFontEncoding encoding) const
+{
+    return AsString( get(), encoding );
+}
+
+#if wxOSX_USE_COCOA_OR_IPHONE
+wxString wxCFStringRef::AsString( NSString* ref, wxFontEncoding encoding )
+{
+    return AsString( (CFStringRef) ref, encoding );
+}
+#endif
+
+
 //
 // wxMacUniCharBuffer
 //
@@ -721,11 +730,11 @@ wxMacUniCharBuffer::~wxMacUniCharBuffer()
     free( m_ubuf ) ;
 }
 
-UniCharPtr wxMacUniCharBuffer::GetBuffer() 
+UniCharPtr wxMacUniCharBuffer::GetBuffer()
 {
     return m_ubuf ;
 }
-   
+
 UniCharCount wxMacUniCharBuffer::GetChars()
 {
     return m_chars ;