diff options
| author | Denis Declara <declara91@gmail.com> | 2012-05-05 13:32:42 +0000 |
|---|---|---|
| committer | Denis Declara <declara91@gmail.com> | 2012-05-05 13:32:42 +0000 |
| commit | aeb9c1bde66de096910757abb17dedb94ad74207 (patch) | |
| tree | c0adf97685b0fa8af1553b14d20601f280492762 /src/display | |
| parent | Fixed some math, so that the objects now line up correctly (diff) | |
| parent | Adding checks to prevent null pointer dereferences (diff) | |
| download | inkscape-aeb9c1bde66de096910757abb17dedb94ad74207.tar.gz inkscape-aeb9c1bde66de096910757abb17dedb94ad74207.zip | |
Trunk merge
(bzr r11073.1.29)
Diffstat (limited to 'src/display')
| -rw-r--r-- | src/display/guideline.cpp | 7 | ||||
| -rw-r--r-- | src/display/sp-canvas-item.h | 29 | ||||
| -rw-r--r-- | src/display/sp-canvas.cpp | 33 | ||||
| -rw-r--r-- | src/display/sp-ctrlline.cpp | 125 | ||||
| -rw-r--r-- | src/display/sp-ctrlline.h | 25 |
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{}; |
