fix crash when copy'ing latent plugins
[ardour.git] / libs / canvas / lookup_table.cc
index f88531537aebb0544d85a792f6c749e8e9199dad..3836ccd18a9af305a5b7b3b066a0eeb5a3338869 100644 (file)
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
+#include "canvas/item.h"
 #include "canvas/lookup_table.h"
-#include "canvas/group.h"
 
 using namespace std;
 using namespace ArdourCanvas;
 
-LookupTable::LookupTable (Group const & group)
-       : _group (group)
+LookupTable::LookupTable (Item const & item)
+       : _item (item)
 {
 
 }
@@ -34,27 +34,38 @@ LookupTable::~LookupTable ()
 
 }
 
-DumbLookupTable::DumbLookupTable (Group const & group)
-       : LookupTable (group)
+DumbLookupTable::DumbLookupTable (Item const & item)
+       : LookupTable (item)
 {
 
 }
 
 vector<Item *>
-DumbLookupTable::get (Rect const &)
+DumbLookupTable::get (Rect const &area)
 {
-       list<Item *> const & items = _group.items ();
+       list<Item *> const & items = _item.items ();
        vector<Item *> vitems;
+#if 1
+       for (list<Item *>::const_iterator i = items.begin(); i != items.end(); ++i) {
+               boost::optional<Rect> item_bbox = (*i)->bounding_box ();
+               if (!item_bbox) continue;
+               Rect item = (*i)->item_to_window (item_bbox.get());
+               if (item.intersection (area)) {
+                       vitems.push_back (*i);
+               }
+       }
+#else
        copy (items.begin(), items.end(), back_inserter (vitems));
+#endif
        return vitems;
 }
 
 vector<Item *>
 DumbLookupTable::items_at_point (Duple const & point) const
 {
-       /* Point is in canvas coordinate system */
+       /* Point is in window coordinate system */
 
-       list<Item *> const & items (_group.items ());
+       list<Item *> const & items (_item.items ());
        vector<Item *> vitems;
 
        for (list<Item *>::const_iterator i = items.begin(); i != items.end(); ++i) {
@@ -71,9 +82,9 @@ DumbLookupTable::items_at_point (Duple const & point) const
 bool
 DumbLookupTable::has_item_at_point (Duple const & point) const
 {
-       /* Point is in canvas coordinate system */
+       /* Point is in window coordinate system */
 
-       list<Item *> const & items (_group.items ());
+       list<Item *> const & items (_item.items ());
        vector<Item *> vitems;
 
        for (list<Item *>::const_iterator i = items.begin(); i != items.end(); ++i) {
@@ -81,23 +92,23 @@ DumbLookupTable::has_item_at_point (Duple const & point) const
                if (!(*i)->visible()) {
                        continue;
                }
-               
+
                if ((*i)->covers (point)) {
                        // std::cerr << "\t\t" << (*i)->whatami() << '/' << (*i)->name << " covers " << point << std::endl;
                        return true;
-                       
+
                }
        }
 
        return false;
 }
 
-OptimizingLookupTable::OptimizingLookupTable (Group const & group, int items_per_cell)
-       : LookupTable (group)
+OptimizingLookupTable::OptimizingLookupTable (Item const & item, int items_per_cell)
+       : LookupTable (item)
        , _items_per_cell (items_per_cell)
        , _added (false)
 {
-       list<Item*> const & items = _group.items ();
+       list<Item*> const & items = _item.items ();
 
        /* number of cells */
        int const cells = items.size() / _items_per_cell;
@@ -109,8 +120,8 @@ OptimizingLookupTable::OptimizingLookupTable (Group const & group, int items_per
                _cells[i] = new Cell[_dimension];
        }
 
-       /* our group's bounding box in its coordinates */
-       boost::optional<Rect> bbox = _group.bounding_box ();
+       /* our item's bounding box in its coordinates */
+       boost::optional<Rect> bbox = _item.bounding_box ();
        if (!bbox) {
                return;
        }
@@ -130,11 +141,11 @@ OptimizingLookupTable::OptimizingLookupTable (Group const & group, int items_per
                        continue;
                }
 
-               /* and in the group's coordinates */
-               Rect const item_bbox_in_group = (*i)->item_to_parent (item_bbox.get ());
+               /* and in the item's coordinates */
+               Rect const item_bbox_in_item = (*i)->item_to_parent (item_bbox.get ());
 
                int x0, y0, x1, y1;
-               area_to_indices (item_bbox_in_group, x0, y0, x1, y1);
+               area_to_indices (item_bbox_in_item, x0, y0, x1, y1);
 
                /* XXX */
                assert (x0 >= 0);
@@ -147,19 +158,19 @@ OptimizingLookupTable::OptimizingLookupTable (Group const & group, int items_per
                //assert (y1 <= _dimension);
 
                if (x0 > _dimension) {
-                       cout << "WARNING: item outside bbox by " << (item_bbox_in_group.x0 - bbox.get().x0) << "\n";
+                       cout << "WARNING: item outside bbox by " << (item_bbox_in_item.x0 - bbox.get().x0) << "\n";
                        x0 = _dimension;
                }
                if (x1 > _dimension) {
-                       cout << "WARNING: item outside bbox by " << (item_bbox_in_group.x1 - bbox.get().x1) << "\n";
+                       cout << "WARNING: item outside bbox by " << (item_bbox_in_item.x1 - bbox.get().x1) << "\n";
                        x1 = _dimension;
                }
                if (y0 > _dimension) {
-                       cout << "WARNING: item outside bbox by " << (item_bbox_in_group.y0 - bbox.get().y0) << "\n";
+                       cout << "WARNING: item outside bbox by " << (item_bbox_in_item.y0 - bbox.get().y0) << "\n";
                        y0 = _dimension;
                }
                if (y1 > _dimension) {
-                       cout << "WARNING: item outside bbox by " << (item_bbox_in_group.y1 - bbox.get().y1) << "\n";
+                       cout << "WARNING: item outside bbox by " << (item_bbox_in_item.y1 - bbox.get().y1) << "\n";
                        y1 = _dimension;
                }
 
@@ -224,7 +235,7 @@ OptimizingLookupTable::items_at_point (Duple const & point) const
        if (y >= _dimension) {
                cout << "WARNING: y=" << y << ", dim=" << _dimension << ", py=" << point.y << " cellsize=" << _cell_size << "\n";
        }
-       
+
        /* XXX: hmm */
        x = min (_dimension - 1, x);
        y = min (_dimension - 1, y);
@@ -261,7 +272,7 @@ OptimizingLookupTable::has_item_at_point (Duple const & point) const
        if (y >= _dimension) {
                cout << "WARNING: y=" << y << ", dim=" << _dimension << ", py=" << point.y << " cellsize=" << _cell_size << "\n";
        }
-       
+
        /* XXX: hmm */
        x = min (_dimension - 1, x);
        y = min (_dimension - 1, y);
@@ -283,8 +294,8 @@ OptimizingLookupTable::has_item_at_point (Duple const & point) const
 
        return false;
 }
-       
-/** @param area Area in our owning group's coordinates */
+
+/** @param area Area in our owning item's coordinates */
 vector<Item*>
 OptimizingLookupTable::get (Rect const & area)
 {
@@ -310,7 +321,7 @@ OptimizingLookupTable::get (Rect const & area)
 
        vector<Item*> vitems;
        copy (items.begin (), items.end (), back_inserter (vitems));
-       
+
        return vitems;
 }