* 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
This commit is contained in:
@@ -44,8 +44,11 @@ bool wxMemoryDC::CocoaLockFocus()
|
|||||||
{
|
{
|
||||||
if(m_cocoaNSImage)
|
if(m_cocoaNSImage)
|
||||||
{
|
{
|
||||||
[m_cocoaNSImage lockFocusOnRepresentation: m_selectedBitmap.GetNSBitmapImageRep()];
|
[m_cocoaNSImage lockFocus];
|
||||||
sm_cocoaDCStack.Insert(this);
|
sm_cocoaDCStack.Insert(this);
|
||||||
|
m_cocoaFlipped = [m_cocoaNSImage isFlipped];
|
||||||
|
m_cocoaHeight = [m_cocoaNSImage size].height;
|
||||||
|
CocoaApplyTransformations();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -57,18 +60,42 @@ bool wxMemoryDC::CocoaUnlockFocus()
|
|||||||
return true;
|
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 )
|
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();
|
CocoaUnwindStackAndLoseFocus();
|
||||||
[m_cocoaNSImage release];
|
[m_cocoaNSImage release];
|
||||||
m_cocoaNSImage = nil;
|
m_cocoaNSImage = nil;
|
||||||
m_selectedBitmap = bitmap;
|
m_selectedBitmap = bitmap;
|
||||||
if(m_selectedBitmap.Ok())
|
if(m_selectedBitmap.Ok())
|
||||||
{
|
{
|
||||||
|
// Create an offscreen window of the same size
|
||||||
m_cocoaNSImage = [[NSImage alloc]
|
m_cocoaNSImage = [[NSImage alloc]
|
||||||
initWithSize:NSMakeSize(m_selectedBitmap.GetWidth(),
|
initWithSize:NSMakeSize(m_selectedBitmap.GetWidth(),
|
||||||
m_selectedBitmap.GetHeight())];
|
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<wxBitmap&>(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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user