svn merge -r 23207:23528 https://svn.blender.org/svnroot/bf-blender/trunk/blender
[blender.git] / source / blender / blenlib / intern / rct.c
1 /*
2  * 
3  * rct.c
4  * 
5  * april 95
6  * 
7  * $Id$
8  *
9  * A minimalist lib for functions doing stuff with rectangle structs.
10  *
11  * ***** BEGIN GPL LICENSE BLOCK *****
12  *
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License
15  * as published by the Free Software Foundation; either version 2
16  * of the License, or (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software Foundation,
25  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
26  *
27  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
28  * All rights reserved.
29  *
30  * The Original Code is: all of this file.
31  *
32  * Contributor(s): none yet.
33  *
34  * ***** END GPL LICENSE BLOCK *****
35  *
36  */
37
38 #include "DNA_vec_types.h"
39 #include "BLI_blenlib.h"
40
41 #ifdef HAVE_CONFIG_H
42 #include <config.h>
43 #endif
44
45 int BLI_rcti_is_empty(rcti * rect)
46 {
47         return ((rect->xmax<=rect->xmin) ||
48                         (rect->ymax<=rect->ymin));
49 }
50
51 int BLI_in_rcti(rcti * rect, int x, int y)
52 {
53
54         if(x<rect->xmin) return 0;
55         if(x>rect->xmax) return 0;
56         if(y<rect->ymin) return 0;
57         if(y>rect->ymax) return 0;
58         return 1;
59 }
60
61 int BLI_in_rctf(rctf *rect, float x, float y)
62 {
63
64         if(x<rect->xmin) return 0;
65         if(x>rect->xmax) return 0;
66         if(y<rect->ymin) return 0;
67         if(y>rect->ymax) return 0;
68         return 1;
69 }
70
71 void BLI_union_rctf(rctf *rct1, rctf *rct2)
72 {
73         
74         if(rct1->xmin>rct2->xmin) rct1->xmin= rct2->xmin;
75         if(rct1->xmax<rct2->xmax) rct1->xmax= rct2->xmax;
76         if(rct1->ymin>rct2->ymin) rct1->ymin= rct2->ymin;
77         if(rct1->ymax<rct2->ymax) rct1->ymax= rct2->ymax;
78 }
79
80 void BLI_union_rcti(rcti *rct1, rcti *rct2)
81 {
82         
83         if(rct1->xmin>rct2->xmin) rct1->xmin= rct2->xmin;
84         if(rct1->xmax<rct2->xmax) rct1->xmax= rct2->xmax;
85         if(rct1->ymin>rct2->ymin) rct1->ymin= rct2->ymin;
86         if(rct1->ymax<rct2->ymax) rct1->ymax= rct2->ymax;
87 }
88
89 void BLI_init_rctf(rctf *rect, float xmin, float xmax, float ymin, float ymax)
90 {
91         if(xmin <= xmax) {
92                 rect->xmin= xmin;
93                 rect->xmax= xmax;
94         }
95         else {
96                 rect->xmax= xmin;
97                 rect->xmin= xmax;
98         }
99         if(ymin <= ymax) {
100                 rect->ymin= ymin;
101                 rect->ymax= ymax;
102         }
103         else {
104                 rect->ymax= ymin;
105                 rect->ymin= ymax;
106         }
107 }
108
109 void BLI_init_rcti(rcti *rect, int xmin, int xmax, int ymin, int ymax)
110 {
111         if(xmin <= xmax) {
112                 rect->xmin= xmin;
113                 rect->xmax= xmax;
114         }
115         else {
116                 rect->xmax= xmin;
117                 rect->xmin= xmax;
118         }
119         if(ymin <= ymax) {
120                 rect->ymin= ymin;
121                 rect->ymax= ymax;
122         }
123         else {
124                 rect->ymax= ymin;
125                 rect->ymin= ymax;
126         }
127 }
128
129 void BLI_translate_rcti(rcti *rect, int x, int y)
130 {
131         rect->xmin += x;
132         rect->ymin += y;
133         rect->xmax += x;
134         rect->ymax += y;
135 }
136 void BLI_translate_rctf(rctf *rect, float x, float y)
137 {
138         rect->xmin += x;
139         rect->ymin += y;
140         rect->xmax += x;
141         rect->ymax += y;
142 }
143
144 int BLI_isect_rctf(rctf *src1, rctf *src2, rctf *dest)
145 {
146         float xmin, xmax;
147         float ymin, ymax;
148
149         xmin = (src1->xmin) > (src2->xmin) ? (src1->xmin) : (src2->xmin);
150         xmax = (src1->xmax) < (src2->xmax) ? (src1->xmax) : (src2->xmax);
151         ymin = (src1->ymin) > (src2->ymin) ? (src1->ymin) : (src2->ymin);
152         ymax = (src1->ymax) < (src2->ymax) ? (src1->ymax) : (src2->ymax);
153         
154         if(xmax>=xmin && ymax>=ymin) {
155                 if(dest) {
156                         dest->xmin = xmin;
157                         dest->xmax = xmax;
158                         dest->ymin = ymin;
159                         dest->ymax = ymax;
160                 }
161                 return 1;
162         }
163         else {
164                 if(dest) {
165                         dest->xmin = 0;
166                         dest->xmax = 0;
167                         dest->ymin = 0;
168                         dest->ymax = 0;
169                 }
170                 return 0;
171         }
172 }
173
174 int BLI_isect_rcti(rcti *src1, rcti *src2, rcti *dest)
175 {
176         int xmin, xmax;
177         int ymin, ymax;
178         
179         xmin = (src1->xmin) > (src2->xmin) ? (src1->xmin) : (src2->xmin);
180         xmax = (src1->xmax) < (src2->xmax) ? (src1->xmax) : (src2->xmax);
181         ymin = (src1->ymin) > (src2->ymin) ? (src1->ymin) : (src2->ymin);
182         ymax = (src1->ymax) < (src2->ymax) ? (src1->ymax) : (src2->ymax);
183         
184         if(xmax>=xmin && ymax>=ymin) {
185                 if(dest) {
186                         dest->xmin = xmin;
187                         dest->xmax = xmax;
188                         dest->ymin = ymin;
189                         dest->ymax = ymax;
190                 }
191                 return 1;
192         }
193         else {
194                 if(dest) {
195                         dest->xmin = 0;
196                         dest->xmax = 0;
197                         dest->ymin = 0;
198                         dest->ymax = 0;
199                 }
200                 return 0;
201         }
202 }