X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/449c567346a1b3937e532cd87aac007faad76b04..5a1e0e91a1ca5ec98b0eeb335cda757d1261ed08:/src/cocoa/dcmemory.mm?ds=sidebyside diff --git a/src/cocoa/dcmemory.mm b/src/cocoa/dcmemory.mm index 3bdb6dd67e..b6de98c880 100644 --- a/src/cocoa/dcmemory.mm +++ b/src/cocoa/dcmemory.mm @@ -6,18 +6,23 @@ // Created: 2003/03/16 // RCS-ID: $Id$ // Copyright: (c) 2002 David Elliott -// Licence: wxWindows licence +// Licence: wxWidgets licence ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" + #ifndef WX_PRECOMP #include "wx/log.h" #include "wx/dcmemory.h" #endif //WX_PRECOMP +#include "wx/cocoa/autorelease.h" + #import #import #import +#import +#import //----------------------------------------------------------------------------- // wxMemoryDC @@ -25,7 +30,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC,wxDC) -wxMemoryDC::wxMemoryDC(void) +void wxMemoryDC::Init() { m_cocoaNSImage = NULL; m_ok = false; @@ -33,8 +38,7 @@ wxMemoryDC::wxMemoryDC(void) wxMemoryDC::wxMemoryDC( wxDC *WXUNUSED(dc) ) { - m_cocoaNSImage = NULL; - m_ok = false; + Init(); } wxMemoryDC::~wxMemoryDC(void) @@ -49,8 +53,10 @@ bool wxMemoryDC::CocoaLockFocus() { [m_cocoaNSImage lockFocus]; sm_cocoaDCStack.Insert(this); - m_cocoaFlipped = [m_cocoaNSImage isFlipped]; - m_cocoaHeight = [m_cocoaNSImage size].height; + NSAffineTransform *newTransform = CocoaGetWxToBoundsTransform([m_cocoaNSImage isFlipped], [m_cocoaNSImage size].height); + [newTransform retain]; + [m_cocoaWxToBoundsTransform release]; + m_cocoaWxToBoundsTransform = newTransform; CocoaApplyTransformations(); return true; } @@ -65,8 +71,9 @@ bool wxMemoryDC::CocoaUnlockFocus() // NOTE: The AppKit is unable to draw onto an NSBitmapImageRep so we must // instead copy the data to an offscreen window, then copy it back -void wxMemoryDC::SelectObject( const wxBitmap& bitmap ) +void wxMemoryDC::DoSelect( const wxBitmap& bitmap ) { + wxAutoNSAutoreleasePool pool; if(m_selectedBitmap.Ok()) { CocoaTakeFocus(); @@ -89,17 +96,14 @@ void wxMemoryDC::SelectObject( const wxBitmap& bitmap ) m_selectedBitmap.GetHeight())]; // Now copy the data - NSImage *nsimage = [[NSImage alloc] - initWithSize:NSMakeSize(m_selectedBitmap.GetWidth(), - m_selectedBitmap.GetHeight())]; - [nsimage addRepresentation: const_cast(m_selectedBitmap).GetNSBitmapImageRep()]; + NSImage *nsimage = [m_selectedBitmap.GetNSImage(false) retain]; [m_cocoaNSImage lockFocus]; [nsimage drawAtPoint: NSMakePoint(0,0) fromRect: NSMakeRect(0.0,0.0,m_selectedBitmap.GetWidth(),m_selectedBitmap.GetHeight()) operation: NSCompositeCopy fraction: 1.0]; [m_cocoaNSImage unlockFocus]; - + [nsimage release]; } } @@ -138,15 +142,28 @@ bool wxMemoryDC::CocoaDoBlitOnFocusedDC(wxCoord xdest, wxCoord ydest, [transform concat]; [flipTransform concat]; - wxLogDebug("[m_cocoaNSImage isFlipped]=%d", [m_cocoaNSImage isFlipped]); + wxLogTrace(wxTRACE_COCOA,wxT("[m_cocoaNSImage isFlipped]=%d"), [m_cocoaNSImage isFlipped]); [m_cocoaNSImage drawAtPoint: NSMakePoint(0,0) fromRect: NSMakeRect(xsrc, m_selectedBitmap.GetHeight()-height-ysrc, width, height) operation: NSCompositeCopy // FIXME: raster ops fraction: 1.0]; - + [context restoreGraphicsState]; return false; } +bool wxMemoryDC::CocoaGetBounds(void *rectData) +{ + if(!rectData) + return false; + if(!m_cocoaNSImage) + return false; + NSRect *pRect = (NSRect*)rectData; + pRect->origin.x = 0.0; + pRect->origin.y = 0.0; + pRect->size = [m_cocoaNSImage size]; + return true; +} +