Edit

IABSD.fr/xenocara/lib/pixman/demos/srgb-test.c

Branch :

  • Show log

    Commit

  • Author : matthieu
    Date : 2012-11-23 20:44:07
    Hash : 87d6a5b7
    Message : Update to pixman 0.28.0. Tested by ajacoutot@, mpi@ and naddy@ in a full ports build. Tweaks from mpi@ for macppc.

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