diff options
Diffstat (limited to 'miext/damage')
| -rw-r--r-- | miext/damage/Makefile.am | 14 | ||||
| -rw-r--r-- | miext/damage/Makefile.in | 754 | ||||
| -rw-r--r-- | miext/damage/damage.c | 2127 | ||||
| -rw-r--r-- | miext/damage/damage.h | 128 | ||||
| -rw-r--r-- | miext/damage/damagestr.h | 114 | 
5 files changed, 3137 insertions, 0 deletions
| diff --git a/miext/damage/Makefile.am b/miext/damage/Makefile.am new file mode 100644 index 0000000..767a65a --- /dev/null +++ b/miext/damage/Makefile.am @@ -0,0 +1,14 @@ +noinst_LTLIBRARIES = libdamage.la + +AM_CFLAGS = $(DIX_CFLAGS) + +INCLUDES = -I$(srcdir)/../cw + +if XORG +sdk_HEADERS = damage.h damagestr.h +endif + +libdamage_la_SOURCES =	\ +	damage.c	\ +	damage.h	\ +	damagestr.h diff --git a/miext/damage/Makefile.in b/miext/damage/Makefile.in new file mode 100644 index 0000000..032e8a0 --- /dev/null +++ b/miext/damage/Makefile.in @@ -0,0 +1,754 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = miext/damage +DIST_COMMON = $(am__sdk_HEADERS_DIST) $(srcdir)/Makefile.am \ +	$(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_define_dir.m4 \ +	$(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ +	$(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/do-not-use-config.h \ +	$(top_builddir)/include/xorg-server.h \ +	$(top_builddir)/include/dix-config.h \ +	$(top_builddir)/include/xorg-config.h \ +	$(top_builddir)/include/xkb-config.h \ +	$(top_builddir)/include/xwin-config.h \ +	$(top_builddir)/include/kdrive-config.h \ +	$(top_builddir)/include/version-config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libdamage_la_LIBADD = +am_libdamage_la_OBJECTS = damage.lo +libdamage_la_OBJECTS = $(am_libdamage_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ +	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ +	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ +	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ +	$(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo "  CC    " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ +	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ +	$(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo "  CCLD  " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo "  GEN   " $@; +SOURCES = $(libdamage_la_SOURCES) +DIST_SOURCES = $(libdamage_la_SOURCES) +am__sdk_HEADERS_DIST = damage.h damagestr.h +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ +    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ +    *) f=$$p;; \ +  esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ +  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ +  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ +  for p in $$list; do echo "$$p $$p"; done | \ +  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ +  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ +    if (++n[$$2] == $(am__install_max)) \ +      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ +    END { for (dir in files) print dir, files[dir] }' +am__base_list = \ +  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ +  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(sdkdir)" +HEADERS = $(sdk_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ADMIN_MAN_DIR = @ADMIN_MAN_DIR@ +ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +APPLE_APPLICATIONS_DIR = @APPLE_APPLICATIONS_DIR@ +APPLE_APPLICATION_NAME = @APPLE_APPLICATION_NAME@ +APP_MAN_DIR = @APP_MAN_DIR@ +APP_MAN_SUFFIX = @APP_MAN_SUFFIX@ +AR = @AR@ +ARM_BACKTRACE_CFLAGS = @ARM_BACKTRACE_CFLAGS@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BASE_FONT_PATH = @BASE_FONT_PATH@ +BUILD_DATE = @BUILD_DATE@ +BUILD_TIME = @BUILD_TIME@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHANGELOG_CMD = @CHANGELOG_CMD@ +COMPILEDDEFAULTFONTPATH = @COMPILEDDEFAULTFONTPATH@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CWARNFLAGS = @CWARNFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DARWIN_LIBS = @DARWIN_LIBS@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DEFAULT_LIBRARY_PATH = @DEFAULT_LIBRARY_PATH@ +DEFAULT_LOGDIR = @DEFAULT_LOGDIR@ +DEFAULT_LOGPREFIX = @DEFAULT_LOGPREFIX@ +DEFAULT_MODULE_PATH = @DEFAULT_MODULE_PATH@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DGA_CFLAGS = @DGA_CFLAGS@ +DGA_LIBS = @DGA_LIBS@ +DIX_CFLAGS = @DIX_CFLAGS@ +DIX_LIB = @DIX_LIB@ +DLLTOOL = @DLLTOOL@ +DLOPEN_LIBS = @DLOPEN_LIBS@ +DMXEXAMPLES_DEP_CFLAGS = @DMXEXAMPLES_DEP_CFLAGS@ +DMXEXAMPLES_DEP_LIBS = @DMXEXAMPLES_DEP_LIBS@ +DMXMODULES_CFLAGS = @DMXMODULES_CFLAGS@ +DMXMODULES_LIBS = @DMXMODULES_LIBS@ +DMXXIEXAMPLES_DEP_CFLAGS = @DMXXIEXAMPLES_DEP_CFLAGS@ +DMXXIEXAMPLES_DEP_LIBS = @DMXXIEXAMPLES_DEP_LIBS@ +DMXXMUEXAMPLES_DEP_CFLAGS = @DMXXMUEXAMPLES_DEP_CFLAGS@ +DMXXMUEXAMPLES_DEP_LIBS = @DMXXMUEXAMPLES_DEP_LIBS@ +DOXYGEN = @DOXYGEN@ +DRI2PROTO_CFLAGS = @DRI2PROTO_CFLAGS@ +DRI2PROTO_LIBS = @DRI2PROTO_LIBS@ +DRIPROTO_CFLAGS = @DRIPROTO_CFLAGS@ +DRIPROTO_LIBS = @DRIPROTO_LIBS@ +DRIVER_MAN_DIR = @DRIVER_MAN_DIR@ +DRIVER_MAN_SUFFIX = @DRIVER_MAN_SUFFIX@ +DRI_CFLAGS = @DRI_CFLAGS@ +DRI_DRIVER_PATH = @DRI_DRIVER_PATH@ +DRI_LIBS = @DRI_LIBS@ +DSYMUTIL = @DSYMUTIL@ +DTRACE = @DTRACE@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILE_MAN_DIR = @FILE_MAN_DIR@ +FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ +FONT100DPIDIR = @FONT100DPIDIR@ +FONT75DPIDIR = @FONT75DPIDIR@ +FONTMISCDIR = @FONTMISCDIR@ +FONTOTFDIR = @FONTOTFDIR@ +FONTROOTDIR = @FONTROOTDIR@ +FONTTTFDIR = @FONTTTFDIR@ +FONTTYPE1DIR = @FONTTYPE1DIR@ +FOP = @FOP@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLX_ARCH_DEFINES = @GLX_ARCH_DEFINES@ +GLX_DEFINES = @GLX_DEFINES@ +GLX_TLS = @GLX_TLS@ +GL_CFLAGS = @GL_CFLAGS@ +GL_LIBS = @GL_LIBS@ +GREP = @GREP@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +INSTALL = @INSTALL@ +INSTALL_CMD = @INSTALL_CMD@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KDRIVE_CFLAGS = @KDRIVE_CFLAGS@ +KDRIVE_INCS = @KDRIVE_INCS@ +KDRIVE_LIBS = @KDRIVE_LIBS@ +KDRIVE_LOCAL_LIBS = @KDRIVE_LOCAL_LIBS@ +KDRIVE_PURE_INCS = @KDRIVE_PURE_INCS@ +KDRIVE_PURE_LIBS = @KDRIVE_PURE_LIBS@ +LAUNCHD_ID_PREFIX = @LAUNCHD_ID_PREFIX@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LD_EXPORT_SYMBOLS_FLAG = @LD_EXPORT_SYMBOLS_FLAG@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBDRM_CFLAGS = @LIBDRM_CFLAGS@ +LIBDRM_LIBS = @LIBDRM_LIBS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBSHA1_CFLAGS = @LIBSHA1_CFLAGS@ +LIBSHA1_LIBS = @LIBSHA1_LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_MAN_DIR = @LIB_MAN_DIR@ +LIB_MAN_SUFFIX = @LIB_MAN_SUFFIX@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAIN_LIB = @MAIN_LIB@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAN_SUBSTS = @MAN_SUBSTS@ +MISC_MAN_DIR = @MISC_MAN_DIR@ +MISC_MAN_SUFFIX = @MISC_MAN_SUFFIX@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCCLD = @OBJCCLD@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJCLINK = @OBJCLINK@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENSSL_CFLAGS = @OPENSSL_CFLAGS@ +OPENSSL_LIBS = @OPENSSL_LIBS@ +OS_LIB = @OS_LIB@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PCIACCESS_CFLAGS = @PCIACCESS_CFLAGS@ +PCIACCESS_LIBS = @PCIACCESS_LIBS@ +PCI_TXT_IDS_PATH = @PCI_TXT_IDS_PATH@ +PERL = @PERL@ +PIXMAN_CFLAGS = @PIXMAN_CFLAGS@ +PIXMAN_LIBS = @PIXMAN_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PROJECTROOT = @PROJECTROOT@ +RANLIB = @RANLIB@ +RAWCPP = @RAWCPP@ +RAWCPPFLAGS = @RAWCPPFLAGS@ +RELEASE_DATE = @RELEASE_DATE@ +SDK_REQUIRED_MODULES = @SDK_REQUIRED_MODULES@ +SED = @SED@ +SELINUX_CFLAGS = @SELINUX_CFLAGS@ +SELINUX_LIBS = @SELINUX_LIBS@ +SERVER_MISC_CONFIG_PATH = @SERVER_MISC_CONFIG_PATH@ +SET_MAKE = @SET_MAKE@ +SHA1_CFLAGS = @SHA1_CFLAGS@ +SHA1_LIBS = @SHA1_LIBS@ +SHELL = @SHELL@ +SOLARIS_ASM_CFLAGS = @SOLARIS_ASM_CFLAGS@ +SOLARIS_INOUT_ARCH = @SOLARIS_INOUT_ARCH@ +STRIP = @STRIP@ +STYLESHEET_SRCDIR = @STYLESHEET_SRCDIR@ +SYSCONFDIR = @SYSCONFDIR@ +TSLIB_CFLAGS = @TSLIB_CFLAGS@ +TSLIB_LIBS = @TSLIB_LIBS@ +UDEV_CFLAGS = @UDEV_CFLAGS@ +UDEV_LIBS = @UDEV_LIBS@ +UTILS_SYS_LIBS = @UTILS_SYS_LIBS@ +VENDOR_NAME_SHORT = @VENDOR_NAME_SHORT@ +VERSION = @VERSION@ +WINDOWSWM_CFLAGS = @WINDOWSWM_CFLAGS@ +WINDOWSWM_LIBS = @WINDOWSWM_LIBS@ +WINDRES = @WINDRES@ +X11EXAMPLES_DEP_CFLAGS = @X11EXAMPLES_DEP_CFLAGS@ +X11EXAMPLES_DEP_LIBS = @X11EXAMPLES_DEP_LIBS@ +XDMCP_CFLAGS = @XDMCP_CFLAGS@ +XDMCP_LIBS = @XDMCP_LIBS@ +XDMXCONFIG_DEP_CFLAGS = @XDMXCONFIG_DEP_CFLAGS@ +XDMXCONFIG_DEP_LIBS = @XDMXCONFIG_DEP_LIBS@ +XDMX_CFLAGS = @XDMX_CFLAGS@ +XDMX_LIBS = @XDMX_LIBS@ +XDMX_SYS_LIBS = @XDMX_SYS_LIBS@ +XEPHYR_CFLAGS = @XEPHYR_CFLAGS@ +XEPHYR_INCS = @XEPHYR_INCS@ +XEPHYR_LIBS = @XEPHYR_LIBS@ +XF86CONFIGDIR = @XF86CONFIGDIR@ +XF86CONFIGFILE = @XF86CONFIGFILE@ +XF86VIDMODE_CFLAGS = @XF86VIDMODE_CFLAGS@ +XF86VIDMODE_LIBS = @XF86VIDMODE_LIBS@ +XKB_BASE_DIRECTORY = @XKB_BASE_DIRECTORY@ +XKB_BIN_DIRECTORY = @XKB_BIN_DIRECTORY@ +XKB_COMPILED_DIR = @XKB_COMPILED_DIR@ +XKM_OUTPUT_DIR = @XKM_OUTPUT_DIR@ +XLIB_CFLAGS = @XLIB_CFLAGS@ +XLIB_LIBS = @XLIB_LIBS@ +XMLTO = @XMLTO@ +XNESTMODULES_CFLAGS = @XNESTMODULES_CFLAGS@ +XNESTMODULES_LIBS = @XNESTMODULES_LIBS@ +XNEST_LIBS = @XNEST_LIBS@ +XNEST_SYS_LIBS = @XNEST_SYS_LIBS@ +XORG_CFLAGS = @XORG_CFLAGS@ +XORG_INCS = @XORG_INCS@ +XORG_LIBS = @XORG_LIBS@ +XORG_MAN_PAGE = @XORG_MAN_PAGE@ +XORG_MODULES_CFLAGS = @XORG_MODULES_CFLAGS@ +XORG_MODULES_LIBS = @XORG_MODULES_LIBS@ +XORG_OS = @XORG_OS@ +XORG_OS_SUBDIR = @XORG_OS_SUBDIR@ +XORG_SGML_PATH = @XORG_SGML_PATH@ +XORG_SYS_LIBS = @XORG_SYS_LIBS@ +XPBPROXY_CFLAGS = @XPBPROXY_CFLAGS@ +XPBPROXY_LIBS = @XPBPROXY_LIBS@ +XQUARTZ_SPARKLE = @XQUARTZ_SPARKLE@ +XRESEXAMPLES_DEP_CFLAGS = @XRESEXAMPLES_DEP_CFLAGS@ +XRESEXAMPLES_DEP_LIBS = @XRESEXAMPLES_DEP_LIBS@ +XSERVERCFLAGS_CFLAGS = @XSERVERCFLAGS_CFLAGS@ +XSERVERCFLAGS_LIBS = @XSERVERCFLAGS_LIBS@ +XSERVERLIBS_CFLAGS = @XSERVERLIBS_CFLAGS@ +XSERVERLIBS_LIBS = @XSERVERLIBS_LIBS@ +XSERVER_LIBS = @XSERVER_LIBS@ +XSERVER_SYS_LIBS = @XSERVER_SYS_LIBS@ +XSL_STYLESHEET = @XSL_STYLESHEET@ +XTSTEXAMPLES_DEP_CFLAGS = @XTSTEXAMPLES_DEP_CFLAGS@ +XTSTEXAMPLES_DEP_LIBS = @XTSTEXAMPLES_DEP_LIBS@ +XVFB_LIBS = @XVFB_LIBS@ +XVFB_SYS_LIBS = @XVFB_SYS_LIBS@ +XWINMODULES_CFLAGS = @XWINMODULES_CFLAGS@ +XWINMODULES_LIBS = @XWINMODULES_LIBS@ +XWIN_LIBS = @XWIN_LIBS@ +XWIN_SERVER_NAME = @XWIN_SERVER_NAME@ +XWIN_SYS_LIBS = @XWIN_SYS_LIBS@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +__XCONFIGDIR__ = @__XCONFIGDIR__@ +__XCONFIGFILE__ = @__XCONFIGFILE__@ +abi_ansic = @abi_ansic@ +abi_extension = @abi_extension@ +abi_videodrv = @abi_videodrv@ +abi_xinput = @abi_xinput@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +driverdir = @driverdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +extdir = @extdir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +logdir = @logdir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +moduledir = @moduledir@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sdkdir = @sdkdir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +symbol_visibility = @symbol_visibility@ +sysconfdir = @sysconfdir@ +sysconfigdir = @sysconfigdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +noinst_LTLIBRARIES = libdamage.la +AM_CFLAGS = $(DIX_CFLAGS) +INCLUDES = -I$(srcdir)/../cw +@XORG_TRUE@sdk_HEADERS = damage.h damagestr.h +libdamage_la_SOURCES = \ +	damage.c	\ +	damage.h	\ +	damagestr.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps) +	@for dep in $?; do \ +	  case '$(am__configure_deps)' in \ +	    *$$dep*) \ +	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ +	        && { if test -f $@; then exit 0; else break; fi; }; \ +	      exit 1;; \ +	  esac; \ +	done; \ +	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign miext/damage/Makefile'; \ +	$(am__cd) $(top_srcdir) && \ +	  $(AUTOMAKE) --foreign miext/damage/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status +	@case '$?' in \ +	  *config.status*) \ +	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ +	  *) \ +	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ +	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ +	esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) +	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) +	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) +	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: +	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) +	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ +	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ +	  test "$$dir" != "$$p" || dir=.; \ +	  echo "rm -f \"$${dir}/so_locations\""; \ +	  rm -f "$${dir}/so_locations"; \ +	done +libdamage.la: $(libdamage_la_OBJECTS) $(libdamage_la_DEPENDENCIES)  +	$(AM_V_CCLD)$(LINK)  $(libdamage_la_OBJECTS) $(libdamage_la_LIBADD) $(LIBS) + +mostlyclean-compile: +	-rm -f *.$(OBJEXT) + +distclean-compile: +	-rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/damage.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@	$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@	$(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: +	-rm -f *.lo + +clean-libtool: +	-rm -rf .libs _libs +install-sdkHEADERS: $(sdk_HEADERS) +	@$(NORMAL_INSTALL) +	test -z "$(sdkdir)" || $(MKDIR_P) "$(DESTDIR)$(sdkdir)" +	@list='$(sdk_HEADERS)'; test -n "$(sdkdir)" || list=; \ +	for p in $$list; do \ +	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ +	  echo "$$d$$p"; \ +	done | $(am__base_list) | \ +	while read files; do \ +	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(sdkdir)'"; \ +	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(sdkdir)" || exit $$?; \ +	done + +uninstall-sdkHEADERS: +	@$(NORMAL_UNINSTALL) +	@list='$(sdk_HEADERS)'; test -n "$(sdkdir)" || list=; \ +	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ +	test -n "$$files" || exit 0; \ +	echo " ( cd '$(DESTDIR)$(sdkdir)' && rm -f" $$files ")"; \ +	cd "$(DESTDIR)$(sdkdir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +	unique=`for i in $$list; do \ +	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +	  done | \ +	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ +	      END { if (nonempty) { for (i in files) print i; }; }'`; \ +	mkid -fID $$unique +tags: TAGS + +TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \ +		$(TAGS_FILES) $(LISP) +	set x; \ +	here=`pwd`; \ +	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \ +	unique=`for i in $$list; do \ +	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +	  done | \ +	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ +	      END { if (nonempty) { for (i in files) print i; }; }'`; \ +	shift; \ +	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ +	  test -n "$$unique" || unique=$$empty_fix; \ +	  if test $$# -gt 0; then \ +	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ +	      "$$@" $$unique; \ +	  else \ +	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ +	      $$unique; \ +	  fi; \ +	fi +ctags: CTAGS +CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \ +		$(TAGS_FILES) $(LISP) +	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \ +	unique=`for i in $$list; do \ +	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +	  done | \ +	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ +	      END { if (nonempty) { for (i in files) print i; }; }'`; \ +	test -z "$(CTAGS_ARGS)$$unique" \ +	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ +	     $$unique + +GTAGS: +	here=`$(am__cd) $(top_builddir) && pwd` \ +	  && $(am__cd) $(top_srcdir) \ +	  && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: +	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) +	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ +	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ +	list='$(DISTFILES)'; \ +	  dist_files=`for file in $$list; do echo $$file; done | \ +	  sed -e "s|^$$srcdirstrip/||;t" \ +	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ +	case $$dist_files in \ +	  */*) $(MKDIR_P) `echo "$$dist_files" | \ +			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ +			   sort -u` ;; \ +	esac; \ +	for file in $$dist_files; do \ +	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ +	  if test -d $$d/$$file; then \ +	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ +	    if test -d "$(distdir)/$$file"; then \ +	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ +	    fi; \ +	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ +	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ +	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ +	    fi; \ +	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ +	  else \ +	    test -f "$(distdir)/$$file" \ +	    || cp -p $$d/$$file "$(distdir)/$$file" \ +	    || exit 1; \ +	  fi; \ +	done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: +	for dir in "$(DESTDIR)$(sdkdir)"; do \ +	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \ +	done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am +	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: +	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ +	  `test -z '$(STRIP)' || \ +	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: +	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) +	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: +	@echo "This command is intended for maintainers to use" +	@echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ +	mostlyclean-am + +distclean: distclean-am +	-rm -rf ./$(DEPDIR) +	-rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ +	distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-sdkHEADERS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am +	-rm -rf ./$(DEPDIR) +	-rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ +	mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-sdkHEADERS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ +	clean-libtool clean-noinstLTLIBRARIES ctags distclean \ +	distclean-compile distclean-generic distclean-libtool \ +	distclean-tags distdir dvi dvi-am html html-am info info-am \ +	install install-am install-data install-data-am install-dvi \ +	install-dvi-am install-exec install-exec-am install-html \ +	install-html-am install-info install-info-am install-man \ +	install-pdf install-pdf-am install-ps install-ps-am \ +	install-sdkHEADERS install-strip installcheck installcheck-am \ +	installdirs maintainer-clean maintainer-clean-generic \ +	mostlyclean mostlyclean-compile mostlyclean-generic \ +	mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ +	uninstall-am uninstall-sdkHEADERS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/miext/damage/damage.c b/miext/damage/damage.c new file mode 100644 index 0000000..0fe1fb6 --- /dev/null +++ b/miext/damage/damage.c @@ -0,0 +1,2127 @@ +/* + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission.  Keith Packard makes no + * representations about the suitability of this software for any purpose.  It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_DIX_CONFIG_H +#include <dix-config.h> +#endif + +#include <stdlib.h> + +#include    <X11/X.h> +#include    "scrnintstr.h" +#include    "windowstr.h" +#include    <X11/fonts/font.h> +#include    "dixfontstr.h" +#include    <X11/fonts/fontstruct.h> +#include    "mi.h" +#include    "regionstr.h" +#include    "globals.h" +#include    "gcstruct.h" +#include    "damage.h" +#include    "damagestr.h" +#ifdef COMPOSITE +#include    "cw.h" +#endif + +#define wrap(priv, real, mem, func) {\ +    priv->mem = real->mem; \ +    real->mem = func; \ +} + +#define unwrap(priv, real, mem) {\ +    real->mem = priv->mem; \ +} + +#define BOX_SAME(a,b) \ +    ((a)->x1 == (b)->x1 && \ +     (a)->y1 == (b)->y1 && \ +     (a)->x2 == (b)->x2 && \ +     (a)->y2 == (b)->y2) + +#define DAMAGE_VALIDATE_ENABLE 0 +#define DAMAGE_DEBUG_ENABLE 0 +#if DAMAGE_DEBUG_ENABLE +#define DAMAGE_DEBUG(x)	ErrorF x +#else +#define DAMAGE_DEBUG(x) +#endif + +#define getPixmapDamageRef(pPixmap) ((DamagePtr *) \ +    dixLookupPrivateAddr(&(pPixmap)->devPrivates, damagePixPrivateKey)) + +#define pixmapDamage(pPixmap)		damagePixPriv(pPixmap) + +static DevPrivateKeyRec damageScrPrivateKeyRec; +#define damageScrPrivateKey (&damageScrPrivateKeyRec) +static DevPrivateKeyRec damagePixPrivateKeyRec; +#define damagePixPrivateKey (&damagePixPrivateKeyRec) +static DevPrivateKeyRec damageGCPrivateKeyRec; +#define damageGCPrivateKey (&damageGCPrivateKeyRec) +static DevPrivateKeyRec damageWinPrivateKeyRec; +#define damageWinPrivateKey (&damageWinPrivateKeyRec) + +static DamagePtr * +getDrawableDamageRef (DrawablePtr pDrawable) +{ +    PixmapPtr   pPixmap; +     +    if (WindowDrawable(pDrawable->type)) +    { +	ScreenPtr   pScreen = pDrawable->pScreen; + +	pPixmap = 0; +	if (pScreen->GetWindowPixmap +#ifdef ROOTLESS_WORKAROUND +	    && ((WindowPtr)pDrawable)->viewable +#endif +	    ) +	    pPixmap = (*pScreen->GetWindowPixmap) ((WindowPtr)pDrawable); + +	if (!pPixmap) +	{ +	    damageScrPriv(pScreen); + +	    return &pScrPriv->pScreenDamage; +	} +    } +    else +	pPixmap = (PixmapPtr) pDrawable; +    return getPixmapDamageRef (pPixmap); +} + +#define getDrawableDamage(pDrawable)	(*getDrawableDamageRef (pDrawable)) +#define getWindowDamage(pWin)		getDrawableDamage(&(pWin)->drawable) + +#define drawableDamage(pDrawable)	\ +    DamagePtr	pDamage = getDrawableDamage(pDrawable) + +#define windowDamage(pWin)		drawableDamage(&(pWin)->drawable) + +#define winDamageRef(pWindow) \ +    DamagePtr	*pPrev = (DamagePtr *) \ +	dixLookupPrivateAddr(&(pWindow)->devPrivates, damageWinPrivateKey) + +static void +damageReportDamage (DamagePtr pDamage, RegionPtr pDamageRegion) +{ +    BoxRec tmpBox; +    RegionRec tmpRegion; +    Bool was_empty; + +    switch (pDamage->damageLevel) { +    case DamageReportRawRegion: +	RegionUnion(&pDamage->damage, &pDamage->damage, +			 pDamageRegion); +	(*pDamage->damageReport) (pDamage, pDamageRegion, pDamage->closure); +	break; +    case DamageReportDeltaRegion: +	RegionNull(&tmpRegion); +	RegionSubtract(&tmpRegion, pDamageRegion, &pDamage->damage); +	if (RegionNotEmpty(&tmpRegion)) { +	    RegionUnion(&pDamage->damage, &pDamage->damage, +			 pDamageRegion); +	    (*pDamage->damageReport) (pDamage, &tmpRegion, pDamage->closure); +	} +	RegionUninit(&tmpRegion); +	break; +    case DamageReportBoundingBox: +	tmpBox = *RegionExtents(&pDamage->damage); +	RegionUnion(&pDamage->damage, &pDamage->damage, +		     pDamageRegion); +	if (!BOX_SAME (&tmpBox, RegionExtents(&pDamage->damage))) { +	    (*pDamage->damageReport) (pDamage, &pDamage->damage, +				      pDamage->closure); +	} +	break; +    case DamageReportNonEmpty: +	was_empty = !RegionNotEmpty(&pDamage->damage); +	RegionUnion(&pDamage->damage, &pDamage->damage, +		     pDamageRegion); +	if (was_empty && RegionNotEmpty(&pDamage->damage)) { +	    (*pDamage->damageReport) (pDamage, &pDamage->damage, +				      pDamage->closure); +	} +	break; +    case DamageReportNone: +	RegionUnion(&pDamage->damage, &pDamage->damage, +		     pDamageRegion); +	break; +    } +} + +static void +damageReportDamagePostRendering (DamagePtr pDamage, RegionPtr pOldDamage, RegionPtr pDamageRegion) +{ +    BoxRec tmpBox; +    RegionRec tmpRegion, newDamage; +    Bool was_empty; + +    RegionUnion(&newDamage, pOldDamage, pDamageRegion); + +    switch (pDamage->damageLevel) { +    case DamageReportRawRegion: +	(*pDamage->damageReportPostRendering) (pDamage, pDamageRegion, pDamage->closure); +	break; +    case DamageReportDeltaRegion: +	RegionNull(&tmpRegion); +	RegionSubtract(&tmpRegion, pDamageRegion, pOldDamage); +	if (RegionNotEmpty(&tmpRegion)) { +	    (*pDamage->damageReportPostRendering) (pDamage, &tmpRegion, pDamage->closure); +	} +	RegionUninit(&tmpRegion); +	break; +    case DamageReportBoundingBox: +	tmpBox = *RegionExtents(pOldDamage); +	if (!BOX_SAME (&tmpBox, RegionExtents(&newDamage))) { +	    (*pDamage->damageReportPostRendering) (pDamage, &newDamage, +				      pDamage->closure); +	} +	break; +    case DamageReportNonEmpty: +	was_empty = !RegionNotEmpty(pOldDamage); +	if (was_empty && RegionNotEmpty(&newDamage)) { +	    (*pDamage->damageReportPostRendering) (pDamage, &newDamage, +				      pDamage->closure); +	} +	break; +    case DamageReportNone: +	break; +    } + +    RegionUninit(&newDamage); +} + +#if DAMAGE_DEBUG_ENABLE +static void +_damageRegionAppend (DrawablePtr pDrawable, RegionPtr pRegion, Bool clip, int subWindowMode, const char *where) +#define damageRegionAppend(d,r,c,m) _damageRegionAppend(d,r,c,m,__FUNCTION__) +#else +static void +damageRegionAppend (DrawablePtr pDrawable, RegionPtr pRegion, Bool clip, +			int subWindowMode) +#endif +{ +    ScreenPtr	    pScreen = pDrawable->pScreen; +    damageScrPriv(pScreen); +    drawableDamage(pDrawable); +    DamagePtr	    pNext; +    RegionRec	    clippedRec; +    RegionPtr	    pDamageRegion; +    RegionRec	    pixClip; +    int		    draw_x, draw_y; +#ifdef COMPOSITE +    int		    screen_x = 0, screen_y = 0; +#endif + +    /* short circuit for empty regions */ +    if (!RegionNotEmpty(pRegion)) +	return; +     +#ifdef COMPOSITE +    /* +     * When drawing to a pixmap which is storing window contents, +     * the region presented is in pixmap relative coordinates which +     * need to be converted to screen relative coordinates +     */ +    if (pDrawable->type != DRAWABLE_WINDOW) +    { +	screen_x = ((PixmapPtr) pDrawable)->screen_x - pDrawable->x; +	screen_y = ((PixmapPtr) pDrawable)->screen_y - pDrawable->y; +    } +    if (screen_x || screen_y) +        RegionTranslate(pRegion, screen_x, screen_y); +#endif +	 +    if (pDrawable->type == DRAWABLE_WINDOW && +	((WindowPtr)(pDrawable))->backingStore == NotUseful) +    { +	if (subWindowMode == ClipByChildren) +	{ +	    RegionIntersect(pRegion, pRegion, +			     &((WindowPtr)(pDrawable))->clipList); +	} +	else if (subWindowMode == IncludeInferiors) +	{ +	    RegionPtr pTempRegion = +		NotClippedByChildren((WindowPtr)(pDrawable)); +	    RegionIntersect(pRegion, pRegion, pTempRegion); +	    RegionDestroy(pTempRegion); +	} +	/* If subWindowMode is set to an invalid value, don't perform +	 * any drawable-based clipping. */ +    } +         + +    RegionNull(&clippedRec); +    for (; pDamage; pDamage = pNext) +    { +	pNext = pDamage->pNext; +	/* +	 * Check for internal damage and don't send events +	 */ +	if (pScrPriv->internalLevel > 0 && !pDamage->isInternal) +	{ +	    DAMAGE_DEBUG (("non internal damage, skipping at %d\n", +			   pScrPriv->internalLevel)); +	    continue; +	} +	/* +	 * Check for unrealized windows +	 */ +	if (pDamage->pDrawable->type == DRAWABLE_WINDOW && +	    !((WindowPtr) (pDamage->pDrawable))->realized) +	{ +	    continue; +	} +	 +	draw_x = pDamage->pDrawable->x; +	draw_y = pDamage->pDrawable->y; +#ifdef COMPOSITE +	/* +	 * Need to move everyone to screen coordinates +	 * XXX what about off-screen pixmaps with non-zero x/y? +	 */ +	if (!WindowDrawable(pDamage->pDrawable->type)) +	{ +	    draw_x += ((PixmapPtr) pDamage->pDrawable)->screen_x; +	    draw_y += ((PixmapPtr) pDamage->pDrawable)->screen_y; +	} +#endif +	 +	/* +	 * Clip against border or pixmap bounds +	 */ +	 +	pDamageRegion = pRegion; +	if (clip || pDamage->pDrawable != pDrawable) +	{ +	    pDamageRegion = &clippedRec; +	    if (pDamage->pDrawable->type == DRAWABLE_WINDOW) { +		RegionIntersect(pDamageRegion, pRegion, +		    &((WindowPtr)(pDamage->pDrawable))->borderClip); +	    } else { +		BoxRec	box; +		box.x1 = draw_x; +		box.y1 = draw_y; +		box.x2 = draw_x + pDamage->pDrawable->width; +		box.y2 = draw_y + pDamage->pDrawable->height; +		RegionInit(&pixClip, &box, 1); +		RegionIntersect(pDamageRegion, pRegion, &pixClip); +		RegionUninit(&pixClip); +	    } +	    /* +	     * Short circuit empty results +	     */ +	    if (!RegionNotEmpty(pDamageRegion)) +		continue; +	} +	 +	DAMAGE_DEBUG (("%s %d x %d +%d +%d (target 0x%lx monitor 0x%lx)\n", +		       where, +		       pDamageRegion->extents.x2 - pDamageRegion->extents.x1, +		       pDamageRegion->extents.y2 - pDamageRegion->extents.y1, +		       pDamageRegion->extents.x1, pDamageRegion->extents.y1, +		       pDrawable->id, pDamage->pDrawable->id)); +	 +	/* +	 * Move region to target coordinate space +	 */ +	if (draw_x || draw_y) +	    RegionTranslate(pDamageRegion, -draw_x, -draw_y); + +	/* Store damage region if needed after submission. */ +	if (pDamage->reportAfter || pDamage->damageMarker) +	    RegionUnion(&pDamage->pendingDamage, +			 &pDamage->pendingDamage, pDamageRegion); + +	/* Duplicate current damage if needed. */ +	if (pDamage->damageMarker) +	    RegionCopy(&pDamage->backupDamage, &pDamage->damage); + +	/* Report damage now, if desired. */ +	if (!pDamage->reportAfter) { +	    if (pDamage->damageReport) +		damageReportDamage (pDamage, pDamageRegion); +	    else +		RegionUnion(&pDamage->damage, +			 &pDamage->damage, pDamageRegion); +	} + +	/* +	 * translate original region back +	 */ +	if (pDamageRegion == pRegion && (draw_x || draw_y)) +	    RegionTranslate(pDamageRegion, draw_x, draw_y); +    } +#ifdef COMPOSITE +    if (screen_x || screen_y) +	RegionTranslate(pRegion, -screen_x, -screen_y); +#endif +     +    RegionUninit(&clippedRec); +} + +static void +damageRegionProcessPending (DrawablePtr pDrawable) +{ +    drawableDamage(pDrawable); + +    for (; pDamage != NULL; pDamage = pDamage->pNext) +    { +	/* submit damage marker whenever possible. */ +	if (pDamage->damageMarker) +	    (*pDamage->damageMarker) (pDrawable, pDamage, &pDamage->backupDamage, &pDamage->pendingDamage, pDamage->closure); +	if (pDamage->reportAfter) { +	    /* It's possible that there is only interest in postRendering reporting. */ +	    if (pDamage->damageReport) +		damageReportDamage (pDamage, &pDamage->pendingDamage); +	    else +		RegionUnion(&pDamage->damage, &pDamage->damage, +			&pDamage->pendingDamage); +	} + +	if (pDamage->reportAfter || pDamage->damageMarker) +	    RegionEmpty(&pDamage->pendingDamage); +	if (pDamage->damageMarker) +	    RegionEmpty(&pDamage->backupDamage); +    } +     +} + +#if DAMAGE_DEBUG_ENABLE +#define damageDamageBox(d,b,m) _damageDamageBox(d,b,m,__FUNCTION__) +static void +_damageDamageBox (DrawablePtr pDrawable, BoxPtr pBox, int subWindowMode, const char *where) +#else +static void +damageDamageBox (DrawablePtr pDrawable, BoxPtr pBox, int subWindowMode) +#endif +{ +    RegionRec	region; + +    RegionInit(®ion, pBox, 1); +#if DAMAGE_DEBUG_ENABLE +    _damageRegionAppend (pDrawable, ®ion, TRUE, subWindowMode, where); +#else +    damageRegionAppend (pDrawable, ®ion, TRUE, subWindowMode); +#endif +    RegionUninit(®ion); +} + +static void damageValidateGC(GCPtr, unsigned long, DrawablePtr); +static void damageChangeGC(GCPtr, unsigned long); +static void damageCopyGC(GCPtr, unsigned long, GCPtr); +static void damageDestroyGC(GCPtr); +static void damageChangeClip(GCPtr, int, pointer, int); +static void damageDestroyClip(GCPtr); +static void damageCopyClip(GCPtr, GCPtr); + +static GCFuncs damageGCFuncs = { +    damageValidateGC, damageChangeGC, damageCopyGC, damageDestroyGC, +    damageChangeClip, damageDestroyClip, damageCopyClip +}; + +static GCOps damageGCOps; + +static Bool +damageCreateGC(GCPtr pGC) +{ +    ScreenPtr pScreen = pGC->pScreen; +    damageScrPriv(pScreen); +    damageGCPriv(pGC); +    Bool ret; + +    unwrap (pScrPriv, pScreen, CreateGC); +    if((ret = (*pScreen->CreateGC) (pGC))) { +	pGCPriv->ops = NULL; +	pGCPriv->funcs = pGC->funcs; +	pGC->funcs = &damageGCFuncs; +    } +    wrap (pScrPriv, pScreen, CreateGC, damageCreateGC); + +    return ret; +} + +#define DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable) \ +    damageGCPriv(pGC);  \ +    GCFuncs *oldFuncs = pGC->funcs; \ +    unwrap(pGCPriv, pGC, funcs);  \ +    unwrap(pGCPriv, pGC, ops); \ + +#define DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable) \ +    wrap(pGCPriv, pGC, funcs, oldFuncs); \ +    wrap(pGCPriv, pGC, ops, &damageGCOps) + +#define DAMAGE_GC_FUNC_PROLOGUE(pGC) \ +    damageGCPriv(pGC); \ +    unwrap(pGCPriv, pGC, funcs); \ +    if (pGCPriv->ops) unwrap(pGCPriv, pGC, ops) + +#define DAMAGE_GC_FUNC_EPILOGUE(pGC) \ +    wrap(pGCPriv, pGC, funcs, &damageGCFuncs);  \ +    if (pGCPriv->ops) wrap(pGCPriv, pGC, ops, &damageGCOps) + +static void +damageValidateGC(GCPtr         pGC, +		 unsigned long changes, +		 DrawablePtr   pDrawable) +{ +    DAMAGE_GC_FUNC_PROLOGUE (pGC); +    (*pGC->funcs->ValidateGC)(pGC, changes, pDrawable); +    pGCPriv->ops = pGC->ops;  /* just so it's not NULL */ +    DAMAGE_GC_FUNC_EPILOGUE (pGC); +} + +static void +damageDestroyGC(GCPtr pGC) +{ +    DAMAGE_GC_FUNC_PROLOGUE (pGC); +    (*pGC->funcs->DestroyGC)(pGC); +    DAMAGE_GC_FUNC_EPILOGUE (pGC); +} + +static void +damageChangeGC (GCPtr		pGC, +		unsigned long   mask) +{ +    DAMAGE_GC_FUNC_PROLOGUE (pGC); +    (*pGC->funcs->ChangeGC) (pGC, mask); +    DAMAGE_GC_FUNC_EPILOGUE (pGC); +} + +static void +damageCopyGC (GCPtr	    pGCSrc, +	      unsigned long mask, +	      GCPtr	    pGCDst) +{ +    DAMAGE_GC_FUNC_PROLOGUE (pGCDst); +    (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst); +    DAMAGE_GC_FUNC_EPILOGUE (pGCDst); +} + +static void +damageChangeClip (GCPtr	    pGC, +		  int	    type, +		  pointer   pvalue, +		  int	    nrects) +{ +    DAMAGE_GC_FUNC_PROLOGUE (pGC); +    (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects); +    DAMAGE_GC_FUNC_EPILOGUE (pGC); +} + +static void +damageCopyClip(GCPtr pgcDst, GCPtr pgcSrc) +{ +    DAMAGE_GC_FUNC_PROLOGUE (pgcDst); +    (* pgcDst->funcs->CopyClip)(pgcDst, pgcSrc); +    DAMAGE_GC_FUNC_EPILOGUE (pgcDst); +} + +static void +damageDestroyClip(GCPtr pGC) +{ +    DAMAGE_GC_FUNC_PROLOGUE (pGC); +    (* pGC->funcs->DestroyClip)(pGC); +    DAMAGE_GC_FUNC_EPILOGUE (pGC); +} + +#define TRIM_BOX(box, pGC) if (pGC->pCompositeClip) { \ +    BoxPtr extents = &pGC->pCompositeClip->extents;\ +    if(box.x1 < extents->x1) box.x1 = extents->x1; \ +    if(box.x2 > extents->x2) box.x2 = extents->x2; \ +    if(box.y1 < extents->y1) box.y1 = extents->y1; \ +    if(box.y2 > extents->y2) box.y2 = extents->y2; \ +    } + +#define TRANSLATE_BOX(box, pDrawable) { \ +    box.x1 += pDrawable->x; \ +    box.x2 += pDrawable->x; \ +    box.y1 += pDrawable->y; \ +    box.y2 += pDrawable->y; \ +    } + +#define TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC) { \ +    TRANSLATE_BOX(box, pDrawable); \ +    TRIM_BOX(box, pGC); \ +    } + +#define BOX_NOT_EMPTY(box) \ +    (((box.x2 - box.x1) > 0) && ((box.y2 - box.y1) > 0)) + +#define checkGCDamage(d,g)	(getDrawableDamage(d) && \ +				 (!g->pCompositeClip ||\ +				  RegionNotEmpty(g->pCompositeClip))) + +#define TRIM_PICTURE_BOX(box, pDst) { \ +    BoxPtr extents = &pDst->pCompositeClip->extents;\ +    if(box.x1 < extents->x1) box.x1 = extents->x1; \ +    if(box.x2 > extents->x2) box.x2 = extents->x2; \ +    if(box.y1 < extents->y1) box.y1 = extents->y1; \ +    if(box.y2 > extents->y2) box.y2 = extents->y2; \ +    } +     +#define checkPictureDamage(p)	(getDrawableDamage(p->pDrawable) && \ +				 RegionNotEmpty(p->pCompositeClip)) + +static void +damageComposite (CARD8      op, +		   PicturePtr pSrc, +		   PicturePtr pMask, +		   PicturePtr pDst, +		   INT16      xSrc, +		   INT16      ySrc, +		   INT16      xMask, +		   INT16      yMask, +		   INT16      xDst, +		   INT16      yDst, +		   CARD16     width, +		   CARD16     height) +{ +    ScreenPtr		pScreen = pDst->pDrawable->pScreen; +    PictureScreenPtr	ps = GetPictureScreen(pScreen); +    damageScrPriv(pScreen); + +    if (checkPictureDamage (pDst)) +    { +	BoxRec	box; + +	box.x1 = xDst + pDst->pDrawable->x; +	box.y1 = yDst + pDst->pDrawable->y; +	box.x2 = box.x1 + width; +	box.y2 = box.y1 + height; +	TRIM_PICTURE_BOX(box, pDst); +	if (BOX_NOT_EMPTY(box)) +	    damageDamageBox (pDst->pDrawable, &box, pDst->subWindowMode); +    } +    unwrap (pScrPriv, ps, Composite); +    (*ps->Composite) (op, +		       pSrc, +		       pMask, +		       pDst, +		       xSrc, +		       ySrc, +		       xMask, +		       yMask, +		       xDst, +		       yDst, +		       width, +		       height); +    damageRegionProcessPending (pDst->pDrawable); +    wrap (pScrPriv, ps, Composite, damageComposite); +} + +static void +damageGlyphs (CARD8		op, +		PicturePtr	pSrc, +		PicturePtr	pDst, +		PictFormatPtr	maskFormat, +		INT16		xSrc, +		INT16		ySrc, +		int		nlist, +		GlyphListPtr	list, +		GlyphPtr	*glyphs) +{ +    ScreenPtr		pScreen = pDst->pDrawable->pScreen; +    PictureScreenPtr	ps = GetPictureScreen(pScreen); +    damageScrPriv(pScreen); + +    if (checkPictureDamage (pDst)) +    { +	int		nlistTmp = nlist; +	GlyphListPtr	listTmp = list; +	GlyphPtr	*glyphsTmp = glyphs; +	int		x, y; +	int		n; +	GlyphPtr	glyph; +	BoxRec		box; +	int		x1, y1, x2, y2; + +	box.x1 = 32767; +	box.y1 = 32767; +	box.x2 = -32767; +	box.y2 = -32767; +	x = pDst->pDrawable->x; +	y = pDst->pDrawable->y; +	while (nlistTmp--) +	{ +	    x += listTmp->xOff; +	    y += listTmp->yOff; +	    n = listTmp->len; +	    while (n--) +	    { +		glyph = *glyphsTmp++; +		x1 = x - glyph->info.x; +		y1 = y - glyph->info.y; +		x2 = x1 + glyph->info.width; +		y2 = y1 + glyph->info.height; +		if (x1 < box.x1) +		    box.x1 = x1; +		if (y1 < box.y1) +		    box.y1 = y1; +		if (x2 > box.x2) +		    box.x2 = x2; +		if (y2 > box.y2) +		    box.y2 = y2; +		x += glyph->info.xOff; +		y += glyph->info.yOff; +	    } +	    listTmp++; +	} +	TRIM_PICTURE_BOX (box, pDst); +	if (BOX_NOT_EMPTY(box)) +	    damageDamageBox (pDst->pDrawable, &box, pDst->subWindowMode); +    } +    unwrap (pScrPriv, ps, Glyphs); +    (*ps->Glyphs) (op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs); +    damageRegionProcessPending (pDst->pDrawable); +    wrap (pScrPriv, ps, Glyphs, damageGlyphs); +} + +static void +damageAddTraps (PicturePtr  pPicture, +		INT16	    x_off, +		INT16	    y_off, +		int	    ntrap, +		xTrap	    *traps) +{ +    ScreenPtr		pScreen = pPicture->pDrawable->pScreen; +    PictureScreenPtr	ps = GetPictureScreen(pScreen); +    damageScrPriv(pScreen); + +    if (checkPictureDamage (pPicture)) +    { +	BoxRec	box; +	int	i; +	int	x, y; +	xTrap	*t = traps; + +	box.x1 = 32767; +	box.y1 = 32767; +	box.x2 = -32767; +	box.y2 = -32767; +	x = pPicture->pDrawable->x + x_off; +	y = pPicture->pDrawable->y + y_off; +	for (i = 0; i < ntrap; i++) +	{ +	    pixman_fixed_t   l = min (t->top.l, t->bot.l); +	    pixman_fixed_t   r = max (t->top.r, t->bot.r); +	    int	    x1 = x + pixman_fixed_to_int (l); +	    int	    x2 = x + pixman_fixed_to_int (pixman_fixed_ceil (r)); +	    int	    y1 = y + pixman_fixed_to_int (t->top.y); +	    int	    y2 = y + pixman_fixed_to_int (pixman_fixed_ceil (t->bot.y)); +	     +	    if (x1 < box.x1) +		box.x1 = x1; +	    if (x2 > box.x2) +		box.x2 = x2; +	    if (y1 < box.y1) +		box.y1 = y1; +	    if (y2 > box.y2) +		box.y2 = y2; +	} +	TRIM_PICTURE_BOX (box, pPicture); +	if (BOX_NOT_EMPTY(box)) +	    damageDamageBox (pPicture->pDrawable, &box, pPicture->subWindowMode); +    } +    unwrap (pScrPriv, ps, AddTraps); +    (*ps->AddTraps) (pPicture, x_off, y_off, ntrap, traps); +    damageRegionProcessPending (pPicture->pDrawable); +    wrap (pScrPriv, ps, AddTraps, damageAddTraps); +} + +/**********************************************************/ + + +static void +damageFillSpans(DrawablePtr pDrawable, +		GC	    *pGC, +		int	    npt, +		DDXPointPtr ppt, +		int	    *pwidth, +		int	    fSorted) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); + +    if (npt && checkGCDamage (pDrawable, pGC)) +    { +	int	    nptTmp = npt; +	DDXPointPtr pptTmp = ppt; +	int	    *pwidthTmp = pwidth; +	BoxRec	    box; + +	box.x1 = pptTmp->x; +	box.x2 = box.x1 + *pwidthTmp; +	box.y2 = box.y1 = pptTmp->y; + +	while(--nptTmp)  +	{ +	   pptTmp++; +	   pwidthTmp++; +	   if(box.x1 > pptTmp->x) box.x1 = pptTmp->x; +	   if(box.x2 < (pptTmp->x + *pwidthTmp)) +		box.x2 = pptTmp->x + *pwidthTmp; +	   if(box.y1 > pptTmp->y) box.y1 = pptTmp->y; +	   else if(box.y2 < pptTmp->y) box.y2 = pptTmp->y; +	} + +	box.y2++; + +        if(!pGC->miTranslate) { +           TRANSLATE_BOX(box, pDrawable); +        } +        TRIM_BOX(box, pGC);  + +	if(BOX_NOT_EMPTY(box)) +	   damageDamageBox (pDrawable, &box, pGC->subWindowMode); +    } +     +    (*pGC->ops->FillSpans)(pDrawable, pGC, npt, ppt, pwidth, fSorted); + +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +} + +static void +damageSetSpans(DrawablePtr  pDrawable, +	       GCPtr	    pGC, +	       char	    *pcharsrc, +	       DDXPointPtr  ppt, +	       int	    *pwidth, +	       int	    npt, +	       int	    fSorted) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); + +    if (npt && checkGCDamage (pDrawable, pGC)) +    { +	DDXPointPtr pptTmp = ppt; +	int	    *pwidthTmp = pwidth; +	int	    nptTmp = npt; +	BoxRec	    box; + +	box.x1 = pptTmp->x; +	box.x2 = box.x1 + *pwidthTmp; +	box.y2 = box.y1 = pptTmp->y; + +	while(--nptTmp)  +	{ +	   pptTmp++; +	   pwidthTmp++; +	   if(box.x1 > pptTmp->x) box.x1 = pptTmp->x; +	   if(box.x2 < (pptTmp->x + *pwidthTmp)) +		box.x2 = pptTmp->x + *pwidthTmp; +	   if(box.y1 > pptTmp->y) box.y1 = pptTmp->y; +	   else if(box.y2 < pptTmp->y) box.y2 = pptTmp->y; +	} + +	box.y2++; + +        if(!pGC->miTranslate) { +           TRANSLATE_BOX(box, pDrawable); +        } +        TRIM_BOX(box, pGC);  + +	if(BOX_NOT_EMPTY(box)) +	   damageDamageBox (pDrawable, &box, pGC->subWindowMode); +    } +    (*pGC->ops->SetSpans)(pDrawable, pGC, pcharsrc, ppt, pwidth, npt, fSorted); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +} + +static void +damagePutImage(DrawablePtr  pDrawable, +	       GCPtr	    pGC, +	       int	    depth, +	       int	    x, +	       int	    y, +	       int	    w, +	       int	    h, +	       int	    leftPad, +	       int	    format, +	       char	    *pImage) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); +    if (checkGCDamage (pDrawable, pGC)) +    { +	BoxRec box; + +	box.x1 = x + pDrawable->x; +	box.x2 = box.x1 + w; +	box.y1 = y + pDrawable->y; +	box.y2 = box.y1 + h; + +	TRIM_BOX(box, pGC); +	if(BOX_NOT_EMPTY(box)) +	   damageDamageBox (pDrawable, &box, pGC->subWindowMode); +    } +    (*pGC->ops->PutImage)(pDrawable, pGC, depth, x, y, w, h, +		leftPad, format, pImage); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +} + +static RegionPtr +damageCopyArea(DrawablePtr   pSrc, +	       DrawablePtr  pDst, +	       GC	    *pGC, +	       int	    srcx, +	       int	    srcy, +	       int	    width, +	       int	    height, +	       int	    dstx, +	       int	    dsty) +{ +    RegionPtr ret; +    DAMAGE_GC_OP_PROLOGUE(pGC, pDst); +     +    if (checkGCDamage (pDst, pGC)) +    { +	BoxRec box; + +	box.x1 = dstx + pDst->x; +	box.x2 = box.x1 + width; +	box.y1 = dsty + pDst->y; +	box.y2 = box.y1 + height; + +	TRIM_BOX(box, pGC); +	if(BOX_NOT_EMPTY(box)) +	   damageDamageBox (pDst, &box, pGC->subWindowMode); +    } + +    ret = (*pGC->ops->CopyArea)(pSrc, pDst, +            pGC, srcx, srcy, width, height, dstx, dsty); +    damageRegionProcessPending (pDst); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDst); +    return ret; +} + +static RegionPtr +damageCopyPlane(DrawablePtr	pSrc, +		DrawablePtr	pDst, +		GCPtr		pGC, +		int		srcx, +		int		srcy, +		int		width, +		int		height, +		int		dstx, +		int		dsty, +		unsigned long	bitPlane) +{ +    RegionPtr ret; +    DAMAGE_GC_OP_PROLOGUE(pGC, pDst); + +    if (checkGCDamage (pDst, pGC)) +    { +	BoxRec box; + +	box.x1 = dstx + pDst->x; +	box.x2 = box.x1 + width; +	box.y1 = dsty + pDst->y; +	box.y2 = box.y1 + height; + +	TRIM_BOX(box, pGC); +	if(BOX_NOT_EMPTY(box)) +	   damageDamageBox (pDst, &box, pGC->subWindowMode); +    } + +    ret = (*pGC->ops->CopyPlane)(pSrc, pDst, +	       pGC, srcx, srcy, width, height, dstx, dsty, bitPlane); +    damageRegionProcessPending (pDst); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDst); +    return ret; +} + +static void +damagePolyPoint(DrawablePtr pDrawable, +		GCPtr	    pGC, +		int	    mode, +		int	    npt, +		xPoint	    *ppt) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); + +    if (npt && checkGCDamage (pDrawable, pGC)) +    { +	BoxRec	box; +	int	nptTmp = npt; +	xPoint	*pptTmp = ppt; + +	box.x2 = box.x1 = pptTmp->x; +	box.y2 = box.y1 = pptTmp->y; + +	/* this could be slow if the points were spread out */ + +	while(--nptTmp)  +	{ +	   pptTmp++; +	   if(box.x1 > pptTmp->x) box.x1 = pptTmp->x; +	   else if(box.x2 < pptTmp->x) box.x2 = pptTmp->x; +	   if(box.y1 > pptTmp->y) box.y1 = pptTmp->y; +	   else if(box.y2 < pptTmp->y) box.y2 = pptTmp->y; +	} + +	box.x2++; +	box.y2++; + +	TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC); +	if(BOX_NOT_EMPTY(box)) +	   damageDamageBox (pDrawable, &box, pGC->subWindowMode); +    } +    (*pGC->ops->PolyPoint)(pDrawable, pGC, mode, npt, ppt); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +} + +static void +damagePolylines(DrawablePtr pDrawable, +		GCPtr	    pGC, +		int	    mode, +		int	    npt, +		DDXPointPtr ppt) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); + +    if (npt && checkGCDamage (pDrawable, pGC)) +    { +	int	    nptTmp = npt; +	DDXPointPtr pptTmp = ppt; +	BoxRec	    box; +	int	    extra = pGC->lineWidth >> 1; + +	box.x2 = box.x1 = pptTmp->x; +	box.y2 = box.y1 = pptTmp->y; + +	if(nptTmp > 1)  +	{ +	   if(pGC->joinStyle == JoinMiter) +		extra = 6 * pGC->lineWidth; +	   else if(pGC->capStyle == CapProjecting) +		extra = pGC->lineWidth; +        } + +	if(mode == CoordModePrevious)  +	{ +	   int x = box.x1; +	   int y = box.y1; +	   while(--nptTmp)  +	   { +		pptTmp++; +		x += pptTmp->x; +		y += pptTmp->y; +		if(box.x1 > x) box.x1 = x; +		else if(box.x2 < x) box.x2 = x; +		if(box.y1 > y) box.y1 = y; +		else if(box.y2 < y) box.y2 = y; +	    } +	} +	else  +	{ +	   while(--nptTmp)  +	   { +		pptTmp++; +		if(box.x1 > pptTmp->x) box.x1 = pptTmp->x; +		else if(box.x2 < pptTmp->x) box.x2 = pptTmp->x; +		if(box.y1 > pptTmp->y) box.y1 = pptTmp->y; +		else if(box.y2 < pptTmp->y) box.y2 = pptTmp->y; +	    } +	} + +	box.x2++; +	box.y2++; + +	if(extra)  +	{ +	   box.x1 -= extra; +	   box.x2 += extra; +	   box.y1 -= extra; +	   box.y2 += extra; +        } + +	TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC); +	if(BOX_NOT_EMPTY(box)) +	   damageDamageBox (pDrawable, &box, pGC->subWindowMode); +    } +    (*pGC->ops->Polylines)(pDrawable, pGC, mode, npt, ppt); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +} + +static void +damagePolySegment(DrawablePtr	pDrawable, +		  GCPtr		pGC, +		  int		nSeg, +		  xSegment	*pSeg) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); + +    if (nSeg && checkGCDamage (pDrawable, pGC)) +    { +	BoxRec	    box; +	int	    extra = pGC->lineWidth; +	int	    nsegTmp = nSeg; +	xSegment    *pSegTmp = pSeg; + +        if(pGC->capStyle != CapProjecting) +	   extra >>= 1; + +	if(pSegTmp->x2 > pSegTmp->x1) { +	    box.x1 = pSegTmp->x1; +	    box.x2 = pSegTmp->x2; +	} else { +	    box.x2 = pSegTmp->x1; +	    box.x1 = pSegTmp->x2; +	} + +	if(pSegTmp->y2 > pSegTmp->y1) { +	    box.y1 = pSegTmp->y1; +	    box.y2 = pSegTmp->y2; +	} else { +	    box.y2 = pSegTmp->y1; +	    box.y1 = pSegTmp->y2; +	} + +	while(--nsegTmp)  +	{ +	    pSegTmp++; +	    if(pSegTmp->x2 > pSegTmp->x1)  +	    { +		if(pSegTmp->x1 < box.x1) box.x1 = pSegTmp->x1; +		if(pSegTmp->x2 > box.x2) box.x2 = pSegTmp->x2; +	    } +	    else  +	    { +		if(pSegTmp->x2 < box.x1) box.x1 = pSegTmp->x2; +		if(pSegTmp->x1 > box.x2) box.x2 = pSegTmp->x1; +	    } +	    if(pSegTmp->y2 > pSegTmp->y1)  +	    { +		if(pSegTmp->y1 < box.y1) box.y1 = pSegTmp->y1; +		if(pSegTmp->y2 > box.y2) box.y2 = pSegTmp->y2; +	    } +	    else +	    { +		if(pSegTmp->y2 < box.y1) box.y1 = pSegTmp->y2; +		if(pSegTmp->y1 > box.y2) box.y2 = pSegTmp->y1; +	    } +	} + +	box.x2++; +	box.y2++; + +	if(extra)  +	{ +	   box.x1 -= extra; +	   box.x2 += extra; +	   box.y1 -= extra; +	   box.y2 += extra; +        } + +	TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC); +	if(BOX_NOT_EMPTY(box)) +	   damageDamageBox (pDrawable, &box, pGC->subWindowMode); +    } +    (*pGC->ops->PolySegment)(pDrawable, pGC, nSeg, pSeg); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +} + +static void +damagePolyRectangle(DrawablePtr  pDrawable, +		    GCPtr        pGC, +		    int	         nRects, +		    xRectangle  *pRects) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); + +    if (nRects && checkGCDamage (pDrawable, pGC)) +    { +	BoxRec	    box; +	int	    offset1, offset2, offset3; +	int	    nRectsTmp = nRects; +	xRectangle  *pRectsTmp = pRects; + +	offset2 = pGC->lineWidth; +	if(!offset2) offset2 = 1; +	offset1 = offset2 >> 1; +	offset3 = offset2 - offset1; + +	while(nRectsTmp--) +	{ +	    box.x1 = pRectsTmp->x - offset1; +	    box.y1 = pRectsTmp->y - offset1; +	    box.x2 = box.x1 + pRectsTmp->width + offset2; +	    box.y2 = box.y1 + offset2; +	    TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC); +	    if(BOX_NOT_EMPTY(box)) +		damageDamageBox (pDrawable, &box, pGC->subWindowMode); + +	    box.x1 = pRectsTmp->x - offset1; +	    box.y1 = pRectsTmp->y + offset3; +	    box.x2 = box.x1 + offset2; +	    box.y2 = box.y1 + pRectsTmp->height - offset2; +	    TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC); +	    if(BOX_NOT_EMPTY(box)) +		damageDamageBox (pDrawable, &box, pGC->subWindowMode); + +	    box.x1 = pRectsTmp->x + pRectsTmp->width - offset1; +	    box.y1 = pRectsTmp->y + offset3; +	    box.x2 = box.x1 + offset2; +	    box.y2 = box.y1 + pRectsTmp->height - offset2; +	    TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC); +	    if(BOX_NOT_EMPTY(box)) +		damageDamageBox (pDrawable, &box, pGC->subWindowMode); + +	    box.x1 = pRectsTmp->x - offset1; +	    box.y1 = pRectsTmp->y + pRectsTmp->height - offset1; +	    box.x2 = box.x1 + pRectsTmp->width + offset2; +	    box.y2 = box.y1 + offset2; +	    TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC); +	    if(BOX_NOT_EMPTY(box)) +		damageDamageBox (pDrawable, &box, pGC->subWindowMode); + +	    pRectsTmp++; +	} +    } +    (*pGC->ops->PolyRectangle)(pDrawable, pGC, nRects, pRects); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +} + +static void +damagePolyArc(DrawablePtr   pDrawable, +	      GCPtr	    pGC, +	      int	    nArcs, +	      xArc	    *pArcs) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); + +    if (nArcs && checkGCDamage (pDrawable, pGC)) +    { +	int	extra = pGC->lineWidth >> 1; +	BoxRec	box; +	int	nArcsTmp = nArcs; +	xArc	*pArcsTmp = pArcs; + +	box.x1 = pArcsTmp->x; +	box.x2 = box.x1 + pArcsTmp->width; +	box.y1 = pArcsTmp->y; +	box.y2 = box.y1 + pArcsTmp->height; + +	while(--nArcsTmp)  +	{ +	    pArcsTmp++; +	    if(box.x1 > pArcsTmp->x) +		box.x1 = pArcsTmp->x; +	    if(box.x2 < (pArcsTmp->x + pArcsTmp->width)) +		box.x2 = pArcsTmp->x + pArcsTmp->width; +	    if(box.y1 > pArcsTmp->y)  +		box.y1 = pArcsTmp->y; +	    if(box.y2 < (pArcsTmp->y + pArcsTmp->height)) +		box.y2 = pArcsTmp->y + pArcsTmp->height; +        } + +	if(extra)  +	{ +	   box.x1 -= extra; +	   box.x2 += extra; +	   box.y1 -= extra; +	   box.y2 += extra; +        } + +	box.x2++; +	box.y2++; + +	TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC); +	if(BOX_NOT_EMPTY(box)) +	   damageDamageBox (pDrawable, &box, pGC->subWindowMode); +    } +    (*pGC->ops->PolyArc)(pDrawable, pGC, nArcs, pArcs); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +} + +static void +damageFillPolygon(DrawablePtr	pDrawable, +		  GCPtr		pGC, +		  int		shape, +		  int		mode, +		  int		npt, +		  DDXPointPtr	ppt) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); + +    if (npt > 2 && checkGCDamage (pDrawable, pGC)) +    { +	DDXPointPtr pptTmp = ppt; +	int	    nptTmp = npt; +	BoxRec	    box; + +	box.x2 = box.x1 = pptTmp->x; +	box.y2 = box.y1 = pptTmp->y; + +	if(mode != CoordModeOrigin)  +	{ +	   int x = box.x1; +	   int y = box.y1; +	   while(--nptTmp)  +	   { +		pptTmp++; +		x += pptTmp->x; +		y += pptTmp->y; +		if(box.x1 > x) box.x1 = x; +		else if(box.x2 < x) box.x2 = x; +		if(box.y1 > y) box.y1 = y; +		else if(box.y2 < y) box.y2 = y; +	    } +	} +	else  +	{ +	   while(--nptTmp)  +	   { +		pptTmp++; +		if(box.x1 > pptTmp->x) box.x1 = pptTmp->x; +		else if(box.x2 < pptTmp->x) box.x2 = pptTmp->x; +		if(box.y1 > pptTmp->y) box.y1 = pptTmp->y; +		else if(box.y2 < pptTmp->y) box.y2 = pptTmp->y; +	    } +	} + +	box.x2++; +	box.y2++; + +	TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC); +	if(BOX_NOT_EMPTY(box)) +	   damageDamageBox (pDrawable, &box, pGC->subWindowMode); +    } +     +    (*pGC->ops->FillPolygon)(pDrawable, pGC, shape, mode, npt, ppt); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +} + + +static void +damagePolyFillRect(DrawablePtr	pDrawable, +		   GCPtr	pGC, +		   int		nRects, +		   xRectangle	*pRects) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); +    if (nRects && checkGCDamage (pDrawable, pGC)) +    { +	BoxRec	    box; +	xRectangle  *pRectsTmp = pRects; +	int	    nRectsTmp = nRects; + +	box.x1 = pRectsTmp->x; +	box.x2 = box.x1 + pRectsTmp->width; +	box.y1 = pRectsTmp->y; +	box.y2 = box.y1 + pRectsTmp->height; + +	while(--nRectsTmp)  +	{ +	    pRectsTmp++; +	    if(box.x1 > pRectsTmp->x) box.x1 = pRectsTmp->x; +	    if(box.x2 < (pRectsTmp->x + pRectsTmp->width)) +		box.x2 = pRectsTmp->x + pRectsTmp->width; +	    if(box.y1 > pRectsTmp->y) box.y1 = pRectsTmp->y; +	    if(box.y2 < (pRectsTmp->y + pRectsTmp->height)) +		box.y2 = pRectsTmp->y + pRectsTmp->height; +	} + +	TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC); +	if(BOX_NOT_EMPTY(box)) +	    damageDamageBox (pDrawable, &box, pGC->subWindowMode); +    } +    (*pGC->ops->PolyFillRect)(pDrawable, pGC, nRects, pRects); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +} + + +static void +damagePolyFillArc(DrawablePtr	pDrawable, +		  GCPtr		pGC, +		  int		nArcs, +		  xArc		*pArcs) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); + +    if (nArcs && checkGCDamage (pDrawable, pGC)) +    { +	BoxRec	box; +	int	nArcsTmp = nArcs; +	xArc	*pArcsTmp = pArcs; + +	box.x1 = pArcsTmp->x; +	box.x2 = box.x1 + pArcsTmp->width; +	box.y1 = pArcsTmp->y; +	box.y2 = box.y1 + pArcsTmp->height; + +	while(--nArcsTmp)  +	{ +	    pArcsTmp++; +	    if(box.x1 > pArcsTmp->x) +		box.x1 = pArcsTmp->x; +	    if(box.x2 < (pArcsTmp->x + pArcsTmp->width)) +		box.x2 = pArcsTmp->x + pArcsTmp->width; +	    if(box.y1 > pArcsTmp->y) +		box.y1 = pArcsTmp->y; +	    if(box.y2 < (pArcsTmp->y + pArcsTmp->height)) +		box.y2 = pArcsTmp->y + pArcsTmp->height; +        } + +	TRIM_AND_TRANSLATE_BOX(box, pDrawable, pGC); +	if(BOX_NOT_EMPTY(box)) +	   damageDamageBox (pDrawable, &box, pGC->subWindowMode); +    } +    (*pGC->ops->PolyFillArc)(pDrawable, pGC, nArcs, pArcs); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +} + +/* + * general Poly/Image text function.  Extract glyph information, + * compute bounding box and remove cursor if it is overlapped. + */ + +static void +damageDamageChars (DrawablePtr	pDrawable, +		   FontPtr	font, +		   int		x, +		   int		y, +		   unsigned int	n, +		   CharInfoPtr	*charinfo, +		   Bool		imageblt, +		   int		subWindowMode) +{ +    ExtentInfoRec   extents; +    BoxRec	    box; + +    QueryGlyphExtents(font, charinfo, n, &extents); +    if (imageblt) +    { +	if (extents.overallWidth > extents.overallRight) +	    extents.overallRight = extents.overallWidth; +	if (extents.overallWidth < extents.overallLeft) +	    extents.overallLeft = extents.overallWidth; +	if (extents.overallLeft > 0) +	    extents.overallLeft = 0; +	if (extents.fontAscent > extents.overallAscent) +	    extents.overallAscent = extents.fontAscent; +	if (extents.fontDescent > extents.overallDescent) +	    extents.overallDescent = extents.fontDescent; +    } +    box.x1 = x + extents.overallLeft; +    box.y1 = y - extents.overallAscent; +    box.x2 = x + extents.overallRight; +    box.y2 = y + extents.overallDescent; +    damageDamageBox (pDrawable, &box, subWindowMode); +} + +/* + * values for textType: + */ +#define TT_POLY8   0 +#define TT_IMAGE8  1 +#define TT_POLY16  2 +#define TT_IMAGE16 3 + +static int  +damageText (DrawablePtr	    pDrawable, +	    GCPtr	    pGC, +	    int		    x, +	    int		    y, +	    unsigned long   count, +	    char	    *chars, +	    FontEncoding    fontEncoding, +	    Bool	    textType) +{ +    CharInfoPtr	    *charinfo; +    CharInfoPtr	    *info; +    unsigned long   i; +    unsigned int    n; +    int		    w; +    Bool	    imageblt; + +    imageblt = (textType == TT_IMAGE8) || (textType == TT_IMAGE16); + +    charinfo = malloc(count * sizeof(CharInfoPtr)); +    if (!charinfo) +	return x; + +    GetGlyphs(pGC->font, count, (unsigned char *)chars, +	      fontEncoding, &i, charinfo); +    n = (unsigned int)i; +    w = 0; +    if (!imageblt) +	for (info = charinfo; i--; info++) +	    w += (*info)->metrics.characterWidth; + +    if (n != 0) { +	damageDamageChars (pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y, n, +			   charinfo, imageblt, pGC->subWindowMode); +	if (imageblt) +	    (*pGC->ops->ImageGlyphBlt)(pDrawable, pGC, x, y, n, charinfo, +				       FONTGLYPHS(pGC->font)); +	else +	    (*pGC->ops->PolyGlyphBlt)(pDrawable, pGC, x, y, n, charinfo, +				      FONTGLYPHS(pGC->font)); +    } +    free(charinfo); +    return x + w; +} + +static int +damagePolyText8(DrawablePtr pDrawable, +		GCPtr	    pGC, +		int	    x, +		int	    y, +		int	    count, +		char	    *chars) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); + +    if (checkGCDamage (pDrawable, pGC)) +	x = damageText (pDrawable, pGC, x, y, (unsigned long) count, chars, +		    Linear8Bit, TT_POLY8); +    else +	x = (*pGC->ops->PolyText8)(pDrawable, pGC, x, y, count, chars); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +    return x; +} + +static int +damagePolyText16(DrawablePtr	pDrawable, +		 GCPtr		pGC, +		 int		x, +		 int		y, +		 int		count, +		 unsigned short	*chars) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); + +    if (checkGCDamage (pDrawable, pGC)) +	x = damageText (pDrawable, pGC, x, y, (unsigned long) count, (char *) chars, +		    FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit, +		    TT_POLY16); +    else +	x = (*pGC->ops->PolyText16)(pDrawable, pGC, x, y, count, chars); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +    return x; +} + +static void +damageImageText8(DrawablePtr	pDrawable, +		 GCPtr		pGC, +		 int		x, +		 int		y, +		 int		count, +		 char		*chars) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); + +    if (checkGCDamage (pDrawable, pGC)) +	damageText (pDrawable, pGC, x, y, (unsigned long) count, chars, +		    Linear8Bit, TT_IMAGE8); +    else +	(*pGC->ops->ImageText8)(pDrawable, pGC, x, y, count, chars); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +} + +static void +damageImageText16(DrawablePtr	pDrawable, +		  GCPtr		pGC, +		  int		x, +		  int		y, +		  int		count, +		  unsigned short *chars) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); + +    if (checkGCDamage (pDrawable, pGC)) +	damageText (pDrawable, pGC, x, y, (unsigned long) count, (char *) chars, +		    FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit, +		    TT_IMAGE16); +    else +	(*pGC->ops->ImageText16)(pDrawable, pGC, x, y, count, chars); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +} + + +static void +damageImageGlyphBlt(DrawablePtr	    pDrawable, +		    GCPtr	    pGC, +		    int		    x, +		    int		    y, +		    unsigned int    nglyph, +		    CharInfoPtr	    *ppci, +		    pointer	    pglyphBase) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); +    damageDamageChars (pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y, +		       nglyph, ppci, TRUE, pGC->subWindowMode); +    (*pGC->ops->ImageGlyphBlt)(pDrawable, pGC, x, y, nglyph, +					ppci, pglyphBase); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +} + +static void +damagePolyGlyphBlt(DrawablePtr	pDrawable, +		   GCPtr	pGC, +		   int		x, +		   int		y, +		   unsigned int	nglyph, +		   CharInfoPtr	*ppci, +		   pointer	pglyphBase) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); +    damageDamageChars (pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y, +		       nglyph, ppci, FALSE, pGC->subWindowMode); +    (*pGC->ops->PolyGlyphBlt)(pDrawable, pGC, x, y, nglyph, +				ppci, pglyphBase); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +} + +static void +damagePushPixels(GCPtr		pGC, +		 PixmapPtr	pBitMap, +		 DrawablePtr	pDrawable, +		 int		dx, +		 int		dy, +		 int		xOrg, +		 int		yOrg) +{ +    DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable); +    if(checkGCDamage (pDrawable, pGC)) +    { +	BoxRec box; + +        box.x1 = xOrg; +        box.y1 = yOrg; + +        if(!pGC->miTranslate) { +           box.x1 += pDrawable->x;           +           box.y1 += pDrawable->y;           +        } + +	box.x2 = box.x1 + dx; +	box.y2 = box.y1 + dy; + +	TRIM_BOX(box, pGC); +	if(BOX_NOT_EMPTY(box)) +	   damageDamageBox (pDrawable, &box, pGC->subWindowMode); +    } +    (*pGC->ops->PushPixels)(pGC, pBitMap, pDrawable, dx, dy, xOrg, yOrg); +    damageRegionProcessPending (pDrawable); +    DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable); +} + +static void +damageRemoveDamage (DamagePtr *pPrev, DamagePtr pDamage) +{ +    while (*pPrev) +    { +	if (*pPrev == pDamage) +	{ +	    *pPrev = pDamage->pNext; +	    return; +	} +	pPrev = &(*pPrev)->pNext; +    } +#if DAMAGE_VALIDATE_ENABLE +    ErrorF ("Damage not on list\n"); +    OsAbort (); +#endif +} + +static void +damageInsertDamage (DamagePtr *pPrev, DamagePtr pDamage) +{ +#if DAMAGE_VALIDATE_ENABLE +    DamagePtr	pOld; + +    for (pOld = *pPrev; pOld; pOld = pOld->pNext) +	if (pOld == pDamage) { +	    ErrorF ("Damage already on list\n"); +	    OsAbort (); +	} +#endif +    pDamage->pNext = *pPrev; +    *pPrev = pDamage; +} + +static Bool +damageDestroyPixmap (PixmapPtr pPixmap) +{ +    ScreenPtr	pScreen = pPixmap->drawable.pScreen; +    damageScrPriv(pScreen); + +    if (pPixmap->refcnt == 1) +    { +	DamagePtr	*pPrev = getPixmapDamageRef (pPixmap); +	DamagePtr	pDamage; + +	while ((pDamage = *pPrev)) +	{ +	    damageRemoveDamage (pPrev, pDamage); +	    if (!pDamage->isWindow) +		DamageDestroy (pDamage); +	} +    } +    unwrap (pScrPriv, pScreen, DestroyPixmap); +    (*pScreen->DestroyPixmap) (pPixmap); +    wrap (pScrPriv, pScreen, DestroyPixmap, damageDestroyPixmap); +    return TRUE; +} + +static void +damageCopyWindow(WindowPtr	pWindow, +		 DDXPointRec	ptOldOrg, +		 RegionPtr	prgnSrc) +{ +    ScreenPtr pScreen = pWindow->drawable.pScreen; +    damageScrPriv(pScreen); + +    if (getWindowDamage (pWindow)) +    { +	int dx = pWindow->drawable.x - ptOldOrg.x; +	int dy = pWindow->drawable.y - ptOldOrg.y; +	 +	/* +	 * The region comes in source relative, but the damage occurs +	 * at the destination location.  Translate back and forth. +	 */ +	RegionTranslate(prgnSrc, dx, dy); +	damageRegionAppend (&pWindow->drawable, prgnSrc, FALSE, -1); +	RegionTranslate(prgnSrc, -dx, -dy); +    } +    unwrap (pScrPriv, pScreen, CopyWindow); +    (*pScreen->CopyWindow) (pWindow, ptOldOrg, prgnSrc); +    damageRegionProcessPending (&pWindow->drawable); +    wrap (pScrPriv, pScreen, CopyWindow, damageCopyWindow); +} + +static GCOps damageGCOps = { +    damageFillSpans, damageSetSpans, +    damagePutImage, damageCopyArea, +    damageCopyPlane, damagePolyPoint, +    damagePolylines, damagePolySegment, +    damagePolyRectangle, damagePolyArc, +    damageFillPolygon, damagePolyFillRect, +    damagePolyFillArc, damagePolyText8, +    damagePolyText16, damageImageText8, +    damageImageText16, damageImageGlyphBlt, +    damagePolyGlyphBlt, damagePushPixels, +}; + +static void +damageSetWindowPixmap (WindowPtr pWindow, PixmapPtr pPixmap) +{ +    DamagePtr	pDamage; +    ScreenPtr	pScreen = pWindow->drawable.pScreen; +    damageScrPriv(pScreen); + +    if ((pDamage = damageGetWinPriv(pWindow))) +    { +	PixmapPtr   pOldPixmap = (*pScreen->GetWindowPixmap) (pWindow); +	DamagePtr   *pPrev = getPixmapDamageRef(pOldPixmap); +	 +	while (pDamage) +	{ +	    damageRemoveDamage (pPrev, pDamage); +	    pDamage = pDamage->pNextWin; +	} +    } +    unwrap (pScrPriv, pScreen, SetWindowPixmap); +    (*pScreen->SetWindowPixmap) (pWindow, pPixmap); +    wrap (pScrPriv, pScreen, SetWindowPixmap, damageSetWindowPixmap); +    if ((pDamage = damageGetWinPriv(pWindow))) +    { +	DamagePtr   *pPrev = getPixmapDamageRef(pPixmap); +	 +	while (pDamage) +	{ +	    damageInsertDamage (pPrev, pDamage); +	    pDamage = pDamage->pNextWin; +	} +    } +} + +static Bool +damageDestroyWindow (WindowPtr pWindow) +{ +    DamagePtr	pDamage; +    ScreenPtr	pScreen = pWindow->drawable.pScreen; +    Bool	ret; +    damageScrPriv(pScreen); + +    while ((pDamage = damageGetWinPriv(pWindow))) +    { +	DamageUnregister (&pWindow->drawable, pDamage); +	DamageDestroy (pDamage); +    } +    unwrap (pScrPriv, pScreen, DestroyWindow); +    ret = (*pScreen->DestroyWindow) (pWindow); +    wrap (pScrPriv, pScreen, DestroyWindow, damageDestroyWindow); +    return ret; +} + +static Bool +damageCloseScreen (int i, ScreenPtr pScreen) +{ +    damageScrPriv(pScreen); + +    unwrap (pScrPriv, pScreen, DestroyPixmap); +    unwrap (pScrPriv, pScreen, CreateGC); +    unwrap (pScrPriv, pScreen, CopyWindow); +    unwrap (pScrPriv, pScreen, CloseScreen); +    free(pScrPriv); +    return (*pScreen->CloseScreen) (i, pScreen); +} + +/** + * Default implementations of the damage management functions. + */ +void miDamageCreate (DamagePtr pDamage) +{ +} + +void miDamageRegister (DrawablePtr pDrawable, DamagePtr pDamage) +{ +} + +void miDamageUnregister (DrawablePtr pDrawable, DamagePtr pDamage) +{ +} + +void miDamageDestroy (DamagePtr pDamage) +{ +} + +/** + * Public functions for consumption outside this file. + */ + +Bool +DamageSetup (ScreenPtr pScreen) +{ +    DamageScrPrivPtr	pScrPriv; +    PictureScreenPtr	ps = GetPictureScreenIfSet(pScreen); +    const DamageScreenFuncsRec miFuncs = { +	miDamageCreate, miDamageRegister, miDamageUnregister, miDamageDestroy +    }; + +    if (!dixRegisterPrivateKey(&damageScrPrivateKeyRec, PRIVATE_SCREEN, 0)) +	return FALSE; + +    if (dixLookupPrivate(&pScreen->devPrivates, damageScrPrivateKey)) +	return TRUE; + +    if (!dixRegisterPrivateKey(&damageGCPrivateKeyRec, PRIVATE_GC, sizeof(DamageGCPrivRec))) +	return FALSE; + +    if (!dixRegisterPrivateKey(&damagePixPrivateKeyRec, PRIVATE_PIXMAP, 0)) +	return FALSE; + +    if (!dixRegisterPrivateKey(&damageWinPrivateKeyRec, PRIVATE_WINDOW, 0)) +	return FALSE; + +    pScrPriv = malloc(sizeof (DamageScrPrivRec)); +    if (!pScrPriv) +	return FALSE; + +    pScrPriv->internalLevel = 0; +    pScrPriv->pScreenDamage = 0; + +    wrap (pScrPriv, pScreen, DestroyPixmap, damageDestroyPixmap); +    wrap (pScrPriv, pScreen, CreateGC, damageCreateGC); +    wrap (pScrPriv, pScreen, DestroyWindow, damageDestroyWindow); +    wrap (pScrPriv, pScreen, SetWindowPixmap, damageSetWindowPixmap); +    wrap (pScrPriv, pScreen, CopyWindow, damageCopyWindow); +    wrap (pScrPriv, pScreen, CloseScreen, damageCloseScreen); +    if (ps) { +	wrap (pScrPriv, ps, Glyphs, damageGlyphs); +	wrap (pScrPriv, ps, Composite, damageComposite); +	wrap (pScrPriv, ps, AddTraps, damageAddTraps); +    } + +    pScrPriv->funcs = miFuncs; + +    dixSetPrivate(&pScreen->devPrivates, damageScrPrivateKey, pScrPriv); +    return TRUE; +} + +DamagePtr +DamageCreate (DamageReportFunc  damageReport, +	      DamageDestroyFunc	damageDestroy, +	      DamageReportLevel	damageLevel, +	      Bool		isInternal, +	      ScreenPtr		pScreen, +	      void		*closure) +{ +    damageScrPriv(pScreen); +    DamagePtr	pDamage; + +    pDamage = dixAllocateObjectWithPrivates(DamageRec, PRIVATE_DAMAGE); +    if (!pDamage) +	return 0; +    pDamage->pNext = 0; +    pDamage->pNextWin = 0; +    RegionNull(&pDamage->damage); +    RegionNull(&pDamage->pendingDamage); +     +    pDamage->damageLevel = damageLevel; +    pDamage->isInternal = isInternal; +    pDamage->closure = closure; +    pDamage->isWindow = FALSE; +    pDamage->pDrawable = 0; +    pDamage->reportAfter = FALSE; + +    pDamage->damageReport = damageReport; +    pDamage->damageReportPostRendering = NULL; +    pDamage->damageDestroy = damageDestroy; +    pDamage->damageMarker = NULL; +    pDamage->pScreen = pScreen; + +    (*pScrPriv->funcs.Create) (pDamage); + +    return pDamage; +} + +void +DamageRegister (DrawablePtr pDrawable, +		DamagePtr   pDamage) +{ +    ScreenPtr pScreen = pDrawable->pScreen; +    damageScrPriv(pScreen); + +#if DAMAGE_VALIDATE_ENABLE +    if (pDrawable->pScreen != pDamage->pScreen) +    { +	ErrorF ("DamageRegister called with mismatched screens\n"); +	OsAbort (); +    } +#endif + +    if (pDrawable->type == DRAWABLE_WINDOW) +    { +	WindowPtr   pWindow = (WindowPtr) pDrawable; +	winDamageRef(pWindow); + +#if DAMAGE_VALIDATE_ENABLE +	DamagePtr   pOld; +	 +	for (pOld = *pPrev; pOld; pOld = pOld->pNextWin) +	    if (pOld == pDamage) { +		ErrorF ("Damage already on window list\n"); +		OsAbort (); +	    } +#endif +	pDamage->pNextWin = *pPrev; +	*pPrev = pDamage; +	pDamage->isWindow = TRUE; +    } +    else +	pDamage->isWindow = FALSE; +    pDamage->pDrawable = pDrawable; +    damageInsertDamage (getDrawableDamageRef (pDrawable), pDamage); +    (*pScrPriv->funcs.Register) (pDrawable, pDamage); +} + +void +DamageDrawInternal (ScreenPtr pScreen, Bool enable) +{ +    damageScrPriv (pScreen); + +    pScrPriv->internalLevel += enable ? 1 : -1; +} + +void +DamageUnregister (DrawablePtr	    pDrawable, +		  DamagePtr	    pDamage) +{ +    ScreenPtr pScreen = pDrawable->pScreen; +    damageScrPriv(pScreen); + +    (*pScrPriv->funcs.Unregister) (pDrawable, pDamage); + +    if (pDrawable->type == DRAWABLE_WINDOW) +    { +	WindowPtr   pWindow = (WindowPtr) pDrawable; +	winDamageRef (pWindow); +#if DAMAGE_VALIDATE_ENABLE +	int	found = 0; +#endif + +	while (*pPrev) +	{ +	    if (*pPrev == pDamage) +	    { +		*pPrev = pDamage->pNextWin; +#if DAMAGE_VALIDATE_ENABLE +		found = 1; +#endif +		break; +	    } +	    pPrev = &(*pPrev)->pNextWin; +	} +#if DAMAGE_VALIDATE_ENABLE +	if (!found) { +	    ErrorF ("Damage not on window list\n"); +	    OsAbort (); +	} +#endif +    } +    pDamage->pDrawable = 0; +    damageRemoveDamage (getDrawableDamageRef (pDrawable), pDamage); +} + +void +DamageDestroy (DamagePtr    pDamage) +{ +    ScreenPtr pScreen = pDamage->pScreen; +    damageScrPriv(pScreen); + +    if (pDamage->damageDestroy) +	(*pDamage->damageDestroy) (pDamage, pDamage->closure); +    (*pScrPriv->funcs.Destroy) (pDamage); +    RegionUninit(&pDamage->damage); +    RegionUninit(&pDamage->pendingDamage); +    dixFreeObjectWithPrivates(pDamage, PRIVATE_DAMAGE); +} + +Bool +DamageSubtract (DamagePtr	    pDamage, +		const RegionPtr	    pRegion) +{ +    RegionPtr	pClip; +    RegionRec	pixmapClip; +    DrawablePtr	pDrawable = pDamage->pDrawable; +     +    RegionSubtract(&pDamage->damage, &pDamage->damage, pRegion); +    if (pDrawable) +    { +	if (pDrawable->type == DRAWABLE_WINDOW) +	    pClip = &((WindowPtr) pDrawable)->borderClip; +	else +	{ +	    BoxRec  box; + +	    box.x1 = pDrawable->x; +	    box.y1 = pDrawable->y; +	    box.x2 = pDrawable->x + pDrawable->width; +	    box.y2 = pDrawable->y + pDrawable->height; +	    RegionInit(&pixmapClip, &box, 1); +	    pClip = &pixmapClip; +	} +	RegionTranslate(&pDamage->damage, pDrawable->x, pDrawable->y); +	RegionIntersect(&pDamage->damage, &pDamage->damage, pClip); +	RegionTranslate(&pDamage->damage, -pDrawable->x, -pDrawable->y); +	if (pDrawable->type != DRAWABLE_WINDOW) +	    RegionUninit(&pixmapClip); +    } +    return RegionNotEmpty(&pDamage->damage); +} + +void +DamageEmpty (DamagePtr	    pDamage) +{ +    RegionEmpty(&pDamage->damage); +} + +RegionPtr +DamageRegion (DamagePtr		    pDamage) +{ +    return &pDamage->damage; +} + +RegionPtr +DamagePendingRegion (DamagePtr	    pDamage) +{ +    return &pDamage->pendingDamage; +} + +void +DamageRegionAppend (DrawablePtr pDrawable, RegionPtr pRegion) +{ +    damageRegionAppend (pDrawable, pRegion, FALSE, -1); +} + +void +DamageRegionProcessPending (DrawablePtr pDrawable) +{ +    damageRegionProcessPending (pDrawable); +} + +/* If a damage marker is provided, then this function must be called after rendering is done. */ +/* Please do call back so any future enhancements can assume this function is called. */ +/* There are no strict timing requirements for calling this function, just as soon as (is cheaply) possible. */ +void +DamageRegionRendered (DrawablePtr pDrawable, DamagePtr pDamage, RegionPtr pOldDamage, RegionPtr pRegion) +{ +    if (pDamage->damageReportPostRendering) +	damageReportDamagePostRendering (pDamage, pOldDamage, pRegion); +} + +/* This call is very odd, i'm leaving it intact for API sake, but please don't use it. */ +void +DamageDamageRegion (DrawablePtr	pDrawable, +		    RegionPtr	pRegion) +{ +    damageRegionAppend (pDrawable, pRegion, FALSE, -1); + +    /* Go back and report this damage for DamagePtrs with reportAfter set, since +     * this call isn't part of an in-progress drawing op in the call chain and +     * the DDX probably just wants to know about it right away. +     */ +    damageRegionProcessPending (pDrawable); +} + +void +DamageSetReportAfterOp (DamagePtr pDamage, Bool reportAfter) +{ +    pDamage->reportAfter = reportAfter; +} + +void +DamageSetPostRenderingFunctions(DamagePtr pDamage, DamageReportFunc damageReportPostRendering, +				DamageMarkerFunc damageMarker) +{ +    pDamage->damageReportPostRendering = damageReportPostRendering; +    pDamage->damageMarker = damageMarker; +} + +DamageScreenFuncsPtr +DamageGetScreenFuncs (ScreenPtr pScreen) +{ +    damageScrPriv(pScreen); +    return &pScrPriv->funcs; +} diff --git a/miext/damage/damage.h b/miext/damage/damage.h new file mode 100644 index 0000000..067016f --- /dev/null +++ b/miext/damage/damage.h @@ -0,0 +1,128 @@ +/* + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission.  Keith Packard makes no + * representations about the suitability of this software for any purpose.  It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_DIX_CONFIG_H +#include <dix-config.h> +#endif + +#ifndef _DAMAGE_H_ +#define _DAMAGE_H_ + +typedef struct _damage	*DamagePtr; + +typedef enum _damageReportLevel { +    DamageReportRawRegion, +    DamageReportDeltaRegion, +    DamageReportBoundingBox, +    DamageReportNonEmpty, +    DamageReportNone +} DamageReportLevel; + +typedef void (*DamageReportFunc) (DamagePtr pDamage, RegionPtr pRegion, void *closure); +typedef void (*DamageDestroyFunc) (DamagePtr pDamage, void *closure); +/* It's the responsibility of the driver to duplicate both regions. */ +/* At some point DamageRegionRendered() must be called. */ +typedef void (*DamageMarkerFunc) (DrawablePtr pDrawable, DamagePtr pDamage, RegionPtr pOldDamage, RegionPtr pRegion, void *closure); + +typedef void (*DamageScreenCreateFunc) (DamagePtr); +typedef void (*DamageScreenRegisterFunc) (DrawablePtr, DamagePtr); +typedef void (*DamageScreenUnregisterFunc) (DrawablePtr, DamagePtr); +typedef void (*DamageScreenDestroyFunc) (DamagePtr); + +typedef struct _damageScreenFuncs { +    DamageScreenCreateFunc      Create; +    DamageScreenRegisterFunc    Register; +    DamageScreenUnregisterFunc  Unregister; +    DamageScreenDestroyFunc     Destroy; +} DamageScreenFuncsRec, *DamageScreenFuncsPtr; + +extern _X_EXPORT void miDamageCreate (DamagePtr); +extern _X_EXPORT void miDamageRegister (DrawablePtr, DamagePtr); +extern _X_EXPORT void miDamageUnregister (DrawablePtr, DamagePtr); +extern _X_EXPORT void miDamageDestroy (DamagePtr); + +extern _X_EXPORT Bool +DamageSetup (ScreenPtr pScreen); +     +extern _X_EXPORT DamagePtr +DamageCreate (DamageReportFunc  damageReport, +	      DamageDestroyFunc	damageDestroy, +	      DamageReportLevel damageLevel, +	      Bool		isInternal, +	      ScreenPtr		pScreen, +	      void *		closure); + +extern _X_EXPORT void +DamageDrawInternal (ScreenPtr pScreen, Bool enable); + +extern _X_EXPORT void +DamageRegister (DrawablePtr	pDrawable, +		DamagePtr	pDamage); + +extern _X_EXPORT void +DamageUnregister (DrawablePtr	pDrawable, +		  DamagePtr	pDamage); + +extern _X_EXPORT void +DamageDestroy (DamagePtr pDamage); + +extern _X_EXPORT Bool +DamageSubtract (DamagePtr	    pDamage, +		const RegionPtr	    pRegion); + +extern _X_EXPORT void +DamageEmpty (DamagePtr pDamage); + +extern _X_EXPORT RegionPtr +DamageRegion (DamagePtr		    pDamage); + +extern _X_EXPORT RegionPtr +DamagePendingRegion (DamagePtr	    pDamage); + +/* In case of rendering, call this before the submitting the commands. */ +extern _X_EXPORT void +DamageRegionAppend (DrawablePtr pDrawable, RegionPtr pRegion); + +/* Call this directly after the rendering operation has been submitted. */ +extern _X_EXPORT void +DamageRegionProcessPending (DrawablePtr pDrawable); + +/* Call this some time after rendering is done, only relevant when a damageMarker is provided. */ +extern _X_EXPORT void +DamageRegionRendered (DrawablePtr pDrawable, DamagePtr pDamage, RegionPtr pOldDamage, RegionPtr pRegion); + +/* Avoid using this call, it only exists for API compatibility. */ +extern _X_EXPORT void +DamageDamageRegion (DrawablePtr	    pDrawable, +		    const RegionPtr pRegion); + +extern _X_EXPORT void +DamageSetReportAfterOp (DamagePtr pDamage, Bool reportAfter); + +extern _X_EXPORT void +DamageSetPostRenderingFunctions(DamagePtr pDamage, DamageReportFunc damageReportPostRendering, +				DamageMarkerFunc damageMarker); + +extern _X_EXPORT DamageScreenFuncsPtr +DamageGetScreenFuncs (ScreenPtr); + +#endif /* _DAMAGE_H_ */ diff --git a/miext/damage/damagestr.h b/miext/damage/damagestr.h new file mode 100644 index 0000000..b224958 --- /dev/null +++ b/miext/damage/damagestr.h @@ -0,0 +1,114 @@ +/* + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission.  Keith Packard makes no + * representations about the suitability of this software for any purpose.  It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_DIX_CONFIG_H +#include <dix-config.h> +#endif + +#ifndef _DAMAGESTR_H_ +#define _DAMAGESTR_H_ + +#include "damage.h" +#include "gcstruct.h" +#include "privates.h" +# include "picturestr.h" + +typedef struct _damage { +    DamagePtr		pNext; +    DamagePtr		pNextWin; +    RegionRec		damage; +     +    DamageReportLevel	damageLevel; +    Bool		isInternal; +    void		*closure; +    Bool		isWindow; +    DrawablePtr		pDrawable; +     +    DamageReportFunc	damageReport; +    DamageReportFunc	damageReportPostRendering; +    DamageDestroyFunc	damageDestroy; +    DamageMarkerFunc	damageMarker; + +    Bool		reportAfter; +    RegionRec		pendingDamage; /* will be flushed post submission at the latest */ +    RegionRec		backupDamage; /* for use with damageMarker */ +    ScreenPtr		pScreen; +    PrivateRec		*devPrivates; +} DamageRec; + +typedef struct _damageScrPriv { +    int				internalLevel; + +    /* +     * For DDXen which don't provide GetScreenPixmap, this provides +     * a place to hook damage for windows on the screen +     */ +    DamagePtr			pScreenDamage; + +    CopyWindowProcPtr		CopyWindow; +    CloseScreenProcPtr		CloseScreen; +    CreateGCProcPtr		CreateGC; +    DestroyPixmapProcPtr	DestroyPixmap; +    SetWindowPixmapProcPtr	SetWindowPixmap; +    DestroyWindowProcPtr	DestroyWindow; +    CompositeProcPtr		Composite; +    GlyphsProcPtr		Glyphs; +    AddTrapsProcPtr		AddTraps; + +    /* Table of wrappable function pointers */ +    DamageScreenFuncsRec	funcs; +} DamageScrPrivRec, *DamageScrPrivPtr; + +typedef struct _damageGCPriv { +    GCOps   *ops; +    GCFuncs *funcs; +} DamageGCPrivRec, *DamageGCPrivPtr; + +/* XXX should move these into damage.c, damageScrPrivateIndex is static */ +#define damageGetScrPriv(pScr) ((DamageScrPrivPtr) \ +    dixLookupPrivate(&(pScr)->devPrivates, damageScrPrivateKey)) + +#define damageScrPriv(pScr) \ +    DamageScrPrivPtr    pScrPriv = damageGetScrPriv(pScr) + +#define damageGetPixPriv(pPix) \ +    dixLookupPrivate(&(pPix)->devPrivates, damagePixPrivateKey) + +#define damgeSetPixPriv(pPix,v) \ +    dixSetPrivate(&(pPix)->devPrivates, damagePixPrivateKey, v) + +#define damagePixPriv(pPix) \ +    DamagePtr	    pDamage = damageGetPixPriv(pPix) + +#define damageGetGCPriv(pGC) \ +    dixLookupPrivate(&(pGC)->devPrivates, damageGCPrivateKey) + +#define damageGCPriv(pGC) \ +    DamageGCPrivPtr  pGCPriv = damageGetGCPriv(pGC) + +#define damageGetWinPriv(pWin) \ +    ((DamagePtr)dixLookupPrivate(&(pWin)->devPrivates, damageWinPrivateKey)) + +#define damageSetWinPriv(pWin,d) \ +    dixSetPrivate(&(pWin)->devPrivates, damageWinPrivateKey, d) + +#endif /* _DAMAGESTR_H_ */ | 
