[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