summaryrefslogtreecommitdiffstats
path: root/src/object/sp-mesh-patch.cpp
blob: 3d1fdddf751b07a375854b74ed435f2ea26ca9dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// SPDX-License-Identifier: GPL-2.0-or-later
/** @file
 * @gradient meshpatch class.
 */
/* Authors:
 *   Lauris Kaplinski <lauris@kaplinski.com>
 *   bulia byak
 *   Johan Engelen <j.b.c.engelen@ewi.utwente.nl>
 *   Jon A. Cruz <jon@joncruz.org>
 *   Tavmjong Bah <tavjong@free.fr>
 *
 * Copyright (C) 1999,2005 authors
 * Copyright (C) 2010 Jon A. Cruz
 * Copyright (C) 2012 Tavmjong Bah
 *
 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
 */
#include "sp-mesh-patch.h"
#include "style.h"

#include "attributes.h"

SPMeshpatch* SPMeshpatch::getNextMeshpatch()
{
    SPMeshpatch *result = nullptr;

    for (SPObject* obj = getNext(); obj && !result; obj = obj->getNext()) {
        if (SP_IS_MESHPATCH(obj)) {
            result = SP_MESHPATCH(obj);
        }
    }

    return result;
}

SPMeshpatch* SPMeshpatch::getPrevMeshpatch()
{
    SPMeshpatch *result = nullptr;

    for (SPObject* obj = getPrev(); obj; obj = obj->getPrev()) {
        // The closest previous SPObject that is an SPMeshpatch *should* be ourself.
        if (SP_IS_MESHPATCH(obj)) {
            SPMeshpatch* meshpatch = SP_MESHPATCH(obj);
            // Sanity check to ensure we have a proper sibling structure.
            if (meshpatch->getNextMeshpatch() == this) {
                result = meshpatch;
            } else {
                g_warning("SPMeshpatch previous/next relationship broken");
            }
            break;
        }
    }

    return result;
}


/*
 * Mesh Patch
 */
SPMeshpatch::SPMeshpatch() : SPObject() {
    this->tensor_string = nullptr;
}

SPMeshpatch::~SPMeshpatch() = default;

void SPMeshpatch::build(SPDocument* doc, Inkscape::XML::Node* repr) {
	SPObject::build(doc, repr);

	this->readAttr(SPAttr::TENSOR);
}

/**
 * Virtual build: set meshpatch attributes from its associated XML node.
 */
void SPMeshpatch::set(SPAttr key, const gchar* value) {
    switch (key) {
        case SPAttr::TENSOR: {
            if (value) {
                this->tensor_string = new Glib::ustring( value );
                // std::cout << "sp_meshpatch_set: Tensor string: " << patch->tensor_string->c_str() << std::endl;
            }
            break;
        }
        default: {
            // Do nothing
        }
    }
}

/**
 * modified
 */
void SPMeshpatch::modified(unsigned int flags) {

    flags &= SP_OBJECT_MODIFIED_CASCADE;
    std::vector<SPObject *> l;
    for (auto& child: children) {
        sp_object_ref(&child);
        l.push_back(&child);
    }

    for (auto child:l) {
        if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) {
            child->emitModified(flags);
        }
        sp_object_unref(child);
    }
}


/**
 * Virtual set: set attribute to value.
 */
Inkscape::XML::Node* SPMeshpatch::write(Inkscape::XML::Document* xml_doc, Inkscape::XML::Node* repr, guint flags) {
    if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {
        repr = xml_doc->createElement("svg:meshpatch");
    }

    SPObject::write(xml_doc, repr, flags);

    return repr;
}

/**
 * Virtual write: write object attributes to repr.
 */

/*
  Local Variables:
  mode:c++
  c-file-style:"stroustrup"
  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
  indent-tabs-mode:nil
  fill-column:99
  End:
*/
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :