1 #include <math.h> 2 3 #include "pixman.h" 4 #include "gtk-utils.h" 5 6 static uint32_t 7 linear_argb_to_premult_argb (float a, 8 float r, 9 float g, 10 float b) 11 { 12 r *= a; 13 g *= a; 14 b *= a; 15 return (uint32_t) (a * 255.0f + 0.5f) << 24 16 | (uint32_t) (r * 255.0f + 0.5f) << 16 17 | (uint32_t) (g * 255.0f + 0.5f) << 8 18 | (uint32_t) (b * 255.0f + 0.5f) << 0; 19 } 20 21 static float 22 lin2srgb (float linear) 23 { 24 if (linear < 0.0031308f) 25 return linear * 12.92f; 26 else 27 return 1.055f * powf (linear, 1.0f/2.4f) - 0.055f; 28 } 29 30 static uint32_t 31 linear_argb_to_premult_srgb_argb (float a, 32 float r, 33 float g, 34 float b) 35 { 36 r = lin2srgb (r * a); 37 g = lin2srgb (g * a); 38 b = lin2srgb (b * a); 39 return (uint32_t) (a * 255.0f + 0.5f) << 24 40 | (uint32_t) (r * 255.0f + 0.5f) << 16 41 | (uint32_t) (g * 255.0f + 0.5f) << 8 42 | (uint32_t) (b * 255.0f + 0.5f) << 0; 43 } 44 45 int 46 main (int argc, char **argv) 47 { 48 #define WIDTH 400 49 #define HEIGHT 200 50 int y, x, p; 51 float alpha; 52 53 uint32_t *dest = malloc (WIDTH * HEIGHT * 4); 54 uint32_t *src1 = malloc (WIDTH * HEIGHT * 4); 55 pixman_image_t *dest_img, *src1_img; 56 57 dest_img = pixman_image_create_bits (PIXMAN_a8r8g8b8_sRGB, 58 WIDTH, HEIGHT, 59 dest, 60 WIDTH * 4); 61 src1_img = pixman_image_create_bits (PIXMAN_a8r8g8b8, 62 WIDTH, HEIGHT, 63 src1, 64 WIDTH * 4); 65 66 for (y = 0; y < HEIGHT; y ++) 67 { 68 p = WIDTH * y; 69 for (x = 0; x < WIDTH; x ++) 70 { 71 alpha = (float) x / WIDTH; 72 src1[p + x] = linear_argb_to_premult_argb (alpha, 1, 0, 1); 73 dest[p + x] = linear_argb_to_premult_srgb_argb (1-alpha, 0, 1, 0); 74 } 75 } 76 77 pixman_image_composite (PIXMAN_OP_ADD, src1_img, NULL, dest_img, 78 0, 0, 0, 0, 0, 0, WIDTH, HEIGHT); 79 pixman_image_unref (src1_img); 80 free (src1); 81 82 show_image (dest_img); 83 pixman_image_unref (dest_img); 84 free (dest); 85 86 return 0; 87 } 88