From b0e45e04bce14f2856bf33b3c2430a2bb5d7520c Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Tue, 5 Apr 2011 14:16:18 +0000 Subject: [PATCH] evas: and now, the last one to die today, Evas Xrender backend. SVN revision: 58364 --- legacy/evas/ChangeLog | 2 + legacy/evas/Makefile.am | 10 - legacy/evas/README.in | 17 - legacy/evas/configure.ac | 11 - legacy/evas/evas-xrender-x11.pc.in | 3 - legacy/evas/evas-xrender-xcb.pc.in | 3 - legacy/evas/evas.spec.in | 41 - legacy/evas/src/lib/Makefile.am | 5 - legacy/evas/src/lib/canvas/evas_main.c | 6 - legacy/evas/src/lib/file/evas_module.c | 4 - legacy/evas/src/modules/engines/Makefile.am | 3 - .../modules/engines/xrender_x11/.cvsignore | 6 - .../xrender_x11/Evas_Engine_XRender_X11.h | 44 - .../modules/engines/xrender_x11/Makefile.am | 59 - .../modules/engines/xrender_x11/evas_engine.c | 1328 ----------------- .../modules/engines/xrender_x11/evas_engine.h | 264 ---- .../xrender_x11/evas_engine_xcb_font.c | 208 --- .../xrender_x11/evas_engine_xcb_image.c | 704 --------- .../xrender_x11/evas_engine_xcb_render.c | 841 ----------- .../xrender_x11/evas_engine_xcb_ximage.c | 574 ------- .../xrender_x11/evas_engine_xlib_font.c | 192 --- .../xrender_x11/evas_engine_xlib_image.c | 705 --------- .../xrender_x11/evas_engine_xlib_render.c | 744 --------- .../xrender_x11/evas_engine_xlib_ximage.c | 262 ---- 24 files changed, 2 insertions(+), 6034 deletions(-) delete mode 100644 legacy/evas/evas-xrender-x11.pc.in delete mode 100644 legacy/evas/evas-xrender-xcb.pc.in delete mode 100644 legacy/evas/src/modules/engines/xrender_x11/.cvsignore delete mode 100644 legacy/evas/src/modules/engines/xrender_x11/Evas_Engine_XRender_X11.h delete mode 100644 legacy/evas/src/modules/engines/xrender_x11/Makefile.am delete mode 100644 legacy/evas/src/modules/engines/xrender_x11/evas_engine.c delete mode 100644 legacy/evas/src/modules/engines/xrender_x11/evas_engine.h delete mode 100644 legacy/evas/src/modules/engines/xrender_x11/evas_engine_xcb_font.c delete mode 100644 legacy/evas/src/modules/engines/xrender_x11/evas_engine_xcb_image.c delete mode 100644 legacy/evas/src/modules/engines/xrender_x11/evas_engine_xcb_render.c delete mode 100644 legacy/evas/src/modules/engines/xrender_x11/evas_engine_xcb_ximage.c delete mode 100644 legacy/evas/src/modules/engines/xrender_x11/evas_engine_xlib_font.c delete mode 100644 legacy/evas/src/modules/engines/xrender_x11/evas_engine_xlib_image.c delete mode 100644 legacy/evas/src/modules/engines/xrender_x11/evas_engine_xlib_render.c delete mode 100644 legacy/evas/src/modules/engines/xrender_x11/evas_engine_xlib_ximage.c diff --git a/legacy/evas/ChangeLog b/legacy/evas/ChangeLog index 1e6d1c6fba..dd29848850 100644 --- a/legacy/evas/ChangeLog +++ b/legacy/evas/ChangeLog @@ -214,3 +214,5 @@ * Remove Evas Quartz backend. * Remove Evas Cairo backend. * Remove Evas Qtopia backend. + * Remove Evas Xrender backend. + diff --git a/legacy/evas/Makefile.am b/legacy/evas/Makefile.am index 717203241a..1f44c81fed 100644 --- a/legacy/evas/Makefile.am +++ b/legacy/evas/Makefile.am @@ -40,8 +40,6 @@ evas-software-buffer.pc.in \ evas-software-x11.pc.in \ evas-software-16-x11.pc.in \ evas-software-8-x11.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 \ @@ -86,14 +84,6 @@ if BUILD_ENGINE_GL_SDL pkgconfig_DATA += evas-opengl-sdl.pc endif -if BUILD_ENGINE_XRENDER_X11 -pkgconfig_DATA += evas-xrender-x11.pc -endif - -if BUILD_ENGINE_XRENDER_XCB -pkgconfig_DATA += evas-xrender-xcb.pc -endif - if BUILD_ENGINE_SOFTWARE_GDI pkgconfig_DATA += evas-software-gdi.pc endif diff --git a/legacy/evas/README.in b/legacy/evas/README.in index 1b82c8663b..4625f6869f 100644 --- a/legacy/evas/README.in +++ b/legacy/evas/README.in @@ -19,7 +19,6 @@ Must: Recommended: libX11 libXext - libXrender fontconfig libpng libjpeg @@ -192,22 +191,6 @@ pixels, allowing the results of rendering to be directly read out or used again for other purposes. ---enable-xrender-x11[=static] - -this engine uses the xrender api to do drawing via (possibly) -accelerated 2d or 3d hardware means. as such xrender has never lived -up to its possible performance levels and has fallen into disrepair. -use this engine at your own risk. it is considered to be "bitrotting" -and be unmaintained. - - ---enable-xrender-xcb[=static] - -this is the same as xrender-x11 but uses/exposes an xcb api. It is not -recommended to use this as it's experimental and will create problems -with both ecore_evas and enlightenment itself. - - --enable-gl-x11[=static] this is the opengl engine. it is intended for an x11 target (via xlib) diff --git a/legacy/evas/configure.ac b/legacy/evas/configure.ac index f3e95865b8..2aec86f8e4 100644 --- a/legacy/evas/configure.ac +++ b/legacy/evas/configure.ac @@ -94,11 +94,9 @@ want_evas_cserve="yes" want_evas_engine_buffer="yes" want_evas_engine_software_xlib="no" -want_evas_engine_xrender_x11="no" want_evas_engine_gl_x11="no" want_evas_engine_gl_sdl="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" @@ -152,7 +150,6 @@ case "$host_os" in want_evas_engine_fb="auto" ### no - not ready/usable/complete # want_evas_engine_software_8_x11="auto" -# want_evas_engine_xrender_x11="auto" # want_evas_engine_software_16_x11="auto" ;; esac @@ -578,14 +575,10 @@ EVAS_CHECK_ENGINE([buffer], [${want_evas_engine_buffer}], [yes], [Buffer]) EVAS_CHECK_ENGINE([software-xlib], [${want_evas_engine_software_xlib}], [yes], [Software Xlib]) -EVAS_CHECK_ENGINE([xrender-x11], [${want_evas_engine_xrender_x11}], [yes], [XRender X11]) - EVAS_CHECK_ENGINE([gl-x11], [${want_evas_engine_gl_x11}], [yes], [OpenGL X11]) EVAS_CHECK_ENGINE([software-xcb], [${want_evas_engine_software_xcb}], [no], [Software XCB]) -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]) @@ -1523,8 +1516,6 @@ evas-software-buffer.pc evas-software-x11.pc evas-software-8-x11.pc evas-software-16-x11.pc -evas-xrender-x11.pc -evas-xrender-xcb.pc evas-software-gdi.pc evas-software-ddraw.pc evas-software-16-ddraw.pc @@ -1565,7 +1556,6 @@ src/modules/engines/directfb/Makefile src/modules/engines/gl_common/Makefile src/modules/engines/gl_x11/Makefile src/modules/engines/gl_sdl/Makefile -src/modules/engines/xrender_x11/Makefile src/modules/engines/software_sdl/Makefile src/modules/engines/software_8/Makefile src/modules/engines/software_8_x11/Makefile @@ -1638,7 +1628,6 @@ echo echo "Engines:" echo " Software Memory Buffer.....: $have_evas_engine_buffer" echo " Software X11...............: $have_evas_engine_software_x11 (Xlib: $have_evas_engine_software_xlib) (XCB: $have_evas_engine_software_xcb)" -echo " XRender X11................: $have_evas_engine_xrender_x11 (XCB: $have_evas_engine_xrender_xcb)" echo $ECHO_N " OpenGL X11.................: $have_evas_engine_gl_x11 $ECHO_C" if test "x$have_evas_engine_gl_x11" = "xyes"; then echo "(GLES: $gl_flavor_gles) (SGX: $gles_variety_sgx) (s3c6410: $gles_variety_s3c6410)" diff --git a/legacy/evas/evas-xrender-x11.pc.in b/legacy/evas/evas-xrender-x11.pc.in deleted file mode 100644 index 9d28d1353e..0000000000 --- a/legacy/evas/evas-xrender-x11.pc.in +++ /dev/null @@ -1,3 +0,0 @@ -Name: evas-xrender-x11 -Description: Evas XRender X11 engine -Version: @VERSION@ diff --git a/legacy/evas/evas-xrender-xcb.pc.in b/legacy/evas/evas-xrender-xcb.pc.in deleted file mode 100644 index ba30c43034..0000000000 --- a/legacy/evas/evas-xrender-xcb.pc.in +++ /dev/null @@ -1,3 +0,0 @@ -Name: evas-xrender-xcb -Description: Evas XRender XCB engine -Version: @VERSION@ diff --git a/legacy/evas/evas.spec.in b/legacy/evas/evas.spec.in index 0cfcf54faf..b470e9825f 100644 --- a/legacy/evas/evas.spec.in +++ b/legacy/evas/evas.spec.in @@ -22,8 +22,6 @@ %bcond_with module_engine_software_16_x11 %bcond_with module_engine_software_sdl %bcond_with module_engine_software_xcb -%bcond_with module_engine_xrender_x11 -%bcond_with module_engine_xrender_xcb %bcond_with module_loader_gif %bcond_with module_loader_svg @@ -71,13 +69,11 @@ %define ac_with_module_engine_software-x11 --%{?with_module_engine_software_x11:en}%{!?with_module_engine_software_x11:dis}able-software-x11 %define ac_with_module_engine_buffer --%{?with_module_engine_buffer:en}%{!?with_module_engine_buffer:dis}able-buffer %define ac_with_module_engine_fb --%{?with_module_engine_fb:en}%{!?with_module_engine_fb:dis}able-fb -%define ac_with_module_engine_xrender_x11 --%{?with_module_engine_xrender_x11:en}%{!?with_module_engine_xrender_x11:dis}able-xrender-x11 %define ac_with_module_engine_gl_x11 --%{?with_module_engine_gl_x11:en}%{!?with_module_engine_gl_x11:dis}able-gl-x11 %define ac_with_module_engine_directfb --%{?with_module_engine_directfb:en}%{!?with_module_engine_directfb:dis}able-directfb %define ac_with_module_engine_software_16_x11 --%{?with_module_engine_software_16_x11:en}%{!?with_module_engine_software_16_x11:dis}able-software-16-x11 %define ac_with_module_engine_software_sdl --%{?with_module_engine_software_sdl:en}%{!?with_module_engine_software_sdl:dis}able-sdl %define ac_with_module_engine_software_xcb --%{?with_module_engine_software_xcb:en}%{!?with_module_engine_software_xcb:dis}able-software-xcb -%define ac_with_module_engine_xrender_xcb --%{?with_module_engine_xrender_xcb:en}%{!?with_module_engine_xrender_xcb:dis}able-xrender-xcb %{!?_rel:%{expand:%%global _rel 0.r%(svnversion | sed 's/[^0-9].*$//' || echo 0000)}} @@ -301,18 +297,6 @@ Requires: evas Framebuffer rendering engine module for Evas %endif -%if %{with module_engine_xrender_x11} -%package module_engine_xrender_x11 -Summary: XRender rendering engine module for Evas -Group: System Environment/Libraries -#BuildSuggests: xorg-x11-devel, XFree86-devel, xrender-devel -BuildRequires: libXrender-devel -Requires: evas-module_engine_software_generic -Requires: evas -%description module_engine_xrender_x11 -XRender rendering engine module for Evas -%endif - %if %{with module_engine_gl_x11} %package module_engine_gl_x11 Summary: OpenGL under X11 rendering engine module for Evas @@ -366,17 +350,6 @@ Requires: evas Software XCB X11 rendering engine module for Evas %endif -%if %{with module_engine_xrender_xcb} -%package module_engine_xrender_xcb -Summary: Xrender XCB X11 rendering engine module for Evas -Group: System Environment/Libraries -BuildRequires: libxcb-devel -Requires: evas-module_engine_xrender_x11 -Requires: evas -%description module_engine_xrender_xcb -Xrender XCB X11 rendering engine module for Evas -%endif - %prep %setup -q @@ -399,13 +372,11 @@ Xrender XCB X11 rendering engine module for Evas %{?ac_with_module_engine_software_x11} \ %{?ac_with_module_engine_buffer} \ %{?ac_with_module_engine_fb} \ - %{?ac_with_module_engine_xrender_x11} \ %{?ac_with_module_engine_gl_x11} \ %{?ac_with_module_engine_directfb} \ %{?ac_with_module_engine_software_16_x11} \ %{?ac_with_module_engine_software_sdl} \ %{?ac_with_module_engine_software_xcb} \ - %{?ac_with_module_engine_xrender_xcb} \ $RPM_CONFIGURE_OPTS %{__make} %{?_smp_mflags} %{?mflags} test -x `which doxygen` && /bin/sh gendoc || : @@ -561,12 +532,6 @@ test "x$RPM_BUILD_ROOT" != "x/" && rm -rf $RPM_BUILD_ROOT %{_libdir}/evas/modules/engines/fb/*/module.so %endif -%if %{with module_engine_xrender_x11} -%files module_engine_xrender_x11 -%defattr(-, root, root) -%{_libdir}/evas/modules/engines/xrender_x11/*/module.so -%endif - %if %{with module_engine_gl_x11} %files module_engine_gl_x11 %defattr(-, root, root) @@ -598,10 +563,4 @@ test "x$RPM_BUILD_ROOT" != "x/" && rm -rf $RPM_BUILD_ROOT %{_libdir}/evas/modules/engines/software_xcb/*/module.so %endif -%if %{with module_engine_xrender_xcb} -%files module_engine_xrender_xcb -%defattr(-, root, root) -%{_libdir}/evas/modules/engines/xrender_xcb/*/module.so -%endif - %changelog diff --git a/legacy/evas/src/lib/Makefile.am b/legacy/evas/src/lib/Makefile.am index dbf347c4de..f2f6041fb1 100644 --- a/legacy/evas/src/lib/Makefile.am +++ b/legacy/evas/src/lib/Makefile.am @@ -95,11 +95,6 @@ SUBDIRS += ../modules/engines/software_x11/ EVAS_STATIC_MODULE += ../modules/engines/software_x11/libevas_engine_software_x11.la EVAS_STATIC_LIBADD += @evas_engine_software_xlib_libs@ @evas_engine_software_xcb_libs@ endif -if EVAS_STATIC_BUILD_XRENDER_X11 -SUBDIRS += ../modules/engines/xrender_x11/ -EVAS_STATIC_MODULE += ../modules/engines/xrender_x11/libevas_engine_xrender_x11.la -EVAS_STATIC_LIBADD += @evas_engine_xrender_x11_libs@ @evas_engine_xrender_xcb_libs@ -endif if EVAS_STATIC_BUILD_BMP SUBDIRS += ../modules/loaders/bmp EVAS_STATIC_MODULE += ../modules/loaders/bmp/libevas_loader_bmp.la diff --git a/legacy/evas/src/lib/canvas/evas_main.c b/legacy/evas/src/lib/canvas/evas_main.c index d2d82a174b..7742dc817b 100644 --- a/legacy/evas/src/lib/canvas/evas_main.c +++ b/legacy/evas/src/lib/canvas/evas_main.c @@ -825,12 +825,6 @@ evas_render_method_list(void) #ifdef BUILD_ENGINE_SOFTWARE_X11 methods = eina_list_append(methods, "software_x11"); #endif -#ifdef BUILD_ENGINE_XRENDER_X11 - methods = eina_list_append(methods, "xrender_x11"); -#endif -#ifdef BUILD_ENGINE_XRENDER_XCB - methods = eina_list_append(methods, "xrender_xcb"); -#endif #ifdef BUILD_ENGINE_SOFTWARE_16_X11 methods = eina_list_append(methods, "software_16_x11"); #endif diff --git a/legacy/evas/src/lib/file/evas_module.c b/legacy/evas/src/lib/file/evas_module.c index 3af332c6e1..0c5969f764 100644 --- a/legacy/evas/src/lib/file/evas_module.c +++ b/legacy/evas/src/lib/file/evas_module.c @@ -108,7 +108,6 @@ EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_gdi); EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_generic); EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_sdl); EVAS_EINA_STATIC_MODULE_DEFINE(engine, software_x11); -EVAS_EINA_STATIC_MODULE_DEFINE(engine, xrender_x11); EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, xpm); EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, bmp); EVAS_EINA_STATIC_MODULE_DEFINE(image_loader, tiff); @@ -186,9 +185,6 @@ static const struct { #ifdef EVAS_STATIC_BUILD_SOFTWARE_X11 EVAS_EINA_STATIC_MODULE_USE(engine, software_x11), #endif -#ifdef EVAS_STATIC_BUILD_XRENDER_X11 - EVAS_EINA_STATIC_MODULE_USE(engine, xrender_x11), -#endif #ifdef EVAS_STATIC_BUILD_XPM EVAS_EINA_STATIC_MODULE_USE(image_loader, xpm), #endif diff --git a/legacy/evas/src/modules/engines/Makefile.am b/legacy/evas/src/modules/engines/Makefile.am index e6b8e9aa08..60acbd16cd 100644 --- a/legacy/evas/src/modules/engines/Makefile.am +++ b/legacy/evas/src/modules/engines/Makefile.am @@ -58,7 +58,4 @@ endif if !EVAS_STATIC_BUILD_SOFTWARE_X11 SUBDIRS += software_x11 endif -if !EVAS_STATIC_BUILD_XRENDER_X11 -SUBDIRS += xrender_x11 -endif diff --git a/legacy/evas/src/modules/engines/xrender_x11/.cvsignore b/legacy/evas/src/modules/engines/xrender_x11/.cvsignore deleted file mode 100644 index a51c9665e0..0000000000 --- a/legacy/evas/src/modules/engines/xrender_x11/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -.deps -.libs -Makefile -Makefile.in -*.lo -*.la \ No newline at end of file diff --git a/legacy/evas/src/modules/engines/xrender_x11/Evas_Engine_XRender_X11.h b/legacy/evas/src/modules/engines/xrender_x11/Evas_Engine_XRender_X11.h deleted file mode 100644 index b329ae4334..0000000000 --- a/legacy/evas/src/modules/engines/xrender_x11/Evas_Engine_XRender_X11.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef _EVAS_ENGINE_XRENDER_X11_H -#define _EVAS_ENGINE_XRENDER_X11_H - -#include - -typedef enum -{ - EVAS_ENGINE_INFO_XRENDER_BACKEND_XLIB, - EVAS_ENGINE_INFO_XRENDER_BACKEND_XCB -} Evas_Engine_Info_XRender_Backend; - -typedef struct _Evas_Engine_Info_XRender_X11 Evas_Engine_Info_XRender_X11; - -/* - * Xlib | XCB - * connection | Display * | xcb_connection_t * - * screen | NULL | xcb_screen_t * - * drawable | Drawable | xcb_drawable_t - * mask | Pixmap | xcb_pixmap_t - * visual | Visual * | xcb_visualtype_t * - * colormap | Colormap | xcb_colormap_t - */ - -struct _Evas_Engine_Info_XRender_X11 -{ - /* 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 { - Evas_Engine_Info_XRender_Backend backend; - void *connection; - void *screen; - unsigned int drawable; - unsigned int mask; - void *visual; - unsigned char destination_alpha : 1; - } info; - - /* non-blocking or blocking mode */ - Evas_Engine_Render_Mode render_mode; -}; -#endif diff --git a/legacy/evas/src/modules/engines/xrender_x11/Makefile.am b/legacy/evas/src/modules/engines/xrender_x11/Makefile.am deleted file mode 100644 index 4ad72a721b..0000000000 --- a/legacy/evas/src/modules/engines/xrender_x11/Makefile.am +++ /dev/null @@ -1,59 +0,0 @@ - -MAINTAINERCLEANFILES = Makefile.in - -AM_CPPFLAGS = \ --I. \ --I$(top_srcdir)/src/lib \ --I$(top_srcdir)/src/lib/include \ --I$(top_srcdir)/src/modules/engines \ -@FREETYPE_CFLAGS@ \ -@EINA_CFLAGS@ \ -@evas_engine_xrender_x11_cflags@ \ -@evas_engine_xrender_xcb_cflags@ - -if BUILD_ENGINE_XRENDER_X11 - -XRENDER_X11_SOURCES = \ -evas_engine_xlib_font.c \ -evas_engine_xlib_image.c \ -evas_engine_xlib_render.c \ -evas_engine_xlib_ximage.c \ -evas_engine.c - -if BUILD_ENGINE_XRENDER_XCB - -XRENDER_X11_SOURCES += \ -evas_engine_xcb_font.c \ -evas_engine_xcb_image.c \ -evas_engine_xcb_render.c \ -evas_engine_xcb_ximage.c - -endif - -XRENDER_X11_LIBADD = @evas_engine_xrender_xcb_libs@ @evas_engine_xrender_x11_libs@ - - -includes_HEADERS = Evas_Engine_XRender_X11.h -includesdir = $(includedir)/evas-@VMAJ@ - -if !EVAS_STATIC_BUILD_XRENDER_X11 - -pkgdir = $(libdir)/evas/modules/engines/xrender_x11/$(MODULE_ARCH) -pkg_LTLIBRARIES = module.la - -module_la_SOURCES = $(XRENDER_X11_SOURCES) -module_la_LIBADD = $(top_builddir)/src/lib/libevas.la @EINA_LIBS@ $(XRENDER_X11_LIBADD) -module_la_LDFLAGS = -no-undefined -module -avoid-version -module_la_LIBTOOLFLAGS = --tag=disable-static - -else - -noinst_LTLIBRARIES = libevas_engine_xrender_x11.la - -libevas_engine_xrender_x11_la_SOURCES = $(XRENDER_X11_SOURCES) -libevas_engine_xrender_x11_la_LIBADD = $(XRENDER_X11_LIBADD) - -endif -endif - -EXTRA_DIST = evas_engine.h diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine.c deleted file mode 100644 index b7efa97253..0000000000 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine.c +++ /dev/null @@ -1,1328 +0,0 @@ -#include "evas_common.h" /* Also includes international specific stuff */ -#include "evas_private.h" - -#include "Evas_Engine_XRender_X11.h" - -#include "evas_engine.h" -int _evas_xrender_xcb_log_dom = -1; -/* function tables - filled in later (func and parent func) */ -static Evas_Func func, pfunc; - -#ifdef BUILD_ENGINE_SOFTWARE_XLIB -struct xrdb_user -{ - time_t last_stat; - time_t last_mtime; - XrmDatabase db; -}; -static struct xrdb_user xrdb_user = {0, 0, NULL}; - -static Eina_Bool -xrdb_user_query(const char *name, const char *cls, char **type, XrmValue *val) -{ - time_t last = xrdb_user.last_stat, now = time(NULL); - - xrdb_user.last_stat = now; - if (last != now) /* don't stat() more than once every second */ - { - struct stat st; - const char *home = getenv("HOME"); - char tmp[PATH_MAX]; - - if (!home) goto failed; - snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home); - if (stat(tmp, &st) != 0) goto failed; - if (xrdb_user.last_mtime != st.st_mtime) - { - if (xrdb_user.db) XrmDestroyDatabase(xrdb_user.db); - xrdb_user.db = XrmGetFileDatabase(tmp); - if (!xrdb_user.db) goto failed; - xrdb_user.last_mtime = st.st_mtime; - } - } - - if (!xrdb_user.db) return EINA_FALSE; - return XrmGetResource(xrdb_user.db, name, cls, type, val); - - failed: - if (xrdb_user.db) - { - XrmDestroyDatabase(xrdb_user.db); - xrdb_user.db = NULL; - } - xrdb_user.last_mtime = 0; - return EINA_FALSE; -} -#endif - -/* engine struct data */ -typedef struct _Render_Engine Render_Engine; -typedef struct _Render_Engine_Update Render_Engine_Update; - -struct _Render_Engine_Update -{ - int x, y, w, h; - Xrender_Surface *surface; -}; - -struct _Render_Engine -{ - struct { - void *connection; - void *screen; - unsigned int window; - unsigned int mask; - void *visual; - void (*sync) (Render_Engine *re); - } x11; - unsigned char destination_alpha : 1; - -#ifdef BUILD_ENGINE_XRENDER_X11 - XrmDatabase xrdb; // xres - dpi - struct { // xres - dpi - int dpi; // xres - dpi - } xr; // xres - dpi -#endif - - Ximage_Info *xinf; - Xrender_Surface *output; - Xrender_Surface *mask_output; - - Tilebuf *tb; - Tilebuf_Rect *rects; - Eina_Inlist *cur_rect; - int end : 1; - - Eina_List *updates; - - XR_Font_Surface *(*font_surface_new)(Ximage_Info *xinf, RGBA_Font_Glyph *fg); - void (*font_surface_free)(XR_Font_Surface *fs); - void (*font_surface_draw)(Ximage_Info *xinf, RGBA_Image *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y); - - XR_Image *(*image_load)(Ximage_Info *xinf, const char *file, const char *key, Evas_Image_Load_Opts *lo, int *error); - XR_Image *(*image_new_from_data)(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace); - XR_Image *(*image_new_from_copied_data)(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace); - XR_Image *(*image_new)(Ximage_Info *xinf, int w, int h); - void (*image_resize)(XR_Image *im, int w, int h); - void (*image_free)(XR_Image *im); - void (*image_region_dirty)(XR_Image *im, int x, int y, int w, int h); - void (*image_dirty)(XR_Image *im); - XR_Image *(*image_copy)(XR_Image *im); - void *(*image_data_get)(XR_Image *im); - XR_Image *(*image_data_find)(void *data); - void (*image_data_put)(XR_Image *im, void *data); - void (*image_alpha_set)(XR_Image *im, int alpha); - int (*image_alpha_get)(XR_Image *im); - void (*image_border_set)(XR_Image *im, int l, int r, int t, int b); - void (*image_border_get)(XR_Image *im, int *l, int *r, int *t, int *b); - void (*image_surface_gen)(XR_Image *im); - void (*image_cache_set)(int size); - int (*image_cache_get)(void); - - Ximage_Info *(*ximage_info_get)(Display *connection, Drawable draw, Visual *vis); - void (*ximage_info_free)(Ximage_Info *xinf); - void (*ximage_info_pool_flush)(Ximage_Info *xinf, unsigned int max_num, unsigned int max_mem); - Ximage_Image *(*ximage_new)(Ximage_Info *xinf, int w, int h, int depth); - void (*ximage_free)(Ximage_Image *xim); - void (*ximage_put)(Ximage_Image *xim, Drawable draw, int x, int y, int w, int h); - - Xrender_Surface *(*render_surface_new)(Ximage_Info *xinf, int w, int h, XRenderPictFormat *fmt, int alpha); - Xrender_Surface *(*render_surface_adopt)(Ximage_Info *xinf, Drawable draw, int w, int h, int alpha); - Xrender_Surface *(*render_surface_format_adopt)(Ximage_Info *xinf, Drawable draw, int w, int h, XRenderPictFormat *fmt, int alpha); - void (*render_surface_free)(Xrender_Surface *rs); - void (*render_surface_repeat_set)(Xrender_Surface *rs, int repeat); - void (*render_surface_solid_rectangle_set)(Xrender_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h); - void (*render_surface_argb_pixels_fill)(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy); - void (*render_surface_rgb_pixels_fill)(Xrender_Surface *rs, int sw, int sh __UNUSED__, void *pixels, int x, int y, int w, int h, int ox, int oy); - void (*render_surface_clips_set)(Xrender_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh); - void (*render_surface_composite)(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth); - void (*render_surface_copy)(Xrender_Surface *srs, Xrender_Surface *drs, int sx, int sy, int x, int y, int w, int h); - void (*render_surface_rectangle_draw)(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h); - void (*render_surface_line_draw)(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2); - void (*render_surface_polygon_draw)(Xrender_Surface *rs, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y); -}; - -/* internal engine routines */ - -#ifdef BUILD_ENGINE_XRENDER_X11 - -static void -_xlib_sync(Render_Engine *re) -{ - XSync((Display *)re->x11.connection, False); -} - -static Render_Engine * -_output_xlib_setup(int width, - int height, - unsigned char destination_alpha, - void *connection, - unsigned int draw, - unsigned int mask, - void *visual) -{ - Render_Engine *re; - - re = calloc(1, sizeof(Render_Engine)); - if (!re) - return NULL; - - re->x11.connection = connection; - re->x11.screen = NULL; - re->x11.window = draw; - re->x11.mask = mask; - re->x11.visual = visual; - - if (re->xinf) _xr_xlib_image_info_free(re->xinf); - re->xinf = _xr_xlib_image_info_get((Display *)re->x11.connection, (Drawable)re->x11.window, (Visual *)re->x11.visual); - - if (!re->x11.mask) - re->output = _xr_xlib_render_surface_adopt(re->xinf, (Drawable)re->x11.window, width, height, destination_alpha); - else - re->output = _xr_xlib_render_surface_adopt(re->xinf, (Drawable)re->x11.window, width, height, 0); - if (re->x11.mask) - re->mask_output = _xr_xlib_render_surface_format_adopt(re->xinf, - (Drawable)re->x11.mask, - width, height, - re->xinf->x11.fmt1, 1); - else - re->mask_output = NULL; - -// if (re->output) _xr_xlib_render_surface_free(re->output); -// if (re->mask_output) _xr_xlib_render_surface_free(re->mask_output); - - re->x11.sync = _xlib_sync; - - re->font_surface_new = _xre_xlib_font_surface_new; - re->font_surface_free = _xre_xlib_font_surface_free; - re->font_surface_draw = _xre_xlib_font_surface_draw; - - re->image_load = _xre_xlib_image_load; - re->image_new_from_data = _xre_xlib_image_new_from_data; - re->image_new_from_copied_data = _xre_xlib_image_new_from_copied_data; - re->image_new = _xre_xlib_image_new; - re->image_resize = _xre_xlib_image_resize; - re->image_free = _xre_xlib_image_free; - re->image_region_dirty = _xre_xlib_image_region_dirty; - re->image_dirty = _xre_xlib_image_dirty; - re->image_copy = _xre_xlib_image_copy; - re->image_data_get = _xre_xlib_image_data_get; - re->image_data_find = _xre_xlib_image_data_find; - re->image_data_put = _xre_xlib_image_data_put; - re->image_alpha_set = _xre_xlib_image_alpha_set; - re->image_alpha_get = _xre_xlib_image_alpha_get; - re->image_border_set = _xre_xlib_image_border_set; - re->image_border_get = _xre_xlib_image_border_get; - re->image_surface_gen = _xre_xlib_image_surface_gen; - re->image_cache_set = _xre_xlib_image_cache_set; - re->image_cache_get = _xre_xlib_image_cache_get; - - re->ximage_info_get = _xr_xlib_image_info_get; - re->ximage_info_free = _xr_xlib_image_info_free; - re->ximage_info_pool_flush = _xr_xlib_image_info_pool_flush; - re->ximage_new = _xr_xlib_image_new; - re->ximage_free = _xr_xlib_image_free; - re->ximage_put = _xr_xlib_image_put; - - re->render_surface_new = _xr_xlib_render_surface_new; - re->render_surface_adopt = _xr_xlib_render_surface_adopt; - re->render_surface_format_adopt = _xr_xlib_render_surface_format_adopt; - re->render_surface_free = _xr_xlib_render_surface_free; - re->render_surface_repeat_set = _xr_xlib_render_surface_repeat_set; - re->render_surface_solid_rectangle_set = _xr_xlib_render_surface_solid_rectangle_set; - re->render_surface_argb_pixels_fill = _xr_xlib_render_surface_argb_pixels_fill; - re->render_surface_rgb_pixels_fill = _xr_xlib_render_surface_rgb_pixels_fill; - re->render_surface_clips_set = _xr_xlib_render_surface_clips_set; - re->render_surface_composite = _xr_xlib_render_surface_composite; - re->render_surface_copy = _xr_xlib_render_surface_copy; - re->render_surface_rectangle_draw = _xr_xlib_render_surface_rectangle_draw; - re->render_surface_line_draw = _xr_xlib_render_surface_line_draw; - re->render_surface_polygon_draw = _xr_xlib_render_surface_polygon_draw; - - { - int status; - char *type = NULL; - XrmValue val; - - re->xr.dpi = 75000; // dpy * 1000 - - status = xrdb_user_query("Xft.dpi", "Xft.Dpi", &type, &val); - if ((!status) || (!type)) - { - if (!re->xrdb) - re->xrdb = XrmGetDatabase((Display *)re->x11.connection); - if (re->xrdb) - status = XrmGetResource(re->xrdb, - "Xft.dpi", "Xft.Dpi", &type, &val); - } - - if ((status) && (type)) - { - if (!strcmp(type, "String")) - { - const char *str, *dp; - - str = val.addr; - dp = strchr(str, '.'); - if (!dp) dp = strchr(str, ','); - - if (dp) - { - int subdpi, len, i; - char *buf; - - buf = alloca(dp - str + 1); - strncpy(buf, str, dp - str); - buf[dp - str] = 0; - len = strlen(dp + 1); - subdpi = atoi(dp + 1); - - if (len < 3) - { - for (i = len; i < 3; i++) subdpi *= 10; - } - else if (len > 3) - { - for (i = len; i > 3; i--) subdpi /= 10; - } - re->xr.dpi = atoi(buf) * 1000; - } - else - re->xr.dpi = atoi(str) * 1000; - evas_common_font_dpi_set(re->xr.dpi / 1000); - } - } - } - - return re; -} - -#endif /* BUILD_ENGINE_XRENDER_X11 */ - -#ifdef BUILD_ENGINE_XRENDER_XCB - -static void -_xcb_sync(Render_Engine *re) -{ - xcb_get_input_focus_reply_t *reply; - - reply = xcb_get_input_focus_reply(re->x11.connection, - xcb_get_input_focus_unchecked(re->x11.connection), - NULL); - if (reply) - free(reply); -} - -static Render_Engine * -_output_xcb_setup(int width, - int height, - unsigned char destination_alpha, - void *connection, - void *screen, - unsigned int draw, - unsigned int mask, - void *visual) -{ - Render_Engine *re; - - re = calloc(1, sizeof(Render_Engine)); - if (!re) - return NULL; - - re->x11.connection = connection; - re->x11.screen = screen; - re->x11.window = draw; - re->x11.mask = mask; - re->x11.visual = visual; - - if (re->xinf) _xr_xcb_image_info_free(re->xinf); - re->xinf = _xr_xcb_image_info_get((xcb_connection_t *)re->x11.connection, (xcb_screen_t *)re->x11.screen, (xcb_drawable_t)re->x11.window, (xcb_visualtype_t *)re->x11.visual); - - if (!re->x11.mask) - re->output = _xr_xcb_render_surface_adopt(re->xinf, (Drawable)re->x11.window, width, height, destination_alpha); - else - re->output = _xr_xcb_render_surface_adopt(re->xinf, (Drawable)re->x11.window, width, height, 0); - if (re->x11.mask) - re->mask_output = _xr_xcb_render_surface_format_adopt(re->xinf, - (Drawable)re->x11.mask, - width, height, - re->xinf->x11.fmt1, 1); - else - re->mask_output = NULL; - - if (re->output) _xr_xcb_render_surface_free(re->output); - if (re->mask_output) _xr_xcb_render_surface_free(re->mask_output); - - re->x11.sync = _xcb_sync; - - re->font_surface_new = _xre_xcb_font_surface_new; - re->font_surface_free = _xre_xcb_font_surface_free; - re->font_surface_draw = _xre_xcb_font_surface_draw; - - re->image_load = _xre_xcb_image_load; - re->image_new_from_data = _xre_xcb_image_new_from_data; - re->image_new_from_copied_data = _xre_xcb_image_new_from_copied_data; - re->image_new = _xre_xcb_image_new; - re->image_resize = _xre_xcb_image_resize; - re->image_free = _xre_xcb_image_free; - re->image_region_dirty = _xre_xcb_image_region_dirty; - re->image_dirty = _xre_xcb_image_dirty; - re->image_copy = _xre_xcb_image_copy; - re->image_data_get = _xre_xcb_image_data_get; - re->image_data_find = _xre_xcb_image_data_find; - re->image_data_put = _xre_xcb_image_data_put; - re->image_alpha_set = _xre_xcb_image_alpha_set; - re->image_alpha_get = _xre_xcb_image_alpha_get; - re->image_border_set = _xre_xcb_image_border_set; - re->image_border_get = _xre_xcb_image_border_get; - re->image_surface_gen = _xre_xcb_image_surface_gen; - re->image_cache_set = _xre_xcb_image_cache_set; - re->image_cache_get = _xre_xcb_image_cache_get; - - re->ximage_info_get = _xr_xcb_image_info_get; - re->ximage_info_free = _xr_xcb_image_info_free; - re->ximage_info_pool_flush = _xr_xcb_image_info_pool_flush; - re->ximage_new = _xr_xcb_image_new; - re->ximage_free = _xr_xcb_image_free; - re->ximage_put = _xr_xcb_image_put; - - re->render_surface_new = _xr_xcb_render_surface_new; - re->render_surface_adopt = _xr_xcb_render_surface_adopt; - re->render_surface_format_adopt = _xr_xcb_render_surface_format_adopt; - re->render_surface_free = _xr_xcb_render_surface_free; - re->render_surface_repeat_set = _xr_xcb_render_surface_repeat_set; - re->render_surface_solid_rectangle_set = _xr_xcb_render_surface_solid_rectangle_set; - re->render_surface_argb_pixels_fill = _xr_xcb_render_surface_argb_pixels_fill; - re->render_surface_rgb_pixels_fill = _xr_xcb_render_surface_rgb_pixels_fill; - re->render_surface_clips_set = _xr_xcb_render_surface_clips_set; - re->render_surface_composite = _xr_xcb_render_surface_composite; - re->render_surface_copy = _xr_xcb_render_surface_copy; - re->render_surface_rectangle_draw = _xr_xcb_render_surface_rectangle_draw; - re->render_surface_line_draw = _xr_xcb_render_surface_line_draw; - re->render_surface_polygon_draw = _xr_xcb_render_surface_polygon_draw; - - return re; -} - -#endif /* BUILD_ENGINE_XRENDER_XCB */ - -/* engine api this module provides */ -static void * -eng_info(Evas *e __UNUSED__) -{ - Evas_Engine_Info_XRender_X11 *info; - info = calloc(1, sizeof(Evas_Engine_Info_XRender_X11)); - if (!info) return NULL; - info->magic.magic = rand(); - info->render_mode = EVAS_RENDER_MODE_BLOCKING; - return info; -} - -static void -eng_info_free(Evas *e __UNUSED__, void *info) -{ - Evas_Engine_Info_XRender_X11 *in; - in = (Evas_Engine_Info_XRender_X11 *)info; - free(in); -} - -static int -eng_setup(Evas *e, void *in) -{ - Render_Engine *re = NULL; - Evas_Engine_Info_XRender_X11 *info; - int resize = 1; - - info = (Evas_Engine_Info_XRender_X11 *)in; - if (!e->engine.data.output) - { - evas_common_cpu_init(); - evas_common_blend_init(); - evas_common_image_init(); - evas_common_convert_init(); - evas_common_scale_init(); - evas_common_rectangle_init(); - evas_common_polygon_init(); - evas_common_line_init(); - evas_common_font_init(); - evas_common_draw_init(); - evas_common_tilebuf_init(); - -#ifdef BUILD_ENGINE_XRENDER_X11 - if (info->info.backend == 0) - { - re = _output_xlib_setup(e->output.w, - e->output.h, - info->info.destination_alpha, - info->info.connection, - info->info.drawable, - info->info.mask, - info->info.visual); - } -#endif /* BUILD_ENGINE_XRENDER_X11 */ - -#ifdef BUILD_ENGINE_XRENDER_XCB - if (info->info.backend == 1) - { - re = _output_xcb_setup(e->output.w, - e->output.h, - info->info.destination_alpha, - info->info.connection, - info->info.screen, - info->info.drawable, - info->info.mask, - info->info.visual); - } -#endif /* BUILD_ENGINE_XRENDER_XCB */ - - if (!re) - return 0; - - re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); - if (re->tb) - evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); - e->engine.data.output = re; - resize = 0; - } - re = e->engine.data.output; - if (!re) return 0; - - if (!e->engine.data.context) e->engine.data.context = e->engine.func->context_new(e->engine.data.output); - - if (resize) - { - if (re->tb) evas_common_tilebuf_free(re->tb); - if ((e->output.w > 0) && (e->output.h > 0)) - re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); - else - re->tb = evas_common_tilebuf_new(1, 1); - if (re->tb) - evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); - } - - return 1; -} - -static void -eng_output_free(void *data) -{ - Render_Engine *re; - - re = (Render_Engine *)data; - -#ifdef BUILD_ENGINE_XRENDER_X11 -// NOTE: XrmGetDatabase() result is shared per connection, do not free it. -// if (re->xrdb) XrmDestroyDatabase(re->xrdb); -#endif - - evas_common_font_shutdown(); - evas_common_image_shutdown(); - while (re->updates) - { - Render_Engine_Update *reu; - - reu = re->updates->data; - re->updates = eina_list_remove_list(re->updates, re->updates); - re->render_surface_free(reu->surface); - free(reu); - } - if (re->tb) evas_common_tilebuf_free(re->tb); - if (re->output) re->render_surface_free(re->output); - if (re->mask_output) re->render_surface_free(re->mask_output); - if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); - if (re->xinf) re->ximage_info_free(re->xinf); - free(re); -} - -static void -eng_output_resize(void *data, int w, int h) -{ - Render_Engine *re; - - re = (Render_Engine *)data; - if (re->output) - { - if ((re->output->width == w) && (re->output->height == h)) return; - if (re->output) re->render_surface_free(re->output); - } - re->output = re->render_surface_adopt(re->xinf, re->x11.window, w, h, 0); - if (re->mask_output) - { - if (re->mask_output) re->render_surface_free(re->mask_output); - re->mask_output = re->render_surface_format_adopt(re->xinf, - re->x11.mask, - w, h, - re->xinf->x11.fmt1, 1); - } - evas_common_tilebuf_free(re->tb); - re->tb = evas_common_tilebuf_new(w, h); - if (re->tb) evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); -} - -static void -eng_output_tile_size_set(void *data, int w, int h) -{ - Render_Engine *re; - - re = (Render_Engine *)data; - evas_common_tilebuf_set_tile_size(re->tb, w, h); -} - -static void -eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) -{ - Render_Engine *re; - - re = (Render_Engine *)data; - evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); -} - -static void -eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) -{ - Render_Engine *re; - - re = (Render_Engine *)data; - evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); -} - -static void -eng_output_redraws_clear(void *data) -{ - Render_Engine *re; - - re = (Render_Engine *)data; - evas_common_tilebuf_clear(re->tb); -} - -static void * -eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) -{ - Render_Engine *re; - Tilebuf_Rect *rect; - int ux, uy, uw, uh; - - re = (Render_Engine *)data; - if (re->end) - { - re->end = 0; - return NULL; - } - if (!re->rects) - { - re->rects = evas_common_tilebuf_get_render_rects(re->tb); - re->cur_rect = EINA_INLIST_GET(re->rects); - } - if (!re->cur_rect) return NULL; - rect = (Tilebuf_Rect *)re->cur_rect; - ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h; - re->cur_rect = re->cur_rect->next; - if (!re->cur_rect) - { - evas_common_tilebuf_free_render_rects(re->rects); - re->rects = NULL; - re->end = 1; - } - - *x = ux; *y = uy; *w = uw; *h = uh; - *cx = 0; *cy = 0; *cw = uw; *ch = uh; -// use target format to avoid conversion to depth when copying to screen -// return _xr_render_surface_new(re->xinf, uw, uh, re->xinf->fmtdef, 0); -// use 24/32bpp for tmp buf for better quality. rendering in 24/32bpp - return re->render_surface_new(re->xinf, uw, uh, re->xinf->x11.fmt24, 0); -} - -static void -eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) -{ - Render_Engine *re; - Render_Engine_Update *reu; - - re = (Render_Engine *)data; - reu = malloc(sizeof(Render_Engine_Update)); - if (!reu) return; - reu->x = x; - reu->y = y; - reu->w = w; - reu->h = h; - reu->surface = (Xrender_Surface *)surface; - re->updates = eina_list_append(re->updates, reu); -} - -static void -eng_output_flush(void *data) -{ - Render_Engine *re; - - re = (Render_Engine *)data; - while (re->updates) - { - Render_Engine_Update *reu; - - reu = re->updates->data; - re->updates = eina_list_remove_list(re->updates, re->updates); - if (re->mask_output) - { - Xrender_Surface *tsurf; - - re->render_surface_copy(reu->surface, re->output, 0, 0, - reu->x, reu->y, reu->w, reu->h); - tsurf = re->render_surface_new(re->xinf, reu->w, reu->h, re->xinf->x11.fmt1, 1); - if (tsurf) - { - re->render_surface_copy(reu->surface, tsurf, 0, 0, - 0, 0, reu->w, reu->h); - re->render_surface_copy(tsurf, re->mask_output, 0, 0, - reu->x, reu->y, reu->w, reu->h); - re->render_surface_free(tsurf); - } - } - else - { - re->render_surface_copy(reu->surface, re->output, 0, 0, - reu->x, reu->y, reu->w, reu->h); - } - re->render_surface_free(reu->surface); - free(reu); - } - re->x11.sync(re); - re->ximage_info_pool_flush(re->xinf, 0, 0); -} - -static void -eng_output_idle_flush(void *data) -{ - Render_Engine *re; - - re = (Render_Engine *)data; -} - -static void -eng_output_dump(void *data) -{ - Render_Engine *re; - - re = (Render_Engine *)data; - evas_common_image_image_all_unload(); - evas_common_font_font_all_unload(); - // FIXME: kill pixmaps too - but... xrender engine is dead... no? :):) -} - -static void -eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h) -{ - Render_Engine *re; - - re = (Render_Engine *)data; - - re->render_surface_rectangle_draw((Xrender_Surface *)surface, - (RGBA_Draw_Context *)context, - x, y, w, h); -} - -static void -eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2) -{ - Render_Engine *re; - - re = (Render_Engine *)data; - - re->render_surface_line_draw((Xrender_Surface *)surface, (RGBA_Draw_Context *)context, x1, y1, x2, y2); -} - -static void -eng_polygon_draw(void *data, void *context, void *surface, void *polygon, int x, int y) -{ - Render_Engine *re; - - re = (Render_Engine *)data; - - re->render_surface_polygon_draw((Xrender_Surface *)surface, (RGBA_Draw_Context *)context, (RGBA_Polygon_Point *)polygon, x, y); -} - -static int -eng_image_alpha_get(void *data, void *image) -{ - Render_Engine *re; - - if (!image) return 0; - - re = (Render_Engine *)data; - return re->image_alpha_get((XR_Image *)image); -} - -static int -eng_image_colorspace_get(void *data __UNUSED__, void *image) -{ - if (!image) return EVAS_COLORSPACE_ARGB8888; - return ((XR_Image *)image)->cs.space; -} - -static void * -eng_image_alpha_set(void *data, void *image, int has_alpha) -{ - Render_Engine *re; - XR_Image *im; - - im = (XR_Image *)image; - if (!im) return im; - if (im->cs.space != EVAS_COLORSPACE_ARGB8888) return im; - if (((im->alpha) && (has_alpha)) || ((!im->alpha) && (!has_alpha))) - return im; - re = (Render_Engine *)data; - if (im->references > 1) - { - XR_Image *old_im; - - old_im = im; - im = re->image_copy(old_im); - if (im) - { - im->alpha = old_im->alpha; - re->image_free(old_im); - } - else - im = old_im; - } - else - re->image_dirty(im); - re->image_alpha_set(im, has_alpha); - return im; -} - -static void * -eng_image_border_set(void *data, void *image, int l, int r, int t, int b) -{ - Render_Engine *re; - - if (!image) return image; - re = (Render_Engine *)data; - re->image_border_set((XR_Image *)image, l, r, t, b); - return image; -} - -static void -eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b) -{ - Render_Engine *re; - - if (!image) return; - re = (Render_Engine *)data; - re->image_border_get((XR_Image *)image, l, r, t, b); -} - -static char * -eng_image_comment_get(void *data __UNUSED__, void *image, char *key __UNUSED__) -{ - if (!image) return NULL; - return strdup(((XR_Image *)image)->comment); -} - -static char * -eng_image_format_get(void *data __UNUSED__, void *image) -{ - if (!image) return NULL; - return ((XR_Image *)image)->format; -} - -static void -eng_image_colorspace_set(void *data, void *image, int cspace) -{ - Render_Engine *re; - XR_Image *im; - - if (!image) return; - im = (XR_Image *)image; - if (im->cs.space == cspace) return; - - if (im->im) evas_cache_image_drop(&im->im->cache_entry); - im->im = NULL; - - re = (Render_Engine *)data; - switch (cspace) - { - case EVAS_COLORSPACE_ARGB8888: - if (im->cs.data) - { - if (!im->cs.no_free) free(im->cs.data); - im->cs.data = NULL; - im->cs.no_free = 0; - } - break; - case EVAS_COLORSPACE_YCBCR422P601_PL: - case EVAS_COLORSPACE_YCBCR422P709_PL: - if ((im->free_data) && (im->data)) free(im->data); - im->data = NULL; - if (im->cs.data) - { - if (!im->cs.no_free) free(im->cs.data); - } - if (im->h > 0) - im->cs.data = calloc(1, im->h * sizeof(unsigned char *) * 2); - im->cs.no_free = 0; - break; - default: - abort(); - break; - } - im->cs.space = cspace; - re->image_dirty(im); - re->image_region_dirty(im, 0, 0, im->w, im->h); -} - -static void * -eng_image_native_set(void *data __UNUSED__, void *image __UNUSED__, void *native __UNUSED__) -{ - return NULL; -} - -static void * -eng_image_native_get(void *data __UNUSED__, void *image __UNUSED__) -{ - return NULL; -} - -static void * -eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo) -{ - Render_Engine *re; - XR_Image *im; - - re = (Render_Engine *)data; - *error = 0; - im = re->image_load(re->xinf, file, key, lo, error); - return im; -} - -static void * -eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace) -{ - Render_Engine *re; - XR_Image *im; - - re = (Render_Engine *)data; - im = re->image_new_from_data(re->xinf, w, h, image_data, alpha, cspace); - return im; -} - -static void * -eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace) -{ - Render_Engine *re; - XR_Image *im; - - re = (Render_Engine *)data; - im = re->image_new_from_copied_data(re->xinf, w, h, image_data, alpha, cspace); - return im; -} - -static void -eng_image_free(void *data, void *image) -{ - Render_Engine *re; - - if (!image) return; - re = (Render_Engine *)data; - re->image_free((XR_Image *)image); -} - -static void -eng_image_size_get(void *data __UNUSED__, void *image, int *w, int *h) -{ - if (!image) return; - if (w) *w = ((XR_Image *)image)->w; - if (h) *h = ((XR_Image *)image)->h; -} - -static void * -eng_image_size_set(void *data, void *image, int w, int h) -{ - Render_Engine *re; - XR_Image *im, *im_old; - - if (!image) return NULL; - re = (Render_Engine *)data; - im_old = image; - if ((im_old->cs.space == EVAS_COLORSPACE_YCBCR422P601_PL) || - (im_old->cs.space == EVAS_COLORSPACE_YCBCR422P709_PL)) - w &= ~0x1; - if ((im_old) && (im_old->w == w) && (im_old->h == h)) - return image; - if ((w <= 0) || (h <= 0)) - { - re->image_free(im_old); - return NULL; - } - if (im_old) - { - im = re->image_new_from_copied_data(im_old->xinf, w, h, NULL, im_old->alpha, im_old->cs.space); - re->image_free(im_old); - return im; - } - return image; -} - -static void * -eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h) -{ - Render_Engine *re; - - if (!image) return image; - re = (Render_Engine *)data; - re->image_dirty((XR_Image *)image); - re->image_region_dirty((XR_Image *)image, x, y, w, h); - return image; -} - -static void * -eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data) -{ - Render_Engine *re; - XR_Image *im; - - if (!image) - { - *image_data = NULL; - return NULL; - } - re = (Render_Engine *)data; - im = (XR_Image *)image; - if (im->im) - evas_cache_image_load_data(&im->im->cache_entry); - switch (im->cs.space) - { - case EVAS_COLORSPACE_ARGB8888: - if (to_write) - { - if (im->references > 1) - { - XR_Image *im_old; - - im_old = im; - im = re->image_copy(im_old); - if (im) - re->image_free(im_old); - else - im = im_old; - } - else - re->image_dirty(im); - } - break; - case EVAS_COLORSPACE_YCBCR422P601_PL: - case EVAS_COLORSPACE_YCBCR422P709_PL: - break; - default: - abort(); - break; - } - if (image_data) *image_data = re->image_data_get(im); - return im; -} - -static void * -eng_image_data_put(void *data, void *image, DATA32 *image_data) -{ - Render_Engine *re; - XR_Image *im; - - if (!image) return image; - re = (Render_Engine *)data; - im = (XR_Image *)image; - - switch (im->cs.space) - { - case EVAS_COLORSPACE_ARGB8888: - if (re->image_data_get(im) != image_data) - { - XR_Image *im_old; - - im_old = im; - image = re->image_data_find(image_data); - if (image != im_old) - { - if (!image) - { - image = re->image_new_from_data(im_old->xinf, im_old->w, im_old->h, image_data, im_old->alpha, EVAS_COLORSPACE_ARGB8888); - if (image) - { - ((XR_Image *)image)->alpha = im_old->alpha; - re->image_free(im_old); - } - else - image = im_old; - } - else - { - re->image_free(im_old); - } - } - else - { - re->image_free(image); - image = im_old; - } - } - break; - case EVAS_COLORSPACE_YCBCR422P601_PL: - case EVAS_COLORSPACE_YCBCR422P709_PL: - if (re->image_data_get(im) != image_data) - { - if (im->data) - { - if (im->free_data) free(im->data); - im->data = NULL; - } - if (im->cs.data) - { - if (!im->cs.no_free) free(im->cs.data); - } - im->cs.data = image_data; - re->image_dirty(im); - } - break; - default: - abort(); - break; - } - return image; -} - -static void -eng_image_data_preload_request(void *data __UNUSED__, void *image, const void *target) -{ - XR_Image *xim = image; - RGBA_Image *im; - - if (!xim) return ; - im = (RGBA_Image*) xim->im; - if (!im) return ; - evas_cache_image_preload_data(&im->cache_entry, target); -} - -static void -eng_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *target) -{ - XR_Image *xim = image; - RGBA_Image *im; - - if (!xim) return ; - im = (RGBA_Image*) xim->im; - if (!im) return ; - evas_cache_image_preload_cancel(&im->cache_entry, target); -} - -static void -eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth) -{ - Render_Engine *re; - - if ((!image) || (!surface)) return; - - re = (Render_Engine *)data; - re->image_surface_gen((XR_Image *)image); - if (((XR_Image *)image)->surface) - re->render_surface_composite(((XR_Image *)image)->surface, - (Xrender_Surface *)surface, - (RGBA_Draw_Context *)context, - src_x, src_y, src_w, src_h, - dst_x, dst_y, dst_w, dst_h, - smooth); -} - -static void -eng_image_scale_hint_set(void *data __UNUSED__, void *image __UNUSED__, int hint __UNUSED__) -{ -} - -static int -eng_image_scale_hint_get(void *data __UNUSED__, void *image __UNUSED__) -{ - return EVAS_IMAGE_SCALE_HINT_NONE; -} - - -static void -eng_image_cache_flush(void *data) -{ - Render_Engine *re; - int tmp_size; - - re = (Render_Engine *)data; - tmp_size = re->image_cache_get(); - pfunc.image_cache_flush(data); - re->image_cache_set(0); - re->image_cache_set(tmp_size); -} - -static void -eng_image_cache_set(void *data, int bytes) -{ - Render_Engine *re; - - re = (Render_Engine *)data; - pfunc.image_cache_set(data, bytes); - re->image_cache_set(bytes); -} - -static int -eng_image_cache_get(void *data) -{ - return pfunc.image_cache_get(data); -} - -static void -eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow __UNUSED__, int oh __UNUSED__, const Eina_Unicode *text, const Evas_Text_Props *intl_props) -{ - Render_Engine *re; - RGBA_Image *im; - - re = (Render_Engine *)data; - - re->render_surface_clips_set((Xrender_Surface *)surface, (RGBA_Draw_Context *)context, x, y, w, h); - - im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), - ((Xrender_Surface *)surface)->width, - ((Xrender_Surface *)surface)->height, - surface, - 0, EVAS_COLORSPACE_ARGB8888); - evas_common_draw_context_font_ext_set((RGBA_Draw_Context *)context, - re->xinf, - (void *(*)(void *, RGBA_Font_Glyph *)) re->font_surface_new, - (void (*)(void *)) re->font_surface_free, - (void (*) (void *, void *, void *, RGBA_Font_Glyph *, int, int)) - re->font_surface_draw); - evas_common_font_draw(im, context, font, x, y, text, intl_props); - evas_common_draw_context_font_ext_set(context, - NULL, - NULL, - NULL, - NULL); - evas_common_cpu_end_opt(); - - evas_cache_image_drop(&im->cache_entry); -} - -static Eina_Bool -eng_canvas_alpha_get(void *data, void *context __UNUSED__) -{ - Render_Engine *re = (Render_Engine *)data; - return (re->destination_alpha) || (re->x11.mask); -} - -/* module advertising code */ -static int -module_open(Evas_Module *em) -{ -#ifdef BUILD_ENGINE_SOFTWARE_XLIB - static Eina_Bool xrm_inited = EINA_FALSE; - if (!xrm_inited) - { - xrm_inited = EINA_TRUE; - XrmInitialize(); - } -#endif - - if (!em) return 0; - /* get whatever engine module we inherit from */ - if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0; - _evas_xrender_xcb_log_dom = eina_log_domain_register - ("evas-xrender_x11", EVAS_DEFAULT_LOG_COLOR); - if (_evas_xrender_xcb_log_dom < 0) - { - EINA_LOG_ERR("Can not create a module log domain."); - return 0; - } - /* store it for later use */ - func = pfunc; - /* now to override methods */ -#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) - ORD(info); - ORD(info_free); - ORD(setup); - ORD(canvas_alpha_get); - ORD(output_free); - ORD(output_resize); - ORD(output_tile_size_set); - ORD(output_redraws_rect_add); - ORD(output_redraws_rect_del); - ORD(output_redraws_clear); - ORD(output_redraws_next_update_get); - ORD(output_redraws_next_update_push); - ORD(output_flush); - ORD(output_idle_flush); - ORD(output_dump); - ORD(rectangle_draw); - ORD(line_draw); - ORD(polygon_draw); - - ORD(image_load); - ORD(image_new_from_data); - ORD(image_new_from_copied_data); - ORD(image_free); - ORD(image_size_get); - ORD(image_size_set); - ORD(image_dirty_region); - ORD(image_data_get); - ORD(image_data_put); - ORD(image_data_preload_request); - ORD(image_data_preload_cancel); - ORD(image_alpha_set); - ORD(image_alpha_get); - ORD(image_border_set); - ORD(image_border_get); - ORD(image_draw); - ORD(image_comment_get); - ORD(image_format_get); - ORD(image_colorspace_set); - ORD(image_colorspace_get); - ORD(image_native_set); - ORD(image_native_get); - ORD(image_cache_flush); - ORD(image_cache_set); - ORD(image_cache_get); - ORD(font_draw); - - ORD(image_scale_hint_set); - ORD(image_scale_hint_get); - -// ORD(image_map_draw); -// ORD(image_map_surface_new); -// ORD(image_map_surface_free); - - /* now advertise out own api */ - em->functions = (void *)(&func); - return 1; -} - -static void -module_close(Evas_Module *em __UNUSED__) -{ - eina_log_domain_unregister(_evas_xrender_xcb_log_dom); -#ifdef BUILD_ENGINE_SOFTWARE_XLIB - if (xrdb_user.db) - { - XrmDestroyDatabase(xrdb_user.db); - xrdb_user.last_stat = 0; - xrdb_user.last_mtime = 0; - xrdb_user.db = NULL; - } -#endif -} - -static Evas_Module_Api evas_modapi = -{ - EVAS_MODULE_API_VERSION, - "xrender_x11", - "none", - { - module_open, - module_close - } -}; - -EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, xrender_x11); - -#ifndef EVAS_STATIC_BUILD_XRENDER_X11 -EVAS_EINA_MODULE_DEFINE(engine, xrender_x11); -#endif diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine.h b/legacy/evas/src/modules/engines/xrender_x11/evas_engine.h deleted file mode 100644 index f71f384429..0000000000 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine.h +++ /dev/null @@ -1,264 +0,0 @@ -#ifndef EVAS_ENGINE_H -#define EVAS_ENGINE_H - -#include -#include - -#include -#include -#include -#include -#include -#include // xres - dpi - -#ifdef BUILD_ENGINE_XRENDER_XCB -# include -# include -# include -#endif - -extern int _evas_xrender_xcb_log_dom ; -#ifdef ERR -# undef ERR -#endif -#define ERR(...) EINA_LOG_DOM_ERR(_evas_xrender_xcb_log_dom, __VA_ARGS__) - -#ifdef DBG -# undef DBG -#endif -#define DBG(...) EINA_LOG_DOM_DBG(_evas_xrender_xcb_log_dom, __VA_ARGS__) - -#ifdef INF -# undef INF -#endif -#define INF(...) EINA_LOG_DOM_INFO(_evas_xrender_xcb_log_dom, __VA_ARGS__) - -#ifdef WRN -# undef WRN -#endif -#define WRN(...) EINA_LOG_DOM_WARN(_evas_xrender_xcb_log_dom, __VA_ARGS__) - -#ifdef CRIT -# undef CRIT -#endif -#define CRIT(...) EINA_LOG_DOM_CRIT(_evas_xrender_xcb_log_dom, __VA_ARGS__) - -typedef struct _Ximage_Info Ximage_Info; -typedef struct _Ximage_Image Ximage_Image; -typedef struct _Xrender_Surface Xrender_Surface; - -struct _Ximage_Info -{ - struct { - void *connection; - void *screen; - unsigned int root; - unsigned int draw; - void *visual; - void *fmt32; - void *fmt24; - void *fmt8; - void *fmt4; - void *fmt1; - void *fmtdef; - } x11; - unsigned int depth; - unsigned int pool_mem; - Eina_List *pool; - unsigned char can_do_shm; - Xrender_Surface *mul; - unsigned char mul_r, mul_g, mul_b, mul_a; - int references; -}; - -struct _Ximage_Image -{ - union { - struct { - XImage *xim; - XShmSegmentInfo *shm_info; - } xlib; -#ifdef BUILD_ENGINE_XRENDER_XCB - struct { - xcb_image_t *xim; - xcb_shm_segment_info_t *shm_info; - } xcb; -#endif - } x11; - Ximage_Info *xinf; - int width; - int height; - int depth; - int line_bytes; - unsigned char *data; - unsigned char available : 1; -}; - -struct _Xrender_Surface -{ - union { - struct { - XRenderPictFormat *fmt; - Drawable draw; - Picture pic; - } xlib; -#ifdef BUILD_ENGINE_XRENDER_XCB - struct { - xcb_render_pictforminfo_t *fmt; - xcb_drawable_t draw; - xcb_render_picture_t pic; - } xcb; -#endif - } x11; - Ximage_Info *xinf; - int width; - int height; - int depth; - unsigned char alpha : 1; - unsigned char allocated : 1; - unsigned char bordered : 1; -}; - -/* ximage support calls (ximage vs xshmimage, cache etc.) */ -Ximage_Info *_xr_xlib_image_info_get(Display *disp, Drawable draw, Visual *vis); -void _xr_xlib_image_info_free(Ximage_Info *xinf); -void _xr_xlib_image_info_pool_flush(Ximage_Info *xinf, unsigned int max_num, unsigned int max_mem); -Ximage_Image *_xr_xlib_image_new(Ximage_Info *xinf, int w, int h, int depth); -void _xr_xlib_image_free(Ximage_Image *xim); -void _xr_xlib_image_put(Ximage_Image *xim, Drawable draw, int x, int y, int w, int h); - -#ifdef BUILD_ENGINE_XRENDER_XCB -Ximage_Info *_xr_xcb_image_info_get(xcb_connection_t *conn, xcb_screen_t *screen, xcb_drawable_t draw, xcb_visualtype_t *visual); -void _xr_xcb_image_info_free(Ximage_Info *xinf); -void _xr_xcb_image_info_pool_flush(Ximage_Info *xinf, unsigned int max_num, unsigned int max_mem); -Ximage_Image *_xr_xcb_image_new(Ximage_Info *xinf, int w, int h, int depth); -void _xr_xcb_image_free(Ximage_Image *xim); -void _xr_xcb_image_put(Ximage_Image *xim, xcb_drawable_t draw, int x, int y, int w, int h); -#endif - -/* xrender support calls */ -Xrender_Surface *_xr_xlib_render_surface_new(Ximage_Info *xinf, int w, int h, XRenderPictFormat *fmt, int alpha); -Xrender_Surface *_xr_xlib_render_surface_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, int alpha); -Xrender_Surface *_xr_xlib_render_surface_format_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, XRenderPictFormat *fmt, int alpha); -void _xr_xlib_render_surface_free(Xrender_Surface *rs); -void _xr_xlib_render_surface_repeat_set(Xrender_Surface *rs, int repeat); -void _xr_xlib_render_surface_solid_rectangle_set(Xrender_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h); -void _xr_xlib_render_surface_argb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy); -void _xr_xlib_render_surface_rgb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy); -void _xr_xlib_render_surface_clips_set(Xrender_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh); -void _xr_xlib_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth); -void _xr_xlib_render_surface_copy(Xrender_Surface *srs, Xrender_Surface *drs, int sx, int sy, int x, int y, int w, int h); -void _xr_xlib_render_surface_rectangle_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h); -void _xr_xlib_render_surface_line_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2); -void _xr_xlib_render_surface_polygon_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y); - -#ifdef BUILD_ENGINE_XRENDER_XCB -Xrender_Surface *_xr_xcb_render_surface_new(Ximage_Info *xinf, int w, int h, xcb_render_pictforminfo_t *fmt, int alpha); -Xrender_Surface *_xr_xcb_render_surface_adopt(Ximage_Info *xinf, xcb_drawable_t draw, int w, int h, int alpha); -Xrender_Surface *_xr_xcb_render_surface_format_adopt(Ximage_Info *xinf, xcb_drawable_t draw, int w, int h, xcb_render_pictforminfo_t *fmt, int alpha); -void _xr_xcb_render_surface_free(Xrender_Surface *rs); -void _xr_xcb_render_surface_repeat_set(Xrender_Surface *rs, int repeat); -void _xr_xcb_render_surface_solid_rectangle_set(Xrender_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h); -void _xr_xcb_render_surface_argb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy); -void _xr_xcb_render_surface_rgb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy); -void _xr_xcb_render_surface_clips_set(Xrender_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh); -void _xr_xcb_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth); -void _xr_xcb_render_surface_copy(Xrender_Surface *srs, Xrender_Surface *drs, int sx, int sy, int x, int y, int w, int h); -void _xr_xcb_render_surface_rectangle_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h); -void _xr_xcb_render_surface_line_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2); -void _xr_xcb_render_surface_polygon_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y); -#endif - - -typedef struct _XR_Image XR_Image; - -struct _XR_Image -{ - Ximage_Info *xinf; - const char *file; - const char *key; - char *fkey; - RGBA_Image *im; - void *data; - int w, h; - Xrender_Surface *surface; - int references; - char *format; - const char *comment; - Tilebuf *updates; - RGBA_Image_Loadopts load_opts; - int *load_error; /* points to Evas_Object's load_error field */ - struct { - int space; - void *data; - unsigned char no_free : 1; - } cs; - unsigned char alpha : 1; - unsigned char dirty : 1; - unsigned char free_data : 1; -}; - -XR_Image *_xre_xlib_image_load(Ximage_Info *xinf, const char *file, const char *key, Evas_Image_Load_Opts *lo, int *error); -XR_Image *_xre_xlib_image_new_from_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace); -XR_Image *_xre_xlib_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace); -XR_Image *_xre_xlib_image_new(Ximage_Info *xinf, int w, int h); -void _xre_xlib_image_resize(XR_Image *im, int w, int h); -void _xre_xlib_image_free(XR_Image *im); -void _xre_xlib_image_region_dirty(XR_Image *im, int x, int y, int w, int h); -void _xre_xlib_image_dirty(XR_Image *im); -XR_Image *_xre_xlib_image_copy(XR_Image *im); -void *_xre_xlib_image_data_get(XR_Image *im); -XR_Image *_xre_xlib_image_data_find(void *data); -void _xre_xlib_image_data_put(XR_Image *im, void *data); -void _xre_xlib_image_alpha_set(XR_Image *im, int alpha); -int _xre_xlib_image_alpha_get(XR_Image *im); -void _xre_xlib_image_border_set(XR_Image *im, int l, int r, int t, int b); -void _xre_xlib_image_border_get(XR_Image *im, int *l, int *r, int *t, int *b); -void _xre_xlib_image_surface_gen(XR_Image *im); -void _xre_xlib_image_cache_set(int size); -int _xre_xlib_image_cache_get(void); - -#ifdef BUILD_ENGINE_XRENDER_XCB -XR_Image *_xre_xcb_image_load(Ximage_Info *xinf, const char *file, const char *key, Evas_Image_Load_Opts *lo, int *error); -XR_Image *_xre_xcb_image_new_from_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace); -XR_Image *_xre_xcb_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace); -XR_Image *_xre_xcb_image_new(Ximage_Info *xinf, int w, int h); -void _xre_xcb_image_resize(XR_Image *im, int w, int h); -void _xre_xcb_image_free(XR_Image *im); -void _xre_xcb_image_region_dirty(XR_Image *im, int x, int y, int w, int h); -void _xre_xcb_image_dirty(XR_Image *im); -XR_Image *_xre_xcb_image_copy(XR_Image *im); -void *_xre_xcb_image_data_get(XR_Image *im); -XR_Image *_xre_xcb_image_data_find(void *data); -void _xre_xcb_image_data_put(XR_Image *im, void *data); -void _xre_xcb_image_alpha_set(XR_Image *im, int alpha); -int _xre_xcb_image_alpha_get(XR_Image *im); -void _xre_xcb_image_border_set(XR_Image *im, int l, int r, int t, int b); -void _xre_xcb_image_border_get(XR_Image *im, int *l, int *r, int *t, int *b); -void _xre_xcb_image_surface_gen(XR_Image *im); -void _xre_xcb_image_cache_set(int size); -int _xre_xcb_image_cache_get(void); -#endif - -typedef struct _XR_Font_Surface XR_Font_Surface; - -struct _XR_Font_Surface -{ - Ximage_Info *xinf; - RGBA_Font_Glyph *fg; - int w, h; - Drawable draw; - Picture pic; -}; - -XR_Font_Surface *_xre_xlib_font_surface_new(Ximage_Info *xinf, RGBA_Font_Glyph *fg); -void _xre_xlib_font_surface_free(XR_Font_Surface *fs); -void _xre_xlib_font_surface_draw(Ximage_Info *xinf, RGBA_Image *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y); - -#ifdef BUILD_ENGINE_XRENDER_XCB -XR_Font_Surface *_xre_xcb_font_surface_new(Ximage_Info *xinf, RGBA_Font_Glyph *fg); -void _xre_xcb_font_surface_free(XR_Font_Surface *fs); -void _xre_xcb_font_surface_draw(Ximage_Info *xinf, RGBA_Image *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y); -#endif - -#endif diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xcb_font.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xcb_font.c deleted file mode 100644 index ad3a121146..0000000000 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xcb_font.c +++ /dev/null @@ -1,208 +0,0 @@ -#include "evas_common.h" -#include "evas_private.h" -#include "evas_engine.h" -#include "Evas_Engine_XRender_X11.h" - -static Eina_Hash *_xr_fg_pool = NULL; - -XR_Font_Surface * -_xre_xcb_font_surface_new(Ximage_Info *xinf, RGBA_Font_Glyph *fg) -{ - char buf[256]; - char buf2[256]; - uint32_t values[3]; - XR_Font_Surface *fs; - DATA8 *data; - Ximage_Image *xim; - Eina_Hash *pool; - uint32_t mask; - int w; - int h; - int pitch; - - data = fg->glyph_out->bitmap.buffer; - w = fg->glyph_out->bitmap.width; - h = fg->glyph_out->bitmap.rows; - pitch = fg->glyph_out->bitmap.pitch; - if (pitch < w) pitch = w; - if ((w <= 0) || (h <= 0)) return NULL; - - if (fg->ext_dat) - { - fs = fg->ext_dat; - if ((fs->xinf->x11.connection == xinf->x11.connection) && - (fs->xinf->x11.root == xinf->x11.root)) - return fs; - snprintf(buf, sizeof(buf), "@%p@/@%x@", fs->xinf->x11.connection, fs->xinf->x11.root); - pool = eina_hash_find(_xr_fg_pool, buf); - if (pool) - { - snprintf(buf, sizeof(buf), "%p", fg); - fs = eina_hash_find(pool, buf); - if (fs) return fs; - } - } - - fs = calloc(1, sizeof(XR_Font_Surface)); - if (!fs) return NULL; - - fs->xinf = xinf; - fs->fg = fg; - fs->xinf->references++; - fs->w = w; - fs->h = h; - - snprintf(buf, sizeof(buf), "@%p@/@%x@", fs->xinf->x11.connection, fs->xinf->x11.root); - pool = eina_hash_find(_xr_fg_pool, buf); - if (!pool) pool = eina_hash_string_superfast_new(NULL); - snprintf(buf2, sizeof(buf2), "%p", fg); - eina_hash_add(pool, buf2, fs); - if (!_xr_fg_pool) _xr_fg_pool = eina_hash_string_superfast_new(NULL); - eina_hash_add(_xr_fg_pool, buf, pool); - - fs->draw = xcb_generate_id(xinf->x11.connection); - xcb_create_pixmap(xinf->x11.connection, ((xcb_render_pictforminfo_t *)xinf->x11.fmt8)->depth, fs->draw, xinf->x11.root, w, h); - - mask = XCB_RENDER_CP_REPEAT | XCB_RENDER_CP_DITHER | XCB_RENDER_CP_COMPONENT_ALPHA; - values[0] = 0; - values[1] = 0; - values[2] = 0; - fs->pic = xcb_generate_id(xinf->x11.connection); - xcb_render_create_picture(xinf->x11.connection, fs->pic, fs->draw, ((xcb_render_pictforminfo_t *)xinf->x11.fmt8)->id, mask, values); - - xim = _xr_xcb_image_new(fs->xinf, w, h, ((xcb_render_pictforminfo_t *)xinf->x11.fmt8)->depth); - if ((fg->glyph_out->bitmap.num_grays == 256) && - (fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays)) - { - int x, y; - DATA8 *p1, *p2; - - for (y = 0; y < h; y++) - { - p1 = data + (pitch * y); - p2 = ((DATA8 *)xim->data) + (xim->line_bytes * y); - for (x = 0; x < w; x++) - { - *p2 = *p1; - p1++; - p2++; - } - } - - } - else - { - DATA8 *tmpbuf = NULL, *dp, *tp, bits; - int bi, bj, end; - const DATA8 bitrepl[2] = {0x0, 0xff}; - - tmpbuf = alloca(w); - { - int x, y; - DATA8 *p1, *p2; - - for (y = 0; y < h; y++) - { - p1 = tmpbuf; - p2 = ((DATA8 *)xim->data) + (xim->line_bytes * y); - tp = tmpbuf; - dp = data + (y * 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++; - } - for (x = 0; x < w; x++) - { - *p2 = *p1; - p1++; - p2++; - } - } - } - } - _xr_xcb_image_put(xim, fs->draw, 0, 0, w, h); - return fs; -} - -static Eina_Bool -_xre_xcb_font_pool_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata) -{ - char buf[256]; - Eina_Hash *pool; - XR_Font_Surface *fs; - - fs = fdata; - pool = data; - snprintf(buf, sizeof(buf), "@%p@/@%x@", fs->xinf->x11.connection, fs->xinf->x11.root); - eina_hash_del(pool, buf, fs); - if (!hash) hash = eina_hash_string_superfast_new(NULL); - eina_hash_modify(hash, key, pool); - return 1; -} - -void -_xre_xcb_font_surface_free(XR_Font_Surface *fs) -{ - if (!fs) return; - eina_hash_foreach(_xr_fg_pool, _xre_xcb_font_pool_cb, fs); - xcb_free_pixmap(fs->xinf->x11.connection, fs->draw); - xcb_render_free_picture(fs->xinf->x11.connection, fs->pic); - _xr_xcb_image_info_free(fs->xinf); - free(fs); -} - -void -_xre_xcb_font_surface_draw(Ximage_Info *xinf __UNUSED__, RGBA_Image *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y) -{ - XR_Font_Surface *fs; - Xrender_Surface *target_surface; - xcb_rectangle_t rect; - int r; - int g; - int b; - int a; - - fs = fg->ext_dat; - if (!fs || !fs->xinf || !dc || !dc->col.col) return; - target_surface = (Xrender_Surface *)(surface->image.data); - a = (dc->col.col >> 24) & 0xff; - r = (dc->col.col >> 16) & 0xff; - g = (dc->col.col >> 8 ) & 0xff; - b = (dc->col.col ) & 0xff; - if ((fs->xinf->mul_r != r) || (fs->xinf->mul_g != g) || - (fs->xinf->mul_b != b) || (fs->xinf->mul_a != a)) - { - fs->xinf->mul_r = r; - fs->xinf->mul_g = g; - fs->xinf->mul_b = b; - fs->xinf->mul_a = a; - _xr_xcb_render_surface_solid_rectangle_set(fs->xinf->mul, r, g, b, a, 0, 0, 1, 1); - } - rect.x = x; - rect.y = y; - rect.width = fs->w; - rect.height = fs->h; - if (dc->clip.use) - { - RECTS_CLIP_TO_RECT(rect.x, rect.y, rect.width, rect.height, - dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h); - } - xcb_render_set_picture_clip_rectangles(target_surface->xinf->x11.connection, - target_surface->x11.xcb.pic, 0, 0, 1, &rect); - xcb_render_composite(fs->xinf->x11.connection, XCB_RENDER_PICT_OP_OVER, - fs->xinf->mul->x11.xcb.pic, - fs->pic, - target_surface->x11.xcb.pic, - 0, 0, - 0, 0, - x, y, - fs->w, fs->h); -} diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xcb_image.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xcb_image.c deleted file mode 100644 index f1be566a14..0000000000 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xcb_image.c +++ /dev/null @@ -1,704 +0,0 @@ -#include "evas_common.h" -#include "evas_private.h" -#include "evas_engine.h" -#include "Evas_Engine_XRender_X11.h" - -static Eina_Hash *_xr_image_hash = NULL; -static int _xr_image_cache_size = 0; -static int _xr_image_cache_usage = 0; -static Eina_List *_xr_image_cache = NULL; -static Eina_Hash *_xr_image_dirty_hash = NULL; - -static void -__xre_xcb_image_dirty_hash_add(XR_Image *im) -{ - char buf[64]; - - if (!im->data) return; - snprintf(buf, sizeof(buf), "%p", im->data); - if (!_xr_image_dirty_hash) _xr_image_dirty_hash = eina_hash_string_superfast_new(NULL); - eina_hash_add(_xr_image_dirty_hash, buf, im); -} - -static void -__xre_xcb_image_dirty_hash_del(XR_Image *im) -{ - char buf[64]; - - if (!im->data) return; - snprintf(buf, sizeof(buf), "%p", im->data); - eina_hash_del(_xr_image_dirty_hash, buf, im); -} - -static XR_Image * -__xre_xcb_image_dirty_hash_find(void *data) -{ - char buf[64]; - - snprintf(buf, sizeof(buf), "%p", data); - return eina_hash_find(_xr_image_dirty_hash, buf); -} - -static XR_Image * -__xre_xcb_image_find(char *fkey) -{ - XR_Image *im; - - im = eina_hash_find(_xr_image_hash, fkey); - if (!im) - { - Eina_List *l; - - EINA_LIST_FOREACH(_xr_image_cache, l, im) - { - if (!strcmp(im->fkey, fkey)) - { - _xr_image_cache = eina_list_remove_list(_xr_image_cache, l); - if (!_xr_image_hash) _xr_image_hash = eina_hash_string_superfast_new(NULL); - eina_hash_add(_xr_image_hash, im->fkey, im); - _xr_image_cache_usage -= (im->w * im->h * 4); - break; - } - im = NULL; - } - } - if (im) im->references++; - return im; -} - -XR_Image * -_xre_xcb_image_load(Ximage_Info *xinf, const char *file, const char *key, Evas_Image_Load_Opts *lo, int *error) -{ - char buf[4096]; - XR_Image *im; - - if (!file) - { - *error = EVAS_LOAD_ERROR_GENERIC; - return NULL; - } - if (!lo) - { - if (key) - snprintf(buf, sizeof(buf), "/@%p@%x@/%s//://%s", xinf->x11.connection, xinf->x11.root, file, key); - else - snprintf(buf, sizeof(buf), "/@%p@%x@/%s", xinf->x11.connection, xinf->x11.root, file); - } - else - { - if (key) - snprintf(buf, sizeof(buf), "//@/%i/%1.5f/%ix%i//@%p@%x@/%s//://%s", lo->scale_down_by, lo->dpi, lo->w, lo->h, xinf->x11.connection, xinf->x11.root, file, key); - else - snprintf(buf, sizeof(buf), "//@/%i/%1.5f/%ix%i//@%p@%x@/%s", lo->scale_down_by, lo->dpi, lo->w, lo->h, xinf->x11.connection, xinf->x11.root, file); - } - im = __xre_xcb_image_find(buf); - if (im) - { - *error = EVAS_LOAD_ERROR_NONE; - return im; - } - - im = calloc(1, sizeof(XR_Image)); - if (!im) - { - *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED; - return NULL; - } - im->im = evas_common_load_image_from_file(file, key, lo, error); - if (!im->im) - { - free(im); - return NULL; - } - im->xinf = xinf; - im->xinf->references++; - im->cs.space = EVAS_COLORSPACE_ARGB8888; - im->fkey = strdup(buf); - im->file = (char *)eina_stringshare_add(file); - if (key) im->key = (char *)eina_stringshare_add(key); - im->w = im->im->cache_entry.w; - im->h = im->im->cache_entry.h; - im->references = 1; - if (lo) im->load_opts = *lo; - im->load_error = error; /* points to object's load_error */ - if (im->im->info.comment) im->comment = (char *)eina_stringshare_add(im->im->info.comment); -/* if (im->im->info.format == 1) im->format = eina_stringshare_add("png"); */ - if (im->im->cache_entry.flags.alpha) im->alpha = 1; - if (!_xr_image_hash) _xr_image_hash = eina_hash_string_superfast_new(NULL); - eina_hash_direct_add(_xr_image_hash, im->fkey, im); - return im; -} - -XR_Image * -_xre_xcb_image_new_from_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace) -{ - XR_Image *im; - - im = calloc(1, sizeof(XR_Image)); - if (!im) return NULL; - im->xinf = xinf; - im->xinf->references++; - im->cs.space = cspace; - im->w = w; - im->h = h; - im->references = 1; - switch (im->cs.space) - { - case EVAS_COLORSPACE_ARGB8888: - im->data = data; - im->alpha = alpha; - break; - case EVAS_COLORSPACE_YCBCR422P601_PL: - case EVAS_COLORSPACE_YCBCR422P709_PL: - im->cs.data = data; - im->cs.no_free = 1; - break; - default: - abort(); - break; - } - im->dirty = 1; - __xre_xcb_image_dirty_hash_add(im); - return im; -} - -XR_Image * -_xre_xcb_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace) -{ - XR_Image *im; - - im = calloc(1, sizeof(XR_Image)); - if (!im) return NULL; - im->cs.space = cspace; - switch (im->cs.space) - { - case EVAS_COLORSPACE_ARGB8888: - im->data = malloc(w * h * 4); - if (!im->data) - { - free(im); - return NULL; - } - if (data) - { - Gfx_Func_Copy func; - - func = evas_common_draw_func_copy_get(w * h, 0); - if (func) func(data, im->data, w * h); - evas_common_cpu_end_opt(); - } - im->alpha = alpha; - im->free_data = 1; - break; - case EVAS_COLORSPACE_YCBCR422P601_PL: - case EVAS_COLORSPACE_YCBCR422P709_PL: - im->cs.no_free = 0; - im->cs.data = calloc(1, h * sizeof(unsigned char *) * 2); - if ((data) && (im->cs.data)) - memcpy(im->cs.data, data, h * sizeof(unsigned char *) * 2); - break; - default: - abort(); - break; - } - im->w = w; - im->h = h; - im->references = 1; - im->xinf = xinf; - im->xinf->references++; - im->dirty = 1; - __xre_xcb_image_dirty_hash_add(im); - return im; -} - -XR_Image * -_xre_xcb_image_new(Ximage_Info *xinf, int w, int h) -{ - XR_Image *im; - - im = calloc(1, sizeof(XR_Image)); - if (!im) return NULL; - im->data = malloc(w * h * 4); - if (!im->data) - { - free(im); - return NULL; - } - im->w = w; - im->h = h; - im->references = 1; - im->cs.space = EVAS_COLORSPACE_ARGB8888; - im->xinf = xinf; - im->xinf->references++; - im->free_data = 1; - im->alpha = 1; - im->dirty = 1; - __xre_xcb_image_dirty_hash_add(im); - return im; -} - -static void -__xre_xcb_image_real_free(XR_Image *im) -{ - if (im->cs.data) - { - if (!im->cs.no_free) free(im->cs.data); - } - if (im->file) eina_stringshare_del(im->file); - if (im->key) eina_stringshare_del(im->key); - if (im->fkey) free(im->fkey); - if (im->im) evas_cache_image_drop(&im->im->cache_entry); - if ((im->data) && (im->dirty)) __xre_xcb_image_dirty_hash_del(im); - if ((im->free_data) && (im->data)) free(im->data); - if (im->surface) _xr_xcb_render_surface_free(im->surface); - if (im->format) eina_stringshare_del(im->format); - if (im->comment) eina_stringshare_del(im->comment); - if (im->updates) evas_common_tilebuf_free(im->updates); - _xr_xcb_image_info_free(im->xinf); - free(im); -} - -void -_xre_xcb_image_free(XR_Image *im) -{ - im->references--; - if (im->references != 0) return; - if (!im->dirty) - { - if (im->fkey) - eina_hash_del(_xr_image_hash, im->fkey, im); - _xr_image_cache = eina_list_prepend(_xr_image_cache, im); - _xr_image_cache_usage += (im->w * im->h * 4); - _xre_xcb_image_cache_set(_xr_image_cache_size); - } - else - { - __xre_xcb_image_real_free(im); - } -} - -void -_xre_xcb_image_region_dirty(XR_Image *im, int x, int y, int w, int h) -{ - if (!im->updates) - { - im->updates = evas_common_tilebuf_new(im->w, im->h); - if (im->updates) evas_common_tilebuf_set_tile_size(im->updates, 8, 8); - } - if (im->updates) - evas_common_tilebuf_add_redraw(im->updates, x, y, w, h); -} - -void -_xre_xcb_image_dirty(XR_Image *im) -{ - if (im->dirty) return; - if (im->fkey) - eina_hash_del(_xr_image_hash, im->fkey, im); - im->dirty = 1; - __xre_xcb_image_dirty_hash_add(im); -} - -XR_Image * -_xre_xcb_image_copy(XR_Image *im) -{ - XR_Image *im2; - void *data = NULL; - - if (im->data) data = im->data; - else if (im->cs.data) data = im->cs.data; - else - { - if (!im->im) - im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts), im->load_error); - if (im->im) - { - evas_cache_image_load_data(&im->im->cache_entry); - data = im->im->image.data; - } - } - if (!data) return NULL; - im2 = _xre_xcb_image_new_from_copied_data(im->xinf, im->w, im->h, data, im->alpha, im->cs.space); - return im2; -} - -void -_xre_xcb_image_resize(XR_Image *im, int w, int h) -{ - if ((w == im->w) && (h == im->h)) return; - if (im->surface) - { - Xrender_Surface *old_surface; - - old_surface = im->surface; - im->surface = _xr_xcb_render_surface_new(old_surface->xinf, w + 2, h + 2, old_surface->x11.xcb.fmt, old_surface->alpha); - _xr_xcb_render_surface_free(old_surface); - } - switch (im->cs.space) - { - case EVAS_COLORSPACE_ARGB8888: - if (im->data) - { - if (im->free_data) - { - if (im->data) free(im->data); - im->data = malloc(w * h * 4); - } - } - else if (im->im) - { - evas_cache_image_drop(&im->im->cache_entry); - im->im = NULL; - if (im->free_data) - { - if (im->data) free(im->data); - im->data = malloc(w * h * 4); - } - } - else - { - im->data = malloc(w * h * 4); - im->free_data = 1; - } - break; - case EVAS_COLORSPACE_YCBCR422P601_PL: - case EVAS_COLORSPACE_YCBCR422P709_PL: - if (im->data) - { - if (im->free_data) - { - if (im->data) free(im->data); - } - im->data = NULL; - } - if (im->im) - { - evas_cache_image_drop(&im->im->cache_entry); - im->im = NULL; - } - if (!im->cs.no_free) - { - if (im->cs.data) free(im->cs.data); - im->cs.data = calloc(1, h * sizeof(unsigned char *) * 2); - } - break; - default: - abort(); - break; - } - __xre_xcb_image_dirty_hash_del(im); - __xre_xcb_image_dirty_hash_add(im); - im->w = w; - im->h = h; -} - -void * -_xre_xcb_image_data_get(XR_Image *im) -{ - void *data = NULL; - - if (im->data) data = im->data; - else if (im->cs.data) data = im->cs.data; - else - { - if (!im->im) im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts), im->load_error); - if (im->im) - { - evas_cache_image_load_data(&im->im->cache_entry); - data = im->im->image.data; - } - } - return data; -} - -XR_Image * -_xre_xcb_image_data_find(void *data) -{ - XR_Image *im; - - im = __xre_xcb_image_dirty_hash_find(data); - if (im) - { - im->references++; - } - return im; -} - -void -_xre_xcb_image_data_put(XR_Image *im, void *data) -{ - if (!data) return; - switch (im->cs.space) - { - case EVAS_COLORSPACE_ARGB8888: - if (im->im) - { - if (data == im->im->image.data) return; - evas_cache_image_drop(&im->im->cache_entry); - im->im = NULL; - } - if (im->cs.data == data) return; - if (im->data) - { - if (im->data == data) return; - if (im->free_data) free(im->data); - im->free_data = 0; - } - im->data = data; - im->free_data = 0; - break; - case EVAS_COLORSPACE_YCBCR422P601_PL: - case EVAS_COLORSPACE_YCBCR422P709_PL: - if (im->data) - { - if (im->free_data) free(im->data); - im->data = NULL; - } - im->free_data = 0; - if (data == im->cs.data) return; - if (!im->cs.no_free) - { - if (im->cs.data) free(im->cs.data); - } - im->cs.data = data; - break; - default: - abort(); - break; - } - __xre_xcb_image_dirty_hash_del(im); - __xre_xcb_image_dirty_hash_add(im); - if (im->surface) - { - _xr_xcb_render_surface_free(im->surface); - im->surface = NULL; - } - if (!im->dirty) - { - if (im->fkey) - eina_hash_del(_xr_image_hash, im->fkey, im); - im->dirty = 1; - } - if (im->updates) - { - evas_common_tilebuf_free(im->updates); - im->updates = NULL; - } -} - -void -_xre_xcb_image_alpha_set(XR_Image *im, int alpha) -{ - if (im->alpha == alpha) return; - switch (im->cs.space) - { - case EVAS_COLORSPACE_ARGB8888: - im->alpha = alpha; - if (im->surface) - { - Xrender_Surface *old_surface; - - old_surface = im->surface; - im->surface = NULL; - if (im->alpha) - im->surface = _xr_xcb_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmt32, 1); - else - { - /* FIXME: if im->depth == 16, use xinf->fmtdef */ - if ((im->xinf->depth == 16) && - (((xcb_visualtype_t *)im->xinf->x11.visual)->red_mask == 0xf800) && - (((xcb_visualtype_t *)im->xinf->x11.visual)->green_mask == 0x07e0) && - (((xcb_visualtype_t *)im->xinf->x11.visual)->blue_mask == 0x001f)) - im->surface = _xr_xcb_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmtdef, 0); - else - im->surface = _xr_xcb_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmt24, 0); - } - if (im->surface) - _xr_xcb_render_surface_copy(old_surface, im->surface, 0, 0, 0, 0, im->w + 2, im->h + 2); - _xr_xcb_render_surface_free(old_surface); - } - if (im->updates) - { - evas_common_tilebuf_free(im->updates); - im->updates = NULL; - } - default: - break; - } -} - -int -_xre_xcb_image_alpha_get(XR_Image *im) -{ - if (im->im) - { - if (im->im->cache_entry.space != EVAS_COLORSPACE_ARGB8888) return 0; - } - return im->alpha; -} - -void -_xre_xcb_image_border_set(XR_Image *im, int l, int r, int t, int b) -{ - if (!im) return; - _xre_xcb_image_surface_gen(im); - if (l < 1) l = 0; - if (r < 1) r = 0; - if (t < 1) t = 0; - if (b < 1) b = 0; - if (im->surface) - { - if (l | r | t | b) - im->surface->bordered = 1; - else - im->surface->bordered = 0; - } -} - -void -_xre_xcb_image_border_get(XR_Image *im __UNUSED__, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__) -{ -} - -void -_xre_xcb_image_surface_gen(XR_Image *im) -{ - void *data = NULL; - void *tdata = NULL; - - if ((im->surface) && (!im->updates)) return; - if (im->data) data = im->data; - else - { - if (!im->im) im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts), im->load_error); - if (im->im) - { - evas_cache_image_load_data(&im->im->cache_entry); - data = im->im->image.data; - } - } - if (!data) - { - switch (im->cs.space) - { - case EVAS_COLORSPACE_ARGB8888: - return; - break; - case EVAS_COLORSPACE_YCBCR422P601_PL: - case EVAS_COLORSPACE_YCBCR422P709_PL: - if ((im->cs.data) && (*((unsigned char **)im->cs.data))) - { - tdata = malloc(im->w * im->h * sizeof(DATA32)); - if (tdata) - evas_common_convert_yuv_420p_601_rgba(im->cs.data, - tdata, - im->w, im->h); - data = tdata; - } - break; - default: - abort(); - break; - } - if (!data) return; - } - if (im->surface) - { - if (im->updates) - { - Tilebuf_Rect *rects, *r; - - rects = evas_common_tilebuf_get_render_rects(im->updates); - if (rects) - { - EINA_INLIST_FOREACH(rects, r) - { - int rx, ry, rw, rh; - - rx = r->x; ry = r->y; rw = r->w, rh = r->h; - RECTS_CLIP_TO_RECT(rx, ry, rw, rh, 0, 0, im->w, im->h); - if (im->alpha) - _xr_xcb_render_surface_argb_pixels_fill(im->surface, im->w, im->h, data, rx, ry, rw, rh, 1, 1); - else - /* FIXME: if im->depth == 16 - convert to 16bpp then - * upload */ - _xr_xcb_render_surface_rgb_pixels_fill(im->surface, im->w, im->h, data, rx, ry, rw, rh, 1, 1); - } - evas_common_tilebuf_free_render_rects(rects); - } - evas_common_tilebuf_free(im->updates); - im->updates = NULL; - } - if (tdata) free(tdata); - return; - } - if (im->alpha) - { - im->surface = _xr_xcb_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmt32, 1); - _xr_xcb_render_surface_argb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h, 1, 1); - } - else - { - /* FIXME: if im->xinf->depth == 16, use xinf->fmtdef */ - if ((im->xinf->depth == 16) && - (((xcb_visualtype_t *)im->xinf->x11.visual)->red_mask == 0xf800) && - (((xcb_visualtype_t *)im->xinf->x11.visual)->green_mask == 0x07e0) && - (((xcb_visualtype_t *)im->xinf->x11.visual)->blue_mask == 0x001f)) - im->surface = _xr_xcb_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmtdef, 0); - else - im->surface = _xr_xcb_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmt24, 0); - /* FIXME: if im->depth == 16 - convert to 16bpp then - * upload */ - _xr_xcb_render_surface_rgb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h, 1, 1); - } - /* fill borders */ - _xr_xcb_render_surface_copy(im->surface, im->surface, - 1, 1, - 0, 1, - 1, im->h); - _xr_xcb_render_surface_copy(im->surface, im->surface, - 0, 1, - 0, 0, - im->w + 2, 1); - _xr_xcb_render_surface_copy(im->surface, im->surface, - im->w, 1, - im->w + 1, 1, - 1, im->h); - _xr_xcb_render_surface_copy(im->surface, im->surface, - 0, im->h, - 0, im->h + 1, - im->w + 2, 1); - if ((im->im) && (!im->dirty)) - { - evas_cache_image_drop(&im->im->cache_entry); - im->im = NULL; - } - if (tdata) free(tdata); -} - -void -_xre_xcb_image_cache_set(int size) -{ - _xr_image_cache_size = size; - while (_xr_image_cache_usage > _xr_image_cache_size) - { - Eina_List *l; - - l = eina_list_last(_xr_image_cache); - if (l) - { - XR_Image *im; - - im = l->data; - _xr_image_cache = eina_list_remove_list(_xr_image_cache, l); - _xr_image_cache_usage -= (im->w * im->h * 4); - __xre_xcb_image_real_free(im); - } - } -} - -int -_xre_xcb_image_cache_get(void) -{ - return _xr_image_cache_size; -} diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xcb_render.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xcb_render.c deleted file mode 100644 index c5a283e87d..0000000000 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xcb_render.c +++ /dev/null @@ -1,841 +0,0 @@ -#include "evas_common.h" -/* #include "evas_macros.h" */ -#include "evas_private.h" -#include "evas_engine.h" -#include "Evas_Engine_XRender_X11.h" -#include - -/* As opposed to libXRender, we don't have - * XDoubleToFixed in XCB :/ - */ -#define DOUBLE_TO_FIXED(d) ((xcb_render_fixed_t) ((d) * 65536)) - -/* this is a work around broken xrender - when/if this ever gets fixed in xorg - * we can comment this out and one day remove it - for now keep it until such - * a fix is spotted in the wild - */ -#define BROKEN_XORG_XRENDER 1 - -static inline void -set_filter(Xrender_Surface *s, int smooth) -{ - const char *f = smooth ? "best": "nearest"; - - xcb_render_set_picture_filter (s->xinf->x11.connection, s->x11.xcb.pic, strlen (f), f, 0, NULL); -} - -xcb_render_pictforminfo_t * -xcb_render_find_visual_format (xcb_connection_t *c, xcb_visualtype_t *visual) -{ - xcb_render_query_pict_formats_cookie_t cookie; - xcb_render_query_pict_formats_reply_t *rep; - xcb_render_pictscreen_iterator_t screen_iter; - xcb_render_pictformat_t format = { 0 }; - - cookie = xcb_render_query_pict_formats (c); - rep = xcb_render_query_pict_formats_reply (c, cookie, NULL); - if (!rep) - return NULL; - - screen_iter = xcb_render_query_pict_formats_screens_iterator (rep); - for (; screen_iter.rem; xcb_render_pictscreen_next (&screen_iter)) { - xcb_render_pictdepth_iterator_t depth_iter; - - depth_iter = xcb_render_pictscreen_depths_iterator (screen_iter.data); - for (; depth_iter.rem; xcb_render_pictdepth_next (&depth_iter)) { - xcb_render_pictvisual_iterator_t visual_iter; - - visual_iter = xcb_render_pictdepth_visuals_iterator (depth_iter.data); - for (; visual_iter.rem; xcb_render_pictvisual_next (&visual_iter)) { - if (visual->visual_id == visual_iter.data->visual) { - format = visual_iter.data->format; - } - } - } - } - - if (format != 0) - { - xcb_render_pictforminfo_iterator_t forminfo_iter; - - forminfo_iter = xcb_render_query_pict_formats_formats_iterator (rep); - for (; forminfo_iter.rem; xcb_render_pictforminfo_next (&forminfo_iter)) { - if (forminfo_iter.data->id == format) { - xcb_render_pictforminfo_t *forminfo; - - forminfo = (xcb_render_pictforminfo_t *)malloc (sizeof (xcb_render_pictforminfo_t)); - memcpy (forminfo, forminfo_iter.data, sizeof (xcb_render_pictforminfo_t)); - free (rep); - - return forminfo; - } - } - } - - return NULL; -} - -Xrender_Surface * -_xr_xcb_render_surface_new(Ximage_Info *xinf, int w, int h, xcb_render_pictforminfo_t *fmt, int alpha) -{ - Xrender_Surface *rs; - uint32_t mask; - uint32_t values[3]; - - if ((!xinf) || (!fmt) || (w < 1) || (h < 1)) return NULL; - - rs = calloc(1, sizeof(Xrender_Surface)); - if (!rs) return NULL; - rs->xinf = xinf; - rs->width = w; - rs->height = h; - rs->x11.xcb.fmt = (xcb_render_pictforminfo_t *)malloc (sizeof (xcb_render_pictforminfo_t)); - if (!rs->x11.xcb.fmt) - { - free(rs); - return NULL; - } - memcpy (rs->x11.xcb.fmt, fmt, sizeof (xcb_render_pictforminfo_t)); - rs->alpha = alpha; - rs->depth = fmt->depth; - rs->allocated = 1; - rs->x11.xcb.draw = xcb_generate_id(xinf->x11.connection); - xcb_create_pixmap(xinf->x11.connection, fmt->depth, rs->x11.xcb.draw, xinf->x11.root, w, h); - if (rs->x11.xcb.draw == XCB_NONE) - { - free(rs->x11.xcb.fmt); - free(rs); - return NULL; - } - rs->xinf->references++; - mask = XCB_RENDER_CP_REPEAT | XCB_RENDER_CP_DITHER | XCB_RENDER_CP_COMPONENT_ALPHA; - values[0] = 0; - values[1] = 1; - values[2] = 0; - rs->x11.xcb.pic = xcb_generate_id(xinf->x11.connection); - xcb_render_create_picture(xinf->x11.connection, rs->x11.xcb.pic, rs->x11.xcb.draw, fmt->id, mask, values); - if (rs->x11.xcb.pic == XCB_NONE) - { - xcb_free_pixmap(rs->xinf->x11.connection, rs->x11.xcb.draw); - rs->xinf->references--; - free(rs->x11.xcb.fmt); - free(rs); - return NULL; - } - - return rs; -} - -Xrender_Surface * -_xr_xcb_render_surface_adopt(Ximage_Info *xinf, xcb_drawable_t draw, int w, int h, int alpha) -{ - Xrender_Surface *rs; - uint32_t mask; - uint32_t values[3]; - - if ((!xinf) || (draw == 0) || (w < 1) || (h < 1)) return NULL; - rs = calloc(1, sizeof(Xrender_Surface)); - if (!rs) return NULL; - rs->xinf = xinf; - rs->width = w; - rs->height = h; -/* if (fmt->depth == xinf->fmt32->depth) */ -/* rs->x11.xcb.fmt = xinf->fmt32; */ -/* else if (fmt->depth == xinf->fmt24->depth) */ -/* rs->x11.xcb.fmt = xinf->fmt24; */ -/* else if (fmt->depth == xinf->fmt8->depth) */ -/* rs->x11.xcb.fmt = xinf->fmt8; */ -/* else if (fmt->depth == xinf->fmt4->depth) */ -/* rs->x11.xcb.fmt = xinf->fmt4; */ -/* else */ -/* rs->x11.xcb.fmt = xinf->fmt1; */ -/* free(fmt); */ - - rs->x11.xcb.fmt = xcb_render_find_visual_format(xinf->x11.connection, xinf->x11.visual); - if (!rs->x11.xcb.fmt) - { - free(rs); - return NULL; - } - rs->alpha = alpha; - rs->depth = rs->x11.xcb.fmt->depth; - if (rs->x11.xcb.fmt->depth == 32) rs->alpha = 1; - rs->allocated = 0; - rs->x11.xcb.draw = draw; - rs->xinf->references++; - mask = XCB_RENDER_CP_REPEAT | XCB_RENDER_CP_DITHER | XCB_RENDER_CP_COMPONENT_ALPHA; - values[0] = 0; - values[1] = 1; - values[2] = 0; - rs->x11.xcb.pic = xcb_generate_id(xinf->x11.connection); - xcb_render_create_picture(xinf->x11.connection, rs->x11.xcb.pic, rs->x11.xcb.draw, rs->x11.xcb.fmt->id, mask, values); - if (rs->x11.xcb.pic == XCB_NONE) - { - rs->xinf->references--; - free(rs->x11.xcb.fmt); - free(rs); - return NULL; - } - - return rs; -} - -Xrender_Surface * -_xr_xcb_render_surface_format_adopt(Ximage_Info *xinf, xcb_drawable_t draw, int w, int h, xcb_render_pictforminfo_t *fmt, int alpha) -{ - Xrender_Surface *rs; - uint32_t mask; - uint32_t values[3]; - - if ((!xinf) || (!fmt) || (draw == XCB_NONE) || (w < 1) || (h < 1)) return NULL; - rs = calloc(1, sizeof(Xrender_Surface)); - if (!rs) return NULL; - rs->xinf = xinf; - rs->width = w; - rs->height = h; - rs->x11.xcb.fmt = (xcb_render_pictforminfo_t *)malloc (sizeof (xcb_render_pictforminfo_t)); - memcpy (rs->x11.xcb.fmt, fmt, sizeof (xcb_render_pictforminfo_t)); - rs->alpha = alpha; - rs->depth = fmt->depth; - if (fmt->depth == 32) rs->alpha = 1; - rs->xinf->references++; - rs->allocated = 0; - rs->x11.xcb.draw = draw; - mask = XCB_RENDER_CP_REPEAT | XCB_RENDER_CP_DITHER | XCB_RENDER_CP_COMPONENT_ALPHA; - values[0] = 0; - values[1] = 1; - values[2] = 0; - rs->x11.xcb.pic = xcb_generate_id(xinf->x11.connection); - xcb_render_create_picture(xinf->x11.connection, rs->x11.xcb.pic, rs->x11.xcb.draw, fmt->id, mask, values); - if (rs->x11.xcb.pic == XCB_NONE) - { - rs->xinf->references--; - free(rs->x11.xcb.fmt); - free(rs); - return NULL; - } - - return rs; -} - -void -_xr_xcb_render_surface_free(Xrender_Surface *rs) -{ - if (!rs) return; - if (rs->xinf) - { - if ((rs->allocated) && (rs->x11.xcb.draw != XCB_NONE)) - xcb_free_pixmap(rs->xinf->x11.connection, rs->x11.xcb.draw); - if (rs->x11.xcb.pic != XCB_NONE) - xcb_render_free_picture(rs->xinf->x11.connection, rs->x11.xcb.pic); - _xr_xcb_image_info_free(rs->xinf); - rs->xinf = NULL; - } - free(rs->x11.xcb.fmt); - free(rs); -} - -void -_xr_xcb_render_surface_repeat_set(Xrender_Surface *rs, int repeat) -{ - uint32_t mask; - uint32_t value[1]; - - mask = XCB_RENDER_CP_REPEAT; - value[0] = repeat; - xcb_render_change_picture(rs->xinf->x11.connection, rs->x11.xcb.pic, mask, value); -} - -void -_xr_xcb_render_surface_solid_rectangle_set(Xrender_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h) -{ - xcb_render_color_t col; - xcb_rectangle_t rect; - - col.red = (r << 8) | r; - col.green = (g << 8) | g; - col.blue = (b << 8) | b; - col.alpha = (a << 8) | a; - rect.x = x; - rect.y = y; - rect.width = w; - rect.height = h; - xcb_render_fill_rectangles(rs->xinf->x11.connection, XCB_RENDER_PICT_OP_SRC, rs->x11.xcb.pic, col, 1, &rect); -} - -void -_xr_xcb_render_surface_argb_pixels_fill(Xrender_Surface *rs, int sw, int sh __UNUSED__, void *pixels, int x, int y, int w, int h, int ox, int oy) -{ - Ximage_Image *xim; - unsigned int *p, *sp, *sple, *spe; - unsigned int jump, sjump; - - xim = _xr_xcb_image_new(rs->xinf, w, h, rs->depth); - if (!xim) return; - p = (unsigned int *)xim->data; - sp = ((unsigned int *)pixels) + (y * sw) + x; - jump = ((xim->line_bytes / 4) - w); - sjump = sw - w; - spe = sp + ((h - 1) * sw) + w; - if -#ifdef WORDS_BIGENDIAN - (xim->x11.xcb.xim->byte_order == XCB_IMAGE_ORDER_LSB_FIRST) -#else - (xim->x11.xcb.xim->byte_order == XCB_IMAGE_ORDER_MSB_FIRST) -#endif - { - while (sp < spe) - { - sple = sp + w; - while (sp < sple) - { - *p++ = (*sp << 24) + ((*sp << 8) & 0xff0000) + ((*sp >> 8) & 0xff00) + (*sp >> 24); -// *p++ = (B_VAL(sp) << 24) | (G_VAL(sp) << 16) | (R_VAL(sp) << 8) | A_VAL(sp); - sp++; - } - p += jump; - sp += sjump; - } - } - else - { - while (sp < spe) - { - sple = sp + w; - while (sp < sple) - *p++ = *sp++; - p += jump; - sp += sjump; - } - } - _xr_xcb_image_put(xim, rs->x11.xcb.draw, x + ox, y + oy, w, h); -} - -void -_xr_xcb_render_surface_rgb_pixels_fill(Xrender_Surface *rs, int sw, int sh __UNUSED__, void *pixels, int x, int y, int w, int h, int ox, int oy) -{ - Ximage_Image *xim; - unsigned int *p, *sp, *sple, *spe; - unsigned int jump, sjump; - - xim = _xr_xcb_image_new(rs->xinf, w, h, rs->depth); - if (!xim) return; - p = (unsigned int *)xim->data; - sp = ((unsigned int *)pixels) + (y * sw) + x; - sjump = sw - w; - spe = sp + ((h - 1) * sw) + w; - if (rs->depth == 16) - { - /* FIXME: if rs->depth == 16 - convert */ - Gfx_Func_Convert conv_func; - int swap; - - jump = ((xim->line_bytes / 2) - w); - -#ifdef WORDS_BIGENDIAN - swap = (int)(xim->x11.xcb.xim->byte_order == XCB_IMAGE_ORDER_LSB_FIRST); -#else - swap = (int)(xim->x11.xcb.xim->byte_order == XCB_IMAGE_ORDER_MSB_FIRST); -#endif - /* FIXME: swap not handled */ - conv_func = evas_common_convert_func_get((DATA8 *)sp, w, h, rs->depth, - ((xcb_visualtype_t *)rs->xinf->x11.visual)->red_mask, - ((xcb_visualtype_t *)rs->xinf->x11.visual)->green_mask, - ((xcb_visualtype_t *)rs->xinf->x11.visual)->blue_mask, - PAL_MODE_NONE, 0); - if (conv_func) - conv_func(sp, (DATA8 *)p, sjump, jump, w, h, x, y, NULL); - } - else - { - jump = ((xim->line_bytes / 4) - w); - if -#ifdef WORDS_BIGENDIAN - (xim->x11.xcb.xim->byte_order == XCB_IMAGE_ORDER_LSB_FIRST) -#else - (xim->x11.xcb.xim->byte_order == XCB_IMAGE_ORDER_MSB_FIRST) -#endif - { - while (sp < spe) - { - sple = sp + w; - while (sp < sple) - { - *p++ = (*sp << 24) + ((*sp << 8) & 0xff0000) + ((*sp >> 8) & 0xff00) + 0xff; -// *p++ = ((B_VAL(sp)) << 24) | ((G_VAL(sp)) << 16) | ((R_VAL(sp)) << 8) | 0x000000ff; - sp++; - } - p += jump; - sp += sjump; - } - } - else - { - while (sp < spe) - { - sple = sp + w; - while (sp < sple) - *p++ = 0xff000000 | *sp++; - p += jump; - sp += sjump; - } - } - } - _xr_xcb_image_put(xim, rs->x11.xcb.draw, x + ox, y + oy, w, h); -} - -void -_xr_xcb_render_surface_clips_set(Xrender_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh) -{ - int num = 0; - xcb_rectangle_t *rect = NULL; - - if ((dc) && (dc->clip.use)) - { - RECTS_CLIP_TO_RECT(rx, ry, rw, rh, - dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h); - } - if ((!dc) || (!dc->cutout.rects)) - { - rect = malloc(sizeof(xcb_rectangle_t)); - if (!rect) return; - rect->x = rx; - rect->y = ry; - rect->width = rw; - rect->height = rh; - num = 1; - } - else - { - Cutout_Rects *rects; - Cutout_Rect *r; - int i; - - rects = evas_common_draw_context_apply_cutouts(dc); - num = rects->active; - rect = malloc(num * sizeof(xcb_rectangle_t)); - if (!rect) return; - for (i = 0; i < num; i++) - { - r = rects->rects + i; - rect[i].x = r->x; - rect[i].y = r->y; - rect[i].width = r->w; - rect[i].height = r->h; - } - evas_common_draw_context_apply_clear_cutouts(rects); - } - if (!rect) return; - xcb_render_set_picture_clip_rectangles(rs->xinf->x11.connection, rs->x11.xcb.pic, 0, 0, num, rect); - free(rect); -} - -/* initialized the transform to the identity */ -static void -init_transform (xcb_render_transform_t *t) -{ - t->matrix11 = t->matrix22 = t->matrix33 = DOUBLE_TO_FIXED(1); - - t->matrix12 = t->matrix13 = t->matrix21 = t->matrix23 = - t->matrix31 = t->matrix32 = 0; -} - -static void -set_transform_scale(xcb_render_transform_t *t, - int sw, - int sh, - int w, - int h, - int tx, - int ty) -{ -/* if ((sw > 1) && (w > 1)) */ -/* { sw--; w--; } */ -/* if ((sh > 1) && (h > 1)) */ -/* { sh--; h--; } */ - t->matrix11 = DOUBLE_TO_FIXED((double)sw / (double)w); - t->matrix22 = DOUBLE_TO_FIXED((double)sh / (double)h); - t->matrix31 = (tx * sw) / w; - t->matrix32 = (ty * sh) / h; -} - -// when color multiplier is used want: instead -// CA src IN mask SRC temp; non-CA temp OVER dst. - i think. need to check. -void -_xr_xcb_render_surface_composite(Xrender_Surface *srs, - Xrender_Surface *drs, - RGBA_Draw_Context *dc, - int sx, - int sy, - int sw, - int sh, - int x, - int y, - int w, - int h, - int smooth) -{ - Xrender_Surface *trs = NULL; - xcb_render_transform_t xf; - xcb_render_picture_t mask = XCB_NONE; - uint32_t value_mask; - uint32_t value_list[1]; - int e, is_scaling; - xcb_render_pict_op_t op; - - if ((sw <= 0) || (sh <= 0) || (w <= 0) || (h <= 0)) return; - - is_scaling = e = (sw != w) || (sh != h); - - value_mask = XCB_RENDER_CP_CLIP_MASK; - value_list[0] = 0; - xcb_render_change_picture(srs->xinf->x11.connection, srs->x11.xcb.pic, value_mask, value_list); - xcb_render_change_picture(drs->xinf->x11.connection, drs->x11.xcb.pic, value_mask, value_list); - - init_transform(&xf); - - op = XCB_RENDER_PICT_OP_OVER; - if (dc->render_op == _EVAS_RENDER_BLEND) - { - if (!srs->alpha) op = XCB_RENDER_PICT_OP_SRC; - } - else if (dc->render_op == _EVAS_RENDER_BLEND_REL) - op = XCB_RENDER_PICT_OP_ATOP; - else if (dc->render_op == _EVAS_RENDER_MUL) - op = XCB_RENDER_PICT_OP_IN; - else if (dc->render_op == _EVAS_RENDER_COPY) - op = XCB_RENDER_PICT_OP_SRC; - else if (dc->render_op == _EVAS_RENDER_COPY_REL) - op = XCB_RENDER_PICT_OP_IN; - else if (dc->render_op == _EVAS_RENDER_MASK) - op = XCB_RENDER_PICT_OP_IN_REVERSE; - - if ((dc) && (dc->mul.use)) - { - int r, g, b, a; - - if ((op == XCB_RENDER_PICT_OP_OVER) && (!dc->mul.col)) return; - a = dc->mul.col >> 24; - r = (dc->mul.col >> 16) & 0xff; - g = (dc->mul.col >> 8) & 0xff; - b = dc->mul.col & 0xff; - if (dc->mul.col != 0xffffffff) - { - if ((srs->xinf->mul_r != r) || (srs->xinf->mul_g != g) || - (srs->xinf->mul_b != b) || (srs->xinf->mul_a != a)) - { - srs->xinf->mul_r = r; - srs->xinf->mul_g = g; - srs->xinf->mul_b = b; - srs->xinf->mul_a = a; - _xr_xcb_render_surface_solid_rectangle_set(srs->xinf->mul, - r, - g, - b, - a, - 0, 0, 1, 1); - } - mask = srs->xinf->mul->x11.xcb.pic; - if (dc->mul.col == (a * 0x01010101)) - { - value_mask = XCB_RENDER_CP_COMPONENT_ALPHA; - value_list[0] = 0; - xcb_render_change_picture(srs->xinf->x11.connection, mask, value_mask, value_list); - } - else - { - if ((srs->alpha) || (a != 0xff)) - trs = _xr_xcb_render_surface_new(srs->xinf, sw + 2, sh + 2, - srs->xinf->x11.fmt32, 1); - else - trs = _xr_xcb_render_surface_new(srs->xinf, sw + 2, sh + 2, - srs->x11.xcb.fmt, srs->alpha); - if (!trs) return; - - value_mask = XCB_RENDER_CP_COMPONENT_ALPHA; - value_list[0] = 1; - xcb_render_change_picture(srs->xinf->x11.connection, mask, value_mask, value_list); - xcb_render_set_picture_transform(trs->xinf->x11.connection, srs->x11.xcb.pic, xf); - xcb_render_composite(srs->xinf->x11.connection, XCB_RENDER_PICT_OP_SRC, srs->x11.xcb.pic, mask, trs->x11.xcb.pic, - sx, sy, sx, sy, 0, 0, sw + 2, sh + 2); - mask = XCB_NONE; - } - } - } - -//#define HFW + (sw / 2) -//#define HFH + (sh / 2) -#define HFW -#define HFH - - _xr_xcb_render_surface_clips_set(drs, dc, x, y, w, h); - if (trs) - { - set_filter(trs, smooth); - - set_transform_scale(&xf, sw, sh, w, h, -1, -1); - xcb_render_set_picture_transform(trs->xinf->x11.connection, trs->x11.xcb.pic, xf); - - value_mask = XCB_RENDER_CP_COMPONENT_ALPHA; - value_list[0] = 0; - if (dc->render_op == _EVAS_RENDER_MUL) - value_list[0] = 1; - xcb_render_change_picture(trs->xinf->x11.connection, trs->x11.xcb.pic, value_mask, value_list); - - xcb_render_composite(trs->xinf->x11.connection, op, trs->x11.xcb.pic, mask, drs->x11.xcb.pic, - (w HFW) / sw, (h HFH) / sh, - (w HFW) / sw, (h HFH) / sh, - x, y, w, h); - _xr_xcb_render_surface_free(trs); - } - else - { - if (srs->bordered && is_scaling) - { - trs = _xr_xcb_render_surface_new(srs->xinf, sw + 2, sh + 2, - srs->x11.xcb.fmt, srs->alpha); - if (!trs) return; - - value_mask = XCB_RENDER_CP_COMPONENT_ALPHA; - value_list[0] = 0; - xcb_render_change_picture(srs->xinf->x11.connection, srs->x11.xcb.pic, value_mask, value_list); - xcb_render_set_picture_transform(srs->xinf->x11.connection, srs->x11.xcb.pic, xf); - xcb_render_composite(srs->xinf->x11.connection, XCB_RENDER_PICT_OP_SRC, srs->x11.xcb.pic, XCB_NONE, trs->x11.xcb.pic, - sx, sy, sx, sx, 0, 0, sw + 2, sh + 2); - - set_filter(trs, smooth); - - set_transform_scale(&xf, sw, sh, w, h, -1, -1); - xcb_render_set_picture_transform(trs->xinf->x11.connection, trs->x11.xcb.pic, xf); - - if (dc->render_op == _EVAS_RENDER_MUL) - { - value_mask = XCB_RENDER_CP_COMPONENT_ALPHA; - value_list[0] = 1; - xcb_render_change_picture(trs->xinf->x11.connection, trs->x11.xcb.pic, value_mask, value_list); - } - - xcb_render_composite(trs->xinf->x11.connection, op, trs->x11.xcb.pic, mask, drs->x11.xcb.pic, - (w HFW) / sw, (h HFH) / sh, - (w HFW) / sw, (h HFH) / sh, - x, y, w, h); - _xr_xcb_render_surface_free(trs); - } - else - { - set_filter(srs, smooth); - - set_transform_scale(&xf, sw, sh, w, h, 0, 0); - xcb_render_set_picture_transform(srs->xinf->x11.connection, srs->x11.xcb.pic, xf); - - value_mask = XCB_RENDER_CP_COMPONENT_ALPHA; - value_list[0] = 0; - if (dc->render_op == _EVAS_RENDER_MUL) - value_list[0] = 1; - xcb_render_change_picture(srs->xinf->x11.connection, srs->x11.xcb.pic, value_mask, value_list); - - xcb_render_composite(srs->xinf->x11.connection, op, srs->x11.xcb.pic, mask, drs->x11.xcb.pic, - ((((sx + 1) * w) HFW) / sw), - ((((sy + 1) * h) HFH) / sh), - ((((sx + 1) * w) HFW) / sw), - ((((sy + 1) * h) HFH) / sh), - x, y, w, h); - } - } -} - -void -_xr_xcb_render_surface_copy(Xrender_Surface *srs, Xrender_Surface *drs, int sx, int sy, int x, int y, int w, int h) -{ - xcb_render_transform_t xf; - uint32_t value_mask; - uint32_t value_list[1]; - - if ((w <= 0) || (h <= 0) || (!srs) || (!drs)) return; - - init_transform(&xf); -#ifdef BROKEN_XORG_XRENDER - /* FIXME: why do we need to change the identity matrix if the src surface - * is 1 bit deep? - */ - if (srs->depth == 1) - { - xf.matrix11 = xf.matrix22 = xf.matrix33 = 1; - } -#endif - xcb_render_set_picture_transform(srs->xinf->x11.connection, srs->x11.xcb.pic, xf); -/* set_filter(srs, 0); */ - - value_mask = XCB_RENDER_CP_CLIP_MASK; - value_list[0] = 0; - xcb_render_change_picture(srs->xinf->x11.connection, srs->x11.xcb.pic, value_mask, value_list); - xcb_render_change_picture(drs->xinf->x11.connection, drs->x11.xcb.pic, value_mask, value_list); - - xcb_render_composite(srs->xinf->x11.connection, XCB_RENDER_PICT_OP_SRC, srs->x11.xcb.pic, XCB_NONE, drs->x11.xcb.pic, - sx, sy, 0, 0, x, y, w, h); -} - -void -_xr_xcb_render_surface_rectangle_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h) -{ - xcb_render_color_t col; - xcb_rectangle_t rect; - uint32_t value_mask; - uint32_t value_list; - int r, g, b, a; - xcb_render_pict_op_t op; - - if ((!rs) || (!dc)) return; - if ((w <= 0) || (h <= 0)) return; - a = dc->col.col >> 24; - r = (dc->col.col >> 16) & 0xff; - g = (dc->col.col >> 8 ) & 0xff; - b = (dc->col.col ) & 0xff; - col.red = (r << 8) | r; - col.green = (g << 8) | g; - col.blue = (b << 8) | b; - col.alpha = (a << 8) | a; - - op = XCB_RENDER_PICT_OP_SRC; - if (dc->render_op == _EVAS_RENDER_BLEND) - { - if (!dc->col.col) return; - if (a == 0xff) op = XCB_RENDER_PICT_OP_SRC; - } - else if (dc->render_op == _EVAS_RENDER_BLEND_REL) - { - if (!dc->col.col) return; - op = XCB_RENDER_PICT_OP_ATOP; - } - else if (dc->render_op == _EVAS_RENDER_MUL) - { - if (dc->col.col == 0xffffffff) return; - op = XCB_RENDER_PICT_OP_IN; - } - else if (dc->render_op == _EVAS_RENDER_COPY) - op = XCB_RENDER_PICT_OP_SRC; - else if (dc->render_op == _EVAS_RENDER_COPY_REL) - op = XCB_RENDER_PICT_OP_IN; - else if (dc->render_op == _EVAS_RENDER_MASK) - op = XCB_RENDER_PICT_OP_IN_REVERSE; - - value_mask = XCB_RENDER_CP_CLIP_MASK; - value_list = 0; - xcb_render_change_picture(rs->xinf->x11.connection, rs->x11.xcb.pic, value_mask, &value_list); - - _xr_xcb_render_surface_clips_set(rs, dc, x, y, w, h); - rect.x = x; - rect.y = y; - rect.width = w; - rect.height = h; - xcb_render_fill_rectangles(rs->xinf->x11.connection, op, rs->x11.xcb.pic, col, 1, &rect); -} - -void -_xr_xcb_render_surface_line_draw(Xrender_Surface *rs __UNUSED__, RGBA_Draw_Context *dc __UNUSED__, int x1 __UNUSED__, int y1 __UNUSED__, int x2 __UNUSED__, int y2 __UNUSED__) -{ -/* uint32_t value_mask; */ -/* uint32_t value_list[1]; */ -/* int op; */ - -/* if ((!rs) || (!dc)) return; */ -/* op = XCB_RENDER_PICT_OP_SRC; */ -/* value_mask = XCB_RENDER_CP_CLIP_MASK; */ -/* value_list[0] = 0; */ -/* xcb_render_change_picture(rs->xinf->x11.connection, rs->x11.xcb.pic, value_mask, value_list); */ -/* _xr_xcb_render_surface_clips_set(rs, dc, 0, 0, rs->width, rs->height); */ - -/* { */ -/* int r, g, b, a; */ -/* XPointDouble poly[4]; */ -/* int dx, dy; */ -/* double len, ddx, ddy; */ - -/* dx = x2 - x1; */ -/* dy = y2 - y1; */ -/* len = sqrt((double)(dx * dx) + (double)(dy * dy)); */ -/* ddx = (0.5 * dx) / len; */ -/* ddy = (0.5 * dy) / len; */ -/* poly[0].x = (x1 + ddx); */ -/* poly[0].y = (y1 - ddy); */ -/* poly[1].x = (x2 + ddx); */ -/* poly[1].y = (y2 - ddy); */ -/* poly[2].x = (x2 - ddx); */ -/* poly[2].y = (y2 + ddy); */ -/* poly[3].x = (x1 - ddx); */ -/* poly[3].y = (y1 + ddy); */ - -/* a = (dc->col.col >> 24) & 0xff; */ -/* if (a == 0) return; */ -/* if (a < 0xff) op = XCB_RENDER_PICT_OP_OVER; */ -/* r = (dc->col.col >> 16) & 0xff; */ -/* g = (dc->col.col >> 8 ) & 0xff; */ -/* b = (dc->col.col ) & 0xff; */ -/* if ((rs->xinf->mul_r != r) || (rs->xinf->mul_g != g) || */ -/* (rs->xinf->mul_b != b) || (rs->xinf->mul_a != a)) */ -/* { */ -/* rs->xinf->mul_r = r; */ -/* rs->xinf->mul_g = g; */ -/* rs->xinf->mul_b = b; */ -/* rs->xinf->mul_a = a; */ -/* _xr_xcb_render_surface_solid_rectangle_set(rs->xinf->mul, r, g, b, a, 0, 0, 1, 1); */ -/* } */ -/* XRenderCompositeDoublePoly(rs->xinf->x11.connection, op, */ -/* rs->xinf->mul->pic, rs->x11.xcb.pic, */ -/* rs->xinf->fmt8, 0, 0, 0, 0, */ -/* poly, 4, EvenOddRule); */ -/* } */ -} - -void -_xr_xcb_render_surface_polygon_draw(Xrender_Surface *rs __UNUSED__, RGBA_Draw_Context *dc __UNUSED__, RGBA_Polygon_Point *points __UNUSED__, int x, int y) -{ -/* RGBA_Polygon_Point *pt; */ -/* int i, num; */ -/* XPointDouble *pts; */ -/* int r, g, b, a; */ -/* uint32_t value_mask; */ -/* uint32_t value_list[1]; */ -/* int op; */ - -/* if ((!rs) || (!dc)) return; */ -/* num = 0; EINA_INLIST_FOREACH(points, pt) num++; */ -/* if (num < 3) return; */ -/* a = (dc->col.col >> 24) & 0xff; */ -/* if (a == 0) return; */ -/* op = XCB_RENDER_PICT_OP_OVER; */ -/* r = (dc->col.col >> 16) & 0xff; */ -/* g = (dc->col.col >> 8 ) & 0xff; */ -/* b = (dc->col.col ) & 0xff; */ -/* if ((rs->xinf->mul_r != r) || (rs->xinf->mul_g != g) || */ -/* (rs->xinf->mul_b != b) || (rs->xinf->mul_a != a)) */ -/* { */ -/* rs->xinf->mul_r = r; */ -/* rs->xinf->mul_g = g; */ -/* rs->xinf->mul_b = b; */ -/* rs->xinf->mul_a = a; */ -/* _xr_xcb_render_surface_solid_rectangle_set(rs->xinf->mul, r, g, b, a, 0, 0, 1, 1); */ -/* } */ -/* pts = malloc(num * sizeof(XPointDouble)); */ -/* if (!pts) return; */ -/* i = 0; */ -/* EINA_INLIST_FOREACH(points, pt) */ -/* { */ -/* if (i < num) */ -/* { */ -/* pts[i].x = pt->x; */ -/* pts[i].y = pt->y; */ -/* i++; */ -/* } */ -/* } */ -/* value_mask = XCB_RENDER_CP_CLIP_MASK; */ -/* value_list[0] = 0; */ -/* xcb_render_change_picture(rs->xinf->x11.connection, rs->x11.xcb.pic, value_mask, value_list); */ - -/* _xr_xcb_render_surface_clips_set(rs, dc, 0, 0, rs->width, rs->height); */ -/* XRenderCompositeDoublePoly(rs->xinf->x11.connection, op, */ -/* rs->xinf->mul->pic, rs->x11.xcb.pic, */ -/* rs->xinf->fmt8, 0, 0, 0, 0, */ -/* pts, num, Complex); */ -/* free(pts); */ -} diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xcb_ximage.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xcb_ximage.c deleted file mode 100644 index 4a75ac3304..0000000000 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xcb_ximage.c +++ /dev/null @@ -1,574 +0,0 @@ -#include "evas_common.h" -#include "evas_private.h" -#include "evas_engine.h" -#include "Evas_Engine_XRender_X11.h" - -static Eina_List *_image_info_list = NULL; - -static int _xcb_err = 0; - -enum -{ - xcb_render_pictforminfo_id = 1 << 0, - xcb_render_pictforminfo_type_t = 1 << 1, - xcb_render_pictforminfo_depth_t = 1 << 2, - xcb_render_pictforminfo_red_shift_t = 1 << 3, - xcb_render_pictforminfo_red_mask_t = 1 << 4, - xcb_render_pictforminfo_green_shift_t = 1 << 5, - xcb_render_pictforminfo_green_mask_t = 1 << 6, - xcb_render_pictforminfo_blue_shift_t = 1 << 7, - xcb_render_pictforminfo_blue_mask_t = 1 << 8, - xcb_render_pictforminfo_alpha_shift_t = 1 << 9, - xcb_render_pictforminfo_alpha_mask_t = 1 << 10, - xcb_render_pictforminfo_colormap_t = 1 << 11, -}; - -enum -{ - xcb_render_standard_pictforminfoargb_32_t, - xcb_render_standard_pictforminforgb_24_t, - xcb_render_standard_pictforminfoa_8_t, - xcb_render_standard_pictforminfoa_4_t, - xcb_render_standard_pictforminfoa_1_t, - xcb_render_standard_pictforminfo_count_t -}; - -static xcb_render_pictforminfo_t * -xcb_render_find_pictforminfo (xcb_connection_t *conn, uint32_t mask, const xcb_render_pictforminfo_t *template, int count) -{ - xcb_render_query_pict_formats_cookie_t cookie; - xcb_render_query_pict_formats_reply_t *rep; - xcb_render_pictforminfo_iterator_t iter_forminfo; - - cookie = xcb_render_query_pict_formats_unchecked (conn); - rep = xcb_render_query_pict_formats_reply (conn, cookie, NULL); - iter_forminfo = xcb_render_query_pict_formats_formats_iterator (rep); - for (; iter_forminfo.rem; xcb_render_pictforminfo_next (&iter_forminfo)) { - if (mask & xcb_render_pictforminfo_id) - if (template->id != iter_forminfo.data->id) - continue; - if (mask & xcb_render_pictforminfo_type_t) - if (template->type != iter_forminfo.data->type) - continue; - if (mask & xcb_render_pictforminfo_depth_t) - if (template->depth != iter_forminfo.data->depth) - continue; - if (mask & xcb_render_pictforminfo_red_shift_t) - if (template->direct.red_shift != iter_forminfo.data->direct.red_shift) - continue; - if (mask & xcb_render_pictforminfo_red_mask_t) - if (template->direct.red_mask != iter_forminfo.data->direct.red_mask) - continue; - if (mask & xcb_render_pictforminfo_green_shift_t) - if (template->direct.green_shift != iter_forminfo.data->direct.green_shift) - continue; - if (mask & xcb_render_pictforminfo_green_mask_t) - if (template->direct.green_mask != iter_forminfo.data->direct.green_mask) - continue; - if (mask & xcb_render_pictforminfo_blue_shift_t) - if (template->direct.blue_shift != iter_forminfo.data->direct.blue_shift) - continue; - if (mask & xcb_render_pictforminfo_blue_mask_t) - if (template->direct.blue_mask != iter_forminfo.data->direct.blue_mask) - continue; - if (mask & xcb_render_pictforminfo_alpha_shift_t) - if (template->direct.alpha_shift != iter_forminfo.data->direct.alpha_shift) - continue; - if (mask & xcb_render_pictforminfo_alpha_mask_t) - if (template->direct.alpha_mask != iter_forminfo.data->direct.alpha_mask) - continue; - if (mask & xcb_render_pictforminfo_colormap_t) - if (template->colormap != iter_forminfo.data->colormap) - continue; - if (count-- == 0) { - xcb_render_pictforminfo_t *forminfo; - - forminfo = (xcb_render_pictforminfo_t *)malloc (sizeof (xcb_render_pictforminfo_t)); - memcpy (forminfo, iter_forminfo.data, sizeof (xcb_render_pictforminfo_t)); - - free (rep); - return forminfo; - } - } - free (rep); - return NULL; -} - -static xcb_render_pictforminfo_t * -xcb_render_find_standard_pictforminfo (xcb_connection_t *conn, int format) -{ - xcb_render_pictforminfo_t *forminfo = NULL; - struct { - xcb_render_pictforminfo_t template; - uint32_t mask; - } standardFormats[xcb_render_standard_pictforminfo_count_t] = { - /* StandardPICTFORMINFOARGB32 */ - { - { - 0, /* id */ - XCB_RENDER_PICT_TYPE_DIRECT, /* type */ - 32, /* depth */ - { 0, 0 }, /* pad */ - { /* direct */ - 16, /* direct.red_shift */ - 0xff, /* direct.red_mask */ - 8, /* direct.green_shift */ - 0xff, /* direct.green_mask */ - 0, /* direct.blue_shift */ - 0xff, /* direct.blue_mask */ - 24, /* direct.alpha_shift */ - 0xff /* direct.alpha_mask */ - }, - 0 /* colormap */ - }, - xcb_render_pictforminfo_type_t | - xcb_render_pictforminfo_depth_t | - xcb_render_pictforminfo_red_shift_t | - xcb_render_pictforminfo_red_mask_t | - xcb_render_pictforminfo_green_shift_t | - xcb_render_pictforminfo_green_mask_t | - xcb_render_pictforminfo_blue_shift_t | - xcb_render_pictforminfo_blue_mask_t | - xcb_render_pictforminfo_alpha_shift_t | - xcb_render_pictforminfo_alpha_mask_t - }, - /* StandardPICTFORMINFORGB24 */ - { - { - 0, /* id */ - XCB_RENDER_PICT_TYPE_DIRECT, /* type */ - 24, /* depth */ - { 0, 0 }, /* pad */ - { /* direct */ - 16, /* direct.red_shift */ - 0xff, /* direct.red_mask */ - 8, /* direct.green_shift */ - 0xff, /* direct.green_mask */ - 0, /* direct.blue_shift */ - 0xff, /* direct.blue_mask */ - 0, /* direct.alpha_shift */ - 0x00 /* direct.alpha_mask */ - }, - 0 /* colormap */ - }, - xcb_render_pictforminfo_type_t | - xcb_render_pictforminfo_depth_t | - xcb_render_pictforminfo_red_shift_t | - xcb_render_pictforminfo_red_mask_t | - xcb_render_pictforminfo_green_shift_t | - xcb_render_pictforminfo_green_mask_t | - xcb_render_pictforminfo_blue_shift_t | - xcb_render_pictforminfo_blue_mask_t | - xcb_render_pictforminfo_alpha_mask_t - }, - /* StandardPICTFORMINFOA8 */ - { - { - 0, /* id */ - XCB_RENDER_PICT_TYPE_DIRECT, /* type */ - 8, /* depth */ - { 0, 0 }, /* pad */ - { /* direct */ - 0, /* direct.red_shift */ - 0x00, /* direct.red_mask */ - 0, /* direct.green_shift */ - 0x00, /* direct.green_mask */ - 0, /* direct.blue_shift */ - 0x00, /* direct.blue_mask */ - 0, /* direct.alpha_shift */ - 0xff /* direct.alpha_mask */ - }, - 0 /* colormap */ - }, - xcb_render_pictforminfo_type_t | - xcb_render_pictforminfo_depth_t | - xcb_render_pictforminfo_red_mask_t | - xcb_render_pictforminfo_green_mask_t | - xcb_render_pictforminfo_blue_mask_t | - xcb_render_pictforminfo_alpha_shift_t | - xcb_render_pictforminfo_alpha_mask_t - }, - /* StandardPICTFORMINFOA4 */ - { - { - 0, /* id */ - XCB_RENDER_PICT_TYPE_DIRECT, /* type */ - 4, /* depth */ - { 0, 0 }, /* pad */ - { /* direct */ - 0, /* direct.red_shift */ - 0x00, /* direct.red_mask */ - 0, /* direct.green_shift */ - 0x00, /* direct.green_mask */ - 0, /* direct.blue_shift */ - 0x00, /* direct.blue_mask */ - 0, /* direct.alpha_shift */ - 0x0f /* direct.alpha_mask */ - }, - 0 /* colormap */ - }, - xcb_render_pictforminfo_type_t | - xcb_render_pictforminfo_depth_t | - xcb_render_pictforminfo_red_mask_t | - xcb_render_pictforminfo_green_mask_t | - xcb_render_pictforminfo_blue_mask_t | - xcb_render_pictforminfo_alpha_shift_t | - xcb_render_pictforminfo_alpha_mask_t - }, - /* StandardPICTFORMINFOA1 */ - { - { - 0, /* id */ - XCB_RENDER_PICT_TYPE_DIRECT, /* type */ - 1, /* depth */ - { 0, 0 }, /* pad */ - { /* direct */ - 0, /* direct.red_shift */ - 0x00, /* direct.red_mask */ - 0, /* direct.green_shift */ - 0x00, /* direct.green_mask */ - 0, /* direct.blue_shift */ - 0x00, /* direct.blue_mask */ - 0, /* direct.alpha_shift */ - 0x01 /* direct.alpha_mask */ - }, - 0 /* colormap */ - }, - xcb_render_pictforminfo_type_t | - xcb_render_pictforminfo_depth_t | - xcb_render_pictforminfo_red_mask_t | - xcb_render_pictforminfo_green_mask_t | - xcb_render_pictforminfo_blue_mask_t | - xcb_render_pictforminfo_alpha_shift_t | - xcb_render_pictforminfo_alpha_mask_t - }, - }; - if ((format >= 0) && (format < xcb_render_standard_pictforminfo_count_t)) - forminfo = xcb_render_find_pictforminfo (conn, - standardFormats[format].mask, - &standardFormats[format].template, - 0); - return forminfo; -} - -static void -_tmp_xcb_err(xcb_connection_t *conn __UNUSED__/* , XErrorEvent *ev */) -{ - _xcb_err = 1; - return; -} - -Ximage_Info * -_xr_xcb_image_info_get(xcb_connection_t *conn, xcb_screen_t *screen, xcb_drawable_t draw, xcb_visualtype_t *visual) -{ - xcb_get_geometry_cookie_t cookie; - xcb_get_geometry_reply_t *rep; - Ximage_Info *xinf; - Ximage_Info *xinf2; - Eina_List *l; - - xinf2 = NULL; - EINA_LIST_FOREACH(_image_info_list, l, xinf) - { - if (xinf->x11.connection == conn) - { - xinf2 = xinf; - break; - } - } - xinf = calloc(1, sizeof(Ximage_Info)); - if (!xinf) return NULL; - - xinf->references = 1; - xinf->x11.connection = conn; - xinf->x11.screen = screen; - xinf->x11.draw = draw; - cookie = xcb_get_geometry_unchecked(xinf->x11.connection, xinf->x11.draw); - rep = xcb_get_geometry_reply(xinf->x11.connection, cookie, NULL); - xinf->x11.root = rep->root; - free(rep); - xinf->x11.visual = visual; - xinf->x11.fmt32 = xcb_render_find_standard_pictforminfo(xinf->x11.connection, xcb_render_standard_pictforminfoargb_32_t); - xinf->x11.fmt24 = xcb_render_find_standard_pictforminfo(xinf->x11.connection, xcb_render_standard_pictforminforgb_24_t); - xinf->x11.fmt8 = xcb_render_find_standard_pictforminfo(xinf->x11.connection, xcb_render_standard_pictforminfoa_8_t); - xinf->x11.fmt4 = xcb_render_find_standard_pictforminfo(xinf->x11.connection, xcb_render_standard_pictforminfoa_4_t); - xinf->x11.fmt1 = xcb_render_find_standard_pictforminfo(xinf->x11.connection, xcb_render_standard_pictforminfoa_1_t); - - xinf->mul = _xr_xcb_render_surface_new(xinf, 1, 1, xinf->x11.fmt32, 1); - _xr_xcb_render_surface_repeat_set(xinf->mul, 1); - xinf->mul_r = xinf->mul_g = xinf->mul_b = xinf->mul_a = 0xff; - _xr_xcb_render_surface_solid_rectangle_set(xinf->mul, xinf->mul_r, xinf->mul_g, xinf->mul_b, xinf->mul_a, 0, 0, 1, 1); - if (xinf2) - { - xinf->can_do_shm = xinf2->can_do_shm; - xinf->depth = xinf2->depth; - } - else - { - xcb_depth_iterator_t iter_depth; - xcb_shm_segment_info_t shm_info; - xcb_image_t *xim; - - iter_depth = xcb_screen_allowed_depths_iterator (xinf->x11.screen); - for (; iter_depth.rem ; xcb_depth_next (&iter_depth)) - { - xcb_visualtype_iterator_t iter_visual; - - iter_visual = xcb_depth_visuals_iterator (iter_depth.data); - for (; iter_visual.rem ; xcb_visualtype_next (&iter_visual)) - { - if (iter_visual.data->visual_id == visual->visual_id) - xinf->depth = iter_depth.data->depth; - } - } - - xinf->can_do_shm = 0; - - - shm_info.shmseg = xcb_generate_id(xinf->x11.connection); - xim = xcb_image_create_native(xinf->x11.connection, 1, 1, - XCB_IMAGE_FORMAT_Z_PIXMAP, - xinf->depth, NULL, ~0, NULL); - if (xim) { - shm_info.shmid = shmget(IPC_PRIVATE, xim->size, IPC_CREAT | 0777); - if (shm_info.shmid >= 0) { - shm_info.shmaddr = xim->data = shmat(shm_info.shmid, 0, 0); - if ((shm_info.shmaddr) && (shm_info.shmaddr != (void *) -1)) { - xcb_get_input_focus_reply_t *reply; - /* - * FIXME: no error mechanism - */ - /* XErrorHandler ph; */ - - /* we sync */ - reply = xcb_get_input_focus_reply(xinf->x11.connection, - xcb_get_input_focus_unchecked(xinf->x11.connection), - NULL); - free(reply); - _xcb_err = 0; - /* ph = XSetErrorHandler((XErrorHandler)_tmp_xcb_err); */ - xcb_shm_attach(xinf->x11.connection, shm_info.shmseg, shm_info.shmid, 0); - /* we sync */ - reply = xcb_get_input_focus_reply(xinf->x11.connection, - xcb_get_input_focus_unchecked(xinf->x11.connection), - NULL); - free(reply); - /* XSetErrorHandler((XErrorHandler)ph); */ - if (!_xcb_err) xinf->can_do_shm = 1; - shmdt(shm_info.shmaddr); - } - shmctl(shm_info.shmid, IPC_RMID, 0); - } - xcb_image_destroy(xim); - } - } - _image_info_list = eina_list_prepend(_image_info_list, xinf); - return xinf; -} - -void -_xr_xcb_image_info_free(Ximage_Info *xinf) -{ - if (!xinf) return; - if (xinf->pool) - { - xcb_get_input_focus_reply_t *reply; - - reply = xcb_get_input_focus_reply(xinf->x11.connection, - xcb_get_input_focus_unchecked(xinf->x11.connection), - NULL); - free(reply); - } - _xr_xcb_image_info_pool_flush(xinf, 0, 0); - xinf->references--; - if (xinf->references != 0) return; - _xr_xcb_render_surface_free(xinf->mul); - if (xinf->x11.fmt1) - free(xinf->x11.fmt1); - if (xinf->x11.fmt4) - free(xinf->x11.fmt4); - if (xinf->x11.fmt8) - free(xinf->x11.fmt8); - if (xinf->x11.fmt24) - free(xinf->x11.fmt24); - if (xinf->x11.fmt32) - free(xinf->x11.fmt32); - free(xinf); - _image_info_list = eina_list_remove(_image_info_list, xinf); -} - -void -_xr_xcb_image_info_pool_flush(Ximage_Info *xinf, unsigned int max_num, unsigned int max_mem) -{ - if ((xinf->pool_mem <= max_mem) && (eina_list_count(xinf->pool) <= max_num)) return; - while ((xinf->pool_mem > max_mem) || (eina_list_count(xinf->pool) > max_num)) - { - Ximage_Image *xim; - - if (!xinf->pool) break; - xim = xinf->pool->data; - _xr_xcb_image_free(xim); - } -} - -Ximage_Image * -_xr_xcb_image_new(Ximage_Info *xinf, int w, int h, int depth) -{ - Ximage_Image *xim; - Ximage_Image *xim2; - Eina_List *l; - - xim2 = NULL; - EINA_LIST_FOREACH(xinf->pool, l, xim) - { - if ((xim->width >= w) && (xim->height >= h) && (xim->depth == depth) && (xim->available)) - { - if (!xim2) xim2 = xim; - else if ((xim->width * xim->height) < (xim2->width * xim2->height)) xim2 = xim; - } - } - if (xim2) - { - xim2->available = 0; - return xim2; - } - xim = calloc(1, sizeof(Ximage_Image)); - if (xim) - { - xim->xinf = xinf; - xim->width = w; - xim->height = h; - xim->depth = depth; - xim->available = 0; - if (xim->xinf->can_do_shm) - { - xim->x11.xcb.shm_info = calloc(1, sizeof(xcb_shm_segment_info_t)); - if (xim->x11.xcb.shm_info) - { - xim->x11.xcb.shm_info->shmseg = xcb_generate_id(xinf->x11.connection); - xim->x11.xcb.xim = xcb_image_create_native(xim->xinf->x11.connection, xim->width, xim->height, XCB_IMAGE_FORMAT_Z_PIXMAP, xim->depth, NULL, ~0, NULL); - if (xim->x11.xcb.xim) - { - xim->x11.xcb.shm_info->shmid = shmget(IPC_PRIVATE, xim->x11.xcb.xim->size, IPC_CREAT | 0777); - if (xim->x11.xcb.shm_info->shmid >= 0) - { - xim->x11.xcb.shm_info->shmaddr = xim->x11.xcb.xim->data = shmat(xim->x11.xcb.shm_info->shmid, 0, 0); - if ((xim->x11.xcb.shm_info->shmaddr) && (xim->x11.xcb.shm_info->shmaddr != (void *) -1)) - { - xcb_get_input_focus_reply_t *reply; - /* - * FIXME: no error mechanism - */ - /* XErrorHandler ph; */ - - /* we sync */ - reply = xcb_get_input_focus_reply(xim->xinf->x11.connection, - xcb_get_input_focus_unchecked(xim->xinf->x11.connection), - NULL); - free(reply); - _xcb_err = 0; -/* ph = XSetErrorHandler((XErrorHandler)_tmp_xcb_err); */ - xcb_shm_attach(xim->xinf->x11.connection, xim->x11.xcb.shm_info->shmseg, xim->x11.xcb.shm_info->shmid, 0); - /* we sync */ - reply = xcb_get_input_focus_reply(xim->xinf->x11.connection, - xcb_get_input_focus_unchecked(xim->xinf->x11.connection), - NULL); - free(reply); -/* XSetErrorHandler((XErrorHandler)ph); */ - if (!_xcb_err) goto xim_ok; - shmdt(xim->x11.xcb.shm_info->shmaddr); - } - shmctl(xim->x11.xcb.shm_info->shmid, IPC_RMID, 0); - } - xcb_image_destroy(xim->x11.xcb.xim); - } - free(xim->x11.xcb.shm_info); - xim->x11.xcb.shm_info = NULL; - } - } - xim->x11.xcb.xim = xcb_image_create_native(xim->xinf->x11.connection, xim->width, xim->height, XCB_IMAGE_FORMAT_Z_PIXMAP, xim->depth, NULL, ~0, NULL); - if (!xim->x11.xcb.xim) - { - free(xim); - return NULL; - } - xim->x11.xcb.xim->data = malloc(xim->x11.xcb.xim->size); - if (!xim->x11.xcb.xim->data) - { - xcb_image_destroy(xim->x11.xcb.xim); - free(xim); - return NULL; - } - } - - xim_ok: - _xr_xcb_image_info_pool_flush(xinf, 32, (1600 * 1200 * 32 * 2)); - - xim->line_bytes = xim->x11.xcb.xim->stride; - xim->data = (void *)(xim->x11.xcb.xim->data); - xinf->pool_mem += (xim->width * xim->height * xim->depth); - xinf->pool = eina_list_append(xinf->pool, xim); - return xim; -} - -void -_xr_xcb_image_free(Ximage_Image *xim) -{ - if (xim->x11.xcb.shm_info) - { - if (!xim->available) - { - xcb_get_input_focus_reply_t *reply; - - reply = xcb_get_input_focus_reply(xim->xinf->x11.connection, - xcb_get_input_focus_unchecked(xim->xinf->x11.connection), - NULL); - free(reply); - } - xcb_shm_detach(xim->xinf->x11.connection, xim->x11.xcb.shm_info->shmseg); - xcb_image_destroy(xim->x11.xcb.xim); - shmdt(xim->x11.xcb.shm_info->shmaddr); - shmctl(xim->x11.xcb.shm_info->shmid, IPC_RMID, 0); - free(xim->x11.xcb.shm_info); - } - else - { - free(xim->x11.xcb.xim->data); - xim->x11.xcb.xim->data = NULL; - xcb_image_destroy(xim->x11.xcb.xim); - } - xim->xinf->pool_mem -= (xim->width * xim->height * xim->depth); - xim->xinf->pool = eina_list_remove(xim->xinf->pool, xim); - free(xim); -} - -void -_xr_xcb_image_put(Ximage_Image *xim, xcb_drawable_t draw, int x, int y, int w, int h) -{ - xcb_get_input_focus_reply_t *reply; - xcb_gcontext_t gc; - - gc = xcb_generate_id(xim->xinf->x11.connection); - xcb_create_gc(xim->xinf->x11.connection, gc, draw, 0, NULL); - if (xim->x11.xcb.shm_info) - { - xcb_shm_put_image(xim->xinf->x11.connection, draw, gc, - xim->x11.xcb.xim->width, xim->x11.xcb.xim->height, - 0, 0, - w, h, - x, y, - xim->x11.xcb.xim->depth, xim->x11.xcb.xim->format, - 0, - xim->x11.xcb.shm_info->shmseg, - xim->x11.xcb.xim->data - xim->x11.xcb.shm_info->shmaddr); - /* we sync */ - reply = xcb_get_input_focus_reply(xim->xinf->x11.connection, - xcb_get_input_focus_unchecked(xim->xinf->x11.connection), - NULL); - free(reply); - } - else - xcb_image_put(xim->xinf->x11.connection, draw, gc, xim->x11.xcb.xim, x, y, 0); - xim->available = 1; - xcb_free_gc(xim->xinf->x11.connection, gc); -} diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xlib_font.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xlib_font.c deleted file mode 100644 index a23c9eb15d..0000000000 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xlib_font.c +++ /dev/null @@ -1,192 +0,0 @@ -#include "evas_common.h" -#include "evas_private.h" -#include "evas_engine.h" -#include "Evas_Engine_XRender_X11.h" - -static Eina_Hash *_xr_fg_pool = NULL; - -XR_Font_Surface * -_xre_xlib_font_surface_new(Ximage_Info *xinf, RGBA_Font_Glyph *fg) -{ - XR_Font_Surface *fs; - DATA8 *data; - int w, h, j; - XRenderPictureAttributes att; - XRenderPictFormat *fmt; - Ximage_Image *xim; - Eina_Hash *pool; - char buf[256], buf2[256]; - - data = fg->glyph_out->bitmap.buffer; - w = fg->glyph_out->bitmap.width; - h = fg->glyph_out->bitmap.rows; - j = fg->glyph_out->bitmap.pitch; - if (j < w) j = w; - if ((w <= 0) || (h <= 0)) return NULL; - - if (fg->ext_dat) - { - fs = fg->ext_dat; - if ((fs->xinf->x11.connection == xinf->x11.connection) && (fs->xinf->x11.root == xinf->x11.root)) - return fs; - snprintf(buf, sizeof(buf), "@%p@/@%lx@", fs->xinf->x11.connection, (unsigned long int)fs->xinf->x11.root); - pool = eina_hash_find(_xr_fg_pool, buf); - if (pool) - { - snprintf(buf, sizeof(buf), "%p", fg); - fs = eina_hash_find(pool, buf); - if (fs) return fs; - } - } - - fs = calloc(1, sizeof(XR_Font_Surface)); - if (!fs) return NULL; - - fs->xinf = xinf; - fs->fg = fg; - fs->xinf->references++; - fs->w = w; - fs->h = h; - - snprintf(buf, sizeof(buf), "@%p@/@%lx@", fs->xinf->x11.connection, (unsigned long int)fs->xinf->x11.root); - pool = eina_hash_find(_xr_fg_pool, buf); - if (!pool) pool = eina_hash_string_superfast_new(NULL); - snprintf(buf2, sizeof(buf2), "%p", fg); - eina_hash_add(pool, buf2, fs); - if (!_xr_fg_pool) _xr_fg_pool = eina_hash_string_superfast_new(NULL); - eina_hash_add(_xr_fg_pool, buf, pool); - - /* FIXME: maybe use fmt4? */ - fmt = xinf->x11.fmt8; - fs->draw = XCreatePixmap(xinf->x11.connection, xinf->x11.root, w, h,fmt->depth); - att.dither = 0; - att.component_alpha = 0; - att.repeat = 0; - fs->pic = XRenderCreatePicture(xinf->x11.connection, fs->draw,fmt, - CPRepeat | CPDither | CPComponentAlpha, &att); - - /* FIXME: handle if fmt->depth != 8 */ - xim = _xr_xlib_image_new(fs->xinf, w, h,fmt->depth); - if ((fg->glyph_out->bitmap.num_grays == 256) && - (fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays)) - { - int x, y; - DATA8 *p1, *p2; - - for (y = 0; y < h; y++) - { - p1 = data + (j * y); - p2 = ((DATA8 *)xim->data) + (xim->line_bytes * y); - for (x = 0; x < w; x++) - { - *p2 = *p1; - p1++; - p2++; - } - } - - } - else - { - DATA8 *tmpbuf = NULL, *dp, *tp, bits; - int bi, bj, end; - const DATA8 bitrepl[2] = {0x0, 0xff}; - - tmpbuf = alloca(w); - { - int x, y; - DATA8 *p1, *p2; - - for (y = 0; y < h; y++) - { - p1 = tmpbuf; - p2 = ((DATA8 *)xim->data) + (xim->line_bytes * y); - tp = tmpbuf; - dp = data + (y * 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++; - } - for (x = 0; x < w; x++) - { - *p2 = *p1; - p1++; - p2++; - } - } - } - } - _xr_xlib_image_put(xim, fs->draw, 0, 0, w, h); - return fs; -} - -static Eina_Bool -_xre_xlib_font_pool_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata) -{ - char buf[256]; - Eina_Hash *pool; - XR_Font_Surface *fs; - - fs = fdata; - pool = data; - snprintf(buf, sizeof(buf), "@%p@/@%lx@", fs->xinf->x11.connection, (unsigned long int)fs->xinf->x11.root); - eina_hash_del(pool, buf, fs); - return 1; -} - -void -_xre_xlib_font_surface_free(XR_Font_Surface *fs) -{ - if (!fs) return; - eina_hash_foreach(_xr_fg_pool, _xre_xlib_font_pool_cb, fs); - XFreePixmap(fs->xinf->x11.connection, fs->draw); - XRenderFreePicture(fs->xinf->x11.connection, fs->pic); - _xr_xlib_image_info_free(fs->xinf); - free(fs); -} - -void -_xre_xlib_font_surface_draw(Ximage_Info *xinf __UNUSED__, RGBA_Image *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y) -{ - XR_Font_Surface *fs; - Xrender_Surface *target_surface; - XRectangle rect; - int r, g, b, a; - - fs = fg->ext_dat; - if (!fs || !fs->xinf || !dc || !dc->col.col) return; - if (!surface || !surface->image.data) return; - target_surface = (Xrender_Surface *)(surface->image.data); - a = (dc->col.col >> 24) & 0xff; - r = (dc->col.col >> 16) & 0xff; - g = (dc->col.col >> 8 ) & 0xff; - b = (dc->col.col ) & 0xff; - if ((fs->xinf->mul_r != r) || (fs->xinf->mul_g != g) || - (fs->xinf->mul_b != b) || (fs->xinf->mul_a != a)) - { - fs->xinf->mul_r = r; - fs->xinf->mul_g = g; - fs->xinf->mul_b = b; - fs->xinf->mul_a = a; - _xr_xlib_render_surface_solid_rectangle_set(fs->xinf->mul, r, g, b, a, 0, 0, 1, 1); - } - rect.x = x; rect.y = y; rect.width = fs->w; rect.height = fs->h; - if (dc->clip.use) - { - RECTS_CLIP_TO_RECT(rect.x, rect.y, rect.width, rect.height, - dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h); - } - XRenderSetPictureClipRectangles(target_surface->xinf->x11.connection, - target_surface->x11.xlib.pic, 0, 0, &rect, 1); - XRenderComposite(fs->xinf->x11.connection, PictOpOver, fs->xinf->mul->x11.xlib.pic, - fs->pic, target_surface->x11.xlib.pic, - 0, 0, 0, 0, x, y, fs->w, fs->h); -} diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xlib_image.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xlib_image.c deleted file mode 100644 index 2e4078e236..0000000000 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xlib_image.c +++ /dev/null @@ -1,705 +0,0 @@ -#include "evas_common.h" -#include "evas_private.h" -#include "evas_engine.h" -#include "Evas_Engine_XRender_X11.h" - -static Eina_Hash *_xr_image_hash = NULL; -static int _xr_image_cache_size = 0; -static int _xr_image_cache_usage = 0; -static Eina_List *_xr_image_cache = NULL; -static Eina_Hash *_xr_image_dirty_hash = NULL; - -static void -__xre_xlib_image_dirty_hash_add(XR_Image *im) -{ - char buf[64]; - - if (!im->data) return; - snprintf(buf, sizeof(buf), "%p", im->data); - if (!_xr_image_dirty_hash) _xr_image_dirty_hash = eina_hash_string_superfast_new(NULL); - eina_hash_add(_xr_image_dirty_hash, buf, im); -} - -static void -__xre_xlib_image_dirty_hash_del(XR_Image *im) -{ - char buf[64]; - - if (!im->data) return; - snprintf(buf, sizeof(buf), "%p", im->data); - eina_hash_del(_xr_image_dirty_hash, buf, im); -} - -static XR_Image * -__xre_xlib_image_dirty_hash_find(void *data) -{ - char buf[64]; - - snprintf(buf, sizeof(buf), "%p", data); - return eina_hash_find(_xr_image_dirty_hash, buf); -} - -static XR_Image * -__xre_xlib_image_find(char *fkey) -{ - XR_Image *im; - - im = eina_hash_find(_xr_image_hash, fkey); - if (!im) - { - Eina_List *l; - - for (l = _xr_image_cache; l; l = l->next) - { - im = l->data; - if (!strcmp(im->fkey, fkey)) - { - _xr_image_cache = eina_list_remove_list(_xr_image_cache, l); - if (!_xr_image_hash) _xr_image_hash = eina_hash_string_superfast_new(NULL); - eina_hash_add(_xr_image_hash, im->fkey, im); - _xr_image_cache_usage -= (im->w * im->h * 4); - break; - } - im = NULL; - } - } - if (im) im->references++; - return im; -} - -XR_Image * -_xre_xlib_image_load(Ximage_Info *xinf, const char *file, const char *key, Evas_Image_Load_Opts *lo, int *error) -{ - XR_Image *im; - char buf[4096]; - - if (!file) - { - *error = EVAS_LOAD_ERROR_GENERIC; - return NULL; - } - if (!lo) - { - if (key) - snprintf(buf, sizeof(buf), "/@%p@%lx@/%s//://%s", xinf->x11.connection, (unsigned long int)xinf->x11.root, file, key); - else - snprintf(buf, sizeof(buf), "/@%p@%lx@/%s", xinf->x11.connection, (unsigned long int)xinf->x11.root, file); - } - else - { - if (key) - snprintf(buf, sizeof(buf), "//@/%i/%1.5f/%ix%i//@%p@%lx@/%s//://%s", lo->scale_down_by, lo->dpi, lo->w, lo->h, xinf->x11.connection, (unsigned long int)xinf->x11.root, file, key); - else - snprintf(buf, sizeof(buf), "//@/%i/%1.5f/%ix%i//@%p@%lx@/%s", lo->scale_down_by, lo->dpi, lo->w, lo->h, xinf->x11.connection, (unsigned long int)xinf->x11.root, file); - } - im = __xre_xlib_image_find(buf); - if (im) - { - *error = EVAS_LOAD_ERROR_NONE; - return im; - } - - im = calloc(1, sizeof(XR_Image)); - if (!im) - { - *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED; - return NULL; - } - im->im = evas_common_load_image_from_file(file, key, lo, error); - if (!im->im) - { - free(im); - return NULL; - } - im->xinf = xinf; - im->xinf->references++; - im->cs.space = EVAS_COLORSPACE_ARGB8888; - im->fkey = strdup(buf); - im->file = eina_stringshare_add(file); - if (key) im->key = eina_stringshare_add(key); - im->w = im->im->cache_entry.w; - im->h = im->im->cache_entry.h; - im->references = 1; - if (lo) im->load_opts = *lo; - im->load_error = error; /* points to object's load_error */ - if (im->im->info.comment) im->comment = eina_stringshare_add(im->im->info.comment); -// if (im->im->info.format == 1) im->format = eina_stringshare_add("png"); - if (im->im->cache_entry.flags.alpha) im->alpha = 1; - if (!_xr_image_hash) _xr_image_hash = eina_hash_string_superfast_new(NULL); - eina_hash_direct_add(_xr_image_hash, im->fkey, im); - return im; -} - -XR_Image * -_xre_xlib_image_new_from_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace) -{ - XR_Image *im; - - im = calloc(1, sizeof(XR_Image)); - if (!im) return NULL; - im->xinf = xinf; - im->xinf->references++; - im->cs.space = cspace; - im->w = w; - im->h = h; - im->references = 1; - switch (im->cs.space) - { - case EVAS_COLORSPACE_ARGB8888: - im->data = data; - im->alpha = alpha; - break; - case EVAS_COLORSPACE_YCBCR422P601_PL: - case EVAS_COLORSPACE_YCBCR422P709_PL: - im->cs.data = data; - im->cs.no_free = 1; - break; - default: - abort(); - break; - } - im->dirty = 1; - __xre_xlib_image_dirty_hash_add(im); - return im; -} - -XR_Image * -_xre_xlib_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace) -{ - XR_Image *im; - - im = calloc(1, sizeof(XR_Image)); - if (!im) return NULL; - im->cs.space = cspace; - switch (im->cs.space) - { - case EVAS_COLORSPACE_ARGB8888: - im->data = malloc(w * h * 4); - if (!im->data) - { - free(im); - return NULL; - } - if (data) - { - Gfx_Func_Copy func; - - func = evas_common_draw_func_copy_get(w * h, 0); - if (func) func(data, im->data, w * h); - evas_common_cpu_end_opt(); - } - im->alpha = alpha; - im->free_data = 1; - break; - case EVAS_COLORSPACE_YCBCR422P601_PL: - case EVAS_COLORSPACE_YCBCR422P709_PL: - im->cs.no_free = 0; - im->cs.data = calloc(1, h * sizeof(unsigned char *) * 2); - if ((data) && (im->cs.data)) - memcpy(im->cs.data, data, h * sizeof(unsigned char *) * 2); - break; - default: - abort(); - break; - } - im->w = w; - im->h = h; - im->references = 1; - im->xinf = xinf; - im->xinf->references++; - im->dirty = 1; - __xre_xlib_image_dirty_hash_add(im); - return im; -} - -XR_Image * -_xre_xlib_image_new(Ximage_Info *xinf, int w, int h) -{ - XR_Image *im; - - im = calloc(1, sizeof(XR_Image)); - if (!im) return NULL; - im->data = malloc(w * h * 4); - if (!im->data) - { - free(im); - return NULL; - } - im->w = w; - im->h = h; - im->references = 1; - im->cs.space = EVAS_COLORSPACE_ARGB8888; - im->xinf = xinf; - im->xinf->references++; - im->free_data = 1; - im->alpha = 1; - im->dirty = 1; - __xre_xlib_image_dirty_hash_add(im); - return im; -} - -static void -__xre_xlib_image_real_free(XR_Image *im) -{ - if (im->cs.data) - { - if (!im->cs.no_free) free(im->cs.data); - } - if (im->file) eina_stringshare_del(im->file); - if (im->key) eina_stringshare_del(im->key); - if (im->fkey) free(im->fkey); - if (im->im) evas_cache_image_drop(&im->im->cache_entry); - if ((im->data) && (im->dirty)) __xre_xlib_image_dirty_hash_del(im); - if ((im->free_data) && (im->data)) free(im->data); - if (im->surface) _xr_xlib_render_surface_free(im->surface); - if (im->format) eina_stringshare_del(im->format); - if (im->comment) eina_stringshare_del(im->comment); - if (im->updates) evas_common_tilebuf_free(im->updates); - _xr_xlib_image_info_free(im->xinf); - free(im); -} - -void -_xre_xlib_image_free(XR_Image *im) -{ - im->references--; - if (im->references != 0) return; - if (!im->dirty) - { - if (im->fkey) - eina_hash_del(_xr_image_hash, im->fkey, im); - _xr_image_cache = eina_list_prepend(_xr_image_cache, im); - _xr_image_cache_usage += (im->w * im->h * 4); - _xre_xlib_image_cache_set(_xr_image_cache_size); - } - else - { - __xre_xlib_image_real_free(im); - } -} - -void -_xre_xlib_image_region_dirty(XR_Image *im, int x, int y, int w, int h) -{ - if (!im->updates) - { - im->updates = evas_common_tilebuf_new(im->w, im->h); - if (im->updates) evas_common_tilebuf_set_tile_size(im->updates, 8, 8); - } - if (im->updates) - evas_common_tilebuf_add_redraw(im->updates, x, y, w, h); -} - -void -_xre_xlib_image_dirty(XR_Image *im) -{ - if (im->dirty) return; - if (im->fkey) - eina_hash_del(_xr_image_hash, im->fkey, im); - im->dirty = 1; - __xre_xlib_image_dirty_hash_add(im); -} - -XR_Image * -_xre_xlib_image_copy(XR_Image *im) -{ - XR_Image *im2; - void *data = NULL; - - if (im->data) data = im->data; - else if (im->cs.data) data = im->cs.data; - else - { - if (!im->im) - im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts), im->load_error); - if (im->im) - { - evas_cache_image_load_data(&im->im->cache_entry); - data = im->im->image.data; - } - } - if (!data) return NULL; - im2 = _xre_xlib_image_new_from_copied_data(im->xinf, im->w, im->h, data, im->alpha, im->cs.space); - return im2; -} - -void -_xre_xlib_image_resize(XR_Image *im, int w, int h) -{ - if ((w == im->w) && (h == im->h)) return; - if (im->surface) - { - Xrender_Surface *old_surface; - old_surface = im->surface; - im->surface = _xr_xlib_render_surface_new(old_surface->xinf, w + 2, h + 2, old_surface->x11.xlib.fmt, old_surface->alpha); - _xr_xlib_render_surface_free(old_surface); - } - switch (im->cs.space) - { - case EVAS_COLORSPACE_ARGB8888: - if (im->data) - { - if (im->free_data) - { - if (im->data) free(im->data); - im->data = malloc(w * h * 4); - } - } - else if (im->im) - { - evas_cache_image_drop(&im->im->cache_entry); - im->im = NULL; - if (im->free_data) - { - if (im->data) free(im->data); - im->data = malloc(w * h * 4); - } - } - else - { - im->data = malloc(w * h * 4); - im->free_data = 1; - } - break; - case EVAS_COLORSPACE_YCBCR422P601_PL: - case EVAS_COLORSPACE_YCBCR422P709_PL: - if (im->data) - { - if (im->free_data) - { - if (im->data) free(im->data); - } - im->data = NULL; - } - if (im->im) - { - evas_cache_image_drop(&im->im->cache_entry); - im->im = NULL; - } - if (!im->cs.no_free) - { - if (im->cs.data) free(im->cs.data); - im->cs.data = calloc(1, h * sizeof(unsigned char *) * 2); - } - break; - default: - abort(); - break; - } - __xre_xlib_image_dirty_hash_del(im); - __xre_xlib_image_dirty_hash_add(im); - im->w = w; - im->h = h; -} - -void * -_xre_xlib_image_data_get(XR_Image *im) -{ - void *data = NULL; - - if (im->data) data = im->data; - else if (im->cs.data) data = im->cs.data; - else - { - if (!im->im) - im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts), im->load_error); - if (im->im) - { - evas_cache_image_load_data(&im->im->cache_entry); - data = im->im->image.data; - } - } - return data; -} - -XR_Image * -_xre_xlib_image_data_find(void *data) -{ - XR_Image *im; - - im = __xre_xlib_image_dirty_hash_find(data); - if (im) - { - im->references++; - } - return im; -} - -void -_xre_xlib_image_data_put(XR_Image *im, void *data) -{ - if (!data) return; - switch (im->cs.space) - { - case EVAS_COLORSPACE_ARGB8888: - if (im->im) - { - if (data == im->im->image.data) return; - evas_cache_image_drop(&im->im->cache_entry); - im->im = NULL; - } - if (im->cs.data == data) return; - if (im->data) - { - if (im->data == data) return; - if (im->free_data) free(im->data); - im->free_data = 0; - } - im->data = data; - im->free_data = 0; - break; - case EVAS_COLORSPACE_YCBCR422P601_PL: - case EVAS_COLORSPACE_YCBCR422P709_PL: - if (im->data) - { - if (im->free_data) free(im->data); - im->data = NULL; - } - im->free_data = 0; - if (data == im->cs.data) return; - if (!im->cs.no_free) - { - if (im->cs.data) free(im->cs.data); - } - im->cs.data = data; - break; - default: - abort(); - break; - } - __xre_xlib_image_dirty_hash_del(im); - __xre_xlib_image_dirty_hash_add(im); - if (im->surface) - { - _xr_xlib_render_surface_free(im->surface); - im->surface = NULL; - } - if (!im->dirty) - { - if (im->fkey) - eina_hash_del(_xr_image_hash, im->fkey, im); - im->dirty = 1; - } - if (im->updates) - { - evas_common_tilebuf_free(im->updates); - im->updates = NULL; - } -} - -void -_xre_xlib_image_alpha_set(XR_Image *im, int alpha) -{ - if (im->alpha == alpha) return; - switch (im->cs.space) - { - case EVAS_COLORSPACE_ARGB8888: - im->alpha = alpha; - if (im->surface) - { - Xrender_Surface *old_surface; - - old_surface = im->surface; - im->surface = NULL; - if (im->alpha) - im->surface = _xr_xlib_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmt32, 1); - else - { - /* FIXME: if im->depth == 16, use xinf->x11.fmtdef */ - if ((im->xinf->depth == 16) && - (((Visual *)im->xinf->x11.visual)->red_mask == 0xf800) && - (((Visual *)im->xinf->x11.visual)->green_mask == 0x07e0) && - (((Visual *)im->xinf->x11.visual)->blue_mask == 0x001f)) - im->surface = _xr_xlib_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmtdef, 0); - else - im->surface = _xr_xlib_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmt24, 0); - } - if (im->surface) - _xr_xlib_render_surface_copy(old_surface, im->surface, 0, 0, 0, 0, im->w + 2, im->h + 2); - _xr_xlib_render_surface_free(old_surface); - } - if (im->updates) - { - evas_common_tilebuf_free(im->updates); - im->updates = NULL; - } - default: - break; - } -} - -int -_xre_xlib_image_alpha_get(XR_Image *im) -{ - if (im->im) - { - if (im->im->cache_entry.space != EVAS_COLORSPACE_ARGB8888) return 0; - } - return im->alpha; -} - -void -_xre_xlib_image_border_set(XR_Image *im, int l, int r, int t, int b) -{ - if (!im) return; - _xre_xlib_image_surface_gen(im); - if (l < 1) l = 0; - if (r < 1) r = 0; - if (t < 1) t = 0; - if (b < 1) b = 0; - if (im->surface) - { - if (l | r | t | b) - im->surface->bordered = 1; - else - im->surface->bordered = 0; - } -} - -void -_xre_xlib_image_border_get(XR_Image *im __UNUSED__, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__) -{ -} - -void -_xre_xlib_image_surface_gen(XR_Image *im) -{ - void *data = NULL, *tdata = NULL; - - if ((im->surface) && (!im->updates)) return; - if (im->data) data = im->data; - else - { - if (!im->im) - im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts), im->load_error); - if (im->im) - { - evas_cache_image_load_data(&im->im->cache_entry); - data = im->im->image.data; - } - } - if (!data) - { - switch (im->cs.space) - { - case EVAS_COLORSPACE_ARGB8888: - return; - break; - case EVAS_COLORSPACE_YCBCR422P601_PL: - case EVAS_COLORSPACE_YCBCR422P709_PL: - if ((im->cs.data) && (*((unsigned char **)im->cs.data))) - { - tdata = malloc(im->w * im->h * sizeof(DATA32)); - if (tdata) - evas_common_convert_yuv_420p_601_rgba(im->cs.data, - tdata, - im->w, im->h); - data = tdata; - } - break; - default: - abort(); - break; - } - if (!data) return; - } - if (im->surface) - { - if (im->updates) - { - Tilebuf_Rect *rects, *r; - - rects = evas_common_tilebuf_get_render_rects(im->updates); - if (rects) - { - EINA_INLIST_FOREACH(rects, r) - { - int rx, ry, rw, rh; - - rx = r->x; ry = r->y; rw = r->w, rh = r->h; - RECTS_CLIP_TO_RECT(rx, ry, rw, rh, 0, 0, im->w, im->h); - if (im->alpha) - _xr_xlib_render_surface_argb_pixels_fill(im->surface, im->w, im->h, data, rx, ry, rw, rh, 1, 1); - else - /* FIXME: if im->depth == 16 - convert to 16bpp then - * upload */ - _xr_xlib_render_surface_rgb_pixels_fill(im->surface, im->w, im->h, data, rx, ry, rw, rh, 1, 1); - } - evas_common_tilebuf_free_render_rects(rects); - } - evas_common_tilebuf_free(im->updates); - im->updates = NULL; - } - if (tdata) free(tdata); - return; - } - if (im->alpha) - { - im->surface = _xr_xlib_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmt32, 1); - _xr_xlib_render_surface_argb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h, 1, 1); - } - else - { - /* FIXME: if im->xinf->depth == 16, use xinf->x11.fmtdef */ - if ((im->xinf->depth == 16) && - (((Visual *)im->xinf->x11.visual)->red_mask == 0xf800) && - (((Visual *)im->xinf->x11.visual)->green_mask == 0x07e0) && - (((Visual *)im->xinf->x11.visual)->blue_mask == 0x001f)) - im->surface = _xr_xlib_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmtdef, 0); - else - im->surface = _xr_xlib_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->x11.fmt24, 0); - /* FIXME: if im->depth == 16 - convert to 16bpp then - * upload */ - _xr_xlib_render_surface_rgb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h, 1, 1); - } - /* fill borders */ - _xr_xlib_render_surface_copy(im->surface, im->surface, - 1, 1, - 0, 1, - 1, im->h); - _xr_xlib_render_surface_copy(im->surface, im->surface, - 0, 1, - 0, 0, - im->w + 2, 1); - _xr_xlib_render_surface_copy(im->surface, im->surface, - im->w, 1, - im->w + 1, 1, - 1, im->h); - _xr_xlib_render_surface_copy(im->surface, im->surface, - 0, im->h, - 0, im->h + 1, - im->w + 2, 1); - if ((im->im) && (!im->dirty)) - { - evas_cache_image_drop(&im->im->cache_entry); - im->im = NULL; - } - if (tdata) free(tdata); -} - -void -_xre_xlib_image_cache_set(int size) -{ - _xr_image_cache_size = size; - while (_xr_image_cache_usage > _xr_image_cache_size) - { - Eina_List *l; - - l = eina_list_last(_xr_image_cache); - if (l) - { - XR_Image *im; - - im = l->data; - _xr_image_cache = eina_list_remove_list(_xr_image_cache, l); - _xr_image_cache_usage -= (im->w * im->h * 4); - __xre_xlib_image_real_free(im); - } - } -} - -int -_xre_xlib_image_cache_get(void) -{ - return _xr_image_cache_size; -} diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xlib_render.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xlib_render.c deleted file mode 100644 index 8f1d2c7b99..0000000000 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xlib_render.c +++ /dev/null @@ -1,744 +0,0 @@ -#include "evas_common.h" -//#include "evas_macros.h" -#include "evas_private.h" -#include "evas_engine.h" -#include "Evas_Engine_XRender_X11.h" -#include - -/* this is a work around broken xrender - when/if this ever gets fixed in xorg - * we can comment this out and one day remove it - for now keep it until such - * a fix is spotted in the wild - */ -#define BROKEN_XORG_XRENDER 1 - -/* should be const char*, but the prototype for XRenderSetPictureFilter - * is silly - */ -static inline char * -get_filter(int smooth) -{ - return smooth ? FilterBest : FilterNearest; -} - -Xrender_Surface * -_xr_xlib_render_surface_new(Ximage_Info *xinf, int w, int h, XRenderPictFormat *fmt, int alpha) -{ - Xrender_Surface *rs; - XRenderPictureAttributes att; - - if ((!xinf) || (!fmt) || (w < 1) || (h < 1)) return NULL; - rs = calloc(1, sizeof(Xrender_Surface)); - if (!rs) return NULL; - rs->xinf = xinf; - rs->width = w; - rs->height = h; - rs->x11.xlib.fmt = fmt; - rs->alpha = alpha; - rs->depth = fmt->depth; - rs->allocated = 1; - rs->x11.xlib.draw = XCreatePixmap(xinf->x11.connection, xinf->x11.root, w, h, fmt->depth); - if (rs->x11.xlib.draw == None) - { - free(rs); - return NULL; - } - rs->xinf->references++; - att.dither = 1; - att.component_alpha = 0; - att.repeat = 0; - rs->x11.xlib.pic = XRenderCreatePicture(xinf->x11.connection, rs->x11.xlib.draw, fmt, - CPRepeat | CPDither | CPComponentAlpha, &att); - if (rs->x11.xlib.pic == None) - { - XFreePixmap(rs->xinf->x11.connection, rs->x11.xlib.draw); - rs->xinf->references--; - free(rs); - return NULL; - } - return rs; -} - -Xrender_Surface * -_xr_xlib_render_surface_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, int alpha) -{ - Xrender_Surface *rs; - XRenderPictFormat *fmt; - XRenderPictureAttributes att; - - if ((!xinf) || (draw == None) || (w < 1) || (h < 1)) return NULL; - fmt = XRenderFindVisualFormat(xinf->x11.connection, xinf->x11.visual); - if (!fmt) return NULL; - rs = calloc(1, sizeof(Xrender_Surface)); - if (!rs) return NULL; - rs->xinf = xinf; - rs->width = w; - rs->height = h; - rs->x11.xlib.fmt = fmt; - rs->alpha = alpha; - rs->depth = fmt->depth; - if (fmt->depth == 32) rs->alpha = 1; - rs->allocated = 0; - rs->x11.xlib.draw = draw; - rs->xinf->references++; - att.dither = 1; - att.component_alpha = 0; - att.repeat = 0; - rs->x11.xlib.pic = XRenderCreatePicture(xinf->x11.connection, rs->x11.xlib.draw, fmt, - CPRepeat | CPDither | CPComponentAlpha, &att); - if (rs->x11.xlib.pic == None) - { - rs->xinf->references--; - free(rs); - return NULL; - } - return rs; -} - -Xrender_Surface * -_xr_xlib_render_surface_format_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, XRenderPictFormat *fmt, int alpha) -{ - Xrender_Surface *rs; - XRenderPictureAttributes att; - - if ((!xinf) || (!fmt) || (draw == None) || (w < 1) || (h < 1)) return NULL; - rs = calloc(1, sizeof(Xrender_Surface)); - if (!rs) return NULL; - rs->xinf = xinf; - rs->width = w; - rs->height = h; - rs->x11.xlib.fmt = fmt; - rs->alpha = alpha; - rs->depth = fmt->depth; - if (fmt->depth == 32) rs->alpha = 1; - rs->xinf->references++; - rs->allocated = 0; - rs->x11.xlib.draw = draw; - att.dither = 1; - att.component_alpha = 0; - att.repeat = 0; - rs->x11.xlib.pic = XRenderCreatePicture(xinf->x11.connection, rs->x11.xlib.draw, fmt, - CPRepeat | CPDither | CPComponentAlpha, &att); - if (rs->x11.xlib.pic == None) - { - rs->xinf->references--; - free(rs); - return NULL; - } - return rs; -} - -void -_xr_xlib_render_surface_free(Xrender_Surface *rs) -{ - if (!rs) return; - if (rs->xinf) - { - if ((rs->allocated) && (rs->x11.xlib.draw != None)) - XFreePixmap(rs->xinf->x11.connection, rs->x11.xlib.draw); - if (rs->x11.xlib.pic != None) - XRenderFreePicture(rs->xinf->x11.connection, rs->x11.xlib.pic); - _xr_xlib_image_info_free(rs->xinf); - rs->xinf = NULL; - } - free(rs); -} - -void -_xr_xlib_render_surface_repeat_set(Xrender_Surface *rs, int repeat) -{ - XRenderPictureAttributes att; - - att.repeat = repeat; - XRenderChangePicture(rs->xinf->x11.connection, rs->x11.xlib.pic, CPRepeat, &att); -} - -void -_xr_xlib_render_surface_solid_rectangle_set(Xrender_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h) -{ - XRenderColor col; - - col.red = (r << 8) | r; - col.green = (g << 8) | g; - col.blue = (b << 8) | b; - col.alpha = (a << 8) | a; - XRenderFillRectangle(rs->xinf->x11.connection, PictOpSrc, rs->x11.xlib.pic, &col, x, y, w, h); -} - -void -_xr_xlib_render_surface_argb_pixels_fill(Xrender_Surface *rs, int sw, int sh __UNUSED__, void *pixels, int x, int y, int w, int h, int ox, int oy) -{ - Ximage_Image *xim; - unsigned int *p, *sp, *sple, *spe; - unsigned int jump, sjump; - - xim = _xr_xlib_image_new(rs->xinf, w, h, rs->depth); - if (!xim) return; - p = (unsigned int *)xim->data; - sp = ((unsigned int *)pixels) + (y * sw) + x; - jump = ((xim->line_bytes / 4) - w); - sjump = sw - w; - spe = sp + ((h - 1) * sw) + w; - if -#ifdef WORDS_BIGENDIAN - (xim->x11.xlib.xim->byte_order == LSBFirst) -#else - (xim->x11.xlib.xim->byte_order == MSBFirst) -#endif - { - while (sp < spe) - { - sple = sp + w; - while (sp < sple) - { - *p++ = (*sp << 24) + ((*sp << 8) & 0xff0000) + ((*sp >> 8) & 0xff00) + (*sp >> 24); -// *p++ = (B_VAL(sp) << 24) | (G_VAL(sp) << 16) | (R_VAL(sp) << 8) | A_VAL(sp); - sp++; - } - p += jump; - sp += sjump; - } - } - else - { - while (sp < spe) - { - sple = sp + w; - while (sp < sple) - *p++ = *sp++; - p += jump; - sp += sjump; - } - } - _xr_xlib_image_put(xim, rs->x11.xlib.draw, x + ox, y + oy, w, h); -} - -void -_xr_xlib_render_surface_rgb_pixels_fill(Xrender_Surface *rs, int sw, int sh __UNUSED__, void *pixels, int x, int y, int w, int h, int ox, int oy) -{ - Ximage_Image *xim; - unsigned int *p, *sp, *sple, *spe; - unsigned int jump, sjump; - - xim = _xr_xlib_image_new(rs->xinf, w, h, rs->depth); - if (!xim) return; - p = (unsigned int *)xim->data; - sp = ((unsigned int *)pixels) + (y * sw) + x; - sjump = sw - w; - spe = sp + ((h - 1) * sw) + w; - if (rs->depth == 16) - { - jump = ((xim->line_bytes / 2) - w); - /* FIXME: if rs->depth == 16 - convert */ - Gfx_Func_Convert conv_func; - int swap; - -#ifdef WORDS_BIGENDIAN - swap = (int)(xim->x11.xlib.xim->byte_order == LSBFirst); -#else - swap = (int)(xim->x11.xlib.xim->byte_order == MSBFirst); -#endif - /* FIXME: swap not handled */ - conv_func = evas_common_convert_func_get((DATA8 *)sp, w, h, rs->depth, - ((Visual *)rs->xinf->x11.visual)->red_mask, - ((Visual *)rs->xinf->x11.visual)->green_mask, - ((Visual *)rs->xinf->x11.visual)->blue_mask, - PAL_MODE_NONE, 0); - if (conv_func) - conv_func(sp, (DATA8 *)p, sjump, jump, w, h, x, y, NULL); - } - else - { - jump = ((xim->line_bytes / 4) - w); - if -#ifdef WORDS_BIGENDIAN - (xim->x11.xlib.xim->byte_order == LSBFirst) -#else - (xim->x11.xlib.xim->byte_order == MSBFirst) -#endif - { - while (sp < spe) - { - sple = sp + w; - while (sp < sple) - { - *p++ = (*sp << 24) + ((*sp << 8) & 0xff0000) + ((*sp >> 8) & 0xff00) + 0xff; -// *p++ = ((B_VAL(sp)) << 24) | ((G_VAL(sp)) << 16) | ((R_VAL(sp)) << 8) | 0x000000ff; - sp++; - } - p += jump; - sp += sjump; - } - } - else - { - while (sp < spe) - { - sple = sp + w; - while (sp < sple) - *p++ = 0xff000000 | *sp++; - p += jump; - sp += sjump; - } - } - } - _xr_xlib_image_put(xim, rs->x11.xlib.draw, x + ox, y + oy, w, h); -} - -void -_xr_xlib_render_surface_clips_set(Xrender_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh) -{ - int num = 0; - XRectangle *rect = NULL; - - if ((dc) && (dc->clip.use)) - { - RECTS_CLIP_TO_RECT(rx, ry, rw, rh, - dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h); - } - if ((!dc) || (!dc->cutout.rects)) - { - rect = malloc(sizeof(XRectangle)); - if (!rect) return; - rect->x = rx; - rect->y = ry; - rect->width = rw; - rect->height = rh; - num = 1; - } - else - { - Cutout_Rects *rects; - Cutout_Rect *r; - int i; - - rects = evas_common_draw_context_apply_cutouts(dc); - num = rects->active; - rect = malloc(num * sizeof(XRectangle)); - if (!rect) return; - for (i = 0; i < num; i++) - { - r = rects->rects + i; - rect[i].x = r->x; - rect[i].y = r->y; - rect[i].width = r->w; - rect[i].height = r->h; - } - evas_common_draw_context_apply_clear_cutouts(rects); - } - if (!rect) return; - XRenderSetPictureClipRectangles(rs->xinf->x11.connection, rs->x11.xlib.pic, 0, 0, rect, num); - free(rect); -} - -/* initialized the transform to the identity */ -static void -init_xtransform(XTransform *t) -{ - int i, j; - - for (i = 0; i < 3; i++) - for (j = 0; j < 3; j++) - t->matrix[i][j] = XDoubleToFixed((i == j) ? 1 : 0); -} - -static void -set_xtransform_scale(XTransform *t, int sw, int sh, int w, int h, int tx, int ty) -{ -// if ((sw > 1) && (w > 1)) -// { sw--; w--; } -// if ((sh > 1) && (h > 1)) -// { sh--; h--; } - t->matrix[0][0] = XDoubleToFixed((double)(sw) / (double)(w)); - t->matrix[1][1] = XDoubleToFixed((double)(sh) / (double)(h)); - t->matrix[2][0] = (tx * sw) / w; - t->matrix[2][1] = (ty * sh) / h; -} - -// when color multiplier is used want: instead -// CA src IN mask SRC temp; non-CA temp OVER dst. - i think. need to check. -void -_xr_xlib_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth) -{ - Xrender_Surface *trs = NULL; - XTransform xf; - XRenderPictureAttributes att; - Picture mask = None; - int e, is_scaling, op; - - if ((sw <= 0) || (sh <= 0) || (w <= 0) || (h <= 0)) return; - - is_scaling = e = ((sw != w) || (sh != h)); - - att.clip_mask = None; - XRenderChangePicture(srs->xinf->x11.connection, srs->x11.xlib.pic, CPClipMask, &att); - XRenderChangePicture(drs->xinf->x11.connection, drs->x11.xlib.pic, CPClipMask, &att); - - init_xtransform(&xf); - - op = PictOpOver; - if (dc->render_op == _EVAS_RENDER_BLEND) - { - if (!srs->alpha) op = PictOpSrc; - } - else if (dc->render_op == _EVAS_RENDER_BLEND_REL) - op = PictOpAtop; - else if (dc->render_op == _EVAS_RENDER_MUL) - op = PictOpIn; - else if (dc->render_op == _EVAS_RENDER_COPY) - op = PictOpSrc; - else if (dc->render_op == _EVAS_RENDER_COPY_REL) - op = PictOpIn; - else if (dc->render_op == _EVAS_RENDER_MASK) - op = PictOpInReverse; - - if ((dc) && (dc->mul.use)) - { - unsigned int r, g, b, a; - - if ((op == PictOpOver) && (!dc->mul.col)) return; - a = dc->mul.col >> 24; - r = (dc->mul.col >> 16) & 0xff; - g = (dc->mul.col >> 8) & 0xff; - b = dc->mul.col & 0xff; - if (a < 255) op = PictOpOver; - if (dc->mul.col != 0xffffffff) - { - if ((srs->xinf->mul_r != r) || (srs->xinf->mul_g != g) || - (srs->xinf->mul_b != b) || (srs->xinf->mul_a != a)) - { - srs->xinf->mul_r = r; - srs->xinf->mul_g = g; - srs->xinf->mul_b = b; - srs->xinf->mul_a = a; - _xr_xlib_render_surface_solid_rectangle_set(srs->xinf->mul, - r, g, b, a, - 0, 0, 1, 1); - } - mask = srs->xinf->mul->x11.xlib.pic; - if (dc->mul.col == (a * 0x01010101)) - { - att.component_alpha = 0; - XRenderChangePicture(srs->xinf->x11.connection, mask, CPComponentAlpha, &att); - } - else - { - if ((srs->alpha) || (a != 0xff)) - trs = _xr_xlib_render_surface_new(srs->xinf, sw + 2, sh + 2, - srs->xinf->x11.fmt32, 1); - else - trs = _xr_xlib_render_surface_new(srs->xinf, sw + 2, sh + 2, - srs->x11.xlib.fmt, srs->alpha); - if (!trs) return; - - att.component_alpha = 1; - XRenderChangePicture(srs->xinf->x11.connection, mask, CPComponentAlpha, &att); - XRenderSetPictureTransform(srs->xinf->x11.connection, srs->x11.xlib.pic, &xf); - XRenderComposite(srs->xinf->x11.connection, PictOpSrc, srs->x11.xlib.pic, mask, - trs->x11.xlib.pic, - sx, sy, - sx, sy, - 0, 0, sw + 2, sh + 2); - mask = None; - } - } - } - -//#define HFW + (sw / 2) -//#define HFH + (sh / 2) -#define HFW -#define HFH - - _xr_xlib_render_surface_clips_set(drs, dc, x, y, w, h); - if (trs) - { - XRenderSetPictureFilter(trs->xinf->x11.connection, trs->x11.xlib.pic, get_filter(smooth), NULL, 0); - - set_xtransform_scale(&xf, sw, sh, w, h, -1, -1); - XRenderSetPictureTransform(trs->xinf->x11.connection, trs->x11.xlib.pic, &xf); - - att.component_alpha = 0; - if (dc->render_op == _EVAS_RENDER_MUL) att.component_alpha = 1; - XRenderChangePicture(trs->xinf->x11.connection, trs->x11.xlib.pic, CPComponentAlpha, &att); - - XRenderComposite(trs->xinf->x11.connection, op, trs->x11.xlib.pic, mask, drs->x11.xlib.pic, - (w HFW) / sw, (h HFH) / sh, - (w HFW) / sw, (h HFH) / sh, - x, y, w, h); - _xr_xlib_render_surface_free(trs); - } - else - { - if (srs->bordered && is_scaling) - { - trs = _xr_xlib_render_surface_new(srs->xinf, sw + 2, sh + 2, - srs->x11.xlib.fmt, srs->alpha); - if (!trs) return; - - att.component_alpha = 0; - XRenderChangePicture(srs->xinf->x11.connection, srs->x11.xlib.pic, CPComponentAlpha, &att); - XRenderSetPictureTransform(srs->xinf->x11.connection, srs->x11.xlib.pic, &xf); - - XRenderComposite(srs->xinf->x11.connection, PictOpSrc, srs->x11.xlib.pic, None, - trs->x11.xlib.pic, sx, sy, sx, sy, 0, 0, sw + 2, sh + 2); - - XRenderSetPictureFilter(trs->xinf->x11.connection, trs->x11.xlib.pic, get_filter(smooth), NULL, 0); - - set_xtransform_scale(&xf, sw, sh, w, h, -1, -1); - XRenderSetPictureTransform(trs->xinf->x11.connection, trs->x11.xlib.pic, &xf); - - if (dc->render_op == _EVAS_RENDER_MUL) - { - att.component_alpha = 1; - XRenderChangePicture(trs->xinf->x11.connection, trs->x11.xlib.pic, CPComponentAlpha, &att); - } - - XRenderComposite(trs->xinf->x11.connection, op, trs->x11.xlib.pic, mask, drs->x11.xlib.pic, - (w HFW) / sw, (h HFH) / sh, - (w HFW) / sw, (h HFH) / sh, -// 1, 1, 1, 1, - x, y, w, h); - _xr_xlib_render_surface_free(trs); - } - else - { - XRenderSetPictureFilter(srs->xinf->x11.connection, srs->x11.xlib.pic, get_filter(smooth), NULL, 0); - - set_xtransform_scale(&xf, sw, sh, w, h, 0, 0); - XRenderSetPictureTransform(srs->xinf->x11.connection, srs->x11.xlib.pic, &xf); - - att.component_alpha = 0; - if (dc->render_op == _EVAS_RENDER_MUL) - att.component_alpha = 1; - XRenderChangePicture(srs->xinf->x11.connection, srs->x11.xlib.pic, CPComponentAlpha, &att); - - XRenderComposite(srs->xinf->x11.connection, op, srs->x11.xlib.pic, mask, drs->x11.xlib.pic, - ((((sx + 1) * w) HFW) / sw), - ((((sy + 1) * h) HFH) / sh), - ((((sx + 1) * w) HFW) / sw), - ((((sy + 1) * h) HFH) / sh), - x, y, w, h); - } - } -} - -void -_xr_xlib_render_surface_copy(Xrender_Surface *srs, Xrender_Surface *drs, int sx, int sy, int x, int y, int w, int h) -{ - XTransform xf; - XRenderPictureAttributes att; - - if ((w <= 0) || (h <= 0) || (!srs) || (!drs)) return; - - init_xtransform(&xf); -#ifdef BROKEN_XORG_XRENDER - /* FIXME: why do we need to change the identity matrix ifthe src surface - * is 1 bit deep? - */ - if (srs->depth == 1) - { - xf.matrix[0][0] = xf.matrix[1][1] = xf.matrix[2][2] = 1; - } -#endif - XRenderSetPictureTransform(srs->xinf->x11.connection, srs->x11.xlib.pic, &xf); -// XRenderSetPictureFilter(srs->xinf->x11.connection, srs->x11.xlib.pic, FilterNearest, NULL, 0); - - att.clip_mask = None; - XRenderChangePicture(srs->xinf->x11.connection, srs->x11.xlib.pic, CPClipMask, &att); - XRenderChangePicture(drs->xinf->x11.connection, drs->x11.xlib.pic, CPClipMask, &att); - - XRenderComposite(srs->xinf->x11.connection, PictOpSrc, srs->x11.xlib.pic, None, drs->x11.xlib.pic, - sx, sy, 0, 0, x, y, w, h); -} - -void -_xr_xlib_render_surface_rectangle_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h) -{ - XRenderColor col; - XRenderPictureAttributes att; - int r, g, b, a, op; - - if ((!rs) || (!dc)) return; - if ((w <= 0) || (h <= 0)) return; - a = dc->col.col >> 24; - r = (dc->col.col >> 16) & 0xff; - g = (dc->col.col >> 8 ) & 0xff; - b = (dc->col.col ) & 0xff; - col.red = (r << 8) | r; - col.green = (g << 8) | g; - col.blue = (b << 8) | b; - col.alpha = (a << 8) | a; - op = PictOpOver; - if (dc->render_op == _EVAS_RENDER_BLEND) - { - if (!dc->col.col) return; - if (a == 0xff) op = PictOpSrc; - } - else if (dc->render_op == _EVAS_RENDER_BLEND_REL) - { - if (!dc->col.col) return; - op = PictOpAtop; - } - else if (dc->render_op == _EVAS_RENDER_MUL) - { - if (dc->col.col == 0xffffffff) return; - op = PictOpIn; - } - else if (dc->render_op == _EVAS_RENDER_COPY) - op = PictOpSrc; - else if (dc->render_op == _EVAS_RENDER_COPY_REL) - op = PictOpIn; - else if (dc->render_op == _EVAS_RENDER_MASK) - op = PictOpInReverse; - - att.clip_mask = None; - XRenderChangePicture(rs->xinf->x11.connection, rs->x11.xlib.pic, CPClipMask, &att); - - _xr_xlib_render_surface_clips_set(rs, dc, x, y, w, h); - XRenderFillRectangle(rs->xinf->x11.connection, op, rs->x11.xlib.pic, &col, x, y, w, h); -} - -void -_xr_xlib_render_surface_line_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2) -{ - XRenderPictureAttributes att; - int op; - - if ((!rs) || (!dc) || (!dc->col.col)) return; - op = PictOpOver; - if (dc->render_op == _EVAS_RENDER_BLEND) - { - if (!dc->col.col) return; - } - else if (dc->render_op == _EVAS_RENDER_BLEND_REL) - { - if (!dc->col.col) return; - op = PictOpAtop; - } - else if (dc->render_op == _EVAS_RENDER_MUL) - { - if (dc->col.col == 0xffffffff) return; - op = PictOpIn; - } - else if (dc->render_op == _EVAS_RENDER_COPY) - op = PictOpSrc; - else if (dc->render_op == _EVAS_RENDER_COPY_REL) - op = PictOpIn; - else if (dc->render_op == _EVAS_RENDER_MASK) - op = PictOpInReverse; - att.clip_mask = None; - XRenderChangePicture(rs->xinf->x11.connection, rs->x11.xlib.pic, CPClipMask, &att); - _xr_xlib_render_surface_clips_set(rs, dc, 0, 0, rs->width, rs->height); - - { - int r, g, b, a; - XPointDouble poly[4]; - int dx, dy; - double len, ddx, ddy; - - dx = x2 - x1; - dy = y2 - y1; - len = sqrt((double)(dx * dx) + (double)(dy * dy)); - ddx = (0.5 * dx) / len; - ddy = (0.5 * dy) / len; - if (ddx < 0) ddx = -0.5 - ddx; - else ddx = 0.5 - ddx; - if (ddy < 0) ddy = -0.5 - ddy; - else ddy = 0.5 - ddy; - poly[0].x = (x1 + ddx); - poly[0].y = (y1 - ddy); - poly[1].x = (x2 + ddx); - poly[1].y = (y2 - ddy); - poly[2].x = (x2 - ddx); - poly[2].y = (y2 + ddy); - poly[3].x = (x1 - ddx); - poly[3].y = (y1 + ddy); - - a = (dc->col.col >> 24) & 0xff; - r = (dc->col.col >> 16) & 0xff; - g = (dc->col.col >> 8 ) & 0xff; - b = (dc->col.col ) & 0xff; - if ((rs->xinf->mul_r != r) || (rs->xinf->mul_g != g) || - (rs->xinf->mul_b != b) || (rs->xinf->mul_a != a)) - { - rs->xinf->mul_r = r; - rs->xinf->mul_g = g; - rs->xinf->mul_b = b; - rs->xinf->mul_a = a; - _xr_xlib_render_surface_solid_rectangle_set(rs->xinf->mul, r, g, b, a, 0, 0, 1, 1); - } - XRenderCompositeDoublePoly(rs->xinf->x11.connection, op, - rs->xinf->mul->x11.xlib.pic, rs->x11.xlib.pic, - rs->xinf->x11.fmt8, 0, 0, 0, 0, - poly, 4, EvenOddRule); - } -} - -void -_xr_xlib_render_surface_polygon_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y) -{ - RGBA_Polygon_Point *pt; - int i, num; - XPointDouble *pts; - int r, g, b, a; - XRenderPictureAttributes att; - int op; - - if ((!rs) || (!dc)) return; - num = 0; EINA_INLIST_FOREACH(points, pt) num++; - if (num < 3) return; - op = PictOpOver; - if (dc->render_op == _EVAS_RENDER_BLEND) - { - if (!dc->col.col) return; - } - else if (dc->render_op == _EVAS_RENDER_BLEND_REL) - { - if (!dc->col.col) return; - op = PictOpAtop; - } - else if (dc->render_op == _EVAS_RENDER_MUL) - { - if (dc->col.col == 0xffffffff) return; - op = PictOpIn; - } - else if (dc->render_op == _EVAS_RENDER_COPY) - op = PictOpSrc; - else if (dc->render_op == _EVAS_RENDER_COPY_REL) - op = PictOpIn; - else if (dc->render_op == _EVAS_RENDER_MASK) - op = PictOpInReverse; - a = (dc->col.col >> 24) & 0xff; - r = (dc->col.col >> 16) & 0xff; - g = (dc->col.col >> 8 ) & 0xff; - b = (dc->col.col ) & 0xff; - if ((rs->xinf->mul_r != r) || (rs->xinf->mul_g != g) || - (rs->xinf->mul_b != b) || (rs->xinf->mul_a != a)) - { - rs->xinf->mul_r = r; - rs->xinf->mul_g = g; - rs->xinf->mul_b = b; - rs->xinf->mul_a = a; - _xr_xlib_render_surface_solid_rectangle_set(rs->xinf->mul, r, g, b, a, 0, 0, 1, 1); - } - pts = malloc(num * sizeof(XPointDouble)); - if (!pts) return; - i = 0; - EINA_INLIST_FOREACH(points, pt) - { - if (i < num) - { - pts[i].x = pt->x + x; - pts[i].y = pt->y + y; - i++; - } - } - att.clip_mask = None; - XRenderChangePicture(rs->xinf->x11.connection, rs->x11.xlib.pic, CPClipMask, &att); - - _xr_xlib_render_surface_clips_set(rs, dc, 0, 0, rs->width, rs->height); - XRenderCompositeDoublePoly(rs->xinf->x11.connection, op, - rs->xinf->mul->x11.xlib.pic, rs->x11.xlib.pic, - rs->xinf->x11.fmt8, 0, 0, 0, 0, - pts, num, Complex); - free(pts); -} diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xlib_ximage.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xlib_ximage.c deleted file mode 100644 index 8a0c370dd2..0000000000 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xlib_ximage.c +++ /dev/null @@ -1,262 +0,0 @@ -#include "evas_common.h" -#include "evas_private.h" -#include "evas_engine.h" -#include "Evas_Engine_XRender_X11.h" - -static Eina_List *_image_info_list = NULL; - -static int _x_err = 0; -static void -_tmp_x_err(Display *d __UNUSED__, XErrorEvent *ev __UNUSED__) -{ - _x_err = 1; - return; -} - -Ximage_Info * -_xr_xlib_image_info_get(Display *display, Drawable draw, Visual *visual) -{ - Ximage_Info *xinf; - Ximage_Info *xinf2; - Eina_List *l; - int di; - unsigned int dui; - Window root; - - xinf2 = NULL; - EINA_LIST_FOREACH(_image_info_list, l, xinf) - if (xinf->x11.connection == display) - { - xinf2 = xinf; - break; - } - xinf = calloc(1, sizeof(Ximage_Info)); - if (!xinf) return NULL; - - xinf->references = 1; - xinf->x11.connection = display; - xinf->x11.draw = draw; - XGetGeometry(xinf->x11.connection, xinf->x11.draw, - &root, - &di, &di, &dui, &dui, &dui, &dui); - xinf->x11.root = root; - xinf->x11.visual = visual; - xinf->x11.fmt32 = XRenderFindStandardFormat(xinf->x11.connection, PictStandardARGB32); - xinf->x11.fmt24 = XRenderFindStandardFormat(xinf->x11.connection, PictStandardRGB24); - xinf->x11.fmt8 = XRenderFindStandardFormat(xinf->x11.connection, PictStandardA8); - xinf->x11.fmt4 = XRenderFindStandardFormat(xinf->x11.connection, PictStandardA4); - xinf->x11.fmt1 = XRenderFindStandardFormat(xinf->x11.connection, PictStandardA1); - - /* find fmt for default visual */ - xinf->x11.fmtdef = XRenderFindVisualFormat(xinf->x11.connection, xinf->x11.visual); - - xinf->mul = _xr_xlib_render_surface_new(xinf, 1, 1, xinf->x11.fmt32, 1); - _xr_xlib_render_surface_repeat_set(xinf->mul, 1); - xinf->mul_r = xinf->mul_g = xinf->mul_b = xinf->mul_a = 0xff; - _xr_xlib_render_surface_solid_rectangle_set(xinf->mul, xinf->mul_r, xinf->mul_g, xinf->mul_b, xinf->mul_a, 0, 0, 1, 1); - if (xinf2) - { - xinf->can_do_shm = xinf2->can_do_shm; - xinf->depth = xinf2->depth; - } - else - { - XVisualInfo *vi, vit; - XShmSegmentInfo shm_info; - XImage *xim; - int num = 0; - - vit.visualid = XVisualIDFromVisual(xinf->x11.visual); - vi = XGetVisualInfo(xinf->x11.connection, VisualIDMask, &vit, &num); - if (!vi) xinf->depth = 32; - else - { - xinf->depth = vi->depth; - XFree(vi); - } - xinf->can_do_shm = 0; - xim = XShmCreateImage(xinf->x11.connection, xinf->x11.visual, xinf->depth, ZPixmap, NULL, &shm_info, 1, 1); - if (xim) - { - shm_info.shmid = shmget(IPC_PRIVATE, xim->bytes_per_line * xim->height, IPC_CREAT | 0777); - if (shm_info.shmid >= 0) - { - shm_info.shmaddr = xim->data = shmat(shm_info.shmid, 0, 0); - if ((shm_info.shmaddr) && (shm_info.shmaddr != (void *) -1)) - { - XErrorHandler ph; - - XSync(xinf->x11.connection, False); - _x_err = 0; - ph = XSetErrorHandler((XErrorHandler)_tmp_x_err); - XShmAttach(xinf->x11.connection, &shm_info); - XSync(xinf->x11.connection, False); - XSetErrorHandler((XErrorHandler)ph); - if (!_x_err) xinf->can_do_shm = 1; - shmdt(shm_info.shmaddr); - } - shmctl(shm_info.shmid, IPC_RMID, 0); - } - XDestroyImage(xim); - } - } - _image_info_list = eina_list_prepend(_image_info_list, xinf); - return xinf; -} - -void -_xr_xlib_image_info_free(Ximage_Info *xinf) -{ - if (xinf->pool) XSync(xinf->x11.connection, False); - _xr_xlib_image_info_pool_flush(xinf, 0, 0); - xinf->references--; - if (xinf->references != 0) return; - _xr_xlib_render_surface_free(xinf->mul); - free(xinf); - _image_info_list = eina_list_remove(_image_info_list, xinf); -} - -void -_xr_xlib_image_info_pool_flush(Ximage_Info *xinf, unsigned int max_num, unsigned int max_mem) -{ - if ((xinf->pool_mem <= max_mem) && (eina_list_count(xinf->pool) <= max_num)) return; - while ((xinf->pool_mem > max_mem) || (eina_list_count(xinf->pool) > max_num)) - { - Ximage_Image *xim; - - if (!xinf->pool) break; - xim = xinf->pool->data; - _xr_xlib_image_free(xim); - } -} - -Ximage_Image * -_xr_xlib_image_new(Ximage_Info *xinf, int w, int h, int depth) -{ - Ximage_Image *xim, *xim2; - Eina_List *l; - - xim2 = NULL; - EINA_LIST_FOREACH(xinf->pool, l, xim) - { - if ((xim->width >= w) && (xim->height >= h) && (xim->depth == depth) && (xim->available)) - { - if (!xim2) xim2 = xim; - else if ((xim->width * xim->height) < (xim2->width * xim2->height)) xim2 = xim; - } - } - if (xim2) - { - xim2->available = 0; - return xim2; - } - xim = calloc(1, sizeof(Ximage_Image)); - if (xim) - { - xim->xinf = xinf; - xim->width = w; - xim->height = h; - xim->depth = depth; - xim->available = 0; - if (xim->xinf->can_do_shm) - { - xim->x11.xlib.shm_info = calloc(1, sizeof(XShmSegmentInfo)); - if (xim->x11.xlib.shm_info) - { - xim->x11.xlib.xim = XShmCreateImage(xim->xinf->x11.connection, xim->xinf->x11.visual, xim->depth, ZPixmap, NULL, xim->x11.xlib.shm_info, xim->width, xim->height); - if (xim->x11.xlib.xim) - { - xim->x11.xlib.shm_info->shmid = shmget(IPC_PRIVATE, xim->x11.xlib.xim->bytes_per_line * xim->x11.xlib.xim->height, IPC_CREAT | 0777); - if (xim->x11.xlib.shm_info->shmid >= 0) - { - xim->x11.xlib.shm_info->shmaddr = xim->x11.xlib.xim->data = shmat(xim->x11.xlib.shm_info->shmid, 0, 0); - if ((xim->x11.xlib.shm_info->shmaddr) && (xim->x11.xlib.shm_info->shmaddr != (void *) -1)) - { - XErrorHandler ph; - - XSync(xim->xinf->x11.connection, False); - _x_err = 0; - ph = XSetErrorHandler((XErrorHandler)_tmp_x_err); - XShmAttach(xim->xinf->x11.connection, xim->x11.xlib.shm_info); - XSync(xim->xinf->x11.connection, False); - XSetErrorHandler((XErrorHandler)ph); - if (!_x_err) goto xim_ok; - shmdt(xim->x11.xlib.shm_info->shmaddr); - } - shmctl(xim->x11.xlib.shm_info->shmid, IPC_RMID, 0); - } - XDestroyImage(xim->x11.xlib.xim); - } - free(xim->x11.xlib.shm_info); - xim->x11.xlib.shm_info = NULL; - } - } - xim->x11.xlib.xim = XCreateImage(xim->xinf->x11.connection, xim->xinf->x11.visual, xim->depth, ZPixmap, 0, NULL, xim->width, xim->height, 32, 0); - if (!xim->x11.xlib.xim) - { - free(xim); - return NULL; - } - xim->x11.xlib.xim->data = malloc(xim->x11.xlib.xim->bytes_per_line * xim->x11.xlib.xim->height); - if (!xim->x11.xlib.xim->data) - { - XDestroyImage(xim->x11.xlib.xim); - free(xim); - return NULL; - } - } - else - { - return NULL; - } - - xim_ok: - _xr_xlib_image_info_pool_flush(xinf, 32, (1600 * 1200 * 32 * 2)); - - xim->line_bytes = xim->x11.xlib.xim->bytes_per_line; - xim->data = (void *)(xim->x11.xlib.xim->data); - xinf->pool_mem += (xim->width * xim->height * xim->depth); - xinf->pool = eina_list_append(xinf->pool, xim); - return xim; -} - -void -_xr_xlib_image_free(Ximage_Image *xim) -{ - if (xim->x11.xlib.shm_info) - { - if (!xim->available) XSync(xim->xinf->x11.connection, False); - XShmDetach(xim->xinf->x11.connection, xim->x11.xlib.shm_info); - XDestroyImage(xim->x11.xlib.xim); - shmdt(xim->x11.xlib.shm_info->shmaddr); - shmctl(xim->x11.xlib.shm_info->shmid, IPC_RMID, 0); - free(xim->x11.xlib.shm_info); - } - else - { - free(xim->x11.xlib.xim->data); - xim->x11.xlib.xim->data = NULL; - XDestroyImage(xim->x11.xlib.xim); - } - xim->xinf->pool_mem -= (xim->width * xim->height * xim->depth); - xim->xinf->pool = eina_list_remove(xim->xinf->pool, xim); - free(xim); -} - -void -_xr_xlib_image_put(Ximage_Image *xim, Drawable draw, int x, int y, int w, int h) -{ - XGCValues gcv; - GC gc; - - gc = XCreateGC(xim->xinf->x11.connection, draw, 0, &gcv); - if (xim->x11.xlib.shm_info) - { - XShmPutImage(xim->xinf->x11.connection, draw, gc, xim->x11.xlib.xim, 0, 0, x, y, w, h, False); - XSync(xim->xinf->x11.connection, False); - } - else - XPutImage(xim->xinf->x11.connection, draw, gc, xim->x11.xlib.xim, 0, 0, x, y, w, h); - xim->available = 1; - XFreeGC(xim->xinf->x11.connection, gc); -}