[GRASS-dev] cause for bad colors in output from png driver

Glynn Clements glynn at gclements.plus.com
Thu May 10 06:38:10 EDT 2007


Hamish wrote:

> > The framebuffer is always stored as B,G,R,A (the format used by 32-bpp
> > BMP files).
> 
> (answers my earlier r.what.color question)
> 
> > This corresponds to 0xAARRGGBB on a little-endian system and
> > 0xBBGGRRAA on a big-endian system (e.g. Mac).
> 
> dumb question: are Intel Macs now little endian?

Yes; the x86 is always little-endian; if you want to read big-endian
values, you have to do it in software.

> > Externally (DRV_color, DRV_lookup_color), the alpha value is always
> > zero (0 = opaque, 255 = transparent),
> 
> 
> in gis.h I used:
> 
> typedef struct
> {
>     unsigned char r, g, b, a;  /* red, green, blue, and alpha */
> } RGBA_Color ;
> 
> typedef RGBA_Color RGB_Color;
> 
> /* RGBA_Color alpha presets */
> #define RGBA_COLOR_OPAQUE     255
> #define RGBA_COLOR_TRANSPARENT  0
> #define RGBA_COLOR_NONE         0
> 
> Are the above alpha OPAQUE and TRANSPARENT values backwards? I had
> pictured alpha as opacity, with OPAQUE being 100% and TRANSPARENT as 0%.
> COLOR_NONE is used to indicate that the RGB array hasn't been filled.
> (d.vect color=none)

There's no "right" answer; "alpha" can represent either opacity (0 =
transparent, 255 = opaque) or transparency (0 = opaque, 255 =
transparent).

The PNG driver uses transparency because all externally-specified
colours are opaque, and at that time, the integer colour number was
stored directly in the framebuffer. Transparent pixels can only arise
from erasing the framebuffer when GRASS_TRANSPARENT=TRUE, and (more
recently) with R_bitmap(). Note that R_bitmap() uses opacity.

When writing PPM/PGM files, the PGM file contains opacity values
(255-alpha). When writing PNG files, it calls png_set_invert_alpha(),
which causes the opacity values to be returned when reading.

I'm not sure which sense the 32-bit BMP format uses; the only
application I tested (gqview) simply ignores the alpha channel. If it
turns out that it's meant to be opacity, I'll need to invert the
internal format.

-- 
Glynn Clements <glynn at gclements.plus.com>




More information about the grass-dev mailing list