[GRASS5] Color code cleanup

Hamish hamish_nospam at yahoo.com
Wed Apr 19 06:20:53 EDT 2006

> >  gis.h doesn't have a RGBCOLOR struct in it.
> > (e.g. SYMBCOLOR in symbol.h)
> >
> > I'd have such a creature as so:
> >
> > (in gis.h)
> >
> > typedef struct {
> >     int set;  /* 0 unset, 1 set, -1 "none" */
> >     unsigned char r, g, b;
> >
> Why do we need to keep track of set information?

It's good accounting practice.
We need a meta-place holder for "none" anyway.

> Since structs are sometimes but not consistently initialized to zeros
> by compilers this seems like an easy way to make bugs that are very
> difficult to track down.

I think that bug would be pretty easy to track down. If the compiler
initialized it to 0 (CFLAGS="-g"?), the default is "unset", which tells
you pretty quick that you forgot something when you go to use it.
If everything comes up as 0:0:0 black you've got a good lead too.

> This is everything I can think of that could go in a color:
> typedef struct {
>     int standard;  /* Positive integer if this is a standard color, 0 
> otherwise*/
>     unsigned char r, g, b, a; /* red, green, blue, and alpha */
>     float fr, fg, fb, fa; /* This is twice as big as everything else
>     combined 
> */

I do like adding the alpha channel for GUI future-proofness.
I have no idea if it will ever be useful*, but it only costs a byte.
  *(guidance from the GUI experienced please?)
For now it does mean setting it to 1 every time you set a color, which
is extra work for little gain.

What's the point of knowing if there's an equivalent standard color?
If dealing with standard colors, wouldn't you just use
D_raster_use_color() or R_standard_color() in the first place and not
bother with RGB? Are the standard colors that much faster to use that
knowing you had one would make a difference in the 1 in 10^6 chance
that you hit one?

> None can simply be alpha==0. An easy way to check this is just:
> if (color.a) {
> 	do something
> }

mmmhh. It would work, but I'm not crazy about mixing concepts.
In a practical sense I see how 99.9% of the time they are the same
thing, and I'm having a hard time trying to think of a case where
"color=none" doesn't mean "transparent", but I do consider "none" more 
of an absence case than a alpha=0 case.

Logically, "if(color.set != TRUE) continue;" is a lot better and
readable than "if(!color.a) continue;".

If used uninitialized (& compiler sets to 0) it could be frustrating to
figure out why objects randomly don't display. If used uninitialized
and the compiler hasn't initialized it anything, you've got a very good
chance of bizarre random shading.

..... I'm still preferring to have the set flag in there.

> I think the floats should probably go. We might want some shared
> structure for them, but it'd be separate anyway.

I agree. Who knows how far off analog displays are? (retro!)
So far I haven't heard a case for when fp color would be used. Anyone?
(besides PostScript...)

If there are no objections, I'll add this to gis.h in the coming days:

typedef struct {
    int set;  /* 0 unset, 1 set, -1 "none" */
    unsigned char r, g, b, a;  /* red, green, blue, and alpha */

I would like to get this right the first time.


More information about the grass-dev mailing list