+// convert degrees to radians
+static inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; }
+
+// call AlphaBlend() to blit contents of hdcSrc to hdcDst using alpha
+//
+// NB: bmpSrc is the bitmap selected in hdcSrc, it is not really needed
+// to pass it to this function but as we already have it at the point
+// of call anyhow we do
+//
+// return true if we could draw the bitmap in one way or the other, false
+// otherwise
+static bool AlphaBlt(HDC hdcDst,
+ int x, int y, int dstWidth, int dstHeight,
+ int srcX, int srcY,
+ int srcWidth, int srcHeight,
+ HDC hdcSrc,
+ const wxBitmap& bmp);
+
+#ifdef wxHAVE_RAW_BITMAP
+
+// our (limited) AlphaBlend() replacement for Windows versions not providing it
+static void
+wxAlphaBlend(HDC hdcDst, int xDst, int yDst,
+ int dstWidth, int dstHeight,
+ int srcX, int srcY,
+ int srcWidth, int srcHeight,
+ const wxBitmap& bmpSrc);
+
+#endif // wxHAVE_RAW_BITMAP
+
+// ----------------------------------------------------------------------------
+// private classes
+// ----------------------------------------------------------------------------
+
+// instead of duplicating the same code which sets and then restores text
+// colours in each wxDC method working with wxSTIPPLE_MASK_OPAQUE brushes,
+// encapsulate this in a small helper class
+
+// wxColourChanger: changes the text colours in the ctor if required and
+// restores them in the dtor
+class wxColourChanger
+{
+public:
+ wxColourChanger(wxDC& dc);
+ ~wxColourChanger();
+
+private:
+ wxDC& m_dc;
+
+ COLORREF m_colFgOld, m_colBgOld;
+
+ bool m_changed;
+
+ DECLARE_NO_COPY_CLASS(wxColourChanger)
+};
+
+// this class saves the old stretch blit mode during its life time
+class StretchBltModeChanger
+{
+public:
+ StretchBltModeChanger(HDC hdc,
+ int WXUNUSED_IN_WINCE(mode))
+ : m_hdc(hdc)
+ {
+#ifndef __WXWINCE__
+ m_modeOld = ::SetStretchBltMode(m_hdc, mode);
+ if ( !m_modeOld )
+ wxLogLastError(_T("SetStretchBltMode"));
+#endif
+ }
+
+ ~StretchBltModeChanger()
+ {
+#ifndef __WXWINCE__
+ if ( !::SetStretchBltMode(m_hdc, m_modeOld) )
+ wxLogLastError(_T("SetStretchBltMode"));
+#endif
+ }
+
+private:
+ const HDC m_hdc;
+
+ int m_modeOld;
+
+ DECLARE_NO_COPY_CLASS(StretchBltModeChanger)
+};
+
+#if wxUSE_DYNLIB_CLASS
+
+// helper class to cache dynamically loaded libraries and not attempt reloading
+// them if it fails
+class wxOnceOnlyDLLLoader
+{
+public:
+ // ctor argument must be a literal string as we don't make a copy of it!
+ wxOnceOnlyDLLLoader(const wxChar *dllName)
+ : m_dllName(dllName)
+ {
+ }
+
+
+ // return the symbol with the given name or NULL if the DLL not loaded
+ // or symbol not present
+ void *GetSymbol(const wxChar *name)
+ {
+ // we're prepared to handle errors here
+ wxLogNull noLog;
+
+ if ( m_dllName )
+ {
+ m_dll.Load(m_dllName);
+
+ // reset the name whether we succeeded or failed so that we don't
+ // try again the next time
+ m_dllName = NULL;
+ }
+
+ return m_dll.IsLoaded() ? m_dll.GetSymbol(name) : NULL;
+ }
+
+private:
+ wxDynamicLibrary m_dll;
+ const wxChar *m_dllName;
+};
+
+static wxOnceOnlyDLLLoader wxGDI32DLL(_T("gdi32"));
+static wxOnceOnlyDLLLoader wxMSIMG32DLL(_T("msimg32"));
+
+#endif // wxUSE_DYNLIB_CLASS