X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fcanvas%2Flookup_table.cc;h=3836ccd18a9af305a5b7b3b066a0eeb5a3338869;hb=a3eaa4d3f0606349b91c7660da19eb3fee91bce3;hp=be0e553ee7a44a644c3a55230b2d585613a46f1e;hpb=37dd7e952bd084cd35a4c4f67949890ee3e7c152;p=ardour.git diff --git a/libs/canvas/lookup_table.cc b/libs/canvas/lookup_table.cc index be0e553ee7..3836ccd18a 100644 --- a/libs/canvas/lookup_table.cc +++ b/libs/canvas/lookup_table.cc @@ -17,14 +17,14 @@ 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,60 +34,94 @@ LookupTable::~LookupTable () } -DumbLookupTable::DumbLookupTable (Group const & group) - : LookupTable (group) +DumbLookupTable::DumbLookupTable (Item const & item) + : LookupTable (item) { } vector -DumbLookupTable::get (Rect const &) +DumbLookupTable::get (Rect const &area) { - list const & items = _group.items (); + list const & items = _item.items (); vector vitems; +#if 1 + for (list::const_iterator i = items.begin(); i != items.end(); ++i) { + boost::optional 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; } -/* XXX: what coordinate system is the point in? parent of our group I think */ vector -DumbLookupTable::items_at_point (Duple point) const +DumbLookupTable::items_at_point (Duple const & point) const { - list items = _group.items (); + /* Point is in window coordinate system */ + + list const & items (_item.items ()); vector vitems; for (list::const_iterator i = items.begin(); i != items.end(); ++i) { - boost::optional item_bbox = (*i)->bounding_box (); - if (item_bbox) { - Rect parent_bbox = (*i)->item_to_parent (item_bbox.get ()); - if (parent_bbox.contains (point)) { - vitems.push_back (*i); - } + + if ((*i)->covers (point)) { + // std::cerr << "\t\t" << (*i)->whatami() << '/' << (*i)->name << " covers " << point << std::endl; + vitems.push_back (*i); } } return vitems; } -OptimizingLookupTable::OptimizingLookupTable (Group const & group, int items_per_cell) - : LookupTable (group) +bool +DumbLookupTable::has_item_at_point (Duple const & point) const +{ + /* Point is in window coordinate system */ + + list const & items (_item.items ()); + vector vitems; + + for (list::const_iterator i = items.begin(); i != items.end(); ++i) { + + 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 (Item const & item, int items_per_cell) + : LookupTable (item) , _items_per_cell (items_per_cell) , _added (false) { - list const & items = _group.items (); + list const & items = _item.items (); /* number of cells */ int const cells = items.size() / _items_per_cell; /* hence number down each side of the table's square */ - _dimension = max (1, int (rint (sqrt (cells)))); + _dimension = max (1, int (rint (sqrt ((double)cells)))); _cells = new Cell*[_dimension]; for (int i = 0; i < _dimension; ++i) { _cells[i] = new Cell[_dimension]; } - /* our group's bounding box in its coordinates */ - boost::optional bbox = _group.bounding_box (); + /* our item's bounding box in its coordinates */ + boost::optional bbox = _item.bounding_box (); if (!bbox) { return; } @@ -107,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); @@ -124,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; } @@ -188,7 +222,7 @@ OptimizingLookupTable::point_to_indices (Duple point, int& x, int& y) const } vector -OptimizingLookupTable::items_at_point (Duple point) const +OptimizingLookupTable::items_at_point (Duple const & point) const { int x; int y; @@ -201,7 +235,7 @@ OptimizingLookupTable::items_at_point (Duple 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); @@ -223,8 +257,45 @@ OptimizingLookupTable::items_at_point (Duple point) const return items; } - -/** @param area Area in our owning group's coordinates */ + +bool +OptimizingLookupTable::has_item_at_point (Duple const & point) const +{ + int x; + int y; + point_to_indices (point, x, y); + + if (x >= _dimension) { + cout << "WARNING: x=" << x << ", dim=" << _dimension << ", px=" << point.x << " cellsize=" << _cell_size << "\n"; + } + + 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); + + assert (x >= 0); + assert (y >= 0); + + Cell const & cell = _cells[x][y]; + vector items; + for (Cell::const_iterator i = cell.begin(); i != cell.end(); ++i) { + boost::optional const item_bbox = (*i)->bounding_box (); + if (item_bbox) { + Rect parent_bbox = (*i)->item_to_parent (item_bbox.get ()); + if (parent_bbox.contains (point)) { + return true; + } + } + } + + return false; +} + +/** @param area Area in our owning item's coordinates */ vector OptimizingLookupTable::get (Rect const & area) { @@ -250,7 +321,7 @@ OptimizingLookupTable::get (Rect const & area) vector vitems; copy (items.begin (), items.end (), back_inserter (vitems)); - + return vitems; }