Final merge of HEAD (bf-blender) into the orange branch.
[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/BL DUAL 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. The Blender
17  * Foundation also sells licenses for use in proprietary software under
18  * the Blender License.  See http://www.blender.org/BL/ for information
19  * about this.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with this program; if not, write to the Free Software Foundation,
28  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
29  *
30  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
31  * All rights reserved.
32  *
33  * The Original Code is: all of this file.
34  *
35  * Contributor(s): none yet.
36  *
37  * ***** END GPL/BL DUAL LICENSE BLOCK *****
38  *
39  */
40
41 #include "DNA_vec_types.h"
42 #include "BLI_blenlib.h"
43
44 #ifdef HAVE_CONFIG_H
45 #include <config.h>
46 #endif
47
48 int BLI_rcti_is_empty(rcti * rect)
49 {
50         return ((rect->xmax<=rect->xmin) ||
51                         (rect->ymax<=rect->ymin));
52 }
53
54 int BLI_in_rcti(rcti * rect, int x, int y)
55 {
56
57         if(x<rect->xmin) return 0;
58         if(x>rect->xmax) return 0;
59         if(y<rect->ymin) return 0;
60         if(y>rect->ymax) return 0;
61         return 1;
62 }
63
64 int BLI_in_rctf(rctf *rect, float x, float y)
65 {
66
67         if(x<rect->xmin) return 0;
68         if(x>rect->xmax) return 0;
69         if(y<rect->ymin) return 0;
70         if(y>rect->ymax) return 0;
71         return 1;
72 }
73
74 void BLI_union_rctf(rctf *rct1, rctf *rct2)
75 {
76
77         if(rct1->xmin>rct2->xmin) rct1->xmin= rct2->xmin;
78         if(rct1->xmax<rct2->xmax) rct1->xmax= rct2->xmax;
79         if(rct1->ymin>rct2->ymin) rct1->ymin= rct2->ymin;
80         if(rct1->ymax<rct2->ymax) rct1->ymax= rct2->ymax;
81 }
82
83 void BLI_init_rctf(rctf *rect, float xmin, float xmax, float ymin, float ymax)
84 {
85         rect->xmin= xmin;
86         rect->xmax= xmax;
87         rect->ymin= ymin;
88         rect->ymax= ymax;
89 }
90 void BLI_init_rcti(rcti *rect, int xmin, int xmax, int ymin, int ymax)
91 {
92         rect->xmin= xmin;
93         rect->xmax= xmax;
94         rect->ymin= ymin;
95         rect->ymax= ymax;
96 }
97
98 void BLI_translate_rcti(rcti *rect, int x, int y)
99 {
100         rect->xmin += x;
101         rect->ymin += y;
102         rect->xmax += x;
103         rect->ymax += y;
104 }
105 void BLI_translate_rctf(rctf *rect, float x, float y)
106 {
107         rect->xmin += x;
108         rect->ymin += y;
109         rect->xmax += x;
110         rect->ymax += y;
111 }
112
113 int BLI_isect_rctf(rctf *src1, rctf *src2, rctf *dest)
114 {
115         float xmin, xmax;
116         float ymin, ymax;
117
118         xmin = (src1->xmin) > (src2->xmin) ? (src1->xmin) : (src2->xmin);
119         xmax = (src1->xmax) < (src2->xmax) ? (src1->xmax) : (src2->xmax);
120         ymin = (src1->ymin) > (src2->ymin) ? (src1->ymin) : (src2->ymin);
121         ymax = (src1->ymax) < (src2->ymax) ? (src1->ymax) : (src2->ymax);
122         
123         if(xmax>=xmin && ymax>=ymin) {
124                 if(dest) {
125                         dest->xmin = xmin;
126                         dest->xmax = xmax;
127                         dest->ymin = ymin;
128                         dest->ymax = ymax;
129                 }
130                 return 1;
131         }
132         else {
133                 if(dest) {
134                         dest->xmin = 0;
135                         dest->xmax = 0;
136                         dest->ymin = 0;
137                         dest->ymax = 0;
138                 }
139                 return 0;
140         }
141 }
142
143 int BLI_isect_rcti(rcti *src1, rcti *src2, rcti *dest)
144 {
145         int xmin, xmax;
146         int ymin, ymax;
147         
148         xmin = (src1->xmin) > (src2->xmin) ? (src1->xmin) : (src2->xmin);
149         xmax = (src1->xmax) < (src2->xmax) ? (src1->xmax) : (src2->xmax);
150         ymin = (src1->ymin) > (src2->ymin) ? (src1->ymin) : (src2->ymin);
151         ymax = (src1->ymax) < (src2->ymax) ? (src1->ymax) : (src2->ymax);
152         
153         if(xmax>=xmin && ymax>=ymin) {
154                 if(dest) {
155                         dest->xmin = xmin;
156                         dest->xmax = xmax;
157                         dest->ymin = ymin;
158                         dest->ymax = ymax;
159                 }
160                 return 1;
161         }
162         else {
163                 if(dest) {
164                         dest->xmin = 0;
165                         dest->xmax = 0;
166                         dest->ymin = 0;
167                         dest->ymax = 0;
168                 }
169                 return 0;
170         }
171 }