1 #define __SP_FILTER_PRIMITIVE_CPP__\r
2 \r
3 /** \file\r
4 * Superclass for all the filter primitives\r
5 *\r
6 */\r
7 /*\r
8 * Authors:\r
9 * Kees Cook <kees@outflux.net>\r
10 *\r
11 * Copyright (C) 2004 Kees Cook\r
12 *\r
13 * Released under GNU GPL, read the file 'COPYING' for more information\r
14 */\r
15 \r
16 #ifdef HAVE_CONFIG_H\r
17 # include "config.h"\r
18 #endif\r
19 \r
20 #include "attributes.h"\r
21 #include "sp-filter-primitive.h"\r
22 #include "xml/repr.h"\r
23 #include "sp-filter.h"\r
24 \r
25 /* FilterPrimitive base class */\r
26 \r
27 static void sp_filter_primitive_class_init(SPFilterPrimitiveClass *klass);\r
28 static void sp_filter_primitive_init(SPFilterPrimitive *filter_primitive);\r
29 \r
30 static void sp_filter_primitive_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);\r
31 static void sp_filter_primitive_release(SPObject *object);\r
32 static void sp_filter_primitive_set(SPObject *object, unsigned int key, gchar const *value);\r
33 static void sp_filter_primitive_update(SPObject *object, SPCtx *ctx, guint flags);\r
34 static Inkscape::XML::Node *sp_filter_primitive_write(SPObject *object, Inkscape::XML::Node *repr, guint flags);\r
35 \r
36 static SPObjectClass *filter_primitive_parent_class;\r
37 \r
38 GType\r
39 sp_filter_primitive_get_type()\r
40 {\r
41 static GType filter_primitive_type = 0;\r
42 \r
43 if (!filter_primitive_type) {\r
44 GTypeInfo filter_primitive_info = {\r
45 sizeof(SPFilterPrimitiveClass),\r
46 NULL, NULL,\r
47 (GClassInitFunc) sp_filter_primitive_class_init,\r
48 NULL, NULL,\r
49 sizeof(SPFilterPrimitive),\r
50 16,\r
51 (GInstanceInitFunc) sp_filter_primitive_init,\r
52 NULL, /* value_table */\r
53 };\r
54 filter_primitive_type = g_type_register_static(SP_TYPE_OBJECT, "SPFilterPrimitive", &filter_primitive_info, (GTypeFlags)0);\r
55 }\r
56 return filter_primitive_type;\r
57 }\r
58 \r
59 static void\r
60 sp_filter_primitive_class_init(SPFilterPrimitiveClass *klass)\r
61 {\r
62 //GObjectClass *gobject_class = (GObjectClass *)klass;\r
63 SPObjectClass *sp_object_class = (SPObjectClass *)klass;\r
64 \r
65 filter_primitive_parent_class = (SPObjectClass*)g_type_class_peek_parent(klass);\r
66 \r
67 sp_object_class->build = sp_filter_primitive_build;\r
68 sp_object_class->release = sp_filter_primitive_release;\r
69 sp_object_class->write = sp_filter_primitive_write;\r
70 sp_object_class->set = sp_filter_primitive_set;\r
71 sp_object_class->update = sp_filter_primitive_update;\r
72 }\r
73 \r
74 static void\r
75 sp_filter_primitive_init(SPFilterPrimitive *filter_primitive)\r
76 {\r
77 }\r
78 \r
79 /**\r
80 * Reads the Inkscape::XML::Node, and initializes SPFilterPrimitive variables. For this to get called,\r
81 * our name must be associated with a repr via "sp_object_type_register". Best done through\r
82 * sp-object-repr.cpp's repr_name_entries array.\r
83 */\r
84 static void\r
85 sp_filter_primitive_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)\r
86 {\r
87 if (((SPObjectClass *) filter_primitive_parent_class)->build) {\r
88 ((SPObjectClass *) filter_primitive_parent_class)->build(object, document, repr);\r
89 }\r
90 \r
91 if (object->parent)\r
92 add_primitive((SPFilter*)object->parent, (SPFilterPrimitive*)object);\r
93 }\r
94 \r
95 /**\r
96 * Drops any allocated memory.\r
97 */\r
98 static void\r
99 sp_filter_primitive_release(SPObject *object)\r
100 {\r
101 /* deal with our children and our selves here */\r
102 if (((SPObjectClass *) filter_primitive_parent_class)->release)\r
103 ((SPObjectClass *) filter_primitive_parent_class)->release(object);\r
104 }\r
105 \r
106 /**\r
107 * Sets a specific value in the SPFilterPrimitive.\r
108 */\r
109 static void\r
110 sp_filter_primitive_set(SPObject *object, unsigned int key, gchar const *value)\r
111 {\r
112 SPFilterPrimitive *filter_primitive = SP_FILTER_PRIMITIVE(object);\r
113 (void)filter_primitive;\r
114 \r
115 /* See if any parents need this value. */\r
116 if (((SPObjectClass *) filter_primitive_parent_class)->set) {\r
117 ((SPObjectClass *) filter_primitive_parent_class)->set(object, key, value);\r
118 }\r
119 }\r
120 \r
121 /**\r
122 * Receives update notifications.\r
123 */\r
124 static void\r
125 sp_filter_primitive_update(SPObject *object, SPCtx *ctx, guint flags)\r
126 {\r
127 //SPFilterPrimitive *filter_primitive = SP_FILTER_PRIMITIVE(object);\r
128 \r
129 if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |\r
130 SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {\r
131 \r
132 /* do something to trigger redisplay, updates? */\r
133 }\r
134 \r
135 if (((SPObjectClass *) filter_primitive_parent_class)->update) {\r
136 ((SPObjectClass *) filter_primitive_parent_class)->update(object, ctx, flags);\r
137 }\r
138 }\r
139 \r
140 /**\r
141 * Writes its settings to an incoming repr object, if any.\r
142 */\r
143 static Inkscape::XML::Node *\r
144 sp_filter_primitive_write(SPObject *object, Inkscape::XML::Node *repr, guint flags)\r
145 {\r
146 //SPFilterPrimitive *filterPrimitive = SP_FILTER_PRIMITIVE(object);\r
147 \r
148 // Inkscape-only object, not copied during an "plain SVG" dump:\r
149 if (flags & SP_OBJECT_WRITE_EXT) {\r
150 if (repr) {\r
151 // is this sane?\r
152 //repr->mergeFrom(SP_OBJECT_REPR(object), "id");\r
153 } else {\r
154 repr = SP_OBJECT_REPR(object)->duplicate();\r
155 }\r
156 }\r
157 \r
158 if (((SPObjectClass *) filter_primitive_parent_class)->write) {\r
159 ((SPObjectClass *) filter_primitive_parent_class)->write(object, repr, flags);\r
160 }\r
161 \r
162 return repr;\r
163 }\r
164 \r
165 \r
166 /*\r
167 Local Variables:\r
168 mode:c++\r
169 c-file-style:"stroustrup"\r
170 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))\r
171 indent-tabs-mode:nil\r
172 fill-column:99\r
173 End:\r
174 */\r
175 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :\r