+ BYTE maskPattern = 0 ;
+ BYTE maskByte = 0;
+ size_t maskIndex ;
+
+ for ( size_t y = 0 ; y < height ; ++y)
+ {
+ maskIndex = 0 ;
+ for( size_t x = 0 ; x < width; ++x)
+ {
+ if ( x % 8 == 0)
+ {
+ maskPattern = 0x80;
+ maskByte = *((BYTE*)dataMask.Scan0 + dataMask.Stride*y + maskIndex);
+ maskIndex++;
+ }
+ else
+ maskPattern = maskPattern >> 1;
+
+ ARGB *dest = (ARGB*)((BYTE*)imageData.Scan0 + imageData.Stride*y + x*4);
+ if ( (maskByte & maskPattern) == 0 )
+ *dest = 0x00000000;
+ else
+ {
+ Color c ;
+ interim.GetPixel(x,y,&c) ;
+ *dest = (c.GetValue() | Color::AlphaMask);
+ }
+ }
+ }
+
+ image->UnlockBits(&imageData);
+
+ interimMask.UnlockBits(&dataMask);
+ interim.UnlockBits(&dataMask);
+ }
+ else
+ {
+ image = Bitmap::FromHBITMAP((HBITMAP)bmp.GetHBITMAP(),
+#if wxUSE_PALETTE
+ (HPALETTE)bmp.GetPalette()->GetHPALETTE()
+#else
+ NULL
+#endif
+ );
+ if ( bmp.HasAlpha() && GetPixelFormatSize(image->GetPixelFormat()) == 32 )
+ {
+ size_t width = image->GetWidth();
+ size_t height = image->GetHeight();
+ Rect bounds(0,0,width,height);
+ static BitmapData data ;
+
+ m_helper = image ;
+ image = NULL ;
+ m_helper->LockBits(&bounds, ImageLockModeRead,
+ m_helper->GetPixelFormat(),&data);
+
+ image = new Bitmap(data.Width, data.Height, data.Stride,
+ PixelFormat32bppPARGB , (BYTE*) data.Scan0);
+
+ m_helper->UnlockBits(&data);
+ }
+ }
+ if ( image )
+ m_bitmap = image;
+}
+
+#if wxUSE_IMAGE
+
+wxImage wxGDIPlusBitmapData::ConvertToImage() const
+{
+ // We could use Bitmap::LockBits() and convert to wxImage directly but
+ // passing by wxBitmap is easier. It would be nice to measure performance
+ // of the two methods but for this the second one would need to be written
+ // first...
+ HBITMAP hbmp;
+ if ( m_bitmap->GetHBITMAP(Color(0xffffffff), &hbmp) != Gdiplus::Ok )
+ return wxNullImage;
+
+ wxBitmap bmp;
+ bmp.SetWidth(m_bitmap->GetWidth());
+ bmp.SetHeight(m_bitmap->GetHeight());
+ bmp.SetHBITMAP(hbmp);
+ bmp.SetDepth(IsAlphaPixelFormat(m_bitmap->GetPixelFormat()) ? 32 : 24);
+ return bmp.ConvertToImage();
+}
+
+#endif // wxUSE_IMAGE
+
+wxGDIPlusBitmapData::~wxGDIPlusBitmapData()
+{
+ delete m_bitmap;
+ delete m_helper;
+}
+
+//-----------------------------------------------------------------------------
+// wxGDIPlusPath implementation
+//-----------------------------------------------------------------------------
+
+wxGDIPlusPathData::wxGDIPlusPathData(wxGraphicsRenderer* renderer, GraphicsPath* path ) : wxGraphicsPathData(renderer)
+{
+ if ( path )
+ m_path = path;
+ else
+ m_path = new GraphicsPath();
+}
+
+wxGDIPlusPathData::~wxGDIPlusPathData()
+{
+ delete m_path;
+}
+
+wxGraphicsObjectRefData* wxGDIPlusPathData::Clone() const
+{
+ return new wxGDIPlusPathData( GetRenderer() , m_path->Clone());
+}
+
+//
+// The Primitives
+//
+
+void wxGDIPlusPathData::MoveToPoint( wxDouble x , wxDouble y )
+{
+ m_path->StartFigure();
+ m_path->AddLine((REAL) x,(REAL) y,(REAL) x,(REAL) y);
+}
+
+void wxGDIPlusPathData::AddLineToPoint( wxDouble x , wxDouble y )
+{
+ m_path->AddLine((REAL) x,(REAL) y,(REAL) x,(REAL) y);
+}
+
+void wxGDIPlusPathData::CloseSubpath()
+{
+ m_path->CloseFigure();
+}
+
+void wxGDIPlusPathData::AddCurveToPoint( wxDouble cx1, wxDouble cy1, wxDouble cx2, wxDouble cy2, wxDouble x, wxDouble y )
+{
+ PointF c1(cx1,cy1);
+ PointF c2(cx2,cy2);
+ PointF end(x,y);
+ PointF start;
+ m_path->GetLastPoint(&start);
+ m_path->AddBezier(start,c1,c2,end);
+}
+
+// gets the last point of the current path, (0,0) if not yet set
+void wxGDIPlusPathData::GetCurrentPoint( wxDouble* x, wxDouble* y) const
+{
+ PointF start;
+ m_path->GetLastPoint(&start);
+ *x = start.X ;
+ *y = start.Y ;
+}
+
+void wxGDIPlusPathData::AddArc( wxDouble x, wxDouble y, wxDouble r, double startAngle, double endAngle, bool clockwise )
+{
+ double sweepAngle = endAngle - startAngle ;
+ if( fabs(sweepAngle) >= 2*M_PI)
+ {
+ sweepAngle = 2 * M_PI;
+ }
+ else
+ {
+ if ( clockwise )
+ {