summaryrefslogtreecommitdiff
path: root/libs/canvas/canvas/lookup_table.h
blob: d56394ca589aaba482b7023da2dfe6ef677a6cd6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#ifndef __CANVAS_LOOKUP_TABLE_H__
#define __CANVAS_LOOKUP_TABLE_H__

#include <vector>
#include <boost/multi_array.hpp>
#include "canvas/types.h"

class OptimizingLookupTableTest;

namespace ArdourCanvas {

class Item;
class Group;

class LookupTable
{
public:
	LookupTable (Group const &);
	virtual ~LookupTable ();

	virtual std::vector<Item*> get (Rect const &) = 0;
	virtual std::vector<Item*> items_at_point (Duple) const = 0;

protected:
	
	Group const & _group;
};

class DumbLookupTable : public LookupTable
{
public:
	DumbLookupTable (Group const &);

	std::vector<Item*> get (Rect const &);
	std::vector<Item*> items_at_point (Duple) const;
};

class OptimizingLookupTable : public LookupTable
{
public:
	OptimizingLookupTable (Group const &, int);
	~OptimizingLookupTable ();
	std::vector<Item*> get (Rect const &);
	std::vector<Item*> items_at_point (Duple) const;

	static int default_items_per_cell;

private:

	void area_to_indices (Rect const &, int &, int &, int &, int &) const;
	void point_to_indices (Duple, int &, int &) const;

	friend class ::OptimizingLookupTableTest;

	typedef std::vector<Item*> Cell;
	int _items_per_cell;
	int _dimension;
	Duple _cell_size;
	Duple _offset;
	Cell** _cells;
	bool _added;
};

}

#endif