On 2/26/07, Luc Le Blanc <[EMAIL PROTECTED]> wrote:
I'm surprised the RGBColorType was not declared as a union of UInt32
and other elements. But to copy or compare RGBColorTypes quickly
without having to resort to MemMove or Compare, is there a
CPU-effective smart cast I can use (( UInt32 ) is refused by the
compiler)? Is this cost-free (CPU-wise):

you have a point, it should have been:

typedef struct RGBColorType
{
 union
 {
   struct
   {
     uint8 r;
     uint8 g
     uint8 b;
   } elements;

   uint32 rgb;
 } data;

} RGBColorType ;

but to your question. yes.

RGBColorType a, b;

*( UInt32 * ) &a = 0xffffffffL;
*( UInt32 * ) &b = 0x80800101L;

*((UInt32 *)&a) = 0xffffffffL;

may help the compiler understand better - why not use a macro to make
your code easier to understand at the same time :)

#define RGBColorTypeSet(a, val) (*((UInt32 *)(a)) = (val)
#define RGBColorTypeCompare(a, b) ( (*((UInt32 *)(a)) == *((UInt32 *)(b))) )

then do:

RGBColorTypeSet(&a, 0xffffffffL);
RGBColorTypeSet(&b, 0x80800101L);
if (RGBColorTypeCompare(&a, &b))
{
 .. same
}
else
{
 .. different
}

C/C++ can be pretty nasty about how you code your pointer casts;
so, just put extra brackets in there to help. it all comes down to memory;
as long as the RGBColorType components are after each other; it'll work.

you can do a lot of cool tricks like color averaging etc with this too.

--
// Aaron Ardiri

--
For information on using the PalmSource Developer Forums, or to unsubscribe, 
please see http://www.palmos.com/dev/support/forums/

Reply via email to