Ticket #1837: rendertest1837.c

File rendertest1837.c, 3.2 KB (added by bernie, 7 years ago)
Line 
1/*
2 * Testcase for http://dev.laptop.org/ticket/1837
3 *
4 * Written by Bernardo Innocenti <bernie@codewiz.org>
5 * Based on xrenderbenchmark
6 *
7 * cc -g3 -O0 -Wall rendertest1837.c -o rendertest1837 -lXrender -lX11
8 */
9
10#include <X11/Xlib.h>
11#include <X11/Xutil.h>
12#include <X11/extensions/Xrender.h>
13
14#include <stdio.h>
15#include <stdlib.h>
16
17int        win_w = 600;
18int        win_h = 450;
19Display   *disp;
20Window     win;
21
22Window
23setup_window(Display *disp)
24{
25    XSetWindowAttributes att;
26    XClassHint *xch;
27
28    att.background_pixmap = None;
29    att.colormap = DefaultColormap(disp, DefaultScreen(disp));
30    att.border_pixel = 0;
31    att.event_mask =
32        ButtonPressMask |
33        ButtonReleaseMask |
34        EnterWindowMask |
35        LeaveWindowMask |
36        PointerMotionMask |
37        ExposureMask |
38        StructureNotifyMask |
39        KeyPressMask |
40        KeyReleaseMask;
41    win = XCreateWindow(disp, RootWindow(disp, DefaultScreen(disp)),
42                        0, 0, win_w, win_h, 0, DefaultDepth(disp, DefaultScreen(disp)),
43                        InputOutput, DefaultVisual(disp, DefaultScreen(disp)),
44                        CWColormap | CWBorderPixel | CWEventMask | CWBackPixmap,
45                        &att);
46    XStoreName(disp, win, "XRender Test");
47    xch = XAllocClassHint();
48    xch->res_name = "Main";
49    xch->res_class = "XRenderTest";
50    XSetClassHint(disp, win, xch);
51    XFree(xch);
52    XMapWindow(disp, win);
53    XSync(disp, False);
54    return win;
55}
56
57void draw(Display *disp, Picture dst,
58                        int  dst_x, int  dst_y,
59                        unsigned int width, unsigned int height)
60{
61    #define XF(x) ((x) * 65536)
62    Pixmap pixmap = XCreatePixmap (disp, win, 1, 1, 16);
63    GC gc = XCreateGC (disp, pixmap, 0, NULL);
64    XSetForeground (disp, gc, 0xFF);
65    XSetFillStyle (disp, gc, FillSolid);
66    XSetPlaneMask (disp, gc, ~0);
67    XFillRectangle (disp, pixmap, gc, 0, 0, 1, 1);
68    XRenderPictureAttributes pa;
69    pa.subwindow_mode = IncludeInferiors;
70    pa.repeat = 1;
71    Visual *vis = DefaultVisual (disp, DefaultScreen(disp));
72    Picture pic = XRenderCreatePicture (disp,
73             pixmap,
74             XRenderFindVisualFormat(disp, vis),
75             CPSubwindowMode | CPRepeat,
76             &pa);
77
78        const XTrapezoid traps[1] = {
79                {
80                        XF(dst_y),
81                        XF(dst_y + height),
82                        { { XF(dst_x + 100), XF(dst_y) }, { XF(dst_x + 200), XF(dst_y + 300) } },
83                        { { XF(dst_x + 180), XF(dst_y) }, { XF(dst_x + 350), XF(dst_y + height) } }
84                }
85        };
86        XRenderCompositeTrapezoids(disp, PictOpSrc, pic, dst,
87                        NULL, 0, 0, traps, 1);
88        XRenderFreePicture(disp, pic);
89        XFreeGC(disp, gc);
90        XFreePixmap(disp, pixmap);
91}
92
93void
94main_loop(Window win)
95{
96        Visual *vis = DefaultVisual(disp, DefaultScreen(disp));
97        XRenderPictFormat *fmt = XRenderFindVisualFormat(disp, vis);
98        XRenderPictureAttributes att;
99        Picture wpic = XRenderCreatePicture(disp, win, fmt, 0, &att);
100
101        for(;;)
102        {
103                int x = rand() % win_w;
104                int y = rand() % win_h;
105                int w = 100;
106                int h = 100;
107                draw(disp, wpic, x, y, w, h);
108        }
109
110        XRenderFreePicture(disp, wpic);
111}
112
113int
114main(int argc, char **argv)
115{
116    disp = XOpenDisplay(NULL);
117    if (!disp) {
118        fprintf(stderr, "Error: Cannot connect to display!\n");
119        exit(-1);
120    }
121    Window win = setup_window(disp);
122    main_loop(win);
123    return 0;
124}
125