X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/facd6764872eede45605ba7c9dfa0e1d0c708fa2..37de49a3225b9e87ec950f73d361335c73ad3f7f:/src/mac/carbon/dc.cpp diff --git a/src/mac/carbon/dc.cpp b/src/mac/carbon/dc.cpp index 005e7d54ea..3084e7224c 100644 --- a/src/mac/carbon/dc.cpp +++ b/src/mac/carbon/dc.cpp @@ -79,8 +79,7 @@ public : wxMacFastPortSetter( const wxDC *dc ) { wxASSERT( dc->Ok() ) ; - GetPort( &m_oldPort ) ; - SetPort( (GrafPtr) dc->m_macPort ) ; + m_swapped = QDSwapPort( (GrafPtr) dc->m_macPort , &m_oldPort ) ; m_clipRgn = NewRgn() ; GetClip( m_clipRgn ) ; m_dc = dc ; @@ -88,13 +87,15 @@ public : } ~wxMacFastPortSetter() { - SetPort( (GrafPtr) m_dc->m_macPort ) ; + // SetPort( (GrafPtr) m_dc->m_macPort ) ; SetClip( m_clipRgn ) ; - SetPort( m_oldPort ) ; + if ( m_swapped ) + SetPort( m_oldPort ) ; m_dc->MacCleanupPort( NULL ) ; DisposeRgn( m_clipRgn ) ; } private : + bool m_swapped ; RgnHandle m_clipRgn ; GrafPtr m_oldPort ; const wxDC* m_dc ; @@ -107,6 +108,7 @@ typedef wxMacPortSetter wxMacFastPortSetter ; wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win ) : wxMacPortSaver( (GrafPtr) GetWindowPort((WindowRef) win->MacGetTopLevelWindowRef()) ) { + m_newPort =(GrafPtr) GetWindowPort((WindowRef) win->MacGetTopLevelWindowRef()) ; m_formerClip = NewRgn() ; m_newClip = NewRgn() ; GetClip( m_formerClip ) ; @@ -126,11 +128,26 @@ wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win ) : wxMacWindowClipper::~wxMacWindowClipper() { + SetPort( m_newPort ) ; SetClip( m_formerClip ) ; DisposeRgn( m_newClip ) ; DisposeRgn( m_formerClip ) ; } +wxMacWindowStateSaver::wxMacWindowStateSaver( const wxWindow* win ) : + wxMacWindowClipper( win ) +{ + // the port is already set at this point + m_newPort =(GrafPtr) GetWindowPort((WindowRef) win->MacGetTopLevelWindowRef()) ; + GetThemeDrawingState( &m_themeDrawingState ) ; +} + +wxMacWindowStateSaver::~wxMacWindowStateSaver() +{ + SetPort( m_newPort ) ; + SetThemeDrawingState( m_themeDrawingState , true ) ; +} + //----------------------------------------------------------------------------- // Local functions //----------------------------------------------------------------------------- @@ -495,7 +512,7 @@ void wxDC::DestroyClippingRegion() { wxMacFastPortSetter helper(this) ; CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ; - m_clipping = FALSE; + ResetClipping(); } void wxDC::DoGetSizeMM( int* width, int* height ) const @@ -614,10 +631,9 @@ void wxDC::ComputeScaleAndOrigin() { // this is a bit artificial, but we need to force wxDC to think // the pen has changed - wxPen* pen = & GetPen(); - wxPen tempPen; - m_pen = tempPen; - SetPen(* pen); + wxPen pen(GetPen()); + m_pen = wxNullPen; + SetPen(pen); } } @@ -1328,15 +1344,33 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y, OSStatus status = noErr ; ATSUTextLayout atsuLayout ; UniCharCount chars = str.Length() ; + UniChar* ubuf = NULL ; +#if SIZEOF_WCHAR_T == 4 + wxMBConvUTF16BE converter ; #if wxUSE_UNICODE - status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) (const wxChar*) str , 0 , str.Length() , str.Length() , 1 , - &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ; + size_t unicharlen = converter.WC2MB( NULL , str.wc_str() , 0 ) ; + ubuf = (UniChar*) malloc( unicharlen + 2 ) ; + converter.WC2MB( (char*) ubuf , str.wc_str(), unicharlen + 2 ) ; +#else + const wxWCharBuffer wchar = str.wc_str( wxConvLocal ) ; + size_t unicharlen = converter.WC2MB( NULL , wchar.data() , 0 ) ; + ubuf = (UniChar*) malloc( unicharlen + 2 ) ; + converter.WC2MB( (char*) ubuf , wchar.data() , unicharlen + 2 ) ; +#endif + chars = unicharlen / 2 ; +#else +#if wxUSE_UNICODE + ubuf = (UniChar*) str.wc_str() ; #else 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 ) ; + chars = wxWcslen( wchar.data() ) ; + ubuf = (UniChar*) wchar.data() ; +#endif #endif + + status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) ubuf , 0 , chars , chars , 1 , + &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ; + wxASSERT_MSG( status == noErr , wxT("couldn't create the layout of the rotated text") ); int iAngle = int( angle ); int drawX = XLOG2DEVMAC(x) ; @@ -1382,6 +1416,9 @@ 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); +#if SIZEOF_WCHAR_T == 4 + free( ubuf ) ; +#endif } void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) @@ -1649,10 +1686,9 @@ void wxDC::Clear(void) wxCHECK_RET(Ok(), wxT("Invalid DC")); wxMacFastPortSetter helper(this) ; Rect rect = { -31000 , -31000 , 31000 , 31000 } ; - if (m_backgroundBrush.GetStyle() != wxTRANSPARENT) + if ( m_backgroundBrush.Ok() && m_backgroundBrush.GetStyle() != wxTRANSPARENT) { ::PenNormal() ; - //MacInstallBrush() ; MacSetupBackgroundForCurrentPort( m_backgroundBrush ) ; ::EraseRect( &rect ) ; } @@ -1913,37 +1949,40 @@ void wxDC::MacInstallPen() const void wxDC::MacSetupBackgroundForCurrentPort(const wxBrush& background ) { Pattern whiteColor ; - switch( background.MacGetBrushKind() ) + if ( background.Ok() ) { - case kwxMacBrushTheme : + switch( background.MacGetBrushKind() ) { - ::SetThemeBackground( background.MacGetTheme() , wxDisplayDepth() , true ) ; - break ; - } - case kwxMacBrushThemeBackground : - { - Rect extent ; - ThemeBackgroundKind bg = background.MacGetThemeBackground( &extent ) ; - ::ApplyThemeBackground( bg , &extent ,kThemeStateActive , wxDisplayDepth() , true ) ; - break ; - } - case kwxMacBrushColour : - { - ::RGBBackColor( &MAC_WXCOLORREF( background.GetColour().GetPixel()) ); - int brushStyle = background.GetStyle(); - if (brushStyle == wxSOLID) - ::BackPat(GetQDGlobalsWhite(&whiteColor)); - else if (IS_HATCH(brushStyle)) + case kwxMacBrushTheme : { - Pattern pat ; - wxMacGetPattern(brushStyle, &pat); - ::BackPat(&pat); + ::SetThemeBackground( background.MacGetTheme() , wxDisplayDepth() , true ) ; + break ; } - else + case kwxMacBrushThemeBackground : { - ::BackPat(GetQDGlobalsWhite(&whiteColor)); + Rect extent ; + ThemeBackgroundKind bg = background.MacGetThemeBackground( &extent ) ; + ::ApplyThemeBackground( bg , &extent ,kThemeStateActive , wxDisplayDepth() , true ) ; + break ; + } + case kwxMacBrushColour : + { + ::RGBBackColor( &MAC_WXCOLORREF( background.GetColour().GetPixel()) ); + int brushStyle = background.GetStyle(); + if (brushStyle == wxSOLID) + ::BackPat(GetQDGlobalsWhite(&whiteColor)); + else if (IS_HATCH(brushStyle)) + { + Pattern pat ; + wxMacGetPattern(brushStyle, &pat); + ::BackPat(&pat); + } + else + { + ::BackPat(GetQDGlobalsWhite(&whiteColor)); + } + break ; } - break ; } } }