no. your shifting is right, your masks are a little off. here's what's being evaluated right now:
Code:
#define RGB12_TO_RGB16(pixel) \
((((pixel) & 0x0F00) << 4) | \
(((pixel) & 0x00E0) << 3) | \
(((pixel) & 0x001F) << 1) )
#define RGB12_TO_RGB16(0000RRRRGGGGBBBB) \
(((0000RRRR00000000) << 4) | \
((00000000GGG00000) << 3) | \
((00000000000GBBBB) << 1) )