- replaced G.{edve,eded,edvl} with G.editMesh, atm just a structure to
[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
91 int BLI_isect_rctf(rctf *src1, rctf *src2, rctf *dest)
92 {
93         float xmin, xmax;
94         float ymin, ymax;
95
96         xmin = (src1->xmin) > (src2->xmin) ? (src1->xmin) : (src2->xmin);
97         xmax = (src1->xmax) < (src2->xmax) ? (src1->xmax) : (src2->xmax);
98         ymin = (src1->ymin) > (src2->ymin) ? (src1->ymin) : (src2->ymin);
99         ymax = (src1->ymax) < (src2->ymax) ? (src1->ymax) : (src2->ymax);
100         
101         if(xmax>=xmin && ymax>=ymin) {
102                 if(dest) {
103                         dest->xmin = xmin;
104                         dest->xmax = xmax;
105                         dest->ymin = ymin;
106                         dest->ymax = ymax;
107                 }
108                 return 1;
109         }
110         else {
111                 if(dest) {
112                         dest->xmin = 0;
113                         dest->xmax = 0;
114                         dest->ymin = 0;
115                         dest->ymax = 0;
116                 }
117                 return 0;
118         }
119 }