Index: display/d.grid/d.grid.html
===================================================================
--- display/d.grid/d.grid.html	(revision 68522)
+++ display/d.grid/d.grid.html	(working copy)
@@ -40,7 +40,12 @@
 or <em>XY</em> projection.
 <p>
 Colors may be standard named GRASS colors (red, green, aqua, etc.) or
-a numerical R:G:B triplet, where component values range from 0-255.<br>
+a numerical R:G:B triplet, where component values range from 0-255.
+Grid color can be set with option <b>color</b>. Border color can be 
+se with option <b>border_color</b>. Text color can be set with option
+<b>text_color</b>. Background color can be set with option 
+<b>bg_color</b>.
+<br>
 
 <p>
 The grid drawing may be turned off by using the <em>-n</em> flag.<br>
@@ -94,6 +99,7 @@
 Geogrid support: Bob Covill<br>
 Border support: Markus Neteler<br>
 Text and RGB support: Hamish Bowman<br>
+Improvements as part of GSoC 2016 by Adam Laza, CTU in Prague 
 
 <p>
 <i>Last changed: $Date$</i>
Index: display/d.grid/local_proto.h
===================================================================
--- display/d.grid/local_proto.h	(revision 68522)
+++ display/d.grid/local_proto.h	(working copy)
@@ -1,18 +1,19 @@
 #include <grass/gprojects.h>
 
-#define DIRN_BOTH 0 
+#define DIRN_BOTH 0
 #define DIRN_LAT  1
 #define DIRN_LON  2
 
 /* plot.c */
-int plot_grid(double, double, double, int, int, int, int, int, double, int);
+int plot_grid(double, double, double, int, int, int, int, int, int, double,
+              int);
 int plot_geogrid(double, struct pj_info, struct pj_info, int, int, int, int,
-		 int, double, int);
+                 int, int, double, int);
 void init_proj(struct pj_info *, struct pj_info *, int);
 void get_ll_bounds(double *, double *, double *, double *, struct Cell_head,
-		   struct pj_info, struct pj_info);
+                   struct pj_info, struct pj_info);
 void check_coords(double, double, double *, double *, int, struct Cell_head,
-		  struct pj_info, struct pj_info);
+                  struct pj_info, struct pj_info);
 float get_heading(double, double);
 
 /* plotborder.c */
Index: display/d.grid/main.c
===================================================================
--- display/d.grid/main.c	(revision 68522)
+++ display/d.grid/main.c	(working copy)
@@ -1,3 +1,4 @@
+
 /****************************************************************
  *
  * MODULE:       d.grid
@@ -32,16 +33,17 @@
     int colorg = 0;
     int colorb = 0;
     int colort = 0;
-    double size = 0., gsize = 0.;	/* initialize to zero */
+    int colorbg = 0;
+    double size = 0., gsize = 0.;       /* initialize to zero */
     double east, north;
     int do_text, fontsize, mark_type, line_width, dirn;
     struct GModule *module;
     struct Option *opt1, *opt2, *opt3, *opt4, *fsize, *tcolor, *lwidth,
-	*direction;
+        *direction, *bgcolor;
     struct Flag *noborder, *notext, *geogrid, *nogrid, *wgs84, *cross,
-	*fiducial, *dot, *align;
-    struct pj_info info_in;	/* Proj structures */
-    struct pj_info info_out;	/* Proj structures */
+        *fiducial, *dot, *align;
+    struct pj_info info_in;     /* Proj structures */
+    struct pj_info info_out;    /* Proj structures */
     struct Cell_head wind;
 
     /* Initialize the GIS calls */
@@ -52,8 +54,8 @@
     G_add_keyword(_("cartography"));
     G_add_keyword(_("graticule"));
     module->description =
-	_("Overlays a user-specified grid "
-	  "in the active display frame on the graphics monitor.");
+        _("Overlays a user-specified grid "
+          "in the active display frame on the graphics monitor.");
 
     opt2 = G_define_option();
     opt2->key = "size";
@@ -61,9 +63,10 @@
     opt2->type = TYPE_STRING;
     opt2->required = YES;
     opt2->label = _("Size of grid to be drawn (in map units)");
-    opt2->description = _("0 for north-south resolution of the current region. "
-                          "In map units or DDD:MM:SS format. "
-			  "Example: \"1000\" or \"0:10\"");
+    opt2->description =
+        _("0 for north-south resolution of the current region. "
+          "In map units or DDD:MM:SS format. "
+          "Example: \"1000\" or \"0:10\"");
 
     opt3 = G_define_standard_option(G_OPT_M_COORDS);
     opt3->key = "origin";
@@ -78,7 +81,7 @@
     direction->answer = "both";
     direction->options = "both,east-west,north-south";
     direction->description =
-	_("Draw only east-west lines, north-south lines, or both ");
+        _("Draw only east-west lines, north-south lines, or both ");
     direction->guisection = _("Disable");
 
     lwidth = G_define_option();
@@ -103,6 +106,12 @@
     tcolor->label = _("Text color");
     tcolor->guisection = _("Color");
 
+    bgcolor = G_define_standard_option(G_OPT_CN);
+    bgcolor->key = "bg_color";
+    bgcolor->answer = "none";
+    bgcolor->label = _("Background color");
+    bgcolor->guisection = _("Color");
+
     fsize = G_define_option();
     fsize->key = "fontsize";
     fsize->type = TYPE_INTEGER;
@@ -113,18 +122,19 @@
 
     align = G_define_flag();
     align->key = 'a';
-    align->description = _("Align the origin to the east-north corner of the current region");
+    align->description =
+        _("Align the origin to the east-north corner of the current region");
 
     geogrid = G_define_flag();
     geogrid->key = 'g';
     geogrid->description =
-	_("Draw geographic grid (referenced to current ellipsoid)");
+        _("Draw geographic grid (referenced to current ellipsoid)");
     geogrid->guisection = _("Draw");
 
     wgs84 = G_define_flag();
     wgs84->key = 'w';
     wgs84->description =
-	_("Draw geographic grid (referenced to WGS84 ellipsoid)");
+        _("Draw geographic grid (referenced to WGS84 ellipsoid)");
     wgs84->guisection = _("Draw");
 
     cross = G_define_flag();
@@ -141,7 +151,7 @@
     fiducial->key = 'f';
     fiducial->description = _("Draw fiducial marks instead of grid lines");
     fiducial->guisection = _("Draw");
-    
+
     nogrid = G_define_flag();
     nogrid->key = 'n';
     nogrid->description = _("Disable grid drawing");
@@ -159,99 +169,107 @@
 
     /* Check command line */
     if (G_parser(argc, argv))
-	exit(EXIT_FAILURE);
+        exit(EXIT_FAILURE);
 
 
     /* do some checking */
     if (nogrid->answer && noborder->answer)
-	G_fatal_error(_("Both grid and border drawing are disabled"));
+        G_fatal_error(_("Both grid and border drawing are disabled"));
     if (wgs84->answer)
-	geogrid->answer = 1;	/* -w implies -g */
+        geogrid->answer = 1;    /* -w implies -g */
     if (geogrid->answer && G_projection() == PROJECTION_LL)
-	G_fatal_error(_("Geo-grid option not available for LL projection, use without -g/-w"));
+        G_fatal_error(_("Geo-grid option not available for LL projection, use without -g/-w"));
     if (geogrid->answer && G_projection() == PROJECTION_XY)
-	G_fatal_error(_("Geo-grid option not available for XY projection, use without -g/-w"));
+        G_fatal_error(_("Geo-grid option not available for XY projection, use without -g/-w"));
 
     if (notext->answer)
-	do_text = FALSE;
+        do_text = FALSE;
     else
-	do_text = TRUE;
+        do_text = TRUE;
 
     if (lwidth->answer) {
-	line_width = atoi(lwidth->answer);
-	if(line_width < 0 || line_width > 1e3)
-	    G_fatal_error("Invalid line width");
+        line_width = atoi(lwidth->answer);
+        if (line_width < 0 || line_width > 1e3)
+            G_fatal_error("Invalid line width");
     }
     else
-	line_width = 0;
+        line_width = 0;
 
     fontsize = atoi(fsize->answer);
 
     mark_type = MARK_GRID;
     if (cross->answer + fiducial->answer + dot->answer > 1)
-	G_fatal_error(_("Choose a single mark style"));
+        G_fatal_error(_("Choose a single mark style"));
     if (cross->answer)
-	mark_type = MARK_CROSS;
+        mark_type = MARK_CROSS;
     if (fiducial->answer)
-	mark_type = MARK_FIDUCIAL;
+        mark_type = MARK_FIDUCIAL;
     if (dot->answer)
-	mark_type = MARK_DOT;
+        mark_type = MARK_DOT;
 
     if (G_strcasecmp(direction->answer, "both") == 0)
-	dirn = DIRN_BOTH;
+        dirn = DIRN_BOTH;
     else if (G_strcasecmp(direction->answer, "east-west") == 0)
-	dirn = DIRN_LAT;
+        dirn = DIRN_LAT;
     else if (G_strcasecmp(direction->answer, "north-south") == 0)
-	dirn = DIRN_LON;
+        dirn = DIRN_LON;
     else
-	G_fatal_error("Invalid direction: %s", direction->answer);
+        G_fatal_error("Invalid direction: %s", direction->answer);
 
     if (align->answer || strcmp(opt2->answer, "0") == 0)
-	G_get_element_window(&wind, "", "WIND", G_mapset());
+        G_get_element_window(&wind, "", "WIND", G_mapset());
 
     if (strcmp(opt2->answer, "0") == 0) {
-	if (geogrid->answer)
-	    gsize = wind.ns_res;
-	else
-	    size = wind.ns_res;
-    } else {
+        if (geogrid->answer)
+            gsize = wind.ns_res;
+        else
+            size = wind.ns_res;
+    }
+    else {
         /* get grid size */
         if (geogrid->answer) {
-	    if (!G_scan_resolution(opt2->answer, &gsize, PROJECTION_LL) ||
-    	        gsize <= 0.0)
-    	        G_fatal_error(_("Invalid geo-grid size <%s>"), opt2->answer);
+            if (!G_scan_resolution(opt2->answer, &gsize, PROJECTION_LL) ||
+                gsize <= 0.0)
+                G_fatal_error(_("Invalid geo-grid size <%s>"), opt2->answer);
         }
         else {
-    	    if (!G_scan_resolution(opt2->answer, &size, G_projection()) ||
-    	        size <= 0.0)
-    	        G_fatal_error(_("Invalid grid size <%s>"), opt2->answer);
+            if (!G_scan_resolution(opt2->answer, &size, G_projection()) ||
+                size <= 0.0)
+                G_fatal_error(_("Invalid grid size <%s>"), opt2->answer);
         }
     }
 
     if (align->answer) {
-	/* reduce accumulated errors when ew_res is not the same as ns_res. */
-	struct Cell_head w;
+        /* reduce accumulated errors when ew_res is not the same as ns_res. */
+        struct Cell_head w;
 
-	G_get_set_window(&w);
-	east = wind.west + (int)((w.west - wind.west) / wind.ew_res) * wind.ew_res;
-	north = wind.south + (int)((w.south - wind.south) / wind.ns_res) * wind.ns_res;
-    } else {
+        G_get_set_window(&w);
+        east =
+            wind.west +
+            (int)((w.west - wind.west) / wind.ew_res) * wind.ew_res;
+        north =
+            wind.south +
+            (int)((w.south - wind.south) / wind.ns_res) * wind.ns_res;
+    }
+    else {
         /* get grid easting start */
         if (!G_scan_easting(opt3->answers[0], &east, G_projection())) {
-    	    G_usage();
-    	    G_fatal_error(_("Illegal east coordinate <%s>"), opt3->answers[0]);
+            G_usage();
+            G_fatal_error(_("Illegal east coordinate <%s>"),
+                          opt3->answers[0]);
         }
-    
+
         /* get grid northing start */
         if (!G_scan_northing(opt3->answers[1], &north, G_projection())) {
-    	    G_usage();
-    	    G_fatal_error(_("Illegal north coordinate <%s>"), opt3->answers[1]);
+            G_usage();
+            G_fatal_error(_("Illegal north coordinate <%s>"),
+                          opt3->answers[1]);
         }
     }
 
     /* Setup driver and check important information */
     D_open_driver();
-    
+
     /* Parse and select grid color */
     colorg = D_parse_color(opt1->answer, FALSE);
     /* Parse and select border color */
@@ -258,32 +276,33 @@
     colorb = D_parse_color(opt4->answer, FALSE);
     /* Parse and select text color */
     colort = D_parse_color(tcolor->answer, FALSE);
+    /* Parse and select background color */
+    colorbg = D_parse_color(bgcolor->answer, TRUE);
 
-
     D_setup(0);
 
     /* draw grid */
     if (!nogrid->answer) {
-	if (geogrid->answer) {
-	    /* initialzie proj stuff */
-	    init_proj(&info_in, &info_out, wgs84->answer);
-	    plot_geogrid(gsize, info_in, info_out, do_text, colorg, colort,
-			 fontsize, mark_type, line_width, dirn);
-	}
-	else {
-	    /* Do the grid plotting */
-	    plot_grid(size, east, north, do_text, colorg, colort, fontsize,
-		      mark_type, line_width, dirn);
-	}
+        if (geogrid->answer) {
+            /* initialzie proj stuff */
+            init_proj(&info_in, &info_out, wgs84->answer);
+            plot_geogrid(gsize, info_in, info_out, do_text, colorg, colort,
+                         colorbg, fontsize, mark_type, line_width, dirn);
+        }
+        else {
+            /* Do the grid plotting */
+            plot_grid(size, east, north, do_text, colorg, colort, colorbg,
+                      fontsize, mark_type, line_width, dirn);
+        }
     }
 
     /* Draw border */
     if (!noborder->answer) {
-	/* Set border color */
-	D_use_color(colorb);
+        /* Set border color */
+        D_use_color(colorb);
 
-	/* Do the border plotting */
-	plot_border(size, east, north, dirn);
+        /* Do the border plotting */
+        plot_border(size, east, north, dirn);
     }
 
     D_save_command(G_recreate_command());
Index: display/d.grid/plot.c
===================================================================
--- display/d.grid/plot.c	(revision 68522)
+++ display/d.grid/plot.c	(working copy)
@@ -10,8 +10,8 @@
 
 
 int plot_grid(double grid_size, double east, double north, int do_text,
-	      int gcolor, int tcolor, int fontsize, int mark_type,
-	      double line_width, int direction)
+              int gcolor, int tcolor, int bgcolor, int fontsize,
+              int mark_type, double line_width, int direction)
 {
     double x, y, y0;
     double e1, e2;
@@ -18,6 +18,7 @@
     struct Cell_head window;
     double row_dist, colm_dist;
     char text[128];
+    double tx, ty, bt, bb, bl, br, w, h;
 
     G_get_set_window(&window);
 
@@ -24,46 +25,62 @@
     /* pull right and bottom edges back one pixel; display lib bug? */
     row_dist = D_d_to_u_row(0.) - D_d_to_u_row(1.);
     colm_dist = D_d_to_u_col(1.) - D_d_to_u_col(0.);
-/*    window.south += row_dist;
-      window.east -= colm_dist;
- */
+    /*    window.south += row_dist;
+       window.east -= colm_dist;
+     */
 
     /* Draw vertical grids */
     if (window.west > east)
-	x = ceil((window.west - east) / grid_size) * grid_size + east;
+        x = ceil((window.west - east) / grid_size) * grid_size + east;
     else
-	x = east - ceil((east - window.west) / grid_size) * grid_size;
+        x = east - ceil((east - window.west) / grid_size) * grid_size;
 
     if (direction != DIRN_LAT) {
-	while (x <= window.east) {
-	    if (mark_type == MARK_GRID) {
-		D_use_color(gcolor);
-		if (line_width)
-		    D_line_width(line_width);
-		D_line_abs(x, window.north, x, window.south);
-		D_line_width(0);    /* reset so text doesn't use it */
-	    }
+        while (x <= window.east) {
+            if (mark_type == MARK_GRID) {
+                D_use_color(gcolor);
+                if (line_width)
+                    D_line_width(line_width);
+                D_line_abs(x, window.north, x, window.south);
+                D_line_width(0);        /* reset so text doesn't use it */
+            }
 
-	    if (do_text) {
-		D_use_color(tcolor);
-		G_format_easting(x, text, G_projection());
-		D_text_rotation(270.0);
-		D_text_size(fontsize, fontsize);
+            if (do_text) {
+                D_use_color(tcolor);
+                G_format_easting(x, text, G_projection());
+                D_text_rotation(270.0);
+                D_text_size(fontsize, fontsize);
 
-		/* Positioning -
-		   x: 4 pixels to the right of the grid line, + 0.5 rounding factor.
-		   y: End of text is 7 pixels up from bottom of screen, +.5 rounding.
-		   fontsize*.81 = actual text width FOR DEFAULT FONT (NOT FreeType)
-		 */
-		D_pos_abs(x + 4.5 * D_get_d_to_u_xconv(),
-			   D_get_u_south()
-			   - D_get_d_to_u_yconv() * (strlen(text) * fontsize * 0.81 + 7.5));
+                /* Positioning -
+                   x: 4 pixels to the right of the grid line, + 0.5 rounding factor.
+                   y: End of text is 7 pixels up from bottom of screen, +.5 rounding.
+                   fontsize*.81 = actual text width FOR DEFAULT FONT (NOT FreeType)
+                 */
 
-		D_text(text);
-	    }
-	    x += grid_size;
-	}
-	D_text_rotation(0.0);	    /* reset */
+                tx = x + 4.5 * D_get_d_to_u_xconv();
+                ty = D_get_u_south() -
+                    D_get_d_to_u_yconv() * (strlen(text) * fontsize * 0.81 +
+                                            7.5);
+
+                if (bgcolor != 0) {
+                    D_get_text_box(text, &bt, &bb, &bl, &br);
+                    w = br - bl;
+                    h = bt - bb;
+                    bl = tx - fontsize - 200 * fontsize;
+                    bt = ty + fontsize + 200 * fontsize;
+                    br = tx + w + fontsize + 200 * fontsize;
+                    bb = ty - h - fontsize - 200 * fontsize;
+                    D_use_color(bgcolor);
+                    D_box_abs(bl, bt, br, bb);
+                }
+
+                D_use_color(tcolor);
+                D_pos_abs(tx, ty);
+                D_text(text);
+            }
+            x += grid_size;
+        }
+        D_text_rotation(0.0);   /* reset */
     }
 
 
@@ -77,70 +94,85 @@
     e2 = (window.west * 2 + window.east) / 3;
 
     if (window.south > north)
-	y = ceil((window.south - north) / grid_size) * grid_size + north;
+        y = ceil((window.south - north) / grid_size) * grid_size + north;
     else
-	y = north - ceil((north - window.south) / grid_size) * grid_size;
+        y = north - ceil((north - window.south) / grid_size) * grid_size;
 
     if (direction != DIRN_LON) {
-	while (y <= window.north) {
-	    if (mark_type == MARK_GRID) {
-		D_use_color(gcolor);
-		if (line_width)
-		    D_line_width(line_width);
-		D_line_abs(window.east, y, e1, y);
-		D_line_abs(e1, y, e2, y);
-		D_line_abs(e2, y, window.west, y);
-		D_line_width(0);    /* reset so text doesn't use it */
-	    }
+        while (y <= window.north) {
+            if (mark_type == MARK_GRID) {
+                D_use_color(gcolor);
+                if (line_width)
+                    D_line_width(line_width);
+                D_line_abs(window.east, y, e1, y);
+                D_line_abs(e1, y, e2, y);
+                D_line_abs(e2, y, window.west, y);
+                D_line_width(0);        /* reset so text doesn't use it */
+            }
 
-	    if (do_text) {
-		D_use_color(tcolor);
-		G_format_northing(y, text, G_projection());
-		D_text_size(fontsize, fontsize);
+            if (do_text) {
+                D_use_color(tcolor);
+                G_format_northing(y, text, G_projection());
+                D_text_size(fontsize, fontsize);
 
-		/* Positioning -
-		   x: End of text is 7 pixels left from right edge of screen, +.5 rounding.
-		   fontsize*.81 = actual text width FOR DEFAULT FONT (NOT FreeType)
-		   y: 4 pixels above each grid line, +.5 rounding.
-		 */
-		D_pos_abs(
-		    D_get_u_east()
-		    - D_get_d_to_u_xconv() * (strlen(text) * fontsize * 0.81 + 7.5),
-		    y - D_get_d_to_u_yconv() * 4.5);
+                /* Positioning -
+                   x: End of text is 7 pixels left from right edge of screen, +.5 rounding.
+                   fontsize*.81 = actual text width FOR DEFAULT FONT (NOT FreeType)
+                   y: 4 pixels above each grid line, +.5 rounding.
+                 */
 
-		D_text(text);
-	    }
-	    y += grid_size;
-	}
+                tx = D_get_u_east() -
+                    D_get_d_to_u_xconv() * (strlen(text) * fontsize * 0.81 +
+                                            7.5);
+                ty = y - D_get_d_to_u_yconv() * 4.5;
+
+                if (bgcolor != 0) {
+                    D_get_text_box(text, &bt, &bb, &bl, &br);
+                    w = br - bl;
+                    h = bt - bb;
+                    bl = tx - fontsize - 200 * fontsize;
+                    bt = ty + h + fontsize + 200 * fontsize;
+                    br = tx + w + fontsize + 200 * fontsize;
+                    bb = ty - fontsize - 200 * fontsize;
+                    D_use_color(bgcolor);
+                    D_box_abs(bl, bt, br, bb);
+                }
+
+                D_use_color(tcolor);
+                D_pos_abs(tx, ty);
+                D_text(text);
+            }
+            y += grid_size;
+        }
     }
 
 
     /* draw marks not grid lines */
     if (mark_type != MARK_GRID) {
-	/* reset x and y */
-	if (window.west > east)
-	    x = ceil((window.west - east) / grid_size) * grid_size + east;
-	else
-	    x = east - ceil((east - window.west) / grid_size) * grid_size;
-	if (window.south > north)
-	    y0 = ceil((window.south - north) / grid_size) * grid_size + north;
-	else
-	    y0 = north - ceil((north - window.south) / grid_size) * grid_size;
+        /* reset x and y */
+        if (window.west > east)
+            x = ceil((window.west - east) / grid_size) * grid_size + east;
+        else
+            x = east - ceil((east - window.west) / grid_size) * grid_size;
+        if (window.south > north)
+            y0 = ceil((window.south - north) / grid_size) * grid_size + north;
+        else
+            y0 = north - ceil((north - window.south) / grid_size) * grid_size;
 
-	/* plot marks */
-	while (x <= window.east) {
-	    y = y0;		/* reset */
-	    while (y <= window.north) {
-		if (mark_type == MARK_CROSS)
-		    plot_cross(x, y, gcolor, 0.0);
-		else if (mark_type == MARK_FIDUCIAL)
-		    plot_fiducial(x, y, gcolor, 0.0);
-		else if (mark_type == MARK_DOT)
-		    plot_dot(x, y, gcolor);
-		y += grid_size;
-	    }
-	    x += grid_size;
-	}
+        /* plot marks */
+        while (x <= window.east) {
+            y = y0;             /* reset */
+            while (y <= window.north) {
+                if (mark_type == MARK_CROSS)
+                    plot_cross(x, y, gcolor, 0.0);
+                else if (mark_type == MARK_FIDUCIAL)
+                    plot_fiducial(x, y, gcolor, 0.0);
+                else if (mark_type == MARK_DOT)
+                    plot_dot(x, y, gcolor);
+                y += grid_size;
+            }
+            x += grid_size;
+        }
     }
 
     return 0;
@@ -148,8 +180,9 @@
 
 
 int plot_geogrid(double size, struct pj_info info_in, struct pj_info info_out,
-		 int do_text, int gcolor, int tcolor, int fontsize,
-		 int mark_type, double line_width, int direction)
+                 int do_text, int gcolor, int tcolor, int bgcolor,
+                 int fontsize, int mark_type, double line_width,
+                 int direction)
 {
     double g;
     double e1, e2, n1, n2;
@@ -165,6 +198,7 @@
     double row_dist, colm_dist;
     float font_angle;
     struct Cell_head window;
+    double tx, ty, bt, bb, br, bl, w, h;
 
     /* geo current region */
     G_get_set_window(&window);
@@ -186,54 +220,69 @@
     g = floor(north / size) * size;
     e1 = east;
     for (j = 0; g >= south; j++, g -= size) {
-	start_coord = -9999.;
-	if (g == north || g == south || direction == DIRN_LON)
-	    continue;
+        start_coord = -9999.;
+        if (g == north || g == south || direction == DIRN_LON)
+            continue;
 
-	/* Set grid color */
-	D_use_color(gcolor);
+        /* Set grid color */
+        D_use_color(gcolor);
 
-	for (ll = 0; ll < SEGS; ll++) {
-	    n1 = n2 = g;
-	    e1 = west + (ll * ((east - west) / SEGS));
-	    e2 = e1 + ((east - west) / SEGS);
-	    if (pj_do_proj(&e1, &n1, &info_in, &info_out) < 0)
-		G_fatal_error(_("Error in pj_do_proj"));
+        for (ll = 0; ll < SEGS; ll++) {
+            n1 = n2 = g;
+            e1 = west + (ll * ((east - west) / SEGS));
+            e2 = e1 + ((east - west) / SEGS);
+            if (pj_do_proj(&e1, &n1, &info_in, &info_out) < 0)
+                G_fatal_error(_("Error in pj_do_proj"));
 
-	    check_coords(e1, n1, &lon, &lat, 1, window, info_in, info_out);
-	    e1 = lon;
-	    n1 = lat;
-	    if (pj_do_proj(&e2, &n2, &info_in, &info_out) < 0)
-		G_fatal_error(_("Error in pj_do_proj"));
+            check_coords(e1, n1, &lon, &lat, 1, window, info_in, info_out);
+            e1 = lon;
+            n1 = lat;
+            if (pj_do_proj(&e2, &n2, &info_in, &info_out) < 0)
+                G_fatal_error(_("Error in pj_do_proj"));
 
-	    check_coords(e2, n2, &lon, &lat, 1, window, info_in, info_out);
-	    e2 = lon;
-	    n2 = lat;
-	    if (start_coord == -9999.) {
-		start_coord = n1;
-		font_angle = get_heading((e1 - e2), (n1 - n2));
-	    }
+            check_coords(e2, n2, &lon, &lat, 1, window, info_in, info_out);
+            e2 = lon;
+            n2 = lat;
+            if (start_coord == -9999.) {
+                start_coord = n1;
+                font_angle = get_heading((e1 - e2), (n1 - n2));
+            }
 
-	    if (line_width)
-		D_line_width(line_width);
+            if (line_width)
+                D_line_width(line_width);
 
-	    if (mark_type == MARK_GRID)
-		D_line_abs(e1, n1, e2, n2);
+            if (mark_type == MARK_GRID)
+                D_line_abs(e1, n1, e2, n2);
 
-	    D_line_width(0);
-	}
+            D_line_width(0);
+        }
 
-	if (do_text) {
-	    /* Set text color */
-	    D_use_color(tcolor);
+        if (do_text) {
+            /* Set text color */
+            D_use_color(tcolor);
 
-	    G_format_northing(g, text, PROJECTION_LL);
-	    D_text_rotation(font_angle);
-	    D_text_size(fontsize, fontsize);
-	    D_pos_abs(D_get_u_west() + D_get_d_to_u_xconv() * border_off,
-		      start_coord - D_get_d_to_u_yconv() * grid_off);
-	    D_text(text);
-	}
+            G_format_northing(g, text, PROJECTION_LL);
+            D_text_rotation(font_angle);
+            D_text_size(fontsize, fontsize);
+            tx = D_get_u_west() + D_get_d_to_u_xconv() * border_off;
+            ty = start_coord - D_get_d_to_u_yconv() * grid_off;
+
+            if (bgcolor != 0) {
+                D_get_text_box(text, &bt, &bb, &bl, &br);
+                w = br - bl;
+                h = bt - bb;
+                bl = tx - fontsize - 200 * fontsize;
+                bt = ty + h + fontsize + 200 * fontsize;
+                br = tx + w + fontsize + 200 * fontsize;
+                bb = ty - fontsize - 200 * fontsize;
+                D_use_color(bgcolor);
+                D_box_abs(bl, bt, br, bb);
+            }
+
+            D_use_color(tcolor);
+            D_pos_abs(tx, ty);
+            D_text(text);
+        }
     }
 
     /* Lines of Longitude */
@@ -240,94 +289,111 @@
     g = floor(east / size) * size;
     n1 = north;
     for (j = 0; g > west; j++, g -= size) {
-	start_coord = -9999.;
-	extra_y_off = 0.0;
-	if (g == east || g == west || direction == DIRN_LAT)
-	    continue;
+        start_coord = -9999.;
+        extra_y_off = 0.0;
+        if (g == east || g == west || direction == DIRN_LAT)
+            continue;
 
-	/* Set grid color */
-	D_use_color(gcolor);
+        /* Set grid color */
+        D_use_color(gcolor);
 
-	for (ll = 0; ll < SEGS; ll++) {
-	    e1 = e2 = g;
-	    n1 = north - (ll * ((north - south) / SEGS));
-	    n2 = n1 - ((north - south) / SEGS);
-	    /*
-	       n1 = south + (ll *((north - south)/SEGS));
-	       n2 = n1 + ((north - south)/SEGS);
-	     */
-	    if (pj_do_proj(&e1, &n1, &info_in, &info_out) < 0)
-		G_fatal_error(_("Error in pj_do_proj"));
+        for (ll = 0; ll < SEGS; ll++) {
+            e1 = e2 = g;
+            n1 = north - (ll * ((north - south) / SEGS));
+            n2 = n1 - ((north - south) / SEGS);
+            /*
+               n1 = south + (ll *((north - south)/SEGS));
+               n2 = n1 + ((north - south)/SEGS);
+             */
+            if (pj_do_proj(&e1, &n1, &info_in, &info_out) < 0)
+                G_fatal_error(_("Error in pj_do_proj"));
 
-	    check_coords(e1, n1, &lon, &lat, 2, window, info_in, info_out);
-	    e1 = lon;
-	    n1 = lat;
-	    if (pj_do_proj(&e2, &n2, &info_in, &info_out) < 0)
-		G_fatal_error(_("Error in pj_do_proj"));
+            check_coords(e1, n1, &lon, &lat, 2, window, info_in, info_out);
+            e1 = lon;
+            n1 = lat;
+            if (pj_do_proj(&e2, &n2, &info_in, &info_out) < 0)
+                G_fatal_error(_("Error in pj_do_proj"));
 
-	    check_coords(e2, n2, &lon, &lat, 2, window, info_in, info_out);
-	    e2 = lon;
-	    n2 = lat;
+            check_coords(e2, n2, &lon, &lat, 2, window, info_in, info_out);
+            e2 = lon;
+            n2 = lat;
 
-	    if ((start_coord == -9999.) && (D_u_to_a_row(n1) > 0)) {
-		font_angle = get_heading((e1 - e2), (n1 - n2));
-		start_coord = e1;
+            if ((start_coord == -9999.) && (D_u_to_a_row(n1) > 0)) {
+                font_angle = get_heading((e1 - e2), (n1 - n2));
+                start_coord = e1;
 
-		/* font rotates by bottom-left corner, try to keep top-left cnr on screen */
-		if (font_angle - 270 > 0) {
-		    extra_y_off = sin((font_angle - 270) * M_PI/180) * fontsize;
-		    if (D_u_to_d_row(n1) - D_get_d_north() < extra_y_off + grid_off)
-			start_coord = -9999.;  /* wait until the next point south */
-		}
-	    }
+                /* font rotates by bottom-left corner, try to keep top-left cnr on screen */
+                if (font_angle - 270 > 0) {
+                    extra_y_off =
+                        sin((font_angle - 270) * M_PI / 180) * fontsize;
+                    if (D_u_to_d_row(n1) - D_get_d_north() <
+                        extra_y_off + grid_off)
+                        start_coord = -9999.;   /* wait until the next point south */
+                }
+            }
 
-	    if (line_width)
-		D_line_width(line_width);
+            if (line_width)
+                D_line_width(line_width);
 
-	    if (mark_type == MARK_GRID)
-		D_line_abs(e1, n1, e2, n2);
+            if (mark_type == MARK_GRID)
+                D_line_abs(e1, n1, e2, n2);
 
-	    D_line_width(0);
-	}
-	if (do_text) {
-	    /* Set text color */
-	    D_use_color(tcolor);
+            D_line_width(0);
+        }
+        if (do_text) {
+            /* Set text color */
+            D_use_color(tcolor);
 
-	    G_format_easting(g, text, PROJECTION_LL);
-	    D_text_rotation(font_angle);
-	    D_text_size(fontsize, fontsize);
-	    D_pos_abs(start_coord + D_get_d_to_u_xconv() * (grid_off + 1.5),
-		      D_get_u_north() + D_get_d_to_u_yconv() *
-		      (border_off + extra_y_off));
-	    D_text(text);
-	}
+            G_format_easting(g, text, PROJECTION_LL);
+            D_text_rotation(font_angle);
+            D_text_size(fontsize, fontsize);
+            tx = start_coord + D_get_d_to_u_xconv() * (grid_off + 1.5);
+            ty = D_get_u_north() + D_get_d_to_u_yconv() * (border_off +
+                                                           extra_y_off);
+
+            if (bgcolor != 0) {
+                D_get_text_box(text, &bt, &bb, &bl, &br);
+                w = br - bl;
+                h = bt - bb;
+                bl = tx - fontsize - 200 * fontsize;
+                bt = ty + fontsize + 200 * fontsize;
+                br = tx + w + fontsize + 200 * fontsize;
+                bb = ty - h - fontsize - 200 * fontsize;
+                D_use_color(bgcolor);
+                D_box_abs(bl, bt, br, bb);
+            }
+
+            D_use_color(tcolor);
+            D_pos_abs(tx, ty);
+            D_text(text);
+        }
     }
 
-    D_text_rotation(0.0);	/* reset */
+    D_text_rotation(0.0);       /* reset */
 
     /* draw marks not grid lines */
     if (mark_type != MARK_GRID) {
-	G_warning(_("Geo-grid option only available for LL projection, use without -g/-w"));
+        G_warning(_("Geo-grid option only available for LL projection, use without -g/-w"));
 #ifdef TODO
-	e1 = combine above;
-	n1 = combine above;
+        e1 = combine above;
+        n1 = combine above;
 
-	/* plot marks */
-	while (e1 <= window.east) {
-	    n1 = y0;		/* reset */
-	    while (n1 <= window.north) {
-		if (mark_type == MARK_CROSS)
-		    plot_cross(e1, n1, gcolor, 0.0);
-		else if (mark_type == MARK_FIDUCIAL)
-		    plot_fiducial(e1, n1, gcolor, 0.0);
-		else if (mark_type == MARK_DOT)
-		    plot_dot(e1, n1, gcolor);
-		n1 += grid_size;
-	    }
-	    e1 += grid_size;
-	}
+        /* plot marks */
+        while (e1 <= window.east) {
+            n1 = y0;            /* reset */
+            while (n1 <= window.north) {
+                if (mark_type == MARK_CROSS)
+                    plot_cross(e1, n1, gcolor, 0.0);
+                else if (mark_type == MARK_FIDUCIAL)
+                    plot_fiducial(e1, n1, gcolor, 0.0);
+                else if (mark_type == MARK_DOT)
+                    plot_dot(e1, n1, gcolor);
+                n1 += grid_size;
+            }
+            e1 += grid_size;
+        }
 #endif
-    /* also TODO: rotate cross and fiducial marks by the converge angle; see g.region -n */
+        /* also TODO: rotate cross and fiducial marks by the converge angle; see g.region -n */
     }
 
     return 0;
@@ -346,44 +412,44 @@
     out_proj_keys = G_get_projinfo();
     out_unit_keys = G_get_projunits();
     if (pj_get_kv(info_out, out_proj_keys, out_unit_keys) < 0)
-	G_fatal_error(_("Can't get projection key values of current location"));
+        G_fatal_error(_("Can't get projection key values of current location"));
 
     /* In Info */
     if (!wgs84) {
-	/* Set lat/long to same ellipsoid as location if we're not looking
-	 * for the WGS84 values */
-	if (GPJ_get_equivalent_latlong(info_in, info_out) < 0)
-	    G_fatal_error(_("Unable to set up lat/long projection parameters"));
+        /* Set lat/long to same ellipsoid as location if we're not looking
+         * for the WGS84 values */
+        if (GPJ_get_equivalent_latlong(info_in, info_out) < 0)
+            G_fatal_error(_("Unable to set up lat/long projection parameters"));
 
     }
     else {
-	struct Key_Value *in_proj_info, *in_unit_info;
-	char buff[256], dum[256];
+        struct Key_Value *in_proj_info, *in_unit_info;
+        char buff[256], dum[256];
 
-	in_proj_info = G_create_key_value();
-	in_unit_info = G_create_key_value();
+        in_proj_info = G_create_key_value();
+        in_unit_info = G_create_key_value();
 
-	/* Check that datumparams are defined for this location (otherwise
-	 * the WGS84 values would be meaningless), and if they are set the 
-	 * input datum to WGS84 */
-	if (G_get_datumparams_from_projinfo(out_proj_keys, buff, dum) < 0)
-	    G_fatal_error(_("WGS84 grid output not possible as this location does not contain\n"
-			   "datum transformation parameters. Try running g.setproj."));
-	else
-	    G_set_key_value("datum", "wgs84", in_proj_info);
+        /* Check that datumparams are defined for this location (otherwise
+         * the WGS84 values would be meaningless), and if they are set the 
+         * input datum to WGS84 */
+        if (G_get_datumparams_from_projinfo(out_proj_keys, buff, dum) < 0)
+            G_fatal_error(_("WGS84 grid output not possible as this location does not contain\n"
+                           "datum transformation parameters. Try running g.setproj."));
+        else
+            G_set_key_value("datum", "wgs84", in_proj_info);
 
-	/* set input projection to lat/long */
-	G_set_key_value("proj", "ll", in_proj_info);
+        /* set input projection to lat/long */
+        G_set_key_value("proj", "ll", in_proj_info);
 
-	G_set_key_value("unit", "degree", in_unit_info);
-	G_set_key_value("units", "degrees", in_unit_info);
-	G_set_key_value("meters", "1.0", in_unit_info);
+        G_set_key_value("unit", "degree", in_unit_info);
+        G_set_key_value("units", "degrees", in_unit_info);
+        G_set_key_value("meters", "1.0", in_unit_info);
 
-	if (pj_get_kv(info_in, in_proj_info, in_unit_info) < 0)
-	    G_fatal_error(_("Unable to set up lat/long projection parameters"));
+        if (pj_get_kv(info_in, in_proj_info, in_unit_info) < 0)
+            G_fatal_error(_("Unable to set up lat/long projection parameters"));
 
-	G_free_key_value(in_proj_info);
-	G_free_key_value(in_unit_info);
+        G_free_key_value(in_proj_info);
+        G_free_key_value(in_unit_info);
     }
     G_free_key_value(out_proj_keys);
     G_free_key_value(out_unit_keys);
@@ -397,8 +463,8 @@
  * Use Proj to get min max bounds of region in lat long
 ********************************************************/
 void get_ll_bounds(double *w, double *e, double *s, double *n,
-		   struct Cell_head window,
-		   struct pj_info info_in, struct pj_info info_out)
+                   struct Cell_head window,
+                   struct pj_info info_in, struct pj_info info_out)
 {
     double east, west, north, south;
     double e1, w1, n1, s1;
@@ -424,68 +490,68 @@
     /* North */
     first = 0;
     for (ew = window.west; ew <= window.east; ew += ew_res) {
-	e1 = ew;
-	n1 = window.north;
-	if (pj_do_proj(&e1, &n1, &info_out, &info_in) < 0)
-	    G_fatal_error(_("Error in pj_do_proj"));
-	if (!first) {
-	    north = n1;
-	    first = 1;
-	}
-	else {
-	    if (n1 > north)
-		north = n1;
-	}
+        e1 = ew;
+        n1 = window.north;
+        if (pj_do_proj(&e1, &n1, &info_out, &info_in) < 0)
+            G_fatal_error(_("Error in pj_do_proj"));
+        if (!first) {
+            north = n1;
+            first = 1;
+        }
+        else {
+            if (n1 > north)
+                north = n1;
+        }
     }
     /*South */
     first = 0;
     for (ew = window.west; ew <= window.east; ew += ew_res) {
-	e1 = ew;
-	s1 = window.south;
-	if (pj_do_proj(&e1, &s1, &info_out, &info_in) < 0)
-	    G_fatal_error(_("Error in pj_do_proj"));
-	if (!first) {
-	    south = s1;
-	    first = 1;
-	}
-	else {
-	    if (s1 < south)
-		south = s1;
-	}
+        e1 = ew;
+        s1 = window.south;
+        if (pj_do_proj(&e1, &s1, &info_out, &info_in) < 0)
+            G_fatal_error(_("Error in pj_do_proj"));
+        if (!first) {
+            south = s1;
+            first = 1;
+        }
+        else {
+            if (s1 < south)
+                south = s1;
+        }
     }
 
     /*East */
     first = 0;
     for (ns = window.south; ns <= window.north; ns += ns_res) {
-	e1 = window.east;
-	n1 = ns;
-	if (pj_do_proj(&e1, &n1, &info_out, &info_in) < 0)
-	    G_fatal_error(_("Error in pj_do_proj"));
-	if (!first) {
-	    east = e1;
-	    first = 1;
-	}
-	else {
-	    if (e1 > east)
-		east = e1;
-	}
+        e1 = window.east;
+        n1 = ns;
+        if (pj_do_proj(&e1, &n1, &info_out, &info_in) < 0)
+            G_fatal_error(_("Error in pj_do_proj"));
+        if (!first) {
+            east = e1;
+            first = 1;
+        }
+        else {
+            if (e1 > east)
+                east = e1;
+        }
     }
 
     /*West */
     first = 0;
     for (ns = window.south; ns <= window.north; ns += ns_res) {
-	w1 = window.west;
-	n1 = ns;
-	if (pj_do_proj(&w1, &n1, &info_out, &info_in) < 0)
-	    G_fatal_error(_("Error in pj_do_proj"));
-	if (!first) {
-	    west = w1;
-	    first = 1;
-	}
-	else {
-	    if (w1 < west)
-		west = w1;
-	}
+        w1 = window.west;
+        n1 = ns;
+        if (pj_do_proj(&w1, &n1, &info_out, &info_in) < 0)
+            G_fatal_error(_("Error in pj_do_proj"));
+        if (!first) {
+            west = w1;
+            first = 1;
+        }
+        else {
+            if (w1 < west)
+                west = w1;
+        }
     }
 
     *w = west;
@@ -502,12 +568,12 @@
 ********************************************************/
 void
 check_coords(double e,
-	     double n,
-	     double *lon,
-	     double *lat,
-	     int par,
-	     struct Cell_head w,
-	     struct pj_info info_in, struct pj_info info_out)
+             double n,
+             double *lon,
+             double *lat,
+             int par,
+             struct Cell_head w,
+             struct pj_info info_in, struct pj_info info_out)
 {
     double x, y;
     int proj = 0;
@@ -516,51 +582,51 @@
     *lon = x = e;
 
     if (e < w.west) {
-	x = w.west;
-	proj = 1;
+        x = w.west;
+        proj = 1;
     }
     if (e > w.east) {
-	x = w.east;
-	proj = 1;
+        x = w.east;
+        proj = 1;
     }
     if (n < w.south) {
-	y = w.south;
-	proj = 1;
+        y = w.south;
+        proj = 1;
     }
     if (n > w.north) {
-	y = w.north;
-	proj = 1;
+        y = w.north;
+        proj = 1;
     }
 
     if (proj) {
-	/* convert original coords to ll */
-	if (pj_do_proj(&e, &n, &info_out, &info_in) < 0)
-	    G_fatal_error(_("Error in pj_do_proj1"));
+        /* convert original coords to ll */
+        if (pj_do_proj(&e, &n, &info_out, &info_in) < 0)
+            G_fatal_error(_("Error in pj_do_proj1"));
 
-	if (par == 1) {
-	    /* lines of latitude -- const. northing */
-	    /* convert correct UTM to ll */
-	    if (pj_do_proj(&x, &y, &info_out, &info_in) < 0)
-		G_fatal_error(_("Error in pj_do_proj2"));
+        if (par == 1) {
+            /* lines of latitude -- const. northing */
+            /* convert correct UTM to ll */
+            if (pj_do_proj(&x, &y, &info_out, &info_in) < 0)
+                G_fatal_error(_("Error in pj_do_proj2"));
 
-	    /* convert new ll back to coords */
-	    if (pj_do_proj(&x, &n, &info_in, &info_out) < 0)
-		G_fatal_error(_("Error in pj_do_proj3"));
-	    *lat = n;
-	    *lon = x;
-	}
-	if (par == 2) {
-	    /* lines of longitude -- const. easting */
-	    /* convert correct UTM to ll */
-	    if (pj_do_proj(&x, &y, &info_out, &info_in) < 0)
-		G_fatal_error(_("Error in pj_do_proj5"));
+            /* convert new ll back to coords */
+            if (pj_do_proj(&x, &n, &info_in, &info_out) < 0)
+                G_fatal_error(_("Error in pj_do_proj3"));
+            *lat = n;
+            *lon = x;
+        }
+        if (par == 2) {
+            /* lines of longitude -- const. easting */
+            /* convert correct UTM to ll */
+            if (pj_do_proj(&x, &y, &info_out, &info_in) < 0)
+                G_fatal_error(_("Error in pj_do_proj5"));
 
-	    /* convert new ll back to coords */
-	    if (pj_do_proj(&e, &y, &info_in, &info_out) < 0)
-		G_fatal_error(_("Error in pj_do_proj6"));
-	    *lat = y;
-	    *lon = e;
-	}
+            /* convert new ll back to coords */
+            if (pj_do_proj(&e, &y, &info_in, &info_out) < 0)
+                G_fatal_error(_("Error in pj_do_proj6"));
+            *lat = y;
+            *lon = e;
+        }
     }
 
     return;
@@ -576,32 +642,32 @@
 
     /* NE Quad or due south */
     if (rows < 0 && cols <= 0) {
-	azi = RAD_TO_DEG * atan((cols / rows));
-	if (azi < 0.)
-	    azi *= -1.;
+        azi = RAD_TO_DEG * atan((cols / rows));
+        if (azi < 0.)
+            azi *= -1.;
     }
     /* SE Quad or due east */
     if (rows >= 0 && cols < 0) {
-	azi = RAD_TO_DEG * atan((rows / cols));
-	if (azi < 0.)
-	    azi *= -1.;
-	azi = 90. + azi;
+        azi = RAD_TO_DEG * atan((rows / cols));
+        if (azi < 0.)
+            azi *= -1.;
+        azi = 90. + azi;
     }
 
     /* SW Quad or due south */
     if (rows > 0 && cols >= 0) {
-	azi = RAD_TO_DEG * atan((rows / cols));
-	if (azi < 0.)
-	    azi *= -1.;
-	azi = 270. - azi;
+        azi = RAD_TO_DEG * atan((rows / cols));
+        if (azi < 0.)
+            azi *= -1.;
+        azi = 270. - azi;
     }
 
     /* NW Quad or due south */
     if (rows <= 0 && cols > 0) {
-	azi = RAD_TO_DEG * atan((rows / cols));
-	if (azi < 0.)
-	    azi *= -1.;
-	azi = 270. + azi;
+        azi = RAD_TO_DEG * atan((rows / cols));
+        if (azi < 0.)
+            azi *= -1.;
+        azi = 270. + azi;
     }
 
     return (azi);
Index: .
===================================================================
--- .	(revision 68522)
+++ .	(working copy)

