2 #ifndef SEEN_SP_GRADIENT_TEST_H
3 #define SEEN_SP_GRADIENT_TEST_H
5 #include "document-using-test.h"
8 #include "sp-gradient.h"
9 #include "svg/svg.h"
10 #include "xml/repr.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 sp_document_unref( _doc );
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.test_identity());
36 UTEST_ASSERT(gr->gradientTransform == NR::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_set(SP_OBJECT(gr), SP_ATTR_GRADIENTTRANSFORM, "translate(5, 8)");
59 TS_ASSERT_EQUALS( gr->gradientTransform, NR::Matrix(NR::translate(5, 8)) );
61 sp_object_set(SP_OBJECT(gr), SP_ATTR_GRADIENTTRANSFORM, "");
62 TS_ASSERT_EQUALS( gr->gradientTransform, NR::identity() );
64 sp_object_set(SP_OBJECT(gr), SP_ATTR_GRADIENTTRANSFORM, "rotate(90)");
65 TS_ASSERT_EQUALS( gr->gradientTransform, NR::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_set(SP_OBJECT(gr), 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 NR::Matrix svd;
83 bool const valid = sp_svg_transform_read(tr, &svd);
84 TS_ASSERT( valid );
85 TS_ASSERT_EQUALS( svd, NR::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 NR::Matrix const grXform(2, 1,
97 1, 3,
98 4, 6);
99 gr->gradientTransform = grXform;
100 NR::Rect const unit_rect(NR::Point(0, 0), NR::Point(1, 1));
101 {
102 NR::Matrix const g2d(sp_gradient_get_g2d_matrix(gr, NR::identity(), unit_rect));
103 NR::Matrix const gs2d(sp_gradient_get_gs2d_matrix(gr, NR::identity(), unit_rect));
104 TS_ASSERT_EQUALS( g2d, NR::identity() );
105 TS_ASSERT( NR::matrix_equalp(gs2d, gr->gradientTransform * g2d, 1e-12) );
107 sp_gradient_set_gs2d_matrix(gr, NR::identity(), unit_rect, gs2d);
108 TS_ASSERT( NR::matrix_equalp(gr->gradientTransform, grXform, 1e-12) );
109 }
111 gr->gradientTransform = grXform;
112 NR::Matrix const funny(2, 3,
113 4, 5,
114 6, 7);
115 {
116 NR::Matrix const g2d(sp_gradient_get_g2d_matrix(gr, funny, unit_rect));
117 NR::Matrix const gs2d(sp_gradient_get_gs2d_matrix(gr, funny, unit_rect));
118 TS_ASSERT_EQUALS( g2d, funny );
119 TS_ASSERT( NR::matrix_equalp(gs2d, gr->gradientTransform * g2d, 1e-12) );
121 sp_gradient_set_gs2d_matrix(gr, funny, unit_rect, gs2d);
122 TS_ASSERT( NR::matrix_equalp(gr->gradientTransform, grXform, 1e-12) );
123 }
125 gr->gradientTransform = grXform;
126 NR::Rect const larger_rect(NR::Point(5, 6), NR::Point(8, 10));
127 {
128 NR::Matrix const g2d(sp_gradient_get_g2d_matrix(gr, funny, larger_rect));
129 NR::Matrix const gs2d(sp_gradient_get_gs2d_matrix(gr, funny, larger_rect));
130 TS_ASSERT_EQUALS( g2d, NR::Matrix(3, 0,
131 0, 4,
132 5, 6) * funny );
133 TS_ASSERT( NR::matrix_equalp(gs2d, gr->gradientTransform * g2d, 1e-12) );
135 sp_gradient_set_gs2d_matrix(gr, funny, larger_rect, gs2d);
136 TS_ASSERT( NR::matrix_equalp(gr->gradientTransform, grXform, 1e-12) );
138 sp_object_set(SP_OBJECT(gr), SP_ATTR_GRADIENTUNITS, "userSpaceOnUse");
139 NR::Matrix const user_g2d(sp_gradient_get_g2d_matrix(gr, funny, larger_rect));
140 NR::Matrix const user_gs2d(sp_gradient_get_gs2d_matrix(gr, funny, larger_rect));
141 TS_ASSERT_EQUALS( user_g2d, funny );
142 TS_ASSERT( NR::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:encoding=utf-8:textwidth=99 :