]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/nonownedwnd_osx.cpp
Applied Blit system options optimization to StretchBlit
[wxWidgets.git] / src / osx / nonownedwnd_osx.cpp
index 70cd61b5c4c9a8d92bdd9adb74e0a41e274b7c7c..1d643a0fdb0eafa19eaa447492a99b59def57fbb 100644 (file)
@@ -13,6 +13,7 @@
 
 #ifndef WX_PRECOMP
     #include "wx/app.h"
+    #include "wx/dcmemory.h"
     #include "wx/log.h"
 #endif // WX_PRECOMP
 
@@ -497,25 +498,49 @@ WXWindow wxNonOwnedWindow::GetWXWindow() const
 // Shape implementation
 // ---------------------------------------------------------------------------
 
-
-bool wxNonOwnedWindow::SetShape(const wxRegion& region)
+bool wxNonOwnedWindow::DoClearShape()
 {
-    wxCHECK_MSG( HasFlag(wxFRAME_SHAPED), false,
-                 wxT("Shaped windows must be created with the wxFRAME_SHAPED style."));
+    m_shape.Clear();
+
+    wxSize sz = GetClientSize();
+    wxRegion region(0, 0, sz.x, sz.y);
+
+    return m_nowpeer->SetShape(region);
+}
 
+bool wxNonOwnedWindow::DoSetRegionShape(const wxRegion& region)
+{
     m_shape = region;
 
-    // The empty region signifies that the shape
-    // should be removed from the window.
-    if ( region.IsEmpty() )
+    return m_nowpeer->SetShape(region);
+}
+
+#if wxUSE_GRAPHICS_CONTEXT
+
+#include "wx/scopedptr.h"
+
+bool wxNonOwnedWindow::DoSetPathShape(const wxGraphicsPath& path)
+{
+    m_shapePath = path;
+
+    // Convert the path to wxRegion by rendering the path on a window-sized
+    // bitmap, creating a mask from it and finally creating the region from
+    // this mask.
+    wxBitmap bmp(GetSize());
+
     {
-        wxSize sz = GetClientSize();
-        wxRegion rgn(0, 0, sz.x, sz.y);
-        if ( rgn.IsEmpty() )
-            return false ;
-        else
-            return SetShape(rgn);
+        wxMemoryDC dc(bmp);
+        dc.SetBackground(*wxBLACK);
+        dc.Clear();
+
+        wxScopedPtr<wxGraphicsContext> context(wxGraphicsContext::Create(dc));
+        context->SetBrush(*wxWHITE);
+        context->FillPath(m_shapePath);
     }
 
-    return m_nowpeer->SetShape(region);
+    bmp.SetMask(new wxMask(bmp, *wxBLACK));
+
+    return DoSetRegionShape(wxRegion(bmp));
 }
+
+#endif // wxUSE_GRAPHICS_CONTEXT