1 #include <math.h> 2 #include "pixman.h" 3 #include "gtk-utils.h" 4 5 #define F(x) \ 6 pixman_double_to_fixed (x) 7 8 #define WIDTH 600 9 #define HEIGHT 300 10 11 static uint16_t 12 convert_to_srgb (uint16_t in) 13 { 14 double d = in * (1/65535.0); 15 double a = 0.055; 16 17 if (d < 0.0031308) 18 d = 12.92 * d; 19 else 20 d = (1 + a) * pow (d, 1 / 2.4) - a; 21 22 return (d * 65535.0) + 0.5; 23 } 24 25 static void 26 convert_color (pixman_color_t *dest_srgb, pixman_color_t *linear) 27 { 28 dest_srgb->alpha = convert_to_srgb (linear->alpha); 29 dest_srgb->red = convert_to_srgb (linear->red); 30 dest_srgb->green = convert_to_srgb (linear->green); 31 dest_srgb->blue = convert_to_srgb (linear->blue); 32 } 33 34 int 35 main (int argc, char **argv) 36 { 37 static const pixman_trapezoid_t traps[] = 38 { 39 { F(10.10), F(280.0), 40 { { F(20.0), F(10.10) }, 41 { F(5.3), F(280.0) } }, 42 { { F(20.3), F(10.10) }, 43 { F(5.6), F(280.0) } } 44 }, 45 { F(10.10), F(280.0), 46 { { F(40.0), F(10.10) }, 47 { F(15.3), F(280.0) } }, 48 { { F(41.0), F(10.10) }, 49 { F(16.3), F(280.0) } } 50 }, 51 { F(10.10), F(280.0), 52 { { F(120.0), F(10.10) }, 53 { F(5.3), F(280.0) } }, 54 { { F(128.3), F(10.10) }, 55 { F(6.6), F(280.0) } } 56 }, 57 { F(10.10), F(280.0), 58 { { F(60.0), F(10.10) }, 59 { F(25.3), F(280.0) } }, 60 { { F(61.0), F(10.10) }, 61 { F(26.3), F(280.0) } } 62 }, 63 { F(10.10), F(280.0), 64 { { F(90.0), F(10.10) }, 65 { F(55.3), F(280.0) } }, 66 { { F(93.0), F(10.10) }, 67 { F(58.3), F(280.0) } } 68 }, 69 { F(130.10), F(150.0), 70 { { F(100.0), F(130.10) }, 71 { F(250.3), F(150.0) } }, 72 { { F(110.0), F(130.10) }, 73 { F(260.3), F(150.0) } } 74 }, 75 { F(170.10), F(240.0), 76 { { F(100.0), F(170.10) }, 77 { F(120.3), F(240.0) } }, 78 { { F(250.0), F(170.10) }, 79 { F(250.3), F(240.0) } } 80 }, 81 }; 82 83 pixman_image_t *src, *dest_srgb, *dest_linear; 84 pixman_color_t bg = { 0x0000, 0x0000, 0x0000, 0xffff }; 85 pixman_color_t fg = { 0xffff, 0xffff, 0xffff, 0xffff }; 86 pixman_color_t fg_srgb; 87 uint32_t *d; 88 89 d = malloc (WIDTH * HEIGHT * 4); 90 91 dest_srgb = pixman_image_create_bits ( 92 PIXMAN_a8r8g8b8_sRGB, WIDTH, HEIGHT, d, WIDTH * 4); 93 dest_linear = pixman_image_create_bits ( 94 PIXMAN_a8r8g8b8, WIDTH, HEIGHT, d, WIDTH * 4); 95 96 src = pixman_image_create_solid_fill (&bg); 97 pixman_image_composite32 (PIXMAN_OP_SRC, 98 src, NULL, dest_srgb, 99 0, 0, 0, 0, 0, 0, WIDTH, HEIGHT); 100 101 src = pixman_image_create_solid_fill (&fg); 102 103 pixman_composite_trapezoids (PIXMAN_OP_OVER, 104 src, dest_srgb, PIXMAN_a8, 105 0, 0, 10, 10, G_N_ELEMENTS (traps), traps); 106 107 convert_color (&fg_srgb, &fg); 108 src = pixman_image_create_solid_fill (&fg_srgb); 109 110 pixman_composite_trapezoids (PIXMAN_OP_OVER, 111 src, dest_linear, PIXMAN_a8, 112 0, 0, 310, 10, G_N_ELEMENTS (traps), traps); 113 114 show_image (dest_linear); 115 pixman_image_unref(dest_linear); 116 free(d); 117 118 return 0; 119 } 120