X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d10e22fe8ad283f37b1809349028ffc282e393ce..80a779275ae04443c568dca919adb26cf6f5002c:/src/common/dcbase.cpp?ds=sidebyside diff --git a/src/common/dcbase.cpp b/src/common/dcbase.cpp index 37800e0d72..84ac42aa3c 100644 --- a/src/common/dcbase.cpp +++ b/src/common/dcbase.cpp @@ -25,6 +25,7 @@ #endif #include "wx/dc.h" +#include "wx/dcbuffer.h" // for IMPLEMENT_DYNAMIC_CLASS #ifndef WX_PRECOMP #include "wx/math.h" @@ -38,6 +39,9 @@ IMPLEMENT_ABSTRACT_CLASS(wxDCBase, wxObject) // implementation // ============================================================================ +IMPLEMENT_DYNAMIC_CLASS(wxBufferedDC, wxMemoryDC) +IMPLEMENT_ABSTRACT_CLASS(wxBufferedPaintDC, wxBufferedDC) + #if WXWIN_COMPATIBILITY_2_6 void wxDCBase::BeginDrawing() { @@ -1157,6 +1161,7 @@ void wxDCBase::CalculateEllipticPoints( wxList* points, #if defined(wxMAC_USE_CORE_GRAPHICS) && wxMAC_USE_CORE_GRAPHICS #include "wx/mac/private.h" +#include "wx/toplevel.h" class wxOverlayImpl { @@ -1181,10 +1186,20 @@ public: void Clear( wxWindowDC* dc); private: - WindowRef m_overlayWindow ; + OSStatus CreateOverlayWindow(); + + void MacGetBounds( Rect *bounds ); + + WindowRef m_overlayWindow; + WindowRef m_overlayParentWindow; CGContextRef m_overlayContext ; // we store the window in case we would have to issue a Refresh() wxWindow* m_window ; + + int m_x ; + int m_y ; + int m_width ; + int m_height ; } ; wxOverlayImpl::wxOverlayImpl() @@ -1201,7 +1216,36 @@ wxOverlayImpl::~wxOverlayImpl() bool wxOverlayImpl::IsOk() { - return m_overlayContext != NULL ; + return m_overlayWindow != NULL ; +} + +void wxOverlayImpl::MacGetBounds( Rect *bounds ) +{ + wxPoint origin(0,0); + origin = m_window->ClientToScreen( origin ); + bounds->top = origin.y; + bounds->left = origin.x; + bounds->bottom = origin.y+m_y+m_height; + bounds->right = origin.x+m_x+m_width; +} + +OSStatus wxOverlayImpl::CreateOverlayWindow() +{ + OSStatus err; + + WindowAttributes overlayAttributes = kWindowIgnoreClicksAttribute; + + m_overlayParentWindow =(WindowRef) m_window->MacGetTopLevelWindowRef(); + + Rect bounds ; + MacGetBounds(&bounds); + err = CreateNewWindow( kOverlayWindowClass, overlayAttributes, &bounds, &m_overlayWindow ); + if ( err == noErr ) + { + SetWindowGroup( m_overlayWindow, GetWindowGroup(m_overlayParentWindow)); // Put them in the same group so that their window layers are consistent + ShowWindow(m_overlayWindow); + } + return err; } void wxOverlayImpl::Init( wxWindowDC* dc, int x , int y , int width , int height ) @@ -1209,17 +1253,17 @@ void wxOverlayImpl::Init( wxWindowDC* dc, int x , int y , int width , int height wxASSERT_MSG( !IsOk() , _("You cannot Init an overlay twice") ); m_window = dc->GetWindow(); + m_x = x ; + m_y = y ; + m_width = width ; + m_height = height ; - wxPoint origin(0,0); - origin = m_window->ClientToScreen( origin ); - Rect bounds = { origin.y, origin.x, origin.y+y+height, origin.x+x+width } ; - - UInt32 flags = kWindowHideOnSuspendAttribute | kWindowIgnoreClicksAttribute; - OSStatus err = CreateNewWindow( kOverlayWindowClass, flags, &bounds, &m_overlayWindow ); + OSStatus err = CreateOverlayWindow(); wxASSERT_MSG( err == noErr , _("Couldn't create the overlay window") ); - ShowWindow(m_overlayWindow); +#ifndef __LP64__ err = QDBeginCGContext(GetWindowPort(m_overlayWindow), &m_overlayContext); - CGContextTranslateCTM( m_overlayContext, 0, bounds.bottom - bounds.top ); +#endif + CGContextTranslateCTM( m_overlayContext, 0, m_height+m_y ); CGContextScaleCTM( m_overlayContext, 1, -1 ); wxASSERT_MSG( err == noErr , _("Couldn't init the context on the overlay window") ); } @@ -1228,32 +1272,39 @@ void wxOverlayImpl::BeginDrawing( wxWindowDC* dc) { delete dc->m_graphicContext ; dc->m_graphicContext = new wxMacCGContext( m_overlayContext ); + // we are right now startin at 0,0 not at the wxWindow's origin, so most of the calculations + // int dc are already corect + // just to make sure : dc->m_macLocalOrigin.x = 0 ; dc->m_macLocalOrigin.y = 0 ; + wxSize size = m_window->GetSize() ; + dc->SetClippingRegion( 0 , 0 , size.x , size.y ) ; } void wxOverlayImpl::EndDrawing( wxWindowDC* dc) { + delete dc->m_graphicContext ; + dc->m_graphicContext = NULL ; + } void wxOverlayImpl::Clear(wxWindowDC* dc) { wxASSERT_MSG( IsOk() , _("You cannot Clear an overlay that is not inited") ); - delete dc->m_graphicContext ; - dc->m_graphicContext = NULL ; - - Reset(); + CGRect box = CGRectMake( m_x - 1, m_y - 1 , m_width + 2 , m_height + 2 ); + CGContextClearRect( m_overlayContext, box ); } void wxOverlayImpl::Reset() { if ( m_overlayContext ) { +#ifndef __LP64__ OSStatus err = QDEndCGContext(GetWindowPort(m_overlayWindow), &m_overlayContext); wxASSERT_MSG( err == noErr , _("Couldn't end the context on the overlay window") ); - +#endif m_overlayContext = NULL ; - } + } // todo : don't dispose, only hide and reposition on next run if (m_overlayWindow) @@ -1267,7 +1318,7 @@ void wxOverlayImpl::Reset() // // -#else +#else // ie not wxMAC_USE_CORE_GRAPHICS class wxOverlayImpl { @@ -1297,12 +1348,20 @@ private: int m_y ; int m_width ; int m_height ; +// this is to enable wxMOTIF and UNIV to compile.... +// currently (10 oct 06) we don't use m_window +// ce - how do we fix this +#if defined(__WXGTK__) || defined(__WXMSW__) +// wxWindow* m_window ; +#endif } ; wxOverlayImpl::wxOverlayImpl() { - m_window = NULL ; +#if defined(__WXGTK__) || defined(__WXMSW__) + m_window = NULL ; +#endif m_x = m_y = m_width = m_height = 0 ; } @@ -1320,7 +1379,10 @@ void wxOverlayImpl::Init( wxWindowDC* dc, int x , int y , int width , int height #if defined(__WXGTK__) m_window = dc->m_owner; #else + #if defined (__WXMSW__) m_window = dc->GetWindow(); + #endif // __WXMSW__ + #endif wxMemoryDC dcMem ; m_bmpSaved.Create( width, height );