1428d7b3dSmrg#include <stdint.h> 2428d7b3dSmrg#include <stdio.h> 3428d7b3dSmrg#include <stdlib.h> 4428d7b3dSmrg 5428d7b3dSmrg#include <X11/Xutil.h> /* for XDestroyImage */ 6428d7b3dSmrg 7428d7b3dSmrg#include "test.h" 8428d7b3dSmrg 9428d7b3dSmrg#define SIZE 20000 10428d7b3dSmrgstruct draw { 11428d7b3dSmrg Pixmap a, b; 12428d7b3dSmrg GC gc; 13428d7b3dSmrg XRenderPictFormat *format; 14428d7b3dSmrg}; 15428d7b3dSmrg 16428d7b3dSmrgstatic void target_init(struct test_display *t, struct draw *tt, int size) 17428d7b3dSmrg{ 18428d7b3dSmrg XGCValues val; 19428d7b3dSmrg 20428d7b3dSmrg tt->a = XCreatePixmap(t->dpy, DefaultRootWindow(t->dpy), 21428d7b3dSmrg size, size, 32); 22428d7b3dSmrg tt->b = XCreatePixmap(t->dpy, DefaultRootWindow(t->dpy), 23428d7b3dSmrg size, size, 32); 24428d7b3dSmrg 25428d7b3dSmrg val.graphics_exposures = 0; 26428d7b3dSmrg tt->gc = XCreateGC(t->dpy, tt->a, GCGraphicsExposures, &val); 27428d7b3dSmrg 28428d7b3dSmrg tt->format = XRenderFindStandardFormat(t->dpy, PictStandardARGB32); 29428d7b3dSmrg 30428d7b3dSmrg val.foreground = 0xffff0000; 31428d7b3dSmrg XChangeGC(t->dpy, tt->gc, GCForeground, &val); 32428d7b3dSmrg XFillRectangle(t->dpy, tt->a, tt->gc, 0, 0, size, size); 33428d7b3dSmrg 34428d7b3dSmrg val.foreground = 0xff0000ff; 35428d7b3dSmrg XChangeGC(t->dpy, tt->gc, GCForeground, &val); 36428d7b3dSmrg XFillRectangle(t->dpy, tt->b, tt->gc, 0, 0, size, size); 37428d7b3dSmrg} 38428d7b3dSmrg 39428d7b3dSmrgstatic void target_fini(struct test_display *t, struct draw *tt) 40428d7b3dSmrg{ 41428d7b3dSmrg XFreePixmap(t->dpy, tt->a); 42428d7b3dSmrg XFreePixmap(t->dpy, tt->b); 43428d7b3dSmrg} 44428d7b3dSmrg 45428d7b3dSmrgint main(int argc, char **argv) 46428d7b3dSmrg{ 47428d7b3dSmrg struct test test; 48428d7b3dSmrg struct draw out, ref; 49428d7b3dSmrg int size, i; 50428d7b3dSmrg 51428d7b3dSmrg test_init(&test, argc, argv); 52428d7b3dSmrg 53428d7b3dSmrg /* Copy back and forth betwenn two pixmaps, gradually getting larger */ 54428d7b3dSmrg for (size = 1; size <= SIZE; size = (size * 3 + 1) / 2) { 55428d7b3dSmrg target_init(&test.out, &out, size); 56428d7b3dSmrg target_init(&test.ref, &ref, size); 57428d7b3dSmrg 58428d7b3dSmrg printf("size=%d\n", size); 59428d7b3dSmrg for (i = 0; i <= DEFAULT_ITERATIONS; i++) { 60428d7b3dSmrg int reps = REPS(i); 61428d7b3dSmrg do { 62428d7b3dSmrg int sx = rand() % (2*size) - size; 63428d7b3dSmrg int sy = rand() % (2*size) - size; 64428d7b3dSmrg 65428d7b3dSmrg int dx = rand() % (2*size) - size; 66428d7b3dSmrg int dy = rand() % (2*size) - size; 67428d7b3dSmrg 68428d7b3dSmrg int order = rand() & 1; 69428d7b3dSmrg 70428d7b3dSmrg XCopyArea(test.out.dpy, 71428d7b3dSmrg order ? out.a : out.b, 72428d7b3dSmrg (!order) ? out.a : out.b, 73428d7b3dSmrg out.gc, 74428d7b3dSmrg sx, sy, 75428d7b3dSmrg size, size, 76428d7b3dSmrg dx, dy); 77428d7b3dSmrg 78428d7b3dSmrg XCopyArea(test.ref.dpy, 79428d7b3dSmrg order ? ref.a : ref.b, 80428d7b3dSmrg (!order) ? ref.a : ref.b, 81428d7b3dSmrg ref.gc, 82428d7b3dSmrg sx, sy, 83428d7b3dSmrg size, size, 84428d7b3dSmrg dx, dy); 85428d7b3dSmrg } while (--reps); 86428d7b3dSmrg } 87428d7b3dSmrg 88428d7b3dSmrg test_compare(&test, 89428d7b3dSmrg out.a, out.format, 90428d7b3dSmrg ref.a, ref.format, 91428d7b3dSmrg 0, 0, size, size, 92428d7b3dSmrg ""); 93428d7b3dSmrg test_compare(&test, 94428d7b3dSmrg out.b, out.format, 95428d7b3dSmrg ref.b, ref.format, 96428d7b3dSmrg 0, 0, size, size, 97428d7b3dSmrg ""); 98428d7b3dSmrg 99428d7b3dSmrg target_fini(&test.out, &out); 100428d7b3dSmrg target_fini(&test.ref, &ref); 101428d7b3dSmrg } 102428d7b3dSmrg 103428d7b3dSmrg return 0; 104428d7b3dSmrg} 105