202 float *rangef,
int *pt)
204 GLint sl, sr, sb, st;
206 int cat_labs = 0, cat_vals = 0, do_invert = 0, discrete = 0;
207 int is_fp, fprec, iprec;
208 struct Categories cats;
210 struct FPRange fp_range;
212 struct Colors colors;
237 if (mapset ==
NULL) {
242 is_fp = Rast_map_is_fp(
name, mapset);
244 if (Rast_read_colors(
name, mapset, &colors) == -1) {
245 G_warning(_(
"Unable to read color file of raster map <%s>"),
name);
250 if (Rast_read_cats(
name, mapset, &cats) == -1) {
251 G_warning(_(
"Unable to read category file of raster map <%s>"),
256 if (flags[4] && rangef[0] != -9999. && rangef[1] != -9999.) {
266 if (Rast_read_fp_range(
name, mapset, &fp_range) != 1) {
267 G_warning(_(
"Unable to read fp range of raster map <%s>"),
271 Rast_get_fp_range_min_max(&fp_range, &fmin, &fmax);
272 if (flags[4] && rangef[0] != -9999.)
274 if (flags[4] && rangef[1] != -9999.)
278 if (Rast_read_range(
name, mapset, &range) == -1) {
279 G_warning(_(
"Unable to read range of raster map <%s>"),
name);
282 Rast_get_range_min_max(&range, &
min, &
max);
283 if (flags[4] && rangef[0] != -9999.)
285 if (flags[4] && rangef[1] != -9999.)
293 G_warning(_(
"Range request error for legend"));
316 for (tmp = 1; tmp <
max; tmp *= 10, p1++)
319 for (tmp = -1; tmp >
min; tmp *= 10, p2++)
322 iprec = (p1 > p2 ? p1 : p2);
357 int i, k, lleg, horiz;
358 int red, green, blue;
360 DCELL tdcell, pdcell;
361 float vert1[2], vert2[2], vert3[2], vert4[2];
367 int labw, maxlabw, numlabs;
368 float labpos, labpt[3];
371 GLint wt, wb, wl, wr;
375 horiz = (sr - sl > st - sb);
379 numlabs = Listnum ? Listnum :
max -
min + 1;
381 if (is_fp && !Listnum) {
383 G_warning(_(
"Unable to show discrete FP range (use list)"));
387 dividers = (
float *)G_malloc(numlabs *
sizeof(
float));
392 labvals[numlabs + 1] = fmax;
399 if (cat_labs || cat_vals) {
400 for (k = 0; k < numlabs; k++) {
402 tdcell = discrete ? Listcats[k] : labvals[k];
404 cstr = Rast_get_d_cat(&tdcell, &cats);
406 if (cat_labs && !cat_vals) {
407 snprintf(buff,
sizeof(buff),
"%s", cstr);
410 if (cat_labs && cat_vals) {
412 snprintf(buff,
sizeof(buff),
"%.*lf) %s", fprec,
415 snprintf(buff,
sizeof(buff),
"%.*lf", fprec,
419 snprintf(buff,
sizeof(buff),
"%.*lf", fprec,
425 discrete ? Listnum ? Listcats[k] :
min + k : labvals[k];
426 if (cat_labs && !cat_vals)
427 snprintf(buff,
sizeof(buff),
"%s",
428 Rast_get_c_cat(&tcell, &cats));
430 if (cat_labs && cat_vals) {
431 cstr = Rast_get_c_cat(&tcell, &cats);
433 snprintf(buff,
sizeof(buff),
"%*d) %s", iprec,
436 snprintf(buff,
sizeof(buff),
"%d", tcell);
439 snprintf(buff,
sizeof(buff),
"%d", tcell);
443 if (labw > maxlabw) {
475 vert1[
X] = vert2[
X] = xoff;
476 vert1[
Y] = vert2[
Y] = yoff;
483 stab2 = vert2[
Y] = st - sb + yoff;
484 stab1 = vert1[
Y] = yoff;
486 vert1[
X] = vert2[
X] = sr - sl + xoff;
494 stab2 = vert2[
X] = sr - sl + xoff;
495 stab1 = vert1[
X] = xoff;
497 vert1[
Y] = vert2[
Y] = st - sb + yoff;
501 if (numlabs > lleg / 5)
502 G_warning(_(
"Too many categories to show as discrete!"));
507 incr = do_invert ? -1 : 1;
508 for (k = 0, i = 0; k < lleg; k++) {
509 if (discrete && Listnum)
510 tdcell = Listcats[(int)((
float)k * numlabs / lleg)];
512 tcell =
min + k * (
max -
min + 1) / lleg;
513 tdcell = fmin + k * (fmax - fmin) / lleg;
517 if (k == 0 || tdcell != pdcell) {
519 Rast_get_d_color(&tdcell, &red, &green, &blue, &colors);
521 Rast_get_c_color((CELL *)&tdcell, &red, &green, &blue,
538 dividers[i++] = *dv1;
568 vert1[
X] = vert2[
X] = 1. + xoff;
569 vert1[
Y] = vert4[
Y] = 1. + yoff;
570 vert3[
X] = vert4[
X] = sr - sl - 1. + xoff;
571 vert3[
Y] = vert2[
Y] = st - sb - 1. + yoff;
583 vert1[
X] = vert2[
X] = xoff;
584 vert1[
Y] = vert4[
Y] = yoff;
585 vert3[
X] = vert4[
X] = sr - sl + xoff;
586 vert3[
Y] = vert2[
Y] = st - sb + yoff;
602 for (k = 0; k < i; k++) {
603 *dv1 = *dv2 = dividers[k];
611 if (cat_labs || cat_vals) {
613 for (k = 0; k < numlabs; k++) {
615 if (discrete && Listnum) {
616 tdcell = Listcats[k];
617 labpos = (k + .5) / numlabs;
622 labpos = (tdcell - fmin) / (fmax - fmin);
626 if (discrete && Listnum) {
628 labpos = (k + .5) / numlabs;
631 tcell = discrete ?
min + k : labvals[k];
632 labpos = (tcell -
min + .5) / (
max -
min + 1);
636 labpos = 1. - labpos;
639 cstr = Rast_get_c_cat(&tcell, &cats);
641 cstr = Rast_get_d_cat(&tdcell, &cats);
643 if (cat_labs && !cat_vals)
644 snprintf(buff,
sizeof(buff),
"%s", cstr);
646 if (cat_labs && cat_vals) {
649 snprintf(buff,
sizeof(buff),
"%.*lf) %s", fprec,
652 snprintf(buff,
sizeof(buff),
"%*d) %s", iprec,
655 snprintf(buff,
sizeof(buff),
"%.*lf", fprec,
658 snprintf(buff,
sizeof(buff),
"%d", tcell);
662 snprintf(buff,
sizeof(buff),
"%.*lf", fprec,
665 snprintf(buff,
sizeof(buff),
"%d", tcell);
669 labpt[
X] = labpos * (sr - sl) + xoff -
696 Rast_free_cats(&cats);
698 Rast_free_colors(&colors);
708 return (legend_list);