render-copyarea-size.c revision 03b705cf
103b705cfSriastradh#include <stdint.h> 203b705cfSriastradh#include <stdio.h> 303b705cfSriastradh#include <stdlib.h> 403b705cfSriastradh 503b705cfSriastradh#include <X11/Xutil.h> /* for XDestroyImage */ 603b705cfSriastradh 703b705cfSriastradh#include "test.h" 803b705cfSriastradh 903b705cfSriastradh#define SIZE 20000 1003b705cfSriastradhstruct draw { 1103b705cfSriastradh Pixmap a, b; 1203b705cfSriastradh Picture pa, pb; 1303b705cfSriastradh GC gc; 1403b705cfSriastradh XRenderPictFormat *format; 1503b705cfSriastradh}; 1603b705cfSriastradh 1703b705cfSriastradhstatic void target_init(struct test_display *t, struct draw *tt, int size) 1803b705cfSriastradh{ 1903b705cfSriastradh XRenderColor color; 2003b705cfSriastradh 2103b705cfSriastradh tt->format = XRenderFindStandardFormat(t->dpy, PictStandardARGB32); 2203b705cfSriastradh 2303b705cfSriastradh tt->a = XCreatePixmap(t->dpy, DefaultRootWindow(t->dpy), 2403b705cfSriastradh size, size, tt->format->depth); 2503b705cfSriastradh tt->pa = XRenderCreatePicture(t->dpy, tt->a, tt->format, 0, NULL); 2603b705cfSriastradh 2703b705cfSriastradh color.alpha = 0xffff; 2803b705cfSriastradh color.red = 0xffff; 2903b705cfSriastradh color.green = 0; 3003b705cfSriastradh color.blue = 0; 3103b705cfSriastradh XRenderFillRectangle(t->dpy, PictOpSrc, tt->pa, &color, 0, 0, size, size); 3203b705cfSriastradh 3303b705cfSriastradh tt->b = XCreatePixmap(t->dpy, DefaultRootWindow(t->dpy), 3403b705cfSriastradh size, size, tt->format->depth); 3503b705cfSriastradh tt->pb = XRenderCreatePicture(t->dpy, tt->b, tt->format, 0, NULL); 3603b705cfSriastradh 3703b705cfSriastradh color.alpha = 0xffff; 3803b705cfSriastradh color.red = 0; 3903b705cfSriastradh color.green = 0; 4003b705cfSriastradh color.blue = 0xffff; 4103b705cfSriastradh XRenderFillRectangle(t->dpy, PictOpSrc, tt->pb, &color, 0, 0, size, size); 4203b705cfSriastradh} 4303b705cfSriastradh 4403b705cfSriastradhstatic void target_fini(struct test_display *t, struct draw *tt) 4503b705cfSriastradh{ 4603b705cfSriastradh XRenderFreePicture(t->dpy, tt->pa); 4703b705cfSriastradh XFreePixmap(t->dpy, tt->a); 4803b705cfSriastradh 4903b705cfSriastradh XRenderFreePicture(t->dpy, tt->pb); 5003b705cfSriastradh XFreePixmap(t->dpy, tt->b); 5103b705cfSriastradh} 5203b705cfSriastradh 5303b705cfSriastradhint main(int argc, char **argv) 5403b705cfSriastradh{ 5503b705cfSriastradh struct test test; 5603b705cfSriastradh struct draw real, ref; 5703b705cfSriastradh int size, i; 5803b705cfSriastradh 5903b705cfSriastradh test_init(&test, argc, argv); 6003b705cfSriastradh 6103b705cfSriastradh /* Copy back and forth betwenn two pixmaps, gradually getting larger */ 6203b705cfSriastradh for (size = 1; size <= SIZE; size = (size * 3 + 1) / 2) { 6303b705cfSriastradh target_init(&test.real, &real, size); 6403b705cfSriastradh target_init(&test.ref, &ref, size); 6503b705cfSriastradh 6603b705cfSriastradh printf("size=%d\n", size); 6703b705cfSriastradh for (i = 0; i <= DEFAULT_ITERATIONS; i++) { 6803b705cfSriastradh int reps = 1 << i; 6903b705cfSriastradh do { 7003b705cfSriastradh int sx = rand() % (2*size) - size; 7103b705cfSriastradh int sy = rand() % (2*size) - size; 7203b705cfSriastradh 7303b705cfSriastradh int dx = rand() % (2*size) - size; 7403b705cfSriastradh int dy = rand() % (2*size) - size; 7503b705cfSriastradh 7603b705cfSriastradh int w = rand() % size; 7703b705cfSriastradh int h = rand() % size; 7803b705cfSriastradh 7903b705cfSriastradh int order = rand() & 1; 8003b705cfSriastradh 8103b705cfSriastradh XRenderComposite(test.real.dpy, PictOpSrc, 8203b705cfSriastradh order ? real.pa : real.pb, 8303b705cfSriastradh 0, 8403b705cfSriastradh (!order) ? real.pa : real.pb, 8503b705cfSriastradh sx, sy, 8603b705cfSriastradh 0, 0, 8703b705cfSriastradh dx, dy, 8803b705cfSriastradh w, h); 8903b705cfSriastradh 9003b705cfSriastradh XRenderComposite(test.ref.dpy, PictOpSrc, 9103b705cfSriastradh order ? ref.pa : ref.pb, 9203b705cfSriastradh 0, 9303b705cfSriastradh (!order) ? ref.pa : ref.pb, 9403b705cfSriastradh sx, sy, 9503b705cfSriastradh 0, 0, 9603b705cfSriastradh dx, dy, 9703b705cfSriastradh w, h); 9803b705cfSriastradh } while (--reps); 9903b705cfSriastradh } 10003b705cfSriastradh 10103b705cfSriastradh test_compare(&test, 10203b705cfSriastradh real.a, real.format, 10303b705cfSriastradh ref.a, ref.format, 10403b705cfSriastradh 0, 0, size, size, 10503b705cfSriastradh ""); 10603b705cfSriastradh test_compare(&test, 10703b705cfSriastradh real.b, real.format, 10803b705cfSriastradh ref.b, ref.format, 10903b705cfSriastradh 0, 0, size, size, 11003b705cfSriastradh ""); 11103b705cfSriastradh 11203b705cfSriastradh target_fini(&test.real, &real); 11303b705cfSriastradh target_fini(&test.ref, &ref); 11403b705cfSriastradh } 11503b705cfSriastradh 11603b705cfSriastradh return 0; 11703b705cfSriastradh} 118