diff options
Diffstat (limited to 'miext/cw')
| -rw-r--r-- | miext/cw/Makefile.am | 11 | ||||
| -rw-r--r-- | miext/cw/Makefile.in | 706 | ||||
| -rw-r--r-- | miext/cw/cw.c | 527 | ||||
| -rw-r--r-- | miext/cw/cw.h | 171 | ||||
| -rw-r--r-- | miext/cw/cw_ops.c | 478 | ||||
| -rw-r--r-- | miext/cw/cw_render.c | 469 | 
6 files changed, 2362 insertions, 0 deletions
| diff --git a/miext/cw/Makefile.am b/miext/cw/Makefile.am new file mode 100644 index 0000000..e056f42 --- /dev/null +++ b/miext/cw/Makefile.am @@ -0,0 +1,11 @@ +noinst_LTLIBRARIES = libcw.la + +AM_CFLAGS = $(DIX_CFLAGS) + +INCLUDES = -I$(top_srcdir)/hw/xfree86/os-support + +libcw_la_SOURCES = 	\ +	cw.c		\ +	cw_ops.c	\ +	cw_render.c     \ +        cw.h diff --git a/miext/cw/Makefile.in b/miext/cw/Makefile.in new file mode 100644 index 0000000..14b13ef --- /dev/null +++ b/miext/cw/Makefile.in @@ -0,0 +1,706 @@ +# 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/cw +DIST_COMMON = $(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) +libcw_la_LIBADD = +am_libcw_la_OBJECTS = cw.lo cw_ops.lo cw_render.lo +libcw_la_OBJECTS = $(am_libcw_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 = $(libcw_la_SOURCES) +DIST_SOURCES = $(libcw_la_SOURCES) +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 = libcw.la +AM_CFLAGS = $(DIX_CFLAGS) +INCLUDES = -I$(top_srcdir)/hw/xfree86/os-support +libcw_la_SOURCES = \ +	cw.c		\ +	cw_ops.c	\ +	cw_render.c     \ +        cw.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/cw/Makefile'; \ +	$(am__cd) $(top_srcdir) && \ +	  $(AUTOMAKE) --foreign miext/cw/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 +libcw.la: $(libcw_la_OBJECTS) $(libcw_la_DEPENDENCIES)  +	$(AM_V_CCLD)$(LINK)  $(libcw_la_OBJECTS) $(libcw_la_LIBADD) $(LIBS) + +mostlyclean-compile: +	-rm -f *.$(OBJEXT) + +distclean-compile: +	-rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cw.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cw_ops.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cw_render.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 + +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) +installdirs: +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-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: + +.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-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 + + +# 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/cw/cw.c b/miext/cw/cw.c new file mode 100644 index 0000000..3da3bc3 --- /dev/null +++ b/miext/cw/cw.c @@ -0,0 +1,527 @@ +/* + * Copyright © 2004 Eric Anholt + * + * 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 Eric Anholt not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission.  Eric Anholt makes no + * representations about the suitability of this software for any purpose.  It + * is provided "as is" without express or implied warranty. + * + * ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL ERIC ANHOLT 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 <string.h> + +#include "gcstruct.h" +#include "windowstr.h" +#include "cw.h" + +#define CW_DEBUG 1 + +#if CW_DEBUG +#define CW_ASSERT(x) do {						\ +    if (!(x)) {								\ +	ErrorF("composite wrapper: assertion failed at %s:%d\n", __FUNC__, \ +	    __LINE__);							\ +    }									\ +} while (0) +#else +#define CW_ASSERT(x) do {} while (0) +#endif + +DevPrivateKeyRec cwGCKeyRec; +DevPrivateKeyRec cwScreenKeyRec; +DevPrivateKeyRec cwWindowKeyRec; +DevPrivateKeyRec cwPictureKeyRec; + +extern GCOps cwGCOps; + +static Bool +cwCloseScreen (int i, ScreenPtr pScreen); + +static void +cwValidateGC(GCPtr pGC, unsigned long stateChanges, DrawablePtr pDrawable); +static void +cwChangeGC(GCPtr pGC, unsigned long mask); +static void +cwCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst); +static void +cwDestroyGC(GCPtr pGC); +static void +cwChangeClip(GCPtr pGC, int type, pointer pvalue, int nrects); +static void +cwCopyClip(GCPtr pgcDst, GCPtr pgcSrc); +static void +cwDestroyClip(GCPtr pGC); + +GCFuncs cwGCFuncs = { +    cwValidateGC, +    cwChangeGC, +    cwCopyGC, +    cwDestroyGC, +    cwChangeClip, +    cwDestroyClip, +    cwCopyClip, +}; + +/* Find the real drawable to draw to, and provide offsets that will translate + * window coordinates to backing pixmap coordinates. + */ +DrawablePtr +cwGetBackingDrawable(DrawablePtr pDrawable, int *x_off, int *y_off) +{ +    PixmapPtr	pPixmap; +     +    if (pDrawable->type == DRAWABLE_WINDOW &&  +	(pPixmap = getCwPixmap ((WindowPtr) pDrawable))) +    { +	*x_off = pDrawable->x - pPixmap->screen_x; +	*y_off = pDrawable->y - pPixmap->screen_y; +	return &pPixmap->drawable; +    } else { +	*x_off = *y_off = 0; +	return pDrawable; +    } +} + +#define FUNC_PROLOGUE(pGC, pPriv) do {					\ +    (pGC)->funcs = (pPriv)->wrapFuncs;					\ +    (pGC)->ops = (pPriv)->wrapOps;					\ +} while (0) + +#define FUNC_EPILOGUE(pGC, pPriv) do {					\ +    (pPriv)->wrapFuncs = (pGC)->funcs;					\ +    (pPriv)->wrapOps = (pGC)->ops;					\ +    (pGC)->funcs = &cwGCFuncs;						\ +    (pGC)->ops = &cwGCOps;						\ +} while (0) + + +static Bool +cwCreateBackingGC(GCPtr pGC, DrawablePtr pDrawable) +{ +    cwGCRec *pPriv = getCwGC(pGC); +    int status, x_off, y_off; +    XID noexpose = xFalse; +    DrawablePtr pBackingDrawable; + +    pBackingDrawable = cwGetBackingDrawable(pDrawable, &x_off, &y_off); +    pPriv->pBackingGC = CreateGC(pBackingDrawable, GCGraphicsExposures, +				 &noexpose, &status, (XID)0, serverClient); +    if (status != Success) +	return FALSE; + +    pPriv->serialNumber = 0; +    pPriv->stateChanges = GCAllBits; + +    return TRUE; +} + +static void +cwDestroyBackingGC(GCPtr pGC) +{ +    cwGCPtr pPriv; + +    pPriv = (cwGCPtr) getCwGC (pGC); + +    if (pPriv->pBackingGC) { +	FreeGC(pPriv->pBackingGC, (XID)0); +	pPriv->pBackingGC = NULL; +    } +} + +static void +cwValidateGC(GCPtr pGC, unsigned long stateChanges, DrawablePtr pDrawable) +{ +    GCPtr   	  	pBackingGC; +    cwGCPtr		pPriv; +    DrawablePtr		pBackingDrawable; +    int			x_off, y_off; + +    pPriv = (cwGCPtr) getCwGC (pGC); + +    FUNC_PROLOGUE(pGC, pPriv); + +    /* +     * Must call ValidateGC to ensure pGC->pCompositeClip is valid +     */ +    (*pGC->funcs->ValidateGC)(pGC, stateChanges, pDrawable); + +    if (!cwDrawableIsRedirWindow(pDrawable)) { +	cwDestroyBackingGC(pGC); +	FUNC_EPILOGUE(pGC, pPriv); +	return; +    } else { +	if (!pPriv->pBackingGC && !cwCreateBackingGC(pGC, pDrawable)) { +	    FUNC_EPILOGUE(pGC, pPriv); +	    return; +	} +    } + +    pBackingGC = pPriv->pBackingGC; +    pBackingDrawable = cwGetBackingDrawable(pDrawable, &x_off, &y_off); + +    pPriv->stateChanges |= stateChanges; + +    /* +     * Copy the composite clip into the backing GC if either +     * the drawable clip list has changed or the client has changed +     * the client clip data +     */ +    if (pDrawable->serialNumber != pPriv->serialNumber || +	(pPriv->stateChanges & (GCClipXOrigin|GCClipYOrigin|GCClipMask))) +    { +	ChangeGCVal vals[2]; +	RegionPtr   pCompositeClip; + +	pCompositeClip = RegionCreate(NULL, 0); +	RegionCopy(pCompositeClip, pGC->pCompositeClip); + +	/* Either the drawable has changed, or the clip list in the drawable has +	 * changed.  Copy the new clip list over and set the new translated +	 * offset for it. +	 */ +	 +	(*pBackingGC->funcs->ChangeClip) (pBackingGC, CT_REGION, +					  (pointer) pCompositeClip, 0); +	 +	vals[0].val = x_off - pDrawable->x; +	vals[1].val = y_off - pDrawable->y; +	ChangeGC(NullClient, pBackingGC, +		    (GCClipXOrigin | GCClipYOrigin), vals); + +	pPriv->serialNumber = pDrawable->serialNumber; +	/* +	 * Mask off any client clip changes to make sure +	 * the clip list set above remains in effect +	 */ +	pPriv->stateChanges &= ~(GCClipXOrigin|GCClipYOrigin|GCClipMask); +    } + +    if (pPriv->stateChanges) { +	CopyGC(pGC, pBackingGC, pPriv->stateChanges); +	pPriv->stateChanges = 0; +    } + +    if ((pGC->patOrg.x + x_off) != pBackingGC->patOrg.x || +	(pGC->patOrg.y + y_off) != pBackingGC->patOrg.y) +    { +	ChangeGCVal vals[2]; +	vals[0].val = pGC->patOrg.x + x_off; +	vals[1].val = pGC->patOrg.y + y_off; +	ChangeGC(NullClient, pBackingGC, +		    (GCTileStipXOrigin | GCTileStipYOrigin), vals); +    } + +    ValidateGC(pBackingDrawable, pBackingGC); + +    FUNC_EPILOGUE(pGC, pPriv); +} + +static void +cwChangeGC(GCPtr pGC, unsigned long mask) +{ +    cwGCPtr pPriv = (cwGCPtr)dixLookupPrivate(&pGC->devPrivates, cwGCKey); + +    FUNC_PROLOGUE(pGC, pPriv); + +    (*pGC->funcs->ChangeGC) (pGC, mask); + +    FUNC_EPILOGUE(pGC, pPriv); +} + +static void +cwCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst) +{ +    cwGCPtr pPriv = (cwGCPtr)dixLookupPrivate(&pGCDst->devPrivates, cwGCKey); + +    FUNC_PROLOGUE(pGCDst, pPriv); + +    (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst); + +    FUNC_EPILOGUE(pGCDst, pPriv); +} + +static void +cwDestroyGC(GCPtr pGC) +{ +    cwGCPtr pPriv = (cwGCPtr)dixLookupPrivate(&pGC->devPrivates, cwGCKey); + +    FUNC_PROLOGUE(pGC, pPriv); + +    cwDestroyBackingGC(pGC); + +    (*pGC->funcs->DestroyGC) (pGC); + +    /* leave it unwrapped */ +} + +static void +cwChangeClip(GCPtr pGC, int type, pointer pvalue, int nrects) +{ +    cwGCPtr pPriv = (cwGCPtr)dixLookupPrivate(&pGC->devPrivates, cwGCKey); + +    FUNC_PROLOGUE(pGC, pPriv); + +    (*pGC->funcs->ChangeClip)(pGC, type, pvalue, nrects); + +    FUNC_EPILOGUE(pGC, pPriv); +} + +static void +cwCopyClip(GCPtr pgcDst, GCPtr pgcSrc) +{ +    cwGCPtr pPriv = (cwGCPtr)dixLookupPrivate(&pgcDst->devPrivates, cwGCKey); + +    FUNC_PROLOGUE(pgcDst, pPriv); + +    (*pgcDst->funcs->CopyClip)(pgcDst, pgcSrc); + +    FUNC_EPILOGUE(pgcDst, pPriv); +} + +static void +cwDestroyClip(GCPtr pGC) +{ +    cwGCPtr pPriv = (cwGCPtr)dixLookupPrivate(&pGC->devPrivates, cwGCKey); + +    FUNC_PROLOGUE(pGC, pPriv); + +    (*pGC->funcs->DestroyClip)(pGC); + +    FUNC_EPILOGUE(pGC, pPriv); +} + +/* + * Screen wrappers. + */ + +#define SCREEN_PROLOGUE(pScreen, field)				\ +  ((pScreen)->field = getCwScreen(pScreen)->field) + +#define SCREEN_EPILOGUE(pScreen, field, wrapper) do {		\ +    getCwScreen(pScreen)->field = (pScreen)->field;		\ +    (pScreen)->field = (wrapper);				\ +} while (0) + +static Bool +cwCreateGC(GCPtr pGC) +{ +    cwGCPtr	pPriv = getCwGC(pGC); +    ScreenPtr	pScreen = pGC->pScreen; +    Bool	ret; + +    SCREEN_PROLOGUE(pScreen, CreateGC); + +    if ( (ret = (*pScreen->CreateGC)(pGC)) ) +	FUNC_EPILOGUE(pGC, pPriv); + +    SCREEN_EPILOGUE(pScreen, CreateGC, cwCreateGC); + +    return ret; +} + +static void +cwGetImage(DrawablePtr pSrc, int x, int y, int w, int h, unsigned int format, +	   unsigned long planemask, char *pdstLine) +{ +    ScreenPtr pScreen = pSrc->pScreen; +    DrawablePtr pBackingDrawable; +    int src_off_x, src_off_y; +     +    SCREEN_PROLOGUE(pScreen, GetImage); + +    pBackingDrawable = cwGetBackingDrawable(pSrc, &src_off_x, &src_off_y); + +    CW_OFFSET_XY_SRC(x, y); + +    (*pScreen->GetImage)(pBackingDrawable, x, y, w, h, format, planemask, +			 pdstLine); + +    SCREEN_EPILOGUE(pScreen, GetImage, cwGetImage); +} + +static void +cwGetSpans(DrawablePtr pSrc, int wMax, DDXPointPtr ppt, int *pwidth, +	   int nspans, char *pdstStart) +{ +    ScreenPtr pScreen = pSrc->pScreen; +    DrawablePtr pBackingDrawable; +    int i; +    int src_off_x, src_off_y; +     +    SCREEN_PROLOGUE(pScreen, GetSpans); + +    pBackingDrawable = cwGetBackingDrawable(pSrc, &src_off_x, &src_off_y); + +    for (i = 0; i < nspans; i++) +	CW_OFFSET_XY_SRC(ppt[i].x, ppt[i].y); + +    (*pScreen->GetSpans)(pBackingDrawable, wMax, ppt, pwidth, nspans, +			 pdstStart); + +    SCREEN_EPILOGUE(pScreen, GetSpans, cwGetSpans); +} + + +static void +cwCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc) +{ +    ScreenPtr pScreen = pWin->drawable.pScreen; + +    SCREEN_PROLOGUE(pScreen, CopyWindow); + +    if (!cwDrawableIsRedirWindow((DrawablePtr)pWin)) { +	(*pScreen->CopyWindow)(pWin, ptOldOrg, prgnSrc); +    } else { +	GCPtr	    pGC; +	BoxPtr	    pExtents; +	int	    x_off, y_off; +	int	    dx, dy; +	PixmapPtr   pBackingPixmap; +	RegionPtr   pClip; +	int	    src_x, src_y, dst_x, dst_y, w, h; + +	dx = ptOldOrg.x - pWin->drawable.x; +	dy = ptOldOrg.y - pWin->drawable.y; + +	pExtents = RegionExtents(prgnSrc); + +	pBackingPixmap = (PixmapPtr) cwGetBackingDrawable((DrawablePtr)pWin, +							  &x_off, &y_off); + +	src_x = pExtents->x1 - pBackingPixmap->screen_x; +	src_y = pExtents->y1 - pBackingPixmap->screen_y; +	w = pExtents->x2 - pExtents->x1; +	h = pExtents->y2 - pExtents->y1; +	dst_x = src_x - dx; +	dst_y = src_y - dy; +			        +	/* Translate region (as required by API) */ +	RegionTranslate(prgnSrc, -dx, -dy); +	 +	pGC = GetScratchGC(pBackingPixmap->drawable.depth, pScreen); +	/* +	 * Copy region to GC as clip, aligning as dest clip +	 */ +	pClip = RegionCreate(NULL, 0); +	RegionIntersect(pClip, &pWin->borderClip, prgnSrc); +	RegionTranslate(pClip, +			 -pBackingPixmap->screen_x, +			 -pBackingPixmap->screen_y); +	 +	(*pGC->funcs->ChangeClip) (pGC, CT_REGION, pClip, 0); + +	ValidateGC(&pBackingPixmap->drawable, pGC); + +	(*pGC->ops->CopyArea) (&pBackingPixmap->drawable, +			       &pBackingPixmap->drawable, pGC, +			       src_x, src_y, w, h, dst_x, dst_y); + +	(*pGC->funcs->DestroyClip) (pGC); + +	FreeScratchGC(pGC); +    } +	 +    SCREEN_EPILOGUE(pScreen, CopyWindow, cwCopyWindow); +} + +static PixmapPtr +cwGetWindowPixmap (WindowPtr pWin) +{ +    PixmapPtr	pPixmap = getCwPixmap (pWin); + +    if (!pPixmap) +    { +	ScreenPtr   pScreen = pWin->drawable.pScreen; +	SCREEN_PROLOGUE(pScreen, GetWindowPixmap); +	if (pScreen->GetWindowPixmap) +	    pPixmap = (*pScreen->GetWindowPixmap) (pWin); +	SCREEN_EPILOGUE(pScreen, GetWindowPixmap, cwGetWindowPixmap); +    } +    return pPixmap; +} + +static void +cwSetWindowPixmap (WindowPtr pWindow, PixmapPtr pPixmap) +{ +    ScreenPtr	pScreen = pWindow->drawable.pScreen; +     +    if (pPixmap == (*pScreen->GetScreenPixmap) (pScreen)) +	pPixmap = NULL; +    setCwPixmap (pWindow, pPixmap); +} + +/* Screen initialization/teardown */ +void +miInitializeCompositeWrapper(ScreenPtr pScreen) +{ +    cwScreenPtr pScreenPriv; +    Bool has_render = GetPictureScreenIfSet(pScreen) != NULL; + +    if (!dixRegisterPrivateKey(&cwScreenKeyRec, PRIVATE_SCREEN, 0)) +	return; + +    if (!dixRegisterPrivateKey(&cwGCKeyRec, PRIVATE_GC, sizeof(cwGCRec))) +	return; + +    if (!dixRegisterPrivateKey(&cwWindowKeyRec, PRIVATE_WINDOW, 0)) +	return; + +    if (!dixRegisterPrivateKey(&cwPictureKeyRec, PRIVATE_PICTURE, 0)) +	return; + +    pScreenPriv = malloc(sizeof(cwScreenRec)); +    if (!pScreenPriv) +	return; + +    dixSetPrivate(&pScreen->devPrivates, cwScreenKey, pScreenPriv); +     +    SCREEN_EPILOGUE(pScreen, CloseScreen, cwCloseScreen); +    SCREEN_EPILOGUE(pScreen, GetImage, cwGetImage); +    SCREEN_EPILOGUE(pScreen, GetSpans, cwGetSpans); +    SCREEN_EPILOGUE(pScreen, CreateGC, cwCreateGC); +    SCREEN_EPILOGUE(pScreen, CopyWindow, cwCopyWindow); + +    SCREEN_EPILOGUE(pScreen, SetWindowPixmap, cwSetWindowPixmap); +    SCREEN_EPILOGUE(pScreen, GetWindowPixmap, cwGetWindowPixmap); + +    if (has_render) +	cwInitializeRender(pScreen); +} + +static Bool +cwCloseScreen (int i, ScreenPtr pScreen) +{ +    cwScreenPtr   pScreenPriv; +    PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); + +    pScreenPriv = (cwScreenPtr)dixLookupPrivate(&pScreen->devPrivates, +						cwScreenKey); +    pScreen->CloseScreen = pScreenPriv->CloseScreen; +    pScreen->GetImage = pScreenPriv->GetImage; +    pScreen->GetSpans = pScreenPriv->GetSpans; +    pScreen->CreateGC = pScreenPriv->CreateGC; +    pScreen->CopyWindow = pScreenPriv->CopyWindow; + +    if (ps) +	cwFiniRender(pScreen); + +    free((pointer)pScreenPriv); + +    return (*pScreen->CloseScreen)(i, pScreen); +} diff --git a/miext/cw/cw.h b/miext/cw/cw.h new file mode 100644 index 0000000..31eb9e5 --- /dev/null +++ b/miext/cw/cw.h @@ -0,0 +1,171 @@ +/* + * Copyright © 2004 Eric Anholt + * + * 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 Eric Anholt not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission.  Eric Anholt makes no + * representations about the suitability of this software for any purpose.  It + * is provided "as is" without express or implied warranty. + * + * ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL ERIC ANHOLT 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 "gcstruct.h" +#include "picturestr.h" +#include "privates.h" + +/* + * One of these structures is allocated per GC that gets used with a window with + * backing pixmap. + */ + +typedef struct { +    GCPtr	    pBackingGC;	    /* Copy of the GC but with graphicsExposures +				     * set FALSE and the clientClip set to +				     * clip output to the valid regions of the +				     * backing pixmap. */ +    unsigned long   serialNumber;   /* clientClip computed time */ +    unsigned long   stateChanges;   /* changes in parent gc since last copy */ +    GCOps	    *wrapOps;	    /* wrapped ops */ +    GCFuncs	    *wrapFuncs;	    /* wrapped funcs */ +} cwGCRec, *cwGCPtr; + +extern _X_EXPORT DevPrivateKeyRec cwGCKeyRec; +#define cwGCKey (&cwGCKeyRec) + +#define getCwGC(pGC) ((cwGCPtr)dixLookupPrivate(&(pGC)->devPrivates, cwGCKey)) +#define setCwGC(pGC,p) dixSetPrivate(&(pGC)->devPrivates, cwGCKey, p) + +/* + * One of these structures is allocated per Picture that gets used with a + * window with a backing pixmap + */ + +typedef struct { +    PicturePtr	    pBackingPicture; +    unsigned long   serialNumber; +    unsigned long   stateChanges; +} cwPictureRec, *cwPicturePtr; + +extern _X_EXPORT DevPrivateKeyRec cwPictureKeyRec; +#define cwPictureKey (&cwPictureKeyRec) + +#define getCwPicture(pPicture) (pPicture->pDrawable ? \ +    (cwPicturePtr)dixLookupPrivate(&(pPicture)->devPrivates, cwPictureKey) : 0) +#define setCwPicture(pPicture,p) dixSetPrivate(&(pPicture)->devPrivates, cwPictureKey, p) + +extern _X_EXPORT DevPrivateKeyRec cwWindowKeyRec; +#define cwWindowKey (&cwWindowKeyRec) + +#define cwWindowPrivate(pWin) dixLookupPrivate(&(pWin)->devPrivates, cwWindowKey) +#define getCwPixmap(pWindow)	    ((PixmapPtr) cwWindowPrivate(pWindow)) +#define setCwPixmap(pWindow,pPixmap) \ +    dixSetPrivate(&(pWindow)->devPrivates, cwWindowKey, pPixmap) + +#define cwDrawableIsRedirWindow(pDraw)					\ +	((pDraw)->type == DRAWABLE_WINDOW &&				\ +	 getCwPixmap((WindowPtr) (pDraw)) != NULL) + +typedef struct { +    /* +     * screen func wrappers +     */ +    CloseScreenProcPtr		CloseScreen; +    GetImageProcPtr		GetImage; +    GetSpansProcPtr		GetSpans; +    CreateGCProcPtr		CreateGC; + +    CopyWindowProcPtr		CopyWindow; + +    GetWindowPixmapProcPtr	GetWindowPixmap; +    SetWindowPixmapProcPtr	SetWindowPixmap; +     +    DestroyPictureProcPtr	DestroyPicture; +    ChangePictureClipProcPtr	ChangePictureClip; +    DestroyPictureClipProcPtr	DestroyPictureClip; +     +    ChangePictureProcPtr	ChangePicture; +    ValidatePictureProcPtr	ValidatePicture; + +    CompositeProcPtr		Composite; +    CompositeRectsProcPtr	CompositeRects; + +    TrapezoidsProcPtr		Trapezoids; +    TrianglesProcPtr		Triangles; +    TriStripProcPtr		TriStrip; +    TriFanProcPtr		TriFan; + +    RasterizeTrapezoidProcPtr	RasterizeTrapezoid; +} cwScreenRec, *cwScreenPtr; + +extern _X_EXPORT DevPrivateKeyRec cwScreenKeyRec; +#define cwScreenKey (&cwScreenKeyRec) + +#define getCwScreen(pScreen) ((cwScreenPtr)dixLookupPrivate(&(pScreen)->devPrivates, cwScreenKey)) +#define setCwScreen(pScreen,p) dixSetPrivate(&(pScreen)->devPrivates, cwScreenKey, p) + +#define CW_OFFSET_XYPOINTS(ppt, npt) do { \ +    DDXPointPtr _ppt = (DDXPointPtr)(ppt); \ +    int _i; \ +    for (_i = 0; _i < npt; _i++) { \ +	_ppt[_i].x += dst_off_x; \ +	_ppt[_i].y += dst_off_y; \ +    } \ +} while (0) + +#define CW_OFFSET_RECTS(prect, nrect) do { \ +    int _i; \ +    for (_i = 0; _i < nrect; _i++) { \ +	(prect)[_i].x += dst_off_x; \ +	(prect)[_i].y += dst_off_y; \ +    } \ +} while (0) + +#define CW_OFFSET_ARCS(parc, narc) do { \ +    int _i; \ +    for (_i = 0; _i < narc; _i++) { \ +	(parc)[_i].x += dst_off_x; \ +	(parc)[_i].y += dst_off_y; \ +    } \ +} while (0) + +#define CW_OFFSET_XY_DST(x, y) do { \ +    (x) = (x) + dst_off_x; \ +    (y) = (y) + dst_off_y; \ +} while (0) + +#define CW_OFFSET_XY_SRC(x, y) do { \ +    (x) = (x) + src_off_x; \ +    (y) = (y) + src_off_y; \ +} while (0) + +/* cw.c */ +extern _X_EXPORT DrawablePtr +cwGetBackingDrawable(DrawablePtr pDrawable, int *x_off, int *y_off); + +/* cw_render.c */ + +extern _X_EXPORT void +cwInitializeRender (ScreenPtr pScreen); + +extern _X_EXPORT void +cwFiniRender (ScreenPtr pScreen); + +/* cw.c */ + +extern _X_EXPORT void +miInitializeCompositeWrapper(ScreenPtr pScreen); diff --git a/miext/cw/cw_ops.c b/miext/cw/cw_ops.c new file mode 100644 index 0000000..9ae56cb --- /dev/null +++ b/miext/cw/cw_ops.c @@ -0,0 +1,478 @@ +/* + * Copyright © 2004 Eric Anholt + * + * 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 Eric Anholt not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission.  Eric Anholt makes no + * representations about the suitability of this software for any purpose.  It + * is provided "as is" without express or implied warranty. + * + * ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL ERIC ANHOLT 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 "gcstruct.h" +#include "pixmapstr.h" +#include "cw.h" +#include "mi.h" + +#define SETUP_BACKING_DST(_pDst, _pGC) \ +    cwGCPtr pGCPrivate = getCwGC (_pGC); \ +    int dst_off_x, dst_off_y; \ +    DrawablePtr pBackingDst = cwGetBackingDrawable(pDst, &dst_off_x, \ +	&dst_off_y); \ +    GCPtr pBackingGC = pGCPrivate->pBackingGC ? pGCPrivate->pBackingGC : _pGC + +#define SETUP_BACKING_SRC(pSrc, pGC) \ +    int src_off_x, src_off_y; \ +    DrawablePtr pBackingSrc = cwGetBackingDrawable(pSrc, &src_off_x, \ +	&src_off_y) + +#define PROLOGUE(pGC) do { \ +    if (pBackingGC->serialNumber != pBackingDst->serialNumber) { \ +	ValidateGC(pBackingDst, pBackingGC); \ +    } \ +    pGC->funcs = pGCPrivate->wrapFuncs;\ +    pGC->ops = pGCPrivate->wrapOps;\ +} while (0) + +#define EPILOGUE(pGC) do { \ +    pGCPrivate->wrapFuncs = (pGC)->funcs; \ +    pGCPrivate->wrapOps = (pGC)->ops; \ +    (pGC)->funcs = &cwGCFuncs; \ +    (pGC)->ops = &cwGCOps; \ +} while (0) + +extern GCFuncs cwGCFuncs; + +/* + * GC ops -- wrap each GC operation with our own function + */ + +static void cwFillSpans(DrawablePtr pDst, GCPtr pGC, int nInit, +			DDXPointPtr pptInit, int *pwidthInit, int fSorted); +static void cwSetSpans(DrawablePtr pDst, GCPtr pGC, char *psrc, +		       DDXPointPtr ppt, int *pwidth, int nspans, int fSorted); +static void cwPutImage(DrawablePtr pDst, GCPtr pGC, int depth, +		       int x, int y, int w, int h, int leftPad, int format, +		       char *pBits); +static RegionPtr cwCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, +			    int srcx, int srcy, int w, int h, +			    int dstx, int dsty); +static RegionPtr cwCopyPlane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, +			     int srcx, int srcy, int w, int h, +			     int dstx, int dsty, unsigned long plane); +static void cwPolyPoint(DrawablePtr pDst, GCPtr pGC, int mode, int npt, +			xPoint *pptInit); +static void cwPolylines(DrawablePtr pDst, GCPtr pGC, int mode, int npt, +			DDXPointPtr pptInit); +static void cwPolySegment(DrawablePtr pDst, GCPtr pGC, int nseg, +			  xSegment *pSegs); +static void cwPolyRectangle(DrawablePtr pDst, GCPtr pGC, +			    int nrects, xRectangle *pRects); +static void cwPolyArc(DrawablePtr pDst, GCPtr pGC, int narcs, xArc *parcs); +static void cwFillPolygon(DrawablePtr pDst, GCPtr pGC, int shape, int mode, +			  int count, DDXPointPtr pPts); +static void cwPolyFillRect(DrawablePtr pDst, GCPtr pGC, +			   int nrectFill, xRectangle *prectInit); +static void cwPolyFillArc(DrawablePtr pDst, GCPtr pGC, +			  int narcs, xArc *parcs); +static int cwPolyText8(DrawablePtr pDrawable, GCPtr pGC, int x, int y, +		       int count, char *chars); +static int cwPolyText16(DrawablePtr pDst, GCPtr pGC, int x, int y, +			int count, unsigned short *chars); +static void cwImageText8(DrawablePtr pDst, GCPtr pGC, int x, int y, +			 int count, char *chars); +static void cwImageText16(DrawablePtr pDst, GCPtr pGC, int x, int y, +			  int count, unsigned short *chars); +static void cwImageGlyphBlt(DrawablePtr pDst, GCPtr pGC, int x, int y, +			    unsigned int nglyph, CharInfoPtr *ppci, +			    pointer pglyphBase); +static void cwPolyGlyphBlt(DrawablePtr pDst, GCPtr pGC, int x, int y, +			   unsigned int nglyph, CharInfoPtr *ppci, +			   pointer pglyphBase); +static void cwPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst, +			 int w, int h, int x, int y); + +GCOps cwGCOps = { +	cwFillSpans, +	cwSetSpans, +	cwPutImage, +	cwCopyArea, +	cwCopyPlane, +	cwPolyPoint, +	cwPolylines, +	cwPolySegment, +	cwPolyRectangle, +	cwPolyArc, +	cwFillPolygon, +	cwPolyFillRect, +	cwPolyFillArc, +	cwPolyText8, +	cwPolyText16, +	cwImageText8, +	cwImageText16, +	cwImageGlyphBlt, +	cwPolyGlyphBlt, +	cwPushPixels +}; + +static void +cwFillSpans(DrawablePtr pDst, GCPtr pGC, int nspans, DDXPointPtr ppt, +	    int *pwidth, int fSorted) +{ +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    CW_OFFSET_XYPOINTS(ppt, nspans); + +    (*pBackingGC->ops->FillSpans)(pBackingDst, pBackingGC, nspans, ppt, +				  pwidth, fSorted); + +    EPILOGUE(pGC); +} + +static void +cwSetSpans(DrawablePtr pDst, GCPtr pGC, char *psrc, DDXPointPtr ppt, +	   int *pwidth, int nspans, int fSorted) +{ +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    CW_OFFSET_XYPOINTS(ppt, nspans); + +    (*pBackingGC->ops->SetSpans)(pBackingDst, pBackingGC, psrc, ppt, pwidth, +				 nspans, fSorted); + +    EPILOGUE(pGC); +} + +static void +cwPutImage(DrawablePtr pDst, GCPtr pGC, int depth, int x, int y, int w, int h, +	   int leftPad, int format, char *pBits) +{ +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    CW_OFFSET_XY_DST(x, y); + +    (*pBackingGC->ops->PutImage)(pBackingDst, pBackingGC, depth, x, y, w, h, +				 leftPad, format, pBits); + +    EPILOGUE(pGC); +} + +static RegionPtr +cwCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy, +	   int w, int h, int dstx, int dsty) +{ +    int		odstx, odsty; +    int		osrcx, osrcy; +    SETUP_BACKING_DST(pDst, pGC); +    SETUP_BACKING_SRC(pSrc, pGC); + +    PROLOGUE(pGC); + +    odstx = dstx; +    odsty = dsty; +    osrcx = srcx; +    osrcy = srcy; +    CW_OFFSET_XY_DST(dstx, dsty); +    CW_OFFSET_XY_SRC(srcx, srcy); + +    (*pBackingGC->ops->CopyArea)(pBackingSrc, pBackingDst, +				 pBackingGC, srcx, srcy, w, h, +				 dstx, dsty); +     +    EPILOGUE(pGC); + +    return miHandleExposures(pSrc, pDst, pGC, +			     osrcx, osrcy, w, h, +			     odstx, odsty, 0); +} + +static RegionPtr +cwCopyPlane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy, +	    int w, int h, int dstx, int dsty, unsigned long plane) +{ +    int		odstx, odsty; +    int		osrcx, osrcy; +    SETUP_BACKING_DST(pDst, pGC); +    SETUP_BACKING_SRC(pSrc, pGC); + +    PROLOGUE(pGC); + +    odstx = dstx; +    odsty = dsty; +    osrcx = srcx; +    osrcy = srcy; +    CW_OFFSET_XY_DST(dstx, dsty); +    CW_OFFSET_XY_SRC(srcx, srcy); + +    (*pBackingGC->ops->CopyPlane)(pBackingSrc, pBackingDst, +				  pBackingGC, srcx, srcy, w, h, +				  dstx, dsty, plane); + +    EPILOGUE(pGC); + +    return miHandleExposures(pSrc, pDst, pGC, +			     osrcx, osrcy, w, h, +			     odstx, odsty, plane); +} + +static void +cwPolyPoint(DrawablePtr pDst, GCPtr pGC, int mode, int npt, xPoint *ppt) +{ +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    if (mode == CoordModeOrigin) +	CW_OFFSET_XYPOINTS(ppt, npt); +    else +	CW_OFFSET_XYPOINTS(ppt, 1); + +    (*pBackingGC->ops->PolyPoint)(pBackingDst, pBackingGC, mode, npt, ppt); + +    EPILOGUE(pGC); +} + +static void +cwPolylines(DrawablePtr pDst, GCPtr pGC, int mode, int npt, DDXPointPtr ppt) +{ +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    if (mode == CoordModeOrigin) +	CW_OFFSET_XYPOINTS(ppt, npt); +    else +	CW_OFFSET_XYPOINTS(ppt, 1); + +    (*pBackingGC->ops->Polylines)(pBackingDst, pBackingGC, mode, npt, ppt); + +    EPILOGUE(pGC); +} + +static void +cwPolySegment(DrawablePtr pDst, GCPtr pGC, int nseg, xSegment *pSegs) +{ +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    CW_OFFSET_XYPOINTS(pSegs, nseg * 2); + +    (*pBackingGC->ops->PolySegment)(pBackingDst, pBackingGC, nseg, pSegs); + +    EPILOGUE(pGC); +} + +static void +cwPolyRectangle(DrawablePtr pDst, GCPtr pGC, int nrects, xRectangle *pRects) +{ +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    CW_OFFSET_RECTS(pRects, nrects); + +    (*pBackingGC->ops->PolyRectangle)(pBackingDst, pBackingGC, nrects, pRects); + +    EPILOGUE(pGC); +} + +static void +cwPolyArc(DrawablePtr pDst, GCPtr pGC, int narcs, xArc *pArcs) +{ +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    CW_OFFSET_RECTS(pArcs, narcs); + +    (*pBackingGC->ops->PolyArc)(pBackingDst, pBackingGC, narcs, pArcs); + +    EPILOGUE(pGC); +} + +static void +cwFillPolygon(DrawablePtr pDst, GCPtr pGC, int shape, int mode, int npt, +	      DDXPointPtr ppt) +{ +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    if (mode == CoordModeOrigin) +	CW_OFFSET_XYPOINTS(ppt, npt); +    else +	CW_OFFSET_XYPOINTS(ppt, 1); + +    (*pBackingGC->ops->FillPolygon)(pBackingDst, pBackingGC, shape, mode, npt, +				    ppt); + +    EPILOGUE(pGC); +} + +static void +cwPolyFillRect(DrawablePtr pDst, GCPtr pGC, int nrects, xRectangle *pRects) +{ +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    CW_OFFSET_RECTS(pRects, nrects); + +    (*pBackingGC->ops->PolyFillRect)(pBackingDst, pBackingGC, nrects, pRects); + +    EPILOGUE(pGC); +} + +static void +cwPolyFillArc(DrawablePtr pDst, GCPtr pGC, int narcs, xArc *parcs) +{ +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    CW_OFFSET_RECTS(parcs, narcs); + +    (*pBackingGC->ops->PolyFillArc)(pBackingDst, pBackingGC, narcs, parcs); + +    EPILOGUE(pGC); +} + +static int +cwPolyText8(DrawablePtr pDst, GCPtr pGC, int x, int y, int count, char *chars) +{ +    int result; +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    CW_OFFSET_XY_DST(x, y); + +    result = (*pBackingGC->ops->PolyText8)(pBackingDst, pBackingGC, x, y, +					   count, chars); + +    EPILOGUE(pGC); + +    return result; +} + +static int +cwPolyText16(DrawablePtr pDst, GCPtr pGC, int x, int y, int count, +	     unsigned short *chars) +{ +    int result; +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    CW_OFFSET_XY_DST(x, y); + +    result = (*pBackingGC->ops->PolyText16)(pBackingDst, pBackingGC, x, y, +					    count, chars); + +    EPILOGUE(pGC); +    return result; +} + +static void +cwImageText8(DrawablePtr pDst, GCPtr pGC, int x, int y, int count, char *chars) +{ +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    CW_OFFSET_XY_DST(x, y); + +    (*pBackingGC->ops->ImageText8)(pBackingDst, pBackingGC, x, y, count, +				   chars); + +    EPILOGUE(pGC); +} + +static void +cwImageText16(DrawablePtr pDst, GCPtr pGC, int x, int y, int count, +	     unsigned short *chars) +{ +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    CW_OFFSET_XY_DST(x, y); + +    (*pBackingGC->ops->ImageText16)(pBackingDst, pBackingGC, x, y, count, +				    chars); + +    EPILOGUE(pGC); +} + +static void +cwImageGlyphBlt(DrawablePtr pDst, GCPtr pGC, int x, int y, unsigned int nglyph, +		CharInfoPtr *ppci, pointer pglyphBase) +{ +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    CW_OFFSET_XY_DST(x, y); + +    (*pBackingGC->ops->ImageGlyphBlt)(pBackingDst, pBackingGC, x, y, nglyph, +				      ppci, pglyphBase); + +    EPILOGUE(pGC); +} + +static void +cwPolyGlyphBlt(DrawablePtr pDst, GCPtr pGC, int x, int y, unsigned int nglyph, +	       CharInfoPtr *ppci, pointer pglyphBase) +{ +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    CW_OFFSET_XY_DST(x, y); + +    (*pBackingGC->ops->PolyGlyphBlt)(pBackingDst, pBackingGC, x, y, nglyph, +				      ppci, pglyphBase); + +    EPILOGUE(pGC); +} + +static void +cwPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst, int w, int h, +	     int x, int y) +{ +    SETUP_BACKING_DST(pDst, pGC); + +    PROLOGUE(pGC); + +    CW_OFFSET_XY_DST(x, y); + +    (*pBackingGC->ops->PushPixels)(pBackingGC, pBitMap, pBackingDst, w, h, +				   x, y); + +    EPILOGUE(pGC); +} + diff --git a/miext/cw/cw_render.c b/miext/cw/cw_render.c new file mode 100644 index 0000000..165c44f --- /dev/null +++ b/miext/cw/cw_render.c @@ -0,0 +1,469 @@ +/* + * Copyright © 2004 Eric Anholt + * + * 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 Eric Anholt not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission.  Eric Anholt makes no + * representations about the suitability of this software for any purpose.  It + * is provided "as is" without express or implied warranty. + * + * ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL ERIC ANHOLT 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 <string.h> + +#include "gcstruct.h" +#include "windowstr.h" +#include "cw.h" + +#define cwPsDecl(pScreen)	\ +    PictureScreenPtr	ps = GetPictureScreen (pScreen);	\ +    cwScreenPtr		pCwScreen = getCwScreen (pScreen) + +#define cwPicturePrivate					\ +    cwPicturePtr    pPicturePrivate = getCwPicture(pPicture) + +#define cwSrcPictureDecl							\ +    int		    src_picture_x_off, src_picture_y_off;			\ +    PicturePtr	    pBackingSrcPicture = cwGetBackingPicture(pSrcPicture,	\ +							     &src_picture_x_off,\ +							     &src_picture_y_off) + +#define cwDstPictureDecl							\ +    int		    dst_picture_x_off, dst_picture_y_off;			\ +    PicturePtr	    pBackingDstPicture = cwGetBackingPicture(pDstPicture,	\ +							     &dst_picture_x_off,\ +							     &dst_picture_y_off) + +#define cwMskPictureDecl							\ +    int		    msk_picture_x_off = 0, msk_picture_y_off = 0;		\ +    PicturePtr	    pBackingMskPicture = (!pMskPicture ? 0 :	    		\ +					  cwGetBackingPicture(pMskPicture,	\ +							      &msk_picture_x_off,\ +							      &msk_picture_y_off)) + +#define cwPsUnwrap(elt) {	\ +    ps->elt = pCwScreen->elt;	\ +} + +#define cwPsWrap(elt,func) {	\ +    pCwScreen->elt = ps->elt;	\ +    ps->elt = func;		\ +} + +static cwPicturePtr +cwCreatePicturePrivate (PicturePtr pPicture) +{ +    WindowPtr	    pWindow = (WindowPtr) pPicture->pDrawable; +    PixmapPtr	    pPixmap = getCwPixmap (pWindow); +    int		    error; +    cwPicturePtr    pPicturePrivate; + +    pPicturePrivate = malloc(sizeof (cwPictureRec)); +    if (!pPicturePrivate) +	return NULL; +     +    pPicturePrivate->pBackingPicture = CreatePicture (0, &pPixmap->drawable,  +						      pPicture->pFormat, +						      0, 0, serverClient, +						      &error); +    if (!pPicturePrivate->pBackingPicture) +    { +	free(pPicturePrivate); +	return NULL; +    } + +    /* +     * Ensure that this serial number does not match the window's +     */ +    pPicturePrivate->serialNumber = pPixmap->drawable.serialNumber; +    pPicturePrivate->stateChanges = (1 << (CPLastBit + 1)) - 1; +     +    setCwPicture(pPicture, pPicturePrivate); + +    return pPicturePrivate; +} + +static void +cwDestroyPicturePrivate (PicturePtr pPicture) +{ +    cwPicturePrivate; + +    if (pPicturePrivate) +    { +	if (pPicturePrivate->pBackingPicture) +	    FreePicture (pPicturePrivate->pBackingPicture, 0); +	free(pPicturePrivate); +	setCwPicture(pPicture, NULL); +    } +} + +static PicturePtr +cwGetBackingPicture (PicturePtr pPicture, int *x_off, int *y_off) +{ +    cwPicturePrivate; + +    if (pPicturePrivate) +    { +	DrawablePtr pDrawable = pPicture->pDrawable; +	WindowPtr   pWindow = (WindowPtr) pDrawable; +	PixmapPtr   pPixmap = getCwPixmap (pWindow); + +	*x_off = pDrawable->x - pPixmap->screen_x; +	*y_off = pDrawable->y - pPixmap->screen_y; + +	return pPicturePrivate->pBackingPicture; +    } +    else +    { +	*x_off = *y_off = 0; +	return pPicture; +    } +} +     +static void +cwDestroyPicture (PicturePtr pPicture) +{ +    ScreenPtr		pScreen = pPicture->pDrawable->pScreen; +    cwPsDecl(pScreen); +     +    cwPsUnwrap(DestroyPicture); +    cwDestroyPicturePrivate (pPicture); +    (*ps->DestroyPicture) (pPicture); +    cwPsWrap(DestroyPicture, cwDestroyPicture); +} + +static void +cwChangePicture (PicturePtr pPicture, Mask mask) +{ +    ScreenPtr		pScreen = pPicture->pDrawable->pScreen; +    cwPsDecl(pScreen); +    cwPicturePtr	pPicturePrivate = getCwPicture(pPicture); +     +    cwPsUnwrap(ChangePicture); +    (*ps->ChangePicture) (pPicture, mask); +    if (pPicturePrivate) +	pPicturePrivate->stateChanges |= mask; +    cwPsWrap(ChangePicture, cwChangePicture); +} + + +static void +cwValidatePicture (PicturePtr pPicture, +		   Mask       mask) +{ +    DrawablePtr		pDrawable = pPicture->pDrawable; +    ScreenPtr		pScreen = pDrawable->pScreen; +    cwPsDecl(pScreen); +    cwPicturePrivate; +     +    cwPsUnwrap(ValidatePicture); + +    /* +     * Must call ValidatePicture to ensure pPicture->pCompositeClip is valid +     */ +    (*ps->ValidatePicture) (pPicture, mask); +     +    if (!cwDrawableIsRedirWindow (pDrawable)) +    { +	if (pPicturePrivate) +	    cwDestroyPicturePrivate (pPicture); +    } +    else +    { +	PicturePtr  pBackingPicture; +	DrawablePtr pBackingDrawable; +	int	    x_off, y_off; +	 +	pBackingDrawable = cwGetBackingDrawable(pDrawable, &x_off, &y_off); + +	if (pPicturePrivate &&  +	    pPicturePrivate->pBackingPicture->pDrawable != pBackingDrawable) +	{ +	    cwDestroyPicturePrivate (pPicture); +	    pPicturePrivate = 0; +	} + +	if (!pPicturePrivate) +	{ +	    pPicturePrivate = cwCreatePicturePrivate (pPicture); +	    if (!pPicturePrivate) +	    { +		cwPsWrap(ValidatePicture, cwValidatePicture); +		return; +	    } +	} + +	pBackingPicture = pPicturePrivate->pBackingPicture; + +	/* +	 * Always copy transform and filters because there's no +	 * indication of when they've changed +	 */ +	SetPictureTransform(pBackingPicture, pPicture->transform); +	 +	if (pBackingPicture->filter != pPicture->filter || +	    pPicture->filter_nparams > 0) +	{ +	    char    *filter = PictureGetFilterName (pPicture->filter); +	     +	    SetPictureFilter(pBackingPicture, +			     filter, strlen (filter), +			     pPicture->filter_params, +			     pPicture->filter_nparams); +	} + +	pPicturePrivate->stateChanges |= mask; + +	if (pPicturePrivate->serialNumber != pDrawable->serialNumber || +	    (pPicturePrivate->stateChanges & (CPClipXOrigin|CPClipYOrigin|CPClipMask))) +	{ +	    SetPictureClipRegion (pBackingPicture,  +				  x_off - pDrawable->x, +				  y_off - pDrawable->y, +				  pPicture->pCompositeClip); +     +	    pPicturePrivate->serialNumber = pDrawable->serialNumber; +	    pPicturePrivate->stateChanges &= ~(CPClipXOrigin | CPClipYOrigin | CPClipMask); +	} + +	CopyPicture(pPicture, pPicturePrivate->stateChanges, pBackingPicture); + +	ValidatePicture (pBackingPicture); +    } +    cwPsWrap(ValidatePicture, cwValidatePicture); +} + +static void +cwComposite (CARD8	op, +	     PicturePtr pSrcPicture, +	     PicturePtr pMskPicture, +	     PicturePtr pDstPicture, +	     INT16	xSrc, +	     INT16	ySrc, +	     INT16	xMsk, +	     INT16	yMsk, +	     INT16	xDst, +	     INT16	yDst, +	     CARD16	width, +	     CARD16	height) +{ +    ScreenPtr	pScreen = pDstPicture->pDrawable->pScreen; +    cwPsDecl(pScreen); +    cwSrcPictureDecl; +    cwMskPictureDecl; +    cwDstPictureDecl; +     +    cwPsUnwrap(Composite); +    (*ps->Composite) (op, pBackingSrcPicture, pBackingMskPicture, pBackingDstPicture, +		      xSrc + src_picture_x_off, ySrc + src_picture_y_off, +		      xMsk + msk_picture_x_off, yMsk + msk_picture_y_off, +		      xDst + dst_picture_x_off, yDst + dst_picture_y_off, +		      width, height); +    cwPsWrap(Composite, cwComposite); +} + +static void +cwCompositeRects (CARD8		op, +		  PicturePtr	pDstPicture, +		  xRenderColor  *color, +		  int		nRect, +		  xRectangle	*rects) +{ +    ScreenPtr	pScreen = pDstPicture->pDrawable->pScreen; +    cwPsDecl(pScreen); +    cwDstPictureDecl; +    int i; +     +    cwPsUnwrap(CompositeRects); +    for (i = 0; i < nRect; i++) +    { +	rects[i].x += dst_picture_x_off; +	rects[i].y += dst_picture_y_off; +    } +    (*ps->CompositeRects) (op, pBackingDstPicture, color, nRect, rects); +    cwPsWrap(CompositeRects, cwCompositeRects); +} + +static void +cwTrapezoids (CARD8	    op, +	      PicturePtr    pSrcPicture, +	      PicturePtr    pDstPicture, +	      PictFormatPtr maskFormat, +	      INT16	    xSrc, +	      INT16	    ySrc, +	      int	    ntrap, +	      xTrapezoid    *traps) +{ +    ScreenPtr	pScreen = pDstPicture->pDrawable->pScreen; +    cwPsDecl(pScreen); +    cwSrcPictureDecl; +    cwDstPictureDecl; +    int i; +     +    cwPsUnwrap(Trapezoids); +    if (dst_picture_x_off || dst_picture_y_off) { +	for (i = 0; i < ntrap; i++) +	{ +	    traps[i].top += dst_picture_y_off << 16; +	    traps[i].bottom += dst_picture_y_off << 16; +	    traps[i].left.p1.x += dst_picture_x_off << 16; +	    traps[i].left.p1.y += dst_picture_y_off << 16; +	    traps[i].left.p2.x += dst_picture_x_off << 16; +	    traps[i].left.p2.y += dst_picture_y_off << 16; +	    traps[i].right.p1.x += dst_picture_x_off << 16; +	    traps[i].right.p1.y += dst_picture_y_off << 16; +	    traps[i].right.p2.x += dst_picture_x_off << 16; +	    traps[i].right.p2.y += dst_picture_y_off << 16; +	} +    } +    (*ps->Trapezoids) (op, pBackingSrcPicture, pBackingDstPicture, maskFormat, +		       xSrc + src_picture_x_off, ySrc + src_picture_y_off, +		       ntrap, traps); +    cwPsWrap(Trapezoids, cwTrapezoids); +} + +static void +cwTriangles (CARD8	    op, +	     PicturePtr	    pSrcPicture, +	     PicturePtr	    pDstPicture, +	     PictFormatPtr  maskFormat, +	     INT16	    xSrc, +	     INT16	    ySrc, +	     int	    ntri, +	     xTriangle	   *tris) +{ +    ScreenPtr	pScreen = pDstPicture->pDrawable->pScreen; +    cwPsDecl(pScreen); +    cwSrcPictureDecl; +    cwDstPictureDecl; +    int i; +     +    cwPsUnwrap(Triangles); +    if (dst_picture_x_off || dst_picture_y_off) { +	for (i = 0; i < ntri; i++) +	{ +	    tris[i].p1.x += dst_picture_x_off << 16; +	    tris[i].p1.y += dst_picture_y_off << 16; +	    tris[i].p2.x += dst_picture_x_off << 16; +	    tris[i].p2.y += dst_picture_y_off << 16; +	    tris[i].p3.x += dst_picture_x_off << 16; +	    tris[i].p3.y += dst_picture_y_off << 16; +	} +    } +    (*ps->Triangles) (op, pBackingSrcPicture, pBackingDstPicture, maskFormat, +		      xSrc + src_picture_x_off, ySrc + src_picture_y_off, +		      ntri, tris); +    cwPsWrap(Triangles, cwTriangles); +} + +static void +cwTriStrip (CARD8	    op, +	    PicturePtr	    pSrcPicture, +	    PicturePtr	    pDstPicture, +	    PictFormatPtr   maskFormat, +	    INT16	    xSrc, +	    INT16	    ySrc, +	    int		    npoint, +	    xPointFixed    *points) +{ +    ScreenPtr	pScreen = pDstPicture->pDrawable->pScreen; +    cwPsDecl(pScreen); +    cwSrcPictureDecl; +    cwDstPictureDecl; +    int i; + +    cwPsUnwrap(TriStrip); +    if (dst_picture_x_off || dst_picture_y_off) { +	for (i = 0; i < npoint; i++) +	{ +	    points[i].x += dst_picture_x_off << 16; +	    points[i].y += dst_picture_y_off << 16; +	} +    } +    (*ps->TriStrip) (op, pBackingSrcPicture, pBackingDstPicture, maskFormat, +		     xSrc + src_picture_x_off, ySrc + src_picture_y_off, +		     npoint, points); +    cwPsWrap(TriStrip, cwTriStrip); +} + +static void +cwTriFan (CARD8		 op, +	  PicturePtr	 pSrcPicture, +	  PicturePtr	 pDstPicture, +	  PictFormatPtr  maskFormat, +	  INT16		 xSrc, +	  INT16		 ySrc, +	  int		 npoint, +	  xPointFixed   *points) +{ +    ScreenPtr	pScreen = pDstPicture->pDrawable->pScreen; +    cwPsDecl(pScreen); +    cwSrcPictureDecl; +    cwDstPictureDecl; +    int i; + +    cwPsUnwrap(TriFan); +    if (dst_picture_x_off || dst_picture_y_off) { +	for (i = 0; i < npoint; i++) +	{ +	    points[i].x += dst_picture_x_off << 16; +	    points[i].y += dst_picture_y_off << 16; +	} +    } +    (*ps->TriFan) (op, pBackingSrcPicture, pBackingDstPicture, maskFormat, +		   xSrc + src_picture_x_off, ySrc + src_picture_y_off, +		   npoint, points); +    cwPsWrap(TriFan, cwTriFan); +} + +void +cwInitializeRender (ScreenPtr pScreen) +{ +    cwPsDecl (pScreen); + +    cwPsWrap(DestroyPicture, cwDestroyPicture); +    cwPsWrap(ChangePicture, cwChangePicture); +    cwPsWrap(ValidatePicture, cwValidatePicture); +    cwPsWrap(Composite, cwComposite); +    cwPsWrap(CompositeRects, cwCompositeRects); +    cwPsWrap(Trapezoids, cwTrapezoids); +    cwPsWrap(Triangles, cwTriangles); +    cwPsWrap(TriStrip, cwTriStrip); +    cwPsWrap(TriFan, cwTriFan); +    /* There is no need to wrap AddTraps as far as we can tell.  AddTraps can +     * only be done on alpha-only pictures, and we won't be getting +     * alpha-only window pictures, so there's no need to translate. +     */ +} + +void +cwFiniRender (ScreenPtr pScreen) +{ +    cwPsDecl (pScreen); + +    cwPsUnwrap(DestroyPicture); +    cwPsUnwrap(ChangePicture); +    cwPsUnwrap(ValidatePicture); +    cwPsUnwrap(Composite); +    cwPsUnwrap(CompositeRects); +    cwPsUnwrap(Trapezoids); +    cwPsUnwrap(Triangles); +    cwPsUnwrap(TriStrip); +    cwPsUnwrap(TriFan); +} + | 
