int support(char **names, struct Cell_stats *statf, int nfiles, struct Categories *cats, int *cats_ok, struct Colors *colr, int *colr_ok, RASTER_MAP_TYPE out_type) { int i; struct Categories pcats; struct Colors pcolr; CELL n; long count; int red, grn, blu; int do_cats, do_colr; *cats_ok = 1; *colr_ok = 1; if (Rast_read_cats(names[0], "", cats) < 0) *cats_ok = 0; G_suppress_warnings(1); if (Rast_read_colors(names[0], "", colr) < 0) *colr_ok = 0; G_suppress_warnings(0); if (*cats_ok == 0 && *colr_ok == 0) return 0; for (i = 1; i < nfiles; i++) { do_cats = *cats_ok && (Rast_read_cats(names[i], "", &pcats) >= 0); G_suppress_warnings(1); do_colr = *colr_ok && (Rast_read_colors(names[i], "", &pcolr) >= 0); G_suppress_warnings(0); if (!do_cats && !do_colr) continue; if (out_type == CELL_TYPE) { Rast_rewind_cell_stats(statf + i); while (Rast_next_cell_stat(&n, &count, statf + i)) if (n && !Rast_find_cell_stat(n, &count, statf)) { if (do_cats) { Rast_update_cell_stats(&n, 1, statf); Rast_set_c_cat(&n, &n, Rast_get_c_cat((CELL *) &n, &pcats), cats); } if (do_colr) { Rast_get_c_color(&n, &red, &grn, &blu, &pcolr); Rast_set_c_color(n, red, grn, blu, colr); } } } /* else the color will be the color of the first map */ if (do_cats) Rast_free_cats(&pcats); if (do_colr) /* otherwise this memory is used in colr pointer */ Rast_free_colors(&pcolr); } return 1; }
int make_gray_scale(struct Colors *gray) { int i; Rast_init_colors(gray); for (i = 0; i < 256; i++) Rast_set_c_color((CELL) i, i, i, i, gray); return 0; }
static void write_colors_int(int c) { channel *ch = &channels[c]; CELL i0 = 0; CELL i1 = ch->maxval; struct Colors colors; int i; Rast_init_colors(&colors); if (color_type == PNG_COLOR_TYPE_PALETTE) { png_colorp palette; int num_palette; png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette); for (i = 0; i < num_palette; i++) { png_colorp col = &palette[i]; Rast_set_c_color((CELL) i, col->red, col->green, col->blue, &colors); } } else if (c == C_A || t_gamma == 1.0) Rast_add_c_color_rule(&i0, 0, 0, 0, &i1, 255, 255, 255, &colors); else for (i = 0; i <= i1; i++) { int v = intensity((double) i / i1); Rast_set_c_color((CELL) i, v, v, v, &colors); } Rast_write_colors(ch->name, G_mapset(), &colors); }
int close_array_seg(void) { struct Colors colors; int incr, max, red, green, blue, rd, gr, bl, flag; int c, r, map_fd; CELL *cellrow, value; CELL *theseg; RAMSEG thesegseg; cellrow = Rast_allocate_c_buf(); if (seg_flag || bas_flag || haf_flag) { if (seg_flag) { theseg = bas; thesegseg = bas_seg; } else if (bas_flag) { theseg = bas; thesegseg = bas_seg; } else { theseg = haf; thesegseg = haf_seg; } max = n_basins; G_debug(1, "%d basins created", max); Rast_init_colors(&colors); if (max > 0) Rast_make_random_colors(&colors, 1, max); else { G_warning(_("No basins were created. Verify threshold and region settings.")); Rast_make_random_colors(&colors, 1, 2); } if (max < 1000 && max > 0) { Rast_set_c_color((CELL) 0, 0, 0, 0, &colors); r = 1; incr = 0; while (incr >= 0) { G_percent(r, max, 2); for (gr = 130 + incr; gr <= 255; gr += 20) { for (rd = 90 + incr; rd <= 255; rd += 30) { for (bl = 90 + incr; bl <= 255; bl += 40) { flag = 1; while (flag) { Rast_get_c_color(&r, &red, &green, &blue, &colors); /* if existing rule is too dark then append a new rule to override it */ if ((blue * .11 + red * .30 + green * .59) < 100) { Rast_set_c_color(r, rd, gr, bl, &colors); flag = 0; } if (++r > max) { gr = rd = bl = 300; flag = 0; incr = -1; } } } } } if (incr >= 0) { incr += 15; if (incr > 120) incr = 7; } } G_percent(r - 1, max, 3); /* finish it */ } else G_debug(1, "Too many subbasins to reasonably check for color brightness"); /* using the existing stack of while/for/for/for/while loops ... */ } /* stream segments map */ if (seg_flag) { map_fd = Rast_open_c_new(seg_name); for (r = 0; r < nrows; r++) { Rast_set_c_null_value(cellrow, ncols); /* reset row to all NULL */ for (c = 0; c < ncols; c++) { value = FLAG_GET(swale, r, c); if (value) cellrow[c] = bas[SEG_INDEX(bas_seg, r, c)]; } Rast_put_row(map_fd, cellrow, CELL_TYPE); } Rast_close(map_fd); Rast_write_colors(seg_name, this_mapset, &colors); } /* basins map */ if (bas_flag) { map_fd = Rast_open_c_new(bas_name); for (r = 0; r < nrows; r++) { for (c = 0; c < ncols; c++) { cellrow[c] = bas[SEG_INDEX(bas_seg, r, c)]; if (cellrow[c] == 0) Rast_set_c_null_value(cellrow + c, 1); } Rast_put_row(map_fd, cellrow, CELL_TYPE); } Rast_close(map_fd); Rast_write_colors(bas_name, this_mapset, &colors); } /* half_basins map */ if (haf_flag) { map_fd = Rast_open_c_new(haf_name); for (r = 0; r < nrows; r++) { for (c = 0; c < ncols; c++) { cellrow[c] = haf[SEG_INDEX(haf_seg, r, c)]; if (cellrow[c] == 0) Rast_set_c_null_value(cellrow + c, 1); } Rast_put_row(map_fd, cellrow, CELL_TYPE); } Rast_close(map_fd); Rast_write_colors(haf_name, this_mapset, &colors); } if (seg_flag || bas_flag || haf_flag) Rast_free_colors(&colors); G_free(haf); G_free(bas); G_free(cellrow); if (arm_flag) fclose(fp); close_maps(); return 0; }