diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2009-05-23 14:38:22 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2009-05-23 14:38:22 +0000 |
commit | 86bb951017acff65627eb198fe1fa4c73b46aad4 (patch) | |
tree | 18afd632e81d724b548b60373016d1459dfce5f3 /dist/xcb-util/image | |
parent | 013b4a3065ff281c23c32277f08a521fd7922c23 (diff) |
import xcb-util 0.3.4
Diffstat (limited to 'dist/xcb-util/image')
-rw-r--r-- | dist/xcb-util/image/Makefile.am | 44 | ||||
-rw-r--r-- | dist/xcb-util/image/Makefile.in | 784 | ||||
-rw-r--r-- | dist/xcb-util/image/test_bitmap.c | 169 | ||||
-rw-r--r-- | dist/xcb-util/image/test_formats.c | 202 | ||||
-rw-r--r-- | dist/xcb-util/image/test_swap.c | 239 | ||||
-rw-r--r-- | dist/xcb-util/image/test_xcb_image.c | 226 | ||||
-rw-r--r-- | dist/xcb-util/image/test_xcb_image_shm.c | 183 | ||||
-rw-r--r-- | dist/xcb-util/image/xcb-image.pc.in | 11 | ||||
-rw-r--r-- | dist/xcb-util/image/xcb_image.c | 1009 | ||||
-rw-r--r-- | dist/xcb-util/image/xcb_image.h | 630 | ||||
-rw-r--r-- | dist/xcb-util/image/xcb_pixel.h | 171 |
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__ */ |