1 ///////////////////////////////////////////////////////////////////////////// 
   8 // Copyright:   (c) AUTHOR 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13 #pragma implementation "dc.h" 
  18 #include "wx/mac/uma.h" 
  19 #include "wx/dcmemory.h" 
  20 #include "wx/region.h" 
  30 #include "wx/mac/private.h" 
  31 #include "ATSUnicode.h" 
  32 #include "TextCommon.h" 
  33 #include "TextEncodingConverter.h" 
  35 #if !USE_SHARED_LIBRARY 
  36 IMPLEMENT_ABSTRACT_CLASS(wxDC
, wxObject
) 
  39 //----------------------------------------------------------------------------- 
  41 //----------------------------------------------------------------------------- 
  43 #define mm2inches               0.0393700787402 
  44 #define inches2mm               25.4 
  45 #define mm2twips                56.6929133859 
  46 #define twips2mm                0.0176388888889 
  47 #define mm2pt                   2.83464566929 
  48 #define pt2mm                   0.352777777778 
  50 const double M_PI 
= 3.14159265358979 ; 
  52 const double RAD2DEG  
= 180.0 / M_PI
; 
  53 const short kEmulatedMode 
= -1 ; 
  54 const short kUnsupportedMode 
= -2 ; 
  56 wxMacPortSetter::wxMacPortSetter( const wxDC
* dc 
) : 
  57         m_ph( (GrafPtr
) dc
->m_macPort 
)  
  59         wxASSERT( dc
->Ok() ) ; 
  61         dc
->MacSetupPort(&m_ph
) ; 
  64 wxMacPortSetter::~wxMacPortSetter()  
  66         m_dc
->MacCleanupPort(&m_ph
) ; 
  69 //----------------------------------------------------------------------------- 
  71 //----------------------------------------------------------------------------- 
  73 static inline double dmin(double a
, double b
) { return a 
< b 
? a 
: b
; } 
  74 static inline double dmax(double a
, double b
) { return a 
> b 
? a 
: b
; } 
  75 static inline double DegToRad(double deg
) { return (deg 
* M_PI
) / 180.0; } 
  77 //----------------------------------------------------------------------------- 
  79 //----------------------------------------------------------------------------- 
  81 // this function emulates all wx colour manipulations, used to verify the implementation 
  82 // by setting the mode in the blitting functions to kEmulatedMode 
  84 void wxMacCalculateColour( int logical_func 
, const RGBColor 
&srcColor 
, RGBColor 
&dstColor 
) ; 
  85 void wxMacCalculateColour( int logical_func 
, const RGBColor 
&srcColor 
, RGBColor 
&dstColor 
) 
  87     switch ( logical_func 
) 
  89         case wxAND
:        // src AND dst 
  90             dstColor
.red 
= dstColor
.red 
& srcColor
.red 
; 
  91             dstColor
.green 
= dstColor
.green 
& srcColor
.green 
; 
  92             dstColor
.blue 
= dstColor
.blue 
& srcColor
.blue 
; 
  94         case wxAND_INVERT
: // (NOT src) AND dst 
  95             dstColor
.red 
= dstColor
.red 
& ~srcColor
.red 
; 
  96             dstColor
.green 
= dstColor
.green 
& ~srcColor
.green 
; 
  97             dstColor
.blue 
= dstColor
.blue 
& ~srcColor
.blue 
; 
  99         case wxAND_REVERSE
:// src AND (NOT dst) 
 100             dstColor
.red 
= ~dstColor
.red 
& srcColor
.red 
; 
 101             dstColor
.green 
= ~dstColor
.green 
& srcColor
.green 
; 
 102             dstColor
.blue 
= ~dstColor
.blue 
& srcColor
.blue 
; 
 110             dstColor
.red 
= srcColor
.red 
; 
 111             dstColor
.green 
= srcColor
.green 
; 
 112             dstColor
.blue 
= srcColor
.blue 
; 
 114         case wxEQUIV
:      // (NOT src) XOR dst 
 115             dstColor
.red 
= dstColor
.red 
^ ~srcColor
.red 
; 
 116             dstColor
.green 
= dstColor
.green 
^ ~srcColor
.green 
; 
 117             dstColor
.blue 
= dstColor
.blue 
^ ~srcColor
.blue 
; 
 119         case wxINVERT
:     // NOT dst 
 120             dstColor
.red 
= ~dstColor
.red 
; 
 121             dstColor
.green 
= ~dstColor
.green 
; 
 122             dstColor
.blue 
= ~dstColor
.blue 
; 
 124         case wxNAND
:       // (NOT src) OR (NOT dst) 
 125             dstColor
.red 
= ~dstColor
.red 
| ~srcColor
.red 
; 
 126             dstColor
.green 
= ~dstColor
.green 
| ~srcColor
.green 
; 
 127             dstColor
.blue 
= ~dstColor
.blue 
| ~srcColor
.blue 
; 
 129         case wxNOR
:        // (NOT src) AND (NOT dst) 
 130             dstColor
.red 
= ~dstColor
.red 
& ~srcColor
.red 
; 
 131             dstColor
.green 
= ~dstColor
.green 
& ~srcColor
.green 
; 
 132             dstColor
.blue 
= ~dstColor
.blue 
& ~srcColor
.blue 
; 
 136         case wxOR
:         // src OR dst 
 137             dstColor
.red 
= dstColor
.red 
| srcColor
.red 
; 
 138             dstColor
.green 
= dstColor
.green 
| srcColor
.green 
; 
 139             dstColor
.blue 
= dstColor
.blue 
| srcColor
.blue 
; 
 141         case wxOR_INVERT
:  // (NOT src) OR dst 
 142             dstColor
.red 
= dstColor
.red 
| ~srcColor
.red 
; 
 143             dstColor
.green 
= dstColor
.green 
| ~srcColor
.green 
; 
 144             dstColor
.blue 
= dstColor
.blue 
| ~srcColor
.blue 
; 
 146         case wxOR_REVERSE
: // src OR (NOT dst) 
 147             dstColor
.red 
= ~dstColor
.red 
| srcColor
.red 
; 
 148             dstColor
.green 
= ~dstColor
.green 
| srcColor
.green 
; 
 149             dstColor
.blue 
= ~dstColor
.blue 
| srcColor
.blue 
; 
 152             dstColor
.red 
= 0xFFFF ; 
 153             dstColor
.green 
= 0xFFFF ; 
 154             dstColor
.blue 
= 0xFFFF ; 
 156         case wxSRC_INVERT
: // (NOT src) 
 157             dstColor
.red 
= ~srcColor
.red 
; 
 158             dstColor
.green 
= ~srcColor
.green 
; 
 159             dstColor
.blue 
= ~srcColor
.blue 
; 
 161         case wxXOR
:        // src XOR dst 
 162             dstColor
.red 
= dstColor
.red 
^ srcColor
.red 
; 
 163             dstColor
.green 
= dstColor
.green 
^ srcColor
.green 
; 
 164             dstColor
.blue 
= dstColor
.blue 
^ srcColor
.blue 
; 
 175   m_mm_to_pix_x 
= mm2pt
; 
 176   m_mm_to_pix_y 
= mm2pt
; 
 178   m_internalDeviceOriginX 
= 0; 
 179   m_internalDeviceOriginY 
= 0; 
 180   m_externalDeviceOriginX 
= 0; 
 181   m_externalDeviceOriginY 
= 0; 
 183   m_logicalScaleX 
= 1.0; 
 184   m_logicalScaleY 
= 1.0; 
 190   m_needComputeScaleX 
= FALSE
; 
 191   m_needComputeScaleY 
= FALSE
; 
 197         m_macFontInstalled 
= false ; 
 198         m_macBrushInstalled 
= false ; 
 199         m_macPenInstalled 
= false ; 
 201         m_macLocalOrigin
.x 
= m_macLocalOrigin
.y 
= 0 ; 
 202         m_macBoundaryClipRgn 
= NewRgn() ; 
 203         m_macCurrentClipRgn 
= NewRgn() ; 
 205         SetRectRgn( (RgnHandle
) m_macBoundaryClipRgn 
, -32000 , -32000 , 32000 , 32000 ) ; 
 206         SetRectRgn( (RgnHandle
) m_macCurrentClipRgn 
, -32000 , -32000 , 32000 , 32000 ) ; 
 208     m_pen 
= *wxBLACK_PEN
; 
 209     m_font 
= *wxNORMAL_FONT
; 
 210     m_brush 
= *wxWHITE_BRUSH
; 
 211     m_macCurrentPortStateHelper 
= NULL 
; 
 212     m_macATSUIStyle 
= NULL 
; 
 213     m_macAliasWasEnabled 
= false; 
 214     m_macForegroundPixMap 
= NULL 
; 
 215     m_macBackgroundPixMap 
= NULL 
; 
 220     DisposeRgn( (RgnHandle
) m_macBoundaryClipRgn 
) ; 
 221     DisposeRgn( (RgnHandle
) m_macCurrentClipRgn 
) ; 
 223 void wxDC::MacSetupPort(wxMacPortStateHelper
* help
) const 
 225     wxASSERT( m_macCurrentPortStateHelper 
== NULL 
) ; 
 226     m_macCurrentPortStateHelper 
= help 
; 
 227         SetClip( (RgnHandle
) m_macCurrentClipRgn
); 
 229         m_macFontInstalled 
= false ; 
 230         m_macBrushInstalled 
= false ; 
 231         m_macPenInstalled 
= false ;      
 234 void wxDC::MacCleanupPort(wxMacPortStateHelper
* help
) const 
 236     wxASSERT( m_macCurrentPortStateHelper 
== help 
) ; 
 237     m_macCurrentPortStateHelper 
= NULL 
; 
 238     if( m_macATSUIStyle 
) 
 240         ::ATSUDisposeStyle((ATSUStyle
)m_macATSUIStyle
); 
 241         m_macATSUIStyle 
= NULL 
; 
 243     if ( m_macAliasWasEnabled 
) 
 245         SetAntiAliasedTextEnabled(m_macFormerAliasState
, m_macFormerAliasSize
); 
 246         m_macAliasWasEnabled 
= false ; 
 248     if ( m_macForegroundPixMap 
) 
 251         ::PenPat(GetQDGlobalsBlack(&blackColor
)); 
 252         DisposePixPat( (PixPatHandle
) m_macForegroundPixMap 
) ; 
 253         m_macForegroundPixMap 
= NULL 
; 
 255     if ( m_macBackgroundPixMap 
) 
 258         ::BackPat(GetQDGlobalsWhite(&whiteColor
)); 
 259         DisposePixPat( (PixPatHandle
) m_macBackgroundPixMap 
) ; 
 260         m_macBackgroundPixMap 
= NULL 
; 
 264 void wxDC::DoDrawBitmap( const wxBitmap 
&bmp
, wxCoord x
, wxCoord y
, bool useMask 
) 
 266      wxCHECK_RET( Ok(), wxT("invalid window dc") ); 
 268      wxCHECK_RET( bmp
.Ok(), wxT("invalid bitmap") ); 
 270      wxMacPortSetter 
helper(this) ; 
 272      wxCoord xx 
= XLOG2DEVMAC(x
); 
 273      wxCoord yy 
= YLOG2DEVMAC(y
); 
 274      wxCoord w 
= bmp
.GetWidth(); 
 275      wxCoord h 
= bmp
.GetHeight(); 
 276      wxCoord ww 
= XLOG2DEVREL(w
); 
 277      wxCoord hh 
= YLOG2DEVREL(h
); 
 279      // Set up drawing mode 
 280      short  mode 
= (m_logicalFunction 
== wxCOPY 
? srcCopy 
: 
 281                     //m_logicalFunction == wxCLEAR ? WHITENESS : 
 282                     //m_logicalFunction == wxSET ? BLACKNESS : 
 283                     m_logicalFunction 
== wxINVERT 
? hilite 
: 
 284                    //m_logicalFunction == wxAND ? MERGECOPY : 
 285                     m_logicalFunction 
== wxOR 
? srcOr 
: 
 286                     m_logicalFunction 
== wxSRC_INVERT 
? notSrcCopy 
: 
 287                     m_logicalFunction 
== wxXOR 
? srcXor 
: 
 288                     m_logicalFunction 
== wxOR_REVERSE 
? notSrcOr 
: 
 289                     //m_logicalFunction == wxAND_REVERSE ? SRCERASE : 
 290                     //m_logicalFunction == wxSRC_OR ? srcOr : 
 291                     //m_logicalFunction == wxSRC_AND ? SRCAND : 
 294      if ( bmp
.GetBitmapType() == kMacBitmapTypePict 
) { 
 295          Rect bitmaprect 
= { 0 , 0 , hh
, ww 
}; 
 296          ::OffsetRect( &bitmaprect
, xx
, yy 
) ; 
 297          ::DrawPicture( (PicHandle
) bmp
.GetPict(), &bitmaprect 
) ; 
 299      else if ( bmp
.GetBitmapType() == kMacBitmapTypeGrafWorld 
) 
 301          GWorldPtr    bmapworld 
= MAC_WXHBITMAP( bmp
.GetHBITMAP() ); 
 302          PixMapHandle bmappixels 
; 
 304          // Set foreground and background colours (for bitmaps depth = 1) 
 305          if(bmp
.GetDepth() == 1) 
 307              RGBColor fore 
= MAC_WXCOLORREF(m_textForegroundColour
.GetPixel()); 
 308              RGBColor back 
= MAC_WXCOLORREF(m_textBackgroundColour
.GetPixel()); 
 314              RGBColor white 
= { 0xFFFF, 0xFFFF,0xFFFF} ; 
 315              RGBColor black 
= { 0,0,0} ; 
 316              RGBForeColor( &black 
) ; 
 317              RGBBackColor( &white 
) ; 
 320          bmappixels 
= GetGWorldPixMap( bmapworld 
) ; 
 322          wxCHECK_RET(LockPixels(bmappixels
), 
 323                      wxT("DoDrawBitmap:  Unable to lock pixels")); 
 325          Rect source 
= { 0, 0, h
, w 
}; 
 326          Rect dest   
= { yy
, xx
, yy 
+ hh
, xx 
+ ww 
}; 
 328          if ( useMask 
&& bmp
.GetMask() ) 
 330              if( LockPixels(GetGWorldPixMap(MAC_WXHBITMAP(bmp
.GetMask()->GetMaskBitmap())))) 
 334                       GetPortBitMapForCopyBits(bmapworld
), 
 335                       GetPortBitMapForCopyBits(MAC_WXHBITMAP(bmp
.GetMask()->GetMaskBitmap())), 
 336                       GetPortBitMapForCopyBits( MAC_WXHBITMAP(m_macPort
) ), 
 337                       &source
, &source
, &dest
, mode
, NULL
 
 339                  UnlockPixels(GetGWorldPixMap(MAC_WXHBITMAP(bmp
.GetMask()->GetMaskBitmap()))); 
 343              CopyBits( GetPortBitMapForCopyBits( bmapworld 
), 
 344                        GetPortBitMapForCopyBits( MAC_WXHBITMAP(m_macPort
) ), 
 345                        &source
, &dest
, mode
, NULL 
) ; 
 347          UnlockPixels( bmappixels 
) ; 
 349      else if ( bmp
.GetBitmapType() == kMacBitmapTypeIcon 
) 
 351         Rect bitmaprect 
= { 0 , 0 , bmp
.GetHeight(), bmp
.GetWidth() } ; 
 352         OffsetRect( &bitmaprect
, xx
, yy 
) ; 
 353         PlotCIconHandle( &bitmaprect 
, atNone 
, ttNone 
, MAC_WXHICON(bmp
.GetHICON()) ) ; 
 355      m_macPenInstalled 
= false ; 
 356      m_macBrushInstalled 
= false ; 
 357      m_macFontInstalled 
= false ; 
 361 void wxDC::DoDrawIcon( const wxIcon 
&icon
, wxCoord x
, wxCoord y 
) 
 363      wxCHECK_RET(Ok(), wxT("Invalid dc  wxDC::DoDrawIcon")); 
 365      wxCHECK_RET(icon
.Ok(), wxT("Invalid icon wxDC::DoDrawIcon")); 
 367     DoDrawBitmap( icon 
, x 
, y 
, icon
.GetMask() != NULL 
) ; 
 369 void wxDC::DoSetClippingRegion( wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height 
) 
 371     wxCHECK_RET(Ok(), wxT("wxDC::DoSetClippingRegion  Invalid DC")); 
 372     wxCoord xx
, yy
, ww
, hh
; 
 376     ww 
= XLOG2DEVREL(width
); 
 377     hh 
= YLOG2DEVREL(height
); 
 379     SetRectRgn( (RgnHandle
) m_macCurrentClipRgn 
, xx 
, yy 
, xx 
+ ww 
, yy 
+ hh 
) ; 
 380     SectRgn( (RgnHandle
) m_macCurrentClipRgn 
, (RgnHandle
) m_macBoundaryClipRgn 
, (RgnHandle
) m_macCurrentClipRgn 
) ; 
 384         m_clipX1 
= wxMax( m_clipX1 
, xx 
); 
 385         m_clipY1 
= wxMax( m_clipY1 
, yy 
); 
 386         m_clipX2 
= wxMin( m_clipX2
, (xx 
+ ww
)); 
 387         m_clipY2 
= wxMin( m_clipY2
, (yy 
+ hh
)); 
 399 void wxDC::DoSetClippingRegionAsRegion( const wxRegion 
®ion  
) 
 401     wxCHECK_RET( Ok(), wxT("invalid window dc") ) ; 
 403         wxMacPortSetter 
helper(this) ; 
 406         DestroyClippingRegion(); 
 411     region
.GetBox( x
, y
, w
, h 
); 
 412     wxCoord xx
, yy
, ww
, hh
; 
 419     // if we have a scaling that we cannot map onto native regions 
 420     // we must use the box 
 422     if ( ww 
!= w 
|| hh 
!= h 
) 
 424         wxDC::DoSetClippingRegion( x
, y
, w
, h 
); 
 428         CopyRgn( (RgnHandle
) region
.GetWXHRGN() , (RgnHandle
) m_macCurrentClipRgn 
) ; 
 429         if ( xx 
!= x 
|| yy 
!= y 
) 
 431             OffsetRgn( (RgnHandle
) m_macCurrentClipRgn 
, xx 
- x 
, yy 
- y 
) ; 
 433         SectRgn( (RgnHandle
) m_macCurrentClipRgn 
, (RgnHandle
) m_macBoundaryClipRgn 
, (RgnHandle
) m_macCurrentClipRgn 
) ; 
 436             m_clipX1 
= wxMax( m_clipX1 
, xx 
); 
 437             m_clipY1 
= wxMax( m_clipY1 
, yy 
); 
 438             m_clipX2 
= wxMin( m_clipX2
, (xx 
+ ww
)); 
 439             m_clipY2 
= wxMin( m_clipY2
, (yy 
+ hh
)); 
 453 void wxDC::DestroyClippingRegion() 
 455   wxMacPortSetter 
helper(this) ; 
 456   CopyRgn( (RgnHandle
) m_macBoundaryClipRgn 
, (RgnHandle
) m_macCurrentClipRgn 
) ; 
 459 void wxDC::DoGetSize( int* width
, int* height 
) const 
 461   *width 
= m_maxX
-m_minX
; 
 462   *height 
= m_maxY
-m_minY
; 
 464 void wxDC::DoGetSizeMM( int* width
, int* height 
) const 
 469   *width 
= long( double(w
) / (m_scaleX
*m_mm_to_pix_x
) ); 
 470   *height 
= long( double(h
) / (m_scaleY
*m_mm_to_pix_y
) ); 
 472 void wxDC::SetTextForeground( const wxColour 
&col 
) 
 474     wxCHECK_RET(Ok(), wxT("Invalid DC")); 
 475     m_textForegroundColour 
= col
; 
 476     m_macFontInstalled 
= false ; 
 478 void wxDC::SetTextBackground( const wxColour 
&col 
) 
 480     wxCHECK_RET(Ok(), wxT("Invalid DC")); 
 481     m_textBackgroundColour 
= col
; 
 482     m_macFontInstalled 
= false ; 
 484 void wxDC::SetMapMode( int mode 
) 
 489       SetLogicalScale( twips2mm
*m_mm_to_pix_x
, twips2mm
*m_mm_to_pix_y 
); 
 492       SetLogicalScale( pt2mm
*m_mm_to_pix_x
, pt2mm
*m_mm_to_pix_y 
); 
 495       SetLogicalScale( m_mm_to_pix_x
, m_mm_to_pix_y 
); 
 498       SetLogicalScale( m_mm_to_pix_x
/10.0, m_mm_to_pix_y
/10.0 ); 
 502       SetLogicalScale( 1.0, 1.0 ); 
 505   if (mode 
!= wxMM_TEXT
) 
 507     m_needComputeScaleX 
= TRUE
; 
 508     m_needComputeScaleY 
= TRUE
; 
 511 void wxDC::SetUserScale( double x
, double y 
) 
 513   // allow negative ? -> no 
 516   ComputeScaleAndOrigin(); 
 518 void wxDC::SetLogicalScale( double x
, double y 
) 
 523   ComputeScaleAndOrigin(); 
 525 void wxDC::SetLogicalOrigin( wxCoord x
, wxCoord y 
) 
 527   m_logicalOriginX 
= x 
* m_signX
;   // is this still correct ? 
 528   m_logicalOriginY 
= y 
* m_signY
; 
 529   ComputeScaleAndOrigin(); 
 531 void wxDC::SetDeviceOrigin( wxCoord x
, wxCoord y 
) 
 533   m_externalDeviceOriginX 
= x
; 
 534   m_externalDeviceOriginY 
= y
; 
 535   ComputeScaleAndOrigin(); 
 539 void wxDC::SetInternalDeviceOrigin( long x
, long y 
) 
 541   m_internalDeviceOriginX 
= x
; 
 542   m_internalDeviceOriginY 
= y
; 
 543   ComputeScaleAndOrigin(); 
 545 void wxDC::GetInternalDeviceOrigin( long *x
, long *y 
) 
 547   if (x
) *x 
= m_internalDeviceOriginX
; 
 548   if (y
) *y 
= m_internalDeviceOriginY
; 
 551 void wxDC::SetAxisOrientation( bool xLeftRight
, bool yBottomUp 
) 
 553   m_signX 
= (xLeftRight 
?  1 : -1); 
 554   m_signY 
= (yBottomUp  
? -1 :  1); 
 555   ComputeScaleAndOrigin(); 
 558 wxSize 
wxDC::GetPPI() const 
 560     return wxSize(72, 72); 
 563 int wxDC::GetDepth() const 
 565     if ( IsPortColor( (CGrafPtr
) m_macPort 
) ) 
 567         return ( (**GetPortPixMap( (CGrafPtr
) m_macPort
)).pixelSize 
) ; 
 572 void wxDC::ComputeScaleAndOrigin() 
 574   // CMB: copy scale to see if it changes 
 575   double origScaleX 
= m_scaleX
; 
 576   double origScaleY 
= m_scaleY
; 
 578   m_scaleX 
= m_logicalScaleX 
* m_userScaleX
; 
 579   m_scaleY 
= m_logicalScaleY 
* m_userScaleY
; 
 581   m_deviceOriginX 
= m_internalDeviceOriginX 
+ m_externalDeviceOriginX
; 
 582   m_deviceOriginY 
= m_internalDeviceOriginY 
+ m_externalDeviceOriginY
; 
 584   // CMB: if scale has changed call SetPen to recalulate the line width  
 585   if (m_scaleX 
!= origScaleX 
|| m_scaleY 
!= origScaleY
) 
 587     // this is a bit artificial, but we need to force wxDC to think 
 588     // the pen has changed 
 589     wxPen
* pen 
= & GetPen(); 
 595 void  wxDC::SetPalette( const wxPalette
& palette 
) 
 599 void  wxDC::SetBackgroundMode( int mode 
) 
 601         m_backgroundMode 
= mode 
; 
 604 void  wxDC::SetFont( const wxFont 
&font 
) 
 607     m_macFontInstalled 
= false ; 
 610 void  wxDC::SetPen( const wxPen 
&pen 
) 
 617   m_macPenInstalled 
= false ; 
 620 void  wxDC::SetBrush( const wxBrush 
&brush 
) 
 622   if (m_brush 
== brush
)  
 626   m_macBrushInstalled 
= false ; 
 629 void  wxDC::SetBackground( const wxBrush 
&brush 
) 
 631   if (m_backgroundBrush 
== brush
)  
 634   m_backgroundBrush 
= brush
; 
 636   if (!m_backgroundBrush
.Ok())  
 638    m_macBrushInstalled 
= false ; 
 641 void  wxDC::SetLogicalFunction( int function 
) 
 643         if (m_logicalFunction 
== function
)  
 646         m_logicalFunction 
= function 
; 
 647         m_macFontInstalled 
= false ; 
 648         m_macBrushInstalled 
= false ; 
 649         m_macPenInstalled 
= false ; 
 652 extern bool wxDoFloodFill(wxDC 
*dc
, wxCoord x
, wxCoord y
,  
 653                           const wxColour 
& col
, int style
); 
 655 bool wxDC::DoFloodFill(wxCoord x
, wxCoord y
, 
 656                        const wxColour
& col
, int style
) 
 658     return wxDoFloodFill(this, x
, y
, col
, style
); 
 661 bool  wxDC::DoGetPixel( wxCoord x
, wxCoord y
, wxColour 
*col 
) const  
 663     wxCHECK_MSG( Ok(), false, wxT("wxDC::DoGetPixel  Invalid DC") ); 
 664     wxMacPortSetter 
helper(this) ; 
 668     GetCPixel( XLOG2DEVMAC(x
), YLOG2DEVMAC(y
), &colour 
); 
 670     // Convert from Mac colour to wx 
 671     col
->Set( colour
.red   
>> 8, 
 678 void  wxDC::DoDrawLine( wxCoord x1
, wxCoord y1
, wxCoord x2
, wxCoord y2 
) 
 680   wxCHECK_RET(Ok(), wxT("Invalid DC")); 
 682   wxMacPortSetter 
helper(this) ; 
 684   if (m_pen
.GetStyle() != wxTRANSPARENT
) 
 687                 wxCoord offset 
= ( (m_pen
.GetWidth() == 0 ? 1 : 
 688                             m_pen
.GetWidth() ) * (wxCoord
)m_scaleX 
- 1) / 2; 
 690         wxCoord xx1 
= XLOG2DEVMAC(x1
) - offset
; 
 691         wxCoord yy1 
= YLOG2DEVMAC(y1
) - offset
; 
 692         wxCoord xx2 
= XLOG2DEVMAC(x2
) - offset
; 
 693         wxCoord yy2 
= YLOG2DEVMAC(y2
) - offset
; 
 695         if ((m_pen
.GetCap() == wxCAP_ROUND
) && 
 696             (m_pen
.GetWidth() <= 1)) 
 698             // Implement LAST_NOT for MAC at least for 
 699             // orthogonal lines. RR. 
 721 void  wxDC::DoCrossHair( wxCoord x
, wxCoord y 
) 
 723     wxCHECK_RET( Ok(), wxT("wxDC::DoCrossHair  Invalid window dc") ); 
 725     if (m_pen
.GetStyle() != wxTRANSPARENT
) 
 730         wxCoord xx 
= XLOG2DEVMAC(x
); 
 731         wxCoord yy 
= YLOG2DEVMAC(y
); 
 734         ::MoveTo( XLOG2DEVMAC(0), yy 
); 
 735         ::LineTo( XLOG2DEVMAC(w
), yy 
); 
 736         ::MoveTo( xx
, YLOG2DEVMAC(0) ); 
 737         ::LineTo( xx
, YLOG2DEVMAC(h
) ); 
 739         CalcBoundingBox(x
, y
); 
 740         CalcBoundingBox(x
+w
, y
+h
); 
 746  * To draw arcs properly the angles need to be converted from the WX style: 
 747  * Angles start on the +ve X axis and go anti-clockwise (As you would draw on 
 748  * a normal axis on paper). 
 751  * Angles start on the +ve y axis and go clockwise. 
 752  * To achive this I work out which quadrant the angle lies in then map this to 
 753  * the equivalent quadrant on the Mac.  (Sin and Cos values reveal which 
 754  * quadrant you are in). 
 756 static double wxConvertWXangleToMACangle(double angle
) 
 760     sin_a 
= sin(angle 
/ RAD2DEG
); 
 761     cos_a 
= cos(angle 
/ RAD2DEG
); 
 763     if( (sin_a 
>= 0.0) && (cos_a 
>= 0.0) ) { 
 764         angle 
= acos(sin_a
) * RAD2DEG
; 
 766     else if( (sin_a 
>= 0.0) && (cos_a 
<= 0.0) ) { 
 768         angle 
= acos(sin_a
) * RAD2DEG 
+ 180; 
 770     else if( (sin_a 
<= 0.0) && (cos_a 
>=  0.0) ) { 
 771         angle 
= acos(sin_a
) * RAD2DEG 
+ 180; 
 773     else if( (sin_a 
<  0.0) && (cos_a 
<  0.0) ) { 
 775         angle 
= acos(sin_a
) * RAD2DEG 
+ 180; 
 780 void  wxDC::DoDrawArc( wxCoord x1
, wxCoord y1
, 
 781                            wxCoord x2
, wxCoord y2
, 
 782                            wxCoord xc
, wxCoord yc 
) 
 784     wxCHECK_RET(Ok(), wxT("wxDC::DoDrawArc  Invalid DC")); 
 786     wxCoord xx1 
= XLOG2DEVMAC(x1
); 
 787     wxCoord yy1 
= YLOG2DEVMAC(y1
); 
 788     wxCoord xx2 
= XLOG2DEVMAC(x2
); 
 789     wxCoord yy2 
= YLOG2DEVMAC(y2
); 
 790     wxCoord xxc 
= XLOG2DEVMAC(xc
); 
 791     wxCoord yyc 
= YLOG2DEVMAC(yc
); 
 792     double dx 
= xx1 
- xxc
; 
 793     double dy 
= yy1 
- yyc
; 
 794     double radius 
= sqrt((double)(dx
*dx
+dy
*dy
)); 
 795     wxCoord rad   
= (wxCoord
)radius
; 
 796     double radius1
, radius2
; 
 798     if (xx1 
== xx2 
&& yy1 
== yy2
) 
 803     else if (radius 
== 0.0) 
 805         radius1 
= radius2 
= 0.0; 
 809         radius1 
= (xx1 
- xxc 
== 0) ? 
 810             (yy1 
- yyc 
< 0) ? 90.0 : -90.0 : 
 811             -atan2(double(yy1
-yyc
), double(xx1
-xxc
)) * RAD2DEG
; 
 812          radius2 
= (xx2 
- xxc 
== 0) ? 
 813             (yy2 
- yyc 
< 0) ? 90.0 : -90.0 : 
 814             -atan2(double(yy2
-yyc
), double(xx2
-xxc
)) * RAD2DEG
; 
 816      wxCoord alpha2 
= wxCoord(radius2 
- radius1
); 
 817     wxCoord alpha1 
= wxCoord(wxConvertWXangleToMACangle(radius1
)); 
 818      if( (xx1 
> xx2
) || (yy1 
> yy2
) ) { 
 822     Rect r 
= { yyc 
- rad
, xxc 
- rad
, yyc 
+ rad
, xxc 
+ rad 
}; 
 824     if(m_brush
.GetStyle() != wxTRANSPARENT
) { 
 826         PaintArc(&r
, alpha1
, alpha2
); 
 828     if(m_pen
.GetStyle() != wxTRANSPARENT
) { 
 830         FrameArc(&r
, alpha1
, alpha2
); 
 834 void  wxDC::DoDrawEllipticArc( wxCoord x
, wxCoord y
, wxCoord w
, wxCoord h
, 
 835                                    double sa
, double ea 
) 
 837     wxCHECK_RET(Ok(), wxT("wxDC::DoDrawEllepticArc  Invalid DC")); 
 840     double angle 
= sa 
- ea
;  // Order important Mac in opposite direction to wx 
 842     wxCoord xx 
= XLOG2DEVMAC(x
); 
 843     wxCoord yy 
= YLOG2DEVMAC(y
); 
 844     wxCoord ww 
= m_signX 
* XLOG2DEVREL(w
); 
 845     wxCoord hh 
= m_signY 
* YLOG2DEVREL(h
); 
 847     // handle -ve width and/or height 
 848     if (ww 
< 0) { ww 
= -ww
; xx 
= xx 
- ww
; } 
 849     if (hh 
< 0) { hh 
= -hh
; yy 
= yy 
- hh
; } 
 851     sa 
= wxConvertWXangleToMACangle(sa
); 
 858     if(m_brush
.GetStyle() != wxTRANSPARENT
) { 
 860         PaintArc(&r
, (short)sa
, (short)angle
); 
 862     if(m_pen
.GetStyle() != wxTRANSPARENT
) { 
 864         FrameArc(&r
, (short)sa
, (short)angle
); 
 868 void  wxDC::DoDrawPoint( wxCoord x
, wxCoord y 
) 
 870   wxCHECK_RET(Ok(), wxT("Invalid DC")); 
 872   wxMacPortSetter 
helper(this) ; 
 874   if (m_pen
.GetStyle() != wxTRANSPARENT
)  
 877         wxCoord xx1 
= XLOG2DEVMAC(x
);  
 878         wxCoord yy1 
= YLOG2DEVMAC(y
); 
 881                 ::LineTo(xx1
+1, yy1
+1); 
 885 void  wxDC::DoDrawLines(int n
, wxPoint points
[], 
 886                              wxCoord xoffset
, wxCoord yoffset
) 
 888   wxCHECK_RET(Ok(), wxT("Invalid DC")); 
 889   wxMacPortSetter 
helper(this) ; 
 891   if (m_pen
.GetStyle() == wxTRANSPARENT
)  
 896   wxCoord offset 
= ( (m_pen
.GetWidth() == 0 ? 1 : 
 897                       m_pen
.GetWidth() ) * (wxCoord
)m_scaleX 
- 1) / 2 ; 
 899   wxCoord x1
, x2 
, y1 
, y2 
; 
 900   x1 
= XLOG2DEVMAC(points
[0].x 
+ xoffset
); 
 901   y1 
= YLOG2DEVMAC(points
[0].y 
+ yoffset
);    
 902   ::MoveTo(x1 
- offset
, y1 
- offset 
); 
 904   for (int i 
= 0; i 
< n
-1; i
++) 
 906     x2 
= XLOG2DEVMAC(points
[i
+1].x 
+ xoffset
); 
 907     y2 
= YLOG2DEVMAC(points
[i
+1].y 
+ yoffset
); 
 908     ::LineTo( x2 
- offset
, y2 
- offset 
); 
 912 void  wxDC::DoDrawPolygon(int n
, wxPoint points
[], 
 913                                wxCoord xoffset
, wxCoord yoffset
, 
 916         wxCHECK_RET(Ok(), wxT("Invalid DC")); 
 917         wxMacPortSetter 
helper(this) ; 
 919         wxCoord x1
, x2 
, y1 
, y2 
; 
 921     if ( m_brush
.GetStyle() == wxTRANSPARENT 
&& m_pen
.GetStyle() == wxTRANSPARENT 
) 
 924         PolyHandle polygon 
= OpenPoly(); 
 926         x1 
= XLOG2DEVMAC(points
[0].x 
+ xoffset
); 
 927         y1 
= YLOG2DEVMAC(points
[0].y 
+ yoffset
);    
 930         for (int i 
= 1; i 
< n
; i
++) 
 932                 x2 
= XLOG2DEVMAC(points
[i
].x 
+ xoffset
); 
 933                 y2 
= YLOG2DEVMAC(points
[i
].y 
+ yoffset
); 
 937     // close the polyline if necessary 
 938     if ( x1 
!= x2 
|| y1 
!= y2 
) 
 945         if (m_brush
.GetStyle() != wxTRANSPARENT
) 
 949                 ::PaintPoly( polygon 
); 
 953         if (m_pen
.GetStyle() != wxTRANSPARENT
)  
 957                 ::FramePoly( polygon 
) ; 
 963 void wxDC::DoDrawRectangle(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
) 
 965     wxCHECK_RET(Ok(), wxT("Invalid DC")); 
 966     wxMacPortSetter 
helper(this) ; 
 968         wxCoord xx 
= XLOG2DEVMAC(x
); 
 969         wxCoord yy 
= YLOG2DEVMAC(y
); 
 970         wxCoord ww 
= m_signX 
* XLOG2DEVREL(width
); 
 971         wxCoord hh 
= m_signY 
* YLOG2DEVREL(height
); 
 973         // CMB: draw nothing if transformed w or h is 0 
 974         if (ww 
== 0 || hh 
== 0)  
 977         // CMB: handle -ve width and/or height 
 990         Rect rect 
= { yy 
, xx 
, yy 
+ hh 
, xx 
+ ww 
} ; 
 992         if (m_brush
.GetStyle() != wxTRANSPARENT
)  
 995                 ::PaintRect( &rect 
) ; 
 998         if (m_pen
.GetStyle() != wxTRANSPARENT
)  
1001                 ::FrameRect( &rect 
) ; 
1005 void  wxDC::DoDrawRoundedRectangle(wxCoord x
, wxCoord y
, 
1006                                         wxCoord width
, wxCoord height
, 
1009     wxCHECK_RET(Ok(), wxT("Invalid DC")); 
1010     wxMacPortSetter 
helper(this) ; 
1013             radius 
= - radius 
* ((width 
< height
) ? width 
: height
); 
1015         wxCoord xx 
= XLOG2DEVMAC(x
); 
1016         wxCoord yy 
= YLOG2DEVMAC(y
); 
1017         wxCoord ww 
= m_signX 
* XLOG2DEVREL(width
); 
1018         wxCoord hh 
= m_signY 
* YLOG2DEVREL(height
); 
1020         // CMB: draw nothing if transformed w or h is 0 
1021         if (ww 
== 0 || hh 
== 0)  
1024         // CMB: handle -ve width and/or height 
1037         Rect rect 
= { yy 
, xx 
, yy 
+ hh 
, xx 
+ ww 
} ; 
1039         if (m_brush
.GetStyle() != wxTRANSPARENT
)  
1042                 ::PaintRoundRect( &rect 
, int(radius 
* 2) , int(radius 
* 2) ) ; 
1045         if (m_pen
.GetStyle() != wxTRANSPARENT
)  
1048                 ::FrameRoundRect( &rect 
, int(radius 
* 2) , int(radius 
* 2) ) ; 
1052 void  wxDC::DoDrawEllipse(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
) 
1054     wxCHECK_RET(Ok(), wxT("Invalid DC")); 
1055     wxMacPortSetter 
helper(this) ; 
1057         wxCoord xx 
= XLOG2DEVMAC(x
); 
1058         wxCoord yy 
= YLOG2DEVMAC(y
); 
1059         wxCoord ww 
= m_signX 
* XLOG2DEVREL(width
); 
1060         wxCoord hh 
= m_signY 
* YLOG2DEVREL(height
); 
1062         // CMB: draw nothing if transformed w or h is 0 
1063         if (ww 
== 0 || hh 
== 0) 
1066         // CMB: handle -ve width and/or height 
1079         Rect rect 
= { yy 
, xx 
, yy 
+ hh 
, xx 
+ ww 
} ; 
1081         if (m_brush
.GetStyle() != wxTRANSPARENT
) 
1084                 ::PaintOval( &rect 
) ; 
1087         if (m_pen
.GetStyle() != wxTRANSPARENT
) 
1090                 ::FrameOval( &rect 
) ; 
1096 bool  wxDC::CanDrawBitmap(void) const  
1102 bool  wxDC::DoBlit(wxCoord xdest
, wxCoord ydest
, wxCoord width
, wxCoord height
, 
1103                         wxDC 
*source
, wxCoord xsrc
, wxCoord ysrc
, int logical_func 
, bool useMask
, 
1104                         wxCoord xsrcMask
,  wxCoord ysrcMask 
) 
1106     wxCHECK_MSG(Ok(), false, wxT("wxDC::DoBlit Illegal dc")); 
1107     wxCHECK_MSG(source
->Ok(), false, wxT("wxDC::DoBlit  Illegal source DC")); 
1109     if ( logical_func 
== wxNO_OP 
) 
1112     if (xsrcMask 
== -1 && ysrcMask 
== -1) 
1114         xsrcMask 
= xsrc
; ysrcMask 
= ysrc
; 
1117     // correct the parameter in case this dc does not have a mask at all 
1119     if ( useMask 
&& !source
->m_macMask 
) 
1122         Rect srcrect 
, dstrect 
; 
1123         srcrect
.top 
= source
->YLOG2DEVMAC(ysrc
) ; 
1124         srcrect
.left 
= source
->XLOG2DEVMAC(xsrc
)  ; 
1125         srcrect
.right 
= source
->XLOG2DEVMAC(xsrc 
+ width 
) ; 
1126         srcrect
.bottom 
= source
->YLOG2DEVMAC(ysrc 
+ height
) ; 
1127         dstrect
.top 
= YLOG2DEVMAC(ydest
) ; 
1128         dstrect
.left 
= XLOG2DEVMAC(xdest
) ; 
1129         dstrect
.bottom 
= YLOG2DEVMAC(ydest 
+ height 
)  ; 
1130         dstrect
.right 
= XLOG2DEVMAC(xdest 
+ width 
) ; 
1132     short mode 
= kUnsupportedMode 
; 
1133     bool invertDestinationFirst 
= false ; 
1134     switch ( logical_func 
) 
1136                 case wxAND
:        // src AND dst 
1137                     mode 
= srcOr 
; // ok 
1139                 case wxAND_INVERT
: // (NOT src) AND dst 
1140                     mode 
= notSrcOr  
; // ok 
1142                 case wxAND_REVERSE
:// src AND (NOT dst) 
1143                     invertDestinationFirst 
= true ; 
1147                     mode 
= kEmulatedMode 
;  
1150                         mode 
= srcCopy 
; // ok 
1152                 case wxEQUIV
:      // (NOT src) XOR dst 
1153                     mode 
= srcXor 
; // ok 
1155                 case wxINVERT
:     // NOT dst 
1156                         mode 
= kEmulatedMode 
; //or hilite ; 
1158                 case wxNAND
:       // (NOT src) OR (NOT dst) 
1159                     invertDestinationFirst 
= true ; 
1162                 case wxNOR
:        // (NOT src) AND (NOT dst) 
1163                     invertDestinationFirst 
= true ; 
1166                 case wxNO_OP
:      // dst 
1167                     mode 
= kEmulatedMode 
; // this has already been handled upon entry 
1169                 case wxOR
:         // src OR dst 
1172                 case wxOR_INVERT
:  // (NOT src) OR dst 
1175                 case wxOR_REVERSE
: // src OR (NOT dst) 
1176                     invertDestinationFirst 
= true ; 
1180                     mode 
= kEmulatedMode 
;  
1182                 case wxSRC_INVERT
: // (NOT src) 
1183                         mode 
= notSrcCopy 
; // ok 
1185                 case wxXOR
:        // src XOR dst 
1186                         mode 
= notSrcXor 
; // ok 
1194     if ( mode 
== kUnsupportedMode 
) 
1196         wxFAIL_MSG("unsupported blitting mode" ) 
1200         CGrafPtr                        sourcePort 
= (CGrafPtr
) source
->m_macPort 
; 
1201         PixMapHandle    bmappixels 
=  GetGWorldPixMap( sourcePort 
) ;  
1202         if ( LockPixels(bmappixels
) ) 
1204         wxMacPortSetter 
helper(this) ; 
1205         RGBColor tempColor 
; 
1207         if ( source
->GetDepth() == 1 ) 
1209             RGBForeColor( &MAC_WXCOLORREF(m_textForegroundColour
.GetPixel()) ) ; 
1210             RGBBackColor( &MAC_WXCOLORREF(m_textBackgroundColour
.GetPixel()) ) ; 
1214             // the modes need this, otherwise we'll end up having really nice colors... 
1215             RGBColor    white 
= { 0xFFFF, 0xFFFF,0xFFFF} ; 
1216             RGBColor    black 
= { 0,0,0} ; 
1217             RGBForeColor( &black 
) ; 
1218             RGBBackColor( &white 
) ; 
1221                 if ( useMask 
&& source
->m_macMask 
) 
1223                     if ( mode 
== srcCopy 
) 
1225                         if ( LockPixels( GetGWorldPixMap( MAC_WXHBITMAP(source
->m_macMask
) ) ) ) 
1227                                 CopyMask( GetPortBitMapForCopyBits( sourcePort 
) ,  
1228                                             GetPortBitMapForCopyBits( MAC_WXHBITMAP(source
->m_macMask
) ) ,  
1229                                             GetPortBitMapForCopyBits( MAC_WXHBITMAP(m_macPort
) ) , 
1230                                                 &srcrect
, &srcrect 
, &dstrect 
) ; 
1231                                 UnlockPixels( GetGWorldPixMap( MAC_WXHBITMAP(source
->m_macMask
) )  ) ; 
1236                 RgnHandle clipRgn 
= NewRgn() ; 
1237                 LockPixels( GetGWorldPixMap( MAC_WXHBITMAP(source
->m_macMask
) ) ) ; 
1238                 BitMapToRegion( clipRgn 
, (BitMap
*) *GetGWorldPixMap( MAC_WXHBITMAP(source
->m_macMask
) ) ) ; 
1239                 UnlockPixels( GetGWorldPixMap( MAC_WXHBITMAP(source
->m_macMask
) ) ) ; 
1240                 OffsetRgn( clipRgn 
, -srcrect
.left 
+ dstrect
.left
, -srcrect
.top 
+  dstrect
.top 
) ; 
1241                 if ( mode 
== kEmulatedMode 
) 
1244                             ::PenPat(GetQDGlobalsBlack(&pat
)); 
1245                     if ( logical_func 
== wxSET 
) 
1247                         RGBColor col
= { 0xFFFF, 0xFFFF, 0xFFFF } ; 
1248                                 ::RGBForeColor( &col  
) ; 
1249                         ::PaintRgn( clipRgn 
) ; 
1251                     else if ( logical_func 
== wxCLEAR 
) 
1253                         RGBColor col
= { 0x0000, 0x0000, 0x0000 } ; 
1254                                 ::RGBForeColor( &col  
) ; 
1255                         ::PaintRgn( clipRgn 
) ; 
1257                     else if ( logical_func 
== wxINVERT 
) 
1259                         MacInvertRgn( clipRgn 
) ; 
1263                         for ( int y 
= 0 ; y 
< srcrect
.right 
- srcrect
.left 
; ++y 
) 
1265                             for ( int x 
= 0 ; x 
< srcrect
.bottom 
- srcrect
.top 
; ++x 
) 
1267                                 Point dstPoint 
= { dstrect
.top 
+ y 
, dstrect
.left 
+ x 
} ; 
1268                                 Point srcPoint 
= { srcrect
.top 
+ y 
, srcrect
.left 
+ x 
} ; 
1269                                 if ( PtInRgn( dstPoint 
, clipRgn 
) ) 
1274                                     SetPort( (GrafPtr
) sourcePort 
) ; 
1275                                     GetCPixel(  srcPoint
.h 
, srcPoint
.v 
, &srcColor
) ; 
1276                                     SetPort( (GrafPtr
) m_macPort 
) ; 
1277                                     GetCPixel( dstPoint
.h 
, dstPoint
.v 
, &dstColor 
) ; 
1279                                     wxMacCalculateColour( logical_func 
, srcColor 
,  dstColor 
) ; 
1280                                     SetCPixel( dstPoint
.h 
, dstPoint
.v 
, &dstColor 
) ; 
1288                     if ( invertDestinationFirst 
) 
1290                         MacInvertRgn( clipRgn 
) ; 
1292                                 CopyBits( GetPortBitMapForCopyBits( sourcePort 
) ,  
1293                                     GetPortBitMapForCopyBits( MAC_WXHBITMAP(m_macPort
) ) , 
1294                                         &srcrect
, &dstrect
, mode
, clipRgn 
) ; 
1296                     DisposeRgn( clipRgn 
) ; 
1301             RgnHandle clipRgn 
= NewRgn() ; 
1302             SetRectRgn( clipRgn 
, dstrect
.left 
, dstrect
.top 
, dstrect
.right 
, dstrect
.bottom 
) ; 
1303                     if ( mode 
== kEmulatedMode 
) 
1306                     ::PenPat(GetQDGlobalsBlack(&pat
)); 
1307                 if ( logical_func 
== wxSET 
) 
1309                     RGBColor col
= { 0xFFFF, 0xFFFF, 0xFFFF } ; 
1310                         ::RGBForeColor( &col  
) ; 
1311                     ::PaintRgn( clipRgn 
) ; 
1313                 else if ( logical_func 
== wxCLEAR 
) 
1315                     RGBColor col
= { 0x0000, 0x0000, 0x0000 } ; 
1316                         ::RGBForeColor( &col  
) ; 
1317                     ::PaintRgn( clipRgn 
) ; 
1319                 else if ( logical_func 
== wxINVERT 
) 
1321                     MacInvertRgn( clipRgn 
) ; 
1325                     for ( int y 
= 0 ; y 
< srcrect
.right 
- srcrect
.left 
; ++y 
) 
1327                         for ( int x 
= 0 ; x 
< srcrect
.bottom 
- srcrect
.top 
; ++x 
) 
1329                             Point dstPoint 
= { dstrect
.top 
+ y 
, dstrect
.left 
+ x 
} ; 
1330                             Point srcPoint 
= { srcrect
.top 
+ y 
, srcrect
.left 
+ x 
} ; 
1336                                 SetPort( (GrafPtr
) sourcePort 
) ; 
1337                                 GetCPixel(  srcPoint
.h 
, srcPoint
.v 
, &srcColor
) ; 
1338                                 SetPort( (GrafPtr
) m_macPort 
) ; 
1339                                 GetCPixel( dstPoint
.h 
, dstPoint
.v 
, &dstColor 
) ; 
1341                                 wxMacCalculateColour( logical_func 
, srcColor 
,  dstColor 
) ; 
1342                                 SetCPixel( dstPoint
.h 
, dstPoint
.v 
, &dstColor 
) ; 
1351                 if ( invertDestinationFirst 
) 
1353                     MacInvertRgn( clipRgn 
) ; 
1355                         CopyBits( GetPortBitMapForCopyBits( sourcePort 
) ,  
1356                             GetPortBitMapForCopyBits( MAC_WXHBITMAP(m_macPort
) ) , 
1357                                 &srcrect
, &dstrect
, mode
, NULL 
) ; 
1359                 DisposeRgn( clipRgn 
) ; 
1361                 UnlockPixels( bmappixels 
) ; 
1364         m_macPenInstalled 
= false ; 
1365         m_macBrushInstalled 
= false ; 
1366         m_macFontInstalled 
= false ; 
1371 inline Fixed    
IntToFixed( int inInt 
) 
1373                 return (((SInt32
) inInt
) << 16); 
1377 void  wxDC::DoDrawRotatedText(const wxString
& str
, wxCoord x
, wxCoord y
, 
1380     wxCHECK_RET( Ok(), wxT("wxDC::DoDrawRotatedText  Invalid window dc") ); 
1384         DrawText(str
, x
, y
); 
1388     wxMacPortSetter 
helper(this) ; 
1392         if ( wxApp::s_macDefaultEncodingIsPC 
) 
1394                 text 
= wxMacMakeMacStringFromPC( str 
) ; 
1401         wxFontRefData 
* font 
= (wxFontRefData
*) m_font
.GetRefData() ; 
1404         m_macFormerAliasState 
= IsAntiAliasedTextEnabled(&m_macFormerAliasSize
); 
1405         SetAntiAliasedTextEnabled(true, m_scaleY 
* font
->m_macFontSize
); 
1406         m_macAliasWasEnabled 
= true ; 
1409     OSStatus status 
= noErr 
; 
1412         status 
= TECCreateConverter(&ec
, kTextEncodingMacRoman
, kTextEncodingUnicodeDefault
); 
1413         wxASSERT_MSG( status 
== noErr 
, "couldn't start converter" ) ; 
1415     ByteCount byteOutLen 
; 
1416     ByteCount byteInLen 
= text
.Length() ; 
1417     ByteCount byteBufferLen 
= byteInLen 
*2 ; 
1418     char* buf 
= new char[byteBufferLen
] ; 
1420         status 
= TECConvertText(ec
, (ConstTextPtr
)text
.c_str() , byteInLen
, &byteInLen
,  
1421             (TextPtr
)buf
, byteBufferLen
, &byteOutLen
); 
1423         wxASSERT_MSG( status 
== noErr 
, "couldn't convert text" ) ; 
1424         status 
= TECDisposeConverter(ec
); 
1425         wxASSERT_MSG( status 
== noErr 
, "couldn't dispose converter" ) ; 
1427         ATSUTextLayout atsuLayout 
; 
1428         UniCharCount chars 
= byteOutLen 
/ 2 ; 
1429     status 
= ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr
) buf 
, 0 , byteOutLen 
/ 2 , byteOutLen 
/ 2 , 1 , 
1430         &chars 
, (ATSUStyle
*) &m_macATSUIStyle 
, &atsuLayout 
) ; 
1431         wxASSERT_MSG( status 
== noErr 
, "couldn't create the layout of the rotated text" ); 
1433     Fixed atsuAngle 
= IntToFixed( angle 
) ; 
1434         ByteCount angleSize 
= sizeof(Fixed
) ; 
1435         ATSUAttributeTag rotationTag 
= kATSULineRotationTag 
; 
1436         ATSUAttributeValuePtr   angleValue 
= &atsuAngle 
; 
1437         status 
= ::ATSUSetLayoutControls(atsuLayout 
, 1 , &rotationTag 
, &angleSize 
, &angleValue 
) ; 
1439         status 
= ::ATSUDrawText( atsuLayout
, kATSUFromTextBeginning
, kATSUToTextEnd
, 
1440                                         IntToFixed(XLOG2DEVMAC(x
) ) , IntToFixed(YLOG2DEVMAC(y
) ) ); 
1441         wxASSERT_MSG( status 
== noErr 
, "couldn't draw the rotated text" ); 
1443         status 
= ::ATSUMeasureTextImage( atsuLayout
, kATSUFromTextBeginning
, kATSUToTextEnd
, 
1444                                         IntToFixed(XLOG2DEVMAC(x
) ) , IntToFixed(YLOG2DEVMAC(y
) ) , &rect 
); 
1445         wxASSERT_MSG( status 
== noErr 
, "couldn't measure the rotated text" ); 
1447     OffsetRect( &rect 
, -m_macLocalOrigin
.x 
, -m_macLocalOrigin
.y 
) ; 
1448     CalcBoundingBox(XDEV2LOG(rect
.left
), YDEV2LOG(rect
.top
) ); 
1449     CalcBoundingBox(XDEV2LOG(rect
.right
), YDEV2LOG(rect
.bottom
) ); 
1450     ::ATSUDisposeTextLayout(atsuLayout
); 
1454 void  wxDC::DoDrawText(const wxString
& strtext
, wxCoord x
, wxCoord y
) 
1456     wxCHECK_RET(Ok(), wxT("wxDC::DoDrawText  Invalid DC")); 
1457     wxMacPortSetter 
helper(this) ; 
1459         long xx 
= XLOG2DEVMAC(x
); 
1460         long yy 
= YLOG2DEVMAC(y
); 
1465         m_macFormerAliasState 
= IsAntiAliasedTextEnabled(&m_macFormerAliasSize
); 
1466         SetAntiAliasedTextEnabled(true, 8); 
1467         m_macAliasWasEnabled 
= true ; 
1471         ::GetFontInfo( &fi 
) ; 
1474         ::MoveTo( xx 
, yy 
); 
1475         if (  m_backgroundMode 
== wxTRANSPARENT 
) 
1477                 ::TextMode( srcOr
) ; 
1481                 ::TextMode( srcCopy 
) ; 
1484         const char *text 
= NULL 
; 
1488         if ( wxApp::s_macDefaultEncodingIsPC 
) 
1490                 macText 
= wxMacMakeMacStringFromPC( strtext 
) ; 
1492                 length 
= macText
.Length() ; 
1497                 length 
= strtext
.Length() ; 
1506                 if( text
[i
] == 13 || text
[i
] == 10) 
1508                         ::DrawText( text 
, laststop 
, i 
- laststop 
) ; 
1510                         ::MoveTo( xx 
, yy 
+ line
*(fi
.descent 
+ fi
.ascent 
+ fi
.leading
) ); 
1516         ::DrawText( text 
, laststop 
, i 
- laststop 
) ; 
1517         ::TextMode( srcOr 
) ; 
1520 bool  wxDC::CanGetTextExtent() const  
1522         wxCHECK_MSG(Ok(), false, wxT("Invalid DC")); 
1527 void  wxDC::DoGetTextExtent( const wxString 
&string
, wxCoord 
*width
, wxCoord 
*height
, 
1528                      wxCoord 
*descent
, wxCoord 
*externalLeading 
, 
1529                      wxFont 
*theFont 
) const 
1531    wxCHECK_RET(Ok(), wxT("Invalid DC")); 
1532    wxMacPortSetter 
helper(this) ; 
1534         wxFont formerFont 
= m_font 
;  
1538                 wxFontRefData 
* font 
= (wxFontRefData
*) m_font
.GetRefData() ; 
1542                         ::TextFont( font
->m_macFontNum 
) ; 
1543                         ::TextSize( YLOG2DEVREL( font
->m_macFontSize
) ) ; 
1544                         ::TextFace( font
->m_macFontStyle 
) ; 
1553         ::GetFontInfo( &fi 
) ; 
1556                 *height 
= YDEV2LOGREL( fi
.descent 
+ fi
.ascent 
) ; 
1558                 *descent 
=YDEV2LOGREL( fi
.descent 
); 
1559         if ( externalLeading 
) 
1560                 *externalLeading 
= YDEV2LOGREL( fi
.leading 
) ; 
1562         const char *text 
= NULL 
; 
1565         if ( wxApp::s_macDefaultEncodingIsPC 
) 
1567                 macText 
= wxMacMakeMacStringFromPC( string 
) ; 
1569                 length 
= macText
.Length() ; 
1574                 length 
= string
.Length() ; 
1586                         if( text
[i
] == 13 || text
[i
] == 10) 
1589                                         *height 
+= YDEV2LOGREL( fi
.descent 
+ fi
.ascent 
+ fi
.leading 
) ; 
1590                                 curwidth 
= ::TextWidth( text 
, laststop 
, i 
- laststop 
) ; 
1591                                 if ( curwidth 
> *width 
) 
1592                                         *width 
= XDEV2LOGREL( curwidth 
) ; 
1598                 curwidth 
= ::TextWidth( text 
, laststop 
, i 
- laststop 
) ; 
1599                 if ( curwidth 
> *width 
) 
1600                         *width 
= XDEV2LOGREL( curwidth 
) ; 
1605                 m_macFontInstalled 
= false ; 
1609 wxCoord   
wxDC::GetCharWidth(void) const 
1611     wxCHECK_MSG(Ok(), 1, wxT("Invalid DC")); 
1613    wxMacPortSetter 
helper(this) ; 
1617     int width 
= ::TextWidth( "n" , 0 , 1 ) ; 
1619         return YDEV2LOGREL(width
) ; 
1622 wxCoord   
wxDC::GetCharHeight(void) const 
1624     wxCHECK_MSG(Ok(), 1, wxT("Invalid DC")); 
1626     wxMacPortSetter 
helper(this) ; 
1631         ::GetFontInfo( &fi 
) ; 
1633         return YDEV2LOGREL( fi
.descent 
+ fi
.ascent 
); 
1636 void  wxDC::Clear(void) 
1638     wxCHECK_RET(Ok(), wxT("Invalid DC"));   
1639     wxMacPortSetter 
helper(this) ; 
1640         Rect rect 
= { -32000 , -32000 , 32000 , 32000 } ; 
1642         if (m_backgroundBrush
.GetStyle() != wxTRANSPARENT
)  
1645             //MacInstallBrush() ; 
1646         MacSetupBackgroundForCurrentPort( m_backgroundBrush 
) ; 
1647                 ::EraseRect( &rect 
) ; 
1651 void wxDC::MacInstallFont() const 
1653     wxCHECK_RET(Ok(), wxT("Invalid DC")); 
1654 //      if ( m_macFontInstalled ) 
1656         Pattern blackColor 
; 
1658         wxFontRefData 
* font 
= (wxFontRefData
*) m_font
.GetRefData() ; 
1662                 ::TextFont( font
->m_macFontNum 
) ; 
1663                 ::TextSize( short(m_scaleY 
* font
->m_macFontSize
) ) ; 
1664                 ::TextFace( font
->m_macFontStyle 
) ; 
1666                 m_macFontInstalled 
= true ; 
1667                 m_macBrushInstalled 
= false ; 
1668                 m_macPenInstalled 
= false ; 
1670                 RGBColor forecolor 
= MAC_WXCOLORREF( m_textForegroundColour
.GetPixel()); 
1671                 RGBColor backcolor 
= MAC_WXCOLORREF( m_textBackgroundColour
.GetPixel()); 
1672                 ::RGBForeColor( &forecolor 
); 
1673                 ::RGBBackColor( &backcolor 
); 
1679                 GetFNum( "\pGeneva" , &fontnum 
) ; 
1680                 ::TextFont( fontnum 
) ; 
1681                 ::TextSize( short(m_scaleY 
* 10) ) ; 
1684                 // todo reset after spacing changes - or store the current spacing somewhere 
1686                 m_macFontInstalled 
= true ; 
1687                 m_macBrushInstalled 
= false ; 
1688                 m_macPenInstalled 
= false ; 
1690                 RGBColor forecolor 
= MAC_WXCOLORREF( m_textForegroundColour
.GetPixel()); 
1691                 RGBColor backcolor 
= MAC_WXCOLORREF( m_textBackgroundColour
.GetPixel()); 
1692                 ::RGBForeColor( &forecolor 
); 
1693                 ::RGBBackColor( &backcolor 
); 
1696         short mode 
= patCopy 
; 
1700         switch( m_logicalFunction 
) 
1705                 case wxINVERT
:     // NOT dst 
1706                         ::PenPat(GetQDGlobalsBlack(&blackColor
)); 
1709                 case wxXOR
:        // src XOR dst 
1712                 case wxOR_REVERSE
: // src OR (NOT dst) 
1715                 case wxSRC_INVERT
: // (NOT src) 
1722                 case wxAND_REVERSE
:// src AND (NOT dst) 
1723                 case wxAND
:        // src AND dst 
1724                 case wxAND_INVERT
: // (NOT src) AND dst 
1725                 case wxNO_OP
:      // dst 
1726                 case wxNOR
:        // (NOT src) AND (NOT dst) 
1727                 case wxEQUIV
:      // (NOT src) XOR dst 
1728                 case wxOR_INVERT
:  // (NOT src) OR dst 
1729                 case wxNAND
:       // (NOT src) OR (NOT dst) 
1730                 case wxOR
:         // src OR dst 
1732 //              case wxSRC_OR:     // source _bitmap_ OR destination 
1733 //              case wxSRC_AND:     // source _bitmap_ AND destination 
1738     OSStatus status 
= noErr 
; 
1740     Fixed atsuSize 
= IntToFixed(m_scaleY 
* font
->m_macFontSize
) ; 
1742     Style qdStyle 
= font
->m_macFontStyle 
; 
1743         ATSUFontID      atsuFont 
= font
->m_macATSUFontID 
; 
1745     status 
= ::ATSUCreateStyle(&(ATSUStyle
)m_macATSUIStyle
) ; 
1746         wxASSERT_MSG( status 
== noErr 
, "couldn't create ATSU style" ) ; 
1748         ATSUAttributeTag atsuTags
[] = 
1754             kATSUQDBoldfaceTag 
, 
1756             kATSUQDUnderlineTag 
, 
1757             kATSUQDCondensedTag 
, 
1758             kATSUQDExtendedTag 
, 
1762     ByteCount atsuSizes
[sizeof(atsuTags
)/sizeof(ATSUAttributeTag
)] = 
1764         sizeof( ATSUFontID 
) , 
1766         sizeof( RGBColor 
) , 
1774     Boolean kTrue 
= true ; 
1775     Boolean kFalse 
= false ; 
1777         ATSUAttributeValuePtr   atsuValues
[sizeof(atsuTags
)/sizeof(ATSUAttributeTag
)] = 
1781             &MAC_WXCOLORREF( m_textForegroundColour
.GetPixel() ) , 
1783             (qdStyle 
& bold
) ? &kTrue 
: &kFalse 
, 
1784             (qdStyle 
& italic
) ? &kTrue 
: &kFalse 
, 
1785             (qdStyle 
& underline
) ? &kTrue 
: &kFalse 
, 
1786             (qdStyle 
& condense
) ? &kTrue 
: &kFalse 
, 
1787             (qdStyle 
& extend
) ? &kTrue 
: &kFalse 
, 
1790         status 
= ::ATSUSetAttributes((ATSUStyle
)m_macATSUIStyle
, sizeof(atsuTags
)/sizeof(ATSUAttributeTag
),  
1791             atsuTags
, atsuSizes
, atsuValues
); 
1792         wxASSERT_MSG( status 
== noErr 
, "couldn't set create ATSU style" ) ; 
1796 Pattern gHatchPatterns
[] = 
1798     { 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF } , 
1799     { 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 } , 
1800     { 0x80 , 0x40 , 0x20 , 0x10 , 0x08 , 0x04 , 0x02 , 0x01 } , 
1801     { 0x10 , 0x10 , 0x10 , 0xFF , 0x10 , 0x10 , 0x10 , 0x10 } , 
1802     { 0x00 , 0x00 , 0x00 , 0xFF , 0x00 , 0x00 , 0x00 , 0x00 } , 
1803     { 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 } , 
1804     { 0x81 , 0x42 , 0x24 , 0x18 , 0x18 , 0x24 , 0x42 , 0x81 } , 
1807 static void wxMacGetHatchPattern(int hatchStyle
, Pattern 
*pattern
) 
1813                 case wxBDIAGONAL_HATCH
: 
1816                 case wxFDIAGONAL_HATCH
: 
1822                 case wxHORIZONTAL_HATCH
: 
1825                 case wxVERTICAL_HATCH
: 
1828                 case wxCROSSDIAG_HATCH
: 
1832                         theIndex 
= 1; // solid pattern 
1835         *pattern 
= gHatchPatterns
[theIndex
-1] ;  
1838 void wxDC::MacInstallPen() const 
1840     wxCHECK_RET(Ok(), wxT("Invalid DC")); 
1844 //      if ( m_macPenInstalled ) 
1847         RGBColor forecolor 
= MAC_WXCOLORREF( m_pen
.GetColour().GetPixel()); 
1848         RGBColor backcolor 
= MAC_WXCOLORREF( m_backgroundBrush
.GetColour().GetPixel()); 
1849         ::RGBForeColor( &forecolor 
); 
1850         ::RGBBackColor( &backcolor 
); 
1853         int penWidth 
= m_pen
.GetWidth() * (int) m_scaleX 
; 
1855         // null means only one pixel, at whatever resolution 
1856         if ( penWidth 
== 0 ) 
1858         ::PenSize(penWidth
, penWidth
); 
1860         int penStyle 
= m_pen
.GetStyle(); 
1862         if (penStyle 
== wxSOLID
) 
1864                 ::PenPat(GetQDGlobalsBlack(&blackColor
)); 
1866         else if (IS_HATCH(penStyle
)) 
1869                 wxMacGetHatchPattern(penStyle
, &pat
); 
1874             Pattern pat 
= *GetQDGlobalsBlack(&blackColor
) ; 
1878                 for ( int i 
= 0 ; i 
< 8 ; ++i 
) 
1884                 for ( int i 
= 0 ; i 
< 8 ; ++i 
) 
1890                 for ( int i 
= 0 ; i 
< 8 ; ++i 
) 
1896                 for ( int i 
= 0 ; i 
< 8 ; ++i 
) 
1904                         int number 
= m_pen
.GetDashes(&dash
) ; 
1905                         // right now we don't allocate larger pixmaps 
1906                         for ( int i 
= 0 ; i 
< 8 ; ++i 
) 
1908                             pat
.pat
[i
] = dash
[0] ; 
1916         short mode 
= patCopy 
; 
1920         switch( m_logicalFunction 
) 
1922                 case wxCOPY
:       // only foreground color, leave background (thus not patCopy) 
1925                 case wxINVERT
:     // NOT dst 
1926 //                      ::PenPat(GetQDGlobalsBlack(&blackColor)); 
1929                 case wxXOR
:        // src XOR dst 
1932                 case wxOR_REVERSE
: // src OR (NOT dst) 
1935                 case wxSRC_INVERT
: // (NOT src) 
1942                 case wxAND_REVERSE
:// src AND (NOT dst) 
1943                 case wxAND
:        // src AND dst 
1944                 case wxAND_INVERT
: // (NOT src) AND dst 
1945                 case wxNO_OP
:      // dst 
1946                 case wxNOR
:        // (NOT src) AND (NOT dst) 
1947                 case wxEQUIV
:      // (NOT src) XOR dst 
1948                 case wxOR_INVERT
:  // (NOT src) OR dst 
1949                 case wxNAND
:       // (NOT src) OR (NOT dst) 
1950                 case wxOR
:         // src OR dst 
1952 //              case wxSRC_OR:     // source _bitmap_ OR destination 
1953 //              case wxSRC_AND:     // source _bitmap_ AND destination 
1957         m_macPenInstalled 
= true ; 
1958         m_macBrushInstalled 
= false ; 
1959         m_macFontInstalled 
= false ; 
1962 void wxDC::MacSetupBackgroundForCurrentPort(const wxBrush
& background 
)  
1964     Pattern whiteColor 
; 
1965     switch( background
.MacGetBrushKind() ) 
1967       case kwxMacBrushTheme 
: 
1969                 ::SetThemeBackground( background
.GetMacTheme() , wxDisplayDepth() , true ) ; 
1972       case kwxMacBrushThemeBackground 
: 
1975                 ThemeBackgroundKind bg 
= background
.GetMacThemeBackground( &extent 
) ; 
1976                 ::ApplyThemeBackground( bg 
, &extent 
,kThemeStateActive 
, wxDisplayDepth() , true ) ; 
1979       case kwxMacBrushColour 
: 
1981             ::RGBBackColor( &MAC_WXCOLORREF( background
.GetColour().GetPixel()) ); 
1982                 int brushStyle 
= background
.GetStyle(); 
1983                 if (brushStyle 
== wxSOLID
) 
1984                         ::BackPat(GetQDGlobalsWhite(&whiteColor
)); 
1985                 else if (IS_HATCH(brushStyle
)) 
1988                         wxMacGetHatchPattern(brushStyle
, &pat
); 
1993                         ::BackPat(GetQDGlobalsWhite(&whiteColor
)); 
2000 void wxDC::MacInstallBrush() const 
2002     wxCHECK_RET(Ok(), wxT("Invalid DC")); 
2004         Pattern  blackColor 
; 
2005 //      if ( m_macBrushInstalled ) 
2010         bool backgroundTransparent 
= (GetBackgroundMode() == wxTRANSPARENT
) ; 
2012         ::RGBForeColor( &MAC_WXCOLORREF( m_brush
.GetColour().GetPixel()) ); 
2013         ::RGBBackColor( &MAC_WXCOLORREF( m_backgroundBrush
.GetColour().GetPixel()) ); 
2015         int brushStyle 
= m_brush
.GetStyle(); 
2016         if (brushStyle 
== wxSOLID
) 
2018                 ::PenPat(GetQDGlobalsBlack(&blackColor
)); 
2020         else if (IS_HATCH(brushStyle
)) 
2023                 wxMacGetHatchPattern(brushStyle
, &pat
); 
2026         else if ( m_brush
.GetStyle() == wxSTIPPLE 
|| m_brush
.GetStyle() == wxSTIPPLE_MASK_OPAQUE 
) 
2028             // we force this in order to be compliant with wxMSW 
2029             backgroundTransparent 
= false ; 
2030             // for these the text fore (and back for MASK_OPAQUE) colors are used 
2031             wxBitmap
* bitmap 
= m_brush
.GetStipple() ; 
2032             int width 
= bitmap
->GetWidth() ; 
2033             int height 
= bitmap
->GetHeight() ; 
2034         GWorldPtr gw 
= NULL 
; 
2036             if ( m_brush
.GetStyle() == wxSTIPPLE 
) 
2037                 gw 
= MAC_WXHBITMAP(bitmap
->GetHBITMAP())  ; 
2039                 gw 
= MAC_WXHBITMAP(bitmap
->GetMask()->GetMaskBitmap()) ; 
2041         PixMapHandle gwpixmaphandle 
= GetGWorldPixMap( gw 
) ; 
2042         LockPixels( gwpixmaphandle 
) ; 
2044             bool isMonochrome 
= !IsPortColor( gw 
) ; 
2046         if ( !isMonochrome 
) 
2048             if ( (**gwpixmaphandle
).pixelSize 
== 1 ) 
2049                 isMonochrome 
= true ; 
2052         if ( isMonochrome 
&& width 
== 8 && height 
== 8 ) 
2054                 ::RGBForeColor( &MAC_WXCOLORREF( m_textForegroundColour
.GetPixel()) ); 
2055                 ::RGBForeColor( &MAC_WXCOLORREF( m_textBackgroundColour
.GetPixel()) ); 
2056             BitMap
* gwbitmap 
= (BitMap
*) *gwpixmaphandle 
; // since the color depth is 1 it is a BitMap 
2057             UInt8 
*gwbits 
= (UInt8
*) gwbitmap
->baseAddr 
; 
2058             int alignment 
= gwbitmap
->rowBytes 
& 0x7FFF ; 
2060             for ( int i 
= 0 ; i 
< 8 ; ++i 
) 
2062                 pat
.pat
[i
] = gwbits
[i
*alignment
+0] ; 
2064             UnlockPixels( GetGWorldPixMap( gw 
) ) ; 
2069  // this will be the code to handle power of 2 patterns, we will have to arrive at a nice 
2070  // caching scheme before putting this into production 
2073                 PixPatHandle pixpat 
= NewPixPat() ; 
2075                 CopyPixMap(gwpixmaphandle
, (**pixpat
).patMap
); 
2076             imageSize 
= GetPixRowBytes((**pixpat
).patMap
) * 
2077                             ((**(**pixpat
).patMap
).bounds
.bottom 
- 
2078                             (**(**pixpat
).patMap
).bounds
.top
); 
2080             PtrToHand( (**gwpixmaphandle
).baseAddr
, &image
, imageSize 
); 
2081             (**pixpat
).patData 
= image
; 
2084                     CTabHandle ctable 
= ((**((**pixpat
).patMap
)).pmTable
) ; 
2085                     ColorSpecPtr ctspec 
= (ColorSpecPtr
) &(**ctable
).ctTable 
; 
2086                     if ( ctspec
[0].rgb
.red 
== 0x0000 ) 
2088                         ctspec
[1].rgb 
= MAC_WXCOLORREF( m_textBackgroundColour
.GetPixel()) ; 
2089                         ctspec
[0].rgb 
= MAC_WXCOLORREF( m_textForegroundColour
.GetPixel()) ; 
2093                         ctspec
[0].rgb 
= MAC_WXCOLORREF( m_textBackgroundColour
.GetPixel()) ; 
2094                         ctspec
[1].rgb 
= MAC_WXCOLORREF( m_textForegroundColour
.GetPixel()) ; 
2096                     ::CTabChanged( ctable 
) ; 
2098             ::PenPixPat(pixpat
); 
2099             m_macForegroundPixMap 
= pixpat 
; 
2101             UnlockPixels( gwpixmaphandle 
) ; 
2105             ::PenPat(GetQDGlobalsBlack(&blackColor
)); 
2108         short mode 
= patCopy 
; 
2109         switch( m_logicalFunction 
) 
2112                     if ( backgroundTransparent 
) 
2117                 case wxINVERT
:     // NOT dst 
2118                     if ( !backgroundTransparent 
) 
2120                             ::PenPat(GetQDGlobalsBlack(&blackColor
)); 
2124                 case wxXOR
:        // src XOR dst 
2127                 case wxOR_REVERSE
: // src OR (NOT dst) 
2130                 case wxSRC_INVERT
: // (NOT src) 
2137                 case wxAND_REVERSE
:// src AND (NOT dst) 
2138                 case wxAND
:        // src AND dst 
2139                 case wxAND_INVERT
: // (NOT src) AND dst 
2140                 case wxNO_OP
:      // dst 
2141                 case wxNOR
:        // (NOT src) AND (NOT dst) 
2142                 case wxEQUIV
:      // (NOT src) XOR dst 
2143                 case wxOR_INVERT
:  // (NOT src) OR dst 
2144                 case wxNAND
:       // (NOT src) OR (NOT dst) 
2145                 case wxOR
:         // src OR dst 
2147 //              case wxSRC_OR:     // source _bitmap_ OR destination 
2148 //              case wxSRC_AND:     // source _bitmap_ AND destination 
2152         m_macBrushInstalled 
= true ; 
2153         m_macPenInstalled 
= false ; 
2154         m_macFontInstalled 
= false ; 
2157 // --------------------------------------------------------------------------- 
2158 // coordinates transformations 
2159 // --------------------------------------------------------------------------- 
2162 wxCoord 
wxDCBase::DeviceToLogicalX(wxCoord x
) const 
2164     return ((wxDC 
*)this)->XDEV2LOG(x
); 
2167 wxCoord 
wxDCBase::DeviceToLogicalY(wxCoord y
) const 
2169     return ((wxDC 
*)this)->YDEV2LOG(y
); 
2172 wxCoord 
wxDCBase::DeviceToLogicalXRel(wxCoord x
) const 
2174     return ((wxDC 
*)this)->XDEV2LOGREL(x
); 
2177 wxCoord 
wxDCBase::DeviceToLogicalYRel(wxCoord y
) const 
2179     return ((wxDC 
*)this)->YDEV2LOGREL(y
); 
2182 wxCoord 
wxDCBase::LogicalToDeviceX(wxCoord x
) const 
2184     return ((wxDC 
*)this)->XLOG2DEV(x
); 
2187 wxCoord 
wxDCBase::LogicalToDeviceY(wxCoord y
) const 
2189     return ((wxDC 
*)this)->YLOG2DEV(y
); 
2192 wxCoord 
wxDCBase::LogicalToDeviceXRel(wxCoord x
) const 
2194     return ((wxDC 
*)this)->XLOG2DEVREL(x
); 
2197 wxCoord 
wxDCBase::LogicalToDeviceYRel(wxCoord y
) const 
2199     return ((wxDC 
*)this)->YLOG2DEVREL(y
);