12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #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 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)
- 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)
- 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;
- }
|