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 \r
114 /* See if any parents need this value. */\r
115 if (((SPObjectClass *) filter_primitive_parent_class)->set) {\r
116 ((SPObjectClass *) filter_primitive_parent_class)->set(object, key, value);\r
117 }\r
118 }\r
119 \r
120 /**\r
121 * Receives update notifications.\r
122 */\r
123 static void\r
124 sp_filter_primitive_update(SPObject *object, SPCtx *ctx, guint flags)\r
125 {\r
126 //SPFilterPrimitive *filter_primitive = SP_FILTER_PRIMITIVE(object);\r
127 \r
128 if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |\r
129 SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {\r
130 \r
131 /* do something to trigger redisplay, updates? */\r
132 }\r
133 \r
134 if (((SPObjectClass *) filter_primitive_parent_class)->update) {\r
135 ((SPObjectClass *) filter_primitive_parent_class)->update(object, ctx, flags);\r
136 }\r
137 }\r
138 \r
139 /**\r
140 * Writes its settings to an incoming repr object, if any.\r
141 */\r
142 static Inkscape::XML::Node *\r
143 sp_filter_primitive_write(SPObject *object, Inkscape::XML::Node *repr, guint flags)\r
144 {\r
145 //SPFilterPrimitive *filterPrimitive = SP_FILTER_PRIMITIVE(object);\r
146 \r
147 // Inkscape-only object, not copied during an "plain SVG" dump:\r
148 if (flags & SP_OBJECT_WRITE_EXT) {\r
149 if (repr) {\r
150 // is this sane?\r
151 //repr->mergeFrom(SP_OBJECT_REPR(object), "id");\r
152 } else {\r
153 repr = SP_OBJECT_REPR(object)->duplicate();\r
154 }\r
155 }\r
156 \r
157 if (((SPObjectClass *) filter_primitive_parent_class)->write) {\r
158 ((SPObjectClass *) filter_primitive_parent_class)->write(object, repr, flags);\r
159 }\r
160 \r
161 return repr;\r
162 }\r
163 \r
164 \r
165 /*\r
166 Local Variables:\r
167 mode:c++\r
168 c-file-style:"stroustrup"\r
169 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))\r
170 indent-tabs-mode:nil\r
171 fill-column:99\r
172 End:\r
173 */\r
174 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :\r