[GRASS-dev] Help with gsd_color_func() for NVIZ

Hamish hamish_nospam at yahoo.com
Wed Dec 6 23:58:06 EST 2006


Hi, 

I am trying to understand the OpenGL color setting code in NVIZ for changing
the North Arrow text color. I am not very good with the bitwise/GL stuff,
so can anyone give me a hand at understanding how to feed gsd_color_func()
correctly?


this is in  lib/ogsf/gsd_objs.c  and  lib/ogsf/gsd_prim.c

I was expecting 0x00000 to mean 0xRRGGBB, but it's backwards for me.
The least significant pair comes first.
(I'm running Pentium4 / 32bit / little endian)


some experiments:

gsd_color_func(0xFF0000);    r=0  g=0  b=-1 a=0
gsd_color_func(0x00FF00);    r=0  g=-1 b=0  a=0
gsd_color_func(0x0000FF);    r=-1 g=0  b=0  a=0
gsd_color_func(0xFFFFFF);    r=-1 g=-1 b=-1 a=0
gsd_color_func(0x00000000);  r=0  g=0  b=0  a=0
gsd_color_func(0xFFFFFFFF);  r=-1 g=-1 b=-1 a=-1
gsd_color_func(0xFF000000);  r=0  g=0  b=0  a=-1
gsd_color_func(0x00FFFFFF);  r=-1 g=-1 b=-1 a=0

gsd_color_func(0x000008);    r=8    g=0 b=0 a=0
gsd_color_func(0x000010);    r=16   g=0 b=0 a=0
gsd_color_func(0x000070);    r=112  g=0 b=0 a=0
gsd_color_func(0x000080);    r=-128 g=0 b=0 a=0
gsd_color_func(0x000090);    r=-112 g=0 b=0 a=0
gsd_color_func(0x0000A0);    r=-96  g=0 b=0 a=0
gsd_color_func(0x0000A8);    r=-88  g=0 b=0 a=0
gsd_color_func(0x0000FE);    r=-2   g=0 b=0 a=0

(am I doing %d with something that should be e.g. %c, %x?)


relevant code from gsd_prim.c:

#define RED_MASK 0x000000FF
#define GRN_MASK 0x0000FF00
#define BLU_MASK 0x00FF0000
#define ALP_MASK 0xFF000000

#define INT_TO_RED(i, r)    (r = (i & RED_MASK))
#define INT_TO_GRN(i, g)    (g = (i & GRN_MASK) >> 8)
#define INT_TO_BLU(i, b)    (b = (i & BLU_MASK) >> 16)
#define INT_TO_ALP(i, a)    (a = (i & ALP_MASK) >> 24)

/************************************************************************/
void gsd_color_func(unsigned int col)
{
    GLbyte r, g, b, a;

    /* OGLXXX
     * cpack: if argument is not a variable
     * might need to be:
     *  glColor4b(($1)&0xff, ($1)>>8&0xff, ($1)>>16&0xff, ($1)>>24&0xff)
     */
    INT_TO_RED(col, r);
    INT_TO_GRN(col, g);
    INT_TO_BLU(col, b);
    INT_TO_ALP(col, a);
    glColor4ub(r, g, b, a);

/* HB DEBUG */
fprintf(stderr, "gsd_color_func: r=%d g=%d b=%d a=%d\n", r, g, b, a);

    return;
}

/************************************************************************/



thanks,
Hamish




More information about the grass-dev mailing list