]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dc.cpp
The UseAntiAliasing is off by default on wxMac. Add a menu item to
[wxWidgets.git] / src / mac / carbon / dc.cpp
index 989cc238a8d623c188646646b97308a13ac36d5d..bfd36c8421f7a034fa538bf5c30d6db69a139f44 100644 (file)
@@ -55,6 +55,11 @@ const double RAD2DEG  = 180.0 / M_PI;
 const short kEmulatedMode = -1 ;
 const short kUnsupportedMode = -2 ;
 
 const short kEmulatedMode = -1 ;
 const short kUnsupportedMode = -2 ;
 
+extern TECObjectRef s_TECNativeCToUnicode ;
+
+// set to 0 if problems arise
+#define wxMAC_EXPERIMENTAL_DC 1
+
 wxMacPortSetter::wxMacPortSetter( const wxDC* dc ) :
     m_ph( (GrafPtr) dc->m_macPort )
 {
 wxMacPortSetter::wxMacPortSetter( const wxDC* dc ) :
     m_ph( (GrafPtr) dc->m_macPort )
 {
@@ -62,12 +67,67 @@ wxMacPortSetter::wxMacPortSetter( const wxDC* dc ) :
     m_dc = dc ;
     dc->MacSetupPort(&m_ph) ;
 }
     m_dc = dc ;
     dc->MacSetupPort(&m_ph) ;
 }
-
 wxMacPortSetter::~wxMacPortSetter()
 {
     m_dc->MacCleanupPort(&m_ph) ;
 }
 
 wxMacPortSetter::~wxMacPortSetter()
 {
     m_dc->MacCleanupPort(&m_ph) ;
 }
 
+#if wxMAC_EXPERIMENTAL_DC
+class wxMacFastPortSetter
+{
+public :
+    wxMacFastPortSetter( const wxDC *dc ) 
+    {
+           wxASSERT( dc->Ok() ) ;
+           GetPort( &m_oldPort ) ;
+           SetPort( (GrafPtr) dc->m_macPort ) ;
+           m_clipRgn = NewRgn() ;
+           GetClip( m_clipRgn ) ;
+           m_dc = dc ;
+           dc->MacSetupPort( NULL ) ;
+    }
+    ~wxMacFastPortSetter()
+    {
+        SetPort( (GrafPtr) m_dc->m_macPort ) ;
+        SetClip( m_clipRgn ) ;
+           SetPort( m_oldPort ) ;
+           m_dc->MacCleanupPort( NULL ) ;
+           DisposeRgn( m_clipRgn ) ;
+    }
+private :
+    RgnHandle m_clipRgn ;
+    GrafPtr m_oldPort ;
+    const wxDC*   m_dc ;
+} ;
+
+#else
+typedef wxMacPortSetter wxMacFastPortSetter ;
+#endif
+
+#if 0
+
+// start moving to a dual implementation for QD and CGContextRef
+
+class wxMacGraphicsContext
+{
+public :
+    void DrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask ) = 0 ;
+    void SetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord height ) = 0 ;
+    void SetClippingRegion( const wxRegion &region  ) = 0 ;
+    void DestroyClippingRegion() = 0 ;
+    void SetTextForeground( const wxColour &col ) = 0 ;
+    void SetTextBackground( const wxColour &col ) = 0 ;
+    void SetLogicalScale( double x , double y ) = 0 ;
+    void SetUserScale( double x , double y ) = 0;
+} ;
+
+class wxMacQuickDrawContext : public wxMacGraphicsContext
+{
+public :
+} ;
+
+#endif
+
 wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win ) 
 {
     m_formerClip = NewRgn() ;
 wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win ) 
 {
     m_formerClip = NewRgn() ;
@@ -263,11 +323,12 @@ void wxDC::MacSetupPort(wxMacPortStateHelper* help) const
     m_macCurrentPortStateHelper = help ;
 #endif
     SetClip( (RgnHandle) m_macCurrentClipRgn);
     m_macCurrentPortStateHelper = help ;
 #endif
     SetClip( (RgnHandle) m_macCurrentClipRgn);
+#if ! wxMAC_EXPERIMENTAL_DC
     m_macFontInstalled = false ;
     m_macBrushInstalled = false ;
     m_macPenInstalled = false ;
     m_macFontInstalled = false ;
     m_macBrushInstalled = false ;
     m_macPenInstalled = false ;
+#endif
 }
 }
-
 void wxDC::MacCleanupPort(wxMacPortStateHelper* help) const
 {
 #ifdef __WXDEBUG__
 void wxDC::MacCleanupPort(wxMacPortStateHelper* help) const
 {
 #ifdef __WXDEBUG__
@@ -304,7 +365,7 @@ void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask
 {
      wxCHECK_RET( Ok(), wxT("invalid window dc") );
      wxCHECK_RET( bmp.Ok(), wxT("invalid bitmap") );
 {
      wxCHECK_RET( Ok(), wxT("invalid window dc") );
      wxCHECK_RET( bmp.Ok(), wxT("invalid bitmap") );
-     wxMacPortSetter helper(this) ;
+     wxMacFastPortSetter helper(this) ;
      wxCoord xx = XLOG2DEVMAC(x);
      wxCoord yy = YLOG2DEVMAC(y);
      wxCoord w = bmp.GetWidth();
      wxCoord xx = XLOG2DEVMAC(x);
      wxCoord yy = YLOG2DEVMAC(y);
      wxCoord w = bmp.GetWidth();
@@ -428,7 +489,7 @@ void wxDC::DoSetClippingRegionAsRegion( const wxRegion &region  )
         DestroyClippingRegion();
         return;
     }
         DestroyClippingRegion();
         return;
     }
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     wxCoord x, y, w, h;
     region.GetBox( x, y, w, h );
     wxCoord xx, yy, ww, hh;
     wxCoord x, y, w, h;
     region.GetBox( x, y, w, h );
     wxCoord xx, yy, ww, hh;
@@ -470,7 +531,7 @@ void wxDC::DoSetClippingRegionAsRegion( const wxRegion &region  )
 
 void wxDC::DestroyClippingRegion()
 {
 
 void wxDC::DestroyClippingRegion()
 {
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ;
     m_clipping = FALSE;
 }
     CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ;
     m_clipping = FALSE;
 }
@@ -675,7 +736,7 @@ bool wxDC::DoFloodFill(wxCoord x, wxCoord y,
 bool  wxDC::DoGetPixel( wxCoord x, wxCoord y, wxColour *col ) const
 {
     wxCHECK_MSG( Ok(), false, wxT("wxDC::DoGetPixel  Invalid DC") );
 bool  wxDC::DoGetPixel( wxCoord x, wxCoord y, wxColour *col ) const
 {
     wxCHECK_MSG( Ok(), false, wxT("wxDC::DoGetPixel  Invalid DC") );
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     RGBColor colour;
     GetCPixel( XLOG2DEVMAC(x), YLOG2DEVMAC(y), &colour );
     // Convert from Mac colour to wx
     RGBColor colour;
     GetCPixel( XLOG2DEVMAC(x), YLOG2DEVMAC(y), &colour );
     // Convert from Mac colour to wx
@@ -688,7 +749,7 @@ bool  wxDC::DoGetPixel( wxCoord x, wxCoord y, wxColour *col ) const
 void  wxDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 )
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
 void  wxDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 )
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     if (m_pen.GetStyle() != wxTRANSPARENT)
     {
         MacInstallPen() ;
     if (m_pen.GetStyle() != wxTRANSPARENT)
     {
         MacInstallPen() ;
@@ -726,7 +787,7 @@ void  wxDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 )
 void  wxDC::DoCrossHair( wxCoord x, wxCoord y )
 {
     wxCHECK_RET( Ok(), wxT("wxDC::DoCrossHair  Invalid window dc") );
 void  wxDC::DoCrossHair( wxCoord x, wxCoord y )
 {
     wxCHECK_RET( Ok(), wxT("wxDC::DoCrossHair  Invalid window dc") );
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     if (m_pen.GetStyle() != wxTRANSPARENT)
     {
         int w = 0;
     if (m_pen.GetStyle() != wxTRANSPARENT)
     {
         int w = 0;
@@ -766,7 +827,7 @@ void  wxDC::DoDrawArc( wxCoord x1, wxCoord y1,
                       wxCoord xc, wxCoord yc )
 {
     wxCHECK_RET(Ok(), wxT("wxDC::DoDrawArc  Invalid DC"));
                       wxCoord xc, wxCoord yc )
 {
     wxCHECK_RET(Ok(), wxT("wxDC::DoDrawArc  Invalid DC"));
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     wxCoord xx1 = XLOG2DEVMAC(x1);
     wxCoord yy1 = YLOG2DEVMAC(y1);
     wxCoord xx2 = XLOG2DEVMAC(x2);
     wxCoord xx1 = XLOG2DEVMAC(x1);
     wxCoord yy1 = YLOG2DEVMAC(y1);
     wxCoord xx2 = XLOG2DEVMAC(x2);
@@ -816,7 +877,7 @@ void  wxDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h,
                               double sa, double ea )
 {
     wxCHECK_RET(Ok(), wxT("wxDC::DoDrawEllepticArc  Invalid DC"));
                               double sa, double ea )
 {
     wxCHECK_RET(Ok(), wxT("wxDC::DoDrawEllepticArc  Invalid DC"));
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     Rect r;
     double angle = sa - ea;  // Order important Mac in opposite direction to wx
     // we have to make sure that the filling is always counter-clockwise
     Rect r;
     double angle = sa - ea;  // Order important Mac in opposite direction to wx
     // we have to make sure that the filling is always counter-clockwise
@@ -847,7 +908,7 @@ void  wxDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h,
 void  wxDC::DoDrawPoint( wxCoord x, wxCoord y )
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
 void  wxDC::DoDrawPoint( wxCoord x, wxCoord y )
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     if (m_pen.GetStyle() != wxTRANSPARENT)
     {
         wxCoord xx1 = XLOG2DEVMAC(x);
     if (m_pen.GetStyle() != wxTRANSPARENT)
     {
         wxCoord xx1 = XLOG2DEVMAC(x);
@@ -862,7 +923,7 @@ void  wxDC::DoDrawLines(int n, wxPoint points[],
                         wxCoord xoffset, wxCoord yoffset)
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
                         wxCoord xoffset, wxCoord yoffset)
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     if (m_pen.GetStyle() == wxTRANSPARENT)
         return;
     MacInstallPen() ;
     if (m_pen.GetStyle() == wxTRANSPARENT)
         return;
     MacInstallPen() ;
@@ -885,7 +946,7 @@ void  wxDC::DoDrawPolygon(int n, wxPoint points[],
                           int fillStyle )
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
                           int fillStyle )
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     wxCoord x1, x2 , y1 , y2 ;
     if ( m_brush.GetStyle() == wxTRANSPARENT && m_pen.GetStyle() == wxTRANSPARENT )
         return ;
     wxCoord x1, x2 , y1 , y2 ;
     if ( m_brush.GetStyle() == wxTRANSPARENT && m_pen.GetStyle() == wxTRANSPARENT )
         return ;
@@ -921,7 +982,7 @@ void  wxDC::DoDrawPolygon(int n, wxPoint points[],
 void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
 void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     wxCoord xx = XLOG2DEVMAC(x);
     wxCoord yy = YLOG2DEVMAC(y);
     wxCoord ww = m_signX * XLOG2DEVREL(width);
     wxCoord xx = XLOG2DEVMAC(x);
     wxCoord yy = YLOG2DEVMAC(y);
     wxCoord ww = m_signX * XLOG2DEVREL(width);
@@ -958,7 +1019,7 @@ void  wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y,
                                    double radius)
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
                                    double radius)
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     if (radius < 0.0)
         radius = - radius * ((width < height) ? width : height);
     wxCoord xx = XLOG2DEVMAC(x);
     if (radius < 0.0)
         radius = - radius * ((width < height) ? width : height);
     wxCoord xx = XLOG2DEVMAC(x);
@@ -995,7 +1056,7 @@ void  wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y,
 void  wxDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
 void  wxDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     wxCoord xx = XLOG2DEVMAC(x);
     wxCoord yy = YLOG2DEVMAC(y);
     wxCoord ww = m_signX * XLOG2DEVREL(width);
     wxCoord xx = XLOG2DEVMAC(x);
     wxCoord yy = YLOG2DEVMAC(y);
     wxCoord ww = m_signX * XLOG2DEVREL(width);
@@ -1124,7 +1185,7 @@ bool  wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
     PixMapHandle    bmappixels =  GetGWorldPixMap( sourcePort ) ;
     if ( LockPixels(bmappixels) )
     {
     PixMapHandle    bmappixels =  GetGWorldPixMap( sourcePort ) ;
     if ( LockPixels(bmappixels) )
     {
-        wxMacPortSetter helper(this) ;
+        wxMacFastPortSetter helper(this) ;
         if ( source->GetDepth() == 1 )
         {
             RGBForeColor( &MAC_WXCOLORREF(m_textForegroundColour.GetPixel()) ) ;
         if ( source->GetDepth() == 1 )
         {
             RGBForeColor( &MAC_WXCOLORREF(m_textForegroundColour.GetPixel()) ) ;
@@ -1307,14 +1368,13 @@ void  wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
     if ( str.Length() == 0 )
         return ;
         
     if ( str.Length() == 0 )
         return ;
         
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     MacInstallFont() ;
 
     MacInstallFont() ;
 
-    wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
     if ( 0 )
     {
         m_macFormerAliasState = IsAntiAliasedTextEnabled(&m_macFormerAliasSize);
     if ( 0 )
     {
         m_macFormerAliasState = IsAntiAliasedTextEnabled(&m_macFormerAliasSize);
-        SetAntiAliasedTextEnabled(true, SInt16(m_scaleY * font->m_macFontSize));
+        SetAntiAliasedTextEnabled(true, SInt16(m_scaleY * m_font.GetMacFontSize()));
         m_macAliasWasEnabled = true ;
     }
     OSStatus status = noErr ;
         m_macAliasWasEnabled = true ;
     }
     OSStatus status = noErr ;
@@ -1324,24 +1384,9 @@ void  wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
     status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) (const wxChar*) str , 0 , str.Length() , str.Length() , 1 ,
         &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
 #else
     status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) (const wxChar*) str , 0 , str.Length() , str.Length() , 1 ,
         &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
 #else
-    TECObjectRef ec;
-    status = TECCreateConverter(&ec,
-                                wxApp::s_macDefaultEncodingIsPC
-                                    ? (int)kTextEncodingWindowsLatin1
-                                    : (int)kTextEncodingMacRoman,
-                                kTextEncodingUnicodeDefault);
-        
-    wxASSERT_MSG( status == noErr , wxT("couldn't start converter") ) ;
-    ByteCount byteOutLen ;
-    ByteCount byteInLen = str.Length() ;
-    ByteCount byteBufferLen = byteInLen *2 ;
-    char* buf = new char[byteBufferLen] ;
-    status = TECConvertText(ec, (ConstTextPtr)str.c_str() , byteInLen, &byteInLen,
-        (TextPtr)buf, byteBufferLen, &byteOutLen);
-    wxASSERT_MSG( status == noErr , wxT("couldn't convert text") ) ;
-    status = TECDisposeConverter(ec);
-    wxASSERT_MSG( status == noErr , wxT("couldn't dispose converter") ) ;
-    status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) buf , 0 , byteOutLen / 2 , byteOutLen / 2 , 1 ,
+    wxWCharBuffer wchar = str.wc_str( wxConvLocal ) ;
+    int wlen = wxWcslen( wchar.data() ) ;
+    status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) wchar.data() , 0 , wlen , wlen , 1 ,
         &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
 #endif
     wxASSERT_MSG( status == noErr , wxT("couldn't create the layout of the rotated text") );
         &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
 #endif
     wxASSERT_MSG( status == noErr , wxT("couldn't create the layout of the rotated text") );
@@ -1389,23 +1434,18 @@ void  wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
     CalcBoundingBox(XDEV2LOG(rect.left), YDEV2LOG(rect.top) );
     CalcBoundingBox(XDEV2LOG(rect.right), YDEV2LOG(rect.bottom) );
     ::ATSUDisposeTextLayout(atsuLayout);
     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)
 {
     wxCHECK_RET(Ok(), wxT("wxDC::DoDrawText  Invalid DC"));
 
 }
 
 void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
 {
     wxCHECK_RET(Ok(), wxT("wxDC::DoDrawText  Invalid DC"));
 
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     long xx = XLOG2DEVMAC(x);
     long yy = YLOG2DEVMAC(y);
 #if TARGET_CARBON
     long xx = XLOG2DEVMAC(x);
     long yy = YLOG2DEVMAC(y);
 #if TARGET_CARBON
-
     bool useDrawThemeText = ( DrawThemeTextBox != (void*) kUnresolvedCFragSymbolAddress ) ;
     bool useDrawThemeText = ( DrawThemeTextBox != (void*) kUnresolvedCFragSymbolAddress ) ;
-    if ( IsKindOf(CLASSINFO( wxPrinterDC ) ) || m_font.GetNoAntiAliasing() )
+    if ( UMAGetSystemVersion() < 0x1000 || IsKindOf(CLASSINFO( wxPrinterDC ) ) || m_font.GetNoAntiAliasing() )
         useDrawThemeText = false ;
 #endif
     MacInstallFont() ;
         useDrawThemeText = false ;
 #endif
     MacInstallFont() ;
@@ -1445,7 +1485,7 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
                 if ( useDrawThemeText )
                 {
                     Rect frame = { yy + line*(fi.descent + fi.ascent + fi.leading)  ,xx , yy + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 10000 } ;
                 if ( useDrawThemeText )
                 {
                     Rect frame = { yy + line*(fi.descent + fi.ascent + fi.leading)  ,xx , yy + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 10000 } ;
-                    wxMacCFStringHolder mString( linetext ) ;
+                    wxMacCFStringHolder mString( linetext , m_font.GetEncoding() ) ;
                     if ( m_backgroundMode != wxTRANSPARENT )
                     {
                         Point bounds={0,0} ;
                     if ( m_backgroundMode != wxTRANSPARENT )
                     {
                         Point bounds={0,0} ;
@@ -1473,7 +1513,7 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
                 else
 #endif
                 {
                 else
 #endif
                 {
-                    wxCharBuffer text = wxMacStringToCString(linetext) ; 
+                    wxCharBuffer text = linetext.mb_str(wxConvLocal) ; 
                     ::DrawText( text , 0 , strlen(text) ) ;
                     line++ ;
                     ::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) );
                     ::DrawText( text , 0 , strlen(text) ) ;
                     line++ ;
                     ::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) );
@@ -1487,7 +1527,7 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
         if ( useDrawThemeText )
         {
             Rect frame = { yy + line*(fi.descent + fi.ascent + fi.leading)  ,xx , yy + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 10000 } ;
         if ( useDrawThemeText )
         {
             Rect frame = { yy + line*(fi.descent + fi.ascent + fi.leading)  ,xx , yy + (line+1)*(fi.descent + fi.ascent + fi.leading) , xx + 10000 } ;
-            wxMacCFStringHolder mString( linetext ) ;
+            wxMacCFStringHolder mString( linetext , m_font.GetEncoding()) ;
 
             if ( m_backgroundMode != wxTRANSPARENT )
             {
 
             if ( m_backgroundMode != wxTRANSPARENT )
             {
@@ -1515,7 +1555,7 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
         else
 #endif
         {
         else
 #endif
         {
-            wxCharBuffer text = wxMacStringToCString(linetext) ; 
+            wxCharBuffer text = linetext.mb_str(wxConvLocal) ; 
             ::DrawText( text , 0 , strlen(text) ) ;
          }
     }
             ::DrawText( text , 0 , strlen(text) ) ;
          }
     }
@@ -1533,7 +1573,7 @@ void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *h
                             wxFont *theFont ) const
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
                             wxFont *theFont ) const
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     wxFont formerFont = m_font ;
     if ( theFont )
     {
     wxFont formerFont = m_font ;
     if ( theFont )
     {
@@ -1545,7 +1585,7 @@ void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *h
     ::GetFontInfo( &fi ) ;
 #if TARGET_CARBON    
     bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;
     ::GetFontInfo( &fi ) ;
 #if TARGET_CARBON    
     bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;
-    if ( IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() )
+    if ( UMAGetSystemVersion() < 0x1000 || IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() )
         useGetThemeText = false ;
 #endif
     if ( height )
         useGetThemeText = false ;
 #endif
     if ( height )
@@ -1555,21 +1595,7 @@ void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *h
     if ( externalLeading )
         *externalLeading = YDEV2LOGREL( fi.leading ) ;
     int length = strtext.Length() ;
     if ( externalLeading )
         *externalLeading = YDEV2LOGREL( fi.leading ) ;
     int length = strtext.Length() ;
-    /*
-    const char *text = NULL ;
-    wxString macText ;
-    if ( wxApp::s_macDefaultEncodingIsPC )
-    {
-        macText = wxMacMakeMacStringFromPC( string ) ;
-        text = macText ;
-        length = macText.Length() ;
-    } 
-    else
-    {
-        text = string ;
-        length = string.Length() ;
-    }
-    */
+
     int laststop = 0 ;
     int i = 0 ;
     int curwidth = 0 ;
     int laststop = 0 ;
     int i = 0 ;
     int curwidth = 0 ;
@@ -1588,7 +1614,7 @@ void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *h
                 {
                     Point bounds={0,0} ;
                     SInt16 baseline ;
                 {
                     Point bounds={0,0} ;
                     SInt16 baseline ;
-                    wxMacCFStringHolder mString( linetext ) ;
+                    wxMacCFStringHolder mString( linetext , m_font.GetEncoding() ) ;
                     ::GetThemeTextDimensions( mString,
                         kThemeCurrentPortFont,
                         kThemeStateActive,
                     ::GetThemeTextDimensions( mString,
                         kThemeCurrentPortFont,
                         kThemeStateActive,
@@ -1600,7 +1626,7 @@ void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *h
                 else
 #endif
                 {
                 else
 #endif
                 {
-                    wxCharBuffer text = wxMacStringToCString(linetext) ; 
+                    wxCharBuffer text = linetext.mb_str(wxConvLocal) ; 
                     curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
                 }
                 if ( curwidth > *width )
                     curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
                 }
                 if ( curwidth > *width )
@@ -1616,7 +1642,7 @@ void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *h
         {
             Point bounds={0,0} ;
             SInt16 baseline ;
         {
             Point bounds={0,0} ;
             SInt16 baseline ;
-            wxMacCFStringHolder mString( linetext ) ;
+            wxMacCFStringHolder mString( linetext , m_font.GetEncoding() ) ;
             ::GetThemeTextDimensions( mString,
                 kThemeCurrentPortFont,
                 kThemeStateActive,
             ::GetThemeTextDimensions( mString,
                 kThemeCurrentPortFont,
                 kThemeStateActive,
@@ -1628,7 +1654,7 @@ void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *h
         else
 #endif
         {
         else
 #endif
         {
-            wxCharBuffer text = wxMacStringToCString(linetext) ; 
+            wxCharBuffer text = linetext.mb_str(wxConvLocal) ;  
             curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
         }
         if ( curwidth > *width )
             curwidth = ::TextWidth( text , 0 , strlen(text) ) ;
         }
         if ( curwidth > *width )
@@ -1642,18 +1668,80 @@ void  wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *h
     }
 }
 
     }
 }
 
+
+bool wxDC::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const
+{
+    wxCHECK_MSG(Ok(), false, wxT("Invalid DC"));
+
+    widths.Empty();
+    widths.Add(0, text.Length());
+
+    if (text.Length() == 0)
+        return false;
+    
+    wxMacFastPortSetter helper(this) ;
+    MacInstallFont() ;
+#if TARGET_CARBON    
+    bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;
+    if ( UMAGetSystemVersion() < 0x1000 || IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() )
+        useGetThemeText = false ;
+
+    if ( useGetThemeText )
+    {
+        // If anybody knows how to do this more efficiently yet still handle
+        // the fractional glyph widths that may be present when using AA
+        // fonts, please change it.  Currently it is measuring from the
+        // begining of the string for each succeding substring, which is much
+        // slower than this should be.
+        for (size_t i=0; i<text.Length(); i++)
+        {
+            wxString str(text.Left(i+1));
+            Point bounds = {0,0};
+            SInt16 baseline ;
+            wxMacCFStringHolder mString(str, m_font.GetEncoding());
+            ::GetThemeTextDimensions( mString,
+                                      kThemeCurrentPortFont,
+                                      kThemeStateActive,
+                                      false,
+                                      &bounds,
+                                      &baseline );
+            widths[i] = XDEV2LOGREL(bounds.h);
+        }
+    }
+    else        
+#endif
+    {
+        wxCharBuffer buff = text.mb_str(wxConvLocal);
+        size_t len = strlen(buff);
+        short* measurements = new short[len+1];
+        MeasureText(len, buff.data(), measurements);
+
+        // Copy to widths, starting at measurements[1]
+        // NOTE: this doesn't take into account any multi-byte characters
+        // in buff, it probabkly should...
+        for (size_t i=0; i<text.Length(); i++)
+            widths[i] = XDEV2LOGREL(measurements[i+1]);
+
+        delete [] measurements;        
+    }
+
+    return true;
+}
+
+
+
 wxCoord   wxDC::GetCharWidth(void) const
 {
     wxCHECK_MSG(Ok(), 1, wxT("Invalid DC"));
 wxCoord   wxDC::GetCharWidth(void) const
 {
     wxCHECK_MSG(Ok(), 1, wxT("Invalid DC"));
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     MacInstallFont() ;
     int width = 0 ;
 #if TARGET_CARBON
     bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;
     MacInstallFont() ;
     int width = 0 ;
 #if TARGET_CARBON
     bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ;
-    if ( ((wxFont*)&m_font)->GetNoAntiAliasing() )
+    if ( UMAGetSystemVersion() < 0x1000 || ((wxFont*)&m_font)->GetNoAntiAliasing() )
         useGetThemeText = false ;
 #endif
         useGetThemeText = false ;
 #endif
-    char text[] = "H" ;
+    char text[] = "g" ;
 #if TARGET_CARBON
     if ( useGetThemeText )
     {
 #if TARGET_CARBON
     if ( useGetThemeText )
     {
@@ -1680,7 +1768,7 @@ wxCoord   wxDC::GetCharWidth(void) const
 wxCoord   wxDC::GetCharHeight(void) const
 {
     wxCHECK_MSG(Ok(), 1, wxT("Invalid DC"));
 wxCoord   wxDC::GetCharHeight(void) const
 {
     wxCHECK_MSG(Ok(), 1, wxT("Invalid DC"));
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     MacInstallFont() ;
     FontInfo fi ;
     ::GetFontInfo( &fi ) ;
     MacInstallFont() ;
     FontInfo fi ;
     ::GetFontInfo( &fi ) ;
@@ -1690,7 +1778,7 @@ wxCoord   wxDC::GetCharHeight(void) const
 void  wxDC::Clear(void)
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
 void  wxDC::Clear(void)
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
-    wxMacPortSetter helper(this) ;
+    wxMacFastPortSetter helper(this) ;
     Rect rect = { -31000 , -31000 , 31000 , 31000 } ;
     if (m_backgroundBrush.GetStyle() != wxTRANSPARENT)
     {
     Rect rect = { -31000 , -31000 , 31000 , 31000 } ;
     if (m_backgroundBrush.GetStyle() != wxTRANSPARENT)
     {
@@ -1708,12 +1796,11 @@ void wxDC::MacInstallFont() const
     //        return ;
     Pattern blackColor ;
     MacSetupBackgroundForCurrentPort(m_backgroundBrush) ;
     //        return ;
     Pattern blackColor ;
     MacSetupBackgroundForCurrentPort(m_backgroundBrush) ;
-    wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
-    if ( font )
+    if ( m_font.Ok() )
     {
     {
-        ::TextFont( font->m_macFontNum ) ;
-        ::TextSize( short(m_scaleY * font->m_macFontSize) ) ;
-        ::TextFace( font->m_macFontStyle ) ;
+        ::TextFont( m_font.GetMacFontNum() ) ;
+        ::TextSize( (short)(m_scaleY * m_font.GetMacFontSize()) ) ;
+        ::TextFace( m_font.GetMacFontStyle() ) ;
         m_macFontInstalled = true ;
         m_macBrushInstalled = false ;
         m_macPenInstalled = false ;
         m_macFontInstalled = true ;
         m_macBrushInstalled = false ;
         m_macPenInstalled = false ;
@@ -1782,9 +1869,9 @@ void wxDC::MacInstallFont() const
     }
     ::PenMode( mode ) ;
     OSStatus status = noErr ;
     }
     ::PenMode( mode ) ;
     OSStatus status = noErr ;
-    Fixed atsuSize = IntToFixed( int(m_scaleY * font->m_macFontSize) ) ;
-    Style qdStyle = font->m_macFontStyle ;
-    ATSUFontID    atsuFont = font->m_macATSUFontID ;
+    Fixed atsuSize = IntToFixed( int(m_scaleY * m_font.GetMacFontSize()) ) ;
+    Style qdStyle = m_font.GetMacFontStyle() ;
+    ATSUFontID    atsuFont = m_font.GetMacATSUFontID() ;
     status = ::ATSUCreateStyle((ATSUStyle *)&m_macATSUIStyle) ;
     wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") ) ;
     ATSUAttributeTag atsuTags[] =
     status = ::ATSUCreateStyle((ATSUStyle *)&m_macATSUIStyle) ;
     wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") ) ;
     ATSUAttributeTag atsuTags[] =
@@ -1837,18 +1924,18 @@ void wxDC::MacInstallFont() const
 
 Pattern gPatterns[] =
 {   // hatch patterns
 
 Pattern gPatterns[] =
 {   // hatch patterns
-    { 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF } ,
-    { 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 } ,
-    { 0x80 , 0x40 , 0x20 , 0x10 , 0x08 , 0x04 , 0x02 , 0x01 } ,
-    { 0x10 , 0x10 , 0x10 , 0xFF , 0x10 , 0x10 , 0x10 , 0x10 } ,
-    { 0x00 , 0x00 , 0x00 , 0xFF , 0x00 , 0x00 , 0x00 , 0x00 } ,
-    { 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 } ,
-    { 0x81 , 0x42 , 0x24 , 0x18 , 0x18 , 0x24 , 0x42 , 0x81 } ,
+    { { 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF } } ,
+    { { 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 } } ,
+    { { 0x80 , 0x40 , 0x20 , 0x10 , 0x08 , 0x04 , 0x02 , 0x01 } } ,
+    { { 0x10 , 0x10 , 0x10 , 0xFF , 0x10 , 0x10 , 0x10 , 0x10 } } ,
+    { { 0x00 , 0x00 , 0x00 , 0xFF , 0x00 , 0x00 , 0x00 , 0x00 } } ,
+    { { 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 } } ,
+    { { 0x81 , 0x42 , 0x24 , 0x18 , 0x18 , 0x24 , 0x42 , 0x81 } } ,
     // dash patterns
     // dash patterns
-    { 0xCC , 0x99 , 0x33 , 0x66 , 0xCC , 0x99 , 0x33 , 0x66 } , // DOT
-    { 0xFE , 0xFD , 0xFB , 0xF7 , 0xEF , 0xDF , 0xBF , 0x7F } , // LONG_DASH
-    { 0xEE , 0xDD , 0xBB , 0x77 , 0xEE , 0xDD , 0xBB , 0x77 } , // SHORT_DASH
-    { 0xDE , 0xBD , 0x7B , 0xF6 , 0xED , 0xDB , 0xB7 , 0x6F } , // DOT_DASH
+    { { 0xCC , 0x99 , 0x33 , 0x66 , 0xCC , 0x99 , 0x33 , 0x66 } } , // DOT
+    { { 0xFE , 0xFD , 0xFB , 0xF7 , 0xEF , 0xDF , 0xBF , 0x7F } } , // LONG_DASH
+    { { 0xEE , 0xDD , 0xBB , 0x77 , 0xEE , 0xDD , 0xBB , 0x77 } } , // SHORT_DASH
+    { { 0xDE , 0xBD , 0x7B , 0xF6 , 0xED , 0xDB , 0xB7 , 0x6F } } , // DOT_DASH
 } ;
 
 static void wxMacGetPattern(int penStyle, Pattern *pattern)
 } ;
 
 static void wxMacGetPattern(int penStyle, Pattern *pattern)
@@ -1875,7 +1962,7 @@ static void wxMacGetPattern(int penStyle, Pattern *pattern)
 void wxDC::MacInstallPen() const
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
 void wxDC::MacInstallPen() const
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
-    Pattern     blackColor;
+    //Pattern     blackColor;
     //    if ( m_macPenInstalled )
     //        return ;
     RGBColor forecolor = MAC_WXCOLORREF( m_pen.GetColour().GetPixel());
     //    if ( m_macPenInstalled )
     //        return ;
     RGBColor forecolor = MAC_WXCOLORREF( m_pen.GetColour().GetPixel());