From e3d7f7703ee16c35dca819794bec8bd730848cd0 Mon Sep 17 00:00:00 2001 From: David Elliott Date: Fri, 8 Aug 2003 14:57:04 +0000 Subject: [PATCH] * Since AppKit cannot draw directly on NSBitmapImageRep, copy the data to/from an offscreen window during SelectObject * Apply the usual flip transformations git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22705 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/cocoa/dcmemory.mm | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/cocoa/dcmemory.mm b/src/cocoa/dcmemory.mm index 02efda166f..10b01be3b3 100644 --- a/src/cocoa/dcmemory.mm +++ b/src/cocoa/dcmemory.mm @@ -44,8 +44,11 @@ bool wxMemoryDC::CocoaLockFocus() { if(m_cocoaNSImage) { - [m_cocoaNSImage lockFocusOnRepresentation: m_selectedBitmap.GetNSBitmapImageRep()]; + [m_cocoaNSImage lockFocus]; sm_cocoaDCStack.Insert(this); + m_cocoaFlipped = [m_cocoaNSImage isFlipped]; + m_cocoaHeight = [m_cocoaNSImage size].height; + CocoaApplyTransformations(); return true; } return false; @@ -57,18 +60,42 @@ bool wxMemoryDC::CocoaUnlockFocus() return true; } +// 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 ) { + if(m_selectedBitmap.Ok()) + { + CocoaTakeFocus(); + wxASSERT(m_cocoaNSImage); + m_selectedBitmap.SetNSBitmapImageRep( + [[NSBitmapImageRep alloc] + initWithFocusedViewRect:NSMakeRect(0.0,0.0, + m_selectedBitmap.GetWidth(), + m_selectedBitmap.GetHeight())]); + } CocoaUnwindStackAndLoseFocus(); [m_cocoaNSImage release]; m_cocoaNSImage = nil; m_selectedBitmap = bitmap; if(m_selectedBitmap.Ok()) { + // Create an offscreen window of the same size m_cocoaNSImage = [[NSImage alloc] initWithSize:NSMakeSize(m_selectedBitmap.GetWidth(), m_selectedBitmap.GetHeight())]; - [m_cocoaNSImage addRepresentation: m_selectedBitmap.GetNSBitmapImageRep()]; + + // Now copy the data + NSImage *nsimage = [[NSImage alloc] + initWithSize:NSMakeSize(m_selectedBitmap.GetWidth(), + m_selectedBitmap.GetHeight())]; + [nsimage addRepresentation: const_cast(m_selectedBitmap).GetNSBitmapImageRep()]; + [nsimage drawAtPoint: NSMakePoint(0,0) + fromRect: NSMakeRect(0.0,0.0,m_selectedBitmap.GetWidth(),m_selectedBitmap.GetHeight()) + operation: NSCompositeCopy + fraction: 1.0]; + + [nsimage release]; } } -- 2.45.2