]> 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 6cd9b891fe8f46eb31a27629eb47a03dc51a8700..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:
@@ -16,6 +16,7 @@
 
 #include "wx/osx/private.h"
 #include "wx/graphics.h"
+#include "wx/osx/private/glgrab.h"
 
 IMPLEMENT_ABSTRACT_CLASS(wxScreenDCImpl, wxWindowDCImpl)
 
@@ -57,3 +58,37 @@ wxScreenDCImpl::~wxScreenDCImpl()
     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;
+}