-
Notifications
You must be signed in to change notification settings - Fork 0
/
mask.c
125 lines (105 loc) · 2.37 KB
/
mask.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <stdlib.h>
#include <grass/gis.h>
#include <grass/raster.h>
#include "mask.h"
#include "local_proto.h"
int init_mask_rules(Mask * mask)
{
mask->list = NULL;
return 0;
}
int init_d_mask_rules(d_Mask * d_mask)
{
d_mask->list = NULL;
return 0;
}
int add_mask_rule(Mask * mask, long a, long b, int inf)
{
Interval *I;
I = (Interval *) G_malloc(sizeof(Interval));
I->low = a <= b ? a : b;
I->high = a >= b ? a : b;
I->inf = inf;
I->next = mask->list;
mask->list = I;
return 0;
}
int add_d_mask_rule(d_Mask * d_mask, double a, double b, int inf)
{
d_Interval *I;
I = (d_Interval *) G_malloc(sizeof(d_Interval));
I->low = a <= b ? a : b;
I->high = a >= b ? a : b;
I->inf = inf;
I->next = d_mask->list;
d_mask->list = I;
return 0;
}
int mask_cell_array(CELL * cell, int ncols, Mask * mask, int invert)
{
long x;
while (ncols-- > 0) {
x = *cell;
if (mask_select(&x, mask, invert))
*cell++ = x;
else
Rast_set_c_null_value(cell++, 1);
}
return 0;
}
int mask_d_cell_array(DCELL * dcell, int ncols, d_Mask * mask, int invert)
{
DCELL x;
while (ncols-- > 0) {
x = *dcell;
if (mask_d_select(&x, mask, invert))
*dcell++ = x;
else
Rast_set_d_null_value(dcell++, 1);
}
return 0;
}
int mask_select(long *x, Mask * mask, int invert)
{
Interval *I;
if (mask->list == NULL)
return 1;
for (I = mask->list; I; I = I->next) {
if (mask_match_interval(*x, I)) {
if (invert)
return 0;
return 1;
}
}
return invert;
}
int mask_d_select(DCELL * x, d_Mask * mask, int invert)
{
d_Interval *I;
if (mask->list == NULL)
return 1;
for (I = mask->list; I; I = I->next) {
if (mask_match_d_interval(*x, I)) {
if (invert)
return 0;
return 1;
}
}
return invert;
}
int mask_match_interval(long x, Interval * I)
{
if (I->inf < 0)
return x <= I->low;
if (I->inf > 0)
return x >= I->high;
return x >= I->low && x <= I->high;
}
int mask_match_d_interval(DCELL x, d_Interval * I)
{
if (I->inf < 0)
return x <= I->low;
if (I->inf > 0)
return x >= I->high;
return x >= I->low && x <= I->high;
}