1
#define __SP_FETURBULENCE_CPP__
4
* SVG <feTurbulence> implementation.
9
* Felipe CorrĆŖa da Silva Sanches <felipe.sanches@gmail.com>
10
* hugo Rodrigues <haa.rodrigues@gmail.com>
12
* Copyright (C) 2007 Felipe Sanches
13
* Copyright (C) 2006 Hugo Rodrigues
15
* Released under GNU GPL, read the file 'COPYING' for more information
22
#include "attributes.h"
24
#include "turbulence.h"
25
#include "helper-fns.h"
29
#include "display/nr-filter.h"
30
#include "display/nr-filter-turbulence.h"
32
/* FeTurbulence base class */
34
static void sp_feTurbulence_class_init(SPFeTurbulenceClass *klass);
35
static void sp_feTurbulence_init(SPFeTurbulence *feTurbulence);
37
static void sp_feTurbulence_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
38
static void sp_feTurbulence_release(SPObject *object);
39
static void sp_feTurbulence_set(SPObject *object, unsigned int key, gchar const *value);
40
static void sp_feTurbulence_update(SPObject *object, SPCtx *ctx, guint flags);
41
static Inkscape::XML::Node *sp_feTurbulence_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
42
static void sp_feTurbulence_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter);
44
static SPFilterPrimitiveClass *feTurbulence_parent_class;
47
sp_feTurbulence_get_type()
49
static GType feTurbulence_type = 0;
51
if (!feTurbulence_type) {
52
GTypeInfo feTurbulence_info = {
53
sizeof(SPFeTurbulenceClass),
55
(GClassInitFunc) sp_feTurbulence_class_init,
57
sizeof(SPFeTurbulence),
59
(GInstanceInitFunc) sp_feTurbulence_init,
60
NULL, /* value_table */
62
feTurbulence_type = g_type_register_static(SP_TYPE_FILTER_PRIMITIVE, "SPFeTurbulence", &feTurbulence_info, (GTypeFlags)0);
64
return feTurbulence_type;
68
sp_feTurbulence_class_init(SPFeTurbulenceClass *klass)
70
SPObjectClass *sp_object_class = (SPObjectClass *)klass;
71
SPFilterPrimitiveClass * sp_primitive_class = (SPFilterPrimitiveClass *)klass;
73
feTurbulence_parent_class = (SPFilterPrimitiveClass*)g_type_class_peek_parent(klass);
75
sp_object_class->build = sp_feTurbulence_build;
76
sp_object_class->release = sp_feTurbulence_release;
77
sp_object_class->write = sp_feTurbulence_write;
78
sp_object_class->set = sp_feTurbulence_set;
79
sp_object_class->update = sp_feTurbulence_update;
81
sp_primitive_class->build_renderer = sp_feTurbulence_build_renderer;
85
sp_feTurbulence_init(SPFeTurbulence *feTurbulence)
87
feTurbulence->updated=false;
91
* Reads the Inkscape::XML::Node, and initializes SPFeTurbulence variables. For this to get called,
92
* our name must be associated with a repr via "sp_object_type_register". Best done through
93
* sp-object-repr.cpp's repr_name_entries array.
96
sp_feTurbulence_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
98
if (((SPObjectClass *) feTurbulence_parent_class)->build) {
99
((SPObjectClass *) feTurbulence_parent_class)->build(object, document, repr);
102
/*LOAD ATTRIBUTES FROM REPR HERE*/
103
sp_object_read_attr(object, "baseFrequency");
104
sp_object_read_attr(object, "numOctaves");
105
sp_object_read_attr(object, "seed");
106
sp_object_read_attr(object, "stitchTiles");
107
sp_object_read_attr(object, "type");
111
* Drops any allocated memory.
114
sp_feTurbulence_release(SPObject *object)
116
if (((SPObjectClass *) feTurbulence_parent_class)->release)
117
((SPObjectClass *) feTurbulence_parent_class)->release(object);
120
static bool sp_feTurbulence_read_stitchTiles(gchar const *value){
121
if (!value) return false; // 'noStitch' is default
124
if (strncmp(value, "stitch", 6) == 0) return true;
127
if (strncmp(value, "noStitch", 8) == 0) return false;
130
return false; // 'noStitch' is default
133
static NR::FilterTurbulenceType sp_feTurbulence_read_type(gchar const *value){
134
if (!value) return NR::TURBULENCE_TURBULENCE; // 'turbulence' is default
137
if (strncmp(value, "fractalNoise", 12) == 0) return NR::TURBULENCE_FRACTALNOISE;
140
if (strncmp(value, "turbulence", 10) == 0) return NR::TURBULENCE_TURBULENCE;
143
return NR::TURBULENCE_TURBULENCE; // 'turbulence' is default
147
* Sets a specific value in the SPFeTurbulence.
150
sp_feTurbulence_set(SPObject *object, unsigned int key, gchar const *value)
152
SPFeTurbulence *feTurbulence = SP_FETURBULENCE(object);
158
NR::FilterTurbulenceType read_type;
161
/*DEAL WITH SETTING ATTRIBUTES HERE*/
163
case SP_ATTR_BASEFREQUENCY:
164
feTurbulence->baseFrequency.set(value);
165
//From SVG spec: If two <number>s are provided, the first number represents a base frequency in the X direction and the second value represents a base frequency in the Y direction. If one number is provided, then that value is used for both X and Y.
166
if (feTurbulence->baseFrequency.optNumIsSet() == false)
167
feTurbulence->baseFrequency.setOptNumber(feTurbulence->baseFrequency.getNumber());
168
feTurbulence->updated = false;
169
object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
171
case SP_ATTR_NUMOCTAVES:
172
read_int = (int) helperfns_read_number(value);
173
if (read_int != feTurbulence->numOctaves){
174
feTurbulence->numOctaves = read_int;
175
feTurbulence->updated = false;
176
object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
180
read_num = helperfns_read_number(value);
181
if (read_num != feTurbulence->seed){
182
feTurbulence->seed = read_num;
183
feTurbulence->updated = false;
184
object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
187
case SP_ATTR_STITCHTILES:
188
read_bool = sp_feTurbulence_read_stitchTiles(value);
189
if (read_bool != feTurbulence->stitchTiles){
190
feTurbulence->stitchTiles = read_bool;
191
feTurbulence->updated = false;
192
object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
196
read_type = sp_feTurbulence_read_type(value);
197
if (read_type != feTurbulence->type){
198
feTurbulence->type = read_type;
199
feTurbulence->updated = false;
200
object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
204
if (((SPObjectClass *) feTurbulence_parent_class)->set)
205
((SPObjectClass *) feTurbulence_parent_class)->set(object, key, value);
212
* Receives update notifications.
215
sp_feTurbulence_update(SPObject *object, SPCtx *ctx, guint flags)
217
if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
218
SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
220
/* do something to trigger redisplay, updates? */
224
if (((SPObjectClass *) feTurbulence_parent_class)->update) {
225
((SPObjectClass *) feTurbulence_parent_class)->update(object, ctx, flags);
230
* Writes its settings to an incoming repr object, if any.
232
static Inkscape::XML::Node *
233
sp_feTurbulence_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
235
// Inkscape-only object, not copied during an "plain SVG" dump:
236
if (flags & SP_OBJECT_WRITE_EXT) {
239
//repr->mergeFrom(SP_OBJECT_REPR(object), "id");
241
repr = SP_OBJECT_REPR(object)->duplicate(doc);
245
if (((SPObjectClass *) feTurbulence_parent_class)->write) {
246
((SPObjectClass *) feTurbulence_parent_class)->write(object, doc, repr, flags);
252
static void sp_feTurbulence_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter) {
253
g_assert(primitive != NULL);
254
g_assert(filter != NULL);
256
SPFeTurbulence *sp_turbulence = SP_FETURBULENCE(primitive);
258
int primitive_n = filter->add_primitive(NR::NR_FILTER_TURBULENCE);
259
NR::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
260
NR::FilterTurbulence *nr_turbulence = dynamic_cast<NR::FilterTurbulence*>(nr_primitive);
261
g_assert(nr_turbulence != NULL);
263
sp_filter_primitive_renderer_common(primitive, nr_primitive);
265
nr_turbulence->set_baseFrequency(0, sp_turbulence->baseFrequency.getNumber());
266
nr_turbulence->set_baseFrequency(1, sp_turbulence->baseFrequency.getOptNumber());
267
nr_turbulence->set_numOctaves(sp_turbulence->numOctaves);
268
nr_turbulence->set_seed(sp_turbulence->seed);
269
nr_turbulence->set_stitchTiles(sp_turbulence->stitchTiles);
270
nr_turbulence->set_type(sp_turbulence->type);
271
nr_turbulence->set_updated(sp_turbulence->updated);
277
c-file-style:"stroustrup"
278
c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
283
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :