summaryrefslogtreecommitdiff
path: root/dist/xcb-util/image
diff options
context:
space:
mode:
authorMatthieu Herrb <matthieu@cvs.openbsd.org>2009-05-23 14:38:22 +0000
committerMatthieu Herrb <matthieu@cvs.openbsd.org>2009-05-23 14:38:22 +0000
commit86bb951017acff65627eb198fe1fa4c73b46aad4 (patch)
tree18afd632e81d724b548b60373016d1459dfce5f3 /dist/xcb-util/image
parent013b4a3065ff281c23c32277f08a521fd7922c23 (diff)
import xcb-util 0.3.4
Diffstat (limited to 'dist/xcb-util/image')
-rw-r--r--dist/xcb-util/image/Makefile.am44
-rw-r--r--dist/xcb-util/image/Makefile.in784
-rw-r--r--dist/xcb-util/image/test_bitmap.c169
-rw-r--r--dist/xcb-util/image/test_formats.c202
-rw-r--r--dist/xcb-util/image/test_swap.c239
-rw-r--r--dist/xcb-util/image/test_xcb_image.c226
-rw-r--r--dist/xcb-util/image/test_xcb_image_shm.c183
-rw-r--r--dist/xcb-util/image/xcb-image.pc.in11
-rw-r--r--dist/xcb-util/image/xcb_image.c1009
-rw-r--r--dist/xcb-util/image/xcb_image.h630
-rw-r--r--dist/xcb-util/image/xcb_pixel.h171
11 files changed, 3668 insertions, 0 deletions
diff --git a/dist/xcb-util/image/Makefile.am b/dist/xcb-util/image/Makefile.am
new file mode 100644
index 000000000..a18b22874
--- /dev/null
+++ b/dist/xcb-util/image/Makefile.am
@@ -0,0 +1,44 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+lib_LTLIBRARIES = libxcb-image.la
+
+xcbinclude_HEADERS = xcb_image.h xcb_pixel.h
+
+AM_CFLAGS = $(CWARNFLAGS)
+
+XCB_IMAGE_LIBS = libxcb-image.la
+
+libxcb_image_la_SOURCES = xcb_image.c
+libxcb_image_la_CPPFLAGS = $(XCB_CFLAGS) $(XCB_SHM_CFLAGS) $(XCB_AUX_CFLAGS)
+libxcb_image_la_LIBADD = $(XCB_LIBS) $(XCB_SHM_LIBS) $(XCB_AUX_LIBS)
+
+pkgconfig_DATA = xcb-image.pc
+
+EXTRA_DIST=xcb-image.pc.in
+
+EXTRA_PROGRAMS = test_xcb_image test_xcb_image_shm test_formats test_bitmap
+
+check_PROGRAMS = test_swap
+
+TESTS=test_swap
+
+test_swap_SOURCES = test_swap.c
+test_swap_CPPFLAGS = $(XCB_CFLAGS) $(XCB_SHM_CFLAGS) $(XCB_AUX_CFLAGS)
+test_swap_LDADD = $(XCB_LIBS) $(XCB_AUX_LIBS) $(XCB_IMAGE_LIBS)
+
+test_xcb_image_SOURCES = test_xcb_image.c
+test_xcb_image_CPPFLAGS = $(XCB_CFLAGS) $(XCB_SHM_CFLAGS) $(XCB_AUX_CFLAGS)
+test_xcb_image_LDADD = $(XCB_LIBS) $(XCB_AUX_LIBS) $(XCB_IMAGE_LIBS)
+
+test_xcb_image_shm_SOURCES = test_xcb_image_shm.c
+test_xcb_image_shm_CPPFLAGS = $(XCB_CFLAGS) $(XCB_SHM_CFLAGS) $(XCB_AUX_CFLAGS)
+test_xcb_image_shm_LDADD = $(XCB_LIBS) $(XCB_SHM_LIBS) \
+ $(XCB_AUX_LIBS) $(XCB_IMAGE_LIBS)
+
+test_formats_SOURCES = test_formats.c
+test_formats_CPPFLAGS = $(XCB_CFLAGS) $(XCB_SHM_CFLAGS) $(XCB_AUX_CFLAGS)
+test_formats_LDADD = $(XCB_LIBS) $(XCB_AUX_LIBS) $(XCB_IMAGE_LIBS)
+
+test_bitmap_SOURCES = test_bitmap.c
+test_bitmap_CPPFLAGS = $(XCB_CFLAGS) $(XCB_SHM_CFLAGS) $(XCB_AUX_CFLAGS)
+test_bitmap_LDADD = $(XCB_LIBS) $(XCB_AUX_LIBS) $(XCB_IMAGE_LIBS)
diff --git a/dist/xcb-util/image/Makefile.in b/dist/xcb-util/image/Makefile.in
new file mode 100644
index 000000000..a244b36f2
--- /dev/null
+++ b/dist/xcb-util/image/Makefile.in
@@ -0,0 +1,784 @@
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+EXTRA_PROGRAMS = test_xcb_image$(EXEEXT) test_xcb_image_shm$(EXEEXT) \
+ test_formats$(EXEEXT) test_bitmap$(EXEEXT)
+check_PROGRAMS = test_swap$(EXEEXT)
+TESTS = test_swap$(EXEEXT)
+subdir = image
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/xcb-image.pc.in $(xcbinclude_HEADERS)
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = xcb-image.pc
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" \
+ "$(DESTDIR)$(xcbincludedir)"
+libLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libxcb_image_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libxcb_image_la_OBJECTS = libxcb_image_la-xcb_image.lo
+libxcb_image_la_OBJECTS = $(am_libxcb_image_la_OBJECTS)
+am_test_bitmap_OBJECTS = test_bitmap-test_bitmap.$(OBJEXT)
+test_bitmap_OBJECTS = $(am_test_bitmap_OBJECTS)
+test_bitmap_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(XCB_IMAGE_LIBS)
+am_test_formats_OBJECTS = test_formats-test_formats.$(OBJEXT)
+test_formats_OBJECTS = $(am_test_formats_OBJECTS)
+test_formats_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(XCB_IMAGE_LIBS)
+am_test_swap_OBJECTS = test_swap-test_swap.$(OBJEXT)
+test_swap_OBJECTS = $(am_test_swap_OBJECTS)
+test_swap_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(XCB_IMAGE_LIBS)
+am_test_xcb_image_OBJECTS = test_xcb_image-test_xcb_image.$(OBJEXT)
+test_xcb_image_OBJECTS = $(am_test_xcb_image_OBJECTS)
+test_xcb_image_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(XCB_IMAGE_LIBS)
+am_test_xcb_image_shm_OBJECTS = \
+ test_xcb_image_shm-test_xcb_image_shm.$(OBJEXT)
+test_xcb_image_shm_OBJECTS = $(am_test_xcb_image_shm_OBJECTS)
+test_xcb_image_shm_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) $(XCB_IMAGE_LIBS)
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+SOURCES = $(libxcb_image_la_SOURCES) $(test_bitmap_SOURCES) \
+ $(test_formats_SOURCES) $(test_swap_SOURCES) \
+ $(test_xcb_image_SOURCES) $(test_xcb_image_shm_SOURCES)
+DIST_SOURCES = $(libxcb_image_la_SOURCES) $(test_bitmap_SOURCES) \
+ $(test_formats_SOURCES) $(test_swap_SOURCES) \
+ $(test_xcb_image_SOURCES) $(test_xcb_image_shm_SOURCES)
+pkgconfigDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkgconfig_DATA)
+xcbincludeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(xcbinclude_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CWARNFLAGS = @CWARNFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GPERF = @GPERF@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+M4 = @M4@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+XCB_ATOM_CFLAGS = @XCB_ATOM_CFLAGS@
+XCB_ATOM_LIBS = @XCB_ATOM_LIBS@
+XCB_AUX_CFLAGS = @XCB_AUX_CFLAGS@
+XCB_AUX_LIBS = @XCB_AUX_LIBS@
+XCB_CFLAGS = @XCB_CFLAGS@
+XCB_EVENT_CFLAGS = @XCB_EVENT_CFLAGS@
+XCB_EVENT_LIBS = @XCB_EVENT_LIBS@
+XCB_ICCCM_CFLAGS = @XCB_ICCCM_CFLAGS@
+XCB_ICCCM_LIBS = @XCB_ICCCM_LIBS@
+XCB_LIBS = @XCB_LIBS@
+XCB_PROPERTY_CFLAGS = @XCB_PROPERTY_CFLAGS@
+XCB_PROPERTY_LIBS = @XCB_PROPERTY_LIBS@
+XCB_RENDER_CFLAGS = @XCB_RENDER_CFLAGS@
+XCB_RENDER_LIBS = @XCB_RENDER_LIBS@
+XCB_SHM_CFLAGS = @XCB_SHM_CFLAGS@
+XCB_SHM_LIBS = @XCB_SHM_LIBS@
+XPROTO_CFLAGS = @XPROTO_CFLAGS@
+XPROTO_LIBS = @XPROTO_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+xcbincludedir = @xcbincludedir@
+MAINTAINERCLEANFILES = Makefile.in
+lib_LTLIBRARIES = libxcb-image.la
+xcbinclude_HEADERS = xcb_image.h xcb_pixel.h
+AM_CFLAGS = $(CWARNFLAGS)
+XCB_IMAGE_LIBS = libxcb-image.la
+libxcb_image_la_SOURCES = xcb_image.c
+libxcb_image_la_CPPFLAGS = $(XCB_CFLAGS) $(XCB_SHM_CFLAGS) $(XCB_AUX_CFLAGS)
+libxcb_image_la_LIBADD = $(XCB_LIBS) $(XCB_SHM_LIBS) $(XCB_AUX_LIBS)
+pkgconfig_DATA = xcb-image.pc
+EXTRA_DIST = xcb-image.pc.in
+test_swap_SOURCES = test_swap.c
+test_swap_CPPFLAGS = $(XCB_CFLAGS) $(XCB_SHM_CFLAGS) $(XCB_AUX_CFLAGS)
+test_swap_LDADD = $(XCB_LIBS) $(XCB_AUX_LIBS) $(XCB_IMAGE_LIBS)
+test_xcb_image_SOURCES = test_xcb_image.c
+test_xcb_image_CPPFLAGS = $(XCB_CFLAGS) $(XCB_SHM_CFLAGS) $(XCB_AUX_CFLAGS)
+test_xcb_image_LDADD = $(XCB_LIBS) $(XCB_AUX_LIBS) $(XCB_IMAGE_LIBS)
+test_xcb_image_shm_SOURCES = test_xcb_image_shm.c
+test_xcb_image_shm_CPPFLAGS = $(XCB_CFLAGS) $(XCB_SHM_CFLAGS) $(XCB_AUX_CFLAGS)
+test_xcb_image_shm_LDADD = $(XCB_LIBS) $(XCB_SHM_LIBS) \
+ $(XCB_AUX_LIBS) $(XCB_IMAGE_LIBS)
+
+test_formats_SOURCES = test_formats.c
+test_formats_CPPFLAGS = $(XCB_CFLAGS) $(XCB_SHM_CFLAGS) $(XCB_AUX_CFLAGS)
+test_formats_LDADD = $(XCB_LIBS) $(XCB_AUX_LIBS) $(XCB_IMAGE_LIBS)
+test_bitmap_SOURCES = test_bitmap.c
+test_bitmap_CPPFLAGS = $(XCB_CFLAGS) $(XCB_SHM_CFLAGS) $(XCB_AUX_CFLAGS)
+test_bitmap_LDADD = $(XCB_LIBS) $(XCB_AUX_LIBS) $(XCB_IMAGE_LIBS)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign image/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign image/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+xcb-image.pc: $(top_builddir)/config.status $(srcdir)/xcb-image.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libxcb-image.la: $(libxcb_image_la_OBJECTS) $(libxcb_image_la_DEPENDENCIES)
+ $(LINK) -rpath $(libdir) $(libxcb_image_la_OBJECTS) $(libxcb_image_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+test_bitmap$(EXEEXT): $(test_bitmap_OBJECTS) $(test_bitmap_DEPENDENCIES)
+ @rm -f test_bitmap$(EXEEXT)
+ $(LINK) $(test_bitmap_OBJECTS) $(test_bitmap_LDADD) $(LIBS)
+test_formats$(EXEEXT): $(test_formats_OBJECTS) $(test_formats_DEPENDENCIES)
+ @rm -f test_formats$(EXEEXT)
+ $(LINK) $(test_formats_OBJECTS) $(test_formats_LDADD) $(LIBS)
+test_swap$(EXEEXT): $(test_swap_OBJECTS) $(test_swap_DEPENDENCIES)
+ @rm -f test_swap$(EXEEXT)
+ $(LINK) $(test_swap_OBJECTS) $(test_swap_LDADD) $(LIBS)
+test_xcb_image$(EXEEXT): $(test_xcb_image_OBJECTS) $(test_xcb_image_DEPENDENCIES)
+ @rm -f test_xcb_image$(EXEEXT)
+ $(LINK) $(test_xcb_image_OBJECTS) $(test_xcb_image_LDADD) $(LIBS)
+test_xcb_image_shm$(EXEEXT): $(test_xcb_image_shm_OBJECTS) $(test_xcb_image_shm_DEPENDENCIES)
+ @rm -f test_xcb_image_shm$(EXEEXT)
+ $(LINK) $(test_xcb_image_shm_OBJECTS) $(test_xcb_image_shm_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libxcb_image_la-xcb_image.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_bitmap-test_bitmap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_formats-test_formats.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_swap-test_swap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_xcb_image-test_xcb_image.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_xcb_image_shm-test_xcb_image_shm.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+libxcb_image_la-xcb_image.lo: xcb_image.c
+@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxcb_image_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libxcb_image_la-xcb_image.lo -MD -MP -MF $(DEPDIR)/libxcb_image_la-xcb_image.Tpo -c -o libxcb_image_la-xcb_image.lo `test -f 'xcb_image.c' || echo '$(srcdir)/'`xcb_image.c
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libxcb_image_la-xcb_image.Tpo $(DEPDIR)/libxcb_image_la-xcb_image.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='xcb_image.c' object='libxcb_image_la-xcb_image.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libxcb_image_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libxcb_image_la-xcb_image.lo `test -f 'xcb_image.c' || echo '$(srcdir)/'`xcb_image.c
+
+test_bitmap-test_bitmap.o: test_bitmap.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_bitmap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_bitmap-test_bitmap.o -MD -MP -MF $(DEPDIR)/test_bitmap-test_bitmap.Tpo -c -o test_bitmap-test_bitmap.o `test -f 'test_bitmap.c' || echo '$(srcdir)/'`test_bitmap.c
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/test_bitmap-test_bitmap.Tpo $(DEPDIR)/test_bitmap-test_bitmap.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test_bitmap.c' object='test_bitmap-test_bitmap.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_bitmap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_bitmap-test_bitmap.o `test -f 'test_bitmap.c' || echo '$(srcdir)/'`test_bitmap.c
+
+test_bitmap-test_bitmap.obj: test_bitmap.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_bitmap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_bitmap-test_bitmap.obj -MD -MP -MF $(DEPDIR)/test_bitmap-test_bitmap.Tpo -c -o test_bitmap-test_bitmap.obj `if test -f 'test_bitmap.c'; then $(CYGPATH_W) 'test_bitmap.c'; else $(CYGPATH_W) '$(srcdir)/test_bitmap.c'; fi`
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/test_bitmap-test_bitmap.Tpo $(DEPDIR)/test_bitmap-test_bitmap.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test_bitmap.c' object='test_bitmap-test_bitmap.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_bitmap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_bitmap-test_bitmap.obj `if test -f 'test_bitmap.c'; then $(CYGPATH_W) 'test_bitmap.c'; else $(CYGPATH_W) '$(srcdir)/test_bitmap.c'; fi`
+
+test_formats-test_formats.o: test_formats.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_formats_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_formats-test_formats.o -MD -MP -MF $(DEPDIR)/test_formats-test_formats.Tpo -c -o test_formats-test_formats.o `test -f 'test_formats.c' || echo '$(srcdir)/'`test_formats.c
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/test_formats-test_formats.Tpo $(DEPDIR)/test_formats-test_formats.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test_formats.c' object='test_formats-test_formats.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_formats_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_formats-test_formats.o `test -f 'test_formats.c' || echo '$(srcdir)/'`test_formats.c
+
+test_formats-test_formats.obj: test_formats.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_formats_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_formats-test_formats.obj -MD -MP -MF $(DEPDIR)/test_formats-test_formats.Tpo -c -o test_formats-test_formats.obj `if test -f 'test_formats.c'; then $(CYGPATH_W) 'test_formats.c'; else $(CYGPATH_W) '$(srcdir)/test_formats.c'; fi`
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/test_formats-test_formats.Tpo $(DEPDIR)/test_formats-test_formats.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test_formats.c' object='test_formats-test_formats.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_formats_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_formats-test_formats.obj `if test -f 'test_formats.c'; then $(CYGPATH_W) 'test_formats.c'; else $(CYGPATH_W) '$(srcdir)/test_formats.c'; fi`
+
+test_swap-test_swap.o: test_swap.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_swap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_swap-test_swap.o -MD -MP -MF $(DEPDIR)/test_swap-test_swap.Tpo -c -o test_swap-test_swap.o `test -f 'test_swap.c' || echo '$(srcdir)/'`test_swap.c
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/test_swap-test_swap.Tpo $(DEPDIR)/test_swap-test_swap.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test_swap.c' object='test_swap-test_swap.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_swap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_swap-test_swap.o `test -f 'test_swap.c' || echo '$(srcdir)/'`test_swap.c
+
+test_swap-test_swap.obj: test_swap.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_swap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_swap-test_swap.obj -MD -MP -MF $(DEPDIR)/test_swap-test_swap.Tpo -c -o test_swap-test_swap.obj `if test -f 'test_swap.c'; then $(CYGPATH_W) 'test_swap.c'; else $(CYGPATH_W) '$(srcdir)/test_swap.c'; fi`
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/test_swap-test_swap.Tpo $(DEPDIR)/test_swap-test_swap.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test_swap.c' object='test_swap-test_swap.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_swap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_swap-test_swap.obj `if test -f 'test_swap.c'; then $(CYGPATH_W) 'test_swap.c'; else $(CYGPATH_W) '$(srcdir)/test_swap.c'; fi`
+
+test_xcb_image-test_xcb_image.o: test_xcb_image.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_xcb_image_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_xcb_image-test_xcb_image.o -MD -MP -MF $(DEPDIR)/test_xcb_image-test_xcb_image.Tpo -c -o test_xcb_image-test_xcb_image.o `test -f 'test_xcb_image.c' || echo '$(srcdir)/'`test_xcb_image.c
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/test_xcb_image-test_xcb_image.Tpo $(DEPDIR)/test_xcb_image-test_xcb_image.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test_xcb_image.c' object='test_xcb_image-test_xcb_image.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_xcb_image_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_xcb_image-test_xcb_image.o `test -f 'test_xcb_image.c' || echo '$(srcdir)/'`test_xcb_image.c
+
+test_xcb_image-test_xcb_image.obj: test_xcb_image.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_xcb_image_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_xcb_image-test_xcb_image.obj -MD -MP -MF $(DEPDIR)/test_xcb_image-test_xcb_image.Tpo -c -o test_xcb_image-test_xcb_image.obj `if test -f 'test_xcb_image.c'; then $(CYGPATH_W) 'test_xcb_image.c'; else $(CYGPATH_W) '$(srcdir)/test_xcb_image.c'; fi`
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/test_xcb_image-test_xcb_image.Tpo $(DEPDIR)/test_xcb_image-test_xcb_image.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test_xcb_image.c' object='test_xcb_image-test_xcb_image.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_xcb_image_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_xcb_image-test_xcb_image.obj `if test -f 'test_xcb_image.c'; then $(CYGPATH_W) 'test_xcb_image.c'; else $(CYGPATH_W) '$(srcdir)/test_xcb_image.c'; fi`
+
+test_xcb_image_shm-test_xcb_image_shm.o: test_xcb_image_shm.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_xcb_image_shm_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_xcb_image_shm-test_xcb_image_shm.o -MD -MP -MF $(DEPDIR)/test_xcb_image_shm-test_xcb_image_shm.Tpo -c -o test_xcb_image_shm-test_xcb_image_shm.o `test -f 'test_xcb_image_shm.c' || echo '$(srcdir)/'`test_xcb_image_shm.c
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/test_xcb_image_shm-test_xcb_image_shm.Tpo $(DEPDIR)/test_xcb_image_shm-test_xcb_image_shm.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test_xcb_image_shm.c' object='test_xcb_image_shm-test_xcb_image_shm.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_xcb_image_shm_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_xcb_image_shm-test_xcb_image_shm.o `test -f 'test_xcb_image_shm.c' || echo '$(srcdir)/'`test_xcb_image_shm.c
+
+test_xcb_image_shm-test_xcb_image_shm.obj: test_xcb_image_shm.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_xcb_image_shm_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_xcb_image_shm-test_xcb_image_shm.obj -MD -MP -MF $(DEPDIR)/test_xcb_image_shm-test_xcb_image_shm.Tpo -c -o test_xcb_image_shm-test_xcb_image_shm.obj `if test -f 'test_xcb_image_shm.c'; then $(CYGPATH_W) 'test_xcb_image_shm.c'; else $(CYGPATH_W) '$(srcdir)/test_xcb_image_shm.c'; fi`
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/test_xcb_image_shm-test_xcb_image_shm.Tpo $(DEPDIR)/test_xcb_image_shm-test_xcb_image_shm.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test_xcb_image_shm.c' object='test_xcb_image_shm-test_xcb_image_shm.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_xcb_image_shm_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_xcb_image_shm-test_xcb_image_shm.obj `if test -f 'test_xcb_image_shm.c'; then $(CYGPATH_W) 'test_xcb_image_shm.c'; else $(CYGPATH_W) '$(srcdir)/test_xcb_image_shm.c'; fi`
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-pkgconfigDATA: $(pkgconfig_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)"
+ @list='$(pkgconfig_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkgconfigDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgconfigdir)/$$f'"; \
+ $(pkgconfigDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgconfigdir)/$$f"; \
+ done
+
+uninstall-pkgconfigDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkgconfig_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkgconfigdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkgconfigdir)/$$f"; \
+ done
+install-xcbincludeHEADERS: $(xcbinclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(xcbincludedir)" || $(MKDIR_P) "$(DESTDIR)$(xcbincludedir)"
+ @list='$(xcbinclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(xcbincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(xcbincludedir)/$$f'"; \
+ $(xcbincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(xcbincludedir)/$$f"; \
+ done
+
+uninstall-xcbincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(xcbinclude_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(xcbincludedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(xcbincludedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list=' $(TESTS) '; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$tst[\ \ ]*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$tst[\ \ ]*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$all" -eq 1; then \
+ tests="test"; \
+ All=""; \
+ else \
+ tests="tests"; \
+ All="All "; \
+ fi; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="$$All$$all $$tests passed"; \
+ else \
+ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all $$tests failed"; \
+ else \
+ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ if test "$$skip" -eq 1; then \
+ skipped="($$skip test was not run)"; \
+ else \
+ skipped="($$skip tests were not run)"; \
+ fi; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(xcbincludedir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
+ clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pkgconfigDATA install-xcbincludeHEADERS
+
+install-dvi: install-dvi-am
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-libLTLIBRARIES uninstall-pkgconfigDATA \
+ uninstall-xcbincludeHEADERS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
+ clean-libtool ctags distclean distclean-compile \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-libLTLIBRARIES \
+ install-man install-pdf install-pdf-am install-pkgconfigDATA \
+ install-ps install-ps-am install-strip \
+ install-xcbincludeHEADERS installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
+ uninstall-am uninstall-libLTLIBRARIES uninstall-pkgconfigDATA \
+ uninstall-xcbincludeHEADERS
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/dist/xcb-util/image/test_bitmap.c b/dist/xcb-util/image/test_bitmap.c
new file mode 100644
index 000000000..3464743e4
--- /dev/null
+++ b/dist/xcb-util/image/test_bitmap.c
@@ -0,0 +1,169 @@
+/*
+ * Copyright © 2008 Bart Massey <bart@cs.pdx.edu>
+ * Copyright © 2008 Julien Danjou <julien@danjou.info>
+ *
+ * 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 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.
+ *
+ * Except as contained in this notice, the names of the authors or
+ * their institutions shall not be used in advertising or otherwise to
+ * promote the sale, use or other dealings in this Software without
+ * prior written authorization from the authors.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <xcb/xcb.h>
+#include "../aux/xcb_aux.h"
+#include "../event/xcb_event.h"
+#include "xcb_image.h"
+
+#include "test.xbm"
+
+static xcb_window_t make_window(xcb_connection_t *c,
+ xcb_screen_t *s,
+ uint32_t bg,
+ uint32_t fg,
+ uint32_t width,
+ uint32_t height) {
+ uint32_t mask = 0;
+ xcb_params_cw_t cwa;
+ xcb_window_t w;
+ xcb_void_cookie_t check_cookie;
+ xcb_generic_error_t *error;
+ xcb_visualtype_t *v = xcb_aux_find_visual_by_id(s, s->root_visual);
+ assert(v);
+ XCB_AUX_ADD_PARAM(&mask, &cwa, back_pixel, bg);
+ XCB_AUX_ADD_PARAM(&mask, &cwa, border_pixel, fg);
+ XCB_AUX_ADD_PARAM(&mask, &cwa, override_redirect, 1);
+ XCB_AUX_ADD_PARAM(&mask, &cwa, event_mask,
+ XCB_EVENT_MASK_BUTTON_PRESS |
+ XCB_EVENT_MASK_EXPOSURE);
+ w = xcb_generate_id(c);
+ check_cookie = xcb_aux_create_window_checked(c,
+ s->root_depth, w, s->root, 0, 0, width, height, 1,
+ XCB_WINDOW_CLASS_INPUT_OUTPUT, v->visual_id, mask, &cwa);
+ error = xcb_request_check(c, check_cookie);
+ assert(!error);
+ check_cookie = xcb_map_window_checked(c, w);
+ error = xcb_request_check(c, check_cookie);
+ assert(!error);
+ return w;
+}
+
+void process_events(xcb_connection_t *c,
+ xcb_gcontext_t g,
+ xcb_window_t w,
+ xcb_pixmap_t p,
+ uint32_t width,
+ uint32_t height) {
+ xcb_generic_event_t *e;
+ xcb_void_cookie_t cookie;
+
+ while ((e = xcb_wait_for_event(c))) {
+ uint32_t r = XCB_EVENT_RESPONSE_TYPE(e);
+ xcb_generic_error_t *err;
+
+ fprintf(stderr, "event %d\n", r);
+ switch (r) {
+ case XCB_EXPOSE:
+ case XCB_MAP_NOTIFY:
+ cookie = xcb_copy_area_checked(c, p, w, g,
+ 0, 0, 0, 0,
+ width, height);
+ assert(!xcb_request_check(c, cookie));
+ break;
+ case XCB_BUTTON_PRESS:
+ exit(0);
+ break;
+ case 0:
+ err = (xcb_generic_error_t *) e;
+ printf("error: %d (sequence %d)\n",
+ err->error_code, (unsigned int) err->full_sequence);
+ exit(1);
+ default:
+ break;
+ }
+ free(e);
+ }
+}
+
+#define INSET_X 31
+#define INSET_Y 32
+
+int main(int argc, char **argv) {
+ uint32_t width = test_width - 2 * INSET_X;
+ uint32_t height = test_height - 2 * INSET_Y;
+ int snum;
+ xcb_void_cookie_t check_cookie;
+ xcb_window_t w;
+ xcb_gcontext_t gc;
+ xcb_pixmap_t pix;
+ xcb_connection_t *c = xcb_connect(0, &snum);
+ xcb_screen_t *s = xcb_aux_get_screen(c, snum);
+ xcb_alloc_named_color_cookie_t bg_cookie =
+ xcb_alloc_named_color(c, s->default_colormap,
+ strlen("white"), "white");
+ xcb_alloc_named_color_cookie_t fg_cookie =
+ xcb_alloc_named_color(c, s->default_colormap,
+ strlen("black"), "black");
+ xcb_alloc_named_color_reply_t *bg_reply =
+ xcb_alloc_named_color_reply(c, bg_cookie, 0);
+ xcb_alloc_named_color_reply_t *fg_reply =
+ xcb_alloc_named_color_reply(c, fg_cookie, 0);
+ uint32_t fg, bg;
+ xcb_image_t *image, *native_image, *subimage;
+ uint32_t mask = 0;
+ xcb_params_gc_t gcv;
+
+ assert(bg_reply && fg_reply);
+ bg = bg_reply->pixel;
+ fg = fg_reply->pixel;
+ free(bg_reply);
+ free(fg_reply);
+ w = make_window(c, s, bg, fg, width, height);
+ gc = xcb_generate_id(c);
+ check_cookie = xcb_create_gc_checked(c, gc, w, 0, 0);
+ assert(!xcb_request_check(c, check_cookie));
+ image = xcb_image_create_from_bitmap_data((uint8_t *)test_bits,
+ test_width, test_height);
+ native_image = xcb_image_native(c, image, 1);
+ assert(native_image);
+ if (native_image != image)
+ xcb_image_destroy(image);
+ subimage = xcb_image_subimage(native_image, INSET_X, INSET_Y,
+ width, height,
+ 0, 0, 0);
+ assert(subimage);
+ xcb_image_destroy(native_image);
+ subimage->format = XCB_IMAGE_FORMAT_XY_BITMAP;
+ pix = xcb_generate_id(c);
+ xcb_create_pixmap(c, s->root_depth, pix, w,
+ subimage->width, subimage->height);
+ gc = xcb_generate_id(c);
+ XCB_AUX_ADD_PARAM(&mask, &gcv, foreground, fg);
+ XCB_AUX_ADD_PARAM(&mask, &gcv, background, bg);
+ xcb_aux_create_gc(c, gc, pix, mask, &gcv);
+ xcb_image_put(c, pix, gc, subimage, 0, 0, 0);
+ process_events(c, gc, w, pix, width, height);
+ xcb_disconnect(c);
+ return 1;
+}
diff --git a/dist/xcb-util/image/test_formats.c b/dist/xcb-util/image/test_formats.c
new file mode 100644
index 000000000..be3b217e9
--- /dev/null
+++ b/dist/xcb-util/image/test_formats.c
@@ -0,0 +1,202 @@
+/*
+ * Copyright © 2008 Bart Massey <bart@cs.pdx.edu>
+ *
+ * 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 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.
+ *
+ * Except as contained in this notice, the names of the authors or
+ * their institutions shall not be used in advertising or otherwise to
+ * promote the sale, use or other dealings in this Software without
+ * prior written authorization from the authors.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <xcb/xcb.h>
+#include "../aux/xcb_aux.h"
+#include "../aux/xcb_bitops.h"
+#include "xcb_image.h"
+
+#define WIDTH 50
+#define HEIGHT 50
+
+static uint32_t
+color (uint32_t depth, uint32_t x, uint32_t y)
+{
+ uint32_t p;
+
+ if (depth == 1) {
+ extern long random();
+ int frac = random() % (WIDTH * HEIGHT);
+ p = x * y >= frac;
+ return p;
+ }
+ depth /= 3;
+ p = ((1 << depth) - 1) * x * y / WIDTH / HEIGHT;
+ return (p << depth) | (p << (2 * depth));
+}
+
+static xcb_image_t *create_image(xcb_connection_t *c, int depth, int format)
+{
+ xcb_image_t *im;
+ int x, y;
+ printf("Image depth %d, format %d\n", depth, format);
+ im = xcb_image_create_native(c, WIDTH, HEIGHT,
+ format, depth, 0, 0, 0);
+ for(x = 0; x < WIDTH; ++x)
+ for(y = 0; y < HEIGHT; ++y)
+ xcb_image_put_pixel(im, x, y, color(depth, x, y));
+ return im;
+}
+
+static xcb_window_t create_window(xcb_connection_t *c, xcb_screen_t *root)
+{
+ static const uint32_t mask = XCB_CW_EVENT_MASK;
+ static const uint32_t values[] = { XCB_EVENT_MASK_EXPOSURE };
+ unsigned int seq;
+ xcb_window_t w = xcb_generate_id(c);
+ seq = xcb_create_window(c, root->root_depth, w, root->root, 30, 30, WIDTH, HEIGHT, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, root->root_visual, mask, values).sequence;
+ printf("CreateWindow sequence %d, depth %d\n", seq, root->root_depth);
+ seq = xcb_map_window(c, w).sequence;
+ printf("MapWindow sequence %d\n", seq);
+ return w;
+}
+
+static xcb_pixmap_t create_pixmap(xcb_connection_t *c, xcb_drawable_t d, uint8_t depth)
+{
+ xcb_pixmap_t p = xcb_generate_id(c);
+ unsigned int seq;
+ seq = xcb_create_pixmap(c, depth, p, d, WIDTH, HEIGHT).sequence;
+ printf("CreatePixmap sequence %d, depth %d\n", seq, depth);
+ return p;
+}
+
+static xcb_gcontext_t create_gcontext(xcb_connection_t *c,
+ xcb_drawable_t d,
+ xcb_screen_t *root)
+{
+ static const uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND;
+ const uint32_t values[] = { root->black_pixel, 0xffff };
+ unsigned int seq;
+ xcb_gcontext_t gc = xcb_generate_id(c);
+ seq = xcb_create_gc(c, gc, d, mask, values).sequence;
+ printf("CreateGC sequence %d\n", seq);
+ return gc;
+}
+
+
+typedef struct {
+ char *name;
+ xcb_image_format_t format;
+ uint8_t depth;
+} format_t;
+
+static format_t formats[] = {
+ {"z-pixmap", XCB_IMAGE_FORMAT_Z_PIXMAP, 24},
+ {"xy-bitmap", XCB_IMAGE_FORMAT_XY_BITMAP, 1},
+ {"xy-pixmap-1", XCB_IMAGE_FORMAT_XY_PIXMAP, 1},
+ {"xy-pixmap-24", XCB_IMAGE_FORMAT_XY_PIXMAP, 24},
+ {0, 0, 0}
+};
+
+static format_t *
+parse_format (char *name) {
+ format_t *f;
+ for (f = formats; f->name; f++)
+ if (!strcmp(name, f->name))
+ return f;
+ fprintf(stderr, "%s: bad format: known formats are:\n", name);
+ for (f = formats; f->name; f++)
+ fprintf(stderr, "\t%s\n", f->name);
+ exit(1);
+}
+
+int main(int argc, char **argv)
+{
+ int screen, depth;
+ format_t *format = &formats[0];
+ xcb_screen_t *root;
+ xcb_visualtype_t *visual;
+ xcb_image_t *im;
+ xcb_drawable_t d, w = XCB_NONE;
+ xcb_gcontext_t dgc, wgc = 0;
+ xcb_generic_event_t *ev;
+ xcb_connection_t *c = xcb_connect(0, &screen);
+ if(!c)
+ {
+ printf("Connection failed.\n");
+ exit(1);
+ }
+ root = xcb_aux_get_screen(c, screen);
+ assert(root);
+ visual = xcb_aux_find_visual_by_id(root, root->root_visual);
+ assert(visual);
+ if(argc > 1)
+ format = parse_format(argv[1]);
+ if (root->root_depth != 24 ||
+ visual->_class != XCB_VISUAL_CLASS_TRUE_COLOR)
+ {
+ printf("Only 24 bit TrueColor visuals for now\n");
+ exit(1);
+ }
+ depth = format->depth;
+
+ im = create_image(c, depth, format->format);
+ d = create_window(c, root);
+ if(format->format == XCB_IMAGE_FORMAT_XY_PIXMAP && depth == 1)
+ {
+ w = d;
+ d = create_pixmap(c, w, depth);
+ }
+ dgc = create_gcontext(c, d, root);
+ if (w)
+ wgc = create_gcontext(c, w, root);
+ xcb_flush(c);
+
+ if(im)
+ {
+ while((ev = xcb_wait_for_event(c)))
+ {
+ if(ev->response_type == XCB_EXPOSE && ((xcb_expose_event_t *) ev)->count == 0)
+ {
+ printf("ImagePut sequence %d\n", xcb_image_put(c, d, dgc, im, 0, 0, 0).sequence);
+ if(w)
+ {
+ unsigned int seq;
+ seq = xcb_copy_plane(c, d, w, wgc,
+ 0, 0, 0, 0,
+ WIDTH, HEIGHT, 1).sequence;
+ printf("CopyPlane sequence %d\n", seq);
+ }
+ xcb_flush(c);
+ }
+ else if(ev->response_type == 0)
+ {
+ xcb_generic_error_t *err = (xcb_generic_error_t *) ev;
+ printf("Error: %d after sequence %d\n", err->error_code, (unsigned int) err->full_sequence);
+ }
+ free(ev);
+ }
+ xcb_image_destroy(im);
+ }
+
+ xcb_disconnect(c);
+ exit(0);
+}
diff --git a/dist/xcb-util/image/test_swap.c b/dist/xcb-util/image/test_swap.c
new file mode 100644
index 000000000..becf26b00
--- /dev/null
+++ b/dist/xcb-util/image/test_swap.c
@@ -0,0 +1,239 @@
+/*
+ * Copyright © 2008 Keith Packard <keithp@keithp.com>
+ *
+ * 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 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.
+ *
+ * Except as contained in this notice, the names of the authors or
+ * their institutions shall not be used in advertising or otherwise to
+ * promote the sale, use or other dealings in this Software without
+ * prior written authorization from the authors.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <xcb/xcb.h>
+#include "../aux/xcb_aux.h"
+#include "xcb_image.h"
+
+xcb_image_format_t formats[] = {
+ XCB_IMAGE_FORMAT_Z_PIXMAP,
+ XCB_IMAGE_FORMAT_XY_PIXMAP,
+ XCB_IMAGE_FORMAT_XY_BITMAP,
+};
+#define SIZE(a) (sizeof (a) / sizeof (a[0]))
+#define NFORMAT SIZE(formats)
+
+int bpps[] = {
+ 1, 4, 8, 16, 32
+};
+#define NBPP SIZE(bpps)
+
+int units[] = {
+ 8, 16, 32
+};
+#define NUNIT SIZE(units)
+
+xcb_image_order_t byte_orders[] = {
+ XCB_IMAGE_ORDER_LSB_FIRST,
+ XCB_IMAGE_ORDER_MSB_FIRST
+};
+#define NBYTE_ORDER SIZE(byte_orders)
+
+static
+uint32_t pixel_mask (int bpp)
+{
+ if (bpp == 32)
+ return 0xffffffff;
+ return (1 << bpp) - 1;
+}
+
+int
+compare_image(xcb_image_t *a, xcb_image_t *b)
+{
+ int x, y;
+ uint32_t a_pixel, b_pixel;
+ uint32_t mask = pixel_mask (a->bpp) & pixel_mask (b->bpp);
+
+ for (y = 0; y < a->height; y++)
+ for (x = 0; x < a->width; x++) {
+ a_pixel = xcb_image_get_pixel (a, x, y) & mask;
+ b_pixel = xcb_image_get_pixel (b, x, y) & mask;
+ if (a_pixel != b_pixel) {
+ fprintf (stderr, "fail at %d,%d: 0x%x != 0x%x\n",
+ x, y, a_pixel, b_pixel);
+ return 0;
+ }
+ }
+ return 1;
+}
+
+#define test_width 63
+#define test_height 2
+
+static xcb_image_t *
+create_test_image (void)
+{
+ xcb_image_t *test_image;
+ int x, y;
+ uint32_t pixel;
+ test_image = xcb_image_create(test_width, test_height,
+ XCB_IMAGE_FORMAT_Z_PIXMAP,
+ 32,
+ 32,
+ 32,
+ 32,
+ XCB_IMAGE_ORDER_LSB_FIRST,
+ XCB_IMAGE_ORDER_LSB_FIRST,
+ NULL, 0, NULL);
+
+ pixel = 0;
+ for (y = 0; y < test_height; y++)
+ for (x = 0; x < test_width; x++) {
+ xcb_image_put_pixel (test_image, x, y, pixel);
+ pixel++;
+ }
+ return test_image;
+}
+
+static void
+convert_test (xcb_image_t *test, xcb_image_t *a)
+{
+ int x, y;
+
+ for (y = 0; y < test->height; y++)
+ for (x = 0; x < test->width; x++)
+ xcb_image_put_pixel (a, x, y, xcb_image_get_pixel (test, x, y));
+}
+
+static char *
+order_name (xcb_image_order_t order) {
+ if (order == XCB_IMAGE_ORDER_MSB_FIRST)
+ return "MSB";
+ else
+ return "LSB";
+}
+
+static void
+print_format (xcb_image_t *image)
+{
+ switch (image->format) {
+ case XCB_IMAGE_FORMAT_Z_PIXMAP: fprintf (stderr, "Z pixmap"); break;
+ case XCB_IMAGE_FORMAT_XY_PIXMAP: fprintf (stderr, "XY pixmap"); break;
+ case XCB_IMAGE_FORMAT_XY_BITMAP: fprintf (stderr, "XY bitmap"); break;
+ }
+ fprintf (stderr, " pad: %d bpp: %d depth: %d unit: %d planemask: 0x%08x",
+ image->scanline_pad, image->bpp, image->depth, image->unit,
+ image->plane_mask);
+ fprintf (stderr, " byte order: %s bit order: %s stride: %d\n",
+ order_name (image->byte_order), order_name (image->bit_order),
+ image->stride);
+}
+
+int main (int argc, char **argv) {
+ xcb_image_t *test_image;
+ xcb_image_t *src_image;
+ xcb_image_t *dst_image;
+ int dst_format_i, dst_bpp_i, dst_unit_i, dst_byte_order_i, dst_bit_order_i;
+ int src_format_i, src_bpp_i, src_unit_i, src_byte_order_i, src_bit_order_i;
+ xcb_image_format_t dst_format, src_format;
+ int dst_bpp, src_bpp;
+ int dst_unit, src_unit;
+ int dst_byte_order, src_byte_order;
+ int dst_bit_order, src_bit_order;
+
+ test_image = create_test_image ();
+
+ for (dst_format_i = 0; dst_format_i < NFORMAT; dst_format_i++) {
+ dst_format = formats[dst_format_i];
+ for (src_format_i = 0; src_format_i < NFORMAT; src_format_i++) {
+ src_format = formats[src_format_i];
+ for (dst_bpp_i = 0; dst_bpp_i < NBPP; dst_bpp_i++) {
+ dst_bpp = bpps[dst_bpp_i];
+ for (src_bpp_i = 0; src_bpp_i < NBPP; src_bpp_i++) {
+ src_bpp = bpps[src_bpp_i];
+ for (dst_unit_i = 0; dst_unit_i < NUNIT; dst_unit_i++) {
+ dst_unit = units[dst_unit_i];
+ if (dst_format == XCB_IMAGE_FORMAT_Z_PIXMAP) {
+ if (dst_bpp == 4 && dst_unit != 8)
+ continue;
+ if (dst_bpp > 4 && dst_unit != dst_bpp)
+ continue;
+ }
+ if (dst_format == XCB_IMAGE_FORMAT_XY_BITMAP && dst_bpp != 1)
+ continue;
+ for (src_unit_i = 0; src_unit_i < NUNIT; src_unit_i++) {
+ src_unit = units[src_unit_i];
+ if (src_format == XCB_IMAGE_FORMAT_Z_PIXMAP) {
+ if (src_bpp == 4 && src_unit != 8)
+ continue;
+ if (src_bpp > 4 && src_unit != src_bpp)
+ continue;
+ }
+ if (src_format == XCB_IMAGE_FORMAT_XY_BITMAP && src_bpp != 1)
+ continue;
+ for (dst_byte_order_i = 0; dst_byte_order_i < NBYTE_ORDER; dst_byte_order_i++) {
+ dst_byte_order = byte_orders[dst_byte_order_i];
+ for (src_byte_order_i = 0; src_byte_order_i < NBYTE_ORDER; src_byte_order_i++) {
+ src_byte_order = byte_orders[src_byte_order_i];
+ for (dst_bit_order_i = 0; dst_bit_order_i < NBYTE_ORDER; dst_bit_order_i++) {
+ dst_bit_order = byte_orders[dst_bit_order_i];
+ if (dst_format == XCB_IMAGE_FORMAT_Z_PIXMAP && dst_bit_order != dst_byte_order)
+ continue;
+ for (src_bit_order_i = 0; src_bit_order_i < NBYTE_ORDER; src_bit_order_i++) {
+ src_bit_order = byte_orders[src_bit_order_i];
+ if (src_format == XCB_IMAGE_FORMAT_Z_PIXMAP && src_bit_order != src_byte_order)
+ continue;
+ src_image = xcb_image_create (test_width, test_height, src_format, 32, src_bpp, src_bpp, src_unit,
+ src_byte_order, src_bit_order, NULL, 0, NULL);
+ dst_image = xcb_image_create (test_width, test_height, dst_format, 32, dst_bpp, dst_bpp, dst_unit,
+ dst_byte_order, dst_bit_order, NULL, 0, NULL);
+ convert_test (test_image, src_image);
+ if (!compare_image (test_image, src_image)) {
+ fprintf (stderr, "Initialization failure:\n");
+ fprintf (stderr, "src format: "); print_format(src_image);
+ exit (1);
+ }
+ xcb_image_convert (src_image, dst_image);
+ if (!compare_image (src_image, dst_image)) {
+ /*
+ * Call the conversion function again so that debugging
+ * is easier
+ */
+ fprintf (stderr, "Conversion failure:\n");
+ fprintf (stderr, "src format: "); print_format(src_image);
+ fprintf (stderr, "dst format: "); print_format(dst_image);
+ exit (1);
+ }
+ xcb_image_destroy (src_image);
+ xcb_image_destroy (dst_image);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return 0;
+}
diff --git a/dist/xcb-util/image/test_xcb_image.c b/dist/xcb-util/image/test_xcb_image.c
new file mode 100644
index 000000000..ec1c9249a
--- /dev/null
+++ b/dist/xcb-util/image/test_xcb_image.c
@@ -0,0 +1,226 @@
+/*
+ * Copyright © 2008 Bart Massey <bart@cs.pdx.edu>
+ *
+ * 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 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.
+ *
+ * Except as contained in this notice, the names of the authors or
+ * their institutions shall not be used in advertising or otherwise to
+ * promote the sale, use or other dealings in this Software without
+ * prior written authorization from the authors.
+ */
+
+/* gcc -g -O2 -Wall `pkg-config --cflags --libs xcb` -o test xcb_image.o test_xcb_image.c */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <xcb/xcb.h>
+
+#include "../aux/xcb_aux.h"
+#include "xcb_image.h"
+
+#define W_W 64
+#define W_H 64
+
+void
+reflect_window (xcb_connection_t *c,
+ xcb_drawable_t win,
+ xcb_drawable_t new_win,
+ xcb_gcontext_t gc,
+ uint16_t width,
+ uint16_t height)
+{
+ xcb_image_t *image;
+ uint32_t pixel1;
+ uint32_t pixel2;
+ int32_t left_x;
+ int32_t right_x;
+ int32_t y;
+ int format;
+
+ format = XCB_IMAGE_FORMAT_Z_PIXMAP;
+
+ printf ("get_image %d %d\n", width, height);
+ image = xcb_image_get (c, win,
+ 0, 0, width, height,
+ ~0,
+ format);
+
+ printf ("Create image summary:\n");
+ printf (" * format................: %d\n", image->format);
+ printf (" * byte order............: %d\n", image->byte_order);
+ printf (" * bitmap order..........: %d\n", image->bit_order);
+ printf (" * bitmap pad............: %d\n", image->scanline_pad);
+ printf (" * depth.................: %d\n", image->depth);
+ printf (" * bytes/line............: %d\n", image->stride);
+ printf (" * bits/pixel (or unit)..: %d\n", image->bpp);
+
+ printf ("bpl %d %d\n", image->stride, image->height);
+
+ printf("calculating reflection -- this may take awhile...\n");
+
+ for (left_x = 0 ; left_x < width/2 ; left_x++)
+ {
+ for (y = 0 ; y < height ; y++)
+ {
+ pixel1 = xcb_image_get_pixel (image, left_x, y);
+ right_x = width - left_x-1;
+ if (left_x != right_x)
+ {
+ pixel2 = xcb_image_get_pixel (image, right_x, y);
+ xcb_image_put_pixel (image, left_x, y, pixel2);
+ }
+ xcb_image_put_pixel (image, right_x, y, pixel1);
+ }
+ }
+
+ printf("putting image\n");
+
+ xcb_image_put (c, new_win, gc, image, 0, 0, 0);
+ image = xcb_image_get (c, new_win,
+ 0, 0, width, height,
+ ~0,
+ format);
+
+ printf ("done\n");
+}
+
+int
+main (int argc, char *argv[])
+{
+ xcb_connection_t *c;
+ xcb_screen_t *screen;
+ xcb_drawable_t win;
+ xcb_drawable_t new_win;
+ xcb_drawable_t rect;
+ xcb_rectangle_t rect_coord = { 0, 0, W_W, W_H};
+ xcb_gcontext_t bgcolor, fgcolor;
+ xcb_point_t points[2];
+ uint32_t mask;
+ uint32_t valgc[2];
+ uint32_t valwin[3];
+ int depth;
+ int screen_nbr;
+ xcb_generic_event_t *e;
+
+ /* Open the connexion to the X server and get the first screen */
+ c = xcb_connect (NULL, &screen_nbr);
+ screen = xcb_aux_get_screen (c, screen_nbr);
+ depth = xcb_aux_get_depth (c, screen);
+
+ /* Create a black graphic context for drawing in the foreground */
+ win = screen->root;
+
+ fgcolor = xcb_generate_id(c);
+ mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
+ valgc[0] = screen->black_pixel;
+ valgc[1] = 0; /* no graphics exposures */
+ xcb_create_gc(c, fgcolor, win, mask, valgc);
+
+ bgcolor = xcb_generate_id(c);
+ mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
+ valgc[0] = screen->white_pixel;
+ valgc[1] = 0; /* no graphics exposures */
+ xcb_create_gc(c, bgcolor, win, mask, valgc);
+
+ /* Ask for our window's Id */
+ win = xcb_generate_id(c);
+
+ /* Create the window */
+ mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK | XCB_CW_DONT_PROPAGATE;
+ valwin[0] = screen->white_pixel;
+ valwin[1] = XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_EXPOSURE;
+ valwin[2] = XCB_EVENT_MASK_BUTTON_PRESS;
+ xcb_create_window (c, /* Connection */
+ 0, /* depth */
+ win, /* window Id */
+ screen->root, /* parent window */
+ 0, 0, /* x, y */
+ W_W, W_H, /* width, height */
+ 10, /* border_width */
+ XCB_WINDOW_CLASS_INPUT_OUTPUT,/* class */
+ screen->root_visual, /* visual */
+ mask, valwin); /* masks, not used yet */
+
+ /* Map the window on the screen */
+ xcb_map_window (c, win);
+
+ /* Create a Pixmap that will fill the window */
+ rect = xcb_generate_id (c);
+ xcb_create_pixmap(c, depth, rect, win, W_W, W_H);
+ xcb_poly_fill_rectangle(c, rect, bgcolor, 1, &rect_coord);
+ points[0].x = 0;
+ points[0].y = 0;
+ points[1].x = W_W;
+ points[1].y = W_H;
+ xcb_poly_line(c, XCB_COORD_MODE_ORIGIN, rect, fgcolor, 2, points);
+ points[0].x = W_W / 4;
+ points[0].y = 0;
+ points[1].x = W_W / 2;
+ points[1].y = W_H / 2;
+ xcb_poly_line(c, XCB_COORD_MODE_ORIGIN, rect, fgcolor, 2, points);
+
+ /* Ask for our window's Id */
+ new_win = xcb_generate_id(c);
+
+ /* Create the window */
+ mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK | XCB_CW_DONT_PROPAGATE;
+ valwin[0] = screen->white_pixel;
+ valwin[1] = XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_EXPOSURE;
+ valwin[2] = XCB_EVENT_MASK_BUTTON_PRESS;
+ xcb_create_window (c, /* Connection */
+ 0, /* depth */
+ new_win, /* window Id */
+ screen->root, /* parent window */
+ 0, 0, /* x, y */
+ W_W, W_H, /* width, height */
+ 10, /* border_width */
+ XCB_WINDOW_CLASS_INPUT_OUTPUT,/* class */
+ screen->root_visual, /* visual */
+ mask, valwin); /* masks, not used yet */
+
+
+
+ /* Map the window on the screen */
+ xcb_map_window (c, new_win);
+
+
+ xcb_flush (c);
+
+ while ((e = xcb_wait_for_event(c)))
+ {
+ switch (e->response_type)
+ {
+ case XCB_EXPOSE:
+ {
+ xcb_copy_area(c, rect, win, bgcolor,
+ 0, 0, 0, 0, W_W, W_H);
+ reflect_window (c, win, new_win,
+ fgcolor,
+ W_W, W_H);
+ xcb_flush (c);
+ break;
+ }
+ }
+ free (e);
+ }
+
+ return 1;
+}
diff --git a/dist/xcb-util/image/test_xcb_image_shm.c b/dist/xcb-util/image/test_xcb_image_shm.c
new file mode 100644
index 000000000..b68d637ff
--- /dev/null
+++ b/dist/xcb-util/image/test_xcb_image_shm.c
@@ -0,0 +1,183 @@
+/*
+ * Copyright © 2007 Bart Massey <bart@cs.pdx.edu>
+ *
+ * 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 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.
+ *
+ * Except as contained in this notice, the names of the authors or their
+ * institutions shall not be used in advertising or otherwise to promote the
+ * sale, use or other dealings in this Software without prior written
+ * authorization from the authors.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+#include <xcb/xcb.h>
+#include <xcb/shm.h>
+
+#include "../aux/xcb_aux.h"
+#include "xcb_image.h"
+
+#define W_W 40
+#define W_H 40
+
+
+
+int
+main (int argc, char *argv[])
+{
+ xcb_connection_t *c;
+ xcb_screen_t *screen;
+ xcb_drawable_t win;
+ xcb_drawable_t rect;
+ xcb_rectangle_t rect_coord = { 0, 0, W_W, W_H};
+ xcb_gcontext_t bgcolor, fgcolor;
+ xcb_point_t points[2];
+ uint32_t mask;
+ uint32_t valgc[2];
+ uint32_t valwin[3];
+ int depth;
+ int screen_nbr;
+ xcb_generic_event_t *e;
+ uint8_t format;
+
+ /* Open the connexion to the X server and get the first screen */
+ c = xcb_connect (NULL, &screen_nbr);
+ screen = xcb_aux_get_screen (c, screen_nbr);
+ depth = xcb_aux_get_depth (c, screen);
+
+ /* Create a black graphic context for drawing in the foreground */
+ win = screen->root;
+
+ fgcolor = xcb_generate_id(c);
+ mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
+ valgc[0] = screen->black_pixel;
+ valgc[1] = 0; /* no graphics exposures */
+ xcb_create_gc(c, fgcolor, win, mask, valgc);
+
+ bgcolor = xcb_generate_id(c);
+ mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
+ valgc[0] = screen->white_pixel;
+ valgc[1] = 0; /* no graphics exposures */
+ xcb_create_gc(c, bgcolor, win, mask, valgc);
+
+ /* Shm test */
+ printf ("shm test begin\n");
+ xcb_image_t *img = 0;
+ xcb_shm_query_version_reply_t *rep;
+ xcb_shm_segment_info_t shminfo;
+
+ rep = xcb_shm_query_version_reply (c,
+ xcb_shm_query_version (c),
+ NULL);
+ if (!rep || !rep->shared_pixmaps ||
+ rep->major_version < 1 ||
+ (rep->major_version == 1 && rep->minor_version == 0))
+ {
+ printf ("No or insufficient shm support...\n");
+ exit (0);
+ }
+ format = rep->pixmap_format;
+ img = xcb_image_create_native (c, W_W, W_H, format, depth,
+ 0, ~0, 0);
+
+ if (!img)
+ {
+ printf ("Can't create image...\n");
+ exit (0);
+ }
+
+ printf ("Create image summary:\n");
+ printf (" * format..........: %d\n", img->format);
+ printf (" * byte order......: %d\n", img->byte_order);
+ printf (" * bitmap unit.....: %d\n", img->bpp);
+ printf (" * bitmap order....: %d\n", img->bit_order);
+ printf (" * bitmap pad......: %d\n", img->scanline_pad);
+
+ shminfo.shmid = shmget (IPC_PRIVATE, img->size, IPC_CREAT|0777);
+ shminfo.shmaddr = shmat(shminfo.shmid, 0, 0);
+ img->data = shminfo.shmaddr;
+
+ shminfo.shmseg = xcb_generate_id (c);
+ xcb_shm_attach(c, shminfo.shmseg, shminfo.shmid, 0);
+ shmctl(shminfo.shmid, IPC_RMID, 0);
+
+ /* Draw in the image */
+ printf ("put the pixel\n");
+ xcb_image_put_pixel (img, 20, 20, 65535);
+ printf ("fin put pixel\n");
+
+ /* Ask for our window's Id */
+ win = xcb_generate_id(c);
+
+ /* Create the window */
+ mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK | XCB_CW_DONT_PROPAGATE;
+ valwin[0] = screen->white_pixel;
+ valwin[1] = XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_EXPOSURE;
+ valwin[2] = XCB_EVENT_MASK_BUTTON_PRESS;
+ xcb_create_window (c, /* Connection */
+ 0, /* depth */
+ win, /* window Id */
+ screen->root, /* parent window */
+ 0, 0, /* x, y */
+ W_W, W_H, /* width, height */
+ 10, /* border_width */
+ XCB_WINDOW_CLASS_INPUT_OUTPUT,/* class */
+ screen->root_visual, /* visual */
+ mask, valwin); /* masks, not used yet */
+
+ /* Map the window on the screen */
+ xcb_map_window (c, win);
+
+ /* Create a Pixmap that will fill the window */
+ rect = xcb_generate_id (c);
+ xcb_create_pixmap(c, depth, rect, win, W_W, W_H);
+ xcb_poly_fill_rectangle(c, rect, bgcolor, 1, &rect_coord);
+ points[0].x = 0;
+ points[0].y = 0;
+ points[1].x = 1;
+ points[1].y = 1;
+ xcb_poly_line(c, XCB_COORD_MODE_ORIGIN, rect, fgcolor, 2, points);
+
+ xcb_flush (c);
+
+ while ((e = xcb_wait_for_event(c)))
+ {
+ switch (e->response_type)
+ {
+ case XCB_EXPOSE:
+ {
+ xcb_copy_area(c, rect, win, bgcolor,
+ 0, 0, 0, 0, W_W, W_H);
+ printf ("put image\n");
+ xcb_image_shm_put (c, win, fgcolor,
+ img, shminfo,
+ 0, 0, 0, 0, W_W,W_H,
+ 0);
+ xcb_flush (c);
+ break;
+ }
+ }
+ free (e);
+ }
+
+ return 1;
+}
diff --git a/dist/xcb-util/image/xcb-image.pc.in b/dist/xcb-util/image/xcb-image.pc.in
new file mode 100644
index 000000000..403fdd05b
--- /dev/null
+++ b/dist/xcb-util/image/xcb-image.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: XCB Image library
+Description: XCB image convenience library
+Version: @PACKAGE_VERSION@
+Requires: xcb xcb-shm
+Libs: -L${libdir} -lxcb-image @LIBS@
+Cflags: -I${includedir}
diff --git a/dist/xcb-util/image/xcb_image.c b/dist/xcb-util/image/xcb_image.c
new file mode 100644
index 000000000..413bdc5c1
--- /dev/null
+++ b/dist/xcb-util/image/xcb_image.c
@@ -0,0 +1,1009 @@
+/* Copyright © 2007 Bart Massey
+ *
+ * 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 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.
+ *
+ * Except as contained in this notice, the names of the authors or their
+ * institutions shall not be used in advertising or otherwise to promote the
+ * sale, use or other dealings in this Software without prior written
+ * authorization from the authors.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <xcb/xcb.h>
+#include <xcb/shm.h>
+#include "../aux/xcb_aux.h"
+#include "../aux/xcb_bitops.h"
+#include "xcb_image.h"
+#define BUILD
+#include "xcb_pixel.h"
+
+
+static xcb_format_t *
+find_format_by_depth (const xcb_setup_t *setup, uint8_t depth)
+{
+ xcb_format_t *fmt = xcb_setup_pixmap_formats(setup);
+ xcb_format_t *fmtend = fmt + xcb_setup_pixmap_formats_length(setup);
+ for(; fmt != fmtend; ++fmt)
+ if(fmt->depth == depth)
+ return fmt;
+ return 0;
+}
+
+
+static xcb_image_format_t
+effective_format(xcb_image_format_t format, uint8_t bpp)
+{
+ if (format == XCB_IMAGE_FORMAT_Z_PIXMAP && bpp != 1)
+ return format;
+ return XCB_IMAGE_FORMAT_XY_PIXMAP;
+}
+
+
+static int
+format_valid (uint8_t depth, uint8_t bpp, uint8_t unit,
+ xcb_image_format_t format, uint8_t xpad)
+{
+ xcb_image_format_t ef = effective_format(format, bpp);
+ if (depth > bpp)
+ return 0;
+ switch(ef) {
+ case XCB_IMAGE_FORMAT_XY_PIXMAP:
+ switch(unit) {
+ case 8:
+ case 16:
+ case 32:
+ break;
+ default:
+ return 0;
+ }
+ if (xpad < bpp)
+ return 0;
+ switch (xpad) {
+ case 8:
+ case 16:
+ case 32:
+ break;
+ default:
+ return 0;
+ }
+ break;
+ case XCB_IMAGE_FORMAT_Z_PIXMAP:
+ switch (bpp) {
+ case 4:
+ if (unit != 8)
+ return 0;
+ break;
+ case 8:
+ case 16:
+ case 24:
+ case 32:
+ if (unit != bpp)
+ return 0;
+ break;
+ default:
+ return 0;
+ }
+ break;
+ default:
+ return 0;
+ }
+ return 1;
+}
+
+
+static int
+image_format_valid (xcb_image_t *image) {
+ return format_valid(image->depth,
+ image->bpp,
+ image->unit,
+ image->format,
+ image->scanline_pad);
+}
+
+
+void
+xcb_image_annotate (xcb_image_t *image)
+{
+ xcb_image_format_t ef = effective_format(image->format, image->bpp);
+ switch (ef) {
+ case XCB_IMAGE_FORMAT_XY_PIXMAP:
+ image->stride = xcb_roundup(image->width, image->scanline_pad) >> 3;
+ image->size = image->height * image->stride * image->depth;
+ break;
+ case XCB_IMAGE_FORMAT_Z_PIXMAP:
+ image->stride = xcb_roundup((uint32_t)image->width *
+ (uint32_t)image->bpp,
+ image->scanline_pad) >> 3;
+ image->size = image->height * image->stride;
+ break;
+ default:
+ assert(0);
+ }
+}
+
+
+xcb_image_t *
+xcb_image_create_native (xcb_connection_t * c,
+ uint16_t width,
+ uint16_t height,
+ xcb_image_format_t format,
+ uint8_t depth,
+ void * base,
+ uint32_t bytes,
+ uint8_t * data)
+{
+ const xcb_setup_t * setup = xcb_get_setup(c);
+ xcb_format_t * fmt;
+ xcb_image_format_t ef = format;
+
+ if (ef == XCB_IMAGE_FORMAT_Z_PIXMAP && depth == 1)
+ ef = XCB_IMAGE_FORMAT_XY_PIXMAP;
+ switch (ef) {
+ case XCB_IMAGE_FORMAT_XY_BITMAP:
+ if (depth != 1)
+ return 0;
+ /* fall through */
+ case XCB_IMAGE_FORMAT_XY_PIXMAP:
+ if (depth > 1) {
+ fmt = find_format_by_depth(setup, depth);
+ if (!fmt)
+ return 0;
+ }
+ return xcb_image_create(width, height, format,
+ setup->bitmap_format_scanline_pad,
+ depth, depth, setup->bitmap_format_scanline_unit,
+ setup->image_byte_order,
+ setup->bitmap_format_bit_order,
+ base, bytes, data);
+ case XCB_IMAGE_FORMAT_Z_PIXMAP:
+ fmt = find_format_by_depth(setup, depth);
+ if (!fmt)
+ return 0;
+ return xcb_image_create(width, height, format,
+ fmt->scanline_pad,
+ fmt->depth, fmt->bits_per_pixel, 0,
+ setup->image_byte_order,
+ XCB_IMAGE_ORDER_MSB_FIRST,
+ base, bytes, data);
+ default:
+ assert(0);
+ }
+ assert(0);
+}
+
+
+xcb_image_t *
+xcb_image_create (uint16_t width,
+ uint16_t height,
+ xcb_image_format_t format,
+ uint8_t xpad,
+ uint8_t depth,
+ uint8_t bpp,
+ uint8_t unit,
+ xcb_image_order_t byte_order,
+ xcb_image_order_t bit_order,
+ void * base,
+ uint32_t bytes,
+ uint8_t * data)
+{
+ xcb_image_t * image;
+
+ if (unit == 0) {
+ switch (format) {
+ case XCB_IMAGE_FORMAT_XY_BITMAP:
+ case XCB_IMAGE_FORMAT_XY_PIXMAP:
+ unit = 32;
+ break;
+ case XCB_IMAGE_FORMAT_Z_PIXMAP:
+ if (bpp == 1) {
+ unit = 32;
+ break;
+ }
+ if (bpp < 8) {
+ unit = 8;
+ break;
+ }
+ unit = bpp;
+ break;
+ }
+ }
+ if (!format_valid(depth, bpp, unit, format, xpad))
+ return 0;
+ image = malloc(sizeof(*image));
+ if (image == 0)
+ return 0;
+ image->width = width;
+ image->height = height;
+ image->format = format;
+ image->scanline_pad = xpad;
+ image->depth = depth;
+ image->bpp = bpp;
+ image->unit = unit;
+ image->plane_mask = xcb_mask(depth);
+ image->byte_order = byte_order;
+ image->bit_order = bit_order;
+ xcb_image_annotate(image);
+
+ /*
+ * Ways this function can be called:
+ * * with data: we fail if bytes isn't
+ * large enough, else leave well enough alone.
+ * * with base and !data: if bytes is zero, we
+ * default; otherwise we fail if bytes isn't
+ * large enough, else fill in data
+ * * with !base and !data: we malloc storage
+ * for the data, save that address as the base,
+ * and fail if malloc does.
+ *
+ * When successful, we establish the invariant that data
+ * points at sufficient storage that may have been
+ * supplied, and base is set iff it should be
+ * auto-freed when the image is destroyed.
+ *
+ * Except as a special case when base = 0 && data == 0 &&
+ * bytes == ~0 we just return the image structure and let
+ * the caller deal with getting the allocation right.
+ */
+ if (!base && !data && bytes == ~0) {
+ image->base = 0;
+ image->data = 0;
+ return image;
+ }
+ if (!base && data && bytes == 0)
+ bytes = image->size;
+ image->base = base;
+ image->data = data;
+ if (!image->data) {
+ if (image->base) {
+ image->data = image->base;
+ } else {
+ bytes = image->size;
+ image->base = malloc(bytes);
+ image->data = image->base;
+ }
+ }
+ if (!image->data || bytes < image->size) {
+ free(image);
+ return 0;
+ }
+ return image;
+}
+
+
+void
+xcb_image_destroy (xcb_image_t *image)
+{
+ if (image->base)
+ free (image->base);
+ free (image);
+}
+
+
+xcb_image_t *
+xcb_image_get (xcb_connection_t * conn,
+ xcb_drawable_t draw,
+ int16_t x,
+ int16_t y,
+ uint16_t width,
+ uint16_t height,
+ uint32_t plane_mask,
+ xcb_image_format_t format)
+{
+ xcb_get_image_cookie_t image_cookie;
+ xcb_get_image_reply_t * imrep;
+ xcb_image_t * image = 0;
+ uint32_t bytes;
+ uint8_t * data;
+
+ image_cookie = xcb_get_image(conn, format, draw, x, y,
+ width, height, plane_mask);
+ imrep = xcb_get_image_reply(conn, image_cookie, 0);
+ if (!imrep)
+ return 0;
+ bytes = xcb_get_image_data_length(imrep);
+ data = xcb_get_image_data(imrep);
+ switch (format) {
+ case XCB_IMAGE_FORMAT_XY_PIXMAP:
+ plane_mask &= xcb_mask(imrep->depth);
+ if (plane_mask != xcb_mask(imrep->depth)) {
+ xcb_image_t * tmp_image =
+ xcb_image_create_native(conn, width, height, format,
+ imrep->depth, 0, 0, 0);
+ int i;
+ uint32_t rpm = plane_mask;
+ uint8_t * src_plane = image->data;
+ uint8_t * dst_plane = tmp_image->data;
+ uint32_t size = image->height * image->stride;
+
+ if (!tmp_image) {
+ free(imrep);
+ return 0;
+ }
+ if (tmp_image->bit_order == XCB_IMAGE_ORDER_MSB_FIRST)
+ rpm = xcb_bit_reverse(plane_mask, imrep->depth);
+ for (i = 0; i < imrep->depth; i++) {
+ if (rpm & 1) {
+ memcpy(dst_plane, src_plane, size);
+ src_plane += size;
+ } else {
+ memset(dst_plane, 0, size);
+ }
+ dst_plane += size;
+ }
+ tmp_image->plane_mask = plane_mask;
+ image = tmp_image;
+ free(imrep);
+ break;
+ }
+ /* fall through */
+ case XCB_IMAGE_FORMAT_Z_PIXMAP:
+ image = xcb_image_create_native(conn, width, height, format,
+ imrep->depth, imrep, bytes, data);
+ if (!image) {
+ free(imrep);
+ return 0;
+ }
+ break;
+ default:
+ assert(0);
+ }
+ assert(bytes == image->size);
+ return image;
+}
+
+
+xcb_image_t *
+xcb_image_native (xcb_connection_t * c,
+ xcb_image_t * image,
+ int convert)
+{
+ xcb_image_t * tmp_image = 0;
+ const xcb_setup_t * setup = xcb_get_setup(c);
+ xcb_format_t * fmt = 0;
+ xcb_image_format_t ef = effective_format(image->format, image->bpp);
+ uint8_t bpp = 1;
+
+ if (image->depth > 1 || ef == XCB_IMAGE_FORMAT_Z_PIXMAP) {
+ fmt = find_format_by_depth(setup, image->depth);
+ /* XXX For now, we don't do depth conversions, even
+ for xy-pixmaps */
+ if (!fmt)
+ return 0;
+ bpp = fmt->bits_per_pixel;
+ }
+ switch (ef) {
+ case XCB_IMAGE_FORMAT_XY_PIXMAP:
+ if (setup->bitmap_format_scanline_unit != image->unit ||
+ setup->bitmap_format_scanline_pad != image->scanline_pad ||
+ setup->image_byte_order != image->byte_order ||
+ setup->bitmap_format_bit_order != image->bit_order ||
+ bpp != image->bpp) {
+ if (!convert)
+ return 0;
+ tmp_image =
+ xcb_image_create(image->width, image->height, image->format,
+ setup->bitmap_format_scanline_pad,
+ image->depth, bpp,
+ setup->bitmap_format_scanline_unit,
+ setup->image_byte_order,
+ setup->bitmap_format_bit_order,
+ 0, 0, 0);
+ if (!tmp_image)
+ return 0;
+ }
+ break;
+ case XCB_IMAGE_FORMAT_Z_PIXMAP:
+ if (fmt->scanline_pad != image->scanline_pad ||
+ setup->image_byte_order != image->byte_order ||
+ bpp != image->bpp) {
+ if (!convert)
+ return 0;
+ tmp_image =
+ xcb_image_create(image->width, image->height, image->format,
+ fmt->scanline_pad,
+ image->depth, bpp, 0,
+ setup->image_byte_order,
+ XCB_IMAGE_ORDER_MSB_FIRST,
+ 0, 0, 0);
+ if (!tmp_image)
+ return 0;
+ }
+ break;
+ default:
+ assert(0);
+ }
+ if (tmp_image) {
+ if (!xcb_image_convert(image, tmp_image)) {
+ xcb_image_destroy(tmp_image);
+ return 0;
+ }
+ image = tmp_image;
+ }
+ return image;
+}
+
+
+xcb_void_cookie_t
+xcb_image_put (xcb_connection_t * conn,
+ xcb_drawable_t draw,
+ xcb_gcontext_t gc,
+ xcb_image_t * image,
+ int16_t x,
+ int16_t y,
+ uint8_t left_pad)
+{
+ return xcb_put_image(conn, image->format, draw, gc,
+ image->width, image->height,
+ x, y, left_pad,
+ image->depth,
+ image->size,
+ image->data);
+}
+
+
+
+/*
+ * Shm stuff
+ */
+
+xcb_image_t *
+xcb_image_shm_put (xcb_connection_t * conn,
+ xcb_drawable_t draw,
+ xcb_gcontext_t gc,
+ xcb_image_t * image,
+ xcb_shm_segment_info_t shminfo,
+ int16_t src_x,
+ int16_t src_y,
+ int16_t dest_x,
+ int16_t dest_y,
+ uint16_t src_width,
+ uint16_t src_height,
+ uint8_t send_event)
+{
+ if (!xcb_image_native(conn, image, 0))
+ return 0;
+ if (!shminfo.shmaddr)
+ return 0;
+ xcb_shm_put_image(conn, draw, gc,
+ image->width, image->height,
+ src_x, src_y, src_width, src_height,
+ dest_x, dest_y,
+ image->depth, image->format,
+ send_event,
+ shminfo.shmseg,
+ image->data - shminfo.shmaddr);
+ return image;
+}
+
+
+int
+xcb_image_shm_get (xcb_connection_t * conn,
+ xcb_drawable_t draw,
+ xcb_image_t * image,
+ xcb_shm_segment_info_t shminfo,
+ int16_t x,
+ int16_t y,
+ uint32_t plane_mask)
+{
+ xcb_shm_get_image_reply_t * setup;
+ xcb_shm_get_image_cookie_t cookie;
+ xcb_generic_error_t * err = 0;
+
+ if (!shminfo.shmaddr)
+ return 0;
+ cookie = xcb_shm_get_image(conn, draw,
+ x, y,
+ image->width, image->height,
+ plane_mask,
+ image->format,
+ shminfo.shmseg,
+ image->data - shminfo.shmaddr);
+ setup = xcb_shm_get_image_reply(conn, cookie, &err);
+ if (err) {
+ fprintf(stderr, "ShmGetImageReply error %d\n", (int)err->error_code);
+ free(err);
+ return 0;
+ } else {
+ free (setup);
+ return 1;
+ }
+}
+
+
+static uint32_t
+xy_image_byte (xcb_image_t *image, uint32_t x)
+{
+ x >>= 3;
+ if (image->byte_order == image->bit_order)
+ return x;
+ switch (image->unit) {
+ default:
+ case 8:
+ return x;
+ case 16:
+ return x ^ 1;
+ case 32:
+ return x ^ 3;
+ }
+}
+
+static uint32_t
+xy_image_bit (xcb_image_t *image, uint32_t x)
+{
+ x &= 7;
+ if (image->bit_order == XCB_IMAGE_ORDER_MSB_FIRST)
+ x = 7 - x;
+ return x;
+}
+
+/* GetPixel/PutPixel */
+
+/* XXX this is the most hideously done cut-and-paste
+ to below. Any bugs fixed there should be fixed here
+ and vice versa. */
+void
+xcb_image_put_pixel (xcb_image_t *image,
+ uint32_t x,
+ uint32_t y,
+ uint32_t pixel)
+{
+ uint8_t *row;
+
+ if (x > image->width || y > image->height)
+ return;
+ row = image->data + (y * image->stride);
+ switch (effective_format(image->format, image->bpp)) {
+ case XCB_IMAGE_FORMAT_XY_BITMAP:
+ case XCB_IMAGE_FORMAT_XY_PIXMAP:
+ /* block */ {
+ int p;
+ uint32_t plane_mask = image->plane_mask;
+ uint8_t * plane = row;
+ uint32_t byte = xy_image_byte(image, x);
+ uint32_t bit = xy_image_bit(image,x);
+ uint8_t mask = 1 << bit;
+
+ for (p = image->bpp - 1; p >= 0; p--) {
+ if ((plane_mask >> p) & 1) {
+ uint8_t * bp = plane + byte;
+ uint8_t this_bit = ((pixel >> p) & 1) << bit;
+ *bp = (*bp & ~mask) | this_bit;
+ }
+ plane += image->stride * image->height;
+ }
+ }
+ break;
+ case XCB_IMAGE_FORMAT_Z_PIXMAP:
+ switch (image->bpp) {
+ uint32_t mask;
+ case 4:
+ mask = 0xf;
+ pixel &= 0xf;
+ if ((x & 1) ==
+ (image->byte_order == XCB_IMAGE_ORDER_MSB_FIRST)) {
+ pixel <<= 4;
+ mask <<= 4;
+ }
+ row[x >> 1] = (row[x >> 1] & ~mask) | pixel;
+ break;
+ case 8:
+ row[x] = pixel;
+ break;
+ case 16:
+ switch (image->byte_order) {
+ case XCB_IMAGE_ORDER_LSB_FIRST:
+ row[x << 1] = pixel;
+ row[(x << 1) + 1] = pixel >> 8;
+ break;
+ case XCB_IMAGE_ORDER_MSB_FIRST:
+ row[x << 1] = pixel >> 8;
+ row[(x << 1) + 1] = pixel;
+ break;
+ }
+ break;
+ case 24:
+ switch (image->byte_order) {
+ case XCB_IMAGE_ORDER_LSB_FIRST:
+ row[x * 3] = pixel;
+ row[x * 3 + 1] = pixel >> 8;
+ row[x * 3 + 2] = pixel >> 16;
+ break;
+ case XCB_IMAGE_ORDER_MSB_FIRST:
+ row[x * 3] = pixel >> 16;
+ row[x * 3 + 1] = pixel >> 8;
+ row[x * 3 + 2] = pixel;
+ break;
+ }
+ break;
+ case 32:
+ switch (image->byte_order) {
+ case XCB_IMAGE_ORDER_LSB_FIRST:
+ row[x << 2] = pixel;
+ row[(x << 2) + 1] = pixel >> 8;
+ row[(x << 2) + 2] = pixel >> 16;
+ row[(x << 2) + 3] = pixel >> 24;
+ break;
+ case XCB_IMAGE_ORDER_MSB_FIRST:
+ row[x << 2] = pixel >> 24;
+ row[(x << 2) + 1] = pixel >> 16;
+ row[(x << 2) + 2] = pixel >> 8;
+ row[(x << 2) + 3] = pixel;
+ break;
+ }
+ break;
+ default:
+ assert(0);
+ }
+ break;
+ default:
+ assert(0);
+ }
+}
+
+
+/* XXX this is the most hideously done cut-and-paste
+ from above. Any bugs fixed there should be fixed here
+ and vice versa. */
+uint32_t
+xcb_image_get_pixel (xcb_image_t *image,
+ uint32_t x,
+ uint32_t y)
+{
+ uint32_t pixel = 0;
+ uint8_t *row;
+
+ assert(x < image->width && y < image->height);
+ row = image->data + (y * image->stride);
+ switch (effective_format(image->format, image->bpp)) {
+ case XCB_IMAGE_FORMAT_XY_BITMAP:
+ case XCB_IMAGE_FORMAT_XY_PIXMAP:
+ /* block */ {
+ int p;
+ uint32_t plane_mask = image->plane_mask;
+ uint8_t * plane = row;
+ uint32_t byte = xy_image_byte(image, x);
+ uint32_t bit = xy_image_bit(image,x);
+
+ for (p = image->bpp - 1; p >= 0; p--) {
+ pixel <<= 1;
+ if ((plane_mask >> p) & 1) {
+ uint8_t * bp = plane + byte;
+ pixel |= (*bp >> bit) & 1;
+ }
+ plane += image->stride * image->height;
+ }
+ }
+ return pixel;
+ case XCB_IMAGE_FORMAT_Z_PIXMAP:
+ switch (image->bpp) {
+ case 4:
+ if ((x & 1) == (image->byte_order == XCB_IMAGE_ORDER_MSB_FIRST))
+ return row[x >> 1] >> 4;
+ return row[x >> 1] & 0xf;
+ case 8:
+ return row[x];
+ case 16:
+ switch (image->byte_order) {
+ case XCB_IMAGE_ORDER_LSB_FIRST:
+ pixel = row[x << 1];
+ pixel |= row[(x << 1) + 1] << 8;
+ break;
+ case XCB_IMAGE_ORDER_MSB_FIRST:
+ pixel = row[x << 1] << 8;
+ pixel |= row[(x << 1) + 1];
+ break;
+ }
+ break;
+ case 24:
+ switch (image->byte_order) {
+ case XCB_IMAGE_ORDER_LSB_FIRST:
+ pixel = row[x * 3];
+ pixel |= row[x * 3 + 1] << 8;
+ pixel |= row[x * 3 + 2] << 16;
+ break;
+ case XCB_IMAGE_ORDER_MSB_FIRST:
+ pixel = row[x * 3] << 16;
+ pixel |= row[x * 3 + 1] << 8;
+ pixel |= row[x * 3 + 2];
+ break;
+ }
+ break;
+ case 32:
+ switch (image->byte_order) {
+ case XCB_IMAGE_ORDER_LSB_FIRST:
+ pixel = row[x << 2];
+ pixel |= row[(x << 2) + 1] << 8;
+ pixel |= row[(x << 2) + 2] << 16;
+ pixel |= row[(x << 2) + 3] << 24;
+ break;
+ case XCB_IMAGE_ORDER_MSB_FIRST:
+ pixel = row[x << 2] << 24;
+ pixel |= row[(x << 2) + 1] << 16;
+ pixel |= row[(x << 2) + 2] << 8;
+ pixel |= row[(x << 2) + 3];
+ break;
+ }
+ break;
+ default:
+ assert(0);
+ }
+ return pixel;
+ default:
+ assert(0);
+ }
+}
+
+
+xcb_image_t *
+xcb_image_create_from_bitmap_data (uint8_t * data,
+ uint32_t width,
+ uint32_t height)
+{
+ return xcb_image_create(width, height, XCB_IMAGE_FORMAT_XY_PIXMAP,
+ 8, 1, 1, 8,
+ XCB_IMAGE_ORDER_LSB_FIRST,
+ XCB_IMAGE_ORDER_LSB_FIRST,
+ 0, 0, data);
+}
+
+
+/*
+ * (Adapted from libX11.)
+ *
+ * xcb_create_pixmap_from_bitmap_data: Routine to make a pixmap of
+ * given depth from user supplied bitmap data.
+ * D is any drawable on the same screen that the pixmap will be used in.
+ * Data is a pointer to the bit data, and
+ * width & height give the size in bits of the pixmap.
+ *
+ * The following format is assumed for data:
+ *
+ * format=XY (will use XYPixmap for depth 1 and XYBitmap for larger)
+ * bit_order=LSBFirst
+ * padding=8
+ * bitmap_unit=8
+ */
+xcb_pixmap_t
+xcb_create_pixmap_from_bitmap_data (xcb_connection_t * display,
+ xcb_drawable_t d,
+ uint8_t * data,
+ uint32_t width,
+ uint32_t height,
+ uint32_t depth,
+ uint32_t fg,
+ uint32_t bg,
+ xcb_gcontext_t * gcp)
+{
+ xcb_pixmap_t pix;
+ xcb_image_t * image;
+ xcb_image_t * final_image;
+ xcb_gcontext_t gc;
+ uint32_t mask = 0;
+ xcb_params_gc_t gcv;
+
+ image = xcb_image_create_from_bitmap_data(data, width, height);
+ if (!image)
+ return 0;
+ if (depth > 1)
+ image->format = XCB_IMAGE_FORMAT_XY_BITMAP;
+ final_image = xcb_image_native(display, image, 1);
+ if (!final_image) {
+ xcb_image_destroy(image);
+ return 0;
+ }
+ pix = xcb_generate_id(display);
+ xcb_create_pixmap(display, depth, pix, d, width, height);
+ gc = xcb_generate_id(display);
+ XCB_AUX_ADD_PARAM(&mask, &gcv, foreground, fg);
+ XCB_AUX_ADD_PARAM(&mask, &gcv, background, bg);
+ xcb_aux_create_gc(display, gc, pix, mask, &gcv);
+ xcb_image_put(display, pix, gc, final_image, 0, 0, 0);
+ if (final_image != image)
+ xcb_image_destroy(final_image);
+ xcb_image_destroy(image);
+ if (gcp)
+ *gcp = gc;
+ else
+ xcb_free_gc(display, gc);
+ return pix;
+}
+
+
+/* Thanks to Keith Packard <keithp@keithp.com> for this code */
+static void
+swap_image(uint8_t * src,
+ uint32_t src_stride,
+ uint8_t * dst,
+ uint32_t dst_stride,
+ uint32_t height,
+ uint32_t byteswap,
+ int bitswap,
+ int nibbleswap)
+{
+ while (height--) {
+ uint32_t s;
+
+ for (s = 0; s < src_stride; s++) {
+ uint8_t b;
+ uint32_t d = s ^ byteswap;
+
+ if (d > dst_stride)
+ continue;
+
+ b = src[s];
+ if (bitswap)
+ b = xcb_bit_reverse(b, 8);
+ if (nibbleswap)
+ b = (b << 4) | (b >> 4);
+ dst[d] = b;
+ }
+ src += src_stride;
+ dst += dst_stride;
+ }
+}
+
+/* Which order are bytes in (low two bits), given
+ * code which accesses an image one byte at a time
+ */
+static uint32_t
+byte_order(xcb_image_t *i)
+{
+ uint32_t flip = i->byte_order == XCB_IMAGE_ORDER_MSB_FIRST;
+
+ switch (i->bpp) {
+ default:
+ case 8:
+ return 0;
+ case 16:
+ return flip;
+ case 32:
+ return flip | (flip << 1);
+ }
+}
+
+static uint32_t
+bit_order(xcb_image_t *i)
+{
+ uint32_t flip = i->byte_order != i->bit_order;
+
+ switch (i->unit) {
+ default:
+ case 8:
+ return 0;
+ case 16:
+ return flip;
+ case 32:
+ return flip | (flip << 1);
+ }
+}
+
+/* Convert from one byte order to another by flipping the
+ * low two bits of the byte index along a scanline
+ */
+static uint32_t
+conversion_byte_swap(xcb_image_t *src, xcb_image_t *dst)
+{
+ xcb_image_format_t ef = effective_format(src->format, src->bpp);
+
+ /* src_ef == dst_ef in all callers of this function */
+ if (ef == XCB_IMAGE_FORMAT_XY_PIXMAP) {
+ return bit_order(src) ^ bit_order(dst);
+ } else {
+ /* src_bpp == dst_bpp in all callers of this function */
+ return byte_order(src) ^ byte_order(dst);
+ }
+}
+
+xcb_image_t *
+xcb_image_convert (xcb_image_t * src,
+ xcb_image_t * dst)
+{
+ xcb_image_format_t ef = effective_format(src->format, src->bpp);
+
+ /* Things will go horribly wrong here if a bad
+ image is passed in, so we check some things
+ up front just to be nice. */
+ assert(image_format_valid(src));
+ assert(image_format_valid(dst));
+
+ /* images must be the same size
+ * (yes, we could copy a sub-set)
+ */
+ if (src->width != dst->width ||
+ src->height != dst->height)
+ return 0;
+
+ if (ef == effective_format(dst->format, dst->bpp) &&
+ src->bpp == dst->bpp)
+ {
+ if (src->unit == dst->unit &&
+ src->scanline_pad == dst->scanline_pad &&
+ src->byte_order == dst->byte_order &&
+ (ef == XCB_IMAGE_FORMAT_Z_PIXMAP ||
+ src->bit_order == dst->bit_order)) {
+ memcpy(dst->data, src->data, src->size);
+ } else {
+ int bitswap = 0;
+ int nibbleswap = 0;
+ uint32_t byteswap = conversion_byte_swap(src, dst);
+ uint32_t height = src->height;;
+
+ if (ef == XCB_IMAGE_FORMAT_Z_PIXMAP) {
+ if (src->bpp == 4 && src->byte_order != dst->byte_order)
+ nibbleswap = 1;
+ } else {
+ if (src->bit_order != dst->bit_order)
+ bitswap = 1;
+ height *= src->depth;
+ }
+ swap_image (src->data, src->stride, dst->data, dst->stride,
+ height, byteswap, bitswap, nibbleswap);
+ }
+ }
+ else
+ {
+ uint32_t x;
+ uint32_t y;
+ /* General case: Slow pixel copy. Should we optimize
+ Z24<->Z32 copies of either endianness? */
+ for (y = 0; y < src->height; y++) {
+ for (x = 0; x < src->width; x++) {
+ uint32_t pixel = xcb_image_get_pixel(src, x, y);
+ xcb_image_put_pixel(dst, x, y, pixel);
+ }
+ }
+ }
+ return dst;
+}
+
+xcb_image_t *
+xcb_image_subimage(xcb_image_t * image,
+ uint32_t x,
+ uint32_t y,
+ uint32_t width,
+ uint32_t height,
+ void * base,
+ uint32_t bytes,
+ uint8_t * data)
+{
+ int i, j;
+ xcb_image_t * result;
+
+ if (x + width > image->width)
+ return 0;
+ if (y + height > image->height)
+ return 0;
+ result = xcb_image_create(width, height, image->format,
+ image->scanline_pad, image->depth,
+ image->bpp, image->unit, image->byte_order,
+ image->bit_order,
+ base, bytes, data);
+ if (!result)
+ return 0;
+ /* XXX FIXME For now, lose on performance. Sorry. */
+ for (j = 0; j < height; j++) {
+ for (i = 0; i < width; i++) {
+ uint32_t pixel = xcb_image_get_pixel(image, x + i, y + j);
+ xcb_image_put_pixel(result, i, j, pixel);
+ }
+ }
+ return result;
+}
diff --git a/dist/xcb-util/image/xcb_image.h b/dist/xcb-util/image/xcb_image.h
new file mode 100644
index 000000000..3b54da36d
--- /dev/null
+++ b/dist/xcb-util/image/xcb_image.h
@@ -0,0 +1,630 @@
+#ifndef __XCB_IMAGE_H__
+#define __XCB_IMAGE_H__
+
+/* Copyright (C) 2007 Bart Massey
+ *
+ * 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 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.
+ *
+ * Except as contained in this notice, the names of the authors or their
+ * institutions shall not be used in advertising or otherwise to promote the
+ * sale, use or other dealings in this Software without prior written
+ * authorization from the authors.
+ */
+
+#include <xcb/xcb.h>
+#include <xcb/shm.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @defgroup xcb__image_t XCB Image Functions
+ *
+ * These are functions used to create and manipulate X images.
+ *
+ * The X image format we use is specific to this software,
+ * which is probably a bug; it represents an intermediate
+ * position between the wire format used by the X GetImage
+ * and PutImage requests and standard formats like PBM. An
+ * image consists of a header of type @ref xcb_image_t
+ * describing the properties of the image, together with a
+ * pointer to the image data itself.
+ *
+ * X wire images come in three formats. An xy-bitmap is a
+ * bit-packed format that will be expanded to a two-color
+ * pixmap using a GC when sent over the wire by PutImage.
+ * An xy-pixmap is one or more bit-planes, each in the same
+ * format as xy-bitmap. A z-pixmap is a more conventional
+ * pixmap representation, with each pixel packed into a
+ * word. Pixmaps are sent and received over the wire only
+ * to/from drawables of their depth.
+ *
+ * Each X server defines, for each depth and format,
+ * properties of images in that format that are sent and
+ * received on the wire. We refer to this as a "native"
+ * image for a given X server. It is not uncommon to want
+ * to work with non-native images on the client side, or to
+ * convert between the native images of different servers.
+ *
+ * This library provides several things. Facilities for
+ * creating and destroying images are, of course, provided.
+ * Wrappers for xcb_get_image() and xcb_put_image() are
+ * provided; these utilize the image header to simplify the
+ * interface. Routines for getting and putting image pixels
+ * are provided: both a generic form that works with
+ * arbitrary images, and fastpath forms for some common
+ * cases. Conversion routines are provided for X images;
+ * these routines have been fairly well optimized for the
+ * common cases, and should run fast even on older hardware.
+ * A routine analogous to Xlib's XCreate*FromBitmapData() is
+ * provided for creating X images from xbm-format data; this
+ * routine is in this library only because it is a trivial
+ * use case for the library.
+ *
+ * @{
+ */
+
+
+typedef struct xcb_image_t xcb_image_t;
+
+/**
+ * @struct xcb_image_t
+ * A structure that describes an xcb_image_t.
+ */
+struct xcb_image_t
+{
+ uint16_t width; /**< Width in pixels, excluding pads etc. */
+ uint16_t height; /**< Height in pixels. */
+ xcb_image_format_t format; /**< Format. */
+ uint8_t scanline_pad; /**< Right pad in bits. Valid pads
+ * are 8, 16, 32.
+ */
+ uint8_t depth; /**< Depth in bits. Valid depths
+ * are 1, 4, 8, 16, 24 for z format,
+ * 1 for xy-bitmap-format, anything
+ * for xy-pixmap-format.
+ */
+ uint8_t bpp; /**< Storage per pixel in bits.
+ * Must be >= depth. Valid bpp
+ * are 1, 4, 8, 16, 24, 32 for z
+ * format, 1 for xy-bitmap format,
+ * anything for xy-pixmap-format.
+ */
+ uint8_t unit; /**< Scanline unit in bits for
+ * xy formats and for bpp == 1,
+ * in which case valid scanline
+ * units are 8, 16, 32. Otherwise,
+ * will be max(8, bpp). Must be >= bpp.
+ */
+ uint32_t plane_mask; /**< When format is
+ * xy-pixmap and depth >
+ * 1, this says which
+ * planes are "valid" in
+ * some vague sense.
+ * Currently used only
+ * by xcb_image_get/put_pixel(),
+ * and set only by
+ * xcb_image_get().
+ */
+ xcb_image_order_t byte_order; /**< Component byte order
+ * for z-pixmap, byte
+ * order of scanline unit
+ * for xy-bitmap and
+ * xy-pixmap. Nybble
+ * order for z-pixmap
+ * when bpp == 4.
+ */
+ xcb_image_order_t bit_order; /**< Bit order of
+ * scanline unit for
+ * xy-bitmap and
+ * xy-pixmap.
+ */
+ uint32_t stride; /**< Bytes per image row.
+ * Computable from other
+ * data, but cached for
+ * convenience/performance.
+ */
+ uint32_t size; /**< Size of image data in bytes.
+ * Computable from other
+ * data, but cached for
+ * convenience/performance.
+ */
+ void * base; /**< Malloced block of storage that
+ * will be freed by
+ * @ref xcb_image_destroy() if non-null.
+ */
+ uint8_t * data; /**< The actual image. */
+};
+
+typedef struct xcb_shm_segment_info_t xcb_shm_segment_info_t;
+
+/**
+ * @struct xcb_shm_segment_info_t
+ * A structure that stores the informations needed by the MIT Shm
+ * Extension.
+ */
+struct xcb_shm_segment_info_t
+{
+ xcb_shm_seg_t shmseg;
+ uint32_t shmid;
+ uint8_t *shmaddr;
+};
+
+
+/**
+ * Update the cached data of an image.
+ * @param image The image.
+ *
+ * An image's size and stride, among other things, are
+ * cached in its structure. This function recomputes those
+ * cached values for the given image.
+ * @ingroup xcb__image_t
+ */
+void
+xcb_image_annotate (xcb_image_t *image);
+
+/**
+ * Create a new image.
+ * @param width The width of the image, in pixels.
+ * @param height The height of the image, in pixels.
+ * @param format The format of the image.
+ * @param xpad The scanline pad of the image.
+ * @param depth The depth of the image.
+ * @param bpp The depth of the image storage.
+ * @param unit The unit of image representation, in bits.
+ * @param byte_order The byte order of the image.
+ * @param bit_order The bit order of the image.
+ * @param base The base address of malloced image data.
+ * @param bytes The size in bytes of the storage pointed to by base.
+ * If base == 0 and bytes == ~0 and data == 0 on
+ * entry, no storage will be auto-allocated.
+ * @param data The image data. If data is null and bytes != ~0, then
+ * an attempt will be made to fill in data; from
+ * base if it is non-null (and bytes is large enough), else
+ * by mallocing sufficient storage and filling in base.
+ * @return The new image.
+ *
+ * This function allocates the memory needed for an @ref xcb_image_t structure
+ * with the given properties. See the description of xcb_image_t for details.
+ * This function initializes and returns a pointer to the
+ * xcb_image_t structure. It may try to allocate or reserve data for the
+ * structure, depending on how @p base, @p bytes and @p data are set.
+ *
+ * The image must be destroyed with xcb_image_destroy().
+ * @ingroup xcb__image_t
+ */
+xcb_image_t *
+xcb_image_create (uint16_t width,
+ uint16_t height,
+ xcb_image_format_t format,
+ uint8_t xpad,
+ uint8_t depth,
+ uint8_t bpp,
+ uint8_t unit,
+ xcb_image_order_t byte_order,
+ xcb_image_order_t bit_order,
+ void * base,
+ uint32_t bytes,
+ uint8_t * data);
+
+
+/**
+ * Create a new image in connection-native format.
+ * @param c The connection.
+ * @param width The width of the image, in pixels.
+ * @param height The height of the image, in pixels.
+ * @param format The format of the image.
+ * @param depth The depth of the image.
+ * @param base The base address of malloced image data.
+ * @param bytes The size in bytes of the storage pointed to by base.
+ * If base == 0 and bytes == ~0 and data == 0 on
+ * entry, no storage will be auto-allocated.
+ * @param data The image data. If data is null and bytes != ~0, then
+ * an attempt will be made to fill in data; from
+ * base if it is non-null (and bytes is large enough), else
+ * by mallocing sufficient storage and filling in base.
+ * @return The new image.
+ *
+ * This function calls @ref xcb_image_create() with the given
+ * properties, and with the remaining properties chosen
+ * according to the "native format" with the given
+ * properties on the current connection.
+ *
+ * It is usual to use this rather
+ * than calling xcb_image_create() directly.
+ * @ingroup xcb__image_t
+ */
+xcb_image_t *
+xcb_image_create_native (xcb_connection_t * c,
+ uint16_t width,
+ uint16_t height,
+ xcb_image_format_t format,
+ uint8_t depth,
+ void * base,
+ uint32_t bytes,
+ uint8_t * data);
+
+
+/**
+ * Destroy an image.
+ * @param image The image to be destroyed.
+ *
+ * This function frees the memory associated with the @p image
+ * parameter. If its base pointer is non-null, it frees
+ * that also.
+ * @ingroup xcb__image_t
+ */
+void
+xcb_image_destroy (xcb_image_t *image);
+
+
+/**
+ * Get an image from the X server.
+ * @param conn The connection to the X server.
+ * @param draw The drawable to get the image from.
+ * @param x The x coordinate in pixels, relative to the origin of the
+ * drawable and defining the upper-left corner of the rectangle.
+ * @param y The y coordinate in pixels, relative to the origin of the
+ * drawable and defining the upper-left corner of the rectangle.
+ * @param width The width of the subimage in pixels.
+ * @param height The height of the subimage in pixels.
+ * @param plane_mask The plane mask. See the protocol document for details.
+ * @param format The format of the image.
+ * @return The subimage of @p draw defined by @p x, @p y, @p w, @p h.
+ *
+
+ * This function returns a new image taken from the
+ * given drawable @p draw.
+ * The image will be in connection native format. If the @p format
+ * is xy-bitmap and the @p plane_mask masks bit planes out, those
+ * bit planes will be made part of the returned image anyway,
+ * by zero-filling them; this will require a fresh memory allocation
+ * and some copying. Otherwise, the resulting image will use the
+ * xcb_get_image_reply() record as its backing store.
+ *
+ * If a problem occurs, the function returns null.
+ * @ingroup xcb__image_t
+ */
+xcb_image_t *
+xcb_image_get (xcb_connection_t * conn,
+ xcb_drawable_t draw,
+ int16_t x,
+ int16_t y,
+ uint16_t width,
+ uint16_t height,
+ uint32_t plane_mask,
+ xcb_image_format_t format);
+
+
+/**
+ * Put an image onto the X server.
+ * @param conn The connection to the X server.
+ * @param draw The draw you get the image from.
+ * @param gc The graphic context.
+ * @param image The image you want to combine with the rectangle.
+ * @param x The x coordinate, which is relative to the origin of the
+ * drawable and defines the x coordinate of the upper-left corner of the
+ * rectangle.
+ * @param y The y coordinate, which is relative to the origin of the
+ * drawable and defines the x coordinate of the upper-left corner of
+ * the rectangle.
+ * @param left_pad Notionally shift an xy-bitmap or xy-pixmap image
+ * to the right some small amount, for some reason. XXX Not clear
+ * this is currently supported correctly.
+ * @return The cookie returned by xcb_put_image().
+ *
+ * This function combines an image with a rectangle of the
+ * specified drawable @p draw. The image must be in native
+ * format for the connection. The image is drawn at the
+ * specified location in the drawable. For the xy-bitmap
+ * format, the foreground pixel in @p gc defines the source
+ * for the one bits in the image, and the background pixel
+ * defines the source for the zero bits. For xy-pixmap and
+ * z-pixmap formats, the depth of the image must match the
+ * depth of the drawable; the gc is ignored.
+ *
+ * @ingroup xcb__image_t
+ */
+xcb_void_cookie_t
+xcb_image_put (xcb_connection_t * conn,
+ xcb_drawable_t draw,
+ xcb_gcontext_t gc,
+ xcb_image_t * image,
+ int16_t x,
+ int16_t y,
+ uint8_t left_pad);
+
+
+/**
+ * Check image for or convert image to native format.
+ * @param c The connection to the X server.
+ * @param image The image.
+ * @param convert If 0, just check the image for native format.
+ * Otherwise, actually convert it.
+ * @return Null if the image is not in native format and can or will not
+ * be converted. Otherwise, the native format image.
+ *
+ * Each X display has its own "native format" for images of a given
+ * format and depth. This function either checks whether the given
+ * @p image is in native format for the given connection @p c, or
+ * actually tries to convert the image to native format, depending
+ * on whether @p convert is true or false.
+ *
+ * When @p convert is true, and the image is not in native format
+ * but can be converted, it will be, and a pointer to the new image
+ * will be returned. The image passed in will be unharmed in this
+ * case; it is the caller's responsibility to check that the returned
+ * pointer is different and to dispose of the old image if desired.
+ * @ingroup xcb__image_t
+ */
+xcb_image_t *
+xcb_image_native (xcb_connection_t * c,
+ xcb_image_t * image,
+ int convert);
+
+
+/**
+ * Put a pixel to an image.
+ * @param image The image.
+ * @param x The x coordinate of the pixel.
+ * @param y The y coordinate of the pixel.
+ * @param pixel The new pixel value.
+ *
+ * This function overwrites the pixel in the given @p image with the
+ * specified @p pixel value (in client format). The image must contain the @p x
+ * and @p y coordinates, as no clipping is done. This function honors
+ * the plane-mask for xy-pixmap images.
+ * @ingroup xcb__image_t
+ */
+void
+xcb_image_put_pixel (xcb_image_t *image,
+ uint32_t x,
+ uint32_t y,
+ uint32_t pixel);
+
+/**
+ * Get a pixel from an image.
+ * @param image The image.
+ * @param x The x coordinate of the pixel.
+ * @param y The y coordinate of the pixel.
+ * @return The pixel value.
+ *
+ * This function retrieves a pixel from the given @p image.
+ * The image must contain the @p x
+ * and @p y coordinates, as no clipping is done. This function honors
+ * the plane-mask for xy-pixmap images.
+ * @ingroup xcb__image_t
+ */
+uint32_t
+xcb_image_get_pixel (xcb_image_t *image,
+ uint32_t x,
+ uint32_t y);
+
+
+/**
+ * Convert an image to a new format.
+ * @param src Source image.
+ * @param dst Destination image.
+ * @return The @p dst image, or null on error.
+ *
+ * This function tries to convert the image data of the @p
+ * src image to the format implied by the @p dst image,
+ * overwriting the current destination image data.
+ * The source and destination must have the same
+ * width, height, and depth. When the source and destination
+ * are already the same format, a simple copy is done. Otherwise,
+ * when the destination has the same bits-per-pixel/scanline-unit
+ * as the source, an optimized copy routine (thanks to Keith Packard)
+ * is used for the conversion. Otherwise, the copy is done the
+ * slow, slow way with @ref xcb_image_get_pixel() and
+ * @ref xcb_image_put_pixel() calls.
+ * @ingroup xcb__image_t
+ */
+xcb_image_t *
+xcb_image_convert (xcb_image_t * src,
+ xcb_image_t * dst);
+
+
+/**
+ * Extract a subimage of an image.
+ * @param image Source image.
+ * @param x X coordinate of subimage.
+ * @param y Y coordinate of subimage.
+ * @param width Width of subimage.
+ * @param height Height of subimage.
+ * @param base Base of memory allocation.
+ * @param bytes Size of base allocation.
+ * @param data Memory allocation.
+ * @return The subimage, or null on error.
+ *
+ * Given an image, this function extracts the subimage at the
+ * given coordinates. The requested subimage must be entirely
+ * contained in the source @p image. The resulting image will have the same
+ * general image parameters as the source image. The @p base, @p bytes,
+ * and @p data arguments are passed to @ref xcb_create_image() unaltered
+ * to create the destination image---see its documentation for details.
+ *
+ * @ingroup xcb__image_t
+ */
+xcb_image_t *
+xcb_image_subimage(xcb_image_t * image,
+ uint32_t x,
+ uint32_t y,
+ uint32_t width,
+ uint32_t height,
+ void * base,
+ uint32_t bytes,
+ uint8_t * data);
+
+
+/*
+ * Shm stuff
+ */
+
+/**
+ * Put the data of an xcb_image_t onto a drawable using the MIT Shm
+ * Extension.
+ * @param conn The connection to the X server.
+ * @param draw The draw you get the image from.
+ * @param gc The graphic context.
+ * @param image The image you want to combine with the rectangle.
+ * @param shminfo A @ref xcb_shm_segment_info_t structure.
+ * @param src_x The offset in x from the left edge of the image
+ * defined by the xcb_image_t structure.
+ * @param src_y The offset in y from the left edge of the image
+ * defined by the xcb_image_t structure.
+ * @param dest_x The x coordinate, which is relative to the origin of the
+ * drawable and defines the x coordinate of the upper-left corner of the
+ * rectangle.
+ * @param dest_y The y coordinate, which is relative to the origin of the
+ * drawable and defines the x coordinate of the upper-left corner of
+ * the rectangle.
+ * @param src_width The width of the subimage, in pixels.
+ * @param src_height The height of the subimage, in pixels.
+ * @param send_event Indicates whether or not a completion event
+ * should occur when the image write is complete.
+ * @return 1 is no problems occurs.
+ *
+ * This function combines an image in memory with a shape of the
+ * specified drawable. The section of the image defined by the @p x, @p y,
+ * @p width, and @p height arguments is drawn on the specified part of
+ * the drawable. If XYBitmap format is used, the depth must be
+ * one, or a``BadMatch'' error results. The foreground pixel in the
+ * Graphic Context @p gc defines the source for the one bits in the
+ * image, and the background pixel defines the source for the zero
+ * bits. For XYPixmap and ZPixmap, the depth must match the depth of
+ * the drawable, or a ``BadMatch'' error results.
+ *
+ * If a problem occurs, the functons returns @c 0. Otherwise, it
+ * returns @c 1.
+ * @ingroup xcb__image_t
+ */
+xcb_image_t *
+xcb_image_shm_put (xcb_connection_t * conn,
+ xcb_drawable_t draw,
+ xcb_gcontext_t gc,
+ xcb_image_t * image,
+ xcb_shm_segment_info_t shminfo,
+ int16_t src_x,
+ int16_t src_y,
+ int16_t dest_x,
+ int16_t dest_y,
+ uint16_t src_width,
+ uint16_t src_height,
+ uint8_t send_event);
+
+
+/**
+ * Read image data into a shared memory xcb_image_t.
+ * @param conn The connection to the X server.
+ * @param draw The draw you get the image from.
+ * @param image The image you want to combine with the rectangle.
+ * @param shminfo A @ref xcb_shm_segment_info_t structure.
+ * @param x The x coordinate, which are relative to the origin of the
+ * drawable and define the upper-left corner of the rectangle.
+ * @param y The y coordinate, which are relative to the origin of the
+ * drawable and define the upper-left corner of the rectangle.
+ * @param plane_mask The plane mask.
+ * @return The subimage of @p draw defined by @p x, @p y, @p w, @p h.
+ *
+ * This function reads image data into a shared memory xcb_image_t where
+ * @p conn is the connection to the X server, @p draw is the source
+ * drawable, @p image is the destination xcb_image_t, @p x and @p y are offsets
+ * within the drawable, and @p plane_mask defines which planes are to be
+ * read.
+ *
+ * If a problem occurs, the functons returns @c 0. It returns 1
+ * otherwise.
+ * @ingroup xcb__image_t
+ */
+int xcb_image_shm_get (xcb_connection_t * conn,
+ xcb_drawable_t draw,
+ xcb_image_t * image,
+ xcb_shm_segment_info_t shminfo,
+ int16_t x,
+ int16_t y,
+ uint32_t plane_mask);
+
+
+/**
+ * Create an image from user-supplied bitmap data.
+ * @param data Image data in packed bitmap format.
+ * @param width Width in bits of image data.
+ * @param height Height in bits of image data.
+ * @return The image constructed from the image data, or 0 on error.
+ *
+ * This function creates an image from the user-supplied
+ * bitmap @p data. The bitmap data is assumed to be in
+ * xbm format (i.e., 8-bit scanline unit, LSB-first, 8-bit pad).
+ * @ingroup xcb__image_t
+ */
+xcb_image_t *
+xcb_image_create_from_bitmap_data (uint8_t * data,
+ uint32_t width,
+ uint32_t height);
+
+/**
+ * Create a pixmap from user-supplied bitmap data.
+ * @param display The connection to the X server.
+ * @param d The parent drawable for the pixmap.
+ * @param data Image data in packed bitmap format.
+ * @param width Width in bits of image data.
+ * @param height Height in bits of image data.
+ * @param depth Depth of the desired pixmap.
+ * @param fg Pixel for one-bits of pixmaps with depth larger than one.
+ * @param bg Pixel for zero-bits of pixmaps with depth larger than one.
+ * @param gcp If this pointer is non-null, the GC created to
+ * fill in the pixmap is stored here; it will have its foreground
+ * and background set to the supplied value. Otherwise, the GC
+ * will be freed.
+ * @return The pixmap constructed from the image data, or 0 on error.
+ *
+ * This function creates a pixmap from the user-supplied
+ * bitmap @p data. The bitmap data is assumed to be in
+ * xbm format (i.e., 8-bit scanline unit, LSB-first, 8-bit pad).
+ * If @p depth is greater than 1, the
+ * bitmap will be expanded to a pixmap using the given
+ * foreground and background pixels @p fg and @p bg.
+ * @ingroup xcb__image_t
+ */
+xcb_pixmap_t
+xcb_create_pixmap_from_bitmap_data (xcb_connection_t * display,
+ xcb_drawable_t d,
+ uint8_t * data,
+ uint32_t width,
+ uint32_t height,
+ uint32_t depth,
+ uint32_t fg,
+ uint32_t bg,
+ xcb_gcontext_t * gcp);
+
+
+/**
+ * @}
+ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __XCB_IMAGE_H__ */
diff --git a/dist/xcb-util/image/xcb_pixel.h b/dist/xcb-util/image/xcb_pixel.h
new file mode 100644
index 000000000..fcb22b482
--- /dev/null
+++ b/dist/xcb-util/image/xcb_pixel.h
@@ -0,0 +1,171 @@
+#ifndef __XCB_PIXEL_H__
+#define __XCB_PIXEL_H__
+
+/* Copyright (C) 2007 Bart Massey
+ *
+ * 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 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.
+ *
+ * Except as contained in this notice, the names of the authors or their
+ * institutions shall not be used in advertising or otherwise to promote the
+ * sale, use or other dealings in this Software without prior written
+ * authorization from the authors.
+ */
+
+#include <inttypes.h>
+#include <X11/Xfuncproto.h>
+#ifndef BUILD
+#include <xcb/xcb_bitops.h>
+#include <xcb/xcb_image.h>
+#endif
+
+/**
+ * XCB Image fast pixel ops.
+ *
+ * Fast inline versions of xcb_image_get_pixel() and
+ * xcb_image_put_pixel() for various common cases.
+ * The naming convention is xcb_image_put_pixel_FUB()
+ * where F is the format and is either XY for bitmaps
+ * or Z for pixmaps, U is the bitmap unit size or pixmap
+ * bits-per-pixel, and B is the endianness (if needed)
+ * and is either M for most-significant-first or L for
+ * least-significant-first. Note that no checking
+ * is done on the arguments to these routines---caller beware.
+ * Also note that the pixel type is chosen to be appropriate
+ * to the unit; bitmaps use int and pixmaps use the appropriate
+ * size of unsigned.
+ * @ingroup xcb__image_t
+ */
+
+_X_INLINE static void
+xcb_image_put_pixel_XY32M (xcb_image_t *image,
+ uint32_t x,
+ uint32_t y,
+ int pixel)
+{
+ uint32_t unit = (x >> 3) & ~xcb_mask(2);
+ uint32_t byte = xcb_mask(2) - ((x >> 3) & xcb_mask(2));
+ uint32_t bit = xcb_mask(3) - (x & xcb_mask(3));
+ uint8_t m = 1 << bit;
+ uint8_t p = pixel << bit;
+ uint8_t * bp = image->data + (y * image->stride) + (unit | byte);
+ *bp = (*bp & ~m) | p;
+}
+
+_X_INLINE static void
+xcb_image_put_pixel_XY32L (xcb_image_t *image,
+ uint32_t x,
+ uint32_t y,
+ int pixel)
+{
+ uint32_t bit = x & xcb_mask(3);
+ uint8_t m = 1 << bit;
+ uint8_t p = pixel << bit;
+ uint8_t * bp = image->data + (y * image->stride) + (x >> 3);
+ *bp = (*bp & ~m) | p;
+}
+
+_X_INLINE static int
+xcb_image_get_pixel_XY32M (xcb_image_t *image,
+ uint32_t x,
+ uint32_t y)
+{
+ uint32_t unit = (x >> 3) & ~xcb_mask(2);
+ uint32_t byte = xcb_mask(2) - ((x >> 3) & xcb_mask(2));
+ uint32_t bit = xcb_mask(3) - (x & xcb_mask(3));
+ uint8_t * bp = image->data + (y * image->stride) + (unit | byte);
+ return (*bp >> bit) & 1;
+}
+
+_X_INLINE static int
+xcb_image_get_pixel_XY32L (xcb_image_t *image,
+ uint32_t x,
+ uint32_t y)
+{
+ uint32_t bit = x & xcb_mask(3);
+ uint8_t * bp = image->data + (y * image->stride) + (x >> 3);
+ return (*bp >> bit) & 1;
+}
+
+_X_INLINE static void
+xcb_image_put_pixel_Z8 (xcb_image_t *image,
+ uint32_t x,
+ uint32_t y,
+ uint8_t pixel)
+{
+ image->data[x + y * image->stride] = pixel;
+}
+
+_X_INLINE static uint8_t
+xcb_image_get_pixel_Z8 (xcb_image_t *image,
+ uint32_t x,
+ uint32_t y)
+{
+ return image->data[x + y * image->stride];
+}
+
+_X_INLINE static void
+xcb_image_put_pixel_Z32M (xcb_image_t *image,
+ uint32_t x,
+ uint32_t y,
+ uint32_t pixel)
+{
+ uint8_t * row = image->data + (y * image->stride);
+ row[x << 2] = pixel >> 24;
+ row[(x << 2) + 1] = pixel >> 16;
+ row[(x << 2) + 2] = pixel >> 8;
+ row[(x << 2) + 3] = pixel;
+}
+
+_X_INLINE static void
+xcb_image_put_pixel_Z32L (xcb_image_t *image,
+ uint32_t x,
+ uint32_t y,
+ uint32_t pixel)
+{
+ uint8_t * row = image->data + (y * image->stride);
+ row[x << 2] = pixel;
+ row[(x << 2) + 1] = pixel >> 8;
+ row[(x << 2) + 2] = pixel >> 16;
+ row[(x << 2) + 3] = pixel >> 24;
+}
+
+_X_INLINE static uint32_t
+xcb_image_get_pixel_Z32M (xcb_image_t *image,
+ uint32_t x,
+ uint32_t y)
+{
+ uint8_t * row = image->data + (y * image->stride);
+ uint32_t pixel = row[x << 2] << 24;
+ pixel |= row[(x << 2) + 1] << 16;
+ pixel |= row[(x << 2) + 2] << 8;
+ return pixel | row[(x << 2) + 3];
+}
+
+_X_INLINE static uint32_t
+xcb_image_get_pixel_Z32L (xcb_image_t *image,
+ uint32_t x,
+ uint32_t y)
+{
+ uint8_t * row = image->data + (y * image->stride);
+ uint32_t pixel = row[x << 2];
+ pixel |= row[(x << 2) + 1] << 8;
+ pixel |= row[(x << 2) + 2] << 16;
+ return pixel | row[(x << 2) + 3] << 24;
+}
+
+#endif /* __XCB_PIXEL_H__ */