Gradients can have matrix transforms too. Updates for Cairo.

This commit is contained in:
Robin Dunn
2019-07-31 19:29:55 -07:00
parent fd0b19f277
commit 7c33d3f969
4 changed files with 113 additions and 51 deletions

View File

@@ -242,7 +242,8 @@ public:
wxGraphicsPenInfo& wxGraphicsPenInfo&
LinearGradient(wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2, LinearGradient(wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
const wxColour& c1, const wxColour& c2) const wxColour& c1, const wxColour& c2,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix)
{ {
m_gradientType = wxGRADIENT_LINEAR; m_gradientType = wxGRADIENT_LINEAR;
m_x1 = x1; m_x1 = x1;
@@ -251,12 +252,14 @@ public:
m_y2 = y2; m_y2 = y2;
m_stops.SetStartColour(c1); m_stops.SetStartColour(c1);
m_stops.SetEndColour(c2); m_stops.SetEndColour(c2);
m_matrix = matrix;
return *this; return *this;
} }
wxGraphicsPenInfo& wxGraphicsPenInfo&
LinearGradient(wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2, LinearGradient(wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
const wxGraphicsGradientStops& stops) const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix)
{ {
m_gradientType = wxGRADIENT_LINEAR; m_gradientType = wxGRADIENT_LINEAR;
m_x1 = x1; m_x1 = x1;
@@ -264,12 +267,14 @@ public:
m_x2 = x2; m_x2 = x2;
m_y2 = y2; m_y2 = y2;
m_stops = stops; m_stops = stops;
m_matrix = matrix;
return *this; return *this;
} }
wxGraphicsPenInfo& wxGraphicsPenInfo&
RadialGradient(wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius, RadialGradient(wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
const wxColour& oColor, const wxColour& cColor) const wxColour& oColor, const wxColour& cColor,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix)
{ {
m_gradientType = wxGRADIENT_RADIAL; m_gradientType = wxGRADIENT_RADIAL;
m_x1 = xo; m_x1 = xo;
@@ -279,12 +284,14 @@ public:
m_radius = radius; m_radius = radius;
m_stops.SetStartColour(oColor); m_stops.SetStartColour(oColor);
m_stops.SetEndColour(cColor); m_stops.SetEndColour(cColor);
m_matrix = matrix;
return *this; return *this;
} }
wxGraphicsPenInfo& wxGraphicsPenInfo&
RadialGradient(wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, RadialGradient(wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc,
wxDouble radius, const wxGraphicsGradientStops& stops) wxDouble radius, const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix)
{ {
m_gradientType = wxGRADIENT_RADIAL; m_gradientType = wxGRADIENT_RADIAL;
m_x1 = xo; m_x1 = xo;
@@ -293,6 +300,7 @@ public:
m_y2 = yc; m_y2 = yc;
m_radius = radius; m_radius = radius;
m_stops = stops; m_stops = stops;
m_matrix = matrix;
return *this; return *this;
} }
@@ -310,6 +318,7 @@ public:
wxDouble GetYC() const { return m_y2; } wxDouble GetYC() const { return m_y2; }
wxDouble GetRadius() const { return m_radius; } wxDouble GetRadius() const { return m_radius; }
const wxGraphicsGradientStops& GetStops() const { return m_stops; } const wxGraphicsGradientStops& GetStops() const { return m_stops; }
const wxGraphicsMatrix& GetMatrix() const { return m_matrix; }
private: private:
wxDouble m_width; wxDouble m_width;
@@ -317,6 +326,7 @@ private:
wxDouble m_x1, m_y1, m_x2, m_y2; // also used for m_xo, m_yo, m_xc, m_yx wxDouble m_x1, m_y1, m_x2, m_y2; // also used for m_xo, m_yo, m_xc, m_yx
wxDouble m_radius; wxDouble m_radius;
wxGraphicsGradientStops m_stops; wxGraphicsGradientStops m_stops;
wxGraphicsMatrix m_matrix;
}; };
@@ -606,11 +616,13 @@ public:
wxGraphicsBrush wxGraphicsBrush
CreateLinearGradientBrush(wxDouble x1, wxDouble y1, CreateLinearGradientBrush(wxDouble x1, wxDouble y1,
wxDouble x2, wxDouble y2, wxDouble x2, wxDouble y2,
const wxColour& c1, const wxColour& c2) const; const wxColour& c1, const wxColour& c2,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix) const;
wxGraphicsBrush wxGraphicsBrush
CreateLinearGradientBrush(wxDouble x1, wxDouble y1, CreateLinearGradientBrush(wxDouble x1, wxDouble y1,
wxDouble x2, wxDouble y2, wxDouble x2, wxDouble y2,
const wxGraphicsGradientStops& stops) const; const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix) const;
// sets the brush to a radial gradient originating at (xo,yc) and ending // sets the brush to a radial gradient originating at (xo,yc) and ending
// on a circle around (xc,yc) with the given radius; the colours may be // on a circle around (xc,yc) with the given radius; the colours may be
@@ -618,12 +630,14 @@ public:
wxGraphicsBrush wxGraphicsBrush
CreateRadialGradientBrush(wxDouble xo, wxDouble yo, CreateRadialGradientBrush(wxDouble xo, wxDouble yo,
wxDouble xc, wxDouble yc, wxDouble radius, wxDouble xc, wxDouble yc, wxDouble radius,
const wxColour& oColor, const wxColour& cColor) const; const wxColour& oColor, const wxColour& cColor,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix) const;
wxGraphicsBrush wxGraphicsBrush
CreateRadialGradientBrush(wxDouble xo, wxDouble yo, CreateRadialGradientBrush(wxDouble xo, wxDouble yo,
wxDouble xc, wxDouble yc, wxDouble radius, wxDouble xc, wxDouble yc, wxDouble radius,
const wxGraphicsGradientStops& stops) const; const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix) const;
// creates a font // creates a font
virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) const; virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) const;
@@ -999,13 +1013,15 @@ public:
virtual wxGraphicsBrush virtual wxGraphicsBrush
CreateLinearGradientBrush(wxDouble x1, wxDouble y1, CreateLinearGradientBrush(wxDouble x1, wxDouble y1,
wxDouble x2, wxDouble y2, wxDouble x2, wxDouble y2,
const wxGraphicsGradientStops& stops) = 0; const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix) = 0;
virtual wxGraphicsBrush virtual wxGraphicsBrush
CreateRadialGradientBrush(wxDouble xo, wxDouble yo, CreateRadialGradientBrush(wxDouble xo, wxDouble yo,
wxDouble xc, wxDouble yc, wxDouble xc, wxDouble yc,
wxDouble radius, wxDouble radius,
const wxGraphicsGradientStops& stops) = 0; const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix) = 0;
// sets the font // sets the font
virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) = 0; virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) = 0;

View File

@@ -644,7 +644,8 @@ public:
wxGraphicsBrush wxGraphicsBrush
CreateLinearGradientBrush(wxDouble x1, wxDouble y1, CreateLinearGradientBrush(wxDouble x1, wxDouble y1,
wxDouble x2, wxDouble y2, wxDouble x2, wxDouble y2,
const wxColour& c1, const wxColour& c2) const; const wxColour& c1, const wxColour& c2,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix) const;
/** /**
@overload @overload
@@ -652,7 +653,8 @@ public:
wxGraphicsBrush wxGraphicsBrush
CreateLinearGradientBrush(wxDouble x1, wxDouble y1, CreateLinearGradientBrush(wxDouble x1, wxDouble y1,
wxDouble x2, wxDouble y2, wxDouble x2, wxDouble y2,
const wxGraphicsGradientStops& stops) const; const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix) const;
/** /**
Creates a native brush with a radial gradient. Creates a native brush with a radial gradient.
@@ -670,7 +672,8 @@ public:
wxDouble xc, wxDouble yc, wxDouble xc, wxDouble yc,
wxDouble radius, wxDouble radius,
const wxColour& oColor, const wxColour& oColor,
const wxColour& cColor) const; const wxColour& cColor,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix) const;
/** /**
@overload @overload
@@ -679,7 +682,8 @@ public:
CreateRadialGradientBrush(wxDouble xo, wxDouble yo, CreateRadialGradientBrush(wxDouble xo, wxDouble yo,
wxDouble xc, wxDouble yc, wxDouble xc, wxDouble yc,
wxDouble radius, wxDouble radius,
const wxGraphicsGradientStops& stops) = 0; const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix) = 0;
/** /**
Sets the brush for filling paths. Sets the brush for filling paths.
@@ -1456,7 +1460,8 @@ public:
wxDouble y1, wxDouble y1,
wxDouble x2, wxDouble x2,
wxDouble y2, wxDouble y2,
const wxGraphicsGradientStops& stops) = 0; const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix) = 0;
/** /**
Creates a native affine transformation matrix from the passed in Creates a native affine transformation matrix from the passed in
@@ -1488,7 +1493,8 @@ public:
virtual wxGraphicsBrush CreateRadialGradientBrush(wxDouble xo, wxDouble yo, virtual wxGraphicsBrush CreateRadialGradientBrush(wxDouble xo, wxDouble yo,
wxDouble xc, wxDouble yc, wxDouble xc, wxDouble yc,
wxDouble radius, wxDouble radius,
const wxGraphicsGradientStops& stops) = 0; const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix) = 0;
/** /**
Extracts a sub-bitmap from an existing bitmap. Extracts a sub-bitmap from an existing bitmap.
@@ -1630,19 +1636,23 @@ public:
wxGraphicsPenInfo& wxGraphicsPenInfo&
LinearGradient(wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2, LinearGradient(wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
const wxColour& c1, const wxColour& c2); const wxColour& c1, const wxColour& c2,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix);
wxGraphicsPenInfo& wxGraphicsPenInfo&
LinearGradient(wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2, LinearGradient(wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2,
const wxGraphicsGradientStops& stops); const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix);
wxGraphicsPenInfo& wxGraphicsPenInfo&
RadialGradient(wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius, RadialGradient(wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, wxDouble radius,
const wxColour& oColor, const wxColour& cColor); const wxColour& oColor, const wxColour& cColor,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix);
wxGraphicsPenInfo& wxGraphicsPenInfo&
RadialGradient(wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc, RadialGradient(wxDouble xo, wxDouble yo, wxDouble xc, wxDouble yc,
wxDouble radius, const wxGraphicsGradientStops& stops); wxDouble radius, const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix);
wxColour GetColour() const; wxColour GetColour() const;
wxBitmap GetStipple() const; wxBitmap GetStipple() const;

View File

@@ -883,13 +883,15 @@ wxGraphicsBrush
wxGraphicsContext::CreateLinearGradientBrush( wxGraphicsContext::CreateLinearGradientBrush(
wxDouble x1, wxDouble y1, wxDouble x1, wxDouble y1,
wxDouble x2, wxDouble y2, wxDouble x2, wxDouble y2,
const wxColour& c1, const wxColour& c2) const const wxColour& c1, const wxColour& c2,
const wxGraphicsMatrix& matrix) const
{ {
return GetRenderer()->CreateLinearGradientBrush return GetRenderer()->CreateLinearGradientBrush
( (
x1, y1, x1, y1,
x2, y2, x2, y2,
wxGraphicsGradientStops(c1,c2) wxGraphicsGradientStops(c1,c2),
matrix
); );
} }
@@ -897,22 +899,15 @@ wxGraphicsBrush
wxGraphicsContext::CreateLinearGradientBrush( wxGraphicsContext::CreateLinearGradientBrush(
wxDouble x1, wxDouble y1, wxDouble x1, wxDouble y1,
wxDouble x2, wxDouble y2, wxDouble x2, wxDouble y2,
const wxGraphicsGradientStops& gradientStops) const const wxGraphicsGradientStops& gradientStops,
const wxGraphicsMatrix& matrix) const
{ {
return GetRenderer()->CreateLinearGradientBrush(x1,y1,x2,y2, gradientStops); return GetRenderer()->CreateLinearGradientBrush
}
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, x1, y1,
xc, yc, radius, x2, y2,
wxGraphicsGradientStops(oColor, cColor) gradientStops,
matrix
); );
} }
@@ -920,13 +915,31 @@ wxGraphicsBrush
wxGraphicsContext::CreateRadialGradientBrush( wxGraphicsContext::CreateRadialGradientBrush(
wxDouble xo, wxDouble yo, wxDouble xo, wxDouble yo,
wxDouble xc, wxDouble yc, wxDouble radius, wxDouble xc, wxDouble yc, wxDouble radius,
const wxGraphicsGradientStops& gradientStops) const const wxColour &oColor, const wxColour &cColor,
const wxGraphicsMatrix& matrix) const
{ {
return GetRenderer()->CreateRadialGradientBrush return GetRenderer()->CreateRadialGradientBrush
( (
xo, yo, xo, yo,
xc, yc, radius, xc, yc, radius,
gradientStops wxGraphicsGradientStops(oColor, cColor),
matrix
);
}
wxGraphicsBrush
wxGraphicsContext::CreateRadialGradientBrush(
wxDouble xo, wxDouble yo,
wxDouble xc, wxDouble yc, wxDouble radius,
const wxGraphicsGradientStops& gradientStops,
const wxGraphicsMatrix& matrix) const
{
return GetRenderer()->CreateRadialGradientBrush
(
xo, yo,
xc, yc, radius,
gradientStops,
matrix
); );
} }

View File

@@ -262,10 +262,12 @@ public:
void CreateLinearGradientPattern(wxDouble x1, wxDouble y1, void CreateLinearGradientPattern(wxDouble x1, wxDouble y1,
wxDouble x2, wxDouble y2, wxDouble x2, wxDouble y2,
const wxGraphicsGradientStops& stops); const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix);
void CreateRadialGradientPattern(wxDouble xo, wxDouble yo, void CreateRadialGradientPattern(wxDouble xo, wxDouble yo,
wxDouble xc, wxDouble yc, wxDouble radius, wxDouble xc, wxDouble yc, wxDouble radius,
const wxGraphicsGradientStops& stops); const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix);
protected: protected:
// Call this to use the given bitmap as stipple. Bitmap must be non-null // Call this to use the given bitmap as stipple. Bitmap must be non-null
@@ -748,10 +750,17 @@ void wxCairoPenBrushBaseData::AddGradientStops(const wxGraphicsGradientStops& st
void void
wxCairoPenBrushBaseData::CreateLinearGradientPattern(wxDouble x1, wxDouble y1, wxCairoPenBrushBaseData::CreateLinearGradientPattern(wxDouble x1, wxDouble y1,
wxDouble x2, wxDouble y2, wxDouble x2, wxDouble y2,
const wxGraphicsGradientStops& stops) const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix)
{ {
m_pattern = cairo_pattern_create_linear(x1,y1,x2,y2); m_pattern = cairo_pattern_create_linear(x1,y1,x2,y2);
if (! matrix.IsNull())
{
cairo_matrix_t m = *((cairo_matrix_t*) matrix.GetNativeMatrix());
cairo_pattern_set_matrix(m_pattern, &m);
}
AddGradientStops(stops); AddGradientStops(stops);
} }
@@ -759,10 +768,17 @@ void
wxCairoPenBrushBaseData::CreateRadialGradientPattern(wxDouble xo, wxDouble yo, wxCairoPenBrushBaseData::CreateRadialGradientPattern(wxDouble xo, wxDouble yo,
wxDouble xc, wxDouble yc, wxDouble xc, wxDouble yc,
wxDouble radius, wxDouble radius,
const wxGraphicsGradientStops& stops) const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix)
{ {
m_pattern = cairo_pattern_create_radial(xo,yo,0.0,xc,yc,radius); m_pattern = cairo_pattern_create_radial(xo,yo,0.0,xc,yc,radius);
if (! matrix.IsNull())
{
cairo_matrix_t m = *((cairo_matrix_t*) matrix.GetNativeMatrix());
cairo_pattern_set_matrix(m_pattern, &m);
}
AddGradientStops(stops); AddGradientStops(stops);
} }
@@ -922,14 +938,16 @@ wxCairoPenData::wxCairoPenData( wxGraphicsRenderer* renderer, const wxGraphicsPe
case wxGRADIENT_LINEAR: case wxGRADIENT_LINEAR:
CreateLinearGradientPattern(info.GetX1(), info.GetY1(), CreateLinearGradientPattern(info.GetX1(), info.GetY1(),
info.GetX2(), info.GetY2(), info.GetX2(), info.GetY2(),
info.GetStops()); info.GetStops(),
info.GetMatrix());
break; break;
case wxGRADIENT_RADIAL: case wxGRADIENT_RADIAL:
CreateRadialGradientPattern(info.GetXO(), info.GetYO(), CreateRadialGradientPattern(info.GetXO(), info.GetYO(),
info.GetXC(), info.GetYC(), info.GetXC(), info.GetYC(),
info.GetRadius(), info.GetRadius(),
info.GetStops()); info.GetStops(),
info.GetMatrix());
break; break;
} }
} }
@@ -2975,13 +2993,15 @@ public :
virtual wxGraphicsBrush virtual wxGraphicsBrush
CreateLinearGradientBrush(wxDouble x1, wxDouble y1, CreateLinearGradientBrush(wxDouble x1, wxDouble y1,
wxDouble x2, wxDouble y2, wxDouble x2, wxDouble y2,
const wxGraphicsGradientStops& stops) wxOVERRIDE; const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix) wxOVERRIDE;
virtual wxGraphicsBrush virtual wxGraphicsBrush
CreateRadialGradientBrush(wxDouble xo, wxDouble yo, CreateRadialGradientBrush(wxDouble xo, wxDouble yo,
wxDouble xc, wxDouble yc, wxDouble xc, wxDouble yc,
wxDouble radius, wxDouble radius,
const wxGraphicsGradientStops& stops) wxOVERRIDE; const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix=wxNullGraphicsMatrix) wxOVERRIDE;
// sets the font // sets the font
virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) wxOVERRIDE ; virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) wxOVERRIDE ;
@@ -3169,12 +3189,13 @@ wxGraphicsBrush wxCairoRenderer::CreateBrush(const wxBrush& brush )
wxGraphicsBrush wxGraphicsBrush
wxCairoRenderer::CreateLinearGradientBrush(wxDouble x1, wxDouble y1, wxCairoRenderer::CreateLinearGradientBrush(wxDouble x1, wxDouble y1,
wxDouble x2, wxDouble y2, wxDouble x2, wxDouble y2,
const wxGraphicsGradientStops& stops) const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix)
{ {
wxGraphicsBrush p; wxGraphicsBrush p;
ENSURE_LOADED_OR_RETURN(p); ENSURE_LOADED_OR_RETURN(p);
wxCairoBrushData* d = new wxCairoBrushData( this ); wxCairoBrushData* d = new wxCairoBrushData( this );
d->CreateLinearGradientPattern(x1, y1, x2, y2, stops); d->CreateLinearGradientPattern(x1, y1, x2, y2, stops, matrix);
p.SetRefData(d); p.SetRefData(d);
return p; return p;
} }
@@ -3182,16 +3203,18 @@ wxCairoRenderer::CreateLinearGradientBrush(wxDouble x1, wxDouble y1,
wxGraphicsBrush wxGraphicsBrush
wxCairoRenderer::CreateRadialGradientBrush(wxDouble xo, wxDouble yo, wxCairoRenderer::CreateRadialGradientBrush(wxDouble xo, wxDouble yo,
wxDouble xc, wxDouble yc, wxDouble r, wxDouble xc, wxDouble yc, wxDouble r,
const wxGraphicsGradientStops& stops) const wxGraphicsGradientStops& stops,
const wxGraphicsMatrix& matrix)
{ {
wxGraphicsBrush p; wxGraphicsBrush p;
ENSURE_LOADED_OR_RETURN(p); ENSURE_LOADED_OR_RETURN(p);
wxCairoBrushData* d = new wxCairoBrushData( this ); wxCairoBrushData* d = new wxCairoBrushData( this );
d->CreateRadialGradientPattern(xo, yo, xc, yc, r, stops); d->CreateRadialGradientPattern(xo, yo, xc, yc, r, stops, matrix);
p.SetRefData(d); p.SetRefData(d);
return p; return p;
} }
wxGraphicsFont wxCairoRenderer::CreateFont( const wxFont &font , const wxColour &col ) wxGraphicsFont wxCairoRenderer::CreateFont( const wxFont &font , const wxColour &col )
{ {
wxGraphicsFont p; wxGraphicsFont p;