aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/bfc/util/findopenrect.h
blob: 97fdc5cbe49ec8b30f5ce94d4dd8121f6ef06179 (plain) (blame)
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
#ifndef _FINDOPENRECT_H
#define _FINDOPENRECT_H

#include <bfc/wasabi_std.h>
#include <bfc/ptrlist.h>

class FindOpenRect
{
public:
	FindOpenRect();

	typedef double (*compareRectsFn)(const RECT &rect, const RECT &dest, unsigned long userdata, unsigned long userdata2, int index, double bsf);
	static double compare_overlapArea(const RECT &rect, const RECT &dest, unsigned long userdata = 0, unsigned long userdata2 = 0, int index = 0, double bsf = 0);

	void setCompareRectsFn(compareRectsFn fn);

	// this one does it all in one call
	RECT find(const RECT &viewport, const PtrList<RECT> &list,
	          const RECT &prev, unsigned long userdata = 0, unsigned long userdata2 = 0);

	// these let you do it over time
	void beginFind(const RECT &viewport, const PtrList<RECT> &list,
	               const RECT &prev, unsigned long userdata = 0, unsigned long userdata2 = 0);
	RECT findMore();

	double trySingleRect(const RECT &r, int early_out = FALSE);

	void setTimeLimit(int ms);
	int getNumIters();
	void resetNumIters();

	double getBestValSoFar();
	RECT getBestRectSoFar();

	// this only sets it if it's a better value
	void setBestSoFar(double bsf, const RECT &bestrect);

	RECT getOriginalRect();

	void setCoordDivisor(int xdiv, int ydiv);

private:
	RECT vr, prev;
	PtrList<RECT> list;
	compareRectsFn fn;
	unsigned long userdata, userdata2;

	int timelimit;
	int iters;

	int xdiv, ydiv;

	RECT bsfrect;
	double bsfval;
	double bsfdist;
	//CUT  RECT bsf_nooverlap;
	//CUT  int found_nooverlap;
	//CUT  RECT bsf_overlap;
	//CUT  double bsfval_nooverlap;
	//CUT  double bsfval_overlap;
};

#endif