120 lines
2.8 KiB
C
120 lines
2.8 KiB
C
|
#include <math.h>
|
||
|
#include "pixman.h"
|
||
|
#include "gtk-utils.h"
|
||
|
|
||
|
#define F(x) \
|
||
|
pixman_double_to_fixed (x)
|
||
|
|
||
|
#define WIDTH 600
|
||
|
#define HEIGHT 300
|
||
|
|
||
|
static uint16_t
|
||
|
convert_to_srgb (uint16_t in)
|
||
|
{
|
||
|
double d = in * (1/65535.0);
|
||
|
double a = 0.055;
|
||
|
|
||
|
if (d < 0.0031308)
|
||
|
d = 12.92 * d;
|
||
|
else
|
||
|
d = (1 + a) * pow (d, 1 / 2.4) - a;
|
||
|
|
||
|
return (d * 65535.0) + 0.5;
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
convert_color (pixman_color_t *dest_srgb, pixman_color_t *linear)
|
||
|
{
|
||
|
dest_srgb->alpha = convert_to_srgb (linear->alpha);
|
||
|
dest_srgb->red = convert_to_srgb (linear->red);
|
||
|
dest_srgb->green = convert_to_srgb (linear->green);
|
||
|
dest_srgb->blue = convert_to_srgb (linear->blue);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
main (int argc, char **argv)
|
||
|
{
|
||
|
static const pixman_trapezoid_t traps[] =
|
||
|
{
|
||
|
{ F(10.10), F(280.0),
|
||
|
{ { F(20.0), F(10.10) },
|
||
|
{ F(5.3), F(280.0) } },
|
||
|
{ { F(20.3), F(10.10) },
|
||
|
{ F(5.6), F(280.0) } }
|
||
|
},
|
||
|
{ F(10.10), F(280.0),
|
||
|
{ { F(40.0), F(10.10) },
|
||
|
{ F(15.3), F(280.0) } },
|
||
|
{ { F(41.0), F(10.10) },
|
||
|
{ F(16.3), F(280.0) } }
|
||
|
},
|
||
|
{ F(10.10), F(280.0),
|
||
|
{ { F(120.0), F(10.10) },
|
||
|
{ F(5.3), F(280.0) } },
|
||
|
{ { F(128.3), F(10.10) },
|
||
|
{ F(6.6), F(280.0) } }
|
||
|
},
|
||
|
{ F(10.10), F(280.0),
|
||
|
{ { F(60.0), F(10.10) },
|
||
|
{ F(25.3), F(280.0) } },
|
||
|
{ { F(61.0), F(10.10) },
|
||
|
{ F(26.3), F(280.0) } }
|
||
|
},
|
||
|
{ F(10.10), F(280.0),
|
||
|
{ { F(90.0), F(10.10) },
|
||
|
{ F(55.3), F(280.0) } },
|
||
|
{ { F(93.0), F(10.10) },
|
||
|
{ F(58.3), F(280.0) } }
|
||
|
},
|
||
|
{ F(130.10), F(150.0),
|
||
|
{ { F(100.0), F(130.10) },
|
||
|
{ F(250.3), F(150.0) } },
|
||
|
{ { F(110.0), F(130.10) },
|
||
|
{ F(260.3), F(150.0) } }
|
||
|
},
|
||
|
{ F(170.10), F(240.0),
|
||
|
{ { F(100.0), F(170.10) },
|
||
|
{ F(120.3), F(240.0) } },
|
||
|
{ { F(250.0), F(170.10) },
|
||
|
{ F(250.3), F(240.0) } }
|
||
|
},
|
||
|
};
|
||
|
|
||
|
pixman_image_t *src, *dest_srgb, *dest_linear;
|
||
|
pixman_color_t bg = { 0x0000, 0x0000, 0x0000, 0xffff };
|
||
|
pixman_color_t fg = { 0xffff, 0xffff, 0xffff, 0xffff };
|
||
|
pixman_color_t fg_srgb;
|
||
|
uint32_t *d;
|
||
|
|
||
|
d = malloc (WIDTH * HEIGHT * 4);
|
||
|
|
||
|
dest_srgb = pixman_image_create_bits (
|
||
|
PIXMAN_a8r8g8b8_sRGB, WIDTH, HEIGHT, d, WIDTH * 4);
|
||
|
dest_linear = pixman_image_create_bits (
|
||
|
PIXMAN_a8r8g8b8, WIDTH, HEIGHT, d, WIDTH * 4);
|
||
|
|
||
|
src = pixman_image_create_solid_fill (&bg);
|
||
|
pixman_image_composite32 (PIXMAN_OP_SRC,
|
||
|
src, NULL, dest_srgb,
|
||
|
0, 0, 0, 0, 0, 0, WIDTH, HEIGHT);
|
||
|
|
||
|
src = pixman_image_create_solid_fill (&fg);
|
||
|
|
||
|
pixman_composite_trapezoids (PIXMAN_OP_OVER,
|
||
|
src, dest_srgb, PIXMAN_a8,
|
||
|
0, 0, 10, 10, G_N_ELEMENTS (traps), traps);
|
||
|
|
||
|
convert_color (&fg_srgb, &fg);
|
||
|
src = pixman_image_create_solid_fill (&fg_srgb);
|
||
|
|
||
|
pixman_composite_trapezoids (PIXMAN_OP_OVER,
|
||
|
src, dest_linear, PIXMAN_a8,
|
||
|
0, 0, 310, 10, G_N_ELEMENTS (traps), traps);
|
||
|
|
||
|
show_image (dest_linear);
|
||
|
pixman_image_unref(dest_linear);
|
||
|
free(d);
|
||
|
|
||
|
return 0;
|
||
|
}
|