1/* Copyright (C) 2007-2008 The Android Open Source Project
2**
3** This software is licensed under the terms of the GNU General Public
4** License version 2, as published by the Free Software Foundation, and
5** may be copied, distributed, and modified under those terms.
6**
7** This program is distributed in the hope that it will be useful,
8** but WITHOUT ANY WARRANTY; without even the implied warranty of
9** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10** GNU General Public License for more details.
11*/
12#ifndef _ANDROID_SKIN_REGION_H
13#define _ANDROID_SKIN_REGION_H
14
15#include "android/skin/rect.h"
16
17typedef struct SkinRegion  SkinRegion;
18
19extern void  skin_region_init_empty( SkinRegion*  r );
20extern void  skin_region_init( SkinRegion*  r, int  x1, int  y1, int  x2, int  y2 );
21extern void  skin_region_init_rect( SkinRegion*  r, SkinRect*  rect );
22extern void  skin_region_init_box( SkinRegion*  r, SkinBox*  box );
23extern void  skin_region_init_copy( SkinRegion*  r, SkinRegion*  r2 );
24extern void  skin_region_reset( SkinRegion*  r );
25
26/* finalize region, then copy src into it */
27extern void  skin_region_copy( SkinRegion*  r, SkinRegion*  src );
28
29/* compare two regions for equality */
30extern int   skin_region_equals( SkinRegion*  r1, SkinRegion*  r2 );
31
32/* swap two regions */
33extern void  skin_region_swap( SkinRegion*  r, SkinRegion*  r2 );
34
35extern int   skin_region_is_empty( SkinRegion*  r );
36extern int   skin_region_is_rect( SkinRegion*  r );
37extern int   skin_region_is_complex( SkinRegion*  r );
38extern void  skin_region_get_bounds( SkinRegion*  r, SkinRect*  bounds );
39
40extern void  skin_region_translate( SkinRegion*  r, int  dx, int  dy );
41
42extern SkinOverlap  skin_region_contains( SkinRegion*  r, int  x, int  y );
43
44extern SkinOverlap  skin_region_contains_rect( SkinRegion*  r,
45                                               SkinRect*    rect );
46
47extern SkinOverlap  skin_region_contains_box( SkinRegion*  r, SkinBox*  b );
48
49/* returns overlap mode for "is r2 inside r1" */
50extern  SkinOverlap  skin_region_test_intersect( SkinRegion*  r1,
51                                                 SkinRegion*  r2 );
52
53/* performs r = (intersect r r2), returns true if the resulting region
54   is not empty */
55extern int  skin_region_intersect     ( SkinRegion*  r, SkinRegion*  r2 );
56extern int  skin_region_intersect_rect( SkinRegion*  r, SkinRect*    rect );
57
58/* performs r = (intersect r (region+_from_rect rect)), returns true iff
59   the resulting region is not empty */
60
61/* performs r = (union r r2) */
62extern void skin_region_union     ( SkinRegion*  r, SkinRegion*  r2 );
63extern void skin_region_union_rect( SkinRegion*  r, SkinRect*  rect );
64
65/* performs r = (difference r r2) */
66extern void skin_region_substract     ( SkinRegion*  r, SkinRegion*  r2 );
67extern void skin_region_substract_rect( SkinRegion*  r, SkinRect*  rect );
68
69/* performs r = (xor r r2) */
70extern void skin_region_xor( SkinRegion*  r, SkinRegion*  r2 );
71
72typedef struct SkinRegionIterator  SkinRegionIterator;
73
74/* iterator */
75extern void  skin_region_iterator_init( SkinRegionIterator*  iter,
76                                        SkinRegion*          r );
77
78extern int   skin_region_iterator_next( SkinRegionIterator*  iter,
79                                        SkinRect            *rect );
80
81extern int   skin_rection_iterator_next_box( SkinRegionIterator*  iter,
82                                             SkinBox             *box );
83
84/* the following should be considered private definitions. they're only here
85   to allow clients to allocate SkinRegion objects themselves... */
86
87typedef signed short   SkinRegionRun;
88#define SKIN_REGION_SENTINEL  0x7fff
89
90struct SkinRegion
91{
92    SkinRect        bounds;
93    SkinRegionRun*  runs;
94};
95
96struct SkinRegionIterator
97{
98    SkinRegion*     region;
99    SkinRegionRun*  band;
100    SkinRegionRun*  span;
101};
102
103#endif /* _ANDROID_SKIN_REGION_H */
104