From f723aac5305619d0d906c1faad1fa0eea8dc178f Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Mon, 22 Jan 2018 17:19:36 +0100 Subject: Add functions to return Gdk::Pixbuf's for gradients and gradient stops. --- src/widgets/gradient-image.cpp | 73 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) (limited to 'src/widgets/gradient-image.cpp') diff --git a/src/widgets/gradient-image.cpp b/src/widgets/gradient-image.cpp index dff564feb..638cffda6 100644 --- a/src/widgets/gradient-image.cpp +++ b/src/widgets/gradient-image.cpp @@ -11,11 +11,15 @@ */ #include +#include +#include +#include #include "display/cairo-utils.h" #include "gradient-image.h" #include "macros.h" #include "sp-gradient.h" +#include "sp-stop.h" #define VBLOCK 16 @@ -153,6 +157,75 @@ sp_gradient_to_pixbuf (SPGradient *gr, int width, int height) } +Glib::RefPtr +sp_gradient_to_pixbuf_ref (SPGradient *gr, int width, int height) +{ + cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); + cairo_t *ct = cairo_create(s); + + cairo_pattern_t *check = ink_cairo_pattern_create_checkerboard(); + cairo_set_source(ct, check); + cairo_paint(ct); + cairo_pattern_destroy(check); + + if (gr) { + cairo_pattern_t *p = sp_gradient_create_preview_pattern(gr, width); + cairo_set_source(ct, p); + cairo_paint(ct); + cairo_pattern_destroy(p); + } + + cairo_destroy(ct); + cairo_surface_flush(s); + + Cairo::RefPtr sref = Cairo::RefPtr(new Cairo::Surface(s)); + Glib::RefPtr pixbuf = + Gdk::Pixbuf::create(sref, 0, 0, width, height); + + cairo_surface_destroy(s); + + return pixbuf; +} + + +Glib::RefPtr +sp_gradstop_to_pixbuf_ref (SPStop *stop, int width, int height) +{ + cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); + cairo_t *ct = cairo_create(s); + + /* Checkerboard background */ + cairo_pattern_t *check = ink_cairo_pattern_create_checkerboard(); + cairo_rectangle(ct, 0, 0, width, height); + cairo_set_source(ct, check); + cairo_fill_preserve(ct); + cairo_pattern_destroy(check); + + if (stop) { + /* Alpha area */ + cairo_rectangle(ct, 0, 0, width/2, height); + ink_cairo_set_source_rgba32(ct, stop->get_rgba32()); + cairo_fill(ct); + + /* Solid area */ + cairo_rectangle(ct, width/2, 0, width, height); + ink_cairo_set_source_rgba32(ct, stop->get_rgba32() | 0xff); + cairo_fill(ct); + } + + cairo_destroy(ct); + cairo_surface_flush(s); + + Cairo::RefPtr sref = Cairo::RefPtr(new Cairo::Surface(s)); + Glib::RefPtr pixbuf = + Gdk::Pixbuf::create(sref, 0, 0, width, height); + + cairo_surface_destroy(s); + + return pixbuf; +} + + void sp_gradient_image_set_gradient (SPGradientImage *image, SPGradient *gradient) { -- cgit v1.2.3