implement support for wxOR and wxCLEAR in wxCairoContext::SetLogicalFunction() (#9808)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54897 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -153,7 +153,7 @@ public :
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
// appends a rectangle as a new closed subpath
|
// appends a rectangle as a new closed subpath
|
||||||
virtual void AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h ) ;
|
virtual void AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h ) ;
|
||||||
// appends an ellipsis as a new closed subpath fitting the passed rectangle
|
// appends an ellipsis as a new closed subpath fitting the passed rectangle
|
||||||
virtual void AddEllipsis( wxDouble x, wxDouble y, wxDouble w , wxDouble h ) ;
|
virtual void AddEllipsis( wxDouble x, wxDouble y, wxDouble w , wxDouble h ) ;
|
||||||
@@ -192,13 +192,13 @@ public :
|
|||||||
virtual void Concat( const wxGraphicsMatrixData *t );
|
virtual void Concat( const wxGraphicsMatrixData *t );
|
||||||
|
|
||||||
// sets the matrix to the respective values
|
// sets the matrix to the respective values
|
||||||
virtual void Set(wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0,
|
virtual void Set(wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0,
|
||||||
wxDouble tx=0.0, wxDouble ty=0.0);
|
wxDouble tx=0.0, wxDouble ty=0.0);
|
||||||
|
|
||||||
// gets the component valuess of the matrix
|
// gets the component valuess of the matrix
|
||||||
virtual void Get(wxDouble* a=NULL, wxDouble* b=NULL, wxDouble* c=NULL,
|
virtual void Get(wxDouble* a=NULL, wxDouble* b=NULL, wxDouble* c=NULL,
|
||||||
wxDouble* d=NULL, wxDouble* tx=NULL, wxDouble* ty=NULL) const;
|
wxDouble* d=NULL, wxDouble* tx=NULL, wxDouble* ty=NULL) const;
|
||||||
|
|
||||||
// makes this the inverse matrix
|
// makes this the inverse matrix
|
||||||
virtual void Invert();
|
virtual void Invert();
|
||||||
|
|
||||||
@@ -219,7 +219,7 @@ public :
|
|||||||
virtual void Scale( wxDouble xScale , wxDouble yScale );
|
virtual void Scale( wxDouble xScale , wxDouble yScale );
|
||||||
|
|
||||||
// add the rotation to this matrix (radians)
|
// add the rotation to this matrix (radians)
|
||||||
virtual void Rotate( wxDouble angle );
|
virtual void Rotate( wxDouble angle );
|
||||||
|
|
||||||
//
|
//
|
||||||
// apply the transforms
|
// apply the transforms
|
||||||
@@ -250,12 +250,12 @@ public:
|
|||||||
|
|
||||||
private :
|
private :
|
||||||
double m_width;
|
double m_width;
|
||||||
|
|
||||||
double m_red;
|
double m_red;
|
||||||
double m_green;
|
double m_green;
|
||||||
double m_blue;
|
double m_blue;
|
||||||
double m_alpha;
|
double m_alpha;
|
||||||
|
|
||||||
cairo_line_cap_t m_cap;
|
cairo_line_cap_t m_cap;
|
||||||
cairo_line_join_t m_join;
|
cairo_line_join_t m_join;
|
||||||
|
|
||||||
@@ -274,7 +274,7 @@ public:
|
|||||||
~wxCairoBrushData ();
|
~wxCairoBrushData ();
|
||||||
|
|
||||||
virtual void Apply( wxGraphicsContext* context );
|
virtual void Apply( wxGraphicsContext* context );
|
||||||
void CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
|
void CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
|
||||||
const wxColour&c1, const wxColour&c2 );
|
const wxColour&c1, const wxColour&c2 );
|
||||||
void CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
|
void CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
|
||||||
const wxColour &oColor, const wxColour &cColor );
|
const wxColour &oColor, const wxColour &cColor );
|
||||||
@@ -335,7 +335,7 @@ public:
|
|||||||
virtual ~wxCairoContext();
|
virtual ~wxCairoContext();
|
||||||
|
|
||||||
virtual bool ShouldOffset() const
|
virtual bool ShouldOffset() const
|
||||||
{
|
{
|
||||||
int penwidth = 0 ;
|
int penwidth = 0 ;
|
||||||
if ( !m_pen.IsNull() )
|
if ( !m_pen.IsNull() )
|
||||||
{
|
{
|
||||||
@@ -356,6 +356,8 @@ public:
|
|||||||
|
|
||||||
virtual void * GetNativeContext();
|
virtual void * GetNativeContext();
|
||||||
|
|
||||||
|
virtual bool SetLogicalFunction( int function );
|
||||||
|
|
||||||
virtual void StrokePath( const wxGraphicsPath& p );
|
virtual void StrokePath( const wxGraphicsPath& p );
|
||||||
virtual void FillPath( const wxGraphicsPath& p , int fillStyle = wxWINDING_RULE );
|
virtual void FillPath( const wxGraphicsPath& p , int fillStyle = wxWINDING_RULE );
|
||||||
|
|
||||||
@@ -384,7 +386,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void Init(cairo_t *context);
|
void Init(cairo_t *context);
|
||||||
|
|
||||||
cairo_t* m_context;
|
cairo_t* m_context;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -407,7 +409,7 @@ void wxCairoPenData::Init()
|
|||||||
|
|
||||||
wxCairoPenData::wxCairoPenData( wxGraphicsRenderer* renderer, const wxPen &pen )
|
wxCairoPenData::wxCairoPenData( wxGraphicsRenderer* renderer, const wxPen &pen )
|
||||||
: wxGraphicsObjectRefData(renderer)
|
: wxGraphicsObjectRefData(renderer)
|
||||||
{
|
{
|
||||||
Init();
|
Init();
|
||||||
m_pen = pen;
|
m_pen = pen;
|
||||||
m_width = m_pen.GetWidth();
|
m_width = m_pen.GetWidth();
|
||||||
@@ -415,7 +417,7 @@ wxCairoPenData::wxCairoPenData( wxGraphicsRenderer* renderer, const wxPen &pen )
|
|||||||
m_width = 0.1;
|
m_width = 0.1;
|
||||||
|
|
||||||
m_red = m_pen.GetColour().Red()/255.0;
|
m_red = m_pen.GetColour().Red()/255.0;
|
||||||
m_green = m_pen.GetColour().Green()/255.0;
|
m_green = m_pen.GetColour().Green()/255.0;
|
||||||
m_blue = m_pen.GetColour().Blue()/255.0;
|
m_blue = m_pen.GetColour().Blue()/255.0;
|
||||||
m_alpha = m_pen.GetColour().Alpha()/255.0;
|
m_alpha = m_pen.GetColour().Alpha()/255.0;
|
||||||
|
|
||||||
@@ -598,9 +600,9 @@ wxCairoBrushData::wxCairoBrushData( wxGraphicsRenderer* renderer, const wxBrush
|
|||||||
: wxGraphicsObjectRefData(renderer)
|
: wxGraphicsObjectRefData(renderer)
|
||||||
{
|
{
|
||||||
Init();
|
Init();
|
||||||
|
|
||||||
m_red = brush.GetColour().Red()/255.0;
|
m_red = brush.GetColour().Red()/255.0;
|
||||||
m_green = brush.GetColour().Green()/255.0;
|
m_green = brush.GetColour().Green()/255.0;
|
||||||
m_blue = brush.GetColour().Blue()/255.0;
|
m_blue = brush.GetColour().Blue()/255.0;
|
||||||
m_alpha = brush.GetColour().Alpha()/255.0;
|
m_alpha = brush.GetColour().Alpha()/255.0;
|
||||||
/*
|
/*
|
||||||
@@ -637,7 +639,7 @@ wxCairoBrushData::wxCairoBrushData( wxGraphicsRenderer* renderer, const wxBrush
|
|||||||
m_brush = new HatchBrush(style,Color( brush.GetColour().Alpha() , brush.GetColour().Red() ,
|
m_brush = new HatchBrush(style,Color( brush.GetColour().Alpha() , brush.GetColour().Red() ,
|
||||||
brush.GetColour().Green() , brush.GetColour().Blue() ), Color.Transparent );
|
brush.GetColour().Green() , brush.GetColour().Blue() ), Color.Transparent );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wxBitmap* bmp = brush.GetStipple();
|
wxBitmap* bmp = brush.GetStipple();
|
||||||
if ( bmp && bmp->Ok() )
|
if ( bmp && bmp->Ok() )
|
||||||
@@ -669,7 +671,7 @@ void wxCairoBrushData::Apply( wxGraphicsContext* context )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxCairoBrushData::CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
|
void wxCairoBrushData::CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
|
||||||
const wxColour&c1, const wxColour&c2 )
|
const wxColour&c1, const wxColour&c2 )
|
||||||
{
|
{
|
||||||
m_brushPattern = cairo_pattern_create_linear(x1,y1,x2,y2);
|
m_brushPattern = cairo_pattern_create_linear(x1,y1,x2,y2);
|
||||||
@@ -700,11 +702,11 @@ void wxCairoBrushData::Init()
|
|||||||
// wxCairoFontData implementation
|
// wxCairoFontData implementation
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
wxCairoFontData::wxCairoFontData( wxGraphicsRenderer* renderer, const wxFont &font,
|
wxCairoFontData::wxCairoFontData( wxGraphicsRenderer* renderer, const wxFont &font,
|
||||||
const wxColour& col ) : wxGraphicsObjectRefData(renderer)
|
const wxColour& col ) : wxGraphicsObjectRefData(renderer)
|
||||||
{
|
{
|
||||||
m_red = col.Red()/255.0;
|
m_red = col.Red()/255.0;
|
||||||
m_green = col.Green()/255.0;
|
m_green = col.Green()/255.0;
|
||||||
m_blue = col.Blue()/255.0;
|
m_blue = col.Blue()/255.0;
|
||||||
m_alpha = col.Alpha()/255.0;
|
m_alpha = col.Alpha()/255.0;
|
||||||
m_size = font.GetPointSize();
|
m_size = font.GetPointSize();
|
||||||
@@ -836,7 +838,7 @@ void wxCairoPathData::GetCurrentPoint( wxDouble* x, wxDouble* y) const
|
|||||||
|
|
||||||
void wxCairoPathData::AddArc( wxDouble x, wxDouble y, wxDouble r, double startAngle, double endAngle, bool clockwise )
|
void wxCairoPathData::AddArc( wxDouble x, wxDouble y, wxDouble r, double startAngle, double endAngle, bool clockwise )
|
||||||
{
|
{
|
||||||
// as clockwise means positive in our system (y pointing downwards)
|
// as clockwise means positive in our system (y pointing downwards)
|
||||||
// TODO make this interpretation dependent of the
|
// TODO make this interpretation dependent of the
|
||||||
// real device trans
|
// real device trans
|
||||||
if ( clockwise||(endAngle-startAngle)>=2*M_PI)
|
if ( clockwise||(endAngle-startAngle)>=2*M_PI)
|
||||||
@@ -846,14 +848,14 @@ void wxCairoPathData::AddArc( wxDouble x, wxDouble y, wxDouble r, double startAn
|
|||||||
}
|
}
|
||||||
|
|
||||||
// transforms each point of this path by the matrix
|
// transforms each point of this path by the matrix
|
||||||
void wxCairoPathData::Transform( const wxGraphicsMatrixData* matrix )
|
void wxCairoPathData::Transform( const wxGraphicsMatrixData* matrix )
|
||||||
{
|
{
|
||||||
// as we don't have a true path object, we have to apply the inverse
|
// as we don't have a true path object, we have to apply the inverse
|
||||||
// matrix to the context
|
// matrix to the context
|
||||||
cairo_matrix_t m = *((cairo_matrix_t*) matrix->GetNativeMatrix());
|
cairo_matrix_t m = *((cairo_matrix_t*) matrix->GetNativeMatrix());
|
||||||
cairo_matrix_invert( &m );
|
cairo_matrix_invert( &m );
|
||||||
cairo_transform(m_pathContext,&m);
|
cairo_transform(m_pathContext,&m);
|
||||||
}
|
}
|
||||||
|
|
||||||
// gets the bounding box enclosing all points (possibly including control points)
|
// gets the bounding box enclosing all points (possibly including control points)
|
||||||
void wxCairoPathData::GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h) const
|
void wxCairoPathData::GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h) const
|
||||||
@@ -871,7 +873,7 @@ void wxCairoPathData::GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h)
|
|||||||
*x = x1;
|
*x = x1;
|
||||||
*w = x2-x1;
|
*w = x2-x1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( y2 < y1 )
|
if( y2 < y1 )
|
||||||
{
|
{
|
||||||
*y = y2;
|
*y = y2;
|
||||||
@@ -900,25 +902,25 @@ wxCairoMatrixData::wxCairoMatrixData(wxGraphicsRenderer* renderer, const cairo_m
|
|||||||
m_matrix = *matrix;
|
m_matrix = *matrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxCairoMatrixData::~wxCairoMatrixData()
|
wxCairoMatrixData::~wxCairoMatrixData()
|
||||||
{
|
{
|
||||||
// nothing to do
|
// nothing to do
|
||||||
}
|
}
|
||||||
|
|
||||||
wxGraphicsObjectRefData *wxCairoMatrixData::Clone() const
|
wxGraphicsObjectRefData *wxCairoMatrixData::Clone() const
|
||||||
{
|
{
|
||||||
return new wxCairoMatrixData(GetRenderer(),&m_matrix);
|
return new wxCairoMatrixData(GetRenderer(),&m_matrix);
|
||||||
}
|
}
|
||||||
|
|
||||||
// concatenates the matrix
|
// concatenates the matrix
|
||||||
void wxCairoMatrixData::Concat( const wxGraphicsMatrixData *t )
|
void wxCairoMatrixData::Concat( const wxGraphicsMatrixData *t )
|
||||||
{
|
{
|
||||||
cairo_matrix_multiply( &m_matrix, &m_matrix, (cairo_matrix_t*) t->GetNativeMatrix());
|
cairo_matrix_multiply( &m_matrix, &m_matrix, (cairo_matrix_t*) t->GetNativeMatrix());
|
||||||
}
|
}
|
||||||
|
|
||||||
// sets the matrix to the respective values
|
// sets the matrix to the respective values
|
||||||
void wxCairoMatrixData::Set(wxDouble a, wxDouble b, wxDouble c, wxDouble d,
|
void wxCairoMatrixData::Set(wxDouble a, wxDouble b, wxDouble c, wxDouble d,
|
||||||
wxDouble tx, wxDouble ty)
|
wxDouble tx, wxDouble ty)
|
||||||
{
|
{
|
||||||
cairo_matrix_init( &m_matrix, a, b, c, d, tx, ty);
|
cairo_matrix_init( &m_matrix, a, b, c, d, tx, ty);
|
||||||
}
|
}
|
||||||
@@ -936,21 +938,21 @@ void wxCairoMatrixData::Get(wxDouble* a, wxDouble* b, wxDouble* c,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// makes this the inverse matrix
|
// makes this the inverse matrix
|
||||||
void wxCairoMatrixData::Invert()
|
void wxCairoMatrixData::Invert()
|
||||||
{
|
{
|
||||||
cairo_matrix_invert( &m_matrix );
|
cairo_matrix_invert( &m_matrix );
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns true if the elements of the transformation matrix are equal ?
|
// returns true if the elements of the transformation matrix are equal ?
|
||||||
bool wxCairoMatrixData::IsEqual( const wxGraphicsMatrixData* t) const
|
bool wxCairoMatrixData::IsEqual( const wxGraphicsMatrixData* t) const
|
||||||
{
|
{
|
||||||
const cairo_matrix_t* tm = (cairo_matrix_t*) t->GetNativeMatrix();
|
const cairo_matrix_t* tm = (cairo_matrix_t*) t->GetNativeMatrix();
|
||||||
return (
|
return (
|
||||||
m_matrix.xx == tm->xx &&
|
m_matrix.xx == tm->xx &&
|
||||||
m_matrix.yx == tm->yx &&
|
m_matrix.yx == tm->yx &&
|
||||||
m_matrix.xy == tm->xy &&
|
m_matrix.xy == tm->xy &&
|
||||||
m_matrix.yy == tm->yy &&
|
m_matrix.yy == tm->yy &&
|
||||||
m_matrix.x0 == tm->x0 &&
|
m_matrix.x0 == tm->x0 &&
|
||||||
m_matrix.y0 == tm->y0 ) ;
|
m_matrix.y0 == tm->y0 ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -978,10 +980,10 @@ void wxCairoMatrixData::Scale( wxDouble xScale , wxDouble yScale )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// add the rotation to this matrix (radians)
|
// add the rotation to this matrix (radians)
|
||||||
void wxCairoMatrixData::Rotate( wxDouble angle )
|
void wxCairoMatrixData::Rotate( wxDouble angle )
|
||||||
{
|
{
|
||||||
cairo_matrix_rotate( &m_matrix, angle) ;
|
cairo_matrix_rotate( &m_matrix, angle) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// apply the transforms
|
// apply the transforms
|
||||||
@@ -1044,7 +1046,7 @@ wxCairoContext::wxCairoContext( wxGraphicsRenderer* renderer, const wxPrinterDC&
|
|||||||
|
|
||||||
wxPoint org = dc.GetDeviceOrigin();
|
wxPoint org = dc.GetDeviceOrigin();
|
||||||
cairo_translate( m_context, org.x, org.y );
|
cairo_translate( m_context, org.x, org.y );
|
||||||
|
|
||||||
double sx,sy;
|
double sx,sy;
|
||||||
dc.GetUserScale( &sx, &sy );
|
dc.GetUserScale( &sx, &sy );
|
||||||
cairo_scale( m_context, sx, sy );
|
cairo_scale( m_context, sx, sy );
|
||||||
@@ -1060,13 +1062,13 @@ wxCairoContext::wxCairoContext( wxGraphicsRenderer* renderer, const wxWindowDC&
|
|||||||
#ifdef __WXGTK20__
|
#ifdef __WXGTK20__
|
||||||
wxGTKDCImpl *impldc = (wxGTKDCImpl*) dc.GetImpl();
|
wxGTKDCImpl *impldc = (wxGTKDCImpl*) dc.GetImpl();
|
||||||
Init( gdk_cairo_create( impldc->GetGDKWindow() ) );
|
Init( gdk_cairo_create( impldc->GetGDKWindow() ) );
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
wxGraphicsMatrix matrix = CreateMatrix();
|
wxGraphicsMatrix matrix = CreateMatrix();
|
||||||
|
|
||||||
wxPoint org = dc.GetDeviceOrigin();
|
wxPoint org = dc.GetDeviceOrigin();
|
||||||
matrix.Translate( org.x, org.y );
|
matrix.Translate( org.x, org.y );
|
||||||
|
|
||||||
org = dc.GetLogicalOrigin();
|
org = dc.GetLogicalOrigin();
|
||||||
matrix.Translate( -org.x, -org.y );
|
matrix.Translate( -org.x, -org.y );
|
||||||
|
|
||||||
@@ -1094,13 +1096,13 @@ wxCairoContext::wxCairoContext( wxGraphicsRenderer* renderer, const wxMemoryDC&
|
|||||||
#ifdef __WXGTK20__
|
#ifdef __WXGTK20__
|
||||||
wxGTKDCImpl *impldc = (wxGTKDCImpl*) dc.GetImpl();
|
wxGTKDCImpl *impldc = (wxGTKDCImpl*) dc.GetImpl();
|
||||||
Init( gdk_cairo_create( impldc->GetGDKWindow() ) );
|
Init( gdk_cairo_create( impldc->GetGDKWindow() ) );
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
wxGraphicsMatrix matrix = CreateMatrix();
|
wxGraphicsMatrix matrix = CreateMatrix();
|
||||||
|
|
||||||
wxPoint org = dc.GetDeviceOrigin();
|
wxPoint org = dc.GetDeviceOrigin();
|
||||||
matrix.Translate( org.x, org.y );
|
matrix.Translate( org.x, org.y );
|
||||||
|
|
||||||
org = dc.GetLogicalOrigin();
|
org = dc.GetLogicalOrigin();
|
||||||
matrix.Translate( -org.x, -org.y );
|
matrix.Translate( -org.x, -org.y );
|
||||||
|
|
||||||
@@ -1184,14 +1186,14 @@ void wxCairoContext::Clip( const wxRegion& region )
|
|||||||
path.AddRectangle(ri.GetX(), ri.GetY(), ri.GetW(), ri.GetH());
|
path.AddRectangle(ri.GetX(), ri.GetY(), ri.GetW(), ri.GetH());
|
||||||
++ri;
|
++ri;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Put it in the context
|
// Put it in the context
|
||||||
cairo_path_t* cp = (cairo_path_t*) path.GetNativePath() ;
|
cairo_path_t* cp = (cairo_path_t*) path.GetNativePath() ;
|
||||||
cairo_append_path(m_context, cp);
|
cairo_append_path(m_context, cp);
|
||||||
|
|
||||||
// clip to that path
|
// clip to that path
|
||||||
cairo_clip(m_context);
|
cairo_clip(m_context);
|
||||||
path.UnGetNativePath(cp);
|
path.UnGetNativePath(cp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxCairoContext::Clip( wxDouble x, wxDouble y, wxDouble w, wxDouble h )
|
void wxCairoContext::Clip( wxDouble x, wxDouble y, wxDouble w, wxDouble h )
|
||||||
@@ -1206,7 +1208,7 @@ void wxCairoContext::Clip( wxDouble x, wxDouble y, wxDouble w, wxDouble h )
|
|||||||
|
|
||||||
// clip to that path
|
// clip to that path
|
||||||
cairo_clip(m_context);
|
cairo_clip(m_context);
|
||||||
path.UnGetNativePath(cp);
|
path.UnGetNativePath(cp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxCairoContext::ResetClip()
|
void wxCairoContext::ResetClip()
|
||||||
@@ -1218,8 +1220,8 @@ void wxCairoContext::ResetClip()
|
|||||||
void wxCairoContext::StrokePath( const wxGraphicsPath& path )
|
void wxCairoContext::StrokePath( const wxGraphicsPath& path )
|
||||||
{
|
{
|
||||||
if ( !m_pen.IsNull() )
|
if ( !m_pen.IsNull() )
|
||||||
{
|
{
|
||||||
wxCairoOffsetHelper helper( m_context, ShouldOffset() ) ;
|
wxCairoOffsetHelper helper( m_context, ShouldOffset() ) ;
|
||||||
cairo_path_t* cp = (cairo_path_t*) path.GetNativePath() ;
|
cairo_path_t* cp = (cairo_path_t*) path.GetNativePath() ;
|
||||||
cairo_append_path(m_context,cp);
|
cairo_append_path(m_context,cp);
|
||||||
((wxCairoPenData*)m_pen.GetRefData())->Apply(this);
|
((wxCairoPenData*)m_pen.GetRefData())->Apply(this);
|
||||||
@@ -1299,7 +1301,7 @@ void wxCairoContext::DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wx
|
|||||||
wxBitmap bmpSource = bmp; // we need a non-const instance
|
wxBitmap bmpSource = bmp; // we need a non-const instance
|
||||||
unsigned char* buffer = new unsigned char[bw*bh*4];
|
unsigned char* buffer = new unsigned char[bw*bh*4];
|
||||||
wxUint32* data = (wxUint32*)buffer;
|
wxUint32* data = (wxUint32*)buffer;
|
||||||
|
|
||||||
// Create a surface object and copy the bitmap pixel data to it. if the
|
// Create a surface object and copy the bitmap pixel data to it. if the
|
||||||
// image has alpha (or a mask represented as alpha) then we'll use a
|
// image has alpha (or a mask represented as alpha) then we'll use a
|
||||||
// different format and iterator than if it doesn't...
|
// different format and iterator than if it doesn't...
|
||||||
@@ -1309,7 +1311,7 @@ void wxCairoContext::DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wx
|
|||||||
buffer, CAIRO_FORMAT_ARGB32, bw, bh, bw*4);
|
buffer, CAIRO_FORMAT_ARGB32, bw, bh, bw*4);
|
||||||
wxAlphaPixelData pixData(bmpSource, wxPoint(0,0), wxSize(bw, bh));
|
wxAlphaPixelData pixData(bmpSource, wxPoint(0,0), wxSize(bw, bh));
|
||||||
wxCHECK_RET( pixData, wxT("Failed to gain raw access to bitmap data."));
|
wxCHECK_RET( pixData, wxT("Failed to gain raw access to bitmap data."));
|
||||||
|
|
||||||
wxAlphaPixelData::Iterator p(pixData);
|
wxAlphaPixelData::Iterator p(pixData);
|
||||||
for (int y=0; y<bh; y++)
|
for (int y=0; y<bh; y++)
|
||||||
{
|
{
|
||||||
@@ -1324,16 +1326,16 @@ void wxCairoContext::DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wx
|
|||||||
if (alpha == 0)
|
if (alpha == 0)
|
||||||
*data = 0;
|
*data = 0;
|
||||||
else
|
else
|
||||||
*data = ( alpha << 24
|
*data = ( alpha << 24
|
||||||
| (p.Red() * alpha/255) << 16
|
| (p.Red() * alpha/255) << 16
|
||||||
| (p.Green() * alpha/255) << 8
|
| (p.Green() * alpha/255) << 8
|
||||||
| (p.Blue() * alpha/255) );
|
| (p.Blue() * alpha/255) );
|
||||||
++data;
|
++data;
|
||||||
++p;
|
++p;
|
||||||
}
|
}
|
||||||
p = rowStart;
|
p = rowStart;
|
||||||
p.OffsetY(pixData, 1);
|
p.OffsetY(pixData, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // no alpha
|
else // no alpha
|
||||||
{
|
{
|
||||||
@@ -1341,7 +1343,7 @@ void wxCairoContext::DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wx
|
|||||||
buffer, CAIRO_FORMAT_RGB24, bw, bh, bw*4);
|
buffer, CAIRO_FORMAT_RGB24, bw, bh, bw*4);
|
||||||
wxNativePixelData pixData(bmpSource, wxPoint(0,0), wxSize(bw, bh));
|
wxNativePixelData pixData(bmpSource, wxPoint(0,0), wxSize(bw, bh));
|
||||||
wxCHECK_RET( pixData, wxT("Failed to gain raw access to bitmap data."));
|
wxCHECK_RET( pixData, wxT("Failed to gain raw access to bitmap data."));
|
||||||
|
|
||||||
wxNativePixelData::Iterator p(pixData);
|
wxNativePixelData::Iterator p(pixData);
|
||||||
for (int y=0; y<bh; y++)
|
for (int y=0; y<bh; y++)
|
||||||
{
|
{
|
||||||
@@ -1358,12 +1360,12 @@ void wxCairoContext::DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wx
|
|||||||
}
|
}
|
||||||
p = rowStart;
|
p = rowStart;
|
||||||
p.OffsetY(pixData, 1);
|
p.OffsetY(pixData, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PushState();
|
PushState();
|
||||||
|
|
||||||
// In case we're scaling the image by using a width and height different
|
// In case we're scaling the image by using a width and height different
|
||||||
// than the bitmap's size create a pattern transformation on the surface and
|
// than the bitmap's size create a pattern transformation on the surface and
|
||||||
// draw the transformed pattern.
|
// draw the transformed pattern.
|
||||||
@@ -1422,7 +1424,7 @@ void wxCairoContext::DrawText( const wxString &str, wxDouble x, wxDouble y )
|
|||||||
cairo_font_extents_t fe;
|
cairo_font_extents_t fe;
|
||||||
cairo_font_extents(m_context, &fe);
|
cairo_font_extents(m_context, &fe);
|
||||||
cairo_move_to(m_context, x, y+fe.ascent);
|
cairo_move_to(m_context, x, y+fe.ascent);
|
||||||
|
|
||||||
const wxWX2MBbuf buf(str.mb_str(wxConvUTF8));
|
const wxWX2MBbuf buf(str.mb_str(wxConvUTF8));
|
||||||
cairo_show_text(m_context,buf);
|
cairo_show_text(m_context,buf);
|
||||||
#endif
|
#endif
|
||||||
@@ -1445,7 +1447,7 @@ void wxCairoContext::GetTextExtent( const wxString &str, wxDouble *width, wxDoub
|
|||||||
|
|
||||||
#ifdef __WXGTK__
|
#ifdef __WXGTK__
|
||||||
int w, h;
|
int w, h;
|
||||||
|
|
||||||
PangoLayout *layout = pango_cairo_create_layout (m_context);
|
PangoLayout *layout = pango_cairo_create_layout (m_context);
|
||||||
pango_layout_set_font_description( layout, ((wxCairoFontData*)m_font.GetRefData())->GetFont());
|
pango_layout_set_font_description( layout, ((wxCairoFontData*)m_font.GetRefData())->GetFont());
|
||||||
const wxCharBuffer data = str.utf8_str();
|
const wxCharBuffer data = str.utf8_str();
|
||||||
@@ -1482,18 +1484,18 @@ void wxCairoContext::GetTextExtent( const wxString &str, wxDouble *width, wxDoub
|
|||||||
{
|
{
|
||||||
cairo_font_extents_t fe;
|
cairo_font_extents_t fe;
|
||||||
cairo_font_extents(m_context, &fe);
|
cairo_font_extents(m_context, &fe);
|
||||||
|
|
||||||
// some backends have negative descents
|
// some backends have negative descents
|
||||||
|
|
||||||
if ( fe.descent < 0 )
|
if ( fe.descent < 0 )
|
||||||
fe.descent = -fe.descent;
|
fe.descent = -fe.descent;
|
||||||
|
|
||||||
if ( fe.height < (fe.ascent + fe.descent ) )
|
if ( fe.height < (fe.ascent + fe.descent ) )
|
||||||
{
|
{
|
||||||
// some backends are broken re height ... (eg currently ATSUI)
|
// some backends are broken re height ... (eg currently ATSUI)
|
||||||
fe.height = fe.ascent + fe.descent;
|
fe.height = fe.ascent + fe.descent;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (height)
|
if (height)
|
||||||
*height = fe.height;
|
*height = fe.height;
|
||||||
if ( descent )
|
if ( descent )
|
||||||
@@ -1515,11 +1517,59 @@ void wxCairoContext::GetPartialTextExtents(const wxString& text, wxArrayDouble&
|
|||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
void * wxCairoContext::GetNativeContext()
|
void * wxCairoContext::GetNativeContext()
|
||||||
{
|
{
|
||||||
return m_context;
|
return m_context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cairo doesn't support bitwise logical function (a.k.a. ROP, raster output
|
||||||
|
// mode). Cairo supports Porter-Duff compositing operators, but they are quite
|
||||||
|
// different, although in some cases have similar names.
|
||||||
|
bool wxCairoContext::SetLogicalFunction( int function )
|
||||||
|
{
|
||||||
|
if (m_logicalFunction == function)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
cairo_operator_t op;
|
||||||
|
|
||||||
|
switch ( function )
|
||||||
|
{
|
||||||
|
case wxCOPY: // (default) src
|
||||||
|
op = CAIRO_OPERATOR_OVER; // (also default)
|
||||||
|
break;
|
||||||
|
case wxOR: // src OR dst
|
||||||
|
op = CAIRO_OPERATOR_ADD;
|
||||||
|
break;
|
||||||
|
case wxNO_OP: // dst
|
||||||
|
op = CAIRO_OPERATOR_DEST; // ignore the source
|
||||||
|
break;
|
||||||
|
case wxCLEAR: // 0
|
||||||
|
op = CAIRO_OPERATOR_CLEAR;// clear dst
|
||||||
|
break;
|
||||||
|
|
||||||
|
case wxAND: // src AND dst
|
||||||
|
case wxAND_INVERT: // (NOT src) AND dst
|
||||||
|
case wxAND_REVERSE:// src AND (NOT dst)
|
||||||
|
case wxEQUIV: // (NOT src) XOR dst
|
||||||
|
case wxINVERT: // NOT dst
|
||||||
|
case wxNAND: // (NOT src) OR (NOT dst)
|
||||||
|
case wxNOR: // (NOT src) AND (NOT dst)
|
||||||
|
case wxOR_INVERT: // (NOT src) OR dst
|
||||||
|
case wxOR_REVERSE: // src OR (NOT dst)
|
||||||
|
case wxSET: // 1
|
||||||
|
case wxSRC_INVERT: // NOT src
|
||||||
|
//wxXOR does _not_ correspond to CAIRO_OPERATOR_XOR
|
||||||
|
case wxXOR: // src XOR dst
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_logicalFunction = function;
|
||||||
|
cairo_set_operator(m_context, op);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// wxCairoRenderer declaration
|
// wxCairoRenderer declaration
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -1551,7 +1601,7 @@ public :
|
|||||||
|
|
||||||
// Matrix
|
// Matrix
|
||||||
|
|
||||||
virtual wxGraphicsMatrix CreateMatrix( wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0,
|
virtual wxGraphicsMatrix CreateMatrix( wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0,
|
||||||
wxDouble tx=0.0, wxDouble ty=0.0);
|
wxDouble tx=0.0, wxDouble ty=0.0);
|
||||||
|
|
||||||
|
|
||||||
@@ -1560,10 +1610,10 @@ public :
|
|||||||
virtual wxGraphicsBrush CreateBrush(const wxBrush& brush ) ;
|
virtual wxGraphicsBrush CreateBrush(const wxBrush& brush ) ;
|
||||||
|
|
||||||
// sets the brush to a linear gradient, starting at (x1,y1) with color c1 to (x2,y2) with color c2
|
// sets the brush to a linear gradient, starting at (x1,y1) with color c1 to (x2,y2) with color c2
|
||||||
virtual wxGraphicsBrush CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
|
virtual wxGraphicsBrush CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
|
||||||
const wxColour&c1, const wxColour&c2) ;
|
const wxColour&c1, const wxColour&c2) ;
|
||||||
|
|
||||||
// sets the brush to a radial gradient originating at (xo,yc) with color oColor and ends on a circle around (xc,yc)
|
// 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
|
// with radius r and color cColor
|
||||||
virtual wxGraphicsBrush CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
|
virtual wxGraphicsBrush CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
|
||||||
const wxColour &oColor, const wxColour &cColor) ;
|
const wxColour &oColor, const wxColour &cColor) ;
|
||||||
@@ -1577,7 +1627,7 @@ public :
|
|||||||
{
|
{
|
||||||
return wxGraphicsBitmap;
|
return wxGraphicsBitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
// create a subimage from a native image representation
|
// create a subimage from a native image representation
|
||||||
virtual wxGraphicsBitmap CreateSubBitmap( const wxGraphicsBitmap &bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h )
|
virtual wxGraphicsBitmap CreateSubBitmap( const wxGraphicsBitmap &bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h )
|
||||||
{
|
{
|
||||||
@@ -1667,7 +1717,7 @@ wxGraphicsPath wxCairoRenderer::CreatePath()
|
|||||||
|
|
||||||
// Matrix
|
// Matrix
|
||||||
|
|
||||||
wxGraphicsMatrix wxCairoRenderer::CreateMatrix( wxDouble a, wxDouble b, wxDouble c, wxDouble d,
|
wxGraphicsMatrix wxCairoRenderer::CreateMatrix( wxDouble a, wxDouble b, wxDouble c, wxDouble d,
|
||||||
wxDouble tx, wxDouble ty)
|
wxDouble tx, wxDouble ty)
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -1678,7 +1728,7 @@ wxGraphicsMatrix wxCairoRenderer::CreateMatrix( wxDouble a, wxDouble b, wxDouble
|
|||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxGraphicsPen wxCairoRenderer::CreatePen(const wxPen& pen)
|
wxGraphicsPen wxCairoRenderer::CreatePen(const wxPen& pen)
|
||||||
{
|
{
|
||||||
if ( !pen.Ok() || pen.GetStyle() == wxTRANSPARENT )
|
if ( !pen.Ok() || pen.GetStyle() == wxTRANSPARENT )
|
||||||
return wxNullGraphicsPen;
|
return wxNullGraphicsPen;
|
||||||
@@ -1690,7 +1740,7 @@ wxGraphicsPen wxCairoRenderer::CreatePen(const wxPen& pen)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wxGraphicsBrush wxCairoRenderer::CreateBrush(const wxBrush& brush )
|
wxGraphicsBrush wxCairoRenderer::CreateBrush(const wxBrush& brush )
|
||||||
{
|
{
|
||||||
if ( !brush.Ok() || brush.GetStyle() == wxTRANSPARENT )
|
if ( !brush.Ok() || brush.GetStyle() == wxTRANSPARENT )
|
||||||
return wxNullGraphicsBrush;
|
return wxNullGraphicsBrush;
|
||||||
@@ -1703,8 +1753,8 @@ wxGraphicsBrush wxCairoRenderer::CreateBrush(const wxBrush& brush )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// sets the brush to a linear gradient, starting at (x1,y1) with color c1 to (x2,y2) with color c2
|
// sets the brush to a linear gradient, starting at (x1,y1) with color c1 to (x2,y2) with color c2
|
||||||
wxGraphicsBrush wxCairoRenderer::CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
|
wxGraphicsBrush wxCairoRenderer::CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
|
||||||
const wxColour&c1, const wxColour&c2)
|
const wxColour&c1, const wxColour&c2)
|
||||||
{
|
{
|
||||||
wxGraphicsBrush p;
|
wxGraphicsBrush p;
|
||||||
wxCairoBrushData* d = new wxCairoBrushData( this );
|
wxCairoBrushData* d = new wxCairoBrushData( this );
|
||||||
@@ -1713,10 +1763,10 @@ wxGraphicsBrush wxCairoRenderer::CreateLinearGradientBrush( wxDouble x1, wxDoubl
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
// sets the brush to a radial gradient originating at (xo,yc) with color oColor and ends on a circle around (xc,yc)
|
// 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
|
// with radius r and color cColor
|
||||||
wxGraphicsBrush wxCairoRenderer::CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
|
wxGraphicsBrush wxCairoRenderer::CreateRadialGradientBrush( wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
|
||||||
const wxColour &oColor, const wxColour &cColor)
|
const wxColour &oColor, const wxColour &cColor)
|
||||||
{
|
{
|
||||||
wxGraphicsBrush p;
|
wxGraphicsBrush p;
|
||||||
wxCairoBrushData* d = new wxCairoBrushData( this );
|
wxCairoBrushData* d = new wxCairoBrushData( this );
|
||||||
@@ -1726,10 +1776,10 @@ wxGraphicsBrush wxCairoRenderer::CreateRadialGradientBrush( wxDouble xo, wxDoubl
|
|||||||
}
|
}
|
||||||
|
|
||||||
// sets the font
|
// sets the font
|
||||||
wxGraphicsFont wxCairoRenderer::CreateFont( const wxFont &font , const wxColour &col )
|
wxGraphicsFont wxCairoRenderer::CreateFont( const wxFont &font , const wxColour &col )
|
||||||
{
|
{
|
||||||
if ( font.Ok() )
|
if ( font.Ok() )
|
||||||
{
|
{
|
||||||
wxGraphicsFont p;
|
wxGraphicsFont p;
|
||||||
p.SetRefData(new wxCairoFontData( this , font, col ));
|
p.SetRefData(new wxCairoFontData( this , font, col ));
|
||||||
return p;
|
return p;
|
||||||
|
Reference in New Issue
Block a user