bb51f55bed0f416a1f35f25d642af1700343b22e
1 #define __SP_FECOMPONENTTRANSFER_CPP__
3 /** \file
4 * SVG <feComponentTransfer> implementation.
5 *
6 */
7 /*
8 * Authors:
9 * hugo Rodrigues <haa.rodrigues@gmail.com>
10 *
11 * Copyright (C) 2006 Hugo Rodrigues
12 *
13 * Released under GNU GPL, read the file 'COPYING' for more information
14 */
16 #ifdef HAVE_CONFIG_H
17 # include "config.h"
18 #endif
20 #include "attributes.h"
21 #include "svg/svg.h"
22 #include "sp-fecomponenttransfer.h"
23 #include "xml/repr.h"
24 #include "display/nr-filter-component-transfer.h"
26 /* FeComponentTransfer base class */
28 static void sp_feComponentTransfer_class_init(SPFeComponentTransferClass *klass);
29 static void sp_feComponentTransfer_init(SPFeComponentTransfer *feComponentTransfer);
31 static void sp_feComponentTransfer_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
32 static void sp_feComponentTransfer_release(SPObject *object);
33 static void sp_feComponentTransfer_set(SPObject *object, unsigned int key, gchar const *value);
34 static void sp_feComponentTransfer_update(SPObject *object, SPCtx *ctx, guint flags);
35 static Inkscape::XML::Node *sp_feComponentTransfer_write(SPObject *object, Inkscape::XML::Node *repr, guint flags);
37 static SPFilterPrimitiveClass *feComponentTransfer_parent_class;
39 GType
40 sp_feComponentTransfer_get_type()
41 {
42 static GType feComponentTransfer_type = 0;
44 if (!feComponentTransfer_type) {
45 GTypeInfo feComponentTransfer_info = {
46 sizeof(SPFeComponentTransferClass),
47 NULL, NULL,
48 (GClassInitFunc) sp_feComponentTransfer_class_init,
49 NULL, NULL,
50 sizeof(SPFeComponentTransfer),
51 16,
52 (GInstanceInitFunc) sp_feComponentTransfer_init,
53 NULL, /* value_table */
54 };
55 feComponentTransfer_type = g_type_register_static(SP_TYPE_FILTER_PRIMITIVE, "SPFeComponentTransfer", &feComponentTransfer_info, (GTypeFlags)0);
56 }
57 return feComponentTransfer_type;
58 }
60 static void
61 sp_feComponentTransfer_class_init(SPFeComponentTransferClass *klass)
62 {
63 SPObjectClass *sp_object_class = (SPObjectClass *)klass;
65 feComponentTransfer_parent_class = (SPFilterPrimitiveClass*)g_type_class_peek_parent(klass);
67 sp_object_class->build = sp_feComponentTransfer_build;
68 sp_object_class->release = sp_feComponentTransfer_release;
69 sp_object_class->write = sp_feComponentTransfer_write;
70 sp_object_class->set = sp_feComponentTransfer_set;
71 sp_object_class->update = sp_feComponentTransfer_update;
72 }
74 static void
75 sp_feComponentTransfer_init(SPFeComponentTransfer *feComponentTransfer)
76 {
77 //Setting default values:
78 //TODO: tableValues = "" (empty list);
79 feComponentTransfer->slope = 1;
80 feComponentTransfer->intercept = 0;
81 feComponentTransfer->amplitude = 1;
82 feComponentTransfer->exponent = 1;
83 feComponentTransfer->offset = 0;
84 // feComponentTransfer->type = NR::COMPONENTTRANSFER_TYPE_ERROR;
85 }
87 /**
88 * Reads the Inkscape::XML::Node, and initializes SPFeComponentTransfer variables. For this to get called,
89 * our name must be associated with a repr via "sp_object_type_register". Best done through
90 * sp-object-repr.cpp's repr_name_entries array.
91 */
92 static void
93 sp_feComponentTransfer_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
94 {
95 if (((SPObjectClass *) feComponentTransfer_parent_class)->build) {
96 ((SPObjectClass *) feComponentTransfer_parent_class)->build(object, document, repr);
97 }
99 /*LOAD ATTRIBUTES FROM REPR HERE*/
100 sp_object_read_attr(object, "type");
101 sp_object_read_attr(object, "tableValues");
102 sp_object_read_attr(object, "slope");
103 sp_object_read_attr(object, "intercept");
104 sp_object_read_attr(object, "amplitude");
105 sp_object_read_attr(object, "exponent");
106 sp_object_read_attr(object, "offset");
107 }
109 /**
110 * Drops any allocated memory.
111 */
112 static void
113 sp_feComponentTransfer_release(SPObject *object)
114 {
115 if (((SPObjectClass *) feComponentTransfer_parent_class)->release)
116 ((SPObjectClass *) feComponentTransfer_parent_class)->release(object);
117 }
119 static NR::FilterComponentTransferType sp_feComponenttransfer_read_type(gchar const *value){
120 if (!value) return NR::COMPONENTTRANSFER_TYPE_ERROR; //type attribute is REQUIRED.
121 switch(value[0]){
122 case 'i':
123 if (strncmp(value, "identity", 8) == 0) return NR::COMPONENTTRANSFER_TYPE_IDENTITY;
124 break;
125 case 't':
126 if (strncmp(value, "table", 5) == 0) return NR::COMPONENTTRANSFER_TYPE_TABLE;
127 break;
128 case 'd':
129 if (strncmp(value, "discrete", 8) == 0) return NR::COMPONENTTRANSFER_TYPE_DISCRETE;
130 break;
131 case 'l':
132 if (strncmp(value, "linear", 6) == 0) return NR::COMPONENTTRANSFER_TYPE_LINEAR;
133 break;
134 case 'g':
135 if (strncmp(value, "gamma", 5) == 0) return NR::COMPONENTTRANSFER_TYPE_GAMMA;
136 break;
137 }
138 return NR::COMPONENTTRANSFER_TYPE_ERROR; //type attribute is REQUIRED.
139 }
141 /**
142 * Sets a specific value in the SPFeComponentTransfer.
143 */
144 static void
145 sp_feComponentTransfer_set(SPObject *object, unsigned int key, gchar const *value)
146 {
147 SPFeComponentTransfer *feComponentTransfer = SP_FECOMPONENTTRANSFER(object);
148 (void)feComponentTransfer;
150 NR::FilterComponentTransferType type;
151 switch(key) {
152 case SP_ATTR_TYPE:
153 type = sp_feComponenttransfer_read_type(value);
154 if(type != feComponentTransfer->type) {
155 feComponentTransfer->type = type;
156 object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
157 }
158 break;
159 /*DEAL WITH SETTING ATTRIBUTES HERE*/
160 default:
161 if (((SPObjectClass *) feComponentTransfer_parent_class)->set)
162 ((SPObjectClass *) feComponentTransfer_parent_class)->set(object, key, value);
163 break;
164 }
166 }
168 /**
169 * Receives update notifications.
170 */
171 static void
172 sp_feComponentTransfer_update(SPObject *object, SPCtx *ctx, guint flags)
173 {
174 if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
175 SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
177 /* do something to trigger redisplay, updates? */
179 }
181 if (((SPObjectClass *) feComponentTransfer_parent_class)->update) {
182 ((SPObjectClass *) feComponentTransfer_parent_class)->update(object, ctx, flags);
183 }
184 }
186 /**
187 * Writes its settings to an incoming repr object, if any.
188 */
189 static Inkscape::XML::Node *
190 sp_feComponentTransfer_write(SPObject *object, Inkscape::XML::Node *repr, guint flags)
191 {
192 // Inkscape-only object, not copied during an "plain SVG" dump:
193 if (flags & SP_OBJECT_WRITE_EXT) {
194 if (repr) {
195 // is this sane?
196 //repr->mergeFrom(SP_OBJECT_REPR(object), "id");
197 } else {
198 repr = SP_OBJECT_REPR(object)->duplicate(NULL); // FIXME
199 }
200 }
202 if (((SPObjectClass *) feComponentTransfer_parent_class)->write) {
203 ((SPObjectClass *) feComponentTransfer_parent_class)->write(object, repr, flags);
204 }
206 return repr;
207 }
210 /*
211 Local Variables:
212 mode:c++
213 c-file-style:"stroustrup"
214 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
215 indent-tabs-mode:nil
216 fill-column:99
217 End:
218 */
219 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :