Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
displacementmap.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-or-later
5/*
6 * Authors:
7 * hugo Rodrigues <haa.rodrigues@gmail.com>
8 * Abhishek Sharma
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 "displacementmap.h"
16
17#include "attributes.h" // for SPAttr
18#include "slot-resolver.h" // for SlotResolver
19
20#include "display/nr-filter-displacement-map.h" // for FilterDisplacementMap
21#include "object/filters/sp-filter-primitive.h" // for SPFilterPrimitive
22#include "object/sp-object.h" // for SP_OBJECT_MODIFIED_FLAG
23#include "util/numeric/converters.h" // for read_number
24#include "util/optstr.h" // for assign, to_cstr
25#include "xml/document.h" // for Document
26#include "xml/node.h" // for Node
27
28class SPDocument;
29
30namespace Inkscape {
31class DrawingItem;
32namespace Filters {
33class FilterPrimitive;
34} // namespace Filters
35} // namespace Inkscape
36
46
48{
49 if (!value) return DISPLACEMENTMAP_CHANNEL_ALPHA;
50
51 switch (value[0]) {
52 case 'R':
54 break;
55 case 'G':
57 break;
58 case 'B':
60 break;
61 case 'A':
63 break;
64 default:
65 // error
66 g_warning("Invalid attribute for Channel Selector. Valid modes are 'R', 'G', 'B' or 'A'");
67 break;
68 }
69
70 return DISPLACEMENTMAP_CHANNEL_ALPHA; // default is Alpha Channel
71}
72
73void SPFeDisplacementMap::set(SPAttr key, char const *value)
74{
75 switch (key) {
81 }
82 break;
83 }
89 }
90 break;
91 }
92 case SPAttr::SCALE: {
93 double n_num = value ? Inkscape::Util::read_number(value) : 0.0;
94 if (n_num != scale) {
95 scale = n_num;
97 }
98 break;
99 }
100 case SPAttr::IN2: {
101 if (Inkscape::Util::assign(in2_name, value)) {
104 }
105 break;
106 }
107 default:
109 break;
110 }
111}
112
114{
115 switch (selector) {
117 return "R";
119 return "G";
121 return "B";
123 return "A";
124 default:
125 return nullptr;
126 }
127}
128
130{
131 if (!repr) {
132 repr = doc->createElement("svg:feDisplacementMap");
133 }
134
139
140 SPFilterPrimitive::write(doc, repr, flags);
141
142 return repr;
143}
144
150
151std::unique_ptr<Inkscape::Filters::FilterPrimitive> SPFeDisplacementMap::build_renderer(Inkscape::DrawingItem*) const
152{
153 auto displacement_map = std::make_unique<Inkscape::Filters::FilterDisplacementMap>();
155
156 displacement_map->set_input(1, in2_slot);
157 displacement_map->set_scale(scale);
158 displacement_map->set_channel_selector(0, xChannelSelector);
159 displacement_map->set_channel_selector(1, yChannelSelector);
160
161 return displacement_map;
162}
163
164/*
165 Local Variables:
166 mode:c++
167 c-file-style:"stroustrup"
168 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
169 indent-tabs-mode:nil
170 fill-column:99
171 End:
172*/
173// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
Lookup dictionary for attributes/properties.
SPAttr
Definition attributes.h:27
@ XCHANNELSELECTOR
@ YCHANNELSELECTOR
SVG drawing item for display.
Interface for refcounted XML nodes.
Definition node.h:80
void setAttributeOrRemoveIfEmpty(Inkscape::Util::const_char_ptr key, Inkscape::Util::const_char_ptr value)
Change an attribute of this node.
Definition node.cpp:167
void setAttribute(Util::const_char_ptr key, Util::const_char_ptr value)
Change an attribute of this node.
Definition node.cpp:25
bool setAttributeSvgDouble(Util::const_char_ptr key, double val)
For attributes where an exponent is allowed.
Definition node.cpp:111
SVGLength x
Typed SVG document implementation.
Definition document.h:101
std::optional< std::string > in2_name
FilterDisplacementMapChannelSelector xChannelSelector
Inkscape::XML::Node * write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, unsigned flags) override
void resolve_slots(SlotResolver &) override
FilterDisplacementMapChannelSelector yChannelSelector
std::unique_ptr< Inkscape::Filters::FilterPrimitive > build_renderer(Inkscape::DrawingItem *item) const override
void build(SPDocument *doc, Inkscape::XML::Node *repr) override
void set(SPAttr key, char const *value) override
void build(SPDocument *doc, Inkscape::XML::Node *repr) override
Inkscape::XML::Node * write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, unsigned flags) override
virtual void resolve_slots(SlotResolver &)
void set(SPAttr key, char const *value) override
void build_renderer_common(Inkscape::Filters::FilterPrimitive *primitive) const
Inkscape::XML::Node * repr
Definition sp-object.h:193
void requestModified(unsigned int flags)
Requests that a modification notification signal be emitted later (e.g.
SPDocument * document
Definition sp-object.h:188
void readAttr(char const *key)
Read value of key attribute from XML node into object.
bool read(char const *str)
Utility functions to convert ascii representations to numbers.
static char const * get_channelselector_name(FilterDisplacementMapChannelSelector selector)
static FilterDisplacementMapChannelSelector read_channel_selector(char const *value)
SVG displacement map filter effect.
FilterDisplacementMapChannelSelector
@ DISPLACEMENTMAP_CHANNEL_RED
@ DISPLACEMENTMAP_CHANNEL_BLUE
@ DISPLACEMENTMAP_CHANNEL_GREEN
@ DISPLACEMENTMAP_CHANNEL_ALPHA
auto to_cstr(std::optional< std::string > const &s)
Definition optstr.h:26
bool assign(std::optional< std::string > &a, char const *b)
Definition optstr.h:31
double read_number(gchar const *value, bool warning=true)
Definition converters.h:42
Helper class to stream background task notifications as a series of messages.
static cairo_user_data_key_t key
Document level base class for all SVG filter primitives.
Interface for XML documents.
Definition document.h:43
virtual Node * createElement(char const *name)=0
Interface for XML documents.
Interface for XML nodes.