=== modified file 'src/gradient-chemistry.cpp' --- src/gradient-chemistry.cpp 2012-05-25 23:32:52 +0000 +++ src/gradient-chemistry.cpp 2012-09-12 00:52:32 +0000 @@ -20,6 +20,9 @@ #include <2geom/transforms.h> #include <2geom/bezier-curve.h> +#include <2geom/crossing.h> +#include <2geom/line.h> +#include <2geom/angle.h> #include "style.h" #include "document-private.h" @@ -355,10 +358,41 @@ g_free(c); } } else if (SP_IS_LINEARGRADIENT(gr)) { - sp_repr_set_svg_double(repr, "x1", (center - Geom::Point(width/2, 0))[Geom::X]); - sp_repr_set_svg_double(repr, "y1", (center - Geom::Point(width/2, 0))[Geom::Y]); - sp_repr_set_svg_double(repr, "x2", (center + Geom::Point(width/2, 0))[Geom::X]); - sp_repr_set_svg_double(repr, "y2", (center + Geom::Point(width/2, 0))[Geom::Y]); + + // Assume horizontal line by default + Geom::Point p1 = center - Geom::Point(width/2, 0); + Geom::Point p2 = center + Geom::Point(width/2, 0); + + // Get the preferred gradient angle from prefs + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + double angle = prefs->getDouble("/dialogs/gradienteditor/angle", 0.0); + Geom::Line grl(center, Geom::deg_to_rad(angle)); + + Geom::LineSegment bbl1(bbox->corner(0), bbox->corner(1)); + Geom::LineSegment bbl2(bbox->corner(1), bbox->corner(2)); + Geom::LineSegment bbl3(bbox->corner(2), bbox->corner(3)); + Geom::LineSegment bbl4(bbox->corner(3), bbox->corner(0)); + + // Find where our gradient line intersects the bounding box. + if (intersection(bbl1, grl)) { + //g_message("L1"); + p1 = bbl1.pointAt((*intersection(bbl1, grl)).ta); + p2 = bbl3.pointAt((*intersection(bbl3, grl)).ta); + } else if (intersection(bbl2, grl)) { + //g_message("L2"); + p2 = bbl2.pointAt((*intersection(bbl2, grl)).ta); + p1 = bbl4.pointAt((*intersection(bbl4, grl)).ta); + } + + if (angle < 0 || angle >= 180) { + std::swap(p1, p2); + } + + sp_repr_set_svg_double(repr, "x1", p1[Geom::X]); + sp_repr_set_svg_double(repr, "y1", p1[Geom::Y]); + sp_repr_set_svg_double(repr, "x2", p2[Geom::X]); + sp_repr_set_svg_double(repr, "y2", p2[Geom::Y]); + } else { // Mesh // THIS IS BEING CALLED TWICE WHENEVER A NEW GRADIENT IS CREATED, WRITING HERE CAUSES PROBLEMS === modified file 'src/ui/dialog/inkscape-preferences.cpp' --- src/ui/dialog/inkscape-preferences.cpp 2012-09-11 00:14:11 +0000 +++ src/ui/dialog/inkscape-preferences.cpp 2012-09-12 00:48:16 +0000 @@ -478,6 +478,11 @@ _page_gradient.add_line( false, "", _misc_gradienteditor, "", _("When on, the Gradient Edit button in the Fill & Stroke dialog will show the legacy Gradient Editor dialog, when off the Gradient Tool will be used"), true); + _misc_gradientangle.init("/dialogs/gradienteditor/angle", -359, 359, 1, 90, 0, false, false); + _page_gradient.add_line( false, _("Linear gradient angle:"), _misc_gradientangle, "", + _("Default angle of new linear gradients (clockwise from horizontal"), false); + + //Dropper this->AddPage(_page_dropper, _("Dropper"), iter_tools, PREFS_PAGE_TOOLS_DROPPER); this->AddSelcueCheckbox(_page_dropper, "/tools/dropper", true); === modified file 'src/ui/dialog/inkscape-preferences.h' --- src/ui/dialog/inkscape-preferences.h 2012-08-30 00:36:57 +0000 +++ src/ui/dialog/inkscape-preferences.h 2012-09-12 00:48:16 +0000 @@ -300,6 +300,7 @@ UI::Widget::PrefCheckButton _misc_default_metadata; UI::Widget::PrefCheckButton _misc_forkvectors; UI::Widget::PrefCheckButton _misc_gradienteditor; + UI::Widget::PrefSpinButton _misc_gradientangle; UI::Widget::PrefCheckButton _misc_scripts; UI::Widget::PrefCheckButton _misc_namedicon_delay;