1428d7b3dSmrg#include <stdint.h> 2428d7b3dSmrg#include <stdio.h> 3428d7b3dSmrg#include <stdlib.h> 4428d7b3dSmrg 5428d7b3dSmrg#include "test.h" 6428d7b3dSmrg 7428d7b3dSmrgstatic unsigned char bitmap4x4[] = { 8428d7b3dSmrg 0x03, 0x06, 0x0c, 0x09 9428d7b3dSmrg}; 10428d7b3dSmrg 11428d7b3dSmrgstatic unsigned char bitmap8x8[3][8] = { 12428d7b3dSmrg { 0xcc, 0x66, 0x33, 0x99, 0xcc, 0x66, 0x33, 0x99 }, 13428d7b3dSmrg { 0x00, 0xfe, 0x92, 0x92, 0xfe, 0x92, 0x92, 0xfe }, 14428d7b3dSmrg { 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa }, 15428d7b3dSmrg}; 16428d7b3dSmrg 17428d7b3dSmrgstatic void fill_rect(struct test_target *t, uint8_t alu, 18428d7b3dSmrg XRectangle *clip, int nclip, 19428d7b3dSmrg uint8_t stipple, uint8_t opaque, int tx, int ty, 20428d7b3dSmrg int x, int y, int w, int h, 21428d7b3dSmrg uint32_t fg, uint32_t bg) 22428d7b3dSmrg{ 23428d7b3dSmrg Display *dpy = t->dpy->dpy; 24428d7b3dSmrg XGCValues val; 25428d7b3dSmrg GC gc; 26428d7b3dSmrg 27428d7b3dSmrg val.function = alu; 28428d7b3dSmrg val.foreground = fg; 29428d7b3dSmrg val.background = bg; 30428d7b3dSmrg val.fill_style = opaque ? FillOpaqueStippled : FillStippled; 31428d7b3dSmrg val.ts_x_origin = tx; 32428d7b3dSmrg val.ts_y_origin = ty; 33428d7b3dSmrg if (stipple == 0) { 34428d7b3dSmrg val.stipple = XCreateBitmapFromData(dpy, t->draw, (char *)bitmap4x4, 4, 4); 35428d7b3dSmrg } else { 36428d7b3dSmrg char *b = (char *)bitmap8x8[stipple-1]; 37428d7b3dSmrg val.stipple = XCreateBitmapFromData(dpy, t->draw, b, 8, 8); 38428d7b3dSmrg } 39428d7b3dSmrg 40428d7b3dSmrg gc = XCreateGC(dpy, t->draw, GCFillStyle | GCTileStipXOrigin | GCTileStipYOrigin | GCStipple | GCForeground | GCBackground | GCFunction, &val); 41428d7b3dSmrg if (nclip) 42428d7b3dSmrg XSetClipRectangles(dpy, gc, 0, 0, clip, nclip, Unsorted); 43428d7b3dSmrg XFillRectangle(dpy, t->draw, gc, x, y, w, h); 44428d7b3dSmrg XFreeGC(dpy, gc); 45428d7b3dSmrg XFreePixmap(dpy, val.stipple); 46428d7b3dSmrg} 47428d7b3dSmrg 48428d7b3dSmrgstatic void clear(struct test_target *tt) 49428d7b3dSmrg{ 50428d7b3dSmrg XRenderColor render_color = {0}; 51428d7b3dSmrg XRenderFillRectangle(tt->dpy->dpy, PictOpClear, tt->picture, &render_color, 52428d7b3dSmrg 0, 0, tt->width, tt->height); 53428d7b3dSmrg} 54428d7b3dSmrg 55428d7b3dSmrgstatic void unclipped_tests(struct test *t, int reps, int sets, enum target target) 56428d7b3dSmrg{ 57428d7b3dSmrg struct test_target out, ref; 58428d7b3dSmrg int r, s; 59428d7b3dSmrg 60428d7b3dSmrg printf("Testing unclipped stippled fills (%s): ", test_target_name(target)); 61428d7b3dSmrg fflush(stdout); 62428d7b3dSmrg 63428d7b3dSmrg test_target_create_render(&t->out, target, &out); 64428d7b3dSmrg clear(&out); 65428d7b3dSmrg 66428d7b3dSmrg test_target_create_render(&t->ref, target, &ref); 67428d7b3dSmrg clear(&ref); 68428d7b3dSmrg 69428d7b3dSmrg for (s = 0; s < sets; s++) { 70428d7b3dSmrg for (r = 0; r < reps; r++) { 71428d7b3dSmrg int x = rand() % out.width; 72428d7b3dSmrg int y = rand() % out.height; 73428d7b3dSmrg int w = rand() % (out.width - x); 74428d7b3dSmrg int h = rand() % (out.height - y); 75428d7b3dSmrg int tx = rand() % (2*out.width) - out.width; 76428d7b3dSmrg int ty = rand() % (2*out.height) - out.height; 77428d7b3dSmrg uint8_t stipple = rand() % 4; 78428d7b3dSmrg uint8_t opaque = rand() % 1; 79428d7b3dSmrg uint8_t alu = rand() % (GXset + 1); 80428d7b3dSmrg uint32_t fg = rand(); 81428d7b3dSmrg uint32_t bg = rand(); 82428d7b3dSmrg 83428d7b3dSmrg fill_rect(&out, alu, NULL, 0, 84428d7b3dSmrg stipple, opaque, tx, ty, 85428d7b3dSmrg x, y, w, h, 86428d7b3dSmrg fg, bg); 87428d7b3dSmrg fill_rect(&ref, alu, NULL, 0, 88428d7b3dSmrg stipple, opaque, tx, ty, 89428d7b3dSmrg x, y, w, h, 90428d7b3dSmrg fg, bg); 91428d7b3dSmrg } 92428d7b3dSmrg 93428d7b3dSmrg test_compare(t, 94428d7b3dSmrg out.draw, out.format, 95428d7b3dSmrg ref.draw, ref.format, 96428d7b3dSmrg 0, 0, out.width, out.height, 97428d7b3dSmrg ""); 98428d7b3dSmrg } 99428d7b3dSmrg 100428d7b3dSmrg printf("passed [%d iterations x %d]\n", reps, sets); 101428d7b3dSmrg 102428d7b3dSmrg test_target_destroy_render(&t->out, &out); 103428d7b3dSmrg test_target_destroy_render(&t->ref, &ref); 104428d7b3dSmrg} 105428d7b3dSmrg 106428d7b3dSmrgstatic void simple_clip_tests(struct test *t, int reps, int sets, enum target target) 107428d7b3dSmrg{ 108428d7b3dSmrg struct test_target out, ref; 109428d7b3dSmrg int r, s; 110428d7b3dSmrg 111428d7b3dSmrg printf("Testing simple clipped stippled fills (%s): ", test_target_name(target)); 112428d7b3dSmrg fflush(stdout); 113428d7b3dSmrg 114428d7b3dSmrg test_target_create_render(&t->out, target, &out); 115428d7b3dSmrg clear(&out); 116428d7b3dSmrg 117428d7b3dSmrg test_target_create_render(&t->ref, target, &ref); 118428d7b3dSmrg clear(&ref); 119428d7b3dSmrg 120428d7b3dSmrg for (s = 0; s < sets; s++) { 121428d7b3dSmrg for (r = 0; r < reps; r++) { 122428d7b3dSmrg int x = rand() % (2*out.width) - out.width; 123428d7b3dSmrg int y = rand() % (2*out.height) - out.height; 124428d7b3dSmrg int w = rand() % (2*out.width); 125428d7b3dSmrg int h = rand() % (2*out.height); 126428d7b3dSmrg int tx = rand() % (2*out.width) - out.width; 127428d7b3dSmrg int ty = rand() % (2*out.height) - out.height; 128428d7b3dSmrg uint8_t stipple = rand() % 4; 129428d7b3dSmrg uint8_t opaque = rand() % 1; 130428d7b3dSmrg uint8_t alu = rand() % (GXset + 1); 131428d7b3dSmrg uint32_t fg = rand(); 132428d7b3dSmrg uint32_t bg = rand(); 133428d7b3dSmrg 134428d7b3dSmrg fill_rect(&out, alu, NULL, 0, 135428d7b3dSmrg stipple, opaque, tx, ty, 136428d7b3dSmrg x, y, w, h, 137428d7b3dSmrg fg, bg); 138428d7b3dSmrg fill_rect(&ref, alu, NULL, 0, 139428d7b3dSmrg stipple, opaque, tx, ty, 140428d7b3dSmrg x, y, w, h, 141428d7b3dSmrg fg, bg); 142428d7b3dSmrg } 143428d7b3dSmrg 144428d7b3dSmrg test_compare(t, 145428d7b3dSmrg out.draw, out.format, 146428d7b3dSmrg ref.draw, ref.format, 147428d7b3dSmrg 0, 0, out.width, out.height, 148428d7b3dSmrg ""); 149428d7b3dSmrg } 150428d7b3dSmrg 151428d7b3dSmrg printf("passed [%d iterations x %d]\n", reps, sets); 152428d7b3dSmrg 153428d7b3dSmrg test_target_destroy_render(&t->out, &out); 154428d7b3dSmrg test_target_destroy_render(&t->ref, &ref); 155428d7b3dSmrg} 156428d7b3dSmrg 157428d7b3dSmrgstatic void complex_clip_tests(struct test *t, int reps, int sets, enum target target) 158428d7b3dSmrg{ 159428d7b3dSmrg struct test_target out, ref; 160428d7b3dSmrg XRectangle *clip; 161428d7b3dSmrg int nclip, r, s; 162428d7b3dSmrg 163428d7b3dSmrg printf("Testing complex clipped stippled fills (%s): ", test_target_name(target)); 164428d7b3dSmrg fflush(stdout); 165428d7b3dSmrg 166428d7b3dSmrg test_target_create_render(&t->out, target, &out); 167428d7b3dSmrg clear(&out); 168428d7b3dSmrg 169428d7b3dSmrg test_target_create_render(&t->ref, target, &ref); 170428d7b3dSmrg clear(&ref); 171428d7b3dSmrg 172428d7b3dSmrg for (s = 0; s < sets; s++) { 173428d7b3dSmrg nclip = (rand() % 16) + 2; 174428d7b3dSmrg clip = malloc(sizeof(XRectangle)*nclip); 175428d7b3dSmrg for (r = 0; r < nclip; r++) { 176428d7b3dSmrg clip[r].x = rand() % out.width; 177428d7b3dSmrg clip[r].y = rand() % out.height; 178428d7b3dSmrg clip[r].width = rand() % (out.width - clip[r].x); 179428d7b3dSmrg clip[r].height = rand() % (out.height - clip[r].y); 180428d7b3dSmrg } 181428d7b3dSmrg 182428d7b3dSmrg for (r = 0; r < reps; r++) { 183428d7b3dSmrg int x = rand() % (2*out.width) - out.width; 184428d7b3dSmrg int y = rand() % (2*out.height) - out.height; 185428d7b3dSmrg int w = rand() % (2*out.width); 186428d7b3dSmrg int h = rand() % (2*out.height); 187428d7b3dSmrg int tx = rand() % (2*out.width) - out.width; 188428d7b3dSmrg int ty = rand() % (2*out.height) - out.height; 189428d7b3dSmrg uint8_t stipple = rand() % 4; 190428d7b3dSmrg uint8_t opaque = rand() % 1; 191428d7b3dSmrg uint8_t alu = rand() % (GXset + 1); 192428d7b3dSmrg uint32_t fg = rand(); 193428d7b3dSmrg uint32_t bg = rand(); 194428d7b3dSmrg 195428d7b3dSmrg fill_rect(&out, alu, clip, nclip, 196428d7b3dSmrg stipple, opaque, tx, ty, 197428d7b3dSmrg x, y, w, h, 198428d7b3dSmrg fg, bg); 199428d7b3dSmrg fill_rect(&ref, alu, clip, nclip, 200428d7b3dSmrg stipple, opaque, tx, ty, 201428d7b3dSmrg x, y, w, h, 202428d7b3dSmrg fg, bg); 203428d7b3dSmrg } 204428d7b3dSmrg 205428d7b3dSmrg test_compare(t, 206428d7b3dSmrg out.draw, out.format, 207428d7b3dSmrg ref.draw, ref.format, 208428d7b3dSmrg 0, 0, out.width, out.height, 209428d7b3dSmrg ""); 210428d7b3dSmrg 211428d7b3dSmrg free(clip); 212428d7b3dSmrg } 213428d7b3dSmrg 214428d7b3dSmrg printf("passed [%d iterations x %d]\n", reps, sets); 215428d7b3dSmrg 216428d7b3dSmrg test_target_destroy_render(&t->out, &out); 217428d7b3dSmrg test_target_destroy_render(&t->ref, &ref); 218428d7b3dSmrg} 219428d7b3dSmrg 220428d7b3dSmrgint main(int argc, char **argv) 221428d7b3dSmrg{ 222428d7b3dSmrg struct test test; 223428d7b3dSmrg int i; 224428d7b3dSmrg 225428d7b3dSmrg test_init(&test, argc, argv); 226428d7b3dSmrg 227428d7b3dSmrg for (i = 0; i <= DEFAULT_ITERATIONS; i++) { 228428d7b3dSmrg int reps = REPS(i), sets = SETS(i); 229428d7b3dSmrg enum target t; 230428d7b3dSmrg 231428d7b3dSmrg for (t = TARGET_FIRST; t <= TARGET_LAST; t++) { 232428d7b3dSmrg unclipped_tests(&test, reps, sets, t); 233428d7b3dSmrg simple_clip_tests(&test, reps, sets, t); 234428d7b3dSmrg complex_clip_tests(&test, reps, sets, t); 235428d7b3dSmrg } 236428d7b3dSmrg } 237428d7b3dSmrg 238428d7b3dSmrg return 0; 239428d7b3dSmrg} 240