Blame test/combiner-test.c

Packit 030a23
#include <stdio.h>
Packit 030a23
#include <stdlib.h>
Packit 030a23
#include "utils.h"
Packit 030a23
#include <sys/types.h>
Packit 030a23
#include "pixman-private.h"
Packit 030a23
Packit 030a23
static const pixman_op_t op_list[] =
Packit 030a23
{
Packit 030a23
    PIXMAN_OP_SRC,
Packit 030a23
    PIXMAN_OP_OVER,
Packit 030a23
    PIXMAN_OP_ADD,
Packit 030a23
    PIXMAN_OP_CLEAR,
Packit 030a23
    PIXMAN_OP_SRC,
Packit 030a23
    PIXMAN_OP_DST,
Packit 030a23
    PIXMAN_OP_OVER,
Packit 030a23
    PIXMAN_OP_OVER_REVERSE,
Packit 030a23
    PIXMAN_OP_IN,
Packit 030a23
    PIXMAN_OP_IN_REVERSE,
Packit 030a23
    PIXMAN_OP_OUT,
Packit 030a23
    PIXMAN_OP_OUT_REVERSE,
Packit 030a23
    PIXMAN_OP_ATOP,
Packit 030a23
    PIXMAN_OP_ATOP_REVERSE,
Packit 030a23
    PIXMAN_OP_XOR,
Packit 030a23
    PIXMAN_OP_ADD,
Packit 030a23
    PIXMAN_OP_SATURATE,
Packit 030a23
    PIXMAN_OP_DISJOINT_CLEAR,
Packit 030a23
    PIXMAN_OP_DISJOINT_SRC,
Packit 030a23
    PIXMAN_OP_DISJOINT_DST,
Packit 030a23
    PIXMAN_OP_DISJOINT_OVER,
Packit 030a23
    PIXMAN_OP_DISJOINT_OVER_REVERSE,
Packit 030a23
    PIXMAN_OP_DISJOINT_IN,
Packit 030a23
    PIXMAN_OP_DISJOINT_IN_REVERSE,
Packit 030a23
    PIXMAN_OP_DISJOINT_OUT,
Packit 030a23
    PIXMAN_OP_DISJOINT_OUT_REVERSE,
Packit 030a23
    PIXMAN_OP_DISJOINT_ATOP,
Packit 030a23
    PIXMAN_OP_DISJOINT_ATOP_REVERSE,
Packit 030a23
    PIXMAN_OP_DISJOINT_XOR,
Packit 030a23
    PIXMAN_OP_CONJOINT_CLEAR,
Packit 030a23
    PIXMAN_OP_CONJOINT_SRC,
Packit 030a23
    PIXMAN_OP_CONJOINT_DST,
Packit 030a23
    PIXMAN_OP_CONJOINT_OVER,
Packit 030a23
    PIXMAN_OP_CONJOINT_OVER_REVERSE,
Packit 030a23
    PIXMAN_OP_CONJOINT_IN,
Packit 030a23
    PIXMAN_OP_CONJOINT_IN_REVERSE,
Packit 030a23
    PIXMAN_OP_CONJOINT_OUT,
Packit 030a23
    PIXMAN_OP_CONJOINT_OUT_REVERSE,
Packit 030a23
    PIXMAN_OP_CONJOINT_ATOP,
Packit 030a23
    PIXMAN_OP_CONJOINT_ATOP_REVERSE,
Packit 030a23
    PIXMAN_OP_CONJOINT_XOR,
Packit 030a23
    PIXMAN_OP_MULTIPLY,
Packit 030a23
    PIXMAN_OP_SCREEN,
Packit 030a23
    PIXMAN_OP_OVERLAY,
Packit 030a23
    PIXMAN_OP_DARKEN,
Packit 030a23
    PIXMAN_OP_LIGHTEN,
Packit 030a23
    PIXMAN_OP_COLOR_DODGE,
Packit 030a23
    PIXMAN_OP_COLOR_BURN,
Packit 030a23
    PIXMAN_OP_HARD_LIGHT,
Packit 030a23
    PIXMAN_OP_DIFFERENCE,
Packit 030a23
    PIXMAN_OP_EXCLUSION,
Packit 030a23
    PIXMAN_OP_SOFT_LIGHT,
Packit 030a23
    PIXMAN_OP_HSL_HUE,
Packit 030a23
    PIXMAN_OP_HSL_SATURATION,
Packit 030a23
    PIXMAN_OP_HSL_COLOR,
Packit 030a23
    PIXMAN_OP_HSL_LUMINOSITY,
Packit 030a23
};
Packit 030a23
Packit 030a23
static float
Packit 030a23
rand_float (void)
Packit 030a23
{
Packit 030a23
    uint32_t u = prng_rand();
Packit 030a23
Packit 030a23
    return *(float *)&u;
Packit 030a23
}
Packit 030a23
Packit 030a23
static void
Packit 030a23
random_floats (argb_t *argb, int width)
Packit 030a23
{
Packit 030a23
    int i;
Packit 030a23
Packit 030a23
    for (i = 0; i < width; ++i)
Packit 030a23
    {
Packit 030a23
	argb_t *p = argb + i;
Packit 030a23
Packit 030a23
	p->a = rand_float();
Packit 030a23
	p->r = rand_float();
Packit 030a23
	p->g = rand_float();
Packit 030a23
	p->b = rand_float();
Packit 030a23
    }
Packit 030a23
}
Packit 030a23
Packit 030a23
#define WIDTH	512
Packit 030a23
Packit 030a23
static pixman_combine_float_func_t
Packit 030a23
lookup_combiner (pixman_implementation_t *imp, pixman_op_t op,
Packit 030a23
		 pixman_bool_t component_alpha)
Packit 030a23
{
Packit 030a23
    pixman_combine_float_func_t f;
Packit 030a23
Packit 030a23
    do
Packit 030a23
    {
Packit 030a23
	if (component_alpha)
Packit 030a23
	    f = imp->combine_float_ca[op];
Packit 030a23
	else
Packit 030a23
	    f = imp->combine_float[op];
Packit 030a23
	
Packit 030a23
	imp = imp->fallback;
Packit 030a23
    }
Packit 030a23
    while (!f);
Packit 030a23
Packit 030a23
    return f;
Packit 030a23
}
Packit 030a23
Packit 030a23
int
Packit 030a23
main ()
Packit 030a23
{
Packit 030a23
    pixman_implementation_t *impl;
Packit 030a23
    argb_t *src_bytes = malloc (WIDTH * sizeof (argb_t));
Packit 030a23
    argb_t *mask_bytes = malloc (WIDTH * sizeof (argb_t));
Packit 030a23
    argb_t *dest_bytes = malloc (WIDTH * sizeof (argb_t));
Packit 030a23
    int i;
Packit 030a23
Packit 030a23
    enable_divbyzero_exceptions();
Packit 030a23
    
Packit 030a23
    impl = _pixman_internal_only_get_implementation();
Packit 030a23
    
Packit 030a23
    prng_srand (0);
Packit 030a23
Packit 030a23
    for (i = 0; i < ARRAY_LENGTH (op_list); ++i)
Packit 030a23
    {
Packit 030a23
	pixman_op_t op = op_list[i];
Packit 030a23
	pixman_combine_float_func_t combiner;
Packit 030a23
	int ca;
Packit 030a23
Packit 030a23
	for (ca = 0; ca < 2; ++ca)
Packit 030a23
	{
Packit 030a23
	    combiner = lookup_combiner (impl, op, ca);
Packit 030a23
Packit 030a23
	    random_floats (src_bytes, WIDTH);
Packit 030a23
	    random_floats (mask_bytes, WIDTH);
Packit 030a23
	    random_floats (dest_bytes, WIDTH);
Packit 030a23
Packit 030a23
	    combiner (impl, op,
Packit 030a23
		      (float *)dest_bytes,
Packit 030a23
		      (float *)mask_bytes,
Packit 030a23
		      (float *)src_bytes,
Packit 030a23
		      WIDTH);
Packit 030a23
	}
Packit 030a23
    }	
Packit 030a23
Packit 030a23
    return 0;
Packit 030a23
}