Code

2a061595eea857747f53549d647ff6f68ea5f06f
[inkscape.git] / src / sp-gradient-test.h
1 #ifndef SEEN_SP_GRADIENT_TEST_H
2 #define SEEN_SP_GRADIENT_TEST_H
4 #include "document-using-test.h"
7 #include "sp-gradient.h"
8 #include "svg/svg.h"
9 #include "xml/repr.h"
10 #include <2geom/transforms.h>
11 #include "helper/geom.h"
13 class SPGradientTest : public DocumentUsingTest
14 {
15 public:
16     SPDocument* _doc;
18     SPGradientTest() :
19         _doc(0)
20     {
21     }
23     virtual ~SPGradientTest()
24     {
25         if ( _doc )
26         {
27             _doc->doUnref();
28         }
29     }
31     static void createSuiteSubclass( SPGradientTest *& dst )
32     {
33         SPGradient *gr = static_cast<SPGradient *>(g_object_new(SP_TYPE_GRADIENT, NULL));
34         if ( gr ) {
35             UTEST_ASSERT(gr->gradientTransform.isIdentity());
36             UTEST_ASSERT(gr->gradientTransform == Geom::identity());
37             g_object_unref(gr);
39             dst = new SPGradientTest();
40         }
41     }
43     static SPGradientTest *createSuite()
44     {
45         return Inkscape::createSuiteAndDocument<SPGradientTest>( createSuiteSubclass );
46     }
48     static void destroySuite( SPGradientTest *suite ) { delete suite; }
50 // -------------------------------------------------------------------------
51 // -------------------------------------------------------------------------
53     void testSetGradientTransform()
54     {
55         SPGradient *gr = static_cast<SPGradient *>(g_object_new(SP_TYPE_GRADIENT, NULL));
56         SP_OBJECT(gr)->document = _doc;
58         SP_OBJECT(gr)->setKeyValue( SP_ATTR_GRADIENTTRANSFORM, "translate(5, 8)");
59         TS_ASSERT_EQUALS( gr->gradientTransform, Geom::Matrix(Geom::Translate(5, 8)) );
61         SP_OBJECT(gr)->setKeyValue( SP_ATTR_GRADIENTTRANSFORM, "");
62         TS_ASSERT_EQUALS( gr->gradientTransform, Geom::identity() );
64         SP_OBJECT(gr)->setKeyValue( SP_ATTR_GRADIENTTRANSFORM, "rotate(90)");
65         TS_ASSERT_EQUALS( gr->gradientTransform, Geom::Matrix(rotate_degrees(90)) );
67         g_object_unref(gr);
68     }
71     void testWrite()
72     {
73         SPGradient *gr = static_cast<SPGradient *>(g_object_new(SP_TYPE_GRADIENT, NULL));
74         SP_OBJECT(gr)->document = _doc;
76         SP_OBJECT(gr)->setKeyValue( SP_ATTR_GRADIENTTRANSFORM, "matrix(0, 1, -1, 0, 0, 0)");
77         Inkscape::XML::Document *xml_doc = sp_document_repr_doc(_doc);
78         Inkscape::XML::Node *repr = xml_doc->createElement("svg:radialGradient");
79         SP_OBJECT(gr)->updateRepr(repr, SP_OBJECT_WRITE_ALL);
80         {
81             gchar const *tr = repr->attribute("gradientTransform");
82             Geom::Matrix svd;
83             bool const valid = sp_svg_transform_read(tr, &svd);
84             TS_ASSERT( valid );
85             TS_ASSERT_EQUALS( svd, Geom::Matrix(rotate_degrees(90)) );
86         }
88         g_object_unref(gr);
89     }
92     void testGetG2dGetGs2dSetGs2d()
93     {
94         SPGradient *gr = static_cast<SPGradient *>(g_object_new(SP_TYPE_GRADIENT, NULL));
95         SP_OBJECT(gr)->document = _doc;
96         Geom::Matrix const grXform(2, 1,
97                                  1, 3,
98                                  4, 6);
99         gr->gradientTransform = grXform;
100         Geom::Rect const unit_rect(Geom::Point(0, 0), Geom::Point(1, 1));
101         {
102             Geom::Matrix const g2d(sp_gradient_get_g2d_matrix(gr, Geom::identity(), unit_rect));
103             Geom::Matrix const gs2d(sp_gradient_get_gs2d_matrix(gr, Geom::identity(), unit_rect));
104             TS_ASSERT_EQUALS( g2d, Geom::identity() );
105             TS_ASSERT( Geom::matrix_equalp(gs2d, gr->gradientTransform * g2d, 1e-12) );
107             sp_gradient_set_gs2d_matrix(gr, Geom::identity(), unit_rect, gs2d);
108             TS_ASSERT( Geom::matrix_equalp(gr->gradientTransform, grXform, 1e-12) );
109         }
111         gr->gradientTransform = grXform;
112         Geom::Matrix const funny(2, 3,
113                                4, 5,
114                                6, 7);
115         {
116             Geom::Matrix const g2d(sp_gradient_get_g2d_matrix(gr, funny, unit_rect));
117             Geom::Matrix const gs2d(sp_gradient_get_gs2d_matrix(gr, funny, unit_rect));
118             TS_ASSERT_EQUALS( g2d, funny );
119             TS_ASSERT( Geom::matrix_equalp(gs2d, gr->gradientTransform * g2d, 1e-12) );
121             sp_gradient_set_gs2d_matrix(gr, funny, unit_rect, gs2d);
122             TS_ASSERT( Geom::matrix_equalp(gr->gradientTransform, grXform, 1e-12) );
123         }
125         gr->gradientTransform = grXform;
126         Geom::Rect const larger_rect(Geom::Point(5, 6), Geom::Point(8, 10));
127         {
128             Geom::Matrix const g2d(sp_gradient_get_g2d_matrix(gr, funny, larger_rect));
129             Geom::Matrix const gs2d(sp_gradient_get_gs2d_matrix(gr, funny, larger_rect));
130             TS_ASSERT_EQUALS( g2d, Geom::Matrix(3, 0,
131                                               0, 4,
132                                               5, 6) * funny );
133             TS_ASSERT( Geom::matrix_equalp(gs2d, gr->gradientTransform * g2d, 1e-12) );
135             sp_gradient_set_gs2d_matrix(gr, funny, larger_rect, gs2d);
136             TS_ASSERT( Geom::matrix_equalp(gr->gradientTransform, grXform, 1e-12) );
138             SP_OBJECT(gr)->setKeyValue( SP_ATTR_GRADIENTUNITS, "userSpaceOnUse");
139             Geom::Matrix const user_g2d(sp_gradient_get_g2d_matrix(gr, funny, larger_rect));
140             Geom::Matrix const user_gs2d(sp_gradient_get_gs2d_matrix(gr, funny, larger_rect));
141             TS_ASSERT_EQUALS( user_g2d, funny );
142             TS_ASSERT( Geom::matrix_equalp(user_gs2d, gr->gradientTransform * user_g2d, 1e-12) );
143         }
144         g_object_unref(gr);
145     }
147 };
150 #endif // SEEN_SP_GRADIENT_TEST_H
152 /*
153   Local Variables:
154   mode:c++
155   c-file-style:"stroustrup"
156   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
157   indent-tabs-mode:nil
158   fill-column:99
159   End:
160 */
161 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :