]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/dc.cpp
adapted to new ..internal structure
[wxWidgets.git] / src / mac / dc.cpp
index bba19b5b4cd1dd13020624ff45883aaa301cbba7..55312eb06ffa0475f19e279253e58ab6c1bf8ce2 100644 (file)
@@ -19,6 +19,7 @@
 #include "wx/dcmemory.h"
 #include "wx/region.h"
 #include "wx/image.h"
+#include "wx/log.h"
 
 
 #if __MSL__ >= 0x6000
@@ -52,8 +53,6 @@ const double RAD2DEG  = 180.0 / M_PI;
 const short kEmulatedMode = -1 ;
 const short kUnsupportedMode = -2 ;
 
-#define wxMAC_EXPERIMENTAL_PATTERN 0
-
 wxMacPortSetter::wxMacPortSetter( const wxDC* dc ) :
        m_ph( (GrafPtr) dc->m_macPort ) 
 {
@@ -650,9 +649,13 @@ void  wxDC::SetLogicalFunction( int function )
        m_macPenInstalled = false ;
 }
 
-void  wxDC::DoFloodFill( wxCoord x, wxCoord y, const wxColour& col,
-                             int style )
+extern bool wxDoFloodFill(wxDC *dc, wxCoord x, wxCoord y, 
+                          const wxColour & col, int style);
+
+bool wxDC::DoFloodFill(wxCoord x, wxCoord y,
+                       const wxColour& col, int style)
 {
+    return wxDoFloodFill(this, x, y, col, style);
 }
 
 bool  wxDC::DoGetPixel( wxCoord x, wxCoord y, wxColour *col ) const 
@@ -870,12 +873,11 @@ void  wxDC::DoDrawPoint( wxCoord x, wxCoord y )
   
   if (m_pen.GetStyle() != wxTRANSPARENT) 
   {
-               MacInstallPen() ;
         wxCoord xx1 = XLOG2DEVMAC(x); 
         wxCoord yy1 = YLOG2DEVMAC(y);
-       
-               ::MoveTo(xx1,yy1);
-               ::LineTo(xx1+1, yy1+1);
+        RGBColor pencolor = MAC_WXCOLORREF( m_pen.GetColour().GetPixel());
+        ::SetCPixel( xx1,yy1,&pencolor) ;
+        CalcBoundingBox(x, y);
   }
 }
 
@@ -907,8 +909,8 @@ void  wxDC::DoDrawLines(int n, wxPoint points[],
 }
 
 void  wxDC::DoDrawPolygon(int n, wxPoint points[],
-                               wxCoord xoffset, wxCoord yoffset,
-                               int fillStyle )
+                          wxCoord xoffset, wxCoord yoffset,
+                          int fillStyle )
 {
        wxCHECK_RET(Ok(), wxT("Invalid DC"));
        wxMacPortSetter helper(this) ;
@@ -1199,7 +1201,6 @@ bool  wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
        if ( LockPixels(bmappixels) )
        {
         wxMacPortSetter helper(this) ;
-        RGBColor tempColor ;
     
        if ( source->GetDepth() == 1 )
        {
@@ -1376,12 +1377,15 @@ void  wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
 {
     wxCHECK_RET( Ok(), wxT("wxDC::DoDrawRotatedText  Invalid window dc") );
 
-    if (angle == 0.0)
+    if (angle == 0.0 )
     {
         DrawText(str, x, y);
         return;
     }
 
+    if ( str.Length() == 0 )
+        return ;
+
     wxMacPortSetter helper(this) ;
     MacInstallFont() ;
     
@@ -1427,14 +1431,17 @@ void  wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
         &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ;
        wxASSERT_MSG( status == noErr , "couldn't create the layout of the rotated text" );
 
-    Fixed atsuAngle = IntToFixed( angle ) ;
-       ByteCount angleSize = sizeof(Fixed) ;
-       ATSUAttributeTag rotationTag = kATSULineRotationTag ;
-       ATSUAttributeValuePtr   angleValue = &atsuAngle ;
-       status = ::ATSUSetLayoutControls(atsuLayout , 1 , &rotationTag , &angleSize , &angleValue ) ;
+    if ( abs(angle) > 0 )
+    {
+        Fixed atsuAngle = IntToFixed( angle ) ;
+       ByteCount angleSize = sizeof(Fixed) ;
+       ATSUAttributeTag rotationTag = kATSULineRotationTag ;
+       ATSUAttributeValuePtr   angleValue = &atsuAngle ;
+       status = ::ATSUSetLayoutControls(atsuLayout , 1 , &rotationTag , &angleSize , &angleValue ) ;
+    }
 
-       status = ::ATSUDrawText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd,
-                                       IntToFixed(XLOG2DEVMAC(x) ) , IntToFixed(YLOG2DEVMAC(y) ) );
+    status = ::ATSUDrawText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd,
+                               IntToFixed(XLOG2DEVMAC(x) ) , IntToFixed(YLOG2DEVMAC(y) ) );
        wxASSERT_MSG( status == noErr , "couldn't draw the rotated text" );
     Rect rect ;
        status = ::ATSUMeasureTextImage( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd,
@@ -1449,13 +1456,15 @@ void  wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
 }
 
 void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
-{
+{   
     wxCHECK_RET(Ok(), wxT("wxDC::DoDrawText  Invalid DC"));
     wxMacPortSetter helper(this) ;
 
        long xx = XLOG2DEVMAC(x);
        long yy = YLOG2DEVMAC(y);
-  
+#if TARGET_CARBON      
+       bool useDrawThemeText = ( DrawThemeTextBox != (void*) kUnresolvedCFragSymbolAddress ) ;
+#endif
        MacInstallFont() ;
     if ( 0 ) 
     {
@@ -1467,7 +1476,11 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
        FontInfo fi ;
        ::GetFontInfo( &fi ) ;
        
-       yy += fi.ascent ;
+#if TARGET_CARBON      
+       if ( !useDrawThemeText )
+#endif
+           yy += fi.ascent ;
+           
        ::MoveTo( xx , yy );
        if (  m_backgroundMode == wxTRANSPARENT )
        {
@@ -1498,19 +1511,58 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
        int i = 0 ;
        int line = 0 ;
        
-       while( i < length )
-       {
-               if( text[i] == 13 || text[i] == 10)
-               {
-                       ::DrawText( text , laststop , i - laststop ) ;
-                       line++ ;
-                       ::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) );
-                       laststop = i+1 ;
-               }
-               i++ ;
+    {
+       
+       while( i < length )
+       {
+               if( text[i] == 13 || text[i] == 10)
+               {
+#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 + 1000 } ;
+                    CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ;
+                       ::DrawThemeTextBox( mString,
+                                                               kThemeCurrentPortFont,
+                                                               kThemeStateActive,
+                                                               true,
+                                                               &frame,
+                                                               teJustLeft,
+                                                               nil );
+                   CFRelease( mString ) ;
+                   line++ ;
+                }
+                   else
+#endif
+                   {
+                               ::DrawText( text , laststop , i - laststop ) ;
+                   line++ ;
+                               ::MoveTo( xx , yy + line*(fi.descent + fi.ascent + fi.leading) );
+                       }
+                       laststop = i+1 ;
+               }
+               i++ ;
+       }
+#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 + 1000 } ;
+            CFStringRef mString = CFStringCreateWithCString( NULL , text + laststop , kCFStringEncodingMacRoman ) ;
+               ::DrawThemeTextBox( mString,
+                                                       kThemeCurrentPortFont,
+                                                       kThemeStateActive,
+                                                       true,
+                                                       &frame,
+                                                       teJustLeft,
+                                                       nil );
+            CFRelease( mString ) ;
+        }
+        else
+#endif
+        {      
+           ::DrawText( text , laststop , i - laststop ) ;
+        }
        }
-                       
-       ::DrawText( text , laststop , i - laststop ) ;
        ::TextMode( srcOr ) ;
 }
 
@@ -1634,7 +1686,7 @@ void  wxDC::Clear(void)
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));  
     wxMacPortSetter helper(this) ;
-       Rect rect = { -32000 , -32000 , 32000 , 32000 } ;
+       Rect rect = { -31000 , -31000 , 31000 , 31000 } ;
        
        if (m_backgroundBrush.GetStyle() != wxTRANSPARENT) 
        {
@@ -1652,6 +1704,8 @@ void wxDC::MacInstallFont() const
 //             return ;
        Pattern blackColor ;
        
+       MacSetupBackgroundForCurrentPort(m_backgroundBrush) ;
+       
        wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
 
        if ( font )
@@ -1671,12 +1725,16 @@ void wxDC::MacInstallFont() const
        }
        else
        {
-               short fontnum ;
-               
-               GetFNum( "\pGeneva" , &fontnum ) ;
-               ::TextFont( fontnum ) ;
-               ::TextSize( short(m_scaleY * 10) ) ;
-               ::TextFace( 0 ) ;
+        FontFamilyID fontId ;
+       Str255 fontName ;
+       SInt16 fontSize ;
+       Style fontStyle ;
+       GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ;
+        GetFNum( fontName, &fontId );
+        
+               ::TextFont( fontId ) ;
+               ::TextSize( short(m_scaleY * fontSize) ) ;
+               ::TextFace( fontStyle ) ;
        
                // todo reset after spacing changes - or store the current spacing somewhere
        
@@ -1746,37 +1804,48 @@ void wxDC::MacInstallFont() const
        {
            kATSUFontTag ,
            kATSUSizeTag ,
-           kATSUColorTag ,
-           
+//         kATSUColorTag ,
+           kATSUBaselineClassTag ,
+           kATSUVerticalCharacterTag,
+
            kATSUQDBoldfaceTag ,
            kATSUQDItalicTag ,
            kATSUQDUnderlineTag ,
            kATSUQDCondensedTag ,
            kATSUQDExtendedTag ,
-           
+
        } ;
                                                                
     ByteCount atsuSizes[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] =
     {
         sizeof( ATSUFontID ) ,
         sizeof( Fixed ) ,
-        sizeof( RGBColor ) ,
+//        sizeof( RGBColor ) ,
+        sizeof( BslnBaselineClass ) ,
+        sizeof( ATSUVerticalCharacterType),
+        
         sizeof( Boolean ) ,
         sizeof( Boolean ) ,
         sizeof( Boolean ) ,
         sizeof( Boolean ) ,
         sizeof( Boolean ) ,
+
     } ;
                                                                        
     Boolean kTrue = true ;
     Boolean kFalse = false ;
+    BslnBaselineClass kBaselineDefault = kBSLNHangingBaseline ;
+
+    ATSUVerticalCharacterType kHorizontal = kATSUStronglyHorizontal;
 
        ATSUAttributeValuePtr   atsuValues[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] =
        {
            &atsuFont ,
            &atsuSize ,
-           &MAC_WXCOLORREF( m_textForegroundColour.GetPixel() ) ,
-           
+//         &MAC_WXCOLORREF( m_textForegroundColour.GetPixel() ) ,
+           &kBaselineDefault ,
+           &kHorizontal,
+
            (qdStyle & bold) ? &kTrue : &kFalse ,
            (qdStyle & italic) ? &kTrue : &kFalse ,
            (qdStyle & underline) ? &kTrue : &kFalse ,