1428d7b3dSmrg#include <stdint.h> 2428d7b3dSmrg#include <stdio.h> 3428d7b3dSmrg#include <stdlib.h> 4428d7b3dSmrg 5428d7b3dSmrg#include <X11/Xutil.h> /* for XDestroyImage */ 6428d7b3dSmrg#include <pixman.h> /* for pixman blt functions */ 7428d7b3dSmrg 8428d7b3dSmrg#include "test.h" 9428d7b3dSmrg 10428d7b3dSmrgstatic const XPoint points[]= { 11428d7b3dSmrg /* top */ 12428d7b3dSmrg { 0, 0}, 13428d7b3dSmrg { 1, 0}, 14428d7b3dSmrg { 2, 0}, 15428d7b3dSmrg { 3, 0}, 16428d7b3dSmrg { 4, 0}, 17428d7b3dSmrg { 5, 0}, 18428d7b3dSmrg { 6, 0}, 19428d7b3dSmrg { 7, 0}, 20428d7b3dSmrg { 8, 0}, 21428d7b3dSmrg /* right */ 22428d7b3dSmrg { 8, 1}, 23428d7b3dSmrg { 8, 2}, 24428d7b3dSmrg { 8, 3}, 25428d7b3dSmrg { 8, 4}, 26428d7b3dSmrg { 8, 5}, 27428d7b3dSmrg { 8, 6}, 28428d7b3dSmrg { 8, 7}, 29428d7b3dSmrg { 8, 8}, 30428d7b3dSmrg /* bottom */ 31428d7b3dSmrg { 7, 8}, 32428d7b3dSmrg { 6, 8}, 33428d7b3dSmrg { 5, 8}, 34428d7b3dSmrg { 4, 8}, 35428d7b3dSmrg { 3, 8}, 36428d7b3dSmrg { 2, 8}, 37428d7b3dSmrg { 1, 8}, 38428d7b3dSmrg { 0, 8}, 39428d7b3dSmrg /* left */ 40428d7b3dSmrg { 0, 7}, 41428d7b3dSmrg { 0, 6}, 42428d7b3dSmrg { 0, 5}, 43428d7b3dSmrg { 0, 4}, 44428d7b3dSmrg { 0, 3}, 45428d7b3dSmrg { 0, 2}, 46428d7b3dSmrg { 0, 1}, 47428d7b3dSmrg { 0, 0} /* and origin again for luck */ 48428d7b3dSmrg}; 49428d7b3dSmrg#define NUM_POINTS (sizeof(points)/sizeof(points[0])) 50428d7b3dSmrg 51428d7b3dSmrgstatic void clear(struct test_display *dpy, struct test_target *tt) 52428d7b3dSmrg{ 53428d7b3dSmrg XRenderColor render_color = {0}; 54428d7b3dSmrg XRenderFillRectangle(dpy->dpy, PictOpClear, tt->picture, &render_color, 55428d7b3dSmrg 0, 0, tt->width, tt->height); 56428d7b3dSmrg} 57428d7b3dSmrg 58428d7b3dSmrgstatic void draw_line(struct test_display *dpy, struct test_target *tt, 59428d7b3dSmrg int alu, int width, int style, int cap, 60428d7b3dSmrg const XPoint *p1, const XPoint *p2, 61428d7b3dSmrg int dx, int dy) 62428d7b3dSmrg{ 63428d7b3dSmrg XGCValues val; 64428d7b3dSmrg GC gc; 65428d7b3dSmrg 66428d7b3dSmrg val.function = GXcopy; 67428d7b3dSmrg val.foreground = WhitePixel(dpy->dpy, 0); 68428d7b3dSmrg val.line_width = width; 69428d7b3dSmrg val.line_style = style; 70428d7b3dSmrg val.cap_style = cap; 71428d7b3dSmrg 72428d7b3dSmrg gc = XCreateGC(dpy->dpy, tt->draw, 73428d7b3dSmrg GCForeground | 74428d7b3dSmrg GCFunction | 75428d7b3dSmrg GCLineWidth | 76428d7b3dSmrg GCLineStyle | 77428d7b3dSmrg GCCapStyle, 78428d7b3dSmrg &val); 79428d7b3dSmrg XDrawLine(dpy->dpy, tt->draw, gc, 80428d7b3dSmrg p1->x + dx, p1->y + dy, 81428d7b3dSmrg p2->x + dx, p2->y + dy); 82428d7b3dSmrg XFreeGC(dpy->dpy, gc); 83428d7b3dSmrg} 84428d7b3dSmrg 85428d7b3dSmrgstatic void line_tests(struct test *t, enum target target) 86428d7b3dSmrg{ 87428d7b3dSmrg char buf[1024]; 88428d7b3dSmrg struct test_target out, ref; 89428d7b3dSmrg int a, b, alu, lw, style, cap; 90428d7b3dSmrg 91428d7b3dSmrg printf("Testing drawing of single line segments (%s): ", 92428d7b3dSmrg test_target_name(target)); 93428d7b3dSmrg fflush(stdout); 94428d7b3dSmrg 95428d7b3dSmrg test_target_create_render(&t->out, target, &out); 96428d7b3dSmrg test_target_create_render(&t->ref, target, &ref); 97428d7b3dSmrg 98428d7b3dSmrg style = LineSolid; 99428d7b3dSmrg 100428d7b3dSmrg for (alu = 0; alu < 16; alu++) { 101428d7b3dSmrg for (cap = CapNotLast; cap <= CapProjecting; cap++) { 102428d7b3dSmrg for (lw = 0; lw <= 4; lw++) { 103428d7b3dSmrg for (a = 0; a < NUM_POINTS; a++) { 104428d7b3dSmrg for (b = 0; b < NUM_POINTS; b++) { 105428d7b3dSmrg sprintf(buf, 106428d7b3dSmrg "p1=(%d, %d), p2=(%d, %d), width=%d, cap=%d, alu=%d", 107428d7b3dSmrg points[a].x, points[a].y, 108428d7b3dSmrg points[b].x, points[b].y, 109428d7b3dSmrg lw, cap, alu); 110428d7b3dSmrg 111428d7b3dSmrg clear(&t->out, &out); 112428d7b3dSmrg clear(&t->ref, &ref); 113428d7b3dSmrg 114428d7b3dSmrg draw_line(&t->out, &out, alu, lw, style, cap, 115428d7b3dSmrg &points[a], &points[b], 64, 64); 116428d7b3dSmrg draw_line(&t->ref, &ref, alu, lw, style, cap, 117428d7b3dSmrg &points[a], &points[b], 64, 64); 118428d7b3dSmrg 119428d7b3dSmrg test_compare(t, 120428d7b3dSmrg out.draw, out.format, 121428d7b3dSmrg ref.draw, ref.format, 122428d7b3dSmrg 0, 0, out.width, out.height, 123428d7b3dSmrg buf); 124428d7b3dSmrg } 125428d7b3dSmrg } 126428d7b3dSmrg } 127428d7b3dSmrg } 128428d7b3dSmrg } 129428d7b3dSmrg 130428d7b3dSmrg test_target_destroy_render(&t->out, &out); 131428d7b3dSmrg test_target_destroy_render(&t->ref, &ref); 132428d7b3dSmrg 133428d7b3dSmrg printf("\n"); 134428d7b3dSmrg} 135428d7b3dSmrg 136428d7b3dSmrgint main(int argc, char **argv) 137428d7b3dSmrg{ 138428d7b3dSmrg struct test test; 139428d7b3dSmrg enum target t; 140428d7b3dSmrg 141428d7b3dSmrg test_init(&test, argc, argv); 142428d7b3dSmrg 143428d7b3dSmrg for (t = TARGET_FIRST; t <= TARGET_LAST; t++) 144428d7b3dSmrg line_tests(&test, t); 145428d7b3dSmrg 146428d7b3dSmrg return 0; 147428d7b3dSmrg} 148