]> Pileus Git - ~andy/gtk/blob - gdk/gdkrectangle.c
Merge from themes-2. See the ChangeLog for a somewhat detailed
[~andy/gtk] / gdk / gdkrectangle.c
1 /* GDK - The GIMP Drawing Kit
2  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19 #include "gdk.h"
20
21
22
23 void
24 gdk_rectangle_union (GdkRectangle *src1,
25                      GdkRectangle *src2,
26                      GdkRectangle *dest)
27 {
28   dest->x = MIN (src1->x, src2->x);
29   dest->y = MIN (src1->y, src2->y);
30   dest->width = 
31     MAX (src1->x + src1->width, src2->x + src2->width) - dest->x;
32   dest->height = 
33     MAX (src1->y + src1->height, src2->y + src2->height) - dest->y;
34 }
35
36 gint
37 gdk_rectangle_intersect (GdkRectangle *src1,
38                          GdkRectangle *src2,
39                          GdkRectangle *dest)
40 {
41   GdkRectangle *temp;
42   gint src1_x2, src1_y2;
43   gint src2_x2, src2_y2;
44   gint return_val;
45
46   g_return_val_if_fail (src1 != NULL, FALSE);
47   g_return_val_if_fail (src2 != NULL, FALSE);
48   g_return_val_if_fail (dest != NULL, FALSE);
49
50   return_val = FALSE;
51
52   if (src2->x < src1->x)
53     {
54       temp = src1;
55       src1 = src2;
56       src2 = temp;
57     }
58   dest->x = src2->x;
59
60   src1_x2 = src1->x + src1->width;
61   src2_x2 = src2->x + src2->width;
62
63   if (src2->x < src1_x2)
64     {
65       if (src1_x2 < src2_x2)
66         dest->width = src1_x2 - dest->x;
67       else
68         dest->width = src2_x2 - dest->x;
69
70       if (src2->y < src1->y)
71         {
72           temp = src1;
73           src1 = src2;
74           src2 = temp;
75         }
76       dest->y = src2->y;
77
78       src1_y2 = src1->y + src1->height;
79       src2_y2 = src2->y + src2->height;
80
81       if (src2->y < src1_y2)
82         {
83           return_val = TRUE;
84
85           if (src1_y2 < src2_y2)
86             dest->height = src1_y2 - dest->y;
87           else
88             dest->height = src2_y2 - dest->y;
89
90           if (dest->height == 0)
91             return_val = FALSE;
92           if (dest->width == 0)
93             return_val = FALSE;
94         }
95     }
96
97   return return_val;
98 }