Initial revision
[blender.git] / source / blender / img / intern / IMG_Line.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  * @author      Maarten Gribnau
32  * @date        March 12, 2001
33  */
34
35 #ifndef _H_IMG_Line
36 #define _H_IMG_Line
37
38 #include "IMG_Types.h"
39 #include <math.h>
40
41 /**
42  * A line from a start to an end point.
43  * Used for drawing lines in images.
44  * @author      Maarten Gribnau
45  * @date        March 6, 2001
46  */
47
48 class IMG_Line {
49 public:
50
51         /**
52          * Constructs a line with the given values.
53          * @param       xs      start point x-coordinate
54          * @param       ys      start point y-coordinate
55          * @param       xe      end point x-coordinate
56          * @param       ye      end point y-coordinate
57          */
58         IMG_Line(TInt32 xs=0, TInt32 ys=0, TInt32 xe=0, TInt32 ye=0)
59                 : m_xs(xs), m_ys(ys), m_xe(xe), m_ye(ye) {}
60
61         /**
62          * Copy constructor.
63          * @param       l       line to copy
64          */
65         IMG_Line(const IMG_Line& l)
66                 : m_xs(l.m_xs), m_ys(l.m_ys), m_xe(l.m_xe), m_ye(l.m_ye) {}
67         
68         /**
69          * Destructor.
70          */
71         virtual ~IMG_Line() {};
72
73         /**
74          * Access to line length.
75          * @return      length of the line.
76          */
77         virtual inline float getLength() const;
78
79         /**
80          * Sets all members of the line.
81          * @param       xs      start point x-coordinate
82          * @param       ys      start point y-coordinate
83          * @param       xe      end point x-coordinate
84          * @param       ye      end point y-coordinate
85          */
86         virtual inline void set(TInt32 xs, TInt32 ys, TInt32 xe, TInt32 ye);
87
88         /**
89          * Returns whether this line is empty.
90          * Empty line are lines that have length==0.
91          * @return      boolean value (true==empty line)
92          */
93         virtual inline bool isEmpty() const;
94
95         /**
96          * Returns point at given value for line parameter.
97          * Calculates the coordinates of a point on the line.
98          * @param       t       line parameter value (0<=t<=1) of the point requested.
99          * @param       x       x-coordinate of the point.
100          * @param       y       y-coordinate of the point.
101          */
102         virtual inline void getPoint(float t, TInt32& x, TInt32& y) const;
103
104         /** Start point x-coordinate */
105         TInt32 m_xs;
106         /** Start point y-coordinate */
107         TInt32 m_ys;
108         /** End point x-coordinate */
109         TInt32 m_xe;
110         /** End point y-coordinate */
111         TInt32 m_ye;
112 };
113
114
115 inline float IMG_Line::getLength() const
116 {
117         TInt32 dx = m_xe - m_xs;
118         TInt32 dy = m_ye - m_ys;
119         return ((float)::sqrt(((float)dx)*dx + ((float)dy)*dy));
120 }
121
122
123 inline void IMG_Line::set(TInt32 xs, TInt32 ys, TInt32 xe, TInt32 ye)
124 {
125         m_xs = xs; m_ys = ys; m_xe = xe; m_ye = ye;
126 }
127
128
129 inline bool     IMG_Line::isEmpty() const
130 {
131         return (getLength() <= 0);
132 }
133
134
135 inline void IMG_Line::getPoint(float t, TInt32& x, TInt32& y) const
136 {
137         x = (TInt32) (((float)m_xs) + (t * (m_xe - m_xs)));
138         y = (TInt32) (((float)m_ys) + (t * (m_ye - m_ys)));
139 }
140
141
142 #endif // _H_IMG_Line