[Pkg-e-commits] [SCM] Enlightenment DR17 advanced canvas library branch, new-svn-snapshot, updated. debian/0.9.9.050+svn20081206-1-2320-g32f38ce

Albin Tonnerre albin.tonnerre at gmail.com
Fri Jun 19 12:12:45 UTC 2009


The following commit has been merged in the new-svn-snapshot branch:
commit bab32c4f7a4196441e91296bbccdfaafbd23f8db
Author: Albin Tonnerre <albin.tonnerre at gmail.com>
Date:   Wed Jun 17 15:41:39 2009 +0200

    Import upstream release 0.9.9.061

diff --git a/Makefile.am b/Makefile.am
index 0f3d285..b4dbf55 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -32,6 +32,7 @@ evas-software-16-x11.pc \
 evas-software-xcb.pc \
 evas-xrender-x11.pc \
 evas-xrender-xcb.pc \
+evas-software-gdi.pc \
 evas-software-ddraw.pc \
 evas-software-16-ddraw.pc \
 evas-direct3d.pc \
@@ -70,6 +71,7 @@ evas-software-16-x11.pc.in \
 evas-software-xcb.pc.in \
 evas-xrender-x11.pc.in \
 evas-xrender-xcb.pc.in \
+evas-software-gdi.pc.in \
 evas-software-ddraw.pc.in \
 evas-software-16-ddraw.pc.in \
 evas-direct3d.pc.in \
@@ -129,6 +131,10 @@ if BUILD_ENGINE_XRENDER_XCB
 pxrenderxcb = evas-xrender-xcb.pc
 endif
 
+if BUILD_ENGINE_SOFTWARE_GDI
+psoftwaregdi = evas-software-gdi.pc
+endif
+
 if BUILD_ENGINE_SOFTWARE_DDRAW
 psoftwareddraw = evas-software-ddraw.pc
 endif
@@ -152,9 +158,10 @@ endif
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = \
 	evas.pc $(psoftwarex11) $(psoftwarexcb) $(pdirectfb) $(pfb) \
-	$(psoftwarebuffer) $(psoftwareqtopia) $(popenglx11) $(pquartz) $(pcairox11) \
-	$(pxrenderx11) $(pxrenderxcb) $(psoftwareddraw) $(psoftwaresdl) \
+	$(psoftwarebuffer) $(popenglx11) $(pquartz) \
+	$(pxrenderx11) $(pxrenderxcb) $(psoftwaregdi) $(psoftwareddraw) $(psoftwaresdl) \
 	$(psoftware16x11) $(pdirect3d) $(psoftware16ddraw) $(psoftware16wince) $(popenglglew)
+# $(psoftwareqtopia) $(pcairox11)
 
 .PHONY: doc
 
diff --git a/Makefile.in b/Makefile.in
index 5b19f51..96a3a6c 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -45,6 +45,7 @@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
 	$(srcdir)/evas-software-16-x11.pc.in \
 	$(srcdir)/evas-software-buffer.pc.in \
 	$(srcdir)/evas-software-ddraw.pc.in \
+	$(srcdir)/evas-software-gdi.pc.in \
 	$(srcdir)/evas-software-sdl.pc.in \
 	$(srcdir)/evas-software-x11.pc.in \
 	$(srcdir)/evas-software-xcb.pc.in \
@@ -72,9 +73,10 @@ CONFIG_CLEAN_FILES = evas-directfb.pc evas-fb.pc evas-opengl-glew.pc \
 	evas-opengl-x11.pc evas-quartz.pc evas-software-buffer.pc \
 	evas-software-x11.pc evas-software-16-x11.pc \
 	evas-software-xcb.pc evas-xrender-x11.pc evas-xrender-xcb.pc \
-	evas-software-ddraw.pc evas-software-16-ddraw.pc \
-	evas-direct3d.pc evas-software-16-wince.pc \
-	evas-software-sdl.pc evas.pc README evas.spec
+	evas-software-gdi.pc evas-software-ddraw.pc \
+	evas-software-16-ddraw.pc evas-direct3d.pc \
+	evas-software-16-wince.pc evas-software-sdl.pc evas.pc README \
+	evas.spec
 am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgconfigdir)"
 binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
 SCRIPTS = $(bin_SCRIPTS)
@@ -264,6 +266,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
@@ -358,6 +362,7 @@ evas-software-16-x11.pc \
 evas-software-xcb.pc \
 evas-xrender-x11.pc \
 evas-xrender-xcb.pc \
+evas-software-gdi.pc \
 evas-software-ddraw.pc \
 evas-software-16-ddraw.pc \
 evas-direct3d.pc \
@@ -395,6 +400,7 @@ evas-software-16-x11.pc.in \
 evas-software-xcb.pc.in \
 evas-xrender-x11.pc.in \
 evas-xrender-xcb.pc.in \
+evas-software-gdi.pc.in \
 evas-software-ddraw.pc.in \
 evas-software-16-ddraw.pc.in \
 evas-direct3d.pc.in \
@@ -421,6 +427,7 @@ evas.spec.in evas.spec
 #endif
 @BUILD_ENGINE_XRENDER_X11_TRUE at pxrenderx11 = evas-xrender-x11.pc
 @BUILD_ENGINE_XRENDER_XCB_TRUE at pxrenderxcb = evas-xrender-xcb.pc
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@psoftwaregdi = evas-software-gdi.pc
 @BUILD_ENGINE_SOFTWARE_DDRAW_TRUE at psoftwareddraw = evas-software-ddraw.pc
 @BUILD_ENGINE_SOFTWARE_16_DDRAW_TRUE at psoftware16ddraw = evas-software-16-ddraw.pc
 @BUILD_ENGINE_DIRECT3D_TRUE at pdirect3d = evas-direct3d.pc
@@ -429,8 +436,8 @@ evas.spec.in evas.spec
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = \
 	evas.pc $(psoftwarex11) $(psoftwarexcb) $(pdirectfb) $(pfb) \
-	$(psoftwarebuffer) $(psoftwareqtopia) $(popenglx11) $(pquartz) $(pcairox11) \
-	$(pxrenderx11) $(pxrenderxcb) $(psoftwareddraw) $(psoftwaresdl) \
+	$(psoftwarebuffer) $(popenglx11) $(pquartz) \
+	$(pxrenderx11) $(pxrenderxcb) $(psoftwaregdi) $(psoftwareddraw) $(psoftwaresdl) \
 	$(psoftware16x11) $(pdirect3d) $(psoftware16ddraw) $(psoftware16wince) $(popenglglew)
 
 all: config.h
@@ -509,6 +516,8 @@ evas-xrender-x11.pc: $(top_builddir)/config.status $(srcdir)/evas-xrender-x11.pc
 	cd $(top_builddir) && $(SHELL) ./config.status $@
 evas-xrender-xcb.pc: $(top_builddir)/config.status $(srcdir)/evas-xrender-xcb.pc.in
 	cd $(top_builddir) && $(SHELL) ./config.status $@
+evas-software-gdi.pc: $(top_builddir)/config.status $(srcdir)/evas-software-gdi.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
 evas-software-ddraw.pc: $(top_builddir)/config.status $(srcdir)/evas-software-ddraw.pc.in
 	cd $(top_builddir) && $(SHELL) ./config.status $@
 evas-software-16-ddraw.pc: $(top_builddir)/config.status $(srcdir)/evas-software-16-ddraw.pc.in
@@ -961,6 +970,7 @@ uninstall-am: uninstall-binSCRIPTS uninstall-pkgconfigDATA
 	uninstall uninstall-am uninstall-binSCRIPTS \
 	uninstall-pkgconfigDATA
 
+# $(psoftwareqtopia) $(pcairox11)
 
 .PHONY: doc
 
diff --git a/README b/README
index cd7dfc1..4f15eb6 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-Evas 0.9.9.060
+Evas 0.9.9.061
 
 Evas is a clean display canvas API for several target display systems
 that can draw anti-aliased text, smooth super and sub-sampled scaled
@@ -253,7 +253,7 @@ BUILDING PACKAGES:
 
 RPM: To build rpm packages:
   
-  sudo rpm -ta evas-0.9.9.060.tar.gz
+  sudo rpm -ta evas-0.9.9.061.tar.gz
 
 You will find rpm packages in your system /usr/src/redhat/* dirs (note you may
 not need to use sudo or root if you have your own ~/.rpmrc. see rpm documents
@@ -261,11 +261,11 @@ for more details)
 
 DEB: To build deb packages:
 
-  tar zvf evas-0.9.9.060.tar.gz
-  cd evas-0.9.9.060
+  tar zvf evas-0.9.9.061.tar.gz
+  cd evas-0.9.9.061
   dpkg-buildpackage -us -uc -rfakeroot
   cd ..
-  rm -rf evas-0.9.9.060
+  rm -rf evas-0.9.9.061
 
 You will find all the debian source, binary etc. packages put in the directory
 where you first untarred the source tarball.
diff --git a/config.guess b/config.guess
index 278f9e9..f32079a 100755
--- a/config.guess
+++ b/config.guess
@@ -1,10 +1,10 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
-#   Inc.
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
 
-timestamp='2007-07-22'
+timestamp='2008-01-23'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -56,8 +56,8 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -532,7 +532,7 @@ EOF
 		echo rs6000-ibm-aix3.2
 	fi
 	exit ;;
-    *:AIX:*:[45])
+    *:AIX:*:[456])
 	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
 	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
 		IBM_ARCH=rs6000
@@ -799,6 +799,9 @@ EOF
 	    EM64T | authenticamd)
 		echo x86_64-unknown-interix${UNAME_RELEASE}
 		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
 	esac ;;
     [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
 	echo i${UNAME_MACHINE}-pc-mks
@@ -833,7 +836,14 @@ EOF
 	echo ${UNAME_MACHINE}-pc-minix
 	exit ;;
     arm*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	fi
 	exit ;;
     avr32*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-gnu
@@ -954,8 +964,8 @@ EOF
     x86_64:Linux:*:*)
 	echo x86_64-unknown-linux-gnu
 	exit ;;
-    xtensa:Linux:*:*)
-    	echo xtensa-unknown-linux-gnu
+    xtensa*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
 	exit ;;
     i*86:Linux:*:*)
 	# The BFD linker knows what the default object file format is, so
@@ -1474,9 +1484,9 @@ This script, last modified $timestamp, has failed to recognize
 the operating system you are using. It is advised that you
 download the most up to date version of the config scripts from
 
-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
 and
-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
 
 If the version you run ($0) is already up to date, please
 send the following data and any information you think might be
diff --git a/config.h.in b/config.h.in
index d8315e0..5f3bab1 100644
--- a/config.h.in
+++ b/config.h.in
@@ -135,6 +135,9 @@
 /* Software DirectDraw rendering backend */
 #undef BUILD_ENGINE_SOFTWARE_DDRAW
 
+/* Software GDI rendering backend */
+#undef BUILD_ENGINE_SOFTWARE_GDI
+
 /* Software SDL rendering backend */
 #undef BUILD_ENGINE_SOFTWARE_SDL
 
@@ -224,6 +227,9 @@
 /* Use SDL primitive when possible */
 #undef ENGINE_SDL_PRIMITIVE
 
+/* Shared caceh server. */
+#undef EVAS_CSERVE
+
 /* complain when peole pass in wrong object types etc. */
 #undef EVAS_MAGIC_DEBUG
 
@@ -261,8 +267,8 @@
 /* have fontconfig searching capabilities */
 #undef HAVE_FONTCONFIG
 
-/* Define to 1 if you have the <fribidi/fribidi.h> header file. */
-#undef HAVE_FRIBIDI_FRIBIDI_H
+/* have fribidi support */
+#undef HAVE_FRIBIDI
 
 /* Define to 1 if you have the <GL/glew.h> header file. */
 #undef HAVE_GL_GLEW_H
diff --git a/config.sub b/config.sub
index 1761d8b..6759825 100755
--- a/config.sub
+++ b/config.sub
@@ -1,10 +1,10 @@
 #! /bin/sh
 # Configuration validation subroutine script.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
-#   Inc.
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+#   Free Software Foundation, Inc.
 
-timestamp='2007-06-28'
+timestamp='2008-01-16'
 
 # This file is (in principle) common to ALL GNU software.
 # The presence of a machine in this file suggests that SOME GNU software
@@ -72,8 +72,8 @@ Report bugs and patches to <config-patches at gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -369,10 +369,14 @@ case $basic_machine in
 	| v850-* | v850e-* | vax-* \
 	| we32k-* \
 	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
-	| xstormy16-* | xtensa-* \
+	| xstormy16-* | xtensa*-* \
 	| ymp-* \
 	| z8k-*)
 		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
 	# Recognize the various machine names and aliases which stand
 	# for a CPU type and a company and sometimes even an OS.
 	386bsd)
@@ -443,6 +447,14 @@ case $basic_machine in
 		basic_machine=ns32k-sequent
 		os=-dynix
 		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
 	c90)
 		basic_machine=c90-cray
 		os=-unicos
@@ -668,6 +680,14 @@ case $basic_machine in
 		basic_machine=m68k-isi
 		os=-sysv
 		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
 	m88k-omron*)
 		basic_machine=m88k-omron
 		;;
@@ -813,6 +833,14 @@ case $basic_machine in
 		basic_machine=i860-intel
 		os=-osf
 		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
 	pbd)
 		basic_machine=sparc-tti
 		;;
@@ -1021,6 +1049,10 @@ case $basic_machine in
 		basic_machine=tic6x-unknown
 		os=-coff
 		;;
+	tile*)
+		basic_machine=tile-unknown
+		os=-linux-gnu
+		;;
 	tx39)
 		basic_machine=mipstx39-unknown
 		;;
diff --git a/configure b/configure
index 71b2354..90d8293 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61 for evas 0.9.9.060.
+# Generated by GNU Autoconf 2.61 for evas 0.9.9.061.
 #
 # Report bugs to <enlightenment-devel at lists.sourceforge.net>.
 #
@@ -723,8 +723,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='evas'
 PACKAGE_TARNAME='evas'
-PACKAGE_VERSION='0.9.9.060'
-PACKAGE_STRING='evas 0.9.9.060'
+PACKAGE_VERSION='0.9.9.061'
+PACKAGE_STRING='evas 0.9.9.061'
 PACKAGE_BUGREPORT='enlightenment-devel at lists.sourceforge.net'
 
 ac_unique_file="configure.ac"
@@ -878,15 +878,17 @@ OTOOL64
 CXXCPP
 version_info
 release_info
+MODULE_ARCH
 RC
 ALLOCA
-MODULE_ARCH
 PKG_CONFIG
 EVIL_CFLAGS
 EVIL_LIBS
 WIN32_CPPFLAGS
 WIN32_CFLAGS
 lt_enable_auto_import
+EVAS_CSERVE_TRUE
+EVAS_CSERVE_FALSE
 FRIBIDI_CFLAGS
 FRIBIDI_LIBS
 EINA_CFLAGS
@@ -929,6 +931,10 @@ evas_engine_xrender_xcb_cflags
 evas_engine_xrender_xcb_libs
 BUILD_ENGINE_XRENDER_XCB_TRUE
 BUILD_ENGINE_XRENDER_XCB_FALSE
+evas_engine_software_gdi_cflags
+evas_engine_software_gdi_libs
+BUILD_ENGINE_SOFTWARE_GDI_TRUE
+BUILD_ENGINE_SOFTWARE_GDI_FALSE
 evas_engine_software_ddraw_cflags
 evas_engine_software_ddraw_libs
 BUILD_ENGINE_SOFTWARE_DDRAW_TRUE
@@ -1583,7 +1589,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures evas 0.9.9.060 to adapt to many kinds of systems.
+\`configure' configures evas 0.9.9.061 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1657,7 +1663,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of evas 0.9.9.060:";;
+     short | recursive ) echo "Configuration of evas 0.9.9.061:";;
    esac
   cat <<\_ACEOF
 
@@ -1671,7 +1677,11 @@ Optional Features:
   --enable-fast-install[=PKGS]
                           optimize for fast installation [default=yes]
   --disable-libtool-lock  avoid locking (might break parallel builds)
-  enable strict mode
+  --enable-strict         enable strict checking mode. [default==disabled]
+  --disable-evas-cserve   disable shared cache server support.
+                          [default=enabled]
+  --disable-fribidi       disable bidirectional text support.
+                          [default=enabled]
   --enable-simple-x11     enable simple x11 linking
   --disable-fontconfig    disable fontconfig for finding fonts.
                           [default=enabled]
@@ -1681,6 +1691,7 @@ Optional Features:
   --enable-gl-x11         enable OpenGL X11 rendering backend
   --enable-software-xcb   enable Software XCB rendering backend
   --enable-xrender-xcb    enable XRender XCB rendering backend
+  --enable-software-gdi   enable Software GDI rendering backend
   --enable-software-ddraw enable Software DirectDraw rendering backend
   --enable-direct3d       enable Direct3D rendering backend
   --enable-quartz         enable Quartz rendering backend
@@ -1922,7 +1933,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-evas configure 0.9.9.060
+evas configure 0.9.9.061
 generated by GNU Autoconf 2.61
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1936,7 +1947,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by evas $as_me 0.9.9.060, which was
+It was created by evas $as_me 0.9.9.061, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   $ $0 $@
@@ -2291,6 +2302,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
+
 ac_aux_dir=
 for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
   if test -f "$ac_dir/install-sh"; then
@@ -3777,7 +3789,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='evas'
- VERSION='0.9.9.060'
+ VERSION='0.9.9.061'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -7761,13 +7773,13 @@ if test "${lt_cv_nm_interface+set}" = set; then
 else
   lt_cv_nm_interface="BSD nm"
   echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:7764: $ac_compile\"" >&5)
+  (eval echo "\"\$as_me:7776: $ac_compile\"" >&5)
   (eval "$ac_compile" 2>conftest.err)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:7767: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval echo "\"\$as_me:7779: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
   (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:7770: output\"" >&5)
+  (eval echo "\"\$as_me:7782: output\"" >&5)
   cat conftest.out >&5
   if $GREP 'External.*some_variable' conftest.out > /dev/null; then
     lt_cv_nm_interface="MS dumpbin"
@@ -8877,7 +8889,7 @@ ia64-*-hpux*)
   ;;
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 8880 "configure"' > conftest.$ac_ext
+  echo '#line 8892 "configure"' > conftest.$ac_ext
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -10957,11 +10969,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:10960: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:10972: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:10964: \$? = $ac_status" >&5
+   echo "$as_me:10976: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -11281,11 +11293,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:11284: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:11296: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:11288: \$? = $ac_status" >&5
+   echo "$as_me:11300: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -11386,11 +11398,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:11389: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:11401: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:11393: \$? = $ac_status" >&5
+   echo "$as_me:11405: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -11441,11 +11453,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:11444: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:11456: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:11448: \$? = $ac_status" >&5
+   echo "$as_me:11460: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -14202,7 +14214,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 14205 "configure"
+#line 14217 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -14302,7 +14314,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 14305 "configure"
+#line 14317 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -16305,11 +16317,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:16308: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:16320: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:16312: \$? = $ac_status" >&5
+   echo "$as_me:16324: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -16404,11 +16416,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:16407: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:16419: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:16411: \$? = $ac_status" >&5
+   echo "$as_me:16423: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -16456,11 +16468,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:16459: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:16471: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:16463: \$? = $ac_status" >&5
+   echo "$as_me:16475: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -17457,12 +17469,28 @@ VMIN=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $2);}'`
 VMIC=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $3);}'`
 SNAP=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $4);}'`
 version_info=`expr $VMAJ + $VMIN`":$VMIC:$VMIN"
-release="ver-pre-01"
-release_info="-release $release"
+
+
+release="ver-svn-02"
+case "$host_os" in
+   mingw32ce* | cegcc*)
+      MODULE_ARCH="$host_os-$host_cpu"
+      ;;
+   *)
+      release_info="-release $release"
+      MODULE_ARCH="$host_os-$host_cpu-$release"
+      ;;
+esac
 
 
 
+cat >>confdefs.h <<_ACEOF
+#define MODULE_ARCH "$MODULE_ARCH"
+_ACEOF
+
+
 want_fontconfig="auto"
+want_fribidi="auto"
 
 want_evas_engine_buffer="yes"
 want_evas_engine_software_x11="no"
@@ -17471,6 +17499,7 @@ want_evas_engine_gl_x11="no"
 want_evas_engine_cairo_x11="no"
 want_evas_engine_software_xcb="no"
 want_evas_engine_xrender_xcb="no"
+want_evas_engine_software_gdi="no"
 want_evas_engine_software_ddraw="no"
 want_evas_engine_direct3d="no"
 want_evas_engine_quartz="no"
@@ -17505,6 +17534,7 @@ case "$host_os" in
       want_evas_image_loader_tiff="no"
       ;;
    mingw*)
+      want_evas_engine_software_gdi="yes"
       want_evas_engine_software_ddraw="yes"
       want_evas_engine_direct3d="yes"
       want_evas_engine_software_16_ddraw="yes"
@@ -18059,14 +18089,6 @@ _ACEOF
 fi
 
 
-MODULE_ARCH="$host_os-$host_cpu-$release"
-
-
-cat >>confdefs.h <<_ACEOF
-#define MODULE_ARCH "$MODULE_ARCH"
-_ACEOF
-
-
 
 
 if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
@@ -18341,9 +18363,111 @@ else
 fi
 
 
+#######################################
+## CACHE SERVER (CSERVE / CS)
+want_evas_cserve="yes"
+{ echo "$as_me:$LINENO: checking whether to build shared cache server and support" >&5
+echo $ECHO_N "checking whether to build shared cache server and support... $ECHO_C" >&6; }
+# Check whether --enable-evas-cserve was given.
+if test "${enable_evas_cserve+set}" = set; then
+  enableval=$enable_evas_cserve;  want_evas_cserve="$enableval"
+
+fi
+
+{ echo "$as_me:$LINENO: result: $want_evas_cserve" >&5
+echo "${ECHO_T}$want_evas_cserve" >&6; }
+
+if test "x${want_evas_cserve}" = "xyes" ; then
+   { echo "$as_me:$LINENO: checking whether shm_open() is present" >&5
+echo $ECHO_N "checking whether shm_open() is present... $ECHO_C" >&6; }
+   LIBS_save=${LIBS}
+   LIBS="$LIBS -lrt"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <fcntl.h>
+
+int
+main ()
+{
+
+int fd;
+fd = shm_open("/", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
+shm_unlink("/");
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext &&
+       $as_test_x conftest$ac_exeext; then
+  want_evas_cserve="yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	want_evas_cserve="no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+   LIBS=${LIBS_save}
+   { echo "$as_me:$LINENO: result: $want_evas_cserve" >&5
+echo "${ECHO_T}$want_evas_cserve" >&6; }
+fi
+
+ if test "x$want_evas_cserve" = "xyes"; then
+  EVAS_CSERVE_TRUE=
+  EVAS_CSERVE_FALSE='#'
+else
+  EVAS_CSERVE_TRUE='#'
+  EVAS_CSERVE_FALSE=
+fi
+
+if test "x$want_evas_cserve" = "xyes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define EVAS_CSERVE 1
+_ACEOF
+
+fi
+
 ##################################################################
 #fribidi support - OPTIONAL!
 
+have_fribidi="no"
+# Check whether --enable-fribidi was given.
+if test "${enable_fribidi+set}" = set; then
+  enableval=$enable_fribidi;  want_fribidi=$enableval
+
+fi
+
+
+if test "x$want_fribidi" = "xyes" -o "x$want_fribidi" = "xauto" ; then
+  # Check if really available
+
 pkg_failed=no
 { echo "$as_me:$LINENO: checking for FRIBIDI" >&5
 echo $ECHO_N "checking for FRIBIDI... $ECHO_C" >&6; }
@@ -18404,161 +18528,39 @@ fi
 
 	{ echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6; }
-                HAS_BIDI=0
+
+      if test "x$want_fribidi" = "xyes" -a "x$use_strict" = "xyes" ; then
+        { { echo "$as_me:$LINENO: error: Fribidi not found (strict dependencies checking)" >&5
+echo "$as_me: error: Fribidi not found (strict dependencies checking)" >&2;}
+   { (exit 1); exit 1; }; }
+      fi
+
 elif test $pkg_failed = untried; then
-	HAS_BIDI=0
+
+      if test "x$want_fribidi" = "xyes" -a "x$use_strict" = "xyes" ; then
+        { { echo "$as_me:$LINENO: error: Fribidi not found (strict dependencies checking)" >&5
+echo "$as_me: error: Fribidi not found (strict dependencies checking)" >&2;}
+   { (exit 1); exit 1; }; }
+      fi
+
 else
 	FRIBIDI_CFLAGS=$pkg_cv_FRIBIDI_CFLAGS
 	FRIBIDI_LIBS=$pkg_cv_FRIBIDI_LIBS
         { echo "$as_me:$LINENO: result: yes" >&5
 echo "${ECHO_T}yes" >&6; }
-	:
-fi
 
-for ac_header in fribidi/fribidi.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  { echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+      have_fribidi="yes"
 
-	ac_header_compiler=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_FRIBIDI 1
 _ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
 
-  ac_header_preproc=no
-fi
 
-rm -f conftest.err conftest.$ac_ext
-{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    ( cat <<\_ASBOX
-## -------------------------------------------------------- ##
-## Report this to enlightenment-devel at lists.sourceforge.net ##
-## -------------------------------------------------------- ##
-_ASBOX
-     ) | sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-{ echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
 fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-
 fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
+if test "x$have_fribidi" = "xno"; then
+  HAS_BIDI=0
 fi
-
-done
-
 #####################################################################
 # Check evas strong dependencie
 
@@ -24662,6 +24664,216 @@ fi
 
 
 
+want_engine="${want_evas_engine_software_gdi}"
+have_evas_engine_software_gdi="no"
+
+# Check whether --enable-software-gdi was given.
+if test "${enable_software_gdi+set}" = set; then
+  enableval=$enable_software_gdi; want_engine=${enableval}
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether to enable Software GDI rendering backend" >&5
+echo $ECHO_N "checking whether to enable Software GDI rendering backend... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: ${want_engine}" >&5
+echo "${ECHO_T}${want_engine}" >&6; }
+
+if test "x${want_engine}" = "xyes" -o "x${want_engine}" = "xauto"; then
+
+
+have_dep="no"
+evas_engine_software_gdi_cflags=""
+evas_engine_software_gdi_libs=""
+
+if test "${ac_cv_header_windows_h+set}" = set; then
+  { echo "$as_me:$LINENO: checking for windows.h" >&5
+echo $ECHO_N "checking for windows.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_windows_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_windows_h" >&5
+echo "${ECHO_T}$ac_cv_header_windows_h" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking windows.h usability" >&5
+echo $ECHO_N "checking windows.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <windows.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking windows.h presence" >&5
+echo $ECHO_N "checking windows.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <windows.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: windows.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: windows.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: windows.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: windows.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: windows.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: windows.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: windows.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: windows.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: windows.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: windows.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: windows.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: windows.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: windows.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: windows.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: windows.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: windows.h: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## -------------------------------------------------------- ##
+## Report this to enlightenment-devel at lists.sourceforge.net ##
+## -------------------------------------------------------- ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for windows.h" >&5
+echo $ECHO_N "checking for windows.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_windows_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_windows_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_windows_h" >&5
+echo "${ECHO_T}$ac_cv_header_windows_h" >&6; }
+
+fi
+if test $ac_cv_header_windows_h = yes; then
+
+    have_dep="yes"
+    evas_engine_software_gdi_libs="-lgdi32"
+
+
+fi
+
+
+
+
+
+
+if test "x${have_dep}" = "xyes" ; then
+  have_evas_engine_software_gdi="yes"
+else
+  have_evas_engine_software_gdi="no"
+fi
+
+
+fi
+
+if test "x${have_evas_engine_software_gdi}" = "xno" -a "x${want_engine}" = "xyes" -a "x${use_strict}" = "xyes" ; then
+   { { echo "$as_me:$LINENO: error: Software GDI dependencies not found (strict dependencies checking)" >&5
+echo "$as_me: error: Software GDI dependencies not found (strict dependencies checking)" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+{ echo "$as_me:$LINENO: checking whether Software GDI rendering backend will be built" >&5
+echo $ECHO_N "checking whether Software GDI rendering backend will be built... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: ${have_evas_engine_software_gdi}" >&5
+echo "${ECHO_T}${have_evas_engine_software_gdi}" >&6; }
+
+if test "x${have_evas_engine_software_gdi}" = "xyes" ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define BUILD_ENGINE_SOFTWARE_GDI 1
+_ACEOF
+
+fi
+
+ if test "x${have_evas_engine_software_gdi}" = "xyes"; then
+  BUILD_ENGINE_SOFTWARE_GDI_TRUE=
+  BUILD_ENGINE_SOFTWARE_GDI_FALSE='#'
+else
+  BUILD_ENGINE_SOFTWARE_GDI_TRUE='#'
+  BUILD_ENGINE_SOFTWARE_GDI_FALSE=
+fi
+
+
+
+
+
+
+
+
+
+
 want_engine="${want_evas_engine_software_ddraw}"
 have_evas_engine_software_ddraw="no"
 
@@ -28377,9 +28589,9 @@ fi
 
 	{ echo "$as_me:$LINENO: result: no" >&5
 echo "${ECHO_T}no" >&6; }
-                have_evas_font_loader_eet="yes"
+                have_evas_font_loader_eet="no"
 elif test $pkg_failed = untried; then
-	have_evas_font_loader_eet="yes"
+	have_evas_font_loader_eet="no"
 else
 	EET_CFLAGS=$pkg_cv_EET_CFLAGS
 	EET_LIBS=$pkg_cv_EET_LIBS
@@ -32536,10 +32748,14 @@ if test "${enable_doc+set}" = set; then
 
 else
   efl_enable_doc="yes"
-
 fi
 
 
+{ echo "$as_me:$LINENO: checking whether to build documentation" >&5
+echo $ECHO_N "checking whether to build documentation... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: ${efl_enable_doc}" >&5
+echo "${ECHO_T}${efl_enable_doc}" >&6; }
+
 if test "x${efl_enable_doc}" = "xyes" ; then
 
 
@@ -32590,11 +32806,11 @@ fi
        if test "x${efl_have_doxygen}" = "xno" ; then
           echo "WARNING:"
           echo "The doxygen program you specified:"
-          echo "$efl_doxygen"
+          echo "${efl_doxygen}"
           echo "was not found.  Please check the path and make sure "
           echo "the program exists and is executable."
-          { echo "$as_me:$LINENO: WARNING: Warning: no doxygen detected. Documentation will not be built" >&5
-echo "$as_me: WARNING: Warning: no doxygen detected. Documentation will not be built" >&2;}
+          { echo "$as_me:$LINENO: WARNING: no doxygen detected. Documentation will not be built" >&5
+echo "$as_me: WARNING: no doxygen detected. Documentation will not be built" >&2;}
        fi
 
 else
@@ -32638,18 +32854,17 @@ fi
 
        if test "x${efl_have_doxygen}" = "xno" ; then
           echo "WARNING:"
-          echo "The doxygen program was not found in your execute"
+          echo "The doxygen program was not found in your execute path."
           echo "You may have doxygen installed somewhere not covered by your path."
           echo ""
           echo "If this is the case make sure you have the packages installed, AND"
           echo "that the doxygen program is in your execute path (see your"
           echo "shell manual page on setting the \$PATH environment variable), OR"
           echo "alternatively, specify the program to use with --with-doxygen."
-          { echo "$as_me:$LINENO: WARNING: Warning: no doxygen detected. Documentation will not be built" >&5
-echo "$as_me: WARNING: Warning: no doxygen detected. Documentation will not be built" >&2;}
+          { echo "$as_me:$LINENO: WARNING: no doxygen detected. Documentation will not be built" >&5
+echo "$as_me: WARNING: no doxygen detected. Documentation will not be built" >&2;}
        fi
 
-
 fi
 
 fi
@@ -32687,7 +32902,7 @@ fi
 #####################################################################
 ## Output
 
-ac_config_files="$ac_config_files Makefile evas-directfb.pc evas-fb.pc evas-opengl-glew.pc evas-opengl-x11.pc evas-quartz.pc evas-software-buffer.pc evas-software-x11.pc evas-software-16-x11.pc evas-software-xcb.pc evas-xrender-x11.pc evas-xrender-xcb.pc evas-software-ddraw.pc evas-software-16-ddraw.pc evas-direct3d.pc evas-software-16-wince.pc evas-software-sdl.pc evas.pc doc/evas.dox doc/Makefile src/Makefile src/lib/Makefile src/lib/canvas/Makefile src/lib/data/Makefile src/lib/file/Makefile src/lib/imaging/Makefile src/lib/cache/Makefile src/lib/engines/Makefile src/lib/engines/common/Makefile src/lib/engines/common/evas_op_add/Makefile src/lib/engines/common/evas_op_blend/Makefile src/lib/engines/common/evas_op_copy/Makefile src/lib/engines/common/evas_op_mask/Makefile src/lib/engines/common/evas_op_mul/Makefile src/lib/engines/common/evas_op_sub/Makefile src/lib/engines/common_16/Makefile src/modules/Makefile src/modules/engines/Makefile src/modules/engines/software_generic/Makefile src/modules/engines/software_ddraw/Makefile src/modules/engines/direct3d/Makefile src/modules/engines/software_16_wince/Makefile src/modules/engines/software_x11/Makefile src/modules/engines/fb/Makefile src/modules/engines/buffer/Makefile src/modules/engines/software_win32_gdi/Makefile src/modules/engines/directfb/Makefile src/modules/engines/gl_common/Makefile src/modules/engines/gl_glew/Makefile src/modules/engines/gl_x11/Makefile src/modules/engines/quartz/Makefile src/modules/engines/xrender_x11/Makefile src/modules/engines/software_sdl/Makefile src/modules/engines/software_16/Makefile src/modules/engines/software_16_x11/Makefile src/modules/engines/software_16_ddraw/Makefile src/modules/engines/software_16_sdl/Makefile src/modules/loaders/Makefile src/modules/loaders/edb/Makefile src/modules/loaders/eet/Makefile src/modules/loaders/gif/Makefile src/modules/loaders/jpeg/Makefile src/modules/loaders/png/Makefile src/modules/loaders/tiff/Makefile src/modules/loaders/xpm/Makefile src/modules/loaders/svg/Makefile src/modules/loaders/pmaps/Makefile src/modules/savers/Makefile src/modules/savers/edb/Makefile src/modules/savers/eet/Makefile src/modules/savers/jpeg/Makefile src/modules/savers/png/Makefile src/modules/savers/tiff/Makefile src/lib/include/Makefile README evas.spec"
+ac_config_files="$ac_config_files Makefile evas-directfb.pc evas-fb.pc evas-opengl-glew.pc evas-opengl-x11.pc evas-quartz.pc evas-software-buffer.pc evas-software-x11.pc evas-software-16-x11.pc evas-software-xcb.pc evas-xrender-x11.pc evas-xrender-xcb.pc evas-software-gdi.pc evas-software-ddraw.pc evas-software-16-ddraw.pc evas-direct3d.pc evas-software-16-wince.pc evas-software-sdl.pc evas.pc doc/evas.dox doc/Makefile src/Makefile src/bin/Makefile src/lib/Makefile src/lib/canvas/Makefile src/lib/data/Makefile src/lib/file/Makefile src/lib/imaging/Makefile src/lib/cache/Makefile src/lib/cserve/Makefile src/lib/engines/Makefile src/lib/engines/common/Makefile src/lib/engines/common/evas_op_add/Makefile src/lib/engines/common/evas_op_blend/Makefile src/lib/engines/common/evas_op_copy/Makefile src/lib/engines/common/evas_op_mask/Makefile src/lib/engines/common/evas_op_mul/Makefile src/lib/engines/common/evas_op_sub/Makefile src/lib/engines/common_16/Makefile src/modules/Makefile src/modules/engines/Makefile src/modules/engines/software_generic/Makefile src/modules/engines/software_gdi/Makefile src/modules/engines/software_ddraw/Makefile src/modules/engines/direct3d/Makefile src/modules/engines/software_16_wince/Makefile src/modules/engines/software_x11/Makefile src/modules/engines/fb/Makefile src/modules/engines/buffer/Makefile src/modules/engines/directfb/Makefile src/modules/engines/gl_common/Makefile src/modules/engines/gl_glew/Makefile src/modules/engines/gl_x11/Makefile src/modules/engines/quartz/Makefile src/modules/engines/xrender_x11/Makefile src/modules/engines/software_sdl/Makefile src/modules/engines/software_16/Makefile src/modules/engines/software_16_x11/Makefile src/modules/engines/software_16_ddraw/Makefile src/modules/engines/software_16_sdl/Makefile src/modules/loaders/Makefile src/modules/loaders/edb/Makefile src/modules/loaders/eet/Makefile src/modules/loaders/gif/Makefile src/modules/loaders/jpeg/Makefile src/modules/loaders/png/Makefile src/modules/loaders/tiff/Makefile src/modules/loaders/xpm/Makefile src/modules/loaders/svg/Makefile src/modules/loaders/pmaps/Makefile src/modules/savers/Makefile src/modules/savers/edb/Makefile src/modules/savers/eet/Makefile src/modules/savers/jpeg/Makefile src/modules/savers/png/Makefile src/modules/savers/tiff/Makefile src/lib/include/Makefile README evas.spec"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -32813,6 +33028,13 @@ echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
 Usually this means the macro was only invoked conditionally." >&2;}
    { (exit 1); exit 1; }; }
 fi
+if test -z "${EVAS_CSERVE_TRUE}" && test -z "${EVAS_CSERVE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"EVAS_CSERVE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"EVAS_CSERVE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
 if test -z "${BUILD_ENGINE_BUFFER_TRUE}" && test -z "${BUILD_ENGINE_BUFFER_FALSE}"; then
   { { echo "$as_me:$LINENO: error: conditional \"BUILD_ENGINE_BUFFER\" was never defined.
 Usually this means the macro was only invoked conditionally." >&5
@@ -32855,6 +33077,13 @@ echo "$as_me: error: conditional \"BUILD_ENGINE_XRENDER_XCB\" was never defined.
 Usually this means the macro was only invoked conditionally." >&2;}
    { (exit 1); exit 1; }; }
 fi
+if test -z "${BUILD_ENGINE_SOFTWARE_GDI_TRUE}" && test -z "${BUILD_ENGINE_SOFTWARE_GDI_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"BUILD_ENGINE_SOFTWARE_GDI\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_ENGINE_SOFTWARE_GDI\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
 if test -z "${BUILD_ENGINE_SOFTWARE_DDRAW_TRUE}" && test -z "${BUILD_ENGINE_SOFTWARE_DDRAW_FALSE}"; then
   { { echo "$as_me:$LINENO: error: conditional \"BUILD_ENGINE_SOFTWARE_DDRAW\" was never defined.
 Usually this means the macro was only invoked conditionally." >&5
@@ -33323,7 +33552,7 @@ exec 6>&1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by evas $as_me 0.9.9.060, which was
+This file was extended by evas $as_me 0.9.9.061, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -33376,7 +33605,7 @@ Report bugs to <bug-autoconf at gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-evas config.status 0.9.9.060
+evas config.status 0.9.9.061
 configured by $0, generated by GNU Autoconf 2.61,
   with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
@@ -33941,6 +34170,7 @@ do
     "evas-software-xcb.pc") CONFIG_FILES="$CONFIG_FILES evas-software-xcb.pc" ;;
     "evas-xrender-x11.pc") CONFIG_FILES="$CONFIG_FILES evas-xrender-x11.pc" ;;
     "evas-xrender-xcb.pc") CONFIG_FILES="$CONFIG_FILES evas-xrender-xcb.pc" ;;
+    "evas-software-gdi.pc") CONFIG_FILES="$CONFIG_FILES evas-software-gdi.pc" ;;
     "evas-software-ddraw.pc") CONFIG_FILES="$CONFIG_FILES evas-software-ddraw.pc" ;;
     "evas-software-16-ddraw.pc") CONFIG_FILES="$CONFIG_FILES evas-software-16-ddraw.pc" ;;
     "evas-direct3d.pc") CONFIG_FILES="$CONFIG_FILES evas-direct3d.pc" ;;
@@ -33950,12 +34180,14 @@ do
     "doc/evas.dox") CONFIG_FILES="$CONFIG_FILES doc/evas.dox" ;;
     "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
     "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+    "src/bin/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/Makefile" ;;
     "src/lib/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/Makefile" ;;
     "src/lib/canvas/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/canvas/Makefile" ;;
     "src/lib/data/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/data/Makefile" ;;
     "src/lib/file/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/file/Makefile" ;;
     "src/lib/imaging/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/imaging/Makefile" ;;
     "src/lib/cache/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/cache/Makefile" ;;
+    "src/lib/cserve/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/cserve/Makefile" ;;
     "src/lib/engines/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/engines/Makefile" ;;
     "src/lib/engines/common/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/engines/common/Makefile" ;;
     "src/lib/engines/common/evas_op_add/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/engines/common/evas_op_add/Makefile" ;;
@@ -33968,13 +34200,13 @@ do
     "src/modules/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/Makefile" ;;
     "src/modules/engines/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/engines/Makefile" ;;
     "src/modules/engines/software_generic/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/engines/software_generic/Makefile" ;;
+    "src/modules/engines/software_gdi/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/engines/software_gdi/Makefile" ;;
     "src/modules/engines/software_ddraw/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/engines/software_ddraw/Makefile" ;;
     "src/modules/engines/direct3d/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/engines/direct3d/Makefile" ;;
     "src/modules/engines/software_16_wince/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/engines/software_16_wince/Makefile" ;;
     "src/modules/engines/software_x11/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/engines/software_x11/Makefile" ;;
     "src/modules/engines/fb/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/engines/fb/Makefile" ;;
     "src/modules/engines/buffer/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/engines/buffer/Makefile" ;;
-    "src/modules/engines/software_win32_gdi/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/engines/software_win32_gdi/Makefile" ;;
     "src/modules/engines/directfb/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/engines/directfb/Makefile" ;;
     "src/modules/engines/gl_common/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/engines/gl_common/Makefile" ;;
     "src/modules/engines/gl_glew/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/engines/gl_glew/Makefile" ;;
@@ -34222,15 +34454,17 @@ OTOOL64!$OTOOL64$ac_delim
 CXXCPP!$CXXCPP$ac_delim
 version_info!$version_info$ac_delim
 release_info!$release_info$ac_delim
+MODULE_ARCH!$MODULE_ARCH$ac_delim
 RC!$RC$ac_delim
 ALLOCA!$ALLOCA$ac_delim
-MODULE_ARCH!$MODULE_ARCH$ac_delim
 PKG_CONFIG!$PKG_CONFIG$ac_delim
 EVIL_CFLAGS!$EVIL_CFLAGS$ac_delim
 EVIL_LIBS!$EVIL_LIBS$ac_delim
 WIN32_CPPFLAGS!$WIN32_CPPFLAGS$ac_delim
 WIN32_CFLAGS!$WIN32_CFLAGS$ac_delim
 lt_enable_auto_import!$lt_enable_auto_import$ac_delim
+EVAS_CSERVE_TRUE!$EVAS_CSERVE_TRUE$ac_delim
+EVAS_CSERVE_FALSE!$EVAS_CSERVE_FALSE$ac_delim
 FRIBIDI_CFLAGS!$FRIBIDI_CFLAGS$ac_delim
 FRIBIDI_LIBS!$FRIBIDI_LIBS$ac_delim
 EINA_CFLAGS!$EINA_CFLAGS$ac_delim
@@ -34273,6 +34507,10 @@ evas_engine_xrender_xcb_cflags!$evas_engine_xrender_xcb_cflags$ac_delim
 evas_engine_xrender_xcb_libs!$evas_engine_xrender_xcb_libs$ac_delim
 BUILD_ENGINE_XRENDER_XCB_TRUE!$BUILD_ENGINE_XRENDER_XCB_TRUE$ac_delim
 BUILD_ENGINE_XRENDER_XCB_FALSE!$BUILD_ENGINE_XRENDER_XCB_FALSE$ac_delim
+evas_engine_software_gdi_cflags!$evas_engine_software_gdi_cflags$ac_delim
+evas_engine_software_gdi_libs!$evas_engine_software_gdi_libs$ac_delim
+BUILD_ENGINE_SOFTWARE_GDI_TRUE!$BUILD_ENGINE_SOFTWARE_GDI_TRUE$ac_delim
+BUILD_ENGINE_SOFTWARE_GDI_FALSE!$BUILD_ENGINE_SOFTWARE_GDI_FALSE$ac_delim
 evas_engine_software_ddraw_cflags!$evas_engine_software_ddraw_cflags$ac_delim
 evas_engine_software_ddraw_libs!$evas_engine_software_ddraw_libs$ac_delim
 BUILD_ENGINE_SOFTWARE_DDRAW_TRUE!$BUILD_ENGINE_SOFTWARE_DDRAW_TRUE$ac_delim
@@ -34296,12 +34534,6 @@ evas_engine_software_sdl_libs!$evas_engine_software_sdl_libs$ac_delim
 BUILD_ENGINE_SOFTWARE_SDL_TRUE!$BUILD_ENGINE_SOFTWARE_SDL_TRUE$ac_delim
 BUILD_ENGINE_SOFTWARE_SDL_FALSE!$BUILD_ENGINE_SOFTWARE_SDL_FALSE$ac_delim
 evas_engine_fb_cflags!$evas_engine_fb_cflags$ac_delim
-evas_engine_fb_libs!$evas_engine_fb_libs$ac_delim
-BUILD_ENGINE_FB_TRUE!$BUILD_ENGINE_FB_TRUE$ac_delim
-BUILD_ENGINE_FB_FALSE!$BUILD_ENGINE_FB_FALSE$ac_delim
-DIRECTFB_CFLAGS!$DIRECTFB_CFLAGS$ac_delim
-DIRECTFB_LIBS!$DIRECTFB_LIBS$ac_delim
-evas_engine_directfb_cflags!$evas_engine_directfb_cflags$ac_delim
 _ACEOF
 
   if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
@@ -34343,6 +34575,12 @@ _ACEOF
 ac_delim='%!_!# '
 for ac_last_try in false false false false false :; do
   cat >conf$$subs.sed <<_ACEOF
+evas_engine_fb_libs!$evas_engine_fb_libs$ac_delim
+BUILD_ENGINE_FB_TRUE!$BUILD_ENGINE_FB_TRUE$ac_delim
+BUILD_ENGINE_FB_FALSE!$BUILD_ENGINE_FB_FALSE$ac_delim
+DIRECTFB_CFLAGS!$DIRECTFB_CFLAGS$ac_delim
+DIRECTFB_LIBS!$DIRECTFB_LIBS$ac_delim
+evas_engine_directfb_cflags!$evas_engine_directfb_cflags$ac_delim
 evas_engine_directfb_libs!$evas_engine_directfb_libs$ac_delim
 BUILD_ENGINE_DIRECTFB_TRUE!$BUILD_ENGINE_DIRECTFB_TRUE$ac_delim
 BUILD_ENGINE_DIRECTFB_FALSE!$BUILD_ENGINE_DIRECTFB_FALSE$ac_delim
@@ -34424,7 +34662,7 @@ LIBOBJS!$LIBOBJS$ac_delim
 LTLIBOBJS!$LTLIBOBJS$ac_delim
 _ACEOF
 
-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 79; then
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 85; then
     break
   elif $ac_last_try; then
     { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
@@ -36011,6 +36249,7 @@ echo "  Software X11...............: $have_evas_engine_software_x11 (XCB: $have_
 echo "  XRender X11................: $have_evas_engine_xrender_x11 (XCB: $have_evas_engine_xrender_xcb)"
 echo "  OpenGL X11.................: $have_evas_engine_gl_x11"
 #echo "  Cairo X11..................: $have_evas_engine_cairo_x11"
+echo "  Software GDI...............: $have_evas_engine_software_gdi"
 echo "  Software DirectDraw........: $have_evas_engine_software_ddraw"
 echo "  Direct3d...................: $have_evas_engine_direct3d"
 echo "  Quartz.....................: $have_evas_engine_quartz"
@@ -36044,6 +36283,7 @@ echo "  EET.....................: $have_evas_font_loader_eet"
 echo
 echo "Font Searching Systems:"
 echo "  Fontconfig..............: $have_fontconfig"
+echo "  Fribidi.................: $have_fribidi"
 # FIXME: add non freetype2 font engine support
 # FIXME: make freetype2 optional
 echo
@@ -36054,11 +36294,13 @@ echo "  SSE.....................: $build_cpu_sse"
 echo "  ALTIVEC.................: $build_cpu_altivec"
 echo "  NEON....................: $build_cpu_neon"
 echo "  Thread Support..........: $build_pthreads"
+echo "Features:"
 echo "  MAGIC_DEBUG.............: $want_evas_magic_debug"
+echo "  Cache Server............: $want_evas_cserve"
 echo
-echo "Threaded Pipe Rendering...: $build_pipe_render"
-echo "Async Events..............: $build_async_events"
-echo "Async Image Preload.......: $build_async_preload"
+echo "  Threaded Pipe Rendering.: $build_pipe_render"
+echo "  Async Events............: $build_async_events"
+echo "  Async Image Preload.....: $build_async_preload"
 echo
 echo "ARGB Software Engine Options:"
 echo "  Sampling Scaler.........: $scaler_sample"
diff --git a/configure.ac b/configure.ac
index 2259c5e..9c6e4e7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,9 +1,10 @@
 # get rid of that stupid cache mechanism
 rm -f config.cache
 
-AC_INIT(evas, 0.9.9.060, enlightenment-devel at lists.sourceforge.net)
-AC_PREREQ(2.52)
-AC_CONFIG_SRCDIR(configure.ac)
+AC_INIT([evas], [0.9.9.061], [enlightenment-devel at lists.sourceforge.net])
+AC_PREREQ([2.52])
+AC_CONFIG_SRCDIR([configure.ac])
+AC_CONFIG_MACRO_DIR([m4])
 AC_CANONICAL_BUILD
 AC_CANONICAL_HOST
 AC_ISC_POSIX
@@ -28,12 +29,24 @@ VMIN=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $2);}'`
 VMIC=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $3);}'`
 SNAP=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $4);}'`
 version_info=`expr $VMAJ + $VMIN`":$VMIC:$VMIN"
-release="ver-pre-01"
-release_info="-release $release"
 AC_SUBST(version_info)
+
+release="ver-svn-02"
+case "$host_os" in
+   mingw32ce* | cegcc*)
+      MODULE_ARCH="$host_os-$host_cpu"
+      ;;
+   *)
+      release_info="-release $release"
+      MODULE_ARCH="$host_os-$host_cpu-$release"
+      ;;
+esac
 AC_SUBST(release_info)
+AC_SUBST(MODULE_ARCH)
+AC_DEFINE_UNQUOTED(MODULE_ARCH, "$MODULE_ARCH", "Module architecture")
 
 want_fontconfig="auto"
+want_fribidi="auto"
 
 want_evas_engine_buffer="yes"
 want_evas_engine_software_x11="no"
@@ -42,6 +55,7 @@ want_evas_engine_gl_x11="no"
 want_evas_engine_cairo_x11="no"
 want_evas_engine_software_xcb="no"
 want_evas_engine_xrender_xcb="no"
+want_evas_engine_software_gdi="no"
 want_evas_engine_software_ddraw="no"
 want_evas_engine_direct3d="no"
 want_evas_engine_quartz="no"
@@ -76,6 +90,7 @@ case "$host_os" in
       want_evas_image_loader_tiff="no"
       ;;
    mingw*)
+      want_evas_engine_software_gdi="yes"
       want_evas_engine_software_ddraw="yes"
       want_evas_engine_direct3d="yes"
       want_evas_engine_software_16_ddraw="yes"
@@ -96,10 +111,6 @@ esac
 LT_PROG_RC
 AC_FUNC_ALLOCA
 
-MODULE_ARCH="$host_os-$host_cpu-$release"
-AC_SUBST(MODULE_ARCH)
-AC_DEFINE_UNQUOTED(MODULE_ARCH, "$MODULE_ARCH", "Module architecture")
-
 PKG_PROG_PKG_CONFIG
 
 dnl wierd debian etch bug where pthread_barrier doesn't work without adding
@@ -135,15 +146,80 @@ dnl when used, that option makes configure script fails when
 dnl a requirement is selected, but not met.
 AC_ARG_ENABLE(strict,
   AC_HELP_STRING(
-    [enable strict mode]),
+    [--enable-strict],
+    [enable strict checking mode. [[default==disabled]]]),
   [use_strict="yes"],
   [use_strict="no"]
 )
 
+#######################################
+## CACHE SERVER (CSERVE / CS)
+want_evas_cserve="yes"
+AC_MSG_CHECKING(whether to build shared cache server and support)
+AC_ARG_ENABLE(evas-cserve,
+  AC_HELP_STRING(
+    [--disable-evas-cserve],
+    [disable shared cache server support. [[default=enabled]]]
+  ),
+  [ want_evas_cserve="$enableval" ]
+)
+AC_MSG_RESULT($want_evas_cserve)
+
+if test "x${want_evas_cserve}" = "xyes" ; then
+   AC_MSG_CHECKING([whether shm_open() is present])
+   LIBS_save=${LIBS}
+   LIBS="$LIBS -lrt"
+   AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM(
+         [[
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <fcntl.h>
+         ]],
+         [[
+int fd;
+fd = shm_open("/", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
+shm_unlink("/");
+         ]])],
+      [want_evas_cserve="yes"],
+      [want_evas_cserve="no"])
+   LIBS=${LIBS_save}
+   AC_MSG_RESULT([$want_evas_cserve])
+fi
+
+AM_CONDITIONAL(EVAS_CSERVE, test "x$want_evas_cserve" = "xyes")
+if test "x$want_evas_cserve" = "xyes"; then
+  AC_DEFINE(EVAS_CSERVE, 1, [Shared caceh server.])
+fi
+
 ##################################################################
 #fribidi support - OPTIONAL!
-PKG_CHECK_MODULES([FRIBIDI], [fribidi], ,HAS_BIDI=0)
-AC_CHECK_HEADERS(fribidi/fribidi.h)
+
+have_fribidi="no"
+AC_ARG_ENABLE(fribidi,
+  AC_HELP_STRING(
+    [--disable-fribidi],
+    [disable bidirectional text support. [[default=enabled]]]
+  ),
+  [ want_fribidi=$enableval ]
+)
+
+if test "x$want_fribidi" = "xyes" -o "x$want_fribidi" = "xauto" ; then
+  # Check if really available
+  PKG_CHECK_MODULES(FRIBIDI, fribidi,
+    [
+      have_fribidi="yes"
+      AC_DEFINE(HAVE_FRIBIDI, 1, [have fribidi support])
+    ],
+    [
+      if test "x$want_fribidi" = "xyes" -a "x$use_strict" = "xyes" ; then
+        AC_MSG_ERROR([Fribidi not found (strict dependencies checking)])
+      fi
+    ])
+fi
+if test "x$have_fribidi" = "xno"; then
+  HAS_BIDI=0
+fi
 #####################################################################
 # Check evas strong dependencie
 
@@ -246,6 +322,8 @@ EVAS_CHECK_ENGINE([software-xcb], [${want_evas_engine_software_xcb}], [no], [Sof
 
 EVAS_CHECK_ENGINE([xrender-xcb], [${want_evas_engine_xrender_xcb}], [no], [XRender XCB])
 
+EVAS_CHECK_ENGINE([software-gdi], [${want_evas_engine_software_gdi}], [no], [Software GDI])
+
 EVAS_CHECK_ENGINE([software-ddraw], [${want_evas_engine_software_ddraw}], [no], [Software DirectDraw])
 
 EVAS_CHECK_ENGINE([direct3d], [${want_evas_engine_direct3d}], [no], [Direct3D])
@@ -1030,6 +1108,7 @@ evas-software-16-x11.pc
 evas-software-xcb.pc
 evas-xrender-x11.pc
 evas-xrender-xcb.pc
+evas-software-gdi.pc
 evas-software-ddraw.pc
 evas-software-16-ddraw.pc
 evas-direct3d.pc
@@ -1039,12 +1118,14 @@ evas.pc
 doc/evas.dox
 doc/Makefile
 src/Makefile
+src/bin/Makefile
 src/lib/Makefile
 src/lib/canvas/Makefile
 src/lib/data/Makefile
 src/lib/file/Makefile
 src/lib/imaging/Makefile
 src/lib/cache/Makefile
+src/lib/cserve/Makefile
 src/lib/engines/Makefile
 src/lib/engines/common/Makefile
 src/lib/engines/common/evas_op_add/Makefile
@@ -1057,13 +1138,13 @@ src/lib/engines/common_16/Makefile
 src/modules/Makefile
 src/modules/engines/Makefile
 src/modules/engines/software_generic/Makefile
+src/modules/engines/software_gdi/Makefile
 src/modules/engines/software_ddraw/Makefile
 src/modules/engines/direct3d/Makefile
 src/modules/engines/software_16_wince/Makefile
 src/modules/engines/software_x11/Makefile
 src/modules/engines/fb/Makefile
 src/modules/engines/buffer/Makefile
-src/modules/engines/software_win32_gdi/Makefile
 src/modules/engines/directfb/Makefile
 src/modules/engines/gl_common/Makefile
 src/modules/engines/gl_glew/Makefile
@@ -1122,6 +1203,7 @@ echo "  Software X11...............: $have_evas_engine_software_x11 (XCB: $have_
 echo "  XRender X11................: $have_evas_engine_xrender_x11 (XCB: $have_evas_engine_xrender_xcb)"
 echo "  OpenGL X11.................: $have_evas_engine_gl_x11"
 #echo "  Cairo X11..................: $have_evas_engine_cairo_x11"
+echo "  Software GDI...............: $have_evas_engine_software_gdi"
 echo "  Software DirectDraw........: $have_evas_engine_software_ddraw"
 echo "  Direct3d...................: $have_evas_engine_direct3d"
 echo "  Quartz.....................: $have_evas_engine_quartz"
@@ -1155,6 +1237,7 @@ echo "  EET.....................: $have_evas_font_loader_eet"
 echo
 echo "Font Searching Systems:"
 echo "  Fontconfig..............: $have_fontconfig"
+echo "  Fribidi.................: $have_fribidi"
 # FIXME: add non freetype2 font engine support
 # FIXME: make freetype2 optional
 echo
@@ -1165,11 +1248,13 @@ echo "  SSE.....................: $build_cpu_sse"
 echo "  ALTIVEC.................: $build_cpu_altivec"
 echo "  NEON....................: $build_cpu_neon"
 echo "  Thread Support..........: $build_pthreads"
+echo "Features:"
 echo "  MAGIC_DEBUG.............: $want_evas_magic_debug"
+echo "  Cache Server............: $want_evas_cserve"
 echo
-echo "Threaded Pipe Rendering...: $build_pipe_render"
-echo "Async Events..............: $build_async_events"
-echo "Async Image Preload.......: $build_async_preload"
+echo "  Threaded Pipe Rendering.: $build_pipe_render"
+echo "  Async Events............: $build_async_events"
+echo "  Async Image Preload.....: $build_async_preload"
 echo
 echo "ARGB Software Engine Options:"
 echo "  Sampling Scaler.........: $scaler_sample"
diff --git a/depcomp b/depcomp
index 04701da..e5f9736 100755
--- a/depcomp
+++ b/depcomp
@@ -1,9 +1,10 @@
 #! /bin/sh
 # depcomp - compile a program generating dependencies as side-effects
 
-scriptversion=2005-07-09.11
+scriptversion=2007-03-29.01
 
-# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software
+# Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -91,7 +92,20 @@ gcc3)
 ## gcc 3 implements dependency tracking that does exactly what
 ## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
 ## it if -MD -MP comes after the -MF stuff.  Hmm.
-  "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
   stat=$?
   if test $stat -eq 0; then :
   else
@@ -201,34 +215,39 @@ aix)
   # current directory.  Also, the AIX compiler puts `$object:' at the
   # start of each line; $object doesn't have directory information.
   # Version 6 uses the directory in both cases.
-  stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
-  tmpdepfile="$stripped.u"
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
   if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
     "$@" -Wc,-M
   else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
     "$@" -M
   fi
   stat=$?
 
-  if test -f "$tmpdepfile"; then :
-  else
-    stripped=`echo "$stripped" | sed 's,^.*/,,'`
-    tmpdepfile="$stripped.u"
-  fi
-
   if test $stat -eq 0; then :
   else
-    rm -f "$tmpdepfile"
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
     exit $stat
   fi
 
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
   if test -f "$tmpdepfile"; then
-    outname="$stripped.o"
     # Each line is of the form `foo.o: dependent.h'.
     # Do two passes, one to just change these to
     # `$object: dependent.h' and one to simply `dependent.h:'.
-    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
-    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+    # That's a tab and a space in the [].
+    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
   else
     # The sourcefile does not contain any dependencies, so just
     # store a dummy comment line, to avoid errors with the Makefile
@@ -276,6 +295,46 @@ icc)
   rm -f "$tmpdepfile"
   ;;
 
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add `dependent.h:' lines.
+    sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile"
+  else
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
 tru64)
    # The Tru64 compiler uses -MD to generate dependencies as a side
    # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
@@ -288,13 +347,13 @@ tru64)
 
    if test "$libtool" = yes; then
       # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mecanism is used in libtool 1.4 series to
+      # static library.  This mechanism is used in libtool 1.4 series to
       # handle both shared and static libraries in a single compilation.
       # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
       #
       # With libtool 1.5 this exception was removed, and libtool now
       # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in in $dir.libs/$base.o.d and
+      # compilations output dependencies in $dir.libs/$base.o.d and
       # in $dir$base.o.d.  We have to check for both files, because
       # one of the two compilations can be disabled.  We should prefer
       # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
diff --git a/doc/Makefile.in b/doc/Makefile.in
index d424e8e..1ef6fb1 100644
--- a/doc/Makefile.in
+++ b/doc/Makefile.in
@@ -204,6 +204,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/evas-software-gdi.pc.in b/evas-software-gdi.pc.in
new file mode 100644
index 0000000..097c4e1
--- /dev/null
+++ b/evas-software-gdi.pc.in
@@ -0,0 +1,3 @@
+Name: evas-software-gdi
+Description: Evas software GDI engine
+Version: @VERSION@
diff --git a/evas.spec b/evas.spec
index 647bf93..2db7c17 100644
--- a/evas.spec
+++ b/evas.spec
@@ -77,7 +77,7 @@
 
 Summary: Multi-platform Canvas Library
 Name: evas
-Version: 0.9.9.060
+Version: 0.9.9.061
 Release: 0.%(date '+%Y%m%d')
 License: BSD
 Group: System Environment/Libraries
diff --git a/install-sh b/install-sh
index 4d4a951..a5897de 100755
--- a/install-sh
+++ b/install-sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2005-05-14.22
+scriptversion=2006-12-25.00
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -39,38 +39,68 @@ scriptversion=2005-05-14.22
 # when there is no Makefile.
 #
 # This script is compatible with the BSD install script, but was written
-# from scratch.  It can only install one file at a time, a restriction
-# shared with many OS's install programs.
+# from scratch.
+
+nl='
+'
+IFS=" ""	$nl"
 
 # set DOITPROG to echo to test this script
 
 # Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
 
-# put in absolute paths if you don't have them in your path; or use env. vars.
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
 
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
 
-chmodcmd="$chmodprog 0755"
-chowncmd=
 chgrpcmd=
-stripcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
 rmcmd="$rmprog -f"
-mvcmd="$mvprog"
+stripcmd=
+
 src=
 dst=
 dir_arg=
-dstarg=
+dst_arg=
+
+copy_on_change=false
 no_target_directory=
 
-usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
    or: $0 [OPTION]... SRCFILES... DIRECTORY
    or: $0 [OPTION]... -t DIRECTORY SRCFILES...
    or: $0 [OPTION]... -d DIRECTORIES...
@@ -80,81 +110,86 @@ In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
 In the 4th, create DIRECTORIES.
 
 Options:
--c         (ignored)
--d         create directories instead of installing files.
--g GROUP   $chgrpprog installed files to GROUP.
--m MODE    $chmodprog installed files to MODE.
--o USER    $chownprog installed files to USER.
--s         $stripprog installed files.
--t DIRECTORY  install into DIRECTORY.
--T         report an error if DSTFILE is a directory.
---help     display this help and exit.
---version  display version info and exit.
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
 
 Environment variables override the default commands:
-  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
 "
 
-while test -n "$1"; do
+while test $# -ne 0; do
   case $1 in
-    -c) shift
-        continue;;
+    -c) ;;
+
+    -C) copy_on_change=true;;
 
-    -d) dir_arg=true
-        shift
-        continue;;
+    -d) dir_arg=true;;
 
     -g) chgrpcmd="$chgrpprog $2"
-        shift
-        shift
-        continue;;
+	shift;;
 
     --help) echo "$usage"; exit $?;;
 
-    -m) chmodcmd="$chmodprog $2"
-        shift
-        shift
-        continue;;
+    -m) mode=$2
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
 
     -o) chowncmd="$chownprog $2"
-        shift
-        shift
-        continue;;
+	shift;;
 
-    -s) stripcmd=$stripprog
-        shift
-        continue;;
+    -s) stripcmd=$stripprog;;
 
-    -t) dstarg=$2
-	shift
-	shift
-	continue;;
+    -t) dst_arg=$2
+	shift;;
 
-    -T) no_target_directory=true
-	shift
-	continue;;
+    -T) no_target_directory=true;;
 
     --version) echo "$0 $scriptversion"; exit $?;;
 
-    *)  # When -d is used, all remaining arguments are directories to create.
-	# When -t is used, the destination is already specified.
-	test -n "$dir_arg$dstarg" && break
-        # Otherwise, the last argument is the destination.  Remove it from $@.
-	for arg
-	do
-          if test -n "$dstarg"; then
-	    # $@ is not empty: it contains at least $arg.
-	    set fnord "$@" "$dstarg"
-	    shift # fnord
-	  fi
-	  shift # arg
-	  dstarg=$arg
-	done
+    --)	shift
 	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
   esac
+  shift
 done
 
-if test -z "$1"; then
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+  done
+fi
+
+if test $# -eq 0; then
   if test -z "$dir_arg"; then
     echo "$0: no input file specified." >&2
     exit 1
@@ -164,24 +199,47 @@ if test -z "$1"; then
   exit 0
 fi
 
+if test -z "$dir_arg"; then
+  trap '(exit $?); exit' 1 2 13 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
 for src
 do
   # Protect names starting with `-'.
   case $src in
-    -*) src=./$src ;;
+    -*) src=./$src;;
   esac
 
   if test -n "$dir_arg"; then
     dst=$src
-    src=
-
-    if test -d "$dst"; then
-      mkdircmd=:
-      chmodcmd=
-    else
-      mkdircmd=$mkdirprog
-    fi
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
   else
+
     # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
     # might cause directories to be created, which would be especially bad
     # if $src (and thus $dsttmp) contains '*'.
@@ -190,71 +248,199 @@ do
       exit 1
     fi
 
-    if test -z "$dstarg"; then
+    if test -z "$dst_arg"; then
       echo "$0: no destination specified." >&2
       exit 1
     fi
 
-    dst=$dstarg
+    dst=$dst_arg
     # Protect names starting with `-'.
     case $dst in
-      -*) dst=./$dst ;;
+      -*) dst=./$dst;;
     esac
 
     # If destination is a directory, append the input filename; won't work
     # if double slashes aren't ignored.
     if test -d "$dst"; then
       if test -n "$no_target_directory"; then
-	echo "$0: $dstarg: Is a directory" >&2
+	echo "$0: $dst_arg: Is a directory" >&2
 	exit 1
       fi
-      dst=$dst/`basename "$src"`
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
     fi
   fi
 
-  # This sed command emulates the dirname command.
-  dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
+
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
 
-  # Make sure that the destination directory exists.
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
 
-  # Skip lots of stat calls in the usual case.
-  if test ! -d "$dstdir"; then
-    defaultIFS='
-	 '
-    IFS="${IFS-$defaultIFS}"
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
 
-    oIFS=$IFS
-    # Some sh's can't handle IFS=/ for some reason.
-    IFS='%'
-    set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
-    shift
-    IFS=$oIFS
+      case $dstdir in
+	/*) prefix='/';;
+	-*) prefix='./';;
+	*)  prefix='';;
+      esac
 
-    pathcomp=
+      eval "$initialize_posix_glob"
 
-    while test $# -ne 0 ; do
-      pathcomp=$pathcomp$1
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
       shift
-      if test ! -d "$pathcomp"; then
-        $mkdirprog "$pathcomp"
-	# mkdir can fail with a `File exist' error in case several
-	# install-sh are creating the directory concurrently.  This
-	# is OK.
-	test -d "$pathcomp" || exit
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test -z "$d" && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
       fi
-      pathcomp=$pathcomp/
-    done
+    fi
   fi
 
   if test -n "$dir_arg"; then
-    $doit $mkdircmd "$dst" \
-      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
-      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
-      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
-      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
-
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
   else
-    dstfile=`basename "$dst"`
 
     # Make a couple of temp file names in the proper directory.
     dsttmp=$dstdir/_inst.$$_
@@ -262,10 +448,9 @@ do
 
     # Trap to clean up those temp files at exit.
     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-    trap '(exit $?); exit' 1 2 13 15
 
     # Copy the file name to the temp name.
-    $doit $cpprog "$src" "$dsttmp" &&
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
 
     # and set any options; do chmod last to preserve setuid bits.
     #
@@ -273,48 +458,59 @@ do
     # ignore errors from any of these, just make sure not to ignore
     # errors from the above "$doit $cpprog $src $dsttmp" command.
     #
-    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
-      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
-      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
-      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
-
-    # Now rename the file to the real destination.
-    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
-      || {
-	   # The rename failed, perhaps because mv can't rename something else
-	   # to itself, or perhaps because mv is so ancient that it does not
-	   # support -f.
-
-	   # Now remove or move aside any old file at destination location.
-	   # We try this two ways since rm can't unlink itself on some
-	   # systems and the destination file might be busy for other
-	   # reasons.  In this case, the final cleanup might fail but the new
-	   # file should still install successfully.
-	   {
-	     if test -f "$dstdir/$dstfile"; then
-	       $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
-	       || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
-	       || {
-		 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
-		 (exit 1); exit 1
-	       }
-	     else
-	       :
-	     fi
-	   } &&
-
-	   # Now rename the file to the real destination.
-	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
-	 }
-    }
-  fi || { (exit 1); exit 1; }
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
+
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
 done
 
-# The final little trick to "correctly" pass the exit status to the exit trap.
-{
-  (exit 0); exit 0
-}
-
 # Local variables:
 # eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
diff --git a/m4/efl_doxygen.m4 b/m4/efl_doxygen.m4
index 0c1452f..dd6bc3e 100644
--- a/m4/efl_doxygen.m4
+++ b/m4/efl_doxygen.m4
@@ -25,13 +25,15 @@ AC_ARG_ENABLE([doc],
        efl_enable_doc="no"
     fi
    ],
-   [efl_enable_doc="yes"]
-)
+   [efl_enable_doc="yes"])
+
+AC_MSG_CHECKING([whether to build documentation])
+AC_MSG_RESULT([${efl_enable_doc}])
 
 if test "x${efl_enable_doc}" = "xyes" ; then
 
 dnl
-dnl Specify the full file name, with path
+dnl Specify the file name, without path
 dnl
 
    efl_doxygen="doxygen"
@@ -51,10 +53,10 @@ dnl
        if test "x${efl_have_doxygen}" = "xno" ; then
           echo "WARNING:"
           echo "The doxygen program you specified:"
-          echo "$efl_doxygen"
+          echo "${efl_doxygen}"
           echo "was not found.  Please check the path and make sure "
           echo "the program exists and is executable."
-          AC_MSG_WARN([Warning: no doxygen detected. Documentation will not be built])
+          AC_MSG_WARN([no doxygen detected. Documentation will not be built])
        fi
       ],
       [AC_CHECK_PROG([efl_have_doxygen],
@@ -63,17 +65,16 @@ dnl
           [no])
        if test "x${efl_have_doxygen}" = "xno" ; then
           echo "WARNING:"
-          echo "The doxygen program was not found in your execute"
+          echo "The doxygen program was not found in your execute path."
           echo "You may have doxygen installed somewhere not covered by your path."
           echo ""
           echo "If this is the case make sure you have the packages installed, AND"
           echo "that the doxygen program is in your execute path (see your"
           echo "shell manual page on setting the \$PATH environment variable), OR"
           echo "alternatively, specify the program to use with --with-doxygen."
-          AC_MSG_WARN([Warning: no doxygen detected. Documentation will not be built])
+          AC_MSG_WARN([no doxygen detected. Documentation will not be built])
        fi
-      ]
-   )
+      ])
 fi
 
 dnl
@@ -88,9 +89,9 @@ fi
 AM_CONDITIONAL(EFL_BUILD_DOC, test "x${efl_enable_doc}" = "xyes")
 
 if test "x${efl_enable_doc}" = "xyes" ; then
-  ifelse([$1], , :, [$1])
+  m4_default([$1], [:])
 else
-  ifelse([$2], , :, [$2])
+  m4_default([$2], [:])
 fi
 
 ])
diff --git a/m4/evas_check_engine.m4 b/m4/evas_check_engine.m4
index 367c281..2ad18f8 100644
--- a/m4/evas_check_engine.m4
+++ b/m4/evas_check_engine.m4
@@ -232,6 +232,33 @@ fi
 
 ])
 
+dnl use: EVAS_CHECK_ENGINE_DEP_SOFTWARE_GDI(engine, simple[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+
+AC_DEFUN([EVAS_CHECK_ENGINE_DEP_SOFTWARE_GDI],
+[
+
+have_dep="no"
+evas_engine_[]$1[]_cflags=""
+evas_engine_[]$1[]_libs=""
+
+AC_CHECK_HEADER([windows.h],
+   [
+    have_dep="yes"
+    evas_engine_[]$1[]_libs="-lgdi32"
+   ]
+)
+
+AC_SUBST([evas_engine_$1_cflags])
+AC_SUBST([evas_engine_$1_libs])
+
+if test "x${have_dep}" = "xyes" ; then
+  m4_default([$3], [:])
+else
+  m4_default([$4], [:])
+fi
+
+])
+
 dnl use: EVAS_CHECK_ENGINE_DEP_SOFTWARE_DDRAW(engine, simple[, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
 
 AC_DEFUN([EVAS_CHECK_ENGINE_DEP_SOFTWARE_DDRAW],
diff --git a/m4/evas_check_loader.m4 b/m4/evas_check_loader.m4
index c011294..e30d2c0 100644
--- a/m4/evas_check_loader.m4
+++ b/m4/evas_check_loader.m4
@@ -331,7 +331,7 @@ AC_MSG_CHECKING([whether to enable Eet font loader])
 AC_MSG_RESULT([${want_loader}])
 
 if test "x$want_loader" = "xyes" -o "x$want_loader" = "xauto"; then
-    PKG_CHECK_MODULES([EET], [eet >= 1.0.1], [have_evas_font_loader_eet="yes"], [have_evas_font_loader_eet="yes"])
+    PKG_CHECK_MODULES([EET], [eet >= 1.0.1], [have_evas_font_loader_eet="yes"], [have_evas_font_loader_eet="no"])
 fi
 
 if test "x${have_evas_font_loader_eet}" = "xno" -a "x$want_loader" = "xyes" -a "x$use_strict" = "xyes" ; then
diff --git a/missing b/missing
index 894e786..1c8ff70 100755
--- a/missing
+++ b/missing
@@ -1,9 +1,9 @@
 #! /bin/sh
 # Common stub for a few missing GNU programs while installing.
 
-scriptversion=2005-06-08.21
+scriptversion=2006-05-10.23
 
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006
 #   Free Software Foundation, Inc.
 # Originally by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
 
@@ -33,6 +33,8 @@ if test $# -eq 0; then
 fi
 
 run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
 
 # In the cases where this matters, `missing' is being run in the
 # srcdir already.
@@ -44,7 +46,7 @@ fi
 
 msg="missing on your system"
 
-case "$1" in
+case $1 in
 --run)
   # Try to run requested program, and just exit if it succeeds.
   run=
@@ -77,6 +79,7 @@ Supported PROGRAM values:
   aclocal      touch file \`aclocal.m4'
   autoconf     touch file \`configure'
   autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
   automake     touch all \`Makefile.in' files
   bison        create \`y.tab.[ch]', if possible, from existing .[ch]
   flex         create \`lex.yy.c', if possible, from existing .c
@@ -106,7 +109,7 @@ esac
 # Now exit if we have it, but it failed.  Also exit now if we
 # don't have it and --version was passed (most likely to detect
 # the program).
-case "$1" in
+case $1 in
   lex|yacc)
     # Not GNU programs, they don't have --version.
     ;;
@@ -135,7 +138,7 @@ esac
 
 # If it does not exist, or fails to run (possibly an outdated version),
 # try to emulate it.
-case "$1" in
+case $1 in
   aclocal*)
     echo 1>&2 "\
 WARNING: \`$1' is $msg.  You should only need it if
@@ -164,7 +167,7 @@ WARNING: \`$1' is $msg.  You should only need it if
     test -z "$files" && files="config.h"
     touch_files=
     for f in $files; do
-      case "$f" in
+      case $f in
       *:*) touch_files="$touch_files "`echo "$f" |
 				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
       *) touch_files="$touch_files $f.in";;
@@ -192,8 +195,8 @@ WARNING: \`$1' is needed, but is $msg.
          You can get \`$1' as part of \`Autoconf' from any GNU
          archive site."
 
-    file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
-    test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
     if test -f "$file"; then
 	touch $file
     else
@@ -214,25 +217,25 @@ WARNING: \`$1' $msg.  You should only need it if
          in order for those modifications to take effect.  You can get
          \`Bison' from any GNU archive site."
     rm -f y.tab.c y.tab.h
-    if [ $# -ne 1 ]; then
+    if test $# -ne 1; then
         eval LASTARG="\${$#}"
-	case "$LASTARG" in
+	case $LASTARG in
 	*.y)
 	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-	    if [ -f "$SRCFILE" ]; then
+	    if test -f "$SRCFILE"; then
 	         cp "$SRCFILE" y.tab.c
 	    fi
 	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-	    if [ -f "$SRCFILE" ]; then
+	    if test -f "$SRCFILE"; then
 	         cp "$SRCFILE" y.tab.h
 	    fi
 	  ;;
 	esac
     fi
-    if [ ! -f y.tab.h ]; then
+    if test ! -f y.tab.h; then
 	echo >y.tab.h
     fi
-    if [ ! -f y.tab.c ]; then
+    if test ! -f y.tab.c; then
 	echo 'main() { return 0; }' >y.tab.c
     fi
     ;;
@@ -244,18 +247,18 @@ WARNING: \`$1' is $msg.  You should only need it if
          in order for those modifications to take effect.  You can get
          \`Flex' from any GNU archive site."
     rm -f lex.yy.c
-    if [ $# -ne 1 ]; then
+    if test $# -ne 1; then
         eval LASTARG="\${$#}"
-	case "$LASTARG" in
+	case $LASTARG in
 	*.l)
 	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-	    if [ -f "$SRCFILE" ]; then
+	    if test -f "$SRCFILE"; then
 	         cp "$SRCFILE" lex.yy.c
 	    fi
 	  ;;
 	esac
     fi
-    if [ ! -f lex.yy.c ]; then
+    if test ! -f lex.yy.c; then
 	echo 'main() { return 0; }' >lex.yy.c
     fi
     ;;
@@ -267,11 +270,9 @@ WARNING: \`$1' is $msg.  You should only need it if
 	 \`Help2man' package in order for those modifications to take
 	 effect.  You can get \`Help2man' from any GNU archive site."
 
-    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
-    if test -z "$file"; then
-	file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
-    fi
-    if [ -f "$file" ]; then
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
 	touch $file
     else
 	test -z "$file" || exec >$file
@@ -289,11 +290,17 @@ WARNING: \`$1' is $msg.  You should only need it if
          DU, IRIX).  You might want to install the \`Texinfo' package or
          the \`GNU make' package.  Grab either from any GNU archive site."
     # The file to touch is that specified with -o ...
-    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
     if test -z "$file"; then
       # ... or it is the one specified with @setfilename ...
       infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
+      file=`sed -n '
+	/^@setfilename/{
+	  s/.* \([^ ]*\) *$/\1/
+	  p
+	  q
+	}' $infile`
       # ... or it is derived from the source name (dir/f.texi becomes f.info)
       test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
     fi
@@ -317,13 +324,13 @@ WARNING: \`$1' is $msg.  You should only need it if
     fi
     firstarg="$1"
     if shift; then
-	case "$firstarg" in
+	case $firstarg in
 	*o*)
 	    firstarg=`echo "$firstarg" | sed s/o//`
 	    tar "$firstarg" "$@" && exit 0
 	    ;;
 	esac
-	case "$firstarg" in
+	case $firstarg in
 	*h*)
 	    firstarg=`echo "$firstarg" | sed s/h//`
 	    tar "$firstarg" "$@" && exit 0
diff --git a/src/Makefile.am b/src/Makefile.am
index 75f3f70..1f52208 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,3 +1,3 @@
 MAINTAINERCLEANFILES = Makefile.in
 
-SUBDIRS = lib modules
+SUBDIRS = lib bin modules
diff --git a/src/Makefile.in b/src/Makefile.in
index 373c401..b9f7a0c 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -215,6 +215,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
@@ -278,7 +280,7 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 version_info = @version_info@
 MAINTAINERCLEANFILES = Makefile.in
-SUBDIRS = lib modules
+SUBDIRS = lib bin modules
 all: all-recursive
 
 .SUFFIXES:
diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am
new file mode 100644
index 0000000..7325c14
--- /dev/null
+++ b/src/bin/Makefile.am
@@ -0,0 +1,38 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+if EVAS_CSERVE
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/lib/cserve \
+-DPACKAGE_BIN_DIR=\"$(bindir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+ at EINA_CFLAGS@ \
+ at FREETYPE_CFLAGS@ \
+ at FRIBIDI_CFLAGS@ \
+ at EET_CFLAGS@ \
+ at FONTCONFIG_CFLAGS@ \
+ at pthread_cflags@
+
+AM_CFLAGS = @WIN32_CFLAGS@
+
+bin_PROGRAMS = evas_cserve evas_cserve_tool
+
+evas_cserve_SOURCES = \
+evas_cserve_main.c
+
+evas_cserve_LDADD = \
+$(top_builddir)/src/lib/libevas.la
+
+evas_cserve_tool_LDFLAGS =
+
+evas_cserve_tool_SOURCES = \
+evas_cserve_tool.c
+
+evas_cserve_tool_LDADD = \
+$(top_builddir)/src/lib/libevas.la
+
+endif
diff --git a/src/modules/engines/gl_common/Makefile.in b/src/bin/Makefile.in
similarity index 78%
copy from src/modules/engines/gl_common/Makefile.in
copy to src/bin/Makefile.in
index 119f52d..90229b0 100644
--- a/src/modules/engines/gl_common/Makefile.in
+++ b/src/bin/Makefile.in
@@ -32,7 +32,9 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-subdir = src/modules/engines/gl_common
+ at EVAS_CSERVE_TRUE@bin_PROGRAMS = evas_cserve$(EXEEXT) \
+ at EVAS_CSERVE_TRUE@	evas_cserve_tool$(EXEEXT)
+subdir = src/bin
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
@@ -48,24 +50,23 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
-LTLIBRARIES = $(noinst_LTLIBRARIES)
- at BUILD_ENGINE_GL_COMMON_TRUE@libevas_engine_gl_common_la_DEPENDENCIES = $(top_builddir)/src/lib/libevas.la
-am__libevas_engine_gl_common_la_SOURCES_DIST = evas_gl_context.c \
-	evas_gl_font.c evas_gl_gradient.c evas_gl_image.c \
-	evas_gl_line.c evas_gl_misc.c evas_gl_polygon.c \
-	evas_gl_rectangle.c evas_gl_texture.c
- at BUILD_ENGINE_GL_COMMON_TRUE@am_libevas_engine_gl_common_la_OBJECTS =  \
- at BUILD_ENGINE_GL_COMMON_TRUE@	evas_gl_context.lo \
- at BUILD_ENGINE_GL_COMMON_TRUE@	evas_gl_font.lo \
- at BUILD_ENGINE_GL_COMMON_TRUE@	evas_gl_gradient.lo \
- at BUILD_ENGINE_GL_COMMON_TRUE@	evas_gl_image.lo evas_gl_line.lo \
- at BUILD_ENGINE_GL_COMMON_TRUE@	evas_gl_misc.lo \
- at BUILD_ENGINE_GL_COMMON_TRUE@	evas_gl_polygon.lo \
- at BUILD_ENGINE_GL_COMMON_TRUE@	evas_gl_rectangle.lo \
- at BUILD_ENGINE_GL_COMMON_TRUE@	evas_gl_texture.lo
-libevas_engine_gl_common_la_OBJECTS =  \
-	$(am_libevas_engine_gl_common_la_OBJECTS)
- at BUILD_ENGINE_GL_COMMON_TRUE@am_libevas_engine_gl_common_la_rpath =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am__evas_cserve_SOURCES_DIST = evas_cserve_main.c
+ at EVAS_CSERVE_TRUE@am_evas_cserve_OBJECTS = evas_cserve_main.$(OBJEXT)
+evas_cserve_OBJECTS = $(am_evas_cserve_OBJECTS)
+ at EVAS_CSERVE_TRUE@evas_cserve_DEPENDENCIES =  \
+ at EVAS_CSERVE_TRUE@	$(top_builddir)/src/lib/libevas.la
+am__evas_cserve_tool_SOURCES_DIST = evas_cserve_tool.c
+ at EVAS_CSERVE_TRUE@am_evas_cserve_tool_OBJECTS =  \
+ at EVAS_CSERVE_TRUE@	evas_cserve_tool.$(OBJEXT)
+evas_cserve_tool_OBJECTS = $(am_evas_cserve_tool_OBJECTS)
+ at EVAS_CSERVE_TRUE@evas_cserve_tool_DEPENDENCIES =  \
+ at EVAS_CSERVE_TRUE@	$(top_builddir)/src/lib/libevas.la
+evas_cserve_tool_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(evas_cserve_tool_LDFLAGS) $(LDFLAGS) -o $@
 DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
@@ -78,8 +79,9 @@ CCLD = $(CC)
 LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
 	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
 	$(LDFLAGS) -o $@
-SOURCES = $(libevas_engine_gl_common_la_SOURCES)
-DIST_SOURCES = $(am__libevas_engine_gl_common_la_SOURCES_DIST)
+SOURCES = $(evas_cserve_SOURCES) $(evas_cserve_tool_SOURCES)
+DIST_SOURCES = $(am__evas_cserve_SOURCES_DIST) \
+	$(am__evas_cserve_tool_SOURCES_DIST)
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -236,6 +238,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
@@ -299,29 +303,34 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 version_info = @version_info@
 MAINTAINERCLEANFILES = Makefile.in
-AM_CPPFLAGS = \
--I. \
--I$(top_srcdir)/src/lib \
--I$(top_srcdir)/src/lib/include \
- at FREETYPE_CFLAGS@ \
- at EINA_CFLAGS@
-
- at BUILD_ENGINE_GL_COMMON_TRUE@noinst_LTLIBRARIES = libevas_engine_gl_common.la
- at BUILD_ENGINE_GL_COMMON_TRUE@libevas_engine_gl_common_la_SOURCES = \
- at BUILD_ENGINE_GL_COMMON_TRUE@evas_gl_context.c \
- at BUILD_ENGINE_GL_COMMON_TRUE@evas_gl_font.c \
- at BUILD_ENGINE_GL_COMMON_TRUE@evas_gl_gradient.c \
- at BUILD_ENGINE_GL_COMMON_TRUE@evas_gl_image.c \
- at BUILD_ENGINE_GL_COMMON_TRUE@evas_gl_line.c \
- at BUILD_ENGINE_GL_COMMON_TRUE@evas_gl_misc.c \
- at BUILD_ENGINE_GL_COMMON_TRUE@evas_gl_polygon.c \
- at BUILD_ENGINE_GL_COMMON_TRUE@evas_gl_rectangle.c \
- at BUILD_ENGINE_GL_COMMON_TRUE@evas_gl_texture.c
-
- at BUILD_ENGINE_GL_COMMON_TRUE@libevas_engine_gl_common_la_LIBADD = @EINA_LIBS@ @evas_engine_gl_common_libs@ $(top_builddir)/src/lib/libevas.la
-EXTRA_DIST = \
-evas_gl_private.h \
-evas_gl_common.h
+ at EVAS_CSERVE_TRUE@AM_CPPFLAGS = \
+ at EVAS_CSERVE_TRUE@-I. \
+ at EVAS_CSERVE_TRUE@-I$(top_srcdir)/src/lib \
+ at EVAS_CSERVE_TRUE@-I$(top_srcdir)/src/lib/include \
+ at EVAS_CSERVE_TRUE@-I$(top_srcdir)/src/lib/cserve \
+ at EVAS_CSERVE_TRUE@-DPACKAGE_BIN_DIR=\"$(bindir)\" \
+ at EVAS_CSERVE_TRUE@-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+ at EVAS_CSERVE_TRUE@-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+ at EVAS_CSERVE_TRUE@@EINA_CFLAGS@ \
+ at EVAS_CSERVE_TRUE@@FREETYPE_CFLAGS@ \
+ at EVAS_CSERVE_TRUE@@FRIBIDI_CFLAGS@ \
+ at EVAS_CSERVE_TRUE@@EET_CFLAGS@ \
+ at EVAS_CSERVE_TRUE@@FONTCONFIG_CFLAGS@ \
+ at EVAS_CSERVE_TRUE@@pthread_cflags@
+
+ at EVAS_CSERVE_TRUE@AM_CFLAGS = @WIN32_CFLAGS@
+ at EVAS_CSERVE_TRUE@evas_cserve_SOURCES = \
+ at EVAS_CSERVE_TRUE@evas_cserve_main.c
+
+ at EVAS_CSERVE_TRUE@evas_cserve_LDADD = \
+ at EVAS_CSERVE_TRUE@$(top_builddir)/src/lib/libevas.la
+
+ at EVAS_CSERVE_TRUE@evas_cserve_tool_LDFLAGS = 
+ at EVAS_CSERVE_TRUE@evas_cserve_tool_SOURCES = \
+ at EVAS_CSERVE_TRUE@evas_cserve_tool.c
+
+ at EVAS_CSERVE_TRUE@evas_cserve_tool_LDADD = \
+ at EVAS_CSERVE_TRUE@$(top_builddir)/src/lib/libevas.la
 
 all: all-am
 
@@ -336,9 +345,9 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/modules/engines/gl_common/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/bin/Makefile'; \
 	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  src/modules/engines/gl_common/Makefile
+	  $(AUTOMAKE) --gnu  src/bin/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -356,17 +365,40 @@ $(top_srcdir)/configure:  $(am__configure_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  if test -f $$p \
+	     || test -f $$p1 \
+	  ; then \
+	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+	   echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+	   $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+	  else :; fi; \
+	done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
+	done
 
-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"; \
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; for p in $$list; do \
+	  f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+	  echo " rm -f $$p $$f"; \
+	  rm -f $$p $$f ; \
 	done
-libevas_engine_gl_common.la: $(libevas_engine_gl_common_la_OBJECTS) $(libevas_engine_gl_common_la_DEPENDENCIES) 
-	$(LINK) $(am_libevas_engine_gl_common_la_rpath) $(libevas_engine_gl_common_la_OBJECTS) $(libevas_engine_gl_common_la_LIBADD) $(LIBS)
+evas_cserve$(EXEEXT): $(evas_cserve_OBJECTS) $(evas_cserve_DEPENDENCIES) 
+	@rm -f evas_cserve$(EXEEXT)
+	$(LINK) $(evas_cserve_OBJECTS) $(evas_cserve_LDADD) $(LIBS)
+evas_cserve_tool$(EXEEXT): $(evas_cserve_tool_OBJECTS) $(evas_cserve_tool_DEPENDENCIES) 
+	@rm -f evas_cserve_tool$(EXEEXT)
+	$(evas_cserve_tool_LINK) $(evas_cserve_tool_OBJECTS) $(evas_cserve_tool_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -374,15 +406,8 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_gl_context.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_gl_font.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_gl_gradient.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_gl_image.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_gl_line.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_gl_misc.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_gl_polygon.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_gl_rectangle.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_gl_texture.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_cserve_main.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_cserve_tool.Po at am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -486,8 +511,11 @@ distdir: $(DISTFILES)
 	done
 check-am: all-am
 check: check-am
-all-am: Makefile $(LTLIBRARIES)
+all-am: Makefile $(PROGRAMS)
 installdirs:
+	for dir in "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
 install: install-am
 install-exec: install-exec-am
 install-data: install-data-am
@@ -515,8 +543,7 @@ maintainer-clean-generic:
 	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
 clean: clean-am
 
-clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
-	mostlyclean-am
+clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
 
 distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
@@ -538,7 +565,7 @@ install-data-am:
 
 install-dvi: install-dvi-am
 
-install-exec-am:
+install-exec-am: install-binPROGRAMS
 
 install-html: install-html-am
 
@@ -570,22 +597,23 @@ ps: ps-am
 
 ps-am:
 
-uninstall-am:
+uninstall-am: uninstall-binPROGRAMS
 
 .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 \
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+	clean-generic clean-libtool ctags distclean distclean-compile \
+	distclean-generic distclean-libtool distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-binPROGRAMS 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
+	pdf pdf-am ps ps-am tags uninstall uninstall-am \
+	uninstall-binPROGRAMS
 
 # 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.
diff --git a/src/bin/evas_cserve_main.c b/src/bin/evas_cserve_main.c
new file mode 100644
index 0000000..5d46ae1
--- /dev/null
+++ b/src/bin/evas_cserve_main.c
@@ -0,0 +1,1407 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <signal.h>
+#include <sys/time.h>
+#include <time.h>
+#ifdef _WIN32
+# include <windows.h>
+#endif
+
+#include "Evas.h"
+#include "evas_cs.h"
+
+#define D(fmt, args...) EINA_ERROR_PDBG(fmt, ##args)
+
+// fixme:'s
+// 
+// preload - make it work (both)
+
+// 
+// pants!
+
+typedef struct _Img Img;
+typedef struct _Lopt Lopt;
+
+struct _Lopt
+{
+   int    scale_down_by; // if > 1 then use this
+   double dpi; // if > 0.0 use this
+   int    w, h; // if > 0 use this
+};
+
+struct _Img
+{
+   Image_Entry ie;
+   int ref;
+   int dref;
+   int usage;
+   Mem *mem;
+   const char *key;
+   time_t cached;
+   struct {
+      const char *file;
+      const char *key;
+      time_t modtime;
+      time_t last_stat;
+   } file;
+   struct {
+      int load1saved, load2saved;
+      double load1, load2;
+   } stats;
+   Lopt load_opts;
+   struct {
+      int w, h;
+      void *data;
+      Eina_Bool alpha : 1;
+   } image;
+   int incache;
+   Eina_Bool dead : 1;
+   Eina_Bool active : 1;
+   Eina_Bool useless : 1;
+};
+
+// config
+static int stat_res_interval = 2;
+
+static time_t t_now = 0;
+
+static int server_id = 0;
+
+static Evas_Cache_Image *cache = NULL;
+
+static Eina_Hash *active_images = NULL;
+static Eina_List *cache_images = NULL;
+static int cache_usage = 0;
+static int cache_max_usage = 1 * 1024;
+static int cache_max_adjust = 0;
+static int cache_item_timeout = -1;
+static int cache_item_timeout_check = -1;
+static Mem *stat_mem = NULL;
+
+static int stat_mem_num = 0;
+static Eina_List *stat_mems = NULL;
+
+static void cache_clean(void);
+
+#ifndef _WIN32
+static double
+get_time(void)
+{
+   struct timeval      timev;
+   
+   gettimeofday(&timev, NULL);
+   return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000);
+}
+#else
+static double
+get_time(void)
+{
+   return (double)GetTickCount()/1000.0;
+}
+#endif
+
+static int mem_total = 0;
+static int mem_free = 0;
+static int mem_buffers = 0;
+static int mem_cached = 0;
+
+static void
+meminfo_check(void)
+{
+   FILE *f;
+   char buf[1024];
+   int v;
+   
+   f = fopen("/proc/meminfo", "r");
+   if (!f) return;
+   if (!fgets(buf, sizeof(buf), f)) goto done;
+   v = 0; if (sscanf(buf, "%*s %i %*s", &v) != 1) goto done;
+   mem_total = v;
+   if (!fgets(buf, sizeof(buf), f)) goto done;
+   v = 0; if (sscanf(buf, "%*s %i %*s", &v) != 1) goto done;
+   mem_free = v;
+   if (!fgets(buf, sizeof(buf), f)) goto done;
+   v = 0; if (sscanf(buf, "%*s %i %*s", &v) != 1) goto done;
+   mem_buffers = v;
+   if (!fgets(buf, sizeof(buf), f)) goto done;
+   v = 0; if (sscanf(buf, "%*s %i %*s", &v) != 1) goto done;
+   mem_cached = v;
+   done:
+   fclose(f);
+}
+
+static int stats_dirty = 0;
+static int saved_loads = 0;
+static double saved_load_time = 0;
+static double saved_load_lifetime = 0;
+
+static int saved_loaddatas = 0;
+static double saved_loaddata_time = 0;
+static double saved_loaddata_lifetime = 0;
+
+static int saved_memory = 0;
+static int saved_memory_peak = 0;
+static int alloced_memory = 0;
+static int alloced_memory_peak = 0;
+static int real_memory = 0;
+static int real_memory_peak = 0;
+
+static Eina_Bool
+stats_hash_image_cb(const Eina_Hash *hash __UNUSED__, 
+                   const void *key __UNUSED__,
+                   void *data, void *fdata __UNUSED__)
+{
+   Img *img = data;
+   
+   saved_load_time += img->stats.load1 * img->stats.load1saved;
+   saved_loaddata_time += img->stats.load2 * img->stats.load2saved;
+   if (img->ref > 1)
+     saved_memory += img->image.w * img->image.h * sizeof(DATA32) * (img->ref - 1);
+   if (img->mem)
+     {
+        alloced_memory += img->image.w * img->image.h * sizeof(DATA32);
+        real_memory += (((img->image.w * img->image.h * sizeof(DATA32)) + 4095) >> 12) << 12;
+     }
+   return 1;
+}
+
+static void
+stats_calc(void)
+{
+   Img *img;
+   Eina_List *l;
+   
+   if (!stats_dirty) return;
+   stats_dirty = 0;
+   saved_loads = 0;
+   saved_load_time = 0;
+   saved_loaddatas = 0;
+   saved_loaddata_time = 0;
+   saved_memory = 0;
+   alloced_memory = 0;
+   real_memory = 0;
+   
+   if (active_images)
+     eina_hash_foreach(active_images, stats_hash_image_cb, NULL);
+   EINA_LIST_FOREACH(cache_images, l, img)
+     {
+        saved_loads += img->stats.load1saved;
+        saved_load_time += img->stats.load1 * img->stats.load1saved;
+        saved_loaddatas += img->stats.load2saved;
+        saved_loaddata_time += img->stats.load2 * img->stats.load2saved;
+        if (img->mem)
+          {
+             alloced_memory += img->image.w * img->image.h * sizeof(DATA32);
+             real_memory += (((img->image.w * img->image.h * sizeof(DATA32)) + 4095) >> 12) << 12;
+          }
+     }
+   if (saved_memory > saved_memory_peak)
+     saved_memory_peak = saved_memory;
+   if (real_memory > real_memory_peak)
+     real_memory_peak = real_memory;
+   if (alloced_memory > alloced_memory_peak)
+     alloced_memory_peak = alloced_memory;
+}
+
+static void
+stats_update(void)
+{
+   stats_dirty = 1;
+}
+
+static void
+stats_lifetime_update(Img *img)
+{
+   saved_load_lifetime += img->stats.load1 * img->stats.load1saved;
+   saved_loaddata_lifetime += img->stats.load2 * img->stats.load2saved;
+}
+
+static void
+stat_clean(Mem *m)
+{
+   int *ints;
+   int size, pid, *ids, count, i;
+   
+   ints = (int *)m->data;
+   size = ints[0];
+   if (!evas_cserve_mem_resize(m, size)) return;
+   ints = (int *)m->data;
+   pid =  ints[1];
+   count =  (size - (2 * sizeof(int))) / sizeof(int);
+   ids = ints + 2;
+   for (i = 0; i < count; i++)
+     evas_cserve_mem_del(pid, ids[i]);
+}
+
+static int
+stat_init(Mem *m)
+{
+   int *ints;
+
+   ints = (int *)m->data;
+   
+   if (!evas_cserve_mem_resize(m, 2 * sizeof(int))) return 0;
+   ints[0] = 2 * sizeof(int);
+   ints[1] = getpid();
+   msync(m->data, 2 * sizeof(int), MS_SYNC | MS_INVALIDATE);
+   return 1;
+}
+
+static int
+stat_update(Mem *m)
+{
+   Eina_List *l;
+   Mem *m2;
+   int *ints, *ids, i;
+   
+   ints = (int *)m->data;
+   ints[0] = (2 * sizeof(int)) + (eina_list_count(stat_mems) * sizeof(int));
+   if (!evas_cserve_mem_resize(m, ints[0])) return 0;
+   ints = (int *)m->data;
+   ids = ints + 2;
+   i = 0;
+   EINA_LIST_FOREACH(stat_mems, l, m2)
+     {
+        ids[i] = m2->id;
+        i++;
+     }
+   msync(m->data, ints[0], MS_SYNC | MS_INVALIDATE);
+   return 1;
+}
+
+static Image_Entry *
+_img_alloc(void)
+{
+   Img *img;
+   
+   img = calloc(1, sizeof(Img));
+   return (Image_Entry *)img;
+}
+
+static void
+_img_dealloc(Image_Entry *ie)
+{
+   Img *img = (Img *)ie;
+   free(img);
+}
+
+static int
+_img_surface_alloc(Image_Entry *ie, int w, int h)
+{
+   Img *img = (Img *)ie;
+
+   img->mem = evas_cserve_mem_new(w * h * sizeof(DATA32), NULL);
+   if (!img->mem) return -1;
+   img->image.data = img->mem->data + img->mem->offset;
+   
+   stat_mems = eina_list_append(stat_mems, img->mem);
+   stat_update(stat_mem);
+   return 0;
+}
+
+static void
+_img_surface_delete(Image_Entry *ie)
+{
+   Img *img = (Img *)ie;
+
+   if (!img->mem) return;
+   
+   stat_mems = eina_list_remove(stat_mems, img->mem);
+   stat_update(stat_mem);
+   
+   evas_cserve_mem_free(img->mem);
+   img->mem = NULL;
+   img->image.data = NULL;
+}
+
+static DATA32 *
+_img_surface_pixels(Image_Entry *ie)
+{
+   Img *img = (Img *)ie;
+   
+   return img->image.data;
+}
+
+static int
+_img_load(Image_Entry *ie)
+{
+   return evas_common_load_rgba_image_module_from_file(ie);
+}
+
+static void
+_img_unload(Image_Entry *ie)
+{
+}
+
+static void
+_img_dirty_region(Image_Entry *ie, int x, int y, int w, int h)
+{
+}
+
+static int
+_img_dirty(Image_Entry *dst, const Image_Entry *src)
+{
+   return 0;
+}
+
+static int
+_img_size_set(Image_Entry *dst, const Image_Entry *src, int w, int h)
+{
+   return 0;
+}
+
+static int
+_img_copied_data(Image_Entry *ie, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   return 0;
+}
+
+static int
+_img_data(Image_Entry *ie, int w, int h, DATA32 *image_data, int alpha, int cspace)
+{
+   return 0;
+}
+
+static int
+_img_color_space(Image_Entry *ie, int cspace)
+{
+   return 0;
+}
+
+static int
+_img_load_data(Image_Entry *ie)
+{
+   return evas_common_load_rgba_image_data_from_file(ie);
+}
+
+static int
+_img_mem_size_get(Image_Entry *ie)
+{
+   return 1;
+}
+
+static void
+img_init(void)
+{
+   const Evas_Cache_Image_Func cache_funcs = 
+     {
+        _img_alloc,//Image_Entry *(*alloc)(void);
+          _img_dealloc,//void         (*dealloc)(Image_Entry *im);
+        /* The cache provide some helpers for surface manipulation. */
+          _img_surface_alloc,//int          (*surface_alloc)(Image_Entry *im, int w, int h);
+          _img_surface_delete,//void         (*surface_delete)(Image_Entry *im);
+          _img_surface_pixels,//DATA32      *(*surface_pixels)(Image_Entry *im);
+        /* The cache is doing the allocation and deallocation, you must just do the rest. */
+          _img_load,//int          (*constructor)(Image_Entry *im);
+          _img_unload,//void         (*destructor)(Image_Entry *im);
+          _img_dirty_region,//void         (*dirty_region)(Image_Entry *im, int x, int y, int w, int h);
+        /* Only called when references > 0. Need to provide a fresh copie of im. */
+        /* The destination surface does have a surface, but no allocated pixel data. */
+          _img_dirty,//int          (*dirty)(Image_Entry *dst, const Image_Entry *src);
+        /* Only called when references == 1. We will call drop on im'. */
+        /* The destination surface does not have any surface. */
+          _img_size_set,//int          (*size_set)(Image_Entry *dst, const Image_Entry *src, int w, int h);
+        /* The destination surface does not have any surface. */
+          _img_copied_data,//int          (*copied_data)(Image_Entry *dst, int w, int h, DATA32 *image_data, int alpha, int cspace);
+        /* The destination surface does not have any surface. */
+          _img_data,//int          (*data)(Image_Entry *dst, int w, int h, DATA32 *image_data, int alpha, int cspace);
+          _img_color_space,//int          (*color_space)(Image_Entry *dst, int cspace);
+        /* This function need to update im->w and im->h. */
+          _img_load_data,//int          (*load)(Image_Entry *im);
+          _img_mem_size_get,//int          (*mem_size_get)(Image_Entry *im);
+          NULL,//void         (*debug)(const char *context, Image_Entry *im);
+     };
+   
+   active_images = eina_hash_string_superfast_new(NULL);
+   cache = evas_cache_image_init(&cache_funcs);
+}
+
+static void
+img_shutdown(void)
+{
+   evas_cache_image_shutdown(cache);
+   cache = NULL;
+   // FIXME: shutdown properly
+}
+
+static Img *
+img_new(const char *file, const char *key, RGBA_Image_Loadopts *load_opts, const char *bufkey)
+{
+   Img *img;
+   struct stat st;
+   int ret;
+   Image_Entry *ie;
+   int err = 0;
+   double t;
+   
+   D("... stat %s\n", file);
+   ret = stat(file, &st);
+   if (ret < 0) return NULL;
+   D("... load header\n");
+   t = get_time();
+   ie = evas_cache_image_request(cache, file, key, load_opts, &err);
+   t = get_time() - t;
+   D("... header done\n");
+   if (!ie) return NULL;
+   D("... ie->cache = %p\n", ie->cache);
+   img = (Img *)ie;
+   img->stats.load1 = t;
+   img->key = eina_stringshare_add(bufkey);
+   img->file.modtime = st.st_mtime;
+   img->file.last_stat = t_now;
+   img->file.file = eina_stringshare_add(file);
+   if (key) img->file.key = eina_stringshare_add(key);
+   img->load_opts.scale_down_by = load_opts->scale_down_by;
+   img->load_opts.dpi = load_opts->dpi;
+   img->load_opts.w = load_opts->w;
+   img->load_opts.h = load_opts->h;
+   img->image.w = ie->w;
+   img->image.h = ie->h;
+   img->image.alpha = ie->flags.alpha;
+   img->ref = 1;
+   img->active = 1;
+   img->usage = sizeof(Img) + strlen(img->key) + 1 + 
+     strlen(img->file.file) + 1;
+   if (img->file.key) img->usage += strlen(img->file.key) + 1;
+   eina_hash_direct_add(active_images, img->key, img);
+   return img;
+}
+
+static void
+img_loaddata(Img *img)
+{
+   double t;
+   
+   if (img->mem) return;
+   t = get_time();
+   evas_cache_image_load_data((Image_Entry *)img);
+   t = get_time() - t;
+   img->stats.load2 = t;
+   if (img->image.data)
+     msync(img->image.data, img->image.w * img->image.h * sizeof(DATA32), MS_SYNC | MS_INVALIDATE);
+   if (!img->active) cache_usage -= img->usage;
+   img->usage += 
+     (4096 * (((img->image.w * img->image.h * sizeof(DATA32)) + 4095) / 4096)) +
+     sizeof(Mem);
+   if (!img->active) cache_usage += img->usage;
+   cache_clean();
+}
+
+static void
+img_free(Img *img)
+{
+   if (img->incache > 0)
+     {
+        printf("EEEEEEEEEEEEEEEEK!\n");
+        printf("EEEEEEEEEEEEEEEEK! %p '%s' still in cache\n", 
+               img, img->file.file);
+        printf("EEEEEEEEEEEEEEEEK!\n");
+        return;
+     }
+   stats_lifetime_update(img);
+   stats_update();
+   eina_stringshare_del(img->key);
+   eina_stringshare_del(img->file.file);
+   eina_stringshare_del(img->file.key);
+   evas_cache_image_drop((Image_Entry *)img);
+}
+
+static void
+cache_clean(void)
+{
+   D("... cache clean!!! do\n");
+   while ((cache_usage > ((cache_max_usage + cache_max_adjust) * 1024)) && 
+          (cache_images))
+     {
+        Img *img;
+        Eina_List *l;
+        
+        D("... clean loop %i > %i\n", cache_usage, (cache_max_usage + cache_max_adjust) * 1024);
+        l = eina_list_last(cache_images);
+        if (!l) break;
+        img = l->data;
+        if (!img) break;
+        D("...   REMOVE %p '%s'\n", img, img->file.file);
+        cache_images = eina_list_remove_list(cache_images, l);
+        img->incache--;
+        cache_usage -= img->usage;
+        D("...   IMG FREE %p\n", img);
+        img_free(img);
+     }
+}
+
+static void
+cache_timeout(time_t t)
+{
+   Eina_List *l, *l_next;
+   Img *img;
+   
+   if (cache_item_timeout < 0) return;
+   EINA_LIST_FOREACH_SAFE(cache_images, l, l_next, img)
+     {
+        if ((t - img->cached) > cache_item_timeout)
+          {
+             cache_images = eina_list_remove_list(cache_images, l);
+             img->incache--;
+             cache_usage -= img->usage;
+             img_free(img);
+          }
+     }
+}
+
+static void
+mem_cache_adjust(void)
+{
+   int pval = cache_max_adjust;
+   int max = 0;
+   int mem_used;
+
+   if (mem_total <= 0) return;
+   mem_used = mem_total - mem_free - mem_cached - mem_buffers;
+#if 0 // this lets the image cache to grow to fill all real free ram, if
+      // there is any (ie ram unused by disk cache)
+   if (mem_free < mem_total)
+     {
+        cache_max_adjust = mem_free;
+        return;
+     }
+#endif
+
+   max = ((mem_free + mem_cached + mem_buffers) / 8) - cache_max_usage;
+   if (max < 0) max = 0;
+   if (max > cache_max_usage) max = cache_max_usage;
+   cache_max_adjust = max - cache_max_usage;
+   
+   if (cache_max_adjust < -cache_max_usage) 
+     cache_max_adjust = -cache_max_usage;
+   D("... cache_max_adjust = %i\n", cache_max_adjust);
+   if (pval != cache_max_adjust)
+     {
+        D("... cache clean\n");
+        cache_clean();
+     }
+}
+
+static void
+img_cache(Img *img)
+{
+   eina_hash_del(active_images, img->key, img);
+   if (img->dead)
+     {
+        D("... img %p '%s' dead\n", img , img->file.file);
+        img_free(img);
+        return;
+     }
+   if ((cache_usage + img->usage) > ((cache_max_usage + cache_max_adjust) * 1024))
+     {
+        D("... img %p '%s' too big for cache\n", img , img->file.file);
+        img_free(img);
+        return;
+     }
+   D("... img %p '%s' cached += %i\n", img , img->file.file, img->usage);
+   if (img->incache > 0)
+     {
+        printf("EEEEEEEEEEEEEEEEK!\n");
+        printf("EEEEEEEEEEEEEEEEK! %p '%s' already in cache\n", 
+               img, img->file.file);
+        printf("EEEEEEEEEEEEEEEEK!\n");
+        return;
+     }
+   cache_images = eina_list_prepend(cache_images, img);
+   img->incache++;
+   cache_usage += img->usage;
+   img->active = 0;
+   img->cached = t_now;
+   if (cache_usage > ((cache_max_usage + cache_max_adjust) * 1024))
+     cache_clean();
+}
+
+static void
+img_dead(Img *img)
+{
+   if (img->active) return;
+   cache_images = eina_list_remove(cache_images, img);
+   img->incache--;
+   cache_usage -= img->usage;
+   img_free(img);
+}
+
+static Eina_Bool
+img_ok(Img *img)
+{
+   struct stat st;
+   int ret;
+   
+   if (img->dead) return 0;
+   if ((t_now > img->file.last_stat) &&
+       ((t_now - img->file.last_stat) < stat_res_interval)) return 1;
+   img->file.last_stat = t_now;
+   ret = stat(img->file.file, &st);
+   img->file.last_stat = t_now;
+   if (ret < 0)
+     {
+        img->dead = 1;
+        img_dead(img);
+        return 0;
+     }
+   if (st.st_mtime != img->file.modtime)
+     {
+        img->dead = 1;
+        img_dead(img);
+        return 0;
+     }
+   return 1;
+}
+
+static Img *
+img_load(const char *file, const char *key, RGBA_Image_Loadopts *load_opts)
+{
+   Img *img;
+   char buf[8192];
+   Eina_List *l, *l_next;
+   
+   if (!file) return NULL;
+   D("... img_load '%s'\n", file);
+   if (key) D("... ... key '%s'\n", key);
+   if (key)
+     snprintf(buf, sizeof(buf), "%s///::/%s/\001/%i/%1.8f/%ix%i",
+              file, key, 
+              load_opts->scale_down_by, 
+              load_opts->dpi,
+              load_opts->w, load_opts->h);
+   else
+     snprintf(buf, sizeof(buf), "%s///\001/%i/%1.8f/%ix%i",
+              file, 
+              load_opts->scale_down_by, 
+              load_opts->dpi,
+              load_opts->w, load_opts->h);
+   D("... find '%s'\n", buf);
+   img = eina_hash_find(active_images, buf);
+   if ((img) && (img_ok(img)))
+     {
+        D("... found!\n");
+        img->stats.load1saved++;
+        img->ref++;
+        D("... sats update\n");
+        stats_update();
+        D("... return %p\n", img);
+        return img;
+     }
+   
+   // FIXME: keep hash of cached images too 
+   EINA_LIST_FOREACH_SAFE(cache_images, l, l_next, img)
+    {
+        if (!strcmp(img->key, buf))
+          {
+             if (img_ok(img))
+               {
+                  D("... found cached\n");
+                  cache_images = eina_list_remove_list(cache_images, l);
+                  img->incache--;
+                  cache_usage -= img->usage;
+                  img->active = 1;
+                  img->stats.load1saved++;
+                  img->ref++;
+                  eina_hash_direct_add(active_images, img->key, img);
+                  D("... sats update\n");
+                  stats_update();
+                  D("... return %p\n", img);
+                  return img;
+               }
+          }
+     }
+   D("... ned new img\n");
+   return img_new(file, key, load_opts, buf);
+}
+
+static void
+img_unload(Img *img)
+{
+   if (img->ref == 0)
+     {
+        printf("EEEEEEEEEEEEEEEEK!\n");
+        printf("EEEEEEEEEEEEEEEEK! %p '%s' already @ ref 0\n", 
+               img, img->file.file);
+        printf("EEEEEEEEEEEEEEEEK!\n");
+        return;
+     }
+   img->ref--;
+   D("... img ref-- = %i\n", img->ref);
+   if (img->ref == 0)
+     {
+        D("... img cache %p '%s'\n", img, img->file.file);
+        img_cache(img);
+     }
+}
+
+static void
+img_unloaddata(Img *img)
+{
+   D("img_unloaddata() %p '%s'\n", img, img->file.file);
+   if ((img->dref <= 0) && (img->useless) && (img->mem))
+     {
+        Image_Entry *ie = (Image_Entry *)img;
+        
+        D("... really do forced unload\n");
+        if (!img->active) cache_usage -= img->usage;
+        img->usage -= 
+          (4096 * (((img->image.w * img->image.h * sizeof(DATA32)) + 4095) / 4096)) +
+          sizeof(Mem);
+        if (!img->active) cache_usage += img->usage;
+        evas_cserve_mem_free(img->mem);
+        stat_mems = eina_list_remove(stat_mems, img->mem);
+        img->mem = NULL;
+        img->image.data = NULL;
+        img->dref = 0;
+        D("... done\n");
+        
+        ie->flags.loaded = 0;
+        ie->allocated.w = 0;
+        ie->allocated.h = 0;
+     }
+}
+
+static void
+img_useless(Img *img)
+{
+   D("img_useless() %p\n", img);
+   img->useless = 1;
+   if (img->dref <= 0) img_unloaddata(img);
+}
+
+static void
+img_forcedunload(Img *img)
+{
+   D("img_forcedunload() %p\n", img);
+   img->dead = 1;
+   img_unload(img);
+}
+
+static void
+img_preload(Img *img)
+{
+   D("img_preload() %p\n", img);
+   printf("preload '%s'\n", img->file.file);
+}
+
+static void
+client_del(void *data, Client *c)
+{
+   Eina_List *images;
+   Img *img;
+   
+   images = data;
+   D("... CLIENT DEL %i\n", c->pid);
+   EINA_LIST_FREE(images, img)
+     {
+        D("... unloaddata img %p\n", img);
+        img_unloaddata(img);
+        D("... unload img %p\n", img);
+        img_unload(img);
+     }
+}
+
+static Eina_Bool
+getinfo_hash_image_cb(const Eina_Hash *hash __UNUSED__, 
+                      const void *key __UNUSED__,
+                      void *data, void *fdata __UNUSED__)
+{
+   Img *img = data;
+   Eina_List **list = fdata;
+
+   *list = eina_list_append(*list, img);
+   return 1;
+}
+
+static int
+message(void *fdata, Server *s, Client *c, int opcode, int size, unsigned char *data)
+{
+   t_now = time(NULL);
+   D("message @ %i...\n", (int)t_now);
+   switch (opcode)
+     {
+     case OP_INIT:
+          {
+             Op_Init *rep;
+             Op_Init msg;
+             
+             memset(&msg, 0, sizeof(msg));
+             msg.pid = getpid();
+             msg.server_id = server_id;
+             rep = (Op_Init *)data;
+             c->pid = rep->pid;
+             c->func = client_del;
+             c->data = NULL;
+             D("OP_INIT %i\n", c->pid);
+             D("... reply\n");
+             evas_cserve_client_send(c, OP_INIT, sizeof(msg), (unsigned char *)(&msg));
+          }
+        break;
+     case OP_LOAD:
+          {
+             Op_Load *rep;
+             Op_Load_Reply msg;
+             Img *img;
+             RGBA_Image_Loadopts lopt = {0, 0.0, 0, 0};
+             char *file = NULL, *key = NULL;
+             
+             D("OP_LOAD %i\n", c->pid);
+             rep = (Op_Load *)data;
+             file = data + sizeof(Op_Load);
+             key = file + strlen(file) + 1;
+             if (key[0] == 0) key = NULL;
+             lopt.scale_down_by = rep->lopt.scale_down_by;
+             lopt.dpi = rep->lopt.dpi;
+             lopt.w = rep->lopt.w;
+             lopt.h = rep->lopt.h;
+             D("... img_load '%s'\n", file);
+             if (key) D("'%s'\n", key);
+             else D("   '%s'\n", NULL);
+             D("   lopt { %i %1.1f %i %i}\n", 
+               lopt.scale_down_by, lopt.dpi, lopt.w, lopt.h);
+             img = img_load(file, key, &lopt);
+             D("... img_load = %p\n", img);
+             if (img)
+               {
+                  D("... add image to client list\n");
+                  c->data = eina_list_append(c->data, img);
+               }
+             memset(&msg, 0, sizeof(msg));
+             msg.handle = img;
+             if ((img) && (img->mem))
+               {
+                  msg.mem.id = img->mem->id;
+                  msg.mem.offset = img->mem->offset;
+                  msg.mem.size = img->mem->size;
+                  img->stats.load2saved++;
+                  stats_update();
+               }
+             else
+               msg.mem.id = msg.mem.offset = msg.mem.size = 0;
+             if (img)
+               {
+                  msg.image.w = img->image.w;
+                  msg.image.h = img->image.h;
+                  msg.image.alpha = img->image.alpha;
+               }
+             D("... reply\n");
+             evas_cserve_client_send(c, OP_LOAD, sizeof(msg), (unsigned char *)(&msg)); 
+         } 
+        break;
+     case OP_UNLOAD:
+          {
+             Op_Unload *rep;
+             Img *img;
+             
+             D("OP_UNLOAD %i\n", c->pid);
+             rep = (Op_Unload *)data;
+             img = rep->handle;
+             if ((img) && (rep->server_id == server_id))
+               {
+                  D("... remove %p from list\n", img);
+                  c->data = eina_list_remove(c->data, img);
+                  D("... unload %p\n", img);
+                  img_unload(img);
+               }
+          } 
+        break;
+     case OP_LOADDATA:
+          {
+             Op_Loaddata *rep;
+             Op_Loaddata_Reply msg;
+             Img *img;
+             
+             D("OP_LOADDATA %i\n", c->pid);
+             rep = (Op_Loaddata *)data;
+             img = rep->handle;
+             if ((img) && (rep->server_id == server_id))
+               {
+                  if (img->mem)
+                    {
+                       D("... load saved - cached %p\n", img);
+                       img->stats.load2saved++;
+                       stats_update();
+                    }
+                  else
+                    {
+                       D("... load data %p\n", img);
+                       img_loaddata(img);
+                    }
+                  memset(&msg, 0, sizeof(msg));
+                  if (img->mem)
+                    {
+                       msg.mem.id = img->mem->id;
+                       msg.mem.offset = img->mem->offset;
+                       msg.mem.size = img->mem->size;
+                    }
+                  else
+                    msg.mem.id = msg.mem.offset = msg.mem.size = 0;
+               }
+             else
+               msg.mem.id = msg.mem.offset = msg.mem.size = 0;
+             D("... reply\n");
+             evas_cserve_client_send(c, OP_LOADDATA, sizeof(msg), (unsigned char *)(&msg));
+          }
+        break;
+     case OP_UNLOADDATA:
+          {
+             Op_Unloaddata *rep;
+             Img *img;
+             
+             D("OP_UNLOADDATA %i\n", c->pid);
+             rep = (Op_Unloaddata *)data;
+             img = rep->handle;
+             if ((img) && (rep->server_id == server_id))
+               {
+                  D("... dref--\n");
+                  img->dref--;
+                  if (img->dref < 0) img->dref = 0;
+                  D("... unload data %p '%s'\n", img, img->file.file);
+                  img_unloaddata(img);
+               }
+          } 
+        break;
+     case OP_USELESSDATA:
+          {
+             Op_Unloaddata *rep;
+             Img *img;
+             
+             D("OP_USELESSDATA %i\n", c->pid);
+             rep = (Op_Unloaddata *)data;
+             img = rep->handle;
+             if ((img) && (rep->server_id == server_id))
+               {
+                  D("... dref--\n");
+                  img->dref--;
+                  if (img->dref < 0) img->dref = 0;
+                  D("... useless %p\n", img);
+                  img_useless(img);
+               }
+          } 
+        break;
+     case OP_PRELOAD:
+          {
+             Op_Preload *rep;
+             Img *img;
+             
+             D("OP_PRELOAD %i\n", c->pid);
+             rep = (Op_Preload *)data;
+             img = rep->handle;
+             if ((img) && (rep->server_id == server_id))
+               {
+                  c->data = eina_list_remove(c->data, img);
+                  img_preload(img);
+               }
+          }
+     case OP_FORCEDUNLOAD:
+          {
+             Op_Forcedunload *rep;
+             Img *img;
+             
+             D("OP_FORCEDUNLOAD %i\n", c->pid);
+             rep = (Op_Forcedunload *)data;
+             img = rep->handle;
+             if ((img) && (rep->server_id == server_id))
+               {
+                  D("remove %p from list\n", img);
+                  c->data = eina_list_remove(c->data, img);
+                  D("... forced unload now\n");
+                  img_forcedunload(img);
+               }
+          } 
+        break;
+     case OP_GETCONFIG:
+          {
+             Op_Getconfig_Reply msg;
+             
+             D("OP_GETCONFIG %i\n", c->pid);
+             msg.cache_max_usage = cache_max_usage;
+             msg.cache_item_timeout = cache_item_timeout;
+             msg.cache_item_timeout_check = cache_item_timeout_check;
+             D("... reply\n");
+             evas_cserve_client_send(c, OP_GETCONFIG, sizeof(msg), (unsigned char *)(&msg));
+          } 
+        break;
+     case OP_SETCONFIG:
+          {
+             Op_Setconfig *rep;
+             
+             D("OP_SETCONFIG %i\n", c->pid);
+             rep = (Op_Setconfig *)data;
+             cache_max_usage = rep->cache_max_usage;
+             cache_item_timeout = rep->cache_item_timeout;
+             cache_item_timeout_check = rep->cache_item_timeout_check;
+             D("... cache timeout\n");
+             cache_timeout(t_now);
+             D("... cache clean\n");
+             cache_clean();
+          } 
+        break;
+     case OP_GETSTATS:
+          {
+             Op_Getstats_Reply msg;
+
+             D("OP_GETSTATS %i\n", c->pid);
+             stats_calc();
+             msg.saved_memory = saved_memory;
+             msg.wasted_memory = (real_memory - alloced_memory);
+             msg.saved_memory_peak = saved_memory_peak;
+             msg.wasted_memory_peak = (real_memory_peak - alloced_memory_peak);
+             msg.saved_time_image_header_load = saved_load_lifetime + saved_load_time;
+             msg.saved_time_image_data_load = saved_loaddata_lifetime + saved_loaddata_time;
+             D("... reply\n");
+             evas_cserve_client_send(c, OP_GETSTATS, sizeof(msg), (unsigned char *)(&msg));
+          } 
+        break;
+     case OP_GETINFO:
+          {
+             Op_Getinfo_Reply *msg;
+             int len;
+             Eina_List *imgs = NULL, *l;
+             Img *img;
+             
+             D("OP_GETINFO %i\n", c->pid);
+             len = sizeof(Op_Getinfo_Reply);
+             D("... foreach\n");
+             if (active_images)
+               eina_hash_foreach(active_images, getinfo_hash_image_cb, &imgs);
+             D("... walk foreach list output\n");
+             EINA_LIST_FOREACH(cache_images, l, img)
+               {
+                  imgs = eina_list_append(imgs, img);
+               }
+             D("... walk image cache\n");
+             EINA_LIST_FOREACH(imgs, l, img)
+               {
+                  len += sizeof(Op_Getinfo_Item);
+                  if (img->file.file) len += strlen(img->file.file);
+                  len++;
+                  if (img->file.key) len += strlen(img->file.key);
+                  len++;
+               }
+             D("... malloc msg\n");
+             msg = malloc(len);
+             if (msg)
+               {
+                  unsigned char *p;
+                  
+                  D("...   init msg\n");
+                  memset(msg, 0, len);
+                  p = (unsigned char *)msg;
+                  msg->active.mem_total = 0;
+                  msg->active.count = 0;
+                  msg->cached.mem_total = 0;
+                  msg->cached.count = 0;
+                  p += sizeof(Op_Getinfo_Reply);
+                  D("...   walk all imgs\n");
+                  EINA_LIST_FOREACH(imgs, l, img)
+                    {
+                       Op_Getinfo_Item *itt, it;
+
+                       D("...   img %p\n", img);
+                       memset(&it, 0, sizeof(Op_Getinfo_Item));
+                       itt = (Op_Getinfo_Item *)p;
+                       it.file_key_size = 0;
+                       if (img->file.file)
+                         {
+                            strcpy(p + sizeof(Op_Getinfo_Item) + it.file_key_size, img->file.file);
+                            it.file_key_size += strlen(img->file.file);
+                         }
+                       p[sizeof(Op_Getinfo_Item) + it.file_key_size] = 0;
+                       it.file_key_size += 1;
+                       if (img->file.key)
+                         {
+                            strcpy(p + sizeof(Op_Getinfo_Item) + it.file_key_size, img->file.key);
+                            it.file_key_size += strlen(img->file.key);
+                         }
+                       p[sizeof(Op_Getinfo_Item) + it.file_key_size] = 0;
+                       it.file_key_size += 1;
+                       
+                       it.w = img->image.w;
+                       it.h = img->image.h;
+                       it.file_mod_time = img->file.modtime;
+                       it.file_checked_time = img->file.last_stat;
+                       if (!img->active)
+                         it.cached_time = img->cached;
+                       else
+                         it.cached_time = 0;
+                       it.refcount = img->ref;
+                       it.data_refcount = img->dref;
+                       it.memory_footprint = img->usage;
+                       it.head_load_time = img->stats.load1;
+                       it.data_load_time = img->stats.load2;
+                       it.alpha = img->image.alpha;
+                       if (img->image.data)
+                         it.data_loaded = 1;
+                       else
+                         it.data_loaded = 0;
+                       it.active = img->active;
+                       if (it.active)
+                         {
+                            msg->active.count++;
+                            msg->active.mem_total += img->usage;
+                         }
+                       else
+                         {
+                            msg->cached.count++;
+                            msg->cached.mem_total += img->usage;
+                         }
+                       it.dead = img->dead;
+                       it.useless = img->useless;
+                       D("...   memcpy %p %p %i \n", 
+                         itt, &it, sizeof(Op_Getinfo_Item));
+                       memcpy(itt, &it, sizeof(Op_Getinfo_Item));
+                       D("...   memcpy done n\n", img);
+                       p += sizeof(Op_Getinfo_Item) + it.file_key_size;
+                    }
+                  D("...   walk all imgs done\n");
+                  msg->active.mem_total = 
+                    (msg->active.mem_total + 1023) / 1024;
+                  msg->cached.mem_total = 
+                    (msg->cached.mem_total + 1023) / 1024;
+                  D("... reply\n");
+                  evas_cserve_client_send(c, OP_GETINFO, len, msg);
+                  free(msg);
+               }
+             else
+               {
+                  D("... reply empty\n");
+                  evas_cserve_client_send(c, OP_GETINFO, 0, NULL);
+               }
+               D("... free imgs list\n");
+           if (imgs) eina_list_free(imgs);
+          } 
+        break;
+     default:
+        D("OP_... UNKNOWN??? %i opcode: %i\n", c->pid, opcode);
+        break;
+     }
+   return 0;
+}
+
+static void
+parse_args(int argc, char **argv)
+{
+   int i;
+   
+   for (i = 1; i < argc; i++)
+     {
+        if ((!strcmp(argv[i], "-h")) ||
+            (!strcmp(argv[i], "-help")) ||
+            (!strcmp(argv[i], "--help")))
+          {
+             printf("Options:\n"
+                    "\t-h          This help\n"
+                    "\t-csize      Size of speculative cache (Kb)\n"
+                    "\t-ctime      Maximum life of a cached image (seconds)\n"
+                    "\t-ctimecheck Time between checking the cache for timeouts (seconds)\n"
+                    "\t-debug      Enable debug logging\n"
+                    "\n");
+             exit(0);
+          }
+        else if ((!strcmp(argv[i], "-csize")) && (i < (argc - 1)))
+          {
+             i++;
+             cache_max_usage = atoi(argv[i]);
+          }
+        else if ((!strcmp(argv[i], "-ctime")) && (i < (argc - 1)))
+          {
+             i++;
+             cache_item_timeout = atoi(argv[i]);
+          }
+        else if ((!strcmp(argv[i], "-ctimecheck")) && (i < (argc - 1)))
+          {
+             i++;
+             cache_item_timeout_check = atoi(argv[i]);
+          }
+        else if (!strcmp(argv[i], "-debug"))
+          {
+             eina_error_log_level_set(EINA_ERROR_LEVEL_DBG);
+          }
+     }
+}
+
+static exit_flag = 0;
+
+static void
+exit_handler(int x, siginfo_t *info, void *data)
+{
+   exit_flag = 1;
+}
+
+static void
+pipe_handler(int x, siginfo_t *info, void *data)
+{
+}
+
+static void
+signal_init(void)
+{
+   struct sigaction action, old_action;
+   
+   action.sa_handler = NULL;
+   action.sa_sigaction = exit_handler;
+   action.sa_flags = SA_RESTART | SA_SIGINFO;
+   sigemptyset(&action.sa_mask);
+   sigaction(SIGINT, &action, &old_action);
+
+   action.sa_handler = NULL;
+   action.sa_sigaction = exit_handler;
+   action.sa_flags = SA_RESTART | SA_SIGINFO;
+   sigemptyset(&action.sa_mask);
+   sigaction(SIGTERM, &action, &old_action);
+
+   action.sa_handler = NULL;
+   action.sa_sigaction = exit_handler;
+   action.sa_flags = SA_RESTART | SA_SIGINFO;
+   sigemptyset(&action.sa_mask);
+   sigaction(SIGQUIT, &action, &old_action);
+
+   action.sa_handler = NULL;
+   action.sa_sigaction = pipe_handler;
+   action.sa_flags = SA_RESTART | SA_SIGINFO;
+   sigemptyset(&action.sa_mask);
+   sigaction(SIGPIPE, &action, &old_action);
+
+   // SIGUSR1
+   // SIGUSR2
+   // SIGHUP
+
+   // SIGCHLD
+   
+   // SIGSEGV
+   // SIGILL
+   // SIGBUS
+   // SIGFPE
+   // SIGABRT
+}
+
+static void
+signal_shutdown(void)
+{
+}
+
+int
+main(int argc, char **argv)
+{
+   Server *s;
+   time_t last_check, t, t_next;
+   pid_t pid;
+   
+   t = time(NULL);
+   pid = getpid();
+   t ^= (pid << 24) | (pid << 16) | (pid << 8) | (pid);
+   srand(t);
+   server_id = rand();
+   
+   parse_args(argc, argv);
+   
+   unsetenv("EVAS_CSERVE");
+
+   D("eina init...\n");
+   eina_init();
+   D("evas init...\n");
+   evas_init();
+
+   D("img init...");
+   img_init();
+   D("signal init...\n");
+   signal_init();
+   D("cserve add...\n");
+   s = evas_cserve_server_add();
+   if (!s)
+     {
+        printf("ERROR: server socket init fail. abort.\n");
+        goto error;
+     }
+   D("mem open (status)...\n");
+   stat_mem = evas_cserve_mem_open(0, 0, "status", sizeof(int), 0);
+   if (stat_mem)
+     {
+        printf("WARNING: previous evas_cserve left garbage. cleaning up.\n");
+        stat_clean(stat_mem);
+        evas_cserve_mem_close(stat_mem);
+        stat_mem = NULL;
+     }
+   D("mem new (status)...\n");
+   stat_mem = evas_cserve_mem_new(sizeof(int), "status");
+   if (!stat_mem)
+     {
+        printf("ERROR: cannot create status shmseg. abort.\n");
+        goto error;
+     }
+   D("init status...\n");
+   if (!stat_init(stat_mem))
+     {
+        printf("ERROR: cannot init status shmseg. abort.\n");
+        evas_cserve_mem_free(stat_mem);
+        stat_mem = NULL;
+        goto error;
+     }
+   
+   D("cset server message handler...\n");
+   evas_cserve_server_message_handler_set(s, message, NULL);
+   last_check = time(NULL);
+   t_next = 0; 
+   if (cache_item_timeout_check > 0) t_next = cache_item_timeout_check;
+   D("LOOP!!! ...\n");
+   for (;;)
+     {
+        /* fixme: timeout 0 only her - future use timeouts for timed
+         * housekeping */
+        if (exit_flag) break;
+        D("wait for messages...\n");
+        evas_cserve_server_wait(s, t_next * 1000000);
+        if (exit_flag) break;
+        t = time(NULL);
+        t_next = t - last_check;
+        if ((cache_item_timeout_check > 0) &&
+            ((t_next) >= cache_item_timeout_check))
+          {
+             D("check timeout of items...\n");
+             t_next = cache_item_timeout_check;
+             
+             last_check = t;
+             D("cache timeout...\n");
+             cache_timeout(t);
+             D("meminfo check...\n");
+             meminfo_check();
+             D("mem cache adjust...\n");
+             mem_cache_adjust();
+          }
+        if ((t_next <= 0) && (cache_item_timeout_check > 0))
+          t_next = 1;
+        D("sleep for %isec...\n", t_next);
+     }
+   D("end loop...\n");
+   error:
+   D("cleanup...\n");
+   if (stat_mem)
+     {
+        D("clean mem stat...\n");
+        stat_clean(stat_mem);
+     }
+   D("signal shutdown...\n");
+   signal_shutdown();
+   D("img shutdown...\n");
+   img_shutdown();
+   if (stat_mem)
+     {
+        D("free stat mem...\n");
+        evas_cserve_mem_free(stat_mem);
+        stat_mem = NULL;
+     }
+   if (s)
+     {
+        D("del server...\n");
+        evas_cserve_server_del(s);
+     }
+   D("evas shutdown...\n");
+   evas_shutdown();
+   D("eina shutdown...\n");
+   eina_shutdown();
+   D("exit..\n");
+   return 0;
+}
diff --git a/src/bin/evas_cserve_tool.c b/src/bin/evas_cserve_tool.c
new file mode 100644
index 0000000..fd5f71c
--- /dev/null
+++ b/src/bin/evas_cserve_tool.c
@@ -0,0 +1,160 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "evas_cs.h"
+
+int
+main(int argc, char **argv)
+{
+   int i;
+   
+   evas_init();
+   if (!evas_cserve_init())
+     {
+        printf("ERROR: Cannot connect to cserve. abort\n");
+        exit(-1);
+     }
+
+   for (i = 1; i < argc; i++)
+     {
+        if ((!strcmp(argv[i], "-h")) ||
+            (!strcmp(argv[i], "-help")) ||
+            (!strcmp(argv[i], "--help")))
+          {
+             printf("Options:\n"
+                    "\t-h                               This help\n"
+                    "\tgetconfig                        Get configuration values\n"
+                    "\tsetconfig CSIZE CTIME CTIMECHECK Set the config values\n"
+                    "\tgetstats                         Get current cache statistics\n"
+                    "\tgetinfo                          Get current cache content info\n"
+                    );
+             exit(0);
+          }
+        else if ((!strcmp(argv[i], "getconfig")))
+          {
+             Op_Getconfig_Reply config;
+             
+             if (!evas_cserve_raw_config_get(&config))
+               {
+                  printf("ERROR: cannot fetch config.\n");
+                  exit(-1);
+               }
+             printf("-REPLY-\n");
+             printf("csize: %i\n", config.cache_max_usage);
+             printf("ctime: %i\n", config.cache_item_timeout);
+             printf("ctimecheck: %i\n", config.cache_item_timeout_check);
+             printf("-OK-\n");
+          }
+        else if ((!strcmp(argv[i], "setconfig")) && (i < (argc - 3)))
+          {
+             Op_Setconfig config;
+             
+             i++;
+             config.cache_max_usage = atoi(argv[i]);
+             i++;
+             config.cache_item_timeout = atoi(argv[i]);
+             i++;
+             config.cache_item_timeout_check = atoi(argv[i]);
+             if (!evas_cserve_raw_config_set(&config))
+               {
+                  printf("ERROR: cannot set config.\n");
+                  exit(-1);
+               }
+          }
+        else if ((!strcmp(argv[i], "getstats")))
+          {
+             Op_Getstats_Reply stats;
+             
+             if (!evas_cserve_raw_stats_get(&stats))
+               {
+                  printf("ERROR: cannot fetch stats.\n");
+                  exit(-1);
+               }
+             printf("-REPLY-\n");
+             printf("saved_memory: %i Kb\n", stats.saved_memory / 1024);
+             printf("wasted_memory: %i Kb\n", stats.wasted_memory / 1024);
+             printf("saved_memory_peak: %i Kb\n", stats.saved_memory_peak / 1024);
+             printf("wasted_memory_peak: %i Kb\n", stats.wasted_memory_peak / 1024);
+             printf("saved_time_image_header_load: %1.3f sec\n", stats.saved_time_image_header_load);
+             printf("saved_time_image_data_load: %1.3f sec\n", stats.saved_time_image_data_load);
+             printf("-OK-\n");
+          }
+        else if ((!strcmp(argv[i], "getinfo")))
+          {
+             Op_Getinfo_Reply *info;
+             Op_Getinfo_Item *itt;
+             unsigned char *p;
+             int i, j;
+             
+             info = evas_cserve_raw_info_get();
+             if (!info)
+               {
+                  printf("ERROR: cannot fetch info.\n");
+                  exit(-1);
+               }
+             j = info->active.count + info->cached.count;
+             printf("-REPLY-\n");
+             printf("active_count: %i\n", info->active.count);
+             printf("active_memory: %i Kb\n", info->active.mem_total);
+             printf("cache_count: %i\n", info->cached.count);
+             printf("cache_memory: %i Kb\n", info->cached.mem_total);
+             p = (unsigned char *)info;
+             p += sizeof(Op_Getinfo_Reply);
+             for (i = 0; i < j; i++)
+               {
+                  Op_Getinfo_Item it;
+                  char *file, *key, buf[512];
+                  struct tm *ltm;
+                  
+                  itt = (Op_Getinfo_Item *)p;
+                  memcpy(&it, itt, sizeof(Op_Getinfo_Item));
+                  file = p + sizeof(Op_Getinfo_Item);
+                  key = file + strlen(file) + 1;
+                  printf("-IMAGE- [#%i]\n", i);
+                  printf("  file       : %s\n", file);
+                  printf("  key        : %s\n", key);
+                  printf("  size       : %i x %i\n", it.w, it.h);
+                  printf("  active     : %i\n", (int)it.active);
+                  printf("  memory used: %i bytes (%i Kb)\n", it.memory_footprint, (it.memory_footprint + 1023) / 1024);
+                  printf("  has alpha  : %i\n", (int)it.alpha);
+                  printf("  data loaded: %i\n", (int)it.data_loaded);
+                  printf("  dead       : %i\n", (int)it.dead);
+                  printf("  useless    : %i\n", (int)it.useless);
+                  printf("  image refs : %i\n", it.refcount);
+                  printf("  data  refs : %i\n", it.data_refcount);
+                  printf("  header load: %1.5f sec\n", it.head_load_time);
+                  printf("  data load  : %1.5f sec\n", it.data_load_time);
+                  if (it.cached_time == 0)
+                    printf("  cached at  : N/A\n");
+                  else
+                    {
+                       ltm = localtime(&(it.cached_time));
+                       if (ltm)
+                         {
+                            strftime(buf, sizeof(buf), "%Y.%m.%d %T", ltm);
+                            printf("  cached at  : %s\n", buf);
+                         }
+                    }
+                  ltm = localtime(&(it.file_mod_time));
+                  if (ltm)
+                    {
+                       strftime(buf, sizeof(buf), "%Y.%m.%d %T", ltm);
+                       printf("  file mod at: %s\n", buf);
+                    }
+                  ltm = localtime(&(it.file_checked_time));
+                  if (ltm)
+                    {
+                       strftime(buf, sizeof(buf), "%Y.%m.%d %T", ltm);
+                       printf("  file check : %s\n", buf);
+                    }
+                  p += sizeof(Op_Getinfo_Item) + it.file_key_size;
+               }
+             free(info);
+             printf("-OK-\n");
+          }
+     }
+   evas_cserve_shutdown();
+   evas_shutdown();
+   return 0;
+}
diff --git a/src/lib/Evas.h b/src/lib/Evas.h
index 8363dba..0f7efb7 100644
--- a/src/lib/Evas.h
+++ b/src/lib/Evas.h
@@ -1,6 +1,8 @@
 #ifndef _EVAS_H
 #define _EVAS_H
 
+#include <time.h>
+
 #include <Eina.h>
 
 #ifdef EAPI
@@ -163,11 +165,11 @@ struct _Evas_Smart_Class /** a smart object class */
    void  (*del)         (Evas_Object *o);
    void  (*move)        (Evas_Object *o, Evas_Coord x, Evas_Coord y);
    void  (*resize)      (Evas_Object *o, Evas_Coord w, Evas_Coord h); 
-   void  (*show)        (Evas_Object *o); // FIXME: DELETE ME
-   void  (*hide)        (Evas_Object *o); // FIXME: DELETE ME
-   void  (*color_set)   (Evas_Object *o, int r, int g, int b, int a); // FIXME: DELETE ME
-   void  (*clip_set)    (Evas_Object *o, Evas_Object *clip); // FIXME: DELETE ME
-   void  (*clip_unset)  (Evas_Object *o); // FIXME: DELETE ME
+   void  (*show)        (Evas_Object *o);
+   void  (*hide)        (Evas_Object *o);
+   void  (*color_set)   (Evas_Object *o, int r, int g, int b, int a);
+   void  (*clip_set)    (Evas_Object *o, Evas_Object *clip);
+   void  (*clip_unset)  (Evas_Object *o);
    void  (*calculate)   (Evas_Object *o);
    void  (*member_add)  (Evas_Object *o, Evas_Object *child);
    void  (*member_del)  (Evas_Object *o, Evas_Object *child);
@@ -296,6 +298,13 @@ typedef enum _Evas_Border_Fill_Mode
    EVAS_BORDER_FILL_SOLID = 2
 } Evas_Border_Fill_Mode;
 
+typedef enum _Evas_Image_Scale_Hint
+{
+   EVAS_IMAGE_SCALE_HINT_NONE = 0,
+   EVAS_IMAGE_SCALE_HINT_DYNAMIC = 1,
+   EVAS_IMAGE_SCALE_HINT_STATIC = 2
+} Evas_Image_Scale_Hint;
+
 struct _Evas_Engine_Info /** Generic engine information. Generic info is useless */
 {
    int magic; /**< Magic number */
@@ -599,6 +608,8 @@ extern "C" {
    EAPI Evas_Colorspace   evas_object_image_colorspace_get         (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
    EAPI void                 evas_object_image_native_surface_set  (Evas_Object *obj, Evas_Native_Surface *surf) EINA_ARG_NONNULL(1, 2);
    EAPI Evas_Native_Surface *evas_object_image_native_surface_get  (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void                  evas_object_image_scale_hint_set     (Evas_Object *obj, Evas_Image_Scale_Hint hint) EINA_ARG_NONNULL(1);
+   EAPI Evas_Image_Scale_Hint evas_object_image_scale_hint_get     (const Evas_Object *obj) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
 
 /* image cache */
    EAPI void              evas_image_cache_flush            (Evas *e) EINA_ARG_NONNULL(1);
@@ -749,6 +760,9 @@ extern "C" {
    EAPI int                          evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord y) EINA_ARG_NONNULL(1);
    EAPI Eina_List                   *evas_textblock_cursor_range_geometry_get(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *cur2) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2) EINA_PURE;
    
+   EAPI Eina_Bool                    evas_textblock_cursor_eol_get(const Evas_Textblock_Cursor *cur) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_PURE;
+   EAPI void                         evas_textblock_cursor_eol_set(Evas_Textblock_Cursor *cur, Eina_Bool eol) EINA_ARG_NONNULL(1);
+   
    EAPI Eina_Bool                    evas_object_textblock_line_number_geometry_get(const Evas_Object *obj, int line, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) EINA_ARG_NONNULL(1);
    EAPI void                         evas_object_textblock_clear(Evas_Object *obj) EINA_ARG_NONNULL(1);
    EAPI void                         evas_object_textblock_size_formatted_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) EINA_ARG_NONNULL(1);
@@ -946,6 +960,64 @@ extern "C" {
    EAPI void              evas_object_intercept_clip_unset_callback_add  (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data) EINA_ARG_NONNULL(1, 2);
    EAPI void             *evas_object_intercept_clip_unset_callback_del  (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)) EINA_ARG_NONNULL(1, 2);
 
+   typedef struct _Evas_Cserve_Stats Evas_Cserve_Stats;
+   typedef struct _Evas_Cserve_Image_Cache Evas_Cserve_Image_Cache;
+   typedef struct _Evas_Cserve_Image Evas_Cserve_Image;
+   typedef struct _Evas_Cserve_Config Evas_Cserve_Config;
+   
+   struct _Evas_Cserve_Stats
+     {
+        int saved_memory;
+        int wasted_memory;
+        int saved_memory_peak;
+        int wasted_memory_peak;
+        double saved_time_image_header_load;
+        double saved_time_image_data_load;
+     };
+   
+   struct _Evas_Cserve_Image_Cache
+     {
+        struct {
+           int mem_total;
+           int count;
+        } active, cached;
+        Eina_List *images;
+     };
+   
+   struct _Evas_Cserve_Image
+     {
+        const char *file, *key;
+        int w, h;
+        time_t file_mod_time;
+        time_t file_checked_time;
+        time_t cached_time;
+        int refcount;
+        int data_refcount;
+        int memory_footprint;
+        double head_load_time;
+        double data_load_time;
+        Eina_Bool alpha : 1;
+        Eina_Bool data_loaded : 1;
+        Eina_Bool active : 1;
+        Eina_Bool dead : 1;
+        Eina_Bool useless : 1;
+     };
+   
+    struct _Evas_Cserve_Config
+     {
+        int cache_max_usage;
+        int cache_item_timeout;
+        int cache_item_timeout_check;
+     };
+   
+   EAPI Eina_Bool         evas_cserve_want_get                   (void) EINA_WARN_UNUSED_RESULT EINA_PURE;
+   EAPI Eina_Bool         evas_cserve_connected_get              (void) EINA_WARN_UNUSED_RESULT EINA_PURE;
+   EAPI Eina_Bool         evas_cserve_stats_get                  (Evas_Cserve_Stats *stats) EINA_WARN_UNUSED_RESULT EINA_PURE;
+   EAPI void              evas_cserve_image_cache_contents_clean (Evas_Cserve_Image_Cache *cache) EINA_PURE;
+   EAPI Eina_Bool         evas_cserve_config_get                 (Evas_Cserve_Config *config) EINA_WARN_UNUSED_RESULT EINA_PURE;
+   EAPI Eina_Bool         evas_cserve_config_set                 (Evas_Cserve_Config *config) EINA_WARN_UNUSED_RESULT EINA_PURE;
+   EAPI void              evas_cserve_disconnect                 (void) EINA_PURE;
+       
 /* Evas utility routines for color space conversions */
 /* hsv color space has h in the range 0.0 to 360.0, and s,v in the range 0.0 to 1.0 */
 /* rgb color space has r,g,b in the range 0 to 255 */
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index fd50028..4b22a87 100644
--- a/src/lib/Makefile.am
+++ b/src/lib/Makefile.am
@@ -1,6 +1,6 @@
 MAINTAINERCLEANFILES = Makefile.in
 
-SUBDIRS = canvas data cache file engines imaging include
+SUBDIRS = canvas data cache cserve file engines imaging include
 
 AM_CPPFLAGS = \
 -I. \
@@ -24,12 +24,19 @@ include_HEADERS = Evas.h Evas_Data.h
 
 libevas_la_SOURCES = main.c
 
+if EVAS_CSERVE
+
+libevas_cserve_la = cserve/libevas_cserve.la
+
+endif
+
 libevas_la_LIBADD = \
 canvas/libevas_canvas.la \
 data/libevas_data.la \
 file/libevas_file.la \
 cache/libevas_cache.la \
 imaging/libevas_imaging.la \
+$(libevas_cserve_la) \
 engines/common/libevas_engine_common.la \
 @dlopen_libs@ \
 @FREETYPE_LIBS@ \
@@ -41,12 +48,12 @@ engines/common/libevas_engine_common.la \
 -lm
 
 libevas_la_DEPENDENCIES = \
-$(top_builddir)/config.h \
 canvas/libevas_canvas.la \
 data/libevas_data.la \
 file/libevas_file.la \
 cache/libevas_cache.la \
 imaging/libevas_imaging.la \
+$(libevas_cserve_la) \
 engines/common/libevas_engine_common.la
 
 if BUILD_ENGINE_SOFTWARE_16
diff --git a/src/lib/Makefile.in b/src/lib/Makefile.in
index f1199f7..ea5098b 100644
--- a/src/lib/Makefile.in
+++ b/src/lib/Makefile.in
@@ -248,6 +248,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
@@ -311,7 +313,7 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 version_info = @version_info@
 MAINTAINERCLEANFILES = Makefile.in
-SUBDIRS = canvas data cache file engines imaging include
+SUBDIRS = canvas data cache cserve file engines imaging include
 AM_CPPFLAGS = \
 -I. \
 -I$(top_srcdir)/src/lib \
@@ -330,17 +332,18 @@ AM_CFLAGS = @WIN32_CFLAGS@
 lib_LTLIBRARIES = libevas.la
 include_HEADERS = Evas.h Evas_Data.h
 libevas_la_SOURCES = main.c
+ at EVAS_CSERVE_TRUE@libevas_cserve_la = cserve/libevas_cserve.la
 libevas_la_LIBADD = canvas/libevas_canvas.la data/libevas_data.la \
 	file/libevas_file.la cache/libevas_cache.la \
-	imaging/libevas_imaging.la \
+	imaging/libevas_imaging.la $(libevas_cserve_la) \
 	engines/common/libevas_engine_common.la @dlopen_libs@ \
 	@FREETYPE_LIBS@ @FRIBIDI_LIBS@ @EET_LIBS@ @FONTCONFIG_LIBS@ \
 	@pthread_libs@ @EINA_LIBS@ -lm $(am__append_1)
-libevas_la_DEPENDENCIES = $(top_builddir)/config.h \
-	canvas/libevas_canvas.la data/libevas_data.la \
-	file/libevas_file.la cache/libevas_cache.la \
-	imaging/libevas_imaging.la \
-	engines/common/libevas_engine_common.la $(am__append_2)
+libevas_la_DEPENDENCIES = canvas/libevas_canvas.la \
+	data/libevas_data.la file/libevas_file.la \
+	cache/libevas_cache.la imaging/libevas_imaging.la \
+	$(libevas_cserve_la) engines/common/libevas_engine_common.la \
+	$(am__append_2)
 libevas_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
 all: all-recursive
 
diff --git a/src/lib/cache/Makefile.in b/src/lib/cache/Makefile.in
index 505eaf9..de0bc44 100644
--- a/src/lib/cache/Makefile.in
+++ b/src/lib/cache/Makefile.in
@@ -223,6 +223,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/lib/cache/evas_cache_image.c b/src/lib/cache/evas_cache_image.c
index cffa4ca..22a4ad0 100644
--- a/src/lib/cache/evas_cache_image.c
+++ b/src/lib/cache/evas_cache_image.c
@@ -18,6 +18,11 @@
 #include "evas_common.h"
 #include "evas_private.h"
 
+#ifdef EVAS_CSERVE
+// FIXME: cache server and threaded preload clash badly atm - disable
+#undef BUILD_ASYNC_PRELOAD
+#endif
+
 #ifdef BUILD_ASYNC_PRELOAD
 #include <pthread.h>
 
@@ -671,7 +676,6 @@ evas_cache_image_request(Evas_Cache_Image *cache, const char *file, const char *
 
         ok = 1;
         t = time(NULL);
-
         if ((t - im->laststat) > STAT_GAP)
           {
              stat_done = 1;
@@ -725,8 +729,7 @@ evas_cache_image_request(Evas_Cache_Image *cache, const char *file, const char *
      }
 
    im = _evas_cache_image_entry_new(cache, hkey, st.st_mtime, file, key, lo, error);
-   if (!im)
-     return NULL;
+   if (!im) return NULL;
 
    if (cache->func.debug)
      cache->func.debug("request", im);
@@ -801,11 +804,26 @@ evas_cache_image_dirty(Image_Entry *im, int x, int y, int w, int h)
    cache = im->cache;
    if (!(im->flags.dirty))
      {
+#ifndef EVAS_CSERVE
+// if ref 1 also copy if using shared cache as its read-only
         if (im->references == 1) im_dirty = im;
         else
+#endif
           {
              int        error;
 
+             im_dirty = evas_cache_image_copied_data
+               (cache, im->w, im->h, 
+                evas_cache_image_pixels(im), 
+                im->flags.alpha, 
+                im->space);
+             if (!im_dirty) goto on_error;
+             if (cache->func.debug)
+               cache->func.debug("dirty-src", im);
+             error = cache->func.dirty(im_dirty, im);
+             if (cache->func.debug)
+               cache->func.debug("dirty-out", im_dirty);
+/*             
              im_dirty = _evas_cache_image_entry_new(cache, NULL, im->timestamp, im->file, im->key, &im->load_opts, &error);
              if (!im_dirty) goto on_error;
 
@@ -816,7 +834,7 @@ evas_cache_image_dirty(Image_Entry *im, int x, int y, int w, int h)
                cache->func.debug("dirty-out", im_dirty);
 
              if (error != 0) goto on_error;
-
+ */
              im_dirty->references = 1;
 
              evas_cache_image_drop(im);
@@ -861,6 +879,18 @@ evas_cache_image_alone(Image_Entry *im)
      {
         int     error;
 
+        im_dirty = evas_cache_image_copied_data
+          (cache, im->w, im->h, 
+           evas_cache_image_pixels(im), 
+           im->flags.alpha, 
+           im->space);
+        if (!im_dirty) goto on_error;
+        if (cache->func.debug)
+          cache->func.debug("dirty-src", im);
+        error = cache->func.dirty(im_dirty, im);
+        if (cache->func.debug)
+          cache->func.debug("dirty-out", im_dirty);
+/*        
         im_dirty = _evas_cache_image_entry_new(cache, NULL, im->timestamp, im->file, im->key, &im->load_opts, &error);
         if (!im_dirty) goto on_error;
 
@@ -871,7 +901,7 @@ evas_cache_image_alone(Image_Entry *im)
           cache->func.debug("dirty-out", im_dirty);
 
         if (error != 0) goto on_error;
-
+ */
         im_dirty->references = 1;
 
         evas_cache_image_drop(im);
diff --git a/src/lib/canvas/Makefile.am b/src/lib/canvas/Makefile.am
index 637ddae..63f8174 100644
--- a/src/lib/canvas/Makefile.am
+++ b/src/lib/canvas/Makefile.am
@@ -1,10 +1,10 @@
-
 MAINTAINERCLEANFILES = Makefile.in
 
 AM_CPPFLAGS = \
 -I. \
 -I$(top_srcdir)/src/lib \
 -I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/lib/cserve \
 -DPACKAGE_BIN_DIR=\"$(bindir)\" \
 -DPACKAGE_LIB_DIR=\"$(libdir)\" \
 -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
@@ -48,7 +48,8 @@ evas_render.c \
 evas_smart.c \
 evas_stack.c \
 evas_async_events.c \
-evas_transform.c
+evas_transform.c \
+evas_stats.c
 
 libevas_canvas_la_LIBADD = @EVIL_LIBS@
 
diff --git a/src/lib/canvas/Makefile.in b/src/lib/canvas/Makefile.in
index c27f644..e9ff8ee 100644
--- a/src/lib/canvas/Makefile.in
+++ b/src/lib/canvas/Makefile.in
@@ -61,7 +61,7 @@ am_libevas_canvas_la_OBJECTS = evas_callbacks.lo evas_clip.lo \
 	evas_object_box.lo evas_object_table.lo evas_object_text.lo \
 	evas_object_textblock.lo evas_font_dir.lo evas_rectangle.lo \
 	evas_render.lo evas_smart.lo evas_stack.lo \
-	evas_async_events.lo evas_transform.lo
+	evas_async_events.lo evas_transform.lo evas_stats.lo
 libevas_canvas_la_OBJECTS = $(am_libevas_canvas_la_OBJECTS)
 DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
@@ -233,6 +233,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
@@ -300,6 +302,7 @@ AM_CPPFLAGS = \
 -I. \
 -I$(top_srcdir)/src/lib \
 -I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/lib/cserve \
 -DPACKAGE_BIN_DIR=\"$(bindir)\" \
 -DPACKAGE_LIB_DIR=\"$(libdir)\" \
 -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
@@ -343,7 +346,8 @@ evas_render.c \
 evas_smart.c \
 evas_stack.c \
 evas_async_events.c \
-evas_transform.c
+evas_transform.c \
+evas_stats.c
 
 libevas_canvas_la_LIBADD = @EVIL_LIBS@
 EXTRA_DIST = \
@@ -432,6 +436,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_render.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_smart.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_stack.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_stats.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_transform.Plo at am__quote@
 
 .c.o:
diff --git a/src/lib/canvas/evas_events.c b/src/lib/canvas/evas_events.c
index 6fd9382..aed2f3a 100644
--- a/src/lib/canvas/evas_events.c
+++ b/src/lib/canvas/evas_events.c
@@ -238,7 +238,7 @@ evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags, unsigned int
 	  evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_DOWN, &ev);
 	if (e->delete_me) break;
      }
-   if (copy) copy = eina_list_free(copy);
+   if (copy) eina_list_free(copy);
    e->last_mouse_down_counter++;
    _evas_unwalk(e);
 }
diff --git a/src/lib/canvas/evas_main.c b/src/lib/canvas/evas_main.c
index a07a0bd..2d2065b 100644
--- a/src/lib/canvas/evas_main.c
+++ b/src/lib/canvas/evas_main.c
@@ -1,5 +1,6 @@
 #include "evas_common.h"
 #include "evas_private.h"
+#include "evas_cs.h"
 
 extern Eina_List *evas_modules;
 static int initcount = 0;
@@ -28,6 +29,9 @@ evas_init(void)
 
 	evas_module_init();
 	evas_async_events_init();
+#ifdef EVAS_CSERVE
+        if (getenv("EVAS_CSERVE")) evas_cserve_init();
+#endif        
      }
    return ++initcount;
 }
@@ -38,6 +42,9 @@ evas_shutdown(void)
    initcount--;
    if (initcount == 0)
      {
+#ifdef EVAS_CSERVE
+        if (getenv("EVAS_CSERVE")) evas_cserve_shutdown();
+#endif        
 	evas_async_events_shutdown();
 	evas_font_dir_cache_free();
 	evas_common_shutdown();
@@ -742,6 +749,9 @@ evas_render_method_list(void)
    Eina_List *methods = NULL;
 
    /* FIXME: get from modules - this is currently coded-in */
+#ifdef BUILD_ENGINE_SOFTWARE_GDI
+   methods = eina_list_append(methods, strdup("software_gdi"));
+#endif
 #ifdef BUILD_ENGINE_SOFTWARE_DDRAW
    methods = eina_list_append(methods, strdup("software_ddraw"));
 #endif
diff --git a/src/lib/canvas/evas_object_box.c b/src/lib/canvas/evas_object_box.c
index 91c86d5..ffcb4ae 100644
--- a/src/lib/canvas/evas_object_box.c
+++ b/src/lib/canvas/evas_object_box.c
@@ -124,6 +124,7 @@ _on_child_del(void *data, Evas *evas __UNUSED__, Evas_Object *o, void *einfo __U
 
    if (!api->remove(box, priv, o))
      fputs("child removal failed\n", stderr);
+   evas_object_smart_changed(box);
 }
 
 static void
@@ -1662,7 +1663,7 @@ _evas_object_box_layout_flow_vertical_col_info_collect(Evas_Object_Box_Data *pri
 void
 evas_object_box_layout_flow_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data __UNUSED__)
 {
-   int n_children, h_justify;
+   int n_children;
    int c, col_count;
    int min_w = 0, min_h = 0;
    int max_w, inc_x;
@@ -1688,7 +1689,6 @@ evas_object_box_layout_flow_vertical(Evas_Object *o, Evas_Object_Box_Data *priv,
      (priv, h, &col_count, col_max_w, col_break, col_height, &off_x, &max_w);
 
    inc_x = 0;
-   h_justify = 0;
    remain_x = w - (off_x + max_w);
 
    if (remain_x > 0)
@@ -2092,6 +2092,8 @@ evas_object_box_remove_all(Evas_Object *o, Evas_Bool clear)
    if ((!api) || (!api->remove))
      return 0;
 
+   evas_object_smart_changed(o);
+
    while (priv->children)
      {
         Evas_Object_Box_Option *opt = priv->children->data;
@@ -2108,7 +2110,6 @@ evas_object_box_remove_all(Evas_Object *o, Evas_Bool clear)
         else return 0;
      }
 
-   evas_object_smart_changed(o);
    return 1;
 }
 
diff --git a/src/lib/canvas/evas_object_image.c b/src/lib/canvas/evas_object_image.c
index 214d388..f425e3d 100644
--- a/src/lib/canvas/evas_object_image.c
+++ b/src/lib/canvas/evas_object_image.c
@@ -53,6 +53,8 @@ struct _Evas_Object_Image
       void             *get_pixels_data;
    } func;
 
+   Evas_Image_Scale_Hint scale_hint;
+   
    void             *engine_data;
 
    unsigned char     changed : 1;
@@ -61,7 +63,7 @@ struct _Evas_Object_Image
 };
 
 /* private methods for image objects */
-static void evas_object_image_unload(Evas_Object *obj);
+static void evas_object_image_unload(Evas_Object *obj, Evas_Bool dirty);
 static void evas_object_image_load(Evas_Object *obj);
 static Evas_Coord evas_object_image_figure_x_fill(Evas_Object *obj, Evas_Coord start, Evas_Coord size, Evas_Coord *size_ret);
 static Evas_Coord evas_object_image_figure_y_fill(Evas_Object *obj, Evas_Coord start, Evas_Coord size, Evas_Coord *size_ret);
@@ -1319,8 +1321,10 @@ evas_object_image_reload(Evas_Object *obj)
        (o->pixels_checked_out > 0)) return;
    if (o->engine_data)
      o->engine_data = obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output, o->engine_data, 0, 0, o->cur.image.w, o->cur.image.h);
-   evas_object_image_unload(obj);
+   evas_object_image_unload(obj, 1);
    evas_object_image_load(obj);
+   o->prev.file = NULL;
+   o->prev.key = NULL;
    o->changed = 1;
    evas_object_change(obj);
 }
@@ -1586,10 +1590,11 @@ evas_object_image_load_dpi_set(Evas_Object *obj, double dpi)
    MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
    return;
    MAGIC_CHECK_END();
+   if (dpi == o->load_opts.dpi) return;
    o->load_opts.dpi = dpi;
    if (o->cur.file)
      {
-	evas_object_image_unload(obj);
+	evas_object_image_unload(obj, 0);
 	evas_object_image_load(obj);
 	o->changed = 1;
 	evas_object_change(obj);
@@ -1635,11 +1640,12 @@ evas_object_image_load_size_set(Evas_Object *obj, int w, int h)
    MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
    return;
    MAGIC_CHECK_END();
+   if ((o->load_opts.w == w) && (o->load_opts.h == h)) return;
    o->load_opts.w = w;
    o->load_opts.h = h;
    if (o->cur.file)
      {
-	evas_object_image_unload(obj);
+	evas_object_image_unload(obj, 0);
 	evas_object_image_load(obj);
 	o->changed = 1;
 	evas_object_change(obj);
@@ -1680,10 +1686,11 @@ evas_object_image_load_scale_down_set(Evas_Object *obj, int scale_down)
    MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
    return;
    MAGIC_CHECK_END();
+   if (o->load_opts.scale_down_by == scale_down) return;
    o->load_opts.scale_down_by = scale_down;
    if (o->cur.file)
      {
-	evas_object_image_unload(obj);
+	evas_object_image_unload(obj, 0);
 	evas_object_image_load(obj);
 	o->changed = 1;
 	evas_object_change(obj);
@@ -1809,6 +1816,42 @@ evas_object_image_native_surface_get(const Evas_Object *obj)
  *
  */
 EAPI void
+evas_object_image_scale_hint_set(Evas_Object *obj, Evas_Image_Scale_Hint hint)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+   o->scale_hint = hint;
+}
+
+EAPI Evas_Image_Scale_Hint
+evas_object_image_scale_hint_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+   MAGIC_CHECK_END();
+   return o->scale_hint;
+}
+
+/**
+ * To be documented.
+ *
+ * FIXME: To be fixed.
+ *
+ */
+EAPI void
 evas_image_cache_flush(Evas *e)
 {
    MAGIC_CHECK(e, Evas, MAGIC_EVAS);
@@ -1845,7 +1888,7 @@ evas_image_cache_reload(Evas *e)
 	     o = (Evas_Object_Image *)(obj->object_data);
 	     if (o->magic == MAGIC_OBJ_IMAGE)
 	       {
-		  evas_object_image_unload(obj);
+		  evas_object_image_unload(obj, 1);
 	       }
 	  }
      }
@@ -1910,7 +1953,7 @@ evas_image_cache_get(const Evas *e)
 /* all nice and private */
 
 static void
-evas_object_image_unload(Evas_Object *obj)
+evas_object_image_unload(Evas_Object *obj, Evas_Bool dirty)
 {
    Evas_Object_Image *o;
 
@@ -1918,11 +1961,14 @@ evas_object_image_unload(Evas_Object *obj)
 
    if ((!o->cur.file) ||
        (o->pixels_checked_out > 0)) return;
-   if (o->engine_data)
-     o->engine_data = obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output,
-									o->engine_data,
-									0, 0,
-									o->cur.image.w, o->cur.image.h);
+   if (dirty)
+     {
+        if (o->engine_data)
+          o->engine_data = obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output,
+                                                                             o->engine_data,
+                                                                             0, 0,
+                                                                             o->cur.image.w, o->cur.image.h);
+     }
    if (o->engine_data)
      obj->layer->evas->engine.func->image_free(obj->layer->evas->engine.data.output,
 					       o->engine_data);
@@ -2137,6 +2183,9 @@ evas_object_image_render(Evas_Object *obj, void *output, void *context, void *su
 	       }
 	     o->dirty_pixels = 0;
 	  }
+        obj->layer->evas->engine.func->image_scale_hint_set(output,
+                                                            o->engine_data,
+                                                            o->scale_hint);
 	o->engine_data = obj->layer->evas->engine.func->image_border_set(output, o->engine_data,
 									 o->cur.border.l, o->cur.border.r,
 									 o->cur.border.t, o->cur.border.b);
@@ -2626,22 +2675,104 @@ evas_object_image_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
 {
    Evas_Object_Image *o;
    DATA32 *data;
-   int w, h, stride;
+   int w, h, stride, iw, ih;
    int a;
 
    o = (Evas_Object_Image *)(obj->object_data);
 
    x -= obj->cur.cache.clip.x;
    y -= obj->cur.cache.clip.y;
-   w = o->cur.image.w;
-   h = o->cur.image.h;
-
-   if ((x > w) || (y > h))
-     return 0;
-
-   if (!o->cur.has_alpha)
-     return 1;
+   w = obj->cur.geometry.w;
+   h = obj->cur.geometry.h;
+   iw = o->cur.image.w;
+   ih = o->cur.image.h;
+
+   if ((x < 0) || (y < 0) || (x >= w) || (y >= h)) return 0;
+   if (!o->cur.has_alpha) return 1;
+
+   w = o->cur.fill.w;
+   h = o->cur.fill.h;
+   x -= o->cur.fill.x;
+   y -= o->cur.fill.y;
+   x %= w;
+   y %= h;
+   
+   if (x < 0) x += w;
+   if (y < 0) y += h;
+   
+   if (o->cur.border.fill != EVAS_BORDER_FILL_DEFAULT)
+     {
+        if ((x > o->cur.border.l) && (x < (w - o->cur.border.r)) &&
+            (y > o->cur.border.t) && (y < (h - o->cur.border.b)))
+          {
+             if (o->cur.border.fill == EVAS_BORDER_FILL_SOLID) return 1;
+             return 0;
+          }
+     }
+   if (x < o->cur.border.l)
+     {
+        if (y < o->cur.border.t)
+          {
+             // nothing. x & y stay as-is
+          }
+        else if (y > (h - o->cur.border.b))
+          {
+             y = ih - (h - y);
+          }
+        else if ((o->cur.border.t + o->cur.border.b) < ih)
+          {
+             y = ((y - o->cur.border.t) * ih) / (ih - o->cur.border.t - o->cur.border.b);
+          }
+        else
+          return 1;
+     }
+   else if (x > (w - o->cur.border.r))
+     {
+        x = iw - (w - x);
+        if (y < o->cur.border.t)
+          {
+             // nothing. x & y stay as-is
+          }
+        else if (y > (h - o->cur.border.b))
+          {
+             y = ih - (h - y);
+          }
+        else if ((o->cur.border.t + o->cur.border.b) < ih)
+          {
+             y = ((y - o->cur.border.t) * ih) / (ih - o->cur.border.t - o->cur.border.b);
+          }
+        else
+          return 1;
+     }
+   else
+     {
+        if ((o->cur.border.l + o->cur.border.r) < iw)
+          {
+             x = ((x - o->cur.border.l) * iw) / (iw - o->cur.border.l - o->cur.border.r);
+          }
+        else
+          x = o->cur.border.l;
+        if (y < o->cur.border.t)
+          {
+             // nothing. x & y stay as-is
+          }
+        else if (y > (h - o->cur.border.b))
+          {
+             y = ih - (h - y);
+          }
+        else if ((o->cur.border.t + o->cur.border.b) < ih)
+          {
+             y = ((y - o->cur.border.t) * ih) / (ih - o->cur.border.t - o->cur.border.b);
+          }
+        else
+          return 1;
+     }
 
+   if (x < 0) x = 0;
+   if (y < 0) y = 0;
+   if (x >= iw) x = iw - 1;
+   if (y >= ih) y = ih - 1;
+   
    stride = o->cur.image.stride;
 
    o->engine_data = obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output,
diff --git a/src/lib/canvas/evas_object_line.c b/src/lib/canvas/evas_object_line.c
index b2a1716..6b210cb 100644
--- a/src/lib/canvas/evas_object_line.c
+++ b/src/lib/canvas/evas_object_line.c
@@ -441,46 +441,34 @@ static void *evas_object_line_engine_data_get(Evas_Object *obj)
 static int
 evas_object_line_is_opaque(Evas_Object *obj)
 {
-   Evas_Object_Line *o;
-
    /* this returns 1 if the internal object data implies that the object is */
    /* currently fully opaque over the entire line it occupies */
-   o = (Evas_Object_Line *)(obj->object_data);
    return 0;
 }
 
 static int
 evas_object_line_was_opaque(Evas_Object *obj)
 {
-   Evas_Object_Line *o;
-
    /* this returns 1 if the internal object data implies that the object was */
    /* previously fully opaque over the entire line it occupies */
-   o = (Evas_Object_Line *)(obj->object_data);
    return 0;
 }
 
 static int
 evas_object_line_is_inside(Evas_Object *obj, Evas_Coord x __UNUSED__, Evas_Coord y __UNUSED__)
 {
-   Evas_Object_Line *o;
-
    /* this returns 1 if the canvas co-ordinates are inside the object based */
    /* on object private data. not much use for rects, but for polys, images */
    /* and other complex objects it might be */
-   o = (Evas_Object_Line *)(obj->object_data);
    return 1;
 }
 
 static int
 evas_object_line_was_inside(Evas_Object *obj, Evas_Coord x __UNUSED__, Evas_Coord y __UNUSED__)
 {
-   Evas_Object_Line *o;
-
    /* this returns 1 if the canvas co-ordinates were inside the object based */
    /* on object private data. not much use for rects, but for polys, images */
    /* and other complex objects it might be */
-   o = (Evas_Object_Line *)(obj->object_data);
    return 1;
 }
 
diff --git a/src/lib/canvas/evas_object_polygon.c b/src/lib/canvas/evas_object_polygon.c
index f57b615..92754a9 100644
--- a/src/lib/canvas/evas_object_polygon.c
+++ b/src/lib/canvas/evas_object_polygon.c
@@ -444,45 +444,33 @@ static void *evas_object_polygon_engine_data_get(Evas_Object *obj)
 static int
 evas_object_polygon_is_opaque(Evas_Object *obj)
 {
-   Evas_Object_Polygon *o;
-
    /* this returns 1 if the internal object data implies that the object is */
    /* currently fully opaque over the entire line it occupies */
-   o = (Evas_Object_Polygon *)(obj->object_data);
    return 0;
 }
 
 static int
 evas_object_polygon_was_opaque(Evas_Object *obj)
 {
-   Evas_Object_Polygon *o;
-
    /* this returns 1 if the internal object data implies that the object was */
    /* previously fully opaque over the entire line it occupies */
-   o = (Evas_Object_Polygon *)(obj->object_data);
    return 0;
 }
 
 static int
 evas_object_polygon_is_inside(Evas_Object *obj, Evas_Coord x __UNUSED__, Evas_Coord y __UNUSED__)
 {
-   Evas_Object_Polygon *o;
-
    /* this returns 1 if the canvas co-ordinates are inside the object based */
    /* on object private data. not much use for rects, but for polys, images */
    /* and other complex objects it might be */
-   o = (Evas_Object_Polygon *)(obj->object_data);
    return 1;
 }
 
 static int
 evas_object_polygon_was_inside(Evas_Object *obj, Evas_Coord x __UNUSED__, Evas_Coord y __UNUSED__)
 {
-   Evas_Object_Polygon *o;
-
    /* this returns 1 if the canvas co-ordinates were inside the object based */
    /* on object private data. not much use for rects, but for polys, images */
    /* and other complex objects it might be */
-   o = (Evas_Object_Polygon *)(obj->object_data);
    return 1;
 }
diff --git a/src/lib/canvas/evas_object_rectangle.c b/src/lib/canvas/evas_object_rectangle.c
index c95d3e1..749a6ef 100644
--- a/src/lib/canvas/evas_object_rectangle.c
+++ b/src/lib/canvas/evas_object_rectangle.c
@@ -153,10 +153,7 @@ evas_object_rectangle_free(Evas_Object *obj)
 static void
 evas_object_rectangle_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y)
 {
-   Evas_Object_Rectangle *o;
-
    /* render object to surface with context, and offxet by x,y */
-   o = (Evas_Object_Rectangle *)(obj->object_data);
    obj->layer->evas->engine.func->context_color_set(output,
 						    context,
 						    obj->cur.cache.clip.r,
@@ -183,7 +180,6 @@ evas_object_rectangle_render(Evas_Object *obj, void *output, void *context, void
 static void
 evas_object_rectangle_render_pre(Evas_Object *obj)
 {
-   Evas_Object_Rectangle *o;
    int is_v, was_v;
 
    /* dont pre-render the obj twice! */
@@ -194,7 +190,6 @@ evas_object_rectangle_render_pre(Evas_Object *obj)
    /* elsewhere, decoding video etc. */
    /* then when this is done the object needs to figure if it changed and */
    /* if so what and where and add the appropriate redraw rectangles */
-   o = (Evas_Object_Rectangle *)(obj->object_data);
    /* if someone is clipping this obj - go calculate the clipper */
    if (obj->cur.clipper)
      {
@@ -283,12 +278,10 @@ evas_object_rectangle_render_pre(Evas_Object *obj)
 static void
 evas_object_rectangle_render_post(Evas_Object *obj)
 {
-   Evas_Object_Rectangle *o;
 
    /* this moves the current data to the previous state parts of the object */
    /* in whatever way is safest for the object. also if we don't need object */
    /* data anymore we can free it if the object deems this is a good idea */
-   o = (Evas_Object_Rectangle *)(obj->object_data);
    /* remove those pesky changes */
    evas_object_clip_changes_clean(obj);
    /* move cur to prev safely for object data */
@@ -298,11 +291,8 @@ evas_object_rectangle_render_post(Evas_Object *obj)
 static int
 evas_object_rectangle_is_opaque(Evas_Object *obj)
 {
-   Evas_Object_Rectangle *o;
-
    /* this returns 1 if the internal object data implies that the object is */
    /* currently fully opaque over the entire rectangle it occupies */
-   o = (Evas_Object_Rectangle *)(obj->object_data);
    if (obj->cur.render_op == EVAS_RENDER_COPY)
 	return 1;
    if (obj->cur.render_op != EVAS_RENDER_BLEND)
@@ -313,11 +303,8 @@ evas_object_rectangle_is_opaque(Evas_Object *obj)
 static int
 evas_object_rectangle_was_opaque(Evas_Object *obj)
 {
-   Evas_Object_Rectangle *o;
-
    /* this returns 1 if the internal object data implies that the object was */
    /* previously fully opaque over the entire rectangle it occupies */
-   o = (Evas_Object_Rectangle *)(obj->object_data);
    if (obj->prev.render_op == EVAS_RENDER_COPY)
 	return 1;
    if (obj->prev.render_op != EVAS_RENDER_BLEND)
@@ -372,46 +359,34 @@ evas_object_rectangle_unstore(Evas_Object *obj)
 static int
 evas_object_rectangle_is_visible(Evas_Object *obj)
 {
-   Evas_Object_Rectangle *o;
-
    /* this returns 1 if the internal object data would imply that it is */
    /* visible (ie drawing it draws something. this is not to do with events */
-   o = (Evas_Object_Rectangle *)(obj->object_data);
    return 1;
 }
 
 static int
 evas_object_rectangle_was_visible(Evas_Object *obj)
 {
-   Evas_Object_Rectangle *o;
-
    /* this returns 1 if the internal object data would imply that it was */
    /* visible (ie drawing it draws something. this is not to do with events */
-   o = (Evas_Object_Rectangle *)(obj->object_data);
    return 1;
 }
 
 static int
 evas_object_rectangle_is_inside(Evas_Object *obj, double x, double y)
 {
-   Evas_Object_Rectangle *o;
-
    /* this returns 1 if the canvas co-ordinates are inside the object based */
    /* on object private data. not much use for rects, but for polys, images */
    /* and other complex objects it might be */
-   o = (Evas_Object_Rectangle *)(obj->object_data);
    return 1;
 }
 
 static int
 evas_object_rectangle_was_inside(Evas_Object *obj, double x, double y)
 {
-   Evas_Object_Rectangle *o;
-
    /* this returns 1 if the canvas co-ordinates were inside the object based */
    /* on object private data. not much use for rects, but for polys, images */
    /* and other complex objects it might be */
-   o = (Evas_Object_Rectangle *)(obj->object_data);
    return 1;
 }
 #endif
diff --git a/src/lib/canvas/evas_object_table.c b/src/lib/canvas/evas_object_table.c
index 7eb3f85..7aa6c48 100644
--- a/src/lib/canvas/evas_object_table.c
+++ b/src/lib/canvas/evas_object_table.c
@@ -1,5 +1,5 @@
-#include "evas_common.h"
 #include <errno.h>
+#include "evas_common.h"
 
 typedef struct _Evas_Object_Table_Data       Evas_Object_Table_Data;
 typedef struct _Evas_Object_Table_Option     Evas_Object_Table_Option;
diff --git a/src/lib/canvas/evas_object_text.c b/src/lib/canvas/evas_object_text.c
index 1f6d5cb..bf6f6b8 100644
--- a/src/lib/canvas/evas_object_text.c
+++ b/src/lib/canvas/evas_object_text.c
@@ -933,9 +933,12 @@ evas_object_text_outline_color_get(const Evas_Object *obj, int *r, int *g, int *
 }
 
 /**
- * To be documented.
+ * Gets the text style pad.
  *
- * FIXME: To be fixed.
+ * @param l The left pad (or NULL).
+ * @param r The right pad (or NULL).
+ * @param t The top pad (or NULL).
+ * @param b The bottom pad (or NULL).
  *
  */
 EAPI void
@@ -1721,22 +1724,16 @@ static void *evas_object_text_engine_data_get(Evas_Object *obj)
 static int
 evas_object_text_is_opaque(Evas_Object *obj)
 {
-   Evas_Object_Text *o;
-
    /* this returns 1 if the internal object data implies that the object is */
    /* currently fulyl opque over the entire gradient it occupies */
-   o = (Evas_Object_Text *)(obj->object_data);
    return 0;
 }
 
 static int
 evas_object_text_was_opaque(Evas_Object *obj)
 {
-   Evas_Object_Text *o;
-
    /* this returns 1 if the internal object data implies that the object was */
    /* currently fulyl opque over the entire gradient it occupies */
-   o = (Evas_Object_Text *)(obj->object_data);
    return 0;
 }
 
diff --git a/src/lib/canvas/evas_object_textblock.c b/src/lib/canvas/evas_object_textblock.c
index d98dacc..679722e 100644
--- a/src/lib/canvas/evas_object_textblock.c
+++ b/src/lib/canvas/evas_object_textblock.c
@@ -27,20 +27,23 @@ typedef struct _Evas_Object_Textblock_Format      Evas_Object_Textblock_Format;
 #define  NODE_FORMAT 1
 
 struct _Evas_Object_Style_Tag
-{  EINA_INLIST;
+{
+   EINA_INLIST;
    char *tag;
    char *replace;
 };
 
 struct _Evas_Object_Textblock_Node
-{  EINA_INLIST;
+{
+   EINA_INLIST;
    char *text;
    int   type;
    int   len, alloc;
 };
 
 struct _Evas_Object_Textblock_Line
-{  EINA_INLIST;
+{
+   EINA_INLIST;
    Evas_Object_Textblock_Item        *items;
    Evas_Object_Textblock_Format_Item *format_items;
    int                                x, y, w, h;
@@ -49,7 +52,8 @@ struct _Evas_Object_Textblock_Line
 };
 
 struct _Evas_Object_Textblock_Item
-{  EINA_INLIST;
+{
+   EINA_INLIST;
    char                         *text;
    Evas_Object_Textblock_Format *format;
    Evas_Object_Textblock_Node   *source_node;
@@ -60,7 +64,8 @@ struct _Evas_Object_Textblock_Item
 };
 
 struct _Evas_Object_Textblock_Format_Item
-{  EINA_INLIST;
+{
+   EINA_INLIST;
    const char                   *item;
    Evas_Object_Textblock_Node   *source_node;
    int                           x, w;
@@ -111,6 +116,7 @@ struct _Evas_Textblock_Cursor
    Evas_Object                *obj;
    int                         pos;
    Evas_Object_Textblock_Node *node;
+   Eina_Bool                   eol : 1;
 };
 
 struct _Evas_Object_Textblock
@@ -461,9 +467,6 @@ _line_free(const Evas_Object *obj, Evas_Object_Textblock_Line *ln)
 static void
 _lines_clear(const Evas_Object *obj, Evas_Object_Textblock_Line *lines)
 {
-   Evas_Object_Textblock *o;
-
-   o = (Evas_Object_Textblock *)(obj->object_data);
    while (lines)
      {
 	Evas_Object_Textblock_Line *ln;
@@ -744,7 +747,6 @@ _clean_white(int clean_start, int clean_end, char *str)
    p = str;
    p2 = str2;
    white = 0;
-   pwhite = 0;
    start = 1;
    ok = 1;
    while (*p != 0)
@@ -1852,6 +1854,8 @@ _layout_text_append(Ctxt *c, Evas_Object_Textblock_Format *fmt, Evas_Object_Text
 	      c->marginl - c->marginr)))
 	  {
 	     wrap = _layout_text_cutoff_get(c, fmt, it);
+             if (wrap == 0)
+               evas_common_font_utf8_get_next((unsigned char *)str, &wrap);
 	     if (wrap > 0)
 	       {
 		  if (fmt->wrap_word)
@@ -1890,11 +1894,14 @@ _layout_text_append(Ctxt *c, Evas_Object_Textblock_Format *fmt, Evas_Object_Text
 				      if (it->text) free(it->text);
 				      _format_free(c->obj, it->format);
 				      free(it);
-				      it = (Evas_Object_Textblock_Item *)(EINA_INLIST_GET(c->ln->items))->last;
-				      _layout_strip_trailing_whitespace(c, fmt, it);
-				      twrap = _layout_word_end(str, wrap);
-				      ch = evas_common_font_utf8_get_next((unsigned char *)str, &twrap);
-				      str = str + twrap;
+                                      if (c->ln->items)
+                                        {
+                                           it = (Evas_Object_Textblock_Item *)(EINA_INLIST_GET(c->ln->items))->last;
+                                           _layout_strip_trailing_whitespace(c, fmt, it);
+                                           twrap = _layout_word_end(str, wrap);
+                                           ch = evas_common_font_utf8_get_next((unsigned char *)str, &twrap);
+                                           str = str + twrap;
+                                        }
 				   }
 			      }
 			 }
@@ -2245,7 +2252,7 @@ _relayout(const Evas_Object *obj)
 }
 
 static void
-_find_layout_item_line_match(Evas_Object *obj, Evas_Object_Textblock_Node *n, int pos, Evas_Object_Textblock_Line **lnr, Evas_Object_Textblock_Item **itr)
+_find_layout_item_line_match(Evas_Object *obj, Evas_Object_Textblock_Node *n, int pos, int eol, Evas_Object_Textblock_Line **lnr, Evas_Object_Textblock_Item **itr)
 {
    Evas_Object_Textblock_Line *ln;
 /*    Evas_Object_Textblock_Node *nn; */
@@ -2254,16 +2261,33 @@ _find_layout_item_line_match(Evas_Object *obj, Evas_Object_Textblock_Node *n, in
    o = (Evas_Object_Textblock *)(obj->object_data);
 /*    EINA_INLIST_FOREACH(o->nodes, nn) */
 /*      ; */
+   if ((eol) && (n->type == NODE_TEXT))
+     {
+        int pos2 = pos;
+        
+        evas_common_font_utf8_get_prev(n->text, &pos2);
+        if (pos2 < pos) pos = pos2;
+     }
    EINA_INLIST_FOREACH(o->lines, ln)
      {
 	Evas_Object_Textblock_Format_Item *fit;
 	Evas_Object_Textblock_Item *it;
-
+        Evas_Object_Textblock_Line *lnn;
+        
+        lnn = (Evas_Object_Textblock_Line *)(((Eina_Inlist *)ln)->next);
 	EINA_INLIST_FOREACH(ln->items, it)
 	  {
 	     if (it->source_node == n)
 	       {
-		  if ((int)(it->source_pos + strlen(it->text)) >= pos)
+                  Evas_Object_Textblock_Item *itn;
+                  int p;
+                  
+                  itn = (Evas_Object_Textblock_Item *)(((Eina_Inlist *)it)->next);
+                  p = (int)(it->source_pos + strlen(it->text));
+		  if ((p > pos) || 
+                      ((p == pos) && (!lnn) &&
+                       ((!itn)  |
+                        ((itn) && (itn->source_node != n)))))
 		    {
 		       *lnr = ln;
 		       *itr = it;
@@ -3116,6 +3140,7 @@ evas_object_textblock_cursor_new(Evas_Object *obj)
    cur->obj = obj;
    cur->node = o->nodes;
    cur->pos = 0;
+   cur->eol = 0;
    o->cursors = eina_list_append(o->cursors, cur);
    return cur;
 }
@@ -3151,6 +3176,7 @@ evas_textblock_cursor_node_first(Evas_Textblock_Cursor *cur)
    o = (Evas_Object_Textblock *)(cur->obj->object_data);
    cur->node = o->nodes;
    cur->pos = 0;
+   cur->eol = 0;
 }
 
 /**
@@ -3169,12 +3195,14 @@ evas_textblock_cursor_node_last(Evas_Textblock_Cursor *cur)
      {
 	cur->node = (Evas_Object_Textblock_Node *)((EINA_INLIST_GET(o->nodes))->last);
 	cur->pos = 0;
+        cur->eol = 0;  // 1
 	evas_textblock_cursor_char_last(cur);
      }
    else
      {
 	cur->node = NULL;
 	cur->pos = 0;
+        cur->eol = 0; // 1
      }
 }
 
@@ -3186,15 +3214,13 @@ evas_textblock_cursor_node_last(Evas_Textblock_Cursor *cur)
 EAPI Evas_Bool
 evas_textblock_cursor_node_next(Evas_Textblock_Cursor *cur)
 {
-   Evas_Object_Textblock *o;
-   
    if (!cur) return 0;
-   o = (Evas_Object_Textblock *)(cur->obj->object_data);
    if (!cur->node) return 0;
    if ((EINA_INLIST_GET(cur->node))->next)
      {
 	cur->node = (Evas_Object_Textblock_Node *)((EINA_INLIST_GET(cur->node))->next);
 	cur->pos = 0;
+        cur->eol = 0;
 	return 1;
      }
    return 0;
@@ -3208,10 +3234,7 @@ evas_textblock_cursor_node_next(Evas_Textblock_Cursor *cur)
 EAPI Evas_Bool
 evas_textblock_cursor_node_prev(Evas_Textblock_Cursor *cur)
 {
-   Evas_Object_Textblock *o;
-   
    if (!cur) return 0;
-   o = (Evas_Object_Textblock *)(cur->obj->object_data);
    if (!cur->node) return 0;
    if ((EINA_INLIST_GET(cur->node))->prev)
      {
@@ -3230,20 +3253,31 @@ evas_textblock_cursor_node_prev(Evas_Textblock_Cursor *cur)
 EAPI Evas_Bool
 evas_textblock_cursor_char_next(Evas_Textblock_Cursor *cur)
 {
-   Evas_Object_Textblock *o;
-   int index, tindex, ch;
+   int index, ch;
+   int at_start_of_line = 0;
    
    if (!cur) return 0;
-   o = (Evas_Object_Textblock *)(cur->obj->object_data);
    if (!cur->node) return 0;
    if (cur->node->type == NODE_FORMAT) return 0;
    if (!cur->node->text) return 0;
    index = cur->pos;
+
+   if (cur->node->type == NODE_TEXT)
+     {
+        Evas_Object_Textblock_Line *ln = NULL;
+        Evas_Object_Textblock_Item *it = NULL;
+        int pos;
+        
+	_find_layout_item_line_match(cur->obj, cur->node, cur->pos, cur->eol, &ln, &it);
+        pos = cur->pos - it->source_pos;
+        if (pos <= 0) index -= pos;
+     }
+   
    ch = evas_common_font_utf8_get_next((unsigned char *)(cur->node->text), &index);
    if ((ch == 0) || (index < 0)) return 0;
    if (cur->node->text[index] == 0) return 0;
-   tindex = index;
    cur->pos = index;
+   cur->eol = 0; // 1
    return 1;
 }
 
@@ -3255,19 +3289,52 @@ evas_textblock_cursor_char_next(Evas_Textblock_Cursor *cur)
 EAPI Evas_Bool
 evas_textblock_cursor_char_prev(Evas_Textblock_Cursor *cur)
 {
-   Evas_Object_Textblock *o;
-   int index, ch;
+   int index;
+   int at_end_of_line = 0;
+   int at_start_of_line = 0;
    
    if (!cur) return 0;
-   o = (Evas_Object_Textblock *)(cur->obj->object_data);
    if (!cur->node) return 0;
    if (cur->node->type == NODE_FORMAT) return 0;
    if (!cur->node->text) return 0;
    index = cur->pos;
    if (index == 0) return 0;
-   ch = evas_common_font_utf8_get_prev((unsigned char *)(cur->node->text), &index);
+   
+   // XXX: FIXME: determine at_end_of_line and at_start_of_line
+  
+   if (cur->node->type == NODE_TEXT)
+     {
+        Evas_Object_Textblock_Line *ln = NULL;
+        Evas_Object_Textblock_Item *it = NULL;
+        int pos;
+        
+	_find_layout_item_line_match(cur->obj, cur->node, cur->pos, cur->eol, &ln, &it);
+        if (it)
+          {
+             pos = cur->pos - it->source_pos;
+             if (pos <= 0) at_start_of_line = 1;
+             if (it->text)
+               {
+                  int plast;
+                  
+                  plast = evas_common_font_utf8_get_last(it->text, strlen(it->text));
+                  if ((index - it->source_pos) == plast) at_end_of_line = 1;
+               }
+          }
+     }
+   
+   if ((cur->eol) && (at_end_of_line))
+     {
+        cur->eol = 0;
+        return 1;
+     }
+   evas_common_font_utf8_get_prev((unsigned char *)(cur->node->text), &index);
    if (/*(ch == 0) || */(index < 0)) return 0;
    cur->pos = index;
+   if (at_start_of_line)
+     cur->eol =1;
+   else
+     cur->eol = 0;
    return 1;
 }
 
@@ -3281,6 +3348,7 @@ evas_textblock_cursor_char_first(Evas_Textblock_Cursor *cur)
 {
    if (!cur) return;
    cur->pos = 0;
+   cur->eol = 0;
 }
 
 /**
@@ -3303,6 +3371,7 @@ evas_textblock_cursor_char_last(Evas_Textblock_Cursor *cur)
    index = evas_common_font_utf8_get_last((unsigned char *)cur->node->text, cur->node->len);
    if (index < 0) cur->pos = 0;
    cur->pos = index;
+   cur->eol = 0; // 1
 }
 
 /**
@@ -3322,10 +3391,11 @@ evas_textblock_cursor_line_first(Evas_Textblock_Cursor *cur)
    if (!cur->node) return;
    o = (Evas_Object_Textblock *)(cur->obj->object_data);
    if (!o->formatted.valid) _relayout(cur->obj);
+   cur->eol = 0;
    if (cur->node->type == NODE_FORMAT)
      _find_layout_format_item_line_match(cur->obj, cur->node, &ln, &fi);
    else
-     _find_layout_item_line_match(cur->obj, cur->node, cur->pos, &ln, &it);
+     _find_layout_item_line_match(cur->obj, cur->node, cur->pos, cur->eol, &ln, &it);
    if (!ln) return;
    it = (Evas_Object_Textblock_Item *)ln->items;
    fi = (Evas_Object_Textblock_Format_Item *)ln->format_items;
@@ -3363,10 +3433,11 @@ evas_textblock_cursor_line_last(Evas_Textblock_Cursor *cur)
    if (!cur->node) return;
    o = (Evas_Object_Textblock *)(cur->obj->object_data);
    if (!o->formatted.valid) _relayout(cur->obj);
+   cur->eol = 1;
    if (cur->node->type == NODE_FORMAT)
      _find_layout_format_item_line_match(cur->obj, cur->node, &ln, &fi);
    else
-     _find_layout_item_line_match(cur->obj, cur->node, cur->pos, &ln, &it);
+     _find_layout_item_line_match(cur->obj, cur->node, cur->pos, cur->eol, &ln, &it);
    if (!ln) return;
    if (ln->items)
      it = (Evas_Object_Textblock_Item *)((EINA_INLIST_GET(ln->items))->last);
@@ -3393,6 +3464,7 @@ evas_textblock_cursor_line_last(Evas_Textblock_Cursor *cur)
    else if (fi)
      {
 	cur->pos = 0;
+        cur->eol = 0;
 	cur->node = fi->source_node;
      }
 }
@@ -3424,6 +3496,7 @@ evas_textblock_cursor_pos_set(Evas_Textblock_Cursor *cur, int pos)
    if (pos < 0) pos = 0;
    else if (pos > cur->node->len) pos = cur->node->len;
    cur->pos = pos;
+   cur->eol = 0;
 }
 
 /**
@@ -3456,13 +3529,16 @@ evas_textblock_cursor_line_set(Evas_Textblock_Cursor *cur, int line)
    if (it)
      {
 	cur->pos = it->source_pos;
+        cur->eol = 0;
 	cur->node = it->source_node;
      }
    else if (fi)
      {
 	cur->pos = 0;
+        cur->eol = 0;
 	cur->node = fi->source_node;
      }
+   cur->eol = 0;
    return 1;
 }
 
@@ -3485,10 +3561,12 @@ evas_textblock_cursor_compare(const Evas_Textblock_Cursor *cur1, const Evas_Text
      {
 	if (cur1->pos < cur2->pos) return -1; /* cur1 < cur2 */
 	else if (cur1->pos > cur2->pos) return 1; /* cur2 < cur1 */
-	return 0; /* cur1 == cur2 */
+        if ((cur1->eol) == (cur1->eol)) return 0; /* cur1 == cur2 */
+        if (cur1->eol) return 1; /* cur2 < cur1 */
+	return -1; /* cur1 < cur2 */
      }
    for (l1 = EINA_INLIST_GET(cur1->node),
-	  l2 = EINA_INLIST_GET(cur1->node); (l1) || (l2);)
+        l2 = EINA_INLIST_GET(cur1->node); (l1) || (l2);)
      {
 	if (l1 == EINA_INLIST_GET(cur2->node)) return 1; /* cur2 < cur 1 */
 	else if (l2 == EINA_INLIST_GET(cur2->node)) return -1; /* cur1 < cur 2 */
@@ -3514,6 +3592,7 @@ evas_textblock_cursor_copy(const Evas_Textblock_Cursor *cur, Evas_Textblock_Curs
    if (cur->obj != cur_dest->obj) return;
    cur_dest->pos = cur->pos;
    cur_dest->node = cur->node;
+   cur_dest->eol = cur->eol;
 }
 
 
@@ -3582,6 +3661,7 @@ evas_textblock_cursor_text_append(Evas_Textblock_Cursor *cur, const char *text)
      n->text = _strbuf_append(n->text, (char *)text, &(n->len), &(n->alloc));
    else
      n->text = _strbuf_insert(n->text, (char *)text, cur->pos, &(n->len), &(n->alloc));
+// XXX: This makes no sense?   
    cur->pos += strlen(text);
    o->formatted.valid = 0;
    o->native.valid = 0;
@@ -3606,7 +3686,6 @@ evas_textblock_cursor_text_prepend(Evas_Textblock_Cursor *cur, const char *text)
 {
    Evas_Object_Textblock *o;
    Evas_Object_Textblock_Node *n, *nrel;
-   int index;
    
    if (!cur) return;
    o = (Evas_Object_Textblock *)(cur->obj->object_data);
@@ -3652,7 +3731,6 @@ evas_textblock_cursor_text_prepend(Evas_Textblock_Cursor *cur, const char *text)
 	  o->nodes = (Evas_Object_Textblock_Node *)eina_inlist_prepend(EINA_INLIST_GET(o->nodes), EINA_INLIST_GET(n));
      }
    cur->node = n;
-   index = cur->pos;
    if (cur->pos > (n->len - 1))
      n->text = _strbuf_append(n->text, (char *)text, &(n->len), &(n->alloc));
    else
@@ -3736,6 +3814,7 @@ evas_textblock_cursor_format_append(Evas_Textblock_Cursor *cur, const char *form
 	  }
      }
    cur->node = n;
+// XXX: This makes no sense   
    cur->pos = 0;
    o->formatted.valid = 0;
    o->native.valid = 0;
@@ -3872,6 +3951,7 @@ evas_textblock_cursor_node_delete(Evas_Textblock_Cursor *cur)
 	       {
 		  o->cursor->node = cur->node;
 		  o->cursor->pos = cur->pos;
+                  o->cursor->eol = cur->eol;
 	       }
 	  }
 	EINA_LIST_FOREACH(o->cursors, l, data)
@@ -3882,6 +3962,7 @@ evas_textblock_cursor_node_delete(Evas_Textblock_Cursor *cur)
 		    {
 		       data->node = cur->node;
 		       data->pos = cur->pos;
+                       data->eol = cur->eol;
 		    }
 	       }
 	  }
@@ -4215,7 +4296,7 @@ evas_textblock_cursor_range_delete(Evas_Textblock_Cursor *cur1, Evas_Textblock_C
 		  free(n2);
 	       }
 	  }
-	if (format_hump) format_hump = eina_list_free(format_hump);
+	if (format_hump) eina_list_free(format_hump);
 	cur1->node = tcur.node;
 	cur1->pos = tcur.pos;
 	cur2->node = tcur.node;
@@ -4325,19 +4406,11 @@ evas_textblock_cursor_node_format_is_visible_get(const Evas_Textblock_Cursor *cu
      {
 	char *s;
 	char *item;
-	int push = 0;
-	int pop = 0;
 	int visible = 0;
 	
 	s = n->text;
-	if (s[0] == '+')
+	if (s[0] == '+' || s[0] == '-')
 	  {
-	     push = 1;
-	     s++;
-	  }
-	else if (s[0] == '-')
-	  {
-	     pop = 1;
 	     s++;
 	  }
 	while ((item = _format_parse(&s)))
@@ -4368,8 +4441,8 @@ evas_textblock_cursor_range_text_get(const Evas_Textblock_Cursor *cur1, const Ev
    Evas_Object_Textblock *o;
    Evas_Object_Textblock_Node *n1, *n2, *n;
    char *txt = NULL, *s;
-   int txt_len = 0, txt_alloc = 0, chr, index;
-   
+   int txt_len = 0, txt_alloc = 0, index;
+
    if (!cur1) return NULL;
    if (!cur2) return NULL;
    if (cur1->obj != cur2->obj) return NULL;
@@ -4377,7 +4450,7 @@ evas_textblock_cursor_range_text_get(const Evas_Textblock_Cursor *cur1, const Ev
    if (evas_textblock_cursor_compare(cur1, cur2) > 0)
      {
 	const Evas_Textblock_Cursor *tc;
-	
+
 	tc = cur1;
 	cur1 = cur2;
 	cur2 = tc;
@@ -4385,7 +4458,7 @@ evas_textblock_cursor_range_text_get(const Evas_Textblock_Cursor *cur1, const Ev
    n1 = cur1->node;
    n2 = cur2->node;
    index = cur2->pos;
-   chr = evas_common_font_utf8_get_next((unsigned char *)n2->text, &index);
+   evas_common_font_utf8_get_next((unsigned char *)n2->text, &index);
    EINA_INLIST_FOREACH(n1, n)
      {
 	if (n->type == NODE_TEXT)
@@ -4394,7 +4467,7 @@ evas_textblock_cursor_range_text_get(const Evas_Textblock_Cursor *cur1, const Ev
 	     if (format == EVAS_TEXTBLOCK_TEXT_MARKUP)
 	       {
 		  char *p, *ps, *pe;
-	
+
 		  if (n->text)
 		    {
 		       if ((n == n1) && (n == n2))
@@ -4422,7 +4495,7 @@ evas_textblock_cursor_range_text_get(const Evas_Textblock_Cursor *cur1, const Ev
 			 {
 			    const char *escape;
 			    int adv;
-			    
+
 			    escape = _escaped_char_match(p, &adv);
 			    if (escape)
 			      {
@@ -4432,7 +4505,7 @@ evas_textblock_cursor_range_text_get(const Evas_Textblock_Cursor *cur1, const Ev
 			    else
 			      {
 				 char str[2];
-				 
+
 				 str[0] = *p;
 				 str[1] = 0;
 				 txt = _strbuf_append(txt, str, &txt_len, &txt_alloc);
@@ -4490,7 +4563,7 @@ evas_textblock_cursor_range_text_get(const Evas_Textblock_Cursor *cur1, const Ev
 		    {
 		       int push = 0;
 		       int pop = 0;
-		       
+
 		       // FIXME: need to escape
 		       s = n->text;
 		       if (*s == '+') push = 1;
@@ -4540,7 +4613,7 @@ evas_textblock_cursor_char_geometry_get(const Evas_Textblock_Cursor *cur, Evas_C
      }
    else
      {
-	_find_layout_item_line_match(cur->obj, cur->node, cur->pos, &ln, &it);
+	_find_layout_item_line_match(cur->obj, cur->node, cur->pos, cur->eol, &ln, &it);
      }
    if (!ln)
      {
@@ -4550,6 +4623,15 @@ evas_textblock_cursor_char_geometry_get(const Evas_Textblock_Cursor *cur, Evas_C
      {
 	pos = cur->pos - it->source_pos;
 	ret = -1;
+        if (cur->eol)
+          {
+             int pos2;
+             
+             pos2 = pos;
+             evas_common_font_utf8_get_next((unsigned char *)(it->text), &pos2);
+             if (pos2 > pos) pos = pos2;
+          }
+        if (pos < 0) pos = 0;
 	if (it->format->font.font)
 	  ret = cur->ENFN->font_char_coords_get(cur->ENDT, it->format->font.font,
 						it->text,
@@ -4616,7 +4698,7 @@ evas_textblock_cursor_line_geometry_get(const Evas_Textblock_Cursor *cur, Evas_C
    if (cur->node->type == NODE_FORMAT)
      _find_layout_format_item_line_match(cur->obj, cur->node, &ln, &fi);
    else
-     _find_layout_item_line_match(cur->obj, cur->node, cur->pos, &ln, &it);
+     _find_layout_item_line_match(cur->obj, cur->node, cur->pos, cur->eol, &ln, &it);
    if (!ln) return -1;
    x = ln->x;
    y = ln->y;
@@ -4686,6 +4768,7 @@ evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, E
 		  if (((fi->x + ln->x) <= x) && (((fi->x + ln->x) + fi->w) > x))
 		    {
 		       cur->pos = 0;
+                       cur->eol = 0;
 		       cur->node = fi->source_node;
 		       return 1;
 		    }
@@ -4694,6 +4777,7 @@ evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, E
 	       {
 		  it = it_break;
 		  cur->pos = it->source_pos;
+                  cur->eol = 0;
 		  cur->node = it->source_node;
 		  return 1;
 	       }
@@ -4739,7 +4823,6 @@ evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord y)
 EAPI Eina_List *
 evas_textblock_cursor_range_geometry_get(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *cur2)
 {
-   Evas_Object_Textblock *o;
    Eina_List *rects = NULL;
    Evas_Coord cx, cy, cw, ch, lx, ly, lw, lh;
    Evas_Textblock_Rectangle *tr;
@@ -4748,7 +4831,6 @@ evas_textblock_cursor_range_geometry_get(const Evas_Textblock_Cursor *cur1, cons
    if (!cur1) return NULL;
    if (!cur2) return NULL;
    if (cur1->obj != cur2->obj) return NULL;
-   o = (Evas_Object_Textblock *)(cur1->obj->object_data);
    if (evas_textblock_cursor_compare(cur1, cur2) > 0)
      {
 	const Evas_Textblock_Cursor *tc;
@@ -4830,6 +4912,21 @@ evas_textblock_cursor_range_geometry_get(const Evas_Textblock_Cursor *cur1, cons
    return rects;
 }
 
+EAPI Eina_Bool
+evas_textblock_cursor_eol_get(const Evas_Textblock_Cursor *cur)
+{
+   if (!cur) return 0;
+   return cur->eol;
+}
+
+EAPI void
+evas_textblock_cursor_eol_set(Evas_Textblock_Cursor *cur, Eina_Bool eol)
+{
+   if (!cur) return;
+   cur->eol = eol;
+}
+
+
 /* general controls */
 /**
  * to be documented.
@@ -4871,10 +4968,12 @@ evas_object_textblock_clear(Evas_Object *obj)
    _nodes_clear(obj);
    o->cursor->node = NULL;
    o->cursor->pos = 0;
+   o->cursor->eol = 0;
    EINA_LIST_FOREACH(o->cursors, l, cur)
      {
 	cur->node = NULL;
 	cur->pos = 0;
+        cur->eol = 0;
      }
    if (o->lines)
      {
@@ -5531,17 +5630,17 @@ evas_object_textblock_render_pre(Evas_Object *obj)
 static void
 evas_object_textblock_render_post(Evas_Object *obj)
 {
-   Evas_Object_Textblock *o;
+/*   Evas_Object_Textblock *o; */
 
    /* this moves the current data to the previous state parts of the object */
    /* in whatever way is safest for the object. also if we don't need object */
    /* data anymore we can free it if the object deems this is a good idea */
-   o = (Evas_Object_Textblock *)(obj->object_data);
+/*   o = (Evas_Object_Textblock *)(obj->object_data); */
    /* remove those pesky changes */
    evas_object_clip_changes_clean(obj);
    /* move cur to prev safely for object data */
    obj->prev = obj->cur;
-//   o->prev = o->cur;
+/*   o->prev = o->cur; */
 /*   o->changed = 0; */
 }
 
@@ -5575,22 +5674,16 @@ static void *evas_object_textblock_engine_data_get(Evas_Object *obj)
 static int
 evas_object_textblock_is_opaque(Evas_Object *obj)
 {
-   Evas_Object_Textblock *o;
-
    /* this returns 1 if the internal object data implies that the object is */
    /* currently fulyl opque over the entire gradient it occupies */
-   o = (Evas_Object_Textblock *)(obj->object_data);
    return 0;
 }
 
 static int
 evas_object_textblock_was_opaque(Evas_Object *obj)
 {
-   Evas_Object_Textblock *o;
-
    /* this returns 1 if the internal object data implies that the object was */
    /* currently fulyl opque over the entire gradient it occupies */
-   o = (Evas_Object_Textblock *)(obj->object_data);
    return 0;
 }
 
@@ -5611,9 +5704,6 @@ evas_object_textblock_coords_recalc(Evas_Object *obj)
 static void
 evas_object_textblock_scale_update(Evas_Object *obj)
 {
-   Evas_Object_Textblock *o;
-
-   o = (Evas_Object_Textblock *)(obj->object_data);
    _relayout(obj);
 }
 
diff --git a/src/lib/canvas/evas_stats.c b/src/lib/canvas/evas_stats.c
new file mode 100644
index 0000000..0b85ae2
--- /dev/null
+++ b/src/lib/canvas/evas_stats.c
@@ -0,0 +1,182 @@
+#include "evas_common.h"
+#include "evas_private.h"
+#include "evas_cs.h"
+
+EAPI Eina_Bool
+evas_cserve_want_get(void)
+{
+#ifdef EVAS_CSERVE
+   return evas_cserve_use_get();
+#endif
+   return 0;
+}
+
+EAPI Eina_Bool
+evas_cserve_connected_get(void)
+{
+#ifdef EVAS_CSERVE
+   return evas_cserve_have_get();
+#endif
+   return 0;
+}
+
+EAPI Eina_Bool
+evas_cserve_stats_get(Evas_Cserve_Stats *stats)
+{
+#ifdef EVAS_CSERVE
+   Op_Getstats_Reply st;
+   
+   if (!evas_cserve_raw_stats_get(&st)) return 0;
+   if (!stats) return 1;
+   stats->saved_memory = st.saved_memory;
+   stats->wasted_memory - st.wasted_memory;
+   stats->saved_memory_peak - st.saved_memory_peak;
+   stats->wasted_memory_peak - st.wasted_memory_peak;
+   stats->saved_time_image_header_load - st.saved_time_image_header_load;
+   stats->saved_time_image_data_load - st.saved_time_image_data_load;
+   // may expand this in future
+   return 1;
+#else
+   return 0;
+#endif   
+}
+
+EAPI Eina_Bool
+evas_cserve_image_cache_contents_get(Evas_Cserve_Image_Cache *cache)
+{
+#ifdef EVAS_CSERVE
+   Op_Getinfo_Reply *info;
+   Op_Getinfo_Item *itt;
+   unsigned char *p;
+   int i, j;
+   
+   if (!(info = evas_cserve_raw_info_get())) return 0;
+   if (!cache)
+     {
+        free(info);
+        return 1;
+     }
+   cache->active.mem_total = info->active.mem_total;
+   cache->active.count = info->active.count;
+   cache->cached.mem_total = info->cached.mem_total;
+   cache->cached.count = info->cached.count;
+   cache->images = NULL;
+   j = info->active.count + info->cached.count;
+   p = (unsigned char *)info;
+   p += sizeof(Op_Getinfo_Reply);
+   for (i = 0; i < j; i++)
+     {
+        Evas_Cserve_Image *im;
+        Op_Getinfo_Item it;
+        char *file, *key, buf[512];
+        struct tm *ltm;
+        
+        itt = (Op_Getinfo_Item *)p;
+        memcpy(&it, itt, sizeof(Op_Getinfo_Item));
+        file = p + sizeof(Op_Getinfo_Item);
+        key = file + strlen(file) + 1;
+        im = calloc(1, sizeof(Evas_Cserve_Image));
+        if (!im) continue;
+        if (file[0] != 0)
+          {
+             file = (char *)eina_stringshare_add(file);
+             if (!file)
+               {
+                  free(im);
+                  continue;
+               }
+          }
+        else
+          file = NULL;
+        if (key[0] != 0)
+          {
+             key = (char *)eina_stringshare_add(key);
+             if (!key)
+               {
+                  if (file) eina_stringshare_del(file);
+                  free(im);
+                  continue;
+               }
+          }
+        else key = NULL;
+        cache->images = eina_list_append(cache->images, im);
+        im->file = file;
+        im->key = key;
+        im->w = it.w;
+        im->h = it.h;
+        im->cached_time = it.cached_time;
+        im->file_mod_time = it.file_mod_time;
+        im->file_checked_time = it.file_checked_time;
+        im->refcount = it.refcount;
+        im->data_refcount = it.data_refcount;
+        im->memory_footprint = it.memory_footprint;
+        im->head_load_time = it.head_load_time;
+        im->data_load_time = it.data_load_time;
+        im->active = it.active;
+        im->alpha = it.alpha;
+        im->data_loaded = it.data_loaded;
+        im->dead = it.dead;
+        im->useless = it.useless;
+     }
+   free(info);
+   return 1;
+#else
+   return 0;
+#endif   
+}
+
+EAPI void
+evas_cserve_image_cache_contents_clean(Evas_Cserve_Image_Cache *cache)
+{
+#ifdef EVAS_CSERVE
+   Evas_Cserve_Image *im;
+   
+   EINA_LIST_FREE(cache->images, im)
+     {
+        if (im->file) eina_stringshare_del(im->file);
+        if (im->key) eina_stringshare_del(im->key);
+        free(im);
+     }
+#endif   
+}
+
+EAPI Eina_Bool
+evas_cserve_config_get(Evas_Cserve_Config *config)
+{
+#ifdef EVAS_CSERVE
+   Op_Getconfig_Reply conf;
+   
+   if (!evas_cserve_raw_config_get(&conf)) return 0;
+   if (!config) return 1;
+   config->cache_max_usage = conf.cache_max_usage;
+   config->cache_item_timeout = conf.cache_item_timeout;
+   config->cache_item_timeout_check = conf.cache_item_timeout_check;
+   return 1;
+#else
+   return 0;
+#endif   
+}
+
+EAPI Eina_Bool
+evas_cserve_config_set(Evas_Cserve_Config *config)
+{
+#ifdef EVAS_CSERVE
+   Op_Setconfig conf;
+
+   if (!config) return 1;
+   conf.cache_max_usage = config->cache_max_usage;
+   conf.cache_item_timeout = config->cache_item_timeout;
+   conf.cache_item_timeout_check = config->cache_item_timeout_check;
+   return evas_cserve_raw_config_set(&conf);
+#else
+   return 0;
+#endif   
+}
+
+EAPI void
+evas_cserve_disconnect(void)
+{
+#ifdef EVAS_CSERVE
+   evas_cserve_discon();
+#endif   
+}
diff --git a/src/lib/cserve/Makefile.am b/src/lib/cserve/Makefile.am
new file mode 100644
index 0000000..5d33c81
--- /dev/null
+++ b/src/lib/cserve/Makefile.am
@@ -0,0 +1,31 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I. \
+-I$(top_srcdir)/src/lib \
+-I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/lib/cserve \
+-DPACKAGE_BIN_DIR=\"$(bindir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+ at EINA_CFLAGS@ \
+ at FREETYPE_CFLAGS@ \
+ at FRIBIDI_CFLAGS@ \
+ at EET_CFLAGS@ \
+ at FONTCONFIG_CFLAGS@ \
+ at pthread_cflags@
+
+if EVAS_CSERVE
+
+noinst_LTLIBRARIES = libevas_cserve.la
+
+endif
+
+libevas_cserve_la_SOURCES = \
+evas_cs.h \
+evas_cs_main.c \
+evas_cs_server.c \
+evas_cs_client.c \
+evas_cs_mem.c
+
+libevas_cserve_la_LIBADD = @EINA_LIBS@ -lrt
diff --git a/src/lib/file/Makefile.in b/src/lib/cserve/Makefile.in
similarity index 92%
copy from src/lib/file/Makefile.in
copy to src/lib/cserve/Makefile.in
index 5b3ff4b..f47865f 100644
--- a/src/lib/file/Makefile.in
+++ b/src/lib/cserve/Makefile.in
@@ -32,7 +32,7 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-subdir = src/lib/file
+subdir = src/lib/cserve
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
@@ -49,9 +49,11 @@ mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 LTLIBRARIES = $(noinst_LTLIBRARIES)
-libevas_file_la_DEPENDENCIES =
-am_libevas_file_la_OBJECTS = evas_path.lo evas_module.lo
-libevas_file_la_OBJECTS = $(am_libevas_file_la_OBJECTS)
+libevas_cserve_la_DEPENDENCIES =
+am_libevas_cserve_la_OBJECTS = evas_cs_main.lo evas_cs_server.lo \
+	evas_cs_client.lo evas_cs_mem.lo
+libevas_cserve_la_OBJECTS = $(am_libevas_cserve_la_OBJECTS)
+ at EVAS_CSERVE_TRUE@am_libevas_cserve_la_rpath =
 DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
@@ -64,8 +66,8 @@ CCLD = $(CC)
 LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
 	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
 	$(LDFLAGS) -o $@
-SOURCES = $(libevas_file_la_SOURCES)
-DIST_SOURCES = $(libevas_file_la_SOURCES)
+SOURCES = $(libevas_cserve_la_SOURCES)
+DIST_SOURCES = $(libevas_cserve_la_SOURCES)
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -222,6 +224,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
@@ -289,22 +293,26 @@ AM_CPPFLAGS = \
 -I. \
 -I$(top_srcdir)/src/lib \
 -I$(top_srcdir)/src/lib/include \
+-I$(top_srcdir)/src/lib/cserve \
 -DPACKAGE_BIN_DIR=\"$(bindir)\" \
 -DPACKAGE_LIB_DIR=\"$(libdir)\" \
 -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
- at FREETYPE_CFLAGS@ \
 @EINA_CFLAGS@ \
- at EVIL_CFLAGS@ \
- at WIN32_CPPFLAGS@
-
-AM_CFLAGS = @WIN32_CFLAGS@
-noinst_LTLIBRARIES = libevas_file.la
-libevas_file_la_SOURCES = \
-evas_path.c \
-evas_module.c
-
-libevas_file_la_LIBADD = @EINA_LIBS@ @EVIL_LIBS@
-EXTRA_DIST = evas_module.h evas_path.h
+ at FREETYPE_CFLAGS@ \
+ at FRIBIDI_CFLAGS@ \
+ at EET_CFLAGS@ \
+ at FONTCONFIG_CFLAGS@ \
+ at pthread_cflags@
+
+ at EVAS_CSERVE_TRUE@noinst_LTLIBRARIES = libevas_cserve.la
+libevas_cserve_la_SOURCES = \
+evas_cs.h \
+evas_cs_main.c \
+evas_cs_server.c \
+evas_cs_client.c \
+evas_cs_mem.c
+
+libevas_cserve_la_LIBADD = @EINA_LIBS@ -lrt
 all: all-am
 
 .SUFFIXES:
@@ -318,9 +326,9 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/lib/file/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/lib/cserve/Makefile'; \
 	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  src/lib/file/Makefile
+	  $(AUTOMAKE) --gnu  src/lib/cserve/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -347,8 +355,8 @@ clean-noinstLTLIBRARIES:
 	  echo "rm -f \"$${dir}/so_locations\""; \
 	  rm -f "$${dir}/so_locations"; \
 	done
-libevas_file.la: $(libevas_file_la_OBJECTS) $(libevas_file_la_DEPENDENCIES) 
-	$(LINK)  $(libevas_file_la_OBJECTS) $(libevas_file_la_LIBADD) $(LIBS)
+libevas_cserve.la: $(libevas_cserve_la_OBJECTS) $(libevas_cserve_la_DEPENDENCIES) 
+	$(LINK) $(am_libevas_cserve_la_rpath) $(libevas_cserve_la_OBJECTS) $(libevas_cserve_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -356,8 +364,10 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_module.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_path.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_cs_client.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_cs_main.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_cs_mem.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/evas_cs_server.Plo at am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
diff --git a/src/lib/cserve/evas_cs.h b/src/lib/cserve/evas_cs.h
new file mode 100644
index 0000000..68b3085
--- /dev/null
+++ b/src/lib/cserve/evas_cs.h
@@ -0,0 +1,274 @@
+#ifndef EVAS_CS_H
+#define EVAS_CS_H 1
+
+#ifdef EVAS_CSERVE
+
+#include <sys/select.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/param.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <netinet/in.h>
+#include <sys/un.h>
+#include <arpa/inet.h>
+#include <errno.h>
+
+#include "evas_common.h"
+#include "evas_private.h"
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EVAS_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif /* ! DLL_EXPORT */
+# else
+#  define EAPI __declspec(dllimport)
+# endif /* ! EFL_EVAS_BUILD */
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+#define LENGTH_OF_SOCKADDR_UN(s) (strlen((s)->sun_path) + (size_t)(((struct sockaddr_un *)NULL)->sun_path))
+
+typedef struct _Server Server;
+typedef struct _Client Client;
+typedef struct _Mem Mem;
+
+struct _Server
+{
+   char *socket_path;
+   int fd;
+   Eina_List *clients;
+   int (*func) (void *fdata, Server *s, Client *c, int opcode, int size, unsigned char *data);
+   void *data;
+   pid_t pid;
+   int server_id;
+   int req_from, req_to;
+};
+
+struct _Client
+{
+   Server *server;
+   unsigned char *buf;
+   int bufsize, bufalloc;
+   int fd;
+   unsigned char *inbuf;
+   int inbufsize, inbufalloc;
+   unsigned char dead : 1;
+   void (*func) (void *fdata, Client *c);
+   void *data;
+   pid_t pid;
+   int req_from, req_to;
+};
+
+struct _Mem
+{
+   unsigned char *data;
+   char *name;
+   int fd;
+   int id;
+   int offset;
+   int size;
+   int ref;
+   Eina_Bool write : 1;
+};
+
+//// for comms
+enum
+{
+   OP_NOP, // 0
+     
+     OP_INIT, // 1
+     OP_LOAD, // 2
+     OP_UNLOAD, // 3
+     OP_LOADDATA, // 4
+     OP_UNLOADDATA, // 5
+     OP_USELESSDATA, // 6
+     OP_PRELOAD, // 7
+     OP_FORCEDUNLOAD, // 8
+     
+     OP_GETCONFIG, // 9
+     OP_SETCONFIG, // 10
+     OP_GETSTATS, // 11
+     OP_GETINFO, // 12
+     
+   OP_INVALID // 13
+};
+
+typedef struct
+{
+   pid_t pid;
+   int server_id;
+} Op_Init;
+typedef struct
+{
+   struct {
+      int    scale_down_by;
+      double dpi;
+      int    w, h;
+   } lopt;
+} Op_Load; // +"file""key"
+typedef struct
+{
+   void *handle;
+   int server_id;
+   struct {
+      int id;
+      int offset;
+      int size;
+   } mem;
+   struct {
+      int w, h;
+      Eina_Bool alpha : 1;
+   } image;
+} Op_Load_Reply;
+typedef struct
+{
+   void *handle;
+   int server_id;
+} Op_Unload;
+typedef struct
+{
+   void *handle;
+   int server_id;
+} Op_Unloaddata;
+typedef struct
+{
+   void *handle;
+   int server_id;
+} Op_Loaddata;
+typedef struct
+{
+   struct {
+      int id;
+      int offset;
+      int size;
+   } mem;
+} Op_Loaddata_Reply;
+typedef struct
+{
+   void *handle;
+   int server_id;
+} Op_Preload;
+typedef struct
+{
+   void *handle;
+   struct {
+      int id;
+      int offset;
+      int size;
+   } mem;
+} Op_Preload_Reply;
+typedef struct
+{
+   void *handle;
+   int server_id;
+} Op_Forcedunload;
+typedef struct
+{
+   int cache_max_usage;
+   int cache_item_timeout;
+   int cache_item_timeout_check;
+} Op_Getconfig_Reply;
+typedef struct
+{
+   int cache_max_usage;
+   int cache_item_timeout;
+   int cache_item_timeout_check;
+} Op_Setconfig;
+typedef struct
+{
+   int saved_memory;
+   int wasted_memory;
+   int saved_memory_peak;
+   int wasted_memory_peak;
+   double saved_time_image_header_load;
+   double saved_time_image_data_load;
+} Op_Getstats_Reply;
+typedef struct
+{
+   struct {
+      int mem_total;
+      int count;
+   } active, cached;
+} Op_Getinfo_Reply; // + N active Info Items + N cached items
+typedef struct
+{
+   int file_key_size;
+   int w, h;
+   time_t file_mod_time;
+   time_t file_checked_time;
+   time_t cached_time;
+   int refcount;
+   int data_refcount;
+   int memory_footprint;
+   double head_load_time;
+   double data_load_time;
+   Eina_Bool alpha : 1;
+   Eina_Bool data_loaded : 1;
+   Eina_Bool active : 1;
+   Eina_Bool dead : 1;
+   Eina_Bool useless : 1;
+} Op_Getinfo_Item; // + "file""key"
+
+
+// for clients to connect to cserve
+EAPI Eina_Bool evas_cserve_init(void);
+EAPI int       evas_cserve_use_get(void);
+EAPI Eina_Bool evas_cserve_have_get(void);
+EAPI void      evas_cserve_shutdown(void);
+EAPI void      evas_cserve_discon(void);
+EAPI Eina_Bool evas_cserve_image_load(Image_Entry *ie, const char *file, const char *key, RGBA_Image_Loadopts *lopt);
+EAPI Eina_Bool evas_cserve_image_data_load(Image_Entry *ie);
+EAPI void      evas_cserve_image_unload(Image_Entry *ie);
+EAPI void      evas_cserve_image_useless(Image_Entry *ie);
+EAPI void      evas_cserve_image_free(Image_Entry *ie);
+EAPI Eina_Bool evas_cserve_raw_config_get(Op_Getconfig_Reply *config);
+EAPI Eina_Bool evas_cserve_raw_config_set(Op_Setconfig *config);
+EAPI Eina_Bool evas_cserve_raw_stats_get(Op_Getstats_Reply *stats);
+EAPI Op_Getinfo_Reply *evas_cserve_raw_info_get(void);
+    
+// for the server
+EAPI Server *evas_cserve_server_add(void);
+EAPI void evas_cserve_server_del(Server *s);
+EAPI void evas_cserve_client_send(Client *c, int opcode, int size, unsigned char *data);
+EAPI void evas_cserve_server_message_handler_set(Server *s, int (*func) (void *fdata, Server *s, Client *c, int opcode, int size, unsigned char *data), void *data);
+EAPI void evas_cserve_server_wait(Server *s, int timeout);
+    
+//// for memory
+// for server
+EAPI Mem *evas_cserve_mem_new(int size, const char *name);
+EAPI void evas_cserve_mem_free(Mem *m);
+    
+// for client
+EAPI Mem *evas_cserve_mem_open(int pid, int id, const char *name, int size, int write);
+EAPI void evas_cserve_mem_close(Mem *m);
+
+// for both
+EAPI Eina_Bool evas_cserve_mem_resize(Mem *m, int size);
+EAPI void      evas_cserve_mem_del(int pid, int id);
+
+#endif
+
+#endif
diff --git a/src/lib/cserve/evas_cs_client.c b/src/lib/cserve/evas_cs_client.c
new file mode 100644
index 0000000..c867af4
--- /dev/null
+++ b/src/lib/cserve/evas_cs_client.c
@@ -0,0 +1,494 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <signal.h>
+
+#include "evas_cs.h"
+
+#ifdef EVAS_CSERVE
+
+static Server *cserve = NULL;
+static int csrve_init = 0;
+static int connect_num = 0;
+static int cserve_discon = 0;
+
+static void
+pipe_handler(int x, siginfo_t *info, void *data)
+{
+}
+
+static void
+pipe_handle(int push)
+{
+   static struct sigaction old_action;
+   struct sigaction action;
+
+   if (push)
+     {
+        action.sa_handler = NULL;
+        action.sa_sigaction = pipe_handler;
+        action.sa_flags = SA_RESTART | SA_SIGINFO;
+        sigemptyset(&action.sa_mask);
+        sigaction(SIGPIPE, &action, &old_action);
+     }
+   else
+     {
+        sigaction(SIGPIPE, &old_action, &action);
+     }
+}
+
+static Server *
+server_connect(void)
+{
+   Server *s;
+   char buf[PATH_MAX];
+   int curstate = 0;
+   struct sockaddr_un socket_unix;
+   int socket_unix_len;
+   
+   s = calloc(1, sizeof(Server));
+   if (!s) return NULL;
+   s->fd = -1;
+   snprintf(buf, sizeof(buf), "/tmp/.evas-cserve-%x", getuid());
+   s->socket_path = strdup(buf);
+   if (!s->socket_path)
+     {
+        free(s);
+        return NULL;
+     }
+   s->fd = socket(AF_UNIX, SOCK_STREAM, 0);
+   if (s->fd < 0) goto error;
+   if (fcntl(s->fd, F_SETFD, FD_CLOEXEC) < 0) goto error;
+   if (setsockopt(s->fd, SOL_SOCKET, SO_REUSEADDR, &curstate, sizeof(curstate)) < 0)
+     goto error;
+   socket_unix.sun_family = AF_UNIX;
+   strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path));
+   socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix);
+   if (connect(s->fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0) goto error;
+   return s;
+   error:
+   if (s->fd >= 0) close(s->fd);
+   free(s->socket_path);
+   free(s);
+   return NULL;
+}
+
+static void
+server_disconnect(Server *s)
+{
+   close(s->fd);
+   free(s->socket_path);
+   free(s);
+}
+
+static int
+server_send(Server *s, int opcode, int size, unsigned char *data)
+{
+   int ints[3];
+   int num;
+   
+   pipe_handle(1);
+   ints[0] = size;
+   ints[1] = opcode;
+   s->req_to++;
+   ints[2] = s->req_to;
+   num = write(s->fd, ints, (sizeof(int) * 3));
+   if (num < 0)
+     {
+        pipe_handle(0);
+        if (cserve) server_disconnect(cserve);
+        cserve = NULL;
+        return 0;
+     }
+   num = write(s->fd, data, size);
+   if (num < 0)
+     {
+        pipe_handle(0);
+        if (cserve) server_disconnect(cserve);
+        cserve = NULL;
+        return 0;
+     }
+   pipe_handle(0);
+   return 1;
+}
+
+static unsigned char *
+server_read(Server *s, int *opcode, int *size)
+{
+   int ints[3], num, left;
+   unsigned char *data;
+   
+   num = read(s->fd, ints, sizeof(int) * 3);
+   if (num != (sizeof(int) * 3))
+     {
+        if (cserve) server_disconnect(cserve);
+        cserve = NULL;
+        return NULL;
+     }
+   *size = ints[0];
+   *opcode = ints[1];
+   if ((*size < 0) || (*size > (1024 * 1024))) return NULL;
+   if (ints[2] != (s->req_from + 1))
+     {
+        printf("EEK! sequence number mismatch from serer with pid: %i\n"
+               "---- num %i is not 1 more than %i\n"
+               ,
+               s->pid, ints[2], s->req_from);
+        return NULL;
+     }
+   s->req_from++;
+   data = malloc(*size);
+   if (!data) return NULL;
+   num = read(s->fd, data, *size);
+   if (num < 0)
+     {
+        free(data);
+        return NULL;
+     }
+   left = *size - num;
+   while (left > 0)
+     {
+        num = read(s->fd, data + (*size - left), left);
+        if (num < 0)
+          {
+             free(data);
+             return NULL;
+          }
+        left -= num;
+     }
+   return data;
+}
+
+static int
+server_init(Server *s)
+{
+   Op_Init msg, *rep;
+   int opcode;
+   int size;
+   
+   msg.pid = getpid();
+   msg.server_id = 0;
+   if (!server_send(s, OP_INIT, sizeof(msg), (unsigned char *)(&msg)))
+     return 0;
+   rep = (Op_Init *)server_read(s, &opcode, &size);
+   if ((rep) && (opcode == OP_INIT) && (size == sizeof(Op_Init)))
+     {
+        s->pid = rep->pid;
+        s->server_id = rep->server_id;
+        free(rep);
+        connect_num++;
+        return 1;
+     }
+   if (rep) free(rep);
+   return 0;
+}
+
+EAPI Eina_Bool
+evas_cserve_init(void)
+{
+   csrve_init++;
+   if (cserve) return 1;
+   cserve = server_connect();
+   if (!cserve) return 0;
+   if (!server_init(cserve))
+     {
+        if (cserve) server_disconnect(cserve);
+        cserve = NULL;
+        return 0;
+     }
+   return 1;
+}
+
+EAPI int
+evas_cserve_use_get(void)
+{
+   return csrve_init;
+}
+
+EAPI Eina_Bool
+evas_cserve_have_get(void)
+{
+   if (cserve) return 1;
+   return 0;
+}
+
+EAPI void
+evas_cserve_shutdown(void)
+{
+   csrve_init--;
+   if (csrve_init > 0) return;
+   if (!cserve) return;
+   server_disconnect(cserve);
+   cserve = NULL;
+}
+
+EAPI void
+evas_cserve_discon(void)
+{
+   if (cserve)
+     {
+        server_disconnect(cserve);
+        cserve = NULL;
+        cserve_discon = 1;
+     }
+}
+
+static void
+server_reinit(void)
+{
+   if (cserve) return;
+   if (cserve_discon) return;
+   cserve = server_connect();
+   if (cserve)
+     {
+        if (!server_init(cserve))
+          {
+             if (cserve) server_disconnect(cserve);
+             cserve = NULL;
+          }
+     }
+}
+
+EAPI Eina_Bool
+evas_cserve_image_load(Image_Entry *ie, const char *file, const char *key, RGBA_Image_Loadopts *lopt)
+{
+   Op_Load msg;
+   Op_Load_Reply *rep;
+   unsigned char *buf;
+   char fbuf[PATH_MAX], wdb[PATH_MAX];
+   int flen, klen;
+   int opcode;
+   int size;
+   
+   if (csrve_init > 0) server_reinit();
+   else return 0;
+   if (!cserve) return 0;
+   if (!key) key = "";
+   memset(&msg, 0, sizeof(msg));
+   msg.lopt.scale_down_by = lopt->scale_down_by;
+   msg.lopt.dpi = lopt->dpi;
+   msg.lopt.w = lopt->w;
+   msg.lopt.h = lopt->h;
+   if (file[0] != '/')
+     {
+        if (getcwd(wdb, sizeof(wdb)))
+          {
+             snprintf(fbuf, sizeof(buf), "%s/%s", wdb, file);
+             file = fbuf;
+          }
+     }
+   if (!realpath(file, wdb)) file = wdb;
+   flen = strlen(file) + 1;
+   klen = strlen(key) + 1;
+   buf = malloc(sizeof(msg) + flen + klen);
+   memcpy(buf, &msg, sizeof(msg));
+   strcpy(buf + sizeof(msg), file);
+   strcpy(buf + sizeof(msg) + flen, key);
+   if (!buf) return 0;
+   if (!server_send(cserve, OP_LOAD, 
+                    sizeof(msg) + flen + klen,
+                    buf))
+     {
+        free(buf);
+        return 0;
+     }
+   free(buf);
+   if (!cserve) return 0;
+   rep = (Op_Load_Reply *)server_read(cserve, &opcode, &size);
+   if ((rep) && (opcode == OP_LOAD) && (size == sizeof(Op_Load_Reply)))
+     {
+        ie->w = rep->image.w;
+        ie->h = rep->image.h;
+        ie->flags.alpha = rep->image.alpha;
+        ie->data1 = rep->handle;
+     }
+   if (rep) free(rep);
+   if (ie->data1 == NULL) return 0;
+   ie->connect_num = connect_num;
+   if (cserve)
+     ie->server_id = cserve->server_id;
+   return 1;
+}
+
+EAPI Eina_Bool
+evas_cserve_image_data_load(Image_Entry *ie)
+{
+   Op_Loaddata msg;
+   Op_Loaddata_Reply *rep;
+   int opcode;
+   int size;
+   if (csrve_init > 0) server_reinit();
+   else return 0;
+   if (!cserve) return 0;
+   if (ie->data1 == NULL) return 0;
+   if (cserve->server_id != ie->server_id)
+     {
+        ie->data1 = NULL;
+        if (!evas_cserve_image_load(ie, ie->file, ie->key, &(ie->load_opts)))
+          return 0;
+     }
+   if (ie->connect_num != connect_num) return 0;
+   memset(&msg, 0, sizeof(msg));
+   msg.handle = ie->data1;
+   msg.server_id = cserve->server_id;
+   if (!server_send(cserve, OP_LOADDATA, sizeof(msg), (unsigned char *)(&msg)))
+     return 0;
+   if (!cserve) return 0;
+   rep = (Op_Loaddata_Reply *)server_read(cserve, &opcode, &size);
+   if ((rep) && (opcode == OP_LOADDATA) && (size == sizeof(Op_Loaddata_Reply)))
+     {
+        if (rep->mem.size <= 0)
+          {
+             free(rep);
+             return 0;
+          }
+        ie->data2 = evas_cserve_mem_open(cserve->pid, rep->mem.id, NULL, rep->mem.size, 0);
+        free(rep);
+        return 1;
+     }
+   if (rep) free(rep);
+   return 0;
+}
+
+EAPI void
+evas_cserve_image_free(Image_Entry *ie)
+{
+   Op_Unload msg;
+   
+   if (csrve_init > 0) server_reinit();
+   else return;
+   if (!cserve) return;
+   if (ie->data1 == NULL) return;
+   memset(&msg, 0, sizeof(msg));
+   msg.handle = ie->data1;
+   msg.server_id = cserve->server_id;
+   if (ie->data2) evas_cserve_image_unload(ie);
+   if (cserve)
+     {
+        if (ie->connect_num == connect_num)
+          {
+             if (ie->server_id == cserve->server_id)
+               server_send(cserve, OP_UNLOAD, sizeof(msg), (unsigned char *)(&msg));
+          }
+     }
+   ie->data1 = NULL;
+   ie->data2 = NULL;
+}
+
+EAPI void
+evas_cserve_image_unload(Image_Entry *ie)
+{
+   Op_Unloaddata msg;
+   
+   if (csrve_init > 0) server_reinit();
+   else return;
+   if (!cserve) return;
+   if (ie->data1 == NULL) return;
+   if (ie->connect_num != connect_num) return 0;
+   memset(&msg, 0, sizeof(msg));
+   msg.handle = ie->data1;
+   msg.server_id = cserve->server_id;
+   if (ie->data2) evas_cserve_mem_close(ie->data2);
+   ie->data2 = NULL;
+   if (ie->connect_num == connect_num)
+     {
+        if (ie->server_id == cserve->server_id)
+          server_send(cserve, OP_UNLOADDATA, sizeof(msg), (unsigned char *)(&msg));
+     }
+}
+
+EAPI void
+evas_cserve_image_useless(Image_Entry *ie)
+{
+   Op_Unloaddata msg;
+   
+   if (csrve_init > 0) server_reinit();
+   else return;
+   if (!cserve) return;
+   if (ie->data1 == NULL) return;
+   if (ie->connect_num != connect_num) return 0;
+   memset(&msg, 0, sizeof(msg));
+   msg.handle = ie->data1;
+   msg.server_id = cserve->server_id;
+   if (ie->data2) evas_cserve_mem_close(ie->data2);
+   ie->data2 = NULL;
+   if (ie->connect_num == connect_num)
+     {
+        if (ie->server_id == cserve->server_id)
+          server_send(cserve, OP_USELESSDATA, sizeof(msg), (unsigned char *)(&msg));
+     }
+}
+
+EAPI Eina_Bool
+evas_cserve_raw_config_get(Op_Getconfig_Reply *config)
+{
+   Op_Getconfig_Reply *rep;
+   int opcode;
+   int size;
+   if (csrve_init > 0) server_reinit();
+   else return 0;
+   if (!cserve) return 0;
+   if (!server_send(cserve, OP_GETCONFIG, 0, NULL)) return 0;
+   rep = (Op_Getconfig_Reply *)server_read(cserve, &opcode, &size);
+   if ((rep) && (opcode == OP_GETCONFIG) && (size == sizeof(Op_Getconfig_Reply)))
+     {
+        memcpy(config, rep, sizeof(Op_Getconfig_Reply));
+        free(rep);
+        return 1;
+     }
+   if (rep) free(rep);
+   return 0;
+}
+
+EAPI Eina_Bool
+evas_cserve_raw_config_set(Op_Setconfig *config)
+{
+   if (csrve_init > 0) server_reinit();
+   else return 0;
+   if (!cserve) return 0;
+   if (!server_send(cserve, OP_SETCONFIG, sizeof(Op_Setconfig), (unsigned char *)config)) return 0;
+   return 1;
+}
+
+EAPI Eina_Bool
+evas_cserve_raw_stats_get(Op_Getstats_Reply *stats)
+{
+   Op_Getstats_Reply *rep;
+   int opcode;
+   int size;
+   if (csrve_init > 0) server_reinit();
+   else return 0;
+   if (!cserve) return 0;
+   if (!server_send(cserve, OP_GETSTATS, 0, NULL)) return 0;
+   rep = (Op_Getstats_Reply *)server_read(cserve, &opcode, &size);
+   if ((rep) && (opcode == OP_GETSTATS) && (size == sizeof(Op_Getstats_Reply)))
+     {
+        memcpy(stats, rep, sizeof(Op_Getstats_Reply));
+        free(rep);
+        return 1;
+     }
+   if (rep) free(rep);
+   return 0;
+}
+
+EAPI Op_Getinfo_Reply *
+evas_cserve_raw_info_get(void)
+{
+   Op_Getinfo_Reply *rep;
+   int opcode;
+   int size;
+   if (csrve_init > 0) server_reinit();
+   else return NULL;
+   if (!cserve) return NULL;
+   if (!server_send(cserve, OP_GETINFO, 0, NULL)) return NULL;
+   rep = (Op_Getinfo_Reply *)server_read(cserve, &opcode, &size);
+   if ((rep) && (opcode == OP_GETINFO) && (size >= sizeof(Op_Getinfo_Reply)))
+     {
+        return rep;
+     }
+   if (rep) free(rep);
+   return NULL;
+}
+
+#endif
diff --git a/src/lib/cserve/evas_cs_main.c b/src/lib/cserve/evas_cs_main.c
new file mode 100644
index 0000000..e8282aa
--- /dev/null
+++ b/src/lib/cserve/evas_cs_main.c
@@ -0,0 +1,9 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "evas_cs.h"
+
+#ifdef EVAS_CSERVE
+
+#endif
diff --git a/src/lib/cserve/evas_cs_mem.c b/src/lib/cserve/evas_cs_mem.c
new file mode 100644
index 0000000..1fff9ba
--- /dev/null
+++ b/src/lib/cserve/evas_cs_mem.c
@@ -0,0 +1,160 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "evas_cs.h"
+
+#ifdef EVAS_CSERVE
+
+EAPI Mem *
+evas_cserve_mem_new(int size, const char *name)
+{
+   Mem *m;
+   static int id = 0;
+   char buf[PATH_MAX];
+   
+   m = calloc(1, sizeof(Mem));
+   if (!m) return NULL;
+   if (name)
+     snprintf(buf, sizeof(buf), "/evas-shm-%x.%s", getuid(), name);
+   else
+     {
+        id++;
+        snprintf(buf, sizeof(buf), "/evas-shm-%x.%x.%x", getuid(), getpid(), id);
+     }
+   m->id = id;
+   m->offset = 0;
+   m->name = strdup(buf);
+   if (!m->name)
+     {
+        free(m);
+        return NULL;
+     }
+   m->size = size;
+   m->fd = shm_open(m->name, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
+   if (m->fd < 0)
+     {
+        free(m->name);
+        free(m);
+        return NULL;
+     }
+   if (ftruncate(m->fd, m->size) < 0)
+     {
+        shm_unlink(m->name);
+        close(m->fd);
+        free(m->name);
+        free(m);
+        return NULL;
+     }
+   m->data = mmap(NULL, m->size, PROT_READ | PROT_WRITE, MAP_SHARED, m->fd, 0);
+   if (m->data == MAP_FAILED)
+     {
+        shm_unlink(m->name);
+        close(m->fd);
+        free(m->name);
+        free(m);
+        return NULL;
+     }
+   m->ref = 1;
+   m->write = 1;
+   return m;
+}
+
+EAPI void
+evas_cserve_mem_free(Mem *m)
+{
+   shm_unlink(m->name);
+   munmap(m->data, m->size);
+   close(m->fd);
+   free(m->name);
+   free(m);
+}
+
+EAPI Mem *
+evas_cserve_mem_open(int pid, int id, const char *name, int size, int write)
+{
+   Mem *m;
+   char buf[PATH_MAX];
+   
+   m = calloc(1, sizeof(Mem));
+   if (!m) return NULL;
+   if (name)
+     snprintf(buf, sizeof(buf), "/evas-shm-%x.%s", getuid(), name);
+   else
+     snprintf(buf, sizeof(buf), "/evas-shm-%x.%x.%x", getuid(), pid, id);
+   m->name = strdup(buf);
+   if (!m->name)
+     {
+        free(m);
+        return NULL;
+     }
+   m->size = size;
+   if (write)
+     m->fd = shm_open(m->name, O_RDWR, S_IRUSR | S_IWUSR);
+   else
+     m->fd = shm_open(m->name, O_RDONLY, S_IRUSR);
+   if (m->fd < 0)
+     {
+        free(m->name);
+        free(m);
+        return NULL;
+     }
+   m->write = write;
+   if (write)
+     m->data = mmap(NULL, m->size, PROT_READ | PROT_WRITE, MAP_SHARED, m->fd, 0);
+   else
+     m->data = mmap(NULL, m->size, PROT_READ, MAP_SHARED, m->fd, 0);
+   if (m->data == MAP_FAILED)
+     {
+        close(m->fd);
+        free(m->name);
+        free(m);
+        return NULL;
+     }
+   m->ref = 1;
+   return m;
+}
+
+EAPI void
+evas_cserve_mem_close(Mem *m)
+{
+   munmap(m->data, m->size);
+   close(m->fd);
+   free(m->name);
+   free(m);
+}
+
+EAPI Eina_Bool
+evas_cserve_mem_resize(Mem *m, int size)
+{
+   if (m->size == size) return 1;
+   if (m->write)
+     {
+        if (ftruncate(m->fd, size) < 0) return 0;
+        munmap(m->data, m->size);
+        m->data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, m->fd, 0);
+     }
+   else
+     {
+        munmap(m->data, m->size);
+        m->data = mmap(NULL, size, PROT_READ, MAP_SHARED, m->fd, 0);
+     }
+   if (m->data == MAP_FAILED)
+     {
+        m->data = NULL;
+        return 0;
+     }
+   m->size = size;
+   return 1;
+}
+
+EAPI void
+evas_cserve_mem_del(int pid, int id)
+{
+   char buf[PATH_MAX];
+   
+   snprintf(buf, sizeof(buf), "/evas-shm-%x.%x.%x", getuid(), pid, id);
+   shm_unlink(buf);
+}
+
+#endif
diff --git a/src/lib/cserve/evas_cs_server.c b/src/lib/cserve/evas_cs_server.c
new file mode 100644
index 0000000..63286a3
--- /dev/null
+++ b/src/lib/cserve/evas_cs_server.c
@@ -0,0 +1,373 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "evas_cs.h"
+
+#ifdef EVAS_CSERVE
+
+EAPI Server *
+evas_cserve_server_add(void)
+{
+   Server *s;
+   char buf[PATH_MAX];
+   struct sockaddr_un socket_unix;
+   struct linger lin;
+   mode_t pmode;
+   int socket_unix_len;
+   
+   s = calloc(1, sizeof(Server));
+   if (!s) return NULL;
+   s->fd = -1;
+   snprintf(buf, sizeof(buf), "/tmp/.evas-cserve-%x", getuid());
+   s->socket_path = strdup(buf);
+   if (!s->socket_path)
+     {
+        free(s);
+        return NULL;
+     }
+   pmode = umask(~(S_IRUSR | S_IWUSR));
+   start:
+   s->fd = socket(AF_UNIX, SOCK_STREAM, 0);
+   if (s->fd < 0) goto error;
+   if (fcntl(s->fd, F_SETFL, O_NONBLOCK) < 0) goto error;
+   if (fcntl(s->fd, F_SETFD, FD_CLOEXEC) < 0) goto error;
+   lin.l_onoff = 1;
+   lin.l_linger = 0;
+   if (setsockopt(s->fd, SOL_SOCKET, SO_LINGER, &lin, sizeof(struct linger)) < 0)
+     goto error;
+   socket_unix.sun_family = AF_UNIX;
+   strncpy(socket_unix.sun_path, buf, sizeof(socket_unix.sun_path));
+   socket_unix_len = LENGTH_OF_SOCKADDR_UN(&socket_unix);
+   if (bind(s->fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0)
+     {
+        if ((connect(s->fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0) &&
+            (unlink(s->socket_path) >= 0))
+          {
+             close(s->fd);
+             goto start;
+          }
+        else
+          goto error;
+     }
+   if (listen(s->fd, 4096) < 0) goto error;
+   umask(pmode);
+   return s;
+   error:
+   umask(pmode);
+   if (s->fd >= 0) close(s->fd);
+   free(s->socket_path);
+   free(s);
+   return NULL;
+}
+
+EAPI void
+evas_cserve_server_del(Server *s)
+{
+   Client *c;
+   
+   EINA_LIST_FREE(s->clients, c)
+     {
+        close(c->fd);
+        if (c->buf) free(c->buf);
+        if (c->inbuf) free(c->inbuf);
+        free(c);
+     }
+   close(s->fd);
+   unlink(s->socket_path);
+   free(s->socket_path);
+   free(s);
+}
+
+static void
+server_accept(Server *s)
+{
+   Client *c;
+   int new_fd;
+   struct sockaddr_in incoming;
+   size_t size_in;
+   
+   size_in = sizeof(struct sockaddr_in);
+   new_fd = accept(s->fd, (struct sockaddr *)&incoming, (socklen_t *)&size_in);
+   if (new_fd < 0) return;
+   fcntl(new_fd, F_SETFL, O_NONBLOCK);
+   fcntl(new_fd, F_SETFD, FD_CLOEXEC);
+   c = calloc(1, sizeof(Client));
+   if (!c)
+     {
+        close(new_fd);
+        return;
+     }
+   c->server = s;
+   c->fd = new_fd;
+   s->clients = eina_list_append(s->clients, c);
+}
+
+static void
+client_flush(Client *c)
+{
+   int num;
+   
+   num = write(c->fd, c->buf, c->bufsize);
+   if (num < 0)
+     {
+        c->dead = 1;
+        return;
+     }
+   if (num < c->bufsize)
+     {
+        unsigned char *buf;
+        
+        buf = malloc(c->bufsize - num);
+        if (buf)
+          {
+             memcpy(buf, c->buf + num, c->bufsize - num);
+             free(c->buf);
+             c->bufsize = c->bufsize - num;
+             c->bufalloc = c->bufsize;
+             c->buf = buf;
+          }
+     }
+   else
+     {
+        free(c->buf);
+        c->buf = NULL;
+        c->bufsize = 0;
+        c->bufalloc = 0;
+     }
+}
+
+static void
+client_buf_add(Client *c, unsigned char *data, int size)
+{
+   int newsize;
+   unsigned char *buf;
+
+   newsize = c->bufsize + size;
+   if (newsize > c->bufalloc)
+     {
+        c->bufalloc = newsize + 16384;
+        buf = realloc(c->buf, c->bufalloc);
+        if (buf) c->buf = buf;
+        else return;
+     }
+   memcpy(c->buf + c->bufsize, data, size);
+   c->bufsize += size;
+}
+
+static void
+client_write(Client *c, unsigned char *data, int size)
+{
+   int num;
+   
+   if (!c->buf)
+     {
+        num = write(c->fd, data, size);
+        if (num != size)
+          client_buf_add(c, data + num, size - num);
+     }
+   else
+     {
+        client_buf_add(c, data, size);
+     }
+}
+
+EAPI void
+evas_cserve_client_send(Client *c, int opcode, int size, unsigned char *data)
+{
+   unsigned char *data2;
+   int *ints;
+   
+   data2 = malloc(size + (sizeof(int) * 3));
+   if (!data2) return;
+   ints = (int *)data2;
+   ints[0] = size;
+   ints[1] = opcode;
+   c->req_to++;
+   ints[2] = c->req_to;
+   memcpy(data2 + (sizeof(int) * 3), data, size);
+   client_write(c, data2, size + (sizeof(int) * 3));
+   free(data2);
+}
+
+static void
+server_message_handle(Server *s, Client *c, int opcode, int size, unsigned char *data)
+{
+   if (s->func) s->func(s->data, s, c, opcode, size, data);
+}
+
+EAPI void
+evas_cserve_server_message_handler_set(Server *s, int (*func) (void *fdata, Server *s, Client *c, int opcode, int size, unsigned char *data), void *data)
+{
+   s->func = func;
+   s->data = data;
+}
+
+static int
+server_parse(Server *s, Client *c)
+{
+   int *ints;
+   unsigned char *data, *newbuf;
+   
+   if (c->inbufsize < sizeof(int)) return 0;
+   ints = (int *)((c->inbuf));
+   if ((ints[0] < 0) || (ints[0] > (1024 * 1024)))
+     return 0;
+   if (c->inbufsize < (ints[0] + (sizeof(int) * 3)))
+     {
+        return 0;
+     }
+   data = c->inbuf + (sizeof(int) * 3);
+   if (ints[2] != (c->req_from + 1))
+     {
+        printf("EEK! sequence number mismatch from client with pid: %i\n"
+               "---- num %i is not 1 more than %i\n"
+               ,
+               c->pid, ints[2], c->req_from);
+        return 0;
+     }
+   c->req_from++;
+   server_message_handle(s, c, ints[1], ints[0], data);
+   c->inbufalloc -= ints[0] + (sizeof(int) * 3);
+   if (c->inbufalloc == 0)
+     {
+        free(c->inbuf);
+        c->inbuf = NULL;
+        c->inbufsize = 0;
+        return 0;
+     }
+   newbuf = malloc(c->inbufalloc);
+   if (!newbuf)
+     {
+        c->inbufalloc += ints[0] + (sizeof(int) * 3);
+        /* fixme - bad situation */
+        return 0;
+     }
+   memcpy(newbuf, c->inbuf + ints[0] + (sizeof(int) * 3), c->inbufalloc);
+   c->inbufsize -= ints[0] + (sizeof(int) * 3);
+   free(c->inbuf);
+   c->inbuf = newbuf;
+   return 1;
+}
+
+static void
+server_data(Server *s, Client *c, unsigned char *data, int size)
+{
+   if (!c->inbuf)
+     {
+        c->inbuf = malloc(size);
+        if (c->inbuf)
+          {
+             memcpy(c->inbuf, data, size);
+             c->inbufalloc = size;
+             c->inbufsize = size;
+          }
+        else
+          {
+             /* fixme - bad situation */
+             return;
+          }
+     }
+   else
+     {
+        int size2;
+        
+        size2 = c->inbufsize + size;
+        if (size2 > c->inbufalloc)
+          {
+             unsigned char *newbuf;
+             
+             c->inbufalloc = size2;
+             newbuf = realloc(c->inbuf, c->inbufalloc);
+             if (newbuf) c->inbuf = newbuf;
+             else size2 = 0;
+          }
+        if (size2 > 0)
+          {
+             memcpy(c->inbuf + c->inbufsize, data, size);
+             c->inbufsize = size2;
+          }
+        else
+          {
+             /* fixme - bad situation */
+             return;
+          }
+     }
+   while (server_parse(s, c));
+}
+
+EAPI void
+evas_cserve_server_wait(Server *s, int timeout)
+{
+   fd_set rset, wset, xset;
+   int maxfd;
+   int ret;
+   struct timeval to;
+   Eina_List *l, *dead = NULL;
+   Client *c;
+   
+   maxfd = 0;
+   FD_ZERO(&rset);
+   FD_ZERO(&wset);
+   FD_ZERO(&xset);
+   FD_SET(s->fd, &rset);
+   if (s->fd > maxfd) maxfd = s->fd;
+   EINA_LIST_FOREACH(s->clients, l, c)
+     {
+        FD_SET(c->fd, &rset);
+        if (c->buf)
+          FD_SET(c->fd, &wset);
+        if (c->fd > maxfd) maxfd = c->fd;
+     }
+   if (timeout > 0)
+     {
+        to.tv_sec = timeout / 1000000;
+        to.tv_usec = timeout % 1000000;
+        ret = select(maxfd + 1, &rset, &wset, &xset, &to);
+     }
+   else
+     ret = select(maxfd + 1, &rset, &wset, &xset, NULL);
+   if (ret < 1) return;
+   
+   EINA_LIST_FOREACH(s->clients, l, c)
+     {
+        if (c->dead) continue;
+        if (FD_ISSET(c->fd, &rset))
+          {
+             char buf[16384];
+             int num;
+             
+             errno = 0;
+             num = read(c->fd, buf, sizeof(buf));
+             if (num <= 0)
+               {
+                  c->dead = 1;
+                  dead = eina_list_append(dead, c);
+               }
+             else if (num > 0)
+               {
+                  server_data(s, c, buf, num);
+               }
+          }
+        else if (FD_ISSET(c->fd, &wset))
+          {
+             client_flush(c);
+             if (c->dead) dead = eina_list_append(dead, c);
+          }
+     }
+   if (FD_ISSET(s->fd, &rset))
+     {
+        server_accept(s);
+     }
+   EINA_LIST_FREE(dead, c)
+     {
+        if (c->func) c->func(c->data, c);
+        s->clients = eina_list_remove(s->clients, c);
+        close(c->fd);
+        if (c->buf) free(c->buf);
+        if (c->inbuf) free(c->inbuf);
+        free(c);
+     }
+}
+
+#endif
diff --git a/src/lib/data/Makefile.in b/src/lib/data/Makefile.in
index fc91c70..63107cd 100644
--- a/src/lib/data/Makefile.in
+++ b/src/lib/data/Makefile.in
@@ -222,6 +222,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/lib/engines/Makefile.in b/src/lib/engines/Makefile.in
index 18b8266..0d2b8e1 100644
--- a/src/lib/engines/Makefile.in
+++ b/src/lib/engines/Makefile.in
@@ -216,6 +216,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/lib/engines/common/Makefile.am b/src/lib/engines/common/Makefile.am
index bd76eba..4b998bc 100644
--- a/src/lib/engines/common/Makefile.am
+++ b/src/lib/engines/common/Makefile.am
@@ -5,6 +5,7 @@ MAINTAINERCLEANFILES = Makefile.in
 
 AM_CPPFLAGS	     = -I. \
 		       -I$(top_srcdir)/src/lib \
+		       -I$(top_srcdir)/src/lib/cserve \
 		       -I$(top_srcdir)/src/lib/include \
 		       -DPACKAGE_BIN_DIR=\"$(bindir)\" \
 		       -DPACKAGE_LIB_DIR=\"$(libdir)\" \
diff --git a/src/lib/engines/common/Makefile.in b/src/lib/engines/common/Makefile.in
index 7ace027..9d8d864 100644
--- a/src/lib/engines/common/Makefile.in
+++ b/src/lib/engines/common/Makefile.in
@@ -254,6 +254,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
@@ -320,6 +322,7 @@ SUBDIRS = evas_op_add evas_op_blend evas_op_copy evas_op_mask evas_op_mul evas_o
 MAINTAINERCLEANFILES = Makefile.in
 AM_CPPFLAGS = -I. \
 		       -I$(top_srcdir)/src/lib \
+		       -I$(top_srcdir)/src/lib/cserve \
 		       -I$(top_srcdir)/src/lib/include \
 		       -DPACKAGE_BIN_DIR=\"$(bindir)\" \
 		       -DPACKAGE_LIB_DIR=\"$(libdir)\" \
diff --git a/src/lib/engines/common/evas_blit_main.c b/src/lib/engines/common/evas_blit_main.c
index e350d79..4630df2 100644
--- a/src/lib/engines/common/evas_blit_main.c
+++ b/src/lib/engines/common/evas_blit_main.c
@@ -487,5 +487,4 @@ evas_common_draw_func_copy_get(int pixels, int reverse)
 #else
    return NULL;
 #endif
-   pixels = 0;
 }
diff --git a/src/lib/engines/common/evas_font.h b/src/lib/engines/common/evas_font.h
index 4629654..c27a348 100644
--- a/src/lib/engines/common/evas_font.h
+++ b/src/lib/engines/common/evas_font.h
@@ -66,6 +66,6 @@ EAPI int               evas_common_font_query_inset          (RGBA_Font *fn, con
 EAPI void              evas_common_font_query_advance        (RGBA_Font *fn, const char *text, int *h_adv, int *v_adv);
 EAPI int               evas_common_font_query_char_coords    (RGBA_Font *fn, const char *text, int pos, int *cx, int *cy, int *cw, int *ch);
 EAPI int               evas_common_font_query_text_at_pos    (RGBA_Font *fn, const char *text, int x, int y, int *cx, int *cy, int *cw, int *ch);
-
+EAPI int               evas_common_font_query_last_up_to_pos (RGBA_Font *fn, const char *text, int x, int y);
 
 #endif /* _EVAS_FONT_H */
diff --git a/src/lib/engines/common/evas_font_draw.c b/src/lib/engines/common/evas_font_draw.c
index bc8c4b3..485c7fb 100644
--- a/src/lib/engines/common/evas_font_draw.c
+++ b/src/lib/engines/common/evas_font_draw.c
@@ -189,7 +189,7 @@ evas_common_font_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font
    DATA32 *im;
    int c;
    int char_index = 0; /* the index of the current char */
-   
+
 #ifdef INTERNATIONAL_SUPPORT
    int bidi_err = 0;
    /*FIXME: should get the direction by parmater */
@@ -223,175 +223,178 @@ evas_common_font_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font
 	/* grrr - this means font face sharing is kinda... not an option if */
 	/* you want performance */
 	  if ((use_kerning) && (prev_index) && (index) &&
-	     (pface == fi->src->ft.face)) {		  
+	     (pface == fi->src->ft.face))
+	    {
 #ifdef INTERNATIONAL_SUPPORT
-	    /* if it's rtl, the kerning matching should be reversed, i.e prev
-	    * index is now the index and the other way around. */
-	    if (evas_intl_is_rtl_char(level_list, char_index)) {
-	      if (evas_common_font_query_kerning(fi, index, prev_index, &kern)) 
-  	       pen_x += kern;
-  	    }
-	    else
+	       /* if it's rtl, the kerning matching should be reversed, i.e prev
+		* index is now the index and the other way around. */
+	       if (evas_intl_is_rtl_char(level_list, char_index))
+		 {
+		    if (evas_common_font_query_kerning(fi, index, prev_index, &kern))
+		      pen_x += kern;
+		 }
+	       else
 #endif
 
-	    {
+		 {
 
-	      if (evas_common_font_query_kerning(fi, prev_index, index, &kern)) 
-	        pen_x += kern;  
+		    if (evas_common_font_query_kerning(fi, prev_index, index, &kern))
+		      pen_x += kern;
+		 }
 	    }
-	  }
 
-	pface = fi->src->ft.face;
-	fg = evas_common_font_int_cache_glyph_get(fi, index);
-	if (!fg) continue;
+	  pface = fi->src->ft.face;
+	  fg = evas_common_font_int_cache_glyph_get(fi, index);
+	  if (!fg) continue;
 
-	if (dc->font_ext.func.gl_new)
-	  {
-	     /* extension calls */
-	     fg->ext_dat = dc->font_ext.func.gl_new(dc->font_ext.data, fg);
-	     fg->ext_dat_free = dc->font_ext.func.gl_free;
-	  }
+	  if (dc->font_ext.func.gl_new)
+	    {
+	       /* extension calls */
+	       fg->ext_dat = dc->font_ext.func.gl_new(dc->font_ext.data, fg);
+	       fg->ext_dat_free = dc->font_ext.func.gl_free;
+	    }
 
-	chr_x = (pen_x + (fg->glyph_out->left));
-	chr_y = (pen_y + (fg->glyph_out->top));
+	  chr_x = (pen_x + (fg->glyph_out->left));
+	  chr_y = (pen_y + (fg->glyph_out->top));
 
-	if (chr_x < (ext_x + ext_w))
-	  {
-	     DATA8 *data;
-	     int i, j, w, h;
-
-	     data = fg->glyph_out->bitmap.buffer;
-	     j = fg->glyph_out->bitmap.pitch;
-	     w = fg->glyph_out->bitmap.width;
-	     if (j < w) j = w;
-	     h = fg->glyph_out->bitmap.rows;
-/*
-	     if ((fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays)
-		 && (fg->glyph_out->bitmap.num_grays == 256)
-		 )
- */
-	       {
-		  if ((j > 0) && (chr_x + w > ext_x))
-		    {
-		       if ((fg->ext_dat) && (dc->font_ext.func.gl_draw))
-			 {
-			    /* ext glyph draw */
-			    dc->font_ext.func.gl_draw(dc->font_ext.data,
-						      (void *)dst,
-						      dc, fg,
-						      chr_x,
-						      y - (chr_y - y)
-						      );
-			 }
-		       else
-			 {
-			    if ((fg->glyph_out->bitmap.num_grays == 256) &&
-				(fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays))
-			      {
-				 for (i = 0; i < h; i++)
-				   {
-				      int dx, dy;
-				      int in_x, in_w;
-
-				      in_x = 0;
-				      in_w = 0;
-				      dx = chr_x;
-				      dy = y - (chr_y - i - y);
+	  if (chr_x < (ext_x + ext_w))
+	    {
+	       DATA8 *data;
+	       int i, j, w, h;
+
+	       data = fg->glyph_out->bitmap.buffer;
+	       j = fg->glyph_out->bitmap.pitch;
+	       w = fg->glyph_out->bitmap.width;
+	       if (j < w) j = w;
+	       h = fg->glyph_out->bitmap.rows;
+	       /*
+		  if ((fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays)
+		  && (fg->glyph_out->bitmap.num_grays == 256)
+		  )
+		  */
+		 {
+		    if ((j > 0) && (chr_x + w > ext_x))
+		      {
+			 if ((fg->ext_dat) && (dc->font_ext.func.gl_draw))
+			   {
+			      /* ext glyph draw */
+			      dc->font_ext.func.gl_draw(dc->font_ext.data,
+				    (void *)dst,
+				    dc, fg,
+				    chr_x,
+				    y - (chr_y - y)
+				    );
+			   }
+			 else
+			   {
+			      if ((fg->glyph_out->bitmap.num_grays == 256) &&
+				    (fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays))
+				{
+				   for (i = 0; i < h; i++)
+				     {
+					int dx, dy;
+					int in_x, in_w;
+
+					in_x = 0;
+					in_w = 0;
+					dx = chr_x;
+					dy = y - (chr_y - i - y);
 #ifdef EVAS_SLI
-				      if (((dy) % dc->sli.h) == dc->sli.y)
+					if (((dy) % dc->sli.h) == dc->sli.y)
 #endif
-					{
-					   if ((dx < (ext_x + ext_w)) &&
-					       (dy >= (ext_y)) &&
-					       (dy < (ext_y + ext_h)))
-					     {
-						if (dx + w > (ext_x + ext_w))
-						  in_w += (dx + w) - (ext_x + ext_w);
-						if (dx < ext_x)
-						  {
-						     in_w += ext_x - dx;
-						     in_x = ext_x - dx;
-						     dx = ext_x;
-						  }
-						if (in_w < w)
-						  {
-						     func(NULL, data + (i * j) + in_x, dc->col.col,
-							  im + (dy * im_w) + dx, w - in_w);
-						  }
-					     }
-					}
-				   }
-			      }
-			    else
-			      {
-				 DATA8 *tmpbuf = NULL, *dp, *tp, bits;
-				 int bi, bj;
-				 const DATA8 bitrepl[2] = {0x0, 0xff};
-
-				 tmpbuf = alloca(w);
-				 for (i = 0; i < h; i++)
-				   {
-				      int dx, dy;
-				      int in_x, in_w, end;
-
-				      in_x = 0;
-				      in_w = 0;
-				      dx = chr_x;
-				      dy = y - (chr_y - i - y);
+					  {
+					     if ((dx < (ext_x + ext_w)) &&
+						   (dy >= (ext_y)) &&
+						   (dy < (ext_y + ext_h)))
+					       {
+						  if (dx + w > (ext_x + ext_w))
+						    in_w += (dx + w) - (ext_x + ext_w);
+						  if (dx < ext_x)
+						    {
+						       in_w += ext_x - dx;
+						       in_x = ext_x - dx;
+						       dx = ext_x;
+						    }
+						  if (in_w < w)
+						    {
+						       func(NULL, data + (i * j) + in_x, dc->col.col,
+							     im + (dy * im_w) + dx, w - in_w);
+						    }
+					       }
+					  }
+				     }
+				}
+			      else
+				{
+				   DATA8 *tmpbuf = NULL, *dp, *tp, bits;
+				   int bi, bj;
+				   const DATA8 bitrepl[2] = {0x0, 0xff};
+
+				   tmpbuf = alloca(w);
+				   for (i = 0; i < h; i++)
+				     {
+					int dx, dy;
+					int in_x, in_w, end;
+
+					in_x = 0;
+					in_w = 0;
+					dx = chr_x;
+					dy = y - (chr_y - i - y);
 #ifdef EVAS_SLI
-				      if (((dy) % dc->sli.h) == dc->sli.y)
+					if (((dy) % dc->sli.h) == dc->sli.y)
 #endif
-					{
-					   tp = tmpbuf;
-					   dp = data + (i * fg->glyph_out->bitmap.pitch);
-					   for (bi = 0; bi < w; bi += 8)
-					     {
-						bits = *dp;
-						if ((w - bi) < 8) end = w - bi;
-						else end = 8;
-						for (bj = 0; bj < end; bj++)
-						  {
-						     *tp = bitrepl[(bits >> (7 - bj)) & 0x1];
-						     tp++;
-						  }
-						dp++;
-					     }
-					   if ((dx < (ext_x + ext_w)) &&
-					       (dy >= (ext_y)) &&
-					       (dy < (ext_y + ext_h)))
-					     {
-						if (dx + w > (ext_x + ext_w))
-						  in_w += (dx + w) - (ext_x + ext_w);
-						if (dx < ext_x)
-						  {
-						     in_w += ext_x - dx;
-						     in_x = ext_x - dx;
-						     dx = ext_x;
-						  }
-						if (in_w < w)
-						  {
-						     func(NULL, tmpbuf + in_x, dc->col.col,
-							  im + (dy * im_w) + dx, w - in_w);
-						  }
-					     }
-					}
-				   }
-			      }
-			 }
-		       c++;
-		    }
-	       }
-	  }
-	else
-	  break;
-	pen_x += fg->glyph->advance.x >> 16;
-	prev_index = index;
+					  {
+					     tp = tmpbuf;
+					     dp = data + (i * fg->glyph_out->bitmap.pitch);
+					     for (bi = 0; bi < w; bi += 8)
+					       {
+						  bits = *dp;
+						  if ((w - bi) < 8) end = w - bi;
+						  else end = 8;
+						  for (bj = 0; bj < end; bj++)
+						    {
+						       *tp = bitrepl[(bits >> (7 - bj)) & 0x1];
+						       tp++;
+						    }
+						  dp++;
+					       }
+					     if ((dx < (ext_x + ext_w)) &&
+						   (dy >= (ext_y)) &&
+						   (dy < (ext_y + ext_h)))
+					       {
+						  if (dx + w > (ext_x + ext_w))
+						    in_w += (dx + w) - (ext_x + ext_w);
+						  if (dx < ext_x)
+						    {
+						       in_w += ext_x - dx;
+						       in_x = ext_x - dx;
+						       dx = ext_x;
+						    }
+						  if (in_w < w)
+						    {
+						       func(NULL, tmpbuf + in_x, dc->col.col,
+							     im + (dy * im_w) + dx, w - in_w);
+						    }
+					       }
+					  }
+				     }
+				}
+			   }
+			 c++;
+		      }
+		 }
+	    }
+	  else
+	    break;
+	  pen_x += fg->glyph->advance.x >> 16;
+	  prev_index = index;
      }
 #ifdef INTERNATIONAL_SUPPORT
-   if (bidi_err >= 0) {
-   	free(level_list);
-   	free(text);
-   }
+   if (bidi_err >= 0)
+     {
+	free(level_list);
+	free(text);
+     }
 #endif
 }
 
@@ -401,13 +404,13 @@ evas_common_font_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int
    int ext_x, ext_y, ext_w, ext_h;
    int im_w, im_h;
    int use_kerning;
-   RGBA_Gfx_Func func; 
+   RGBA_Gfx_Func func;
    RGBA_Font_Int *fi;
    Cutout_Rects *rects;
    Cutout_Rect  *r;
    int          c, cx, cy, cw, ch;
    int          i;
-   
+
    fi = fn->fonts->data;
 
    im_w = dst->cache_entry.w;
diff --git a/src/lib/engines/common/evas_font_main.c b/src/lib/engines/common/evas_font_main.c
index e556c7b..c8df596 100644
--- a/src/lib/engines/common/evas_font_main.c
+++ b/src/lib/engines/common/evas_font_main.c
@@ -48,7 +48,7 @@ evas_common_font_ascent_get(RGBA_Font *fn)
    fi = fn->fonts->data;
    val = (int)fi->src->ft.face->size->metrics.ascender;
    if (fi->src->ft.face->units_per_EM == 0)
-     return val;  
+     return val;
    dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
    ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
    return ret;
@@ -65,7 +65,7 @@ evas_common_font_descent_get(RGBA_Font *fn)
    fi = fn->fonts->data;
    val = -(int)fi->src->ft.face->size->metrics.descender;
    if (fi->src->ft.face->units_per_EM == 0)
-     return val;  
+     return val;
    dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
    ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
    return ret;
@@ -82,7 +82,7 @@ evas_common_font_max_ascent_get(RGBA_Font *fn)
    fi = fn->fonts->data;
    val = (int)fi->src->ft.face->bbox.yMax;
    if (fi->src->ft.face->units_per_EM == 0)
-     return val;  
+     return val;
    dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
    ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
    return ret;
@@ -99,7 +99,7 @@ evas_common_font_max_descent_get(RGBA_Font *fn)
    fi = fn->fonts->data;
    val = -(int)fi->src->ft.face->bbox.yMin;
    if (fi->src->ft.face->units_per_EM == 0)
-     return val;  
+     return val;
    dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
    ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
    return ret;
@@ -116,7 +116,7 @@ evas_common_font_get_line_advance(RGBA_Font *fn)
    fi = fn->fonts->data;
    val = (int)fi->src->ft.face->size->metrics.height;
    if (fi->src->ft.face->units_per_EM == 0)
-     return val;  
+     return val;
    dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
    ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
    return ret;
@@ -137,11 +137,11 @@ evas_common_font_utf8_get_next(const unsigned char *buf, int *iindex)
    d = buf[index++];
    if (!d)
      return 0;
-   
+
    while (buf[index] && ((buf[index] & 0xc0) == 0x80))
      index++;
    len = index - *iindex;
-   
+
    if (len == 1)
       r = d;
    else if (len == 2)
@@ -177,7 +177,7 @@ evas_common_font_utf8_get_next(const unsigned char *buf, int *iindex)
 	r <<= 6;
 	r |= (d4 & 0x3f);
      }
-   
+
    *iindex = index;
    return r;
 }
@@ -197,11 +197,11 @@ evas_common_font_utf8_get_prev(const unsigned char *buf, int *iindex)
    if (index <= 0)
      return 0;
    d = buf[index--];
-   
+
    while ((index > 0) && ((buf[index] & 0xc0) == 0x80))
      index--;
    len = *iindex - index;
-   
+
    if (len == 1)
       r = d;
    else if (len == 2)
@@ -237,7 +237,7 @@ evas_common_font_utf8_get_prev(const unsigned char *buf, int *iindex)
 	r <<= 6;
 	r |= (d4 & 0x3f);
      }
-   
+
    *iindex = index;
    return r;
 }
diff --git a/src/lib/engines/common/evas_font_query.c b/src/lib/engines/common/evas_font_query.c
index 5ed5c9c..cd26915 100644
--- a/src/lib/engines/common/evas_font_query.c
+++ b/src/lib/engines/common/evas_font_query.c
@@ -146,14 +146,14 @@ evas_common_font_query_inset(RGBA_Font *fn, const char *text)
    index = evas_common_font_glyph_search(fn, &fi, gl);
    fg = evas_common_font_int_cache_glyph_get(fi, index);
    if (!fg) return 0;
-/*   
+/*
    printf("fg->glyph_out->left = %i\n"
 	  "fi->src->ft.face->glyph->bitmap_left = %i\n"
 	  "fi->src->ft.face->glyph->metrics.horiBearingX = %i\n"
 	  "fi->src->ft.face->glyph->metrics.horiBearingY = %i\n"
 	  "fi->src->ft.face->glyph->metrics.horiAdvance = %i\n"
 	  ,
-	  (int)fg->glyph_out->left, 
+	  (int)fg->glyph_out->left,
 	  (int)fi->src->ft.face->glyph->bitmap_left,
 	  (int)fi->src->ft.face->glyph->metrics.horiBearingX >> 6,
 	  (int)fi->src->ft.face->glyph->metrics.horiBearingY >> 6,
diff --git a/src/lib/engines/common/evas_image.h b/src/lib/engines/common/evas_image.h
index 95ea10c..c589eb1 100644
--- a/src/lib/engines/common/evas_image.h
+++ b/src/lib/engines/common/evas_image.h
@@ -48,4 +48,9 @@ EAPI void
                                        int src_region_w, int src_region_h,
                                        int dst_region_x, int dst_region_y,
                                        int dst_region_w, int dst_region_h);
+
+
+EAPI int evas_common_load_rgba_image_module_from_file (Image_Entry *im);
+EAPI int evas_common_load_rgba_image_data_from_file   (Image_Entry *im);
+
 #endif /* _EVAS_IMAGE_H */
diff --git a/src/lib/engines/common/evas_image_load.c b/src/lib/engines/common/evas_image_load.c
index 9a6a86b..d6b1736 100644
--- a/src/lib/engines/common/evas_image_load.c
+++ b/src/lib/engines/common/evas_image_load.c
@@ -4,6 +4,7 @@
 
 #include "evas_common.h"
 #include "evas_private.h"
+#include "evas_cs.h"
 
 extern Eina_List *evas_modules;
 
@@ -33,7 +34,7 @@ static struct ext_loader_s	loaders[] = {
    { "pnm", "pmaps" }
 };
 
-int
+EAPI int
 evas_common_load_rgba_image_module_from_file(Image_Entry *ie)
 {
    Evas_Image_Load_Func *evas_image_load_func = NULL;
@@ -43,6 +44,16 @@ evas_common_load_rgba_image_module_from_file(Image_Entry *ie)
    char                 *dot;
    int                   i;
 
+
+#ifdef EVAS_CSERVE
+   if (evas_cserve_use_get())
+     {
+        if (evas_cserve_image_load(ie, ie->file, ie->key, &(ie->load_opts)))
+          {
+             return 0;
+          }
+     }
+#endif   
    dot = strrchr (ie->file, '.');
    if (dot)
      {
@@ -89,21 +100,42 @@ evas_common_load_rgba_image_module_from_file(Image_Entry *ie)
 
    return -1;
 
-  ok:
+   ok:
    ie->info.module = (void*) em;
    ie->info.loader = (void*) evas_image_load_func;
    evas_module_ref((Evas_Module*) ie->info.module);
    return 0;
 }
 
-int
+EAPI int
 evas_common_load_rgba_image_data_from_file(Image_Entry *ie)
 {
    Evas_Image_Load_Func *evas_image_load_func = NULL;
 
-   if (!ie->info.module) return -1;
    if (ie->flags.loaded) return -1;
 
+#ifdef EVAS_CSERVE
+   if (ie->data1)
+     {
+        if (evas_cserve_image_data_load(ie))
+          {
+             RGBA_Image *im = (RGBA_Image *)ie;
+             Mem *mem;
+             
+             mem = ie->data2;
+             if (mem)
+               {
+                  im->image.data = mem->data + mem->offset;
+                  im->image.no_free = 1;
+                  return 0;
+               }
+          }
+        return -1;
+     }
+#endif
+   
+   if (!ie->info.module) return -1;
+
    evas_image_load_func = ie->info.loader;
    evas_module_use((Evas_Module*) ie->info.module);
    if (!evas_image_load_func->file_data(ie, ie->file, ie->key))
diff --git a/src/lib/engines/common/evas_image_main.c b/src/lib/engines/common/evas_image_main.c
index 495cf96..0640ee7 100644
--- a/src/lib/engines/common/evas_image_main.c
+++ b/src/lib/engines/common/evas_image_main.c
@@ -152,6 +152,9 @@ _evas_common_rgba_image_delete(Image_Entry *ie)
     * going to empty this struct out in case this happens again so i know
     * that something else is overwritign this struct - or not */
 //   memset(im, 0x99, sizeof(im));
+#ifdef EVAS_CSERVE
+   if (ie->data1) evas_cserve_image_free(ie);
+#endif   
    free(im);
 }
 
@@ -170,8 +173,9 @@ evas_common_rgba_image_unload(Image_Entry *ie)
    evas_cache_image_preload_cancel(ie, NULL);
    
    if (!ie->flags.loaded) return;
-   if (!ie->info.module) return;
+   if ((!ie->info.module) && (!ie->data1)) return;
    if (!ie->file) return;
+   
    ie->flags.loaded = 0;
 
    if ((im->cs.data) && (im->image.data))
@@ -187,6 +191,17 @@ evas_common_rgba_image_unload(Image_Entry *ie)
      }
    im->cs.data = NULL;
 
+#ifdef EVAS_CSERVE
+   if (ie->data1)
+     {
+        evas_cserve_image_useless(ie);
+        im->image.data = NULL;
+        ie->allocated.w = 0;
+        ie->allocated.h = 0;
+        return;
+     }
+#endif   
+   
    if (im->image.data && !im->image.no_free)
      free(im->image.data);
    im->image.data = NULL;
@@ -200,6 +215,9 @@ _evas_common_rgba_image_surface_alloc(Image_Entry *ie, int w, int h)
    RGBA_Image   *im = (RGBA_Image *) ie;
    size_t        siz = 0;
 
+#ifdef EVAS_CSERVE
+   if (ie->data1) return 0;
+#endif   
    if (im->image.no_free) return 0;
 
    if (im->flags & RGBA_IMAGE_ALPHA_ONLY)
@@ -244,6 +262,10 @@ _evas_common_rgba_image_surface_delete(Image_Entry *ie)
 
    if (im->image.data && !im->image.no_free)
      free(im->image.data);
+#ifdef EVAS_CSERVE
+   else if (ie->data1)
+     evas_cserve_image_free(ie);
+#endif   
    im->image.data = NULL;
    evas_common_rgba_image_scalecache_dirty(&im->cache_entry);
 }
@@ -258,6 +280,9 @@ _evas_common_rgba_image_dirty_region(Image_Entry* ie, int x __UNUSED__, int y __
 {
    RGBA_Image   *im = (RGBA_Image *) ie;
 
+#ifdef EVAS_CSERVE
+   if (ie->data1) evas_cserve_image_free(ie);
+#endif   
    im->flags |= RGBA_IMAGE_IS_DIRTY;
    evas_common_rgba_image_scalecache_dirty(&im->cache_entry);
 }
@@ -274,8 +299,16 @@ _evas_common_rgba_image_dirty(Image_Entry *ie_dst, const Image_Entry *ie_src)
    evas_cache_image_load_data(&src->cache_entry);
    if (_evas_common_rgba_image_surface_alloc(&dst->cache_entry,
                                              src->cache_entry.w, src->cache_entry.h))
-     return 1;
+     {
+#ifdef EVAS_CSERVE
+        if (ie_src->data1) evas_cserve_image_free(ie_src);
+#endif        
+        return 1;
+     }
 
+#ifdef EVAS_CSERVE
+   if (ie_src->data1) evas_cserve_image_free(ie_src);
+#endif   
    evas_common_image_colorspace_normalize(src);
    evas_common_image_colorspace_normalize(dst);
 /*    evas_common_blit_rectangle(src, dst, 0, 0, src->cache_entry.w, src->cache_entry.h, 0, 0); */
@@ -293,8 +326,15 @@ _evas_common_rgba_image_ram_usage(Image_Entry *ie)
 //   ram += sizeof(struct _RGBA_Image);
 //   if (im->info.real_file) ram += strlen(im->info.real_file);
 //   if (im->info.comment) ram += strlen(im->info.comment);
-   if ((im->image.data) && (!im->image.no_free))
-     size += im->cache_entry.w * im->cache_entry.h * sizeof(DATA32);
+   if (im->image.data)
+     {
+#ifdef EVAS_CSERVE
+        if ((!im->image.no_free) || (ie->data1))
+#else
+        if ((!im->image.no_free))
+#endif          
+          size += im->cache_entry.w * im->cache_entry.h * sizeof(DATA32);
+     }
    size += evas_common_rgba_image_scalecache_usage_get(&im->cache_entry);
    return size;
 }
@@ -438,6 +478,9 @@ evas_common_image_colorspace_normalize(RGBA_Image *im)
       case EVAS_COLORSPACE_ARGB8888:
 	if (im->image.data != im->cs.data)
 	  {
+#ifdef EVAS_CSERVE
+             if (((Image_Entry *)im)->data1) evas_cserve_image_free(im);
+#endif             
 	     if (!im->image.no_free) free(im->image.data);
 	     im->image.data = im->cs.data;
 	     im->cs.no_free = im->image.no_free;
diff --git a/src/lib/engines/common/evas_image_private.h b/src/lib/engines/common/evas_image_private.h
index 99aab25..6ac9742 100644
--- a/src/lib/engines/common/evas_image_private.h
+++ b/src/lib/engines/common/evas_image_private.h
@@ -1,9 +1,6 @@
 #ifndef _EVAS_IMAGE_PRIVATE_H
 #define _EVAS_IMAGE_PRIVATE_H
 
-int             evas_common_load_rgba_image_module_from_file (Image_Entry *im);
-int             evas_common_load_rgba_image_data_from_file   (Image_Entry *im);
-
 int             evas_common_rgba_image_size_set              (Image_Entry* dst, const Image_Entry* im, int w, int h);
 int             evas_common_rgba_image_from_copied_data      (Image_Entry* dst, int w, int h, DATA32 *image_data, int alpha, int cspace);
 int             evas_common_rgba_image_from_data             (Image_Entry* dst, int w, int h, DATA32 *image_data, int alpha, int cspace);
diff --git a/src/lib/engines/common/evas_image_scalecache.c b/src/lib/engines/common/evas_image_scalecache.c
index 473d698..3f99202 100644
--- a/src/lib/engines/common/evas_image_scalecache.c
+++ b/src/lib/engines/common/evas_image_scalecache.c
@@ -12,13 +12,13 @@
 
 #define MAX_SCALEITEMS 32
 #define MIN_SCALE_USES 3
-#define MIN_SCALE_AGE_GAP 5000
-#define MIN_SCALECACHE_SIZE 3200
+//#define MIN_SCALE_AGE_GAP 5000
+#define MAX_SCALECACHE_DIM 3200
 #define FLOP_ADD 4
 #define MAX_FLOP_COUNT 16
 #define FLOP_DEL 1
-//#define SCALE_CACHE_SIZE 10 * 1024 * 1024
-#define SCALE_CACHE_SIZE 0
+#define SCALE_CACHE_SIZE 4 * 1024 * 1024
+//#define SCALE_CACHE_SIZE 0
 
 typedef struct _Scaleitem Scaleitem;
 
@@ -30,7 +30,11 @@ struct _Scaleitem
    RGBA_Image *im, *parent_im;
    int src_x, src_y, src_w, src_h;
    int dst_w, dst_h;
-   int smooth, populate_me, flop;
+   int flop;
+   int size_adjust;
+   Eina_Bool forced_unload : 1;
+   Eina_Bool smooth : 1;
+   Eina_Bool populate_me : 1;
 };
 
 #ifdef SCALECACHE
@@ -41,15 +45,35 @@ static LK(cache_lock);
 #endif
 static Eina_Inlist *cache_list = NULL;
 static int cache_size = 0;
+static int init = 0;
+
 static int max_cache_size = SCALE_CACHE_SIZE;
+static int max_dimension = MAX_SCALECACHE_DIM;
+static int max_flop_count = MAX_FLOP_COUNT;
+static int max_scale_items = MAX_SCALEITEMS;
+static int min_scale_uses = MIN_SCALE_USES;
 #endif
 
 void
 evas_common_scalecache_init(void)
 {
 #ifdef SCALECACHE
+   const char *s;
+
+   init++;
+   if (init > 1) return;
    use_counter = 0;
    LKI(cache_lock);
+   s = getenv("EVAS_SCALECACHE_SIZE");
+   if (s) max_cache_size = atoi(s) * 1024;
+   s = getenv("EVAS_SCALECACHE_MAX_DIMENSION");
+   if (s) max_dimension = atoi(s);
+   s = getenv("EVAS_SCALECACHE_MAX_FLOP_COUNT");
+   if (s) max_flop_count = atoi(s);
+   s = getenv("EVAS_SCALECACHE_MAX_ITEMS");
+   if (s) max_scale_items = atoi(s);
+   s = getenv("EVAS_SCALECACHE_MIN_USES");
+   if (s) min_scale_uses = atoi(s);
 #endif
 }
 
@@ -57,6 +81,7 @@ void
 evas_common_scalecache_shutdown(void)
 {
 #ifdef SCALECACHE
+   init--;
    LKD(cache_lock);
 #endif
 }
@@ -96,7 +121,10 @@ evas_common_rgba_image_scalecache_dirty(Image_Entry *ie)
 //             printf(" 0- %i\n", sci->dst_w * sci->dst_h * 4);
              LKL(cache_lock);
              evas_common_rgba_image_free(&sci->im->cache_entry);
-             cache_size -= sci->dst_w * sci->dst_h * 4;
+             if (!sci->forced_unload)
+               cache_size -= sci->dst_w * sci->dst_h * 4;
+             else
+               cache_size -= sci->size_adjust;
              cache_list = eina_inlist_remove(cache_list, (Eina_Inlist *)sci);
              LKU(cache_lock);
           }
@@ -169,7 +197,7 @@ _sci_find(RGBA_Image *im,
 {
    Eina_List *l;
    Scaleitem *sci;
-   
+
    EINA_LIST_FOREACH(im->cache.list, l, sci)
      {
         if (
@@ -190,7 +218,7 @@ _sci_find(RGBA_Image *im,
              return sci;
           }
      }
-   if (eina_list_count(im->cache.list) > MAX_SCALEITEMS)
+   if (eina_list_count(im->cache.list) > max_scale_items)
      {
         l = eina_list_last(im->cache.list);
         sci = l->data;
@@ -201,13 +229,21 @@ _sci_find(RGBA_Image *im,
         if (sci->im)
           {
              evas_common_rgba_image_free(&sci->im->cache_entry);
-             cache_size -= sci->dst_w * sci->dst_h * 4;
+             if (!sci->forced_unload)
+               cache_size -= sci->dst_w * sci->dst_h * 4;
+             else
+               cache_size -= sci->size_adjust;
 //             printf(" 1- %i\n", sci->dst_w * sci->dst_h * 4);
              cache_list = eina_inlist_remove(cache_list, (Eina_Inlist *)sci);
           }
+        if (max_scale_items < 1) return NULL;
      }
    else
      {
+        if (max_scale_items < 1) return NULL;
+
+        if (eina_list_count(im->cache.list) > (max_scale_items - 1))
+          return NULL;
         sci = malloc(sizeof(Scaleitem));
         memset(sci, 0, sizeof(Eina_Inlist));
         sci->parent_im = im;
@@ -215,6 +251,8 @@ _sci_find(RGBA_Image *im,
    sci->usage = 0;
    sci->usage_count = 0;
    sci->populate_me = 0;
+   sci->smooth = smooth;
+   sci->forced_unload = 0;
    sci->flop = 0;
    sci->im = NULL;
    sci->src_x = src_region_x;
@@ -223,7 +261,6 @@ _sci_find(RGBA_Image *im,
    sci->src_h = src_region_h;
    sci->dst_w = dst_region_w;
    sci->dst_h = dst_region_h;
-   sci->smooth = smooth;
    im->cache.list = eina_list_prepend(im->cache.list, sci);
    return sci;
 }
@@ -231,7 +268,6 @@ _sci_find(RGBA_Image *im,
 static void
 _cache_prune(Scaleitem *notsci, Evas_Bool copies_only)
 {
-   RGBA_Image *im;
    Scaleitem *sci;
    while (cache_size > max_cache_size)
      {
@@ -240,11 +276,10 @@ _cache_prune(Scaleitem *notsci, Evas_Bool copies_only)
         if (copies_only)
           {
              while ((sci) && (!sci->parent_im->image.data))
-               sci = ((Eina_Inlist *)sci)->next;
+               sci = (Scaleitem *)(((Eina_Inlist *)sci)->next);
              if (!sci) return;
           }
         if (sci == notsci) return;
-        im = sci->parent_im;
         if (sci->im)
           {
              evas_common_rgba_image_free(&sci->im->cache_entry);
@@ -252,7 +287,10 @@ _cache_prune(Scaleitem *notsci, Evas_Bool copies_only)
              sci->usage = 0;
              sci->usage_count = 0;
              sci->flop += FLOP_ADD;
-             cache_size -= sci->dst_w * sci->dst_h * 4;
+             if (!sci->forced_unload)
+               cache_size -= sci->dst_w * sci->dst_h * 4;
+             else
+               cache_size -= sci->size_adjust;
 //             printf(" 2- %i\n", sci->dst_w * sci->dst_h * 4);
              cache_list = eina_inlist_remove(cache_list, (Eina_Inlist *)sci);
              memset(sci, 0, sizeof(Eina_Inlist));
@@ -265,6 +303,7 @@ _cache_prune(Scaleitem *notsci, Evas_Bool copies_only)
 EAPI void
 evas_common_rgba_image_scalecache_size_set(int size)
 {
+#ifdef SCALECACHE
    LKL(cache_lock);
    if (size != max_cache_size)
      {
@@ -272,21 +311,27 @@ evas_common_rgba_image_scalecache_size_set(int size)
         _cache_prune(NULL, 1);
      }
    LKU(cache_lock);
+#endif   
 }
 
 EAPI int
 evas_common_rgba_image_scalecache_size_get(void)
 {
+#ifdef SCALECACHE
    int t;
    LKL(cache_lock);
    t = max_cache_size;
    LKU(cache_lock);
    return t;
+#else
+   return 0;
+#endif   
 }
 
 EAPI void
 evas_common_rgba_image_scalecache_flush(void)
 {
+#ifdef SCALECACHE
    int t;
    LKL(cache_lock);
    t = max_cache_size;
@@ -294,6 +339,7 @@ evas_common_rgba_image_scalecache_flush(void)
    _cache_prune(NULL, 1);
    max_cache_size = t;
    LKU(cache_lock);
+#endif   
 }
 
 EAPI void
@@ -333,21 +379,28 @@ evas_common_rgba_image_scalecache_prepare(Image_Entry *ie, RGBA_Image *dst,
    sci = _sci_find(im, dc, smooth, 
                    src_region_x, src_region_y, src_region_w, src_region_h, 
                    dst_region_w, dst_region_h);
+   if (!sci)
+     {
+        LKU(cache_lock);
+        LKU(im->cache.lock);
+        return;
+     }
 //   printf("%10i | %4i %4i %4ix%4i -> %4i %4i %4ix%4i | %i\n",
 //          (int)use_counter,
 //          src_region_x, src_region_y, src_region_w, src_region_h,
 //          dst_region_x, dst_region_y, dst_region_w, dst_region_h,
 //          smooth);
-   if ((sci->usage >= MIN_SCALE_USES)
+   if ((sci->usage >= min_scale_uses)
+       && (ie->scale_hint != EVAS_IMAGE_SCALE_HINT_DYNAMIC)
 //       && (sci->usage_count > (use_counter - MIN_SCALE_AGE_GAP))
        )
      {
         if (!sci->im)
           {
-             if ((sci->dst_w < MIN_SCALECACHE_SIZE) && 
-                 (sci->dst_h < MIN_SCALECACHE_SIZE))
+             if ((sci->dst_w < max_dimension) && 
+                 (sci->dst_h < max_dimension))
                {
-                  if (sci->flop <= MAX_FLOP_COUNT)
+                  if (sci->flop <= max_flop_count)
                     {
                        sci->populate_me = 1;
                        im->cache.populate_count++;
@@ -389,6 +442,7 @@ evas_common_rgba_image_scalecache_do(Image_Entry *ie, RGBA_Image *dst,
    RGBA_Image *im = (RGBA_Image *)ie;
    Scaleitem *sci;
    int didpop = 0;
+   int dounload = 0;
 /*
    static int i = 0;
 
@@ -458,6 +512,46 @@ evas_common_rgba_image_scalecache_do(Image_Entry *ie, RGBA_Image *dst,
      }
    if (sci->populate_me)
      {
+        int size, osize, used;
+        
+        size = dst_region_w * dst_region_h;
+        if (((((dst_region_w > 640) || (dst_region_h > 640)) &&
+             (size > (480 * 480))) ||
+             (ie->scale_hint == EVAS_IMAGE_SCALE_HINT_STATIC)) &&
+            (ie->scale_hint != EVAS_IMAGE_SCALE_HINT_DYNAMIC))
+          {
+             Eina_List *l;
+             Scaleitem *sci2;
+             
+             dounload = 1;
+             osize = sci->parent_im->cache_entry.w * sci->parent_im->cache_entry.h;
+             used = 0;
+             EINA_LIST_FOREACH(im->cache.list, l, sci2)
+               {
+                  if (sci2->im) used += sci2->dst_w * sci2->dst_h;
+               }
+             if ((size < osize) && (used == 0))
+               sci->size_adjust = 0;
+             else
+               {
+                  osize -= used;
+                  if (osize < 0) osize = 0;
+                  size -= osize;
+                  sci->size_adjust = size * 4; 
+               }
+          }
+        else
+          {
+             size *= sizeof(DATA32);
+             if ((cache_size + size) > max_cache_size)
+               {
+                  sci->populate_me = 0;
+                  im->cache.populate_count--;
+               }
+          }
+     }
+   if (sci->populate_me)
+     {
 //        printf("##! populate!\n");
         sci->im = evas_common_image_new
           (dst_region_w, dst_region_h, im->cache_entry.flags.alpha);
@@ -510,11 +604,11 @@ evas_common_rgba_image_scalecache_do(Image_Entry *ie, RGBA_Image *dst,
                               {
                                  if (yy & 0x1)
                                    {
-                                      if (xx & 0x1) *pp = 0;
+                                      if (xx & 0x1) *pp = 0x882288ff;
                                    }
                                  else
                                    { 
-                                      if (!(xx & 0x1)) *pp = 0;
+                                      if (!(xx & 0x1)) *pp = 0x882288ff;
                                   }
                                  pp++;
                               }
@@ -522,7 +616,15 @@ evas_common_rgba_image_scalecache_do(Image_Entry *ie, RGBA_Image *dst,
                     }
 #endif                  
                }
-             cache_size += sci->dst_w * sci->dst_h * 4;
+             if (dounload)
+               {
+                  sci->forced_unload = 1;
+                  cache_size += sci->size_adjust;
+               }
+             else
+               {
+                  cache_size += sci->dst_w * sci->dst_h * 4;
+               }
 //             printf(" + %i @ flop: %i (%ix%i)\n", 
 //                    sci->dst_w * sci->dst_h * 4, sci->flop, 
 //                    sci->dst_w, sci->dst_h);
@@ -555,12 +657,20 @@ evas_common_rgba_image_scalecache_do(Image_Entry *ie, RGBA_Image *dst,
 //               im,
 //               (int)im->cache.orig_usage, 
 //               (int)im->cache.newest_usage);
-        if ((im->cache_entry.flags.loaded) && (!im->cs.no_free) && 
-            (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888))
+        if ((dounload) || 
+            ((im->cache_entry.flags.loaded) && 
+             ((!im->cs.no_free) 
+#ifdef EVAS_CSERVE             
+             || (ie->data1)
+#endif             
+              )  &&
+             (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)))
           {
-             if (im->cache.orig_usage < 
-                 (im->cache.newest_usage / 20))
-               evas_common_rgba_image_unload(&im->cache_entry);
+             if ((dounload) || (im->cache.orig_usage < 
+                                (im->cache.newest_usage / 20)))
+               {
+                  evas_common_rgba_image_unload(&im->cache_entry);
+               }
           }
         LKU(im->cache.lock);
      }
diff --git a/src/lib/engines/common/evas_intl/evas_intl_arabic.c b/src/lib/engines/common/evas_intl/evas_intl_arabic.c
index 3de2a13..9c7c0ac 100644
--- a/src/lib/engines/common/evas_intl/evas_intl_arabic.c
+++ b/src/lib/engines/common/evas_intl/evas_intl_arabic.c
@@ -1,5 +1,5 @@
 /* Authors:
- * 	Tom Hacohen (tom at stsob.com)
+ *	Tom Hacohen (tom at stsob.com)
  */
 
 #include "../evas_intl_utils.h"
@@ -73,26 +73,26 @@
 #define ARABIC_ISOLATED_YODH		0xFEF1
 
 #define ARABIC_IS_SPECIAL_LETTER(c)	((c) == ARABIC_ISOLATED_ALEPH ||  \
-					  (c) == ARABIC_ISOLATED_DALET || \
-					  (c) == ARABIC_ISOLATED_DAL ||   \
-					  (c) == ARABIC_ISOLATED_RESH ||  \
-					  (c) == ARABIC_ISOLATED_ZAYIN || \
-					  (c) == ARABIC_ISOLATED_WAW  || \
-					  (c) == ARABIC_ISOLATED_TA_MARBUTA)
+      (c) == ARABIC_ISOLATED_DALET || \
+      (c) == ARABIC_ISOLATED_DAL ||   \
+      (c) == ARABIC_ISOLATED_RESH ||  \
+      (c) == ARABIC_ISOLATED_ZAYIN || \
+      (c) == ARABIC_ISOLATED_WAW  || \
+      (c) == ARABIC_ISOLATED_TA_MARBUTA)
 /* from the first to last (including all forms, and special cases
  * like aleph maqsura in some forms*/
 #define ARABIC_IS_CONTEXT(c)	(((c) >= ARABIC_ISOLATED_ALEPH && (c) <= ARABIC_ISOLATED_YODH + 3) || \
-				 ((c) >= ARABIC_ISOLATED_ALEPH_MADDA && (c) <= ARABIC_ISOLATED_ALEPH_MADDA + 3) || \
-				 (c) == 0xFBE8 || \
-				 (c) == 0xFBE9) 
+      ((c) >= ARABIC_ISOLATED_ALEPH_MADDA && (c) <= ARABIC_ISOLATED_ALEPH_MADDA + 3) || \
+      (c) == 0xFBE8 || \
+      (c) == 0xFBE9)
 #define ARABIC_IS_LETTER(c)	ARABIC_IS_CONTEXT(c)
 /* used for arabic context logic */
 /* each value is the offset from the regular char in unicode */
 enum _ArabicContext {
-		ARABIC_CONTEXT_ISOLATED = 0,
-		ARABIC_CONTEXT_FINAL = 1,
-		ARABIC_CONTEXT_INITIAL = 2,
-		ARABIC_CONTEXT_MEDIAL = 3
+     ARABIC_CONTEXT_ISOLATED = 0,
+     ARABIC_CONTEXT_FINAL = 1,
+     ARABIC_CONTEXT_INITIAL = 2,
+     ARABIC_CONTEXT_MEDIAL = 3
 };
 typedef enum _ArabicContext ArabicContext;
 
@@ -110,73 +110,74 @@ _evas_intl_arabic_general_to_isolated(FriBidiChar chr);
 int
 evas_intl_arabic_to_context(FriBidiChar *text)
 {
-	int i;
-	int len;
-	int start_of_context = 1; /* assume the first is special/non arabic */
-	int last_is_first = 0;
-	int last_letter = 0;
-	
-	/* check for empty string */
-	if (!*text)
-		return;
-
-	len = _evas_intl_arabic_text_to_isolated(text);
-	/*FIXME: make it skip vowels */
-	for (i = 0 ; i < len ; i++)  {
-
-		if (! ARABIC_IS_LETTER(text[i])) {
-			/* mark so it won't be touched,
-			 * though start formating */
-			if (last_letter && !start_of_context) {
-				ArabicContext tmp = (last_is_first) ?
-					ARABIC_CONTEXT_ISOLATED
-					:
-					ARABIC_CONTEXT_FINAL;
-				text[i-1] = _evas_intl_arabic_isolated_to_context(
-					last_letter,
-					tmp);
-				
-			}
-			last_is_first = 0;
-			start_of_context = 1;
-			last_letter = 0;
-			continue;
-		}
-		/* adjust the last letter */
-		last_letter = text[i];
-		if (ARABIC_IS_SPECIAL_LETTER(text[i])) {
-			if (!start_of_context) 
-				text[i] = _evas_intl_arabic_isolated_to_context(text[i], ARABIC_CONTEXT_FINAL);
-			/* else: leave isolated */
-				
-			start_of_context = 1;
-			last_is_first = 0;
-			continue;
-		}
-
-		if (start_of_context) {
-			text[i] = _evas_intl_arabic_isolated_to_context(text[i], ARABIC_CONTEXT_INITIAL);
-			last_is_first = 1;
-		}
-		else {
-			text[i] = _evas_intl_arabic_isolated_to_context(text[i], ARABIC_CONTEXT_MEDIAL);
-			last_is_first = 0;
-		}
-		/* spceial chars don't get here. */
-		start_of_context = 0;
-		
-	}
-	/* if it's arabic and not isolated, the last is always final */
-	i--;
-	if (last_letter && !start_of_context) {
-				ArabicContext tmp = (last_is_first) ? ARABIC_CONTEXT_ISOLATED : ARABIC_CONTEXT_FINAL;
-				/* because it's medial atm, and should be isolated */
-				text[i] = _evas_intl_arabic_isolated_to_context(
-					last_letter,
-					tmp);
-			}
-
-	return len;
+   int i;
+   int len;
+   int start_of_context = 1; /* assume the first is special/non arabic */
+   int last_is_first = 0;
+   int last_letter = 0;
+
+   /* check for empty string */
+   if (!*text)
+     return;
+
+   len = _evas_intl_arabic_text_to_isolated(text);
+   /*FIXME: make it skip vowels */
+   for (i = 0; i < len; i++)
+     {
+	if (!ARABIC_IS_LETTER(text[i]))
+	  {
+	     /* mark so it won't be touched,
+	      * though start formating */
+	     if (last_letter && !start_of_context)
+	       {
+		  ArabicContext tmp = (last_is_first) ?
+		     ARABIC_CONTEXT_ISOLATED : ARABIC_CONTEXT_FINAL;
+		  text[i-1] = _evas_intl_arabic_isolated_to_context(
+			last_letter,
+			tmp);
+	       }
+	     last_is_first = 0;
+	     start_of_context = 1;
+	     last_letter = 0;
+	     continue;
+	  }
+	/* adjust the last letter */
+	last_letter = text[i];
+	if (ARABIC_IS_SPECIAL_LETTER(text[i]))
+	  {
+	     if (!start_of_context)
+	       text[i] = _evas_intl_arabic_isolated_to_context(text[i], ARABIC_CONTEXT_FINAL);
+	     /* else: leave isolated */
+
+	     start_of_context = 1;
+	     last_is_first = 0;
+	     continue;
+	  }
+
+	if (start_of_context)
+	  {
+	     text[i] = _evas_intl_arabic_isolated_to_context(text[i], ARABIC_CONTEXT_INITIAL);
+	     last_is_first = 1;
+	  }
+	else
+	  {
+	     text[i] = _evas_intl_arabic_isolated_to_context(text[i], ARABIC_CONTEXT_MEDIAL);
+	     last_is_first = 0;
+	  }
+	/* spceial chars don't get here. */
+	start_of_context = 0;
+
+     }
+   /* if it's arabic and not isolated, the last is always final */
+   i--;
+   if (last_letter && !start_of_context)
+     {
+	ArabicContext tmp = (last_is_first) ? ARABIC_CONTEXT_ISOLATED : ARABIC_CONTEXT_FINAL;
+	/* because it's medial atm, and should be isolated */
+	text[i] = _evas_intl_arabic_isolated_to_context(last_letter, tmp);
+     }
+
+   return len;
 }
 
 /* I wish I could think about a simpler way to do it.
@@ -184,131 +185,136 @@ evas_intl_arabic_to_context(FriBidiChar *text)
 static FriBidiChar
 _evas_intl_arabic_general_to_isolated(FriBidiChar chr)
 {
-	switch (chr) {
-		case ARABIC_ALEPH_MADDA:
-			return ARABIC_ISOLATED_ALEPH_MADDA;
-
-		case ARABIC_ALEPH:
-			return ARABIC_ISOLATED_ALEPH;
-
-		case ARABIC_TA_MARBUTA:
-			return ARABIC_ISOLATED_TA_MARBUTA;
-		case ARABIC_BET:
-			return ARABIC_ISOLATED_BET;
-		
-		case ARABIC_TAW:
-			return ARABIC_ISOLATED_TAW;
-
-		case ARABIC_TA:
-			return ARABIC_ISOLATED_TA;
-		
-		case ARABIC_GIMEL:
-			return ARABIC_ISOLATED_GIMEL;
-		
-		case ARABIC_HETH:
-			return ARABIC_ISOLATED_HETH;
-		
-		case ARABIC_HA:
-			return ARABIC_ISOLATED_HA;
-		
-		case ARABIC_DALET:
-			return ARABIC_ISOLATED_DALET;
-		
-		case ARABIC_DAL:
-			return ARABIC_ISOLATED_DAL;
-		
-		case ARABIC_RESH:
-			return ARABIC_ISOLATED_RESH;
-		
-		case ARABIC_ZAYIN:
-			return ARABIC_ISOLATED_ZAYIN;
-		
-		case ARABIC_SHIN:
-			return ARABIC_ISOLATED_SHIN;
-		
-		case ARABIC_SH:
-			return ARABIC_ISOLATED_SH;
-		
-		case ARABIC_TSADE:
-			return ARABIC_ISOLATED_TSADE;
-		
-		case ARABIC_DAD:
-			return ARABIC_ISOLATED_DAD;
-		
-		case ARABIC_TETH:
-			return ARABIC_ISOLATED_TETH;
-		
-		case ARABIC_ZA:
-			return ARABIC_ISOLATED_ZA;
-		
-		case ARABIC_AYIN:
-			return ARABIC_ISOLATED_AYIN;
-		
-		case ARABIC_GHAIN:
-			return ARABIC_ISOLATED_GHAIN;
-		
-		case ARABIC_PE:
-			return ARABIC_ISOLATED_PE;
-		
-		case ARABIC_QOPH:
-			return ARABIC_ISOLATED_QOPH;
-		
-		case ARABIC_KAPH:
-			return ARABIC_ISOLATED_KAPH;
-		
-		case ARABIC_LAMED:
-			return ARABIC_ISOLATED_LAMED;
-
-		case ARABIC_MEM:
-			return ARABIC_ISOLATED_MEM;
-		
-		case ARABIC_NUN:
-			return ARABIC_ISOLATED_NUN;
-		
-		case ARABIC_HE:
-			return ARABIC_ISOLATED_HE;
-		
-		case ARABIC_WAW:
-			return ARABIC_ISOLATED_WAW;
-
-		case ARABIC_ALEPH_MAQSURA:
-			return ARABIC_ISOLATED_ALEPH_MAQSURA;
-		
-		case ARABIC_YODH:
-			return ARABIC_ISOLATED_YODH;
-		default:
-			return chr;
-	}
+   switch (chr)
+     {
+      case ARABIC_ALEPH_MADDA:
+	 return ARABIC_ISOLATED_ALEPH_MADDA;
+
+      case ARABIC_ALEPH:
+	 return ARABIC_ISOLATED_ALEPH;
+
+      case ARABIC_TA_MARBUTA:
+	 return ARABIC_ISOLATED_TA_MARBUTA;
+
+      case ARABIC_BET:
+	 return ARABIC_ISOLATED_BET;
+
+      case ARABIC_TAW:
+	 return ARABIC_ISOLATED_TAW;
+
+      case ARABIC_TA:
+	 return ARABIC_ISOLATED_TA;
+
+      case ARABIC_GIMEL:
+	 return ARABIC_ISOLATED_GIMEL;
+
+      case ARABIC_HETH:
+	 return ARABIC_ISOLATED_HETH;
+
+      case ARABIC_HA:
+	 return ARABIC_ISOLATED_HA;
+
+      case ARABIC_DALET:
+	 return ARABIC_ISOLATED_DALET;
+
+      case ARABIC_DAL:
+	 return ARABIC_ISOLATED_DAL;
+
+      case ARABIC_RESH:
+	 return ARABIC_ISOLATED_RESH;
+
+      case ARABIC_ZAYIN:
+	 return ARABIC_ISOLATED_ZAYIN;
+
+      case ARABIC_SHIN:
+	 return ARABIC_ISOLATED_SHIN;
+
+      case ARABIC_SH:
+	 return ARABIC_ISOLATED_SH;
+
+      case ARABIC_TSADE:
+	 return ARABIC_ISOLATED_TSADE;
+
+      case ARABIC_DAD:
+	 return ARABIC_ISOLATED_DAD;
+
+      case ARABIC_TETH:
+	 return ARABIC_ISOLATED_TETH;
+
+      case ARABIC_ZA:
+	 return ARABIC_ISOLATED_ZA;
+
+      case ARABIC_AYIN:
+	 return ARABIC_ISOLATED_AYIN;
+
+      case ARABIC_GHAIN:
+	 return ARABIC_ISOLATED_GHAIN;
+
+      case ARABIC_PE:
+	 return ARABIC_ISOLATED_PE;
+
+      case ARABIC_QOPH:
+	 return ARABIC_ISOLATED_QOPH;
+
+      case ARABIC_KAPH:
+	 return ARABIC_ISOLATED_KAPH;
+
+      case ARABIC_LAMED:
+	 return ARABIC_ISOLATED_LAMED;
+
+      case ARABIC_MEM:
+	 return ARABIC_ISOLATED_MEM;
+
+      case ARABIC_NUN:
+	 return ARABIC_ISOLATED_NUN;
+
+      case ARABIC_HE:
+	 return ARABIC_ISOLATED_HE;
+
+      case ARABIC_WAW:
+	 return ARABIC_ISOLATED_WAW;
+
+      case ARABIC_ALEPH_MAQSURA:
+	 return ARABIC_ISOLATED_ALEPH_MAQSURA;
+
+      case ARABIC_YODH:
+	 return ARABIC_ISOLATED_YODH;
+      default:
+	 return chr;
+     }
 }
 
 static FriBidiChar
 _evas_intl_arabic_isolated_to_context(FriBidiChar chr, ArabicContext context)
 {
-	if (ARABIC_IS_SPECIAL_LETTER(chr)) {
-		if (context == ARABIC_CONTEXT_INITIAL)
-			return chr;
-		else
-			return chr + ARABIC_CONTEXT_FINAL;
-	}
-	/* HACK AROUND ALIF MAQSURA */
-	else if (chr == ARABIC_ISOLATED_ALEPH_MAQSURA && context > 1) {
-		chr = 0xFBE8; /* the initial form */
-		context -= 2;
-	}
-	return chr + context;
+   if (ARABIC_IS_SPECIAL_LETTER(chr))
+     {
+	if (context == ARABIC_CONTEXT_INITIAL)
+	  return chr;
+	else
+	  return chr + ARABIC_CONTEXT_FINAL;
+     }
+   /* HACK AROUND ALIF MAQSURA */
+   else if (chr == ARABIC_ISOLATED_ALEPH_MAQSURA && context > 1)
+     {
+	chr = 0xFBE8; /* the initial form */
+	context -= 2;
+     }
+   return chr + context;
 }
 
 static int
 _evas_intl_arabic_text_to_isolated(FriBidiChar *text)
 {
-	int i=0;
-	while (*text) {
-		/* if it's not arabic/it's already in context
-		 * it's just returned the same */
-		*text = _evas_intl_arabic_general_to_isolated(*text);
-		text++;
-		i++;
-	}
-	return i;
+   int i = 0;
+   while (*text)
+     {
+	/* if it's not arabic/it's already in context
+	 * it's just returned the same */
+	*text = _evas_intl_arabic_general_to_isolated(*text);
+	text++;
+	i++;
+     }
+   return i;
 }
-#endif
\ No newline at end of file
+#endif
diff --git a/src/lib/engines/common/evas_intl_utils.c b/src/lib/engines/common/evas_intl_utils.c
index 6fcc099..cced211 100644
--- a/src/lib/engines/common/evas_intl_utils.c
+++ b/src/lib/engines/common/evas_intl_utils.c
@@ -1,10 +1,11 @@
 /* Authors:
- * 	Tom Hacohen (tom at stsob.com)
+ *	Tom Hacohen (tom at stsob.com)
  */
 
 #include <string.h>
 #include <stdlib.h>
 
+#include "evas_common.h"
 #include "evas_intl_utils.h"
 
 #ifdef USE_FRIBIDI
@@ -14,94 +15,96 @@
 
 /* FIXME: fribidi_utf8_to_unicode should use char len and not byte len!*/
 char *
-evas_intl_utf8_to_visual(const char *text, int *ret_len, FriBidiCharType *direction,
-			FriBidiLevel **embedding_level_list)
+evas_intl_utf8_to_visual(const char *text, int *ret_len, FriBidiCharType *direction, FriBidiLevel **embedding_level_list)
 {
-	FriBidiChar *unicode_in, *unicode_out;
-	char *text_out;
-	size_t len;
-	size_t byte_len;
-
-	if (!text)
-		return NULL;
-
-	len = evas_string_char_len_get(text);
-
-	/* if there's nothing to do, return text
-	 * one char draws are quite common */
-	if (len <= 1) {
-		*ret_len = len;
-		*embedding_level_list = NULL;
-		return strdup(text);
-	}
-	
-	byte_len = strlen(text); /* we need the actual number of bytes, not number of chars */
-	
-	unicode_in=(FriBidiChar *)malloc(sizeof(FriBidiChar)*(len+1));
-	if (!unicode_in) {
-		len = -1;
-		goto error1;
-		
-	}
-		
-	len = fribidi_utf8_to_unicode(text, byte_len, unicode_in);
-	
-	unicode_out=(FriBidiChar *)malloc(sizeof(FriBidiChar)*(len+1));
-	if (!unicode_out) {
-		len = -2;
-		goto error2;
-		
-	}
-
-	*embedding_level_list=(FriBidiLevel *)malloc(sizeof(FriBidiLevel)*len);
-	if (!*embedding_level_list) {
-		len = -3;
-		goto error3;
-		
-	}
+   FriBidiChar *unicode_in, *unicode_out;
+   char *text_out;
+   size_t len;
+   size_t byte_len;
 
-#ifdef ARABIC_SUPPORT
-	/* fix arabic context */
-	evas_intl_arabic_to_context(unicode_in);
-#endif	
-	if (! fribidi_log2vis(unicode_in, len, direction,
-			unicode_out, NULL, NULL, *embedding_level_list)) {
-		len = -4;
-		goto error3;
-				
-	}
-
-	text_out = malloc(UTF8_BYTES_PER_CHAR * len + 1);
-	if (!text_out) {
-		len = -5;
-		goto error4;
-	}
-
-	fribidi_unicode_to_utf8(unicode_out, len, text_out);
-	
-	free(unicode_in);
-	free(unicode_out);
+   if (!text)
+     return NULL;
+
+   len = evas_string_char_len_get(text);
 
+   /* if there's nothing to do, return text
+    * one char draws are quite common */
+   if (len <= 1)
+     {
 	*ret_len = len;
-	return text_out;
+	*embedding_level_list = NULL;
+	return strdup(text);
+     }
+
+   byte_len = strlen(text); /* we need the actual number of bytes, not number of chars */
+
+   unicode_in = (FriBidiChar *)malloc(sizeof(FriBidiChar) * (len + 1));
+   if (!unicode_in)
+     {
+	len = -1;
+	goto error1;
+     }
+
+   len = fribidi_utf8_to_unicode(text, byte_len, unicode_in);
+
+   unicode_out = (FriBidiChar *)malloc(sizeof(FriBidiChar) * (len + 1));
+   if (!unicode_out)
+     {
+	len = -2;
+	goto error2;
+     }
+
+   *embedding_level_list = (FriBidiLevel *)malloc(sizeof(FriBidiLevel) * len);
+   if (!*embedding_level_list)
+     {
+	len = -3;
+	goto error3;
+     }
+
+#ifdef ARABIC_SUPPORT
+   /* fix arabic context */
+   evas_intl_arabic_to_context(unicode_in);
+#endif
+   if (!fribidi_log2vis(unicode_in, len, direction,
+	    unicode_out, NULL, NULL, *embedding_level_list))
+     {
+	len = -4;
+	goto error3;
+     }
 
-	/* ERROR HANDLING */
+   text_out = malloc(UTF8_BYTES_PER_CHAR * len + 1);
+   if (!text_out)
+     {
+	len = -5;
+	goto error4;
+     }
+
+   fribidi_unicode_to_utf8(unicode_out, len, text_out);
+
+   free(unicode_in);
+   free(unicode_out);
+
+   *ret_len = len;
+   return text_out;
+
+   /* ERROR HANDLING */
 error4:
-	free(unicode_out);
+   free(unicode_out);
 error3:
-	free(*embedding_level_list);
+   free(*embedding_level_list);
 error2:
-	free(unicode_in);
+   free(unicode_in);
 error1:
 
-	*ret_len = len;	
-	return NULL;
+   *ret_len = len;
+   return NULL;
 }
 
-
 int
 evas_intl_is_rtl_char(FriBidiLevel *embedded_level_list, FriBidiStrIndex i)
 {
-	return fribidi_is_char_rtl(embedded_level_list, 0, i);
+   if(embedded_level_list || i < 0)
+     return 0;
+   return FRIBIDI_IS_RTL(embedded_level_list[i]);
 }
 #endif
diff --git a/src/lib/engines/common/evas_intl_utils.h b/src/lib/engines/common/evas_intl_utils.h
index 35a8213..4c0e61d 100644
--- a/src/lib/engines/common/evas_intl_utils.h
+++ b/src/lib/engines/common/evas_intl_utils.h
@@ -3,7 +3,7 @@
 
 #include "config.h"
 
-#ifdef HAVE_FRIBIDI_FRIBIDI_H
+#ifdef HAVE_FRIBIDI
 #define USE_FRIBIDI 1
 #define INTERNATIONAL_SUPPORT
 #endif
@@ -22,8 +22,7 @@ int
 evas_intl_is_rtl_char(FriBidiLevel *embedded_level_list, FriBidiStrIndex i);
 
 char *
-evas_intl_utf8_to_visual(const char *text, int *ret_len, FriBidiCharType *direction,
-			FriBidiLevel **embedding_level_list);
+evas_intl_utf8_to_visual(const char *text, int *ret_len, FriBidiCharType *direction, FriBidiLevel **embedding_level_list);
 #endif
 
 #endif
diff --git a/src/lib/engines/common/evas_op_add/Makefile.in b/src/lib/engines/common/evas_op_add/Makefile.in
index 854750f..29e7158 100644
--- a/src/lib/engines/common/evas_op_add/Makefile.in
+++ b/src/lib/engines/common/evas_op_add/Makefile.in
@@ -203,6 +203,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/lib/engines/common/evas_op_blend/Makefile.in b/src/lib/engines/common/evas_op_blend/Makefile.in
index 247a17a..9ff0cb3 100644
--- a/src/lib/engines/common/evas_op_blend/Makefile.in
+++ b/src/lib/engines/common/evas_op_blend/Makefile.in
@@ -203,6 +203,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/lib/engines/common/evas_op_copy/Makefile.in b/src/lib/engines/common/evas_op_copy/Makefile.in
index 9c2e106..194e21f 100644
--- a/src/lib/engines/common/evas_op_copy/Makefile.in
+++ b/src/lib/engines/common/evas_op_copy/Makefile.in
@@ -203,6 +203,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/lib/engines/common/evas_op_mask/Makefile.in b/src/lib/engines/common/evas_op_mask/Makefile.in
index 326cab8..c4a30f6 100644
--- a/src/lib/engines/common/evas_op_mask/Makefile.in
+++ b/src/lib/engines/common/evas_op_mask/Makefile.in
@@ -203,6 +203,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/lib/engines/common/evas_op_mul/Makefile.in b/src/lib/engines/common/evas_op_mul/Makefile.in
index 0b87c1d..3018fd7 100644
--- a/src/lib/engines/common/evas_op_mul/Makefile.in
+++ b/src/lib/engines/common/evas_op_mul/Makefile.in
@@ -203,6 +203,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/lib/engines/common/evas_op_sub/Makefile.in b/src/lib/engines/common/evas_op_sub/Makefile.in
index 41893cb..775e63a 100644
--- a/src/lib/engines/common/evas_op_sub/Makefile.in
+++ b/src/lib/engines/common/evas_op_sub/Makefile.in
@@ -203,6 +203,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/lib/engines/common_16/Makefile.in b/src/lib/engines/common_16/Makefile.in
index c5f393a..800ed8f 100644
--- a/src/lib/engines/common_16/Makefile.in
+++ b/src/lib/engines/common_16/Makefile.in
@@ -227,6 +227,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/lib/engines/common_16/evas_soft16_dither_mask.c b/src/lib/engines/common_16/evas_soft16_dither_mask.c
index 9414e9a..48ed574 100644
--- a/src/lib/engines/common_16/evas_soft16_dither_mask.c
+++ b/src/lib/engines/common_16/evas_soft16_dither_mask.c
@@ -283,11 +283,10 @@ soft16_image_convert_from_rgb(Soft16_Image *im, const DATA32 *src)
 {
    const DATA32 *sp;
    DATA16 *dp;
-   int y, pad;
+   int y;
 
    sp = src;
    dp = im->pixels;
-   pad = im->stride - im->cache_entry.w;
 
    for (y = 0; y < im->cache_entry.h; y++, sp += im->cache_entry.w, dp += im->stride)
      _soft16_convert_from_rgb_scanline(sp, dp, y, im->cache_entry.w);
diff --git a/src/lib/file/Makefile.in b/src/lib/file/Makefile.in
index 5b3ff4b..f94b93f 100644
--- a/src/lib/file/Makefile.in
+++ b/src/lib/file/Makefile.in
@@ -222,6 +222,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/lib/imaging/Makefile.in b/src/lib/imaging/Makefile.in
index 5d33a70..12edbc1 100644
--- a/src/lib/imaging/Makefile.in
+++ b/src/lib/imaging/Makefile.in
@@ -222,6 +222,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/lib/include/Makefile.in b/src/lib/include/Makefile.in
index 3902de0..7fb0625 100644
--- a/src/lib/include/Makefile.in
+++ b/src/lib/include/Makefile.in
@@ -203,6 +203,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/lib/include/evas_common.h b/src/lib/include/evas_common.h
index 3167ee1..c80f87c 100644
--- a/src/lib/include/evas_common.h
+++ b/src/lib/include/evas_common.h
@@ -471,6 +471,10 @@ struct _Image_Entry
 #endif
 
    Image_Entry_Flags      flags;
+   Evas_Image_Scale_Hint  scale_hint;
+   void                  *data1, *data2;
+   int                    server_id;
+   int                    connect_num;
 };
 
 struct _Engine_Image_Entry
diff --git a/src/lib/include/evas_private.h b/src/lib/include/evas_private.h
index f263eab..7304966 100644
--- a/src/lib/include/evas_private.h
+++ b/src/lib/include/evas_private.h
@@ -682,6 +682,8 @@ struct _Evas_Func
 
 /*    void (*image_rotation_set)              (void *data, void *image); */
 
+   void (*image_scale_hint_set)            (void *data, void *image, int hint);
+   int  (*image_scale_hint_get)            (void *data, void *image);
 };
 
 struct _Evas_Image_Load_Func
diff --git a/src/modules/Makefile.in b/src/modules/Makefile.in
index d46c1e4..0cb8789 100644
--- a/src/modules/Makefile.in
+++ b/src/modules/Makefile.in
@@ -215,6 +215,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/engines/Makefile.am b/src/modules/engines/Makefile.am
index 897e3a8..3ddd1f3 100644
--- a/src/modules/engines/Makefile.am
+++ b/src/modules/engines/Makefile.am
@@ -8,7 +8,7 @@ fb \
 gl_common \
 gl_x11 \
 gl_glew \
-software_win32_gdi \
+software_gdi \
 software_ddraw \
 software_x11 \
 xrender_x11 \
diff --git a/src/modules/engines/Makefile.in b/src/modules/engines/Makefile.in
index c527b07..8cb4485 100644
--- a/src/modules/engines/Makefile.in
+++ b/src/modules/engines/Makefile.in
@@ -215,6 +215,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
@@ -286,7 +288,7 @@ fb \
 gl_common \
 gl_x11 \
 gl_glew \
-software_win32_gdi \
+software_gdi \
 software_ddraw \
 software_x11 \
 xrender_x11 \
diff --git a/src/modules/engines/buffer/Makefile.in b/src/modules/engines/buffer/Makefile.in
index f32db41..113f84e 100644
--- a/src/modules/engines/buffer/Makefile.in
+++ b/src/modules/engines/buffer/Makefile.in
@@ -243,6 +243,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/engines/direct3d/Makefile.in b/src/modules/engines/direct3d/Makefile.in
index a674ff0..41494a5 100644
--- a/src/modules/engines/direct3d/Makefile.in
+++ b/src/modules/engines/direct3d/Makefile.in
@@ -268,6 +268,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/engines/direct3d/evas_engine.c b/src/modules/engines/direct3d/evas_engine.c
index f93f770..6ff9021 100644
--- a/src/modules/engines/direct3d/evas_engine.c
+++ b/src/modules/engines/direct3d/evas_engine.c
@@ -376,6 +376,17 @@ eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
 }
 
 static void
+eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static int
+eng_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+static void
 eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text)
 {
    Render_Engine *re = (Render_Engine *)data;
@@ -558,6 +569,10 @@ module_open(Evas_Module *em)
    ORD(image_border_get);
    ORD(font_draw);
    ORD(font_free);
+
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
+
 /*
    ORD(gradient2_color_np_stop_insert);
    ORD(gradient2_clear);
diff --git a/src/modules/engines/directfb/Makefile.in b/src/modules/engines/directfb/Makefile.in
index ae36e5b..8ddb299 100644
--- a/src/modules/engines/directfb/Makefile.in
+++ b/src/modules/engines/directfb/Makefile.in
@@ -242,6 +242,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/engines/directfb/evas_engine.c b/src/modules/engines/directfb/evas_engine.c
index 24c5c1b..aff909b 100644
--- a/src/modules/engines/directfb/evas_engine.c
+++ b/src/modules/engines/directfb/evas_engine.c
@@ -1600,6 +1600,17 @@ evas_engine_dfb_image_comment_get(void *data __UNUSED__, void *image, char *key
    return im->info.comment;
 }
 
+static void
+evas_engine_dfb_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static int
+evas_engine_dfb_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
 EAPI int
 module_open(Evas_Module *em)
 {
@@ -1648,6 +1659,8 @@ module_open(Evas_Module *em)
    ORD(rectangle_draw);
    ORD(polygon_draw);
    ORD(gradient_draw);
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
    /* now advertise out own api */
    em->functions = (void *)(&func);
    return 1;
diff --git a/src/modules/engines/fb/Makefile.in b/src/modules/engines/fb/Makefile.in
index ccac99e..b996d3c 100644
--- a/src/modules/engines/fb/Makefile.in
+++ b/src/modules/engines/fb/Makefile.in
@@ -244,6 +244,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/engines/gl_common/Makefile.in b/src/modules/engines/gl_common/Makefile.in
index 119f52d..d1e2d73 100644
--- a/src/modules/engines/gl_common/Makefile.in
+++ b/src/modules/engines/gl_common/Makefile.in
@@ -236,6 +236,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/engines/gl_glew/Makefile.in b/src/modules/engines/gl_glew/Makefile.in
index 1cdacd9..96e5684 100644
--- a/src/modules/engines/gl_glew/Makefile.in
+++ b/src/modules/engines/gl_glew/Makefile.in
@@ -243,6 +243,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/engines/gl_glew/evas_engine.c b/src/modules/engines/gl_glew/evas_engine.c
index ae540bd..c242576 100644
--- a/src/modules/engines/gl_glew/evas_engine.c
+++ b/src/modules/engines/gl_glew/evas_engine.c
@@ -884,6 +884,17 @@ eng_image_draw(void *data, void *context, void *surface, void *image, int src_x,
 }
 
 static void
+eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static int
+eng_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+static void
 eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text)
 {
    Render_Engine *re;
@@ -984,6 +995,10 @@ module_open(Evas_Module *em)
    ORD(image_native_set);
    ORD(image_native_get);
    ORD(font_draw);
+   
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
+   
    /* now advertise out own api */
    em->functions = (void *)(&func);
    return 1;
diff --git a/src/modules/engines/gl_x11/Makefile.in b/src/modules/engines/gl_x11/Makefile.in
index 2704cd6..52fdbe3 100644
--- a/src/modules/engines/gl_x11/Makefile.in
+++ b/src/modules/engines/gl_x11/Makefile.in
@@ -243,6 +243,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/engines/gl_x11/evas_engine.c b/src/modules/engines/gl_x11/evas_engine.c
index f05cf98..8934e2d 100644
--- a/src/modules/engines/gl_x11/evas_engine.c
+++ b/src/modules/engines/gl_x11/evas_engine.c
@@ -1014,6 +1014,17 @@ eng_image_draw(void *data, void *context, void *surface __UNUSED__, void *image,
 }
 
 static void
+eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static int
+eng_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+static void
 eng_font_draw(void *data, void *context, void *surface __UNUSED__, void *font, int x, int y, int w __UNUSED__, int h __UNUSED__, int ow __UNUSED__, int oh __UNUSED__, const char *text)
 {
    Render_Engine *re;
@@ -1169,6 +1180,10 @@ module_open(Evas_Module *em)
    ORD(image_native_set);
    ORD(image_native_get);
    ORD(font_draw);
+   
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
+   
    /* now advertise out own api */
    em->functions = (void *)(&func);
    return 1;
diff --git a/src/modules/engines/quartz/Makefile.in b/src/modules/engines/quartz/Makefile.in
index 68a17f6..f6eb65a 100644
--- a/src/modules/engines/quartz/Makefile.in
+++ b/src/modules/engines/quartz/Makefile.in
@@ -242,6 +242,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/engines/quartz/evas_engine.c b/src/modules/engines/quartz/evas_engine.c
index de7b3b9..4dc9d80 100644
--- a/src/modules/engines/quartz/evas_engine.c
+++ b/src/modules/engines/quartz/evas_engine.c
@@ -1101,6 +1101,18 @@ eng_image_draw(void *data, void *context, void *surface, void *image, int src_x,
       CGContextDrawImage(re->ctx, CGRectMake(dst_x, dst_y, dst_w, dst_h), im->cgim);
 }
 
+static void
+eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static int
+eng_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+
 #pragma mark Text Manipulation & Drawing
 
 static Evas_Quartz_Font *
@@ -1491,6 +1503,9 @@ module_open(Evas_Module *em)
    ORD(rectangle_draw);
    ORD(setup);
 
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
+   
    /* now advertise out our api */
    em->functions = (void *)(&func);
    return 1;
diff --git a/src/modules/engines/software_16/Makefile.in b/src/modules/engines/software_16/Makefile.in
index c7e7122..e33aa7d 100644
--- a/src/modules/engines/software_16/Makefile.in
+++ b/src/modules/engines/software_16/Makefile.in
@@ -236,6 +236,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/engines/software_16/evas_engine.c b/src/modules/engines/software_16/evas_engine.c
index 93e4af8..30e6758 100644
--- a/src/modules/engines/software_16/evas_engine.c
+++ b/src/modules/engines/software_16/evas_engine.c
@@ -648,6 +648,17 @@ eng_image_draw(void *data __UNUSED__, void *context, void *surface, void *image,
 }
 
 static void
+eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static int
+eng_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+static void
 eng_image_cache_flush(void *data __UNUSED__)
 {
    evas_cache_image_flush(evas_common_soft16_image_cache_get());
@@ -959,7 +970,9 @@ static Evas_Func func =
      eng_font_cache_get,
      /* font hinting functions */
      eng_font_hinting_set,
-     eng_font_hinting_can_hint
+     eng_font_hinting_can_hint,
+     eng_image_scale_hint_set,
+     eng_image_scale_hint_get
      /* FUTURE software generic calls go here */
 };
 
diff --git a/src/modules/engines/software_16_ddraw/Makefile.in b/src/modules/engines/software_16_ddraw/Makefile.in
index c9e8270..e07fb34 100644
--- a/src/modules/engines/software_16_ddraw/Makefile.in
+++ b/src/modules/engines/software_16_ddraw/Makefile.in
@@ -254,6 +254,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/engines/software_16_sdl/Makefile.in b/src/modules/engines/software_16_sdl/Makefile.in
index e955431..b869c88 100644
--- a/src/modules/engines/software_16_sdl/Makefile.in
+++ b/src/modules/engines/software_16_sdl/Makefile.in
@@ -240,6 +240,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/engines/software_16_sdl/evas_engine.c b/src/modules/engines/software_16_sdl/evas_engine.c
index c15a13e..3341720 100644
--- a/src/modules/engines/software_16_sdl/evas_engine.c
+++ b/src/modules/engines/software_16_sdl/evas_engine.c
@@ -822,6 +822,18 @@ evas_engine_sdl16_image_draw(void *data __UNUSED__, void *context, void *surface
 }
 
 static void
+evas_engine_sdl16_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static int
+evas_engine_sdl16_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+
+static void
 evas_engine_sdl16_image_cache_flush(void *data)
 {
    Render_Engine        *re = (Render_Engine*) data;
@@ -1058,6 +1070,10 @@ module_open(Evas_Module *em)
    ORD(line_draw);
    ORD(rectangle_draw);
    ORD(polygon_draw);
+   
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
+   
    /* now advertise out own api */
    em->functions = (void *)(&func);
    return 1;
diff --git a/src/modules/engines/software_16_wince/Makefile.in b/src/modules/engines/software_16_wince/Makefile.in
index 6dfa4ee..36469da 100644
--- a/src/modules/engines/software_16_wince/Makefile.in
+++ b/src/modules/engines/software_16_wince/Makefile.in
@@ -258,6 +258,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/engines/software_16_x11/Makefile.am b/src/modules/engines/software_16_x11/Makefile.am
index 4173d6e..8a44b65 100644
--- a/src/modules/engines/software_16_x11/Makefile.am
+++ b/src/modules/engines/software_16_x11/Makefile.am
@@ -22,7 +22,7 @@ evas_engine.c \
 evas_x_buffer.c
 
 module_la_LIBADD = @EINA_LIBS@ @evas_engine_software_16_x11_libs@ $(top_builddir)/src/lib/libevas.la
-module_la_LDFLAGS = -module -avoid-version
+module_la_LDFLAGS = -no-undefined -module -avoid-version
 module_la_LIBTOOLFLAGS = --tag=disable-static
 
 include_HEADERS = Evas_Engine_Software_16_X11.h
diff --git a/src/modules/engines/software_16_x11/Makefile.in b/src/modules/engines/software_16_x11/Makefile.in
index 0370906..ee967b9 100644
--- a/src/modules/engines/software_16_x11/Makefile.in
+++ b/src/modules/engines/software_16_x11/Makefile.in
@@ -243,6 +243,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
@@ -323,7 +325,7 @@ AM_CPPFLAGS = \
 @BUILD_ENGINE_SOFTWARE_16_X11_TRUE at evas_x_buffer.c
 
 @BUILD_ENGINE_SOFTWARE_16_X11_TRUE at module_la_LIBADD = @EINA_LIBS@ @evas_engine_software_16_x11_libs@ $(top_builddir)/src/lib/libevas.la
- at BUILD_ENGINE_SOFTWARE_16_X11_TRUE@module_la_LDFLAGS = -module -avoid-version
+ at BUILD_ENGINE_SOFTWARE_16_X11_TRUE@module_la_LDFLAGS = -no-undefined -module -avoid-version
 @BUILD_ENGINE_SOFTWARE_16_X11_TRUE at module_la_LIBTOOLFLAGS = --tag=disable-static
 @BUILD_ENGINE_SOFTWARE_16_X11_TRUE at include_HEADERS = Evas_Engine_Software_16_X11.h
 EXTRA_DIST = evas_engine.h
diff --git a/src/modules/engines/software_ddraw/Makefile.in b/src/modules/engines/software_ddraw/Makefile.in
index 8dc3ba6..5616190 100644
--- a/src/modules/engines/software_ddraw/Makefile.in
+++ b/src/modules/engines/software_ddraw/Makefile.in
@@ -255,6 +255,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/engines/software_ddraw/Evas_Engine_Software_DDraw.h b/src/modules/engines/software_gdi/Evas_Engine_Software_Gdi.h
similarity index 55%
copy from src/modules/engines/software_ddraw/Evas_Engine_Software_DDraw.h
copy to src/modules/engines/software_gdi/Evas_Engine_Software_Gdi.h
index e06ef4e..a95b07e 100644
--- a/src/modules/engines/software_ddraw/Evas_Engine_Software_DDraw.h
+++ b/src/modules/engines/software_gdi/Evas_Engine_Software_Gdi.h
@@ -1,5 +1,5 @@
-#ifndef __EVAS_ENGINE_SOFTWARE_DDRAW_H__
-#define __EVAS_ENGINE_SOFTWARE_DDRAW_H__
+#ifndef __EVAS_ENGINE_SOFTWARE_GDI_H__
+#define __EVAS_ENGINE_SOFTWARE_GDI_H__
 
 
 #define WIN32_LEAN_AND_MEAN
@@ -7,9 +7,9 @@
 #undef WIN32_LEAN_AND_MEAN
 
 
-typedef struct _Evas_Engine_Info_Software_DDraw Evas_Engine_Info_Software_DDraw;
+typedef struct _Evas_Engine_Info_Software_Gdi Evas_Engine_Info_Software_Gdi;
 
-struct _Evas_Engine_Info_Software_DDraw
+struct _Evas_Engine_Info_Software_Gdi
 {
    /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
    /* at you and make nasty noises */
@@ -17,11 +17,13 @@ struct _Evas_Engine_Info_Software_DDraw
 
    struct {
       HWND         window;
+      HBITMAP      mask;
       int          depth;
       int          rotation;
+      unsigned int layered    : 1;
       unsigned int fullscreen : 1;
    } info;
 };
 
 
-#endif /* __EVAS_ENGINE_SOFTWARE_DDRAW_H__ */
+#endif /* __EVAS_ENGINE_SOFTWARE_GDI_H__ */
diff --git a/src/modules/engines/software_sdl/Makefile.am b/src/modules/engines/software_gdi/Makefile.am
similarity index 59%
copy from src/modules/engines/software_sdl/Makefile.am
copy to src/modules/engines/software_gdi/Makefile.am
index 1962683..daf5f85 100644
--- a/src/modules/engines/software_sdl/Makefile.am
+++ b/src/modules/engines/software_gdi/Makefile.am
@@ -6,25 +6,26 @@ AM_CPPFLAGS = \
 -I$(top_srcdir)/src/lib \
 -I$(top_srcdir)/src/lib/include \
 -I$(top_srcdir)/src/modules/engines \
- at FREETYPE_CFLAGS@ \
 @EINA_CFLAGS@ \
- at evas_engine_software_sdl_cflags@
-
-AM_CFLAGS = @WIN32_CFLAGS@
+ at FREETYPE_CFLAGS@ \
+ at evas_engine_software_gdi_cflags@
 
-if BUILD_ENGINE_SOFTWARE_SDL
+if BUILD_ENGINE_SOFTWARE_GDI
 
-pkgdir = $(libdir)/evas/modules/engines/software_sdl/$(MODULE_ARCH)
+pkgdir = $(libdir)/evas/modules/engines/software_gdi/$(MODULE_ARCH)
 
 pkg_LTLIBRARIES = module.la
+module_la_SOURCES = \
+evas_engine.c \
+evas_outbuf.c \
+evas_gdi_buffer.c \
+evas_gdi_main.c
 
-module_la_SOURCES  = evas_engine.c
-
-module_la_LIBADD = $(top_builddir)/src/lib/libevas.la @EINA_LIBS@ @evas_engine_software_sdl_libs@
+module_la_LIBADD = $(top_builddir)/src/lib/libevas.la @EINA_LIBS@ @evas_engine_software_gdi_libs@
 module_la_LDFLAGS = -no-undefined -module -avoid-version
 module_la_LIBTOOLFLAGS = --tag=disable-static
 
-include_HEADERS = Evas_Engine_SDL.h
+include_HEADERS = Evas_Engine_Software_Gdi.h
 
 endif
 
diff --git a/src/modules/engines/fb/Makefile.in b/src/modules/engines/software_gdi/Makefile.in
similarity index 87%
copy from src/modules/engines/fb/Makefile.in
copy to src/modules/engines/software_gdi/Makefile.in
index ccac99e..dfcdc47 100644
--- a/src/modules/engines/fb/Makefile.in
+++ b/src/modules/engines/software_gdi/Makefile.in
@@ -33,7 +33,7 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-subdir = src/modules/engines/fb
+subdir = src/modules/engines/software_gdi
 DIST_COMMON = $(am__include_HEADERS_DIST) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -59,18 +59,19 @@ am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
 am__installdirs = "$(DESTDIR)$(pkgdir)" "$(DESTDIR)$(includedir)"
 pkgLTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(pkg_LTLIBRARIES)
- at BUILD_ENGINE_FB_TRUE@module_la_DEPENDENCIES =  \
- at BUILD_ENGINE_FB_TRUE@	$(top_builddir)/src/lib/libevas.la
-am__module_la_SOURCES_DIST = evas_engine.c evas_fb_main.c \
-	evas_outbuf.c
- at BUILD_ENGINE_FB_TRUE@am_module_la_OBJECTS = module_la-evas_engine.lo \
- at BUILD_ENGINE_FB_TRUE@	module_la-evas_fb_main.lo \
- at BUILD_ENGINE_FB_TRUE@	module_la-evas_outbuf.lo
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@module_la_DEPENDENCIES = $(top_builddir)/src/lib/libevas.la
+am__module_la_SOURCES_DIST = evas_engine.c evas_outbuf.c \
+	evas_gdi_buffer.c evas_gdi_main.c
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@am_module_la_OBJECTS =  \
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@	module_la-evas_engine.lo \
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@	module_la-evas_outbuf.lo \
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@	module_la-evas_gdi_buffer.lo \
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@	module_la-evas_gdi_main.lo
 module_la_OBJECTS = $(am_module_la_OBJECTS)
 module_la_LINK = $(LIBTOOL) --tag=CC $(module_la_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
 	$(module_la_LDFLAGS) $(LDFLAGS) -o $@
- at BUILD_ENGINE_FB_TRUE@am_module_la_rpath = -rpath $(pkgdir)
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@am_module_la_rpath = -rpath $(pkgdir)
 DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
@@ -85,7 +86,7 @@ LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
 	$(LDFLAGS) -o $@
 SOURCES = $(module_la_SOURCES)
 DIST_SOURCES = $(am__module_la_SOURCES_DIST)
-am__include_HEADERS_DIST = Evas_Engine_FB.h
+am__include_HEADERS_DIST = Evas_Engine_Software_Gdi.h
 includeHEADERS_INSTALL = $(INSTALL_HEADER)
 HEADERS = $(include_HEADERS)
 ETAGS = etags
@@ -244,6 +245,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
@@ -312,25 +315,23 @@ AM_CPPFLAGS = \
 -I$(top_srcdir)/src/lib \
 -I$(top_srcdir)/src/lib/include \
 -I$(top_srcdir)/src/modules/engines \
- at FREETYPE_CFLAGS@ \
 @EINA_CFLAGS@ \
- at evas_engine_fb_cflags@
-
- at BUILD_ENGINE_FB_TRUE@pkgdir = $(libdir)/evas/modules/engines/fb/$(MODULE_ARCH)
- at BUILD_ENGINE_FB_TRUE@pkg_LTLIBRARIES = module.la
- at BUILD_ENGINE_FB_TRUE@module_la_SOURCES = \
- at BUILD_ENGINE_FB_TRUE@evas_engine.c \
- at BUILD_ENGINE_FB_TRUE@evas_fb_main.c \
- at BUILD_ENGINE_FB_TRUE@evas_outbuf.c
-
- at BUILD_ENGINE_FB_TRUE@module_la_LIBADD = @EINA_LIBS@ @evas_engine_fb_libs@ $(top_builddir)/src/lib/libevas.la
- at BUILD_ENGINE_FB_TRUE@module_la_LDFLAGS = -module -avoid-version
- at BUILD_ENGINE_FB_TRUE@module_la_LIBTOOLFLAGS = --tag=disable-static
- at BUILD_ENGINE_FB_TRUE@include_HEADERS = Evas_Engine_FB.h
-EXTRA_DIST = \
-evas_engine.h \
-evas_fb.h
-
+ at FREETYPE_CFLAGS@ \
+ at evas_engine_software_gdi_cflags@
+
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@pkgdir = $(libdir)/evas/modules/engines/software_gdi/$(MODULE_ARCH)
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@pkg_LTLIBRARIES = module.la
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@module_la_SOURCES = \
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@evas_engine.c \
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@evas_outbuf.c \
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@evas_gdi_buffer.c \
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@evas_gdi_main.c
+
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@module_la_LIBADD = $(top_builddir)/src/lib/libevas.la @EINA_LIBS@ @evas_engine_software_gdi_libs@
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@module_la_LDFLAGS = -no-undefined -module -avoid-version
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@module_la_LIBTOOLFLAGS = --tag=disable-static
+ at BUILD_ENGINE_SOFTWARE_GDI_TRUE@include_HEADERS = Evas_Engine_Software_Gdi.h
+EXTRA_DIST = evas_engine.h
 all: all-am
 
 .SUFFIXES:
@@ -344,9 +345,9 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/modules/engines/fb/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/modules/engines/software_gdi/Makefile'; \
 	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  src/modules/engines/fb/Makefile
+	  $(AUTOMAKE) --gnu  src/modules/engines/software_gdi/Makefile
 .PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
@@ -401,7 +402,8 @@ distclean-compile:
 	-rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/module_la-evas_engine.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/module_la-evas_fb_main.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/module_la-evas_gdi_buffer.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/module_la-evas_gdi_main.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/module_la-evas_outbuf.Plo at am__quote@
 
 .c.o:
@@ -432,13 +434,6 @@ module_la-evas_engine.lo: evas_engine.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(LIBTOOL) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_engine.lo `test -f 'evas_engine.c' || echo '$(srcdir)/'`evas_engine.c
 
-module_la-evas_fb_main.lo: evas_fb_main.c
- at am__fastdepCC_TRUE@	$(LIBTOOL) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT module_la-evas_fb_main.lo -MD -MP -MF $(DEPDIR)/module_la-evas_fb_main.Tpo -c -o module_la-evas_fb_main.lo `test -f 'evas_fb_main.c' || echo '$(srcdir)/'`evas_fb_main.c
- at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/module_la-evas_fb_main.Tpo $(DEPDIR)/module_la-evas_fb_main.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='evas_fb_main.c' object='module_la-evas_fb_main.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(LIBTOOL) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_fb_main.lo `test -f 'evas_fb_main.c' || echo '$(srcdir)/'`evas_fb_main.c
-
 module_la-evas_outbuf.lo: evas_outbuf.c
 @am__fastdepCC_TRUE@	$(LIBTOOL) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT module_la-evas_outbuf.lo -MD -MP -MF $(DEPDIR)/module_la-evas_outbuf.Tpo -c -o module_la-evas_outbuf.lo `test -f 'evas_outbuf.c' || echo '$(srcdir)/'`evas_outbuf.c
 @am__fastdepCC_TRUE@	mv -f $(DEPDIR)/module_la-evas_outbuf.Tpo $(DEPDIR)/module_la-evas_outbuf.Plo
@@ -446,6 +441,20 @@ module_la-evas_outbuf.lo: evas_outbuf.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(LIBTOOL) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_outbuf.lo `test -f 'evas_outbuf.c' || echo '$(srcdir)/'`evas_outbuf.c
 
+module_la-evas_gdi_buffer.lo: evas_gdi_buffer.c
+ at am__fastdepCC_TRUE@	$(LIBTOOL) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT module_la-evas_gdi_buffer.lo -MD -MP -MF $(DEPDIR)/module_la-evas_gdi_buffer.Tpo -c -o module_la-evas_gdi_buffer.lo `test -f 'evas_gdi_buffer.c' || echo '$(srcdir)/'`evas_gdi_buffer.c
+ at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/module_la-evas_gdi_buffer.Tpo $(DEPDIR)/module_la-evas_gdi_buffer.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='evas_gdi_buffer.c' object='module_la-evas_gdi_buffer.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(LIBTOOL) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_gdi_buffer.lo `test -f 'evas_gdi_buffer.c' || echo '$(srcdir)/'`evas_gdi_buffer.c
+
+module_la-evas_gdi_main.lo: evas_gdi_main.c
+ at am__fastdepCC_TRUE@	$(LIBTOOL) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT module_la-evas_gdi_main.lo -MD -MP -MF $(DEPDIR)/module_la-evas_gdi_main.Tpo -c -o module_la-evas_gdi_main.lo `test -f 'evas_gdi_main.c' || echo '$(srcdir)/'`evas_gdi_main.c
+ at am__fastdepCC_TRUE@	mv -f $(DEPDIR)/module_la-evas_gdi_main.Tpo $(DEPDIR)/module_la-evas_gdi_main.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='evas_gdi_main.c' object='module_la-evas_gdi_main.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(LIBTOOL) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_gdi_main.lo `test -f 'evas_gdi_main.c' || echo '$(srcdir)/'`evas_gdi_main.c
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
diff --git a/src/modules/engines/software_ddraw/evas_engine.c b/src/modules/engines/software_gdi/evas_engine.c
similarity index 67%
copy from src/modules/engines/software_ddraw/evas_engine.c
copy to src/modules/engines/software_gdi/evas_engine.c
index 61abfb1..5b73cad 100644
--- a/src/modules/engines/software_ddraw/evas_engine.c
+++ b/src/modules/engines/software_gdi/evas_engine.c
@@ -1,7 +1,7 @@
 #include "evas_common.h"
 #include "evas_private.h"
 #include "evas_engine.h"
-#include "Evas_Engine_Software_DDraw.h"
+#include "Evas_Engine_Software_Gdi.h"
 
 /* function tables - filled in later (func and parent func) */
 static Evas_Func func, pfunc;
@@ -20,12 +20,14 @@ struct _Render_Engine
 
 
 static void *
-_output_setup(int  width,
-              int  height,
-              int  rot,
-              HWND window,
-              int  depth,
-              int  fullscreen)
+_output_setup(int          width,
+              int          height,
+              int          rot,
+              HWND         window,
+              HBITMAP      mask,
+              int          depth,
+              unsigned int layered,
+              unsigned int fullscreen)
 {
    Render_Engine *re;
 
@@ -48,11 +50,17 @@ _output_setup(int  width,
    evas_common_draw_init();
    evas_common_tilebuf_init();
 
-   evas_software_ddraw_outbuf_init();
+   evas_software_gdi_outbuf_init();
 
-   re->ob = evas_software_ddraw_outbuf_setup(width, height, rot,
-                                             OUTBUF_DEPTH_INHERIT,
-                                             window, depth, fullscreen);
+   if (width <= 0)
+     width = 1;
+   if (height <= 0)
+     height = 1;
+
+   re->ob = evas_software_gdi_outbuf_setup(width, height, rot,
+                                           OUTBUF_DEPTH_INHERIT,
+                                           window, mask, depth, layered, fullscreen,
+                                           0, 0);
    if (!re->ob)
      {
 	free(re);
@@ -71,7 +79,7 @@ _output_setup(int  width,
    re->tb = evas_common_tilebuf_new(width, height);
    if (!re->tb)
      {
-	evas_software_ddraw_outbuf_free(re->ob);
+	evas_software_gdi_outbuf_free(re->ob);
 	free(re);
 	return NULL;
      }
@@ -85,39 +93,40 @@ _output_setup(int  width,
 /* engine api this module provides */
 
 static void *
-eng_info(Evas *e)
+eng_info(Evas *e __UNUSED__)
 {
-   Evas_Engine_Info_Software_DDraw *info;
+   Evas_Engine_Info_Software_Gdi *info;
 
-   info = calloc(1, sizeof(Evas_Engine_Info_Software_DDraw));
+   info = calloc(1, sizeof(Evas_Engine_Info_Software_Gdi));
    if (!info) return NULL;
    info->magic.magic = rand();
    return info;
-   e = NULL;
 }
 
 static void
-eng_info_free(Evas *e, void *info)
+eng_info_free(Evas *e __UNUSED__, void *info)
 {
-   Evas_Engine_Info_Software_DDraw *in;
+   Evas_Engine_Info_Software_Gdi *in;
 
-   in = (Evas_Engine_Info_Software_DDraw *)info;
+   in = (Evas_Engine_Info_Software_Gdi *)info;
    free(in);
 }
 
 static int
 eng_setup(Evas *e, void *in)
 {
-   Render_Engine                   *re;
-   Evas_Engine_Info_Software_DDraw *info;
+   Render_Engine                 *re;
+   Evas_Engine_Info_Software_Gdi *info;
 
-   info = (Evas_Engine_Info_Software_DDraw *)in;
+   info = (Evas_Engine_Info_Software_Gdi *)in;
    if (!e->engine.data.output)
      e->engine.data.output = _output_setup(e->output.w,
                                            e->output.h,
                                            info->info.rotation,
                                            info->info.window,
+                                           info->info.mask,
                                            info->info.depth,
+                                           info->info.layered,
                                            info->info.fullscreen);
    else
      {
@@ -125,23 +134,24 @@ eng_setup(Evas *e, void *in)
 
 	re = e->engine.data.output;
 	ponebuf = re->ob->onebuf;
-	evas_software_ddraw_outbuf_free(re->ob);
-	re->ob = evas_software_ddraw_outbuf_setup(e->output.w,
-                                                  e->output.h,
-                                                  info->info.rotation,
-                                                  OUTBUF_DEPTH_INHERIT,
-                                                  info->info.window,
-                                                  info->info.depth,
-                                                  info->info.fullscreen);
+	evas_software_gdi_outbuf_free(re->ob);
+	re->ob = evas_software_gdi_outbuf_setup(e->output.w,
+                                                e->output.h,
+                                                info->info.rotation,
+                                                OUTBUF_DEPTH_INHERIT,
+                                                info->info.window,
+                                                info->info.mask,
+                                                info->info.depth,
+                                                info->info.layered,
+                                                info->info.fullscreen,
+                                                0, 0);
 	re->ob->onebuf = ponebuf;
      }
-   if (!e->engine.data.output) return 0;
+   if (!e->engine.data.output) return;
    if (!e->engine.data.context)
      e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
 
    re = e->engine.data.output;
-
-   return 1;
 }
 
 static void
@@ -152,7 +162,7 @@ eng_output_free(void *data)
    if (!data) return;
 
    re = (Render_Engine *)data;
-   evas_software_ddraw_outbuf_free(re->ob);
+   evas_software_gdi_outbuf_free(re->ob);
    evas_common_tilebuf_free(re->tb);
    if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
    free(re);
@@ -167,11 +177,11 @@ eng_output_resize(void *data, int width, int height)
    Render_Engine *re;
 
    re = (Render_Engine *)data;
-   evas_software_ddraw_outbuf_reconfigure(re->ob,
-					  width,
-					  height,
-                                          evas_software_ddraw_outbuf_rot_get(re->ob),
-                                          OUTBUF_DEPTH_INHERIT);
+   evas_software_gdi_outbuf_reconfigure(re->ob,
+                                        width,
+                                        height,
+                                        evas_software_gdi_outbuf_rot_get(re->ob),
+                                        OUTBUF_DEPTH_INHERIT);
    evas_common_tilebuf_free(re->tb);
    re->tb = evas_common_tilebuf_new(width, height);
    if (re->tb)
@@ -258,15 +268,15 @@ eng_output_redraws_next_update_get(void *data,
 	re->end = 1;
      }
 
-   surface = evas_software_ddraw_outbuf_new_region_for_update(re->ob,
-                                                              ux,
-                                                              uy,
-                                                              uw,
-                                                              uh,
-                                                              cx,
-                                                              cy,
-                                                              cw,
-                                                              ch);
+   surface = evas_software_gdi_outbuf_new_region_for_update(re->ob,
+                                                            ux,
+                                                            uy,
+                                                            uw,
+                                                            uh,
+                                                            cx,
+                                                            cy,
+                                                            cw,
+                                                            ch);
 
    *x = ux;
    *y = uy;
@@ -285,9 +295,9 @@ eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int
 #ifdef BUILD_PIPE_RENDER
    evas_common_pipe_begin(surface);
    evas_common_pipe_flush(surface);
-#endif   
-   evas_software_ddraw_outbuf_push_updated_region(re->ob, surface, x, y, w, h);
-   evas_software_ddraw_outbuf_free_region_for_update(re->ob, surface);
+#endif
+   evas_software_gdi_outbuf_push_updated_region(re->ob, surface, x, y, w, h);
+   evas_software_gdi_outbuf_free_region_for_update(re->ob, surface);
    evas_common_cpu_end_opt();
 }
 
@@ -297,7 +307,7 @@ eng_output_flush(void *data)
    Render_Engine *re;
 
    re = (Render_Engine *)data;
-   evas_software_ddraw_outbuf_flush(re->ob);
+   evas_software_gdi_outbuf_flush(re->ob);
 }
 
 static void
@@ -306,7 +316,7 @@ eng_output_idle_flush(void *data)
    Render_Engine *re;
 
    re = (Render_Engine *)data;
-   evas_software_ddraw_outbuf_idle_flush(re->ob);
+   evas_software_gdi_outbuf_idle_flush(re->ob);
 }
 
 
@@ -348,6 +358,6 @@ EAPI Evas_Module_Api evas_modapi =
 {
    EVAS_MODULE_API_VERSION,
    EVAS_MODULE_TYPE_ENGINE,
-   "software_ddraw",
+   "software_gdi",
    "none"
 };
diff --git a/src/modules/engines/software_gdi/evas_engine.h b/src/modules/engines/software_gdi/evas_engine.h
new file mode 100644
index 0000000..551c52b
--- /dev/null
+++ b/src/modules/engines/software_gdi/evas_engine.h
@@ -0,0 +1,180 @@
+#ifndef EVAS_ENGINE_H
+#define EVAS_ENGINE_H
+
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+
+
+typedef enum _Outbuf_Depth Outbuf_Depth;
+
+enum _Outbuf_Depth
+{
+   OUTBUF_DEPTH_NONE,
+   OUTBUF_DEPTH_INHERIT,
+   OUTBUF_DEPTH_RGB_16BPP_565_565_DITHERED,
+   OUTBUF_DEPTH_RGB_32BPP_888_8888,
+   OUTBUF_DEPTH_LAST
+};
+
+typedef struct BITMAPINFO_GDI     BITMAPINFO_GDI;
+typedef struct _Outbuf            Outbuf;
+typedef struct _Outbuf_Region     Outbuf_Region;
+typedef struct _Gdi_Output_Buffer Gdi_Output_Buffer;
+
+struct BITMAPINFO_GDI
+{
+   BITMAPINFOHEADER bih;
+   DWORD            masks[3];
+};
+
+struct _Outbuf
+{
+   Outbuf_Depth          depth;
+   int                   width;
+   int                   height;
+   int                   rot;
+   int                   onebuf;
+
+   struct {
+      Convert_Pal       *pal;
+      struct {
+         BITMAPINFO_GDI *bitmap_info;
+         HWND            window;
+         HBITMAP         mask;
+         HDC             dc;
+         int             depth;
+         unsigned char   layered    : 1;
+         unsigned char   fullscreen : 1;
+      } gdi;
+
+      /* 1 big buffer for updates - flush on idle_flush */
+      RGBA_Image        *onebuf;
+      Eina_List         *onebuf_regions;
+
+      /* a list of pending regions to write to the target */
+      Eina_List         *pending_writes;
+      /* a list of previous frame pending regions to write to the target */
+      Eina_List         *prev_pending_writes;
+
+      unsigned char      mask_dither       : 1;
+      unsigned char      destination_alpha : 1;
+      unsigned char      debug             : 1;
+      unsigned char      synced            : 1;
+   } priv;
+};
+
+struct _Outbuf_Region
+{
+   Gdi_Output_Buffer *gdiob;
+   int                x;
+   int                y;
+   int                width;
+   int                height;
+};
+
+struct _Gdi_Output_Buffer
+{
+   BITMAPINFO_GDI *bitmap_info;
+   HBITMAP         bitmap;
+   HDC             dc;
+   int             width;
+   int             height;
+   void           *data;
+   int             depth;
+   int             pitch;
+   int             psize;
+};
+
+/* evas_gdi_main.c */
+
+int evas_software_gdi_init (HWND         window,
+                            HBITMAP      mask,
+                            int          depth,
+                            unsigned int layered,
+                            unsigned int fullscreen,
+                            Outbuf      *buf);
+
+void evas_software_gdi_shutdown(Outbuf *buf);
+
+void evas_software_gdi_bitmap_resize(Outbuf *buf);
+
+/* evas_gdi_buffer.c */
+
+Gdi_Output_Buffer *evas_software_gdi_output_buffer_new(HDC             dc,
+                                                       BITMAPINFO_GDI *bitmap_info,
+                                                       int             depth,
+                                                       int             width,
+                                                       int             height,
+                                                       void           *data);
+
+void evas_software_gdi_output_buffer_free(Gdi_Output_Buffer *gdiob);
+
+void evas_software_gdi_output_buffer_paste(Gdi_Output_Buffer *gdiob,
+                                           int                x,
+                                           int                y);
+
+DATA8 *evas_software_gdi_output_buffer_data(Gdi_Output_Buffer *gdiob,
+                                            int               *pitch);
+
+int evas_software_gdi_output_buffer_depth(Gdi_Output_Buffer *gdiob);
+
+/* evas_outbuf.c */
+
+void evas_software_gdi_outbuf_init(void);
+
+void evas_software_gdi_outbuf_free(Outbuf *buf);
+
+Outbuf *evas_software_gdi_outbuf_setup(int          width,
+                                       int          height,
+                                       int          rotation,
+                                       Outbuf_Depth depth,
+                                       HWND         window,
+                                       HBITMAP      mask,
+                                       int          w_depth,
+                                       unsigned int layered,
+                                       unsigned int fullscreen,
+                                       int          mask_dither,
+                                       int          destination_alpha);
+
+void evas_software_gdi_outbuf_reconfigure(Outbuf      *buf,
+                                          int          width,
+                                          int          height,
+                                          int          rotation,
+                                          Outbuf_Depth depth);
+
+RGBA_Image *evas_software_gdi_outbuf_new_region_for_update(Outbuf *buf,
+                                                           int     x,
+                                                           int     y,
+                                                           int     w,
+                                                           int     h,
+                                                           int    *cx,
+                                                           int    *cy,
+                                                           int    *cw,
+                                                           int    *ch);
+
+void evas_software_gdi_outbuf_push_updated_region(Outbuf     *buf,
+                                                  RGBA_Image *update,
+                                                  int         x,
+                                                  int         y,
+                                                  int         w,
+                                                  int         h);
+
+void evas_software_gdi_outbuf_free_region_for_update(Outbuf     *buf,
+                                                     RGBA_Image *update);
+
+void evas_software_gdi_outbuf_flush(Outbuf *buf);
+
+void evas_software_gdi_outbuf_idle_flush(Outbuf *buf);
+
+int evas_software_gdi_outbuf_width_get(Outbuf *buf);
+
+int evas_software_gdi_outbuf_height_get(Outbuf *buf);
+
+Outbuf_Depth evas_software_gdi_outbuf_depth_get(Outbuf *buf);
+
+int evas_software_gdi_outbuf_rot_get(Outbuf *buf);
+
+
+#endif /* EVAS_ENGINE_H */
diff --git a/src/modules/engines/software_gdi/evas_gdi_buffer.c b/src/modules/engines/software_gdi/evas_gdi_buffer.c
new file mode 100644
index 0000000..66a5abf
--- /dev/null
+++ b/src/modules/engines/software_gdi/evas_gdi_buffer.c
@@ -0,0 +1,88 @@
+#include <string.h>
+
+#include "evas_common.h"
+#include "evas_engine.h"
+
+Gdi_Output_Buffer *
+evas_software_gdi_output_buffer_new(HDC             dc,
+                                    BITMAPINFO_GDI *bitmap_info,
+                                    int             depth,
+                                    int             width,
+                                    int             height,
+                                    void           *data)
+{
+   Gdi_Output_Buffer *gdiob;
+
+   gdiob = calloc(1, sizeof(Gdi_Output_Buffer));
+   if (!gdiob) return NULL;
+
+   if (!data)
+     {
+        bitmap_info->bih.biWidth = width;
+        bitmap_info->bih.biHeight = -height;
+        bitmap_info->bih.biSizeImage = (depth >> 3) * width * height;
+        gdiob->bitmap = CreateDIBSection(dc,
+                                         (const BITMAPINFO *)bitmap_info,
+                                         DIB_RGB_COLORS,
+                                         (void **)(&data),
+                                         NULL,
+                                         0);
+        if (!gdiob->bitmap)
+          {
+             free(gdiob);
+             return NULL;
+          }
+     }
+
+   gdiob->bitmap_info = bitmap_info;
+   gdiob->dc = dc;
+   gdiob->data = data;
+   gdiob->width = width;
+   gdiob->height = height;
+   gdiob->depth = depth;
+   gdiob->pitch = width * (depth >> 3);
+/*    gdiob->psize = gdiob->pitch * height; */
+
+   return gdiob;
+}
+
+void
+evas_software_gdi_output_buffer_free(Gdi_Output_Buffer *gdiob)
+{
+   DeleteObject(gdiob->bitmap);
+   free(gdiob);
+}
+
+void
+evas_software_gdi_output_buffer_paste(Gdi_Output_Buffer *gdiob,
+                                      int                x,
+                                      int                y)
+{
+   HDC     dc;
+
+   dc = CreateCompatibleDC(gdiob->dc);
+   if (!dc)
+     return;
+   SelectObject(dc, gdiob->bitmap);
+   BitBlt(gdiob->dc,
+          x, y,
+          gdiob->width, gdiob->height,
+          dc,
+          0, 0,
+          SRCCOPY);
+   DeleteDC(dc);
+}
+
+DATA8 *
+evas_software_gdi_output_buffer_data(Gdi_Output_Buffer *gdiob,
+                                     int               *pitch)
+{
+   if (pitch) *pitch = gdiob->pitch;
+   return gdiob->data;
+}
+
+int
+evas_software_gdi_output_buffer_depth(Gdi_Output_Buffer *gdiob)
+{
+   return gdiob->depth;
+}
diff --git a/src/modules/engines/software_gdi/evas_gdi_main.c b/src/modules/engines/software_gdi/evas_gdi_main.c
new file mode 100644
index 0000000..0a793a7
--- /dev/null
+++ b/src/modules/engines/software_gdi/evas_gdi_main.c
@@ -0,0 +1,116 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+
+
+int
+evas_software_gdi_init (HWND         window,
+                        HBITMAP      mask,
+                        int          depth,
+                        unsigned int layered,
+                        unsigned int fullscreen __UNUSED__,
+                        Outbuf *buf)
+{
+   RECT window_rect;
+   SIZE mask_size;
+
+   if (!window)
+     {
+        fprintf (stderr, "[Evas] [Engine] [GDI] Window is NULL\n");
+        return 0;
+     }
+
+   buf->priv.gdi.window = window;
+   buf->priv.gdi.mask = mask;
+   buf->priv.gdi.dc = GetDC(window);
+   if (!buf->priv.gdi.dc)
+     {
+        fprintf (stderr, "[Evas] [Engine] [GDI] Can not get DC\n");
+        return 0;
+     }
+
+   /* FIXME: check depth */
+   if (depth != GetDeviceCaps(buf->priv.gdi.dc, BITSPIXEL))
+     {
+        fprintf (stderr, "[Evas] [Engine] [GDI] no compatible depth\n");
+        ReleaseDC(window, buf->priv.gdi.dc);
+        return 0;
+     }
+   buf->priv.gdi.depth = depth;
+
+   /* mask */
+   if (layered && mask)
+     {
+        if (GetBitmapDimensionEx(mask, &mask_size) &&
+            GetClientRect(window, &window_rect))
+          {
+             if ((mask_size.cx == window_rect.right) &&
+                 (mask_size.cy == window_rect.bottom))
+               {
+/*                  if (SetLayeredWindowAttributes(window, RGB(0, 0, 0), 255, LWA_COLORKEY)) */
+/*                    { */
+/*                    } */
+               }
+          }
+     }
+
+   /* FIXME: support fullscreen */
+
+   buf->priv.gdi.bitmap_info = (BITMAPINFO_GDI *)malloc(sizeof(BITMAPINFO_GDI));
+   if (!buf->priv.gdi.bitmap_info)
+     {
+        fprintf (stderr, "[Evas] [Engine] [GDI] Can not allocate bitmap info\n");
+        ReleaseDC(window, buf->priv.gdi.dc);
+        return 0;
+     }
+
+   buf->priv.gdi.bitmap_info->bih.biSize = sizeof(BITMAPINFOHEADER);
+   buf->priv.gdi.bitmap_info->bih.biWidth = buf->width;
+   buf->priv.gdi.bitmap_info->bih.biHeight = -buf->height;
+   buf->priv.gdi.bitmap_info->bih.biPlanes = 1;
+   buf->priv.gdi.bitmap_info->bih.biSizeImage = (buf->priv.gdi.depth >> 3) * buf->width * buf->height;
+   buf->priv.gdi.bitmap_info->bih.biXPelsPerMeter = 0;
+   buf->priv.gdi.bitmap_info->bih.biYPelsPerMeter = 0;
+   buf->priv.gdi.bitmap_info->bih.biClrUsed = 0;
+   buf->priv.gdi.bitmap_info->bih.biClrImportant = 0;
+   buf->priv.gdi.bitmap_info->bih.biBitCount = buf->priv.gdi.depth;
+   buf->priv.gdi.bitmap_info->bih.biCompression = BI_BITFIELDS;
+
+   switch (depth)
+     {
+      case 16:
+         buf->priv.gdi.bitmap_info->masks[0] = 0x0000f800;
+         buf->priv.gdi.bitmap_info->masks[1] = 0x000007e0;
+         buf->priv.gdi.bitmap_info->masks[2] = 0x0000001f;
+         break;
+      case 32:
+         buf->priv.gdi.bitmap_info->masks[0] = 0x00ff0000;
+         buf->priv.gdi.bitmap_info->masks[1] = 0x0000ff00;
+         buf->priv.gdi.bitmap_info->masks[2] = 0x000000ff;
+         break;
+      default:
+        fprintf (stderr, "[Evas] [Engine] [GDI] wrong depth\n");
+        free(buf->priv.gdi.bitmap_info);
+        ReleaseDC(window, buf->priv.gdi.dc);
+        return 0;
+     }
+
+   return 1;
+}
+
+void
+evas_software_gdi_shutdown(Outbuf *buf)
+{
+   if (!buf)
+     return;
+
+   free(buf->priv.gdi.bitmap_info);
+   ReleaseDC(buf->priv.gdi.window, buf->priv.gdi.dc);
+}
+
+void
+evas_software_gdi_bitmap_resize(Outbuf *buf)
+{
+   buf->priv.gdi.bitmap_info->bih.biWidth = buf->width;
+   buf->priv.gdi.bitmap_info->bih.biHeight = -buf->height;
+   buf->priv.gdi.bitmap_info->bih.biSizeImage = (buf->priv.gdi.depth >> 3) * buf->width * buf->height;
+}
diff --git a/src/modules/engines/software_gdi/evas_outbuf.c b/src/modules/engines/software_gdi/evas_outbuf.c
new file mode 100644
index 0000000..9c9fe92
--- /dev/null
+++ b/src/modules/engines/software_gdi/evas_outbuf.c
@@ -0,0 +1,509 @@
+#include "evas_common.h"
+#include "evas_engine.h"
+
+
+static Eina_List *gdipool = NULL;
+static int gdisize = 0;
+static int gdimemlimit = 10 * 1024 * 1024;
+static int gdicountlimit = 32;
+
+static Gdi_Output_Buffer *
+_find_gdiob(HDC dc, BITMAPINFO_GDI *bitmap_info, int depth, int w, int h, void *data)
+{
+   Eina_List         *l;
+   Eina_List         *gdil;
+   Gdi_Output_Buffer *gdiob = NULL;
+   Gdi_Output_Buffer *gdiob2;
+   int                sz;
+   int                lbytes;
+   int                bpp;
+   int                fitness = 0x7fffffff;
+
+   bpp = depth >> 3;
+   if (bpp == 3) bpp = 4;
+   lbytes = (((w * bpp) + 3) / 4) * 4;
+   sz = lbytes * h;
+   EINA_LIST_FOREACH(gdipool, l, gdiob2)
+     {
+	int szdif;
+
+        if ((gdiob2->dc != dc) ||
+            (gdiob2->bitmap_info != bitmap_info) ||
+            (gdiob2->depth != depth))
+	  continue;
+	szdif = gdiob2->psize - sz;
+	if (szdif < 0) continue;
+	if (szdif == 0)
+	  {
+	     gdiob = gdiob2;
+	     gdil = l;
+	     goto have_gdiob;
+	  }
+	if (szdif < fitness)
+	  {
+	     fitness = szdif;
+	     gdiob = gdiob2;
+	     gdil = l;
+	  }
+     }
+   if ((fitness > (100 * 100)) || (!gdiob))
+     return evas_software_gdi_output_buffer_new(dc, bitmap_info, depth, w, h, data);
+
+   have_gdiob:
+   gdipool = eina_list_remove_list(gdipool, gdil);
+   gdiob->width = w;
+   gdiob->height = h;
+   gdiob->pitch = lbytes;
+   gdisize -= gdiob->psize * (gdiob->depth >> 3);
+
+   return gdiob;
+}
+
+static void
+_unfind_gdiob(Gdi_Output_Buffer *gdiob)
+{
+   gdipool = eina_list_prepend(gdipool, gdiob);
+   gdisize += gdiob->psize * (gdiob->depth >> 3);
+   while ((gdisize > (gdimemlimit)) ||
+          (eina_list_count(gdipool) > gdicountlimit))
+     {
+        Eina_List *xl;
+
+        xl = eina_list_last(gdipool);
+        if (!xl)
+          {
+             gdisize = 0;
+             break;
+          }
+        gdiob = xl->data;
+        gdipool = eina_list_remove_list(gdipool, xl);
+        evas_software_gdi_output_buffer_free(gdiob);
+     }
+}
+
+static void
+_clear_gdiob()
+{
+   while (gdipool)
+     {
+	Gdi_Output_Buffer *gdiob;
+
+	gdiob = gdipool->data;
+	gdipool = eina_list_remove_list(gdipool, gdipool);
+	evas_software_gdi_output_buffer_free(gdiob);
+     }
+   gdisize = 0;
+}
+
+void
+evas_software_gdi_outbuf_init(void)
+{
+}
+
+void
+evas_software_gdi_outbuf_free(Outbuf *buf)
+{
+   if (!buf)
+     return;
+
+   while (buf->priv.pending_writes)
+     {
+	RGBA_Image *im;
+	Outbuf_Region *obr;
+
+	im = buf->priv.pending_writes->data;
+	buf->priv.pending_writes = eina_list_remove_list(buf->priv.pending_writes, buf->priv.pending_writes);
+	obr = im->extended_info;
+	evas_cache_image_drop(&im->cache_entry);
+	if (obr->gdiob) _unfind_gdiob(obr->gdiob);
+/* 	if (obr->mxob) _unfind_xob(obr->mxob, 0); */
+	free(obr);
+     }
+   evas_software_gdi_outbuf_idle_flush(buf);
+   evas_software_gdi_outbuf_flush(buf);
+
+   evas_software_gdi_shutdown(buf);
+   free(buf);
+}
+
+Outbuf *
+evas_software_gdi_outbuf_setup(int          width,
+                               int          height,
+                               int          rotation,
+                               Outbuf_Depth depth,
+                               HWND         window,
+                               HBITMAP      mask,
+                               int          w_depth,
+                               unsigned int layered,
+                               unsigned int fullscreen,
+                               int          mask_dither,
+                               int          destination_alpha)
+{
+   Outbuf *buf;
+
+   buf = (Outbuf *)calloc(1, sizeof(Outbuf));
+   if (!buf)
+      return NULL;
+
+   buf->width = width;
+   buf->height = height;
+   buf->depth = depth;
+   buf->rot = rotation;
+
+   buf->priv.mask_dither = mask_dither;
+   buf->priv.destination_alpha = destination_alpha;
+
+   if (!evas_software_gdi_init(window, mask, w_depth, layered, fullscreen, buf))
+     {
+        free(buf);
+        return NULL;
+     }
+
+   {
+      Gfx_Func_Convert  conv_func;
+      Gdi_Output_Buffer *gdiob;
+
+      gdiob = evas_software_gdi_output_buffer_new(buf->priv.gdi.dc, buf->priv.gdi.bitmap_info, w_depth, 1, 1, NULL);
+
+      conv_func = NULL;
+      if (gdiob)
+        {
+           if ((rotation == 0) || (rotation == 180))
+             conv_func = evas_common_convert_func_get(0,
+                                                      width,
+                                                      height,
+                                                      evas_software_gdi_output_buffer_depth (gdiob),
+                                                      buf->priv.gdi.bitmap_info->masks[0],
+                                                      buf->priv.gdi.bitmap_info->masks[1],
+                                                      buf->priv.gdi.bitmap_info->masks[2],
+                                                      PAL_MODE_NONE,
+                                                      rotation);
+           else if ((rotation == 90) || (rotation == 270))
+             conv_func = evas_common_convert_func_get(0,
+                                                      height,
+                                                      width,
+                                                      evas_software_gdi_output_buffer_depth (gdiob),
+                                                      buf->priv.gdi.bitmap_info->masks[0],
+                                                      buf->priv.gdi.bitmap_info->masks[1],
+                                                      buf->priv.gdi.bitmap_info->masks[2],
+                                                      PAL_MODE_NONE,
+                                                      rotation);
+
+           evas_software_gdi_output_buffer_free(gdiob);
+
+           if (!conv_func)
+             {
+                fprintf(stderr, ".[ Evas Error ].\n"
+                        " {\n"
+                        "  At depth         %i:\n"
+                        "  RGB format mask: %08lx, %08lx, %08lx\n"
+                        "  Not supported by and compiled in converters!\n"
+                        " }\n",
+                        buf->priv.gdi.depth,
+                        buf->priv.gdi.bitmap_info->masks[0],
+                        buf->priv.gdi.bitmap_info->masks[1],
+                        buf->priv.gdi.bitmap_info->masks[2]);
+             }
+        }
+      if (buf->priv.gdi.mask != mask)
+        buf->priv.gdi.mask = mask;
+   }
+
+   return buf;
+}
+
+void
+evas_software_gdi_outbuf_reconfigure(Outbuf      *buf,
+                                     int          width,
+                                     int          height,
+                                     int          rotation,
+                                     Outbuf_Depth depth)
+{
+   if ((width == buf->width) && (height == buf->height) &&
+       (rotation == buf->rot) && (depth == buf->depth))
+     return;
+   buf->width = width;
+   buf->height = height;
+   buf->rot = rotation;
+   evas_software_gdi_bitmap_resize(buf);
+}
+
+RGBA_Image *
+evas_software_gdi_outbuf_new_region_for_update(Outbuf *buf,
+                                               int     x,
+                                               int     y,
+                                               int     w,
+                                               int     h,
+                                               int    *cx,
+                                               int    *cy,
+                                               int    *cw,
+                                               int    *ch)
+{
+   RGBA_Image    *im;
+   Outbuf_Region *obr;
+   int            bpl = 0;
+   int            alpha = 0;
+
+   obr = calloc(1, sizeof(Outbuf_Region));
+   obr->x = x;
+   obr->y = y;
+   obr->width = w;
+   obr->height = h;
+   *cx = 0;
+   *cy = 0;
+   *cw = w;
+   *ch = h;
+
+   alpha = ((buf->priv.gdi.mask) || (buf->priv.destination_alpha));
+
+   if ((buf->rot == 0) &&
+       (buf->priv.gdi.bitmap_info->masks[0] == 0xff0000) &&
+       (buf->priv.gdi.bitmap_info->masks[1] == 0x00ff00) &&
+       (buf->priv.gdi.bitmap_info->masks[2] == 0x0000ff))
+     {
+        obr->gdiob = _find_gdiob(buf->priv.gdi.dc,
+                                 buf->priv.gdi.bitmap_info,
+                                 buf->priv.gdi.depth,
+                                 w, h, NULL);
+/*      obr->gdiob = evas_software_gdi_output_buffer_new(buf->priv.gdi.dc, */
+/*                                                         buf->priv.gdi.bitmap_info, */
+/*                                                         buf->priv.gdi.depth, */
+/*                                                         w, h, */
+/*                                                         NULL); */
+        im = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(),
+                                                 w, h,
+                                                 (DATA32 *)evas_software_gdi_output_buffer_data(obr->gdiob, &bpl),
+                                                 alpha, EVAS_COLORSPACE_ARGB8888);
+        im->extended_info = obr;
+/* 	if (buf->priv.gdi.mask) */
+/* 	  obr->mgdiob = _find_gdiob(buf->priv.gdi.dc, */
+/*                                     buf->priv.gdi.bitmap_info, */
+/*                                     1, */
+/*                                     w, h, NULL); */
+     }
+   else
+     {
+        im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get());
+        im->cache_entry.flags.alpha |= alpha ? 1 : 0;
+        evas_cache_image_surface_alloc(&im->cache_entry, w, h);
+        im->extended_info = obr;
+        if ((buf->rot == 0) || (buf->rot == 180))
+          obr->gdiob = _find_gdiob(buf->priv.gdi.dc,
+                                   buf->priv.gdi.bitmap_info,
+                                   buf->priv.gdi.depth,
+                                   w, h, NULL);
+/*
+          obr->gdiob = evas_software_x11_x_output_buffer_new(buf->priv.dd.disp,
+                                                           buf->priv.dd.vis,
+                                                           buf->priv.dd.depth,
+                                                           w, h,
+                                                           use_shm,
+                                                           NULL);
+ */
+        else if ((buf->rot == 90) || (buf->rot == 270))
+          obr->gdiob = _find_gdiob(buf->priv.gdi.dc,
+                                   buf->priv.gdi.bitmap_info,
+                                   buf->priv.gdi.depth,
+                                   h, w, NULL);
+/*
+          obr->gdiob = evas_software_x11_x_output_buffer_new(buf->priv.dd.disp,
+                                                           buf->priv.dd.vis,
+                                                           buf->priv.dd.depth,
+                                                           h, w,
+                                                           use_shm,
+                                                           NULL);
+ */
+/* 	if (buf->priv.gdi.mask) */
+/* 	  obr->mgdiob = _find_gdiob(buf->priv.gdi.dc, */
+/*                                     buf->priv.gdi.bitmap_info, */
+/*                                     1, */
+/*                                     w, h, NULL); */
+     }
+   if ((buf->priv.gdi.mask) || (buf->priv.destination_alpha))
+     /* FIXME: faster memset! */
+     memset(im->image.data, 0, w * h * sizeof(DATA32));
+
+   buf->priv.pending_writes = eina_list_append(buf->priv.pending_writes, im);
+   return im;
+}
+
+void
+evas_software_gdi_outbuf_push_updated_region(Outbuf     *buf,
+                                             RGBA_Image *update,
+                                             int         x,
+                                             int         y,
+                                             int         w,
+                                             int         h)
+{
+   Gfx_Func_Convert conv_func;
+   Outbuf_Region   *obr;
+   DATA32          *src_data;
+   void            *data;
+   int              bpl = 0;
+
+   conv_func = NULL;
+   obr = update->extended_info;
+
+   if ((buf->rot == 0) || (buf->rot == 180))
+     conv_func = evas_common_convert_func_get(0, w, h,
+                                              evas_software_gdi_output_buffer_depth(obr->gdiob),
+                                              buf->priv.gdi.bitmap_info->masks[0],
+                                              buf->priv.gdi.bitmap_info->masks[1],
+                                              buf->priv.gdi.bitmap_info->masks[2],
+                                              PAL_MODE_NONE,
+                                              buf->rot);
+   else if ((buf->rot == 90) || (buf->rot == 270))
+     conv_func = evas_common_convert_func_get(0, h, w,
+                                              evas_software_gdi_output_buffer_depth(obr->gdiob),
+                                              buf->priv.gdi.bitmap_info->masks[0],
+                                              buf->priv.gdi.bitmap_info->masks[1],
+                                              buf->priv.gdi.bitmap_info->masks[2],
+                                              PAL_MODE_NONE,
+                                              buf->rot);
+   if (!conv_func) return;
+
+   data = evas_software_gdi_output_buffer_data(obr->gdiob, &bpl);
+   src_data = update->image.data;
+   if (buf->rot == 0)
+     {
+	obr->x = x;
+	obr->y = y;
+     }
+   else if (buf->rot == 90)
+     {
+	obr->x = y;
+	obr->y = buf->width - x - w;
+     }
+   else if (buf->rot == 180)
+     {
+	obr->x = buf->width - x - w;
+	obr->y = buf->height - y - h;
+     }
+   else if (buf->rot == 270)
+     {
+	obr->x = buf->height - y - h;
+	obr->y = x;
+     }
+   if ((buf->rot == 0) || (buf->rot == 180))
+     {
+	obr->width = w;
+	obr->height = h;
+     }
+   else if ((buf->rot == 90) || (buf->rot == 270))
+     {
+	obr->width = h;
+	obr->height = w;
+     }
+
+   if (data != src_data)
+     conv_func(src_data, data,
+               0,
+               bpl / (evas_software_gdi_output_buffer_depth(obr->gdiob) >> 3) - obr->width,
+               obr->width,
+               obr->height,
+               x,
+               y,
+               NULL);
+/*    if (obr->mxob) */
+/*      { */
+/*    int              yy; */
+/* 	for (yy = 0; yy < obr->h; yy++) */
+/* 	  evas_software_xlib_x_write_mask_line(buf, obr->mxob, */
+/* 					      src_data + */
+/* 					      (yy * obr->w), obr->w, yy); */
+}
+
+void
+evas_software_gdi_outbuf_free_region_for_update(Outbuf     *buf __UNUSED__,
+                                                RGBA_Image *update __UNUSED__)
+{
+   /* no need to do anything - they are cleaned up on flush */
+}
+
+void
+evas_software_gdi_outbuf_flush(Outbuf *buf)
+{
+   Eina_List     *l;
+   RGBA_Image    *im;
+   Outbuf_Region *obr;
+
+   /* copy safely the images that need to be drawn onto the back surface */
+   EINA_LIST_FOREACH(buf->priv.pending_writes, l, im)
+     {
+	Gdi_Output_Buffer *gdiob;
+
+        obr = im->extended_info;
+        gdiob = obr->gdiob;
+        evas_software_gdi_output_buffer_paste(gdiob,
+                                              obr->x,
+                                              obr->y);
+/*         if (obr->mgdiob) */
+/*           evas_software_gdi_output_buffer_paste(obr->mgdiob, */
+/*                                                 buf->priv.x11.xlib.mask, */
+/*                                                 buf->priv.x11.xlib.gcm, */
+/*                                                 obr->x, obr->y, 0); */
+     }
+
+   while (buf->priv.prev_pending_writes)
+     {
+        im = buf->priv.prev_pending_writes->data;
+        buf->priv.prev_pending_writes =
+          eina_list_remove_list(buf->priv.prev_pending_writes,
+                                buf->priv.prev_pending_writes);
+        obr = im->extended_info;
+        evas_cache_image_drop(&im->cache_entry);
+        if (obr->gdiob) _unfind_gdiob(obr->gdiob);
+/*         if (obr->mgdiob) _unfind_gdiob(obr->mgdiob); */
+/*         if (obr->gdiob) evas_software_x11_x_output_buffer_free(obr->gdiob); */
+        free(obr);
+     }
+   buf->priv.prev_pending_writes = buf->priv.pending_writes;
+   buf->priv.pending_writes = NULL;
+
+   evas_common_cpu_end_opt();
+}
+
+void
+evas_software_gdi_outbuf_idle_flush(Outbuf *buf)
+{
+   while (buf->priv.prev_pending_writes)
+     {
+        RGBA_Image *im;
+        Outbuf_Region *obr;
+
+        im = buf->priv.prev_pending_writes->data;
+        buf->priv.prev_pending_writes =
+          eina_list_remove_list(buf->priv.prev_pending_writes,
+                                buf->priv.prev_pending_writes);
+        obr = im->extended_info;
+        evas_cache_image_drop((Image_Entry *)im);
+        if (obr->gdiob) _unfind_gdiob(obr->gdiob);
+/*         if (obr->mxob) _unfind_xob(obr->mxob, 0); */
+        free(obr);
+     }
+   _clear_gdiob();
+}
+
+int
+evas_software_gdi_outbuf_width_get(Outbuf *buf)
+{
+   return buf->width;
+}
+
+int
+evas_software_gdi_outbuf_height_get(Outbuf *buf)
+{
+   return buf->height;
+}
+
+Outbuf_Depth
+evas_software_gdi_outbuf_depth_get(Outbuf *buf)
+{
+   return buf->depth;
+}
+
+int
+evas_software_gdi_outbuf_rot_get(Outbuf *buf)
+{
+   return buf->rot;
+}
diff --git a/src/modules/engines/software_generic/Makefile.in b/src/modules/engines/software_generic/Makefile.in
index 7cae41f..fa1e914 100644
--- a/src/modules/engines/software_generic/Makefile.in
+++ b/src/modules/engines/software_generic/Makefile.in
@@ -233,6 +233,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/engines/software_generic/evas_engine.c b/src/modules/engines/software_generic/evas_engine.c
index 2517f50..566ddda 100644
--- a/src/modules/engines/software_generic/evas_engine.c
+++ b/src/modules/engines/software_generic/evas_engine.c
@@ -778,6 +778,26 @@ eng_image_draw(void *data __UNUSED__, void *context, void *surface, void *image,
 }
 
 static void
+eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+   Image_Entry *im;
+
+   if (!image) return;
+   im = image;
+   im->scale_hint = hint;
+}
+
+static int
+eng_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   Image_Entry *im;
+
+   if (!image) return EVAS_IMAGE_SCALE_HINT_NONE;
+   im = image;
+   return im->scale_hint;
+}
+
+static void
 eng_image_cache_flush(void *data __UNUSED__)
 {
    int tmp_size;
@@ -1087,7 +1107,9 @@ static Evas_Func func =
      eng_font_cache_get,
      /* font hinting functions */
      eng_font_hinting_set,
-     eng_font_hinting_can_hint
+     eng_font_hinting_can_hint,
+     eng_image_scale_hint_set,
+     eng_image_scale_hint_get
      /* FUTURE software generic calls go here */
 };
 
diff --git a/src/modules/engines/software_sdl/Makefile.in b/src/modules/engines/software_sdl/Makefile.in
index 58a63dd..ecb7421 100644
--- a/src/modules/engines/software_sdl/Makefile.in
+++ b/src/modules/engines/software_sdl/Makefile.in
@@ -241,6 +241,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/engines/software_sdl/evas_engine.c b/src/modules/engines/software_sdl/evas_engine.c
index ca62c93..13c7f5d 100644
--- a/src/modules/engines/software_sdl/evas_engine.c
+++ b/src/modules/engines/software_sdl/evas_engine.c
@@ -622,6 +622,17 @@ evas_engine_sdl_image_draw(void *data, void *context, void *surface, void *image
 }
 
 static void
+evas_engine_sdl_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static int
+evas_engine_sdl_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+static void
 evas_engine_sdl_image_cache_flush(void *data)
 {
    Render_Engine        *re = (Render_Engine*) data;
@@ -856,6 +867,10 @@ EAPI int module_open(Evas_Module *em)
    ORD(rectangle_draw);
    ORD(polygon_draw);
    ORD(gradient_draw);
+   
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
+   
    /* now advertise out own api */
    em->functions = (void *)(&func);
    return 1;
diff --git a/src/modules/engines/software_win32_gdi/Evas_Engine_Software_Win32_GDI.h b/src/modules/engines/software_win32_gdi/Evas_Engine_Software_Win32_GDI.h
deleted file mode 100644
index 22129b2..0000000
--- a/src/modules/engines/software_win32_gdi/Evas_Engine_Software_Win32_GDI.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef _EVAS_ENGINE_SOFTWARE_WIN32_GDI_H
-#define _EVAS_ENGINE_SOFTWARE_WIN32_GDI_H
-
-typedef struct _Evas_Engine_Info_Software_Win32_GDI Evas_Engine_Info_Software_Win32_GDI;
-
-struct _Evas_Engine_Info_Software_Win32_GDI
-{
-   /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
-   /* at you and make nasty noises */
-   Evas_Engine_Info magic;
-
-   /* engine specific data & parameters it needs to set up */
-   struct {
-		HWND		 hwnd;
-/*
-      Colormap  colormap;
-*/
-
-      int       depth;
-      int       rotation;
-
-   } info;
-   /* engine specific function calls to query stuff about the destination */
-   /* engine (what visual & colormap & depth to use, performance info etc. */
-};
-#endif
-
-
diff --git a/src/modules/engines/software_win32_gdi/Makefile.am b/src/modules/engines/software_win32_gdi/Makefile.am
deleted file mode 100644
index 86ba3d0..0000000
--- a/src/modules/engines/software_win32_gdi/Makefile.am
+++ /dev/null
@@ -1,9 +0,0 @@
-MAINTAINERCLEANFILES = Makefile.in
-
-EXTRA_DIST = \
-evas_engine.h \
-evas_engine.c \
-evas_outbuf.c \
-evas_win32_buffer.c \
-evas_win32_main.c \
-Evas_Engine_Software_Win32_GDI.h
diff --git a/src/modules/engines/software_win32_gdi/Makefile.in b/src/modules/engines/software_win32_gdi/Makefile.in
deleted file mode 100644
index fe9b412..0000000
--- a/src/modules/engines/software_win32_gdi/Makefile.in
+++ /dev/null
@@ -1,446 +0,0 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
- at SET_MAKE@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = src/modules/engines/software_win32_gdi
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \
-	$(top_srcdir)/m4/efl_doxygen.m4 \
-	$(top_srcdir)/m4/evas_check_engine.m4 \
-	$(top_srcdir)/m4/evas_check_loader.m4 \
-	$(top_srcdir)/m4/evas_converter.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-SOURCES =
-DIST_SOURCES =
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
-AMTAR = @AMTAR@
-AR = @AR@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
-DIRECTFB_LIBS = @DIRECTFB_LIBS@
-DLLTOOL = @DLLTOOL@
-DSYMUTIL = @DSYMUTIL@
-DUMPBIN = @DUMPBIN@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EDB_CFLAGS = @EDB_CFLAGS@
-EDB_LIBS = @EDB_LIBS@
-EET_CFLAGS = @EET_CFLAGS@
-EET_LIBS = @EET_LIBS@
-EGREP = @EGREP@
-EINA_CFLAGS = @EINA_CFLAGS@
-EINA_LIBS = @EINA_LIBS@
-EVIL_CFLAGS = @EVIL_CFLAGS@
-EVIL_LIBS = @EVIL_LIBS@
-EXEEXT = @EXEEXT@
-FGREP = @FGREP@
-FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
-FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
-FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
-FREETYPE_LIBS = @FREETYPE_LIBS@
-FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@
-FRIBIDI_LIBS = @FRIBIDI_LIBS@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LD = @LD@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LIPO = @LIPO@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-MODULE_ARCH = @MODULE_ARCH@
-NM = @NM@
-NMEDIT = @NMEDIT@
-OBJDUMP = @OBJDUMP@
-OBJEXT = @OBJEXT@
-OTOOL = @OTOOL@
-OTOOL64 = @OTOOL64@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PKG_CONFIG = @PKG_CONFIG@
-PNG_CFLAGS = @PNG_CFLAGS@
-PNG_LIBS = @PNG_LIBS@
-RANLIB = @RANLIB@
-RC = @RC@
-SDL_CFLAGS = @SDL_CFLAGS@
-SDL_LIBS = @SDL_LIBS@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-SVG_CFLAGS = @SVG_CFLAGS@
-SVG_LIBS = @SVG_LIBS@
-VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
-VALGRIND_LIBS = @VALGRIND_LIBS@
-VERSION = @VERSION@
-WIN32_CFLAGS = @WIN32_CFLAGS@
-WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
-XCBRENDER_CFLAGS = @XCBRENDER_CFLAGS@
-XCBRENDER_LIBS = @XCBRENDER_LIBS@
-XCB_CFLAGS = @XCB_CFLAGS@
-XCB_LIBS = @XCB_LIBS@
-XMKMF = @XMKMF@
-X_CFLAGS = @X_CFLAGS@
-X_EXTRA_LIBS = @X_EXTRA_LIBS@
-X_LIBS = @X_LIBS@
-X_PRE_LIBS = @X_PRE_LIBS@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
-altivec_cflags = @altivec_cflags@
-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@
-dlopen_libs = @dlopen_libs@
-docdir = @docdir@
-dvidir = @dvidir@
-efl_doxygen = @efl_doxygen@
-efl_have_doxygen = @efl_have_doxygen@
-evas_engine_buffer_cflags = @evas_engine_buffer_cflags@
-evas_engine_buffer_libs = @evas_engine_buffer_libs@
-evas_engine_direct3d_cflags = @evas_engine_direct3d_cflags@
-evas_engine_direct3d_libs = @evas_engine_direct3d_libs@
-evas_engine_directfb_cflags = @evas_engine_directfb_cflags@
-evas_engine_directfb_libs = @evas_engine_directfb_libs@
-evas_engine_fb_cflags = @evas_engine_fb_cflags@
-evas_engine_fb_libs = @evas_engine_fb_libs@
-evas_engine_gl_common_libs = @evas_engine_gl_common_libs@
-evas_engine_gl_glew_cflags = @evas_engine_gl_glew_cflags@
-evas_engine_gl_glew_libs = @evas_engine_gl_glew_libs@
-evas_engine_gl_x11_cflags = @evas_engine_gl_x11_cflags@
-evas_engine_gl_x11_libs = @evas_engine_gl_x11_libs@
-evas_engine_quartz_cflags = @evas_engine_quartz_cflags@
-evas_engine_quartz_libs = @evas_engine_quartz_libs@
-evas_engine_software_16_ddraw_cflags = @evas_engine_software_16_ddraw_cflags@
-evas_engine_software_16_ddraw_libs = @evas_engine_software_16_ddraw_libs@
-evas_engine_software_16_wince_cflags = @evas_engine_software_16_wince_cflags@
-evas_engine_software_16_wince_libs = @evas_engine_software_16_wince_libs@
-evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
-evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
-evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
-evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
-evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
-evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
-evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
-evas_engine_software_x11_libs = @evas_engine_software_x11_libs@
-evas_engine_software_xcb_cflags = @evas_engine_software_xcb_cflags@
-evas_engine_software_xcb_libs = @evas_engine_software_xcb_libs@
-evas_engine_xrender_x11_cflags = @evas_engine_xrender_x11_cflags@
-evas_engine_xrender_x11_libs = @evas_engine_xrender_x11_libs@
-evas_engine_xrender_xcb_cflags = @evas_engine_xrender_xcb_cflags@
-evas_engine_xrender_xcb_libs = @evas_engine_xrender_xcb_libs@
-evas_image_loader_edb_cflags = @evas_image_loader_edb_cflags@
-evas_image_loader_edb_libs = @evas_image_loader_edb_libs@
-evas_image_loader_eet_cflags = @evas_image_loader_eet_cflags@
-evas_image_loader_eet_libs = @evas_image_loader_eet_libs@
-evas_image_loader_gif_cflags = @evas_image_loader_gif_cflags@
-evas_image_loader_gif_libs = @evas_image_loader_gif_libs@
-evas_image_loader_jpeg_cflags = @evas_image_loader_jpeg_cflags@
-evas_image_loader_jpeg_libs = @evas_image_loader_jpeg_libs@
-evas_image_loader_pmaps_cflags = @evas_image_loader_pmaps_cflags@
-evas_image_loader_pmaps_libs = @evas_image_loader_pmaps_libs@
-evas_image_loader_png_cflags = @evas_image_loader_png_cflags@
-evas_image_loader_png_libs = @evas_image_loader_png_libs@
-evas_image_loader_svg_cflags = @evas_image_loader_svg_cflags@
-evas_image_loader_svg_libs = @evas_image_loader_svg_libs@
-evas_image_loader_tiff_cflags = @evas_image_loader_tiff_cflags@
-evas_image_loader_tiff_libs = @evas_image_loader_tiff_libs@
-evas_image_loader_xpm_cflags = @evas_image_loader_xpm_cflags@
-evas_image_loader_xpm_libs = @evas_image_loader_xpm_libs@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
-lt_enable_auto_import = @lt_enable_auto_import@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-pthread_cflags = @pthread_cflags@
-pthread_libs = @pthread_libs@
-release_info = @release_info@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-version_info = @version_info@
-MAINTAINERCLEANFILES = Makefile.in
-EXTRA_DIST = \
-evas_engine.h \
-evas_engine.c \
-evas_outbuf.c \
-evas_win32_buffer.c \
-evas_win32_main.c \
-Evas_Engine_Software_Win32_GDI.h
-
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/modules/engines/software_win32_gdi/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  src/modules/engines/software_win32_gdi/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-tags: TAGS
-TAGS:
-
-ctags: CTAGS
-CTAGS:
-
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile
-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)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-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
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
-	distclean distclean-generic distclean-libtool 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-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am 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/src/modules/engines/software_win32_gdi/evas_engine.c b/src/modules/engines/software_win32_gdi/evas_engine.c
deleted file mode 100644
index e69de29..0000000
diff --git a/src/modules/engines/software_win32_gdi/evas_engine.h b/src/modules/engines/software_win32_gdi/evas_engine.h
deleted file mode 100644
index e69de29..0000000
diff --git a/src/modules/engines/software_win32_gdi/evas_outbuf.c b/src/modules/engines/software_win32_gdi/evas_outbuf.c
deleted file mode 100644
index e69de29..0000000
diff --git a/src/modules/engines/software_win32_gdi/evas_win32_buffer.c b/src/modules/engines/software_win32_gdi/evas_win32_buffer.c
deleted file mode 100644
index e69de29..0000000
diff --git a/src/modules/engines/software_win32_gdi/evas_win32_main.c b/src/modules/engines/software_win32_gdi/evas_win32_main.c
deleted file mode 100644
index e69de29..0000000
diff --git a/src/modules/engines/software_x11/Makefile.am b/src/modules/engines/software_x11/Makefile.am
index 0d0b5c6..76a93c4 100644
--- a/src/modules/engines/software_x11/Makefile.am
+++ b/src/modules/engines/software_x11/Makefile.am
@@ -35,7 +35,7 @@ evas_xcb_main.c
 endif
 
 module_la_LIBADD = $(top_builddir)/src/lib/libevas.la @EINA_LIBS@ @evas_engine_software_x11_libs@ @evas_engine_software_xcb_libs@
-module_la_LDFLAGS = -module -avoid-version
+module_la_LDFLAGS = -no-undefined -module -avoid-version
 module_la_LIBTOOLFLAGS = --tag=disable-static
 
 include_HEADERS = Evas_Engine_Software_X11.h
diff --git a/src/modules/engines/software_x11/Makefile.in b/src/modules/engines/software_x11/Makefile.in
index 651dcc9..24a0a72 100644
--- a/src/modules/engines/software_x11/Makefile.in
+++ b/src/modules/engines/software_x11/Makefile.in
@@ -259,6 +259,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
@@ -341,7 +343,7 @@ AM_CPPFLAGS = \
 @BUILD_ENGINE_SOFTWARE_X11_TRUE@	evas_xlib_main.c \
 @BUILD_ENGINE_SOFTWARE_X11_TRUE@	$(am__append_1)
 @BUILD_ENGINE_SOFTWARE_X11_TRUE at module_la_LIBADD = $(top_builddir)/src/lib/libevas.la @EINA_LIBS@ @evas_engine_software_x11_libs@ @evas_engine_software_xcb_libs@
- at BUILD_ENGINE_SOFTWARE_X11_TRUE@module_la_LDFLAGS = -module -avoid-version
+ at BUILD_ENGINE_SOFTWARE_X11_TRUE@module_la_LDFLAGS = -no-undefined -module -avoid-version
 @BUILD_ENGINE_SOFTWARE_X11_TRUE at module_la_LIBTOOLFLAGS = --tag=disable-static
 @BUILD_ENGINE_SOFTWARE_X11_TRUE at include_HEADERS = Evas_Engine_Software_X11.h
 EXTRA_DIST = \
diff --git a/src/modules/engines/software_x11/evas_xlib_buffer.c b/src/modules/engines/software_x11/evas_xlib_buffer.c
index fb562f3..529b0dc 100644
--- a/src/modules/engines/software_x11/evas_xlib_buffer.c
+++ b/src/modules/engines/software_x11/evas_xlib_buffer.c
@@ -58,6 +58,172 @@ evas_software_xlib_x_write_mask_line(Outbuf *buf, X_Output_Buffer *xob, DATA32 *
      }
 }
 
+void
+evas_software_xlib_x_write_mask_line_rev(Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int w, int y)
+{
+   int x;
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int bpl = 0;
+
+   src_ptr = src + w - 1;
+   dst_ptr = evas_software_xlib_x_output_buffer_data(xob, &bpl);
+   dst_ptr = dst_ptr + (bpl * y);
+   w -= 7;
+   if (buf->priv.x11.xlib.bit_swap)
+     {
+	for (x = 0; x < w; x += 8)
+	  {
+	     *dst_ptr =
+	       ((A_VAL(&(src_ptr[ 0])) >> 7) << 7) |
+	       ((A_VAL(&(src_ptr[-1])) >> 7) << 6) |
+	       ((A_VAL(&(src_ptr[-2])) >> 7) << 5) |
+	       ((A_VAL(&(src_ptr[-3])) >> 7) << 4) |
+	       ((A_VAL(&(src_ptr[-4])) >> 7) << 3) |
+	       ((A_VAL(&(src_ptr[-5])) >> 7) << 2) |
+	       ((A_VAL(&(src_ptr[-6])) >> 7) << 1) |
+	       ((A_VAL(&(src_ptr[-7])) >> 7) << 0);
+	     src_ptr -= 8;
+	     dst_ptr++;
+	  }
+     }
+   else
+     {
+	for (x = 0; x < w; x += 8)
+	  {
+	     *dst_ptr =
+	       ((A_VAL(&(src_ptr[ 0])) >> 7) << 0) |
+	       ((A_VAL(&(src_ptr[-1])) >> 7) << 1) |
+	       ((A_VAL(&(src_ptr[-2])) >> 7) << 2) |
+	       ((A_VAL(&(src_ptr[-3])) >> 7) << 3) |
+	       ((A_VAL(&(src_ptr[-4])) >> 7) << 4) |
+	       ((A_VAL(&(src_ptr[-5])) >> 7) << 5) |
+	       ((A_VAL(&(src_ptr[-6])) >> 7) << 6) |
+	       ((A_VAL(&(src_ptr[-7])) >> 7) << 7);
+	     src_ptr -= 8;
+	     dst_ptr++;
+	  }
+     }
+   w += 7;
+   for (; x < w; x ++)
+     {
+	XPutPixel(xob->xim, x, y, A_VAL(src_ptr) >> 7);
+	src_ptr--;
+     }
+}
+
+void
+evas_software_xlib_x_write_mask_line_vert(Outbuf *buf, X_Output_Buffer *xob, 
+                                          DATA32 *src, 
+                                          int h, int ym, int w)
+{
+   int y;
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int bpl = 0;
+
+   src_ptr = src;
+   dst_ptr = evas_software_xlib_x_output_buffer_data(xob, &bpl);
+   dst_ptr = dst_ptr + (bpl * ym);
+   h -= 7;
+   if (buf->priv.x11.xlib.bit_swap)
+     {
+	for (y = 0; y < h; y += 8)
+	  {
+	     *dst_ptr =
+	       ((A_VAL(&(src_ptr[0 * w])) >> 7) << 7) |
+	       ((A_VAL(&(src_ptr[1 * w])) >> 7) << 6) |
+	       ((A_VAL(&(src_ptr[2 * w])) >> 7) << 5) |
+	       ((A_VAL(&(src_ptr[3 * w])) >> 7) << 4) |
+	       ((A_VAL(&(src_ptr[4 * w])) >> 7) << 3) |
+	       ((A_VAL(&(src_ptr[5 * w])) >> 7) << 2) |
+	       ((A_VAL(&(src_ptr[6 * w])) >> 7) << 1) |
+	       ((A_VAL(&(src_ptr[7 * w])) >> 7) << 0);
+	     src_ptr += 8 * w;
+	     dst_ptr++;
+	  }
+     }
+   else
+     {
+	for (y = 0; y < h; y += 8)
+	  {
+	     *dst_ptr =
+	       ((A_VAL(&(src_ptr[0 * w])) >> 7) << 0) |
+	       ((A_VAL(&(src_ptr[1 * w])) >> 7) << 1) |
+	       ((A_VAL(&(src_ptr[2 * w])) >> 7) << 2) |
+	       ((A_VAL(&(src_ptr[3 * w])) >> 7) << 3) |
+	       ((A_VAL(&(src_ptr[4 * w])) >> 7) << 4) |
+	       ((A_VAL(&(src_ptr[5 * w])) >> 7) << 5) |
+	       ((A_VAL(&(src_ptr[6 * w])) >> 7) << 6) |
+	       ((A_VAL(&(src_ptr[7 * w])) >> 7) << 7);
+	     src_ptr += 8 * w;
+	     dst_ptr++;
+	  }
+     }
+   h += 7;
+   for (; y < h; y ++)
+     {
+	XPutPixel(xob->xim, y, ym, A_VAL(src_ptr) >> 7);
+	src_ptr += w;
+     }
+}
+
+void
+evas_software_xlib_x_write_mask_line_vert_rev(Outbuf *buf, X_Output_Buffer *xob, 
+                                              DATA32 *src, 
+                                              int h, int ym, int w)
+{
+   int y;
+   DATA32 *src_ptr;
+   DATA8 *dst_ptr;
+   int bpl = 0;
+
+   src_ptr = src + ((h - 1) * w);
+   dst_ptr = evas_software_xlib_x_output_buffer_data(xob, &bpl);
+   dst_ptr = dst_ptr + (bpl * ym);
+   h -= 7;
+   if (buf->priv.x11.xlib.bit_swap)
+     {
+	for (y = 0; y < h; y += 8)
+	  {
+	     *dst_ptr =
+	       ((A_VAL(&(src_ptr[ 0 * w])) >> 7) << 7) |
+	       ((A_VAL(&(src_ptr[-1 * w])) >> 7) << 6) |
+	       ((A_VAL(&(src_ptr[-2 * w])) >> 7) << 5) |
+	       ((A_VAL(&(src_ptr[-3 * w])) >> 7) << 4) |
+	       ((A_VAL(&(src_ptr[-4 * w])) >> 7) << 3) |
+	       ((A_VAL(&(src_ptr[-5 * w])) >> 7) << 2) |
+	       ((A_VAL(&(src_ptr[-6 * w])) >> 7) << 1) |
+	       ((A_VAL(&(src_ptr[-7 * w])) >> 7) << 0);
+	     src_ptr -= 8 * w;
+	     dst_ptr++;
+	  }
+     }
+   else
+     {
+	for (y = 0; y < h; y += 8)
+	  {
+	     *dst_ptr =
+	       ((A_VAL(&(src_ptr[ 0 * w])) >> 7) << 0) |
+	       ((A_VAL(&(src_ptr[-1 * w])) >> 7) << 1) |
+	       ((A_VAL(&(src_ptr[-2 * w])) >> 7) << 2) |
+	       ((A_VAL(&(src_ptr[-3 * w])) >> 7) << 3) |
+	       ((A_VAL(&(src_ptr[-4 * w])) >> 7) << 4) |
+	       ((A_VAL(&(src_ptr[-5 * w])) >> 7) << 5) |
+	       ((A_VAL(&(src_ptr[-6 * w])) >> 7) << 6) |
+	       ((A_VAL(&(src_ptr[-7 * w])) >> 7) << 7);
+	     src_ptr -= 8 * w;
+	     dst_ptr++;
+	  }
+     }
+   h += 7;
+   for (; y < h; y ++)
+     {
+	XPutPixel(xob->xim, y, ym, A_VAL(src_ptr) >> 7);
+	src_ptr -= w;
+     }
+}
+
 int
 evas_software_xlib_x_can_do_shm(Display *d)
 {
diff --git a/src/modules/engines/software_x11/evas_xlib_buffer.h b/src/modules/engines/software_x11/evas_xlib_buffer.h
index 5ad91a7..01c4db0 100644
--- a/src/modules/engines/software_x11/evas_xlib_buffer.h
+++ b/src/modules/engines/software_x11/evas_xlib_buffer.h
@@ -21,6 +21,9 @@ struct _X_Output_Buffer
 };
 
 void evas_software_xlib_x_write_mask_line               (Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int w, int y);
+void evas_software_xlib_x_write_mask_line_rev           (Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int w, int y);
+void evas_software_xlib_x_write_mask_line_vert          (Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int h, int ym, int w);
+void evas_software_xlib_x_write_mask_line_vert_rev      (Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int h, int ym, int w);
 
 int evas_software_xlib_x_can_do_shm                     (Display *d);
 
diff --git a/src/modules/engines/software_x11/evas_xlib_outbuf.c b/src/modules/engines/software_x11/evas_xlib_outbuf.c
index a1f9a90..442119d 100644
--- a/src/modules/engines/software_x11/evas_xlib_outbuf.c
+++ b/src/modules/engines/software_x11/evas_xlib_outbuf.c
@@ -421,25 +421,35 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
              evas_cache_image_surface_alloc(&im->cache_entry, buf->w, buf->h);
 	     im->extended_info = obr;
 	     if ((buf->rot == 0) || (buf->rot == 180))
-	       obr->xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
-								buf->priv.x11.xlib.vis,
-								buf->priv.x11.xlib.depth,
-								buf->w, buf->h,
-								use_shm,
-								NULL);
+               {
+                  obr->xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
+                                                                    buf->priv.x11.xlib.vis,
+                                                                    buf->priv.x11.xlib.depth,
+                                                                    buf->w, buf->h,
+                                                                    use_shm,
+                                                                    NULL);
+                  if (buf->priv.x11.xlib.mask)
+                    obr->mxob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
+                                                                       buf->priv.x11.xlib.vis,
+                                                                       1, buf->w, buf->h,
+                                                                       use_shm,
+                                                                       NULL);
+               }
 	     else if ((buf->rot == 90) || (buf->rot == 270))
-	       obr->xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
-								buf->priv.x11.xlib.vis,
-								buf->priv.x11.xlib.depth,
-								buf->h, buf->w,
-								use_shm,
-								NULL);
-	     if (buf->priv.x11.xlib.mask)
-	       obr->mxob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
-								 buf->priv.x11.xlib.vis,
-								 1, buf->w, buf->h,
-								 use_shm,
-								 NULL);
+               {
+                  obr->xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
+                                                                    buf->priv.x11.xlib.vis,
+                                                                    buf->priv.x11.xlib.depth,
+                                                                    buf->h, buf->w,
+                                                                    use_shm,
+                                                                    NULL);
+                  if (buf->priv.x11.xlib.mask)
+                    obr->mxob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
+                                                                       buf->priv.x11.xlib.vis,
+                                                                       1, buf->h, buf->w,
+                                                                       use_shm,
+                                                                       NULL);
+               }
 	  }
 	if (alpha)
           /* FIXME: faster memset! */
@@ -511,12 +521,20 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
         evas_cache_image_surface_alloc(&im->cache_entry, w, h);
 	im->extended_info = obr;
 	if ((buf->rot == 0) || (buf->rot == 180))
-	  obr->xob = _find_xob(buf->priv.x11.xlib.disp,
-			       buf->priv.x11.xlib.vis,
-			       buf->priv.x11.xlib.depth,
-			       w, h,
-			       use_shm,
-			       NULL);
+          {
+             obr->xob = _find_xob(buf->priv.x11.xlib.disp,
+                                  buf->priv.x11.xlib.vis,
+                                  buf->priv.x11.xlib.depth,
+                                  w, h,
+                                  use_shm,
+                                  NULL);
+             if (buf->priv.x11.xlib.mask)
+               obr->mxob = _find_xob(buf->priv.x11.xlib.disp,
+                                     buf->priv.x11.xlib.vis,
+                                     1, w, h,
+                                     use_shm,
+                                     NULL);
+          }
 /*
 	  obr->xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
 							   buf->priv.x11.xlib.vis,
@@ -526,12 +544,20 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
 							   NULL);
  */
 	else if ((buf->rot == 90) || (buf->rot == 270))
-	  obr->xob = _find_xob(buf->priv.x11.xlib.disp,
-			       buf->priv.x11.xlib.vis,
-			       buf->priv.x11.xlib.depth,
-			       h, w,
-			       use_shm,
-			       NULL);
+          {
+             obr->xob = _find_xob(buf->priv.x11.xlib.disp,
+                                  buf->priv.x11.xlib.vis,
+                                  buf->priv.x11.xlib.depth,
+                                  h, w,
+                                  use_shm,
+                                  NULL);
+             if (buf->priv.x11.xlib.mask)
+               obr->mxob = _find_xob(buf->priv.x11.xlib.disp,
+                                     buf->priv.x11.xlib.vis,
+                                     1, h, w,
+                                     use_shm,
+                                     NULL);
+          }
 /*
 	  obr->xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
 							   buf->priv.x11.xlib.vis,
@@ -540,12 +566,14 @@ evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w
 							   use_shm,
 							   NULL);
  */
+/*        
 	if (buf->priv.x11.xlib.mask)
 	  obr->mxob = _find_xob(buf->priv.x11.xlib.disp,
 				buf->priv.x11.xlib.vis,
 				1, w, h,
 				use_shm,
 				NULL);
+ */
 /*
 	  obr->mxob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
 							    buf->priv.x11.xlib.vis,
@@ -741,7 +769,7 @@ evas_software_xlib_outbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, i
    Outbuf_Region      *obr;
    DATA32             *src_data;
    void               *data;
-   int                 bpl = 0, yy;
+   int                 bpl = 0, xx, yy;
 
    obr = update->extended_info;
    if (buf->priv.pal)
@@ -842,10 +870,41 @@ evas_software_xlib_outbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, i
 #endif
    if (obr->mxob)
      {
-	for (yy = 0; yy < obr->h; yy++)
-	  evas_software_xlib_x_write_mask_line(buf, obr->mxob,
-					      src_data +
-					      (yy * obr->w), obr->w, yy);
+        if (buf->rot == 0)
+          {
+             for (yy = 0; yy < obr->h; yy++)
+               evas_software_xlib_x_write_mask_line(buf, obr->mxob,
+                                                    src_data +
+                                                    (yy * obr->w), obr->w, yy);
+          }
+        else if (buf->rot == 90)
+          {
+             for (yy = 0; yy < obr->h; yy++)
+               evas_software_xlib_x_write_mask_line_vert(buf, obr->mxob,
+                                                         src_data + yy, 
+                                                         h,  // h
+                                                         obr->h - yy - 1, // ym
+                                                         w); // w
+          }
+        else if (buf->rot == 180)
+          {
+             for (yy = 0; yy < obr->h; yy++)
+               {
+                  evas_software_xlib_x_write_mask_line_rev(buf, obr->mxob,
+                                                           src_data +
+                                                           (yy * obr->w), 
+                                                           obr->w, obr->h - yy - 1);
+               }
+          }
+        else if (buf->rot == 270)
+          {
+             for (yy = 0; yy < obr->h; yy++)
+               evas_software_xlib_x_write_mask_line_vert_rev(buf, obr->mxob,
+                                                             src_data + yy,
+                                                             h,  // h
+                                                             yy, // ym
+                                                             w); // w
+          }
 #if 1
 #else
 	/* XX async push */
diff --git a/src/modules/engines/xrender_x11/Makefile.am b/src/modules/engines/xrender_x11/Makefile.am
index ee723d6..9074018 100644
--- a/src/modules/engines/xrender_x11/Makefile.am
+++ b/src/modules/engines/xrender_x11/Makefile.am
@@ -35,7 +35,7 @@ evas_engine_xcb_ximage.c
 endif
 
 module_la_LIBADD = $(top_builddir)/src/lib/libevas.la @EINA_LIBS@ @evas_engine_xrender_xcb_libs@ @evas_engine_xrender_x11_libs@
-module_la_LDFLAGS = -module -avoid-version
+module_la_LDFLAGS = -no-undefined -module -avoid-version
 module_la_LIBTOOLFLAGS = --tag=disable-static
 
 include_HEADERS = Evas_Engine_XRender_X11.h
diff --git a/src/modules/engines/xrender_x11/Makefile.in b/src/modules/engines/xrender_x11/Makefile.in
index 665205a..a1910f4 100644
--- a/src/modules/engines/xrender_x11/Makefile.in
+++ b/src/modules/engines/xrender_x11/Makefile.in
@@ -263,6 +263,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
@@ -346,7 +348,7 @@ AM_CPPFLAGS = \
 @BUILD_ENGINE_XRENDER_X11_TRUE@	evas_engine_xlib_ximage.c \
 @BUILD_ENGINE_XRENDER_X11_TRUE@	evas_engine.c $(am__append_1)
 @BUILD_ENGINE_XRENDER_X11_TRUE at module_la_LIBADD = $(top_builddir)/src/lib/libevas.la @EINA_LIBS@ @evas_engine_xrender_xcb_libs@ @evas_engine_xrender_x11_libs@
- at BUILD_ENGINE_XRENDER_X11_TRUE@module_la_LDFLAGS = -module -avoid-version
+ at BUILD_ENGINE_XRENDER_X11_TRUE@module_la_LDFLAGS = -no-undefined -module -avoid-version
 @BUILD_ENGINE_XRENDER_X11_TRUE at module_la_LIBTOOLFLAGS = --tag=disable-static
 @BUILD_ENGINE_XRENDER_X11_TRUE at include_HEADERS = Evas_Engine_XRender_X11.h
 EXTRA_DIST = evas_engine.h
diff --git a/src/modules/engines/xrender_x11/evas_engine.c b/src/modules/engines/xrender_x11/evas_engine.c
index 03644ea..1673685 100644
--- a/src/modules/engines/xrender_x11/evas_engine.c
+++ b/src/modules/engines/xrender_x11/evas_engine.c
@@ -1326,6 +1326,18 @@ eng_image_draw(void *data, void *context, void *surface, void *image, int src_x,
 }
 
 static void
+eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
+{
+}
+
+static int
+eng_image_scale_hint_get(void *data __UNUSED__, void *image)
+{
+   return EVAS_IMAGE_SCALE_HINT_NONE;
+}
+
+
+static void
 eng_image_cache_flush(void *data)
 {
    Render_Engine *re;
@@ -1479,6 +1491,10 @@ module_open(Evas_Module *em)
    ORD(image_cache_set);
    ORD(image_cache_get);
    ORD(font_draw);
+   
+   ORD(image_scale_hint_set);
+   ORD(image_scale_hint_get);
+   
    /* now advertise out own api */
    em->functions = (void *)(&func);
    return 1;
diff --git a/src/modules/loaders/Makefile.in b/src/modules/loaders/Makefile.in
index d0c092f..fad1bf7 100644
--- a/src/modules/loaders/Makefile.in
+++ b/src/modules/loaders/Makefile.in
@@ -215,6 +215,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/loaders/edb/Makefile.in b/src/modules/loaders/edb/Makefile.in
index 52a412b..7d3e239 100644
--- a/src/modules/loaders/edb/Makefile.in
+++ b/src/modules/loaders/edb/Makefile.in
@@ -233,6 +233,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/loaders/eet/Makefile.in b/src/modules/loaders/eet/Makefile.in
index 6a18178..10a81ab 100644
--- a/src/modules/loaders/eet/Makefile.in
+++ b/src/modules/loaders/eet/Makefile.in
@@ -233,6 +233,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/loaders/gif/Makefile.in b/src/modules/loaders/gif/Makefile.in
index 1f8736e..632c0ea 100644
--- a/src/modules/loaders/gif/Makefile.in
+++ b/src/modules/loaders/gif/Makefile.in
@@ -233,6 +233,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/loaders/jpeg/Makefile.in b/src/modules/loaders/jpeg/Makefile.in
index 82793f8..f36f381 100644
--- a/src/modules/loaders/jpeg/Makefile.in
+++ b/src/modules/loaders/jpeg/Makefile.in
@@ -233,6 +233,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/loaders/jpeg/evas_image_load_jpeg.c b/src/modules/loaders/jpeg/evas_image_load_jpeg.c
index 0b9210c..450d0fa 100644
--- a/src/modules/loaders/jpeg/evas_image_load_jpeg.c
+++ b/src/modules/loaders/jpeg/evas_image_load_jpeg.c
@@ -1,4 +1,3 @@
-
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
@@ -106,7 +105,7 @@ evas_image_load_file_head_jpeg_internal(Image_Entry *ie, FILE *f)
    w = cinfo.output_width;
    h = cinfo.output_height;
    if ((w < 1) || (h < 1) || (w > 8192) || (h > 8192))
-     {  
+     {
         jpeg_destroy_decompress(&cinfo);
 	return 0;
      }
@@ -143,18 +142,18 @@ evas_image_load_file_head_jpeg_internal(Image_Entry *ie, FILE *f)
      }
    if (w < 1) w = 1;
    if (h < 1) h = 1;
-   
+
    if ((w != cinfo.output_width) || (h != cinfo.output_height))
      {
 	scalew = cinfo.output_width / w;
 	scaleh = cinfo.output_height / h;
-	
+
 	ie->scale = scalew;
 	if (scaleh < scalew) ie->scale = scaleh;
-	
+
 	if      (ie->scale > 8) ie->scale = 8;
 	else if (ie->scale < 1) ie->scale = 1;
-	
+
 	if      (ie->scale == 3) ie->scale = 2;
 	else if (ie->scale == 5) ie->scale = 4;
 	else if (ie->scale == 6) ie->scale = 4;
@@ -164,7 +163,7 @@ evas_image_load_file_head_jpeg_internal(Image_Entry *ie, FILE *f)
    if (ie->scale > 1)
      {
 	jpeg_destroy_decompress(&cinfo);
-   
+
 	rewind(f);
 	jpeg_create_decompress(&cinfo);
 	jpeg_stdio_src(&cinfo, f);
@@ -176,7 +175,7 @@ evas_image_load_file_head_jpeg_internal(Image_Entry *ie, FILE *f)
 	jpeg_calc_output_dimensions(&(cinfo));
 	jpeg_start_decompress(&cinfo);
      }
-   
+
    ie->w = cinfo.output_width;
    ie->h = cinfo.output_height;
 /* end head decoding */
@@ -193,7 +192,7 @@ evas_image_load_file_data_jpeg_internal(Image_Entry *ie, FILE *f)
    struct _JPEG_error_mgr jerr;
    DATA8 *ptr, *line[16], *data;
    DATA32 *ptr2;
-   int x, y, l, i, scans, count, prevy;
+   int x, y, l, i, scans, count;
 
    if (!f) return 0;
    cinfo.err = jpeg_std_error(&(jerr.pub));
@@ -218,20 +217,46 @@ evas_image_load_file_data_jpeg_internal(Image_Entry *ie, FILE *f)
 	cinfo.scale_num = 1;
 	cinfo.scale_denom = ie->scale;
      }
-   
+
+   /* Colorspace conversion options */
+   /* libjpeg can do the following conversions: */
+   /* GRAYSCLAE => RGB YCbCr => RGB and YCCK => CMYK */
+   switch (cinfo.jpeg_color_space)
+     {
+     case JCS_UNKNOWN:
+       break;
+     case JCS_GRAYSCALE:
+     case JCS_RGB:
+     case JCS_YCbCr:
+       cinfo.out_color_space = JCS_RGB;
+       break;
+     case JCS_CMYK:
+     case JCS_YCCK:
+       cinfo.out_color_space = JCS_CMYK;
+       break;
+     }
+
 /* head decoding */
    jpeg_calc_output_dimensions(&(cinfo));
    jpeg_start_decompress(&cinfo);
-   
+
    w = cinfo.output_width;
    h = cinfo.output_height;
-   
+
    if ((w != ie->w) || (h != ie->h))
      {
 	jpeg_destroy_decompress(&cinfo);
 	return 0;
      }
-   
+
+   if (!(((cinfo.out_color_space == JCS_RGB) &&
+          ((cinfo.output_components == 3) || (cinfo.output_components == 1))) ||
+         (cinfo.out_color_space == JCS_CMYK) && (cinfo.output_components == 4)))
+     {
+	jpeg_destroy_decompress(&cinfo);
+	return 0;
+     }
+
 /* end head decoding */
 /* data decoding */
    if (cinfo.rec_outbuf_height > 16)
@@ -239,7 +264,7 @@ evas_image_load_file_data_jpeg_internal(Image_Entry *ie, FILE *f)
 	jpeg_destroy_decompress(&cinfo);
 	return 0;
      }
-   data = alloca(w * 16 * 3);
+   data = alloca(w * 16 * cinfo.output_components);
    evas_cache_image_surface_alloc(ie, w, h);
    if (ie->flags.loaded)
      {
@@ -248,8 +273,56 @@ evas_image_load_file_data_jpeg_internal(Image_Entry *ie, FILE *f)
      }
    ptr2 = evas_cache_image_pixels(ie);
    count = 0;
-   prevy = 0;
-   if (cinfo.output_components == 3)
+   /* We handle first CMYK (4 components) */
+   if (cinfo.output_components == 4)
+     {
+	for (i = 0; i < cinfo.rec_outbuf_height; i++)
+	  line[i] = data + (i * w * 4);
+	for (l = 0; l < h; l += cinfo.rec_outbuf_height)
+	  {
+	     jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height);
+	     scans = cinfo.rec_outbuf_height;
+	     if ((h - l) < scans) scans = h - l;
+	     ptr = data;
+	     for (y = 0; y < scans; y++)
+	       {
+		  for (x = 0; x < w; x++)
+		    {
+                       if (cinfo.saw_Adobe_marker)
+                         /* According to libjpeg doc, Photoshop inverse the values of C, M, Y and K, */
+                         /* that is C is replaces by 255 - C, etc...*/
+                         /* See the comment below for the computation of RGB values from CMYK ones. */
+                         *ptr2 =
+                           (0xff000000) |
+                           ((ptr[0] * ptr[3] / 255) << 16) |
+                           ((ptr[1] * ptr[3] / 255) << 8) |
+                           ((ptr[2] * ptr[3] / 255));
+                       else
+                         /* Conversion from CMYK to RGB is done in 2 steps: */
+                         /* CMYK => CMY => RGB (see http://www.easyrgb.com/index.php?X=MATH) */
+                         /* after computation, if C, M, Y and K are between 0 and 1, we have: */
+                         /* R = (1 - C) * (1 - K) * 255 */
+                         /* G = (1 - M) * (1 - K) * 255 */
+                         /* B = (1 - Y) * (1 - K) * 255 */
+                         /* libjpeg stores CMYK values between 0 and 255, */
+                         /* so we replace C by C * 255 / 255, etc... and we obtain: */
+                         /* R = (255 - C) * (255 - K) / 255 */
+                         /* G = (255 - M) * (255 - K) / 255 */
+                         /* B = (255 - Y) * (255 - K) / 255 */
+                         /* with C, M, Y and K between 0 and 255. */
+                         *ptr2 =
+                           (0xff000000) |
+                           (((255 - ptr[0]) * (255 - ptr[3]) / 255) << 16) |
+                           (((255 - ptr[1]) * (255 - ptr[3]) / 255) << 8) |
+                           (((255 - ptr[2]) * (255 - ptr[3]) / 255));
+		       ptr += 4;
+		       ptr2++;
+		    }
+	       }
+	  }
+     }
+   /* We handle then RGB with 3 components */
+   else if (cinfo.output_components == 3)
      {
 	for (i = 0; i < cinfo.rec_outbuf_height; i++)
 	  line[i] = data + (i * w * 3);
@@ -271,6 +344,7 @@ evas_image_load_file_data_jpeg_internal(Image_Entry *ie, FILE *f)
 	       }
 	  }
      }
+   /* We finally handle RGB with 1 component */
    else if (cinfo.output_components == 1)
      {
 	for (i = 0; i < cinfo.rec_outbuf_height; i++)
@@ -440,7 +514,7 @@ module_open(Evas_Module *em)
 EAPI void
 module_close(void)
 {
-   
+
 }
 
 EAPI Evas_Module_Api evas_modapi =
diff --git a/src/modules/loaders/pmaps/Makefile.in b/src/modules/loaders/pmaps/Makefile.in
index b3a9573..85d88d9 100644
--- a/src/modules/loaders/pmaps/Makefile.in
+++ b/src/modules/loaders/pmaps/Makefile.in
@@ -233,6 +233,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/loaders/png/Makefile.in b/src/modules/loaders/png/Makefile.in
index 4a9ce49..b814983 100644
--- a/src/modules/loaders/png/Makefile.in
+++ b/src/modules/loaders/png/Makefile.in
@@ -233,6 +233,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/loaders/svg/Makefile.in b/src/modules/loaders/svg/Makefile.in
index a9fc2b5..e545f8c 100644
--- a/src/modules/loaders/svg/Makefile.in
+++ b/src/modules/loaders/svg/Makefile.in
@@ -233,6 +233,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/loaders/tiff/Makefile.in b/src/modules/loaders/tiff/Makefile.in
index 910b530..e847db8 100644
--- a/src/modules/loaders/tiff/Makefile.in
+++ b/src/modules/loaders/tiff/Makefile.in
@@ -233,6 +233,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/loaders/xpm/Makefile.in b/src/modules/loaders/xpm/Makefile.in
index 0b98912..15e1131 100644
--- a/src/modules/loaders/xpm/Makefile.in
+++ b/src/modules/loaders/xpm/Makefile.in
@@ -233,6 +233,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/savers/Makefile.in b/src/modules/savers/Makefile.in
index e9e47dd..a6a02ed 100644
--- a/src/modules/savers/Makefile.in
+++ b/src/modules/savers/Makefile.in
@@ -215,6 +215,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/savers/edb/Makefile.in b/src/modules/savers/edb/Makefile.in
index 42190c5..ec71d1b 100644
--- a/src/modules/savers/edb/Makefile.in
+++ b/src/modules/savers/edb/Makefile.in
@@ -233,6 +233,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/savers/eet/Makefile.in b/src/modules/savers/eet/Makefile.in
index b16b9a2..45128cd 100644
--- a/src/modules/savers/eet/Makefile.in
+++ b/src/modules/savers/eet/Makefile.in
@@ -233,6 +233,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/savers/jpeg/Makefile.in b/src/modules/savers/jpeg/Makefile.in
index 035e0a8..3970352 100644
--- a/src/modules/savers/jpeg/Makefile.in
+++ b/src/modules/savers/jpeg/Makefile.in
@@ -233,6 +233,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/savers/png/Makefile.in b/src/modules/savers/png/Makefile.in
index 765b1de..cc2e3b7 100644
--- a/src/modules/savers/png/Makefile.in
+++ b/src/modules/savers/png/Makefile.in
@@ -233,6 +233,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@
diff --git a/src/modules/savers/tiff/Makefile.in b/src/modules/savers/tiff/Makefile.in
index 9b254da..1816f0e 100644
--- a/src/modules/savers/tiff/Makefile.in
+++ b/src/modules/savers/tiff/Makefile.in
@@ -233,6 +233,8 @@ evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
 evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
 evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
 evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
+evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
+evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
 evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
 evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
 evas_engine_software_x11_cflags = @evas_engine_software_x11_cflags@

-- 
Enlightenment DR17 advanced canvas library



More information about the Pkg-e-commits mailing list