From ab7cc89c4f9f938575e777530c31312cde116208 Mon Sep 17 00:00:00 2001 From: Marc Jeanmougin Date: Sun, 13 Dec 2015 20:23:22 +0100 Subject: cppification and performance (bzr r14529) --- src/display/sp-canvas.cpp | 195 ++++++++++++++++------------------------------ 1 file changed, 66 insertions(+), 129 deletions(-) (limited to 'src/display/sp-canvas.cpp') diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp index 5efc4ce86..6441ea68b 100644 --- a/src/display/sp-canvas.cpp +++ b/src/display/sp-canvas.cpp @@ -58,7 +58,7 @@ struct SPCanvasGroupClass { }; /** - * A group of Items. + * A group of items. */ struct SPCanvasGroup { /** @@ -109,8 +109,8 @@ struct SPCanvasGroup { SPCanvasItem item; - GList *items; - GList *last; + std::list *items; + }; /** @@ -166,13 +166,6 @@ static guint object_signals[LAST_SIGNAL] = { 0 }; */ void sp_canvas_item_construct(SPCanvasItem *item, SPCanvasGroup *parent, gchar const *first_arg_name, va_list args); -/** - * Convenience function to reorder items in a group's child list. - * - * This puts the specified link after the "before" link. - */ -void put_item_after(GList *link, GList *before); - /** * Helper that returns true iff item is descendant of parent. */ @@ -590,64 +583,6 @@ void sp_canvas_item_affine_absolute(SPCanvasItem *item, Geom::Affine const &affi item->canvas->need_repick = TRUE; } -namespace { - -void put_item_after(GList *link, GList *before) -{ - if (link == before) { - return; - } - - SPCanvasGroup *parent = SP_CANVAS_GROUP (SP_CANVAS_ITEM (link->data)->parent); - - if (before == NULL) { - if (link == parent->items) { - return; - } - - link->prev->next = link->next; - - if (link->next) { - link->next->prev = link->prev; - } else { - parent->last = link->prev; - } - - link->prev = before; - link->next = parent->items; - link->next->prev = link; - parent->items = link; - } else { - if ((link == parent->last) && (before == parent->last->prev)) { - return; - } - - if (link->next) { - link->next->prev = link->prev; - } - - if (link->prev) { - link->prev->next = link->next; - } else { - parent->items = link->next; - parent->items->prev = NULL; - } - - link->prev = before; - link->next = before->next; - - link->prev->next = link; - - if (link->next) { - link->next->prev = link; - } else { - parent->last = link; - } - } -} - -} // namespace - /** * Raises the item in its parent's stack by the specified number of positions. * @@ -668,24 +603,34 @@ void sp_canvas_item_raise(SPCanvasItem *item, int positions) } SPCanvasGroup *parent = SP_CANVAS_GROUP (item->parent); - GList *link = g_list_find (parent->items, item); - g_assert (link != NULL); + std::list::iterator l = std::find(parent->items->begin(),parent->items->end(), item); + g_assert (l != parent->items->end()); - GList *before; - for (before = link; positions && before; positions--) - before = before->next; + for (int i=0; iitems->end(); ++i) + l++; - if (!before) { - before = parent->last; - } + parent->items->remove(item); + parent->items->insert(l, item); - put_item_after (link, before); + redraw_if_visible (item); + item->canvas->need_repick = TRUE; +} +void sp_canvas_item_raise_to_top(SPCanvasItem *item) +{ + g_return_if_fail (item != NULL); + g_return_if_fail (SP_IS_CANVAS_ITEM (item)); + if (!item->parent) + return; + SPCanvasGroup *parent = SP_CANVAS_GROUP (item->parent); + parent->items->remove(item); + parent->items->insert(parent->items->end(),item); redraw_if_visible (item); item->canvas->need_repick = TRUE; } + /** * Lowers the item in its parent's stack by the specified number of positions. * @@ -701,28 +646,35 @@ void sp_canvas_item_lower(SPCanvasItem *item, int positions) g_return_if_fail (SP_IS_CANVAS_ITEM (item)); g_return_if_fail (positions >= 1); - if (!item->parent || positions == 0) { + if (!item->parent || positions == 0 || item == SP_CANVAS_GROUP(item->parent)->items->front() ) { return; } SPCanvasGroup *parent = SP_CANVAS_GROUP (item->parent); - GList *link = g_list_find (parent->items, item); - g_assert (link != NULL); + std::list::iterator l = std::find(parent->items->begin(),parent->items->end(), item); + g_assert (l != parent->items->end()); - GList *before; - if (link->prev) { - for (before = link->prev; positions && before; positions--) { - before = before->prev; - } - } else { - before = NULL; - } - - put_item_after (link, before); + for (int i=0; iitems->begin(); ++i) + l--; + + parent->items->remove(item); + parent->items->insert(l, item); redraw_if_visible (item); item->canvas->need_repick = TRUE; } +void sp_canvas_item_lower_to_bottom(SPCanvasItem *item) +{ + g_return_if_fail (item != NULL); + g_return_if_fail (SP_IS_CANVAS_ITEM (item)); + if (!item->parent) + return; + SPCanvasGroup *parent = SP_CANVAS_GROUP (item->parent); + parent->items->remove(item); + parent->items->insert(parent->items->begin(),item); + redraw_if_visible (item); + item->canvas->need_repick = TRUE; +} bool sp_canvas_item_is_visible(SPCanvasItem *item) { @@ -919,7 +871,8 @@ void sp_canvas_item_request_update(SPCanvasItem *item) */ gint sp_canvas_item_order (SPCanvasItem * item) { - return g_list_index (SP_CANVAS_GROUP (item->parent)->items, item); + SPCanvasGroup * p = SP_CANVAS_GROUP(item->parent); + return std::distance(p->items->begin(), std::find(p->items->begin(), p->items->end(), item)); } // SPCanvasGroup @@ -936,9 +889,9 @@ static void sp_canvas_group_class_init(SPCanvasGroupClass *klass) item_class->viewbox_changed = SPCanvasGroup::viewboxChanged; } -static void sp_canvas_group_init(SPCanvasGroup * /*group*/) +static void sp_canvas_group_init(SPCanvasGroup * group) { - // Nothing here + group->items = new std::list; } void SPCanvasGroup::destroy(SPCanvasItem *object) @@ -948,14 +901,15 @@ void SPCanvasGroup::destroy(SPCanvasItem *object) SPCanvasGroup const *group = SP_CANVAS_GROUP(object); - GList *list = group->items; - while (list) { - SPCanvasItem *child = reinterpret_cast(list->data); - list = list->next; - + std::list *list = group->items; + for (std::list::iterator it = list->begin(); it != list->end(); ++it) { + SPCanvasItem *child = *it; sp_canvas_item_destroy(child); } + group->items->clear(); + delete group->items; + if (SP_CANVAS_ITEM_CLASS(sp_canvas_group_parent_class)->destroy) { (* SP_CANVAS_ITEM_CLASS(sp_canvas_group_parent_class)->destroy)(object); } @@ -966,8 +920,8 @@ void SPCanvasGroup::update(SPCanvasItem *item, Geom::Affine const &affine, unsig SPCanvasGroup const *group = SP_CANVAS_GROUP(item); Geom::OptRect bounds; - for (GList *list = group->items; list; list = list->next) { - SPCanvasItem *i = SP_CANVAS_ITEM(list->data); + for (std::list::const_iterator it = group->items->begin(); it != group->items->end(); ++it) { + SPCanvasItem *i = *it; sp_canvas_item_invoke_update (i, affine, flags); @@ -1002,9 +956,8 @@ double SPCanvasGroup::point(SPCanvasItem *item, Geom::Point p, SPCanvasItem **ac *actual_item = NULL; double dist = 0.0; - - for (GList *list = group->items; list; list = list->next) { - SPCanvasItem *child = SP_CANVAS_ITEM(list->data); + for (std::list::const_iterator it = group->items->begin(); it != group->items->end(); ++it) { + SPCanvasItem *child = *it; if ((child->x1 <= x2) && (child->y1 <= y2) && (child->x2 >= x1) && (child->y2 >= y1)) { SPCanvasItem *point_item = NULL; // cater for incomplete item implementations @@ -1037,8 +990,8 @@ void SPCanvasGroup::render(SPCanvasItem *item, SPCanvasBuf *buf) { SPCanvasGroup const *group = SP_CANVAS_GROUP(item); - for (GList *list = group->items; list; list = list->next) { - SPCanvasItem *child = SP_CANVAS_ITEM(list->data); + for (std::list::const_iterator it = group->items->begin(); it != group->items->end(); ++it) { + SPCanvasItem *child = *it; if (child->visible) { if ((child->x1 < buf->rect.right()) && (child->y1 < buf->rect.bottom()) && @@ -1056,8 +1009,8 @@ void SPCanvasGroup::viewboxChanged(SPCanvasItem *item, Geom::IntRect const &new_ { SPCanvasGroup *group = SP_CANVAS_GROUP(item); - for (GList *list = group->items; list; list = list->next) { - SPCanvasItem *child = SP_CANVAS_ITEM(list->data); + for (std::list::const_iterator it = group->items->begin(); it != group->items->end(); ++it) { + SPCanvasItem *child = *it; if (child->visible) { if (SP_CANVAS_ITEM_GET_CLASS(child)->viewbox_changed) { SP_CANVAS_ITEM_GET_CLASS(child)->viewbox_changed(child, new_area); @@ -1071,37 +1024,21 @@ void SPCanvasGroup::add(SPCanvasItem *item) g_object_ref(item); g_object_ref_sink(item); - if (!items) { - items = g_list_append(items, item); - last = items; - } else { - last = g_list_append(last, item)->next; - } + items->push_back(item); sp_canvas_item_request_update(item); } void SPCanvasGroup::remove(SPCanvasItem *item) { + g_return_if_fail(item != NULL); + items->remove(item); - for (GList *children = items; children; children = children->next) { - if (children->data == item) { - - // Unparent the child - item->parent = NULL; - g_object_unref(item); - - // Remove it from the list - if (children == last) { - last = children->prev; - } + // Unparent the child + item->parent = NULL; + g_object_unref(item); - items = g_list_remove_link(items, children); - g_list_free(children); - break; - } - } } static void sp_canvas_dispose (GObject *object); -- cgit v1.2.3 From 90577b7848b02830973da377bc9ceff09aa1f039 Mon Sep 17 00:00:00 2001 From: "Liam P. White" Date: Sun, 17 Jan 2016 11:05:43 -0500 Subject: Follow-up commit to 14529. From std::list documentation: list::insert - The container is extended by inserting new elements before the element at the specified position. (bzr r14601) --- src/display/sp-canvas.cpp | 73 ++++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 33 deletions(-) (limited to 'src/display/sp-canvas.cpp') diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp index 6441ea68b..e94133b28 100644 --- a/src/display/sp-canvas.cpp +++ b/src/display/sp-canvas.cpp @@ -109,7 +109,7 @@ struct SPCanvasGroup { SPCanvasItem item; - std::list *items; + std::list items; }; @@ -603,14 +603,14 @@ void sp_canvas_item_raise(SPCanvasItem *item, int positions) } SPCanvasGroup *parent = SP_CANVAS_GROUP (item->parent); - std::list::iterator l = std::find(parent->items->begin(),parent->items->end(), item); - g_assert (l != parent->items->end()); + std::list::iterator l = std::find(parent->items.begin(),parent->items.end(), item); + g_assert (l != parent->items.end()); - for (int i=0; iitems->end(); ++i) + for (int i=0; iitems.end(); ++i) l++; - parent->items->remove(item); - parent->items->insert(l, item); + parent->items.remove(item); + parent->items.insert(++l, item); redraw_if_visible (item); item->canvas->need_repick = TRUE; @@ -623,8 +623,8 @@ void sp_canvas_item_raise_to_top(SPCanvasItem *item) if (!item->parent) return; SPCanvasGroup *parent = SP_CANVAS_GROUP (item->parent); - parent->items->remove(item); - parent->items->insert(parent->items->end(),item); + parent->items.remove(item); + parent->items.push_back(item); redraw_if_visible (item); item->canvas->need_repick = TRUE; } @@ -646,23 +646,25 @@ void sp_canvas_item_lower(SPCanvasItem *item, int positions) g_return_if_fail (SP_IS_CANVAS_ITEM (item)); g_return_if_fail (positions >= 1); - if (!item->parent || positions == 0 || item == SP_CANVAS_GROUP(item->parent)->items->front() ) { + SPCanvasGroup *parent = SP_CANVAS_GROUP(item->parent); + + if (!parent || positions == 0 || item == parent->items.front() ) { return; } - SPCanvasGroup *parent = SP_CANVAS_GROUP (item->parent); - std::list::iterator l = std::find(parent->items->begin(),parent->items->end(), item); - g_assert (l != parent->items->end()); + std::list::iterator l = std::find(parent->items.begin(), parent->items.end(), item); + g_assert (l != parent->items.end()); - for (int i=0; iitems->begin(); ++i) + for (int i=0; iitems.begin(); ++i) l--; - parent->items->remove(item); - parent->items->insert(l, item); + parent->items.remove(item); + parent->items.insert(l, item); redraw_if_visible (item); item->canvas->need_repick = TRUE; } + void sp_canvas_item_lower_to_bottom(SPCanvasItem *item) { g_return_if_fail (item != NULL); @@ -670,15 +672,15 @@ void sp_canvas_item_lower_to_bottom(SPCanvasItem *item) if (!item->parent) return; SPCanvasGroup *parent = SP_CANVAS_GROUP (item->parent); - parent->items->remove(item); - parent->items->insert(parent->items->begin(),item); + parent->items.remove(item); + parent->items.push_front(item); redraw_if_visible (item); item->canvas->need_repick = TRUE; } bool sp_canvas_item_is_visible(SPCanvasItem *item) { - return item->visible; + return item->visible; } /** @@ -872,7 +874,14 @@ void sp_canvas_item_request_update(SPCanvasItem *item) gint sp_canvas_item_order (SPCanvasItem * item) { SPCanvasGroup * p = SP_CANVAS_GROUP(item->parent); - return std::distance(p->items->begin(), std::find(p->items->begin(), p->items->end(), item)); + size_t index = 0; + for (std::list::const_iterator it = p->items.begin(); it != p->items.end(); ++it, ++index) { + if ((*it) == item) { + return index; + } + } + + return -1; } // SPCanvasGroup @@ -891,7 +900,7 @@ static void sp_canvas_group_class_init(SPCanvasGroupClass *klass) static void sp_canvas_group_init(SPCanvasGroup * group) { - group->items = new std::list; + new (&group->items) std::list; } void SPCanvasGroup::destroy(SPCanvasItem *object) @@ -899,16 +908,14 @@ void SPCanvasGroup::destroy(SPCanvasItem *object) g_return_if_fail(object != NULL); g_return_if_fail(SP_IS_CANVAS_GROUP(object)); - SPCanvasGroup const *group = SP_CANVAS_GROUP(object); + SPCanvasGroup *group = SP_CANVAS_GROUP(object); - std::list *list = group->items; - for (std::list::iterator it = list->begin(); it != list->end(); ++it) { - SPCanvasItem *child = *it; - sp_canvas_item_destroy(child); + for (std::list::iterator it = group->items.begin(); it != group->items.end(); ++it) { + sp_canvas_item_destroy(*it); } - group->items->clear(); - delete group->items; + group->items.clear(); + group->items.~list(); // invoke manually if (SP_CANVAS_ITEM_CLASS(sp_canvas_group_parent_class)->destroy) { (* SP_CANVAS_ITEM_CLASS(sp_canvas_group_parent_class)->destroy)(object); @@ -920,7 +927,7 @@ void SPCanvasGroup::update(SPCanvasItem *item, Geom::Affine const &affine, unsig SPCanvasGroup const *group = SP_CANVAS_GROUP(item); Geom::OptRect bounds; - for (std::list::const_iterator it = group->items->begin(); it != group->items->end(); ++it) { + for (std::list::const_iterator it = group->items.begin(); it != group->items.end(); ++it) { SPCanvasItem *i = *it; sp_canvas_item_invoke_update (i, affine, flags); @@ -956,7 +963,7 @@ double SPCanvasGroup::point(SPCanvasItem *item, Geom::Point p, SPCanvasItem **ac *actual_item = NULL; double dist = 0.0; - for (std::list::const_iterator it = group->items->begin(); it != group->items->end(); ++it) { + for (std::list::const_iterator it = group->items.begin(); it != group->items.end(); ++it) { SPCanvasItem *child = *it; if ((child->x1 <= x2) && (child->y1 <= y2) && (child->x2 >= x1) && (child->y2 >= y1)) { @@ -990,7 +997,7 @@ void SPCanvasGroup::render(SPCanvasItem *item, SPCanvasBuf *buf) { SPCanvasGroup const *group = SP_CANVAS_GROUP(item); - for (std::list::const_iterator it = group->items->begin(); it != group->items->end(); ++it) { + for (std::list::const_iterator it = group->items.begin(); it != group->items.end(); ++it) { SPCanvasItem *child = *it; if (child->visible) { if ((child->x1 < buf->rect.right()) && @@ -1009,7 +1016,7 @@ void SPCanvasGroup::viewboxChanged(SPCanvasItem *item, Geom::IntRect const &new_ { SPCanvasGroup *group = SP_CANVAS_GROUP(item); - for (std::list::const_iterator it = group->items->begin(); it != group->items->end(); ++it) { + for (std::list::const_iterator it = group->items.begin(); it != group->items.end(); ++it) { SPCanvasItem *child = *it; if (child->visible) { if (SP_CANVAS_ITEM_GET_CLASS(child)->viewbox_changed) { @@ -1024,7 +1031,7 @@ void SPCanvasGroup::add(SPCanvasItem *item) g_object_ref(item); g_object_ref_sink(item); - items->push_back(item); + items.push_back(item); sp_canvas_item_request_update(item); } @@ -1033,7 +1040,7 @@ void SPCanvasGroup::remove(SPCanvasItem *item) { g_return_if_fail(item != NULL); - items->remove(item); + items.remove(item); // Unparent the child item->parent = NULL; -- cgit v1.2.3 From dc064a944edab7902196389912222b63826ee3a9 Mon Sep 17 00:00:00 2001 From: "Liam P. White" Date: Sun, 17 Jan 2016 11:17:12 -0500 Subject: Less derp, can't iterate past the end of the list (bzr r14602) --- src/display/sp-canvas.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/display/sp-canvas.cpp') diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp index e94133b28..f33428295 100644 --- a/src/display/sp-canvas.cpp +++ b/src/display/sp-canvas.cpp @@ -606,11 +606,11 @@ void sp_canvas_item_raise(SPCanvasItem *item, int positions) std::list::iterator l = std::find(parent->items.begin(),parent->items.end(), item); g_assert (l != parent->items.end()); - for (int i=0; iitems.end(); ++i) + for (int i=0; i<=positions && l != parent->items.end(); ++i) l++; parent->items.remove(item); - parent->items.insert(++l, item); + parent->items.insert(l, item); redraw_if_visible (item); item->canvas->need_repick = TRUE; -- cgit v1.2.3 From 225c64ac7604b0d64c93702c723d52b7d53539e1 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Wed, 10 Feb 2016 12:02:21 +0100 Subject: Remove artifacts when remove canvas items, for example in measure tool (bzr r14645) --- src/display/sp-canvas.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/display/sp-canvas.cpp') diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp index f33428295..22765cb9d 100644 --- a/src/display/sp-canvas.cpp +++ b/src/display/sp-canvas.cpp @@ -419,7 +419,7 @@ static void redraw_if_visible(SPCanvasItem *item) int y1 = (int)(item->y2); if (x0 !=0 || x1 !=0 || y0 !=0 || y1 !=0) { - item->canvas->requestRedraw((int)(item->x1), (int)(item->y1), (int)(item->x2 + 1), (int)(item->y2 + 1)); + item->canvas->requestRedraw((int)(item->x1 - 1), (int)(item->y1 -1), (int)(item->x2 + 1), (int)(item->y2 + 1)); } } } -- cgit v1.2.3 From e16f1a053c67a8c42172f5186f247f11c3b6e777 Mon Sep 17 00:00:00 2001 From: Kris De Gussem Date: Mon, 22 Feb 2016 20:49:03 +0100 Subject: static code analysis (bzr r14664) --- src/display/sp-canvas.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/display/sp-canvas.cpp') diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp index 22765cb9d..ef47613e4 100644 --- a/src/display/sp-canvas.cpp +++ b/src/display/sp-canvas.cpp @@ -607,7 +607,7 @@ void sp_canvas_item_raise(SPCanvasItem *item, int positions) g_assert (l != parent->items.end()); for (int i=0; i<=positions && l != parent->items.end(); ++i) - l++; + ++l; parent->items.remove(item); parent->items.insert(l, item); @@ -656,7 +656,7 @@ void sp_canvas_item_lower(SPCanvasItem *item, int positions) g_assert (l != parent->items.end()); for (int i=0; iitems.begin(); ++i) - l--; + ++l; parent->items.remove(item); parent->items.insert(l, item); -- cgit v1.2.3 From df60915bd9b41940cd58b5d0016e7746cf85cb95 Mon Sep 17 00:00:00 2001 From: Kris De Gussem Date: Mon, 29 Feb 2016 18:37:19 +0100 Subject: type in commit r14664 (bzr r14676) --- src/display/sp-canvas.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/display/sp-canvas.cpp') diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp index ef47613e4..d17271752 100644 --- a/src/display/sp-canvas.cpp +++ b/src/display/sp-canvas.cpp @@ -656,7 +656,7 @@ void sp_canvas_item_lower(SPCanvasItem *item, int positions) g_assert (l != parent->items.end()); for (int i=0; iitems.begin(); ++i) - ++l; + --l; parent->items.remove(item); parent->items.insert(l, item); -- cgit v1.2.3