~centralelyon2010/inkscape/imagelinks2

« back to all changes in this revision

Viewing changes to src/filters/spotlight.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_FESPOTLIGHT_CPP__
 
2
 
 
3
/** \file
 
4
 * SVG <fespotlight> implementation.
 
5
 */
 
6
/*
 
7
 * Authors:
 
8
 *   Hugo Rodrigues <haa.rodrigues@gmail.com>
 
9
 *   Niko Kiirala <niko@kiirala.com>
 
10
 *   Jean-Rene Reinhard <jr@komite.net>
 
11
 *
 
12
 * Copyright (C) 2006,2007 Authors
 
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 <glib.h>
 
22
 
 
23
#include "attributes.h"
 
24
#include "document.h"
 
25
#include "spotlight.h"
 
26
#include "diffuselighting-fns.h"
 
27
#include "specularlighting-fns.h"
 
28
#include "xml/repr.h"
 
29
 
 
30
#define SP_MACROS_SILENT
 
31
#include "macros.h"
 
32
 
 
33
/* FeSpotLight class */
 
34
 
 
35
static void sp_fespotlight_class_init(SPFeSpotLightClass *klass);
 
36
static void sp_fespotlight_init(SPFeSpotLight *fespotlight);
 
37
 
 
38
static void sp_fespotlight_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr);
 
39
static void sp_fespotlight_release(SPObject *object);
 
40
static void sp_fespotlight_set(SPObject *object, unsigned int key, gchar const *value);
 
41
static void sp_fespotlight_update(SPObject *object, SPCtx *ctx, guint flags);
 
42
static Inkscape::XML::Node *sp_fespotlight_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
 
43
 
 
44
static SPObjectClass *feSpotLight_parent_class;
 
45
 
 
46
GType
 
47
sp_fespotlight_get_type()
 
48
{
 
49
    static GType fespotlight_type = 0;
 
50
 
 
51
    if (!fespotlight_type) {
 
52
        GTypeInfo fespotlight_info = {
 
53
            sizeof(SPFeSpotLightClass),
 
54
            NULL, NULL,
 
55
            (GClassInitFunc) sp_fespotlight_class_init,
 
56
            NULL, NULL,
 
57
            sizeof(SPFeSpotLight),
 
58
            16,
 
59
            (GInstanceInitFunc) sp_fespotlight_init,
 
60
            NULL,    /* value_table */
 
61
        };
 
62
        fespotlight_type = g_type_register_static(SP_TYPE_OBJECT, "SPFeSpotLight", &fespotlight_info, (GTypeFlags)0);
 
63
    }
 
64
    return fespotlight_type;
 
65
}
 
66
 
 
67
static void
 
68
sp_fespotlight_class_init(SPFeSpotLightClass *klass)
 
69
{
 
70
 
 
71
    SPObjectClass *sp_object_class = (SPObjectClass *)klass;
 
72
 
 
73
    feSpotLight_parent_class = (SPObjectClass*)g_type_class_peek_parent(klass);
 
74
 
 
75
    sp_object_class->build = sp_fespotlight_build;
 
76
    sp_object_class->release = sp_fespotlight_release;
 
77
    sp_object_class->write = sp_fespotlight_write;
 
78
    sp_object_class->set = sp_fespotlight_set;
 
79
    sp_object_class->update = sp_fespotlight_update;
 
80
}
 
81
 
 
82
static void
 
83
sp_fespotlight_init(SPFeSpotLight *fespotlight)
 
84
{
 
85
    fespotlight->x = 0;
 
86
    fespotlight->y = 0;
 
87
    fespotlight->z = 0;
 
88
    fespotlight->pointsAtX = 0;
 
89
    fespotlight->pointsAtY = 0;
 
90
    fespotlight->pointsAtZ = 0;
 
91
    fespotlight->specularExponent = 1;
 
92
    fespotlight->limitingConeAngle = 90;
 
93
 
 
94
    fespotlight->x_set = FALSE;
 
95
    fespotlight->y_set = FALSE;
 
96
    fespotlight->z_set = FALSE;
 
97
    fespotlight->pointsAtX_set = FALSE;
 
98
    fespotlight->pointsAtY_set = FALSE;
 
99
    fespotlight->pointsAtZ_set = FALSE;
 
100
    fespotlight->specularExponent_set = FALSE;
 
101
    fespotlight->limitingConeAngle_set = FALSE;
 
102
}
 
103
 
 
104
/**
 
105
 * Reads the Inkscape::XML::Node, and initializes SPPointLight variables.  For this to get called,
 
106
 * our name must be associated with a repr via "sp_object_type_register".  Best done through
 
107
 * sp-object-repr.cpp's repr_name_entries array.
 
108
 */
 
109
static void
 
110
sp_fespotlight_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr)
 
111
{
 
112
    if (((SPObjectClass *) feSpotLight_parent_class)->build) {
 
113
        ((SPObjectClass *) feSpotLight_parent_class)->build(object, document, repr);
 
114
    }
 
115
 
 
116
    //Read values of key attributes from XML nodes into object.
 
117
    sp_object_read_attr(object, "x");
 
118
    sp_object_read_attr(object, "y");
 
119
    sp_object_read_attr(object, "z");
 
120
    sp_object_read_attr(object, "pointsAtX");
 
121
    sp_object_read_attr(object, "pointsAtY");
 
122
    sp_object_read_attr(object, "pointsAtZ");
 
123
    sp_object_read_attr(object, "specularExponent");
 
124
    sp_object_read_attr(object, "limitingConeAngle");
 
125
 
 
126
//is this necessary?
 
127
    sp_document_add_resource(document, "fespotlight", object);
 
128
}
 
129
 
 
130
/**
 
131
 * Drops any allocated memory.
 
132
 */
 
133
static void
 
134
sp_fespotlight_release(SPObject *object)
 
135
{
 
136
    //SPFeSpotLight *fespotlight = SP_FESPOTLIGHT(object);
 
137
 
 
138
    if (SP_OBJECT_DOCUMENT(object)) {
 
139
        /* Unregister ourselves */
 
140
        sp_document_remove_resource(SP_OBJECT_DOCUMENT(object), "fespotlight", SP_OBJECT(object));
 
141
    }
 
142
 
 
143
//TODO: release resources here
 
144
}
 
145
 
 
146
/**
 
147
 * Sets a specific value in the SPFeSpotLight.
 
148
 */
 
149
static void
 
150
sp_fespotlight_set(SPObject *object, unsigned int key, gchar const *value)
 
151
{
 
152
    SPFeSpotLight *fespotlight = SP_FESPOTLIGHT(object);
 
153
    gchar *end_ptr;
 
154
 
 
155
    switch (key) {
 
156
    case SP_ATTR_X:
 
157
        end_ptr = NULL;
 
158
        if (value) {
 
159
            fespotlight->x = g_ascii_strtod(value, &end_ptr);
 
160
            if (end_ptr)
 
161
                fespotlight->x_set = TRUE;
 
162
        }
 
163
        if(!value || !end_ptr) {
 
164
            fespotlight->x = 0;
 
165
            fespotlight->x_set = FALSE;
 
166
        }
 
167
        if (object->parent &&
 
168
                (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
 
169
                 SP_IS_FESPECULARLIGHTING(object->parent))) {
 
170
            object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
 
171
        }
 
172
        break;
 
173
    case SP_ATTR_Y:
 
174
        end_ptr = NULL;
 
175
        if (value) {
 
176
            fespotlight->y = g_ascii_strtod(value, &end_ptr);
 
177
            if (end_ptr)
 
178
                fespotlight->y_set = TRUE;
 
179
        }
 
180
        if(!value || !end_ptr) {
 
181
            fespotlight->y = 0;
 
182
            fespotlight->y_set = FALSE;
 
183
        }
 
184
        if (object->parent &&
 
185
                (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
 
186
                 SP_IS_FESPECULARLIGHTING(object->parent))) {
 
187
            object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
 
188
        }
 
189
        break;
 
190
    case SP_ATTR_Z:
 
191
        end_ptr = NULL;
 
192
        if (value) {
 
193
            fespotlight->z = g_ascii_strtod(value, &end_ptr);
 
194
            if (end_ptr)
 
195
                fespotlight->z_set = TRUE;
 
196
        }
 
197
        if(!value || !end_ptr) {
 
198
            fespotlight->z = 0;
 
199
            fespotlight->z_set = FALSE;
 
200
        }
 
201
        if (object->parent &&
 
202
                (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
 
203
                 SP_IS_FESPECULARLIGHTING(object->parent))) {
 
204
            object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
 
205
        }
 
206
        break;
 
207
    case SP_ATTR_POINTSATX:
 
208
        end_ptr = NULL;
 
209
        if (value) {
 
210
            fespotlight->pointsAtX = g_ascii_strtod(value, &end_ptr);
 
211
            if (end_ptr)
 
212
                fespotlight->pointsAtX_set = TRUE;
 
213
        }
 
214
        if(!value || !end_ptr) {
 
215
            fespotlight->pointsAtX = 0;
 
216
            fespotlight->pointsAtX_set = FALSE;
 
217
        }
 
218
        if (object->parent &&
 
219
                (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
 
220
                 SP_IS_FESPECULARLIGHTING(object->parent))) {
 
221
            object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
 
222
        }
 
223
        break;
 
224
    case SP_ATTR_POINTSATY:
 
225
        end_ptr = NULL;
 
226
        if (value) {
 
227
            fespotlight->pointsAtY = g_ascii_strtod(value, &end_ptr);
 
228
            if (end_ptr)
 
229
                fespotlight->pointsAtY_set = TRUE;
 
230
        }
 
231
        if(!value || !end_ptr) {
 
232
            fespotlight->pointsAtY = 0;
 
233
            fespotlight->pointsAtY_set = FALSE;
 
234
        }
 
235
        if (object->parent &&
 
236
                (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
 
237
                 SP_IS_FESPECULARLIGHTING(object->parent))) {
 
238
            object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
 
239
        }
 
240
        break;
 
241
    case SP_ATTR_POINTSATZ:
 
242
        end_ptr = NULL;
 
243
        if (value) {
 
244
            fespotlight->pointsAtZ = g_ascii_strtod(value, &end_ptr);
 
245
            if (end_ptr)
 
246
                fespotlight->pointsAtZ_set = TRUE;
 
247
        }
 
248
        if(!value || !end_ptr) {
 
249
            fespotlight->pointsAtZ = 0;
 
250
            fespotlight->pointsAtZ_set = FALSE;
 
251
        }
 
252
        if (object->parent &&
 
253
                (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
 
254
                 SP_IS_FESPECULARLIGHTING(object->parent))) {
 
255
            object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
 
256
        }
 
257
        break;
 
258
    case SP_ATTR_SPECULAREXPONENT:
 
259
        end_ptr = NULL;
 
260
        if (value) {
 
261
            fespotlight->specularExponent = g_ascii_strtod(value, &end_ptr);
 
262
            if (end_ptr)
 
263
                fespotlight->specularExponent_set = TRUE;
 
264
        }
 
265
        if(!value || !end_ptr) {
 
266
            fespotlight->specularExponent = 1;
 
267
            fespotlight->specularExponent_set = FALSE;
 
268
        }
 
269
        if (object->parent &&
 
270
                (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
 
271
                 SP_IS_FESPECULARLIGHTING(object->parent))) {
 
272
            object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
 
273
        }
 
274
        break;
 
275
    case SP_ATTR_LIMITINGCONEANGLE:
 
276
        end_ptr = NULL;
 
277
        if (value) {
 
278
            fespotlight->limitingConeAngle = g_ascii_strtod(value, &end_ptr);
 
279
            if (end_ptr)
 
280
                fespotlight->limitingConeAngle_set = TRUE;
 
281
        }
 
282
        if(!value || !end_ptr) {
 
283
            fespotlight->limitingConeAngle = 90;
 
284
            fespotlight->limitingConeAngle_set = FALSE;
 
285
        }
 
286
        if (object->parent &&
 
287
                (SP_IS_FEDIFFUSELIGHTING(object->parent) ||
 
288
                 SP_IS_FESPECULARLIGHTING(object->parent))) {
 
289
            object->parent->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
 
290
        }
 
291
        break;
 
292
    default:
 
293
        // See if any parents need this value.
 
294
        if (((SPObjectClass *) feSpotLight_parent_class)->set) {
 
295
            ((SPObjectClass *) feSpotLight_parent_class)->set(object, key, value);
 
296
        }
 
297
        break;
 
298
    }
 
299
}
 
300
 
 
301
/**
 
302
 *  * Receives update notifications.
 
303
 *   */
 
304
static void
 
305
sp_fespotlight_update(SPObject *object, SPCtx *ctx, guint flags)
 
306
{
 
307
    SPFeSpotLight *feSpotLight = SP_FESPOTLIGHT(object);
 
308
    (void)feSpotLight;
 
309
 
 
310
    if (flags & SP_OBJECT_MODIFIED_FLAG) {
 
311
        /* do something to trigger redisplay, updates? */
 
312
        sp_object_read_attr(object, "x");
 
313
        sp_object_read_attr(object, "y");
 
314
        sp_object_read_attr(object, "z");
 
315
        sp_object_read_attr(object, "pointsAtX");
 
316
        sp_object_read_attr(object, "pointsAtY");
 
317
        sp_object_read_attr(object, "pointsAtZ");
 
318
        sp_object_read_attr(object, "specularExponent");
 
319
        sp_object_read_attr(object, "limitingConeAngle");
 
320
    }
 
321
 
 
322
    if (((SPObjectClass *) feSpotLight_parent_class)->update) {
 
323
        ((SPObjectClass *) feSpotLight_parent_class)->update(object, ctx, flags);
 
324
    }
 
325
}
 
326
 
 
327
/**
 
328
 * Writes its settings to an incoming repr object, if any.
 
329
 */
 
330
static Inkscape::XML::Node *
 
331
sp_fespotlight_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
 
332
{
 
333
    SPFeSpotLight *fespotlight = SP_FESPOTLIGHT(object);
 
334
 
 
335
    if (!repr) {
 
336
        repr = SP_OBJECT_REPR(object)->duplicate(doc);
 
337
    }
 
338
 
 
339
    if (fespotlight->x_set)
 
340
        sp_repr_set_css_double(repr, "x", fespotlight->x);
 
341
    if (fespotlight->y_set)
 
342
        sp_repr_set_css_double(repr, "y", fespotlight->y);
 
343
    if (fespotlight->z_set)
 
344
        sp_repr_set_css_double(repr, "z", fespotlight->z);
 
345
    if (fespotlight->pointsAtX_set)
 
346
        sp_repr_set_css_double(repr, "pointsAtX", fespotlight->pointsAtX);
 
347
    if (fespotlight->pointsAtY_set)
 
348
        sp_repr_set_css_double(repr, "pointsAtY", fespotlight->pointsAtY);
 
349
    if (fespotlight->pointsAtZ_set)
 
350
        sp_repr_set_css_double(repr, "pointsAtZ", fespotlight->pointsAtZ);
 
351
    if (fespotlight->specularExponent_set)
 
352
        sp_repr_set_css_double(repr, "specularExponent", fespotlight->specularExponent);
 
353
    if (fespotlight->limitingConeAngle_set)
 
354
        sp_repr_set_css_double(repr, "limitingConeAngle", fespotlight->limitingConeAngle);
 
355
 
 
356
    if (((SPObjectClass *) feSpotLight_parent_class)->write) {
 
357
        ((SPObjectClass *) feSpotLight_parent_class)->write(object, doc, repr, flags);
 
358
    }
 
359
 
 
360
    return repr;
 
361
}
 
362
 
 
363
/*
 
364
  Local Variables:
 
365
  mode:c++
 
366
  c-file-style:"stroustrup"
 
367
  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
 
368
  indent-tabs-mode:nil
 
369
  fill-column:99
 
370
  End:
 
371
*/
 
372
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :