+// 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 w, int h,
+ HDC hdcSrc,
+ const wxBitmap& bmpSrc);
+
+#ifdef wxHAVE_RAW_BITMAP
+// our (limited) AlphaBlend() replacement
+static void
+wxAlphaBlend(HDC hdcDst, int x, int y, int w, int h, const wxBitmap& bmp);
+#endif
+
+// ----------------------------------------------------------------------------
+// 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 mode)
+ : m_hdc(hdc)
+ {
+#ifndef __WXWINCE__
+ m_modeOld = ::SetStretchBltMode(m_hdc, mode);
+ if ( !m_modeOld )
+ wxLogLastError(_T("SetStretchBltMode"));
+#else
+ wxUnusedVar(mode);
+#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)
+};
+