[GRASS-SVN] r52246 - grass/trunk/display/d.legend
svn_grass at osgeo.org
svn_grass at osgeo.org
Thu Jun 28 00:54:32 PDT 2012
Author: huhabla
Date: 2012-06-28 00:54:31 -0700 (Thu, 28 Jun 2012)
New Revision: 52246
Modified:
grass/trunk/display/d.legend/d.legend.html
grass/trunk/display/d.legend/main.c
Log:
Added fontscale flag to scale the font size in case of smoothed legend.
Renamed the option structs to use meaningful names.
Modified: grass/trunk/display/d.legend/d.legend.html
===================================================================
--- grass/trunk/display/d.legend/d.legend.html 2012-06-27 18:17:22 UTC (rev 52245)
+++ grass/trunk/display/d.legend/d.legend.html 2012-06-28 07:54:31 UTC (rev 52246)
@@ -33,7 +33,9 @@
display frame, the legend may appear in unreadably small text, or even revert
to a smooth gradient legend. Use the <b>lines</b>, <b>thin</b>, <b>use</b>, <b>range</b>,
and/or <b>-n</b> options to reduce the number of categories to be displayed,
-or the <b>-s</b> flag to force a smooth gradient legend.
+or the <b>-s</b> flag to force a smooth gradient legend.
+Additionally the fonts for smoothed floating point legends
+can be scaled by a scale factor <b>fontscale</b>, to adjust the automatically computed size of the legend font.
<p>The <b>lines</b> option will display the first number of categories, as defined
by <em>value</em>, contained in the raster map. When used with the <b>-n</b> flag,
it takes on a new meaning: "up to category #". When used with both
Modified: grass/trunk/display/d.legend/main.c
===================================================================
--- grass/trunk/display/d.legend/main.c 2012-06-27 18:17:22 UTC (rev 52245)
+++ grass/trunk/display/d.legend/main.c 2012-06-28 07:54:31 UTC (rev 52246)
@@ -58,7 +58,7 @@
struct Categories cats;
struct Colors colors;
struct GModule *module;
- struct Option *opt1, *opt2, *opt4, *opt5, *opt6, *opt7, *opt8, *opt9, *opt10, *opt11, *opt12;
+ struct Option *opt_input, *opt_color, *opt_lines, *opt_thin, *opt_labelnum, *opt_at, *opt_use, *opt_range, *opt_font, *opt_path, *opt_charset, *opt_fontscale;
struct Flag *hidestr, *hidenum, *hidenodata, *smooth, *flipit, *size;
struct Range range;
struct FPRange fprange;
@@ -75,6 +75,7 @@
double UserRangeMin, UserRangeMax, UserRangeTemp;
double *catlist, maxCat;
int catlistCount, use_catlist;
+ double fontscale;
/* Initialize the GIS calls */
@@ -87,94 +88,103 @@
_("Displays a legend for a raster map in the active frame "
"of the graphics monitor.");
- opt1 = G_define_standard_option(G_OPT_R_MAP);
- opt1->description = _("Name of raster map");
+ opt_input = G_define_standard_option(G_OPT_R_MAP);
+ opt_input->description = _("Name of raster map");
- opt2 = G_define_option();
- opt2->key = "color";
- opt2->type = TYPE_STRING;
- opt2->answer = DEFAULT_FG_COLOR;
- opt2->gisprompt = "old_color,color,color";
- opt2->description = _("Sets the legend's text color");
+ opt_color = G_define_option();
+ opt_color->key = "color";
+ opt_color->type = TYPE_STRING;
+ opt_color->answer = DEFAULT_FG_COLOR;
+ opt_color->gisprompt = "old_color,color,color";
+ opt_color->description = _("Sets the legend's text color");
- opt4 = G_define_option();
- opt4->key = "lines";
- opt4->type = TYPE_INTEGER;
- opt4->answer = "0";
- opt4->options = "0-1000";
- opt4->description =
+ opt_lines = G_define_option();
+ opt_lines->key = "lines";
+ opt_lines->type = TYPE_INTEGER;
+ opt_lines->answer = "0";
+ opt_lines->options = "0-1000";
+ opt_lines->description =
_("Number of text lines (useful for truncating long legends)");
- opt4->guisection = _("Advanced");
+ opt_lines->guisection = _("Advanced");
- opt5 = G_define_option();
- opt5->key = "thin";
- opt5->type = TYPE_INTEGER;
- opt5->required = NO;
- opt5->answer = "1";
- opt5->options = "1-1000";
- opt5->description = _("Thinning factor (thin=10 gives cats 0,10,20...)");
- opt5->guisection = _("Advanced");
+ opt_thin = G_define_option();
+ opt_thin->key = "thin";
+ opt_thin->type = TYPE_INTEGER;
+ opt_thin->required = NO;
+ opt_thin->answer = "1";
+ opt_thin->options = "1-1000";
+ opt_thin->description = _("Thinning factor (thin=10 gives cats 0,10,20...)");
+ opt_thin->guisection = _("Advanced");
- opt6 = G_define_option();
- opt6->key = "labelnum";
- opt6->type = TYPE_INTEGER;
- opt6->answer = "5";
- opt6->options = "2-100";
- opt6->description = _("Number of text labels for smooth gradient legend");
- opt6->guisection = _("Advanced");
+ opt_labelnum = G_define_option();
+ opt_labelnum->key = "labelnum";
+ opt_labelnum->type = TYPE_INTEGER;
+ opt_labelnum->answer = "5";
+ opt_labelnum->options = "2-100";
+ opt_labelnum->description = _("Number of text labels for smooth gradient legend");
+ opt_labelnum->guisection = _("Advanced");
- opt7 = G_define_option();
- opt7->key = "at";
- opt7->key_desc = "bottom,top,left,right";
- opt7->type = TYPE_DOUBLE; /* needs to be TYPE_DOUBLE to get past options check */
- opt7->required = NO;
- opt7->options = "0-100";
- opt7->label =
+ opt_at = G_define_option();
+ opt_at->key = "at";
+ opt_at->key_desc = "bottom,top,left,right";
+ opt_at->type = TYPE_DOUBLE; /* needs to be TYPE_DOUBLE to get past options check */
+ opt_at->required = NO;
+ opt_at->options = "0-100";
+ opt_at->label =
_("Size and placement as percentage of screen coordinates (0,0 is lower left)");
- opt7->description = opt7->key_desc;
- opt7->answer = NULL;
+ opt_at->description = opt_at->key_desc;
+ opt_at->answer = NULL;
- opt8 = G_define_option();
- opt8->key = "use";
- opt8->key_desc = "catnum";
- opt8->type = TYPE_DOUBLE; /* string as it is fed through the parser? */
- opt8->required = NO;
- opt8->description =
+ opt_use = G_define_option();
+ opt_use->key = "use";
+ opt_use->key_desc = "catnum";
+ opt_use->type = TYPE_DOUBLE; /* string as it is fed through the parser? */
+ opt_use->required = NO;
+ opt_use->description =
_("List of discrete category numbers/values for legend");
- opt8->multiple = YES;
- opt8->guisection = _("Advanced");
+ opt_use->multiple = YES;
+ opt_use->guisection = _("Advanced");
- opt9 = G_define_option();
- opt9->key = "range";
- opt9->key_desc = "min,max";
- opt9->type = TYPE_DOUBLE; /* should it be type_double or _string ?? */
- opt9->required = NO;
- opt9->description =
+ opt_range = G_define_option();
+ opt_range->key = "range";
+ opt_range->key_desc = "min,max";
+ opt_range->type = TYPE_DOUBLE; /* should it be type_double or _string ?? */
+ opt_range->required = NO;
+ opt_range->description =
_("Use a subset of the map range for the legend (min,max)");
- opt9->guisection = _("Advanced");
+ opt_range->guisection = _("Advanced");
- opt10 = G_define_option();
- opt10->key = "font";
- opt10->type = TYPE_STRING;
- opt10->required = NO;
- opt10->description = _("Font name");
- opt10->guisection = _("Advanced");
+ opt_font = G_define_option();
+ opt_font->key = "font";
+ opt_font->type = TYPE_STRING;
+ opt_font->required = NO;
+ opt_font->description = _("Font name");
+ opt_font->guisection = _("Advanced");
- opt11 = G_define_option();
- opt11->key = "path";
- opt11->type = TYPE_STRING;
- opt11->required = NO;
- opt11->description = _("Path to font file");
- opt11->gisprompt = "old_file,file,font";
- opt11->guisection = _("Advanced");
+ opt_fontscale = G_define_option();
+ opt_fontscale->key = "fontscale";
+ opt_fontscale->type = TYPE_DOUBLE;
+ opt_fontscale->required = NO;
+ opt_fontscale->answer = "5";
+ opt_fontscale->options = "0-100";
+ opt_fontscale->description = _("Font scaling factor for floating point legends");
+ opt_fontscale->guisection = _("Advanced");
- opt12 = G_define_option();
- opt12->key = "charset";
- opt12->type = TYPE_STRING;
- opt12->required = NO;
- opt12->description =
+ opt_path = G_define_option();
+ opt_path->key = "path";
+ opt_path->type = TYPE_STRING;
+ opt_path->required = NO;
+ opt_path->description = _("Path to font file");
+ opt_path->gisprompt = "old_file,file,font";
+ opt_path->guisection = _("Advanced");
+
+ opt_charset = G_define_option();
+ opt_charset->key = "charset";
+ opt_charset->type = TYPE_STRING;
+ opt_charset->required = NO;
+ opt_charset->description =
_("Text encoding (only applicable to TrueType fonts)");
- opt12->guisection = _("Advanced");
+ opt_charset->guisection = _("Advanced");
hidestr = G_define_flag();
hidestr->key = 'v';
@@ -209,7 +219,7 @@
if (G_parser(argc, argv))
exit(EXIT_FAILURE);
- map_name = opt1->answer;
+ map_name = opt_input->answer;
hide_catstr = hidestr->answer; /* note hide_catstr gets changed and re-read below */
hide_catnum = hidenum->answer;
@@ -217,28 +227,32 @@
do_smooth = smooth->answer;
flip = flipit->answer;
+ /* Create the fontscale factor for floating point legends */
+ fontscale = atof(opt_fontscale->answer);
+ fontscale = 1.0 / (100.0/fontscale);
+
color = 0; /* if only to get rid of the compiler warning */
- if (opt2->answer != NULL) {
- new_colr = D_translate_color(opt2->answer);
+ if (opt_color->answer != NULL) {
+ new_colr = D_translate_color(opt_color->answer);
if (new_colr == 0)
- G_fatal_error(_("Don't know the color %s"), opt2->answer);
+ G_fatal_error(_("Don't know the color %s"), opt_color->answer);
color = new_colr;
}
- if (opt4->answer != NULL)
- sscanf(opt4->answer, "%d", &lines);
+ if (opt_lines->answer != NULL)
+ sscanf(opt_lines->answer, "%d", &lines);
thin = 1;
- if (opt5->answer != NULL)
- sscanf(opt5->answer, "%d", &thin);
+ if (opt_thin->answer != NULL)
+ sscanf(opt_thin->answer, "%d", &thin);
if (!thin)
thin = 1;
- if (opt6->answer != NULL)
- sscanf(opt6->answer, "%d", &steps);
+ if (opt_labelnum->answer != NULL)
+ sscanf(opt_labelnum->answer, "%d", &steps);
catlistCount = 0;
- if (opt8->answer != NULL) { /* should this be answerS ? */
+ if (opt_use->answer != NULL) { /* should this be answerS ? */
use_catlist = TRUE;
catlist = (double *)G_calloc(100 + 1, sizeof(double));
@@ -246,8 +260,8 @@
catlist[i] = 1.0 * (i + 1);
catlist[i] = 0;
- for (i = 0; (opt8->answers[i] != NULL) && i < 100; i++)
- catlist[i] = atof(opt8->answers[i]);
+ for (i = 0; (opt_use->answers[i] != NULL) && i < 100; i++)
+ catlist[i] = atof(opt_use->answers[i]);
catlistCount = i;
}
@@ -256,9 +270,9 @@
UserRange = FALSE;
- if (opt9->answer != NULL) { /* should this be answerS ? */
- sscanf(opt9->answers[0], "%lf", &UserRangeMin);
- sscanf(opt9->answers[1], "%lf", &UserRangeMax);
+ if (opt_range->answer != NULL) { /* should this be answerS ? */
+ sscanf(opt_range->answers[0], "%lf", &UserRangeMin);
+ sscanf(opt_range->answers[1], "%lf", &UserRangeMax);
UserRange = TRUE;
if (UserRangeMin > UserRangeMax) {
UserRangeTemp = UserRangeMax;
@@ -291,23 +305,23 @@
white = D_translate_color(DEFAULT_FG_COLOR);
black = D_translate_color(DEFAULT_BG_COLOR);
- if (opt10->answer)
- D_font(opt10->answer);
- else if (opt11->answer)
- D_font(opt11->answer);
+ if (opt_font->answer)
+ D_font(opt_font->answer);
+ else if (opt_path->answer)
+ D_font(opt_path->answer);
- if (opt12->answer)
- D_encoding(opt12->answer);
+ if (opt_charset->answer)
+ D_encoding(opt_charset->answer);
/* Figure out where to put text */
D_setup_unity(0);
D_get_src(&t, &b, &l, &r);
- if (opt7->answer != NULL) {
- sscanf(opt7->answers[0], "%lf", &Y1);
- sscanf(opt7->answers[1], "%lf", &Y0);
- sscanf(opt7->answers[2], "%lf", &X0);
- sscanf(opt7->answers[3], "%lf", &X1);
+ if (opt_at->answer != NULL) {
+ sscanf(opt_at->answers[0], "%lf", &Y1);
+ sscanf(opt_at->answers[1], "%lf", &Y0);
+ sscanf(opt_at->answers[2], "%lf", &X0);
+ sscanf(opt_at->answers[3], "%lf", &X1);
}
else { /* default */
Y1 = 12;
@@ -438,7 +452,7 @@
for (i = 0, k = 0; i < catlistCount; i++) {
if ((catlist[i] < min_ind) || (catlist[i] > max_ind)) {
G_fatal_error(_("use=%s out of range [%d,%d] (extend with range= ?)"),
- opt8->answers[i], min_ind, max_ind);
+ opt_use->answers[i], min_ind, max_ind);
}
cstr = Rast_get_d_cat(&catlist[i], &cats);
@@ -494,7 +508,7 @@
}
/* center really tiny legends */
- if (opt7->answer == NULL) { /* if defualt scaling */
+ if (opt_at->answer == NULL) { /* if defualt scaling */
if (!do_smooth && (dots_per_line < 4)) /* if so small that there's no box */
if ((b - (dots_per_line * lines)) / (b * 1.0) > 0.15) /* if there's more than a 15% blank at the bottom */
y0 = ((b - t) - (dots_per_line * lines)) / 2;
@@ -544,10 +558,10 @@
for (i = 0; i < catlistCount; i++) {
if ((catlist[i] < dmin) || (catlist[i] > dmax)) {
G_fatal_error(_("use=%s out of range [%.3f, %.3f] (extend with range= ?)"),
- opt8->answers[i], dmin, dmax);
+ opt_use->answers[i], dmin, dmax);
}
- if (strlen(opt8->answers[i]) > MaxLabelLen)
- MaxLabelLen = strlen(opt8->answers[i]);
+ if (strlen(opt_use->answers[i]) > MaxLabelLen)
+ MaxLabelLen = strlen(opt_use->answers[i]);
}
}
do_cats = 0; /* if only to get rid of the compiler warning */
@@ -676,13 +690,13 @@
/* Draw text */
if (!horiz)
- txsiz = (int)((y1 - y0) / 20);
+ txsiz = (int)((y1 - y0) * fontscale);
else
- txsiz = (int)((x1 - x0) / 20);
+ txsiz = (int)((x1 - x0) * fontscale);
/* scale text to fit in window if position not manually set */
/* usually not needed, except when frame is really narrow */
- if (opt7->answer == NULL) { /* ie defualt scaling */
+ if (opt_at->answer == NULL) { /* ie default scaling */
ScaleFactor = ((r - x1) / ((MaxLabelLen + 1) * txsiz * 0.81)); /* ?? txsiz*.81=actual text width. */
if (ScaleFactor < 1.0) {
txsiz = (int)(txsiz * ScaleFactor);
@@ -776,7 +790,7 @@
txsiz = (int)((y1 - y0) / (2.0 * lines));
/* scale text to fit in window if position not manually set */
- if (opt7->answer == NULL) { /* ie defualt scaling */
+ if (opt_at->answer == NULL) { /* ie defualt scaling */
ScaleFactor = ((true_r - true_l) / ((MaxLabelLen + 3) * txsiz * 0.81)); /* ?? txsiz*.81=actual text width. */
if (ScaleFactor < 1.0) {
txsiz = (int)floor(txsiz * ScaleFactor);
@@ -896,14 +910,14 @@
if(use_catlist)
/* pass through format exactly as given by the user in
the use= command line parameter (helps with log scale) */
- sprintf(buff, "%s", opt8->answers[i]);
+ sprintf(buff, "%s", opt_use->answers[i]);
else
/* automatically generated/tuned decimal precision format */
sprintf(buff, DispFormat, catlist[i]);
}
else {
if(use_catlist)
- sprintf(buff, "%s", opt8->answers[catlistCount - i - 1]);
+ sprintf(buff, "%s", opt_use->answers[catlistCount - i - 1]);
else
sprintf(buff, DispFormat, catlist[catlistCount - i - 1]);
}
More information about the grass-commit
mailing list