From 3a381f68ffa8d79efa00ff6d781a1454efc43082 Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Sat, 8 Nov 2014 22:18:56 +0100 Subject: fix missing assignment to variable. (bzr r13683) --- src/svg/svg-angle.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/svg/svg-angle.cpp b/src/svg/svg-angle.cpp index 63152368e..ed5ccd45e 100644 --- a/src/svg/svg-angle.cpp +++ b/src/svg/svg-angle.cpp @@ -104,15 +104,19 @@ static bool sp_svg_angle_read_lff(gchar const *str, SVGAngle::Unit &unit, float } else { if (strncmp(e, "deg", 3) == 0) { unit = SVGAngle::DEG; + val = v; computed = v; } else if (strncmp(e, "grad", 4) == 0) { unit = SVGAngle::GRAD; + val = v; computed = Inkscape::Util::Quantity::convert(v, "grad", "°"); } else if (strncmp(e, "rad", 3) == 0) { unit = SVGAngle::RAD; + val = v; computed = Inkscape::Util::Quantity::convert(v, "rad", "°"); } else if (strncmp(e, "turn", 4) == 0) { unit = SVGAngle::TURN; + val = v; computed = Inkscape::Util::Quantity::convert(v, "turn", "°"); } else { return false; -- cgit v1.2.3 From e82db5320b8f94be360d5892c08eadcf84c4d7e1 Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Sat, 8 Nov 2014 22:35:22 +0100 Subject: sp-filter: fix memory leak when trying to set a duplicate name for an image. This function could use more cleanup, but because I can't test now, I will write it down here: int sp_filter_set_image_name(SPFilter *filter, gchar const *name) { gchar *name_copy = strdup(name); pair new_pair(name_copy, filter->_image_number_next++); // post-increment number_next pair::iterator,bool> ret = filter->_image_name->insert(new_pair); if (ret.second == false) { // The element is not inserted (because an element with the same key was already in the map) // Therefore, free the memory allocated for the new entry: free(name_copy); } return (*ret.first).second; } (bzr r13684) --- src/sp-filter.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/sp-filter.cpp b/src/sp-filter.cpp index 9a184952c..9cb33a6f3 100644 --- a/src/sp-filter.cpp +++ b/src/sp-filter.cpp @@ -465,6 +465,10 @@ int sp_filter_set_image_name(SPFilter *filter, gchar const *name) { pair new_pair(name_copy, value); pair::iterator,bool> ret = filter->_image_name->insert(new_pair); if (ret.second == false) { + // The element is not inserted (because an element with the same key was already in the map) + // Therefore, free the memory allocated for the new entry: + free(name_copy); + return (*ret.first).second; } return value; -- cgit v1.2.3 From dcb05dc518f5b1b6becac20b04693add0a713624 Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Sat, 8 Nov 2014 22:40:46 +0100 Subject: fix potential nullptr deref. (bzr r13685) --- src/extension/param/radiobutton.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extension/param/radiobutton.cpp b/src/extension/param/radiobutton.cpp index 75d5a40e3..f9515197c 100644 --- a/src/extension/param/radiobutton.cpp +++ b/src/extension/param/radiobutton.cpp @@ -122,7 +122,7 @@ ParamRadioButton::ParamRadioButton (const gchar * name, defaultval = (static_cast (choices->data))->value->c_str(); } - const char * indent = xml->attribute("indent"); + const char *indent = xml ? xml->attribute("indent") : NULL; if (indent != NULL) { _indent = atoi(indent) * 12; } -- cgit v1.2.3 From 044036e791bf9bd1644a194226cced94b2a09f08 Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Sat, 8 Nov 2014 22:45:56 +0100 Subject: powerstroke: enable unset fill fallback when style is nullptr. fixes nullptr deref. (bzr r13686) --- src/live_effects/lpe-powerstroke.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/live_effects/lpe-powerstroke.cpp b/src/live_effects/lpe-powerstroke.cpp index 03a10807a..f7fe9592d 100644 --- a/src/live_effects/lpe-powerstroke.cpp +++ b/src/live_effects/lpe-powerstroke.cpp @@ -277,7 +277,7 @@ LPEPowerStroke::doOnApply(SPLPEItem const* lpeitem) double width = (lpeitem && lpeitem->style) ? lpeitem->style->stroke_width.computed / 2 : 1.; SPCSSAttr *css = sp_repr_css_attr_new (); - if (true) { + if (lpeitem->style) { if (lpeitem->style->stroke.isPaintserver()) { SPPaintServer * server = lpeitem->style->getStrokePaintServer(); if (server) { -- cgit v1.2.3 From d8559463c6b3e2656bb0726e9dcb7680c4ae3283 Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Sat, 8 Nov 2014 22:53:49 +0100 Subject: export dialog, small code cleanup, should be a noop. (check if pointer is nullptr, instead of checking the pre-condition for newing into the pointer) (bzr r13687) --- src/ui/dialog/export.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/dialog/export.cpp b/src/ui/dialog/export.cpp index a4d8801f7..b044a6e2c 100644 --- a/src/ui/dialog/export.cpp +++ b/src/ui/dialog/export.cpp @@ -537,7 +537,7 @@ Gtk::Adjustment * Export::createSpinbutton( gchar const * /*key*/, float val, fl sb->set_sensitive (sensitive); pos++; - if (!ll.empty()) { + if (l) { l->set_mnemonic_widget(*sb); } -- cgit v1.2.3 From 263305034e9bb1f8958fa4eda523813d20b65941 Mon Sep 17 00:00:00 2001 From: "Liam P. White" Date: Sat, 8 Nov 2014 21:12:39 -0500 Subject: Add specialized transforms Fixed bugs: - https://launchpad.net/bugs/1207502 (bzr r13688) --- src/svg/svg-affine-test.h | 2 +- src/svg/svg-affine.cpp | 157 +++++++++++++++++++++++++++++----------------- 2 files changed, 100 insertions(+), 59 deletions(-) diff --git a/src/svg/svg-affine-test.h b/src/svg/svg-affine-test.h index 11b9012a8..d44f2f714 100644 --- a/src/svg/svg-affine-test.h +++ b/src/svg/svg-affine-test.h @@ -247,7 +247,7 @@ SvgAffineTest::test_t const SvgAffineTest::write_rotate_tests[2] = { SvgAffineTest::test_t const SvgAffineTest::write_skew_tests[3] = { {"skewX(30)",Geom::Affine(1,0,tan(30.*DEGREE),1,0,0)}, {"skewX(-30)",Geom::Affine(1,0,tan(-30.*DEGREE),1,0,0)}, - {"skewY(390)",Geom::Affine(1,tan(30.*DEGREE),0,1,0,0)}}; + {"skewY(30)",Geom::Affine(1,tan(30.*DEGREE),0,1,0,0)}}; /* Local Variables: diff --git a/src/svg/svg-affine.cpp b/src/svg/svg-affine.cpp index 44567a2bd..b2b8744db 100644 --- a/src/svg/svg-affine.cpp +++ b/src/svg/svg-affine.cpp @@ -162,65 +162,105 @@ sp_svg_transform_write(Geom::Affine const &transform) int prec = prefs->getInt("/options/svgoutput/numericprecision", 8); int min_exp = prefs->getInt("/options/svgoutput/minimumexponent", -8); - /* fixme: We could use t1 * t1 + t2 * t2 here instead */ - if ( Geom::are_near(transform[1], 0.0, e) && Geom::are_near (transform[2], 0.0, e)) { - if (Geom::are_near (transform[4], 0.0, e) && Geom::are_near (transform[5], 0.0, e)) { - if (Geom::are_near (transform[0], 1.0, e) && Geom::are_near (transform[3], 1.0, e)) { - /* We are more or less identity */ - return NULL; - } else { - /* We are more or less scale */ - gchar c[256]; - unsigned p = 0; - strcpy (c + p, "scale("); - p += 6; - p += sp_svg_number_write_de( c + p, sizeof(c) - p, transform[0], prec, min_exp ); - c[p++] = ','; - p += sp_svg_number_write_de( c + p, sizeof(c) - p, transform[3], prec, min_exp ); - c[p++] = ')'; - c[p] = '\000'; - g_assert( p <= sizeof(c) ); - return g_strdup(c); - } + // Special case: when all fields of the affine are zero, + // the optimized transformation is scale(0) + if (transform[0] == 0 && transform[1] == 0 && transform[2] == 0 && + transform[3] == 0 && transform[4] == 0 && transform[5] == 0) + { + return g_strdup("scale(0)"); + } + + // FIXME legacy C code! + // the function sp_svg_number_write_de is stopping me from using a proper C++ string + + gchar c[256]; // string buffer + unsigned p = 0; // position in the buffer + + if (transform.isIdentity()) { + // We are more or less identity, so no transform attribute needed: + return NULL; + } else if (transform.isScale()) { + // We are more or less a uniform scale + strcpy (c + p, "scale("); + p += 6; + p += sp_svg_number_write_de( c + p, sizeof(c) - p, transform[0], prec, min_exp ); + if (Geom::are_near(transform[3], 0.0, e)) { + c[p++] = ')'; + c[p] = '\000'; } else { - if (Geom::are_near (transform[0], 1.0, e) && Geom::are_near (transform[3], 1.0, e)) { - /* We are more or less translate */ - gchar c[256]; - unsigned p = 0; - strcpy (c + p, "translate("); - p += 10; - p += sp_svg_number_write_de( c + p, sizeof(c) - p, transform[4], prec, min_exp ); - c[p++] = ','; - p += sp_svg_number_write_de( c + p, sizeof(c) - p, transform[5], prec, min_exp ); - c[p++] = ')'; - c[p] = '\000'; - g_assert( p <= sizeof(c) ); - return g_strdup(c); - } else { - gchar c[256]; - unsigned p = 0; - strcpy (c + p, "matrix("); - p += 7; - p += sp_svg_number_write_de( c + p, sizeof(c) - p, transform[0], prec, min_exp ); - c[p++] = ','; - p += sp_svg_number_write_de( c + p, sizeof(c) - p, transform[1], prec, min_exp ); - c[p++] = ','; - p += sp_svg_number_write_de( c + p, sizeof(c) - p, transform[2], prec, min_exp ); - c[p++] = ','; - p += sp_svg_number_write_de( c + p, sizeof(c) - p, transform[3], prec, min_exp ); - c[p++] = ','; - p += sp_svg_number_write_de( c + p, sizeof(c) - p, transform[4], prec, min_exp ); - c[p++] = ','; - p += sp_svg_number_write_de( c + p, sizeof(c) - p, transform[5], prec, min_exp ); - c[p++] = ')'; - c[p] = '\000'; - g_assert( p <= sizeof(c) ); - return g_strdup(c); - } + c[p++] = ','; + p += sp_svg_number_write_de( c + p, sizeof(c) - p, transform[3], prec, min_exp ); + c[p++] = ')'; + c[p] = '\000'; } + } else if (transform.isTranslation()) { + // We are more or less a pure translation + strcpy (c + p, "translate("); + p += 10; + p += sp_svg_number_write_de( c + p, sizeof(c) - p, transform[4], prec, min_exp ); + if (Geom::are_near(transform[5], 0.0, e)) { + c[p++] = ')'; + c[p] = '\000'; + } else { + c[p++] = ','; + p += sp_svg_number_write_de( c + p, sizeof(c) - p, transform[5], prec, min_exp ); + c[p++] = ')'; + c[p] = '\000'; + } + } else if (transform.isRotation()) { + // We are more or less a pure rotation + strcpy(c + p, "rotate("); + p += 7; + + double angle = std::atan2(transform[1], transform[0]) * (180 / M_PI); + p += sp_svg_number_write_de(c + p, sizeof(c) - p, angle, prec, min_exp); + + c[p++] = ')'; + c[p] = '\000'; + /* } else if (transform.withoutTranslation().isRotation()) { + // FIXME someone please figure out if this can actually be done + // The rotation angle is correct, the points are not + // Refer to the matrix in svg-affine-test.h + + // We are a rotation about a special axis + strcpy(c + p, "rotate("); + p += 7; + + Geom::Affine const sans_translate = transform.withoutTranslation(); + double angle = std::atan2(sans_translate[1], sans_translate[0]) * (180 / M_PI); + p += sp_svg_number_write_de(c + p, sizeof(c) - p, angle, prec, min_exp); + c[p++] = ','; + + Geom::Point pt = transform.translation(); + p += sp_svg_number_write_de(c + p, sizeof(c) - p, pt[Geom::X], prec, min_exp); + + c[p++] = ','; + + p += sp_svg_number_write_de(c + p, sizeof(c) - p, pt[Geom::Y], prec, min_exp); + + c[p++] = ')'; + c[p] = '\000';*/ + } else if (transform.isHShear()) { + // We are more or less a pure skewX + strcpy(c + p, "skewX("); + p += 6; + + double angle = atan(transform[2]) * (180 / M_PI); + p += sp_svg_number_write_de(c + p, sizeof(c) - p, angle, prec, min_exp); + + c[p++] = ')'; + c[p] = '\000'; + } else if (transform.isVShear()) { + // We are more or less a pure skewY + strcpy(c + p, "skewY("); + p += 6; + + double angle = atan(transform[1]) * (180 / M_PI); + p += sp_svg_number_write_de(c + p, sizeof(c) - p, angle, prec, min_exp); + + c[p++] = ')'; + c[p] = '\000'; } else { - gchar c[256]; - unsigned p = 0; strcpy (c + p, "matrix("); p += 7; p += sp_svg_number_write_de( c + p, sizeof(c) - p, transform[0], prec, min_exp ); @@ -236,9 +276,10 @@ sp_svg_transform_write(Geom::Affine const &transform) p += sp_svg_number_write_de( c + p, sizeof(c) - p, transform[5], prec, min_exp ); c[p++] = ')'; c[p] = '\000'; - g_assert( p <= sizeof(c) ); - return g_strdup(c); } + + assert(p <= sizeof(c)); + return g_strdup(c); } -- cgit v1.2.3 From 6d8711ca804646d2c63e42c4747e3290619bda59 Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Sun, 9 Nov 2014 03:31:45 +0100 Subject: windows: fix running of cxxtests. problem was that DLLs could not be found. We have to copy the cxxtests.exe file to the distribution folder (with all DLLs in in), and run it there. (bzr r13689) --- build.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 6f3324752..dd3bf0942 100644 --- a/build.xml +++ b/build.xml @@ -836,7 +836,8 @@ --> - + +