~centralelyon2010/inkscape/imagelinks2

« back to all changes in this revision

Viewing changes to src/sp-femorphology.cpp

  • Committer: Ted Gould
  • Date: 2008-11-21 05:24:08 UTC
  • Revision ID: ted@canonical.com-20081121052408-tilucis2pjrrpzxx
MergeĀ fromĀ fe-moved

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#define __SP_FEMORPHOLOGY_CPP__
2
 
 
3
 
/** \file
4
 
 * SVG <feMorphology> implementation.
5
 
 *
6
 
 */
7
 
/*
8
 
 * Authors:
9
 
 *   Felipe Sanches <felipe.sanches@gmail.com>
10
 
 *   Hugo Rodrigues <haa.rodrigues@gmail.com>
11
 
 *
12
 
 * Copyright (C) 2006 Hugo Rodrigues
13
 
 *
14
 
 * Released under GNU GPL, read the file 'COPYING' for more information
15
 
 */
16
 
 
17
 
#ifdef HAVE_CONFIG_H
18
 
# include "config.h"
19
 
#endif
20
 
 
21
 
#include <string.h>
22
 
 
23
 
#include "attributes.h"
24
 
#include "svg/svg.h"
25
 
#include "sp-femorphology.h"
26
 
#include "xml/repr.h"
27
 
#include "display/nr-filter-morphology.h"
28
 
 
29
 
/* FeMorphology base class */
30
 
 
31
 
static void sp_feMorphology_class_init(SPFeMorphologyClass *klass);
32
 
static void sp_feMorphology_init(SPFeMorphology *feMorphology);
33
 
 
34
 
static void sp_feMorphology_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
35
 
static void sp_feMorphology_release(SPObject *object);
36
 
static void sp_feMorphology_set(SPObject *object, unsigned int key, gchar const *value);
37
 
static void sp_feMorphology_update(SPObject *object, SPCtx *ctx, guint flags);
38
 
static Inkscape::XML::Node *sp_feMorphology_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
39
 
static void sp_feMorphology_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter);
40
 
 
41
 
static SPFilterPrimitiveClass *feMorphology_parent_class;
42
 
 
43
 
GType
44
 
sp_feMorphology_get_type()
45
 
{
46
 
    static GType feMorphology_type = 0;
47
 
 
48
 
    if (!feMorphology_type) {
49
 
        GTypeInfo feMorphology_info = {
50
 
            sizeof(SPFeMorphologyClass),
51
 
            NULL, NULL,
52
 
            (GClassInitFunc) sp_feMorphology_class_init,
53
 
            NULL, NULL,
54
 
            sizeof(SPFeMorphology),
55
 
            16,
56
 
            (GInstanceInitFunc) sp_feMorphology_init,
57
 
            NULL,    /* value_table */
58
 
        };
59
 
        feMorphology_type = g_type_register_static(SP_TYPE_FILTER_PRIMITIVE, "SPFeMorphology", &feMorphology_info, (GTypeFlags)0);
60
 
    }
61
 
    return feMorphology_type;
62
 
}
63
 
 
64
 
static void
65
 
sp_feMorphology_class_init(SPFeMorphologyClass *klass)
66
 
{
67
 
    SPObjectClass *sp_object_class = (SPObjectClass *)klass;
68
 
    SPFilterPrimitiveClass *sp_primitive_class = (SPFilterPrimitiveClass *)klass;
69
 
    
70
 
    feMorphology_parent_class = (SPFilterPrimitiveClass*)g_type_class_peek_parent(klass);
71
 
 
72
 
    sp_object_class->build = sp_feMorphology_build;
73
 
    sp_object_class->release = sp_feMorphology_release;
74
 
    sp_object_class->write = sp_feMorphology_write;
75
 
    sp_object_class->set = sp_feMorphology_set;
76
 
    sp_object_class->update = sp_feMorphology_update;
77
 
    sp_primitive_class->build_renderer = sp_feMorphology_build_renderer;
78
 
}
79
 
 
80
 
static void
81
 
sp_feMorphology_init(SPFeMorphology *feMorphology)
82
 
{
83
 
    //Setting default values:
84
 
    feMorphology->radius.set("0");
85
 
}
86
 
 
87
 
/**
88
 
 * Reads the Inkscape::XML::Node, and initializes SPFeMorphology variables.  For this to get called,
89
 
 * our name must be associated with a repr via "sp_object_type_register".  Best done through
90
 
 * sp-object-repr.cpp's repr_name_entries array.
91
 
 */
92
 
static void
93
 
sp_feMorphology_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
94
 
{
95
 
    if (((SPObjectClass *) feMorphology_parent_class)->build) {
96
 
        ((SPObjectClass *) feMorphology_parent_class)->build(object, document, repr);
97
 
    }
98
 
 
99
 
    /*LOAD ATTRIBUTES FROM REPR HERE*/
100
 
    sp_object_read_attr(object, "operator");
101
 
    sp_object_read_attr(object, "radius");
102
 
}
103
 
 
104
 
/**
105
 
 * Drops any allocated memory.
106
 
 */
107
 
static void
108
 
sp_feMorphology_release(SPObject *object)
109
 
{
110
 
    if (((SPObjectClass *) feMorphology_parent_class)->release)
111
 
        ((SPObjectClass *) feMorphology_parent_class)->release(object);
112
 
}
113
 
 
114
 
static NR::FilterMorphologyOperator sp_feMorphology_read_operator(gchar const *value){
115
 
    if (!value) return NR::MORPHOLOGY_OPERATOR_ERODE; //erode is default
116
 
    switch(value[0]){
117
 
        case 'e':
118
 
            if (strncmp(value, "erode", 5) == 0) return NR::MORPHOLOGY_OPERATOR_ERODE;
119
 
            break;
120
 
        case 'd':
121
 
            if (strncmp(value, "dilate", 6) == 0) return NR::MORPHOLOGY_OPERATOR_DILATE;
122
 
            break;
123
 
    }
124
 
    return NR::MORPHOLOGY_OPERATOR_ERODE; //erode is default
125
 
}
126
 
 
127
 
/**
128
 
 * Sets a specific value in the SPFeMorphology.
129
 
 */
130
 
static void
131
 
sp_feMorphology_set(SPObject *object, unsigned int key, gchar const *value)
132
 
{
133
 
    SPFeMorphology *feMorphology = SP_FEMORPHOLOGY(object);
134
 
    (void)feMorphology;
135
 
    
136
 
    NR::FilterMorphologyOperator read_operator;
137
 
    switch(key) {
138
 
    /*DEAL WITH SETTING ATTRIBUTES HERE*/
139
 
        case SP_ATTR_OPERATOR:
140
 
            read_operator = sp_feMorphology_read_operator(value);
141
 
            if (read_operator != feMorphology->Operator){
142
 
                feMorphology->Operator = read_operator;
143
 
                object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
144
 
            }
145
 
            break;
146
 
        case SP_ATTR_RADIUS:
147
 
            feMorphology->radius.set(value);
148
 
            //From SVG spec: If <y-radius> is not provided, it defaults to <x-radius>.
149
 
            if (feMorphology->radius.optNumIsSet() == false)
150
 
                feMorphology->radius.setOptNumber(feMorphology->radius.getNumber());
151
 
            object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
152
 
            break;
153
 
        default:
154
 
            if (((SPObjectClass *) feMorphology_parent_class)->set)
155
 
                ((SPObjectClass *) feMorphology_parent_class)->set(object, key, value);
156
 
            break;
157
 
    }
158
 
 
159
 
}
160
 
 
161
 
/**
162
 
 * Receives update notifications.
163
 
 */
164
 
static void
165
 
sp_feMorphology_update(SPObject *object, SPCtx *ctx, guint flags)
166
 
{
167
 
    if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
168
 
                 SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
169
 
 
170
 
        /* do something to trigger redisplay, updates? */
171
 
 
172
 
    }
173
 
 
174
 
    if (((SPObjectClass *) feMorphology_parent_class)->update) {
175
 
        ((SPObjectClass *) feMorphology_parent_class)->update(object, ctx, flags);
176
 
    }
177
 
}
178
 
 
179
 
/**
180
 
 * Writes its settings to an incoming repr object, if any.
181
 
 */
182
 
static Inkscape::XML::Node *
183
 
sp_feMorphology_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
184
 
{
185
 
    // Inkscape-only object, not copied during an "plain SVG" dump:
186
 
    if (flags & SP_OBJECT_WRITE_EXT) {
187
 
        if (repr) {
188
 
            // is this sane?
189
 
            //repr->mergeFrom(SP_OBJECT_REPR(object), "id");
190
 
        } else {
191
 
            repr = SP_OBJECT_REPR(object)->duplicate(doc);
192
 
        }
193
 
    }
194
 
 
195
 
    if (((SPObjectClass *) feMorphology_parent_class)->write) {
196
 
        ((SPObjectClass *) feMorphology_parent_class)->write(object, doc, repr, flags);
197
 
    }
198
 
 
199
 
    return repr;
200
 
}
201
 
 
202
 
static void sp_feMorphology_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter) {
203
 
    g_assert(primitive != NULL);
204
 
    g_assert(filter != NULL);
205
 
 
206
 
    SPFeMorphology *sp_morphology = SP_FEMORPHOLOGY(primitive);
207
 
 
208
 
    int primitive_n = filter->add_primitive(NR::NR_FILTER_MORPHOLOGY);
209
 
    NR::FilterPrimitive *nr_primitive = filter->get_primitive(primitive_n);
210
 
    NR::FilterMorphology *nr_morphology = dynamic_cast<NR::FilterMorphology*>(nr_primitive);
211
 
    g_assert(nr_morphology != NULL);
212
 
 
213
 
    sp_filter_primitive_renderer_common(primitive, nr_primitive); 
214
 
    
215
 
    nr_morphology->set_operator(sp_morphology->Operator);
216
 
    nr_morphology->set_xradius( sp_morphology->radius.getNumber() );
217
 
    nr_morphology->set_yradius( sp_morphology->radius.getOptNumber() );
218
 
}
219
 
 
220
 
/*
221
 
  Local Variables:
222
 
  mode:c++
223
 
  c-file-style:"stroustrup"
224
 
  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
225
 
  indent-tabs-mode:nil
226
 
  fill-column:99
227
 
  End:
228
 
*/
229
 
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :