]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dc.cpp
added direct HICommand updating
[wxWidgets.git] / src / mac / carbon / dc.cpp
index 9dff84e4d3800fe11a16ff5d6fcb1b377d9335f6..8038c0b217547dde04fb2ecf74d5fc8b60960a80 100644 (file)
@@ -17,6 +17,7 @@
 #include "wx/app.h"
 #include "wx/mac/uma.h"
 #include "wx/dcmemory.h"
+#include "wx/dcprint.h"
 #include "wx/region.h"
 #include "wx/image.h"
 #include "wx/log.h"
@@ -25,6 +26,7 @@
 #include "math.h"
 using namespace std ;
 #endif
+
 #include "wx/mac/private.h"
 #include "ATSUnicode.h"
 #include "TextCommon.h"
@@ -43,7 +45,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject)
 #define twips2mm        0.0176388888889
 #define mm2pt            2.83464566929
 #define pt2mm            0.352777777778
-#ifndef __DARWIN__
+#if !defined( __DARWIN__ ) || defined(__MWERKS__)
 const double M_PI = 3.14159265358979 ;
 #endif
 const double RAD2DEG  = 180.0 / M_PI;
@@ -88,7 +90,6 @@ wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win )
         SetClip( m_newClip ) ;
         DisposeRgn( insidergn ) ;
 #endif
-        RgnHandle insidergn = NewRgn() ;
         int x = 0 , y = 0;
         win->MacWindowToRootWindow( &x,&y ) ;
         CopyRgn( (RgnHandle) ((wxWindow*)win)->MacGetVisibleRegion().GetWXHRGN() , m_newClip ) ;
@@ -1054,7 +1055,7 @@ bool  wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
     switch ( logical_func )
     {
     case wxAND:        // src AND dst
-        mode = srcOr ; // ok
+        mode = adMin ; // ok
         break ;
     case wxAND_INVERT: // (NOT src) AND dst
         mode = notSrcOr  ; // ok
@@ -1110,7 +1111,7 @@ bool  wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
     }
     if ( mode == kUnsupportedMode )
     {
-        wxFAIL_MSG("unsupported blitting mode" );
+        wxFAIL_MSG(wxT("unsupported blitting mode" ));
         return FALSE ;
     }
     CGrafPtr            sourcePort = (CGrafPtr) source->m_macPort ;
@@ -1294,17 +1295,10 @@ void  wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
     }
     if ( str.Length() == 0 )
         return ;
+        
     wxMacPortSetter helper(this) ;
     MacInstallFont() ;
-    wxString text ;
-    if ( wxApp::s_macDefaultEncodingIsPC )
-    {
-        text = wxMacMakeMacStringFromPC( str ) ;
-    }
-    else
-    {
-        text = str ;
-    }
+
     wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
     if ( 0 )
     {
@@ -1313,23 +1307,30 @@ void  wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
         m_macAliasWasEnabled = true ;
     }
     OSStatus status = noErr ;
+    ATSUTextLayout atsuLayout ;
+    UniCharCount chars = str.Length() ;
+#if wxUSE_UNICODE
+    status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) (const wxChar*) str , 0 , str.Length() , str.Length() , 1 ,
+        &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
+#else
     TECObjectRef ec;
-    status = TECCreateConverter(&ec, kTextEncodingMacRoman, kTextEncodingUnicodeDefault);
-    wxASSERT_MSG( status == noErr , "couldn't start converter" ) ;
+    status = TECCreateConverter(&ec, 
+       wxApp::s_macDefaultEncodingIsPC ? kTextEncodingWindowsLatin1 : kTextEncodingMacRoman, kTextEncodingUnicodeDefault);
+       
+    wxASSERT_MSG( status == noErr , wxT("couldn't start converter") ) ;
     ByteCount byteOutLen ;
-    ByteCount byteInLen = text.Length() ;
+    ByteCount byteInLen = str.Length() ;
     ByteCount byteBufferLen = byteInLen *2 ;
     char* buf = new char[byteBufferLen] ;
-    status = TECConvertText(ec, (ConstTextPtr)text.c_str() , byteInLen, &byteInLen,
+    status = TECConvertText(ec, (ConstTextPtr)str.c_str() , byteInLen, &byteInLen,
         (TextPtr)buf, byteBufferLen, &byteOutLen);
-    wxASSERT_MSG( status == noErr , "couldn't convert text" ) ;
+    wxASSERT_MSG( status == noErr , wxT("couldn't convert text") ) ;
     status = TECDisposeConverter(ec);
-    wxASSERT_MSG( status == noErr , "couldn't dispose converter" ) ;
-    ATSUTextLayout atsuLayout ;
-    UniCharCount chars = byteOutLen / 2 ;
+    wxASSERT_MSG( status == noErr , wxT("couldn't dispose converter") ) ;
     status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) buf , 0 , byteOutLen / 2 , byteOutLen / 2 , 1 ,
         &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
-    wxASSERT_MSG( status == noErr , "couldn't create the layout of the rotated text" );
+#endif
+    wxASSERT_MSG( status == noErr , wxT("couldn't create the layout of the rotated text") );
     int iAngle = int( angle );
     int drawX = XLOG2DEVMAC(x) ;
     int drawY = YLOG2DEVMAC(y) ;
@@ -1365,16 +1366,19 @@ void  wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
     drawY += cos(angle/RAD2DEG) * FixedToInt(ascent) ;
     status = ::ATSUDrawText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd,
         IntToFixed(drawX) , IntToFixed(drawY) );
-    wxASSERT_MSG( status == noErr , "couldn't draw the rotated text" );
+    wxASSERT_MSG( status == noErr , wxT("couldn't draw the rotated text") );
     Rect rect ;
     status = ::ATSUMeasureTextImage( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd,
         IntToFixed(drawX) , IntToFixed(drawY) , &rect );
-    wxASSERT_MSG( status == noErr , "couldn't measure the rotated text" );
+    wxASSERT_MSG( status == noErr , wxT("couldn't measure the rotated text") );
     OffsetRect( &rect , -m_macLocalOrigin.x , -m_macLocalOrigin.y ) ;
     CalcBoundingBox(XDEV2LOG(rect.left), YDEV2LOG(rect.top) );
     CalcBoundingBox(XDEV2LOG(rect.right), YDEV2LOG(rect.bottom) );
     ::ATSUDisposeTextLayout(atsuLayout);
+#if wxUSE_UNICODE
+#else
     delete[] buf ;
+#endif
 }
 
 void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
@@ -1385,7 +1389,7 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
     long yy = YLOG2DEVMAC(y);
 #if TARGET_CARBON
     bool useDrawThemeText = ( DrawThemeTextBox != (void*) kUnresolvedCFragSymbolAddress ) ;
-    if ( m_font.GetNoAntiAliasing() )
+    if ( IsKindOf(CLASSINFO( wxPrinterDC ) ) || m_font.GetNoAntiAliasing() )
         useDrawThemeText = false ;
 #endif
     MacInstallFont() ;
@@ -1410,33 +1414,22 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
     {
         ::TextMode( srcCopy ) ;
     }
-    const char *text = NULL ;
-    int length = 0 ;
-    wxString macText ;
-    if ( wxApp::s_macDefaultEncodingIsPC )
-    {
-        macText = wxMacMakeMacStringFromPC( strtext ) ;
-        text = macText ;
-        length = macText.Length() ;
-    }
-    else
-    {
-        text = strtext ;
-        length = strtext.Length() ;
-    }
+    int length = strtext.Length() ;
+
     int laststop = 0 ;
     int i = 0 ;
     int line = 0 ;
     {
         while( i < length )
         {
-            if( text[i] == 13 || text[i] == 10)
+            if( strtext[i] == 13 || strtext[i] == 10)
             {
+               wxString linetext = strtext.Mid( laststop , i - laststop ) ;
 #if TARGET_CARBON
                 if ( useDrawThemeText )
                 {
                     Rect frame = { yy + line*(fi.descent + fi.ascent + fi.leading)  ,xx , yy + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 10000 } ;
-                    CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ;
+                    wxMacCFStringHolder mString( linetext ) ;
                     if ( m_backgroundMode != wxTRANSPARENT )
                     {
                         Point bounds={0,0} ;
@@ -1459,13 +1452,13 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
                         &frame,
                         teJustLeft,
                         nil );
-                    CFRelease( mString ) ;
                     line++ ;
                 }
                 else
 #endif
                 {
-                    ::DrawText( text , laststop , i - laststop ) ;
+                                       wxCharBuffer text = wxMacStringToCString(linetext) ; 
+                    ::DrawText( text , 0 , strlen(text) ) ;
                     line++ ;
                     ::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) );
                 }
@@ -1473,11 +1466,13 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
             }
             i++ ;
         }
+        wxString linetext = strtext.Mid( laststop , i - laststop ) ;
 #if TARGET_CARBON
         if ( useDrawThemeText )
         {
             Rect frame = { yy + line*(fi.descent + fi.ascent + fi.leading)  ,xx , yy + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 10000 } ;
-            CFStringRef mString = CFStringCreateWithCString( NULL , text + laststop , kCFStringEncodingMacRoman ) ;
+            wxMacCFStringHolder mString( linetext ) ;
+
             if ( m_backgroundMode != wxTRANSPARENT )
             {
                 Point bounds={0,0} ;
@@ -1500,13 +1495,13 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
                 &frame,
                 teJustLeft,
                 nil );
-            CFRelease( mString ) ;
         }
         else
 #endif
         {
-            ::DrawText( text , laststop , i - laststop ) ;
-        }
+                       wxCharBuffer text = wxMacStringToCString(linetext) ; 
+            ::DrawText( text , 0 , strlen(text) ) ;
+         }
     }
     ::TextMode( srcOr ) ;
 }
@@ -1517,7 +1512,7 @@ bool  wxDC::CanGetTextExtent() const
     return true ;
 }
 
-void  wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *height,
+void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *height,
                             wxCoord *descent, wxCoord *externalLeading ,
                             wxFont *theFont ) const
 {
@@ -1534,7 +1529,7 @@ void  wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *he
     ::GetFontInfo( &fi ) ;
 #if TARGET_CARBON    
     bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;
-    if ( ((wxFont*)&m_font)->GetNoAntiAliasing() )
+       if ( IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() )
         useGetThemeText = false ;
 #endif
     if ( height )
@@ -1543,8 +1538,9 @@ void  wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *he
         *descent =YDEV2LOGREL( fi.descent );
     if ( externalLeading )
         *externalLeading = YDEV2LOGREL( fi.leading ) ;
+    int length = strtext.Length() ;
+    /*
     const char *text = NULL ;
-    int length = 0 ;
     wxString macText ;
     if ( wxApp::s_macDefaultEncodingIsPC )
     {
@@ -1557,6 +1553,7 @@ void  wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *he
         text = string ;
         length = string.Length() ;
     }
+    */
     int laststop = 0 ;
     int i = 0 ;
     int curwidth = 0 ;
@@ -1565,8 +1562,9 @@ void  wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *he
         *width = 0 ;
         while( i < length )
         {
-            if( text[i] == 13 || text[i] == 10)
+            if( strtext[i] == 13 || strtext[i] == 10)
             {
+               wxString linetext = strtext.Mid( laststop , i - laststop ) ;
                 if ( height )
                     *height += YDEV2LOGREL( fi.descent + fi.ascent + fi.leading ) ;
 #if TARGET_CARBON
@@ -1574,20 +1572,20 @@ void  wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *he
                 {
                     Point bounds={0,0} ;
                     SInt16 baseline ;
-                    CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ;
+                    wxMacCFStringHolder mString( linetext ) ;
                     ::GetThemeTextDimensions( mString,
                         kThemeCurrentPortFont,
                         kThemeStateActive,
                         false,
                         &bounds,
                         &baseline );
-                    CFRelease( mString ) ;
                     curwidth = bounds.h ;
                 }
                 else
 #endif
                 {
-                    curwidth = ::TextWidth( text , laststop , i - laststop ) ;
+                                       wxCharBuffer text = wxMacStringToCString(linetext) ; 
+                       curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
                 }
                 if ( curwidth > *width )
                     *width = XDEV2LOGREL( curwidth ) ;
@@ -1596,25 +1594,26 @@ void  wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *he
             i++ ;
         }
         
+        wxString linetext = strtext.Mid( laststop , i - laststop ) ;
 #if TARGET_CARBON
         if ( useGetThemeText )
         {
             Point bounds={0,0} ;
             SInt16 baseline ;
-            CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ;
+            wxMacCFStringHolder mString( linetext ) ;
             ::GetThemeTextDimensions( mString,
                 kThemeCurrentPortFont,
                 kThemeStateActive,
                 false,
                 &bounds,
                 &baseline );
-            CFRelease( mString ) ;
             curwidth = bounds.h ;
         }
         else
 #endif
         {
-            curwidth = ::TextWidth( text , laststop , i - laststop ) ;
+                       wxCharBuffer text = wxMacStringToCString(linetext) ; 
+            curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
         }
         if ( curwidth > *width )
             *width = XDEV2LOGREL( curwidth ) ;
@@ -1747,10 +1746,12 @@ void wxDC::MacInstallFont() const
     case wxSRC_INVERT: // (NOT src)
         mode = notPatCopy ;
         break ;
+    case wxAND: // src AND dst
+        mode = adMin ;
+        break ;
         // unsupported TODO
     case wxCLEAR:      // 0
     case wxAND_REVERSE:// src AND (NOT dst)
-    case wxAND:        // src AND dst
     case wxAND_INVERT: // (NOT src) AND dst
     case wxNO_OP:      // dst
     case wxNOR:        // (NOT src) AND (NOT dst)
@@ -1769,7 +1770,7 @@ void wxDC::MacInstallFont() const
     Style qdStyle = font->m_macFontStyle ;
     ATSUFontID    atsuFont = font->m_macATSUFontID ;
     status = ::ATSUCreateStyle(&(ATSUStyle)m_macATSUIStyle) ;
-    wxASSERT_MSG( status == noErr , "couldn't create ATSU style" ) ;
+    wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") ) ;
     ATSUAttributeTag atsuTags[] =
     {
         kATSUFontTag ,
@@ -1815,7 +1816,7 @@ void wxDC::MacInstallFont() const
     } ;
     status = ::ATSUSetAttributes((ATSUStyle)m_macATSUIStyle, sizeof(atsuTags)/sizeof(ATSUAttributeTag),
         atsuTags, atsuSizes, atsuValues);
-    wxASSERT_MSG( status == noErr , "couldn't set create ATSU style" ) ;
+    wxASSERT_MSG( status == noErr , wxT("couldn't set create ATSU style") ) ;
 }
 
 Pattern gHatchPatterns[] =
@@ -1951,10 +1952,12 @@ void wxDC::MacInstallPen() const
     case wxSRC_INVERT: // (NOT src)
         mode = notPatCopy ;
         break ;
+    case wxAND: // src AND dst
+        mode = adMin ;
+        break ;
         // unsupported TODO
     case wxCLEAR:      // 0
     case wxAND_REVERSE:// src AND (NOT dst)
-    case wxAND:        // src AND dst
     case wxAND_INVERT: // (NOT src) AND dst
     case wxNO_OP:      // dst
     case wxNOR:        // (NOT src) AND (NOT dst)
@@ -2131,10 +2134,12 @@ void wxDC::MacInstallBrush() const
     case wxSRC_INVERT: // (NOT src)
         mode = notPatCopy ;
         break ;
+    case wxAND: // src AND dst
+        mode = adMin ;
+        break ;
         // unsupported TODO
     case wxCLEAR:      // 0
     case wxAND_REVERSE:// src AND (NOT dst)
-    case wxAND:        // src AND dst
     case wxAND_INVERT: // (NOT src) AND dst
     case wxNO_OP:      // dst
     case wxNOR:        // (NOT src) AND (NOT dst)
@@ -2195,4 +2200,4 @@ wxCoord wxDCBase::LogicalToDeviceXRel(wxCoord x) const
 wxCoord wxDCBase::LogicalToDeviceYRel(wxCoord y) const
 {
     return ((wxDC *)this)->YLOG2DEVREL(y);
-}
\ No newline at end of file
+}