summaryrefslogtreecommitdiffstats
path: root/src/sp-gradient-test.cpp
diff options
context:
space:
mode:
authorMenTaLguY <mental@rydia.net>2006-01-16 02:36:01 +0000
committermental <mental@users.sourceforge.net>2006-01-16 02:36:01 +0000
commit179fa413b047bede6e32109e2ce82437c5fb8d34 (patch)
treea5a6ac2c1708bd02288fbd8edb2ff500ff2e0916 /src/sp-gradient-test.cpp
downloadinkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.tar.gz
inkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.zip
moving trunk for module inkscape
(bzr r1)
Diffstat (limited to 'src/sp-gradient-test.cpp')
-rw-r--r--src/sp-gradient-test.cpp139
1 files changed, 139 insertions, 0 deletions
diff --git a/src/sp-gradient-test.cpp b/src/sp-gradient-test.cpp
new file mode 100644
index 000000000..051beb928
--- /dev/null
+++ b/src/sp-gradient-test.cpp
@@ -0,0 +1,139 @@
+#include "attributes.h"
+#include "inkscape-private.h"
+#include "sp-gradient.h"
+#include "sp-object.h"
+#include "document.h"
+#include "libnr/nr-matrix.h"
+#include "libnr/nr-matrix-fns.h"
+#include "libnr/nr-matrix-ops.h"
+#include "libnr/nr-rect.h"
+#include "libnr/nr-rotate-fns.h"
+#include "svg/svg.h"
+#include "utest/utest.h"
+#include "xml/repr.h"
+
+/// Dummy functions to keep linker happy
+int sp_main_gui (int, char const**) { return 0; }
+int sp_main_console (int, char const**) { return 0; }
+
+static bool
+test_gradient()
+{
+ utest_start("gradient");
+ UTEST_TEST("init") {
+ SPGradient *gr = static_cast<SPGradient *>(g_object_new(SP_TYPE_GRADIENT, NULL));
+ UTEST_ASSERT(gr->gradientTransform.test_identity());
+ UTEST_ASSERT(gr->gradientTransform == NR::identity());
+ g_object_unref(gr);
+ }
+
+ /* Create the global inkscape object. */
+ static_cast<void>(g_object_new(inkscape_get_type(), NULL));
+
+
+ SPDocument *doc = sp_document_new_dummy();
+
+ UTEST_TEST("sp_object_set(\"gradientTransform\")") {
+ SPGradient *gr = static_cast<SPGradient *>(g_object_new(SP_TYPE_GRADIENT, NULL));
+ SP_OBJECT(gr)->document = doc;
+ sp_object_set(SP_OBJECT(gr), SP_ATTR_GRADIENTTRANSFORM, "translate(5, 8)");
+ UTEST_ASSERT(gr->gradientTransform == NR::Matrix(NR::translate(5, 8)));
+ sp_object_set(SP_OBJECT(gr), SP_ATTR_GRADIENTTRANSFORM, "");
+ UTEST_ASSERT(gr->gradientTransform == NR::identity());
+ sp_object_set(SP_OBJECT(gr), SP_ATTR_GRADIENTTRANSFORM, "rotate(90)");
+ UTEST_ASSERT(gr->gradientTransform == NR::Matrix(rotate_degrees(90)));
+ g_object_unref(gr);
+ }
+
+ UTEST_TEST("write") {
+ SPGradient *gr = static_cast<SPGradient *>(g_object_new(SP_TYPE_GRADIENT, NULL));
+ SP_OBJECT(gr)->document = doc;
+ sp_object_set(SP_OBJECT(gr), SP_ATTR_GRADIENTTRANSFORM, "matrix(0, 1, -1, 0, 0, 0)");
+ Inkscape::XML::Node *repr = sp_repr_new("svg:radialGradient");
+ SP_OBJECT(gr)->updateRepr(repr, SP_OBJECT_WRITE_ALL);
+ {
+ gchar const *tr = repr->attribute("gradientTransform");
+ NR::Matrix svd;
+ bool const valid = sp_svg_transform_read(tr, &svd);
+ UTEST_ASSERT(valid);
+ UTEST_ASSERT(svd == NR::Matrix(rotate_degrees(90)));
+ }
+ g_object_unref(gr);
+ }
+
+ UTEST_TEST("get_g2d, get_gs2d, set_gs2d") {
+ SPGradient *gr = static_cast<SPGradient *>(g_object_new(SP_TYPE_GRADIENT, NULL));
+ SP_OBJECT(gr)->document = doc;
+ NR::Matrix const grXform(2, 1,
+ 1, 3,
+ 4, 6);
+ gr->gradientTransform = grXform;
+ NR::Rect const unit_rect(NR::Point(0, 0), NR::Point(1, 1));
+ {
+ NR::Matrix const g2d(sp_gradient_get_g2d_matrix(gr, NR::identity(), unit_rect));
+ NR::Matrix const gs2d(sp_gradient_get_gs2d_matrix(gr, NR::identity(), unit_rect));
+ UTEST_ASSERT(g2d == NR::identity());
+ UTEST_ASSERT(NR::matrix_equalp(gs2d, gr->gradientTransform * g2d, 1e-12));
+
+ sp_gradient_set_gs2d_matrix(gr, NR::identity(), unit_rect, gs2d);
+ UTEST_ASSERT(NR::matrix_equalp(gr->gradientTransform, grXform, 1e-12));
+ }
+
+ gr->gradientTransform = grXform;
+ NR::Matrix const funny(2, 3,
+ 4, 5,
+ 6, 7);
+ {
+ NR::Matrix const g2d(sp_gradient_get_g2d_matrix(gr, funny, unit_rect));
+ NR::Matrix const gs2d(sp_gradient_get_gs2d_matrix(gr, funny, unit_rect));
+ UTEST_ASSERT(g2d == funny);
+ UTEST_ASSERT(NR::matrix_equalp(gs2d, gr->gradientTransform * g2d, 1e-12));
+
+ sp_gradient_set_gs2d_matrix(gr, funny, unit_rect, gs2d);
+ UTEST_ASSERT(NR::matrix_equalp(gr->gradientTransform, grXform, 1e-12));
+ }
+
+ gr->gradientTransform = grXform;
+ NR::Rect const larger_rect(NR::Point(5, 6), NR::Point(8, 10));
+ {
+ NR::Matrix const g2d(sp_gradient_get_g2d_matrix(gr, funny, larger_rect));
+ NR::Matrix const gs2d(sp_gradient_get_gs2d_matrix(gr, funny, larger_rect));
+ UTEST_ASSERT(g2d == NR::Matrix(3, 0,
+ 0, 4,
+ 5, 6) * funny);
+ UTEST_ASSERT(NR::matrix_equalp(gs2d, gr->gradientTransform * g2d, 1e-12));
+
+ sp_gradient_set_gs2d_matrix(gr, funny, larger_rect, gs2d);
+ UTEST_ASSERT(NR::matrix_equalp(gr->gradientTransform, grXform, 1e-12));
+
+ sp_object_set(SP_OBJECT(gr), SP_ATTR_GRADIENTUNITS, "userSpaceOnUse");
+ NR::Matrix const user_g2d(sp_gradient_get_g2d_matrix(gr, funny, larger_rect));
+ NR::Matrix const user_gs2d(sp_gradient_get_gs2d_matrix(gr, funny, larger_rect));
+ UTEST_ASSERT(user_g2d == funny);
+ UTEST_ASSERT(NR::matrix_equalp(user_gs2d, gr->gradientTransform * user_g2d, 1e-12));
+ }
+ g_object_unref(gr);
+ }
+
+ return utest_end();
+}
+
+int main()
+{
+ g_type_init();
+ Inkscape::GC::init();
+ return ( test_gradient()
+ ? EXIT_SUCCESS
+ : EXIT_FAILURE );
+}
+
+/*
+ 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:encoding=utf-8:textwidth=99 :