diff options
| author | Tavmjong Bah <tavmjong@free.fr> | 2018-01-22 16:19:36 +0000 |
|---|---|---|
| committer | Tavmjong Bah <tavmjong@free.fr> | 2018-01-22 16:19:36 +0000 |
| commit | f723aac5305619d0d906c1faad1fa0eea8dc178f (patch) | |
| tree | 5f0d8f17f18cc6de305b93c9db79db52855a7e15 /src | |
| parent | Add pixmap and data (pointer) members to column. (diff) | |
| download | inkscape-f723aac5305619d0d906c1faad1fa0eea8dc178f.tar.gz inkscape-f723aac5305619d0d906c1faad1fa0eea8dc178f.zip | |
Add functions to return Gdk::Pixbuf's for gradients and gradient stops.
Diffstat (limited to 'src')
| -rw-r--r-- | src/widgets/gradient-image.cpp | 73 | ||||
| -rw-r--r-- | src/widgets/gradient-image.h | 7 |
2 files changed, 80 insertions, 0 deletions
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 <sigc++/sigc++.h> +#include <glibmm/refptr.h> +#include <gdkmm/pixbuf.h> +#include <cairomm/surface.h> #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<Gdk::Pixbuf> +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<Cairo::Surface> sref = Cairo::RefPtr<Cairo::Surface>(new Cairo::Surface(s)); + Glib::RefPtr<Gdk::Pixbuf> pixbuf = + Gdk::Pixbuf::create(sref, 0, 0, width, height); + + cairo_surface_destroy(s); + + return pixbuf; +} + + +Glib::RefPtr<Gdk::Pixbuf> +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<Cairo::Surface> sref = Cairo::RefPtr<Cairo::Surface>(new Cairo::Surface(s)); + Glib::RefPtr<Gdk::Pixbuf> 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) { diff --git a/src/widgets/gradient-image.h b/src/widgets/gradient-image.h index 0d3833441..a1b665f16 100644 --- a/src/widgets/gradient-image.h +++ b/src/widgets/gradient-image.h @@ -14,8 +14,13 @@ */ #include <gtk/gtk.h> +#include <glibmm/refptr.h> class SPGradient; +class SPStop; +namespace Gdk { + class Pixbuf; +} #include <sigc++/connection.h> @@ -41,6 +46,8 @@ GType sp_gradient_image_get_type (void); GtkWidget *sp_gradient_image_new (SPGradient *gradient); GdkPixbuf *sp_gradient_to_pixbuf (SPGradient *gr, int width, int height); +Glib::RefPtr<Gdk::Pixbuf> sp_gradient_to_pixbuf_ref (SPGradient *gr, int width, int height); +Glib::RefPtr<Gdk::Pixbuf> sp_gradstop_to_pixbuf_ref (SPStop *gr, int width, int height); void sp_gradient_image_set_gradient (SPGradientImage *gi, SPGradient *gr); #endif |
