Blame demos/srgb-test.c

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
}