summaryrefslogtreecommitdiffstats
path: root/src/display
diff options
context:
space:
mode:
authorDenis Declara <declara91@gmail.com>2012-05-05 13:32:42 +0000
committerDenis Declara <declara91@gmail.com>2012-05-05 13:32:42 +0000
commitaeb9c1bde66de096910757abb17dedb94ad74207 (patch)
treec0adf97685b0fa8af1553b14d20601f280492762 /src/display
parentFixed some math, so that the objects now line up correctly (diff)
parentAdding checks to prevent null pointer dereferences (diff)
downloadinkscape-aeb9c1bde66de096910757abb17dedb94ad74207.tar.gz
inkscape-aeb9c1bde66de096910757abb17dedb94ad74207.zip
Trunk merge
(bzr r11073.1.29)
Diffstat (limited to 'src/display')
-rw-r--r--src/display/guideline.cpp7
-rw-r--r--src/display/sp-canvas-item.h29
-rw-r--r--src/display/sp-canvas.cpp33
-rw-r--r--src/display/sp-ctrlline.cpp125
-rw-r--r--src/display/sp-ctrlline.h25
5 files changed, 123 insertions, 96 deletions
diff --git a/src/display/guideline.cpp b/src/display/guideline.cpp
index dad989655..652f4e2d7 100644
--- a/src/display/guideline.cpp
+++ b/src/display/guideline.cpp
@@ -5,6 +5,7 @@
* Lauris Kaplinski <lauris@kaplinski.com>
* Johan Engelen
* Maximilian Albert <maximilian.albert@gmail.com>
+ * Jon A. Cruz <jon@joncruz.org>
*
* Copyright (C) 2000-2002 Lauris Kaplinski
* Copyright (C) 2007 Johan Engelen
@@ -24,6 +25,9 @@
#include "desktop.h"
#include "sp-namedview.h"
#include "display/sp-canvas.h"
+#include "ui/control-manager.h"
+
+using Inkscape::ControlManager;
static void sp_guideline_class_init(SPGuideLineClass *c);
static void sp_guideline_init(SPGuideLine *guideline);
@@ -228,7 +232,8 @@ static double sp_guideline_point(SPCanvasItem *item, Geom::Point p, SPCanvasItem
SPCanvasItem *sp_guideline_new(SPCanvasGroup *parent, char* label, Geom::Point point_on_line, Geom::Point normal)
{
SPCanvasItem *item = sp_canvas_item_new(parent, SP_TYPE_GUIDELINE, NULL);
- SPCanvasItem *origin = sp_canvas_item_new(parent, SP_TYPE_CTRLPOINT, NULL);
+ SPCanvasItem *origin = ControlManager::getManager().createControl(parent, Inkscape::CTRL_TYPE_ORIGIN);
+ ControlManager::getManager().track(origin);
SPGuideLine *gl = SP_GUIDELINE(item);
SPCtrlPoint *cp = SP_CTRLPOINT(origin);
diff --git a/src/display/sp-canvas-item.h b/src/display/sp-canvas-item.h
index 0a6d343b2..8baa09401 100644
--- a/src/display/sp-canvas-item.h
+++ b/src/display/sp-canvas-item.h
@@ -41,6 +41,23 @@ typedef struct _SPCanvasItemClass SPCanvasItemClass;
#define SP_IS_CANVAS_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_CANVAS_ITEM))
#define SP_CANVAS_ITEM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), SP_TYPE_CANVAS_ITEM, SPCanvasItemClass))
+namespace Inkscape
+{
+
+// Rough initial set. Most likely needs refinement.
+enum ControlType {
+ CTRL_TYPE_UNKNOWN,
+ CTRL_TYPE_ADJ_HANDLE,
+ CTRL_TYPE_ANCHOR,
+ CTRL_TYPE_POINT,
+ CTRL_TYPE_ROTATE,
+ CTRL_TYPE_SIZER,
+ CTRL_TYPE_SHAPER,
+ CTRL_TYPE_ORIGIN
+};
+
+} // namespace Inkscape
+
/**
* An SPCanvasItem refers to a SPCanvas and to its parent item; it has
* four coordinates, a bounding rectangle, and a transformation matrix.
@@ -51,10 +68,15 @@ struct SPCanvasItem : public GtkObject {
SPCanvas *canvas;
SPCanvasItem *parent;
- double x1, y1, x2, y2;
+ double x1;
+ double y1;
+ double x2;
+ double y2;
Geom::Rect bounds;
Geom::Affine xform;
-
+
+ Inkscape::ControlType ctrlType;
+
// Replacement for custom GtkObject flag enumeration
gboolean visible;
gboolean need_update;
@@ -74,6 +96,9 @@ struct _SPCanvasItemClass : public GtkObjectClass {
void (* viewbox_changed) (SPCanvasItem *item, Geom::IntRect const &new_area);
};
+/**
+ * Constructs new SPCanvasItem on SPCanvasGroup.
+ */
SPCanvasItem *sp_canvas_item_new(SPCanvasGroup *parent, GType type, const gchar *first_arg_name, ...);
G_END_DECLS
diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp
index 0f650bf4a..22aad2442 100644
--- a/src/display/sp-canvas.cpp
+++ b/src/display/sp-canvas.cpp
@@ -405,31 +405,30 @@ void sp_canvas_item_class_init(SPCanvasItemClass *klass)
void sp_canvas_item_init(SPCanvasItem *item)
{
+ item->xform = Geom::Affine(Geom::identity());
+ item->ctrlType = Inkscape::CTRL_TYPE_UNKNOWN;
+
// TODO items should not be visible on creation - this causes kludges with items
// that should be initially invisible; examples of such items: node handles, the CtrlRect
// used for rubberbanding, path outline, etc.
item->visible = TRUE;
- item->xform = Geom::Affine(Geom::identity());
}
} // namespace
-/**
- * Constructs new SPCanvasItem on SPCanvasGroup.
- */
SPCanvasItem *sp_canvas_item_new(SPCanvasGroup *parent, GType type, gchar const *first_arg_name, ...)
{
va_list args;
g_return_val_if_fail(parent != NULL, NULL);
- g_return_val_if_fail(SP_IS_CANVAS_GROUP (parent), NULL);
+ g_return_val_if_fail(SP_IS_CANVAS_GROUP(parent), NULL);
g_return_val_if_fail(g_type_is_a(type, SPCanvasItem::getType()), NULL);
- SPCanvasItem *item = SP_CANVAS_ITEM (g_object_new (type, NULL));
+ SPCanvasItem *item = SP_CANVAS_ITEM(g_object_new(type, NULL));
- va_start (args, first_arg_name);
- sp_canvas_item_construct (item, parent, first_arg_name, args);
- va_end (args);
+ va_start(args, first_arg_name);
+ sp_canvas_item_construct(item, parent, first_arg_name, args);
+ va_end(args);
return item;
}
@@ -438,17 +437,17 @@ namespace {
void sp_canvas_item_construct(SPCanvasItem *item, SPCanvasGroup *parent, gchar const *first_arg_name, va_list args)
{
- g_return_if_fail (SP_IS_CANVAS_GROUP (parent));
- g_return_if_fail (SP_IS_CANVAS_ITEM (item));
+ g_return_if_fail(SP_IS_CANVAS_GROUP(parent));
+ g_return_if_fail(SP_IS_CANVAS_ITEM(item));
- item->parent = SP_CANVAS_ITEM (parent);
+ item->parent = SP_CANVAS_ITEM(parent);
item->canvas = item->parent->canvas;
- g_object_set_valist (G_OBJECT (item), first_arg_name, args);
+ g_object_set_valist(G_OBJECT(item), first_arg_name, args);
SP_CANVAS_GROUP(item->parent)->add(item);
- sp_canvas_item_request_update (item);
+ sp_canvas_item_request_update(item);
}
} // namespace
@@ -458,7 +457,7 @@ void sp_canvas_item_construct(SPCanvasItem *item, SPCanvasGroup *parent, gchar c
*/
static void redraw_if_visible(SPCanvasItem *item)
{
- if(item->visible) {
+ if (item->visible) {
int x0 = (int)(item->x1);
int x1 = (int)(item->x2);
int y0 = (int)(item->y1);
@@ -528,11 +527,11 @@ static void sp_canvas_item_invoke_update(SPCanvasItem *item, Geom::Affine const
// apply object flags to child flags
int child_flags = flags & ~SP_CANVAS_UPDATE_REQUESTED;
- if(item->need_update) {
+ if (item->need_update) {
child_flags |= SP_CANVAS_UPDATE_REQUESTED;
}
- if(item->need_affine) {
+ if (item->need_affine) {
child_flags |= SP_CANVAS_UPDATE_AFFINE;
}
diff --git a/src/display/sp-ctrlline.cpp b/src/display/sp-ctrlline.cpp
index 3175baf96..11d0b34f8 100644
--- a/src/display/sp-ctrlline.cpp
+++ b/src/display/sp-ctrlline.cpp
@@ -28,82 +28,82 @@
#include "color.h"
#include "display/sp-canvas.h"
+namespace {
-static void sp_ctrlline_class_init (SPCtrlLineClass *klass);
-static void sp_ctrlline_init (SPCtrlLine *ctrlline);
-static void sp_ctrlline_destroy (GtkObject *object);
+void sp_ctrlline_class_init(SPCtrlLineClass *klass, gpointer data);
+void sp_ctrlline_init(SPCtrlLine *ctrlline, gpointer g_class);
+void sp_ctrlline_destroy(GtkObject *object);
-static void sp_ctrlline_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
-static void sp_ctrlline_render (SPCanvasItem *item, SPCanvasBuf *buf);
+void sp_ctrlline_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
+void sp_ctrlline_render(SPCanvasItem *item, SPCanvasBuf *buf);
-static SPCanvasItemClass *parent_class;
+SPCanvasItemClass *parent_class = 0;
-GType
-sp_ctrlline_get_type (void)
+} // namespace
+
+GType SPCtrlLine::getType()
{
static GType type = 0;
if (!type) {
GTypeInfo info = {
sizeof(SPCtrlLineClass),
NULL, NULL,
- (GClassInitFunc) sp_ctrlline_class_init,
+ reinterpret_cast<GClassInitFunc>(sp_ctrlline_class_init),
NULL, NULL,
sizeof(SPCtrlLine),
0,
- (GInstanceInitFunc) sp_ctrlline_init,
+ reinterpret_cast<GInstanceInitFunc>(sp_ctrlline_init),
NULL
};
- type = g_type_register_static(SP_TYPE_CANVAS_ITEM, "SPCtrlLine", &info, (GTypeFlags)0);
+ type = g_type_register_static(SP_TYPE_CANVAS_ITEM, "SPCtrlLine", &info, static_cast<GTypeFlags>(0));
}
return type;
}
-static void
-sp_ctrlline_class_init (SPCtrlLineClass *klass)
-{
- GtkObjectClass *object_class = (GtkObjectClass *) klass;
- SPCanvasItemClass *item_class = (SPCanvasItemClass *) klass;
+namespace {
- parent_class = (SPCanvasItemClass*)g_type_class_peek_parent (klass);
+void sp_ctrlline_class_init(SPCtrlLineClass *klass, gpointer /*data*/)
+{
+ parent_class = reinterpret_cast<SPCanvasItemClass*>(g_type_class_peek_parent(klass));
- object_class->destroy = sp_ctrlline_destroy;
+ klass->destroy = sp_ctrlline_destroy;
- item_class->update = sp_ctrlline_update;
- item_class->render = sp_ctrlline_render;
+ klass->update = sp_ctrlline_update;
+ klass->render = sp_ctrlline_render;
}
-static void
-sp_ctrlline_init (SPCtrlLine *ctrlline)
+void sp_ctrlline_init(SPCtrlLine *ctrlline, gpointer /*g_class*/)
{
ctrlline->rgba = 0x0000ff7f;
ctrlline->s[Geom::X] = ctrlline->s[Geom::Y] = ctrlline->e[Geom::X] = ctrlline->e[Geom::Y] = 0.0;
ctrlline->item=NULL;
}
-static void
-sp_ctrlline_destroy (GtkObject *object)
+void sp_ctrlline_destroy(GtkObject *object)
{
- g_return_if_fail (object != NULL);
- g_return_if_fail (SP_IS_CTRLLINE (object));
+ g_return_if_fail(object != NULL);
+ g_return_if_fail(SP_IS_CTRLLINE(object));
- SPCtrlLine *ctrlline = SP_CTRLLINE (object);
+ SPCtrlLine *ctrlline = SP_CTRLLINE(object);
- ctrlline->item=NULL;
+ ctrlline->item = NULL;
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+ if (GTK_OBJECT_CLASS (parent_class)->destroy) {
+ (* GTK_OBJECT_CLASS (parent_class)->destroy)(object);
+ }
}
-static void
-sp_ctrlline_render (SPCanvasItem *item, SPCanvasBuf *buf)
+void sp_ctrlline_render(SPCanvasItem *item, SPCanvasBuf *buf)
{
- SPCtrlLine *cl = SP_CTRLLINE (item);
+ SPCtrlLine *cl = SP_CTRLLINE(item);
- if (!buf->ct)
+ if (!buf->ct) {
return;
+ }
- if (cl->s == cl->e)
+ if (cl->s == cl->e) {
return;
+ }
ink_cairo_set_source_rgba32(buf->ct, cl->rgba);
cairo_set_line_width(buf->ct, 1);
@@ -118,17 +118,17 @@ sp_ctrlline_render (SPCanvasItem *item, SPCanvasBuf *buf)
cairo_stroke(buf->ct);
}
-static void
-sp_ctrlline_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
+void sp_ctrlline_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
{
- SPCtrlLine *cl = SP_CTRLLINE (item);
+ SPCtrlLine *cl = SP_CTRLLINE(item);
- item->canvas->requestRedraw((int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2);
+ item->canvas->requestRedraw(item->x1, item->y1, item->x2, item->y2);
- if (parent_class->update)
- (* parent_class->update) (item, affine, flags);
+ if (parent_class->update) {
+ (* parent_class->update)(item, affine, flags);
+ }
- sp_canvas_item_reset_bounds (item);
+ sp_canvas_item_reset_bounds(item);
cl->affine = affine;
@@ -144,46 +144,37 @@ sp_ctrlline_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int
item->x2 = round(MAX(s[Geom::X], e[Geom::X]) + 1);
item->y2 = round(MAX(s[Geom::Y], e[Geom::Y]) + 1);
- item->canvas->requestRedraw((int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2);
+ item->canvas->requestRedraw(item->x1, item->y1, item->x2, item->y2);
}
}
-void
-sp_ctrlline_set_rgba32 (SPCtrlLine *cl, guint32 rgba)
+} // namespace
+
+void SPCtrlLine::setRgba32(guint32 rgba)
{
- g_return_if_fail (cl != NULL);
- g_return_if_fail (SP_IS_CTRLLINE (cl));
-
- if (rgba != cl->rgba) {
- SPCanvasItem *item;
- cl->rgba = rgba;
- item = SP_CANVAS_ITEM (cl);
- item->canvas->requestRedraw((int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2);
+ if (rgba != this->rgba) {
+ this->rgba = rgba;
+ canvas->requestRedraw(x1, y1, x2, y2);
}
}
#define EPSILON 1e-6
#define DIFFER(a,b) (fabs ((a) - (b)) > EPSILON)
-void
-sp_ctrlline_set_coords (SPCtrlLine *cl, gdouble x0, gdouble y0, gdouble x1, gdouble y1)
+void SPCtrlLine::setCoords(gdouble x0, gdouble y0, gdouble x1, gdouble y1)
{
- g_return_if_fail (cl != NULL);
- g_return_if_fail (SP_IS_CTRLLINE (cl));
-
- if (DIFFER (x0, cl->s[Geom::X]) || DIFFER (y0, cl->s[Geom::Y]) || DIFFER (x1, cl->e[Geom::X]) || DIFFER (y1, cl->e[Geom::Y])) {
- cl->s[Geom::X] = x0;
- cl->s[Geom::Y] = y0;
- cl->e[Geom::X] = x1;
- cl->e[Geom::Y] = y1;
- sp_canvas_item_request_update (SP_CANVAS_ITEM (cl));
+ if (DIFFER(x0, s[Geom::X]) || DIFFER(y0, s[Geom::Y]) || DIFFER(x1, e[Geom::X]) || DIFFER(y1, e[Geom::Y])) {
+ s[Geom::X] = x0;
+ s[Geom::Y] = y0;
+ e[Geom::X] = x1;
+ e[Geom::Y] = y1;
+ sp_canvas_item_request_update(this);
}
}
-void
-sp_ctrlline_set_coords (SPCtrlLine *cl, const Geom::Point start, const Geom::Point end)
+void SPCtrlLine::setCoords(Geom::Point const &start, Geom::Point const &end)
{
- sp_ctrlline_set_coords(cl, start[0], start[1], end[0], end[1]);
+ setCoords(start[0], start[1], end[0], end[1]);
}
/*
diff --git a/src/display/sp-ctrlline.h b/src/display/sp-ctrlline.h
index 4bfe50a77..12be03ca5 100644
--- a/src/display/sp-ctrlline.h
+++ b/src/display/sp-ctrlline.h
@@ -7,7 +7,9 @@
* Author:
* Lauris Kaplinski <lauris@kaplinski.com>
* Johan Engelen <j.b.c.engelen@ewi.utwente.nl>
+ * Jon A. Cruz <jon@joncruz.org>
*
+ * Copyright (C) 2012 Authors
* Copyright (C) 2007 Johan Engelen
* Copyright (C) 1999-2002 Lauris Kaplinski
*
@@ -18,23 +20,28 @@
class SPItem;
-#define SP_TYPE_CTRLLINE (sp_ctrlline_get_type ())
+#define SP_TYPE_CTRLLINE (SPCtrlLine::getType())
#define SP_CTRLLINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_CTRLLINE, SPCtrlLine))
#define SP_IS_CTRLLINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_CTRLLINE))
-struct SPCtrlLine : public SPCanvasItem{
+struct SPCtrlLine : public SPCanvasItem {
+ static GType getType();
+
+ void setRgba32(guint32 rgba);
+
+ void setCoords(gdouble x0, gdouble y0, gdouble x1, gdouble y1);
+
+ void setCoords(Geom::Point const &start, Geom::Point const &end);
+
+
SPItem *item; // the item to which this line belongs in some sense; may be NULL for some users
guint32 rgba;
- Geom::Point s, e;
+ Geom::Point s;
+ Geom::Point e;
Geom::Affine affine;
};
-struct SPCtrlLineClass : public SPCanvasItemClass{};
-GType sp_ctrlline_get_type (void);
-
-void sp_ctrlline_set_rgba32 (SPCtrlLine *cl, guint32 rgba);
-void sp_ctrlline_set_coords (SPCtrlLine *cl, gdouble x0, gdouble y0, gdouble x1, gdouble y1);
-void sp_ctrlline_set_coords (SPCtrlLine *cl, const Geom::Point start, const Geom::Point end);
+struct SPCtrlLineClass : public SPCanvasItemClass{};