Code

patch by Andrius R. for (un)clip and (un)mask commands
[inkscape.git] / src / sp-gradient-test.cpp
1 #include "attributes.h"
2 #include "inkscape-private.h"
3 #include "sp-gradient.h"
4 #include "sp-object.h"
5 #include "document.h"
6 #include "libnr/nr-matrix.h"
7 #include "libnr/nr-matrix-fns.h"
8 #include "libnr/nr-matrix-ops.h"
9 #include "libnr/nr-rect.h"
10 #include "libnr/nr-rotate-fns.h"
11 #include "svg/svg.h"
12 #include "utest/utest.h"
13 #include "xml/repr.h"
15 /// Dummy functions to keep linker happy
16 int sp_main_gui (int, char const**) { return 0; }
17 int sp_main_console (int, char const**) { return 0; }
19 static bool
20 test_gradient()
21 {
22     utest_start("gradient");
23     UTEST_TEST("init") {
24         SPGradient *gr = static_cast<SPGradient *>(g_object_new(SP_TYPE_GRADIENT, NULL));
25         UTEST_ASSERT(gr->gradientTransform.test_identity());
26         UTEST_ASSERT(gr->gradientTransform == NR::identity());
27         g_object_unref(gr);
28     }
30     /* Create the global inkscape object. */
31     static_cast<void>(g_object_new(inkscape_get_type(), NULL));
34     SPDocument *doc = sp_document_new_dummy();
36     UTEST_TEST("sp_object_set(\"gradientTransform\")") {
37         SPGradient *gr = static_cast<SPGradient *>(g_object_new(SP_TYPE_GRADIENT, NULL));
38         SP_OBJECT(gr)->document = doc;
39         sp_object_set(SP_OBJECT(gr), SP_ATTR_GRADIENTTRANSFORM, "translate(5, 8)");
40         UTEST_ASSERT(gr->gradientTransform == NR::Matrix(NR::translate(5, 8)));
41         sp_object_set(SP_OBJECT(gr), SP_ATTR_GRADIENTTRANSFORM, "");
42         UTEST_ASSERT(gr->gradientTransform == NR::identity());
43         sp_object_set(SP_OBJECT(gr), SP_ATTR_GRADIENTTRANSFORM, "rotate(90)");
44         UTEST_ASSERT(gr->gradientTransform == NR::Matrix(rotate_degrees(90)));
45         g_object_unref(gr);
46     }
48     UTEST_TEST("write") {
49         SPGradient *gr = static_cast<SPGradient *>(g_object_new(SP_TYPE_GRADIENT, NULL));
50         SP_OBJECT(gr)->document = doc;
51         sp_object_set(SP_OBJECT(gr), SP_ATTR_GRADIENTTRANSFORM, "matrix(0, 1, -1, 0, 0, 0)");
52         Inkscape::XML::Node *repr = sp_repr_new("svg:radialGradient");
53         SP_OBJECT(gr)->updateRepr(repr, SP_OBJECT_WRITE_ALL);
54         {
55             gchar const *tr = repr->attribute("gradientTransform");
56             NR::Matrix svd;
57             bool const valid = sp_svg_transform_read(tr, &svd);
58             UTEST_ASSERT(valid);
59             UTEST_ASSERT(svd == NR::Matrix(rotate_degrees(90)));
60         }
61         g_object_unref(gr);
62     }
64     UTEST_TEST("get_g2d, get_gs2d, set_gs2d") {
65         SPGradient *gr = static_cast<SPGradient *>(g_object_new(SP_TYPE_GRADIENT, NULL));
66         SP_OBJECT(gr)->document = doc;
67         NR::Matrix const grXform(2, 1,
68                                  1, 3,
69                                  4, 6);
70         gr->gradientTransform = grXform;
71         NR::Rect const unit_rect(NR::Point(0, 0), NR::Point(1, 1));
72         {
73             NR::Matrix const g2d(sp_gradient_get_g2d_matrix(gr, NR::identity(), unit_rect));
74             NR::Matrix const gs2d(sp_gradient_get_gs2d_matrix(gr, NR::identity(), unit_rect));
75             UTEST_ASSERT(g2d == NR::identity());
76             UTEST_ASSERT(NR::matrix_equalp(gs2d, gr->gradientTransform * g2d, 1e-12));
78             sp_gradient_set_gs2d_matrix(gr, NR::identity(), unit_rect, gs2d);
79             UTEST_ASSERT(NR::matrix_equalp(gr->gradientTransform, grXform, 1e-12));
80         }
82         gr->gradientTransform = grXform;
83         NR::Matrix const funny(2, 3,
84                                4, 5,
85                                6, 7);
86         {
87             NR::Matrix const g2d(sp_gradient_get_g2d_matrix(gr, funny, unit_rect));
88             NR::Matrix const gs2d(sp_gradient_get_gs2d_matrix(gr, funny, unit_rect));
89             UTEST_ASSERT(g2d == funny);
90             UTEST_ASSERT(NR::matrix_equalp(gs2d, gr->gradientTransform * g2d, 1e-12));
92             sp_gradient_set_gs2d_matrix(gr, funny, unit_rect, gs2d);
93             UTEST_ASSERT(NR::matrix_equalp(gr->gradientTransform, grXform, 1e-12));
94         }
96         gr->gradientTransform = grXform;
97         NR::Rect const larger_rect(NR::Point(5, 6), NR::Point(8, 10));
98         {
99             NR::Matrix const g2d(sp_gradient_get_g2d_matrix(gr, funny, larger_rect));
100             NR::Matrix const gs2d(sp_gradient_get_gs2d_matrix(gr, funny, larger_rect));
101             UTEST_ASSERT(g2d == NR::Matrix(3, 0,
102                                            0, 4,
103                                            5, 6) * funny);
104             UTEST_ASSERT(NR::matrix_equalp(gs2d, gr->gradientTransform * g2d, 1e-12));
106             sp_gradient_set_gs2d_matrix(gr, funny, larger_rect, gs2d);
107             UTEST_ASSERT(NR::matrix_equalp(gr->gradientTransform, grXform, 1e-12));
109             sp_object_set(SP_OBJECT(gr), SP_ATTR_GRADIENTUNITS, "userSpaceOnUse");
110             NR::Matrix const user_g2d(sp_gradient_get_g2d_matrix(gr, funny, larger_rect));
111             NR::Matrix const user_gs2d(sp_gradient_get_gs2d_matrix(gr, funny, larger_rect));
112             UTEST_ASSERT(user_g2d == funny);
113             UTEST_ASSERT(NR::matrix_equalp(user_gs2d, gr->gradientTransform * user_g2d, 1e-12));
114         }
115         g_object_unref(gr);
116     }
118     return utest_end();
121 int main()
123     g_type_init();
124     Inkscape::GC::init();
125     return ( test_gradient()
126              ? EXIT_SUCCESS
127              : EXIT_FAILURE );
130 /*
131   Local Variables:
132   mode:c++
133   c-file-style:"stroustrup"
134   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
135   indent-tabs-mode:nil
136   fill-column:99
137   End:
138 */
139 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :