summaryrefslogtreecommitdiff
path: root/libs/canvas/test/optimizing_lookup_table.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/canvas/test/optimizing_lookup_table.cc')
-rw-r--r--libs/canvas/test/optimizing_lookup_table.cc141
1 files changed, 141 insertions, 0 deletions
diff --git a/libs/canvas/test/optimizing_lookup_table.cc b/libs/canvas/test/optimizing_lookup_table.cc
new file mode 100644
index 0000000000..8449b26498
--- /dev/null
+++ b/libs/canvas/test/optimizing_lookup_table.cc
@@ -0,0 +1,141 @@
+#include "canvas/lookup_table.h"
+#include "canvas/types.h"
+#include "canvas/rectangle.h"
+#include "canvas/group.h"
+#include "canvas/canvas.h"
+#include "optimizing_lookup_table.h"
+
+using namespace std;
+using namespace ArdourCanvas;
+
+CPPUNIT_TEST_SUITE_REGISTRATION (OptimizingLookupTableTest);
+
+void
+OptimizingLookupTableTest::build_1 ()
+{
+ ImageCanvas canvas;
+ Rectangle a (canvas.root(), Rect (0, 0, 32, 32));
+ a.set_outline_width (0);
+ Rectangle b (canvas.root(), Rect (0, 33, 32, 64));
+ b.set_outline_width (0);
+ Rectangle c (canvas.root(), Rect (33, 0, 64, 32));
+ c.set_outline_width (0);
+ Rectangle d (canvas.root(), Rect (33, 33, 64, 64));
+ d.set_outline_width (0);
+ OptimizingLookupTable table (*canvas.root(), 1);
+
+ CPPUNIT_ASSERT (table._items_per_cell == 1);
+ CPPUNIT_ASSERT (table._cell_size.x == 32);
+ CPPUNIT_ASSERT (table._cell_size.y == 32);
+ CPPUNIT_ASSERT (table._cells[0][0].front() == &a);
+ CPPUNIT_ASSERT (table._cells[0][1].front() == &b);
+ CPPUNIT_ASSERT (table._cells[1][0].front() == &c);
+ CPPUNIT_ASSERT (table._cells[1][1].front() == &d);
+}
+
+void
+OptimizingLookupTableTest::build_2 ()
+{
+ ImageCanvas canvas;
+ Rectangle a (canvas.root(), Rect (0, 0, 713, 1024));
+ a.set_outline_width (0);
+ Rectangle b (canvas.root(), Rect (0, 0, 0, 1024));
+ b.set_outline_width (0);
+ OptimizingLookupTable table (*canvas.root(), 64);
+}
+
+void
+OptimizingLookupTableTest::build_negative ()
+{
+ ImageCanvas canvas;
+ Rectangle a (canvas.root(), Rect (-32, -32, 32, 32));
+ OptimizingLookupTable table (*canvas.root(), 1);
+}
+
+void
+OptimizingLookupTableTest::get_small ()
+{
+ ImageCanvas canvas;
+ Rectangle a (canvas.root(), Rect (0, 0, 32, 32));
+ a.set_outline_width (0);
+ Rectangle b (canvas.root(), Rect (0, 33, 32, 64));
+ b.set_outline_width (0);
+ Rectangle c (canvas.root(), Rect (33, 0, 64, 32));
+ c.set_outline_width (0);
+ Rectangle d (canvas.root(), Rect (33, 33, 64, 64));
+ d.set_outline_width (0);
+ OptimizingLookupTable table (*canvas.root(), 1);
+
+ vector<Item*> items = table.get (Rect (16, 16, 48, 48));
+ CPPUNIT_ASSERT (items.size() == 4);
+
+ items = table.get (Rect (32, 32, 33, 33));
+ CPPUNIT_ASSERT (items.size() == 1);
+}
+
+void
+OptimizingLookupTableTest::get_big ()
+{
+ ImageCanvas canvas;
+
+ double const s = 8;
+ int const N = 1024;
+
+ for (int x = 0; x < N; ++x) {
+ for (int y = 0; y < N; ++y) {
+ Rectangle* r = new Rectangle (canvas.root());
+ r->set_outline_width (0);
+ r->set (Rect (x * s, y * s, (x + 1) * s, (y + 1) * s));
+ }
+ }
+
+ OptimizingLookupTable table (*canvas.root(), 16);
+ vector<Item*> items = table.get (Rect (0, 0, 15, 15));
+ CPPUNIT_ASSERT (items.size() == 16);
+}
+
+/** Check that calling OptimizingLookupTable::get() returns things in the correct order.
+ * The order should be the same as it is in the owning group.
+ */
+void
+OptimizingLookupTableTest::check_ordering ()
+{
+ ImageCanvas canvas;
+
+ Rectangle a (canvas.root (), Rect (0, 0, 64, 64));
+ Rectangle b (canvas.root (), Rect (0, 0, 64, 64));
+ Rectangle c (canvas.root (), Rect (0, 0, 64, 64));
+
+ /* since there have been bugs introduced due to sorting pointers,
+ get these rectangles in ascending order of their address
+ */
+
+ list<Item*> items;
+ items.push_back (&a);
+ items.push_back (&b);
+ items.push_back (&c);
+ items.sort ();
+
+ /* now arrange these items in the group in reverse order of address */
+
+ for (list<Item*>::reverse_iterator i = items.rbegin(); i != items.rend(); ++i) {
+ (*i)->raise_to_top ();
+ }
+
+ /* ask the LUT for the items */
+
+ canvas.root()->ensure_lut ();
+ vector<Item*> lut_items = canvas.root()->_lut->get (Rect (0, 0, 64, 64));
+ CPPUNIT_ASSERT (lut_items.size() == 3);
+
+ /* check that they are in the right order */
+
+ vector<Item*>::iterator i = lut_items.begin ();
+ list<Item*>::reverse_iterator j = items.rbegin ();
+
+ while (i != lut_items.end ()) {
+ CPPUNIT_ASSERT (*i == *j);
+ ++i;
+ ++j;
+ }
+}