kwo pushed a commit to branch master. http://git.enlightenment.org/legacy/imlib2.git/commit/?id=008e4e9fd4f98898a02523047d8369e14b9c9a51
commit 008e4e9fd4f98898a02523047d8369e14b9c9a51 Author: Kim Woelders <[email protected]> Date: Sun Nov 21 14:43:34 2021 +0100 test: Add X11 drawable grabbing test --- test/Makefile.am | 4 + test/test_grab.cpp | 317 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 321 insertions(+) diff --git a/test/Makefile.am b/test/Makefile.am index aa631af..c2017ff 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -10,6 +10,7 @@ CLEANFILES = file.c img_save-*.* GTESTS += test_load GTESTS += test_load_2 GTESTS += test_save + GTESTS += test_grab AM_CFLAGS = -Wall -Wextra -Werror -Wno-unused-parameter AM_CFLAGS += $(CFLAGS_ASAN) @@ -41,6 +42,9 @@ test_load_2_LDADD = $(LIBS) -lz test_save_SOURCES = test_save.cpp test_save_LDADD = $(LIBS) +test_grab_SOURCES = test_grab.cpp +test_grab_LDADD = $(LIBS) + TESTS_RUN = $(addprefix run-, $(GTESTS)) TEST_ENV = IMLIB2_LOADER_PATH=$(top_builddir)/src/modules/loaders/.libs diff --git a/test/test_grab.cpp b/test/test_grab.cpp new file mode 100644 index 0000000..1c4280c --- /dev/null +++ b/test/test_grab.cpp @@ -0,0 +1,317 @@ +#include <gtest/gtest.h> + +#include <X11/Xutil.h> +#include <Imlib2.h> + +typedef struct { + Display *dpy; + Window root; + Visual *vis; + Colormap cmap; + Visual *argb_vis; + Colormap argb_cmap; + int depth; + int scale; + const char *test; +} xd_t; + +static xd_t xd; +int debug = 0; + +#define D(...) if (debug) printf(__VA_ARGS__) +#define D2(...) if (debug > 1) printf(__VA_ARGS__) + +static Visual * +_x11_vis_argb(void) +{ + XVisualInfo *xvi, xvit; + int i, num; + Visual *vis; + + xvit.screen = DefaultScreen(xd.dpy); + xvit.depth = 32; + xvit.c_class = TrueColor; + + xvi = XGetVisualInfo(xd.dpy, + VisualScreenMask | VisualDepthMask | VisualClassMask, + &xvit, &num); + if (!xvi) + return NULL; + + for (i = 0; i < num; i++) + { + if (xvi[i].depth == 32) + break; + } + + vis = (i < num) ? xvi[i].visual : NULL; + + XFree(xvi); + + xd.argb_vis = vis; + xd.argb_cmap = XCreateColormap(xd.dpy, xd.root, vis, AllocNone); + + return vis; +} + +static void +_x11_init(int depth) +{ + xd.dpy = XOpenDisplay(NULL); + if (!xd.dpy) + { + fprintf(stderr, "Can't open display\n"); + exit(1); + } + + xd.root = DefaultRootWindow(xd.dpy); + if (depth == 32) + { + xd.vis = _x11_vis_argb(); + xd.cmap = xd.argb_cmap; + } + else + { + xd.vis = DefaultVisual(xd.dpy, DefaultScreen(xd.dpy)); + xd.cmap = DefaultColormap(xd.dpy, DefaultScreen(xd.dpy)); + } + + imlib_context_set_display(xd.dpy); + imlib_context_set_visual(xd.vis); + imlib_context_set_colormap(xd.cmap); +} + +static void +_x11_fini(void) +{ + XCloseDisplay(xd.dpy); +} + +static Pixmap +_pmap_mk_fill_solid(int w, int h, unsigned int color) +{ + XGCValues gcv; + GC gc; + Pixmap pmap; + + pmap = XCreatePixmap(xd.dpy, xd.root, w, h, xd.depth); + + gcv.foreground = color; + gcv.graphics_exposures = False; + gc = XCreateGC(xd.dpy, pmap, GCForeground | GCGraphicsExposures, &gcv); + + XFillRectangle(xd.dpy, pmap, gc, 0, 0, w, h); + + XFreeGC(xd.dpy, gc); + + return pmap; +} + +static void +_img_dump(Imlib_Image im, const char *file) +{ + static int seqn = 0; + char buf[1024]; + + snprintf(buf, sizeof(buf), file, seqn++); + imlib_context_set_image(im); + imlib_save_image(buf); +} + +DATA32 color = 0; + +static void +_test_grab_1(int w, int h, int x0, int y0) +{ + Imlib_Image im; + DATA32 *dptr, pix, col; + int x, y, err; + int xs, ys, ws, hs; + char buf[128]; + + xs = xd.scale > 0 ? xd.scale * x0 : x0; + ws = xd.scale > 0 ? xd.scale * w : w; +#if 0 + // FIXME - y scaling doesn't work + ys = xd.scale > 0 ? xd.scale * y0 : y0; + hs = xd.scale > 0 ? xd.scale * h : h; +#else + ys = y0; + hs = h; +#endif + + if (xd.scale == 0) + im = imlib_create_image_from_drawable(None, x0, y0, w, h, 0); + else + im = imlib_create_scaled_image_from_drawable(None, x0, y0, w, h, + ws, hs, 0, 0); + imlib_context_set_image(im); + snprintf(buf, sizeof(buf), "%s-%%d.png", xd.test); + _img_dump(im, buf); + + dptr = imlib_image_get_data_for_reading_only(); + err = 0; + for (y = 0; y < hs; y++) + { + for (x = 0; x < ws; x++) + { + pix = *dptr++; + if (xs + x < 0 || ys + y < 0 || xs + x >= ws || ys + y >= hs) + { +#if 1 + // FIXME - Pixels outside source drawable are not properly initialized + if (x0 != 0 || y0 != 0) + continue; +#endif + col = 0x00000000; // Use 0xff000000 if non-alpa + } + else + { + col = color; + } + if (pix != col) + { + D2("%3d,%3d (%3d,%3d): %08x != %08x\n", + x, y, x0, y0, pix, col); + err = 1; + } + } + } + + EXPECT_FALSE(err); + + imlib_free_image_and_decache(); +} + +static void +_test_grab_1(const char *test, int depth, int scale, int opt) +{ + Pixmap pmap; + int w, h, d; + + color = 0xffff0000; + + _x11_init(depth); + + xd.depth = depth; + xd.scale = scale; + xd.test = test; + + w = 32; + h = 45; + + pmap = _pmap_mk_fill_solid(w, h, color); + imlib_context_set_drawable(pmap); + + switch (opt) + { + case 0: + _test_grab_1(w, h, 0, 0); + break; + case 1: + d = 1; + _test_grab_1(w, h, -d, -d); + _test_grab_1(w, h, -d, d); + _test_grab_1(w, h, d, d); + _test_grab_1(w, h, d, -d); + break; + } + + XFreePixmap(xd.dpy, pmap); + + _x11_fini(); +} + +#define ENABLE_S2 1 + +TEST(GRAB, grab_noof_24_s0) +{ + _test_grab_1("grab_noof_24_s0", 24, 0, 0); +} + +TEST(GRAB, grab_noof_24_s1) +{ + _test_grab_1("grab_noof_24_s1", 24, 1, 0); +} + +#if ENABLE_S2 +TEST(GRAB, grab_noof_24_s2) +{ + _test_grab_1("grab_noof_24_s2", 24, 2, 0); +} +#endif + +TEST(GRAB, grab_noof_32_s0) +{ + _test_grab_1("grab_noof_32_s0", 32, 0, 0); +} + +TEST(GRAB, grab_noof_32_s1) +{ + _test_grab_1("grab_noof_32_s1", 32, 1, 0); +} + +#if ENABLE_S2 +TEST(GRAB, grab_noof_32_s2) +{ + _test_grab_1("grab_noof_32_s2", 32, 2, 0); +} +#endif + +TEST(GRAB, grab_offs_24_s0) +{ + _test_grab_1("grab_offs_24_s0", 24, 0, 1); +} + +TEST(GRAB, grab_offs_24_s1) +{ + _test_grab_1("grab_offs_24_s1", 24, 1, 1); +} + +#if ENABLE_S2 +TEST(GRAB, grab_offs_24_s2) +{ + _test_grab_1("grab_offs_24_s2", 24, 2, 1); +} +#endif + +TEST(GRAB, grab_offs_32_s0) +{ + _test_grab_1("grab_offs_32_s0", 32, 0, 1); +} + +TEST(GRAB, grab_offs_32_s1) +{ + _test_grab_1("grab_offs_32_s1", 32, 1, 1); +} + +#if ENABLE_S2 +TEST(GRAB, grab_offs_32_s2) +{ + _test_grab_1("grab_offs_32_s2", 32, 2, 1); +} +#endif + +int +main(int argc, char **argv) +{ + const char *s; + + ::testing::InitGoogleTest(&argc, argv); + + for (argc--, argv++; argc > 0; argc--, argv++) + { + s = argv[0]; + if (*s++ != '-') + break; + switch (*s) + { + case 'd': + while (*s++ == 'd') + debug++; + break; + } + } + + return RUN_ALL_TESTS(); +} --
