|
Packit |
030a23 |
#include <math.h>
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
#include "pixman.h"
|
|
Packit |
030a23 |
#include "gtk-utils.h"
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static uint32_t
|
|
Packit |
030a23 |
linear_argb_to_premult_argb (float a,
|
|
Packit |
030a23 |
float r,
|
|
Packit |
030a23 |
float g,
|
|
Packit |
030a23 |
float b)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
r *= a;
|
|
Packit |
030a23 |
g *= a;
|
|
Packit |
030a23 |
b *= a;
|
|
Packit |
030a23 |
return (uint32_t) (a * 255.0f + 0.5f) << 24
|
|
Packit |
030a23 |
| (uint32_t) (r * 255.0f + 0.5f) << 16
|
|
Packit |
030a23 |
| (uint32_t) (g * 255.0f + 0.5f) << 8
|
|
Packit |
030a23 |
| (uint32_t) (b * 255.0f + 0.5f) << 0;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static float
|
|
Packit |
030a23 |
lin2srgb (float linear)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
if (linear < 0.0031308f)
|
|
Packit |
030a23 |
return linear * 12.92f;
|
|
Packit |
030a23 |
else
|
|
Packit |
030a23 |
return 1.055f * powf (linear, 1.0f/2.4f) - 0.055f;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
static uint32_t
|
|
Packit |
030a23 |
linear_argb_to_premult_srgb_argb (float a,
|
|
Packit |
030a23 |
float r,
|
|
Packit |
030a23 |
float g,
|
|
Packit |
030a23 |
float b)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
r = lin2srgb (r * a);
|
|
Packit |
030a23 |
g = lin2srgb (g * a);
|
|
Packit |
030a23 |
b = lin2srgb (b * a);
|
|
Packit |
030a23 |
return (uint32_t) (a * 255.0f + 0.5f) << 24
|
|
Packit |
030a23 |
| (uint32_t) (r * 255.0f + 0.5f) << 16
|
|
Packit |
030a23 |
| (uint32_t) (g * 255.0f + 0.5f) << 8
|
|
Packit |
030a23 |
| (uint32_t) (b * 255.0f + 0.5f) << 0;
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
int
|
|
Packit |
030a23 |
main (int argc, char **argv)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
#define WIDTH 400
|
|
Packit |
030a23 |
#define HEIGHT 200
|
|
Packit |
030a23 |
int y, x, p;
|
|
Packit |
030a23 |
float alpha;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
uint32_t *dest = malloc (WIDTH * HEIGHT * 4);
|
|
Packit |
030a23 |
uint32_t *src1 = malloc (WIDTH * HEIGHT * 4);
|
|
Packit |
030a23 |
pixman_image_t *dest_img, *src1_img;
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
dest_img = pixman_image_create_bits (PIXMAN_a8r8g8b8_sRGB,
|
|
Packit |
030a23 |
WIDTH, HEIGHT,
|
|
Packit |
030a23 |
dest,
|
|
Packit |
030a23 |
WIDTH * 4);
|
|
Packit |
030a23 |
src1_img = pixman_image_create_bits (PIXMAN_a8r8g8b8,
|
|
Packit |
030a23 |
WIDTH, HEIGHT,
|
|
Packit |
030a23 |
src1,
|
|
Packit |
030a23 |
WIDTH * 4);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
for (y = 0; y < HEIGHT; y ++)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
p = WIDTH * y;
|
|
Packit |
030a23 |
for (x = 0; x < WIDTH; x ++)
|
|
Packit |
030a23 |
{
|
|
Packit |
030a23 |
alpha = (float) x / WIDTH;
|
|
Packit |
030a23 |
src1[p + x] = linear_argb_to_premult_argb (alpha, 1, 0, 1);
|
|
Packit |
030a23 |
dest[p + x] = linear_argb_to_premult_srgb_argb (1-alpha, 0, 1, 0);
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
}
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
pixman_image_composite (PIXMAN_OP_ADD, src1_img, NULL, dest_img,
|
|
Packit |
030a23 |
0, 0, 0, 0, 0, 0, WIDTH, HEIGHT);
|
|
Packit |
030a23 |
pixman_image_unref (src1_img);
|
|
Packit |
030a23 |
free (src1);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
show_image (dest_img);
|
|
Packit |
030a23 |
pixman_image_unref (dest_img);
|
|
Packit |
030a23 |
free (dest);
|
|
Packit |
030a23 |
|
|
Packit |
030a23 |
return 0;
|
|
Packit |
030a23 |
}
|