[Xcb-commit] 3 commits - Doxyfile image

Bart Massey bart at kemper.freedesktop.org
Fri Dec 7 00:49:44 PST 2007


 Doxyfile                   | 1246 +++++++++++++++++++++++++++++++++++++--
 image/.gitignore           |    2 
 image/Makefile.am          |    8 
 image/test_bitmap.c        |  110 +++
 image/test_formats.c       |  118 ++-
 image/test_xcb_image.c     |   81 --
 image/test_xcb_image_shm.c |   45 -
 image/xcb_image.c          | 1429 ++++++++++++++++++++++++++++-----------------
 image/xcb_image.h          |  588 ++++++++++++------
 image/xcb_pixel.h          |  169 +++++
 10 files changed, 2902 insertions(+), 894 deletions(-)

New commits:
commit aaaaf9a3c4fb8d160dfa5874585fbacb2dbea719
Author: Bart Massey <bart at cs.pdx.edu>
Date:   Fri Dec 7 00:48:25 2007 -0800

    used doxygen -u to create a much more elaborate doxyfile

diff --git a/Doxyfile b/Doxyfile
index b915677..937be7a 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -1,139 +1,1301 @@
-PROJECT_NAME           = XCB Utility
-PROJECT_NUMBER         =
+# Doxyfile 1.5.3-20071008
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file that 
+# follow. The default is UTF-8 which is also the encoding used for all text before 
+# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into 
+# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of 
+# possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = XCBUtility
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = 
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
 OUTPUT_DIRECTORY       = doc/
-INPUT                  = xcb_util_intro image/
-IMAGE_PATH             = doc/img
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, 
+# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, 
+# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, 
+# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
+
 OUTPUT_LANGUAGE        = English
-GENERATE_HTML          = YES
-HTML_OUTPUT            = html
-HTML_FILE_EXTENSION    = .html
-HTML_HEADER            = 
-HTML_FOOTER            = 
-HTML_STYLESHEET        = 
-HTML_ALIGN_MEMBERS     = YES
-ENUM_VALUES_PER_LINE   = 1
-GENERATE_HTMLHELP      = NO
-CHM_FILE               = 
-HHC_LOCATION           = 
-GENERATE_CHI           = NO
-BINARY_TOC             = NO
-TOC_EXPAND             = NO
-DISABLE_INDEX          = NO
-EXTRACT_ALL            = NO
-EXTRACT_PRIVATE        = NO
-EXTRACT_STATIC         = NO
-EXTRACT_LOCAL_CLASSES  = NO
-HIDE_UNDOC_MEMBERS     = YES
-HIDE_UNDOC_CLASSES     = YES
-HIDE_FRIEND_COMPOUNDS  = YES
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
 BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
 REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = 
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
 ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
 INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
 FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
 STRIP_FROM_PATH        = 
-INTERNAL_DOCS          = NO
-STRIP_CODE_COMMENTS    = YES
-CASE_SENSE_NAMES       = YES
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
 SHORT_NAMES            = NO
-HIDE_SCOPE_NAMES       = NO
-VERBATIM_HEADERS       = NO
-SHOW_INCLUDE_FILES     = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
+
 JAVADOC_AUTOBRIEF      = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
+# interpret the first line (until the first dot) of a Qt-style 
+# comment as the brief description. If set to NO, the comments 
+# will behave just like regular Qt-style comments (thus requiring 
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
 MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member 
+# documentation.
+
 DETAILS_AT_TOP         = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
 INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 2
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for Java. 
+# For instance, namespaces will be presented as packages, qualified scopes 
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
+# include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
+# Doxygen will parse them like normal C++ but will assume all classes use public 
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = NO
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be extracted 
+# and appear in the documentation as a namespace called 'anonymous_namespace{file}', 
+# where file will be replaced with the base name of the file that contains the anonymous 
+# namespace. By default anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = YES
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = YES
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = YES
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
 INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
 SORT_MEMBER_DOCS       = YES
-DISTRIBUTE_GROUP_DOC   = NO
-TAB_SIZE               = 2
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
 GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
 GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
 GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
 GENERATE_DEPRECATEDLIST= YES
-ALIASES                = 
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
 ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
 MAX_INITIALIZER_LINES  = 30
-OPTIMIZE_OUTPUT_FOR_C  = YES
-OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
 SHOW_USED_FILES        = NO
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from the 
+# version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
 QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
 WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
 WARN_IF_UNDOCUMENTED   = YES
-WARN_FORMAT            = "$file:$line: $text"
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text "
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
 WARN_LOGFILE           = 
-FILE_PATTERNS          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = xcb_util_intro \
+                         image/
+
+# This tag can be used to specify the character encoding of the source files that 
+# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default 
+# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. 
+# See http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS          = 
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
 RECURSIVE              = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
 EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
 EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
 EXCLUDE_PATTERNS       = 
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
+# (namespaces, classes, functions, etc.) that should be excluded from the output. 
+# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, 
+# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
 EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
 EXAMPLE_PATTERNS       = 
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
 EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = doc/img
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
 INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
 FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH 
+# then you must also enable this option. If you don't then doxygen will produce 
+# a warning and turn it on anyway
+
 SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
 INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
 REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default) 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
 REFERENCES_RELATION    = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.  Otherwise they will link to the documentstion.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
 ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
 COLS_IN_ALPHA_INDEX    = 2
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
 IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
+# documentation will contain sections that can be hidden and shown after the 
+# page has loaded. For this to work a browser that supports 
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 1
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
+# probably better off using the HTML help feature.
+
 GENERATE_TREEVIEW      = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
 TREEVIEW_WIDTH         = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
 GENERATE_LATEX         = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
 LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name.
+
 LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
 MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
 COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
 PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
 EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
 LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
 PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
 USE_PDFLATEX           = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
 LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
 GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
 RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
 COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
 RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
 RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
 RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
 GENERATE_MAN           = YES
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
 MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
 MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
 MAN_LINKS              = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
 GENERATE_XML           = YES
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
 XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
 XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
 GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
 ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
 MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
 EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
 SEARCH_INCLUDES        = NO
-INCLUDE_PATH           =
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
 INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
 PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
 EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
 SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
 TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
 GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
 ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
 EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
 PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
 CLASS_DIAGRAMS         = NO
+
+# You can define message sequence charts within doxygen comments using the \msc 
+# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to 
+# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to 
+# specify the directory where the mscgen tool resides. If left empty the tool is assumed to 
+# be found in the default search path.
+
+MSCGEN_PATH            = 
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
 HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
 HAVE_DOT               = NO
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
 CLASS_GRAPH            = NO
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
 COLLABORATION_GRAPH    = NO
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
 TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
 INCLUDE_GRAPH          = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
 INCLUDED_BY_GRAPH      = NO
+
+# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will 
+# generate a call dependency graph for every global function or class method. 
+# Note that enabling this option will significantly increase the time of a run. 
+# So in most cases it will be better to enable call graphs for selected 
+# functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will 
+# generate a caller dependency graph for every global function or class method. 
+# Note that enabling this option will significantly increase the time of a run. 
+# So in most cases it will be better to enable caller graphs for selected 
+# functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
 GRAPHICAL_HIERARCHY    = NO
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
 DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
 DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
 DOTFILE_DIRS           = 
-MAX_DOT_GRAPH_WIDTH    = 512
-MAX_DOT_GRAPH_HEIGHT   = 512
+
+# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
+# nodes that will be shown in the graph. If the number of nodes in a graph 
+# becomes larger than this value, doxygen will truncate the graph, which is 
+# visualized by representing a node as a red box. Note that doxygen if the number 
+# of direct children of the root node in a graph is already larger than 
+# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note 
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, which results in a white background. 
+# Warning: Depending on the platform used, enabling this option may lead to 
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
+# read).
+
+DOT_TRANSPARENT        = YES
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
 GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
 DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be 
+# used. If set to NO the values of all tags below this one will be ignored.
+
 SEARCHENGINE           = NO
commit 4eca47fa04ee3c50667d94994902c176b27bdbd8
Author: Bart Massey <bart at cs.pdx.edu>
Date:   Fri Dec 7 00:44:11 2007 -0800

    ...and in with the new image library

diff --git a/image/.gitignore b/image/.gitignore
new file mode 100644
index 0000000..586956e
--- /dev/null
+++ b/image/.gitignore
@@ -0,0 +1,5 @@
+test_xcb_image
+test_xcb_image_shm
+test_formats
+test_bitmap
+test.xbm
diff --git a/image/Makefile.am b/image/Makefile.am
new file mode 100644
index 0000000..9a88187
--- /dev/null
+++ b/image/Makefile.am
@@ -0,0 +1,37 @@
+
+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
+
+noinst_PROGRAMS = test_xcb_image test_xcb_image_shm test_formats test_bitmap
+
+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/image/test_bitmap.c b/image/test_bitmap.c
new file mode 100644
index 0000000..5328516
--- /dev/null
+++ b/image/test_bitmap.c
@@ -0,0 +1,110 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <xcb/xcb.h>
+#include <xcb/xcb_aux.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 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, test_width, test_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) {
+    xcb_generic_event_t *e;
+    xcb_void_cookie_t cookie;
+
+    while ((e = xcb_wait_for_event(c))) {
+	uint32_t r = e->response_type & 0x7f;
+	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,
+					   test_width, test_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);
+    }
+}
+		       
+int main(int argc, char **argv) {
+    int snum;
+    xcb_void_cookie_t check_cookie;
+    xcb_window_t w;
+    xcb_gcontext_t gc;
+    xcb_pixmap_t p;
+    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;
+    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);
+    gc = xcb_generate_id(c);
+    check_cookie = xcb_create_gc_checked(c, gc, w, 0, 0);
+    assert(!xcb_request_check(c, check_cookie));
+    p = xcb_create_pixmap_from_bitmap_data(c, w,
+          (uint8_t *)test_bits, test_width, test_height,
+	  s->root_depth, fg, bg, 0);
+    assert(p);
+    process_events(c, gc, w, p);
+    xcb_disconnect(c);
+    return 1;
+}
diff --git a/image/test_formats.c b/image/test_formats.c
new file mode 100644
index 0000000..276f442
--- /dev/null
+++ b/image/test_formats.c
@@ -0,0 +1,174 @@
+#include <xcb/xcb.h>
+#include "xcb_image.h"
+#include "xcb_aux.h"
+#include "xcb_bitops.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.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->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/image/test_xcb_image.c b/image/test_xcb_image.c
new file mode 100644
index 0000000..56904cf
--- /dev/null
+++ b/image/test_xcb_image.c
@@ -0,0 +1,198 @@
+/* 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 "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/image/test_xcb_image_shm.c b/image/test_xcb_image_shm.c
new file mode 100644
index 0000000..d22825c
--- /dev/null
+++ b/image/test_xcb_image_shm.c
@@ -0,0 +1,167 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+#include <xcb/xcb.h>
+#include <xcb/shm.h>
+
+#include "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;
+  
+  /* 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)
+    {
+      uint8_t format;
+      
+      if (!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);
+/*   points[0].x = 10; */
+/*   points[0].y = 10; */
+/*   points[1].x = 10; */
+/*   points[1].y = 40; */
+/*   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/image/xcb-image.pc.in b/image/xcb-image.pc.in
new file mode 100644
index 0000000..403fdd0
--- /dev/null
+++ b/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/image/xcb_image.c b/image/xcb_image.c
new file mode 100644
index 0000000..b5e78a7
--- /dev/null
+++ b/image/xcb_image.c
@@ -0,0 +1,993 @@
+/* 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 <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <xcb/xcb.h>
+#include <xcb/shm.h>
+#include <xcb/xcb_aux.h>
+#include "xcb_bitops.h"
+#include "xcb_image.h"
+#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 || bpp > unit)
+      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->plane_mask = xcb_mask(image->depth);
+      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->plane_mask = 0;
+      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 = (xcb_image_t *)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->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)
+      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);
+      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;
+  }
+}
+
+
+/* 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 (image->format) {
+  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   ulog = image->bpp >> 4;
+	  uint32_t   unit = (x >> 3) & ~xcb_mask(ulog);
+	  uint32_t   byte = (x >> 3) & xcb_mask(ulog);
+	  uint32_t   bit = x & 7;
+
+	  if (image->byte_order == XCB_IMAGE_ORDER_MSB_FIRST)
+	      byte = xcb_mask(ulog) - byte;
+	  if (image->bit_order == XCB_IMAGE_ORDER_MSB_FIRST) {
+	      bit = 7 - bit;
+	  } else {
+	      pixel = xcb_bit_reverse(pixel, image->bpp);
+	      plane_mask = xcb_bit_reverse(plane_mask, image->bpp);
+	  }
+	  for (p = 0; p < image->bpp; p++) {
+	      if (plane_mask & 1) {
+		  uint8_t *  bp = plane + (unit | byte);
+		  uint8_t    m = 1 << bit;
+		  uint8_t    p = (pixel & 1) << bit;
+		  *bp = (*bp & ~m) | p;
+	      }
+	      plane += image->stride * image->height;
+	      pixel >>= 1;
+	      plane_mask >>= 1;
+	  }
+      }
+      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 (image->format) {
+  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   ulog = image->bpp >> 4;
+	  uint32_t   unit = (x >> 3) & ~xcb_mask(ulog);
+	  uint32_t   byte = (x >> 3) & xcb_mask(ulog);
+	  uint32_t   bit = x & 7;
+
+	  if (image->byte_order == XCB_IMAGE_ORDER_MSB_FIRST)
+	      byte = xcb_mask(ulog) - byte;
+	  if (image->bit_order == XCB_IMAGE_ORDER_MSB_FIRST) {
+	      bit = 7 - bit;
+	  } else {
+	      plane_mask = xcb_bit_reverse(plane_mask, image->bpp);
+	  }
+	  for (p = 0; p < image->bpp; p++) {
+	      pixel <<= 1;
+	      if (plane_mask & 1) {
+		  uint8_t *  bp = plane + (unit | byte);
+		  pixel |= (*bp >> bit) & 1;
+	      }
+	      plane += image->stride * image->height;
+	      plane_mask >>= 1;
+	  }
+	  if (image->bit_order == XCB_IMAGE_ORDER_LSB_FIRST)
+	      pixel = xcb_bit_reverse(pixel, image->bpp);
+      }
+      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);
+  }
+}
+
+
+/*
+ * (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_image_format_t  format = XCB_IMAGE_FORMAT_XY_PIXMAP;
+  xcb_gcontext_t gc;
+  uint32_t mask = 0;
+  xcb_params_gc_t gcv;
+
+  if (depth > 1)
+      format = XCB_IMAGE_FORMAT_XY_BITMAP;
+  image = xcb_image_create(width, height, format,
+			   8, 1, 1, 8,
+			   XCB_IMAGE_ORDER_LSB_FIRST,
+			   XCB_IMAGE_ORDER_LSB_FIRST,
+			   0, 0, data);
+  if (!image)
+      return 0;
+  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 at keithp.com> for this code */
+static void 
+swap_image(uint8_t *	     src,
+           uint32_t 	     src_stride,
+	   uint8_t *	     dst,
+	   uint32_t 	     dst_stride,
+	   uint8_t const *   byte_order,
+	   int		     unit_bytes,
+	   uint16_t 	     height,
+	   int		     bitswap,
+	   int               nibbleswap)
+{
+  while (height--) {
+      uint32_t    minor = 0;
+      uint32_t    major = 0;
+      uint32_t    s;
+
+      for (s = 0; s < src_stride; s++) {
+	  uint8_t   b;
+	  uint32_t  d = major + byte_order[minor];
+
+	  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;
+
+	  if (++minor == unit_bytes) 
+	  {
+	      minor = 0; 
+	      major += unit_bytes;
+	  }
+      }
+      src += src_stride;
+      dst += dst_stride;
+  }
+}
+
+/* Note that all of these permutations are self-inverse.
+   Applying them twice yields the identity permutation, i.e p*p = i
+   This means that we only have to care about the
+   source and destination size and whether they mismatch, not
+   the actual endiannesses. */
+static uint8_t const forward_order[4] = {0, 1, 2, 3};
+static uint8_t const reverse_order[4] = {3, 2, 1, 0};
+static uint8_t const reverse_word_order[4] = {2, 3, 0, 1};
+
+static uint8_t const *
+conversion_byte_order(xcb_image_t *src, xcb_image_t *dst)
+{
+    uint8_t  nbytes = src->unit >> 3;
+    
+    if (src->byte_order == dst->byte_order)
+	return forward_order;
+    if (nbytes >= 1 && nbytes <= 4)
+	return &reverse_order[4 - nbytes];
+    return forward_order;
+}
+
+
+#define R1 forward_order
+#define R2 reverse_word_order
+#define R4 reverse_order
+#define W4 reverse_word_order
+
+static uint8_t const * const bbo_reverse[3][3] =
+        /* 8  16  32*/
+  /*8*/ {{R1, R2, R4},
+ /*16*/  {R2, R2, W4},
+ /*32*/  {R4, W4, R4}};
+
+static uint8_t const *
+bitmap_conversion_byte_order(xcb_image_t *src, xcb_image_t *dst)
+{
+    uint8_t  srclog = src->unit >> 4;
+    uint8_t  dstlog = dst->unit >> 4;
+    int sbo = src->byte_order;
+    int dbo = dst->byte_order;
+
+    if (srclog == 0)
+	sbo = XCB_IMAGE_ORDER_LSB_FIRST;
+    if (dstlog == 0)
+	dbo = XCB_IMAGE_ORDER_LSB_FIRST;
+    if (dbo == sbo)
+	return forward_order;
+    return bbo_reverse[srclog][dstlog];
+}
+
+
+xcb_image_t *
+xcb_image_convert (xcb_image_t *  src,
+		   xcb_image_t *  dst)
+{
+  uint32_t            x;
+  uint32_t            y;
+  int                 format_compatible = 0;
+  int                 bitmap = 0;
+  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));
+  if (src->depth != dst->depth ||
+      src->width != dst->width ||
+      src->height != dst->height)
+      return 0;
+  switch (ef) {
+  case XCB_IMAGE_FORMAT_XY_PIXMAP:
+      bitmap = src->depth == 1;
+      format_compatible = src->format == dst->format || bitmap;
+      /* Case: Formats are identical.  Just copy. */
+      if (format_compatible &&
+	  src->bpp == dst->bpp &&
+	  src->unit == dst->unit &&
+	  src->scanline_pad == dst->scanline_pad &&
+	  src->byte_order == dst->byte_order &&
+	  src->bit_order == dst->bit_order) {
+	  memcpy(dst->data, src->data, src->size);
+	  return dst;
+      }
+      break;
+  case XCB_IMAGE_FORMAT_Z_PIXMAP:
+      format_compatible = src->format == dst->format;
+      /* Case: Formats are identical.  Just copy. */
+      if (format_compatible &&
+	  src->bpp == dst->bpp &&
+	  src->byte_order == dst->byte_order) {
+	  memcpy(dst->data, src->data, src->size);
+	  return dst;
+      }
+      break;
+  default:
+      assert(0);
+  }
+  /* Case: Bitmap scanline units are always compatible.  Copy and convert. */
+  if (bitmap) {
+      uint8_t const * const
+	       byte_order = bitmap_conversion_byte_order(src, dst);
+      int      bitswap = src->bit_order != dst->bit_order;
+      uint8_t  unit = src->unit;
+      
+      if (dst->unit < unit)
+	  unit = dst->unit;
+      swap_image(src->data, src->stride,
+		     dst->data, dst->stride,
+		     byte_order, unit >> 3,
+		     src->height, bitswap, 0);
+      return dst;
+  }
+  /* Case: Pixmap scanline units are identical.  Copy and convert. */
+  if (format_compatible && src->bpp == dst->bpp) {
+      uint8_t const * const
+	   byte_order = conversion_byte_order(src, dst);
+      int  bitswap = src->bit_order != dst->bit_order;
+      int  nibbleswap = src->byte_order != dst->byte_order &&
+                        src->bpp == 4;
+      swap_image(src->data, src->stride,
+		     dst->data, dst->stride,
+		     byte_order, src->unit >> 3,
+		     src->height, bitswap, nibbleswap);
+      return dst;
+  }
+
+  /* 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;
+}
diff --git a/image/xcb_image.h b/image/xcb_image.h
new file mode 100644
index 0000000..e9e427e
--- /dev/null
+++ b/image/xcb_image.h
@@ -0,0 +1,580 @@
+#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 xcb_get_pixel() and xcb_put_pixel() calls.
+ * @ingroup xcb__image_t
+ */
+xcb_image_t *
+xcb_image_convert (xcb_image_t *  src,
+		   xcb_image_t *  dst);
+
+
+/*
+ * 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 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/image/xcb_pixel.h b/image/xcb_pixel.h
new file mode 100644
index 0000000..d7d5382
--- /dev/null
+++ b/image/xcb_pixel.h
@@ -0,0 +1,169 @@
+#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>
+#include <xcb/xcb_bitops.h>
+#include <xcb/xcb_image.h>
+
+/**
+ * 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__ */
commit 4bda072a8f824914f97306da0993c9b5cbef1ffc
Author: Bart Massey <bart at cs.pdx.edu>
Date:   Fri Dec 7 00:34:23 2007 -0800

    out with the old image library...

diff --git a/image/.gitignore b/image/.gitignore
deleted file mode 100644
index f72f791..0000000
--- a/image/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-test_xcb_image
-test_xcb_image_shm
-test_formats
diff --git a/image/Makefile.am b/image/Makefile.am
deleted file mode 100644
index 6e4a59f..0000000
--- a/image/Makefile.am
+++ /dev/null
@@ -1,33 +0,0 @@
-
-MAINTAINERCLEANFILES = Makefile.in
-
-lib_LTLIBRARIES = libxcb-image.la
-
-xcbinclude_HEADERS = xcb_image.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
-
-noinst_PROGRAMS = test_xcb_image test_xcb_image_shm test_formats
-
-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)
diff --git a/image/test_formats.c b/image/test_formats.c
deleted file mode 100644
index b7a01ed..0000000
--- a/image/test_formats.c
+++ /dev/null
@@ -1,146 +0,0 @@
-#include <xcb/xcb.h>
-#include "xcb_image.h"
-#include "xcb_aux.h"
-#include <stdio.h>
-#include <stdlib.h>
-
-#define WIDTH 50
-#define HEIGHT 50
-
-#if 0
-static int xpad(int depth)
-{
-	if(depth <= 8)
-		return 8;
-	if(depth <= 16)
-		return 16;
-	return 32;
-}
-#endif
-
-/* FIXME: this function doesn't work correctly for XYPixmaps yet. */
-static xcb_image_t *create_image(xcb_connection_t *c, int depth, int format)
-{
-#if 0
-	int pad = (format == ZPixmap ? xpad(depth) : 8);
-#endif
-	xcb_image_t *im;
-	int x, y;
-	uint32_t i = 0;
-	printf("Image depth %d, format %d\n", depth, format);
-	im = xcb_image_create(c, depth, format, 0, 0, WIDTH, HEIGHT, 32, 0);
-	if(!im)
-	{
-		printf("ImageCreate failed.\n");
-		return 0;
-	}
-	im->data = malloc(im->bytes_per_line * HEIGHT * (format == XCB_IMAGE_FORMAT_Z_PIXMAP ? 1 : depth));
-	if(!im->data)
-	{
-		xcb_image_destroy(im);
-		return 0;
-	}
-	for(x = 0; x < WIDTH; ++x)
-		for(y = 0; y < HEIGHT; ++y)
-		{
-			xcb_image_put_pixel(im, x, y, i);
-			++i;
-			i &= (1 << depth) - 1;
-		}
-	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_screen_t *root)
-{
-	static const uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND;
-	const uint32_t values[] = { root->black_pixel, root->white_pixel };
-	const xcb_drawable_t d = { root->root };
-	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;
-}
-
-int main(int argc, char **argv)
-{
-	int screen, depth, format = XCB_IMAGE_FORMAT_Z_PIXMAP;
-	xcb_screen_t *root;
-	xcb_image_t *im;
-	xcb_drawable_t d, w = XCB_NONE;
-	xcb_gcontext_t gc;
-	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);
-	if(argc > 1)
-		format = atoi(argv[1]);
-	if(format == XCB_IMAGE_FORMAT_XY_BITMAP || argc > 2)
-		depth = 1;
-	else
-		depth = root->root_depth;
-
-	im = create_image(c, depth, format);
-	d = create_window(c, root);
-	if(depth != root->root_depth)
-	{
-		w = d;
-		d = create_pixmap(c, w, depth);
-	}
-	gc = create_gcontext(c, 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)
-			{
-				xcb_image_put(c, d, gc, im, 0, 0, 0, 0, WIDTH, HEIGHT);
-				if(w)
-				{
-					unsigned int seq;
-					seq = xcb_copy_plane(c, d, w, gc, 0, 0, WIDTH, HEIGHT, 0, 0, 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/image/test_xcb_image.c b/image/test_xcb_image.c
deleted file mode 100644
index f459489..0000000
--- a/image/test_xcb_image.c
+++ /dev/null
@@ -1,229 +0,0 @@
-/* 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 "xcb_aux.h"
-#include "xcb_image.h"
-
-#define W_W 4
-#define W_H 4
-
-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 i, j;
-  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,
-			 XCB_ALL_PLANES,
-			 format);
-
-  printf ("Create image summary:\n");
-  printf (" * format..........: %d\n", image->format);
-  printf (" * byte order......: %d\n", image->image_byte_order);
-  printf (" * bitmap unit.....: %d\n", image->bitmap_format_scanline_unit);
-  printf (" * bitmap order....: %d\n", image->bitmap_format_bit_order);
-  printf (" * bitmap pad......: %d\n", image->bitmap_format_scanline_pad);
-  printf (" * depth...........: %d\n", image->depth);
-  printf (" * bytes/line......: %d\n", image->bytes_per_line);
-  printf (" * bits/pixel......: %d\n", image->bits_per_pixel);
-
-  printf ("bpl %d %d\n", image->bytes_per_line, image->height);
-
-  for (j = 0 ; j < image->height ; j++)
-    {
-      for (i = 0 ; i < image->width ; i++)
-	{
-	  pixel1 = xcb_image_get_pixel (image, i, j);
-	  printf ("%6d ", pixel1);
-	}
-      printf ("\n");
-    }
-
-  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 ("\n");
-    }
-  printf("putting image\n");
-  for (j = 0 ; j < image->height ; j++)
-    {
-      for (i = 0 ; i < image->width ; i++)
-	{
-	  pixel1 = xcb_image_get_pixel (image, i, j);
-	  printf ("%6d ", pixel1);
-	}
-      printf ("\n");
-    }
-  xcb_image_put (c, new_win, gc, image,
-		 0, 0, 0, 0, width, height);
-  image = xcb_image_get (c, new_win,
-			 0, 0, width, height,
-			 XCB_ALL_PLANES,
-			 format);
-  printf ("New : \n");
-  for (j = 0 ; j < image->height ; j++)
-    {
-      for (i = 0 ; i < image->width ; i++)
-	{
-	  pixel1 = xcb_image_get_pixel (image, i, j);
-	  printf ("%6d ", pixel1);
-	}
-      printf ("\n");
-    }
-  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 = 1;
-  points[1].y = 1;
-  xcb_poly_line(c, XCB_COORD_MODE_ORIGIN, rect, fgcolor, 2, points);
-/*   points[0].x = 10; */
-/*   points[0].y = 10; */
-/*   points[1].x = 10; */
-/*   points[1].y = 40; */
-/*   xcb_poly_line(c, CoordModeOrigin, 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/image/test_xcb_image_shm.c b/image/test_xcb_image_shm.c
deleted file mode 100644
index ca5cd03..0000000
--- a/image/test_xcb_image_shm.c
+++ /dev/null
@@ -1,166 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-
-#include <sys/ipc.h>
-#include <sys/shm.h>
-
-#include <xcb/xcb.h>
-#include <xcb/shm.h>
-
-#include "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;
-  
-  /* 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)
-    {
-      uint8_t format;
-      
-      if (rep->shared_pixmaps && 
-	  (rep->major_version > 1 || rep->minor_version > 0))
-	format = rep->pixmap_format;
-      else
-	format = 0;
-      img = xcb_image_shm_create (c, depth, format, NULL, W_W, W_H);
-
-      printf ("Create image summary:\n");
-      printf (" * format..........: %d\n", img->format);
-      printf (" * byte order......: %d\n", img->image_byte_order);
-      printf (" * bitmap unit.....: %d\n", img->bitmap_format_scanline_unit);
-      printf (" * bitmap order....: %d\n", img->bitmap_format_bit_order);
-      printf (" * bitmap pad......: %d\n", img->bitmap_format_scanline_pad);
-
-      shminfo.shmid = shmget (IPC_PRIVATE,
-			      img->bytes_per_line*img->height,
-			      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);
-    }
-
-  if (!img)
-    {
-      printf ("Can't use shm...\n");
-      exit (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);
-/*   points[0].x = 10; */
-/*   points[0].y = 10; */
-/*   points[1].x = 10; */
-/*   points[1].y = 40; */
-/*   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/image/xcb-image.pc.in b/image/xcb-image.pc.in
deleted file mode 100644
index 403fdd0..0000000
--- a/image/xcb-image.pc.in
+++ /dev/null
@@ -1,11 +0,0 @@
-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/image/xcb_image.c b/image/xcb_image.c
deleted file mode 100644
index dc30e27..0000000
--- a/image/xcb_image.c
+++ /dev/null
@@ -1,634 +0,0 @@
-/* gcc -g -O2 -Wall -c `pkg-config --cflags xcb` -o xcb_image.o xcb_image.c */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <xcb/xcb.h>
-#include <xcb/shm.h>
-
-#include "xcb_image.h"
-
-/* Convenient */
-static uint8_t          xcb_bits_per_pixel   (xcb_connection_t *c, uint8_t depth);
-static uint32_t         xcb_bytes_per_line   (uint8_t pad, uint16_t width, uint8_t bpp);
-static uint8_t          xcb_scanline_pad_get (xcb_connection_t *conn,
-					    uint8_t          depth);
-
-static inline uint32_t _lomask(int n)
-{
-  return (1 << n) - 1;
-}
-
-static unsigned int Ones(                /* HAKMEM 169 */
-    uint32_t mask)
-{
-    register uint32_t y;
-
-    y = (mask >> 1) &033333333333;
-    y = mask - y - ((y >>1) & 033333333333);
-    return ((unsigned int) (((y + (y >> 3)) & 030707070707) % 077));
-}
-
-
-/* Convenient functions */
-
-static uint8_t
-xcb_bits_per_pixel (xcb_connection_t *c, uint8_t depth)
-{ 
-  xcb_format_t *fmt = xcb_setup_pixmap_formats(xcb_get_setup(c));
-  xcb_format_t *fmtend = fmt + xcb_setup_pixmap_formats_length(xcb_get_setup(c));
-  
-  for(; fmt != fmtend; ++fmt)
-    if(fmt->depth == depth)
-      return fmt->bits_per_pixel;
-  
-  if(depth <= 4)
-    return 4;
-  if(depth <= 8)
-    return 8;
-  if(depth <= 16)
-    return 16;
-  return 32;
-}
-
-static uint32_t
-xcb_bytes_per_line (uint8_t pad, uint16_t width, uint8_t bpp)
-{
-  return ((bpp * width + pad - 1) & -pad) >> 3;
-}
-
-static uint8_t
-xcb_scanline_pad_get (xcb_connection_t *conn,
-		      uint8_t          depth)
-{
-  xcb_format_t *fmt = xcb_setup_pixmap_formats(xcb_get_setup(conn));
-  xcb_format_t *fmtend = fmt + xcb_setup_pixmap_formats_length(xcb_get_setup(conn));
-  
-  for(; fmt != fmtend; ++fmt)
-    if(fmt->depth == depth)
-      {
-	return fmt->scanline_pad;
-      }
-
-  return xcb_get_setup (conn)->bitmap_format_scanline_pad;
-
-/*   xcb_format_iterator_t iter; */
-/*   int           cur; */
-
-/*   iter =  xcb_setup_pixmap_formats_iterator (conn->setup); */
-/*   for (cur = 0 ; cur < iter.rem ; cur++, xcb_format_next (&iter)) */
-/*     if (iter.data->depth == depth) */
-/*       return iter.data->scanline_pad; */
-  
-/*   return xcb_get_setup (conn)->bitmap_format_scanline_pad; */
-}
-
-static int format_invalid(uint8_t depth, uint8_t format, uint8_t xpad)
-{
-  return (depth == 0 || depth > 32 ||
-      (format != XCB_IMAGE_FORMAT_XY_BITMAP &&
-       format != XCB_IMAGE_FORMAT_XY_PIXMAP &&
-       format != XCB_IMAGE_FORMAT_Z_PIXMAP) ||
-      (format == XCB_IMAGE_FORMAT_XY_BITMAP && depth != 1) ||
-      (xpad != 8 && xpad != 16 && xpad != 32));
-}
-
-xcb_image_t *
-xcb_image_create (xcb_connection_t *conn,
-		uint8_t          depth,
-		uint8_t          format,
-		unsigned int   offset,
-		uint8_t          *data,
-		uint16_t         width,
-		uint16_t         height,
-		uint8_t          xpad,
-		uint32_t         bytes_per_line)
-{
-  xcb_image_t       *image;
-  const xcb_setup_t *rep;
-  uint8_t          bpp = 1; /* bits per pixel */
-
-  if (format_invalid(depth, format, xpad))
-    return (xcb_image_t *) NULL;
-
-  image = (xcb_image_t *)malloc (sizeof (xcb_image_t));
-  if (image == NULL)
-    return NULL;
-  
-  rep = xcb_get_setup (conn);
-
-  image->width = width;
-  image->height = height;
-  image->format = format;
-  image->image_byte_order = rep->image_byte_order;
-  image->bitmap_format_scanline_unit = rep->bitmap_format_scanline_unit;
-  image->bitmap_format_bit_order = rep->bitmap_format_bit_order;
-  image->bitmap_format_scanline_pad = xpad;
-  
-  if (format == XCB_IMAGE_FORMAT_Z_PIXMAP) 
-    {
-      bpp = xcb_bits_per_pixel (conn, depth);
-    }
-
-  image->xoffset = offset;
-  image->depth = depth;
-  image->data = data;
-
-  /*
-   * compute per line accelerator.
-   */
-  if (bytes_per_line == 0)
-    {
-      if (format == XCB_IMAGE_FORMAT_Z_PIXMAP)
-	image->bytes_per_line = 
-	  xcb_bytes_per_line (image->bitmap_format_scanline_pad,
-			      width, bpp);
-      else
-	image->bytes_per_line =
-	  xcb_bytes_per_line (image->bitmap_format_scanline_pad,
-			      width + offset, 1);
-    }
-  else
-    image->bytes_per_line = bytes_per_line;
-
-  image->bits_per_pixel = bpp;
-
-  return image;
-}
-
-int
-xcb_image_init (xcb_image_t *image)
-{
-  if (format_invalid(image->depth, image->format, image->bitmap_format_scanline_pad))
-    return 0;
-  
-  /*
-   * compute per line accelerator.
-   */
-  if (image->bytes_per_line == 0)
-    {
-      if (image->format == XCB_IMAGE_FORMAT_Z_PIXMAP)
-	image->bytes_per_line = 
-	  xcb_bytes_per_line (image->bitmap_format_scanline_pad,
-			      image->width,
-			      image->bits_per_pixel);
-      else
-	image->bytes_per_line = 
-	  xcb_bytes_per_line (image->bitmap_format_scanline_pad,
-			      image->width + image->xoffset,
-			      1);
-    }
-  
-  return 1;
-}
-
-int
-xcb_image_destroy (xcb_image_t *image)
-{
-  if (image->data != NULL)
-    free (image->data);
-  free (image);
-
-  return 1;
-}
-
-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,
-	     uint8_t          format)
-{
-  xcb_image_t       *image;
-  xcb_get_image_reply_t *rep;
-  uint8_t           *data;
-
-  rep = xcb_get_image_reply (conn, 
-			  xcb_get_image (conn,
-				       format,
-				       draw,
-				       x, y,
-				       width, height,
-				       plane_mask),
-			  NULL);
-  if (!rep)
-    return NULL;
-
-  data = malloc(xcb_get_image_data_length(rep));
-  if (!data)
-    return NULL;
-  memcpy(data, xcb_get_image_data (rep), xcb_get_image_data_length (rep));
-
-  if (format == XCB_IMAGE_FORMAT_XY_PIXMAP)
-    {
-      image = xcb_image_create (conn,
-				Ones (plane_mask & _lomask(rep->depth)),
-				format,
-				0,
-				data,
-				width, height,
-				xcb_scanline_pad_get (conn, rep->depth),
-				0);
-    }
-  else /* format == XCB_IMAGE_FORMAT_Z_PIXMAP */
-    {
-      image = xcb_image_create (conn,
-				rep->depth,
-				XCB_IMAGE_FORMAT_Z_PIXMAP,
-				0,
-				data,
-				width, height,
-				xcb_scanline_pad_get (conn, rep->depth),
-				0);
-    }
-  if (!image)
-    free (data);
-
-  free (rep);
-
-  return image;
-}
-
-int
-xcb_image_put (xcb_connection_t *conn,
-	     xcb_drawable_t    draw,
-	     xcb_gcontext_t    gc,
-	     xcb_image_t      *image,
-	     int16_t          x_offset,
-	     int16_t          y_offset,
-	     int16_t          x,
-	     int16_t          y,
-	     uint16_t         width,
-	     uint16_t         height)
-{
-  int32_t w;
-  int32_t h;
-  int dest_bits_per_pixel;
-  int dest_scanline_pad;
-  int left_pad;
-
-  w = width;
-  h = height;
-
-  if (x_offset < 0)
-    {
-      w += x_offset;
-      x_offset = 0;
-    }
-
-  if (y_offset < 0)
-    {
-      h += y_offset;
-      y_offset = 0;
-    }
-
-  if ((w + x_offset) > image->width)
-    w = image->width - x_offset;
-
-  if ((h + y_offset) > image->height)
-    h = image->height - y_offset;
-
-  if ((w <= 0) || (h <= 0))
-    return 0;
-
-  if ((image->bits_per_pixel == 1) || (image->format != XCB_IMAGE_FORMAT_Z_PIXMAP))
-    {
-      dest_bits_per_pixel = 1;
-      dest_scanline_pad = xcb_get_setup (conn)->bitmap_format_scanline_pad;
-      left_pad = image->xoffset & (xcb_get_setup (conn)->bitmap_format_scanline_unit- 1);
-    }
-  else
-    {
-      xcb_format_iterator_t iter;
-      
-      dest_bits_per_pixel = image->bits_per_pixel;
-      dest_scanline_pad = image->bitmap_format_scanline_pad;
-      left_pad = 0;
-      iter = xcb_setup_pixmap_formats_iterator (xcb_get_setup (conn));
-      for (; iter.rem ; xcb_format_next (&iter))
-	if (iter.data->depth == image->depth)
-	  {
-	    dest_bits_per_pixel = iter.data->bits_per_pixel;
-	    dest_scanline_pad = iter.data->scanline_pad;
-	  }
-      
-      if (dest_bits_per_pixel != image->bits_per_pixel) {
-	xcb_image_t       img;
-	register int32_t i, j;
-	const xcb_setup_t *rep;
-	
-	/* XXX slow, but works */
-	rep = xcb_get_setup (conn);
-	img.width = width;
-	img.height = height;
-	img.xoffset = 0;
-	img.format = XCB_IMAGE_FORMAT_Z_PIXMAP;
-	img.image_byte_order = rep->image_byte_order;
-	img.bitmap_format_scanline_unit = rep->bitmap_format_scanline_unit;
-	img.bitmap_format_bit_order = rep->bitmap_format_bit_order;
-	img.bitmap_format_scanline_pad = dest_scanline_pad;
-	img.depth = image->depth;
-	img.bits_per_pixel = dest_bits_per_pixel;
-	img.bytes_per_line =  xcb_bytes_per_line (dest_scanline_pad,
-						  width,
-						  dest_bits_per_pixel);
-	img.data = malloc((uint8_t) (img.bytes_per_line * height));
-	
-	if (img.data == NULL)
-	  return 0;
-	
-	for (j = height; --j >= 0; )
-	  for (i = width; --i >= 0; )
-	    xcb_image_put_pixel(&img,
-				i, j,
-				xcb_image_get_pixel(image,
-						    x_offset + i,
-						    y_offset + j));
-	
-	xcb_put_image(conn, img.format, draw, gc,
-		    w, h, x, y,
-		    dest_scanline_pad,
-		    img.depth,
-		    img.bytes_per_line * height,
-		    img.data);
-	
-	free(img.data);
-	return 0;
-      }
-    }
-
-  xcb_put_image(conn, image->format, draw, gc,
-	      w, h, x, y,
-	      left_pad,
-	      image->depth, image->bytes_per_line * height,
-	      image->data);
-
-  return 1;
-}
-
-/*
- * Shm stuff
- */
-
-xcb_image_t *
-xcb_image_shm_create (xcb_connection_t *conn,
-		   uint8_t          depth,
-		   uint8_t          format,
-		   uint8_t          *data,
-		   uint16_t         width,
-		   uint16_t         height)
-{
-  xcb_image_t       *image;
-  const xcb_setup_t *rep;
-
-  image = (xcb_image_t *)malloc (sizeof (xcb_image_t));
-  if (!image)
-    return NULL;
-  
-  rep = xcb_get_setup (conn);
-  
-  image->width = width;
-  image->height = height;
-  image->xoffset = 0;
-  image->format = format;
-  image->data = data;
-  image->depth = depth;
-
-  image->image_byte_order = rep->image_byte_order;
-  image->bitmap_format_scanline_unit = rep->bitmap_format_scanline_unit;
-  image->bitmap_format_bit_order = rep->bitmap_format_bit_order;
-  image->bitmap_format_scanline_pad = xcb_scanline_pad_get (conn, depth);
-
-  if (format == XCB_IMAGE_FORMAT_Z_PIXMAP)
-    image->bits_per_pixel = xcb_bits_per_pixel (conn, depth);
-  else
-    image->bits_per_pixel = 1;
-
-  image->bytes_per_line = xcb_bytes_per_line (image->bitmap_format_scanline_pad,
-					      width,
-					      image->bits_per_pixel);
-
-  return image;
-}
-
-int
-xcb_image_shm_destroy (xcb_image_t *image)
-{
-  if (image)
-    free (image);
-  
-  return 1;
-}
-
-int
-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 (!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 1;
-}
-
-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 *rep;
-  xcb_shm_get_image_cookie_t cookie;
-  xcb_generic_error_t *err = NULL;
-
-  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);
-  rep = xcb_shm_get_image_reply(conn, cookie, &err);
-  /* rep would be useful to get the visual id */
-  /* but i don't use it */
-  /* So, should we remove it ? */
-  
-  if (err) {
-    fprintf(stderr, "ShmGetImageReply error %d\n", (int)err->error_code);
-    free(err);
-  }
-  
-  if (!rep)
-    return 0;
-  else {
-    free (rep);
-    return 1;
-  }
-}
-
-/* GetPixel/PutPixel */
-
-static inline int XYINDEX (int x, xcb_image_t *img, int *bitp)
-{
- int mask = img->bitmap_format_scanline_unit - 1;
-  int unit = (x + img->xoffset) & ~mask;
-  int byte = (x + img->xoffset) & mask;
-  if (img->bitmap_format_bit_order == XCB_IMAGE_ORDER_MSB_FIRST)
-    byte = img->bitmap_format_scanline_unit - byte;
-  *bitp = byte & 7;
-  if (img->image_byte_order == XCB_IMAGE_ORDER_MSB_FIRST)
-    byte = img->bitmap_format_scanline_unit - byte;
-  return (unit + byte) >> 3;
-}
-
-static inline int ZINDEX (int x, xcb_image_t *img)
-{
-  return (x * img->bits_per_pixel) >> 3;
-}
-
-static inline void set_bit (uint8_t *byte, int bit, int value)
-{
-  if (value)
-    *byte |= 1 << bit;
-  else
-    *byte &= ~(1 << bit);
-}
-
-int
-xcb_image_put_pixel (xcb_image_t *image, int x, int y, uint32_t pixel)
-{
-  register uint8_t *src = image->data + (y * image->bytes_per_line);
-
-  if (image->format == XCB_IMAGE_FORMAT_XY_PIXMAP || (image->bits_per_pixel | image->depth) == 1)
-    {
-      int plane, bit;
-      /* do least signif plane 1st */
-      src += XYINDEX(x, image, &bit) + image->bytes_per_line * image->height * image->depth;
-      for (plane = image->depth; --plane >= 0; pixel >>= 1)
-	{
-	  src -= image->bytes_per_line * image->height;
-	  set_bit (src, bit, pixel & 1);
-	}
-    }
-  else
-    if (image->format == XCB_IMAGE_FORMAT_Z_PIXMAP)
-      {
-	src += ZINDEX(x, image);
-	if (image->bits_per_pixel == 4)
-	{
-	  uint8_t mask = ~_lomask(4);
-	  pixel &= _lomask(image->depth);
-	  /* if x is odd and byte order is LSB, or
-	   * if x is even and byte order is MSB, then
-	   * want high nibble; else want low nibble. */
-	  if ((x & 1) == (image->image_byte_order == XCB_IMAGE_ORDER_LSB_FIRST))
-	  {
-	    mask = ~mask;
-	    pixel <<= 4;
-	  }
-	  *src = (*src & mask) | pixel;
-	}
-	else
-	{
-	  int nbytes = image->bits_per_pixel >> 3;
-	  int rev = image->image_byte_order == XCB_IMAGE_ORDER_MSB_FIRST;
-	  if(rev)
-	    src += nbytes - 1;
-	  while (--nbytes >= 0)
-	    {
-	      *src = pixel;
-	      pixel >>= 8;
-	      if(rev)
-		--src;
-	      else
-		++src;
-	    }
-	}
-      }
-    else
-      {
-	return 0; /* bad image */
-      }
-  return 1;
-}
-
-uint32_t
-xcb_image_get_pixel (xcb_image_t *image, int x, int y)
-{
-  uint32_t         pixel = 0;
-  register uint8_t *src = image->data + (y * image->bytes_per_line);
-  
-  if (image->format == XCB_IMAGE_FORMAT_XY_PIXMAP || (image->bits_per_pixel | image->depth) == 1)
-    {
-      int plane, bit;
-      src += XYINDEX(x, image, &bit);
-      for (plane = image->depth; --plane >= 0; )
-	{
-	  pixel <<= 1;
-	  pixel |= (*src >> bit) & 1;
-	  src += image->bytes_per_line * image->height;
-	}
-    }
-  else
-    if (image->format == XCB_IMAGE_FORMAT_Z_PIXMAP)
-      {
-	src += ZINDEX(x, image);
-	if (image->bits_per_pixel == 4)
-	{
-	  pixel = *src;
-	  /* if x is odd and byte order is LSB, or
-	   * if x is even and byte order is MSB, then
-	   * want high nibble; else want low nibble. */
-	  if ((x & 1) == (image->image_byte_order == XCB_IMAGE_ORDER_LSB_FIRST))
-	    pixel >>= 4;
-	}
-	else
-	{
-	  int nbytes = image->bits_per_pixel >> 3;
-	  int rev = image->image_byte_order == XCB_IMAGE_ORDER_MSB_FIRST;
-	  if(rev)
-	    src += nbytes - 1;
-	  while (--nbytes >= 0)
-	    {
-	      pixel <<= 8;
-	      pixel = *src;
-	      if(rev)
-		--src;
-	      else
-		++src;
-	    }
-	}
-      }
-    else
-      {
-	return 0; /* bad image */
-      }
-  return pixel & _lomask(image->depth);
-}
diff --git a/image/xcb_image.h b/image/xcb_image.h
deleted file mode 100644
index 26bfbc5..0000000
--- a/image/xcb_image.h
+++ /dev/null
@@ -1,376 +0,0 @@
-#ifndef __XCB_IMAGE_H__
-#define __XCB_IMAGE_H__
-
-#include <xcb/xcb.h>
-#include <xcb/shm.h>
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/**
- * @defgroup xcb__image_t XCB Image Functions
- *
- * Functions used to create and manipulate images.
- *
- * @{
- */
-
-
-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;
-  uint16_t         height;
-  unsigned int   xoffset;
-  uint8_t          format;
-  uint8_t          *data;
-  uint8_t          image_byte_order;
-  uint8_t          bitmap_format_scanline_unit;
-  uint8_t          bitmap_format_bit_order;
-  uint8_t          bitmap_format_scanline_pad;
-  uint8_t          depth;
-  uint32_t         bytes_per_line;
-  uint8_t          bits_per_pixel;
-};
-
-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;
-};
-
-/**
- * Create a new Image.
- * @param conn The connection to the X server.
- * @param depth The depth of the image.
- * @param format The format of the image. You can pass XYBitmap,
- * XYPixmap, or ZPixmap.
- * @param offset The number of pixels to ignore at the beginning of
- * the scanline.
- * @param data The image data.
- * @param width The width of the image, in pixels.
- * @param height The height of the image, in pixels.
- * @param xpad The quantum of a scanline (8, 16, or 32).
- * @param bytes_per_line The number of bytes in the client image
- * between the start of one scanline and the start of the next.
- * @return The new image.
- *
- * This function allocates the memory needed for an xcb_image_t structure
- * for the specified connection but does not allocate space for the image
- * itself. It initializes the structure byte-order, bit-order, and
- * bitmap-unit values from the connection and returns a pointer to the
- * xcb_image_t structure.
- *
- * The @p offset parameter permits the rapid displaying of the image
- * without requiring each scanline to be shifted into position.
- *
- * The image must be destroyed with @ref xcb_image_destroy_t.
- * @ingroup xcb__image_t
- */
-xcb_image_t *xcb_image_create (xcb_connection_t *conn,
-			  uint8_t          depth,
-			  uint8_t          format,
-			  unsigned int   offset,
-			  uint8_t          *data,
-			  uint16_t         width,
-			  uint16_t         height,
-			  uint8_t          xpad,
-			  uint32_t         bytes_per_line);
-
-/**
- * Initialize an Image.
- * @param image The image to be destroyed.
- * @return 1 if the operation has succeeded.
- *
- * This function  initializes the image structure.
- * @ingroup xcb__image_t
- */
-int xcb_image_init (xcb_image_t *image);
-
-/**
- * Destroy an Image.
- * @param image The image to be destroyed.
- * @return 1 if the operation has succeeded.
- *
- * This function deallocates both the memory associated with the @p image
- * parameter and its data.
- * @ingroup xcb__image_t
- */
-int xcb_image_destroy (xcb_image_t *image);
-
-#define XCB_ALL_PLANES ((uint32_t)~0L)
-
-/**
- * Return a pointer to a xcb_image_t.
- * @param conn The connection to the X server.
- * @param draw The draw you get the image from.
- * @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 width The width of the subimage, in pixels.
- * @param height The height of the subimage, in pixels.
- * @param plane_mask The plane mask (can be xcb_all_planes_t).
- * @param format The format of the image. You can pass XYBitmap,
- * XYPixmap, or ZPixmap.
- * @return The subimage of @p draw defined by @p x, @p y, @p w, @p h.
- *
- * This function returns a subimage of @p draw defined by @p x, @p y,
- * @p w, @p h. The depth of the image is the one of the drawable @p
- * draw, except when getting a subset of the plane in @c XYPixmap
- * format.
- *
- * If a problem occurs, the functons returns @c 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,
-		       uint8_t          format);
-
-/* Not implemented. Should be ? */
-xcb_image_t xcb_image_subimage_get (xcb_connection_t *conn,
-				 xcb_drawable_t    draw,
-				 int            x,
-				 int            y,
-				 unsigned int   width,
-				 unsigned int   height,
-				 unsigned long  plane_mask,
-				 uint8_t          format,
-				 xcb_image_t      *dest_im,
-				 int            dest_x,
-				 int            dest_y);
-
-/**
- * Put the data of an xcb_image_t onto a drawable.
- * @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_offset The offset in x from the left edge of the image
- * defined by the xcb_image_t structure.
- * @param y_offset The offset in y from the left edge of the image
- * defined by the xcb_image_t structure.
- * @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 width The width of the subimage, in pixels.
- * @param height The height of the subimage, in pixels.
- * @return 1 is no problems occurs.
- *
- * This function combines an image with a rectangle 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. 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 XYPixmap and ZPixmap formats, the
- * depth of the image must match the depth of the drawable.
- *
- * If a problem occurs, the functons returns @c NULL.
- * @ingroup xcb__image_t
- */
-int xcb_image_put (xcb_connection_t *conn,
-		 xcb_drawable_t    draw,
-		 xcb_gcontext_t    gc,
-		 xcb_image_t      *image,
-		 int16_t          x_offset,
-		 int16_t          y_offset,
-		 int16_t          x,
-		 int16_t          y,
-		 uint16_t         width,
-		 uint16_t         height);
-
-/**
- * Put a pixel in a 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.
- * @return 1 if the operation has succeeded.
- *
- * This function overwrites the pixel in the named image with the
- * specified @p pixel value. The input pixel value must be in normalized
- * format (that is, the least-significant byte of the long is the
- * least-significant byte of the pixel). The image must contain the @p x
- * and @p y coordinates.
- * @ingroup xcb__image_t
- */
-int xcb_image_put_pixel (xcb_image_t *image,
-		      int       x,
-		      int       y,
-		      uint32_t    pixel);
-
-/**
- * Get a pixel in a 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 returns the specified pixel from the named image. The
- * pixel value is returned in normalized format (that is, the
- * least-significant byte of the long is the least-significant byte of
- * the pixel). The image must contain the @p x and @p y coordinates.
- * @ingroup xcb__image_t
- */
-uint32_t xcb_image_get_pixel (xcb_image_t *image,
-			 int       x,
-			 int       y);
-
-/*
- * Shm stuff
- */
-
-/**
- * Create an xcb_image_t to be used with the MIT Shm Extension
- * @param conn The connection to the X server.
- * @param depth The depth of the image.
- * @param format The format of the image. You can pass XYBitmap,
- * XYPixmap, or ZPixmap.
- * @param data The image data.
- * @param width The width of the image, in pixels.
- * @param height The height of the image, in pixels.
- * @return The new image.
- *
- * This function allocates the memory needed for an xcb_image_t structure
- * for the specified display but does not allocate space for the image
- * itself.
- *
- * The image must be destroyed with @ref xcb_image_shm_destroy_t.
- *
- * @ingroup xcb__image_t
- */
-xcb_image_t *xcb_image_shm_create (xcb_connection_t *conn,
-			     uint8_t          depth,
-			     uint8_t          format,
-			     uint8_t          *data,
-			     uint16_t         width,
-			     uint16_t         height);
-
-/**
- * Destroy an Image created by xcb_image_shm_create_t.
- * @param image The image to be destroyed.
- * @return 1 if the operation has succeeded.
- *
- * This function deallocates both the memory associated with the @p image
- * parameter and its data.
- * @ingroup xcb__image_t
- */
-int xcb_image_shm_destroy (xcb_image_t *image);
-
-/**
- * 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 x The offset in x from the left edge of the image
- * defined by the xcb_image_t structure.
- * @param 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 width The width of the subimage, in pixels.
- * @param 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
- */
-int 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             x,
-		    int16_t             y,
-		    int16_t             dest_x,
-		    int16_t             dest_y,
-		    uint16_t            width,
-		    uint16_t            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);
-
-/**
- * @}
- */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* __XCB_IMAGE_H__ */


More information about the xcb-commit mailing list