diff --git a/src/sp-conn-end.cpp b/src/sp-conn-end.cpp
index 536addf4e6b860ccbff0afe6fa585fd02a547ae4..91ff4bc2bf3fd1a3d85f6723f120c01e9875078a 100644 (file)
--- a/src/sp-conn-end.cpp
+++ b/src/sp-conn-end.cpp
+#include <cstring>
+#include <string>
+
#include "display/curve.h"
-#include "libnr/nr-matrix-div.h"
#include "libnr/nr-matrix-fns.h"
#include "xml/repr.h"
#include "sp-conn-end.h"
#include "document.h"
-static void change_endpts(SPCurve *const curve, NR::Point const h2endPt[2]);
-static NR::Point calc_bbox_conn_pt(NR::Rect const &bbox, NR::Point const &p);
+static void change_endpts(SPCurve *const curve, Geom::Point const h2endPt[2]);
+static Geom::Point calc_bbox_conn_pt(Geom::Rect const &bbox, Geom::Point const &p);
static double signed_one(double const x);
SPConnEnd::SPConnEnd(SPObject *const owner) :
@@ -34,11 +36,11 @@ get_nearest_common_ancestor(SPObject const *const obj, SPItem const *const objs[
}
static void
-sp_conn_end_move_compensate(NR::Matrix const *mp, SPItem *moved_item,
+sp_conn_end_move_compensate(Geom::Matrix const */*mp*/, SPItem */*moved_item*/,
SPPath *const path,
bool const updatePathRepr = true)
{
- // TODO: SPItem::invokeBbox gives the wrong result for some objects
+ // TODO: SPItem::getBounds gives the wrong result for some objects
// that have internal representations that are updated later
// by the sp_*_update functions, e.g., text.
sp_document_ensure_up_to_date(path->document);
SPItem const *const path_item = SP_ITEM(path);
SPObject const *const ancestor = get_nearest_common_ancestor(path_item, h2attItem);
- NR::Matrix const path2anc(i2anc_affine(path_item, ancestor));
+ Geom::Matrix const path2anc(i2anc_affine(path_item, ancestor));
if (h2attItem[0] != NULL && h2attItem[1] != NULL) {
/* Initial end-points: centre of attached object. */
- NR::Point h2endPt_icoordsys[2];
- NR::Matrix h2i2anc[2];
- NR::Rect h2bbox_icoordsys[2] = {
- h2attItem[0]->invokeBbox(NR::identity()),
- h2attItem[1]->invokeBbox(NR::identity())
- };
- NR::Point last_seg_endPt[2] = {
- sp_curve_second_point(path->curve),
- sp_curve_penultimate_point(path->curve)
+ Geom::Point h2endPt_icoordsys[2];
+ Geom::Matrix h2i2anc[2];
+ Geom::Rect h2bbox_icoordsys[2];
+ Geom::Point last_seg_endPt[2] = {
+ *(path->curve->second_point()),
+ *(path->curve->penultimate_point())
};
for (unsigned h = 0; h < 2; ++h) {
+ Geom::OptRect bbox = h2attItem[h]->getBounds(Geom::identity());
+ if (!bbox) {
+ if (updatePathRepr) {
+ path->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
+ path->updateRepr();
+ }
+ return;
+ }
+ h2bbox_icoordsys[h] = *bbox;
h2i2anc[h] = i2anc_affine(h2attItem[h], ancestor);
h2endPt_icoordsys[h] = h2bbox_icoordsys[h].midpoint();
}
// For each attached object, change the corresponding point to be
// on the edge of the bbox.
- NR::Point h2endPt_pcoordsys[2];
+ Geom::Point h2endPt_pcoordsys[2];
for (unsigned h = 0; h < 2; ++h) {
h2endPt_icoordsys[h] = calc_bbox_conn_pt(h2bbox_icoordsys[h],
- ( last_seg_endPt[h] / h2i2anc[h] ));
- h2endPt_pcoordsys[h] = h2endPt_icoordsys[h] * h2i2anc[h] / path2anc;
+ ( last_seg_endPt[h] * h2i2anc[h].inverse() ));
+ h2endPt_pcoordsys[h] = h2endPt_icoordsys[h] * h2i2anc[h] * path2anc.inverse();
}
change_endpts(path->curve, h2endPt_pcoordsys);
} else {
// We leave the unattached endpoint where it is, and adjust the
// position of the attached endpoint to be on the edge of the bbox.
unsigned ind;
- NR::Point other_endpt;
- NR::Point last_seg_pt;
+ Geom::Point other_endpt;
+ Geom::Point last_seg_pt;
if (h2attItem[0] != NULL) {
- other_endpt = sp_curve_last_point(path->curve);
- last_seg_pt = sp_curve_second_point(path->curve);
+ other_endpt = *(path->curve->last_point());
+ last_seg_pt = *(path->curve->second_point());
ind = 0;
}
else {
- other_endpt = sp_curve_first_point(path->curve);
- last_seg_pt = sp_curve_penultimate_point(path->curve);
+ other_endpt = *(path->curve->first_point());
+ last_seg_pt = *(path->curve->penultimate_point());
ind = 1;
}
- NR::Point h2endPt_icoordsys[2];
- NR::Matrix h2i2anc;
-
- NR::Rect otherpt_rect = NR::Rect(other_endpt, other_endpt);
- NR::Rect h2bbox_icoordsys[2] = { otherpt_rect, otherpt_rect };
- h2bbox_icoordsys[ind] = h2attItem[ind]->invokeBbox(NR::identity());
+ Geom::Point h2endPt_icoordsys[2];
+ Geom::Matrix h2i2anc;
+
+ Geom::Rect otherpt_rect = Geom::Rect(other_endpt, other_endpt);
+ Geom::Rect h2bbox_icoordsys[2] = { otherpt_rect, otherpt_rect };
+ Geom::OptRect bbox = h2attItem[ind]->getBounds(Geom::identity());
+ if (!bbox) {
+ if (updatePathRepr) {
+ path->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
+ path->updateRepr();
+ }
+ return;
+ }
+ h2bbox_icoordsys[ind] = *bbox;
h2i2anc = i2anc_affine(h2attItem[ind], ancestor);
h2endPt_icoordsys[ind] = h2bbox_icoordsys[ind].midpoint();
// For the attached object, change the corresponding point to be
// on the edge of the bbox.
- NR::Point h2endPt_pcoordsys[2];
+ Geom::Point h2endPt_pcoordsys[2];
h2endPt_icoordsys[ind] = calc_bbox_conn_pt(h2bbox_icoordsys[ind],
- ( last_seg_pt / h2i2anc ));
- h2endPt_pcoordsys[ind] = h2endPt_icoordsys[ind] * h2i2anc / path2anc;
+ ( last_seg_pt * h2i2anc.inverse() ));
+ h2endPt_pcoordsys[ind] = h2endPt_icoordsys[ind] * h2i2anc * path2anc.inverse();
// Leave the other where it is.
h2endPt_pcoordsys[!ind] = other_endpt;
// TODO: This triggering of makeInvalidPath could be cleaned up to be
// another option passed to move_compensate.
static void
-sp_conn_end_shape_move_compensate(NR::Matrix const *mp, SPItem *moved_item,
+sp_conn_end_shape_move_compensate(Geom::Matrix const *mp, SPItem *moved_item,
SPPath *const path)
{
if (path->connEndPair.isAutoRoutingConn()) {
sp_conn_end_move_compensate(NULL, NULL, path, updatePathRepr);
}
-static NR::Point
-calc_bbox_conn_pt(NR::Rect const &bbox, NR::Point const &p)
+static Geom::Point
+calc_bbox_conn_pt(Geom::Rect const &bbox, Geom::Point const &p)
{
- using NR::X;
- using NR::Y;
- NR::Point const ctr(bbox.midpoint());
- NR::Point const lengths(bbox.dimensions());
+ using Geom::X;
+ using Geom::Y;
+ Geom::Point const ctr(bbox.midpoint());
+ Geom::Point const lengths(bbox.dimensions());
if ( ctr == p ) {
/* Arbitrarily choose centre of right edge. */
- return NR::Point(ctr[X] + .5 * lengths[X],
+ return Geom::Point(ctr[X] + .5 * lengths[X],
ctr[Y]);
}
- NR::Point const cp( p - ctr );
- NR::Dim2 const edgeDim = ( ( fabs(lengths[Y] * cp[X]) <
+ Geom::Point const cp( p - ctr );
+ Geom::Dim2 const edgeDim = ( ( fabs(lengths[Y] * cp[X]) <
fabs(lengths[X] * cp[Y]) )
? Y
: X );
- NR::Dim2 const otherDim = (NR::Dim2) !edgeDim;
- NR::Point offset;
+ Geom::Dim2 const otherDim = (Geom::Dim2) !edgeDim;
+ Geom::Point offset;
offset[edgeDim] = (signed_one(cp[edgeDim])
* lengths[edgeDim]);
offset[otherDim] = (lengths[edgeDim]
}
static void
-change_endpts(SPCurve *const curve, NR::Point const h2endPt[2])
+change_endpts(SPCurve *const curve, Geom::Point const h2endPt[2])
{
#if 0
- sp_curve_reset(curve);
- sp_curve_moveto(curve, h2endPt[0]);
- sp_curve_lineto(curve, h2endPt[1]);
+ curve->reset();
+ curve->moveto(h2endPt[0]);
+ curve->lineto(h2endPt[1]);
#else
- sp_curve_move_endpoints(curve, h2endPt[0], h2endPt[1]);
+ curve->move_endpoints(h2endPt[0], h2endPt[1]);
#endif
}
}
void
-sp_conn_end_href_changed(SPObject *old_ref, SPObject *ref,
+sp_conn_end_href_changed(SPObject */*old_ref*/, SPObject */*ref*/,
SPConnEnd *connEndPtr, SPPath *const path, unsigned const handle_ix)
{
g_return_if_fail(connEndPtr != NULL);