void CocoaUnwindStackAndLoseFocus();
// DC flipping/transformation
void CocoaApplyTransformations();
+ void CocoaUnapplyTransformations();
WX_NSAffineTransform m_cocoaWxToBoundsTransform;
+// Get bounds rect (for Clear())
+ // note: we use void * to mean NSRect * so that we can avoid
+ // putting NSRect in the headers.
+ virtual bool CocoaGetBounds(void *rectData);
// Blitting
virtual bool CocoaDoBlitOnFocusedDC(wxCoord xdest, wxCoord ydest,
wxCoord width, wxCoord height, wxCoord xsrc, wxCoord ysrc,
wxWindowDC(wxWindow *win);
~wxWindowDC(void);
- // NSView specific functions
- virtual void Clear();
protected:
wxWindow *m_window;
WX_NSView m_lockedNSView;
virtual bool CocoaUnlockFocus();
bool CocoaLockFocusOnNSView(WX_NSView nsview);
bool CocoaUnlockFocusOnNSView();
+ virtual bool CocoaGetBounds(void *rectData);
};
class wxClientDC: public wxWindowDC
~wxMemoryDC(void);
virtual void SelectObject(const wxBitmap& bitmap);
virtual void DoGetSize(int *width, int *height) const;
-
- virtual void Clear();
protected:
wxBitmap m_selectedBitmap;
WX_NSImage m_cocoaNSImage;
// DC stack
virtual bool CocoaLockFocus();
virtual bool CocoaUnlockFocus();
+ virtual bool CocoaGetBounds(void *rectData);
// Blitting
virtual bool CocoaDoBlitOnFocusedDC(wxCoord xdest, wxCoord ydest,
wxCoord width, wxCoord height, wxCoord xsrc, wxCoord ysrc,
// TODO: Apply device/logical/user position/scaling transformations
}
+void wxDC::CocoaUnapplyTransformations()
+{
+ // NOTE: You *must* call this with focus held.
+ // Undo all transforms so we're back in true Cocoa coords with
+ // no scaling or flipping.
+ NSAffineTransform *invertTransform;
+ invertTransform = [m_cocoaWxToBoundsTransform copy];
+ [invertTransform invert];
+ [invertTransform concat];
+}
+
+bool wxDC::CocoaGetBounds(void *rectData)
+{
+ // We don't know what we are so we can't return anything.
+ return false;
+}
+
void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{
wxAutoNSAutoreleasePool pool;
void wxDC::Clear()
{
+ if(!CocoaTakeFocus()) return;
+
+ NSRect boundsRect;
+ if(!CocoaGetBounds(&boundsRect)) return;
+
+ NSGraphicsContext *context = [NSGraphicsContext currentContext];
+ [context saveGraphicsState];
+
+ // Undo all transforms so when we draw our bounds rect we
+ // really overwrite our bounds rect.
+ CocoaUnapplyTransformations();
+
+ [m_backgroundBrush.GetNSColor() set];
+ [NSBezierPath fillRect:boundsRect];
+
+ [context restoreGraphicsState];
}
void wxDC::SetBackground(const wxBrush& brush)
return CocoaUnlockFocusOnNSView();
}
-void wxWindowDC::Clear()
-{
- if(!CocoaTakeFocus()) return;
-
- NSGraphicsContext *context = [NSGraphicsContext currentContext];
- [context saveGraphicsState];
-
- [m_backgroundBrush.GetNSColor() set];
- [NSBezierPath fillRect:[m_lockedNSView bounds]];
-
- [context restoreGraphicsState];
+bool wxWindowDC::CocoaGetBounds(void *rectData)
+{
+ if(!rectData)
+ return false;
+ if(!m_lockedNSView)
+ return false;
+ NSRect *pRect = (NSRect*)rectData;
+ *pRect = [m_lockedNSView bounds];
+ return true;
}
/*
return false;
}
-void wxMemoryDC::Clear()
+bool wxMemoryDC::CocoaGetBounds(void *rectData)
{
- if(!CocoaTakeFocus()) return;
-
- NSGraphicsContext *context = [NSGraphicsContext currentContext];
- [context saveGraphicsState];
-
- [m_backgroundBrush.GetNSColor() set];
- NSRect rect;
- rect.origin.x = 0;
- rect.origin.y = 0;
- rect.size = [m_cocoaNSImage size];
- [NSBezierPath fillRect:rect];
-
- [context restoreGraphicsState];
+ 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;
}