[GRASSLIST:2601] Re: [GRASS5] RE: RE: d.area: areas filled with various colors

Glynn Clements glynn.clements at virgin.net
Tue Oct 23 13:56:11 EDT 2001


Eric G. Miller wrote:

> > > > With respect to the new vector format expected in Grass5.1(?), I was
> > > > wondering if this automatic color filling is planned.  When dealing with
> > > > very large vector maps we need some way to do this.  At present I just
> > > > convert my map to raster and create categories.  This does not create too
> > > > many problems but certainly working directly with the vectors will be
> > > > better.
> > > 
> > > This is more a limitation imposed by the GRASS display architechture than
> > > anything with the vector data representation.
> > 
> > This is a limitation imposed by vector layers not having colour
> > tables.
> 
> So your saying if I used R_color() to set a color, and then
> subsequently performed a vector drawing command that the display
> drivers would do the right thing?  I was under the impression that
> vector and text graphics were limited to the named colors.

You would first need to call R_reset_color() to associate an RGB value
with a colour index.

Basically:

R_reset_color() sends RESET_COLOR, receipt of which calls

	Reset_color() -> _fixed_Reset_color() -> assign_fixed_color()

which sets an entry in the {pos,neg}_color_lookup arrays.

R_reset_colors() is similar.

R_color sends COLOR, receipt of which calls

	Color() -> _get_color_index() -> get_fixed_color()

which gets an entry from the {pos,neg}_color_lookup arrays, and makes
this colour "current" for subsequent single-colour drawing operations
(i.e. not rasters) via the (driver-specific) color() function.

Raster operations also use the {pos,neg}_color_lookup arrays, via
_get_color_index_array().

The standard colours are initialised at driver startup, by the driver
calling assign_standard_color() directly, which sets an entry in the
standard_colors array.

R_standard_color() sends STANDARD_COLOR, receipt of which calls

	Standard_color() -> get_standard_color()

which gets an entry from the standard_colors array, and makes this
colour "current" for subsequent single-colour drawing operations (i.e. 
not rasters) via the (driver-specific) color() function.

Also, the driver startup initialises the fixed colour indices 1-13
(corresponding to the constants in colors.h) to the standard colours
so that, unless subsequently changed, R_color() has the same effect as
R_standard_color() for the indices 1-13.

> programming manual:
> 
> 16.9 Colors 
> 
> int D_reset_colors (struct Colors *colors) 
>   Turns color information provided in the colors structure into color
>   requests to the graphics driver. These colors are for raster graphics,
>   not lines or text. See 12.10.3 Raster Color Table (p. 116) for GIS 
>   Library routines which use this structure.

This function doesn't seem to exist. At least, not in
src/libes/display/*.c or src/include/display.h.

D_set_colors() does exist with that prototype; that calls
R_reset_colors(), which would affect the RGB colour selected by calls
to R_color(). However, this function probably isn't appropriate for
anything other than raster graphics.

> int D_translate_color (char *name)
>   Takes a color name in ascii and returns the color number for that color.
>   Returns 0 if color is not known. The color number returned is for lines
>   and text, not raster graphics.

This translates the string "red" to the constant RED etc. The return
values can be passed to R_standard_color(), or to R_color() provided
that the colours haven't been changed from their initial setting (but
this shouldn't be relied upon).

-- 
Glynn Clements <glynn.clements at virgin.net>



More information about the grass-user mailing list