X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/489468feaa08b8f504735eecca522fb8d0f825d2..ec2df34e27ba41f202ecbf096cdfed082a9ddb8f:/src/osx/carbon/dcscreen.cpp diff --git a/src/osx/carbon/dcscreen.cpp b/src/osx/carbon/dcscreen.cpp index ad8ac0be4a..c413eb1fe0 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,13 @@ #include "wx/wxprec.h" #include "wx/dcscreen.h" -#include "wx/mac/carbon/dcscreen.h" +#include "wx/osx/dcscreen.h" -#include "wx/mac/uma.h" +#include "wx/osx/private.h" #include "wx/graphics.h" +#if wxOSX_USE_COCOA_OR_CARBON +#include "wx/osx/private/glgrab.h" +#endif IMPLEMENT_ABSTRACT_CLASS(wxScreenDCImpl, wxWindowDCImpl) @@ -27,12 +30,17 @@ IMPLEMENT_ABSTRACT_CLASS(wxScreenDCImpl, wxWindowDCImpl) wxScreenDCImpl::wxScreenDCImpl( wxDC *owner ) : wxWindowDCImpl( owner ) { -#ifdef __LP64__ - m_graphicContext = NULL; - m_ok = false ; -#else +#if wxOSX_USE_COCOA_OR_CARBON CGRect cgbounds ; cgbounds = CGDisplayBounds(CGMainDisplayID()); + m_width = (wxCoord)cgbounds.size.width; + m_height = (wxCoord)cgbounds.size.height; +#else + wxDisplaySize( &m_width, &m_height ); +#endif +#if wxOSX_USE_COCOA_OR_IPHONE + SetGraphicsContext( wxGraphicsContext::Create() ); +#else Rect bounds; bounds.top = (short)cgbounds.origin.y; bounds.left = (short)cgbounds.origin.x; @@ -42,18 +50,67 @@ wxScreenDCImpl::wxScreenDCImpl( wxDC *owner ) : CreateNewWindow( kOverlayWindowClass, overlayAttributes, &bounds, (WindowRef*) &m_overlayWindow ); ShowWindow((WindowRef)m_overlayWindow); SetGraphicsContext( wxGraphicsContext::CreateFromNativeWindow( m_overlayWindow ) ); - m_width = (wxCoord)cgbounds.size.width; - m_height = (wxCoord)cgbounds.size.height; - m_ok = true ; #endif + m_ok = true ; } wxScreenDCImpl::~wxScreenDCImpl() { - delete m_graphicContext; - m_graphicContext = NULL; -#ifdef __LP64__ + wxDELETE(m_graphicContext); +#if wxOSX_USE_COCOA_OR_IPHONE #else DisposeWindow((WindowRef) m_overlayWindow ); #endif } + +#if wxOSX_USE_IPHONE +// Apple has allowed usage of this API as of 15th Dec 2009w +extern CGImageRef UIGetScreenImage(); +#endif + +// TODO Switch to CGWindowListCreateImage for 10.5 and above + +wxBitmap wxScreenDCImpl::DoGetAsBitmap(const wxRect *subrect) const +{ + wxRect rect = subrect ? *subrect : wxRect(0, 0, m_width, m_height); + + wxBitmap bmp(rect.GetSize(), 32); + +#if !wxOSX_USE_IPHONE + CGRect srcRect = CGRectMake(rect.x, rect.y, rect.width, rect.height); + + 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 = NULL; + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 + if ( UMAGetSystemVersion() >= 10.6) + { + image = CGDisplayCreateImage(kCGDirectMainDisplay); + } + else +#endif + { + image = grabViaOpenGL(kCGNullDirectDisplay, srcRect); + } + + wxASSERT_MSG(image, wxT("wxScreenDC::GetAsBitmap - unable to get screenshot.")); + + CGContextDrawImage(context, srcRect, image); + + CGImageRelease(image); + + CGContextRestoreGState(context); +#else + // TODO implement using UIGetScreenImage, CGImageCreateWithImageInRect, CGContextDrawImage +#endif + return bmp; +}