aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/evas/src/modules/engines/software_x11
diff options
context:
space:
mode:
authorDavid Walter Seikel2012-01-04 18:41:13 +1000
committerDavid Walter Seikel2012-01-04 18:41:13 +1000
commitdd7595a3475407a7fa96a97393bae8c5220e8762 (patch)
treee341e911d7eb911a51684a7412ef7f7c7605d28e /libraries/evas/src/modules/engines/software_x11
parentAdd the skeleton. (diff)
downloadSledjHamr-dd7595a3475407a7fa96a97393bae8c5220e8762.zip
SledjHamr-dd7595a3475407a7fa96a97393bae8c5220e8762.tar.gz
SledjHamr-dd7595a3475407a7fa96a97393bae8c5220e8762.tar.bz2
SledjHamr-dd7595a3475407a7fa96a97393bae8c5220e8762.tar.xz
Add the base Enlightenment Foundation Libraries - eina, eet, evas, ecore, embryo, and edje.
Note that embryo wont be used, but I'm not sure yet if you can build edje without it.
Diffstat (limited to '')
-rw-r--r--libraries/evas/src/modules/engines/software_x11/Evas_Engine_Software_X11.h52
-rw-r--r--libraries/evas/src/modules/engines/software_x11/Makefile.am85
-rw-r--r--libraries/evas/src/modules/engines/software_x11/Makefile.in948
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_engine.c929
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_engine.h137
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xcb_buffer.c498
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xcb_buffer.h30
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xcb_color.c424
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xcb_color.h10
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xcb_main.c8
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xcb_outbuf.c1092
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xcb_outbuf.h30
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xcb_xdefaults.c108
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xcb_xdefaults.h11
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xlib_buffer.c428
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xlib_buffer.h45
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xlib_color.c368
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xlib_color.h16
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xlib_main.c7
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xlib_outbuf.c1135
-rw-r--r--libraries/evas/src/modules/engines/software_x11/evas_xlib_outbuf.h92
21 files changed, 6453 insertions, 0 deletions
diff --git a/libraries/evas/src/modules/engines/software_x11/Evas_Engine_Software_X11.h b/libraries/evas/src/modules/engines/software_x11/Evas_Engine_Software_X11.h
new file mode 100644
index 0000000..e42c10a
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/Evas_Engine_Software_X11.h
@@ -0,0 +1,52 @@
1#ifndef _EVAS_ENGINE_SOFTWARE_X11_H
2# define _EVAS_ENGINE_SOFTWARE_X11_H
3
4typedef enum
5{
6 EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB,
7 EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB
8} Evas_Engine_Info_Software_X11_Backend;
9
10typedef struct _Evas_Engine_Info_Software_X11 Evas_Engine_Info_Software_X11;
11
12struct _Evas_Engine_Info_Software_X11
13{
14 /* PRIVATE - don't mess with this baby or evas will poke its tongue out */
15 /* at you and make nasty noises */
16 Evas_Engine_Info magic;
17
18 /* engine specific data & parameters it needs to set up */
19 struct
20 {
21 Evas_Engine_Info_Software_X11_Backend backend;
22
23 void *connection, *screen;
24 unsigned int drawable, mask;
25 void *visual;
26 unsigned int colormap;
27 int depth, rotation;
28
29 Eina_Bool alloc_grayscale : 1;
30 Eina_Bool debug : 1;
31 Eina_Bool shape_dither : 1;
32 Eina_Bool destination_alpha : 1;
33 Eina_Bool track_mask_changes : 1;
34
35 int alloc_colors_max;
36 } info;
37
38 /* engine specific function calls to query stuff about the destination */
39 struct
40 {
41 void *(*best_visual_get) (int backend, void *connection, int screen);
42 unsigned int (*best_colormap_get) (int backend, void *connection, int screen);
43 int (*best_depth_get) (int backend, void *connection, int screen);
44 } func;
45
46 unsigned char mask_changed : 1;
47
48 /* non-blocking or blocking mode */
49 Evas_Engine_Render_Mode render_mode;
50};
51
52#endif
diff --git a/libraries/evas/src/modules/engines/software_x11/Makefile.am b/libraries/evas/src/modules/engines/software_x11/Makefile.am
new file mode 100644
index 0000000..5a2e345
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/Makefile.am
@@ -0,0 +1,85 @@
1
2MAINTAINERCLEANFILES = Makefile.in
3
4if BUILD_ENGINE_SOFTWARE_X11
5
6SOFTWARE_X11_SOURCES = evas_engine.c
7
8if BUILD_ENGINE_SOFTWARE_XLIB
9
10AM_CPPFLAGS = \
11-I. \
12-I$(top_srcdir)/src/lib \
13-I$(top_srcdir)/src/lib/include \
14-I$(top_srcdir)/src/modules/engines \
15@FREETYPE_CFLAGS@ \
16@PIXMAN_CFLAGS@ \
17@EINA_CFLAGS@ \
18@evas_engine_software_xlib_cflags@
19
20SOFTWARE_X11_SOURCES += \
21evas_xlib_outbuf.c \
22evas_xlib_buffer.c \
23evas_xlib_color.c \
24evas_xlib_main.c
25
26SOFTWARE_X11_LIBADD = @FREETYPE_LIBS@ @EINA_LIBS@ @evas_engine_software_xlib_libs@
27
28endif
29
30if BUILD_ENGINE_SOFTWARE_XCB
31
32AM_CPPFLAGS = \
33-I. \
34-I$(top_srcdir)/src/lib \
35-I$(top_srcdir)/src/lib/include \
36-I$(top_srcdir)/src/modules/engines \
37@FREETYPE_CFLAGS@ \
38@PIXMAN_CFLAGS@ \
39@EINA_CFLAGS@ \
40@evas_engine_software_xcb_cflags@
41
42SOFTWARE_X11_SOURCES += \
43evas_xcb_xdefaults.c \
44evas_xcb_outbuf.c \
45evas_xcb_buffer.c \
46evas_xcb_color.c \
47evas_xcb_main.c
48
49SOFTWARE_X11_LIBADD = @FREETYPE_LIBS@ @PIXMAN_LIBS@ @EINA_LIBS@ @evas_engine_software_xcb_libs@
50
51endif
52
53includes_HEADERS = Evas_Engine_Software_X11.h
54includesdir = $(includedir)/evas-@VMAJ@
55
56if !EVAS_STATIC_BUILD_SOFTWARE_X11
57
58pkgdir = $(libdir)/evas/modules/engines/software_x11/$(MODULE_ARCH)
59pkg_LTLIBRARIES = module.la
60
61module_la_SOURCES = $(SOFTWARE_X11_SOURCES)
62module_la_LIBADD = $(top_builddir)/src/lib/libevas.la $(SOFTWARE_X11_LIBADD)
63module_la_LDFLAGS = -no-undefined -module -avoid-version
64module_la_LIBTOOLFLAGS = --tag=disable-static
65
66else
67
68noinst_LTLIBRARIES = libevas_engine_software_x11.la
69
70libevas_engine_software_x11_la_SOURCES = $(SOFTWARE_X11_SOURCES)
71libevas_engine_software_x11_la_LIBADD = $(SOFTWARE_X11_LIBADD)
72
73endif
74endif
75
76EXTRA_DIST = \
77evas_engine.h \
78evas_xlib_outbuf.h \
79evas_xlib_buffer.h \
80evas_xlib_color.h \
81evas_xcb_outbuf.h \
82evas_xcb_buffer.h \
83evas_xcb_color.h \
84evas_xcb_xdefaults.h
85
diff --git a/libraries/evas/src/modules/engines/software_x11/Makefile.in b/libraries/evas/src/modules/engines/software_x11/Makefile.in
new file mode 100644
index 0000000..f5c73af
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/Makefile.in
@@ -0,0 +1,948 @@
1# Makefile.in generated by automake 1.11.1 from Makefile.am.
2# @configure_input@
3
4# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
5# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
6# Inc.
7# This Makefile.in is free software; the Free Software Foundation
8# gives unlimited permission to copy and/or distribute it,
9# with or without modifications, as long as this notice is preserved.
10
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
13# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
14# PARTICULAR PURPOSE.
15
16@SET_MAKE@
17
18
19VPATH = @srcdir@
20pkgdatadir = $(datadir)/@PACKAGE@
21pkgincludedir = $(includedir)/@PACKAGE@
22pkglibdir = $(libdir)/@PACKAGE@
23pkglibexecdir = $(libexecdir)/@PACKAGE@
24am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
25install_sh_DATA = $(install_sh) -c -m 644
26install_sh_PROGRAM = $(install_sh) -c
27install_sh_SCRIPT = $(install_sh) -c
28INSTALL_HEADER = $(INSTALL_DATA)
29transform = $(program_transform_name)
30NORMAL_INSTALL = :
31PRE_INSTALL = :
32POST_INSTALL = :
33NORMAL_UNINSTALL = :
34PRE_UNINSTALL = :
35POST_UNINSTALL = :
36build_triplet = @build@
37host_triplet = @host@
38@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@am__append_1 = \
39@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@evas_xlib_outbuf.c \
40@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@evas_xlib_buffer.c \
41@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@evas_xlib_color.c \
42@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@evas_xlib_main.c
43
44@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@am__append_2 = \
45@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@evas_xcb_xdefaults.c \
46@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@evas_xcb_outbuf.c \
47@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@evas_xcb_buffer.c \
48@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@evas_xcb_color.c \
49@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@evas_xcb_main.c
50
51subdir = src/modules/engines/software_x11
52DIST_COMMON = $(am__includes_HEADERS_DIST) $(srcdir)/Makefile.am \
53 $(srcdir)/Makefile.in
54ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
55am__aclocal_m4_deps = $(top_srcdir)/m4/efl_attribute.m4 \
56 $(top_srcdir)/m4/efl_coverage.m4 \
57 $(top_srcdir)/m4/efl_doxygen.m4 \
58 $(top_srcdir)/m4/efl_fnmatch.m4 \
59 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
60 $(top_srcdir)/m4/evas_check_engine.m4 \
61 $(top_srcdir)/m4/evas_check_loader.m4 \
62 $(top_srcdir)/m4/evas_converter.m4 \
63 $(top_srcdir)/m4/evas_dither.m4 \
64 $(top_srcdir)/m4/evas_scaler.m4 $(top_srcdir)/m4/libtool.m4 \
65 $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
66 $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
67 $(top_srcdir)/configure.ac
68am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
69 $(ACLOCAL_M4)
70mkinstalldirs = $(install_sh) -d
71CONFIG_HEADER = $(top_builddir)/config.h
72CONFIG_CLEAN_FILES =
73CONFIG_CLEAN_VPATH_FILES =
74am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
75am__vpath_adj = case $$p in \
76 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
77 *) f=$$p;; \
78 esac;
79am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
80am__install_max = 40
81am__nobase_strip_setup = \
82 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
83am__nobase_strip = \
84 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
85am__nobase_list = $(am__nobase_strip_setup); \
86 for p in $$list; do echo "$$p $$p"; done | \
87 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
88 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
89 if (++n[$$2] == $(am__install_max)) \
90 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
91 END { for (dir in files) print dir, files[dir] }'
92am__base_list = \
93 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
94 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
95am__installdirs = "$(DESTDIR)$(pkgdir)" "$(DESTDIR)$(includesdir)"
96LTLIBRARIES = $(noinst_LTLIBRARIES) $(pkg_LTLIBRARIES)
97am__DEPENDENCIES_1 =
98@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_TRUE@libevas_engine_software_x11_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
99am__libevas_engine_software_x11_la_SOURCES_DIST = evas_engine.c \
100 evas_xlib_outbuf.c evas_xlib_buffer.c evas_xlib_color.c \
101 evas_xlib_main.c evas_xcb_xdefaults.c evas_xcb_outbuf.c \
102 evas_xcb_buffer.c evas_xcb_color.c evas_xcb_main.c
103@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@am__objects_1 = evas_xlib_outbuf.lo \
104@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@ evas_xlib_buffer.lo \
105@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@ evas_xlib_color.lo \
106@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@ evas_xlib_main.lo
107@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@am__objects_2 = evas_xcb_xdefaults.lo \
108@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@ evas_xcb_outbuf.lo \
109@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@ evas_xcb_buffer.lo \
110@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@ evas_xcb_color.lo \
111@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@ evas_xcb_main.lo
112@BUILD_ENGINE_SOFTWARE_X11_TRUE@am__objects_3 = evas_engine.lo \
113@BUILD_ENGINE_SOFTWARE_X11_TRUE@ $(am__objects_1) \
114@BUILD_ENGINE_SOFTWARE_X11_TRUE@ $(am__objects_2)
115@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_TRUE@am_libevas_engine_software_x11_la_OBJECTS = $(am__objects_3)
116libevas_engine_software_x11_la_OBJECTS = \
117 $(am_libevas_engine_software_x11_la_OBJECTS)
118AM_V_lt = $(am__v_lt_$(V))
119am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
120am__v_lt_0 = --silent
121@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_TRUE@am_libevas_engine_software_x11_la_rpath =
122@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_FALSE@module_la_DEPENDENCIES = $(top_builddir)/src/lib/libevas.la \
123@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_FALSE@ $(am__DEPENDENCIES_1)
124am__module_la_SOURCES_DIST = evas_engine.c evas_xlib_outbuf.c \
125 evas_xlib_buffer.c evas_xlib_color.c evas_xlib_main.c \
126 evas_xcb_xdefaults.c evas_xcb_outbuf.c evas_xcb_buffer.c \
127 evas_xcb_color.c evas_xcb_main.c
128@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@am__objects_4 = module_la-evas_xlib_outbuf.lo \
129@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@ module_la-evas_xlib_buffer.lo \
130@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@ module_la-evas_xlib_color.lo \
131@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@ module_la-evas_xlib_main.lo
132@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@am__objects_5 = module_la-evas_xcb_xdefaults.lo \
133@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@ module_la-evas_xcb_outbuf.lo \
134@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@ module_la-evas_xcb_buffer.lo \
135@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@ module_la-evas_xcb_color.lo \
136@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@ module_la-evas_xcb_main.lo
137@BUILD_ENGINE_SOFTWARE_X11_TRUE@am__objects_6 = \
138@BUILD_ENGINE_SOFTWARE_X11_TRUE@ module_la-evas_engine.lo \
139@BUILD_ENGINE_SOFTWARE_X11_TRUE@ $(am__objects_4) \
140@BUILD_ENGINE_SOFTWARE_X11_TRUE@ $(am__objects_5)
141@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_FALSE@am_module_la_OBJECTS = $(am__objects_6)
142module_la_OBJECTS = $(am_module_la_OBJECTS)
143module_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
144 $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
145 $(AM_CFLAGS) $(CFLAGS) $(module_la_LDFLAGS) $(LDFLAGS) -o $@
146@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_FALSE@am_module_la_rpath = -rpath \
147@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_FALSE@ $(pkgdir)
148DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
149depcomp = $(SHELL) $(top_srcdir)/depcomp
150am__depfiles_maybe = depfiles
151am__mv = mv -f
152COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
153 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
154LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
155 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
156 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
157 $(AM_CFLAGS) $(CFLAGS)
158AM_V_CC = $(am__v_CC_$(V))
159am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
160am__v_CC_0 = @echo " CC " $@;
161AM_V_at = $(am__v_at_$(V))
162am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
163am__v_at_0 = @
164CCLD = $(CC)
165LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
166 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
167 $(AM_LDFLAGS) $(LDFLAGS) -o $@
168AM_V_CCLD = $(am__v_CCLD_$(V))
169am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
170am__v_CCLD_0 = @echo " CCLD " $@;
171AM_V_GEN = $(am__v_GEN_$(V))
172am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
173am__v_GEN_0 = @echo " GEN " $@;
174SOURCES = $(libevas_engine_software_x11_la_SOURCES) \
175 $(module_la_SOURCES)
176DIST_SOURCES = $(am__libevas_engine_software_x11_la_SOURCES_DIST) \
177 $(am__module_la_SOURCES_DIST)
178am__includes_HEADERS_DIST = Evas_Engine_Software_X11.h
179HEADERS = $(includes_HEADERS)
180ETAGS = etags
181CTAGS = ctags
182DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
183ACLOCAL = @ACLOCAL@
184ALLOCA = @ALLOCA@
185AMTAR = @AMTAR@
186AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
187AR = @AR@
188AS = @AS@
189AUTOCONF = @AUTOCONF@
190AUTOHEADER = @AUTOHEADER@
191AUTOMAKE = @AUTOMAKE@
192AWK = @AWK@
193CC = @CC@
194CCDEPMODE = @CCDEPMODE@
195CFLAGS = @CFLAGS@
196CHECK_CFLAGS = @CHECK_CFLAGS@
197CHECK_LIBS = @CHECK_LIBS@
198CPP = @CPP@
199CPPFLAGS = @CPPFLAGS@
200CXX = @CXX@
201CXXCPP = @CXXCPP@
202CXXDEPMODE = @CXXDEPMODE@
203CXXFLAGS = @CXXFLAGS@
204CYGPATH_W = @CYGPATH_W@
205DEFS = @DEFS@
206DEPDIR = @DEPDIR@
207DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
208DIRECTFB_LIBS = @DIRECTFB_LIBS@
209DLLTOOL = @DLLTOOL@
210DSYMUTIL = @DSYMUTIL@
211DUMPBIN = @DUMPBIN@
212ECHO_C = @ECHO_C@
213ECHO_N = @ECHO_N@
214ECHO_T = @ECHO_T@
215ECORE_EVAS_CFLAGS = @ECORE_EVAS_CFLAGS@
216ECORE_EVAS_LIBS = @ECORE_EVAS_LIBS@
217EDB_CFLAGS = @EDB_CFLAGS@
218EDB_LIBS = @EDB_LIBS@
219EDJE_CFLAGS = @EDJE_CFLAGS@
220EDJE_LIBS = @EDJE_LIBS@
221EET_CFLAGS = @EET_CFLAGS@
222EET_LIBS = @EET_LIBS@
223EFL_COVERAGE_CFLAGS = @EFL_COVERAGE_CFLAGS@
224EFL_COVERAGE_LIBS = @EFL_COVERAGE_LIBS@
225EFL_FNMATCH_LIBS = @EFL_FNMATCH_LIBS@
226EGREP = @EGREP@
227EINA_CFLAGS = @EINA_CFLAGS@
228EINA_LIBS = @EINA_LIBS@
229EVAS_CFLAGS = @EVAS_CFLAGS@
230EVAS_LIBS = @EVAS_LIBS@
231EVAS_SSE3_CFLAGS = @EVAS_SSE3_CFLAGS@
232EVIL_CFLAGS = @EVIL_CFLAGS@
233EVIL_LIBS = @EVIL_LIBS@
234EXEEXT = @EXEEXT@
235FGREP = @FGREP@
236FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
237FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
238FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
239FREETYPE_LIBS = @FREETYPE_LIBS@
240FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@
241FRIBIDI_LIBS = @FRIBIDI_LIBS@
242GL_EET_CFLAGS = @GL_EET_CFLAGS@
243GL_EET_LIBS = @GL_EET_LIBS@
244GREP = @GREP@
245HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@
246HARFBUZZ_LIBS = @HARFBUZZ_LIBS@
247INSTALL = @INSTALL@
248INSTALL_DATA = @INSTALL_DATA@
249INSTALL_PROGRAM = @INSTALL_PROGRAM@
250INSTALL_SCRIPT = @INSTALL_SCRIPT@
251INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
252LD = @LD@
253LDFLAGS = @LDFLAGS@
254LIBOBJS = @LIBOBJS@
255LIBS = @LIBS@
256LIBTOOL = @LIBTOOL@
257LINEBREAK_CFLAGS = @LINEBREAK_CFLAGS@
258LINEBREAK_LIBS = @LINEBREAK_LIBS@
259LIPO = @LIPO@
260LN_S = @LN_S@
261LTLIBOBJS = @LTLIBOBJS@
262MAKEINFO = @MAKEINFO@
263MKDIR_P = @MKDIR_P@
264MODULE_ARCH = @MODULE_ARCH@
265NM = @NM@
266NMEDIT = @NMEDIT@
267OBJC = @OBJC@
268OBJCDEPMODE = @OBJCDEPMODE@
269OBJCFLAGS = @OBJCFLAGS@
270OBJDUMP = @OBJDUMP@
271OBJEXT = @OBJEXT@
272OTOOL = @OTOOL@
273OTOOL64 = @OTOOL64@
274PACKAGE = @PACKAGE@
275PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
276PACKAGE_NAME = @PACKAGE_NAME@
277PACKAGE_STRING = @PACKAGE_STRING@
278PACKAGE_TARNAME = @PACKAGE_TARNAME@
279PACKAGE_URL = @PACKAGE_URL@
280PACKAGE_VERSION = @PACKAGE_VERSION@
281PATH_SEPARATOR = @PATH_SEPARATOR@
282PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
283PIXMAN_LIBS = @PIXMAN_LIBS@
284PKG_CONFIG = @PKG_CONFIG@
285PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
286PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
287PNG_CFLAGS = @PNG_CFLAGS@
288PNG_LIBS = @PNG_LIBS@
289RANLIB = @RANLIB@
290SDL_CFLAGS = @SDL_CFLAGS@
291SDL_LIBS = @SDL_LIBS@
292SED = @SED@
293SET_MAKE = @SET_MAKE@
294SHELL = @SHELL@
295SHM_OPEN_LINK = @SHM_OPEN_LINK@
296STRIP = @STRIP@
297SVG_CFLAGS = @SVG_CFLAGS@
298SVG_LIBS = @SVG_LIBS@
299VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
300VALGRIND_LIBS = @VALGRIND_LIBS@
301VERSION = @VERSION@
302VMAJ = @VMAJ@
303WIN32_CFLAGS = @WIN32_CFLAGS@
304WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
305XCB_CFLAGS = @XCB_CFLAGS@
306XCB_GL_CFLAGS = @XCB_GL_CFLAGS@
307XCB_GL_LIBS = @XCB_GL_LIBS@
308XCB_LIBS = @XCB_LIBS@
309XEXT_CFLAGS = @XEXT_CFLAGS@
310XEXT_LIBS = @XEXT_LIBS@
311XMKMF = @XMKMF@
312X_CFLAGS = @X_CFLAGS@
313X_EXTRA_LIBS = @X_EXTRA_LIBS@
314X_LIBS = @X_LIBS@
315X_PRE_LIBS = @X_PRE_LIBS@
316abs_builddir = @abs_builddir@
317abs_srcdir = @abs_srcdir@
318abs_top_builddir = @abs_top_builddir@
319abs_top_srcdir = @abs_top_srcdir@
320ac_ct_CC = @ac_ct_CC@
321ac_ct_CXX = @ac_ct_CXX@
322ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
323ac_ct_OBJC = @ac_ct_OBJC@
324altivec_cflags = @altivec_cflags@
325am__include = @am__include@
326am__leading_dot = @am__leading_dot@
327am__quote = @am__quote@
328am__tar = @am__tar@
329am__untar = @am__untar@
330bindir = @bindir@
331build = @build@
332build_alias = @build_alias@
333build_cpu = @build_cpu@
334build_os = @build_os@
335build_vendor = @build_vendor@
336builddir = @builddir@
337datadir = @datadir@
338datarootdir = @datarootdir@
339dlopen_libs = @dlopen_libs@
340docdir = @docdir@
341dvidir = @dvidir@
342edje_cc = @edje_cc@
343efl_doxygen = @efl_doxygen@
344efl_have_doxygen = @efl_have_doxygen@
345evas_engine_buffer_cflags = @evas_engine_buffer_cflags@
346evas_engine_buffer_libs = @evas_engine_buffer_libs@
347evas_engine_direct3d_cflags = @evas_engine_direct3d_cflags@
348evas_engine_direct3d_libs = @evas_engine_direct3d_libs@
349evas_engine_directfb_cflags = @evas_engine_directfb_cflags@
350evas_engine_directfb_libs = @evas_engine_directfb_libs@
351evas_engine_fb_cflags = @evas_engine_fb_cflags@
352evas_engine_fb_libs = @evas_engine_fb_libs@
353evas_engine_gl_cocoa_cflags = @evas_engine_gl_cocoa_cflags@
354evas_engine_gl_cocoa_libs = @evas_engine_gl_cocoa_libs@
355evas_engine_gl_common_libs = @evas_engine_gl_common_libs@
356evas_engine_gl_sdl_cflags = @evas_engine_gl_sdl_cflags@
357evas_engine_gl_sdl_libs = @evas_engine_gl_sdl_libs@
358evas_engine_gl_xcb_cflags = @evas_engine_gl_xcb_cflags@
359evas_engine_gl_xcb_libs = @evas_engine_gl_xcb_libs@
360evas_engine_gl_xlib_cflags = @evas_engine_gl_xlib_cflags@
361evas_engine_gl_xlib_libs = @evas_engine_gl_xlib_libs@
362evas_engine_psl1ght_cflags = @evas_engine_psl1ght_cflags@
363evas_engine_psl1ght_libs = @evas_engine_psl1ght_libs@
364evas_engine_software_16_ddraw_cflags = @evas_engine_software_16_ddraw_cflags@
365evas_engine_software_16_ddraw_libs = @evas_engine_software_16_ddraw_libs@
366evas_engine_software_16_sdl_cflags = @evas_engine_software_16_sdl_cflags@
367evas_engine_software_16_sdl_libs = @evas_engine_software_16_sdl_libs@
368evas_engine_software_16_wince_cflags = @evas_engine_software_16_wince_cflags@
369evas_engine_software_16_wince_libs = @evas_engine_software_16_wince_libs@
370evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
371evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
372evas_engine_software_8_x11_cflags = @evas_engine_software_8_x11_cflags@
373evas_engine_software_8_x11_libs = @evas_engine_software_8_x11_libs@
374evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
375evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
376evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
377evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
378evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
379evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
380evas_engine_software_xcb_cflags = @evas_engine_software_xcb_cflags@
381evas_engine_software_xcb_libs = @evas_engine_software_xcb_libs@
382evas_engine_software_xlib_cflags = @evas_engine_software_xlib_cflags@
383evas_engine_software_xlib_libs = @evas_engine_software_xlib_libs@
384evas_image_loader_bmp_cflags = @evas_image_loader_bmp_cflags@
385evas_image_loader_bmp_libs = @evas_image_loader_bmp_libs@
386evas_image_loader_edb_cflags = @evas_image_loader_edb_cflags@
387evas_image_loader_edb_libs = @evas_image_loader_edb_libs@
388evas_image_loader_eet_cflags = @evas_image_loader_eet_cflags@
389evas_image_loader_eet_libs = @evas_image_loader_eet_libs@
390evas_image_loader_generic_cflags = @evas_image_loader_generic_cflags@
391evas_image_loader_generic_libs = @evas_image_loader_generic_libs@
392evas_image_loader_gif_cflags = @evas_image_loader_gif_cflags@
393evas_image_loader_gif_libs = @evas_image_loader_gif_libs@
394evas_image_loader_ico_cflags = @evas_image_loader_ico_cflags@
395evas_image_loader_ico_libs = @evas_image_loader_ico_libs@
396evas_image_loader_jpeg_cflags = @evas_image_loader_jpeg_cflags@
397evas_image_loader_jpeg_libs = @evas_image_loader_jpeg_libs@
398evas_image_loader_pmaps_cflags = @evas_image_loader_pmaps_cflags@
399evas_image_loader_pmaps_libs = @evas_image_loader_pmaps_libs@
400evas_image_loader_png_cflags = @evas_image_loader_png_cflags@
401evas_image_loader_png_libs = @evas_image_loader_png_libs@
402evas_image_loader_psd_cflags = @evas_image_loader_psd_cflags@
403evas_image_loader_psd_libs = @evas_image_loader_psd_libs@
404evas_image_loader_svg_cflags = @evas_image_loader_svg_cflags@
405evas_image_loader_svg_libs = @evas_image_loader_svg_libs@
406evas_image_loader_tga_cflags = @evas_image_loader_tga_cflags@
407evas_image_loader_tga_libs = @evas_image_loader_tga_libs@
408evas_image_loader_tiff_cflags = @evas_image_loader_tiff_cflags@
409evas_image_loader_tiff_libs = @evas_image_loader_tiff_libs@
410evas_image_loader_wbmp_cflags = @evas_image_loader_wbmp_cflags@
411evas_image_loader_wbmp_libs = @evas_image_loader_wbmp_libs@
412evas_image_loader_xpm_cflags = @evas_image_loader_xpm_cflags@
413evas_image_loader_xpm_libs = @evas_image_loader_xpm_libs@
414exec_prefix = @exec_prefix@
415have_evas_engine_gl_x11 = @have_evas_engine_gl_x11@
416have_evas_engine_gl_xcb = @have_evas_engine_gl_xcb@
417have_evas_engine_gl_xlib = @have_evas_engine_gl_xlib@
418have_evas_engine_software_x11 = @have_evas_engine_software_x11@
419have_evas_engine_software_xcb = @have_evas_engine_software_xcb@
420have_evas_engine_software_xlib = @have_evas_engine_software_xlib@
421have_lcov = @have_lcov@
422host = @host@
423host_alias = @host_alias@
424host_cpu = @host_cpu@
425host_os = @host_os@
426host_vendor = @host_vendor@
427htmldir = @htmldir@
428includedir = @includedir@
429infodir = @infodir@
430install_sh = @install_sh@
431libdir = @libdir@
432libexecdir = @libexecdir@
433localedir = @localedir@
434localstatedir = @localstatedir@
435lt_ECHO = @lt_ECHO@
436lt_enable_auto_import = @lt_enable_auto_import@
437mandir = @mandir@
438mkdir_p = @mkdir_p@
439oldincludedir = @oldincludedir@
440pdfdir = @pdfdir@
441pkgconfig_requires_private = @pkgconfig_requires_private@
442prefix = @prefix@
443program_transform_name = @program_transform_name@
444psdir = @psdir@
445pthread_cflags = @pthread_cflags@
446pthread_libs = @pthread_libs@
447release_info = @release_info@
448requirement_evas = @requirement_evas@
449sbindir = @sbindir@
450sharedstatedir = @sharedstatedir@
451srcdir = @srcdir@
452sysconfdir = @sysconfdir@
453target_alias = @target_alias@
454top_build_prefix = @top_build_prefix@
455top_builddir = @top_builddir@
456top_srcdir = @top_srcdir@
457version_info = @version_info@
458MAINTAINERCLEANFILES = Makefile.in
459@BUILD_ENGINE_SOFTWARE_X11_TRUE@SOFTWARE_X11_SOURCES = evas_engine.c \
460@BUILD_ENGINE_SOFTWARE_X11_TRUE@ $(am__append_1) \
461@BUILD_ENGINE_SOFTWARE_X11_TRUE@ $(am__append_2)
462@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@AM_CPPFLAGS = \
463@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@-I. \
464@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@-I$(top_srcdir)/src/lib \
465@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@-I$(top_srcdir)/src/lib/include \
466@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@-I$(top_srcdir)/src/modules/engines \
467@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@@FREETYPE_CFLAGS@ \
468@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@@PIXMAN_CFLAGS@ \
469@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@@EINA_CFLAGS@ \
470@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@@evas_engine_software_xcb_cflags@
471
472@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@AM_CPPFLAGS = \
473@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@-I. \
474@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@-I$(top_srcdir)/src/lib \
475@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@-I$(top_srcdir)/src/lib/include \
476@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@-I$(top_srcdir)/src/modules/engines \
477@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@@FREETYPE_CFLAGS@ \
478@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@@PIXMAN_CFLAGS@ \
479@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@@EINA_CFLAGS@ \
480@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@@evas_engine_software_xlib_cflags@
481
482@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XCB_TRUE@SOFTWARE_X11_LIBADD = @FREETYPE_LIBS@ @PIXMAN_LIBS@ @EINA_LIBS@ @evas_engine_software_xcb_libs@
483@BUILD_ENGINE_SOFTWARE_X11_TRUE@@BUILD_ENGINE_SOFTWARE_XLIB_TRUE@SOFTWARE_X11_LIBADD = @FREETYPE_LIBS@ @EINA_LIBS@ @evas_engine_software_xlib_libs@
484@BUILD_ENGINE_SOFTWARE_X11_TRUE@includes_HEADERS = Evas_Engine_Software_X11.h
485@BUILD_ENGINE_SOFTWARE_X11_TRUE@includesdir = $(includedir)/evas-@VMAJ@
486@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_FALSE@pkgdir = $(libdir)/evas/modules/engines/software_x11/$(MODULE_ARCH)
487@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_FALSE@pkg_LTLIBRARIES = module.la
488@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_FALSE@module_la_SOURCES = $(SOFTWARE_X11_SOURCES)
489@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_FALSE@module_la_LIBADD = $(top_builddir)/src/lib/libevas.la $(SOFTWARE_X11_LIBADD)
490@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_FALSE@module_la_LDFLAGS = -no-undefined -module -avoid-version
491@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_FALSE@module_la_LIBTOOLFLAGS = --tag=disable-static
492@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_TRUE@noinst_LTLIBRARIES = libevas_engine_software_x11.la
493@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_TRUE@libevas_engine_software_x11_la_SOURCES = $(SOFTWARE_X11_SOURCES)
494@BUILD_ENGINE_SOFTWARE_X11_TRUE@@EVAS_STATIC_BUILD_SOFTWARE_X11_TRUE@libevas_engine_software_x11_la_LIBADD = $(SOFTWARE_X11_LIBADD)
495EXTRA_DIST = \
496evas_engine.h \
497evas_xlib_outbuf.h \
498evas_xlib_buffer.h \
499evas_xlib_color.h \
500evas_xcb_outbuf.h \
501evas_xcb_buffer.h \
502evas_xcb_color.h \
503evas_xcb_xdefaults.h
504
505all: all-am
506
507.SUFFIXES:
508.SUFFIXES: .c .lo .o .obj
509$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
510 @for dep in $?; do \
511 case '$(am__configure_deps)' in \
512 *$$dep*) \
513 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
514 && { if test -f $@; then exit 0; else break; fi; }; \
515 exit 1;; \
516 esac; \
517 done; \
518 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/modules/engines/software_x11/Makefile'; \
519 $(am__cd) $(top_srcdir) && \
520 $(AUTOMAKE) --gnu src/modules/engines/software_x11/Makefile
521.PRECIOUS: Makefile
522Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
523 @case '$?' in \
524 *config.status*) \
525 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
526 *) \
527 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
528 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
529 esac;
530
531$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
532 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
533
534$(top_srcdir)/configure: $(am__configure_deps)
535 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
536$(ACLOCAL_M4): $(am__aclocal_m4_deps)
537 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
538$(am__aclocal_m4_deps):
539
540clean-noinstLTLIBRARIES:
541 -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
542 @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
543 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
544 test "$$dir" != "$$p" || dir=.; \
545 echo "rm -f \"$${dir}/so_locations\""; \
546 rm -f "$${dir}/so_locations"; \
547 done
548install-pkgLTLIBRARIES: $(pkg_LTLIBRARIES)
549 @$(NORMAL_INSTALL)
550 test -z "$(pkgdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdir)"
551 @list='$(pkg_LTLIBRARIES)'; test -n "$(pkgdir)" || list=; \
552 list2=; for p in $$list; do \
553 if test -f $$p; then \
554 list2="$$list2 $$p"; \
555 else :; fi; \
556 done; \
557 test -z "$$list2" || { \
558 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkgdir)'"; \
559 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkgdir)"; \
560 }
561
562uninstall-pkgLTLIBRARIES:
563 @$(NORMAL_UNINSTALL)
564 @list='$(pkg_LTLIBRARIES)'; test -n "$(pkgdir)" || list=; \
565 for p in $$list; do \
566 $(am__strip_dir) \
567 echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkgdir)/$$f'"; \
568 $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkgdir)/$$f"; \
569 done
570
571clean-pkgLTLIBRARIES:
572 -test -z "$(pkg_LTLIBRARIES)" || rm -f $(pkg_LTLIBRARIES)
573 @list='$(pkg_LTLIBRARIES)'; for p in $$list; do \
574 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
575 test "$$dir" != "$$p" || dir=.; \
576 echo "rm -f \"$${dir}/so_locations\""; \
577 rm -f "$${dir}/so_locations"; \
578 done
579libevas_engine_software_x11.la: $(libevas_engine_software_x11_la_OBJECTS) $(libevas_engine_software_x11_la_DEPENDENCIES)
580 $(AM_V_CCLD)$(LINK) $(am_libevas_engine_software_x11_la_rpath) $(libevas_engine_software_x11_la_OBJECTS) $(libevas_engine_software_x11_la_LIBADD) $(LIBS)
581module.la: $(module_la_OBJECTS) $(module_la_DEPENDENCIES)
582 $(AM_V_CCLD)$(module_la_LINK) $(am_module_la_rpath) $(module_la_OBJECTS) $(module_la_LIBADD) $(LIBS)
583
584mostlyclean-compile:
585 -rm -f *.$(OBJEXT)
586
587distclean-compile:
588 -rm -f *.tab.c
589
590@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_engine.Plo@am__quote@
591@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_xcb_buffer.Plo@am__quote@
592@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_xcb_color.Plo@am__quote@
593@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_xcb_main.Plo@am__quote@
594@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_xcb_outbuf.Plo@am__quote@
595@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_xcb_xdefaults.Plo@am__quote@
596@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_xlib_buffer.Plo@am__quote@
597@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_xlib_color.Plo@am__quote@
598@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_xlib_main.Plo@am__quote@
599@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_xlib_outbuf.Plo@am__quote@
600@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_la-evas_engine.Plo@am__quote@
601@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_la-evas_xcb_buffer.Plo@am__quote@
602@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_la-evas_xcb_color.Plo@am__quote@
603@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_la-evas_xcb_main.Plo@am__quote@
604@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_la-evas_xcb_outbuf.Plo@am__quote@
605@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_la-evas_xcb_xdefaults.Plo@am__quote@
606@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_la-evas_xlib_buffer.Plo@am__quote@
607@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_la-evas_xlib_color.Plo@am__quote@
608@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_la-evas_xlib_main.Plo@am__quote@
609@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/module_la-evas_xlib_outbuf.Plo@am__quote@
610
611.c.o:
612@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
613@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
614@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
615@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
616@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
617@am__fastdepCC_FALSE@ $(COMPILE) -c $<
618
619.c.obj:
620@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
621@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
622@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
623@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
624@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
625@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
626
627.c.lo:
628@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
629@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
630@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
631@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
632@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
633@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
634
635module_la-evas_engine.lo: evas_engine.c
636@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT module_la-evas_engine.lo -MD -MP -MF $(DEPDIR)/module_la-evas_engine.Tpo -c -o module_la-evas_engine.lo `test -f 'evas_engine.c' || echo '$(srcdir)/'`evas_engine.c
637@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/module_la-evas_engine.Tpo $(DEPDIR)/module_la-evas_engine.Plo
638@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
639@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='evas_engine.c' object='module_la-evas_engine.lo' libtool=yes @AMDEPBACKSLASH@
640@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
641@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_engine.lo `test -f 'evas_engine.c' || echo '$(srcdir)/'`evas_engine.c
642
643module_la-evas_xlib_outbuf.lo: evas_xlib_outbuf.c
644@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT module_la-evas_xlib_outbuf.lo -MD -MP -MF $(DEPDIR)/module_la-evas_xlib_outbuf.Tpo -c -o module_la-evas_xlib_outbuf.lo `test -f 'evas_xlib_outbuf.c' || echo '$(srcdir)/'`evas_xlib_outbuf.c
645@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/module_la-evas_xlib_outbuf.Tpo $(DEPDIR)/module_la-evas_xlib_outbuf.Plo
646@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
647@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='evas_xlib_outbuf.c' object='module_la-evas_xlib_outbuf.lo' libtool=yes @AMDEPBACKSLASH@
648@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
649@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_xlib_outbuf.lo `test -f 'evas_xlib_outbuf.c' || echo '$(srcdir)/'`evas_xlib_outbuf.c
650
651module_la-evas_xlib_buffer.lo: evas_xlib_buffer.c
652@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT module_la-evas_xlib_buffer.lo -MD -MP -MF $(DEPDIR)/module_la-evas_xlib_buffer.Tpo -c -o module_la-evas_xlib_buffer.lo `test -f 'evas_xlib_buffer.c' || echo '$(srcdir)/'`evas_xlib_buffer.c
653@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/module_la-evas_xlib_buffer.Tpo $(DEPDIR)/module_la-evas_xlib_buffer.Plo
654@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
655@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='evas_xlib_buffer.c' object='module_la-evas_xlib_buffer.lo' libtool=yes @AMDEPBACKSLASH@
656@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
657@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_xlib_buffer.lo `test -f 'evas_xlib_buffer.c' || echo '$(srcdir)/'`evas_xlib_buffer.c
658
659module_la-evas_xlib_color.lo: evas_xlib_color.c
660@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT module_la-evas_xlib_color.lo -MD -MP -MF $(DEPDIR)/module_la-evas_xlib_color.Tpo -c -o module_la-evas_xlib_color.lo `test -f 'evas_xlib_color.c' || echo '$(srcdir)/'`evas_xlib_color.c
661@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/module_la-evas_xlib_color.Tpo $(DEPDIR)/module_la-evas_xlib_color.Plo
662@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
663@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='evas_xlib_color.c' object='module_la-evas_xlib_color.lo' libtool=yes @AMDEPBACKSLASH@
664@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
665@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_xlib_color.lo `test -f 'evas_xlib_color.c' || echo '$(srcdir)/'`evas_xlib_color.c
666
667module_la-evas_xlib_main.lo: evas_xlib_main.c
668@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT module_la-evas_xlib_main.lo -MD -MP -MF $(DEPDIR)/module_la-evas_xlib_main.Tpo -c -o module_la-evas_xlib_main.lo `test -f 'evas_xlib_main.c' || echo '$(srcdir)/'`evas_xlib_main.c
669@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/module_la-evas_xlib_main.Tpo $(DEPDIR)/module_la-evas_xlib_main.Plo
670@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
671@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='evas_xlib_main.c' object='module_la-evas_xlib_main.lo' libtool=yes @AMDEPBACKSLASH@
672@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
673@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_xlib_main.lo `test -f 'evas_xlib_main.c' || echo '$(srcdir)/'`evas_xlib_main.c
674
675module_la-evas_xcb_xdefaults.lo: evas_xcb_xdefaults.c
676@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT module_la-evas_xcb_xdefaults.lo -MD -MP -MF $(DEPDIR)/module_la-evas_xcb_xdefaults.Tpo -c -o module_la-evas_xcb_xdefaults.lo `test -f 'evas_xcb_xdefaults.c' || echo '$(srcdir)/'`evas_xcb_xdefaults.c
677@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/module_la-evas_xcb_xdefaults.Tpo $(DEPDIR)/module_la-evas_xcb_xdefaults.Plo
678@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
679@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='evas_xcb_xdefaults.c' object='module_la-evas_xcb_xdefaults.lo' libtool=yes @AMDEPBACKSLASH@
680@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
681@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_xcb_xdefaults.lo `test -f 'evas_xcb_xdefaults.c' || echo '$(srcdir)/'`evas_xcb_xdefaults.c
682
683module_la-evas_xcb_outbuf.lo: evas_xcb_outbuf.c
684@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT module_la-evas_xcb_outbuf.lo -MD -MP -MF $(DEPDIR)/module_la-evas_xcb_outbuf.Tpo -c -o module_la-evas_xcb_outbuf.lo `test -f 'evas_xcb_outbuf.c' || echo '$(srcdir)/'`evas_xcb_outbuf.c
685@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/module_la-evas_xcb_outbuf.Tpo $(DEPDIR)/module_la-evas_xcb_outbuf.Plo
686@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
687@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='evas_xcb_outbuf.c' object='module_la-evas_xcb_outbuf.lo' libtool=yes @AMDEPBACKSLASH@
688@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
689@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_xcb_outbuf.lo `test -f 'evas_xcb_outbuf.c' || echo '$(srcdir)/'`evas_xcb_outbuf.c
690
691module_la-evas_xcb_buffer.lo: evas_xcb_buffer.c
692@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT module_la-evas_xcb_buffer.lo -MD -MP -MF $(DEPDIR)/module_la-evas_xcb_buffer.Tpo -c -o module_la-evas_xcb_buffer.lo `test -f 'evas_xcb_buffer.c' || echo '$(srcdir)/'`evas_xcb_buffer.c
693@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/module_la-evas_xcb_buffer.Tpo $(DEPDIR)/module_la-evas_xcb_buffer.Plo
694@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
695@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='evas_xcb_buffer.c' object='module_la-evas_xcb_buffer.lo' libtool=yes @AMDEPBACKSLASH@
696@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
697@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_xcb_buffer.lo `test -f 'evas_xcb_buffer.c' || echo '$(srcdir)/'`evas_xcb_buffer.c
698
699module_la-evas_xcb_color.lo: evas_xcb_color.c
700@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT module_la-evas_xcb_color.lo -MD -MP -MF $(DEPDIR)/module_la-evas_xcb_color.Tpo -c -o module_la-evas_xcb_color.lo `test -f 'evas_xcb_color.c' || echo '$(srcdir)/'`evas_xcb_color.c
701@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/module_la-evas_xcb_color.Tpo $(DEPDIR)/module_la-evas_xcb_color.Plo
702@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
703@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='evas_xcb_color.c' object='module_la-evas_xcb_color.lo' libtool=yes @AMDEPBACKSLASH@
704@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
705@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_xcb_color.lo `test -f 'evas_xcb_color.c' || echo '$(srcdir)/'`evas_xcb_color.c
706
707module_la-evas_xcb_main.lo: evas_xcb_main.c
708@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT module_la-evas_xcb_main.lo -MD -MP -MF $(DEPDIR)/module_la-evas_xcb_main.Tpo -c -o module_la-evas_xcb_main.lo `test -f 'evas_xcb_main.c' || echo '$(srcdir)/'`evas_xcb_main.c
709@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/module_la-evas_xcb_main.Tpo $(DEPDIR)/module_la-evas_xcb_main.Plo
710@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
711@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='evas_xcb_main.c' object='module_la-evas_xcb_main.lo' libtool=yes @AMDEPBACKSLASH@
712@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
713@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(module_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o module_la-evas_xcb_main.lo `test -f 'evas_xcb_main.c' || echo '$(srcdir)/'`evas_xcb_main.c
714
715mostlyclean-libtool:
716 -rm -f *.lo
717
718clean-libtool:
719 -rm -rf .libs _libs
720install-includesHEADERS: $(includes_HEADERS)
721 @$(NORMAL_INSTALL)
722 test -z "$(includesdir)" || $(MKDIR_P) "$(DESTDIR)$(includesdir)"
723 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
724 for p in $$list; do \
725 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
726 echo "$$d$$p"; \
727 done | $(am__base_list) | \
728 while read files; do \
729 echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesdir)'"; \
730 $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesdir)" || exit $$?; \
731 done
732
733uninstall-includesHEADERS:
734 @$(NORMAL_UNINSTALL)
735 @list='$(includes_HEADERS)'; test -n "$(includesdir)" || list=; \
736 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
737 test -n "$$files" || exit 0; \
738 echo " ( cd '$(DESTDIR)$(includesdir)' && rm -f" $$files ")"; \
739 cd "$(DESTDIR)$(includesdir)" && rm -f $$files
740
741ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
742 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
743 unique=`for i in $$list; do \
744 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
745 done | \
746 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
747 END { if (nonempty) { for (i in files) print i; }; }'`; \
748 mkid -fID $$unique
749tags: TAGS
750
751TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
752 $(TAGS_FILES) $(LISP)
753 set x; \
754 here=`pwd`; \
755 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
756 unique=`for i in $$list; do \
757 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
758 done | \
759 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
760 END { if (nonempty) { for (i in files) print i; }; }'`; \
761 shift; \
762 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
763 test -n "$$unique" || unique=$$empty_fix; \
764 if test $$# -gt 0; then \
765 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
766 "$$@" $$unique; \
767 else \
768 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
769 $$unique; \
770 fi; \
771 fi
772ctags: CTAGS
773CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
774 $(TAGS_FILES) $(LISP)
775 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
776 unique=`for i in $$list; do \
777 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
778 done | \
779 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
780 END { if (nonempty) { for (i in files) print i; }; }'`; \
781 test -z "$(CTAGS_ARGS)$$unique" \
782 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
783 $$unique
784
785GTAGS:
786 here=`$(am__cd) $(top_builddir) && pwd` \
787 && $(am__cd) $(top_srcdir) \
788 && gtags -i $(GTAGS_ARGS) "$$here"
789
790distclean-tags:
791 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
792
793distdir: $(DISTFILES)
794 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
795 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
796 list='$(DISTFILES)'; \
797 dist_files=`for file in $$list; do echo $$file; done | \
798 sed -e "s|^$$srcdirstrip/||;t" \
799 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
800 case $$dist_files in \
801 */*) $(MKDIR_P) `echo "$$dist_files" | \
802 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
803 sort -u` ;; \
804 esac; \
805 for file in $$dist_files; do \
806 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
807 if test -d $$d/$$file; then \
808 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
809 if test -d "$(distdir)/$$file"; then \
810 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
811 fi; \
812 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
813 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
814 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
815 fi; \
816 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
817 else \
818 test -f "$(distdir)/$$file" \
819 || cp -p $$d/$$file "$(distdir)/$$file" \
820 || exit 1; \
821 fi; \
822 done
823check-am: all-am
824check: check-am
825all-am: Makefile $(LTLIBRARIES) $(HEADERS)
826installdirs:
827 for dir in "$(DESTDIR)$(pkgdir)" "$(DESTDIR)$(includesdir)"; do \
828 test -z "$$dir" || $(MKDIR_P) "$$dir"; \
829 done
830install: install-am
831install-exec: install-exec-am
832install-data: install-data-am
833uninstall: uninstall-am
834
835install-am: all-am
836 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
837
838installcheck: installcheck-am
839install-strip:
840 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
841 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
842 `test -z '$(STRIP)' || \
843 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
844mostlyclean-generic:
845
846clean-generic:
847
848distclean-generic:
849 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
850 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
851
852maintainer-clean-generic:
853 @echo "This command is intended for maintainers to use"
854 @echo "it deletes files that may require special tools to rebuild."
855 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
856clean: clean-am
857
858clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
859 clean-pkgLTLIBRARIES mostlyclean-am
860
861distclean: distclean-am
862 -rm -rf ./$(DEPDIR)
863 -rm -f Makefile
864distclean-am: clean-am distclean-compile distclean-generic \
865 distclean-tags
866
867dvi: dvi-am
868
869dvi-am:
870
871html: html-am
872
873html-am:
874
875info: info-am
876
877info-am:
878
879install-data-am: install-includesHEADERS install-pkgLTLIBRARIES
880
881install-dvi: install-dvi-am
882
883install-dvi-am:
884
885install-exec-am:
886
887install-html: install-html-am
888
889install-html-am:
890
891install-info: install-info-am
892
893install-info-am:
894
895install-man:
896
897install-pdf: install-pdf-am
898
899install-pdf-am:
900
901install-ps: install-ps-am
902
903install-ps-am:
904
905installcheck-am:
906
907maintainer-clean: maintainer-clean-am
908 -rm -rf ./$(DEPDIR)
909 -rm -f Makefile
910maintainer-clean-am: distclean-am maintainer-clean-generic
911
912mostlyclean: mostlyclean-am
913
914mostlyclean-am: mostlyclean-compile mostlyclean-generic \
915 mostlyclean-libtool
916
917pdf: pdf-am
918
919pdf-am:
920
921ps: ps-am
922
923ps-am:
924
925uninstall-am: uninstall-includesHEADERS uninstall-pkgLTLIBRARIES
926
927.MAKE: install-am install-strip
928
929.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
930 clean-libtool clean-noinstLTLIBRARIES clean-pkgLTLIBRARIES \
931 ctags distclean distclean-compile distclean-generic \
932 distclean-libtool distclean-tags distdir dvi dvi-am html \
933 html-am info info-am install install-am install-data \
934 install-data-am install-dvi install-dvi-am install-exec \
935 install-exec-am install-html install-html-am \
936 install-includesHEADERS install-info install-info-am \
937 install-man install-pdf install-pdf-am install-pkgLTLIBRARIES \
938 install-ps install-ps-am install-strip installcheck \
939 installcheck-am installdirs maintainer-clean \
940 maintainer-clean-generic mostlyclean mostlyclean-compile \
941 mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
942 tags uninstall uninstall-am uninstall-includesHEADERS \
943 uninstall-pkgLTLIBRARIES
944
945
946# Tell versions [3.59,3.63) of GNU make to not export all variables.
947# Otherwise a system limit (for SysV at least) may be exceeded.
948.NOEXPORT:
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_engine.c b/libraries/evas/src/modules/engines/software_x11/evas_engine.c
new file mode 100644
index 0000000..0a2d2a3
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_engine.c
@@ -0,0 +1,929 @@
1#include "evas_common.h"
2#include "evas_private.h"
3
4#include "Evas_Engine_Software_X11.h"
5#include "evas_engine.h"
6
7#ifdef BUILD_ENGINE_SOFTWARE_XLIB
8# include "evas_xlib_outbuf.h"
9# include "evas_xlib_color.h"
10#endif
11
12#ifdef BUILD_ENGINE_SOFTWARE_XCB
13# include "evas_xcb_outbuf.h"
14# include "evas_xcb_color.h"
15# include "evas_xcb_xdefaults.h"
16#endif
17
18int _evas_engine_soft_x11_log_dom = -1;
19
20/* function tables - filled in later (func and parent func) */
21static Evas_Func func, pfunc;
22
23#ifdef BUILD_ENGINE_SOFTWARE_XLIB
24/*
25struct xrdb_user
26{
27 time_t last_stat;
28 time_t last_mtime;
29 XrmDatabase db;
30};
31static struct xrdb_user xrdb_user = {0, 0, NULL};
32
33static Eina_Bool
34xrdb_user_query(const char *name, const char *cls, char **type, XrmValue *val)
35{
36 time_t last, now;
37
38 last = xrdb_user.last_stat;
39 now = time(NULL);
40
41 xrdb_user.last_stat = now;
42 if (last != now) // don't stat() more than once every second
43 {
44 struct stat st;
45 const char *home;
46 char tmp[PATH_MAX];
47
48 if (!(home = getenv("HOME")))
49 goto failed;
50
51 snprintf(tmp, sizeof(tmp), "%s/.Xdefaults", home);
52 if (stat(tmp, &st) != 0) goto failed;
53 if (xrdb_user.last_mtime != st.st_mtime)
54 {
55 if (xrdb_user.db) XrmDestroyDatabase(xrdb_user.db);
56 xrdb_user.db = XrmGetFileDatabase(tmp);
57 if (!xrdb_user.db) goto failed;
58 xrdb_user.last_mtime = st.st_mtime;
59 }
60 }
61
62 if (!xrdb_user.db) return EINA_FALSE;
63 return XrmGetResource(xrdb_user.db, name, cls, type, val);
64
65 failed:
66 if (xrdb_user.db)
67 {
68 XrmDestroyDatabase(xrdb_user.db);
69 xrdb_user.db = NULL;
70 }
71 xrdb_user.last_mtime = 0;
72 return EINA_FALSE;
73}
74*/
75#endif
76
77/* engine struct data */
78typedef struct _Render_Engine Render_Engine;
79
80struct _Render_Engine
81{
82 Tilebuf *tb;
83 Outbuf *ob;
84 Tilebuf_Rect *rects;
85 Eina_Inlist *cur_rect;
86 unsigned char end : 1;
87/*
88#ifdef BUILD_ENGINE_SOFTWARE_XLIB
89 XrmDatabase xrdb;
90#endif
91 struct
92 {
93 int dpi;
94 } xr;
95 */
96#ifdef EVAS_FRAME_QUEUING
97 Evas_Engine_Render_Mode render_mode;
98#endif
99
100 void (*outbuf_free)(Outbuf *ob);
101 void (*outbuf_reconfigure)(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth);
102 int (*outbuf_get_rot)(Outbuf *ob);
103 RGBA_Image *(*outbuf_new_region_for_update)(Outbuf *ob, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch);
104 void (*outbuf_push_updated_region)(Outbuf *ob, RGBA_Image *update, int x, int y, int w, int h);
105 void (*outbuf_free_region_for_update)(Outbuf *ob, RGBA_Image *update);
106 void (*outbuf_flush)(Outbuf *ob);
107 void (*outbuf_idle_flush)(Outbuf *ob);
108 Eina_Bool (*outbuf_alpha_get)(Outbuf *ob);
109#ifdef EVAS_FRAME_QUEUING
110 void (*outbuf_set_priv)(Outbuf *ob, void *cur, void *prev);
111#endif
112};
113
114/* prototypes we will use here */
115static void *_best_visual_get(int backend, void *connection, int screen);
116static unsigned int _best_colormap_get(int backend, void *connection, int screen);
117static int _best_depth_get(int backend, void *connection, int screen);
118
119static void *eng_info(Evas *e);
120static void eng_info_free(Evas *e, void *info);
121static int eng_setup(Evas *e, void *info);
122static void eng_output_free(void *data);
123static void eng_output_resize(void *data, int w, int h);
124static void eng_output_tile_size_set(void *data, int w, int h);
125static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h);
126static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h);
127static void eng_output_redraws_clear(void *data);
128static 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);
129static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
130static void eng_output_flush(void *data);
131static void eng_output_idle_flush(void *data);
132
133/* internal engine routines */
134
135#ifdef BUILD_ENGINE_SOFTWARE_XLIB
136static void *
137_output_xlib_setup(int w, int h, int rot, Display *disp, Drawable draw,
138 Visual *vis, Colormap cmap, int depth, int debug,
139 int grayscale, int max_colors, Pixmap mask,
140 int shape_dither, int destination_alpha)
141{
142 Render_Engine *re;
143// int status;
144// char *type = NULL;
145// XrmValue val;
146
147 if (!(re = calloc(1, sizeof(Render_Engine)))) return NULL;
148
149 evas_software_xlib_x_init();
150 evas_software_xlib_x_color_init();
151 evas_software_xlib_outbuf_init();
152/*
153 re->xr.dpi = 75000; // dpy * 1000
154
155 status = xrdb_user_query("Xft.dpi", "Xft.Dpi", &type, &val);
156 if ((!status) || (!type))
157 {
158 if (!re->xrdb) re->xrdb = XrmGetDatabase(disp);
159 if (re->xrdb)
160 status = XrmGetResource(re->xrdb,
161 "Xft.dpi", "Xft.Dpi", &type, &val);
162 }
163
164 if ((status) && (type))
165 {
166 if (!strcmp(type, "String"))
167 {
168 const char *str, *dp;
169
170 str = val.addr;
171 dp = strchr(str, '.');
172 if (!dp) dp = strchr(str, ',');
173
174 if (dp)
175 {
176 int subdpi, len, i;
177 char *buf;
178
179 buf = alloca(dp - str + 1);
180 strncpy(buf, str, dp - str);
181 buf[dp - str] = 0;
182 len = strlen(dp + 1);
183 subdpi = atoi(dp + 1);
184
185 if (len < 3)
186 {
187 for (i = len; i < 3; i++)
188 subdpi *= 10;
189 }
190 else if (len > 3)
191 {
192 for (i = len; i > 3; i--)
193 subdpi /= 10;
194 }
195 re->xr.dpi = atoi(buf) * 1000;
196 }
197 else
198 re->xr.dpi = atoi(str) * 1000;
199 evas_common_font_dpi_set(re->xr.dpi / 1000);
200 }
201 }
202 */
203 re->ob =
204 evas_software_xlib_outbuf_setup_x(w, h, rot, OUTBUF_DEPTH_INHERIT, disp,
205 draw, vis, cmap, depth, grayscale,
206 max_colors, mask, shape_dither,
207 destination_alpha);
208 if (!re->ob)
209 {
210 free(re);
211 return NULL;
212 }
213
214 /* for updates return 1 big buffer, but only use portions of it, also cache
215 * it and keepit around until an idle_flush */
216
217 /* disable for now - i am hunting down why some expedite tests are slower,
218 * as well as shaped stuff is broken and probable non-32bpp is broken as
219 * convert funcs dont do the right thing
220 *
221 */
222// re->ob->onebuf = 1;
223
224 evas_software_xlib_outbuf_debug_set(re->ob, debug);
225 re->tb = evas_common_tilebuf_new(w, h);
226 if (!re->tb)
227 {
228 evas_software_xlib_outbuf_free(re->ob);
229 free(re);
230 return NULL;
231 }
232
233 /* in preliminary tests 16x16 gave highest framerates */
234 evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
235 return re;
236}
237#endif
238
239#ifdef BUILD_ENGINE_SOFTWARE_XCB
240static void *
241_output_xcb_setup(int w, int h, int rot, xcb_connection_t *conn,
242 xcb_screen_t *screen, xcb_drawable_t draw,
243 xcb_visualtype_t *vis, xcb_colormap_t cmap, int depth,
244 int debug, int grayscale, int max_colors, xcb_drawable_t mask,
245 int shape_dither, int destination_alpha)
246{
247 Render_Engine *re;
248// int v = 0;
249
250 if (!(re = calloc(1, sizeof(Render_Engine)))) return NULL;
251
252 evas_software_xcb_init();
253 evas_software_xcb_color_init();
254 evas_software_xcb_outbuf_init();
255/*
256 // FIXME: re->xrdb
257 _evas_xcb_xdefaults_init();
258 v = _evas_xcb_xdefaults_int_get("Xft", "dpi");
259 _evas_xcb_xdefaults_shutdown();
260 if (v) re->xr.dpi = (v * 1000);
261 else re->xr.dpi = 75000; // dpy * 1000
262
263 evas_common_font_dpi_set(re->xr.dpi / 1000);
264 */
265 re->ob =
266 evas_software_xcb_outbuf_setup(w, h, rot, OUTBUF_DEPTH_INHERIT, conn,
267 screen, draw, vis, cmap, depth,
268 grayscale, max_colors, mask,
269 shape_dither, destination_alpha);
270 if (!re->ob)
271 {
272 free(re);
273 return NULL;
274 }
275
276 /* for updates return 1 big buffer, but only use portions of it, also cache
277 * it and keepit around until an idle_flush */
278
279 /* disable for now - i am hunting down why some expedite tests are slower,
280 * as well as shaped stuff is broken and probable non-32bpp is broken as
281 * convert funcs dont do the right thing
282 *
283 */
284// re->ob->onebuf = 1;
285
286 evas_software_xcb_outbuf_debug_set(re->ob, debug);
287
288 re->tb = evas_common_tilebuf_new(w, h);
289 if (!re->tb)
290 {
291 evas_software_xcb_outbuf_free(re->ob);
292 free(re);
293 return NULL;
294 }
295
296 /* in preliminary tests 16x16 gave highest framerates */
297 evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
298 return re;
299}
300#endif
301
302static void *
303_best_visual_get(int backend, void *connection, int screen)
304{
305 if (!connection) return NULL;
306
307#ifdef BUILD_ENGINE_SOFTWARE_XLIB
308 if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
309 return DefaultVisual((Display *)connection, screen);
310#endif
311
312#ifdef BUILD_ENGINE_SOFTWARE_XCB
313 if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB)
314 {
315 xcb_screen_iterator_t iter_screen;
316 xcb_depth_iterator_t iter_depth;
317 xcb_screen_t *s = NULL;
318
319 iter_screen =
320 xcb_setup_roots_iterator(xcb_get_setup((xcb_connection_t *)connection));
321 for (; iter_screen.rem; --screen, xcb_screen_next(&iter_screen))
322 if (screen == 0)
323 {
324 s = iter_screen.data;
325 break;
326 }
327
328 iter_depth = xcb_screen_allowed_depths_iterator(s);
329 for (; iter_depth.rem; xcb_depth_next(&iter_depth))
330 {
331 xcb_visualtype_iterator_t iter_vis;
332
333 iter_vis = xcb_depth_visuals_iterator(iter_depth.data);
334 for (; iter_vis.rem; xcb_visualtype_next(&iter_vis))
335 {
336 if (s->root_visual == iter_vis.data->visual_id)
337 return iter_vis.data;
338 }
339 }
340 }
341#endif
342
343 return NULL;
344}
345
346static unsigned int
347_best_colormap_get(int backend, void *connection, int screen)
348{
349 if (!connection) return 0;
350
351#ifdef BUILD_ENGINE_SOFTWARE_XLIB
352 if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
353 return DefaultColormap((Display *)connection, screen);
354#endif
355
356#ifdef BUILD_ENGINE_SOFTWARE_XCB
357 if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB)
358 {
359 xcb_screen_iterator_t iter_screen;
360 xcb_screen_t *s = NULL;
361
362 iter_screen =
363 xcb_setup_roots_iterator(xcb_get_setup((xcb_connection_t *)connection));
364 for (; iter_screen.rem; --screen, xcb_screen_next(&iter_screen))
365 if (screen == 0)
366 {
367 s = iter_screen.data;
368 break;
369 }
370
371 return s->default_colormap;
372 }
373#endif
374
375 return 0;
376}
377
378static int
379_best_depth_get(int backend, void *connection, int screen)
380{
381 if (!connection) return 0;
382
383#ifdef BUILD_ENGINE_SOFTWARE_XLIB
384 if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
385 return DefaultDepth((Display *)connection, screen);
386#endif
387
388#ifdef BUILD_ENGINE_SOFTWARE_XCB
389 if (backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB)
390 {
391 xcb_screen_iterator_t iter_screen;
392 xcb_screen_t *s = NULL;
393
394 iter_screen =
395 xcb_setup_roots_iterator(xcb_get_setup((xcb_connection_t *)connection));
396 for (; iter_screen.rem; --screen, xcb_screen_next(&iter_screen))
397 if (screen == 0)
398 {
399 s = iter_screen.data;
400 break;
401 }
402
403 return s->root_depth;
404 }
405#endif
406
407 return 0;
408}
409
410/* engine api this module provides */
411static void *
412eng_info(Evas *e __UNUSED__)
413{
414 Evas_Engine_Info_Software_X11 *info;
415
416 if (!(info = calloc(1, sizeof(Evas_Engine_Info_Software_X11))))
417 return NULL;
418
419 info->magic.magic = rand();
420 info->info.debug = 0;
421 info->info.alloc_grayscale = 0;
422 info->info.alloc_colors_max = 216;
423 info->func.best_visual_get = _best_visual_get;
424 info->func.best_colormap_get = _best_colormap_get;
425 info->func.best_depth_get = _best_depth_get;
426 info->render_mode = EVAS_RENDER_MODE_BLOCKING;
427 return info;
428}
429
430static void
431eng_info_free(Evas *e __UNUSED__, void *info)
432{
433 Evas_Engine_Info_Software_X11 *in;
434
435 in = (Evas_Engine_Info_Software_X11 *)info;
436 free(in);
437}
438
439static int
440eng_setup(Evas *e, void *in)
441{
442 Evas_Engine_Info_Software_X11 *info;
443 Render_Engine *re = NULL;
444
445 info = (Evas_Engine_Info_Software_X11 *)in;
446 if (!e->engine.data.output)
447 {
448 /* if we haven't initialized - init (automatic abort if already done) */
449 evas_common_cpu_init();
450 evas_common_blend_init();
451 evas_common_image_init();
452 evas_common_convert_init();
453 evas_common_scale_init();
454 evas_common_rectangle_init();
455 evas_common_polygon_init();
456 evas_common_line_init();
457 evas_common_font_init();
458 evas_common_draw_init();
459 evas_common_tilebuf_init();
460
461#ifdef BUILD_ENGINE_SOFTWARE_XLIB
462 if (info->info.backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
463 {
464 re = _output_xlib_setup(e->output.w, e->output.h,
465 info->info.rotation, info->info.connection,
466 info->info.drawable, info->info.visual,
467 info->info.colormap,
468 info->info.depth, info->info.debug,
469 info->info.alloc_grayscale,
470 info->info.alloc_colors_max,
471 info->info.mask, info->info.shape_dither,
472 info->info.destination_alpha);
473
474 re->outbuf_free = evas_software_xlib_outbuf_free;
475 re->outbuf_reconfigure = evas_software_xlib_outbuf_reconfigure;
476 re->outbuf_get_rot = evas_software_xlib_outbuf_get_rot;
477 re->outbuf_new_region_for_update =
478 evas_software_xlib_outbuf_new_region_for_update;
479 re->outbuf_push_updated_region =
480 evas_software_xlib_outbuf_push_updated_region;
481 re->outbuf_free_region_for_update =
482 evas_software_xlib_outbuf_free_region_for_update;
483 re->outbuf_flush = evas_software_xlib_outbuf_flush;
484 re->outbuf_idle_flush = evas_software_xlib_outbuf_idle_flush;
485 re->outbuf_alpha_get = evas_software_xlib_outbuf_alpha_get;
486# ifdef EVAS_FRAME_QUEUING
487 re->outbuf_set_priv = evas_software_xlib_outbuf_set_priv;
488 re->render_mode = info->render_mode;
489# endif
490 }
491#endif
492
493#ifdef BUILD_ENGINE_SOFTWARE_XCB
494 if (info->info.backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB)
495 {
496 re = _output_xcb_setup(e->output.w, e->output.h,
497 info->info.rotation, info->info.connection,
498 info->info.screen, info->info.drawable,
499 info->info.visual, info->info.colormap,
500 info->info.depth, info->info.debug,
501 info->info.alloc_grayscale,
502 info->info.alloc_colors_max,
503 info->info.mask, info->info.shape_dither,
504 info->info.destination_alpha);
505
506 re->outbuf_free = evas_software_xcb_outbuf_free;
507 re->outbuf_reconfigure = evas_software_xcb_outbuf_reconfigure;
508 re->outbuf_get_rot = evas_software_xcb_outbuf_rotation_get;
509 re->outbuf_new_region_for_update =
510 evas_software_xcb_outbuf_new_region_for_update;
511 re->outbuf_push_updated_region =
512 evas_software_xcb_outbuf_push_updated_region;
513 re->outbuf_free_region_for_update =
514 evas_software_xcb_outbuf_free_region_for_update;
515 re->outbuf_flush = evas_software_xcb_outbuf_flush;
516 re->outbuf_idle_flush = evas_software_xcb_outbuf_idle_flush;
517 re->outbuf_alpha_get = evas_software_xcb_outbuf_alpha_get;
518# ifdef EVAS_FRAME_QUEUING
519 re->outbuf_set_priv = evas_software_xcb_outbuf_priv_set;
520 re->render_mode = info->render_mode;
521# endif
522 }
523#endif
524
525 e->engine.data.output = re;
526 }
527 else
528 {
529 int ponebuf = 0;
530
531#ifdef EVAS_FRAME_QUEUING
532 evas_common_frameq_flush();
533#endif
534 re = e->engine.data.output;
535 ponebuf = re->ob->onebuf;
536
537#ifdef BUILD_ENGINE_SOFTWARE_XLIB
538 if (info->info.backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XLIB)
539 {
540 evas_software_xlib_outbuf_free(re->ob);
541 re->ob =
542 evas_software_xlib_outbuf_setup_x(e->output.w, e->output.h,
543 info->info.rotation,
544 OUTBUF_DEPTH_INHERIT,
545 info->info.connection,
546 info->info.drawable,
547 info->info.visual,
548 info->info.colormap,
549 info->info.depth,
550 info->info.alloc_grayscale,
551 info->info.alloc_colors_max,
552 info->info.mask,
553 info->info.shape_dither,
554 info->info.destination_alpha);
555
556 evas_software_xlib_outbuf_debug_set(re->ob, info->info.debug);
557# ifdef EVAS_FRAME_QUEUING
558 re->render_mode = info->render_mode;
559# endif
560 }
561#endif
562
563#ifdef BUILD_ENGINE_SOFTWARE_XCB
564 if (info->info.backend == EVAS_ENGINE_INFO_SOFTWARE_X11_BACKEND_XCB)
565 {
566 evas_software_xcb_outbuf_free(re->ob);
567 re->ob =
568 evas_software_xcb_outbuf_setup(e->output.w, e->output.h,
569 info->info.rotation,
570 OUTBUF_DEPTH_INHERIT,
571 info->info.connection,
572 info->info.screen,
573 info->info.drawable,
574 info->info.visual,
575 info->info.colormap,
576 info->info.depth,
577 info->info.alloc_grayscale,
578 info->info.alloc_colors_max,
579 info->info.mask,
580 info->info.shape_dither,
581 info->info.destination_alpha);
582
583 evas_software_xcb_outbuf_debug_set(re->ob, info->info.debug);
584#ifdef EVAS_FRAME_QUEUING
585 re->render_mode = info->render_mode;
586#endif
587 }
588#endif
589 re->ob->onebuf = ponebuf;
590 }
591 if (!e->engine.data.output) return 0;
592 if (!e->engine.data.context)
593 {
594 e->engine.data.context =
595 e->engine.func->context_new(e->engine.data.output);
596 }
597
598 re = e->engine.data.output;
599
600 return 1;
601}
602
603static void
604eng_output_free(void *data)
605{
606 Render_Engine *re;
607
608#ifdef BUILD_ENGINE_SOFTWARE_XLIB
609// NOTE: XrmGetDatabase() result is shared per connection, do not free it.
610// if (re->xrdb) XrmDestroyDatabase(re->xrdb);
611#endif
612
613 if ((re = (Render_Engine *)data))
614 {
615 re->outbuf_free(re->ob);
616 evas_common_tilebuf_free(re->tb);
617 if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
618 free(re);
619 }
620
621 evas_common_font_shutdown();
622 evas_common_image_shutdown();
623}
624
625static void
626eng_output_resize(void *data, int w, int h)
627{
628 Render_Engine *re;
629
630 re = (Render_Engine *)data;
631 re->outbuf_reconfigure(re->ob, w, h, re->outbuf_get_rot(re->ob),
632 OUTBUF_DEPTH_INHERIT);
633 evas_common_tilebuf_free(re->tb);
634 re->tb = evas_common_tilebuf_new(w, h);
635 if (re->tb)
636 evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
637}
638
639static void
640eng_output_tile_size_set(void *data, int w, int h)
641{
642 Render_Engine *re;
643
644 re = (Render_Engine *)data;
645 evas_common_tilebuf_set_tile_size(re->tb, w, h);
646}
647
648static void
649eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
650{
651 Render_Engine *re;
652
653 re = (Render_Engine *)data;
654 evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
655}
656
657static void
658eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
659{
660 Render_Engine *re;
661
662 re = (Render_Engine *)data;
663 evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
664}
665
666static void
667eng_output_redraws_clear(void *data)
668{
669 Render_Engine *re;
670
671 re = (Render_Engine *)data;
672 evas_common_tilebuf_clear(re->tb);
673}
674
675static void *
676eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
677{
678 Render_Engine *re;
679 RGBA_Image *surface;
680 Tilebuf_Rect *rect;
681 int ux, uy, uw, uh;
682
683 re = (Render_Engine *)data;
684 if (re->end)
685 {
686 re->end = 0;
687 return NULL;
688 }
689 if (!re->rects)
690 {
691 re->rects = evas_common_tilebuf_get_render_rects(re->tb);
692 re->cur_rect = EINA_INLIST_GET(re->rects);
693 }
694 if (!re->cur_rect) return NULL;
695 rect = (Tilebuf_Rect *)re->cur_rect;
696 ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h;
697 re->cur_rect = re->cur_rect->next;
698 if (!re->cur_rect)
699 {
700 evas_common_tilebuf_free_render_rects(re->rects);
701 re->rects = NULL;
702 re->end = 1;
703 }
704
705 surface =
706 re->outbuf_new_region_for_update(re->ob, ux, uy, uw, uh, cx, cy, cw, ch);
707
708 *x = ux; *y = uy; *w = uw; *h = uh;
709 return surface;
710}
711
712static void
713eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
714{
715 Render_Engine *re;
716#ifdef EVAS_FRAME_QUEUING
717 Evas_Surface *e_surface;
718#endif
719
720 re = (Render_Engine *)data;
721#if defined(BUILD_PIPE_RENDER) && !defined(EVAS_FRAME_QUEUING)
722 evas_common_pipe_map_begin(surface);
723#endif /* BUILD_PIPE_RENDER && !EVAS_FRAME_QUEUING*/
724
725#ifdef EVAS_FRAME_QUEUING
726 if (re->render_mode == EVAS_RENDER_MODE_NONBLOCKING)
727 {
728 /* create a new frame if this is the first surface of this frame */
729 evas_common_frameq_prepare_frame();
730 /* add surface into the frame */
731 e_surface = evas_common_frameq_new_surface(surface, x, y, w, h);
732 evas_common_frameq_add_surface(e_surface);
733 return;
734 }
735#endif
736
737 re->outbuf_push_updated_region(re->ob, surface, x, y, w, h);
738 re->outbuf_free_region_for_update(re->ob, surface);
739 evas_common_cpu_end_opt();
740}
741
742#ifdef EVAS_FRAME_QUEUING
743static void *
744eng_image_map_surface_new(void *data , int w, int h, int alpha)
745{
746 void *surface;
747 DATA32 *pixels;
748 Render_Engine *re;
749 Evas_Surface *e_surface;
750
751 re = (Render_Engine *)data;
752
753 surface =
754 evas_cache_image_copied_data(evas_common_image_cache_get(), w, h, NULL,
755 alpha, EVAS_COLORSPACE_ARGB8888);
756 pixels = evas_cache_image_pixels(surface);
757
758 if (re->render_mode == EVAS_RENDER_MODE_NONBLOCKING)
759 {
760 /* create a new frame if this is the first surface of this frame */
761 evas_common_frameq_prepare_frame();
762
763 /* add surface into the frame */
764 e_surface = evas_common_frameq_new_surface(surface, 0, 0, w, h);
765
766 /* this surface is not going to be pushed to screen */
767 e_surface->dontpush = 1;
768 evas_common_frameq_add_surface(e_surface);
769 }
770 return surface;
771}
772
773static void
774eng_output_frameq_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
775{
776 Render_Engine *re;
777
778 re = (Render_Engine *)data;
779 re->outbuf_push_updated_region(re->ob, surface, x, y, w, h);
780 re->outbuf_free_region_for_update(re->ob, surface);
781 evas_common_cpu_end_opt();
782}
783
784static void
785eng_output_frameq_flush(void *data)
786{
787 Render_Engine *re;
788
789 re = (Render_Engine *)data;
790 re->outbuf_flush(re->ob);
791}
792
793static void
794eng_output_frameq_set_priv(void *data, void *cur, void *prev)
795{
796 Render_Engine *re;
797
798 re = (Render_Engine *)data;
799 re->outbuf_set_priv(re->ob, cur, prev);
800}
801#endif
802
803static void
804eng_output_flush(void *data)
805{
806 Render_Engine *re;
807
808 re = (Render_Engine *)data;
809#ifdef EVAS_FRAME_QUEUING
810 if (re->render_mode == EVAS_RENDER_MODE_NONBLOCKING)
811 {
812 evas_common_frameq_set_frame_data(data,
813 eng_output_frameq_redraws_next_update_push,
814 eng_output_frameq_flush,
815 eng_output_frameq_set_priv);
816 evas_common_frameq_ready_frame();
817 evas_common_frameq_begin();
818 }
819 else
820#endif
821 re->outbuf_flush(re->ob);
822}
823
824static void
825eng_output_idle_flush(void *data)
826{
827 Render_Engine *re;
828
829 re = (Render_Engine *)data;
830 re->outbuf_idle_flush(re->ob);
831}
832
833static Eina_Bool
834eng_canvas_alpha_get(void *data, void *context __UNUSED__)
835{
836 Render_Engine *re;
837
838 re = (Render_Engine *)data;
839 return (re->ob->priv.destination_alpha) || (re->outbuf_alpha_get(re->ob));
840}
841
842
843/* module advertising code */
844static int
845module_open(Evas_Module *em)
846{
847#ifdef BUILD_ENGINE_SOFTWARE_XLIB
848 static Eina_Bool xrm_inited = EINA_FALSE;
849
850 if (!xrm_inited)
851 {
852 xrm_inited = EINA_TRUE;
853 XrmInitialize();
854 }
855#endif
856
857 if (!em) return 0;
858
859 /* get whatever engine module we inherit from */
860 if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
861
862 _evas_engine_soft_x11_log_dom =
863 eina_log_domain_register("evas-software_x11", EVAS_DEFAULT_LOG_COLOR);
864
865 if (_evas_engine_soft_x11_log_dom < 0)
866 {
867 EINA_LOG_ERR("Can not create a module log domain.");
868 return 0;
869 }
870
871 /* store it for later use */
872 func = pfunc;
873
874 /* now to override methods */
875#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
876 ORD(info);
877 ORD(info_free);
878 ORD(setup);
879 ORD(canvas_alpha_get);
880 ORD(output_free);
881 ORD(output_resize);
882 ORD(output_tile_size_set);
883 ORD(output_redraws_rect_add);
884 ORD(output_redraws_rect_del);
885 ORD(output_redraws_clear);
886 ORD(output_redraws_next_update_get);
887 ORD(output_redraws_next_update_push);
888 ORD(output_flush);
889 ORD(output_idle_flush);
890#ifdef EVAS_FRAME_QUEUING
891 ORD(image_map_surface_new);
892#endif
893
894 /* now advertise out own api */
895 em->functions = (void *)(&func);
896 return 1;
897}
898
899static void
900module_close(Evas_Module *em __UNUSED__)
901{
902 eina_log_domain_unregister(_evas_engine_soft_x11_log_dom);
903#ifdef BUILD_ENGINE_SOFTWARE_XLIB
904/*
905 if (xrdb_user.db)
906 {
907 XrmDestroyDatabase(xrdb_user.db);
908 xrdb_user.last_stat = 0;
909 xrdb_user.last_mtime = 0;
910 xrdb_user.db = NULL;
911 }
912 */
913#endif
914}
915
916static Evas_Module_Api evas_modapi =
917{
918 EVAS_MODULE_API_VERSION, "software_x11", "none",
919 {
920 module_open,
921 module_close
922 }
923};
924
925EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, software_x11);
926
927#ifndef EVAS_STATIC_BUILD_SOFTWARE_X11
928EVAS_EINA_MODULE_DEFINE(engine, software_x11);
929#endif
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_engine.h b/libraries/evas/src/modules/engines/software_x11/evas_engine.h
new file mode 100644
index 0000000..80b71b7
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_engine.h
@@ -0,0 +1,137 @@
1#ifndef EVAS_ENGINE_H
2# define EVAS_ENGINE_H
3
4# include <sys/ipc.h>
5# include <sys/shm.h>
6
7# ifdef BUILD_ENGINE_SOFTWARE_XLIB
8# include <X11/Xlib.h>
9# include <X11/Xutil.h>
10# include <X11/Xatom.h>
11# include <X11/extensions/XShm.h>
12# include <X11/Xresource.h> // xres - dpi
13# endif
14
15# ifdef BUILD_ENGINE_SOFTWARE_XCB
16# include <xcb/xcb.h>
17# include <xcb/shm.h>
18# include <xcb/xcb_image.h>
19# endif
20
21extern int _evas_engine_soft_x11_log_dom;
22
23# ifdef ERR
24# undef ERR
25# endif
26# define ERR(...) EINA_LOG_DOM_ERR(_evas_engine_soft_x11_log_dom, __VA_ARGS__)
27
28# ifdef DBG
29# undef DBG
30# endif
31# define DBG(...) EINA_LOG_DOM_DBG(_evas_engine_soft_x11_log_dom, __VA_ARGS__)
32
33# ifdef INF
34# undef INF
35# endif
36# define INF(...) EINA_LOG_DOM_INFO(_evas_engine_soft_x11_log_dom, __VA_ARGS__)
37
38# ifdef WRN
39# undef WRN
40# endif
41# define WRN(...) EINA_LOG_DOM_WARN(_evas_engine_soft_x11_log_dom, __VA_ARGS__)
42
43# ifdef CRIT
44# undef CRIT
45# endif
46# define CRIT(...) \
47 EINA_LOG_DOM_CRIT(_evas_engine_soft_x11_log_dom, __VA_ARGS__)
48
49typedef enum _Outbuf_Depth Outbuf_Depth;
50
51enum _Outbuf_Depth
52{
53 OUTBUF_DEPTH_NONE,
54 OUTBUF_DEPTH_INHERIT,
55 OUTBUF_DEPTH_RGB_16BPP_565_565_DITHERED,
56 OUTBUF_DEPTH_RGB_16BPP_555_555_DITHERED,
57 OUTBUF_DEPTH_RGB_16BPP_444_444_DITHERED,
58 OUTBUF_DEPTH_RGB_16BPP_565_444_DITHERED,
59 OUTBUF_DEPTH_RGB_32BPP_888_8888,
60 OUTBUF_DEPTH_LAST
61};
62
63typedef struct _Outbuf Outbuf;
64
65struct _Outbuf
66{
67 Outbuf_Depth depth;
68 int w, h;
69 int rot;
70 int onebuf;
71
72 struct
73 {
74 Convert_Pal *pal;
75 union
76 {
77# ifdef BUILD_ENGINE_SOFTWARE_XLIB
78 struct
79 {
80 Display *disp;
81 Window win;
82 Pixmap mask;
83 Visual *vis;
84 Colormap cmap;
85 int depth, shm;
86 GC gc, gcm;
87 unsigned char swap : 1;
88 unsigned char bit_swap : 1;
89 } xlib;
90# endif
91# ifdef BUILD_ENGINE_SOFTWARE_XCB
92 struct
93 {
94 xcb_connection_t *conn;
95 xcb_screen_t *screen;
96 xcb_window_t win;
97 xcb_pixmap_t mask;
98 xcb_visualtype_t *visual;
99 xcb_colormap_t cmap;
100 int depth, shm;
101 xcb_gcontext_t gc, gcm;
102 unsigned char swap : 1;
103 unsigned char bit_swap : 1;
104 } xcb;
105# endif
106 } x11;
107 struct
108 {
109 DATA32 r, g, b;
110 } mask;
111
112 /* 1 big buffer for updates - flush on idle_flush */
113 RGBA_Image *onebuf;
114 Eina_List *onebuf_regions;
115
116 /* a list of pending regions to write to the target */
117 Eina_List *pending_writes;
118
119 /* a list of previous frame pending regions to write to the target */
120 Eina_List *prev_pending_writes;
121
122# ifdef EVAS_FRAME_QUEUING
123 /* protecting prev_pending_writes */
124 LK(lock);
125# endif
126
127 unsigned char mask_dither : 1;
128 unsigned char destination_alpha : 1;
129 unsigned char debug : 1;
130 unsigned char synced : 1;
131 } priv;
132};
133
134void evas_software_xlib_x_init(void);
135void evas_software_xcb_init(void);
136
137#endif
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xcb_buffer.c b/libraries/evas/src/modules/engines/software_x11/evas_xcb_buffer.c
new file mode 100644
index 0000000..49ce721
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xcb_buffer.c
@@ -0,0 +1,498 @@
1#include "evas_common.h"
2#include "evas_xcb_buffer.h"
3
4/* local function prototypes */
5static void _xcbob_sync(xcb_connection_t *conn);
6static xcb_image_t *_xcbob_create_native(xcb_connection_t *conn, int w, int h, xcb_image_format_t format, uint8_t depth, void *base, uint32_t bytes, uint8_t *data);
7static xcb_format_t *_xcbob_find_format(const xcb_setup_t *setup, uint8_t depth);
8static xcb_visualtype_t *_xcbob_find_visual_by_id(xcb_screen_t *screen, xcb_visualid_t id);
9
10void
11evas_software_xcb_write_mask_line(Outbuf *buf, Xcb_Output_Buffer *xcbob, DATA32 *src, int w, int y)
12{
13 int x, bpl = 0;
14 DATA32 *src_ptr;
15 DATA8 *dst_ptr;
16
17 src_ptr = src;
18 dst_ptr = evas_software_xcb_output_buffer_data(xcbob, &bpl);
19 dst_ptr = dst_ptr + (bpl * y);
20 w -= 7;
21 if (buf->priv.x11.xcb.bit_swap)
22 {
23 for (x = 0; x < w; x += 8)
24 {
25 *dst_ptr =
26 ((A_VAL(&(src_ptr[0])) >> 7) << 7) |
27 ((A_VAL(&(src_ptr[1])) >> 7) << 6) |
28 ((A_VAL(&(src_ptr[2])) >> 7) << 5) |
29 ((A_VAL(&(src_ptr[3])) >> 7) << 4) |
30 ((A_VAL(&(src_ptr[4])) >> 7) << 3) |
31 ((A_VAL(&(src_ptr[5])) >> 7) << 2) |
32 ((A_VAL(&(src_ptr[6])) >> 7) << 1) |
33 ((A_VAL(&(src_ptr[7])) >> 7) << 0);
34 src_ptr += 8;
35 dst_ptr++;
36 }
37 }
38 else
39 {
40 for (x = 0; x < w; x += 8)
41 {
42 *dst_ptr =
43 ((A_VAL(&(src_ptr[0])) >> 7) << 0) |
44 ((A_VAL(&(src_ptr[1])) >> 7) << 1) |
45 ((A_VAL(&(src_ptr[2])) >> 7) << 2) |
46 ((A_VAL(&(src_ptr[3])) >> 7) << 3) |
47 ((A_VAL(&(src_ptr[4])) >> 7) << 4) |
48 ((A_VAL(&(src_ptr[5])) >> 7) << 5) |
49 ((A_VAL(&(src_ptr[6])) >> 7) << 6) |
50 ((A_VAL(&(src_ptr[7])) >> 7) << 7);
51 src_ptr += 8;
52 dst_ptr++;
53 }
54 }
55 w += 7;
56 for (; x < w; x ++)
57 {
58 xcb_image_put_pixel(xcbob->xim, x, y, A_VAL(src_ptr) >> 7);
59 src_ptr++;
60 }
61}
62
63void
64evas_software_xcb_write_mask_line_rev(Outbuf *buf, Xcb_Output_Buffer *xcbob, DATA32 *src, int w, int y)
65{
66 int x, bpl = 0;
67 DATA32 *src_ptr;
68 DATA8 *dst_ptr;
69
70 src_ptr = src + w - 1;
71 dst_ptr = evas_software_xcb_output_buffer_data(xcbob, &bpl);
72 dst_ptr = dst_ptr + (bpl * y);
73 w -= 7;
74 if (buf->priv.x11.xcb.bit_swap)
75 {
76 for (x = 0; x < w; x += 8)
77 {
78 *dst_ptr =
79 ((A_VAL(&(src_ptr[ 0])) >> 7) << 7) |
80 ((A_VAL(&(src_ptr[-1])) >> 7) << 6) |
81 ((A_VAL(&(src_ptr[-2])) >> 7) << 5) |
82 ((A_VAL(&(src_ptr[-3])) >> 7) << 4) |
83 ((A_VAL(&(src_ptr[-4])) >> 7) << 3) |
84 ((A_VAL(&(src_ptr[-5])) >> 7) << 2) |
85 ((A_VAL(&(src_ptr[-6])) >> 7) << 1) |
86 ((A_VAL(&(src_ptr[-7])) >> 7) << 0);
87 src_ptr -= 8;
88 dst_ptr++;
89 }
90 }
91 else
92 {
93 for (x = 0; x < w; x += 8)
94 {
95 *dst_ptr =
96 ((A_VAL(&(src_ptr[ 0])) >> 7) << 0) |
97 ((A_VAL(&(src_ptr[-1])) >> 7) << 1) |
98 ((A_VAL(&(src_ptr[-2])) >> 7) << 2) |
99 ((A_VAL(&(src_ptr[-3])) >> 7) << 3) |
100 ((A_VAL(&(src_ptr[-4])) >> 7) << 4) |
101 ((A_VAL(&(src_ptr[-5])) >> 7) << 5) |
102 ((A_VAL(&(src_ptr[-6])) >> 7) << 6) |
103 ((A_VAL(&(src_ptr[-7])) >> 7) << 7);
104 src_ptr -= 8;
105 dst_ptr++;
106 }
107 }
108 w += 7;
109 for (; x < w; x ++)
110 {
111 xcb_image_put_pixel(xcbob->xim, x, y, A_VAL(src_ptr) >> 7);
112 src_ptr--;
113 }
114}
115
116void
117evas_software_xcb_write_mask_line_vert(Outbuf *buf, Xcb_Output_Buffer *xcbob, DATA32 *src, int h, int y, int w)
118{
119 int yy, bpl = 0;
120 DATA32 *src_ptr;
121 DATA8 *dst_ptr;
122
123 src_ptr = src;
124 dst_ptr = evas_software_xcb_output_buffer_data(xcbob, &bpl);
125 dst_ptr = dst_ptr + (bpl * y);
126 h -= 7;
127 if (buf->priv.x11.xcb.bit_swap)
128 {
129 for (yy = 0; yy < h; yy += 8)
130 {
131 *dst_ptr =
132 ((A_VAL(&(src_ptr[0 * w])) >> 7) << 7) |
133 ((A_VAL(&(src_ptr[1 * w])) >> 7) << 6) |
134 ((A_VAL(&(src_ptr[2 * w])) >> 7) << 5) |
135 ((A_VAL(&(src_ptr[3 * w])) >> 7) << 4) |
136 ((A_VAL(&(src_ptr[4 * w])) >> 7) << 3) |
137 ((A_VAL(&(src_ptr[5 * w])) >> 7) << 2) |
138 ((A_VAL(&(src_ptr[6 * w])) >> 7) << 1) |
139 ((A_VAL(&(src_ptr[7 * w])) >> 7) << 0);
140 src_ptr += 8 * w;
141 dst_ptr++;
142 }
143 }
144 else
145 {
146 for (yy = 0; yy < h; yy += 8)
147 {
148 *dst_ptr =
149 ((A_VAL(&(src_ptr[0 * w])) >> 7) << 0) |
150 ((A_VAL(&(src_ptr[1 * w])) >> 7) << 1) |
151 ((A_VAL(&(src_ptr[2 * w])) >> 7) << 2) |
152 ((A_VAL(&(src_ptr[3 * w])) >> 7) << 3) |
153 ((A_VAL(&(src_ptr[4 * w])) >> 7) << 4) |
154 ((A_VAL(&(src_ptr[5 * w])) >> 7) << 5) |
155 ((A_VAL(&(src_ptr[6 * w])) >> 7) << 6) |
156 ((A_VAL(&(src_ptr[7 * w])) >> 7) << 7);
157 src_ptr += 8 * w;
158 dst_ptr++;
159 }
160 }
161 h += 7;
162 for (; yy < h; yy ++)
163 {
164 xcb_image_put_pixel(xcbob->xim, yy, y, A_VAL(src_ptr) >> 7);
165 src_ptr += w;
166 }
167}
168
169void
170evas_software_xcb_write_mask_line_vert_rev(Outbuf *buf, Xcb_Output_Buffer *xcbob, DATA32 *src, int h, int y, int w)
171{
172 int yy, bpl = 0;
173 DATA32 *src_ptr;
174 DATA8 *dst_ptr;
175
176 src_ptr = src + ((h - 1) * w);
177 dst_ptr = evas_software_xcb_output_buffer_data(xcbob, &bpl);
178 dst_ptr = dst_ptr + (bpl * y);
179 h -= 7;
180 if (buf->priv.x11.xcb.bit_swap)
181 {
182 for (yy = 0; yy < h; yy += 8)
183 {
184 *dst_ptr =
185 ((A_VAL(&(src_ptr[ 0 * w])) >> 7) << 7) |
186 ((A_VAL(&(src_ptr[-1 * w])) >> 7) << 6) |
187 ((A_VAL(&(src_ptr[-2 * w])) >> 7) << 5) |
188 ((A_VAL(&(src_ptr[-3 * w])) >> 7) << 4) |
189 ((A_VAL(&(src_ptr[-4 * w])) >> 7) << 3) |
190 ((A_VAL(&(src_ptr[-5 * w])) >> 7) << 2) |
191 ((A_VAL(&(src_ptr[-6 * w])) >> 7) << 1) |
192 ((A_VAL(&(src_ptr[-7 * w])) >> 7) << 0);
193 src_ptr -= 8 * w;
194 dst_ptr++;
195 }
196 }
197 else
198 {
199 for (yy = 0; yy < h; yy += 8)
200 {
201 *dst_ptr =
202 ((A_VAL(&(src_ptr[ 0 * w])) >> 7) << 0) |
203 ((A_VAL(&(src_ptr[-1 * w])) >> 7) << 1) |
204 ((A_VAL(&(src_ptr[-2 * w])) >> 7) << 2) |
205 ((A_VAL(&(src_ptr[-3 * w])) >> 7) << 3) |
206 ((A_VAL(&(src_ptr[-4 * w])) >> 7) << 4) |
207 ((A_VAL(&(src_ptr[-5 * w])) >> 7) << 5) |
208 ((A_VAL(&(src_ptr[-6 * w])) >> 7) << 6) |
209 ((A_VAL(&(src_ptr[-7 * w])) >> 7) << 7);
210 src_ptr -= 8 * w;
211 dst_ptr++;
212 }
213 }
214 h += 7;
215 for (; yy < h; yy ++)
216 {
217 xcb_image_put_pixel(xcbob->xim, yy, y, A_VAL(src_ptr) >> 7);
218 src_ptr -= w;
219 }
220}
221
222Eina_Bool
223evas_software_xcb_can_do_shm(xcb_connection_t *conn, xcb_screen_t *screen)
224{
225 const xcb_query_extension_reply_t *reply;
226 static xcb_connection_t *cached_conn = NULL;
227 static int cached_result = 0;
228
229 if (conn == cached_conn) return cached_result;
230 cached_conn = conn;
231
232 reply = xcb_get_extension_data(conn, &xcb_shm_id);
233 if ((reply) && (reply->present))
234 {
235 xcb_visualtype_t *visual;
236 Xcb_Output_Buffer *xcbob = NULL;
237
238 visual = _xcbob_find_visual_by_id(screen, screen->root_visual);
239 xcbob =
240 evas_software_xcb_output_buffer_new(conn, visual, screen->root_depth,
241 16, 16, 2, NULL);
242 if (!xcbob)
243 cached_result = 0;
244 else
245 {
246 evas_software_xcb_output_buffer_free(xcbob, EINA_TRUE);
247 cached_result = 1;
248 }
249 }
250 else
251 cached_result = 0;
252
253 return cached_result;
254}
255
256Xcb_Output_Buffer *
257evas_software_xcb_output_buffer_new(xcb_connection_t *conn, xcb_visualtype_t *vis, int depth, int w, int h, int try_shm, unsigned char *data)
258{
259 Xcb_Output_Buffer *xcbob = NULL;
260
261 if (!(xcbob = calloc(1, sizeof(Xcb_Output_Buffer))))
262 return NULL;
263
264 xcbob->connection = conn;
265 xcbob->visual = vis;
266 xcbob->xim = NULL;
267 xcbob->shm_info = NULL;
268 xcbob->w = w;
269 xcbob->h = h;
270
271 if (try_shm > 0)
272 {
273 xcbob->shm_info = malloc(sizeof(xcb_shm_segment_info_t));
274 if (xcbob->shm_info)
275 {
276 xcbob->shm_info->shmseg = xcb_generate_id(conn);
277 xcbob->xim =
278 _xcbob_create_native(conn, w, h, XCB_IMAGE_FORMAT_Z_PIXMAP,
279 depth, NULL, ~0, NULL);
280 if (xcbob->xim)
281 {
282 xcbob->shm_info->shmid =
283 shmget(IPC_PRIVATE,
284 xcbob->xim->stride * xcbob->xim->height,
285 (IPC_CREAT | 0777));
286 if (xcbob->shm_info->shmid == (uint32_t)-1)
287 {
288 xcb_image_destroy(xcbob->xim);
289 free(xcbob->shm_info);
290 free(xcbob);
291 return NULL;
292 }
293 xcbob->shm_info->shmaddr = xcbob->xim->data =
294 shmat(xcbob->shm_info->shmid, 0, 0);
295 if (xcbob->shm_info->shmaddr != ((void *)-1))
296 {
297 /* Sync only needed for testing */
298 if (try_shm == 2) _xcbob_sync(conn);
299
300#if defined(EVAS_FRAME_QUEUING) && defined(LIBXEXT_VERSION_LOW)
301 if (evas_common_frameq_enabled())
302 xcb_grab_server(conn);
303#endif
304 xcb_shm_attach(conn, xcbob->shm_info->shmseg,
305 xcbob->shm_info->shmid, 0);
306#if defined(EVAS_FRAME_QUEUING) && defined(LIBXEXT_VERSION_LOW)
307 if (evas_common_frameq_enabled())
308 xcb_ungrab_server(conn);
309#endif
310 if (try_shm == 2) _xcbob_sync(conn);
311
312 xcbob->bpl = xcbob->xim->stride;
313 xcbob->psize = (xcbob->bpl * xcbob->h);
314 return xcbob;
315 }
316 shmdt(xcbob->shm_info->shmaddr);
317 shmctl(xcbob->shm_info->shmid, IPC_RMID, 0);
318 }
319 if (xcbob->xim) xcb_image_destroy(xcbob->xim);
320 xcbob->xim = NULL;
321 }
322 if (xcbob->shm_info) free(xcbob->shm_info);
323 xcbob->shm_info = NULL;
324 }
325
326 if (try_shm > 1) return NULL;
327
328 /* no shm */
329 xcbob->xim =
330 _xcbob_create_native(conn, w, h, XCB_IMAGE_FORMAT_Z_PIXMAP,
331 depth, NULL, ~0, NULL);
332 if (!xcbob->xim)
333 {
334 free(xcbob);
335 return NULL;
336 }
337
338 xcbob->data = data;
339
340 if (!xcbob->xim->data)
341 {
342 xcbob->xim->data = malloc(xcbob->xim->stride * xcbob->xim->height);
343 if (!xcbob->xim->data)
344 {
345 xcb_image_destroy(xcbob->xim);
346 free(xcbob);
347 return NULL;
348 }
349 }
350 xcbob->bpl = xcbob->xim->stride;
351 xcbob->psize = (xcbob->bpl * xcbob->h);
352 return xcbob;
353}
354
355void
356evas_software_xcb_output_buffer_free(Xcb_Output_Buffer *xcbob, Eina_Bool sync)
357{
358 if (xcbob->shm_info)
359 {
360 if (sync) _xcbob_sync(xcbob->connection);
361 xcb_shm_detach(xcbob->connection, xcbob->shm_info->shmseg);
362 xcb_image_destroy(xcbob->xim);
363 shmdt(xcbob->shm_info->shmaddr);
364 shmctl(xcbob->shm_info->shmid, IPC_RMID, 0);
365 free(xcbob->shm_info);
366 }
367 else
368 {
369 if (xcbob->data) xcbob->xim->data = NULL;
370// free(xcbob->xim->data);
371 xcb_image_destroy(xcbob->xim);
372 }
373 free(xcbob);
374}
375
376void
377evas_software_xcb_output_buffer_paste(Xcb_Output_Buffer *xcbob, xcb_drawable_t drawable, xcb_gcontext_t gc, int x, int y, Eina_Bool sync)
378{
379 if (xcbob->shm_info)
380 {
381 xcb_image_shm_put(xcbob->connection, drawable, gc, xcbob->xim,
382 *xcbob->shm_info, 0, 0, x, y, xcbob->w, xcbob->h, 0);
383 if (sync) _xcbob_sync(xcbob->connection);
384 }
385 else
386 xcb_image_put(xcbob->connection, drawable, gc, xcbob->xim, x, y, 0);
387}
388
389DATA8 *
390evas_software_xcb_output_buffer_data(Xcb_Output_Buffer *xcbob, int *bpl_ret)
391{
392 if (bpl_ret) *bpl_ret = xcbob->xim->stride;
393 return (DATA8 *)xcbob->xim->data;
394}
395
396int
397evas_software_xcb_output_buffer_depth(Xcb_Output_Buffer *xcbob)
398{
399 return xcbob->xim->bpp;
400}
401
402int
403evas_software_xcb_output_buffer_byte_order(Xcb_Output_Buffer *xcbob)
404{
405 return xcbob->xim->byte_order;
406}
407
408int
409evas_software_xcb_output_buffer_bit_order(Xcb_Output_Buffer *xcbob)
410{
411 return xcbob->xim->bit_order;
412}
413
414/* local functions */
415static void
416_xcbob_sync(xcb_connection_t *conn)
417{
418 free(xcb_get_input_focus_reply(conn,
419 xcb_get_input_focus_unchecked(conn), NULL));
420}
421
422static xcb_image_t *
423_xcbob_create_native(xcb_connection_t *conn, int w, int h, xcb_image_format_t format, uint8_t depth, void *base, uint32_t bytes, uint8_t *data)
424{
425 static uint8_t dpth = 0;
426 static xcb_format_t *fmt = NULL;
427 const xcb_setup_t *setup;
428 xcb_image_format_t xif;
429
430 /* NB: We cannot use xcb_image_create_native as it only creates images
431 * using MSB_FIRST, so this routine recreates that function and uses
432 * the endian-ness of the server setup */
433 setup = xcb_get_setup(conn);
434 xif = format;
435
436 if ((xif == XCB_IMAGE_FORMAT_Z_PIXMAP) && (depth == 1))
437 xif = XCB_IMAGE_FORMAT_XY_PIXMAP;
438
439 if (dpth != depth)
440 {
441 dpth = depth;
442 fmt = _xcbob_find_format(setup, depth);
443 if (!fmt) return 0;
444 }
445
446 switch (xif)
447 {
448 case XCB_IMAGE_FORMAT_XY_BITMAP:
449 if (depth != 1) return 0;
450 case XCB_IMAGE_FORMAT_XY_PIXMAP:
451 case XCB_IMAGE_FORMAT_Z_PIXMAP:
452 return xcb_image_create(w, h, xif,
453 fmt->scanline_pad,
454 fmt->depth, fmt->bits_per_pixel,
455 setup->bitmap_format_scanline_unit,
456 setup->image_byte_order,
457 setup->bitmap_format_bit_order,
458 base, bytes, data);
459 default:
460 break;
461 }
462
463 return 0;
464}
465
466static xcb_format_t *
467_xcbob_find_format(const xcb_setup_t *setup, uint8_t depth)
468{
469 xcb_format_t *fmt, *fmtend;
470
471 fmt = xcb_setup_pixmap_formats(setup);
472 fmtend = fmt + xcb_setup_pixmap_formats_length(setup);
473 for (; fmt != fmtend; ++fmt)
474 if (fmt->depth == depth)
475 return fmt;
476
477 return 0;
478}
479
480static xcb_visualtype_t *
481_xcbob_find_visual_by_id(xcb_screen_t *screen, xcb_visualid_t id)
482{
483 xcb_depth_iterator_t diter;
484 xcb_visualtype_iterator_t viter;
485
486 diter = xcb_screen_allowed_depths_iterator(screen);
487 for (; diter.rem; xcb_depth_next(&diter))
488 {
489 viter = xcb_depth_visuals_iterator(diter.data);
490 for (; viter.rem; xcb_visualtype_next(&viter))
491 {
492 if (viter.data->visual_id == id)
493 return viter.data;
494 }
495 }
496
497 return 0;
498}
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xcb_buffer.h b/libraries/evas/src/modules/engines/software_x11/evas_xcb_buffer.h
new file mode 100644
index 0000000..dc1f0b4
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xcb_buffer.h
@@ -0,0 +1,30 @@
1#ifndef EVAS_XCB_BUFFER_H
2# define EVAS_XCB_BUFFER_H
3
4# include "evas_engine.h"
5
6typedef struct _Xcb_Output_Buffer Xcb_Output_Buffer;
7struct _Xcb_Output_Buffer
8{
9 xcb_connection_t *connection;
10 xcb_visualtype_t *visual;
11 xcb_image_t *xim;
12 xcb_shm_segment_info_t *shm_info;
13 unsigned char *data;
14 int w, h, bpl, psize;
15};
16
17void evas_software_xcb_write_mask_line(Outbuf *buf, Xcb_Output_Buffer *xcbob, DATA32 *src, int w, int y);
18void evas_software_xcb_write_mask_line_rev(Outbuf *buf, Xcb_Output_Buffer *xcbob, DATA32 *src, int w, int y);
19void evas_software_xcb_write_mask_line_vert(Outbuf *buf, Xcb_Output_Buffer *xcbob, DATA32 *src, int h, int y, int w);
20void evas_software_xcb_write_mask_line_vert_rev(Outbuf *buf, Xcb_Output_Buffer *xcbob, DATA32 *src, int h, int y, int w);
21Eina_Bool evas_software_xcb_can_do_shm(xcb_connection_t *conn, xcb_screen_t *screen);
22Xcb_Output_Buffer *evas_software_xcb_output_buffer_new(xcb_connection_t *conn, xcb_visualtype_t *vis, int depth, int w, int h, int try_shm, unsigned char *data);
23void evas_software_xcb_output_buffer_free(Xcb_Output_Buffer *xcbob, Eina_Bool sync);
24void evas_software_xcb_output_buffer_paste(Xcb_Output_Buffer *xcbob, xcb_drawable_t drawable, xcb_gcontext_t gc, int x, int y, Eina_Bool sync);
25DATA8 *evas_software_xcb_output_buffer_data(Xcb_Output_Buffer *xcbob, int *bpl_ret);
26int evas_software_xcb_output_buffer_depth(Xcb_Output_Buffer *xcbob);
27int evas_software_xcb_output_buffer_byte_order(Xcb_Output_Buffer *xcbob);
28int evas_software_xcb_output_buffer_bit_order(Xcb_Output_Buffer *xcbob);
29
30#endif
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xcb_color.c b/libraries/evas/src/modules/engines/software_x11/evas_xcb_color.c
new file mode 100644
index 0000000..3ed6037
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xcb_color.c
@@ -0,0 +1,424 @@
1#include "evas_common.h"
2
3#include "evas_engine.h"
4
5typedef struct _Convert_Pal_Priv Convert_Pal_Priv;
6
7struct _Convert_Pal_Priv
8{
9 xcb_connection_t *conn;
10 xcb_colormap_t cmap;
11 xcb_visualtype_t *vis;
12};
13
14typedef DATA8 * (*Xcb_Func_Alloc_Colors) (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
15
16static Xcb_Func_Alloc_Colors x_color_alloc[PAL_MODE_LAST + 1];
17static int x_color_count[PAL_MODE_LAST + 1];
18static Eina_List *palettes = NULL;
19
20static DATA8 * x_color_alloc_rgb(int nr, int ng, int nb, xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
21static DATA8 * x_color_alloc_gray(int ng, xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
22
23static DATA8 * x_color_alloc_rgb_332 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
24static DATA8 * x_color_alloc_rgb_666 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
25static DATA8 * x_color_alloc_rgb_232 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
26static DATA8 * x_color_alloc_rgb_222 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
27static DATA8 * x_color_alloc_rgb_221 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
28static DATA8 * x_color_alloc_rgb_121 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
29static DATA8 * x_color_alloc_rgb_111 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
30static DATA8 * x_color_alloc_gray_256 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
31static DATA8 * x_color_alloc_gray_64 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
32static DATA8 * x_color_alloc_gray_16 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
33static DATA8 * x_color_alloc_gray_4 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
34static DATA8 * x_color_alloc_mono (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v);
35
36static DATA8 *
37x_color_alloc_rgb(int nr,
38 int ng,
39 int nb,
40 xcb_connection_t *conn,
41 xcb_colormap_t cmap,
42 xcb_visualtype_t *v)
43{
44 int r, g, b, i;
45 DATA8 *color_lut;
46 int sig_mask = 0;
47 int delt = 0;
48
49 for (i = 0; i < v->bits_per_rgb_value; i++) sig_mask |= (0x1 << i);
50 sig_mask <<= (16 - v->bits_per_rgb_value);
51 i = 0;
52 color_lut = malloc((nr) * (ng) * (nb));
53 if (!color_lut) return NULL;
54 delt = 0x0101 * 3;
55 /* FIXME: remove the round-trip ? */
56 for (r = 0; r < (nr); r++)
57 {
58 for (g = 0; g < (ng); g++)
59 {
60 for (b = 0; b < (nb); b++)
61 {
62 xcb_coloritem_t xcl;
63 xcb_coloritem_t xcl_in;
64 xcb_alloc_color_reply_t *rep;
65 int val;
66 int dr, dg, db;
67
68 val = (int)((((double)r) / ((nr) - 1)) * 255);
69 val = (val << 8) | val;
70 xcl.red = (uint16_t)(val);
71 val = (int)((((double)g) / ((ng) - 1)) * 255);
72 val = (val << 8) | val;
73 xcl.green = (uint16_t)(val);
74 val = (int)((((double)b) / ((nb) - 1)) * 255);
75 val = (val << 8) | val;
76 xcl.blue = (uint16_t)(val);
77 xcl_in = xcl;
78 rep = xcb_alloc_color_reply(conn,
79 xcb_alloc_color_unchecked(conn,
80 cmap,
81 xcl.red,
82 xcl.green,
83 xcl.blue),
84 0);
85 dr = (int)xcl_in.red - (int)xcl.red;
86 if (dr < 0) dr = -dr;
87 dg = (int)xcl_in.green - (int)xcl.green;
88 if (dg < 0) dg = -dg;
89 db = (int)xcl_in.blue - (int)xcl.blue;
90 if (db < 0) db = -db;
91/*
92 printf("ASK [%i]: %04x %04x %04x = %04x %04x %04x | dif = %04x / %04x\n",
93 ret,
94 xcl_in.red, xcl_in.green, xcl_in.blue,
95 xcl.red, xcl.green, xcl.blue,
96 (dr + dg +db), delt);
97 */
98
99 /* TODO: XAllocColor tries to approach the color */
100 /* in case the allocation fails */
101 /* XCB does not that (i think). It should be done */
102 /* So if rep == NULL, the other following tests */
103 /* should be always satisfied */
104 if ((!rep) ||
105 ((dr + dg + db) > delt)
106 /*
107 ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
108 ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
109 ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask))
110 */
111 )
112 {
113 uint32_t pixels[256];
114 int j;
115
116 if (i > 0)
117 {
118 for (j = 0; j < i; j++)
119 pixels[j] = (uint32_t)color_lut[j];
120 xcb_free_colors(conn, cmap, 0, i, pixels);
121 }
122 free(color_lut);
123 return NULL;
124 }
125 color_lut[i] = rep->pixel;
126 i++;
127 free(rep);
128 }
129 }
130 }
131 return color_lut;
132}
133
134static DATA8 *
135x_color_alloc_gray(int ng,
136 xcb_connection_t *conn,
137 xcb_colormap_t cmap,
138 xcb_visualtype_t *v)
139{
140 int g, i;
141 DATA8 *color_lut;
142 int sig_mask = 0;
143
144 for (i = 0; i < v->bits_per_rgb_value; i++) sig_mask |= (0x1 << i);
145 sig_mask <<= (16 - v->bits_per_rgb_value);
146 i = 0;
147 color_lut = malloc(ng);
148 if (!color_lut) return NULL;
149 /* FIXME: remove the round-trip ? */
150 for (g = 0; g < (ng); g++)
151 {
152 xcb_coloritem_t xcl;
153 xcb_coloritem_t xcl_in;
154 int val;
155 xcb_alloc_color_reply_t *rep;
156
157 val = (int)((((double)g) / ((ng) - 1)) * 255);
158 val = (val << 8) | val;
159 xcl.red = (uint16_t)(val);
160 xcl.green = (uint16_t)(val);
161 xcl.blue = (uint16_t)(val);
162 xcl_in = xcl;
163 rep = xcb_alloc_color_reply(conn,
164 xcb_alloc_color_unchecked(conn,
165 cmap,
166 xcl.red,
167 xcl.green,
168 xcl.blue),
169 0);
170 /* FIXME: XAllocColor tries to approach the color */
171 /* in case the allocation fails */
172 /* XCB does not that (i think). It should be done */
173 /* So if rep == NULL, the other following tests */
174 /* should be always satisfied */
175 if ((!rep) ||
176 ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
177 ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
178 ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
179 {
180 uint32_t pixels[256];
181 int j;
182
183 if (i > 0)
184 {
185 for (j = 0; j < i; j++)
186 pixels[j] = (uint32_t) color_lut[j];
187 xcb_free_colors(conn, cmap, 0, i, pixels);
188 }
189 free(color_lut);
190 return NULL;
191 }
192 color_lut[i] = rep->pixel;
193 i++;
194 free(rep);
195 }
196 return color_lut;
197}
198
199static DATA8 *
200x_color_alloc_rgb_332(xcb_connection_t *conn,
201 xcb_colormap_t cmap,
202 xcb_visualtype_t *v)
203{
204 return x_color_alloc_rgb(8, 8, 4, conn, cmap, v);
205}
206
207static DATA8 *
208x_color_alloc_rgb_666(xcb_connection_t *conn,
209 xcb_colormap_t cmap,
210 xcb_visualtype_t *v)
211{
212 return x_color_alloc_rgb(6, 6, 6, conn, cmap, v);
213}
214
215static DATA8 *
216x_color_alloc_rgb_232(xcb_connection_t *conn,
217 xcb_colormap_t cmap,
218 xcb_visualtype_t *v)
219{
220 return x_color_alloc_rgb(4, 8, 4, conn, cmap, v);
221}
222
223static DATA8 *
224x_color_alloc_rgb_222(xcb_connection_t *conn,
225 xcb_colormap_t cmap,
226 xcb_visualtype_t *v)
227{
228 return x_color_alloc_rgb(4, 4, 4, conn, cmap, v);
229}
230
231static DATA8 *
232x_color_alloc_rgb_221(xcb_connection_t *conn,
233 xcb_colormap_t cmap,
234 xcb_visualtype_t *v)
235{
236 return x_color_alloc_rgb(4, 4, 2, conn, cmap, v);
237}
238
239static DATA8 *
240x_color_alloc_rgb_121(xcb_connection_t *conn,
241 xcb_colormap_t cmap,
242 xcb_visualtype_t *v)
243{
244 return x_color_alloc_rgb(2, 4, 2, conn, cmap, v);
245}
246
247static DATA8 *
248x_color_alloc_rgb_111(xcb_connection_t *conn,
249 xcb_colormap_t cmap,
250 xcb_visualtype_t *v)
251{
252 return x_color_alloc_rgb(2, 2, 2, conn, cmap, v);
253}
254
255static DATA8 *
256x_color_alloc_gray_256(xcb_connection_t *conn,
257 xcb_colormap_t cmap,
258 xcb_visualtype_t *v)
259{
260 return x_color_alloc_gray(256, conn, cmap, v);
261}
262
263static DATA8 *
264x_color_alloc_gray_64(xcb_connection_t *conn,
265 xcb_colormap_t cmap,
266 xcb_visualtype_t *v)
267{
268 return x_color_alloc_gray(64, conn, cmap, v);
269}
270
271static DATA8 *
272x_color_alloc_gray_16(xcb_connection_t *conn,
273 xcb_colormap_t cmap,
274 xcb_visualtype_t *v)
275{
276 return x_color_alloc_gray(32, conn, cmap, v);
277}
278
279static DATA8 *
280x_color_alloc_gray_4(xcb_connection_t *conn,
281 xcb_colormap_t cmap,
282 xcb_visualtype_t *v)
283{
284 return x_color_alloc_gray(16, conn, cmap, v);
285}
286
287static DATA8 *
288x_color_alloc_mono(xcb_connection_t *conn,
289 xcb_colormap_t cmap,
290 xcb_visualtype_t *v)
291{
292 return x_color_alloc_gray(2, conn, cmap, v);
293}
294
295void
296evas_software_xcb_color_init(void)
297{
298 static int initialised = 0;
299
300 if (initialised) return;
301 x_color_alloc[PAL_MODE_NONE] = NULL;
302 x_color_count[PAL_MODE_NONE] = 0;
303
304 x_color_alloc[PAL_MODE_MONO] = x_color_alloc_mono;
305 x_color_count[PAL_MODE_MONO] = 2;
306
307 x_color_alloc[PAL_MODE_GRAY4] = x_color_alloc_gray_4;
308 x_color_count[PAL_MODE_GRAY4] = 4;
309
310 x_color_alloc[PAL_MODE_GRAY16] = x_color_alloc_gray_16;
311 x_color_count[PAL_MODE_GRAY16] = 16;
312
313 x_color_alloc[PAL_MODE_GRAY64] = x_color_alloc_gray_64;
314 x_color_count[PAL_MODE_GRAY64] = 64;
315
316 x_color_alloc[PAL_MODE_GRAY256] = x_color_alloc_gray_256;
317 x_color_count[PAL_MODE_GRAY256] = 256;
318
319 x_color_alloc[PAL_MODE_RGB111] = x_color_alloc_rgb_111;
320 x_color_count[PAL_MODE_RGB111] = 2 * 2 * 2;
321
322 x_color_alloc[PAL_MODE_RGB121] = x_color_alloc_rgb_121;
323 x_color_count[PAL_MODE_RGB121] = 2 * 4 * 2;
324
325 x_color_alloc[PAL_MODE_RGB221] = x_color_alloc_rgb_221;
326 x_color_count[PAL_MODE_RGB221] = 4 * 4 * 2;
327
328 x_color_alloc[PAL_MODE_RGB222] = x_color_alloc_rgb_222;
329 x_color_count[PAL_MODE_RGB222] = 4 * 4 * 4;
330
331 x_color_alloc[PAL_MODE_RGB232] = x_color_alloc_rgb_232;
332 x_color_count[PAL_MODE_RGB232] = 4 * 8 * 4;
333
334 x_color_alloc[PAL_MODE_RGB666] = x_color_alloc_rgb_666;
335 x_color_count[PAL_MODE_RGB666] = 6 * 6 * 6;
336
337 x_color_alloc[PAL_MODE_RGB332] = x_color_alloc_rgb_332;
338 x_color_count[PAL_MODE_RGB332] = 8 * 8 * 4;
339
340 x_color_alloc[PAL_MODE_LAST] = NULL;
341 x_color_count[PAL_MODE_LAST] = 0;
342 initialised = 1;
343}
344
345Convert_Pal *
346evas_software_xcb_color_allocate(xcb_connection_t *conn,
347 xcb_colormap_t cmap,
348 xcb_visualtype_t *vis,
349 Convert_Pal_Mode colors)
350{
351 Convert_Pal_Priv *palpriv;
352 Convert_Pal *pal;
353 Convert_Pal_Mode c;
354 Eina_List *l;
355
356/* printf("ALLOC cmap=%i vis=%p\n", cmap, vis);*/
357 EINA_LIST_FOREACH(palettes, l, pal)
358 {
359 palpriv = pal->data;
360 if ((conn == palpriv->conn) &&
361 (vis == palpriv->vis) &&
362 (cmap == palpriv->cmap))
363 {
364 pal->references++;
365 return pal;
366 }
367 }
368 pal = calloc(1, sizeof(struct _Convert_Pal));
369 if (!pal) return NULL;
370 for (c = colors; c > PAL_MODE_NONE; c--)
371 {
372 if (x_color_alloc[c])
373 {
374/* printf("TRY PAL %i\n", c);*/
375 pal->lookup = (x_color_alloc[c])(conn, cmap, vis);
376 if (pal->lookup) break;
377 }
378 }
379 pal->references = 1;
380 pal->colors = c;
381 pal->count = x_color_count[c];
382 palpriv = calloc(1, sizeof(Convert_Pal_Priv));
383 pal->data = palpriv;
384 if (!palpriv)
385 {
386 if (pal->lookup) free(pal->lookup);
387 free(pal);
388 return NULL;
389 }
390 palpriv->conn = conn;
391 palpriv->vis = vis;
392 palpriv->cmap = cmap;
393 if (pal->colors == PAL_MODE_NONE)
394 {
395 if (pal->lookup) free(pal->lookup);
396 free(pal);
397 return NULL;
398 }
399 palettes = eina_list_append(palettes, pal);
400 return pal;
401}
402
403void
404evas_software_xcb_color_deallocate(xcb_connection_t *conn,
405 xcb_colormap_t cmap,
406 xcb_visualtype_t *vis __UNUSED__,
407 Convert_Pal *pal)
408{
409 uint32_t pixels[256];
410 int j;
411
412 pal->references--;
413 if (pal->references > 0) return;
414 if (pal->lookup)
415 {
416 for(j = 0; j < pal->count; j++)
417 pixels[j] = (uint32_t) pal->lookup[j];
418 xcb_free_colors(conn, cmap, 0, pal->count, pixels);
419 free(pal->lookup);
420 }
421 free(pal->data);
422 palettes = eina_list_remove(palettes, pal);
423 free(pal);
424}
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xcb_color.h b/libraries/evas/src/modules/engines/software_x11/evas_xcb_color.h
new file mode 100644
index 0000000..7dcaeaf
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xcb_color.h
@@ -0,0 +1,10 @@
1#ifndef EVAS_XCB_COLOR_H
2# define EVAS_XCB_COLOR_H
3
4# include "evas_engine.h"
5
6void evas_software_xcb_color_init(void);
7Convert_Pal *evas_software_xcb_color_allocate(xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *vis, Convert_Pal_Mode colors);
8void evas_software_xcb_color_deallocate(xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *vis, Convert_Pal *pal);
9
10#endif
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xcb_main.c b/libraries/evas/src/modules/engines/software_x11/evas_xcb_main.c
new file mode 100644
index 0000000..d187016
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xcb_main.c
@@ -0,0 +1,8 @@
1#include "evas_common.h"
2#include "evas_engine.h"
3
4void
5evas_software_xcb_init(void)
6{
7
8}
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xcb_outbuf.c b/libraries/evas/src/modules/engines/software_x11/evas_xcb_outbuf.c
new file mode 100644
index 0000000..71759be
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xcb_outbuf.c
@@ -0,0 +1,1092 @@
1#include "evas_common.h"
2#include "evas_macros.h"
3#include "evas_xcb_outbuf.h"
4#include "evas_xcb_buffer.h"
5#include "evas_xcb_color.h"
6#include <pixman.h>
7
8/* local structures */
9typedef struct _Outbuf_Region Outbuf_Region;
10struct _Outbuf_Region
11{
12 Xcb_Output_Buffer *xcbob, *mask;
13 int x, y, w, h;
14};
15
16/* local function prototypes */
17static Xcb_Output_Buffer *_find_xcbob(xcb_connection_t *conn, xcb_visualtype_t *vis, int depth, int w, int h, Eina_Bool shm, void *data);
18static void _unfind_xcbob(Xcb_Output_Buffer *xcbob, Eina_Bool sync);
19static void _clear_xcbob(Eina_Bool sync);
20static void _xcbob_sync(xcb_connection_t *conn);
21
22/* local variables */
23static Eina_List *_shmpool = NULL;
24static int _shmsize = 0;
25static int _shmlimit = (10 * 1024 * 1024);
26static const unsigned int _shmcountlimit = 32;
27
28#ifdef EVAS_FRAME_QUEUING
29static LK(lock_shmpool);
30# define SHMPOOL_LOCK() LKL(lock_shmpool);
31# define SHMPOOL_UNLOCK() LKU(lock_shmpool);
32#else
33# define SHMPOOL_LOCK()
34# define SHMPOOL_UNLOCK()
35#endif
36
37void
38evas_software_xcb_outbuf_init(void)
39{
40#ifdef EVAS_FRAME_QUEUING
41 LKI(lock_shmpool);
42#endif
43}
44
45void
46evas_software_xcb_outbuf_free(Outbuf *buf)
47{
48#ifdef EVAS_FRAME_QUEUING
49 LKL(buf->priv.lock);
50#endif
51 while (buf->priv.pending_writes)
52 {
53 RGBA_Image *im = NULL;
54 Outbuf_Region *obr = NULL;
55
56 im = buf->priv.pending_writes->data;
57 buf->priv.pending_writes =
58 eina_list_remove_list(buf->priv.pending_writes,
59 buf->priv.pending_writes);
60 obr = im->extended_info;
61 evas_cache_image_drop(&im->cache_entry);
62 if (obr->xcbob) _unfind_xcbob(obr->xcbob, EINA_FALSE);
63 if (obr->mask) _unfind_xcbob(obr->mask, EINA_FALSE);
64 free(obr);
65 }
66#ifdef EVAS_FRAME_QUEUING
67 LKU(buf->priv.lock);
68#endif
69 evas_software_xcb_outbuf_idle_flush(buf);
70 evas_software_xcb_outbuf_flush(buf);
71 if (buf->priv.x11.xcb.gc)
72 xcb_free_gc(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.gc);
73 if (buf->priv.x11.xcb.gcm)
74 xcb_free_gc(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.gcm);
75 if (buf->priv.pal)
76 evas_software_xcb_color_deallocate(buf->priv.x11.xcb.conn,
77 buf->priv.x11.xcb.cmap,
78 buf->priv.x11.xcb.visual,
79 buf->priv.pal);
80#ifdef EVAS_FRAME_QUEUING
81 LKD(buf->priv.lock);
82#endif
83 free(buf);
84 _clear_xcbob(EINA_FALSE);
85}
86
87Outbuf *
88evas_software_xcb_outbuf_setup(int w, int h, int rot, Outbuf_Depth depth, xcb_connection_t *conn, xcb_screen_t *screen, xcb_drawable_t draw, xcb_visualtype_t *vis, xcb_colormap_t cmap, int xdepth, Eina_Bool grayscale, int max_colors, xcb_drawable_t mask, Eina_Bool shape_dither, Eina_Bool alpha)
89{
90 Outbuf *buf = NULL;
91 Gfx_Func_Convert func_conv= NULL;
92 const xcb_setup_t *setup;
93
94 if (!(buf = calloc(1, sizeof(Outbuf))))
95 return NULL;
96
97 setup = xcb_get_setup(conn);
98
99 buf->w = w;
100 buf->h = h;
101 buf->depth = depth;
102 buf->rot = rot;
103 buf->priv.x11.xcb.conn = conn;
104 buf->priv.x11.xcb.screen = screen;
105 buf->priv.x11.xcb.visual = vis;
106 buf->priv.x11.xcb.cmap = cmap;
107 buf->priv.x11.xcb.depth = xdepth;
108 buf->priv.mask_dither = shape_dither;
109 buf->priv.destination_alpha = alpha;
110 buf->priv.x11.xcb.shm = evas_software_xcb_can_do_shm(conn, screen);
111
112#ifdef WORDS_BIGENDIAN
113 if (setup->image_byte_order == XCB_IMAGE_ORDER_LSB_FIRST)
114 buf->priv.x11.xcb.swap = EINA_TRUE;
115#else
116 if (setup->image_byte_order == XCB_IMAGE_ORDER_MSB_FIRST)
117 buf->priv.x11.xcb.swap = EINA_TRUE;
118#endif
119 if (setup->bitmap_format_bit_order == XCB_IMAGE_ORDER_MSB_FIRST)
120 buf->priv.x11.xcb.bit_swap = EINA_TRUE;
121
122 if (((vis->_class == XCB_VISUAL_CLASS_TRUE_COLOR) ||
123 (vis->_class == XCB_VISUAL_CLASS_DIRECT_COLOR)) && (xdepth > 8))
124 {
125 buf->priv.mask.r = (DATA32)vis->red_mask;
126 buf->priv.mask.g = (DATA32)vis->green_mask;
127 buf->priv.mask.b = (DATA32)vis->blue_mask;
128 if (buf->priv.x11.xcb.swap)
129 {
130 SWAP32(buf->priv.mask.r);
131 SWAP32(buf->priv.mask.g);
132 SWAP32(buf->priv.mask.b);
133 }
134 }
135 else if ((vis->_class == XCB_VISUAL_CLASS_PSEUDO_COLOR) ||
136 (vis->_class == XCB_VISUAL_CLASS_STATIC_COLOR) ||
137 (vis->_class == XCB_VISUAL_CLASS_GRAY_SCALE) ||
138 (vis->_class == XCB_VISUAL_CLASS_STATIC_GRAY) ||
139 (xdepth <= 8))
140 {
141 Convert_Pal_Mode pm = PAL_MODE_RGB332;
142
143 if ((vis->_class == XCB_VISUAL_CLASS_GRAY_SCALE) ||
144 (vis->_class == XCB_VISUAL_CLASS_STATIC_GRAY))
145 grayscale = EINA_TRUE;
146 if (grayscale)
147 {
148 if (max_colors >= 256)
149 pm = PAL_MODE_GRAY256;
150 else if (max_colors >= 64)
151 pm = PAL_MODE_GRAY64;
152 else if (max_colors >= 16)
153 pm = PAL_MODE_GRAY16;
154 else if (max_colors >= 4)
155 pm = PAL_MODE_GRAY4;
156 else
157 pm = PAL_MODE_MONO;
158 }
159 else
160 {
161 if (max_colors >= 256)
162 pm = PAL_MODE_RGB332;
163 else if (max_colors >= 216)
164 pm = PAL_MODE_RGB666;
165 else if (max_colors >= 128)
166 pm = PAL_MODE_RGB232;
167 else if (max_colors >= 64)
168 pm = PAL_MODE_RGB222;
169 else if (max_colors >= 32)
170 pm = PAL_MODE_RGB221;
171 else if (max_colors >= 16)
172 pm = PAL_MODE_RGB121;
173 else if (max_colors >= 8)
174 pm = PAL_MODE_RGB111;
175 else if (max_colors >= 4)
176 pm = PAL_MODE_GRAY4;
177 else
178 pm = PAL_MODE_MONO;
179 }
180 /* FIXME: Only allocate once per display & colormap */
181 buf->priv.pal =
182 evas_software_xcb_color_allocate(conn, cmap, vis, pm);
183 if (!buf->priv.pal)
184 {
185 free(buf);
186 return NULL;
187 }
188 }
189 if ((buf->rot == 0) || (buf->rot == 180))
190 {
191 w = buf->w;
192 h = buf->h;
193 }
194 else if ((buf->rot == 90) || (buf->rot == 270))
195 {
196 w = buf->h;
197 h = buf->w;
198 }
199
200 if (buf->priv.pal)
201 {
202 func_conv =
203 evas_common_convert_func_get(0, w, h, xdepth,
204 buf->priv.mask.r,
205 buf->priv.mask.g,
206 buf->priv.mask.b,
207 buf->priv.pal->colors, buf->rot);
208 }
209 else
210 {
211 func_conv =
212 evas_common_convert_func_get(0, w, h, xdepth,
213 buf->priv.mask.r,
214 buf->priv.mask.g,
215 buf->priv.mask.b,
216 PAL_MODE_NONE, buf->rot);
217 }
218 if (!func_conv)
219 {
220 ERR("XCB Engine"
221 " {"
222 " At depth %i:"
223 " RGB format mask: %08x, %08x, %08x"
224 " Palette mode: %i"
225 " Not supported by any compiled in converters!"
226 " }", buf->priv.x11.xcb.depth, buf->priv.mask.r,
227 buf->priv.mask.g, buf->priv.mask.b,
228 buf->priv.pal ? (int)buf->priv.pal->colors : -1);
229 }
230
231 evas_software_xcb_outbuf_drawable_set(buf, draw);
232 evas_software_xcb_outbuf_mask_set(buf, mask);
233
234#ifdef EVAS_FRAME_QUEUING
235 LKI(buf->priv.lock);
236#endif
237
238 return buf;
239}
240
241RGBA_Image *
242evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch)
243{
244 RGBA_Image *im = NULL;
245 Outbuf_Region *obr = NULL;
246 Eina_Bool use_shm = EINA_TRUE;
247 Eina_Bool alpha = EINA_FALSE;
248 int bpl = 0;
249
250 if ((buf->onebuf) && (buf->priv.x11.xcb.shm))
251 {
252 Eina_Rectangle *rect;
253
254 RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, buf->w, buf->h);
255
256 if (!(obr = calloc(1, sizeof(Outbuf_Region))))
257 return NULL;
258
259 if (!(rect = eina_rectangle_new(x, y, w, h)))
260 {
261 free(obr);
262 return NULL;
263 }
264
265 buf->priv.onebuf_regions =
266 eina_list_append(buf->priv.onebuf_regions, rect);
267 if (buf->priv.onebuf)
268 {
269 if (cx) *cx = x;
270 if (cy) *cy = y;
271 if (cw) *cw = w;
272 if (ch) *ch = h;
273 if (!buf->priv.synced)
274 {
275 _xcbob_sync(buf->priv.x11.xcb.conn);
276 buf->priv.synced = EINA_TRUE;
277 }
278 return buf->priv.onebuf;
279 }
280 obr->x = 0;
281 obr->y = 0;
282 obr->w = buf->w;
283 obr->h = buf->h;
284 if (cx) *cx = x;
285 if (cy) *cy = y;
286 if (cw) *cw = w;
287 if (ch) *ch = h;
288
289 alpha = ((buf->priv.x11.xcb.mask) || (buf->priv.destination_alpha));
290 use_shm = buf->priv.x11.xcb.shm;
291
292 if ((buf->rot == 0) && (buf->priv.mask.r == 0xff0000) &&
293 (buf->priv.mask.g == 0x00ff00) && (buf->priv.mask.b == 0x0000ff))
294 {
295 obr->xcbob =
296 evas_software_xcb_output_buffer_new(buf->priv.x11.xcb.conn,
297 buf->priv.x11.xcb.visual,
298 buf->priv.x11.xcb.depth,
299 buf->w, buf->h, use_shm,
300 NULL);
301 if (!obr->xcbob)
302 {
303 free(obr);
304 return NULL;
305 }
306 im =
307 (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(),
308 buf->w, buf->h,
309 (DATA32 *)evas_software_xcb_output_buffer_data(obr->xcbob, &bpl),
310 alpha, EVAS_COLORSPACE_ARGB8888);
311 if (!im)
312 {
313 evas_software_xcb_output_buffer_free(obr->xcbob, EINA_FALSE);
314 free(obr);
315 return NULL;
316 }
317 im->extended_info = obr;
318 if (buf->priv.x11.xcb.mask)
319 {
320 obr->mask =
321 evas_software_xcb_output_buffer_new(buf->priv.x11.xcb.conn,
322 buf->priv.x11.xcb.visual,
323 1, buf->w, buf->h,
324 use_shm, NULL);
325 }
326 }
327 else
328 {
329 int bw = 0, bh = 0;
330
331 im =
332 (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
333 if (!im)
334 {
335 free(obr);
336 return NULL;
337 }
338 im->cache_entry.flags.alpha |= (alpha ? 1 : 0);
339 evas_cache_image_surface_alloc(&im->cache_entry, buf->w, buf->h);
340 im->extended_info = obr;
341 if ((buf->rot == 0) || (buf->rot == 180))
342 {
343 bw = buf->w;
344 bh = buf->h;
345 }
346 else if ((buf->rot == 90) || (buf->rot == 270))
347 {
348 bw = buf->h;
349 bh = buf->w;
350 }
351 obr->xcbob =
352 evas_software_xcb_output_buffer_new(buf->priv.x11.xcb.conn,
353 buf->priv.x11.xcb.visual,
354 buf->priv.x11.xcb.depth,
355 bw, bh, use_shm, NULL);
356 if (!obr->xcbob)
357 {
358 evas_cache_image_drop(&im->cache_entry);
359 free(obr);
360 return NULL;
361 }
362 if (buf->priv.x11.xcb.mask)
363 {
364 obr->mask =
365 evas_software_xcb_output_buffer_new(buf->priv.x11.xcb.conn,
366 buf->priv.x11.xcb.visual,
367 1, bw, bh, use_shm,
368 NULL);
369 }
370 }
371 /* FIXME: We should be able to remove this memset. */
372 if ((alpha) && (im->image.data))
373 {
374 /* FIXME: Faster memset */
375// memset(im->image.data, 0, (w * h * sizeof(DATA32)));
376 }
377 buf->priv.onebuf = im;
378 return im;
379 }
380
381 if (!(obr = calloc(1, sizeof(Outbuf_Region))))
382 return NULL;
383
384 obr->x = x;
385 obr->y = y;
386 obr->w = w;
387 obr->h = h;
388 if (cx) *cx = 0;
389 if (cy) *cy = 0;
390 if (cw) *cw = w;
391 if (ch) *ch = h;
392
393 use_shm = buf->priv.x11.xcb.shm;
394 alpha = ((buf->priv.x11.xcb.mask) || (buf->priv.destination_alpha));
395 if ((buf->rot == 0) && (buf->priv.mask.r == 0xff0000) &&
396 (buf->priv.mask.g == 0x00ff00) && (buf->priv.mask.b == 0x0000ff))
397 {
398 obr->xcbob =
399 _find_xcbob(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual,
400 buf->priv.x11.xcb.depth, w, h, use_shm, NULL);
401 if (!obr->xcbob)
402 {
403 free(obr);
404 return NULL;
405 }
406 im =
407 (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(),
408 w, h,
409 (DATA32 *)evas_software_xcb_output_buffer_data(obr->xcbob, &bpl),
410 alpha, EVAS_COLORSPACE_ARGB8888);
411 if (!im)
412 {
413 _unfind_xcbob(obr->xcbob, EINA_FALSE);
414 free(obr);
415 return NULL;
416 }
417 im->extended_info = obr;
418 if (buf->priv.x11.xcb.mask)
419 {
420 obr->mask =
421 _find_xcbob(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual,
422 1, w, h, use_shm, NULL);
423 }
424 }
425 else
426 {
427 int bw = 0, bh = 0;
428
429 im =
430 (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
431 if (!im)
432 {
433 free(obr);
434 return NULL;
435 }
436 im->cache_entry.flags.alpha |= (alpha ? 1 : 0);
437 evas_cache_image_surface_alloc(&im->cache_entry, w, h);
438 im->extended_info = obr;
439 if ((buf->rot == 0) || (buf->rot == 180))
440 {
441 bw = w;
442 bh = h;
443 }
444 else if ((buf->rot == 90) || (buf->rot == 270))
445 {
446 bw = h;
447 bh = w;
448 }
449 obr->xcbob =
450 _find_xcbob(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual,
451 buf->priv.x11.xcb.depth, bw, bh, use_shm, NULL);
452 if (!obr->xcbob)
453 {
454 evas_cache_image_drop(&im->cache_entry);
455 free(obr);
456 return NULL;
457 }
458 if (buf->priv.x11.xcb.mask)
459 {
460 obr->mask =
461 _find_xcbob(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, 1,
462 bw, bh, use_shm, NULL);
463 }
464 }
465 /* FIXME: We should be able to remove this memset. */
466 if (((buf->priv.x11.xcb.mask) || (buf->priv.destination_alpha)) &&
467 (im->image.data))
468 {
469 /* FIXME: Faster memset */
470// memset(im->image.data, 0, (w * h * sizeof(DATA32)));
471 }
472
473#ifdef EVAS_FRAME_QUEUING
474 if (!evas_common_frameq_enabled())
475#endif
476 buf->priv.pending_writes = eina_list_append(buf->priv.pending_writes, im);
477
478 return im;
479}
480
481void
482evas_software_xcb_outbuf_free_region_for_update(Outbuf *buf __UNUSED__, RGBA_Image *update __UNUSED__)
483{
484 /* NOOP: Cleaned up on flush */
485}
486
487void
488evas_software_xcb_outbuf_flush(Outbuf *buf)
489{
490 Eina_List *l = NULL;
491 RGBA_Image *im = NULL;
492 Outbuf_Region *obr = NULL;
493
494 if ((buf->priv.onebuf) && (buf->priv.onebuf_regions))
495 {
496 pixman_region16_t tmpr;
497
498 im = buf->priv.onebuf;
499 obr = im->extended_info;
500 pixman_region_init(&tmpr);
501 while (buf->priv.onebuf_regions)
502 {
503 Eina_Rectangle *rect, xr = { 0, 0, 0, 0 };
504
505 rect = buf->priv.onebuf_regions->data;
506 buf->priv.onebuf_regions =
507 eina_list_remove_list(buf->priv.onebuf_regions,
508 buf->priv.onebuf_regions);
509 if (buf->rot == 0)
510 {
511 xr.x = rect->x;
512 xr.y = rect->y;
513 xr.w = rect->w;
514 xr.h = rect->h;
515 }
516 else if (buf->rot == 90)
517 {
518 xr.x = rect->y;
519 xr.y = buf->w - rect->x - rect->w;
520 xr.w = rect->h;
521 xr.h = rect->w;
522 }
523 else if (buf->rot == 180)
524 {
525 xr.x = buf->w - rect->x - rect->w;
526 xr.y = buf->h - rect->y - rect->h;
527 xr.w = rect->w;
528 xr.h = rect->h;
529 }
530 else if (buf->rot == 270)
531 {
532 xr.x = buf->h - rect->y - rect->h;
533 xr.y = rect->x;
534 xr.w = rect->h;
535 xr.h = rect->w;
536 }
537 pixman_region_union_rect(&tmpr, &tmpr, xr.x, xr.y, xr.w, xr.h);
538 if (buf->priv.debug)
539 evas_software_xcb_outbuf_debug_show(buf, buf->priv.x11.xcb.win,
540 xr.x, xr.y, xr.w, xr.h);
541 eina_rectangle_free(rect);
542 }
543 xcb_set_clip_rectangles(buf->priv.x11.xcb.conn,
544 XCB_CLIP_ORDERING_YX_BANDED,
545 buf->priv.x11.xcb.gc, 0, 0,
546 pixman_region_n_rects(&tmpr),
547 (const xcb_rectangle_t *)pixman_region_rectangles(&tmpr, NULL));
548 if (obr->xcbob)
549 evas_software_xcb_output_buffer_paste(obr->xcbob,
550 buf->priv.x11.xcb.win,
551 buf->priv.x11.xcb.gc, 0, 0, 0);
552 if (obr->mask)
553 {
554 xcb_set_clip_rectangles(buf->priv.x11.xcb.conn,
555 XCB_CLIP_ORDERING_YX_BANDED,
556 buf->priv.x11.xcb.gcm, 0, 0,
557 pixman_region_n_rects(&tmpr),
558 (const xcb_rectangle_t *)pixman_region_rectangles(&tmpr, NULL));
559 evas_software_xcb_output_buffer_paste(obr->mask,
560 buf->priv.x11.xcb.mask,
561 buf->priv.x11.xcb.gcm,
562 0, 0, 0);
563 }
564 pixman_region_fini(&tmpr);
565 buf->priv.synced = EINA_FALSE;
566 }
567 else
568 {
569#if 1
570 _xcbob_sync(buf->priv.x11.xcb.conn);
571 EINA_LIST_FOREACH(buf->priv.pending_writes, l, im)
572 {
573 obr = im->extended_info;
574 if (buf->priv.debug)
575 evas_software_xcb_outbuf_debug_show(buf, buf->priv.x11.xcb.win,
576 obr->x, obr->y, obr->w, obr->h);
577 if (obr->xcbob)
578 evas_software_xcb_output_buffer_paste(obr->xcbob,
579 buf->priv.x11.xcb.win,
580 buf->priv.x11.xcb.gc,
581 obr->x, obr->y, 0);
582 if (obr->mask)
583 evas_software_xcb_output_buffer_paste(obr->mask,
584 buf->priv.x11.xcb.mask,
585 buf->priv.x11.xcb.gcm,
586 obr->x, obr->y, 0);
587 }
588# ifdef EVAS_FRAME_QUEUING
589 LKL(buf->priv.lock);
590# endif
591 while (buf->priv.prev_pending_writes)
592 {
593 im = buf->priv.prev_pending_writes->data;
594 buf->priv.prev_pending_writes =
595 eina_list_remove_list(buf->priv.prev_pending_writes,
596 buf->priv.prev_pending_writes);
597 obr = im->extended_info;
598 evas_cache_image_drop(&im->cache_entry);
599 if (obr->xcbob) _unfind_xcbob(obr->xcbob, EINA_FALSE);
600 if (obr->mask) _unfind_xcbob(obr->mask, EINA_FALSE);
601 free(obr);
602 }
603 buf->priv.prev_pending_writes = buf->priv.pending_writes;
604# ifdef EVAS_FRAME_QUEUING
605 LKU(buf->priv.lock);
606# endif
607 buf->priv.pending_writes = NULL;
608 xcb_flush(buf->priv.x11.xcb.conn);
609#else
610 /* FIXME: Async Push Disabled */
611
612 _xcbob_sync(buf->priv.x11.xcb.conn);
613 while (buf->priv.pending_writes)
614 {
615 im = eina_list_data_get(buf->priv.pending_writes);
616 buf->priv.pending_writes =
617 eina_list_remove_list(buf->priv.pending_writes,
618 buf->priv.pending_writes);
619 obr = im->extended_info;
620 evas_cache_image_drop(&im->cache_entry);
621 if (obr->xcbob) _unfind_xcbob(obr->xcbob, EINA_FALSE);
622 if (obr->mask) _unfind_xcbob(obr->mask, EINA_FALSE);
623 free(obr);
624 evas_cache_image_drop(&im->cache_entry);
625 }
626#endif
627 }
628 evas_common_cpu_end_opt();
629}
630
631void
632evas_software_xcb_outbuf_idle_flush(Outbuf *buf)
633{
634 if (buf->priv.onebuf)
635 {
636 RGBA_Image *im;
637 Outbuf_Region *obr;
638
639 im = buf->priv.onebuf;
640 buf->priv.onebuf = NULL;
641 obr = im->extended_info;
642 if (obr->xcbob)
643 evas_software_xcb_output_buffer_free(obr->xcbob, EINA_FALSE);
644 if (obr->mask)
645 evas_software_xcb_output_buffer_free(obr->mask, EINA_FALSE);
646 free(obr);
647 evas_cache_image_drop(&im->cache_entry);
648 }
649 else
650 {
651#ifdef EVAS_FRAME_QUEUING
652 LKL(buf->priv.lock);
653#endif
654 if (buf->priv.prev_pending_writes)
655 _xcbob_sync(buf->priv.x11.xcb.conn);
656 while (buf->priv.prev_pending_writes)
657 {
658 RGBA_Image *im;
659 Outbuf_Region *obr;
660
661 im = buf->priv.prev_pending_writes->data;
662 buf->priv.prev_pending_writes =
663 eina_list_remove_list(buf->priv.prev_pending_writes,
664 buf->priv.prev_pending_writes);
665 obr = im->extended_info;
666 evas_cache_image_drop(&im->cache_entry);
667 if (obr->xcbob) _unfind_xcbob(obr->xcbob, EINA_FALSE);
668 if (obr->mask) _unfind_xcbob(obr->mask, EINA_FALSE);
669 free(obr);
670 }
671#ifdef EVAS_FRAME_QUEUING
672 LKU(buf->priv.lock);
673#endif
674 _clear_xcbob(EINA_FALSE);
675 }
676}
677
678void
679evas_software_xcb_outbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h)
680{
681 Gfx_Func_Convert func_conv = NULL;
682 Outbuf_Region *obr = NULL;
683 DATA32 *src_data = NULL;
684 unsigned char *data = NULL;
685 int bpl = 0, yy = 0;
686 int bw = 0, bh = 0;
687
688 obr = update->extended_info;
689 if (!obr->xcbob) return;
690
691 if ((buf->rot == 0) || (buf->rot == 180))
692 {
693 bw = w;
694 bh = h;
695 }
696 else if ((buf->rot == 90) || (buf->rot == 270))
697 {
698 bw = h;
699 bh = w;
700 }
701 if (buf->priv.pal)
702 {
703 func_conv =
704 evas_common_convert_func_get(0, bw, bh, buf->depth, buf->priv.mask.r,
705 buf->priv.mask.g, buf->priv.mask.b,
706 buf->priv.pal->colors, buf->rot);
707 }
708 else
709 {
710 func_conv =
711 evas_common_convert_func_get(0, bw, bh, buf->depth, buf->priv.mask.r,
712 buf->priv.mask.g, buf->priv.mask.b,
713 PAL_MODE_NONE, buf->rot);
714 }
715 if (!func_conv) return;
716
717 if (!(data = evas_software_xcb_output_buffer_data(obr->xcbob, &bpl)))
718 return;
719 if (!(src_data = update->image.data)) return;
720 if (buf->rot == 0)
721 {
722 obr->x = x;
723 obr->y = y;
724 obr->w = w;
725 obr->h = h;
726 }
727 else if (buf->rot == 90)
728 {
729 obr->x = y;
730 obr->y = (buf->w - x - w);
731 obr->w = h;
732 obr->h = w;
733 }
734 else if (buf->rot == 180)
735 {
736 obr->x = (buf->w - x - w);
737 obr->y = (buf->h - y - h);
738 obr->w = w;
739 obr->h = h;
740 }
741 else if (buf->rot == 270)
742 {
743 obr->x = (buf->h - y - h);
744 obr->y = x;
745 obr->w = h;
746 obr->h = w;
747 }
748 if (buf->onebuf)
749 {
750 src_data += x + (y * update->cache_entry.w);
751 data += (bpl * obr->y) + (obr->x * (buf->depth / 8));
752 }
753 if (data != (unsigned char *)src_data)
754 {
755 if (buf->priv.pal)
756 func_conv(src_data, data, update->cache_entry.w - w,
757 (bpl / (buf->depth / 8)) - obr->w,
758 obr->w, obr->h, x, y, buf->priv.pal->lookup);
759 else
760 func_conv(src_data, data, update->cache_entry.w - w,
761 (bpl / (buf->depth / 8)) - obr->w,
762 obr->w, obr->h, x, y, NULL);
763 }
764#if 1
765#else
766 /* Async Push */
767 if (!((buf->priv.onebuf) && (buf->priv.onebuf_regions)))
768 {
769 if (buf->priv.debug)
770 evas_software_xcb_outbuf_debug_show(buf, buf->priv.x11.xcb.win,
771 obr->x, obr->y, obr->w, obr->h);
772 if (obr->xcbob)
773 evas_software_xcb_output_buffer_paste(obr->xcbob,
774 buf->priv.x11.xcb.win,
775 buf->priv.x11.xcb.gc,
776 obr->x, obr->y, 0);
777 }
778#endif
779 if (obr->mask)
780 {
781 if (buf->rot == 0)
782 {
783 for (yy = 0; yy < obr->h; yy++)
784 evas_software_xcb_write_mask_line(buf, obr->mask,
785 src_data + (yy * obr->w),
786 obr->w, yy);
787 }
788 else if (buf->rot == 90)
789 {
790 for (yy = 0; yy < obr->h; yy++)
791 evas_software_xcb_write_mask_line_vert(buf, obr->mask,
792 src_data + yy,
793 h, (obr->h - yy - 1), w);
794 }
795 else if (buf->rot == 180)
796 {
797 for (yy = 0; yy < obr->h; yy++)
798 evas_software_xcb_write_mask_line_rev(buf, obr->mask,
799 src_data + (yy * obr->w),
800 obr->w, (obr->h - yy - 1));
801 }
802 else if (buf->rot == 270)
803 {
804 for (yy = 0; yy < obr->h; yy++)
805 evas_software_xcb_write_mask_line_vert_rev(buf, obr->mask,
806 src_data + yy,
807 h, yy, w);
808 }
809#if 1
810#else
811 /* Async Push */
812 if (!((buf->priv.onebuf) && (buf->priv.onebuf_regions)))
813 evas_software_xcb_output_buffer_paste(obr->mask,
814 buf->priv.x11.xcb.mask,
815 buf->priv.x11.xcb.gcm,
816 obr->x, obr->y, 0);
817#endif
818 }
819#if 1
820#else
821 xcb_flush(buf->priv.x11.xcb.conn);
822#endif
823}
824
825void
826evas_software_xcb_outbuf_reconfigure(Outbuf *buf, int w, int h, int rot, Outbuf_Depth depth)
827{
828 if ((w == buf->w) && (h == buf->h) && (rot == buf->rot) &&
829 (depth == buf->depth)) return;
830 buf->w = w;
831 buf->h = h;
832 buf->rot = rot;
833 evas_software_xcb_outbuf_idle_flush(buf);
834}
835
836int
837evas_software_xcb_outbuf_width_get(Outbuf *buf)
838{
839 return buf->w;
840}
841
842int
843evas_software_xcb_outbuf_height_get(Outbuf *buf)
844{
845 return buf->h;
846}
847
848Outbuf_Depth
849evas_software_xcb_outbuf_depth_get(Outbuf *buf)
850{
851 return buf->depth;
852}
853
854void
855evas_software_xcb_outbuf_drawable_set(Outbuf *buf, xcb_drawable_t drawable)
856{
857 if (buf->priv.x11.xcb.win == drawable) return;
858 if (buf->priv.x11.xcb.gc)
859 {
860 xcb_free_gc(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.gc);
861 buf->priv.x11.xcb.gc = 0;
862 }
863 buf->priv.x11.xcb.win = drawable;
864 buf->priv.x11.xcb.gc = xcb_generate_id(buf->priv.x11.xcb.conn);
865 xcb_create_gc(buf->priv.x11.xcb.conn,
866 buf->priv.x11.xcb.gc, buf->priv.x11.xcb.win, 0, NULL);
867}
868
869void
870evas_software_xcb_outbuf_mask_set(Outbuf *buf, xcb_drawable_t mask)
871{
872 if (buf->priv.x11.xcb.mask == mask) return;
873 if (buf->priv.x11.xcb.gcm)
874 {
875 xcb_free_gc(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.gcm);
876 buf->priv.x11.xcb.gcm = 0;
877 }
878 buf->priv.x11.xcb.mask = mask;
879 if (buf->priv.x11.xcb.mask)
880 {
881 buf->priv.x11.xcb.gcm = xcb_generate_id(buf->priv.x11.xcb.conn);
882 xcb_create_gc(buf->priv.x11.xcb.conn,
883 buf->priv.x11.xcb.gcm, buf->priv.x11.xcb.mask, 0, NULL);
884 }
885}
886
887int
888evas_software_xcb_outbuf_rotation_get(Outbuf *buf)
889{
890 return buf->rot;
891}
892
893void
894evas_software_xcb_outbuf_rotation_set(Outbuf *buf, int rotation)
895{
896 buf->rot = rotation;
897}
898
899Eina_Bool
900evas_software_xcb_outbuf_alpha_get(Outbuf *buf)
901{
902 return buf->priv.x11.xcb.mask;
903}
904
905void
906evas_software_xcb_outbuf_debug_set(Outbuf *buf, Eina_Bool debug)
907{
908 buf->priv.debug = debug;
909}
910
911void
912evas_software_xcb_outbuf_debug_show(Outbuf *buf, xcb_drawable_t drawable, int x, int y, int w, int h)
913{
914 int i;
915 xcb_screen_t *screen = NULL;
916 xcb_get_geometry_reply_t *geom;
917 xcb_drawable_t root;
918 xcb_screen_iterator_t si;
919
920 geom =
921 xcb_get_geometry_reply(buf->priv.x11.xcb.conn,
922 xcb_get_geometry_unchecked(buf->priv.x11.xcb.conn,
923 drawable), 0);
924 root = geom->root;
925 free(geom);
926 geom =
927 xcb_get_geometry_reply(buf->priv.x11.xcb.conn,
928 xcb_get_geometry_unchecked(buf->priv.x11.xcb.conn,
929 root), 0);
930
931 si = xcb_setup_roots_iterator((xcb_setup_t *)xcb_get_setup(buf->priv.x11.xcb.conn));
932 for (; si.rem; xcb_screen_next(&si))
933 {
934 if (si.data->root == geom->root)
935 {
936 screen = si.data;
937 break;
938 }
939 }
940 free(geom);
941
942 for (i = 0; i < 20; i++)
943 {
944 xcb_rectangle_t rect = { x, y, w, h};
945 uint32_t mask;
946 uint32_t value[2];
947
948 mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
949 value[0] = screen->black_pixel;
950 value[1] = XCB_EXPOSURES_NOT_ALLOWED;
951 xcb_change_gc(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.gc,
952 mask, value);
953 xcb_poly_fill_rectangle(buf->priv.x11.xcb.conn, drawable,
954 buf->priv.x11.xcb.gc, 1, &rect);
955 _xcbob_sync(buf->priv.x11.xcb.conn);
956 _xcbob_sync(buf->priv.x11.xcb.conn);
957
958 mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
959 value[0] = screen->white_pixel;
960 value[1] = XCB_EXPOSURES_NOT_ALLOWED;
961 xcb_change_gc(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.gc,
962 mask, value);
963 xcb_poly_fill_rectangle(buf->priv.x11.xcb.conn, drawable,
964 buf->priv.x11.xcb.gc, 1, &rect);
965 _xcbob_sync(buf->priv.x11.xcb.conn);
966 _xcbob_sync(buf->priv.x11.xcb.conn);
967 }
968}
969
970#ifdef EVAS_FRAME_QUEUING
971void
972evas_software_xcb_outbuf_priv_set(Outbuf *buf, void *cur, void *prev __UNUSED__)
973{
974 buf->priv.pending_writes = (Eina_List *)cur;
975}
976#endif
977
978/* local functions */
979static Xcb_Output_Buffer *
980_find_xcbob(xcb_connection_t *conn, xcb_visualtype_t *vis, int depth, int w, int h, Eina_Bool shm, void *data)
981{
982 Eina_List *l = NULL, *xl = NULL;
983 Xcb_Output_Buffer *xcbob = NULL, *xcbob2 = NULL;
984 int lbytes = 0, bpp = 0, sz = 0;
985 int fitness = 0x7fffffff;
986
987 if (!shm)
988 return evas_software_xcb_output_buffer_new(conn, vis, depth, w, h,
989 shm, data);
990
991 lbytes = (((w + 31) / 32) * 4);
992 if (depth > 1)
993 {
994 bpp = (depth / 8);
995 if (bpp == 3) bpp = 4;
996 lbytes = ((((w * bpp) + 3) / 4) * 4);
997 }
998
999 sz = (lbytes * h);
1000 SHMPOOL_LOCK();
1001 EINA_LIST_FOREACH(_shmpool, l, xcbob2)
1002 {
1003 int szdif = 0;
1004
1005 if ((xcbob2->xim->depth != depth) || (xcbob2->visual != vis) ||
1006 (xcbob2->connection != conn)) continue;
1007 szdif = (xcbob2->psize - sz);
1008 if (szdif < 0) continue;
1009 if (szdif == 0)
1010 {
1011 xcbob = xcbob2;
1012 xl = l;
1013 goto have_xcbob;
1014 }
1015 if (szdif < fitness)
1016 {
1017 xcbob = xcbob2;
1018 xl = l;
1019 fitness = szdif;
1020 }
1021 }
1022 if ((fitness > (100 * 100)) || (!xcbob))
1023 {
1024 SHMPOOL_UNLOCK();
1025 return evas_software_xcb_output_buffer_new(conn, vis, depth,
1026 w, h, shm, data);
1027 }
1028
1029have_xcbob:
1030 _shmpool = eina_list_remove_list(_shmpool, xl);
1031 xcbob->w = w;
1032 xcbob->h = h;
1033 xcbob->bpl = lbytes;
1034 xcbob->xim->width = xcbob->w;
1035 xcbob->xim->height = xcbob->h;
1036 xcbob->xim->stride = xcbob->bpl;
1037 _shmsize -= (xcbob->psize * (xcbob->xim->depth / 8));
1038 SHMPOOL_UNLOCK();
1039 return xcbob;
1040}
1041
1042static void
1043_unfind_xcbob(Xcb_Output_Buffer *xcbob, Eina_Bool sync)
1044{
1045 if (xcbob->shm_info)
1046 {
1047 SHMPOOL_LOCK();
1048 _shmpool = eina_list_prepend(_shmpool, xcbob);
1049 _shmsize += xcbob->psize * xcbob->xim->depth / 8;
1050 while ((_shmsize > _shmlimit) ||
1051 (eina_list_count(_shmpool) > _shmcountlimit))
1052 {
1053 Eina_List *xl = NULL;
1054
1055 if (!(xl = eina_list_last(_shmpool)))
1056 {
1057 _shmsize = 0;
1058 break;
1059 }
1060 xcbob = xl->data;
1061 _shmpool = eina_list_remove_list(_shmpool, xl);
1062 _shmsize -= xcbob->psize * xcbob->xim->depth / 8;
1063 evas_software_xcb_output_buffer_free(xcbob, sync);
1064 }
1065 SHMPOOL_UNLOCK();
1066 }
1067 else
1068 evas_software_xcb_output_buffer_free(xcbob, sync);
1069}
1070
1071static void
1072_clear_xcbob(Eina_Bool sync)
1073{
1074 SHMPOOL_LOCK();
1075 while (_shmpool)
1076 {
1077 Xcb_Output_Buffer *xcbob;
1078
1079 xcbob = _shmpool->data;
1080 _shmpool = eina_list_remove_list(_shmpool, _shmpool);
1081 evas_software_xcb_output_buffer_free(xcbob, sync);
1082 }
1083 _shmsize = 0;
1084 SHMPOOL_UNLOCK();
1085}
1086
1087static void
1088_xcbob_sync(xcb_connection_t *conn)
1089{
1090 free(xcb_get_input_focus_reply(conn,
1091 xcb_get_input_focus_unchecked(conn), NULL));
1092}
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xcb_outbuf.h b/libraries/evas/src/modules/engines/software_x11/evas_xcb_outbuf.h
new file mode 100644
index 0000000..b711848
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xcb_outbuf.h
@@ -0,0 +1,30 @@
1#ifndef EVAS_XCB_OUTBUF_H
2# define EVAS_XCB_OUTBUF_H
3
4# include "evas_engine.h"
5
6void evas_software_xcb_outbuf_init(void);
7void evas_software_xcb_outbuf_free(Outbuf *buf);
8Outbuf *evas_software_xcb_outbuf_setup(int w, int h, int rot, Outbuf_Depth depth, xcb_connection_t *conn, xcb_screen_t *screen, xcb_drawable_t draw, xcb_visualtype_t *vis, xcb_colormap_t cmap, int xdepth, Eina_Bool grayscale, int max_colors, xcb_drawable_t mask, Eina_Bool shape_dither, Eina_Bool alpha);
9RGBA_Image *evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch);
10void evas_software_xcb_outbuf_free_region_for_update(Outbuf *buf, RGBA_Image *update);
11void evas_software_xcb_outbuf_flush(Outbuf *buf);
12void evas_software_xcb_outbuf_idle_flush(Outbuf *buf);
13void evas_software_xcb_outbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h);
14void evas_software_xcb_outbuf_reconfigure(Outbuf *buf, int w, int h, int rot, Outbuf_Depth depth);
15int evas_software_xcb_outbuf_width_get(Outbuf *buf);
16int evas_software_xcb_outbuf_height_get(Outbuf *buf);
17Outbuf_Depth evas_software_xcb_outbuf_depth_get(Outbuf *buf);
18void evas_software_xcb_outbuf_drawable_set(Outbuf *buf, xcb_drawable_t drawable);
19void evas_software_xcb_outbuf_mask_set(Outbuf *buf, xcb_drawable_t mask);
20int evas_software_xcb_outbuf_rotation_get(Outbuf *buf);
21void evas_software_xcb_outbuf_rotation_set(Outbuf *buf, int rotation);
22Eina_Bool evas_software_xcb_outbuf_alpha_get(Outbuf *buf);
23void evas_software_xcb_outbuf_debug_set(Outbuf *buf, Eina_Bool debug);
24void evas_software_xcb_outbuf_debug_show(Outbuf *buf, xcb_drawable_t drawable, int x, int y, int w, int h);
25
26# ifdef EVAS_FRAME_QUEUING
27void evas_software_xcb_outbuf_priv_set(Outbuf *buf, void *cur, void *prev);
28# endif
29
30#endif
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xcb_xdefaults.c b/libraries/evas/src/modules/engines/software_x11/evas_xcb_xdefaults.c
new file mode 100644
index 0000000..3a0bda5
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xcb_xdefaults.c
@@ -0,0 +1,108 @@
1#include "evas_common.h"
2#include "evas_xcb_xdefaults.h"
3#include <fnmatch.h>
4
5/* local function prototypes */
6static Eina_Bool _evas_xcb_xdefaults_glob_match(const char *str, const char *glob);
7
8/* local variables */
9static Eina_File *_evas_xcb_xdefaults_file = NULL;
10static char *_evas_xcb_xdefaults_data = NULL;
11
12void
13_evas_xcb_xdefaults_init(void)
14{
15 char buff[PATH_MAX];
16
17 snprintf(buff, sizeof(buff), "%s/.Xdefaults", getenv("HOME"));
18 if ((_evas_xcb_xdefaults_file = eina_file_open(buff, EINA_FALSE)))
19 {
20 eina_mmap_safety_enabled_set(EINA_TRUE);
21
22 _evas_xcb_xdefaults_data =
23 eina_file_map_all(_evas_xcb_xdefaults_file, EINA_FILE_SEQUENTIAL);
24 }
25}
26
27void
28_evas_xcb_xdefaults_shutdown(void)
29{
30 if (!_evas_xcb_xdefaults_file) return;
31 if (_evas_xcb_xdefaults_data)
32 eina_file_map_free(_evas_xcb_xdefaults_file, _evas_xcb_xdefaults_data);
33 if (_evas_xcb_xdefaults_file) eina_file_close(_evas_xcb_xdefaults_file);
34}
35
36char *
37_evas_xcb_xdefaults_string_get(const char *prog, const char *param)
38{
39 char buff[1024], ret[1024];
40 char *str = NULL;
41 char **ea = NULL;
42 unsigned int count = 0, i = 0;
43
44 if ((!_evas_xcb_xdefaults_data) || (!_evas_xcb_xdefaults_file))
45 return NULL;
46
47 snprintf(buff, sizeof(buff), "*%s*.*%s*", prog, param);
48
49 str = _evas_xcb_xdefaults_data;
50 ea = eina_str_split_full(str, "\n", -1, &count);
51 for (i = 0; i < count; i++)
52 {
53 if (_evas_xcb_xdefaults_glob_match(ea[i], buff))
54 sscanf(ea[i], "%*[^:]:%*[ ]%s", ret);
55 }
56 if ((ea) && (ea[0]))
57 {
58 free(ea[0]);
59 free(ea);
60 }
61
62 return strdup(ret);
63}
64
65int
66_evas_xcb_xdefaults_int_get(const char *prog, const char *param)
67{
68 char buff[1024];
69 char *str = NULL;
70 char **ea = NULL;
71 unsigned int count = 0, i = 0;
72 int ret = -1;
73
74 if ((!_evas_xcb_xdefaults_data) || (!_evas_xcb_xdefaults_file))
75 return 0;
76
77 snprintf(buff, sizeof(buff), "*%s*.*%s*", prog, param);
78
79 str = _evas_xcb_xdefaults_data;
80 ea = eina_str_split_full(str, "\n", -1, &count);
81 for (i = 0; i < count; i++)
82 {
83 if (_evas_xcb_xdefaults_glob_match(ea[i], buff))
84 sscanf(ea[i], "%*[^:]:%*[ ]%d", &ret);
85 }
86 if ((ea) && (ea[0]))
87 {
88 free(ea[0]);
89 free(ea);
90 }
91
92 return ret;
93}
94
95/* local functions */
96static Eina_Bool
97_evas_xcb_xdefaults_glob_match(const char *str, const char *glob)
98{
99 if ((!str) || (!glob)) return EINA_FALSE;
100 if (glob[0] == 0)
101 {
102 if (str[0] == 0) return EINA_TRUE;
103 return EINA_FALSE;
104 }
105 if (!strcmp(glob, "*")) return EINA_TRUE;
106 if (!fnmatch(glob, str, 0)) return EINA_TRUE;
107 return EINA_FALSE;
108}
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xcb_xdefaults.h b/libraries/evas/src/modules/engines/software_x11/evas_xcb_xdefaults.h
new file mode 100644
index 0000000..c5f4ab8
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xcb_xdefaults.h
@@ -0,0 +1,11 @@
1#ifndef EVAS_XCB_XDEFAULTS_H
2# define EVAS_XCB_XDEFAULTS_H
3
4# include "evas_engine.h"
5
6void _evas_xcb_xdefaults_init(void);
7void _evas_xcb_xdefaults_shutdown(void);
8char *_evas_xcb_xdefaults_string_get(const char *prog, const char *param);
9int _evas_xcb_xdefaults_int_get(const char *prog, const char *param);
10
11#endif
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xlib_buffer.c b/libraries/evas/src/modules/engines/software_x11/evas_xlib_buffer.c
new file mode 100644
index 0000000..594041c
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xlib_buffer.c
@@ -0,0 +1,428 @@
1#include "evas_common.h"
2
3#include "evas_xlib_buffer.h"
4
5static int _x_err = 0;
6
7void
8evas_software_xlib_x_write_mask_line(Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int w, int y)
9{
10 int x;
11 DATA32 *src_ptr;
12 DATA8 *dst_ptr;
13 int bpl = 0;
14
15 src_ptr = src;
16 dst_ptr = evas_software_xlib_x_output_buffer_data(xob, &bpl);
17 dst_ptr = dst_ptr + (bpl * y);
18 w -= 7;
19 if (buf->priv.x11.xlib.bit_swap)
20 {
21 for (x = 0; x < w; x += 8)
22 {
23 *dst_ptr =
24 ((A_VAL(&(src_ptr[0])) >> 7) << 7) |
25 ((A_VAL(&(src_ptr[1])) >> 7) << 6) |
26 ((A_VAL(&(src_ptr[2])) >> 7) << 5) |
27 ((A_VAL(&(src_ptr[3])) >> 7) << 4) |
28 ((A_VAL(&(src_ptr[4])) >> 7) << 3) |
29 ((A_VAL(&(src_ptr[5])) >> 7) << 2) |
30 ((A_VAL(&(src_ptr[6])) >> 7) << 1) |
31 ((A_VAL(&(src_ptr[7])) >> 7) << 0);
32 src_ptr += 8;
33 dst_ptr++;
34 }
35 }
36 else
37 {
38 for (x = 0; x < w; x += 8)
39 {
40 *dst_ptr =
41 ((A_VAL(&(src_ptr[0])) >> 7) << 0) |
42 ((A_VAL(&(src_ptr[1])) >> 7) << 1) |
43 ((A_VAL(&(src_ptr[2])) >> 7) << 2) |
44 ((A_VAL(&(src_ptr[3])) >> 7) << 3) |
45 ((A_VAL(&(src_ptr[4])) >> 7) << 4) |
46 ((A_VAL(&(src_ptr[5])) >> 7) << 5) |
47 ((A_VAL(&(src_ptr[6])) >> 7) << 6) |
48 ((A_VAL(&(src_ptr[7])) >> 7) << 7);
49 src_ptr += 8;
50 dst_ptr++;
51 }
52 }
53 w += 7;
54 for (; x < w; x ++)
55 {
56 XPutPixel(xob->xim, x, y, A_VAL(src_ptr) >> 7);
57 src_ptr++;
58 }
59}
60
61void
62evas_software_xlib_x_write_mask_line_rev(Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int w, int y)
63{
64 int x;
65 DATA32 *src_ptr;
66 DATA8 *dst_ptr;
67 int bpl = 0;
68
69 src_ptr = src + w - 1;
70 dst_ptr = evas_software_xlib_x_output_buffer_data(xob, &bpl);
71 dst_ptr = dst_ptr + (bpl * y);
72 w -= 7;
73 if (buf->priv.x11.xlib.bit_swap)
74 {
75 for (x = 0; x < w; x += 8)
76 {
77 *dst_ptr =
78 ((A_VAL(&(src_ptr[ 0])) >> 7) << 7) |
79 ((A_VAL(&(src_ptr[-1])) >> 7) << 6) |
80 ((A_VAL(&(src_ptr[-2])) >> 7) << 5) |
81 ((A_VAL(&(src_ptr[-3])) >> 7) << 4) |
82 ((A_VAL(&(src_ptr[-4])) >> 7) << 3) |
83 ((A_VAL(&(src_ptr[-5])) >> 7) << 2) |
84 ((A_VAL(&(src_ptr[-6])) >> 7) << 1) |
85 ((A_VAL(&(src_ptr[-7])) >> 7) << 0);
86 src_ptr -= 8;
87 dst_ptr++;
88 }
89 }
90 else
91 {
92 for (x = 0; x < w; x += 8)
93 {
94 *dst_ptr =
95 ((A_VAL(&(src_ptr[ 0])) >> 7) << 0) |
96 ((A_VAL(&(src_ptr[-1])) >> 7) << 1) |
97 ((A_VAL(&(src_ptr[-2])) >> 7) << 2) |
98 ((A_VAL(&(src_ptr[-3])) >> 7) << 3) |
99 ((A_VAL(&(src_ptr[-4])) >> 7) << 4) |
100 ((A_VAL(&(src_ptr[-5])) >> 7) << 5) |
101 ((A_VAL(&(src_ptr[-6])) >> 7) << 6) |
102 ((A_VAL(&(src_ptr[-7])) >> 7) << 7);
103 src_ptr -= 8;
104 dst_ptr++;
105 }
106 }
107 w += 7;
108 for (; x < w; x ++)
109 {
110 XPutPixel(xob->xim, x, y, A_VAL(src_ptr) >> 7);
111 src_ptr--;
112 }
113}
114
115void
116evas_software_xlib_x_write_mask_line_vert(Outbuf *buf, X_Output_Buffer *xob,
117 DATA32 *src,
118 int h, int ym, int w)
119{
120 int y;
121 DATA32 *src_ptr;
122 DATA8 *dst_ptr;
123 int bpl = 0;
124
125 src_ptr = src;
126 dst_ptr = evas_software_xlib_x_output_buffer_data(xob, &bpl);
127 dst_ptr = dst_ptr + (bpl * ym);
128 h -= 7;
129 if (buf->priv.x11.xlib.bit_swap)
130 {
131 for (y = 0; y < h; y += 8)
132 {
133 *dst_ptr =
134 ((A_VAL(&(src_ptr[0 * w])) >> 7) << 7) |
135 ((A_VAL(&(src_ptr[1 * w])) >> 7) << 6) |
136 ((A_VAL(&(src_ptr[2 * w])) >> 7) << 5) |
137 ((A_VAL(&(src_ptr[3 * w])) >> 7) << 4) |
138 ((A_VAL(&(src_ptr[4 * w])) >> 7) << 3) |
139 ((A_VAL(&(src_ptr[5 * w])) >> 7) << 2) |
140 ((A_VAL(&(src_ptr[6 * w])) >> 7) << 1) |
141 ((A_VAL(&(src_ptr[7 * w])) >> 7) << 0);
142 src_ptr += 8 * w;
143 dst_ptr++;
144 }
145 }
146 else
147 {
148 for (y = 0; y < h; y += 8)
149 {
150 *dst_ptr =
151 ((A_VAL(&(src_ptr[0 * w])) >> 7) << 0) |
152 ((A_VAL(&(src_ptr[1 * w])) >> 7) << 1) |
153 ((A_VAL(&(src_ptr[2 * w])) >> 7) << 2) |
154 ((A_VAL(&(src_ptr[3 * w])) >> 7) << 3) |
155 ((A_VAL(&(src_ptr[4 * w])) >> 7) << 4) |
156 ((A_VAL(&(src_ptr[5 * w])) >> 7) << 5) |
157 ((A_VAL(&(src_ptr[6 * w])) >> 7) << 6) |
158 ((A_VAL(&(src_ptr[7 * w])) >> 7) << 7);
159 src_ptr += 8 * w;
160 dst_ptr++;
161 }
162 }
163 h += 7;
164 for (; y < h; y ++)
165 {
166 XPutPixel(xob->xim, y, ym, A_VAL(src_ptr) >> 7);
167 src_ptr += w;
168 }
169}
170
171void
172evas_software_xlib_x_write_mask_line_vert_rev(Outbuf *buf, X_Output_Buffer *xob,
173 DATA32 *src,
174 int h, int ym, int w)
175{
176 int y;
177 DATA32 *src_ptr;
178 DATA8 *dst_ptr;
179 int bpl = 0;
180
181 src_ptr = src + ((h - 1) * w);
182 dst_ptr = evas_software_xlib_x_output_buffer_data(xob, &bpl);
183 dst_ptr = dst_ptr + (bpl * ym);
184 h -= 7;
185 if (buf->priv.x11.xlib.bit_swap)
186 {
187 for (y = 0; y < h; y += 8)
188 {
189 *dst_ptr =
190 ((A_VAL(&(src_ptr[ 0 * w])) >> 7) << 7) |
191 ((A_VAL(&(src_ptr[-1 * w])) >> 7) << 6) |
192 ((A_VAL(&(src_ptr[-2 * w])) >> 7) << 5) |
193 ((A_VAL(&(src_ptr[-3 * w])) >> 7) << 4) |
194 ((A_VAL(&(src_ptr[-4 * w])) >> 7) << 3) |
195 ((A_VAL(&(src_ptr[-5 * w])) >> 7) << 2) |
196 ((A_VAL(&(src_ptr[-6 * w])) >> 7) << 1) |
197 ((A_VAL(&(src_ptr[-7 * w])) >> 7) << 0);
198 src_ptr -= 8 * w;
199 dst_ptr++;
200 }
201 }
202 else
203 {
204 for (y = 0; y < h; y += 8)
205 {
206 *dst_ptr =
207 ((A_VAL(&(src_ptr[ 0 * w])) >> 7) << 0) |
208 ((A_VAL(&(src_ptr[-1 * w])) >> 7) << 1) |
209 ((A_VAL(&(src_ptr[-2 * w])) >> 7) << 2) |
210 ((A_VAL(&(src_ptr[-3 * w])) >> 7) << 3) |
211 ((A_VAL(&(src_ptr[-4 * w])) >> 7) << 4) |
212 ((A_VAL(&(src_ptr[-5 * w])) >> 7) << 5) |
213 ((A_VAL(&(src_ptr[-6 * w])) >> 7) << 6) |
214 ((A_VAL(&(src_ptr[-7 * w])) >> 7) << 7);
215 src_ptr -= 8 * w;
216 dst_ptr++;
217 }
218 }
219 h += 7;
220 for (; y < h; y ++)
221 {
222 XPutPixel(xob->xim, y, ym, A_VAL(src_ptr) >> 7);
223 src_ptr -= w;
224 }
225}
226
227int
228evas_software_xlib_x_can_do_shm(Display *d)
229{
230 static Display *cached_d = NULL;
231 static int cached_result = 0;
232
233 if (d == cached_d) return cached_result;
234 cached_d = d;
235 if (XShmQueryExtension(d))
236 {
237 X_Output_Buffer *xob;
238
239 xob = evas_software_xlib_x_output_buffer_new
240 (d, DefaultVisual(d, DefaultScreen(d)),
241 DefaultDepth(d, DefaultScreen(d)), 16, 16, 2, NULL);
242 if (!xob)
243 {
244 cached_result = 0;
245 return 0;
246 }
247 evas_software_xlib_x_output_buffer_free(xob, 1);
248 cached_result = 1;
249 return 1;
250 }
251 cached_result = 0;
252 return 0;
253}
254
255static void
256x_output_tmp_x_err(Display *d __UNUSED__, XErrorEvent *ev __UNUSED__)
257{
258 _x_err = 1;
259 return;
260}
261
262//static int creates = 0;
263
264X_Output_Buffer *
265evas_software_xlib_x_output_buffer_new(Display *d, Visual *v, int depth, int w, int h, int try_shm, void *data)
266{
267 X_Output_Buffer *xob;
268
269 xob = calloc(1, sizeof(X_Output_Buffer));
270 if (!xob) return NULL;
271
272 xob->display = d;
273 xob->visual = v;
274 xob->xim = NULL;
275 xob->shm_info = NULL;
276 xob->w = w;
277 xob->h = h;
278
279 if (try_shm > 0)
280 {
281 xob->shm_info = malloc(sizeof(XShmSegmentInfo));
282 if (xob->shm_info)
283 {
284 xob->xim = XShmCreateImage(d, v, depth, ZPixmap, NULL,
285 xob->shm_info, w, h);
286 if (xob->xim)
287 {
288 xob->shm_info->shmid = shmget(IPC_PRIVATE,
289 xob->xim->bytes_per_line *
290 xob->xim->height,
291 IPC_CREAT | 0777);
292 if (xob->shm_info->shmid >= 0)
293 {
294 xob->shm_info->readOnly = False;
295 xob->shm_info->shmaddr = xob->xim->data =
296 shmat(xob->shm_info->shmid, 0, 0);
297 if (xob->shm_info->shmaddr != ((void *)-1))
298 {
299 XErrorHandler ph;
300
301 if (try_shm == 2) // only needed during testing
302 {
303 XSync(d, False);
304 _x_err = 0;
305 ph = XSetErrorHandler((XErrorHandler)
306 x_output_tmp_x_err);
307 }
308#if defined(EVAS_FRAME_QUEUING) && defined(LIBXEXT_VERSION_LOW)
309 /* workaround for libXext of lower then 1.1.1 */
310 if (evas_common_frameq_enabled())
311 XLockDisplay(d);
312#endif
313 XShmAttach(d, xob->shm_info);
314#if defined(EVAS_FRAME_QUEUING) && defined(LIBXEXT_VERSION_LOW)
315 /* workaround for libXext of lower then 1.1.1 */
316 if (evas_common_frameq_enabled())
317 XUnlockDisplay(d);
318#endif
319
320 if (try_shm == 2) // only needed during testing
321 {
322 XSync(d, False);
323 XSetErrorHandler((XErrorHandler)ph);
324 }
325 if (!_x_err)
326 {
327 xob->bpl = xob->xim->bytes_per_line;
328 xob->psize = xob->bpl * xob->h;
329 return xob;
330 }
331 }
332 shmdt(xob->shm_info->shmaddr);
333 shmctl(xob->shm_info->shmid, IPC_RMID, 0);
334 }
335 if (xob->xim) XDestroyImage(xob->xim);
336 xob->xim = NULL;
337 }
338 if (xob->shm_info) free(xob->shm_info);
339 xob->shm_info = NULL;
340 }
341 }
342
343 if (try_shm > 1) return NULL;
344
345 xob->xim = XCreateImage(d, v, depth, ZPixmap, 0, data, w, h, 32, 0);
346 if (!xob->xim)
347 {
348 free(xob);
349 return NULL;
350 }
351
352 xob->data = data;
353
354 if (!xob->xim->data)
355 {
356 xob->xim->data = malloc(xob->xim->bytes_per_line * xob->xim->height);
357 if (!xob->xim->data)
358 {
359 XDestroyImage(xob->xim);
360 free(xob);
361 return NULL;
362 }
363 }
364 xob->bpl = xob->xim->bytes_per_line;
365 xob->psize = xob->bpl * xob->h;
366 return xob;
367}
368
369void
370evas_software_xlib_x_output_buffer_free(X_Output_Buffer *xob, int psync)
371{
372 if (xob->shm_info)
373 {
374 if (psync) XSync(xob->display, False);
375 XShmDetach(xob->display, xob->shm_info);
376 XDestroyImage(xob->xim);
377 shmdt(xob->shm_info->shmaddr);
378 shmctl(xob->shm_info->shmid, IPC_RMID, 0);
379 free(xob->shm_info);
380 }
381 else
382 {
383 if (xob->data) xob->xim->data = NULL;
384 XDestroyImage(xob->xim);
385 }
386 free(xob);
387}
388
389void
390evas_software_xlib_x_output_buffer_paste(X_Output_Buffer *xob, Drawable d, GC gc, int x, int y, int psync)
391{
392 if (xob->shm_info)
393 {
394 XShmPutImage(xob->display, d, gc, xob->xim, 0, 0, x, y,
395 xob->w, xob->h, False);
396 if (psync) XSync(xob->display, False);
397 }
398 else
399 {
400 XPutImage(xob->display, d, gc, xob->xim, 0, 0, x, y,
401 xob->w, xob->h);
402 }
403}
404
405DATA8 *
406evas_software_xlib_x_output_buffer_data(X_Output_Buffer *xob, int *bytes_per_line_ret)
407{
408 if (bytes_per_line_ret) *bytes_per_line_ret = xob->xim->bytes_per_line;
409 return (DATA8 *)xob->xim->data;
410}
411
412int
413evas_software_xlib_x_output_buffer_depth(X_Output_Buffer *xob)
414{
415 return xob->xim->bits_per_pixel;
416}
417
418int
419evas_software_xlib_x_output_buffer_byte_order(X_Output_Buffer *xob)
420{
421 return xob->xim->byte_order;
422}
423
424int
425evas_software_xlib_x_output_buffer_bit_order(X_Output_Buffer *xob)
426{
427 return xob->xim->bitmap_bit_order;
428}
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xlib_buffer.h b/libraries/evas/src/modules/engines/software_x11/evas_xlib_buffer.h
new file mode 100644
index 0000000..01c4db0
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xlib_buffer.h
@@ -0,0 +1,45 @@
1#ifndef EVAS_XLIB_BUFFER_H
2#define EVAS_XLIB_BUFFER_H
3
4
5#include "evas_engine.h"
6
7
8typedef struct _X_Output_Buffer X_Output_Buffer;
9
10struct _X_Output_Buffer
11{
12 Display *display;
13 XImage *xim;
14 XShmSegmentInfo *shm_info;
15 Visual *visual;
16 void *data;
17 int w;
18 int h;
19 int bpl;
20 int psize;
21};
22
23void evas_software_xlib_x_write_mask_line (Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int w, int y);
24void evas_software_xlib_x_write_mask_line_rev (Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int w, int y);
25void evas_software_xlib_x_write_mask_line_vert (Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int h, int ym, int w);
26void evas_software_xlib_x_write_mask_line_vert_rev (Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int h, int ym, int w);
27
28int evas_software_xlib_x_can_do_shm (Display *d);
29
30X_Output_Buffer *evas_software_xlib_x_output_buffer_new (Display *d, Visual *v, int depth, int w, int h, int try_shm, void *data);
31
32void evas_software_xlib_x_output_buffer_free (X_Output_Buffer *xob, int sync);
33
34void evas_software_xlib_x_output_buffer_paste (X_Output_Buffer *xob, Drawable d, GC gc, int x, int y, int sync);
35
36DATA8 *evas_software_xlib_x_output_buffer_data (X_Output_Buffer *xob, int *bytes_per_line_ret);
37
38int evas_software_xlib_x_output_buffer_depth (X_Output_Buffer *xob);
39
40int evas_software_xlib_x_output_buffer_byte_order (X_Output_Buffer *xob);
41
42int evas_software_xlib_x_output_buffer_bit_order (X_Output_Buffer *xob);
43
44
45#endif
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xlib_color.c b/libraries/evas/src/modules/engines/software_x11/evas_xlib_color.c
new file mode 100644
index 0000000..1df0406
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xlib_color.c
@@ -0,0 +1,368 @@
1#include "evas_common.h"
2
3#include "evas_engine.h"
4
5#include <X11/Xlib.h>
6#include <X11/Xutil.h>
7
8typedef struct _Convert_Pal_Priv Convert_Pal_Priv;
9
10struct _Convert_Pal_Priv
11{
12 Display *disp;
13 Colormap cmap;
14 Visual *vis;
15};
16
17typedef DATA8 * (*X_Func_Alloc_Colors) (Display *d, Colormap cmap, Visual *v);
18
19static X_Func_Alloc_Colors x_color_alloc[PAL_MODE_LAST + 1];
20static int x_color_count[PAL_MODE_LAST + 1];
21static Eina_List *palettes = NULL;
22
23static DATA8 * x_color_alloc_rgb(int nr, int ng, int nb, Display *d, Colormap cmap, Visual *v);
24static DATA8 * x_color_alloc_gray(int ng, Display *d, Colormap cmap, Visual *v);
25
26static DATA8 * x_color_alloc_rgb_332(Display *d, Colormap cmap, Visual *v);
27static DATA8 * x_color_alloc_rgb_666(Display *d, Colormap cmap, Visual *v);
28static DATA8 * x_color_alloc_rgb_232(Display *d, Colormap cmap, Visual *v);
29static DATA8 * x_color_alloc_rgb_222(Display *d, Colormap cmap, Visual *v);
30static DATA8 * x_color_alloc_rgb_221(Display *d, Colormap cmap, Visual *v);
31static DATA8 * x_color_alloc_rgb_121(Display *d, Colormap cmap, Visual *v);
32static DATA8 * x_color_alloc_rgb_111(Display *d, Colormap cmap, Visual *v);
33static DATA8 * x_color_alloc_gray_256(Display *d, Colormap cmap, Visual *v);
34static DATA8 * x_color_alloc_gray_64(Display *d, Colormap cmap, Visual *v);
35static DATA8 * x_color_alloc_gray_16(Display *d, Colormap cmap, Visual *v);
36static DATA8 * x_color_alloc_gray_4(Display *d, Colormap cmap, Visual *v);
37static DATA8 * x_color_alloc_mono(Display *d, Colormap cmap, Visual *v);
38
39static DATA8 *
40x_color_alloc_rgb(int nr, int ng, int nb, Display *d, Colormap cmap, Visual *v)
41{
42 int r, g, b, i;
43 DATA8 *color_lut;
44 int sig_mask = 0, delt = 0;
45
46 for (i = 0; i < v->bits_per_rgb; i++) sig_mask |= (0x1 << i);
47 sig_mask <<= (16 - v->bits_per_rgb);
48 i = 0;
49 color_lut = malloc((nr) * (ng) * (nb));
50 if (!color_lut) return NULL;
51 delt = 0x0101 * 3;
52 for (r = 0; r < (nr); r++)
53 {
54 for (g = 0; g < (ng); g++)
55 {
56 for (b = 0; b < (nb); b++)
57 {
58 XColor xcl;
59 XColor xcl_in;
60 int val;
61 Status ret;
62 int dr, dg, db;
63
64 val = (int)((((double)r) / ((nr) - 1)) * 255);
65 val = (val << 8) | val;
66 xcl.red = (unsigned short)(val);
67 val = (int)((((double)g) / ((ng) - 1)) * 255);
68 val = (val << 8) | val;
69 xcl.green = (unsigned short)(val);
70 val = (int)((((double)b) / ((nb) - 1)) * 255);
71 val = (val << 8) | val;
72 xcl.blue = (unsigned short)(val);
73 xcl_in = xcl;
74 ret = XAllocColor(d, cmap, &xcl);
75 dr = (int)xcl_in.red - (int)xcl.red;
76 if (dr < 0) dr = -dr;
77 dg = (int)xcl_in.green - (int)xcl.green;
78 if (dg < 0) dg = -dg;
79 db = (int)xcl_in.blue - (int)xcl.blue;
80 if (db < 0) db = -db;
81/*
82 printf("ASK [%i]: %04x %04x %04x = %04x %04x %04x | dif = %04x / %04x\n",
83 ret,
84 xcl_in.red, xcl_in.green, xcl_in.blue,
85 xcl.red, xcl.green, xcl.blue,
86 (dr + dg +db), delt);
87 */
88 if ((ret == 0) ||
89 ((dr + dg + db) > delt)
90/*
91 ||
92 ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
93 ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
94 ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask))
95 */
96 )
97 {
98 unsigned long pixels[256];
99 int j;
100
101 if (i > 0)
102 {
103 for (j = 0; j < i; j++)
104 pixels[j] = (unsigned long) color_lut[j];
105 XFreeColors(d, cmap, pixels, i, 0);
106 }
107 free(color_lut);
108 return NULL;
109 }
110 color_lut[i] = xcl.pixel;
111 i++;
112 }
113 }
114 }
115 return color_lut;
116}
117
118static DATA8 *
119x_color_alloc_gray(int ng, Display *d, Colormap cmap, Visual *v)
120{
121 int g, i;
122 DATA8 *color_lut;
123 int sig_mask = 0;
124
125 for (i = 0; i < v->bits_per_rgb; i++) sig_mask |= (0x1 << i);
126 sig_mask <<= (16 - v->bits_per_rgb);
127 i = 0;
128 color_lut = malloc(ng);
129 if (!color_lut) return NULL;
130 for (g = 0; g < (ng); g++)
131 {
132 XColor xcl;
133 XColor xcl_in;
134 int val;
135 Status ret;
136
137 val = (int)((((double)g) / ((ng) - 1)) * 255);
138 val = (val << 8) | val;
139 xcl.red = (unsigned short)(val);
140 xcl.green = (unsigned short)(val);
141 xcl.blue = (unsigned short)(val);
142 xcl_in = xcl;
143 ret = XAllocColor(d, cmap, &xcl);
144 if ((ret == 0) ||
145 ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) ||
146 ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) ||
147 ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)))
148 {
149 unsigned long pixels[256];
150 int j;
151
152 if (i > 0)
153 {
154 for (j = 0; j < i; j++)
155 pixels[j] = (unsigned long) color_lut[j];
156 XFreeColors(d, cmap, pixels, i, 0);
157 }
158 free(color_lut);
159 return NULL;
160 }
161 color_lut[i] = xcl.pixel;
162 i++;
163 }
164 return color_lut;
165}
166
167static DATA8 *
168x_color_alloc_rgb_332(Display *d, Colormap cmap, Visual *v)
169{
170 return x_color_alloc_rgb(8, 8, 4, d, cmap, v);
171}
172
173static DATA8 *
174x_color_alloc_rgb_666(Display *d, Colormap cmap, Visual *v)
175{
176 return x_color_alloc_rgb(6, 6, 6, d, cmap, v);
177}
178
179static DATA8 *
180x_color_alloc_rgb_232(Display *d, Colormap cmap, Visual *v)
181{
182 return x_color_alloc_rgb(4, 8, 4, d, cmap, v);
183}
184
185static DATA8 *
186x_color_alloc_rgb_222(Display *d, Colormap cmap, Visual *v)
187{
188 return x_color_alloc_rgb(4, 4, 4, d, cmap, v);
189}
190
191static DATA8 *
192x_color_alloc_rgb_221(Display *d, Colormap cmap, Visual *v)
193{
194 return x_color_alloc_rgb(4, 4, 2, d, cmap, v);
195}
196
197static DATA8 *
198x_color_alloc_rgb_121(Display *d, Colormap cmap, Visual *v)
199{
200 return x_color_alloc_rgb(2, 4, 2, d, cmap, v);
201}
202
203static DATA8 *
204x_color_alloc_rgb_111(Display *d, Colormap cmap, Visual *v)
205{
206 return x_color_alloc_rgb(2, 2, 2, d, cmap, v);
207}
208
209static DATA8 *
210x_color_alloc_gray_256(Display *d, Colormap cmap, Visual *v)
211{
212 return x_color_alloc_gray(256, d, cmap, v);
213}
214
215static DATA8 *
216x_color_alloc_gray_64(Display *d, Colormap cmap, Visual *v)
217{
218 return x_color_alloc_gray(64, d, cmap, v);
219}
220
221static DATA8 *
222x_color_alloc_gray_16(Display *d, Colormap cmap, Visual *v)
223{
224 return x_color_alloc_gray(32, d, cmap, v);
225}
226
227static DATA8 *
228x_color_alloc_gray_4(Display *d, Colormap cmap, Visual *v)
229{
230 return x_color_alloc_gray(16, d, cmap, v);
231}
232
233static DATA8 *
234x_color_alloc_mono(Display *d, Colormap cmap, Visual *v)
235{
236 return x_color_alloc_gray(2, d, cmap, v);
237}
238
239void
240evas_software_xlib_x_color_init(void)
241{
242 static int initialised = 0;
243
244 if (initialised) return;
245 x_color_alloc[PAL_MODE_NONE] = NULL;
246 x_color_count[PAL_MODE_NONE] = 0;
247
248 x_color_alloc[PAL_MODE_MONO] = x_color_alloc_mono;
249 x_color_count[PAL_MODE_MONO] = 2;
250
251 x_color_alloc[PAL_MODE_GRAY4] = x_color_alloc_gray_4;
252 x_color_count[PAL_MODE_GRAY4] = 4;
253
254 x_color_alloc[PAL_MODE_GRAY16] = x_color_alloc_gray_16;
255 x_color_count[PAL_MODE_GRAY16] = 16;
256
257 x_color_alloc[PAL_MODE_GRAY64] = x_color_alloc_gray_64;
258 x_color_count[PAL_MODE_GRAY64] = 64;
259
260 x_color_alloc[PAL_MODE_GRAY256] = x_color_alloc_gray_256;
261 x_color_count[PAL_MODE_GRAY256] = 256;
262
263 x_color_alloc[PAL_MODE_RGB111] = x_color_alloc_rgb_111;
264 x_color_count[PAL_MODE_RGB111] = 2 * 2 * 2;
265
266 x_color_alloc[PAL_MODE_RGB121] = x_color_alloc_rgb_121;
267 x_color_count[PAL_MODE_RGB121] = 2 * 4 * 2;
268
269 x_color_alloc[PAL_MODE_RGB221] = x_color_alloc_rgb_221;
270 x_color_count[PAL_MODE_RGB221] = 4 * 4 * 2;
271
272 x_color_alloc[PAL_MODE_RGB222] = x_color_alloc_rgb_222;
273 x_color_count[PAL_MODE_RGB222] = 4 * 4 * 4;
274
275 x_color_alloc[PAL_MODE_RGB232] = x_color_alloc_rgb_232;
276 x_color_count[PAL_MODE_RGB232] = 4 * 8 * 4;
277
278 x_color_alloc[PAL_MODE_RGB666] = x_color_alloc_rgb_666;
279 x_color_count[PAL_MODE_RGB666] = 6 * 6 * 6;
280
281 x_color_alloc[PAL_MODE_RGB332] = x_color_alloc_rgb_332;
282 x_color_count[PAL_MODE_RGB332] = 8 * 8 * 4;
283
284 x_color_alloc[PAL_MODE_LAST] = NULL;
285 x_color_count[PAL_MODE_LAST] = 0;
286 initialised = 1;
287}
288
289Convert_Pal *
290evas_software_xlib_x_color_allocate(Display *disp,
291 Colormap cmap,
292 Visual *vis,
293 Convert_Pal_Mode colors)
294{
295 Convert_Pal_Priv *palpriv;
296 Convert_Pal *pal;
297 Convert_Pal_Mode c;
298 Eina_List *l;
299
300/* printf("ALLOC cmap=%i vis=%p\n", cmap, vis);*/
301 EINA_LIST_FOREACH(palettes, l, pal)
302 {
303 palpriv = pal->data;
304 if ((disp == palpriv->disp) &&
305 (vis == palpriv->vis) &&
306 (cmap == palpriv->cmap))
307 {
308 pal->references++;
309 return pal;
310 }
311 }
312 pal = calloc(1, sizeof(struct _Convert_Pal));
313 if (!pal) return NULL;
314 for (c = colors; c > PAL_MODE_NONE; c--)
315 {
316 if (x_color_alloc[c])
317 {
318/* printf("TRY PAL %i\n", c);*/
319 pal->lookup = (x_color_alloc[c])(disp, cmap, vis);
320 if (pal->lookup) break;
321 }
322 }
323 pal->references = 1;
324 pal->colors = c;
325 pal->count = x_color_count[c];
326 palpriv = calloc(1, sizeof(Convert_Pal_Priv));
327 pal->data = palpriv;
328 if (!palpriv)
329 {
330 if (pal->lookup) free(pal->lookup);
331 free(pal);
332 return NULL;
333 }
334 palpriv->disp = disp;
335 palpriv->vis = vis;
336 palpriv->cmap = cmap;
337 if (pal->colors == PAL_MODE_NONE)
338 {
339 if (pal->lookup) free(pal->lookup);
340 free(pal);
341 return NULL;
342 }
343 palettes = eina_list_append(palettes, pal);
344 return pal;
345}
346
347void
348evas_software_xlib_x_color_deallocate(Display *disp,
349 Colormap cmap,
350 Visual *vis __UNUSED__,
351 Convert_Pal *pal)
352{
353 unsigned long pixels[256];
354 int j;
355
356 pal->references--;
357 if (pal->references > 0) return;
358 if (pal->lookup)
359 {
360 for(j = 0; j < pal->count; j++)
361 pixels[j] = (unsigned long) pal->lookup[j];
362 XFreeColors(disp, cmap, pixels, pal->count, 0);
363 free(pal->lookup);
364 }
365 free(pal->data);
366 palettes = eina_list_remove(palettes, pal);
367 free(pal);
368}
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xlib_color.h b/libraries/evas/src/modules/engines/software_x11/evas_xlib_color.h
new file mode 100644
index 0000000..e9f8afb
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xlib_color.h
@@ -0,0 +1,16 @@
1#ifndef EVAS_XLIB_COLOR_H
2#define EVAS_XLIB_COLOR_H
3
4void evas_software_xlib_x_color_init (void);
5
6Convert_Pal *evas_software_xlib_x_color_allocate (Display *disp,
7 Colormap cmap,
8 Visual *vis,
9 Convert_Pal_Mode colors);
10
11void evas_software_xlib_x_color_deallocate (Display *disp,
12 Colormap cmap,
13 Visual *vis,
14 Convert_Pal *pal);
15
16#endif
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xlib_main.c b/libraries/evas/src/modules/engines/software_x11/evas_xlib_main.c
new file mode 100644
index 0000000..3c153e1
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xlib_main.c
@@ -0,0 +1,7 @@
1#include "evas_common.h"
2#include "evas_engine.h"
3
4void
5evas_software_xlib_x_init(void)
6{
7}
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xlib_outbuf.c b/libraries/evas/src/modules/engines/software_x11/evas_xlib_outbuf.c
new file mode 100644
index 0000000..1b1d3d9
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xlib_outbuf.c
@@ -0,0 +1,1135 @@
1#ifdef HAVE_CONFIG_H
2# include <config.h>
3#endif
4
5#include <sys/time.h>
6#include <sys/utsname.h>
7
8#include "evas_common.h"
9#include "evas_macros.h"
10#include "evas_xlib_outbuf.h"
11#include "evas_xlib_buffer.h"
12#include "evas_xlib_color.h"
13
14
15typedef struct _Outbuf_Region Outbuf_Region;
16
17struct _Outbuf_Region
18{
19 X_Output_Buffer *xob;
20 X_Output_Buffer *mxob;
21 int x;
22 int y;
23 int w;
24 int h;
25};
26
27static Eina_List *shmpool = NULL;
28static int shmsize = 0;
29static int shmmemlimit = 10 * 1024 * 1024;
30static const unsigned int shmcountlimit = 32;
31
32#ifdef EVAS_FRAME_QUEUING
33static LK(lock_shmpool);
34#define SHMPOOL_LOCK() LKL(lock_shmpool)
35#define SHMPOOL_UNLOCK() LKU(lock_shmpool)
36#else
37#define SHMPOOL_LOCK()
38#define SHMPOOL_UNLOCK()
39#endif
40
41static X_Output_Buffer *
42_find_xob(Display *d, Visual *v, int depth, int w, int h, int shm, void *data)
43{
44 Eina_List *l, *xl = NULL;
45 X_Output_Buffer *xob = NULL;
46 X_Output_Buffer *xob2;
47 int fitness = 0x7fffffff;
48 int sz, lbytes, bpp;
49
50 if (!shm)
51 return evas_software_xlib_x_output_buffer_new(d, v, depth, w, h, shm, data);
52 if (depth > 1)
53 {
54 bpp = depth / 8;
55 if (bpp == 3) bpp = 4;
56 lbytes = (((w * bpp) + 3) / 4) * 4;
57 }
58 else
59 lbytes = ((w + 31) / 32) * 4;
60 sz = lbytes * h;
61 SHMPOOL_LOCK();
62 EINA_LIST_FOREACH(shmpool, l, xob2)
63 {
64 int szdif;
65
66 if ((xob2->xim->depth != depth) || (xob2->visual != v) ||
67 (xob2->display != d))
68 continue;
69 szdif = xob2->psize - sz;
70 if (szdif < 0) continue;
71 if (szdif == 0)
72 {
73 xob = xob2;
74 xl = l;
75 goto have_xob;
76 }
77 if (szdif < fitness)
78 {
79 fitness = szdif;
80 xob = xob2;
81 xl = l;
82 }
83 }
84 if ((fitness > (100 * 100)) || (!xob))
85 {
86 SHMPOOL_UNLOCK();
87 xob = evas_software_xlib_x_output_buffer_new(d, v, depth, w, h, shm, data);
88 return xob;
89 }
90
91 have_xob:
92 shmpool = eina_list_remove_list(shmpool, xl);
93 xob->w = w;
94 xob->h = h;
95 xob->bpl = lbytes;
96 xob->xim->width = xob->w;
97 xob->xim->height = xob->h;
98 xob->xim->bytes_per_line = xob->bpl;
99 shmsize -= xob->psize * (xob->xim->depth / 8);
100 SHMPOOL_UNLOCK();
101 return xob;
102}
103
104static void
105_unfind_xob(X_Output_Buffer *xob, int psync)
106{
107 if (xob->shm_info)
108 {
109 SHMPOOL_LOCK();
110 shmpool = eina_list_prepend(shmpool, xob);
111 shmsize += xob->psize * xob->xim->depth / 8;
112 while ((shmsize > (shmmemlimit)) ||
113 (eina_list_count(shmpool) > shmcountlimit))
114 {
115 Eina_List *xl;
116
117 xl = eina_list_last(shmpool);
118 if (!xl)
119 {
120 shmsize = 0;
121 break;
122 }
123 xob = xl->data;
124 shmpool = eina_list_remove_list(shmpool, xl);
125 shmsize -= xob->psize * xob->xim->depth / 8;
126 evas_software_xlib_x_output_buffer_free(xob, psync);
127 }
128 SHMPOOL_UNLOCK();
129 }
130 else
131 evas_software_xlib_x_output_buffer_free(xob, psync);
132}
133
134static void
135_clear_xob(int psync)
136{
137 SHMPOOL_LOCK();
138 while (shmpool)
139 {
140 X_Output_Buffer *xob;
141
142 xob = shmpool->data;
143 shmpool = eina_list_remove_list(shmpool, shmpool);
144 evas_software_xlib_x_output_buffer_free(xob, psync);
145 }
146 shmsize = 0;
147 SHMPOOL_UNLOCK();
148}
149
150void
151evas_software_xlib_outbuf_init(void)
152{
153#ifdef EVAS_FRAME_QUEUING
154 LKI(lock_shmpool);
155#endif
156}
157
158void
159evas_software_xlib_outbuf_free(Outbuf *buf)
160{
161#ifdef EVAS_FRAME_QUEUING
162 LKL(buf->priv.lock);
163#endif
164 while (buf->priv.pending_writes)
165 {
166 RGBA_Image *im;
167 Outbuf_Region *obr;
168
169 im = buf->priv.pending_writes->data;
170 buf->priv.pending_writes = eina_list_remove_list(buf->priv.pending_writes, buf->priv.pending_writes);
171 obr = im->extended_info;
172 evas_cache_image_drop(&im->cache_entry);
173 if (obr->xob) _unfind_xob(obr->xob, 0);
174 if (obr->mxob) _unfind_xob(obr->mxob, 0);
175 free(obr);
176 }
177#ifdef EVAS_FRAME_QUEUING
178 LKU(buf->priv.lock);
179#endif
180 evas_software_xlib_outbuf_idle_flush(buf);
181 evas_software_xlib_outbuf_flush(buf);
182 if (buf->priv.x11.xlib.gc)
183 XFreeGC(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gc);
184 if (buf->priv.x11.xlib.gcm)
185 XFreeGC(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gcm);
186 if (buf->priv.pal)
187 evas_software_xlib_x_color_deallocate(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.cmap,
188 buf->priv.x11.xlib.vis, buf->priv.pal);
189#ifdef EVAS_FRAME_QUEUING
190 LKD(buf->priv.lock);
191#endif
192 free(buf);
193 _clear_xob(0);
194}
195
196Outbuf *
197evas_software_xlib_outbuf_setup_x(int w, int h, int rot, Outbuf_Depth depth,
198 Display *disp, Drawable draw, Visual *vis,
199 Colormap cmap, int x_depth,
200 int grayscale, int max_colors, Pixmap mask,
201 int shape_dither, int destination_alpha)
202{
203 Outbuf *buf;
204
205 buf = calloc(1, sizeof(Outbuf));
206 if (!buf)
207 return NULL;
208
209 buf->w = w;
210 buf->h = h;
211 buf->depth = depth;
212 buf->rot = rot;
213
214 buf->priv.x11.xlib.disp = disp;
215 buf->priv.x11.xlib.vis = vis;
216 buf->priv.x11.xlib.cmap = cmap;
217 buf->priv.x11.xlib.depth = x_depth;
218
219 buf->priv.mask_dither = shape_dither;
220 buf->priv.destination_alpha = destination_alpha;
221
222 {
223 Gfx_Func_Convert conv_func;
224 X_Output_Buffer *xob;
225
226 buf->priv.x11.xlib.shm = evas_software_xlib_x_can_do_shm(buf->priv.x11.xlib.disp);
227 xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
228 buf->priv.x11.xlib.vis,
229 buf->priv.x11.xlib.depth,
230 1, 1, buf->priv.x11.xlib.shm, NULL);
231
232 conv_func = NULL;
233 if (xob)
234 {
235#ifdef WORDS_BIGENDIAN
236 if (evas_software_xlib_x_output_buffer_byte_order(xob) == LSBFirst)
237 buf->priv.x11.xlib.swap = 1;
238 if (evas_software_xlib_x_output_buffer_bit_order(xob) == MSBFirst)
239 buf->priv.x11.xlib.bit_swap = 1;
240#else
241 if (evas_software_xlib_x_output_buffer_byte_order(xob) == MSBFirst)
242 buf->priv.x11.xlib.swap = 1;
243 if (evas_software_xlib_x_output_buffer_bit_order(xob) == MSBFirst)
244 buf->priv.x11.xlib.bit_swap = 1;
245#endif
246 if (((vis->class == TrueColor) || (vis->class == DirectColor)) &&
247 (x_depth > 8))
248 {
249 buf->priv.mask.r = (DATA32) vis->red_mask;
250 buf->priv.mask.g = (DATA32) vis->green_mask;
251 buf->priv.mask.b = (DATA32) vis->blue_mask;
252 if (buf->priv.x11.xlib.swap)
253 {
254 SWAP32(buf->priv.mask.r);
255 SWAP32(buf->priv.mask.g);
256 SWAP32(buf->priv.mask.b);
257 }
258 }
259 else if ((vis->class == PseudoColor) ||
260 (vis->class == StaticColor) ||
261 (vis->class == GrayScale) ||
262 (vis->class == StaticGray) ||
263 (x_depth <= 8))
264 {
265 Convert_Pal_Mode pm = PAL_MODE_RGB332;
266
267 if ((vis->class == GrayScale) || (vis->class == StaticGray))
268 grayscale = 1;
269 if (grayscale)
270 {
271 if (max_colors >= 256)
272 pm = PAL_MODE_GRAY256;
273 else if (max_colors >= 64)
274 pm = PAL_MODE_GRAY64;
275 else if (max_colors >= 16)
276 pm = PAL_MODE_GRAY16;
277 else if (max_colors >= 4)
278 pm = PAL_MODE_GRAY4;
279 else
280 pm = PAL_MODE_MONO;
281 }
282 else
283 {
284 if (max_colors >= 256)
285 pm = PAL_MODE_RGB332;
286 else if (max_colors >= 216)
287 pm = PAL_MODE_RGB666;
288 else if (max_colors >= 128)
289 pm = PAL_MODE_RGB232;
290 else if (max_colors >= 64)
291 pm = PAL_MODE_RGB222;
292 else if (max_colors >= 32)
293 pm = PAL_MODE_RGB221;
294 else if (max_colors >= 16)
295 pm = PAL_MODE_RGB121;
296 else if (max_colors >= 8)
297 pm = PAL_MODE_RGB111;
298 else if (max_colors >= 4)
299 pm = PAL_MODE_GRAY4;
300 else
301 pm = PAL_MODE_MONO;
302 }
303 /* FIXME: only alloc once per display+cmap */
304 buf->priv.pal = evas_software_xlib_x_color_allocate(disp, cmap, vis,
305 pm);
306 if (!buf->priv.pal)
307 {
308 free(buf);
309 return NULL;
310 }
311 }
312 if (buf->priv.pal)
313 {
314 if (buf->rot == 0 || buf->rot == 180)
315 conv_func = evas_common_convert_func_get(0, buf->w, buf->h,
316 evas_software_xlib_x_output_buffer_depth
317 (xob), buf->priv.mask.r,
318 buf->priv.mask.g,
319 buf->priv.mask.b,
320 buf->priv.pal->colors,
321 buf->rot);
322 else if (buf->rot == 90 || buf->rot == 270)
323 conv_func = evas_common_convert_func_get(0, buf->h, buf->w,
324 evas_software_xlib_x_output_buffer_depth
325 (xob), buf->priv.mask.r,
326 buf->priv.mask.g,
327 buf->priv.mask.b,
328 buf->priv.pal->colors,
329 buf->rot);
330 }
331 else
332 {
333 if (buf->rot == 0 || buf->rot == 180)
334 conv_func = evas_common_convert_func_get(0, buf->w, buf->h,
335 evas_software_xlib_x_output_buffer_depth
336 (xob), buf->priv.mask.r,
337 buf->priv.mask.g,
338 buf->priv.mask.b, PAL_MODE_NONE,
339 buf->rot);
340 else if (buf->rot == 90 || buf->rot == 270)
341 conv_func = evas_common_convert_func_get(0, buf->h, buf->w,
342 evas_software_xlib_x_output_buffer_depth
343 (xob), buf->priv.mask.r,
344 buf->priv.mask.g,
345 buf->priv.mask.b, PAL_MODE_NONE,
346 buf->rot);
347 }
348 evas_software_xlib_x_output_buffer_free(xob, 1);
349 if (!conv_func)
350 {
351 ERR("At depth: %i, RGB format mask: %08x %08x %08x, "
352 "Palette mode: %i. "
353 "Not supported by compiled in converters!",
354 buf->priv.x11.xlib.depth,
355 buf->priv.mask.r,
356 buf->priv.mask.g,
357 buf->priv.mask.b,
358 buf->priv.pal ? (int)buf->priv.pal->colors : -1);
359 }
360 }
361 evas_software_xlib_outbuf_drawable_set(buf, draw);
362 evas_software_xlib_outbuf_mask_set(buf, mask);
363 }
364#ifdef EVAS_FRAME_QUEUING
365 LKI(buf->priv.lock);
366#endif
367 return buf;
368}
369
370RGBA_Image *
371evas_software_xlib_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch)
372{
373 RGBA_Image *im;
374 Outbuf_Region *obr;
375 int bpl = 0;
376 int use_shm = 1;
377 int alpha;
378
379 if ((buf->onebuf) && (buf->priv.x11.xlib.shm))
380 {
381 Eina_Rectangle *rect;
382
383 RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, buf->w, buf->h);
384 obr = calloc(1, sizeof(Outbuf_Region));
385 if (!obr) return NULL;
386 rect = eina_rectangle_new(x, y, w, h);
387 if (!rect)
388 {
389 free(obr);
390 return NULL;
391 }
392
393 buf->priv.onebuf_regions = eina_list_append(buf->priv.onebuf_regions, rect);
394 if (buf->priv.onebuf)
395 {
396 *cx = x;
397 *cy = y;
398 *cw = w;
399 *ch = h;
400 if (!buf->priv.synced)
401 {
402 XSync(buf->priv.x11.xlib.disp, False);
403 buf->priv.synced = 1;
404 }
405 return buf->priv.onebuf;
406 }
407 obr->x = 0;
408 obr->y = 0;
409 obr->w = buf->w;
410 obr->h = buf->h;
411 *cx = x;
412 *cy = y;
413 *cw = w;
414 *ch = h;
415
416 alpha = ((buf->priv.x11.xlib.mask) || (buf->priv.destination_alpha));
417
418 use_shm = buf->priv.x11.xlib.shm;
419 if ((buf->rot == 0) &&
420 (buf->priv.mask.r == 0xff0000) &&
421 (buf->priv.mask.g == 0x00ff00) &&
422 (buf->priv.mask.b == 0x0000ff))
423 {
424 obr->xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
425 buf->priv.x11.xlib.vis,
426 buf->priv.x11.xlib.depth,
427 buf->w, buf->h,
428 use_shm,
429 NULL);
430 if (!obr->xob)
431 {
432 free(obr);
433 return NULL;
434 }
435 im = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(),
436 buf->w, buf->h,
437 (DATA32 *) evas_software_xlib_x_output_buffer_data(obr->xob, &bpl),
438 alpha, EVAS_COLORSPACE_ARGB8888);
439 if (!im)
440 {
441 evas_software_xlib_x_output_buffer_free(obr->xob, 0);
442 free(obr);
443 return NULL;
444 }
445 im->extended_info = obr;
446 if (buf->priv.x11.xlib.mask)
447 obr->mxob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
448 buf->priv.x11.xlib.vis,
449 1,
450 buf->w, buf->h,
451 use_shm,
452 NULL);
453 }
454 else
455 {
456 im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
457 if (!im)
458 {
459 free(obr);
460 return NULL;
461 }
462 im->cache_entry.flags.alpha |= alpha ? 1 : 0;
463 evas_cache_image_surface_alloc(&im->cache_entry, buf->w, buf->h);
464 im->extended_info = obr;
465 if ((buf->rot == 0) || (buf->rot == 180))
466 {
467 obr->xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
468 buf->priv.x11.xlib.vis,
469 buf->priv.x11.xlib.depth,
470 buf->w, buf->h,
471 use_shm,
472 NULL);
473 if (!obr->xob)
474 {
475 evas_cache_image_drop(&im->cache_entry);
476 free(obr);
477 return NULL;
478 }
479 if (buf->priv.x11.xlib.mask)
480 obr->mxob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
481 buf->priv.x11.xlib.vis,
482 1, buf->w, buf->h,
483 use_shm,
484 NULL);
485 }
486 else if ((buf->rot == 90) || (buf->rot == 270))
487 {
488 obr->xob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
489 buf->priv.x11.xlib.vis,
490 buf->priv.x11.xlib.depth,
491 buf->h, buf->w,
492 use_shm,
493 NULL);
494 if (!obr->xob)
495 {
496 evas_cache_image_drop(&im->cache_entry);
497 free(obr);
498 return NULL;
499 }
500 if (buf->priv.x11.xlib.mask)
501 obr->mxob = evas_software_xlib_x_output_buffer_new(buf->priv.x11.xlib.disp,
502 buf->priv.x11.xlib.vis,
503 1, buf->h, buf->w,
504 use_shm,
505 NULL);
506 }
507 }
508 /* FIXME: We should be able to remove this memset, but somewhere in the process
509 we copy too much to the destination surface and some area are not cleaned before copy. */
510 if ((alpha) && (im->image.data))
511 {
512 /* FIXME: faster memset! */
513// memset(im->image.data, 0, w * h * sizeof(DATA32));
514 }
515
516 buf->priv.onebuf = im;
517 return im;
518 }
519
520 obr = calloc(1, sizeof(Outbuf_Region));
521 if (!obr) return NULL;
522 obr->x = x;
523 obr->y = y;
524 obr->w = w;
525 obr->h = h;
526 *cx = 0;
527 *cy = 0;
528 *cw = w;
529 *ch = h;
530
531 use_shm = buf->priv.x11.xlib.shm;
532 /* FIXME: magic - i found if shm regions are smaller than 200x200 its
533 * faster to use ximages over unix sockets - trial and error
534 */
535// use_shm = 0; /* 630 -> 1006 fps */
536// if ((w * h) < (200 * 200)) use_shm = 0; /* 630 -> 962 fps */
537
538 alpha = ((buf->priv.x11.xlib.mask) || (buf->priv.destination_alpha));
539
540 if ((buf->rot == 0) &&
541 (buf->priv.mask.r == 0xff0000) &&
542 (buf->priv.mask.g == 0x00ff00) &&
543 (buf->priv.mask.b == 0x0000ff))
544 {
545 obr->xob = _find_xob(buf->priv.x11.xlib.disp,
546 buf->priv.x11.xlib.vis,
547 buf->priv.x11.xlib.depth,
548 w, h,
549 use_shm,
550 NULL);
551 if (!obr->xob)
552 {
553 free(obr);
554 return NULL;
555 }
556 im = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(),
557 w, h,
558 (DATA32 *) evas_software_xlib_x_output_buffer_data(obr->xob, &bpl),
559 alpha, EVAS_COLORSPACE_ARGB8888);
560 if (!im)
561 {
562 _unfind_xob(obr->xob, 0);
563 free(obr);
564 return NULL;
565 }
566 im->extended_info = obr;
567 if (buf->priv.x11.xlib.mask)
568 obr->mxob = _find_xob(buf->priv.x11.xlib.disp,
569 buf->priv.x11.xlib.vis,
570 1, w, h,
571 use_shm,
572 NULL);
573 }
574 else
575 {
576 im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
577 if (!im)
578 {
579 free(obr);
580 return NULL;
581 }
582 im->cache_entry.flags.alpha |= alpha ? 1 : 0;
583 evas_cache_image_surface_alloc(&im->cache_entry, w, h);
584 im->extended_info = obr;
585 if ((buf->rot == 0) || (buf->rot == 180))
586 {
587 obr->xob = _find_xob(buf->priv.x11.xlib.disp,
588 buf->priv.x11.xlib.vis,
589 buf->priv.x11.xlib.depth,
590 w, h,
591 use_shm,
592 NULL);
593 if (!obr->xob)
594 {
595 evas_cache_image_drop(&im->cache_entry);
596 free(obr);
597 return NULL;
598 }
599 if (buf->priv.x11.xlib.mask)
600 obr->mxob = _find_xob(buf->priv.x11.xlib.disp,
601 buf->priv.x11.xlib.vis,
602 1, w, h,
603 use_shm,
604 NULL);
605 }
606 else if ((buf->rot == 90) || (buf->rot == 270))
607 {
608 obr->xob = _find_xob(buf->priv.x11.xlib.disp,
609 buf->priv.x11.xlib.vis,
610 buf->priv.x11.xlib.depth,
611 h, w,
612 use_shm,
613 NULL);
614 if (!obr->xob)
615 {
616 evas_cache_image_drop(&im->cache_entry);
617 free(obr);
618 return NULL;
619 }
620 if (buf->priv.x11.xlib.mask)
621 obr->mxob = _find_xob(buf->priv.x11.xlib.disp,
622 buf->priv.x11.xlib.vis,
623 1, h, w,
624 use_shm,
625 NULL);
626 }
627 }
628 /* FIXME: We should be able to remove this memset, but somewhere in the process
629 we copy too much to the destination surface and some area are not cleaned before copy. */
630 if (((buf->priv.x11.xlib.mask) || (buf->priv.destination_alpha)) &&
631 (im->image.data))
632 {
633 /* FIXME: faster memset! */
634// memset(im->image.data, 0, w * h * sizeof(DATA32));
635 }
636
637#ifdef EVAS_FRAME_QUEUING
638 if (!evas_common_frameq_enabled())
639#endif
640 buf->priv.pending_writes = eina_list_append(buf->priv.pending_writes, im);
641 return im;
642}
643
644void
645evas_software_xlib_outbuf_free_region_for_update(Outbuf *buf __UNUSED__, RGBA_Image *update __UNUSED__)
646{
647 /* no need to do anything - they are cleaned up on flush */
648}
649
650void
651evas_software_xlib_outbuf_flush(Outbuf *buf)
652{
653 Eina_List *l;
654 RGBA_Image *im;
655 Outbuf_Region *obr;
656
657 if ((buf->priv.onebuf) && (buf->priv.onebuf_regions))
658 {
659 Region tmpr;
660
661 im = buf->priv.onebuf;
662 obr = im->extended_info;
663 tmpr = XCreateRegion();
664 while (buf->priv.onebuf_regions)
665 {
666 Eina_Rectangle *rect;
667 XRectangle xr;
668
669 rect = buf->priv.onebuf_regions->data;
670 buf->priv.onebuf_regions = eina_list_remove_list(buf->priv.onebuf_regions, buf->priv.onebuf_regions);
671 if (buf->rot == 0)
672 {
673 xr.x = rect->x;
674 xr.y = rect->y;
675 xr.width = rect->w;
676 xr.height = rect->h;
677 }
678 else if (buf->rot == 90)
679 {
680 xr.x = rect->y;
681 xr.y = buf->w - rect->x - rect->w;
682 xr.width = rect->h;
683 xr.height = rect->w;
684 }
685 else if (buf->rot == 180)
686 {
687 xr.x = buf->w - rect->x - rect->w;
688 xr.y = buf->h - rect->y - rect->h;
689 xr.width = rect->w;
690 xr.height = rect->h;
691 }
692 else if (buf->rot == 270)
693 {
694 xr.x = buf->h - rect->y - rect->h;
695 xr.y = rect->x;
696 xr.width = rect->h;
697 xr.height = rect->w;
698 }
699 XUnionRectWithRegion(&xr, tmpr, tmpr);
700 if (buf->priv.debug)
701 evas_software_xlib_outbuf_debug_show(buf, buf->priv.x11.xlib.win,
702 xr.x, xr.y, xr.width, xr.height);
703 eina_rectangle_free(rect);
704 }
705 XSetRegion(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gc, tmpr);
706 if (obr->xob)
707 evas_software_xlib_x_output_buffer_paste(obr->xob, buf->priv.x11.xlib.win,
708 buf->priv.x11.xlib.gc,
709 0, 0, 0);
710 if (obr->mxob)
711 {
712 XSetRegion(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gcm, tmpr);
713 evas_software_xlib_x_output_buffer_paste(obr->mxob,
714 buf->priv.x11.xlib.mask,
715 buf->priv.x11.xlib.gcm,
716 0, 0, 0);
717 }
718 XDestroyRegion(tmpr);
719 buf->priv.synced = 0;
720 }
721 else
722 {
723#if 1
724 XSync(buf->priv.x11.xlib.disp, False);
725 EINA_LIST_FOREACH(buf->priv.pending_writes, l, im)
726 {
727 obr = im->extended_info;
728 if (buf->priv.debug)
729 evas_software_xlib_outbuf_debug_show(buf, buf->priv.x11.xlib.win,
730 obr->x, obr->y, obr->w, obr->h);
731 if (obr->xob)
732 evas_software_xlib_x_output_buffer_paste(obr->xob, buf->priv.x11.xlib.win,
733 buf->priv.x11.xlib.gc,
734 obr->x, obr->y, 0);
735 if (obr->mxob)
736 evas_software_xlib_x_output_buffer_paste(obr->mxob,
737 buf->priv.x11.xlib.mask,
738 buf->priv.x11.xlib.gcm,
739 obr->x, obr->y, 0);
740 }
741#ifdef EVAS_FRAME_QUEUING
742 LKL(buf->priv.lock);
743#endif
744 while (buf->priv.prev_pending_writes)
745 {
746 im = buf->priv.prev_pending_writes->data;
747 buf->priv.prev_pending_writes =
748 eina_list_remove_list(buf->priv.prev_pending_writes,
749 buf->priv.prev_pending_writes);
750 obr = im->extended_info;
751 evas_cache_image_drop(&im->cache_entry);
752 if (obr->xob) _unfind_xob(obr->xob, 0);
753 if (obr->mxob) _unfind_xob(obr->mxob, 0);
754 free(obr);
755 }
756 buf->priv.prev_pending_writes = buf->priv.pending_writes;
757#ifdef EVAS_FRAME_QUEUING
758 LKU(buf->priv.lock);
759#endif
760 buf->priv.pending_writes = NULL;
761 XFlush(buf->priv.x11.xlib.disp);
762#else
763 /* XX async push - disable */
764 /*
765 EINA_LIST_FOREACH(buf->priv.pending_writes, l, im)
766 {
767 obr = im->extended_info;
768 if (buf->priv.debug)
769 evas_software_xlib_outbuf_debug_show(buf, buf->priv.x11.xlib.win,
770 obr->x, obr->y, obr->w, obr->h);
771 evas_software_xlib_x_output_buffer_paste(obr->xob, buf->priv.x11.xlib.win,
772 buf->priv.x11.xlib.gc,
773 obr->x, obr->y, 0);
774 if (obr->mxob)
775 evas_software_xlib_x_output_buffer_paste(obr->mxob,
776 buf->priv.x11.xlib.mask,
777 buf->priv.x11.xlib.gcm,
778 obr->x, obr->y, 0);
779 }
780 */
781 XSync(buf->priv.x11.xlib.disp, False);
782
783 while (buf->priv.pending_writes)
784 {
785 RGBA_Image *im;
786 Outbuf_Region *obr;
787
788 im = eina_list_data_get(buf->priv.pending_writes);
789 buf->priv.pending_writes = eina_list_remove_list(buf->priv.pending_writes, buf->priv.pending_writes);
790 obr = im->extended_info;
791 evas_cache_image_drop(&im->cache_entry);
792 if (obr->xob) _unfind_xob(obr->xob, 0);
793 if (obr->mxob) _unfind_xob(obr->mxob, 0);
794 free(obr);
795 evas_cache_image_drop(&im->cache_entry);
796 }
797#endif
798 }
799 evas_common_cpu_end_opt();
800}
801
802void
803evas_software_xlib_outbuf_idle_flush(Outbuf *buf)
804{
805 if (buf->priv.onebuf)
806 {
807 RGBA_Image *im;
808 Outbuf_Region *obr;
809
810 im = buf->priv.onebuf;
811 buf->priv.onebuf = NULL;
812 obr = im->extended_info;
813 if (obr->xob) evas_software_xlib_x_output_buffer_free(obr->xob, 0);
814 if (obr->mxob) evas_software_xlib_x_output_buffer_free(obr->mxob, 0);
815 free(obr);
816 evas_cache_image_drop(&im->cache_entry);
817 }
818 else
819 {
820#ifdef EVAS_FRAME_QUEUING
821 LKL(buf->priv.lock);
822#endif
823 if (buf->priv.prev_pending_writes) XSync(buf->priv.x11.xlib.disp, False);
824 while (buf->priv.prev_pending_writes)
825 {
826 RGBA_Image *im;
827 Outbuf_Region *obr;
828
829 im = buf->priv.prev_pending_writes->data;
830 buf->priv.prev_pending_writes =
831 eina_list_remove_list(buf->priv.prev_pending_writes,
832 buf->priv.prev_pending_writes);
833 obr = im->extended_info;
834 evas_cache_image_drop(&im->cache_entry);
835 if (obr->xob) _unfind_xob(obr->xob, 0);
836 if (obr->mxob) _unfind_xob(obr->mxob, 0);
837 free(obr);
838 }
839#ifdef EVAS_FRAME_QUEUING
840 LKU(buf->priv.lock);
841#endif
842 _clear_xob(0);
843 }
844}
845
846void
847evas_software_xlib_outbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h)
848{
849 Gfx_Func_Convert conv_func = NULL;
850 Outbuf_Region *obr;
851 DATA32 *src_data;
852 unsigned char *data;
853 int bpl = 0, yy;
854
855 obr = update->extended_info;
856 if (buf->priv.pal)
857 {
858 if ((buf->rot == 0) || (buf->rot == 180))
859 conv_func = evas_common_convert_func_get(0, w, h,
860 evas_software_xlib_x_output_buffer_depth
861 (obr->xob), buf->priv.mask.r,
862 buf->priv.mask.g, buf->priv.mask.b,
863 buf->priv.pal->colors, buf->rot);
864 else if ((buf->rot == 90) || (buf->rot == 270))
865 conv_func = evas_common_convert_func_get(0, h, w,
866 evas_software_xlib_x_output_buffer_depth
867 (obr->xob), buf->priv.mask.r,
868 buf->priv.mask.g, buf->priv.mask.b,
869 buf->priv.pal->colors, buf->rot);
870 }
871 else
872 {
873 if ((buf->rot == 0) || (buf->rot == 180))
874 conv_func = evas_common_convert_func_get(0, w, h,
875 evas_software_xlib_x_output_buffer_depth
876 (obr->xob), buf->priv.mask.r,
877 buf->priv.mask.g, buf->priv.mask.b,
878 PAL_MODE_NONE, buf->rot);
879 else if ((buf->rot == 90) || (buf->rot == 270))
880 conv_func = evas_common_convert_func_get(0, h, w,
881 evas_software_xlib_x_output_buffer_depth
882 (obr->xob), buf->priv.mask.r,
883 buf->priv.mask.g, buf->priv.mask.b,
884 PAL_MODE_NONE, buf->rot);
885 }
886 if (!conv_func) return;
887
888 if (!obr->xob) return;
889 data = evas_software_xlib_x_output_buffer_data(obr->xob, &bpl);
890 if (!data) return;
891 src_data = update->image.data;
892 if (!src_data) return;
893 if (buf->rot == 0)
894 {
895 obr->x = x;
896 obr->y = y;
897 }
898 else if (buf->rot == 90)
899 {
900 obr->x = y;
901 obr->y = buf->w - x - w;
902 }
903 else if (buf->rot == 180)
904 {
905 obr->x = buf->w - x - w;
906 obr->y = buf->h - y - h;
907 }
908 else if (buf->rot == 270)
909 {
910 obr->x = buf->h - y - h;
911 obr->y = x;
912 }
913 if ((buf->rot == 0) || (buf->rot == 180))
914 {
915 obr->w = w;
916 obr->h = h;
917 }
918 else if ((buf->rot == 90) || (buf->rot == 270))
919 {
920 obr->w = h;
921 obr->h = w;
922 }
923 if (buf->onebuf)
924 {
925 src_data += x + (y * update->cache_entry.w);
926 data += (bpl * obr->y) +
927 (obr->x * (evas_software_xlib_x_output_buffer_depth(obr->xob) / 8));
928 }
929 if (buf->priv.pal)
930 {
931 if (data != (unsigned char *)src_data)
932 conv_func(src_data, data,
933 update->cache_entry.w - w,
934 bpl /
935 ((evas_software_xlib_x_output_buffer_depth(obr->xob) /
936 8)) - obr->w, obr->w, obr->h, x, y,
937 buf->priv.pal->lookup);
938 }
939 else
940 {
941 if (data != (unsigned char *)src_data)
942 conv_func(src_data, data,
943 update->cache_entry.w - w,
944 bpl /
945 ((evas_software_xlib_x_output_buffer_depth(obr->xob) /
946 8)) - obr->w, obr->w, obr->h, x, y, NULL);
947 }
948#if 1
949#else
950 /* XX async push */
951 if (!((buf->priv.onebuf) && (buf->priv.onebuf_regions)))
952 {
953 if (buf->priv.debug)
954 evas_software_xlib_outbuf_debug_show(buf, buf->priv.x11.xlib.win,
955 obr->x, obr->y, obr->w, obr->h);
956 if (obr->xob)
957 evas_software_xlib_x_output_buffer_paste(obr->xob, buf->priv.x11.xlib.win,
958 buf->priv.x11.xlib.gc,
959 obr->x, obr->y, 0);
960 }
961#endif
962 if (obr->mxob)
963 {
964 if (buf->rot == 0)
965 {
966 for (yy = 0; yy < obr->h; yy++)
967 evas_software_xlib_x_write_mask_line(buf, obr->mxob,
968 src_data +
969 (yy * obr->w), obr->w, yy);
970 }
971 else if (buf->rot == 90)
972 {
973 for (yy = 0; yy < obr->h; yy++)
974 evas_software_xlib_x_write_mask_line_vert(buf, obr->mxob,
975 src_data + yy,
976 h, // h
977 obr->h - yy - 1, // ym
978 w); // w
979 }
980 else if (buf->rot == 180)
981 {
982 for (yy = 0; yy < obr->h; yy++)
983 {
984 evas_software_xlib_x_write_mask_line_rev(buf, obr->mxob,
985 src_data +
986 (yy * obr->w),
987 obr->w, obr->h - yy - 1);
988 }
989 }
990 else if (buf->rot == 270)
991 {
992 for (yy = 0; yy < obr->h; yy++)
993 evas_software_xlib_x_write_mask_line_vert_rev(buf, obr->mxob,
994 src_data + yy,
995 h, // h
996 yy, // ym
997 w); // w
998 }
999#if 1
1000#else
1001 /* XX async push */
1002 if (!((buf->priv.onebuf) && (buf->priv.onebuf_regions)))
1003 evas_software_xlib_x_output_buffer_paste(obr->mxob,
1004 buf->priv.x11.xlib.mask,
1005 buf->priv.x11.xlib.gcm,
1006 obr->x, obr->y, 0);
1007#endif
1008 }
1009#if 1
1010#else
1011 XFlush(buf->priv.x11.xlib.disp);
1012#endif
1013}
1014
1015void
1016evas_software_xlib_outbuf_reconfigure(Outbuf * buf, int w, int h, int rot,
1017 Outbuf_Depth depth)
1018{
1019 if ((w == buf->w) &&
1020 (h == buf->h) &&
1021 (rot == buf->rot) &&
1022 (depth == buf->depth)) return;
1023 buf->w = w;
1024 buf->h = h;
1025 buf->rot = rot;
1026 evas_software_xlib_outbuf_idle_flush(buf);
1027}
1028
1029int
1030evas_software_xlib_outbuf_get_width(Outbuf * buf)
1031{
1032 return buf->w;
1033}
1034
1035int
1036evas_software_xlib_outbuf_get_height(Outbuf * buf)
1037{
1038 return buf->h;
1039}
1040
1041Outbuf_Depth
1042evas_software_xlib_outbuf_get_depth(Outbuf * buf)
1043{
1044 return buf->depth;
1045}
1046
1047int
1048evas_software_xlib_outbuf_get_rot(Outbuf * buf)
1049{
1050 return buf->rot;
1051}
1052
1053void
1054evas_software_xlib_outbuf_drawable_set(Outbuf * buf, Drawable draw)
1055{
1056 XGCValues gcv;
1057
1058 if (buf->priv.x11.xlib.win == draw) return;
1059 if (buf->priv.x11.xlib.gc)
1060 {
1061 XFreeGC(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gc);
1062 buf->priv.x11.xlib.gc = NULL;
1063 }
1064 buf->priv.x11.xlib.win = draw;
1065 buf->priv.x11.xlib.gc = XCreateGC(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.win, 0, &gcv);
1066}
1067
1068void
1069evas_software_xlib_outbuf_mask_set(Outbuf * buf, Pixmap mask)
1070{
1071 XGCValues gcv;
1072
1073 if (buf->priv.x11.xlib.mask == mask) return;
1074 if (buf->priv.x11.xlib.gcm)
1075 {
1076 XFreeGC(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gcm);
1077 buf->priv.x11.xlib.gcm = NULL;
1078 }
1079 buf->priv.x11.xlib.mask = mask;
1080 if (buf->priv.x11.xlib.mask)
1081 buf->priv.x11.xlib.gcm = XCreateGC(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.mask, 0, &gcv);
1082}
1083
1084void
1085evas_software_xlib_outbuf_debug_set(Outbuf * buf, int debug)
1086{
1087 buf->priv.debug = debug;
1088}
1089
1090void
1091evas_software_xlib_outbuf_debug_show(Outbuf * buf, Drawable draw, int x, int y, int w,
1092 int h)
1093{
1094 int i;
1095 int screen_num = 0;
1096
1097 {
1098 int wx, wy;
1099 unsigned int ww, wh, bd, dp;
1100 Window wdum, root;
1101 XWindowAttributes wattr;
1102
1103 XGetGeometry(buf->priv.x11.xlib.disp, draw, &root, &wx, &wy, &ww, &wh, &bd, &dp);
1104 XGetGeometry(buf->priv.x11.xlib.disp, root, &wdum, &wx, &wy, &ww, &wh, &bd, &dp);
1105 XGetWindowAttributes(buf->priv.x11.xlib.disp, root, &wattr);
1106 screen_num = XScreenNumberOfScreen(wattr.screen);
1107 }
1108 for (i = 0; i < 20; i++)
1109 {
1110 XSetForeground(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gc,
1111 BlackPixel(buf->priv.x11.xlib.disp, screen_num));
1112 XFillRectangle(buf->priv.x11.xlib.disp, draw, buf->priv.x11.xlib.gc, x, y, w, h);
1113 XSync(buf->priv.x11.xlib.disp, False);
1114 XSync(buf->priv.x11.xlib.disp, False);
1115 XSetForeground(buf->priv.x11.xlib.disp, buf->priv.x11.xlib.gc,
1116 WhitePixel(buf->priv.x11.xlib.disp, screen_num));
1117 XFillRectangle(buf->priv.x11.xlib.disp, draw, buf->priv.x11.xlib.gc, x, y, w, h);
1118 XSync(buf->priv.x11.xlib.disp, False);
1119 XSync(buf->priv.x11.xlib.disp, False);
1120 }
1121}
1122
1123Eina_Bool
1124evas_software_xlib_outbuf_alpha_get(Outbuf *buf)
1125{
1126 return buf->priv.x11.xlib.mask;
1127}
1128
1129#ifdef EVAS_FRAME_QUEUING
1130void
1131evas_software_xlib_outbuf_set_priv(Outbuf *buf, void *cur, void *prev __UNUSED__)
1132{
1133 buf->priv.pending_writes = (Eina_List *)cur;
1134}
1135#endif
diff --git a/libraries/evas/src/modules/engines/software_x11/evas_xlib_outbuf.h b/libraries/evas/src/modules/engines/software_x11/evas_xlib_outbuf.h
new file mode 100644
index 0000000..d70eb8d
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_x11/evas_xlib_outbuf.h
@@ -0,0 +1,92 @@
1#ifndef EVAS_XLIB_OUTBUF_H
2#define EVAS_XLIB_OUTBUF_H
3
4
5#include "evas_engine.h"
6
7
8void evas_software_xlib_outbuf_init (void);
9
10void evas_software_xlib_outbuf_free (Outbuf *buf);
11
12Outbuf *evas_software_xlib_outbuf_setup_x (int w,
13 int h,
14 int rot,
15 Outbuf_Depth depth,
16 Display *disp,
17 Drawable draw,
18 Visual *vis,
19 Colormap cmap,
20 int x_depth,
21 int grayscale,
22 int max_colors,
23 Pixmap mask,
24 int shape_dither,
25 int destination_alpha);
26
27
28RGBA_Image *evas_software_xlib_outbuf_new_region_for_update (Outbuf *buf,
29 int x,
30 int y,
31 int w,
32 int h,
33 int *cx,
34 int *cy,
35 int *cw,
36 int *ch);
37
38void evas_software_xlib_outbuf_free_region_for_update (Outbuf *buf,
39 RGBA_Image *update);
40
41void evas_software_xlib_outbuf_flush (Outbuf *buf);
42
43void evas_software_xlib_outbuf_idle_flush (Outbuf *buf);
44
45void evas_software_xlib_outbuf_push_updated_region (Outbuf *buf,
46 RGBA_Image *update,
47 int x,
48 int y,
49 int w,
50 int h);
51
52void evas_software_xlib_outbuf_reconfigure (Outbuf *buf,
53 int w,
54 int h,
55 int rot,
56 Outbuf_Depth depth);
57
58int evas_software_xlib_outbuf_get_width (Outbuf *buf);
59
60int evas_software_xlib_outbuf_get_height (Outbuf *buf);
61
62Outbuf_Depth evas_software_xlib_outbuf_get_depth (Outbuf *buf);
63
64int evas_software_xlib_outbuf_get_rot (Outbuf *buf);
65
66void evas_software_xlib_outbuf_drawable_set (Outbuf *buf,
67 Drawable draw);
68
69void evas_software_xlib_outbuf_mask_set (Outbuf *buf,
70 Pixmap mask);
71
72void evas_software_xlib_outbuf_rotation_set (Outbuf *buf,
73 int rot);
74
75void evas_software_xlib_outbuf_debug_set (Outbuf *buf,
76 int debug);
77
78void evas_software_xlib_outbuf_debug_show (Outbuf *buf,
79 Drawable draw,
80 int x,
81 int y,
82 int w,
83 int h);
84
85Eina_Bool evas_software_xlib_outbuf_alpha_get (Outbuf *buf);
86#ifdef EVAS_FRAME_QUEUING
87void evas_software_xlib_outbuf_set_priv (Outbuf *buf,
88 void *cur,
89 void *prev);
90#endif
91
92#endif