File: do_patch.c

package info (click to toggle)
grass 8.4.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 277,040 kB
  • sloc: ansic: 460,798; python: 227,732; cpp: 42,026; sh: 11,262; makefile: 7,007; xml: 3,637; sql: 968; lex: 520; javascript: 484; yacc: 450; asm: 387; perl: 157; sed: 25; objc: 6; ruby: 4
file content (64 lines) | stat: -rw-r--r-- 2,210 bytes parent folder | download | duplicates (2)
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
#include <grass/gis.h>
#include <grass/raster.h>

/*
 * patch in non-zero data over zero data
 * keep track of the categories which are patched in
 * for later use in constructing the new category and color files
 *
 * returns: 1 the result still contains nulls
 *          0 the result contains no zero nulls
 */

int is_zero_value(void *rast, RASTER_MAP_TYPE data_type)
{

    /* insert 0 check here */

    return Rast_is_null_value(rast, data_type) ||
                   Rast_get_d_value(rast, data_type) != 0.0
               ? 0
               : 1;
}

int do_patch(void *result, void *patch, struct Cell_stats *statf, int ncols,
             RASTER_MAP_TYPE out_type, size_t out_cell_size, int use_zero,
             int no_support)
{
    int more;

    more = 0;
    while (ncols-- > 0) {
        if (use_zero) { /* use 0 for transparency instead of NULL */
            if (is_zero_value(result, out_type) ||
                Rast_is_null_value(result, out_type)) {
                /* Don't patch hole with a null, just mark as more */
                if (Rast_is_null_value(patch, out_type))
                    more = 1;
                else {
                    /* Mark that there is more to be done if we patch with 0 */
                    if (is_zero_value(patch, out_type))
                        more = 1;
                    Rast_raster_cpy(result, patch, 1, out_type);
                    if (out_type == CELL_TYPE && !no_support)
                        Rast_update_cell_stats((CELL *)result, 1, statf);
                }
            } /* ZERO support */
        }
        else { /* use NULL for transparency instead of 0 */

            if (Rast_is_null_value(result, out_type)) {
                if (Rast_is_null_value(patch, out_type))
                    more = 1;
                else {
                    Rast_raster_cpy(result, patch, 1, out_type);
                    if (out_type == CELL_TYPE && !no_support)
                        Rast_update_cell_stats((CELL *)result, 1, statf);
                }
            } /* NULL support */
        }
        result = G_incr_void_ptr(result, out_cell_size);
        patch = G_incr_void_ptr(patch, out_cell_size);
    }
    return more;
}