diff options
author | marha <marha@users.sourceforge.net> | 2012-12-12 08:39:09 +0100 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2012-12-12 08:39:09 +0100 |
commit | c648afe73ef43a15094508d2dd439e05738735bf (patch) | |
tree | 6d69f2726eb57d22395ffbe0b7733eebc16d1bb1 /pixman/pixman | |
parent | 853b3fc8ee9a4e7f26f87334655a3f5c772502b7 (diff) | |
parent | b395c3c85251d4e8761704d8e3a3c9f9fa5b45cc (diff) | |
download | vcxsrv-c648afe73ef43a15094508d2dd439e05738735bf.tar.gz vcxsrv-c648afe73ef43a15094508d2dd439e05738735bf.tar.bz2 vcxsrv-c648afe73ef43a15094508d2dd439e05738735bf.zip |
Merge remote-tracking branch 'origin/released'
* origin/released:
fontconfig mesa pixman xkeyboard-config git update 12 dev 2012
Diffstat (limited to 'pixman/pixman')
-rw-r--r-- | pixman/pixman/pixman-combine32.c | 58 |
1 files changed, 51 insertions, 7 deletions
diff --git a/pixman/pixman/pixman-combine32.c b/pixman/pixman/pixman-combine32.c index 54cc8771b..3ac7576bd 100644 --- a/pixman/pixman/pixman-combine32.c +++ b/pixman/pixman/pixman-combine32.c @@ -196,14 +196,58 @@ combine_over_u (pixman_implementation_t *imp, { int i; - for (i = 0; i < width; ++i) + if (!mask) { - uint32_t s = combine_mask (src, mask, i); - uint32_t d = *(dest + i); - uint32_t ia = ALPHA_8 (~s); - - UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, s); - *(dest + i) = d; + for (i = 0; i < width; ++i) + { + uint32_t s = *(src + i); + uint32_t a = ALPHA_8 (s); + if (a == 0xFF) + { + *(dest + i) = s; + } + else if (s) + { + uint32_t d = *(dest + i); + uint32_t ia = a ^ 0xFF; + UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, s); + *(dest + i) = d; + } + } + } + else + { + for (i = 0; i < width; ++i) + { + uint32_t m = ALPHA_8 (*(mask + i)); + if (m == 0xFF) + { + uint32_t s = *(src + i); + uint32_t a = ALPHA_8 (s); + if (a == 0xFF) + { + *(dest + i) = s; + } + else if (s) + { + uint32_t d = *(dest + i); + uint32_t ia = a ^ 0xFF; + UN8x4_MUL_UN8_ADD_UN8x4 (d, ia, s); + *(dest + i) = d; + } + } + else if (m) + { + uint32_t s = *(src + i); + if (s) + { + uint32_t d = *(dest + i); + UN8x4_MUL_UN8 (s, m); + UN8x4_MUL_UN8_ADD_UN8x4 (d, ALPHA_8 (~s), s); + *(dest + i) = d; + } + } + } } } |