1 #include "Gwater.h"
2 #include <unistd.h>
3 #include <grass/gis.h>
4 #include <grass/glocale.h>
5 
close_array_seg(void)6 int close_array_seg(void)
7 {
8     struct Colors colors;
9     int incr, max, red, green, blue, rd, gr, bl, flag;
10     int c, r, map_fd;
11     CELL *cellrow;
12     CSEG *theseg;
13     ASP_FLAG af;
14 
15     if (seg_flag || bas_flag || haf_flag) {
16 	if (seg_flag)
17 	    theseg = &bas;
18 	else if (bas_flag)
19 	    theseg = &bas;
20 	else
21 	    theseg = &haf;
22 	max = -9;
23 	/*
24 	   for (r = 0; r < nrows; r++) {
25 	   for (c = 0; c < ncols; c++) {
26 	   cseg_get(theseg, &value, r, c);
27 	   if (value > max)
28 	   max = value;
29 	   }
30 	   }
31 	 */
32 	max = n_basins;
33 	G_debug(1, "%d basins created", max);
34 	Rast_init_colors(&colors);
35 	if (max > 0)
36 	    Rast_make_random_colors(&colors, 1, max);
37 	else {
38 	    G_warning(_("No basins were created. Verify threshold and region settings."));
39 	    Rast_make_random_colors(&colors, 1, 2);
40 	}
41 
42 	if (max < 1000 && max > 0) {
43 	    Rast_set_c_color((CELL) 0, 0, 0, 0, &colors);
44 	    r = 1;
45 	    incr = 0;
46 	    while (incr >= 0) {
47 		G_percent(r, max, 3);
48 		for (gr = 130 + incr; gr <= 255; gr += 20) {
49 		    for (rd = 90 + incr; rd <= 255; rd += 30) {
50 			for (bl = 90 + incr; bl <= 255; bl += 40) {
51 			    flag = 1;
52 			    while (flag) {
53 				Rast_get_c_color(&r, &red, &green, &blue,
54 						 &colors);
55 				/* if existing rule is too dark then append a new
56 				   rule to override it */
57 				if ((blue * .11 + red * .30 + green * .59) <
58 				    100) {
59 				    Rast_set_c_color(r, rd, gr, bl, &colors);
60 				    flag = 0;
61 				}
62 				if (++r > max) {
63 				    gr = rd = bl = 300;
64 				    flag = 0;
65 				    incr = -1;
66 				}
67 			    }
68 			}
69 		    }
70 		}
71 		if (incr >= 0) {
72 		    incr += 15;
73 		    if (incr > 120)
74 			incr = 7;
75 		}
76 	    }
77 	    G_percent(r - 1, max, 3);	/* finish it */
78 	}
79 	else
80 	    G_debug(1,
81 		    "Too many subbasins to reasonably check for color brightness");
82 	/* using the existing stack of while/for/for/for/while loops ... */
83     }
84 
85     /* stream segments map */
86     if (seg_flag) {
87 	G_message(_("Closing stream segments map"));
88 	cellrow = (CELL *) G_malloc(ncols * sizeof(CELL));
89 	map_fd = Rast_open_c_new(seg_name);
90 	for (r = 0; r < nrows; r++) {
91 	    G_percent(r, nrows, 1);
92 	    Rast_set_c_null_value(cellrow, ncols);	/* reset row to all NULL */
93 	    for (c = 0; c < ncols; c++) {
94 		/* bseg_get(&swale, &cvalue, r, c); */
95 		/* if (cvalue) */
96 		seg_get(&aspflag, (char *)&af, r, c);
97 		if (FLAG_GET(af.flag, SWALEFLAG))
98 		    cseg_get(&bas, &(cellrow[c]), r, c);
99 	    }
100 	    Rast_put_row(map_fd, cellrow, CELL_TYPE);
101 	}
102 	G_percent(nrows, nrows, 1);	/* finish it */
103 	G_free(cellrow);
104 	Rast_close(map_fd);
105 	Rast_write_colors(seg_name, this_mapset, &colors);
106     }
107 
108     /* basins map */
109     if (bas_flag) {
110 	G_message(_("Closing basins map"));
111 	cseg_write_cellfile(&bas, bas_name);
112 	Rast_write_colors(bas_name, this_mapset, &colors);
113     }
114 
115     /* half.basins map */
116     if (haf_flag) {
117 	G_message(_("Closing half basins map"));
118 	cseg_write_cellfile(&haf, haf_name);
119 	Rast_write_colors(haf_name, this_mapset, &colors);
120     }
121 
122     if (seg_flag || bas_flag || haf_flag)
123 	Rast_free_colors(&colors);
124     cseg_close(&haf);
125     cseg_close(&bas);
126     if (arm_flag)
127 	fclose(fp);
128 
129     close_maps();
130 
131     return 0;
132 }
133