Glenn,

I do agree that your interpretation feels more natural to me, but I definitely don't see it as the only possible interpretation. If you hand me four bytes of RGBA color packed into a 32 bit value, I expect the first byte to be the red channel. The question then arises, how does one number the bytes? This is indisputably a question of endianness.

As an example, the Microsoft Windows header file WinGDI.h defines a macro to generate an integer value from RGB component byte values. This macro is defined like this:

#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))

The red component is in the least significant byte, just like the behavior of asRGBA. I certainly wouldn't suggest doing things this way just because Microsoft does, but I would claim that Windows' GDI API is prominent enough to dash any claim that the opposite way of packing colors into an integer is the only expected one.

I do prefer the packing that you promote, I just don't think that's enough reason to break compatibility since there are other reasonable interpretations.

Mark

On 9/16/2010 1:34 PM, Glenn Waldron wrote:
Mark,

I have to disagree with your initial statement. RGBA is a well-worn specification for byte-encoded color. It implies a specific byte order. Endianness is not relevant since it is not meant to be interpreted as an integer. If you hand me 32 bits of data and tell me it's RGBA-encoded, I expect to be able to do (data & 0xFF) and get the alpha component no matter what platform I'm on.

Glenn Waldron : Pelican Mapping : +1.703.652.4791


On Thu, Sep 16, 2010 at 3:55 PM, Mark Sciabica <[email protected] <mailto:[email protected]>> wrote:

     Hi Glenn,

    I think what these functions *should* return can not be determined by
    the names of the functions. They return 32 bit integers and
    whether the
    low byte or the high byte corresponds to the first color channel named
    is not immediately obvious. Like you, my first guess would be that the
    high byte has the first named color channel so that asRGBA() would
    return 0xff for opaque black. As you have discovered, this is not what
    happens.

    However, on little-endian architectures (like the dominant x86)
    writing
    this 32 bit value to memory results in the bytes being ordered as
    in the
    function name. This is very useful, although not entirely portable.

    I would not recommend changing these functions' behaviors since
    that can
    easily break any existing code that uses them. New functions with more
    descriptive names could certainly be helpful. Documenting these
    functions is also a good idea so other users don't waste too much time
    wondering why their code does not behave as expected.

    Mark



    On 9/16/2010 11:53 AM, Glenn Waldron wrote:

        Hi folks,

        Tthe methods Vec4f::asABGR() and asRGBA() appear to be
        reversed. (That
        is, asABGR() returns RGBA and vice-versa.) Can someone lay another
        pair of eyes on them and confirm this?



        Glenn Waldron : Pelican Mapping : +1.703.652.4791


    This message and any attachments are solely for the intended
    recipient and may contain confidential or privileged information.
    If you are not the intended recipient, any disclosure, copying,
    use, or distribution of the information included in this message
    and any attachments is prohibited. If you have received this
    communication in error, please notify us by reply e-mail and
    immediately and permanently delete this message and any
    attachments. Thank you.
    _______________________________________________
    osg-users mailing list
    [email protected]
    <mailto:[email protected]>
    http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to