]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/carbon/dcscreen.cpp
define MIIM_BITMAP &c in wx/msw/missing.h instead of msw/menu.cpp as menuitem.cpp...
[wxWidgets.git] / src / osx / carbon / dcscreen.cpp
index 521f73b3aea85fa4b001664c86b71093ab95dc48..3f0d549ce3888f93a7086b5f118841175f8afa5c 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        src/mac/carbon/dcscreen.cpp
+// Name:        src/osx/carbon/dcscreen.cpp
 // Purpose:     wxScreenDC class
 // Author:      Stefan Csomor
 // Modified by:
 // Purpose:     wxScreenDC class
 // Author:      Stefan Csomor
 // Modified by:
 #include "wx/wxprec.h"
 
 #include "wx/dcscreen.h"
 #include "wx/wxprec.h"
 
 #include "wx/dcscreen.h"
-#include "wx/osx/carbon/dcscreen.h"
+#include "wx/osx/dcscreen.h"
 
 
-#include "wx/osx/uma.h"
+#include "wx/osx/private.h"
 #include "wx/graphics.h"
 #include "wx/graphics.h"
+#include "wx/osx/private/glgrab.h"
 
 IMPLEMENT_ABSTRACT_CLASS(wxScreenDCImpl, wxWindowDCImpl)
 
 
 IMPLEMENT_ABSTRACT_CLASS(wxScreenDCImpl, wxWindowDCImpl)
 
@@ -27,7 +28,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxScreenDCImpl, wxWindowDCImpl)
 wxScreenDCImpl::wxScreenDCImpl( wxDC *owner ) :
    wxWindowDCImpl( owner )
 {
 wxScreenDCImpl::wxScreenDCImpl( wxDC *owner ) :
    wxWindowDCImpl( owner )
 {
-#ifdef __LP64__
+#if wxOSX_USE_COCOA_OR_IPHONE
     m_graphicContext = NULL;
     m_ok = false ;
 #else
     m_graphicContext = NULL;
     m_ok = false ;
 #else
@@ -52,8 +53,42 @@ wxScreenDCImpl::~wxScreenDCImpl()
 {
     delete m_graphicContext;
     m_graphicContext = NULL;
 {
     delete m_graphicContext;
     m_graphicContext = NULL;
-#ifdef __LP64__
+#if wxOSX_USE_COCOA_OR_IPHONE
 #else
     DisposeWindow((WindowRef) m_overlayWindow );
 #endif
 }
 #else
     DisposeWindow((WindowRef) m_overlayWindow );
 #endif
 }
+
+wxBitmap wxScreenDCImpl::DoGetAsBitmap(const wxRect *subrect) const
+{
+    CGRect srcRect = CGRectMake(0, 0, m_width, m_height);
+    if (subrect)
+    {
+        srcRect.origin.x = subrect->GetX();
+        srcRect.origin.y = subrect->GetY();
+        srcRect.size.width = subrect->GetWidth();
+        srcRect.size.height = subrect->GetHeight();
+    }
+    
+    wxBitmap bmp = wxBitmap(srcRect.size.width, srcRect.size.height, 32);
+    
+    CGContextRef context = (CGContextRef)bmp.GetHBITMAP();
+    
+    CGContextSaveGState(context);
+    
+    CGContextTranslateCTM( context, 0,  m_height );
+    CGContextScaleCTM( context, 1, -1 );
+    
+    if ( subrect )
+        srcRect = CGRectOffset( srcRect, -subrect->x, -subrect->y ) ;
+    
+    CGImageRef image = grabViaOpenGL(kCGNullDirectDisplay, srcRect);
+    
+    wxASSERT_MSG(image, wxT("wxScreenDC::GetAsBitmap - unable to get screenshot."));
+    
+    CGContextDrawImage(context, srcRect, image);
+    
+    CGContextRestoreGState(context);
+
+    return bmp;
+}