1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /** \file
3  * SVG <feMerge> implementation.
4  *
5  */
6 /*
7  * Authors:
8  *   hugo Rodrigues <haa.rodrigues@gmail.com>
9  *
10  * Copyright (C) 2006 Hugo Rodrigues
11  *
12  * Released under GNU GPL v2+, read the file 'COPYING' for more information.
13  */
14 
15 #include "attributes.h"
16 #include "svg/svg.h"
17 #include "xml/repr.h"
18 
19 #include "merge.h"
20 #include "mergenode.h"
21 #include "display/nr-filter.h"
22 #include "display/nr-filter-merge.h"
23 
SPFeMerge()24 SPFeMerge::SPFeMerge() : SPFilterPrimitive() {
25 }
26 
27 SPFeMerge::~SPFeMerge() = default;
28 
29 /**
30  * Reads the Inkscape::XML::Node, and initializes SPFeMerge variables.  For this to get called,
31  * our name must be associated with a repr via "sp_object_type_register".  Best done through
32  * sp-object-repr.cpp's repr_name_entries array.
33  */
build(SPDocument * document,Inkscape::XML::Node * repr)34 void SPFeMerge::build(SPDocument *document, Inkscape::XML::Node *repr) {
35 	SPFilterPrimitive::build(document, repr);
36 }
37 
38 /**
39  * Drops any allocated memory.
40  */
release()41 void SPFeMerge::release() {
42 	SPFilterPrimitive::release();
43 }
44 
45 /**
46  * Sets a specific value in the SPFeMerge.
47  */
set(SPAttr key,gchar const * value)48 void SPFeMerge::set(SPAttr key, gchar const *value) {
49     switch(key) {
50 	/*DEAL WITH SETTING ATTRIBUTES HERE*/
51         default:
52         	SPFilterPrimitive::set(key, value);
53             break;
54     }
55 }
56 
57 /**
58  * Receives update notifications.
59  */
update(SPCtx * ctx,guint flags)60 void SPFeMerge::update(SPCtx *ctx, guint flags) {
61     if (flags & SP_OBJECT_MODIFIED_FLAG) {
62         this->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
63     }
64 
65     SPFilterPrimitive::update(ctx, flags);
66 }
67 
68 /**
69  * Writes its settings to an incoming repr object, if any.
70  */
write(Inkscape::XML::Document * doc,Inkscape::XML::Node * repr,guint flags)71 Inkscape::XML::Node* SPFeMerge::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) {
72     /* TODO: Don't just clone, but create a new repr node and write all
73      * relevant values into it. And child nodes, too! */
74     if (!repr) {
75         repr = this->getRepr()->duplicate(doc);
76     }
77 
78 
79     SPFilterPrimitive::write(doc, repr, flags);
80 
81     return repr;
82 }
83 
build_renderer(Inkscape::Filters::Filter * filter)84 void SPFeMerge::build_renderer(Inkscape::Filters::Filter* filter) {
85     g_assert(filter != nullptr);
86 
87     int primitive_n = filter->add_primitive(Inkscape::Filters::NR_FILTER_MERGE);
88     Inkscape::Filters::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
89     Inkscape::Filters::FilterMerge *nr_merge = dynamic_cast<Inkscape::Filters::FilterMerge*>(nr_primitive);
90     g_assert(nr_merge != nullptr);
91 
92     this->renderer_common(nr_primitive);
93 
94     int in_nr = 0;
95 
96     for(auto& input: children) {
97         if (SP_IS_FEMERGENODE(&input)) {
98             SPFeMergeNode *node = SP_FEMERGENODE(&input);
99             nr_merge->set_input(in_nr, node->input);
100             in_nr++;
101         }
102     }
103 }
104 
105 
106 /*
107   Local Variables:
108   mode:c++
109   c-file-style:"stroustrup"
110   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
111   indent-tabs-mode:nil
112   fill-column:99
113   End:
114 */
115 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
116