2014-06-11 2 views
3

다음은 작은 테스트 프로그램입니다 (리틀 엔디안 컴퓨터에서 작동 함).Pixman 합성 대 알파 블렌딩

은 그대로, 결과는 나에게 이미 이상한 : 나는 마스크 0x80으로 = #의 FFFFFF80 X 채우기 색 #FFFFFFFF 및 # 9090FFFF 너무 출력을 예상대로

in: r=20 g=20 b=80 a=FF (#202080FF, ok!) 
out: r=90 g=90 b=C0 a=FF (#9090C0FF, strange...) 

...

"cfill.alpha = uint16_t (0x80) < < 8"을 변경하여 채우기 색상을 # FFFFFF80으로 설정하면 결과는 정말 잘못된 것 같다 : #의 606060C0FF :

in: r=20 g=20 b=80 a=FF 
out: r=98 g=98 b=E0 a=FF 

내가 X 마스크 기입 => #의 FFFFFF40 따라서의 출력을 기대.

특히 낮은 알파 입력 색상이 어떻게 대상 이미지의 더 밝은 출력으로 끝날 수 있는지 이해할 수 없습니다.

내가 뭘 잘못하고있어? 예상대로 작동하는 또 다른 PIXMAP_OP_xxx가 있습니까?

감사합니다.

#include <stdlib.h> 
#include <stdio.h> 
#include "pixman.h" 

union C { 
    uint32_t value; 
    struct RGBA8888 { 
     uint8_t a; 
     uint8_t b; 
     uint8_t g; 
     uint8_t r; 
    } rgba; 
}; 

int main() 
{ 
    // create target image full with r=0x20 g=0x20 b=0x80 a=0xFF 
    size_t w = 100; // multiple of 4 for alignment 
    size_t h = 100; 
    C *target = (C*)malloc(w * h * sizeof(C)); 
    for(size_t i = 0; i < w * h; ++i) 
     target[i].value = 0x202080FF; 
    printf("in: r=%02X g=%02X b=%02X a=%02X\n", 
     target[0].rgba.r, target[0].rgba.g, target[0].rgba.b, target[0].rgba.a); 

    // connect target to pixman image 
    pixman_image_t *ptarget = pixman_image_create_bits(PIXMAN_r8g8b8a8, w, h, (uint32_t*)target, w * sizeof(uint32_t)); 

    // create fill 
    pixman_color_t cfill; 
    cfill.red = uint16_t(0xFF) << 8; 
    cfill.green = uint16_t(0xFF) << 8; 
    cfill.blue = uint16_t(0xFF) << 8; 
    cfill.alpha = uint16_t(0xFF) << 8; 
    pixman_image_t *pfill = pixman_image_create_solid_fill(&cfill); 

    // create mask with a=0x80 
    uint8_t *mask = (uint8_t*)malloc(w * h); 
    for(size_t i = 0; i < w * h; ++i) 
     mask[i] = 0x80; 
    pixman_image_t *pmask = pixman_image_create_bits(PIXMAN_a8, w, h, (uint32_t*)mask, w); 

    // do compositing 
    pixman_image_composite(
          PIXMAN_OP_OVER, 
          pfill, pmask, ptarget, 
          // src_x, src_y 
          0, 0, 
          // mask_x, mask_y 
          0, 0, 
          // dest_x, dest_y, width, height 
          0, 0, w, h); 

    // display one pixel of target 
    printf("out: r=%02X g=%02X b=%02X a=%02X\n", 
     target[0].rgba.r, target[0].rgba.g, target[0].rgba.b, target[0].rgba.a); 
} 

답변

1

미리 곱셈 된 알파로 작업하는 것으로 나타났습니다! 따라서 알파가있는 흰색은 # 80808080이어야하고 이후 # 40404040이 아니라 # FFFFFF80 및 # FFFFFF40이되어야합니다.

다른 사람에게 도움이되기를 바랍니다.)