2.50: svn merge https://svn.blender.org/svnroot/bf-blender/trunk/blender -r19323...
[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         rect->xmin= xmin;
92         rect->xmax= xmax;
93         rect->ymin= ymin;
94         rect->ymax= ymax;
95 }
96 void BLI_init_rcti(rcti *rect, int xmin, int xmax, int ymin, int ymax)
97 {
98         rect->xmin= xmin;
99         rect->xmax= xmax;
100         rect->ymin= ymin;
101         rect->ymax= ymax;
102 }
103
104 void BLI_translate_rcti(rcti *rect, int x, int y)
105 {
106         rect->xmin += x;
107         rect->ymin += y;
108         rect->xmax += x;
109         rect->ymax += y;
110 }
111 void BLI_translate_rctf(rctf *rect, float x, float y)
112 {
113         rect->xmin += x;
114         rect->ymin += y;
115         rect->xmax += x;
116         rect->ymax += y;
117 }
118
119 int BLI_isect_rctf(rctf *src1, rctf *src2, rctf *dest)
120 {
121         float xmin, xmax;
122         float ymin, ymax;
123
124         xmin = (src1->xmin) > (src2->xmin) ? (src1->xmin) : (src2->xmin);
125         xmax = (src1->xmax) < (src2->xmax) ? (src1->xmax) : (src2->xmax);
126         ymin = (src1->ymin) > (src2->ymin) ? (src1->ymin) : (src2->ymin);
127         ymax = (src1->ymax) < (src2->ymax) ? (src1->ymax) : (src2->ymax);
128         
129         if(xmax>=xmin && ymax>=ymin) {
130                 if(dest) {
131                         dest->xmin = xmin;
132                         dest->xmax = xmax;
133                         dest->ymin = ymin;
134                         dest->ymax = ymax;
135                 }
136                 return 1;
137         }
138         else {
139                 if(dest) {
140                         dest->xmin = 0;
141                         dest->xmax = 0;
142                         dest->ymin = 0;
143                         dest->ymax = 0;
144                 }
145                 return 0;
146         }
147 }
148
149 int BLI_isect_rcti(rcti *src1, rcti *src2, rcti *dest)
150 {
151         int xmin, xmax;
152         int ymin, ymax;
153         
154         xmin = (src1->xmin) > (src2->xmin) ? (src1->xmin) : (src2->xmin);
155         xmax = (src1->xmax) < (src2->xmax) ? (src1->xmax) : (src2->xmax);
156         ymin = (src1->ymin) > (src2->ymin) ? (src1->ymin) : (src2->ymin);
157         ymax = (src1->ymax) < (src2->ymax) ? (src1->ymax) : (src2->ymax);
158         
159         if(xmax>=xmin && ymax>=ymin) {
160                 if(dest) {
161                         dest->xmin = xmin;
162                         dest->xmax = xmax;
163                         dest->ymin = ymin;
164                         dest->ymax = ymax;
165                 }
166                 return 1;
167         }
168         else {
169                 if(dest) {
170                         dest->xmin = 0;
171                         dest->xmax = 0;
172                         dest->ymin = 0;
173                         dest->ymax = 0;
174                 }
175                 return 0;
176         }
177 }