66 glPushAttrib(GL_VIEWPORT);
68 glMatrixMode(GL_PROJECTION);
78 glViewport(wl, wb, (wr - wl), (wt - wb));
80 gluOrtho2D(-0.5, (wr - wl) + 0.5, -0.5, (wt - wb) + 0.5);
81 glMatrixMode(GL_MODELVIEW);
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 sprintf(buff,
"%s", cstr);
410 if (cat_labs && cat_vals) {
412 sprintf(buff,
"%.*lf) %s", fprec, tdcell, cstr);
414 sprintf(buff,
"%.*lf", fprec, tdcell);
417 sprintf(buff,
"%.*lf", fprec, tdcell);
422 discrete ? Listnum ? Listcats[k] :
min + k : labvals[k];
423 if (cat_labs && !cat_vals)
424 sprintf(buff,
"%s", Rast_get_c_cat(&tcell, &cats));
426 if (cat_labs && cat_vals) {
427 cstr = Rast_get_c_cat(&tcell, &cats);
429 sprintf(buff,
"%*d) %s", iprec, tcell, cstr);
431 sprintf(buff,
"%d", tcell);
434 sprintf(buff,
"%d", tcell);
438 if (labw > maxlabw) {
470 vert1[
X] = vert2[
X] = xoff;
471 vert1[
Y] = vert2[
Y] = yoff;
478 stab2 = vert2[
Y] =
st - sb + yoff;
479 stab1 = vert1[
Y] = yoff;
481 vert1[
X] = vert2[
X] = sr - sl + xoff;
489 stab2 = vert2[
X] = sr - sl + xoff;
490 stab1 = vert1[
X] = xoff;
492 vert1[
Y] = vert2[
Y] =
st - sb + yoff;
496 if (numlabs > lleg / 5)
497 G_warning(_(
"Too many categories to show as discrete!"));
502 incr = do_invert ? -1 : 1;
503 for (k = 0, i = 0; k < lleg; k++) {
504 if (discrete && Listnum)
505 tdcell = Listcats[(int)((
float)k * numlabs / lleg)];
507 tcell =
min + k * (
max -
min + 1) / lleg;
508 tdcell = fmin + k * (fmax - fmin) / lleg;
512 if (k == 0 || tdcell != pdcell) {
514 Rast_get_d_color(&tdcell, &red, &green, &blue, &colors);
516 Rast_get_c_color((CELL *)&tdcell, &red, &green, &blue,
533 dividers[i++] = *dv1;
563 vert1[
X] = vert2[
X] = 1. + xoff;
564 vert1[
Y] = vert4[
Y] = 1. + yoff;
565 vert3[
X] = vert4[
X] = sr - sl - 1. + xoff;
566 vert3[
Y] = vert2[
Y] =
st - sb - 1. + yoff;
578 vert1[
X] = vert2[
X] = xoff;
579 vert1[
Y] = vert4[
Y] = yoff;
580 vert3[
X] = vert4[
X] = sr - sl + xoff;
581 vert3[
Y] = vert2[
Y] =
st - sb + yoff;
597 for (k = 0; k < i; k++) {
598 *dv1 = *dv2 = dividers[k];
606 if (cat_labs || cat_vals) {
608 for (k = 0; k < numlabs; k++) {
610 if (discrete && Listnum) {
611 tdcell = Listcats[k];
612 labpos = (k + .5) / numlabs;
617 labpos = (tdcell - fmin) / (fmax - fmin);
621 if (discrete && Listnum) {
623 labpos = (k + .5) / numlabs;
626 tcell = discrete ?
min + k : labvals[k];
627 labpos = (tcell -
min + .5) / (
max -
min + 1);
631 labpos = 1. - labpos;
634 cstr = Rast_get_c_cat(&tcell, &cats);
636 cstr = Rast_get_d_cat(&tdcell, &cats);
638 if (cat_labs && !cat_vals)
639 sprintf(buff,
"%s", cstr);
641 if (cat_labs && cat_vals) {
644 sprintf(buff,
"%.*lf) %s", fprec, tdcell, cstr);
646 sprintf(buff,
"%*d) %s", iprec, tcell, cstr);
648 sprintf(buff,
"%.*lf", fprec, tdcell);
650 sprintf(buff,
"%d", tcell);
654 sprintf(buff,
"%.*lf", fprec, tdcell);
656 sprintf(buff,
"%d", tcell);
660 labpt[
X] = labpos * (sr - sl) + xoff -
687 Rast_free_cats(&cats);
689 Rast_free_colors(&colors);
699 return (legend_list);