1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 #ifndef COMMON_SINETABLES_H
24 #define COMMON_SINETABLES_H
25 
26 namespace Common {
27 
28 /**
29  * @defgroup common_sinetables Sine tables
30  * @ingroup common
31  *
32  * @brief API for managing sine tables.
33  *
34  * @{
35  */
36 
37 class SineTable {
38 public:
39 	/**
40 	 * Construct a sine table given the number of points
41 	 *
42 	 * @param nPoints Number of distinct radian points, which must be in range [16,65536] and be divisible by 4
43 	 */
44 	SineTable(int nPoints);
45 	~SineTable();
46 
47 	/**
48 	 * Get pointer to table
49 	 *
50 	 * This table contains nPoints/2 entries.
51 	 * Prefer to use at()
52 	 * The layout of this table is as follows:
53 	 * - Entries 0 up to (excluding) nPoints/4:
54 	 *           sin(0) till (excluding) sin(1/2*pi)
55 	 * - Entries 2_nPoints/4 up to nPoints/2:
56 	 *           sin(pi) till (excluding) sin(3/2*pi)
57 	 */
getTable()58 	const float *getTable() { return _tableEOS; }
59 
60 	/**
61 	 * Returns sin(2*pi * index / nPoints )
62 	 * Index must be in range [0, nPoints - 1]
63 	 * Faster than atLegacy
64 	 */
65 	float at(int index) const;
66 
67 	/**
68 	 * Returns sin(2*pi * index / nPoints )
69 	 * Index must be in range [0, nPoints - 1]
70 	 */
71 	float atLegacy(int index) const;
72 
73 private:
74 	float *_tableEOS;
75 	float *_table;
76 	double _radResolution; // Smallest radian increment
77 	int _refSize; // _nPoints / 4
78 	int _nPoints; // range of operator[]
79 };
80 
81 /** @} */
82 
83 } // End of namespace Common
84 
85 #endif // COMMON_SINETABLES_H
86