Merge branch 'master' into cairocanvas
[ardour.git] / libs / canvas / canvas / lookup_table.h
1 #ifndef __CANVAS_LOOKUP_TABLE_H__
2 #define __CANVAS_LOOKUP_TABLE_H__
3
4 #include <vector>
5 #include <boost/multi_array.hpp>
6 #include "canvas/types.h"
7
8 class OptimizingLookupTableTest;
9
10 namespace ArdourCanvas {
11
12 class Item;
13 class Group;
14
15 class LookupTable
16 {
17 public:
18         LookupTable (Group const &);
19         virtual ~LookupTable ();
20
21         virtual std::vector<Item*> get (Rect const &) = 0;
22         virtual std::vector<Item*> items_at_point (Duple) const = 0;
23
24 protected:
25         
26         Group const & _group;
27 };
28
29 class DumbLookupTable : public LookupTable
30 {
31 public:
32         DumbLookupTable (Group const &);
33
34         std::vector<Item*> get (Rect const &);
35         std::vector<Item*> items_at_point (Duple) const;
36 };
37
38 class OptimizingLookupTable : public LookupTable
39 {
40 public:
41         OptimizingLookupTable (Group const &, int);
42         ~OptimizingLookupTable ();
43         std::vector<Item*> get (Rect const &);
44         std::vector<Item*> items_at_point (Duple) const;
45
46         static int default_items_per_cell;
47
48 private:
49
50         void area_to_indices (Rect const &, int &, int &, int &, int &) const;
51         void point_to_indices (Duple, int &, int &) const;
52
53         friend class ::OptimizingLookupTableTest;
54
55         typedef std::vector<Item*> Cell;
56         int _items_per_cell;
57         int _dimension;
58         Duple _cell_size;
59         Duple _offset;
60         Cell** _cells;
61         bool _added;
62 };
63
64 }
65
66 #endif