Code

A simple layout document as to what, why and how is cppification.
[inkscape.git] / src / filters / mergenode.cpp
1 #define __SP_FEMERGENODE_CPP__
3 /** \file
4  * feMergeNode implementation. A feMergeNode contains the name of one
5  * input image for feMerge.
6  */
7 /*
8  * Authors:
9  *   Kees Cook <kees@outflux.net>
10  *   Niko Kiirala <niko@kiirala.com>
11  *
12  * Copyright (C) 2004,2007 authors
13  *
14  * Released under GNU GPL, read the file 'COPYING' for more information
15  */
17 #ifdef HAVE_CONFIG_H
18 # include "config.h"
19 #endif
21 #include "attributes.h"
22 #include "xml/repr.h"
23 #include "mergenode.h"
24 #include "merge.h"
26 static void sp_feMergeNode_class_init(SPFeMergeNodeClass *klass);
27 static void sp_feMergeNode_init(SPFeMergeNode *skeleton);
29 static void sp_feMergeNode_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
30 static void sp_feMergeNode_release(SPObject *object);
31 static void sp_feMergeNode_set(SPObject *object, unsigned int key, gchar const *value);
32 static void sp_feMergeNode_update(SPObject *object, SPCtx *ctx, guint flags);
33 static Inkscape::XML::Node *sp_feMergeNode_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
35 static SPObjectClass *feMergeNode_parent_class;
37 GType
38 sp_feMergeNode_get_type()
39 {
40     static GType feMergeNode_type = 0;
42     if (!feMergeNode_type) {
43         GTypeInfo feMergeNode_info = {
44             sizeof(SPFeMergeNodeClass),
45             NULL, NULL,
46             (GClassInitFunc) sp_feMergeNode_class_init,
47             NULL, NULL,
48             sizeof(SPFeMergeNode),
49             16,
50             (GInstanceInitFunc) sp_feMergeNode_init,
51             NULL,    /* value_table */
52         };
53         feMergeNode_type = g_type_register_static(SP_TYPE_OBJECT, "SPFeMergeNode", &feMergeNode_info, (GTypeFlags)0);
54     }
55     return feMergeNode_type;
56 }
58 static void
59 sp_feMergeNode_class_init(SPFeMergeNodeClass *klass)
60 {
61     //GObjectClass *gobject_class = (GObjectClass *)klass;
62     SPObjectClass *sp_object_class = (SPObjectClass *)klass;
64     feMergeNode_parent_class = (SPObjectClass*)g_type_class_peek_parent(klass);
66     sp_object_class->build = sp_feMergeNode_build;
67     sp_object_class->release = sp_feMergeNode_release;
68     sp_object_class->write = sp_feMergeNode_write;
69     sp_object_class->set = sp_feMergeNode_set;
70     sp_object_class->update = sp_feMergeNode_update;
71 }
73 static void
74 sp_feMergeNode_init(SPFeMergeNode *feMergeNode)
75 {
76     feMergeNode->input = Inkscape::Filters::NR_FILTER_SLOT_NOT_SET;
77 }
79 /**
80  * Reads the Inkscape::XML::Node, and initializes SPFeMergeNode variables.  For this to get called,
81  * our name must be associated with a repr via "sp_object_type_register".  Best done through
82  * sp-object-repr.cpp's repr_name_entries array.
83  */
84 static void
85 sp_feMergeNode_build(SPObject *object, SPDocument */*document*/, Inkscape::XML::Node */*repr*/)
86 {
87     object->readAttr( "in");
88 }
90 /**
91  * Drops any allocated memory.
92  */
93 static void
94 sp_feMergeNode_release(SPObject *object)
95 {
96     /* deal with our children and our selves here */
98     if (((SPObjectClass *) feMergeNode_parent_class)->release)
99         ((SPObjectClass *) feMergeNode_parent_class)->release(object);
102 /**
103  * Sets a specific value in the SPFeMergeNode.
104  */
105 static void
106 sp_feMergeNode_set(SPObject *object, unsigned int key, gchar const *value)
108     SPFeMergeNode *feMergeNode = SP_FEMERGENODE(object);
109     SPFeMerge *parent = SP_FEMERGE(object->parent);
111     if (key == SP_ATTR_IN) {
112         int input = sp_filter_primitive_read_in(parent, value);
113         if (input != feMergeNode->input) {
114             feMergeNode->input = input;
115             object->requestModified(SP_OBJECT_MODIFIED_FLAG);
116         }
117     }
119     /* See if any parents need this value. */
120     if (((SPObjectClass *) feMergeNode_parent_class)->set) {
121         ((SPObjectClass *) feMergeNode_parent_class)->set(object, key, value);
122     }
125 /**
126  * Receives update notifications.
127  */
128 static void
129 sp_feMergeNode_update(SPObject *object, SPCtx *ctx, guint flags)
131     //SPFeMergeNode *feMergeNode = SP_FEMERGENODE(object);
133     if (flags & SP_OBJECT_MODIFIED_FLAG) {
134         object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
135     }
137     if (((SPObjectClass *) feMergeNode_parent_class)->update) {
138         ((SPObjectClass *) feMergeNode_parent_class)->update(object, ctx, flags);
139     }
142 /**
143  * Writes its settings to an incoming repr object, if any.
144  */
145 static Inkscape::XML::Node *
146 sp_feMergeNode_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
148     //SPFeMergeNode *feMergeNode = SP_FEMERGENODE(object);
150     // Inkscape-only object, not copied during an "plain SVG" dump:
151     if (flags & SP_OBJECT_WRITE_EXT) {
152         if (repr) {
153             // is this sane?
154             //repr->mergeFrom(SP_OBJECT_REPR(object), "id");
155         } else {
156             repr = SP_OBJECT_REPR(object)->duplicate(doc);
157         }
158     }
160     if (((SPObjectClass *) feMergeNode_parent_class)->write) {
161         ((SPObjectClass *) feMergeNode_parent_class)->write(object, doc, repr, flags);
162     }
164     return repr;
168 /*
169   Local Variables:
170   mode:c++
171   c-file-style:"stroustrup"
172   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
173   indent-tabs-mode:nil
174   fill-column:99
175   End:
176 */
177 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :