11176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include "../test/utils.h"
21176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include "gtk-utils.h"
31176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
41176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define SIZE 128
51176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define GRADIENTS_PER_ROW 7
61176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define NUM_ROWS ((NUM_GRADIENTS + GRADIENTS_PER_ROW - 1) / GRADIENTS_PER_ROW)
71176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define WIDTH (SIZE * GRADIENTS_PER_ROW)
81176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define HEIGHT (SIZE * NUM_ROWS)
91176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define NUM_GRADIENTS 35
101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define double_to_color(x)					\
121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    (((uint32_t) ((x)*65536)) - (((uint32_t) ((x)*65536)) >> 16))
131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define PIXMAN_STOP(offset,r,g,b,a)		\
151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    { pixman_double_to_fixed (offset),		\
161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	{					\
171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	    double_to_color (r),		\
181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		double_to_color (g),		\
191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		double_to_color (b),		\
201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		double_to_color (a)		\
211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	}					\
221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
251176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic const pixman_gradient_stop_t stops[] = {
261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_STOP (0.25,       1, 0, 0, 0.7),
271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_STOP (0.5,        1, 1, 0, 0.7),
281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_STOP (0.75,       0, 1, 0, 0.7),
291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_STOP (1.0,        0, 0, 1, 0.7)
301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck};
311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define NUM_STOPS (sizeof (stops) / sizeof (stops[0]))
331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
341176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_image_t *
351176bdada62cabc6ec4b0308a930e83b679d5d36John Reckcreate_conical (int index)
361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_point_fixed_t c;
381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    double angle;
391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    c.x = pixman_double_to_fixed (0);
411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    c.y = pixman_double_to_fixed (0);
421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    angle = (0.5 / NUM_GRADIENTS + index / (double)NUM_GRADIENTS) * 720 - 180;
441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    return pixman_image_create_conical_gradient (
461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	&c, pixman_double_to_fixed (angle), stops, NUM_STOPS);
471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
491176bdada62cabc6ec4b0308a930e83b679d5d36John Reckint
501176bdada62cabc6ec4b0308a930e83b679d5d36John Reckmain (int argc, char **argv)
511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_transform_t transform;
531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_image_t *src_img, *dest_img;
541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    int i;
551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    enable_divbyzero_exceptions ();
571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    dest_img = pixman_image_create_bits (PIXMAN_a8r8g8b8,
591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck					 WIDTH, HEIGHT,
601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck					 NULL, 0);
611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    draw_checkerboard (dest_img, 25, 0xffaaaaaa, 0xff888888);
631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_transform_init_identity (&transform);
651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_transform_translate (NULL, &transform,
671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck				pixman_double_to_fixed (0.5),
681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck				pixman_double_to_fixed (0.5));
691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_transform_scale (NULL, &transform,
711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck			    pixman_double_to_fixed (SIZE),
721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck			    pixman_double_to_fixed (SIZE));
731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_transform_translate (NULL, &transform,
741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck				pixman_double_to_fixed (0.5),
751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck				pixman_double_to_fixed (0.5));
761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    for (i = 0; i < NUM_GRADIENTS; i++)
781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	int column = i % GRADIENTS_PER_ROW;
801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	int row = i / GRADIENTS_PER_ROW;
811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	src_img = create_conical (i);
831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_image_set_repeat (src_img, PIXMAN_REPEAT_NORMAL);
841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_image_set_transform (src_img, &transform);
861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_image_composite32 (
881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	    PIXMAN_OP_OVER, src_img, NULL,dest_img,
891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	    0, 0, 0, 0, column * SIZE, row * SIZE,
901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	    SIZE, SIZE);
911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck	pixman_image_unref (src_img);
931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    show_image (dest_img);
961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_image_unref (dest_img);
981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    return 0;
1001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
101