Advertisement
gocha

RGBA alpha-blending

Aug 12th, 2012
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.74 KB | None | 0 0
  1. static inline void blend32(uint32 *dstPixel, uint32 color)
  2. {
  3.     uint8 *dst = (uint8*) dstPixel;
  4.     uint8 r = (color & 0xFF000000) >> 24;
  5.     uint8 g = (color & 0x00FF0000) >> 16;
  6.     uint8 b = (color & 0x0000FF00) >> 8;
  7.     uint8 a = color & 0x000000FF;
  8.  
  9.     if (a == 255) {
  10.         // direct copy
  11.         dst[0] = b;
  12.         dst[1] = g;
  13.         dst[2] = r;
  14.         dst[3] = a;
  15.     }
  16.     else if (a == 0) {
  17.         // do not copy
  18.     }
  19.     else {
  20.         // alpha-blending
  21.         // http://en.wikipedia.org/wiki/Alpha_compositing
  22.         uint8 bo = dst[0];
  23.         uint8 go = dst[1];
  24.         uint8 ro = dst[2];
  25.         uint8 ao = dst[3];
  26.         uint8 aof = (ao * (255 - a)) >> 8;
  27.         dst[3] = a + aof;
  28.         dst[0] = (b * a + bo * aof) / dst[3];
  29.         dst[1] = (g * a + go * aof) / dst[3];
  30.         dst[2] = (r * a + ro * aof) / dst[3];
  31.     }
  32. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement