/* gcc -o repeat-test $(pkg-config --cflags --libs xrender cairo-xlib) repeat-test.c */ /* repeat-test * * This is a very simple test of the 4 repeat modes made available as * of version 0.10 of the X render extension. The 4 repeat modes are * tested with a simple 2x2 source being drawn with an offset to an * 8x8 destination. No other pattern transformation, (eg. rotation or * scale), is tested here. * * Copyright ? 2007 Red Hat, Inc. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, copy, * modify, merge, publish, distribute, sublicense, and/or sell copies * of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * Author: Carl Worth */ #define _GNU_SOURCE #include #include #include #include #include /* This cairo stuff is strictly optional. It could be easily stripped * out and the test would still be function. But it does makes it easy * to view the output. */ #include #define SIZE 32 #define NUM_REPEAT_MODES (RepeatReflect + 1) static const char* repeat_mode_name[NUM_REPEAT_MODES] = { "none" , "normal", "pad", "reflect" }; #define R 0x00FF0000 #define G 0x0000FF00 #define B 0x000000FF #define W 0x00FFFFFF uint32_t expected[NUM_REPEAT_MODES][SIZE * SIZE] = { { /* RepeatNone */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, R, R, R, R, G, G, G, G, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, R, R, R, R, G, G, G, G, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, R, R, R, R, G, G, G, G, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, R, R, R, R, G, G, G, G, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, B, B, B, B, W, W, W, W, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, B, B, B, B, W, W, W, W, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, B, B, B, B, W, W, W, W, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, B, B, B, B, W, W, W, W, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* RepeatNormal */ R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, R, R, R, R, G, G, G, G, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W, B, B, B, B, W, W, W, W }, { /* RepeatPad */ R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, G, G, G, G, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, W, W, W, W }, { /* RepeatReflect */ R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, B, B, B, B, W, W, W, W, W, W, W, W, B, B, B, B, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R, R, R, R, R, G, G, G, G, G, G, G, G, R, R, R, R }, }; int main (void) { Display *dpy; XRenderPictFormat *format; Pixmap source_pix, dest_pix; Picture source_pict, dest_pict; XRenderPictureAttributes pa; GC gc; int repeat; cairo_surface_t *surface; char *filename; int x, y, error; XImage *ximage; dpy = XOpenDisplay (NULL); if (dpy == NULL) { fprintf (stderr, "Error: Failed to open display: %s\n", XDisplayName(NULL)); return 1; } format = XRenderFindStandardFormat (dpy, PictStandardRGB24); if (format == NULL) { fprintf (stderr, "Error: X server does not have the Render extension.\n"); return 1; } source_pix = XCreatePixmap (dpy, DefaultRootWindow (dpy), 8, 8, format->depth); dest_pix = XCreatePixmap (dpy, DefaultRootWindow (dpy), SIZE, SIZE, format->depth); source_pict = XRenderCreatePicture (dpy, source_pix, format, 0, NULL); dest_pict = XRenderCreatePicture (dpy, dest_pix, format, 0, NULL); /* Set Carl's favorite RGBW checkerboard pattern into source. */ gc = XCreateGC (dpy, source_pix, 0, NULL); XSetForeground (dpy, gc, 0x00ff0000); XFillRectangle (dpy, source_pix, gc, 0, 0, 4, 4); XSetForeground (dpy, gc, 0x0000ff00); XFillRectangle (dpy, source_pix, gc, 4, 0, 4, 4); XSetForeground (dpy, gc, 0x000000ff); XFillRectangle (dpy, source_pix, gc, 0, 4, 4, 4); XSetForeground (dpy, gc, 0x00ffffff); XFillRectangle (dpy, source_pix, gc, 4, 4, 4, 4); XFreeGC (dpy, gc); /* Exercise each render repeat mode. */ for (repeat = RepeatNone; repeat < NUM_REPEAT_MODES; repeat++) { printf ("Testing repeat mode %s: ", repeat_mode_name[repeat]); pa.repeat = repeat; XRenderChangePicture (dpy, source_pict, CPRepeat, &pa); /* First set the destination to all black. */ gc = XCreateGC (dpy, dest_pix, 0, NULL); XSetForeground (dpy, gc, 0x00000000); XFillRectangle (dpy, dest_pix, gc, 0, 0, SIZE, SIZE); XFreeGC (dpy, gc); /* Then composite the repeating picture over it. */ XRenderComposite (dpy, PictOpOver, source_pict, None, dest_pict, - SIZE / 2, - SIZE /2, 0, 0, 0, 0, SIZE, SIZE); /* Verify the result against what's expected. */ error = 0; ximage = XGetImage (dpy, dest_pix, 0, 0, SIZE, SIZE, AllPlanes, ZPixmap); for (y=0; y < SIZE; y++) for (x=0; x < SIZE; x++) if (XGetPixel (ximage, x, y) != expected[repeat][SIZE * y + x]) error++; if (error) { printf ("*** FAIL ***\n\t%d pixels differ from expected result.\n", error); surface = cairo_image_surface_create_for_data ((unsigned char *) expected[repeat], CAIRO_FORMAT_RGB24, SIZE, SIZE, SIZE * 4); asprintf (&filename, "repeat-test-%s-expected.png", repeat_mode_name[repeat]); cairo_surface_write_to_png (surface, filename); printf ("\tExpected output written to %s\n", filename); free (filename); cairo_surface_destroy (surface); } else { printf ("PASS\n"); } surface = cairo_xlib_surface_create_with_xrender_format (dpy, dest_pix, DefaultScreenOfDisplay (dpy), format, SIZE, SIZE); asprintf (&filename, "repeat-test-%s-out.png", repeat_mode_name[repeat]); cairo_surface_write_to_png (surface, filename); if (error) printf ("\tActual output written to %s\n\n", filename); free (filename); cairo_surface_destroy (surface); } XRenderFreePicture (dpy, source_pict); XRenderFreePicture (dpy, dest_pict); XFreePixmap (dpy, source_pix); XFreePixmap (dpy, dest_pix); XCloseDisplay (dpy); return 0; }