16
16
#include <string.h>
17
#include "libnr/nr-pixblock-pattern.h"
17
#include "sp-paint-server-reference.h"
18
18
#include "sp-paint-server.h"
20
20
#include "sp-gradient.h"
21
21
#include "xml/node.h"
23
23
static void sp_paint_server_class_init(SPPaintServerClass *psc);
24
static void sp_paint_server_init(SPPaintServer *ps);
26
static void sp_paint_server_release(SPObject *object);
28
static void sp_painter_stale_fill(SPPainter *painter, NRPixBlock *pb);
25
static cairo_pattern_t *sp_paint_server_create_dummy_pattern(SPPaintServer *ps, cairo_t *ct, Geom::OptRect const &bbox, double opacity);
30
27
static SPObjectClass *parent_class;
31
static GSList *stale_painters = NULL;
33
GType sp_paint_server_get_type (void)
29
SPPaintServer *SPPaintServerReference::getObject() const
31
return static_cast<SPPaintServer *>(URIReference::getObject());
34
bool SPPaintServerReference::_acceptObject(SPObject *obj) const
36
return SP_IS_PAINT_SERVER(obj);
39
GType SPPaintServer::get_type(void)
35
41
static GType type = 0;
54
60
static void sp_paint_server_class_init(SPPaintServerClass *psc)
56
SPObjectClass *sp_object_class = (SPObjectClass *) psc;
57
sp_object_class->release = sp_paint_server_release;
62
psc->pattern_new = sp_paint_server_create_dummy_pattern;
58
64
parent_class = (SPObjectClass *) g_type_class_ref(SP_TYPE_OBJECT);
61
static void sp_paint_server_init(SPPaintServer *ps)
66
static void sp_paint_server_release(SPObject *object)
68
SPPaintServer *ps = SP_PAINT_SERVER(object);
70
while (ps->painters) {
71
SPPainter *painter = ps->painters;
72
ps->painters = painter->next;
73
stale_painters = g_slist_prepend(stale_painters, painter);
75
painter->server = NULL;
76
painter->fill = sp_painter_stale_fill;
79
if (((SPObjectClass *) parent_class)->release) {
80
((SPObjectClass *) parent_class)->release(object);
84
SPPainter *sp_paint_server_painter_new(SPPaintServer *ps,
85
Geom::Matrix const &full_transform,
86
Geom::Matrix const &parent_transform,
67
void SPPaintServer::init(SPPaintServer * /*ps*/)
71
cairo_pattern_t *sp_paint_server_create_pattern(SPPaintServer *ps,
73
Geom::OptRect const &bbox,
89
76
g_return_val_if_fail(ps != NULL, NULL);
90
77
g_return_val_if_fail(SP_IS_PAINT_SERVER(ps), NULL);
91
g_return_val_if_fail(bbox != NULL, NULL);
93
SPPainter *painter = NULL;
94
SPPaintServerClass *psc = (SPPaintServerClass *) G_OBJECT_GET_CLASS(ps);
95
if ( psc->painter_new ) {
96
painter = (*psc->painter_new)(ps, full_transform, parent_transform, bbox);
100
painter->next = ps->painters;
101
painter->server = ps;
102
painter->type = (SPPainterType) G_OBJECT_TYPE(ps);
103
ps->painters = painter;
109
static void sp_paint_server_painter_free(SPPaintServer *ps, SPPainter *painter)
111
g_return_if_fail(ps != NULL);
112
g_return_if_fail(SP_IS_PAINT_SERVER(ps));
113
g_return_if_fail(painter != NULL);
115
SPPaintServerClass *psc = (SPPaintServerClass *) G_OBJECT_GET_CLASS(ps);
118
for (SPPainter *p = ps->painters; p != NULL; p = p->next) {
123
ps->painters = p->next;
126
if (psc->painter_free) {
127
(*psc->painter_free) (ps, painter);
134
g_assert_not_reached();
137
SPPainter *sp_painter_free(SPPainter *painter)
139
g_return_val_if_fail(painter != NULL, NULL);
141
if (painter->server) {
142
sp_paint_server_painter_free(painter->server, painter);
144
SPPaintServerClass *psc = (SPPaintServerClass *) g_type_class_ref(painter->type);
145
if (psc->painter_free)
146
(*psc->painter_free)(NULL, painter);
147
stale_painters = g_slist_remove(stale_painters, painter);
153
static void sp_painter_stale_fill(SPPainter */*painter*/, NRPixBlock *pb)
155
nr_pixblock_render_gray_noise(pb, NULL);
79
cairo_pattern_t *cp = NULL;
80
SPPaintServerClass *psc = (SPPaintServerClass *) G_OBJECT_GET_CLASS(ps);
81
if ( psc->pattern_new ) {
82
cp = (*psc->pattern_new)(ps, ct, bbox, opacity);
88
static cairo_pattern_t *
89
sp_paint_server_create_dummy_pattern(SPPaintServer */*ps*/,
91
Geom::OptRect const &/*bbox*/,
94
cairo_pattern_t *cp = cairo_pattern_create_rgb(1.0, 0.0, 1.0);
158
98
bool SPPaintServer::isSwatch() const
161
if (SP_IS_GRADIENT(this)) {
162
SPGradient *grad = SP_GRADIENT(this);
163
if ( SP_GRADIENT_HAS_STOPS(grad) ) {
164
gchar const * attr = repr->attribute("osb:paint");
165
if (attr && !strcmp(attr, "solid")) {
173
103
bool SPPaintServer::isSolid() const
175
105
bool solid = false;
176
if (SP_IS_GRADIENT(this)) {
106
if (swatch && SP_IS_GRADIENT(this)) {
177
107
SPGradient *grad = SP_GRADIENT(this);
178
if ( SP_GRADIENT_HAS_STOPS(grad) && (grad->getStopCount() == 0) ) {
179
gchar const * attr = repr->attribute("osb:paint");
180
if (attr && !strcmp(attr, "solid")) {
108
if ( grad->hasStops() && (grad->getStopCount() == 0) ) {