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