X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1f0c8f31f407ecfce909060464c0ea655221cdab..12b5f4b4d2d8a07962da7ba3b78c8c1ec2634a67:/src/osx/carbon/dcscreen.cpp?ds=sidebyside diff --git a/src/osx/carbon/dcscreen.cpp b/src/osx/carbon/dcscreen.cpp index 521f73b3ae..3f0d549ce3 100644 --- a/src/osx/carbon/dcscreen.cpp +++ b/src/osx/carbon/dcscreen.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/mac/carbon/dcscreen.cpp +// Name: src/osx/carbon/dcscreen.cpp // Purpose: wxScreenDC class // Author: Stefan Csomor // Modified by: @@ -12,10 +12,11 @@ #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/osx/private/glgrab.h" IMPLEMENT_ABSTRACT_CLASS(wxScreenDCImpl, wxWindowDCImpl) @@ -27,7 +28,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxScreenDCImpl, wxWindowDCImpl) wxScreenDCImpl::wxScreenDCImpl( wxDC *owner ) : wxWindowDCImpl( owner ) { -#ifdef __LP64__ +#if wxOSX_USE_COCOA_OR_IPHONE m_graphicContext = NULL; m_ok = false ; #else @@ -52,8 +53,42 @@ wxScreenDCImpl::~wxScreenDCImpl() { delete m_graphicContext; m_graphicContext = NULL; -#ifdef __LP64__ +#if wxOSX_USE_COCOA_OR_IPHONE #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; +}