1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _BGFX_TUPLE_B3ITUPLE_HXX
25 #define _BGFX_TUPLE_B3ITUPLE_HXX
26 
27 #include <sal/types.h>
28 #include <basegfx/tuple/b3dtuple.hxx>
29 #include <basegfx/basegfxdllapi.h>
30 
31 namespace basegfx
32 {
33 	/** Base class for all Points/Vectors with three sal_Int32 values
34 
35 		This class provides all methods common to Point
36 		avd Vector classes which are derived from here.
37 
38 		@derive Use this class to implement Points or Vectors
39 		which are based on three sal_Int32 values
40 	*/
41 	class BASEGFX_DLLPUBLIC B3ITuple
42 	{
43 	protected:
44 		sal_Int32										mnX;
45 		sal_Int32										mnY;
46 		sal_Int32										mnZ;
47 
48 	public:
49 		/**	Create a 3D Tuple
50 
51         	The tuple is initialized to (0, 0, 0)
52 		*/
B3ITuple()53 		B3ITuple()
54 		:	mnX(0),
55 			mnY(0),
56 			mnZ(0)
57 		{}
58 
59 		/**	Create a 3D Tuple
60 
61 			@param nX
62 			This parameter is used to initialize the X-coordinate
63 			of the 3D Tuple.
64 
65 			@param nY
66 			This parameter is used to initialize the Y-coordinate
67 			of the 3D Tuple.
68 
69 			@param nZ
70 			This parameter is used to initialize the Z-coordinate
71 			of the 3D Tuple.
72 		*/
B3ITuple(sal_Int32 nX,sal_Int32 nY,sal_Int32 nZ)73 		B3ITuple(sal_Int32 nX, sal_Int32 nY, sal_Int32 nZ)
74 		:	mnX(nX),
75 			mnY(nY),
76 			mnZ(nZ)
77 		{}
78 
79 		/**	Create a copy of a 3D Tuple
80 
81 			@param rTup
82 			The 3D Tuple which will be copied.
83 		*/
B3ITuple(const B3ITuple & rTup)84 		B3ITuple(const B3ITuple& rTup)
85 		:	mnX( rTup.mnX ),
86 			mnY( rTup.mnY ),
87 			mnZ( rTup.mnZ )
88 		{}
89 
~B3ITuple()90 		~B3ITuple()
91 		{}
92 
93 		/// get X-Coordinate of 3D Tuple
getX() const94 		sal_Int32 getX() const
95 		{
96 			return mnX;
97 		}
98 
99 		/// get Y-Coordinate of 3D Tuple
getY() const100 		sal_Int32 getY() const
101 		{
102 			return mnY;
103 		}
104 
105 		/// get Z-Coordinate of 3D Tuple
getZ() const106 		sal_Int32 getZ() const
107 		{
108 			return mnZ;
109 		}
110 
111 		/// set X-Coordinate of 3D Tuple
setX(sal_Int32 nX)112 		void setX(sal_Int32 nX)
113 		{
114 			mnX = nX;
115 		}
116 
117 		/// set Y-Coordinate of 3D Tuple
setY(sal_Int32 nY)118 		void setY(sal_Int32 nY)
119 		{
120 			mnY = nY;
121 		}
122 
123 		/// set Z-Coordinate of 3D Tuple
setZ(sal_Int32 nZ)124 		void setZ(sal_Int32 nZ)
125 		{
126 			mnZ = nZ;
127 		}
128 
129 		/// Array-access to 3D Tuple
operator [](int nPos) const130 		const sal_Int32& operator[] (int nPos) const
131 		{
132 			// Here, normally two if(...)'s should be used. In the assumption that
133 			// both sal_Int32 members can be accessed as an array a shortcut is used here.
134 			// if(0 == nPos) return mnX; if(1 == nPos) return mnY; return mnZ;
135 			return *((&mnX) + nPos);
136 		}
137 
138 		/// Array-access to 3D Tuple
operator [](int nPos)139 		sal_Int32& operator[] (int nPos)
140 		{
141 			// Here, normally two if(...)'s should be used. In the assumption that
142 			// both sal_Int32 members can be accessed as an array a shortcut is used here.
143 			// if(0 == nPos) return mnX; if(1 == nPos) return mnY; return mnZ;
144 			return *((&mnX) + nPos);
145 		}
146 
147 		// operators
148 		//////////////////////////////////////////////////////////////////////
149 
operator +=(const B3ITuple & rTup)150 		B3ITuple& operator+=( const B3ITuple& rTup )
151 		{
152 			mnX += rTup.mnX;
153 			mnY += rTup.mnY;
154 			mnZ += rTup.mnZ;
155 			return *this;
156 		}
157 
operator -=(const B3ITuple & rTup)158 		B3ITuple& operator-=( const B3ITuple& rTup )
159 		{
160 			mnX -= rTup.mnX;
161 			mnY -= rTup.mnY;
162 			mnZ -= rTup.mnZ;
163 			return *this;
164 		}
165 
operator /=(const B3ITuple & rTup)166 		B3ITuple& operator/=( const B3ITuple& rTup )
167 		{
168 			mnX /= rTup.mnX;
169 			mnY /= rTup.mnY;
170 			mnZ /= rTup.mnZ;
171 			return *this;
172 		}
173 
operator *=(const B3ITuple & rTup)174 		B3ITuple& operator*=( const B3ITuple& rTup )
175 		{
176 			mnX *= rTup.mnX;
177 			mnY *= rTup.mnY;
178 			mnZ *= rTup.mnZ;
179 			return *this;
180 		}
181 
operator *=(sal_Int32 t)182 		B3ITuple& operator*=(sal_Int32 t)
183 		{
184 			mnX *= t;
185 			mnY *= t;
186 			mnZ *= t;
187 			return *this;
188 		}
189 
operator /=(sal_Int32 t)190 		B3ITuple& operator/=(sal_Int32 t)
191 		{
192 			mnX /= t;
193 			mnY /= t;
194 			mnZ /= t;
195 			return *this;
196 		}
197 
operator -(void) const198 		B3ITuple operator-(void) const
199 		{
200 			return B3ITuple(-mnX, -mnY, -mnZ);
201 		}
202 
equalZero() const203 		bool equalZero() const
204 		{
205 			return (this == &getEmptyTuple() ||
206 				(mnX == 0 && mnY == 0 && mnZ == 0));
207 		}
208 
operator ==(const B3ITuple & rTup) const209 		bool operator==( const B3ITuple& rTup ) const
210 		{
211 			return this == &rTup || (rTup.mnX == mnX && rTup.mnY == mnY && rTup.mnZ == mnZ);
212 		}
213 
operator !=(const B3ITuple & rTup) const214 		bool operator!=( const B3ITuple& rTup ) const
215 		{
216 			return !(*this == rTup);
217 		}
218 
operator =(const B3ITuple & rTup)219 		B3ITuple& operator=( const B3ITuple& rTup )
220 		{
221 			mnX = rTup.mnX;
222 			mnY = rTup.mnY;
223 			mnZ = rTup.mnZ;
224 			return *this;
225 		}
226 
227 		static const B3ITuple& getEmptyTuple();
228 	};
229 
230 	// external operators
231 	//////////////////////////////////////////////////////////////////////////
232 
minimum(const B3ITuple & rTupA,const B3ITuple & rTupB)233 	inline B3ITuple minimum(const B3ITuple& rTupA, const B3ITuple& rTupB)
234 	{
235         return B3ITuple(
236             std::min(rTupB.getX(), rTupA.getX()),
237             std::min(rTupB.getY(), rTupA.getY()),
238             std::min(rTupB.getZ(), rTupA.getZ()));
239 	}
240 
maximum(const B3ITuple & rTupA,const B3ITuple & rTupB)241 	inline B3ITuple maximum(const B3ITuple& rTupA, const B3ITuple& rTupB)
242 	{
243         return B3ITuple(
244             std::max(rTupB.getX(), rTupA.getX()),
245             std::max(rTupB.getY(), rTupA.getY()),
246             std::max(rTupB.getZ(), rTupA.getZ()));
247 	}
248 
absolute(const B3ITuple & rTup)249 	inline B3ITuple absolute(const B3ITuple& rTup)
250 	{
251 		B3ITuple aAbs(
252 			(0 > rTup.getX()) ? -rTup.getX() : rTup.getX(),
253 			(0 > rTup.getY()) ? -rTup.getY() : rTup.getY(),
254 			(0 > rTup.getZ()) ? -rTup.getZ() : rTup.getZ());
255 		return aAbs;
256 	}
257 
interpolate(const B3ITuple & rOld1,const B3ITuple & rOld2,double t)258 	inline B3ITuple interpolate(const B3ITuple& rOld1, const B3ITuple& rOld2, double t)
259 	{
260         if(rOld1 == rOld2)
261         {
262             return rOld1;
263         }
264         else if(0.0 >= t)
265         {
266             return rOld1;
267         }
268         else if(1.0 <= t)
269         {
270             return rOld2;
271         }
272         else
273         {
274             return B3ITuple(
275 			    basegfx::fround(((rOld2.getX() - rOld1.getX()) * t) + rOld1.getX()),
276 			    basegfx::fround(((rOld2.getY() - rOld1.getY()) * t) + rOld1.getY()),
277 			    basegfx::fround(((rOld2.getZ() - rOld1.getZ()) * t) + rOld1.getZ()));
278         }
279 	}
280 
average(const B3ITuple & rOld1,const B3ITuple & rOld2)281 	inline B3ITuple average(const B3ITuple& rOld1, const B3ITuple& rOld2)
282 	{
283         return B3ITuple(
284             rOld1.getX() == rOld2.getX() ? rOld1.getX() : basegfx::fround((rOld1.getX() + rOld2.getX()) * 0.5),
285             rOld1.getY() == rOld2.getY() ? rOld1.getY() : basegfx::fround((rOld1.getY() + rOld2.getY()) * 0.5),
286             rOld1.getZ() == rOld2.getZ() ? rOld1.getZ() : basegfx::fround((rOld1.getZ() + rOld2.getZ()) * 0.5));
287 	}
288 
average(const B3ITuple & rOld1,const B3ITuple & rOld2,const B3ITuple & rOld3)289 	inline B3ITuple average(const B3ITuple& rOld1, const B3ITuple& rOld2, const B3ITuple& rOld3)
290 	{
291         return B3ITuple(
292             (rOld1.getX() == rOld2.getX() && rOld2.getX() == rOld3.getX()) ? rOld1.getX() : basegfx::fround((rOld1.getX() + rOld2.getX() + rOld3.getX()) * (1.0 / 3.0)),
293             (rOld1.getY() == rOld2.getY() && rOld2.getY() == rOld3.getY()) ? rOld1.getX() : basegfx::fround((rOld1.getY() + rOld2.getY() + rOld3.getY()) * (1.0 / 3.0)),
294             (rOld1.getZ() == rOld2.getZ() && rOld2.getZ() == rOld3.getZ()) ? rOld1.getX() : basegfx::fround((rOld1.getZ() + rOld2.getZ() + rOld3.getZ()) * (1.0 / 3.0)));
295 	}
296 
operator +(const B3ITuple & rTupA,const B3ITuple & rTupB)297 	inline B3ITuple operator+(const B3ITuple& rTupA, const B3ITuple& rTupB)
298 	{
299 		B3ITuple aSum(rTupA);
300 		aSum += rTupB;
301 		return aSum;
302 	}
303 
operator -(const B3ITuple & rTupA,const B3ITuple & rTupB)304 	inline B3ITuple operator-(const B3ITuple& rTupA, const B3ITuple& rTupB)
305 	{
306 		B3ITuple aSub(rTupA);
307 		aSub -= rTupB;
308 		return aSub;
309 	}
310 
operator /(const B3ITuple & rTupA,const B3ITuple & rTupB)311 	inline B3ITuple operator/(const B3ITuple& rTupA, const B3ITuple& rTupB)
312 	{
313 		B3ITuple aDiv(rTupA);
314 		aDiv /= rTupB;
315 		return aDiv;
316 	}
317 
operator *(const B3ITuple & rTupA,const B3ITuple & rTupB)318 	inline B3ITuple operator*(const B3ITuple& rTupA, const B3ITuple& rTupB)
319 	{
320 		B3ITuple aMul(rTupA);
321 		aMul *= rTupB;
322 		return aMul;
323 	}
324 
operator *(const B3ITuple & rTup,sal_Int32 t)325 	inline B3ITuple operator*(const B3ITuple& rTup, sal_Int32 t)
326 	{
327 		B3ITuple aNew(rTup);
328 		aNew *= t;
329 		return aNew;
330 	}
331 
operator *(sal_Int32 t,const B3ITuple & rTup)332 	inline B3ITuple operator*(sal_Int32 t, const B3ITuple& rTup)
333 	{
334 		B3ITuple aNew(rTup);
335 		aNew *= t;
336 		return aNew;
337 	}
338 
operator /(const B3ITuple & rTup,sal_Int32 t)339 	inline B3ITuple operator/(const B3ITuple& rTup, sal_Int32 t)
340 	{
341 		B3ITuple aNew(rTup);
342 		aNew /= t;
343 		return aNew;
344 	}
345 
operator /(sal_Int32 t,const B3ITuple & rTup)346 	inline B3ITuple operator/(sal_Int32 t, const B3ITuple& rTup)
347 	{
348 		B3ITuple aNew(t, t, t);
349 		B3ITuple aTmp(rTup);
350 		aNew /= aTmp;
351 		return aNew;
352 	}
353 } // end of namespace basegfx
354 
355 #endif /* _BGFX_TUPLE_B3ITUPLE_HXX */
356