#if wxUSE_GRAPHICS_CONTEXT
-#include "wx/private/graphics.h"
+#include "wx/graphics.h"
#ifndef WX_PRECOMP
#include "wx/icon.h"
#include "wx/log.h"
#endif
-//-----------------------------------------------------------------------------
-// constants
-//-----------------------------------------------------------------------------
-
-static const double RAD2DEG = 180.0 / M_PI;
+#include "wx/private/graphics.h"
//-----------------------------------------------------------------------------
// Local functions
return wxRect2DDouble( x,y,w,h );
}
-bool wxGraphicsPath::Contains( const wxPoint2DDouble& c, int fillStyle ) const
+bool wxGraphicsPath::Contains( const wxPoint2DDouble& c, wxPolygonFillMode fillStyle ) const
{
return Contains( c.m_x, c.m_y, fillStyle);
}
GetPathData()->GetBox(x,y,w,h);
}
-bool wxGraphicsPath::Contains( wxDouble x, wxDouble y, int fillStyle ) const
+bool wxGraphicsPath::Contains( wxDouble x, wxDouble y, wxPolygonFillMode fillStyle ) const
{
return GetPathData()->Contains(x,y,fillStyle);
}
wxDouble dist = r / sin(alpha/2) * cos(alpha/2);
// calculate tangential points
wxPoint2DDouble t1 = dist*v1 + p1;
- wxPoint2DDouble t2 = dist*v2 + p1;
wxPoint2DDouble nv1 = v1;
nv1.SetVectorAngle(v1.GetVectorAngle()-90);
AddLineToPoint(p2.m_x,p2.m_y);
}
+//-----------------------------------------------------------------------------
+// wxGraphicsGradientStops
+//-----------------------------------------------------------------------------
+
+void wxGraphicsGradientStops::Add(const wxGraphicsGradientStop& stop)
+{
+ for ( wxVector<wxGraphicsGradientStop>::iterator it = m_stops.begin();
+ it != m_stops.end();
+ ++it )
+ {
+ if ( stop.GetPosition() < it->GetPosition() )
+ {
+ if ( it != m_stops.begin() )
+ {
+ m_stops.insert(it, stop);
+ }
+ else // we shouldn't be inserting it at the beginning
+ {
+ wxFAIL_MSG( "invalid gradient stop position < 0" );
+ }
+
+ return;
+ }
+ }
+
+ if ( stop.GetPosition() == 1. )
+ {
+ m_stops.insert(m_stops.end() - 1, stop);
+ }
+ else
+ {
+ wxFAIL_MSG( "invalid gradient stop position > 1" );
+ }
+}
+
//-----------------------------------------------------------------------------
// wxGraphicsContext Convenience Methods
//-----------------------------------------------------------------------------
IMPLEMENT_ABSTRACT_CLASS(wxGraphicsContext, wxObject)
-wxGraphicsContext::wxGraphicsContext(wxGraphicsRenderer* renderer) : wxGraphicsObject(renderer)
+wxGraphicsContext::wxGraphicsContext(wxGraphicsRenderer* renderer) :
+ wxGraphicsObject(renderer),
+ m_antialias(wxANTIALIAS_DEFAULT),
+ m_composition(wxCOMPOSITION_OVER),
+ m_enableOffset(false)
{
- m_logicalFunction = wxCOPY;
}
wxGraphicsContext::~wxGraphicsContext()
{
}
+void wxGraphicsContext::EnableOffset(bool enable)
+{
+ m_enableOffset = enable;
+}
+
#if 0
void wxGraphicsContext::SetAlpha( wxDouble WXUNUSED(alpha) )
{
}
#endif
-void wxGraphicsContext::GetSize( wxDouble* width, wxDouble* height)
-{
- *width = 10000.0;
- *height = 10000.0;
-}
-
void wxGraphicsContext::GetDPI( wxDouble* dpiX, wxDouble* dpiY)
{
*dpiX = 72.0;
void wxGraphicsContext::SetPen( const wxPen& pen )
{
- if ( !pen.Ok() || pen.GetStyle() == wxTRANSPARENT )
+ if ( !pen.IsOk() || pen.GetStyle() == wxPENSTYLE_TRANSPARENT )
SetPen( wxNullGraphicsPen );
else
SetPen( CreatePen( pen ) );
void wxGraphicsContext::SetBrush( const wxBrush& brush )
{
- if ( !brush.Ok() || brush.GetStyle() == wxTRANSPARENT )
+ if ( !brush.IsOk() || brush.GetStyle() == wxBRUSHSTYLE_TRANSPARENT )
SetBrush( wxNullGraphicsBrush );
else
SetBrush( CreateBrush( brush ) );
m_font = font;
}
-bool wxGraphicsContext::SetLogicalFunction( int function )
-{
- if ( function == wxCOPY )
- {
- m_logicalFunction = function;
- return true;
- }
- return false;
-}
-
void wxGraphicsContext::SetFont( const wxFont& font, const wxColour& colour )
{
- if ( font.Ok() )
+ if ( font.IsOk() )
SetFont( CreateFont( font, colour ) );
else
SetFont( wxNullGraphicsFont );
}
-void wxGraphicsContext::DrawPath( const wxGraphicsPath& path, int fillStyle )
+void wxGraphicsContext::DrawPath( const wxGraphicsPath& path, wxPolygonFillMode fillStyle )
{
FillPath( path , fillStyle );
StrokePath( path );
}
-void wxGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle )
+void
+wxGraphicsContext::DoDrawRotatedText(const wxString &str,
+ wxDouble x,
+ wxDouble y,
+ wxDouble angle)
{
Translate(x,y);
Rotate( -angle );
Translate(-x,-y);
}
-void wxGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDouble y, const wxGraphicsBrush& backgroundBrush )
+void
+wxGraphicsContext::DoDrawFilledText(const wxString &str,
+ wxDouble x,
+ wxDouble y,
+ const wxGraphicsBrush& backgroundBrush)
{
wxGraphicsBrush formerBrush = m_brush;
wxGraphicsPen formerPen = m_pen;
// to make sure our 'OffsetToPixelBoundaries' doesn't move the fill shape
SetPen( wxNullGraphicsPen );
- wxGraphicsPath path = CreatePath();
- path.AddRectangle( x , y, width, height );
- FillPath( path );
+ DrawRectangle(x , y, width, height);
DrawText( str, x ,y);
SetBrush( formerBrush );
SetPen( formerPen );
}
-void wxGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle, const wxGraphicsBrush& backgroundBrush )
+void
+wxGraphicsContext::DoDrawRotatedFilledText(const wxString &str,
+ wxDouble x, wxDouble y,
+ wxDouble angle,
+ const wxGraphicsBrush& backgroundBrush)
{
wxGraphicsBrush formerBrush = m_brush;
wxGraphicsPen formerPen = m_pen;
StrokePath( path );
}
-void wxGraphicsContext::DrawLines( size_t n, const wxPoint2DDouble *points, int fillStyle)
+void wxGraphicsContext::DrawLines( size_t n, const wxPoint2DDouble *points, wxPolygonFillMode fillStyle)
{
wxASSERT(n > 1);
wxGraphicsPath path = CreatePath();
return GetRenderer()->CreateBrush(brush);
}
-// sets the brush to a linear gradient, starting at (x1,y1) with color c1 to (x2,y2) with color c2
-wxGraphicsBrush wxGraphicsContext::CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
- const wxColour&c1, const wxColour&c2) const
+wxGraphicsBrush
+wxGraphicsContext::CreateLinearGradientBrush(
+ wxDouble x1, wxDouble y1,
+ wxDouble x2, wxDouble y2,
+ const wxColour& c1, const wxColour& c2) const
+{
+ return GetRenderer()->CreateLinearGradientBrush
+ (
+ x1, y1,
+ x2, y2,
+ wxGraphicsGradientStops(c1,c2)
+ );
+}
+
+wxGraphicsBrush
+wxGraphicsContext::CreateLinearGradientBrush(
+ wxDouble x1, wxDouble y1,
+ wxDouble x2, wxDouble y2,
+ const wxGraphicsGradientStops& gradientStops) const
{
- return GetRenderer()->CreateLinearGradientBrush(x1,y1,x2,y2,c1,c2);
+ return GetRenderer()->CreateLinearGradientBrush(x1,y1,x2,y2, gradientStops);
}
-// sets the brush to a radial gradient originating at (xo,yc) with color oColor and ends on a circle around (xc,yc)
-// with radius r and color cColor
-wxGraphicsBrush wxGraphicsContext::CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
- const wxColour &oColor, const wxColour &cColor) const
+wxGraphicsBrush
+wxGraphicsContext::CreateRadialGradientBrush(
+ wxDouble xo, wxDouble yo,
+ wxDouble xc, wxDouble yc, wxDouble radius,
+ const wxColour &oColor, const wxColour &cColor) const
{
- return GetRenderer()->CreateRadialGradientBrush(xo,yo,xc,yc,radius,oColor,cColor);
+ return GetRenderer()->CreateRadialGradientBrush
+ (
+ xo, yo,
+ xc, yc, radius,
+ wxGraphicsGradientStops(oColor, cColor)
+ );
+}
+
+wxGraphicsBrush
+wxGraphicsContext::CreateRadialGradientBrush(
+ wxDouble xo, wxDouble yo,
+ wxDouble xc, wxDouble yc, wxDouble radius,
+ const wxGraphicsGradientStops& gradientStops) const
+{
+ return GetRenderer()->CreateRadialGradientBrush
+ (
+ xo, yo,
+ xc, yc, radius,
+ gradientStops
+ );
}
// sets the font
wxGraphicsBitmap wxGraphicsContext::CreateBitmap( const wxBitmap& bmp ) const
{
-#ifndef __WXGTK20__
return GetRenderer()->CreateBitmap(bmp);
-#else
- return wxNullGraphicsBitmap;
-#endif
}
wxGraphicsBitmap wxGraphicsContext::CreateSubBitmap( const wxGraphicsBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) const
{
-#ifndef __WXGTK20__
return GetRenderer()->CreateSubBitmap(bmp,x,y,w,h);
-#else
- return wxNullGraphicsBitmap;
-#endif
}
/* static */ wxGraphicsContext* wxGraphicsContext::Create( const wxWindowDC& dc)
}
#endif
+#ifdef __WXMSW__
+#if wxUSE_ENH_METAFILE
+/* static */ wxGraphicsContext* wxGraphicsContext::Create( const wxEnhMetaFileDC& dc)
+{
+ return wxGraphicsRenderer::GetDefaultRenderer()->CreateContext(dc);
+}
+#endif
+#endif
+
wxGraphicsContext* wxGraphicsContext::CreateFromNative( void * context )
{
return wxGraphicsRenderer::GetDefaultRenderer()->CreateContextFromNativeContext(context);