+ return bits;
+}
+
+void wxBitmap::UngetRawData(wxPixelDataBase& dataBase)
+{
+ if ( !Ok() )
+ return;
+
+ // the cast is ugly but we can't do without it and without making this
+ // function template (and hence inline) unfortunately
+ typedef wxPixelData<wxBitmap, wxAlphaPixelFormat> PixelData;
+ PixelData& data = (PixelData &)dataBase;
+
+ if ( !data )
+ {
+ // invalid data, don't crash -- but don't assert neither as we're
+ // called automatically from wxPixelDataBase dtor and so there is no
+ // way to prevent this from happening
+ return;
+ }
+
+ if ( GetBitmapData()->m_hasAlpha )
+ {
+ // AlphaBlend() wants to have premultiplied source alpha but
+ // wxRawBitmap API uses normal, not premultiplied, colours, so adjust
+ // them here now
+ PixelData::Iterator p(data);
+
+ const int w = data.GetWidth();
+ const int h = data.GetHeight();
+
+ for ( int y = 0; y < h; y++ )
+ {
+ PixelData::Iterator rowStart = p;
+
+ for ( int x = 0; x < w; x++ )
+ {
+ const unsigned alpha = p.Alpha();
+
+ p.Red() = (p.Red() * alpha + 127) / 255;
+ p.Blue() = (p.Blue() * alpha + 127) / 255;
+ p.Green() = (p.Green() * alpha + 127) / 255;
+
+ ++p;
+ }
+
+ p = rowStart;
+ p.OffsetY(data, 1);
+ }
+
+ // if we're a DDB we need to convert DIB back to DDB now to make the
+ // changes made via raw bitmap access effective
+ if ( !GetBitmapData()->m_isDIB )
+ {
+ wxDIB *dib = GetBitmapData()->m_dib;
+ GetBitmapData()->m_dib = NULL;
+
+ // TODO: convert
+
+ delete dib;
+ }
+ }