|
Packit Service |
e3b512 |
/* Copyright (C) 2005 The cairomm Development Team
|
|
Packit Service |
e3b512 |
*
|
|
Packit Service |
e3b512 |
* This library is free software; you can redistribute it and/or
|
|
Packit Service |
e3b512 |
* modify it under the terms of the GNU Library General Public
|
|
Packit Service |
e3b512 |
* License as published by the Free Software Foundation; either
|
|
Packit Service |
e3b512 |
* version 2 of the License, or (at your option) any later version.
|
|
Packit Service |
e3b512 |
*
|
|
Packit Service |
e3b512 |
* This library is distributed in the hope that it will be useful,
|
|
Packit Service |
e3b512 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
e3b512 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
e3b512 |
* Library General Public License for more details.
|
|
Packit Service |
e3b512 |
*
|
|
Packit Service |
e3b512 |
* You should have received a copy of the GNU Library General Public
|
|
Packit Service |
e3b512 |
* License along with this library; if not, write to the Free Software
|
|
Packit Service |
e3b512 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
Packit Service |
e3b512 |
* 02110-1301, USA.
|
|
Packit Service |
e3b512 |
*/
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
#include <cairomm/pattern.h>
|
|
Packit Service |
e3b512 |
#include <cairomm/private.h>
|
|
Packit Service |
e3b512 |
#include <cairomm/matrix.h>
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
namespace Cairo
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
Pattern::Pattern()
|
|
Packit Service |
e3b512 |
: m_cobject(nullptr)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
Pattern::Pattern(cairo_pattern_t* cobject, bool has_reference)
|
|
Packit Service |
e3b512 |
: m_cobject(nullptr)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
if(has_reference)
|
|
Packit Service |
e3b512 |
m_cobject = cobject;
|
|
Packit Service |
e3b512 |
else
|
|
Packit Service |
e3b512 |
m_cobject = cairo_pattern_reference(cobject);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
Pattern::~Pattern()
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
if(m_cobject)
|
|
Packit Service |
e3b512 |
cairo_pattern_destroy(m_cobject);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
void Pattern::reference() const
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
cairo_pattern_reference(m_cobject);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
void Pattern::unreference() const
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
cairo_pattern_destroy(m_cobject);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
void Pattern::set_matrix(const Matrix& matrix)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
cairo_pattern_set_matrix(m_cobject, (cairo_matrix_t*)&matrix);
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
void Pattern::get_matrix(Matrix& matrix) const
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
cairo_pattern_get_matrix(m_cobject, (cairo_matrix_t*)&matrix);
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
void Pattern::set_matrix(const cairo_matrix_t& matrix)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
cairo_pattern_set_matrix(m_cobject, (cairo_matrix_t*)&matrix);
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
void Pattern::get_matrix(cairo_matrix_t& matrix) const
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
cairo_pattern_get_matrix(m_cobject, (cairo_matrix_t*)&matrix);
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
Matrix Pattern::get_matrix() const
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
Cairo::Matrix m;
|
|
Packit Service |
e3b512 |
cairo_pattern_get_matrix(m_cobject, (cairo_matrix_t*)&m);
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
return m;
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
PatternType Pattern::get_type() const
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
auto pattern_type = cairo_pattern_get_type(m_cobject);
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
return static_cast<PatternType>(pattern_type);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
void Pattern::set_extend(Extend extend)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
cairo_pattern_set_extend(m_cobject, (cairo_extend_t)extend);
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
Extend Pattern::get_extend() const
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
const auto result = static_cast<Extend>(cairo_pattern_get_extend(m_cobject));
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
return result;
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
SolidPattern::SolidPattern(cairo_pattern_t* cobject, bool has_reference)
|
|
Packit Service |
e3b512 |
: Pattern(cobject, has_reference)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
void
|
|
Packit Service |
e3b512 |
SolidPattern::get_rgba(double& red, double& green,
|
|
Packit Service |
e3b512 |
double& blue, double& alpha) const
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
// ignore the return value since we know that this is a solid color pattern
|
|
Packit Service |
e3b512 |
cairo_pattern_get_rgba(m_cobject, &red, &green, &blue, &alpha);
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
SolidPattern::~SolidPattern()
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
RefPtr<SolidPattern> SolidPattern::create_rgb(double red, double green, double blue)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
auto cobject = cairo_pattern_create_rgb(red, green, blue);
|
|
Packit Service |
e3b512 |
check_status_and_throw_exception(cairo_pattern_status(cobject));
|
|
Packit Service |
e3b512 |
return RefPtr<SolidPattern>(new SolidPattern(cobject, true /* has reference */));
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
RefPtr<SolidPattern> SolidPattern::create_rgba(double red, double green, double blue, double alpha)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
cairo_pattern_t* cobject = cairo_pattern_create_rgba(red, green, blue, alpha);
|
|
Packit Service |
e3b512 |
check_status_and_throw_exception(cairo_pattern_status(cobject));
|
|
Packit Service |
e3b512 |
return RefPtr<SolidPattern>(new SolidPattern(cobject, true /* has reference */));
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
SurfacePattern::SurfacePattern(const RefPtr<Surface>& surface)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
m_cobject = cairo_pattern_create_for_surface(surface->cobj());
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
RefPtr<Surface>
|
|
Packit Service |
e3b512 |
SurfacePattern::get_surface()
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
cairo_surface_t* surface = nullptr;
|
|
Packit Service |
e3b512 |
// we can ignore the return value since we know this is a surface pattern
|
|
Packit Service |
e3b512 |
cairo_pattern_get_surface(const_cast<cairo_pattern_t*>(m_cobject), &surface);
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
return RefPtr<Surface>(new Surface(surface, false /* does not have reference */));
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
RefPtr<const Surface>
|
|
Packit Service |
e3b512 |
SurfacePattern::get_surface() const
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
return const_cast<SurfacePattern*>(this)->get_surface();
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
RefPtr<SurfacePattern> SurfacePattern::create(const RefPtr<Surface>& surface)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
return RefPtr<SurfacePattern>(new SurfacePattern(surface));
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
SurfacePattern::SurfacePattern(cairo_pattern_t* cobject, bool has_reference)
|
|
Packit Service |
e3b512 |
: Pattern(cobject, has_reference)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
SurfacePattern::~SurfacePattern()
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
void SurfacePattern::set_extend(Extend extend)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
Pattern::set_extend(extend);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
Extend SurfacePattern::get_extend() const
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
return Pattern::get_extend();
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
void SurfacePattern::set_filter(Filter filter)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
cairo_pattern_set_filter(m_cobject, (cairo_filter_t)filter);
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
Filter SurfacePattern::get_filter() const
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
auto result = static_cast<Filter>(cairo_pattern_get_filter(m_cobject));
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
return result;
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
Gradient::Gradient()
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
Gradient::Gradient(cairo_pattern_t* cobject, bool has_reference)
|
|
Packit Service |
e3b512 |
: Pattern(cobject, has_reference)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
Gradient::~Gradient()
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
void Gradient::add_color_stop_rgb(double offset, double red, double green, double blue)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
cairo_pattern_add_color_stop_rgb(m_cobject, offset, red, green, blue);
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
void Gradient::add_color_stop_rgba(double offset, double red, double green, double blue, double alpha)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
cairo_pattern_add_color_stop_rgba(m_cobject, offset, red, green, blue, alpha);
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
std::vector<ColorStop>
|
|
Packit Service |
e3b512 |
Gradient::get_color_stops() const
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
std::vector<ColorStop> stops;
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
int num_stops = 0;
|
|
Packit Service |
e3b512 |
// we can ignore the return value since we know this is a gradient pattern
|
|
Packit Service |
e3b512 |
cairo_pattern_get_color_stop_count(m_cobject, &num_stops);
|
|
Packit Service |
e3b512 |
// since we know the total number of stops, we can avoid re-allocation with
|
|
Packit Service |
e3b512 |
// each addition to the vector by pre-allocating the required number
|
|
Packit Service |
e3b512 |
stops.reserve(num_stops);
|
|
Packit Service |
e3b512 |
for(int i = 0; i < num_stops; ++i)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
ColorStop stop;
|
|
Packit Service |
e3b512 |
cairo_pattern_get_color_stop_rgba(m_cobject, i, &stop.offset, &stop.red,
|
|
Packit Service |
e3b512 |
&stop.green, &stop.blue, &stop.alpha);
|
|
Packit Service |
e3b512 |
stops.push_back(stop);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
return stops;
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
LinearGradient::LinearGradient(double x0, double y0, double x1, double y1)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
m_cobject = cairo_pattern_create_linear(x0, y0, x1, y1);
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
void
|
|
Packit Service |
e3b512 |
LinearGradient::get_linear_points(double &x0, double &y0,
|
|
Packit Service |
e3b512 |
double &x1, double &y1) const
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
// ignore the return value since we know that this is a linear gradient
|
|
Packit Service |
e3b512 |
// pattern
|
|
Packit Service |
e3b512 |
cairo_pattern_get_linear_points(m_cobject, &x0, &y0, &x1, &y1;;
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
RefPtr<LinearGradient> LinearGradient::create(double x0, double y0, double x1, double y1)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
return RefPtr<LinearGradient>(new LinearGradient(x0, y0, x1, y1));
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
LinearGradient::LinearGradient(cairo_pattern_t* cobject, bool has_reference)
|
|
Packit Service |
e3b512 |
: Gradient(cobject, has_reference)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
LinearGradient::~LinearGradient()
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
RadialGradient::RadialGradient(double cx0, double cy0, double radius0, double cx1, double cy1, double radius1)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
m_cobject = cairo_pattern_create_radial(cx0, cy0, radius0, cx1, cy1, radius1);
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
void
|
|
Packit Service |
e3b512 |
RadialGradient::get_radial_circles(double& x0, double& y0, double& r0,
|
|
Packit Service |
e3b512 |
double& x1, double& y1, double& r1) const
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
// ignore the return value since we know that this is a radial gradient
|
|
Packit Service |
e3b512 |
// pattern
|
|
Packit Service |
e3b512 |
cairo_pattern_get_radial_circles(const_cast<cairo_pattern_t*>(m_cobject),
|
|
Packit Service |
e3b512 |
&x0, &y0, &r0, &x1, &y1, &r1;;
|
|
Packit Service |
e3b512 |
check_object_status_and_throw_exception(*this);
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
RefPtr<RadialGradient> RadialGradient::create(double cx0, double cy0, double radius0, double cx1, double cy1, double radius1)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
return RefPtr<RadialGradient>(new RadialGradient(cx0, cy0, radius0, cx1, cy1, radius1));
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
RadialGradient::RadialGradient(cairo_pattern_t* cobject, bool has_reference)
|
|
Packit Service |
e3b512 |
: Gradient(cobject, has_reference)
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
RadialGradient::~RadialGradient()
|
|
Packit Service |
e3b512 |
{
|
|
Packit Service |
e3b512 |
}
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
} //namespace Cairo
|
|
Packit Service |
e3b512 |
|
|
Packit Service |
e3b512 |
// vim: ts=2 sw=2 et
|