@raven02, the point of the previous code was, as I understand it, to extract the R/G/B bits from the value.

It starts out as a short (4 nibbles / 2 bytes):
0xBGRA

However, this is the wrong order.  So this code extracts the individual components (a, r, g, b), and then places it into the new order:
0xARGB

You can see that here:

```
c = (a << 12) | (r << 8) | (g << 4) | b;
```

If you shift by 12 or 13, your crosshairs are pointed at a single component:

Original:
0x>B<GRA

That means that if the image contained red, it would be entirely black (because the blue value, which is what shifting by 12 *always* gives you, is 0.)

Shifting by 13 is wrong because it means you only get the high 3 bits of B.  So now, the maximal color value is half what it should be - even a full blue pixel will now look like a dull grey.

-[Unknown]