diff --git a/src/msw/graphicsd2d.cpp b/src/msw/graphicsd2d.cpp index 19a2a95fde..c929e7b78f 100644 --- a/src/msw/graphicsd2d.cpp +++ b/src/msw/graphicsd2d.cpp @@ -48,6 +48,7 @@ #include "wx/dc.h" #include "wx/dynlib.h" #include "wx/image.h" +#include "wx/module.h" #include "wx/msw/private/comptr.h" #include "wx/private/graphics.h" #include "wx/stack.h" @@ -3444,20 +3445,20 @@ private : IMPLEMENT_DYNAMIC_CLASS(wxD2DRenderer,wxGraphicsRenderer) -static wxScopedPtr gs_D2DRenderer; - -wxGraphicsRenderer* wxGraphicsRenderer::GetDirect2DRenderer() -{ - if (!wxDirect2D::Initialize()) - return NULL; - - if (!gs_D2DRenderer) - { - gs_D2DRenderer.reset(new wxD2DRenderer()); - } - - return gs_D2DRenderer.get(); -} +static wxD2DRenderer *gs_D2DRenderer = NULL; + +wxGraphicsRenderer* wxGraphicsRenderer::GetDirect2DRenderer() +{ + if (!wxDirect2D::Initialize()) + return NULL; + + if (!gs_D2DRenderer) + { + gs_D2DRenderer = new wxD2DRenderer(); + } + + return gs_D2DRenderer; +} wxD2DRenderer::wxD2DRenderer() { @@ -3715,4 +3716,48 @@ ID2D1Factory* wxGetD2DFactory(wxGraphicsRenderer* renderer) return static_cast(renderer)->GetD2DFactory(); } +// ---------------------------------------------------------------------------- +// Module ensuring all global/singleton objects are destroyed on shutdown. +// ---------------------------------------------------------------------------- + +class wxDirect2DModule : public wxModule +{ +public: + wxDirect2DModule() + { + } + + virtual bool OnInit() wxOVERRIDE + { + return true; + } + + virtual void OnExit() wxOVERRIDE + { + if ( gs_WICImagingFactory ) + { + gs_WICImagingFactory->Release(); + gs_WICImagingFactory = NULL; + } + + if ( gs_IDWriteFactory ) + { + gs_IDWriteFactory->Release(); + gs_IDWriteFactory = NULL; + } + + if ( gs_D2DRenderer ) + { + delete gs_D2DRenderer; + gs_D2DRenderer = NULL; + } + } + +private: + wxDECLARE_DYNAMIC_CLASS(wxDirect2DModule); +}; + +wxIMPLEMENT_DYNAMIC_CLASS(wxDirect2DModule, wxModule); + + #endif // wxUSE_GRAPHICS_DIRECT2D