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