diff --git a/src/sp-rect.cpp b/src/sp-rect.cpp
index 36e64614e6b00e6626af2ab0d103c3b6a074a66b..2f3fc1864acab40039b0c3e3f4d4144df0c1b160 100644 (file)
--- a/src/sp-rect.cpp
+++ b/src/sp-rect.cpp
-#define __SP_RECT_C__
-
/*
* SVG <rect> implementation
*
#include <glibmm/i18n.h>
#include "xml/repr.h"
#include "sp-guide.h"
-#include "prefs-utils.h"
+#include "preferences.h"
#define noRECT_VERBOSE
static void sp_rect_convert_to_guides(SPItem *item);
static void sp_rect_set_shape(SPShape *shape);
-static void sp_rect_snappoints(SPItem const *item, SnapPointsIter p);
+static void sp_rect_snappoints(SPItem const *item, SnapPointsIter p, Inkscape::SnapPreferences const *snapprefs);
static SPShapeClass *parent_class;
SPRect *rect = (SPRect *) object;
SPStyle *style = object->style;
SPItemCtx const *ictx = (SPItemCtx const *) ctx;
- double const d = NR::expansion(ictx->i2vp);
+ double const d = ictx->i2vp.descrim();
double const w = (ictx->vp.x1 - ictx->vp.x0) / d;
double const h = (ictx->vp.y1 - ictx->vp.y0) / d;
double const em = style->font_size.computed;
Returns the ratio in which the vector from p0 to p1 is stretched by transform
*/
static gdouble
-vector_stretch(NR::Point p0, NR::Point p1, NR::Matrix xform)
+vector_stretch(Geom::Point p0, Geom::Point p1, Geom::Matrix xform)
{
if (p0 == p1)
return 0;
- return (NR::distance(p0 * xform, p1 * xform) / NR::distance(p0, p1));
+ return (Geom::distance(p0 * xform, p1 * xform) / Geom::distance(p0, p1));
}
void
rect->rx._set = false;
} else {
rect->rx.computed = rx / vector_stretch(
- NR::Point(rect->x.computed + 1, rect->y.computed),
- NR::Point(rect->x.computed, rect->y.computed),
+ Geom::Point(rect->x.computed + 1, rect->y.computed),
+ Geom::Point(rect->x.computed, rect->y.computed),
SP_ITEM(rect)->transform);
rect->rx._set = true;
}
rect->ry._set = false;
} else {
rect->ry.computed = ry / vector_stretch(
- NR::Point(rect->x.computed, rect->y.computed + 1),
- NR::Point(rect->x.computed, rect->y.computed),
+ Geom::Point(rect->x.computed, rect->y.computed + 1),
+ Geom::Point(rect->x.computed, rect->y.computed),
SP_ITEM(rect)->transform);
rect->ry._set = true;
}
if (!rect->rx._set)
return 0;
return rect->rx.computed * vector_stretch(
- NR::Point(rect->x.computed + 1, rect->y.computed),
- NR::Point(rect->x.computed, rect->y.computed),
+ Geom::Point(rect->x.computed + 1, rect->y.computed),
+ Geom::Point(rect->x.computed, rect->y.computed),
SP_ITEM(rect)->transform);
}
if (!rect->ry._set)
return 0;
return rect->ry.computed * vector_stretch(
- NR::Point(rect->x.computed, rect->y.computed + 1),
- NR::Point(rect->x.computed, rect->y.computed),
+ Geom::Point(rect->x.computed, rect->y.computed + 1),
+ Geom::Point(rect->x.computed, rect->y.computed),
SP_ITEM(rect)->transform);
}
void
-sp_rect_compensate_rxry(SPRect *rect, NR::Matrix xform)
+sp_rect_compensate_rxry(SPRect *rect, Geom::Matrix xform)
{
if (rect->rx.computed == 0 && rect->ry.computed == 0)
return; // nothing to compensate
// test unit vectors to find out compensation:
- NR::Point c(rect->x.computed, rect->y.computed);
- NR::Point cx = c + NR::Point(1, 0);
- NR::Point cy = c + NR::Point(0, 1);
+ Geom::Point c(rect->x.computed, rect->y.computed);
+ Geom::Point cx = c + Geom::Point(1, 0);
+ Geom::Point cy = c + Geom::Point(0, 1);
// apply previous transform if any
c *= SP_ITEM(rect)->transform;
sp_rect_set_visible_width(SPRect *rect, gdouble width)
{
rect->width.computed = width / vector_stretch(
- NR::Point(rect->x.computed + 1, rect->y.computed),
- NR::Point(rect->x.computed, rect->y.computed),
+ Geom::Point(rect->x.computed + 1, rect->y.computed),
+ Geom::Point(rect->x.computed, rect->y.computed),
SP_ITEM(rect)->transform);
rect->width._set = true;
SP_OBJECT(rect)->updateRepr();
sp_rect_set_visible_height(SPRect *rect, gdouble height)
{
rect->height.computed = height / vector_stretch(
- NR::Point(rect->x.computed, rect->y.computed + 1),
- NR::Point(rect->x.computed, rect->y.computed),
+ Geom::Point(rect->x.computed, rect->y.computed + 1),
+ Geom::Point(rect->x.computed, rect->y.computed),
SP_ITEM(rect)->transform);
rect->height._set = true;
SP_OBJECT(rect)->updateRepr();
if (!rect->width._set)
return 0;
return rect->width.computed * vector_stretch(
- NR::Point(rect->x.computed + 1, rect->y.computed),
- NR::Point(rect->x.computed, rect->y.computed),
+ Geom::Point(rect->x.computed + 1, rect->y.computed),
+ Geom::Point(rect->x.computed, rect->y.computed),
SP_ITEM(rect)->transform);
}
if (!rect->height._set)
return 0;
return rect->height.computed * vector_stretch(
- NR::Point(rect->x.computed, rect->y.computed + 1),
- NR::Point(rect->x.computed, rect->y.computed),
+ Geom::Point(rect->x.computed, rect->y.computed + 1),
+ Geom::Point(rect->x.computed, rect->y.computed),
SP_ITEM(rect)->transform);
}
/**
* Sets the snappoint p to the unrounded corners of the rectangle
*/
-static void sp_rect_snappoints(SPItem const *item, SnapPointsIter p)
+static void sp_rect_snappoints(SPItem const *item, SnapPointsIter p, Inkscape::SnapPreferences const *snapprefs)
{
/* This method overrides sp_shape_snappoints, which is the default for any shape. The default method
returns all eight points along the path of a rounded rectangle, but not the real corners. Snapping
- the startpoint and endpoint of each rounded corner is not very usefull and really confusing. Instead
+ the startpoint and endpoint of each rounded corner is not very useful and really confusing. Instead
we could snap either the real corners, or not snap at all. Bulia Byak opted to snap the real corners,
- but it should be noted that this might be confusing in some cases with relatively large radii. With
+ but it should be noted that this might be confusing in some cases with relatively large radii. With
small radii though the user will easily understand which point is snapping. */
-
+
g_assert(item != NULL);
g_assert(SP_IS_RECT(item));
SPRect *rect = SP_RECT(item);
- NR::Matrix const i2d (sp_item_i2d_affine (item));
+ Geom::Matrix const i2d (sp_item_i2d_affine (item));
+
+ Geom::Point p0 = Geom::Point(rect->x.computed, rect->y.computed) * i2d;
+ Geom::Point p1 = Geom::Point(rect->x.computed, rect->y.computed + rect->height.computed) * i2d;
+ Geom::Point p2 = Geom::Point(rect->x.computed + rect->width.computed, rect->y.computed + rect->height.computed) * i2d;
+ Geom::Point p3 = Geom::Point(rect->x.computed + rect->width.computed, rect->y.computed) * i2d;
- *p = NR::Point(rect->x.computed, rect->y.computed) * i2d;
- *p = NR::Point(rect->x.computed, rect->y.computed + rect->height.computed) * i2d;
- *p = NR::Point(rect->x.computed + rect->width.computed, rect->y.computed + rect->height.computed) * i2d;
- *p = NR::Point(rect->x.computed + rect->width.computed, rect->y.computed) * i2d;
+ *p = p0;
+ *p = p1;
+ *p = p2;
+ *p = p3;
+
+ if (snapprefs->getSnapMidpoints()) {
+ *p = (p0 + p1)/2;
+ *p = (p1 + p2)/2;
+ *p = (p2 + p3)/2;
+ *p = (p3 + p0)/2;
+ }
}
void
sp_rect_convert_to_guides(SPItem *item) {
SPRect *rect = SP_RECT(item);
- if (prefs_get_int_attribute("tools.shapes.rect", "convertguides", 1) == 0) {
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ if (!prefs->getBool("/tools/shapes/rect/convertguides", true)) {
sp_item_convert_to_guides(SP_ITEM(rect));
return;
}
std::list<std::pair<Geom::Point, Geom::Point> > pts;
- NR::Matrix const i2d (sp_item_i2d_affine(SP_ITEM(rect)));
+ Geom::Matrix const i2d (sp_item_i2d_affine(SP_ITEM(rect)));
- NR::Point A1(NR::Point(rect->x.computed, rect->y.computed) * i2d);
- NR::Point A2(NR::Point(rect->x.computed, rect->y.computed + rect->height.computed) * i2d);
- NR::Point A3(NR::Point(rect->x.computed + rect->width.computed, rect->y.computed + rect->height.computed) * i2d);
- NR::Point A4(NR::Point(rect->x.computed + rect->width.computed, rect->y.computed) * i2d);
+ Geom::Point A1(Geom::Point(rect->x.computed, rect->y.computed) * i2d);
+ Geom::Point A2(Geom::Point(rect->x.computed, rect->y.computed + rect->height.computed) * i2d);
+ Geom::Point A3(Geom::Point(rect->x.computed + rect->width.computed, rect->y.computed + rect->height.computed) * i2d);
+ Geom::Point A4(Geom::Point(rect->x.computed + rect->width.computed, rect->y.computed) * i2d);
pts.push_back(std::make_pair(A1, A2));
pts.push_back(std::make_pair(A2, A3));