X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/524c47aa3adf2af11a3069fd5da035a604f08f66..12b5f4b4d2d8a07962da7ba3b78c8c1ec2634a67:/src/osx/carbon/dcscreen.cpp diff --git a/src/osx/carbon/dcscreen.cpp b/src/osx/carbon/dcscreen.cpp index e544aa4ae4..3f0d549ce3 100644 --- a/src/osx/carbon/dcscreen.cpp +++ b/src/osx/carbon/dcscreen.cpp @@ -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; +}