aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/evas/src/lib/engines/common_16
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/lib/engines/common_16
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 'libraries/evas/src/lib/engines/common_16')
-rw-r--r--libraries/evas/src/lib/engines/common_16/Makefile.am32
-rw-r--r--libraries/evas/src/lib/engines/common_16/Makefile.in698
-rw-r--r--libraries/evas/src/lib/engines/common_16/evas_soft16_dither_mask.c293
-rw-r--r--libraries/evas/src/lib/engines/common_16/evas_soft16_font.c295
-rw-r--r--libraries/evas/src/lib/engines/common_16/evas_soft16_image_scaled_sampled.c471
-rw-r--r--libraries/evas/src/lib/engines/common_16/evas_soft16_image_unscaled.c287
-rw-r--r--libraries/evas/src/lib/engines/common_16/evas_soft16_line.c444
-rw-r--r--libraries/evas/src/lib/engines/common_16/evas_soft16_main.c594
-rw-r--r--libraries/evas/src/lib/engines/common_16/evas_soft16_point_blend.c149
-rw-r--r--libraries/evas/src/lib/engines/common_16/evas_soft16_polygon.c231
-rw-r--r--libraries/evas/src/lib/engines/common_16/evas_soft16_rectangle.c121
-rw-r--r--libraries/evas/src/lib/engines/common_16/evas_soft16_scanline_blend.c353
-rw-r--r--libraries/evas/src/lib/engines/common_16/evas_soft16_scanline_fill.c86
13 files changed, 4054 insertions, 0 deletions
diff --git a/libraries/evas/src/lib/engines/common_16/Makefile.am b/libraries/evas/src/lib/engines/common_16/Makefile.am
new file mode 100644
index 0000000..ef2ab30
--- /dev/null
+++ b/libraries/evas/src/lib/engines/common_16/Makefile.am
@@ -0,0 +1,32 @@
1
2MAINTAINERCLEANFILES = Makefile.in
3
4AM_CPPFLAGS = \
5-I. \
6-I$(top_srcdir)/src/lib \
7-I$(top_srcdir)/src/lib/include \
8@FREETYPE_CFLAGS@ \
9@PIXMAN_CFLAGS@ \
10@VALGRIND_CFLAGS@ \
11@EINA_CFLAGS@ \
12@EET_CFLAGS@ \
13@pthread_cflags@
14
15noinst_LTLIBRARIES = libevas_engine_common_16.la
16
17libevas_engine_common_16_la_SOURCES = \
18evas_soft16_dither_mask.c \
19evas_soft16_font.c \
20evas_soft16_image_scaled_sampled.c \
21evas_soft16_image_unscaled.c \
22evas_soft16_main.c \
23evas_soft16_rectangle.c \
24evas_soft16_line.c \
25evas_soft16_polygon.c
26
27libevas_engine_common_16_la_DEPENDENCIES = $(top_builddir)/config.h
28
29EXTRA_DIST = \
30evas_soft16_point_blend.c \
31evas_soft16_scanline_blend.c \
32evas_soft16_scanline_fill.c
diff --git a/libraries/evas/src/lib/engines/common_16/Makefile.in b/libraries/evas/src/lib/engines/common_16/Makefile.in
new file mode 100644
index 0000000..9097a8d
--- /dev/null
+++ b/libraries/evas/src/lib/engines/common_16/Makefile.in
@@ -0,0 +1,698 @@
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
18VPATH = @srcdir@
19pkgdatadir = $(datadir)/@PACKAGE@
20pkgincludedir = $(includedir)/@PACKAGE@
21pkglibdir = $(libdir)/@PACKAGE@
22pkglibexecdir = $(libexecdir)/@PACKAGE@
23am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
24install_sh_DATA = $(install_sh) -c -m 644
25install_sh_PROGRAM = $(install_sh) -c
26install_sh_SCRIPT = $(install_sh) -c
27INSTALL_HEADER = $(INSTALL_DATA)
28transform = $(program_transform_name)
29NORMAL_INSTALL = :
30PRE_INSTALL = :
31POST_INSTALL = :
32NORMAL_UNINSTALL = :
33PRE_UNINSTALL = :
34POST_UNINSTALL = :
35build_triplet = @build@
36host_triplet = @host@
37subdir = src/lib/engines/common_16
38DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
39ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
40am__aclocal_m4_deps = $(top_srcdir)/m4/efl_attribute.m4 \
41 $(top_srcdir)/m4/efl_coverage.m4 \
42 $(top_srcdir)/m4/efl_doxygen.m4 \
43 $(top_srcdir)/m4/efl_fnmatch.m4 \
44 $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \
45 $(top_srcdir)/m4/evas_check_engine.m4 \
46 $(top_srcdir)/m4/evas_check_loader.m4 \
47 $(top_srcdir)/m4/evas_converter.m4 \
48 $(top_srcdir)/m4/evas_dither.m4 \
49 $(top_srcdir)/m4/evas_scaler.m4 $(top_srcdir)/m4/libtool.m4 \
50 $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
51 $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
52 $(top_srcdir)/configure.ac
53am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
54 $(ACLOCAL_M4)
55mkinstalldirs = $(install_sh) -d
56CONFIG_HEADER = $(top_builddir)/config.h
57CONFIG_CLEAN_FILES =
58CONFIG_CLEAN_VPATH_FILES =
59LTLIBRARIES = $(noinst_LTLIBRARIES)
60libevas_engine_common_16_la_LIBADD =
61am_libevas_engine_common_16_la_OBJECTS = evas_soft16_dither_mask.lo \
62 evas_soft16_font.lo evas_soft16_image_scaled_sampled.lo \
63 evas_soft16_image_unscaled.lo evas_soft16_main.lo \
64 evas_soft16_rectangle.lo evas_soft16_line.lo \
65 evas_soft16_polygon.lo
66libevas_engine_common_16_la_OBJECTS = \
67 $(am_libevas_engine_common_16_la_OBJECTS)
68AM_V_lt = $(am__v_lt_$(V))
69am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
70am__v_lt_0 = --silent
71DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
72depcomp = $(SHELL) $(top_srcdir)/depcomp
73am__depfiles_maybe = depfiles
74am__mv = mv -f
75COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
76 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
77LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
78 $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
79 $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
80 $(AM_CFLAGS) $(CFLAGS)
81AM_V_CC = $(am__v_CC_$(V))
82am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
83am__v_CC_0 = @echo " CC " $@;
84AM_V_at = $(am__v_at_$(V))
85am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
86am__v_at_0 = @
87CCLD = $(CC)
88LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
89 $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
90 $(AM_LDFLAGS) $(LDFLAGS) -o $@
91AM_V_CCLD = $(am__v_CCLD_$(V))
92am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
93am__v_CCLD_0 = @echo " CCLD " $@;
94AM_V_GEN = $(am__v_GEN_$(V))
95am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
96am__v_GEN_0 = @echo " GEN " $@;
97SOURCES = $(libevas_engine_common_16_la_SOURCES)
98DIST_SOURCES = $(libevas_engine_common_16_la_SOURCES)
99ETAGS = etags
100CTAGS = ctags
101DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
102ACLOCAL = @ACLOCAL@
103ALLOCA = @ALLOCA@
104AMTAR = @AMTAR@
105AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
106AR = @AR@
107AS = @AS@
108AUTOCONF = @AUTOCONF@
109AUTOHEADER = @AUTOHEADER@
110AUTOMAKE = @AUTOMAKE@
111AWK = @AWK@
112CC = @CC@
113CCDEPMODE = @CCDEPMODE@
114CFLAGS = @CFLAGS@
115CHECK_CFLAGS = @CHECK_CFLAGS@
116CHECK_LIBS = @CHECK_LIBS@
117CPP = @CPP@
118CPPFLAGS = @CPPFLAGS@
119CXX = @CXX@
120CXXCPP = @CXXCPP@
121CXXDEPMODE = @CXXDEPMODE@
122CXXFLAGS = @CXXFLAGS@
123CYGPATH_W = @CYGPATH_W@
124DEFS = @DEFS@
125DEPDIR = @DEPDIR@
126DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
127DIRECTFB_LIBS = @DIRECTFB_LIBS@
128DLLTOOL = @DLLTOOL@
129DSYMUTIL = @DSYMUTIL@
130DUMPBIN = @DUMPBIN@
131ECHO_C = @ECHO_C@
132ECHO_N = @ECHO_N@
133ECHO_T = @ECHO_T@
134ECORE_EVAS_CFLAGS = @ECORE_EVAS_CFLAGS@
135ECORE_EVAS_LIBS = @ECORE_EVAS_LIBS@
136EDB_CFLAGS = @EDB_CFLAGS@
137EDB_LIBS = @EDB_LIBS@
138EDJE_CFLAGS = @EDJE_CFLAGS@
139EDJE_LIBS = @EDJE_LIBS@
140EET_CFLAGS = @EET_CFLAGS@
141EET_LIBS = @EET_LIBS@
142EFL_COVERAGE_CFLAGS = @EFL_COVERAGE_CFLAGS@
143EFL_COVERAGE_LIBS = @EFL_COVERAGE_LIBS@
144EFL_FNMATCH_LIBS = @EFL_FNMATCH_LIBS@
145EGREP = @EGREP@
146EINA_CFLAGS = @EINA_CFLAGS@
147EINA_LIBS = @EINA_LIBS@
148EVAS_CFLAGS = @EVAS_CFLAGS@
149EVAS_LIBS = @EVAS_LIBS@
150EVAS_SSE3_CFLAGS = @EVAS_SSE3_CFLAGS@
151EVIL_CFLAGS = @EVIL_CFLAGS@
152EVIL_LIBS = @EVIL_LIBS@
153EXEEXT = @EXEEXT@
154FGREP = @FGREP@
155FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
156FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
157FREETYPE_CFLAGS = @FREETYPE_CFLAGS@
158FREETYPE_LIBS = @FREETYPE_LIBS@
159FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@
160FRIBIDI_LIBS = @FRIBIDI_LIBS@
161GL_EET_CFLAGS = @GL_EET_CFLAGS@
162GL_EET_LIBS = @GL_EET_LIBS@
163GREP = @GREP@
164HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@
165HARFBUZZ_LIBS = @HARFBUZZ_LIBS@
166INSTALL = @INSTALL@
167INSTALL_DATA = @INSTALL_DATA@
168INSTALL_PROGRAM = @INSTALL_PROGRAM@
169INSTALL_SCRIPT = @INSTALL_SCRIPT@
170INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
171LD = @LD@
172LDFLAGS = @LDFLAGS@
173LIBOBJS = @LIBOBJS@
174LIBS = @LIBS@
175LIBTOOL = @LIBTOOL@
176LINEBREAK_CFLAGS = @LINEBREAK_CFLAGS@
177LINEBREAK_LIBS = @LINEBREAK_LIBS@
178LIPO = @LIPO@
179LN_S = @LN_S@
180LTLIBOBJS = @LTLIBOBJS@
181MAKEINFO = @MAKEINFO@
182MKDIR_P = @MKDIR_P@
183MODULE_ARCH = @MODULE_ARCH@
184NM = @NM@
185NMEDIT = @NMEDIT@
186OBJC = @OBJC@
187OBJCDEPMODE = @OBJCDEPMODE@
188OBJCFLAGS = @OBJCFLAGS@
189OBJDUMP = @OBJDUMP@
190OBJEXT = @OBJEXT@
191OTOOL = @OTOOL@
192OTOOL64 = @OTOOL64@
193PACKAGE = @PACKAGE@
194PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
195PACKAGE_NAME = @PACKAGE_NAME@
196PACKAGE_STRING = @PACKAGE_STRING@
197PACKAGE_TARNAME = @PACKAGE_TARNAME@
198PACKAGE_URL = @PACKAGE_URL@
199PACKAGE_VERSION = @PACKAGE_VERSION@
200PATH_SEPARATOR = @PATH_SEPARATOR@
201PIXMAN_CFLAGS = @PIXMAN_CFLAGS@
202PIXMAN_LIBS = @PIXMAN_LIBS@
203PKG_CONFIG = @PKG_CONFIG@
204PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
205PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
206PNG_CFLAGS = @PNG_CFLAGS@
207PNG_LIBS = @PNG_LIBS@
208RANLIB = @RANLIB@
209SDL_CFLAGS = @SDL_CFLAGS@
210SDL_LIBS = @SDL_LIBS@
211SED = @SED@
212SET_MAKE = @SET_MAKE@
213SHELL = @SHELL@
214SHM_OPEN_LINK = @SHM_OPEN_LINK@
215STRIP = @STRIP@
216SVG_CFLAGS = @SVG_CFLAGS@
217SVG_LIBS = @SVG_LIBS@
218VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
219VALGRIND_LIBS = @VALGRIND_LIBS@
220VERSION = @VERSION@
221VMAJ = @VMAJ@
222WIN32_CFLAGS = @WIN32_CFLAGS@
223WIN32_CPPFLAGS = @WIN32_CPPFLAGS@
224XCB_CFLAGS = @XCB_CFLAGS@
225XCB_GL_CFLAGS = @XCB_GL_CFLAGS@
226XCB_GL_LIBS = @XCB_GL_LIBS@
227XCB_LIBS = @XCB_LIBS@
228XEXT_CFLAGS = @XEXT_CFLAGS@
229XEXT_LIBS = @XEXT_LIBS@
230XMKMF = @XMKMF@
231X_CFLAGS = @X_CFLAGS@
232X_EXTRA_LIBS = @X_EXTRA_LIBS@
233X_LIBS = @X_LIBS@
234X_PRE_LIBS = @X_PRE_LIBS@
235abs_builddir = @abs_builddir@
236abs_srcdir = @abs_srcdir@
237abs_top_builddir = @abs_top_builddir@
238abs_top_srcdir = @abs_top_srcdir@
239ac_ct_CC = @ac_ct_CC@
240ac_ct_CXX = @ac_ct_CXX@
241ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
242ac_ct_OBJC = @ac_ct_OBJC@
243altivec_cflags = @altivec_cflags@
244am__include = @am__include@
245am__leading_dot = @am__leading_dot@
246am__quote = @am__quote@
247am__tar = @am__tar@
248am__untar = @am__untar@
249bindir = @bindir@
250build = @build@
251build_alias = @build_alias@
252build_cpu = @build_cpu@
253build_os = @build_os@
254build_vendor = @build_vendor@
255builddir = @builddir@
256datadir = @datadir@
257datarootdir = @datarootdir@
258dlopen_libs = @dlopen_libs@
259docdir = @docdir@
260dvidir = @dvidir@
261edje_cc = @edje_cc@
262efl_doxygen = @efl_doxygen@
263efl_have_doxygen = @efl_have_doxygen@
264evas_engine_buffer_cflags = @evas_engine_buffer_cflags@
265evas_engine_buffer_libs = @evas_engine_buffer_libs@
266evas_engine_direct3d_cflags = @evas_engine_direct3d_cflags@
267evas_engine_direct3d_libs = @evas_engine_direct3d_libs@
268evas_engine_directfb_cflags = @evas_engine_directfb_cflags@
269evas_engine_directfb_libs = @evas_engine_directfb_libs@
270evas_engine_fb_cflags = @evas_engine_fb_cflags@
271evas_engine_fb_libs = @evas_engine_fb_libs@
272evas_engine_gl_cocoa_cflags = @evas_engine_gl_cocoa_cflags@
273evas_engine_gl_cocoa_libs = @evas_engine_gl_cocoa_libs@
274evas_engine_gl_common_libs = @evas_engine_gl_common_libs@
275evas_engine_gl_sdl_cflags = @evas_engine_gl_sdl_cflags@
276evas_engine_gl_sdl_libs = @evas_engine_gl_sdl_libs@
277evas_engine_gl_xcb_cflags = @evas_engine_gl_xcb_cflags@
278evas_engine_gl_xcb_libs = @evas_engine_gl_xcb_libs@
279evas_engine_gl_xlib_cflags = @evas_engine_gl_xlib_cflags@
280evas_engine_gl_xlib_libs = @evas_engine_gl_xlib_libs@
281evas_engine_psl1ght_cflags = @evas_engine_psl1ght_cflags@
282evas_engine_psl1ght_libs = @evas_engine_psl1ght_libs@
283evas_engine_software_16_ddraw_cflags = @evas_engine_software_16_ddraw_cflags@
284evas_engine_software_16_ddraw_libs = @evas_engine_software_16_ddraw_libs@
285evas_engine_software_16_sdl_cflags = @evas_engine_software_16_sdl_cflags@
286evas_engine_software_16_sdl_libs = @evas_engine_software_16_sdl_libs@
287evas_engine_software_16_wince_cflags = @evas_engine_software_16_wince_cflags@
288evas_engine_software_16_wince_libs = @evas_engine_software_16_wince_libs@
289evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@
290evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@
291evas_engine_software_8_x11_cflags = @evas_engine_software_8_x11_cflags@
292evas_engine_software_8_x11_libs = @evas_engine_software_8_x11_libs@
293evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@
294evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@
295evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@
296evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@
297evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@
298evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@
299evas_engine_software_xcb_cflags = @evas_engine_software_xcb_cflags@
300evas_engine_software_xcb_libs = @evas_engine_software_xcb_libs@
301evas_engine_software_xlib_cflags = @evas_engine_software_xlib_cflags@
302evas_engine_software_xlib_libs = @evas_engine_software_xlib_libs@
303evas_image_loader_bmp_cflags = @evas_image_loader_bmp_cflags@
304evas_image_loader_bmp_libs = @evas_image_loader_bmp_libs@
305evas_image_loader_edb_cflags = @evas_image_loader_edb_cflags@
306evas_image_loader_edb_libs = @evas_image_loader_edb_libs@
307evas_image_loader_eet_cflags = @evas_image_loader_eet_cflags@
308evas_image_loader_eet_libs = @evas_image_loader_eet_libs@
309evas_image_loader_generic_cflags = @evas_image_loader_generic_cflags@
310evas_image_loader_generic_libs = @evas_image_loader_generic_libs@
311evas_image_loader_gif_cflags = @evas_image_loader_gif_cflags@
312evas_image_loader_gif_libs = @evas_image_loader_gif_libs@
313evas_image_loader_ico_cflags = @evas_image_loader_ico_cflags@
314evas_image_loader_ico_libs = @evas_image_loader_ico_libs@
315evas_image_loader_jpeg_cflags = @evas_image_loader_jpeg_cflags@
316evas_image_loader_jpeg_libs = @evas_image_loader_jpeg_libs@
317evas_image_loader_pmaps_cflags = @evas_image_loader_pmaps_cflags@
318evas_image_loader_pmaps_libs = @evas_image_loader_pmaps_libs@
319evas_image_loader_png_cflags = @evas_image_loader_png_cflags@
320evas_image_loader_png_libs = @evas_image_loader_png_libs@
321evas_image_loader_psd_cflags = @evas_image_loader_psd_cflags@
322evas_image_loader_psd_libs = @evas_image_loader_psd_libs@
323evas_image_loader_svg_cflags = @evas_image_loader_svg_cflags@
324evas_image_loader_svg_libs = @evas_image_loader_svg_libs@
325evas_image_loader_tga_cflags = @evas_image_loader_tga_cflags@
326evas_image_loader_tga_libs = @evas_image_loader_tga_libs@
327evas_image_loader_tiff_cflags = @evas_image_loader_tiff_cflags@
328evas_image_loader_tiff_libs = @evas_image_loader_tiff_libs@
329evas_image_loader_wbmp_cflags = @evas_image_loader_wbmp_cflags@
330evas_image_loader_wbmp_libs = @evas_image_loader_wbmp_libs@
331evas_image_loader_xpm_cflags = @evas_image_loader_xpm_cflags@
332evas_image_loader_xpm_libs = @evas_image_loader_xpm_libs@
333exec_prefix = @exec_prefix@
334have_evas_engine_gl_x11 = @have_evas_engine_gl_x11@
335have_evas_engine_gl_xcb = @have_evas_engine_gl_xcb@
336have_evas_engine_gl_xlib = @have_evas_engine_gl_xlib@
337have_evas_engine_software_x11 = @have_evas_engine_software_x11@
338have_evas_engine_software_xcb = @have_evas_engine_software_xcb@
339have_evas_engine_software_xlib = @have_evas_engine_software_xlib@
340have_lcov = @have_lcov@
341host = @host@
342host_alias = @host_alias@
343host_cpu = @host_cpu@
344host_os = @host_os@
345host_vendor = @host_vendor@
346htmldir = @htmldir@
347includedir = @includedir@
348infodir = @infodir@
349install_sh = @install_sh@
350libdir = @libdir@
351libexecdir = @libexecdir@
352localedir = @localedir@
353localstatedir = @localstatedir@
354lt_ECHO = @lt_ECHO@
355lt_enable_auto_import = @lt_enable_auto_import@
356mandir = @mandir@
357mkdir_p = @mkdir_p@
358oldincludedir = @oldincludedir@
359pdfdir = @pdfdir@
360pkgconfig_requires_private = @pkgconfig_requires_private@
361prefix = @prefix@
362program_transform_name = @program_transform_name@
363psdir = @psdir@
364pthread_cflags = @pthread_cflags@
365pthread_libs = @pthread_libs@
366release_info = @release_info@
367requirement_evas = @requirement_evas@
368sbindir = @sbindir@
369sharedstatedir = @sharedstatedir@
370srcdir = @srcdir@
371sysconfdir = @sysconfdir@
372target_alias = @target_alias@
373top_build_prefix = @top_build_prefix@
374top_builddir = @top_builddir@
375top_srcdir = @top_srcdir@
376version_info = @version_info@
377MAINTAINERCLEANFILES = Makefile.in
378AM_CPPFLAGS = \
379-I. \
380-I$(top_srcdir)/src/lib \
381-I$(top_srcdir)/src/lib/include \
382@FREETYPE_CFLAGS@ \
383@PIXMAN_CFLAGS@ \
384@VALGRIND_CFLAGS@ \
385@EINA_CFLAGS@ \
386@EET_CFLAGS@ \
387@pthread_cflags@
388
389noinst_LTLIBRARIES = libevas_engine_common_16.la
390libevas_engine_common_16_la_SOURCES = \
391evas_soft16_dither_mask.c \
392evas_soft16_font.c \
393evas_soft16_image_scaled_sampled.c \
394evas_soft16_image_unscaled.c \
395evas_soft16_main.c \
396evas_soft16_rectangle.c \
397evas_soft16_line.c \
398evas_soft16_polygon.c
399
400libevas_engine_common_16_la_DEPENDENCIES = $(top_builddir)/config.h
401EXTRA_DIST = \
402evas_soft16_point_blend.c \
403evas_soft16_scanline_blend.c \
404evas_soft16_scanline_fill.c
405
406all: all-am
407
408.SUFFIXES:
409.SUFFIXES: .c .lo .o .obj
410$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
411 @for dep in $?; do \
412 case '$(am__configure_deps)' in \
413 *$$dep*) \
414 ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
415 && { if test -f $@; then exit 0; else break; fi; }; \
416 exit 1;; \
417 esac; \
418 done; \
419 echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/engines/common_16/Makefile'; \
420 $(am__cd) $(top_srcdir) && \
421 $(AUTOMAKE) --gnu src/lib/engines/common_16/Makefile
422.PRECIOUS: Makefile
423Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
424 @case '$?' in \
425 *config.status*) \
426 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
427 *) \
428 echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
429 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
430 esac;
431
432$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
433 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
434
435$(top_srcdir)/configure: $(am__configure_deps)
436 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
437$(ACLOCAL_M4): $(am__aclocal_m4_deps)
438 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
439$(am__aclocal_m4_deps):
440
441clean-noinstLTLIBRARIES:
442 -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
443 @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
444 dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
445 test "$$dir" != "$$p" || dir=.; \
446 echo "rm -f \"$${dir}/so_locations\""; \
447 rm -f "$${dir}/so_locations"; \
448 done
449libevas_engine_common_16.la: $(libevas_engine_common_16_la_OBJECTS) $(libevas_engine_common_16_la_DEPENDENCIES)
450 $(AM_V_CCLD)$(LINK) $(libevas_engine_common_16_la_OBJECTS) $(libevas_engine_common_16_la_LIBADD) $(LIBS)
451
452mostlyclean-compile:
453 -rm -f *.$(OBJEXT)
454
455distclean-compile:
456 -rm -f *.tab.c
457
458@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_soft16_dither_mask.Plo@am__quote@
459@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_soft16_font.Plo@am__quote@
460@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_soft16_image_scaled_sampled.Plo@am__quote@
461@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_soft16_image_unscaled.Plo@am__quote@
462@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_soft16_line.Plo@am__quote@
463@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_soft16_main.Plo@am__quote@
464@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_soft16_polygon.Plo@am__quote@
465@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_soft16_rectangle.Plo@am__quote@
466
467.c.o:
468@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
469@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
470@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
471@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
472@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
473@am__fastdepCC_FALSE@ $(COMPILE) -c $<
474
475.c.obj:
476@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
477@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
478@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
479@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
480@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
481@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
482
483.c.lo:
484@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
485@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
486@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
487@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
488@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
489@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
490
491mostlyclean-libtool:
492 -rm -f *.lo
493
494clean-libtool:
495 -rm -rf .libs _libs
496
497ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
498 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
499 unique=`for i in $$list; do \
500 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
501 done | \
502 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
503 END { if (nonempty) { for (i in files) print i; }; }'`; \
504 mkid -fID $$unique
505tags: TAGS
506
507TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
508 $(TAGS_FILES) $(LISP)
509 set x; \
510 here=`pwd`; \
511 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
512 unique=`for i in $$list; do \
513 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
514 done | \
515 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
516 END { if (nonempty) { for (i in files) print i; }; }'`; \
517 shift; \
518 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
519 test -n "$$unique" || unique=$$empty_fix; \
520 if test $$# -gt 0; then \
521 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
522 "$$@" $$unique; \
523 else \
524 $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
525 $$unique; \
526 fi; \
527 fi
528ctags: CTAGS
529CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
530 $(TAGS_FILES) $(LISP)
531 list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
532 unique=`for i in $$list; do \
533 if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
534 done | \
535 $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
536 END { if (nonempty) { for (i in files) print i; }; }'`; \
537 test -z "$(CTAGS_ARGS)$$unique" \
538 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
539 $$unique
540
541GTAGS:
542 here=`$(am__cd) $(top_builddir) && pwd` \
543 && $(am__cd) $(top_srcdir) \
544 && gtags -i $(GTAGS_ARGS) "$$here"
545
546distclean-tags:
547 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
548
549distdir: $(DISTFILES)
550 @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
551 topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
552 list='$(DISTFILES)'; \
553 dist_files=`for file in $$list; do echo $$file; done | \
554 sed -e "s|^$$srcdirstrip/||;t" \
555 -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
556 case $$dist_files in \
557 */*) $(MKDIR_P) `echo "$$dist_files" | \
558 sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
559 sort -u` ;; \
560 esac; \
561 for file in $$dist_files; do \
562 if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
563 if test -d $$d/$$file; then \
564 dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
565 if test -d "$(distdir)/$$file"; then \
566 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
567 fi; \
568 if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
569 cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
570 find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
571 fi; \
572 cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
573 else \
574 test -f "$(distdir)/$$file" \
575 || cp -p $$d/$$file "$(distdir)/$$file" \
576 || exit 1; \
577 fi; \
578 done
579check-am: all-am
580check: check-am
581all-am: Makefile $(LTLIBRARIES)
582installdirs:
583install: install-am
584install-exec: install-exec-am
585install-data: install-data-am
586uninstall: uninstall-am
587
588install-am: all-am
589 @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
590
591installcheck: installcheck-am
592install-strip:
593 $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
594 install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
595 `test -z '$(STRIP)' || \
596 echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
597mostlyclean-generic:
598
599clean-generic:
600
601distclean-generic:
602 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
603 -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
604
605maintainer-clean-generic:
606 @echo "This command is intended for maintainers to use"
607 @echo "it deletes files that may require special tools to rebuild."
608 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
609clean: clean-am
610
611clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
612 mostlyclean-am
613
614distclean: distclean-am
615 -rm -rf ./$(DEPDIR)
616 -rm -f Makefile
617distclean-am: clean-am distclean-compile distclean-generic \
618 distclean-tags
619
620dvi: dvi-am
621
622dvi-am:
623
624html: html-am
625
626html-am:
627
628info: info-am
629
630info-am:
631
632install-data-am:
633
634install-dvi: install-dvi-am
635
636install-dvi-am:
637
638install-exec-am:
639
640install-html: install-html-am
641
642install-html-am:
643
644install-info: install-info-am
645
646install-info-am:
647
648install-man:
649
650install-pdf: install-pdf-am
651
652install-pdf-am:
653
654install-ps: install-ps-am
655
656install-ps-am:
657
658installcheck-am:
659
660maintainer-clean: maintainer-clean-am
661 -rm -rf ./$(DEPDIR)
662 -rm -f Makefile
663maintainer-clean-am: distclean-am maintainer-clean-generic
664
665mostlyclean: mostlyclean-am
666
667mostlyclean-am: mostlyclean-compile mostlyclean-generic \
668 mostlyclean-libtool
669
670pdf: pdf-am
671
672pdf-am:
673
674ps: ps-am
675
676ps-am:
677
678uninstall-am:
679
680.MAKE: install-am install-strip
681
682.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
683 clean-libtool clean-noinstLTLIBRARIES ctags distclean \
684 distclean-compile distclean-generic distclean-libtool \
685 distclean-tags distdir dvi dvi-am html html-am info info-am \
686 install install-am install-data install-data-am install-dvi \
687 install-dvi-am install-exec install-exec-am install-html \
688 install-html-am install-info install-info-am install-man \
689 install-pdf install-pdf-am install-ps install-ps-am \
690 install-strip installcheck installcheck-am installdirs \
691 maintainer-clean maintainer-clean-generic mostlyclean \
692 mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
693 pdf pdf-am ps ps-am tags uninstall uninstall-am
694
695
696# Tell versions [3.59,3.63) of GNU make to not export all variables.
697# Otherwise a system limit (for SysV at least) may be exceeded.
698.NOEXPORT:
diff --git a/libraries/evas/src/lib/engines/common_16/evas_soft16_dither_mask.c b/libraries/evas/src/lib/engines/common_16/evas_soft16_dither_mask.c
new file mode 100644
index 0000000..566efac
--- /dev/null
+++ b/libraries/evas/src/lib/engines/common_16/evas_soft16_dither_mask.c
@@ -0,0 +1,293 @@
1#include "evas_common_soft16.h"
2
3#define S16_DM_SIZE 128
4#define S16_DM_BITS 6
5#define S16_DM_DIV 64
6#define S16_DM_MSK (S16_DM_SIZE - 1)
7#define S16_DM_SHF(_b) (S16_DM_BITS - (8 - _b))
8
9static const DATA8 dither_table[S16_DM_SIZE][S16_DM_SIZE] =
10{
11 { 0, 41, 23, 5, 17, 39, 7, 15, 62, 23, 40, 51, 31, 47, 9, 32, 52, 27, 57, 25, 6, 61, 27, 52, 37, 7, 40, 63, 18, 36, 10, 42, 25, 62, 45, 34, 20, 42, 37, 14, 35, 29, 50, 10, 61, 2, 40, 8, 37, 12, 58, 22, 5, 41, 10, 39, 0, 60, 11, 46, 2, 55, 38, 17, 36, 59, 13, 54, 37, 56, 8, 29, 16, 13, 63, 22, 41, 55, 7, 20, 49, 14, 23, 55, 37, 23, 19, 36, 15, 49, 23, 63, 30, 14, 38, 27, 53, 13, 22, 41, 19, 31, 7, 19, 50, 30, 49, 16, 3, 32, 56, 40, 29, 34, 8, 48, 19, 45, 4, 51, 12, 46, 35, 49, 16, 42, 12, 62 },
12 { 30, 57, 36, 54, 47, 34, 52, 27, 43, 4, 28, 7, 17, 36, 62, 13, 44, 7, 18, 48, 33, 21, 44, 14, 30, 47, 12, 33, 5, 55, 31, 58, 13, 30, 4, 17, 52, 10, 60, 26, 46, 0, 39, 27, 42, 22, 47, 25, 60, 32, 9, 38, 48, 17, 59, 30, 49, 18, 34, 25, 51, 19, 5, 48, 21, 8, 28, 46, 1, 32, 41, 19, 54, 47, 37, 18, 28, 11, 44, 30, 39, 56, 2, 33, 8, 42, 61, 28, 58, 8, 46, 9, 41, 4, 58, 7, 21, 48, 59, 10, 52, 14, 42, 57, 12, 25, 7, 53, 42, 24, 11, 50, 17, 59, 42, 2, 36, 60, 32, 17, 63, 29, 21, 7, 59, 32, 24, 39 },
13 { 22, 8, 16, 32, 3, 25, 13, 57, 18, 45, 58, 39, 55, 20, 5, 42, 23, 34, 63, 1, 51, 10, 58, 4, 60, 23, 53, 27, 44, 21, 3, 48, 8, 50, 43, 54, 27, 32, 5, 55, 21, 58, 12, 53, 6, 36, 14, 50, 17, 29, 53, 15, 24, 52, 7, 36, 13, 42, 4, 53, 9, 35, 61, 26, 56, 32, 49, 15, 62, 23, 6, 60, 2, 31, 4, 48, 58, 38, 15, 61, 5, 25, 47, 28, 50, 15, 7, 40, 3, 32, 33, 52, 25, 50, 35, 42, 61, 3, 28, 36, 23, 63, 4, 33, 46, 62, 36, 23, 60, 6, 54, 28, 4, 37, 23, 55, 25, 8, 42, 54, 14, 6, 56, 38, 19, 52, 4, 46 },
14 { 48, 53, 43, 12, 45, 63, 30, 37, 9, 34, 21, 1, 25, 47, 29, 58, 3, 54, 15, 39, 29, 17, 38, 35, 20, 43, 1, 49, 15, 59, 29, 39, 22, 35, 16, 23, 1, 47, 39, 18, 8, 44, 25, 31, 57, 19, 63, 4, 45, 3, 42, 61, 1, 31, 45, 20, 57, 29, 62, 21, 32, 41, 14, 44, 3, 39, 5, 34, 10, 43, 51, 35, 23, 52, 40, 10, 21, 1, 53, 18, 51, 43, 12, 62, 18, 54, 26, 51, 20, 57, 14, 1, 62, 16, 11, 18, 32, 39, 17, 44, 1, 48, 26, 37, 18, 2, 51, 14, 28, 45, 35, 18, 57, 13, 47, 11, 51, 20, 2, 39, 31, 47, 25, 1, 50, 11, 60, 7 },
15 { 18, 28, 1, 56, 21, 10, 51, 2, 46, 54, 14, 61, 11, 50, 13, 38, 19, 31, 45, 9, 55, 24, 47, 5, 54, 9, 62, 11, 35, 8, 51, 14, 57, 6, 63, 40, 58, 14, 51, 28, 62, 34, 15, 48, 1, 41, 30, 35, 55, 21, 34, 11, 49, 37, 8, 52, 4, 23, 15, 43, 1, 58, 11, 23, 53, 16, 55, 26, 58, 18, 27, 12, 45, 14, 25, 63, 42, 33, 27, 35, 9, 31, 21, 38, 1, 44, 34, 12, 48, 38, 21, 44, 29, 47, 26, 53, 1, 46, 54, 8, 59, 29, 11, 55, 22, 41, 33, 20, 39, 1, 48, 9, 44, 32, 5, 62, 29, 44, 57, 23, 10, 58, 34, 43, 15, 37, 26, 33 },
16 { 51, 38, 59, 24, 35, 42, 19, 60, 5, 32, 41, 26, 43, 33, 7, 53, 48, 11, 59, 23, 42, 2, 61, 30, 16, 40, 32, 24, 56, 41, 19, 33, 37, 26, 47, 9, 31, 22, 2, 45, 9, 54, 4, 37, 21, 52, 11, 23, 7, 57, 16, 25, 55, 18, 63, 27, 46, 39, 56, 10, 50, 37, 29, 47, 19, 63, 24, 9, 46, 2, 39, 60, 9, 57, 30, 7, 49, 11, 59, 3, 45, 57, 5, 60, 29, 22, 5, 60, 30, 9, 59, 18, 40, 6, 57, 36, 30, 12, 24, 34, 15, 40, 52, 6, 49, 9, 58, 4, 63, 12, 26, 61, 22, 53, 38, 16, 35, 14, 28, 50, 42, 17, 5, 28, 62, 20, 54, 12 },
17 { 26, 6, 31, 15, 49, 6, 38, 27, 22, 49, 16, 56, 2, 62, 30, 21, 0, 36, 28, 6, 49, 32, 13, 52, 26, 50, 19, 46, 3, 26, 62, 0, 53, 12, 29, 3, 53, 41, 60, 24, 38, 13, 58, 16, 43, 9, 59, 39, 46, 28, 44, 40, 2, 33, 13, 41, 16, 6, 47, 31, 26, 17, 57, 6, 38, 0, 42, 36, 29, 52, 20, 31, 48, 0, 34, 56, 20, 36, 23, 54, 14, 41, 24, 37, 10, 55, 46, 25, 16, 45, 36, 4, 55, 23, 15, 8, 50, 62, 5, 56, 44, 20, 13, 28, 59, 31, 24, 47, 31, 52, 37, 17, 40, 0, 26, 49, 3, 60, 7, 33, 0, 61, 53, 40, 8, 45, 2, 41 },
18 { 16, 63, 43, 4, 61, 24, 56, 13, 53, 8, 36, 12, 24, 41, 16, 46, 60, 26, 52, 39, 14, 57, 21, 37, 0, 45, 7, 59, 38, 17, 43, 10, 45, 20, 61, 43, 19, 11, 33, 17, 50, 32, 23, 61, 28, 49, 26, 0, 18, 51, 5, 60, 22, 58, 29, 0, 59, 34, 19, 62, 3, 52, 7, 44, 30, 59, 13, 50, 15, 62, 7, 17, 38, 22, 44, 15, 40, 4, 47, 28, 33, 17, 49, 16, 51, 40, 10, 56, 0, 53, 13, 49, 28, 38, 60, 21, 43, 19, 37, 27, 3, 51, 34, 39, 0, 45, 15, 43, 10, 21, 3, 55, 8, 33, 59, 10, 41, 18, 52, 24, 46, 20, 30, 13, 58, 22, 36, 57 },
19 { 50, 34, 11, 47, 29, 17, 44, 0, 33, 63, 28, 46, 52, 5, 57, 10, 42, 18, 4, 63, 20, 8, 44, 10, 56, 34, 14, 29, 5, 54, 23, 59, 32, 49, 7, 34, 49, 27, 56, 0, 42, 7, 46, 3, 40, 6, 54, 32, 62, 13, 36, 10, 47, 8, 35, 49, 24, 51, 12, 40, 22, 35, 60, 12, 22, 51, 33, 4, 40, 25, 43, 55, 5, 54, 12, 61, 26, 51, 8, 62, 0, 53, 7, 63, 2, 32, 19, 34, 42, 24, 31, 63, 2, 10, 45, 33, 0, 48, 9, 61, 22, 47, 8, 62, 18, 56, 7, 54, 27, 57, 46, 30, 50, 19, 45, 30, 56, 36, 22, 47, 11, 38, 3, 51, 32, 48, 18, 9 },
20 { 0, 21, 40, 19, 52, 9, 37, 48, 20, 40, 3, 18, 27, 38, 35, 22, 31, 56, 13, 35, 46, 28, 60, 40, 27, 18, 61, 50, 41, 30, 7, 36, 2, 25, 16, 57, 5, 15, 47, 29, 55, 19, 30, 52, 15, 34, 20, 12, 43, 30, 20, 54, 25, 44, 53, 12, 38, 5, 55, 27, 48, 15, 33, 27, 45, 8, 19, 28, 56, 11, 33, 49, 18, 36, 29, 2, 45, 16, 39, 19, 31, 43, 27, 35, 20, 52, 26, 6, 61, 11, 41, 17, 29, 51, 20, 56, 25, 32, 41, 17, 53, 31, 25, 14, 42, 23, 35, 16, 38, 6, 34, 12, 15, 62, 6, 21, 13, 1, 63, 9, 55, 27, 43, 25, 14, 4, 31, 55 },
21 { 44, 29, 61, 2, 35, 58, 26, 15, 60, 10, 51, 59, 14, 55, 8, 50, 2, 44, 25, 51, 1, 33, 16, 4, 48, 36, 2, 21, 12, 57, 48, 13, 51, 55, 40, 28, 37, 62, 8, 39, 12, 63, 36, 10, 59, 24, 56, 47, 9, 50, 41, 1, 32, 17, 6, 21, 61, 30, 9, 43, 1, 54, 41, 2, 54, 37, 48, 61, 1, 46, 21, 3, 58, 24, 50, 32, 60, 10, 57, 25, 46, 12, 59, 4, 45, 13, 57, 47, 27, 39, 5, 58, 47, 14, 35, 4, 52, 13, 60, 6, 36, 10, 45, 55, 4, 50, 29, 2, 61, 50, 25, 58, 44, 24, 36, 42, 54, 28, 40, 32, 16, 56, 6, 62, 46, 39, 60, 23 },
22 { 7, 48, 14, 54, 23, 40, 4, 45, 30, 22, 42, 32, 1, 44, 20, 29, 58, 8, 37, 19, 41, 54, 24, 58, 9, 53, 25, 46, 34, 16, 23, 38, 27, 11, 18, 1, 52, 21, 35, 22, 48, 5, 25, 45, 18, 38, 2, 27, 35, 4, 57, 15, 62, 39, 57, 28, 42, 16, 36, 60, 24, 18, 10, 63, 20, 5, 16, 23, 37, 14, 59, 27, 41, 8, 13, 42, 21, 35, 6, 50, 3, 38, 15, 48, 30, 39, 17, 3, 49, 14, 53, 33, 24, 7, 61, 44, 11, 39, 23, 49, 19, 58, 1, 32, 36, 12, 60, 41, 20, 13, 41, 4, 39, 1, 48, 8, 18, 51, 14, 44, 5, 37, 21, 34, 1, 26, 10, 37 },
23 { 53, 36, 27, 9, 50, 12, 32, 55, 2, 57, 7, 17, 48, 34, 63, 15, 40, 26, 62, 11, 49, 6, 31, 39, 22, 42, 6, 63, 1, 39, 60, 4, 42, 61, 32, 45, 24, 44, 2, 60, 16, 41, 53, 1, 33, 61, 49, 17, 63, 23, 45, 26, 33, 3, 23, 46, 2, 50, 20, 4, 45, 34, 49, 30, 39, 58, 44, 31, 53, 34, 6, 52, 30, 47, 63, 1, 53, 22, 42, 31, 58, 23, 54, 22, 61, 8, 36, 59, 22, 35, 21, 1, 55, 40, 27, 16, 30, 54, 2, 29, 43, 16, 39, 63, 21, 46, 26, 10, 48, 32, 19, 53, 30, 56, 26, 60, 33, 4, 61, 23, 49, 59, 15, 53, 19, 58, 42, 16 },
24 { 20, 5, 59, 46, 25, 62, 7, 19, 43, 25, 37, 61, 11, 24, 4, 54, 12, 52, 3, 32, 17, 61, 12, 47, 15, 55, 18, 31, 53, 28, 9, 50, 21, 6, 55, 9, 58, 14, 54, 26, 33, 7, 31, 58, 13, 21, 8, 42, 29, 6, 37, 11, 48, 52, 14, 60, 11, 39, 56, 32, 14, 58, 7, 26, 17, 4, 42, 8, 11, 47, 19, 38, 10, 17, 26, 37, 9, 55, 28, 13, 18, 40, 6, 33, 1, 43, 25, 11, 51, 7, 62, 43, 18, 37, 3, 57, 45, 9, 38, 58, 5, 52, 27, 7, 17, 53, 5, 57, 37, 2, 63, 9, 22, 15, 11, 38, 25, 45, 35, 0, 28, 10, 41, 30, 50, 8, 31, 57 },
25 { 49, 33, 16, 38, 1, 42, 51, 34, 53, 14, 28, 49, 30, 56, 36, 23, 43, 20, 38, 56, 22, 45, 28, 0, 62, 35, 26, 44, 11, 19, 52, 35, 44, 15, 30, 38, 10, 31, 40, 4, 46, 50, 20, 40, 27, 44, 51, 14, 56, 53, 19, 59, 7, 29, 41, 19, 35, 25, 8, 52, 22, 44, 13, 53, 50, 32, 61, 24, 56, 25, 63, 0, 45, 57, 33, 59, 16, 46, 4, 62, 50, 11, 60, 37, 52, 19, 55, 29, 37, 46, 13, 26, 48, 10, 50, 34, 21, 63, 26, 13, 42, 33, 22, 55, 35, 28, 43, 15, 24, 51, 27, 34, 46, 49, 58, 3, 52, 9, 57, 19, 48, 55, 3, 35, 12, 45, 24, 3 },
26 { 41, 11, 56, 28, 18, 31, 22, 10, 37, 6, 47, 13, 3, 41, 9, 46, 0, 48, 29, 6, 34, 10, 55, 37, 20, 8, 49, 3, 41, 59, 14, 25, 0, 63, 19, 47, 27, 51, 17, 57, 23, 10, 61, 6, 54, 3, 38, 31, 0, 22, 34, 43, 20, 55, 31, 0, 49, 63, 29, 38, 3, 62, 28, 40, 0, 22, 14, 35, 2, 48, 15, 43, 23, 14, 3, 29, 49, 20, 39, 34, 0, 44, 29, 9, 15, 47, 5, 42, 0, 31, 58, 5, 31, 61, 23, 15, 0, 47, 19, 50, 24, 3, 59, 11, 44, 0, 31, 59, 6, 42, 17, 60, 0, 39, 20, 31, 43, 17, 29, 40, 12, 25, 60, 22, 52, 15, 63, 29 },
27 { 20, 52, 8, 44, 62, 4, 59, 49, 17, 63, 21, 39, 60, 18, 52, 27, 33, 59, 14, 51, 59, 43, 24, 5, 51, 30, 57, 17, 32, 5, 37, 56, 48, 34, 42, 3, 60, 5, 36, 13, 43, 37, 18, 34, 25, 12, 59, 24, 47, 36, 11, 50, 3, 38, 9, 58, 16, 5, 43, 18, 47, 10, 37, 18, 59, 46, 29, 52, 40, 12, 34, 28, 56, 36, 53, 7, 43, 8, 24, 52, 26, 17, 56, 43, 24, 32, 63, 20, 57, 16, 22, 52, 36, 8, 41, 56, 29, 32, 54, 7, 35, 57, 14, 48, 20, 62, 13, 39, 53, 29, 8, 45, 13, 29, 7, 61, 14, 54, 6, 63, 38, 32, 18, 43, 2, 39, 6, 47 },
28 { 0, 58, 23, 35, 13, 46, 12, 39, 0, 31, 55, 24, 5, 35, 15, 61, 17, 5, 39, 25, 18, 2, 50, 33, 41, 13, 39, 23, 62, 46, 29, 12, 22, 8, 56, 25, 20, 49, 32, 62, 0, 56, 11, 46, 63, 42, 9, 16, 55, 5, 60, 15, 62, 26, 45, 21, 36, 51, 13, 57, 31, 24, 55, 6, 35, 9, 57, 5, 20, 60, 7, 51, 5, 19, 40, 25, 61, 32, 56, 12, 36, 48, 21, 2, 58, 12, 39, 28, 9, 50, 40, 12, 44, 18, 25, 49, 6, 38, 11, 62, 18, 46, 30, 9, 40, 25, 49, 19, 10, 36, 55, 22, 33, 52, 41, 18, 37, 27, 49, 21, 2, 46, 7, 53, 33, 61, 27, 35 },
29 { 41, 31, 5, 39, 51, 26, 33, 57, 27, 41, 9, 44, 54, 29, 48, 7, 44, 36, 57, 10, 31, 63, 16, 45, 11, 60, 1, 47, 7, 20, 43, 3, 58, 36, 13, 52, 39, 7, 15, 28, 22, 48, 30, 21, 1, 29, 49, 44, 27, 17, 40, 30, 24, 42, 12, 53, 33, 7, 47, 20, 1, 42, 11, 49, 25, 43, 17, 32, 45, 27, 41, 21, 31, 62, 11, 49, 2, 15, 42, 5, 63, 7, 41, 27, 49, 6, 54, 23, 46, 34, 2, 28, 54, 3, 59, 12, 46, 17, 42, 28, 40, 1, 37, 51, 5, 55, 2, 34, 47, 16, 3, 62, 47, 5, 23, 56, 1, 44, 12, 34, 51, 16, 57, 11, 25, 17, 54, 13 },
30 { 60, 26, 55, 18, 3, 60, 20, 6, 52, 15, 50, 19, 32, 11, 23, 53, 26, 21, 1, 47, 42, 27, 8, 58, 21, 27, 53, 36, 26, 54, 31, 50, 17, 30, 45, 1, 29, 59, 44, 53, 41, 4, 35, 58, 51, 19, 32, 4, 52, 34, 48, 8, 51, 5, 56, 2, 25, 61, 27, 38, 54, 27, 62, 21, 51, 1, 39, 62, 10, 50, 1, 58, 13, 47, 38, 18, 35, 54, 22, 51, 30, 19, 59, 34, 14, 32, 44, 4, 60, 15, 52, 62, 20, 43, 30, 35, 21, 60, 4, 52, 12, 24, 61, 18, 30, 42, 23, 61, 25, 50, 27, 38, 11, 59, 12, 35, 50, 30, 59, 24, 8, 42, 28, 37, 48, 9, 44, 21 },
31 { 10, 47, 15, 50, 30, 43, 8, 45, 29, 2, 36, 59, 1, 58, 41, 3, 63, 31, 54, 20, 13, 55, 35, 38, 4, 44, 15, 9, 61, 2, 14, 38, 61, 10, 23, 54, 18, 12, 24, 2, 14, 55, 16, 8, 38, 14, 41, 60, 10, 23, 1, 58, 32, 17, 28, 37, 41, 15, 3, 60, 15, 33, 4, 36, 16, 59, 28, 14, 23, 55, 37, 18, 44, 28, 2, 57, 30, 10, 27, 46, 14, 38, 3, 53, 21, 61, 17, 35, 10, 41, 26, 7, 33, 9, 57, 1, 53, 37, 26, 20, 56, 48, 9, 33, 58, 16, 37, 7, 45, 1, 57, 15, 32, 26, 42, 23, 7, 20, 4, 54, 31, 62, 22, 1, 59, 30, 4, 51 },
32 { 36, 2, 38, 11, 24, 36, 54, 22, 62, 47, 25, 8, 28, 45, 16, 38, 12, 43, 9, 37, 49, 3, 23, 52, 18, 30, 50, 33, 19, 42, 49, 26, 6, 40, 47, 35, 63, 38, 50, 33, 60, 26, 36, 47, 24, 57, 6, 26, 39, 63, 19, 44, 14, 46, 61, 9, 50, 30, 45, 23, 10, 50, 44, 8, 31, 54, 6, 46, 36, 4, 30, 54, 8, 52, 22, 41, 4, 60, 40, 0, 58, 24, 45, 10, 37, 1, 48, 30, 56, 17, 38, 48, 24, 47, 19, 39, 14, 8, 45, 32, 2, 34, 27, 44, 4, 52, 11, 56, 31, 21, 40, 19, 44, 51, 2, 63, 46, 58, 36, 43, 14, 5, 50, 38, 14, 56, 40, 23 },
33 { 61, 46, 32, 63, 54, 1, 14, 34, 12, 40, 18, 49, 37, 10, 61, 30, 51, 24, 60, 7, 29, 40, 62, 11, 46, 58, 6, 56, 24, 10, 34, 52, 21, 59, 16, 3, 27, 5, 20, 46, 9, 40, 7, 62, 2, 30, 53, 15, 48, 10, 28, 35, 54, 6, 21, 34, 18, 55, 7, 40, 57, 19, 26, 60, 41, 13, 24, 51, 19, 61, 9, 25, 34, 15, 63, 11, 45, 17, 20, 47, 33, 8, 31, 62, 43, 26, 53, 7, 24, 59, 0, 13, 55, 4, 62, 27, 51, 31, 63, 15, 58, 7, 54, 14, 46, 22, 28, 43, 12, 63, 8, 54, 5, 17, 39, 33, 15, 10, 27, 17, 47, 34, 19, 45, 27, 12, 33, 17 },
34 { 5, 28, 21, 7, 17, 48, 42, 58, 23, 4, 63, 14, 55, 21, 34, 5, 19, 0, 45, 17, 52, 15, 25, 32, 0, 22, 40, 13, 45, 62, 18, 0, 43, 11, 33, 55, 30, 42, 57, 19, 51, 31, 22, 43, 18, 45, 34, 0, 43, 31, 56, 3, 23, 40, 59, 0, 44, 13, 48, 35, 2, 32, 46, 0, 21, 48, 35, 3, 40, 32, 43, 59, 0, 48, 33, 26, 53, 36, 55, 12, 51, 16, 55, 5, 18, 29, 11, 39, 51, 19, 45, 31, 42, 21, 35, 6, 22, 47, 10, 38, 23, 50, 20, 36, 0, 60, 38, 4, 50, 35, 48, 34, 24, 57, 9, 53, 28, 48, 61, 0, 56, 24, 53, 3, 63, 6, 42, 57 },
35 { 13, 53, 45, 40, 58, 27, 6, 16, 38, 51, 33, 30, 43, 2, 47, 56, 40, 50, 33, 57, 27, 5, 47, 42, 60, 36, 16, 54, 28, 4, 37, 57, 28, 51, 22, 8, 45, 14, 6, 39, 0, 54, 11, 59, 28, 12, 50, 21, 61, 13, 19, 38, 49, 11, 25, 37, 58, 29, 22, 63, 14, 56, 12, 53, 30, 63, 9, 57, 26, 12, 47, 16, 23, 39, 50, 6, 31, 2, 25, 6, 28, 41, 36, 22, 50, 57, 42, 3, 34, 8, 28, 61, 11, 50, 16, 54, 41, 0, 55, 43, 5, 29, 41, 63, 25, 16, 53, 18, 26, 10, 21, 0, 61, 30, 41, 22, 3, 38, 20, 39, 29, 8, 41, 16, 36, 52, 22, 19 },
36 { 55, 34, 0, 25, 10, 32, 56, 44, 28, 0, 57, 7, 26, 53, 23, 8, 13, 35, 22, 12, 36, 60, 20, 8, 14, 29, 48, 2, 41, 49, 23, 13, 39, 7, 48, 58, 25, 53, 34, 62, 28, 16, 48, 4, 37, 56, 27, 5, 36, 52, 46, 7, 62, 33, 52, 11, 17, 53, 5, 28, 41, 24, 38, 17, 5, 39, 20, 45, 15, 56, 5, 38, 60, 8, 14, 57, 21, 48, 62, 39, 59, 13, 1, 60, 9, 32, 16, 63, 44, 25, 52, 15, 36, 2, 60, 29, 12, 33, 25, 17, 59, 45, 13, 8, 49, 32, 6, 40, 59, 29, 45, 37, 13, 47, 6, 55, 30, 45, 9, 52, 13, 59, 25, 47, 32, 1, 49, 30 },
37 { 9, 39, 14, 61, 49, 37, 3, 20, 50, 13, 41, 19, 46, 17, 38, 59, 28, 62, 4, 44, 54, 1, 34, 51, 55, 7, 63, 32, 21, 8, 56, 31, 62, 19, 36, 1, 41, 17, 24, 12, 42, 35, 25, 52, 20, 8, 44, 59, 25, 2, 22, 42, 16, 29, 4, 46, 20, 36, 43, 9, 51, 8, 49, 26, 58, 33, 54, 1, 37, 29, 52, 20, 27, 45, 19, 35, 42, 16, 10, 32, 20, 49, 46, 27, 40, 4, 47, 22, 13, 55, 4, 47, 26, 44, 23, 40, 58, 19, 48, 13, 31, 2, 57, 34, 42, 19, 61, 32, 14, 55, 5, 51, 26, 19, 58, 16, 49, 14, 62, 5, 33, 44, 21, 7, 60, 26, 11, 41 },
38 { 62, 24, 47, 29, 8, 19, 53, 11, 60, 24, 32, 61, 4, 55, 31, 2, 49, 16, 39, 9, 31, 24, 43, 17, 26, 38, 11, 25, 58, 43, 12, 35, 3, 46, 15, 32, 63, 4, 49, 56, 2, 60, 10, 32, 63, 17, 39, 12, 55, 30, 57, 9, 48, 55, 39, 24, 60, 2, 58, 31, 19, 61, 34, 3, 42, 11, 22, 46, 7, 61, 10, 42, 3, 55, 32, 1, 58, 28, 44, 54, 4, 34, 23, 15, 56, 20, 37, 58, 6, 30, 38, 18, 63, 9, 32, 5, 51, 3, 62, 37, 52, 18, 39, 23, 3, 51, 9, 47, 1, 23, 43, 15, 60, 35, 11, 40, 1, 36, 31, 26, 57, 2, 37, 54, 18, 44, 58, 16 },
39 { 5, 51, 3, 33, 43, 62, 21, 42, 35, 9, 48, 15, 36, 10, 22, 42, 20, 46, 26, 56, 50, 12, 59, 3, 48, 19, 45, 53, 1, 27, 47, 17, 52, 24, 56, 11, 51, 21, 37, 30, 20, 46, 14, 41, 1, 47, 33, 7, 41, 17, 35, 27, 20, 1, 14, 54, 26, 33, 18, 47, 1, 44, 14, 59, 16, 52, 28, 18, 49, 31, 25, 34, 63, 13, 51, 24, 9, 50, 3, 23, 38, 63, 7, 52, 29, 46, 11, 33, 50, 22, 57, 36, 1, 57, 49, 17, 39, 28, 9, 35, 6, 27, 53, 15, 55, 30, 24, 58, 36, 41, 11, 52, 32, 3, 44, 25, 62, 23, 51, 15, 42, 22, 50, 10, 39, 4, 31, 35 },
40 { 46, 22, 57, 17, 12, 39, 26, 5, 31, 59, 1, 45, 27, 62, 52, 7, 58, 33, 6, 18, 39, 22, 33, 41, 57, 5, 35, 18, 40, 16, 60, 5, 29, 42, 7, 39, 27, 44, 9, 47, 8, 26, 54, 22, 51, 29, 24, 49, 15, 61, 4, 51, 31, 63, 43, 6, 50, 8, 39, 12, 53, 37, 23, 30, 40, 6, 62, 43, 14, 53, 2, 49, 7, 36, 17, 41, 61, 37, 18, 56, 11, 18, 44, 35, 2, 19, 61, 0, 41, 14, 8, 30, 43, 12, 24, 46, 14, 54, 42, 21, 44, 61, 10, 46, 37, 11, 44, 7, 18, 63, 20, 29, 7, 49, 28, 54, 8, 43, 4, 48, 18, 63, 12, 29, 48, 24, 59, 20 },
41 { 13, 36, 28, 54, 35, 2, 56, 46, 16, 49, 22, 40, 11, 34, 14, 43, 29, 12, 63, 48, 2, 61, 7, 15, 28, 30, 50, 9, 61, 33, 38, 23, 54, 13, 61, 33, 3, 59, 16, 35, 58, 40, 5, 38, 13, 57, 3, 58, 37, 21, 45, 12, 39, 7, 35, 30, 13, 56, 22, 62, 27, 6, 55, 10, 48, 21, 33, 2, 38, 23, 40, 20, 44, 29, 59, 4, 26, 12, 33, 47, 28, 53, 31, 13, 59, 41, 27, 49, 26, 54, 45, 16, 53, 21, 35, 7, 59, 26, 11, 56, 1, 24, 33, 4, 28, 62, 21, 49, 31, 2, 56, 39, 24, 58, 13, 17, 37, 21, 56, 10, 38, 0, 34, 55, 15, 43, 1, 52 },
42 { 42, 9, 50, 6, 25, 60, 14, 38, 10, 29, 53, 18, 57, 3, 25, 51, 0, 53, 25, 17, 29, 37, 52, 46, 0, 62, 14, 37, 4, 50, 10, 44, 0, 46, 20, 25, 50, 19, 55, 0, 23, 31, 62, 34, 11, 45, 19, 32, 0, 53, 10, 59, 23, 47, 18, 60, 42, 28, 37, 3, 50, 15, 35, 44, 0, 51, 27, 60, 9, 57, 16, 58, 11, 22, 46, 15, 53, 48, 7, 42, 0, 60, 5, 49, 24, 54, 9, 17, 39, 5, 34, 62, 3, 40, 60, 31, 0, 47, 29, 16, 49, 39, 59, 17, 50, 0, 40, 13, 53, 38, 16, 46, 0, 42, 34, 60, 2, 53, 29, 31, 58, 46, 27, 6, 61, 8, 37, 28 },
43 { 0, 63, 21, 40, 45, 18, 51, 23, 63, 34, 6, 43, 28, 38, 55, 19, 40, 35, 8, 41, 54, 10, 21, 32, 39, 23, 53, 26, 55, 28, 22, 63, 30, 34, 9, 48, 6, 38, 29, 43, 49, 6, 18, 52, 27, 61, 9, 43, 28, 42, 33, 26, 56, 3, 51, 23, 0, 48, 16, 45, 32, 25, 63, 20, 57, 17, 42, 12, 35, 47, 5, 31, 39, 56, 6, 30, 34, 21, 61, 25, 14, 40, 22, 38, 15, 6, 36, 56, 20, 60, 25, 12, 51, 27, 10, 56, 42, 20, 36, 63, 32, 6, 21, 41, 12, 34, 60, 26, 5, 48, 27, 10, 62, 19, 6, 47, 39, 14, 45, 7, 24, 17, 41, 32, 23, 51, 19, 56 },
44 { 45, 31, 15, 59, 4, 33, 7, 47, 0, 41, 13, 61, 4, 47, 9, 23, 60, 14, 57, 31, 4, 45, 59, 6, 58, 10, 44, 20, 8, 42, 15, 6, 55, 17, 58, 31, 53, 12, 61, 10, 15, 57, 43, 2, 23, 35, 48, 14, 54, 6, 18, 49, 15, 38, 11, 34, 62, 9, 21, 58, 11, 41, 4, 31, 38, 8, 29, 55, 19, 36, 27, 52, 0, 25, 50, 43, 1, 39, 8, 55, 35, 51, 10, 30, 45, 62, 29, 2, 46, 10, 32, 48, 18, 38, 5, 22, 33, 8, 51, 3, 14, 44, 54, 25, 57, 30, 18, 52, 33, 22, 59, 28, 36, 52, 32, 21, 26, 50, 5, 55, 35, 60, 14, 54, 4, 40, 16, 33 },
45 { 27, 3, 49, 10, 30, 40, 55, 27, 57, 24, 52, 21, 32, 17, 60, 30, 5, 44, 27, 49, 19, 34, 13, 24, 43, 36, 3, 49, 31, 59, 37, 48, 26, 41, 2, 41, 14, 36, 21, 32, 40, 26, 13, 49, 55, 5, 16, 40, 25, 60, 36, 1, 63, 29, 17, 44, 25, 40, 52, 5, 29, 47, 54, 13, 46, 24, 60, 4, 51, 22, 63, 14, 45, 18, 12, 62, 17, 57, 19, 42, 3, 26, 58, 48, 1, 21, 40, 52, 23, 37, 44, 1, 29, 58, 43, 50, 15, 61, 19, 45, 58, 28, 7, 48, 2, 46, 8, 42, 3, 55, 8, 50, 12, 4, 55, 10, 63, 33, 20, 40, 11, 3, 46, 20, 48, 26, 61, 11 },
46 { 44, 56, 24, 36, 53, 19, 12, 37, 16, 44, 7, 36, 49, 54, 11, 37, 48, 21, 15, 1, 62, 25, 47, 56, 16, 18, 51, 12, 40, 1, 24, 11, 52, 16, 23, 59, 28, 1, 45, 53, 4, 60, 37, 21, 39, 30, 63, 20, 52, 10, 30, 45, 8, 41, 54, 4, 57, 7, 34, 55, 36, 18, 23, 59, 2, 48, 11, 32, 44, 1, 41, 8, 33, 54, 38, 23, 30, 46, 6, 29, 62, 18, 32, 16, 55, 34, 14, 11, 61, 7, 55, 16, 53, 13, 23, 2, 55, 37, 26, 10, 33, 23, 36, 16, 38, 22, 56, 15, 24, 43, 35, 17, 44, 40, 25, 46, 16, 1, 57, 25, 49, 36, 28, 62, 9, 35, 7, 53 },
47 { 17, 38, 8, 61, 1, 50, 26, 62, 3, 31, 56, 15, 1, 26, 40, 2, 34, 51, 56, 36, 42, 9, 38, 2, 29, 60, 32, 57, 19, 62, 34, 47, 4, 57, 39, 7, 44, 63, 24, 18, 46, 28, 8, 54, 1, 34, 7, 46, 3, 37, 50, 23, 57, 21, 13, 46, 31, 20, 43, 15, 1, 61, 8, 33, 37, 17, 56, 26, 15, 49, 24, 59, 28, 3, 56, 9, 52, 32, 13, 49, 10, 43, 5, 45, 8, 25, 59, 42, 28, 33, 19, 40, 8, 63, 35, 47, 25, 4, 40, 52, 1, 60, 12, 53, 63, 9, 29, 60, 37, 19, 1, 62, 31, 20, 58, 12, 41, 30, 43, 9, 18, 52, 22, 1, 39, 30, 58, 21 },
48 { 13, 47, 29, 18, 43, 34, 5, 48, 20, 42, 10, 45, 30, 58, 20, 63, 24, 11, 6, 28, 54, 14, 22, 52, 41, 7, 26, 5, 45, 15, 53, 13, 35, 27, 18, 50, 12, 33, 5, 56, 10, 17, 45, 24, 59, 15, 50, 26, 56, 13, 19, 5, 32, 52, 27, 36, 2, 61, 12, 26, 49, 40, 27, 52, 13, 50, 6, 39, 61, 34, 10, 37, 48, 20, 41, 27, 2, 36, 59, 24, 54, 33, 63, 20, 38, 50, 3, 17, 52, 4, 58, 27, 45, 21, 32, 11, 48, 17, 57, 20, 46, 38, 25, 43, 4, 34, 51, 6, 13, 45, 57, 26, 6, 48, 2, 35, 53, 23, 61, 34, 59, 6, 42, 56, 13, 51, 2, 41 },
49 { 32, 5, 55, 23, 58, 14, 22, 52, 29, 15, 61, 25, 51, 8, 43, 13, 53, 41, 46, 20, 3, 33, 63, 11, 48, 21, 54, 38, 28, 3, 30, 43, 21, 62, 9, 31, 55, 22, 51, 29, 37, 62, 32, 12, 42, 29, 41, 9, 33, 44, 62, 28, 43, 1, 59, 19, 48, 30, 51, 39, 24, 4, 58, 19, 42, 29, 22, 43, 3, 18, 53, 5, 13, 50, 16, 60, 45, 21, 7, 40, 15, 0, 26, 53, 13, 31, 43, 24, 47, 31, 15, 49, 2, 41, 6, 59, 29, 42, 9, 30, 14, 7, 49, 18, 31, 47, 20, 39, 49, 32, 11, 41, 54, 15, 61, 18, 7, 38, 4, 13, 44, 28, 15, 32, 45, 19, 27, 49 },
50 { 63, 34, 11, 39, 2, 45, 37, 8, 59, 39, 33, 4, 36, 17, 48, 5, 29, 18, 32, 61, 39, 50, 5, 27, 35, 0, 46, 12, 22, 49, 60, 6, 54, 0, 38, 49, 2, 42, 15, 40, 0, 47, 20, 51, 3, 57, 18, 61, 22, 0, 39, 16, 55, 12, 35, 8, 41, 22, 6, 59, 16, 45, 10, 36, 0, 62, 9, 54, 30, 58, 21, 43, 63, 31, 7, 35, 12, 48, 58, 28, 47, 37, 41, 9, 57, 20, 61, 0, 36, 11, 57, 35, 23, 52, 37, 18, 0, 62, 22, 55, 35, 62, 27, 54, 0, 15, 61, 28, 2, 59, 22, 9, 37, 27, 33, 51, 29, 48, 19, 50, 25, 37, 10, 57, 5, 37, 60, 8 },
51 { 20, 25, 46, 52, 31, 60, 12, 55, 0, 19, 11, 46, 62, 35, 23, 38, 57, 0, 55, 10, 16, 30, 58, 44, 17, 59, 29, 63, 42, 8, 36, 20, 33, 46, 16, 61, 25, 35, 8, 54, 26, 7, 58, 22, 34, 6, 47, 14, 53, 31, 48, 9, 37, 25, 49, 63, 16, 55, 45, 14, 34, 63, 21, 53, 25, 33, 46, 16, 35, 7, 46, 29, 0, 39, 25, 55, 22, 34, 18, 4, 56, 11, 23, 51, 28, 6, 39, 14, 62, 44, 19, 8, 60, 12, 56, 28, 50, 34, 39, 5, 51, 3, 41, 12, 57, 35, 10, 53, 25, 17, 52, 30, 47, 0, 43, 14, 5, 57, 31, 55, 0, 63, 47, 23, 54, 24, 14, 43 },
52 { 0, 57, 16, 6, 26, 19, 35, 28, 49, 42, 54, 26, 21, 1, 59, 27, 9, 47, 26, 44, 50, 22, 13, 40, 8, 37, 10, 34, 17, 56, 25, 58, 13, 27, 44, 9, 20, 58, 31, 17, 60, 36, 10, 41, 53, 25, 36, 39, 4, 24, 58, 17, 60, 4, 22, 38, 10, 32, 0, 50, 31, 7, 28, 47, 12, 57, 5, 26, 52, 23, 14, 40, 57, 17, 47, 5, 53, 1, 44, 31, 19, 60, 46, 2, 35, 48, 30, 54, 22, 5, 51, 39, 25, 31, 4, 43, 14, 9, 45, 16, 24, 44, 19, 29, 40, 23, 44, 7, 38, 42, 4, 63, 12, 54, 23, 59, 22, 42, 8, 15, 40, 21, 8, 34, 3, 41, 30, 50 },
53 { 39, 10, 48, 33, 41, 54, 5, 47, 23, 13, 32, 7, 52, 44, 14, 39, 58, 18, 35, 6, 37, 2, 60, 24, 55, 19, 53, 2, 51, 32, 1, 41, 51, 4, 40, 29, 47, 3, 52, 44, 13, 49, 28, 16, 1, 62, 11, 27, 52, 35, 5, 42, 29, 47, 14, 56, 28, 53, 26, 38, 9, 56, 40, 3, 38, 15, 41, 60, 1, 37, 50, 25, 11, 28, 61, 19, 42, 62, 10, 52, 39, 6, 32, 14, 58, 17, 7, 26, 42, 34, 27, 10, 54, 40, 20, 63, 26, 53, 21, 61, 32, 7, 59, 48, 3, 56, 18, 31, 58, 14, 49, 21, 36, 16, 45, 9, 36, 24, 62, 45, 27, 31, 53, 17, 49, 12, 62, 18 },
54 { 28, 59, 21, 58, 2, 16, 38, 9, 62, 3, 56, 41, 10, 31, 50, 4, 32, 52, 12, 63, 23, 46, 33, 31, 4, 48, 25, 43, 14, 23, 47, 11, 22, 55, 14, 60, 23, 37, 11, 39, 23, 2, 45, 56, 31, 43, 19, 55, 16, 46, 21, 51, 11, 33, 44, 2, 41, 18, 5, 52, 23, 44, 17, 60, 27, 49, 11, 32, 44, 10, 54, 2, 56, 33, 8, 38, 13, 29, 36, 16, 24, 63, 27, 51, 21, 43, 56, 12, 49, 3, 59, 48, 1, 15, 46, 7, 36, 2, 47, 11, 50, 27, 37, 13, 33, 8, 51, 46, 1, 34, 28, 40, 3, 33, 60, 29, 47, 1, 35, 11, 59, 42, 2, 60, 26, 46, 6, 35 },
55 { 4, 43, 9, 29, 36, 63, 24, 44, 20, 50, 30, 17, 60, 22, 16, 43, 25, 3, 42, 19, 51, 15, 8, 54, 42, 15, 61, 5, 39, 57, 18, 61, 31, 48, 34, 2, 50, 19, 57, 5, 63, 33, 19, 38, 13, 27, 48, 7, 32, 61, 2, 26, 58, 6, 24, 50, 13, 61, 42, 20, 62, 2, 35, 20, 51, 4, 62, 18, 23, 58, 20, 31, 43, 15, 51, 45, 26, 50, 4, 55, 45, 3, 35, 9, 38, 1, 32, 61, 20, 45, 17, 33, 24, 57, 29, 51, 22, 58, 38, 30, 15, 1, 54, 21, 63, 43, 26, 12, 24, 56, 8, 60, 50, 19, 5, 52, 13, 54, 17, 50, 4, 16, 36, 12, 32, 56, 22, 54 },
56 { 51, 25, 40, 53, 12, 49, 15, 57, 34, 7, 38, 47, 2, 36, 55, 8, 61, 30, 56, 7, 28, 59, 48, 11, 27, 35, 21, 45, 28, 36, 9, 38, 6, 16, 24, 63, 10, 32, 28, 43, 21, 53, 5, 60, 8, 57, 3, 45, 11, 37, 15, 54, 40, 20, 62, 36, 27, 34, 11, 48, 30, 15, 54, 8, 30, 42, 22, 34, 48, 13, 35, 63, 4, 37, 22, 2, 59, 9, 41, 23, 13, 41, 49, 18, 59, 24, 40, 5, 37, 30, 9, 61, 44, 6, 37, 11, 33, 17, 5, 55, 41, 60, 23, 39, 17, 5, 30, 62, 41, 16, 46, 25, 11, 56, 39, 26, 20, 38, 29, 39, 22, 52, 44, 20, 48, 1, 38, 14 },
57 { 15, 33, 2, 18, 44, 6, 27, 0, 32, 61, 25, 12, 58, 28, 40, 20, 47, 13, 34, 43, 38, 1, 23, 62, 40, 0, 51, 10, 63, 3, 52, 26, 44, 30, 45, 6, 41, 54, 0, 51, 12, 30, 46, 24, 49, 22, 40, 33, 63, 23, 43, 30, 9, 47, 0, 17, 54, 7, 57, 3, 37, 47, 24, 46, 13, 55, 7, 52, 2, 42, 6, 26, 49, 18, 60, 34, 16, 57, 33, 20, 61, 30, 8, 54, 14, 46, 12, 53, 16, 55, 38, 13, 22, 53, 18, 59, 46, 27, 43, 19, 32, 10, 45, 6, 49, 36, 52, 2, 20, 55, 6, 39, 32, 15, 44, 3, 58, 10, 63, 6, 56, 30, 7, 58, 9, 40, 19, 63 },
58 { 10, 47, 61, 23, 55, 31, 52, 42, 17, 45, 4, 51, 27, 6, 15, 53, 0, 49, 26, 10, 56, 18, 36, 6, 20, 58, 32, 30, 13, 49, 19, 56, 0, 59, 12, 53, 27, 17, 38, 25, 48, 9, 15, 36, 14, 30, 59, 17, 0, 50, 8, 58, 18, 56, 31, 45, 21, 41, 29, 19, 60, 6, 32, 59, 0, 36, 29, 39, 19, 59, 46, 12, 55, 30, 10, 47, 24, 3, 28, 48, 0, 55, 44, 27, 33, 4, 63, 29, 49, 0, 26, 50, 34, 2, 42, 14, 0, 62, 9, 56, 3, 52, 28, 34, 58, 9, 20, 48, 37, 32, 22, 53, 0, 62, 27, 49, 34, 46, 21, 33, 41, 14, 25, 37, 53, 29, 31, 45 },
59 { 56, 28, 7, 37, 11, 36, 20, 9, 54, 14, 39, 19, 34, 63, 45, 37, 24, 17, 60, 31, 21, 45, 53, 29, 47, 15, 7, 55, 40, 23, 34, 14, 42, 20, 37, 35, 15, 59, 7, 62, 34, 40, 59, 1, 51, 42, 10, 28, 54, 21, 35, 5, 38, 13, 36, 4, 59, 12, 39, 53, 15, 43, 9, 21, 39, 62, 16, 56, 25, 9, 32, 38, 0, 41, 14, 51, 40, 53, 43, 11, 37, 17, 5, 22, 57, 39, 19, 7, 42, 21, 60, 10, 31, 63, 25, 52, 30, 49, 36, 25, 48, 17, 61, 14, 22, 42, 29, 13, 60, 11, 47, 18, 35, 41, 7, 23, 4, 16, 51, 11, 0, 48, 61, 3, 17, 50, 5, 24 },
60 { 0, 42, 21, 49, 60, 3, 57, 40, 29, 48, 23, 56, 42, 11, 22, 5, 59, 39, 4, 50, 3, 41, 12, 57, 25, 50, 44, 18, 4, 46, 7, 62, 33, 50, 4, 56, 21, 32, 43, 18, 3, 23, 55, 34, 20, 4, 53, 38, 12, 46, 29, 52, 25, 61, 23, 51, 26, 46, 1, 34, 25, 57, 28, 51, 26, 11, 50, 3, 44, 28, 53, 21, 57, 27, 62, 6, 31, 19, 8, 63, 26, 59, 36, 47, 15, 29, 50, 25, 35, 47, 18, 41, 4, 48, 8, 40, 12, 23, 6, 44, 13, 40, 1, 31, 55, 0, 61, 43, 4, 50, 26, 58, 9, 53, 24, 61, 42, 55, 31, 43, 57, 20, 34, 27, 43, 8, 59, 39 },
61 { 18, 51, 30, 13, 26, 16, 46, 22, 2, 59, 8, 30, 1, 48, 33, 51, 29, 9, 46, 16, 62, 14, 33, 2, 38, 9, 27, 60, 37, 26, 53, 17, 28, 10, 24, 46, 2, 49, 8, 57, 29, 45, 6, 26, 62, 44, 18, 25, 61, 3, 42, 14, 49, 10, 43, 6, 17, 32, 63, 10, 49, 4, 40, 14, 45, 33, 22, 37, 12, 61, 5, 17, 43, 7, 23, 37, 15, 58, 49, 13, 39, 21, 10, 52, 1, 62, 9, 56, 12, 2, 58, 28, 36, 16, 56, 28, 56, 35, 20, 63, 24, 37, 51, 8, 45, 25, 16, 33, 27, 38, 2, 44, 13, 30, 17, 36, 12, 26, 5, 18, 28, 47, 13, 60, 23, 45, 13, 33 },
62 { 55, 4, 62, 34, 52, 38, 7, 63, 32, 37, 13, 53, 25, 62, 18, 12, 55, 41, 27, 35, 24, 49, 31, 52, 17, 63, 34, 1, 56, 12, 41, 2, 48, 58, 39, 16, 61, 27, 41, 52, 13, 19, 50, 39, 11, 31, 57, 6, 32, 40, 20, 55, 1, 28, 33, 57, 48, 8, 37, 22, 44, 18, 53, 1, 61, 5, 54, 16, 47, 36, 50, 24, 55, 34, 48, 45, 1, 30, 33, 46, 2, 50, 32, 42, 25, 34, 43, 21, 38, 52, 23, 45, 14, 54, 21, 4, 44, 16, 53, 29, 10, 47, 19, 57, 12, 54, 39, 10, 51, 15, 63, 21, 57, 40, 51, 1, 48, 57, 37, 62, 2, 38, 9, 52, 1, 35, 58, 22 },
63 { 36, 46, 10, 42, 1, 27, 43, 15, 50, 21, 45, 16, 41, 3, 35, 44, 20, 1, 57, 11, 55, 7, 43, 8, 22, 42, 13, 46, 21, 39, 31, 60, 22, 5, 29, 44, 11, 35, 20, 4, 36, 58, 32, 15, 47, 2, 36, 48, 16, 60, 8, 35, 44, 63, 16, 2, 40, 26, 55, 14, 58, 35, 24, 31, 19, 42, 31, 58, 1, 29, 10, 40, 2, 19, 12, 54, 22, 61, 7, 24, 56, 5, 28, 16, 54, 3, 15, 58, 6, 30, 8, 62, 1, 43, 31, 47, 7, 59, 1, 38, 58, 4, 34, 27, 38, 5, 31, 59, 7, 46, 30, 3, 34, 6, 28, 59, 20, 8, 32, 15, 53, 24, 55, 31, 19, 49, 11, 26 },
64 { 2, 24, 16, 58, 19, 55, 5, 35, 10, 61, 4, 28, 57, 24, 58, 7, 31, 47, 22, 38, 19, 28, 61, 36, 54, 5, 59, 29, 6, 52, 15, 11, 43, 36, 8, 54, 52, 1, 62, 25, 47, 9, 1, 60, 28, 53, 24, 14, 46, 27, 51, 22, 12, 24, 38, 53, 20, 11, 51, 3, 29, 7, 48, 63, 8, 49, 9, 21, 52, 14, 63, 32, 46, 60, 35, 4, 41, 16, 52, 35, 18, 42, 59, 7, 36, 61, 45, 27, 33, 51, 19, 39, 34, 11, 61, 18, 33, 41, 28, 15, 54, 22, 42, 3, 49, 21, 47, 18, 36, 23, 55, 19, 48, 24, 45, 10, 33, 44, 50, 40, 7, 35, 15, 41, 63, 6, 40, 54 },
65 { 62, 41, 32, 8, 47, 28, 60, 24, 44, 30, 38, 49, 9, 33, 14, 40, 50, 14, 60, 2, 54, 40, 0, 20, 25, 39, 16, 49, 24, 35, 57, 47, 19, 61, 33, 18, 23, 37, 13, 55, 31, 43, 22, 41, 17, 8, 42, 58, 0, 37, 5, 56, 31, 54, 7, 30, 60, 33, 42, 17, 59, 39, 12, 27, 38, 17, 35, 41, 27, 45, 20, 7, 25, 15, 29, 58, 27, 47, 11, 40, 14, 54, 23, 46, 19, 31, 11, 40, 13, 49, 5, 58, 24, 51, 26, 6, 50, 20, 49, 9, 32, 46, 17, 60, 14, 63, 24, 1, 57, 41, 9, 43, 14, 62, 16, 52, 3, 27, 14, 22, 61, 45, 4, 28, 9, 47, 29, 17 },
66 { 5, 50, 12, 53, 38, 18, 11, 51, 0, 55, 17, 6, 47, 54, 19, 63, 5, 26, 34, 45, 13, 30, 47, 58, 10, 48, 32, 3, 62, 9, 26, 0, 25, 14, 50, 3, 47, 30, 42, 16, 6, 63, 12, 49, 33, 55, 21, 10, 34, 63, 18, 41, 3, 47, 19, 43, 0, 49, 8, 28, 46, 20, 52, 0, 56, 24, 60, 3, 59, 5, 39, 57, 48, 52, 9, 38, 3, 21, 26, 60, 0, 32, 12, 38, 4, 48, 53, 0, 60, 15, 29, 44, 18, 10, 38, 57, 13, 60, 2, 26, 62, 7, 50, 29, 35, 8, 40, 53, 28, 12, 60, 33, 38, 5, 37, 29, 60, 39, 56, 0, 30, 18, 50, 34, 59, 25, 14, 44 },
67 { 20, 31, 60, 22, 3, 49, 33, 25, 40, 13, 34, 59, 22, 36, 0, 28, 37, 56, 8, 18, 51, 16, 4, 45, 27, 12, 53, 42, 18, 44, 51, 31, 55, 40, 28, 58, 7, 60, 10, 51, 27, 37, 24, 56, 5, 26, 44, 29, 50, 23, 45, 11, 34, 15, 59, 27, 13, 23, 62, 37, 4, 57, 15, 32, 42, 6, 47, 11, 30, 43, 23, 13, 0, 36, 18, 44, 63, 51, 37, 29, 49, 20, 57, 27, 62, 9, 24, 35, 23, 53, 37, 3, 42, 55, 0, 36, 23, 39, 31, 43, 17, 37, 24, 11, 52, 43, 19, 32, 5, 50, 26, 0, 56, 21, 54, 11, 19, 6, 47, 25, 59, 42, 12, 54, 21, 3, 38, 57 },
68 { 48, 0, 35, 27, 44, 14, 59, 7, 57, 46, 26, 2, 42, 12, 52, 43, 10, 27, 53, 42, 32, 62, 37, 21, 34, 61, 7, 23, 36, 4, 38, 12, 41, 5, 17, 45, 22, 27, 39, 21, 59, 0, 45, 18, 39, 62, 3, 38, 14, 7, 54, 26, 61, 39, 9, 52, 45, 36, 18, 50, 10, 34, 44, 22, 50, 14, 36, 55, 17, 34, 53, 62, 33, 26, 56, 6, 31, 12, 6, 53, 9, 44, 2, 50, 20, 40, 55, 17, 47, 7, 26, 63, 22, 32, 48, 16, 46, 8, 52, 12, 57, 41, 0, 56, 25, 3, 61, 14, 45, 35, 18, 44, 12, 46, 23, 42, 32, 51, 35, 10, 17, 36, 23, 1, 45, 52, 32, 10 },
69 { 37, 15, 43, 8, 63, 39, 21, 31, 16, 37, 19, 62, 30, 46, 17, 60, 21, 48, 1, 23, 6, 25, 11, 56, 1, 40, 30, 58, 15, 54, 21, 59, 9, 63, 35, 56, 11, 51, 2, 46, 34, 14, 53, 7, 30, 11, 51, 19, 60, 40, 30, 1, 24, 50, 20, 32, 3, 56, 5, 25, 31, 13, 61, 2, 29, 60, 25, 20, 51, 2, 27, 8, 18, 42, 10, 45, 21, 34, 43, 17, 62, 29, 41, 14, 34, 6, 30, 43, 2, 57, 33, 13, 45, 12, 27, 62, 4, 55, 21, 35, 5, 27, 45, 33, 16, 47, 30, 54, 22, 10, 51, 27, 63, 7, 49, 1, 58, 22, 15, 43, 53, 7, 57, 39, 27, 12, 61, 24 },
70 { 56, 51, 26, 56, 19, 2, 41, 54, 5, 52, 9, 48, 6, 23, 39, 4, 32, 15, 63, 35, 59, 49, 43, 15, 52, 19, 50, 9, 46, 33, 1, 29, 48, 20, 32, 1, 38, 33, 19, 54, 9, 32, 24, 48, 58, 35, 16, 48, 4, 52, 13, 57, 33, 5, 45, 59, 15, 29, 41, 55, 47, 39, 23, 53, 9, 40, 4, 57, 10, 44, 48, 40, 50, 14, 61, 24, 55, 1, 59, 22, 33, 8, 51, 25, 58, 46, 11, 59, 20, 41, 17, 51, 6, 56, 35, 25, 42, 30, 15, 58, 48, 18, 61, 9, 58, 39, 13, 2, 37, 59, 40, 2, 31, 16, 34, 41, 8, 30, 62, 3, 29, 48, 33, 5, 63, 16, 41, 7 },
71 { 22, 4, 46, 11, 33, 51, 29, 10, 62, 24, 43, 27, 15, 58, 50, 25, 54, 44, 9, 38, 18, 3, 29, 57, 32, 5, 26, 43, 17, 61, 24, 52, 8, 42, 23, 53, 15, 61, 7, 28, 57, 43, 4, 40, 20, 2, 43, 25, 32, 35, 21, 43, 17, 48, 10, 22, 38, 54, 11, 21, 1, 58, 16, 30, 48, 18, 46, 32, 38, 13, 22, 4, 59, 35, 2, 51, 30, 39, 15, 47, 4, 56, 13, 37, 1, 28, 16, 52, 32, 9, 61, 29, 38, 19, 3, 52, 10, 48, 1, 32, 11, 40, 20, 36, 6, 22, 49, 29, 55, 6, 20, 56, 36, 52, 19, 60, 26, 46, 18, 54, 40, 13, 20, 46, 35, 19, 49, 29 },
72 { 61, 17, 34, 53, 23, 6, 48, 35, 20, 40, 1, 56, 36, 29, 11, 34, 7, 41, 14, 30, 55, 20, 46, 8, 24, 38, 63, 2, 37, 10, 45, 14, 34, 49, 6, 13, 44, 25, 49, 41, 21, 12, 61, 15, 54, 29, 63, 12, 56, 8, 49, 2, 62, 36, 28, 61, 0, 25, 41, 63, 35, 8, 44, 6, 37, 62, 7, 21, 63, 28, 55, 31, 16, 24, 41, 19, 9, 57, 27, 36, 18, 42, 31, 62, 22, 55, 38, 4, 27, 47, 1, 40, 14, 54, 43, 20, 60, 23, 38, 63, 25, 51, 2, 53, 26, 63, 10, 42, 17, 34, 47, 25, 13, 5, 44, 11, 55, 2, 38, 27, 6, 60, 52, 25, 9, 55, 1, 40 },
73 { 8, 30, 58, 3, 42, 61, 17, 38, 13, 59, 32, 10, 54, 3, 51, 20, 61, 26, 57, 2, 46, 33, 12, 60, 41, 13, 48, 29, 55, 20, 39, 27, 57, 18, 62, 29, 55, 2, 31, 16, 37, 50, 26, 36, 6, 46, 9, 41, 27, 57, 23, 39, 26, 6, 51, 12, 31, 46, 7, 16, 27, 52, 19, 56, 26, 12, 33, 53, 1, 41, 8, 57, 46, 7, 54, 32, 47, 5, 49, 11, 60, 23, 5, 48, 10, 43, 19, 63, 35, 24, 49, 21, 59, 5, 31, 37, 14, 44, 7, 42, 6, 30, 46, 13, 44, 32, 19, 50, 4, 58, 8, 30, 62, 38, 28, 53, 21, 36, 13, 50, 21, 33, 15, 2, 44, 31, 14, 47 },
74 { 37, 13, 39, 16, 28, 9, 57, 0, 25, 49, 21, 45, 18, 47, 12, 42, 0, 49, 22, 39, 16, 53, 25, 36, 0, 52, 22, 16, 6, 60, 4, 51, 0, 26, 37, 47, 10, 36, 63, 5, 57, 0, 18, 59, 23, 33, 51, 19, 0, 44, 15, 11, 54, 17, 42, 35, 53, 18, 58, 33, 49, 4, 34, 42, 0, 50, 43, 25, 16, 49, 34, 20, 37, 28, 12, 63, 16, 38, 25, 44, 0, 40, 52, 17, 35, 3, 50, 14, 8, 53, 11, 36, 25, 45, 9, 62, 0, 54, 28, 17, 50, 55, 15, 24, 57, 0, 53, 34, 23, 41, 15, 45, 0, 49, 16, 4, 48, 9, 63, 45, 0, 42, 58, 37, 61, 22, 54, 26 },
75 { 0, 50, 21, 47, 54, 36, 27, 45, 52, 4, 34, 15, 63, 29, 37, 59, 17, 31, 6, 61, 28, 5, 48, 18, 59, 27, 34, 56, 44, 31, 35, 12, 41, 59, 16, 3, 40, 20, 50, 22, 30, 40, 52, 10, 45, 3, 59, 22, 37, 61, 29, 46, 31, 58, 2, 22, 9, 43, 3, 39, 14, 61, 24, 54, 15, 29, 11, 60, 39, 17, 5, 61, 0, 44, 50, 3, 31, 14, 58, 21, 54, 28, 15, 45, 60, 26, 33, 58, 44, 22, 60, 2, 57, 34, 49, 27, 18, 34, 21, 59, 29, 4, 36, 41, 8, 39, 28, 11, 62, 26, 53, 20, 35, 24, 59, 32, 29, 39, 24, 31, 57, 23, 11, 28, 5, 36, 11, 59 },
76 { 44, 32, 63, 5, 20, 12, 41, 7, 30, 61, 42, 8, 39, 5, 33, 8, 24, 53, 45, 11, 37, 58, 7, 44, 10, 50, 3, 40, 8, 22, 53, 19, 46, 9, 33, 52, 24, 58, 8, 44, 13, 47, 8, 34, 38, 30, 14, 47, 7, 34, 4, 55, 9, 19, 40, 49, 56, 26, 60, 21, 30, 45, 10, 19, 40, 58, 23, 36, 3, 52, 45, 23, 54, 13, 22, 42, 53, 45, 7, 33, 10, 36, 57, 6, 29, 12, 41, 0, 30, 15, 41, 30, 17, 7, 16, 53, 40, 56, 2, 39, 12, 61, 10, 52, 31, 60, 16, 45, 1, 37, 7, 61, 40, 10, 43, 17, 58, 7, 54, 14, 4, 51, 39, 49, 18, 56, 42, 20 },
77 { 14, 6, 24, 36, 56, 49, 22, 60, 18, 14, 23, 51, 26, 57, 21, 52, 41, 14, 35, 50, 19, 31, 40, 23, 33, 14, 63, 17, 32, 47, 7, 62, 23, 30, 56, 11, 42, 27, 14, 60, 35, 19, 28, 61, 17, 55, 25, 39, 53, 17, 42, 21, 38, 63, 25, 5, 14, 36, 12, 50, 1, 37, 59, 32, 2, 51, 6, 56, 27, 32, 11, 30, 38, 26, 60, 8, 26, 19, 62, 39, 50, 2, 21, 39, 53, 23, 56, 19, 49, 39, 5, 46, 55, 23, 42, 4, 31, 11, 47, 26, 45, 22, 48, 18, 21, 5, 48, 25, 57, 14, 47, 30, 3, 56, 12, 50, 1, 42, 19, 47, 35, 17, 8, 30, 45, 25, 4, 51 },
78 { 28, 58, 43, 1, 31, 8, 33, 2, 44, 55, 32, 1, 60, 12, 46, 27, 4, 62, 23, 1, 56, 13, 62, 2, 54, 36, 25, 51, 1, 57, 26, 42, 3, 49, 17, 38, 1, 48, 31, 4, 54, 3, 50, 24, 1, 49, 5, 63, 13, 27, 52, 1, 48, 13, 45, 33, 52, 30, 46, 20, 55, 28, 6, 48, 24, 38, 20, 47, 14, 62, 48, 9, 58, 4, 36, 30, 56, 1, 34, 12, 18, 63, 25, 48, 4, 16, 37, 7, 62, 10, 52, 28, 13, 50, 36, 63, 24, 51, 15, 58, 8, 33, 1, 38, 56, 35, 42, 9, 33, 51, 22, 18, 48, 32, 27, 37, 23, 61, 33, 11, 59, 29, 62, 1, 53, 10, 60, 33 },
79 { 12, 39, 17, 52, 26, 46, 53, 38, 25, 11, 48, 36, 16, 43, 2, 35, 55, 17, 39, 29, 43, 9, 28, 45, 20, 5, 46, 12, 42, 28, 13, 52, 36, 6, 60, 22, 54, 17, 62, 39, 25, 42, 15, 55, 44, 20, 31, 10, 35, 57, 24, 32, 29, 6, 59, 18, 7, 62, 3, 41, 10, 44, 16, 54, 13, 62, 31, 9, 41, 1, 21, 43, 18, 47, 15, 40, 11, 49, 28, 55, 46, 30, 8, 43, 32, 61, 28, 47, 25, 34, 21, 61, 32, 1, 20, 9, 46, 6, 35, 19, 41, 54, 27, 63, 14, 3, 51, 20, 62, 2, 38, 55, 8, 21, 63, 6, 46, 9, 26, 51, 3, 24, 43, 34, 16, 41, 18, 48 },
80 { 62, 23, 55, 9, 15, 62, 19, 13, 58, 40, 6, 30, 54, 19, 50, 31, 10, 44, 6, 59, 21, 47, 51, 15, 60, 39, 30, 54, 21, 61, 19, 33, 14, 29, 43, 11, 34, 45, 7, 21, 10, 56, 36, 6, 38, 11, 58, 42, 2, 47, 11, 60, 50, 16, 41, 28, 38, 23, 47, 17, 35, 63, 22, 33, 42, 5, 45, 17, 53, 35, 25, 56, 33, 6, 51, 19, 60, 23, 43, 15, 5, 40, 58, 13, 51, 1, 45, 11, 54, 3, 43, 8, 37, 48, 59, 29, 39, 21, 61, 43, 3, 31, 10, 44, 24, 29, 60, 12, 28, 40, 11, 25, 43, 52, 14, 41, 16, 57, 44, 20, 40, 55, 12, 21, 57, 27, 35, 2 },
81 { 37, 6, 31, 42, 40, 4, 29, 50, 0, 20, 63, 28, 9, 58, 14, 24, 63, 26, 48, 16, 34, 4, 32, 38, 23, 11, 58, 4, 37, 9, 45, 5, 63, 48, 26, 57, 2, 28, 32, 51, 46, 29, 13, 62, 27, 46, 28, 18, 50, 15, 40, 4, 19, 34, 54, 0, 53, 9, 26, 58, 28, 5, 49, 0, 57, 27, 19, 60, 29, 8, 59, 12, 37, 63, 24, 46, 3, 37, 6, 52, 26, 32, 20, 36, 9, 22, 59, 18, 35, 51, 14, 57, 17, 24, 12, 44, 56, 0, 30, 13, 59, 20, 49, 17, 54, 43, 6, 34, 46, 17, 58, 36, 0, 34, 29, 54, 25, 2, 36, 15, 60, 6, 37, 46, 4, 50, 9, 45 },
82 { 19, 59, 48, 3, 24, 60, 44, 22, 34, 51, 15, 45, 41, 5, 33, 47, 0, 37, 12, 55, 25, 54, 8, 57, 0, 47, 18, 34, 49, 15, 55, 24, 40, 20, 8, 35, 53, 13, 41, 18, 0, 59, 22, 33, 4, 52, 8, 60, 24, 36, 31, 56, 45, 26, 10, 43, 15, 56, 36, 4, 51, 14, 39, 30, 12, 55, 36, 2, 39, 49, 4, 44, 17, 0, 32, 13, 53, 35, 59, 17, 62, 0, 55, 24, 52, 38, 31, 6, 42, 19, 29, 40, 4, 54, 33, 5, 16, 27, 52, 37, 23, 55, 7, 37, 0, 39, 23, 49, 4, 53, 31, 15, 59, 10, 50, 4, 60, 34, 48, 7, 31, 49, 27, 14, 62, 22, 53, 29 },
83 { 46, 21, 14, 51, 36, 17, 7, 57, 10, 32, 3, 37, 22, 60, 39, 18, 56, 20, 42, 3, 36, 10, 44, 26, 41, 29, 53, 27, 2, 39, 30, 52, 0, 59, 15, 48, 23, 61, 6, 58, 37, 12, 40, 49, 16, 39, 20, 44, 0, 62, 8, 21, 3, 59, 23, 32, 49, 31, 12, 44, 22, 59, 18, 50, 24, 7, 43, 52, 15, 23, 41, 26, 51, 28, 55, 39, 21, 27, 10, 42, 12, 45, 27, 47, 3, 15, 63, 26, 55, 0, 60, 26, 45, 18, 62, 38, 58, 49, 8, 47, 4, 33, 46, 29, 57, 13, 56, 16, 59, 21, 5, 47, 23, 39, 18, 44, 13, 22, 28, 53, 19, 0, 58, 32, 41, 7, 26, 13 },
84 { 0, 56, 34, 28, 11, 55, 31, 47, 26, 41, 56, 13, 53, 28, 11, 49, 7, 52, 32, 61, 50, 22, 63, 17, 13, 56, 7, 19, 43, 62, 10, 21, 37, 32, 43, 4, 38, 19, 44, 25, 31, 54, 5, 23, 61, 30, 53, 12, 35, 22, 43, 53, 37, 48, 7, 62, 20, 2, 61, 41, 8, 34, 47, 9, 63, 34, 28, 10, 55, 33, 14, 57, 7, 47, 9, 61, 4, 49, 31, 50, 21, 38, 8, 16, 57, 44, 33, 5, 49, 36, 12, 50, 7, 34, 10, 25, 2, 22, 36, 15, 26, 61, 18, 9, 22, 46, 32, 8, 27, 37, 44, 30, 55, 3, 62, 24, 38, 56, 5, 45, 38, 24, 43, 10, 19, 54, 39, 61 },
85 { 41, 30, 8, 63, 43, 23, 38, 3, 62, 19, 8, 49, 25, 1, 58, 30, 23, 40, 9, 28, 18, 40, 6, 38, 49, 22, 35, 59, 8, 27, 50, 5, 56, 17, 11, 50, 30, 9, 55, 2, 51, 19, 34, 47, 9, 41, 6, 26, 48, 57, 14, 28, 17, 12, 39, 13, 37, 46, 25, 19, 54, 27, 1, 37, 16, 45, 20, 60, 1, 48, 20, 38, 31, 22, 42, 15, 19, 44, 1, 61, 6, 34, 56, 40, 29, 10, 20, 46, 13, 22, 41, 23, 59, 42, 30, 51, 45, 13, 63, 53, 42, 12, 51, 38, 62, 2, 26, 41, 50, 1, 61, 10, 19, 42, 31, 8, 49, 32, 12, 63, 9, 52, 16, 56, 36, 2, 31, 16 },
86 { 52, 5, 47, 20, 1, 53, 12, 50, 16, 35, 43, 21, 33, 43, 16, 44, 3, 59, 14, 46, 1, 30, 60, 33, 2, 45, 12, 42, 31, 47, 14, 33, 46, 25, 55, 27, 60, 36, 16, 42, 14, 46, 26, 1, 55, 15, 63, 32, 2, 38, 5, 47, 33, 61, 30, 52, 4, 57, 6, 38, 11, 43, 61, 24, 52, 3, 31, 22, 42, 10, 62, 3, 59, 11, 35, 57, 33, 54, 24, 14, 29, 48, 18, 2, 60, 41, 53, 24, 32, 62, 3, 53, 15, 1, 55, 17, 32, 40, 6, 31, 1, 40, 28, 5, 35, 52, 19, 63, 13, 33, 17, 41, 52, 26, 15, 57, 1, 20, 42, 17, 35, 27, 48, 5, 25, 50, 44, 11 },
87 { 35, 25, 38, 57, 33, 17, 40, 6, 59, 27, 54, 5, 61, 10, 52, 26, 36, 19, 51, 35, 57, 48, 11, 20, 54, 25, 61, 16, 1, 58, 24, 61, 3, 39, 7, 47, 1, 22, 49, 28, 63, 10, 58, 32, 17, 36, 45, 19, 51, 29, 59, 10, 50, 1, 23, 42, 18, 29, 51, 21, 56, 32, 14, 5, 40, 58, 47, 13, 54, 35, 29, 45, 18, 52, 26, 2, 38, 8, 46, 36, 58, 11, 52, 35, 17, 28, 1, 58, 9, 39, 17, 28, 37, 48, 20, 9, 57, 24, 50, 19, 58, 16, 48, 25, 43, 11, 35, 6, 45, 24, 56, 4, 36, 7, 47, 35, 52, 28, 59, 30, 2, 61, 21, 33, 63, 12, 18, 59 },
88 { 3, 49, 15, 10, 27, 61, 25, 45, 30, 0, 14, 47, 31, 38, 17, 62, 7, 55, 27, 4, 15, 24, 42, 52, 10, 34, 5, 51, 36, 18, 41, 11, 35, 21, 62, 13, 33, 57, 8, 35, 5, 40, 21, 43, 52, 3, 24, 56, 11, 16, 33, 25, 41, 20, 55, 8, 60, 35, 15, 48, 2, 57, 30, 49, 18, 25, 6, 39, 17, 57, 7, 25, 43, 5, 49, 16, 62, 22, 55, 4, 25, 43, 23, 7, 50, 11, 37, 48, 14, 51, 33, 57, 7, 27, 39, 46, 4, 29, 11, 43, 34, 56, 7, 60, 20, 54, 30, 57, 22, 49, 9, 33, 54, 14, 63, 23, 6, 43, 10, 40, 50, 13, 44, 8, 38, 33, 46, 23 },
89 { 55, 39, 22, 50, 44, 4, 36, 9, 52, 23, 37, 59, 21, 2, 46, 13, 31, 41, 11, 45, 62, 29, 6, 37, 19, 48, 30, 23, 44, 7, 53, 28, 54, 16, 41, 29, 44, 18, 52, 24, 60, 15, 48, 7, 27, 59, 9, 34, 42, 54, 7, 63, 4, 46, 31, 27, 45, 0, 40, 26, 34, 17, 37, 10, 53, 29, 36, 50, 2, 27, 51, 11, 61, 37, 23, 41, 30, 7, 18, 50, 39, 14, 63, 32, 45, 61, 19, 30, 25, 44, 2, 47, 23, 63, 11, 34, 59, 37, 60, 3, 22, 14, 44, 30, 15, 0, 47, 15, 3, 38, 61, 20, 27, 45, 11, 39, 51, 16, 55, 3, 22, 54, 29, 58, 1, 57, 6, 29 },
90 { 9, 17, 60, 2, 34, 56, 20, 62, 39, 12, 49, 6, 29, 56, 34, 48, 0, 58, 22, 38, 18, 43, 56, 0, 63, 14, 55, 3, 59, 31, 15, 45, 0, 49, 6, 58, 3, 38, 12, 45, 0, 37, 29, 57, 13, 39, 30, 49, 0, 23, 44, 36, 16, 57, 13, 54, 11, 24, 63, 9, 53, 7, 62, 42, 0, 59, 15, 23, 63, 34, 40, 16, 32, 0, 53, 12, 48, 28, 59, 33, 0, 53, 9, 27, 3, 22, 54, 5, 56, 9, 61, 13, 42, 14, 52, 19, 0, 21, 47, 27, 53, 36, 3, 50, 39, 58, 25, 40, 53, 28, 12, 50, 0, 59, 32, 2, 21, 34, 26, 46, 37, 7, 18, 47, 24, 14, 53, 42 },
91 { 61, 32, 13, 54, 29, 7, 46, 13, 28, 57, 18, 41, 53, 15, 9, 39, 24, 49, 33, 3, 53, 9, 26, 32, 40, 28, 46, 39, 25, 9, 56, 21, 63, 37, 26, 22, 51, 27, 17, 56, 31, 53, 4, 43, 22, 46, 12, 18, 60, 40, 20, 26, 50, 21, 39, 5, 49, 33, 16, 44, 22, 46, 20, 32, 24, 45, 8, 43, 12, 46, 4, 48, 56, 20, 29, 58, 3, 40, 10, 42, 31, 21, 47, 41, 56, 38, 15, 42, 36, 27, 20, 33, 55, 3, 26, 44, 31, 54, 12, 35, 9, 63, 28, 10, 21, 32, 9, 60, 17, 8, 43, 29, 40, 16, 36, 48, 60, 7, 57, 14, 62, 31, 42, 15, 36, 40, 20, 26 },
92 { 0, 37, 47, 23, 41, 18, 32, 48, 1, 35, 8, 25, 4, 26, 63, 20, 54, 8, 16, 61, 35, 23, 51, 15, 58, 7, 12, 20, 50, 34, 42, 4, 38, 10, 32, 47, 8, 60, 41, 20, 9, 25, 50, 19, 62, 1, 37, 56, 28, 8, 53, 11, 3, 58, 34, 43, 19, 60, 38, 4, 58, 31, 3, 51, 11, 55, 38, 30, 21, 58, 19, 26, 9, 44, 36, 13, 46, 20, 62, 24, 13, 60, 5, 28, 12, 34, 7, 59, 0, 53, 45, 6, 38, 30, 50, 7, 62, 16, 41, 5, 46, 18, 55, 42, 51, 5, 45, 23, 34, 48, 19, 58, 5, 25, 54, 19, 13, 41, 28, 21, 0, 49, 10, 60, 4, 51, 9, 45 },
93 { 19, 28, 6, 58, 10, 51, 4, 22, 55, 42, 60, 45, 34, 51, 42, 5, 30, 45, 27, 40, 13, 47, 4, 49, 21, 38, 60, 29, 2, 57, 17, 27, 52, 19, 61, 14, 30, 34, 2, 44, 63, 33, 11, 35, 16, 51, 25, 6, 14, 47, 31, 61, 37, 29, 18, 8, 52, 2, 28, 54, 13, 41, 15, 62, 35, 18, 2, 60, 6, 33, 41, 61, 31, 6, 56, 17, 34, 50, 6, 52, 44, 35, 16, 51, 59, 24, 48, 18, 31, 40, 16, 49, 21, 60, 17, 39, 10, 49, 32, 57, 24, 39, 1, 25, 18, 62, 37, 12, 56, 1, 37, 11, 52, 44, 9, 30, 47, 4, 51, 40, 55, 25, 34, 27, 56, 30, 32, 54 },
94 { 63, 40, 49, 15, 43, 26, 63, 38, 16, 20, 30, 12, 57, 14, 19, 60, 36, 12, 59, 2, 57, 17, 42, 31, 1, 44, 16, 35, 47, 11, 32, 48, 13, 43, 1, 39, 51, 12, 57, 23, 6, 40, 53, 3, 55, 31, 39, 60, 35, 44, 5, 15, 45, 1, 62, 41, 26, 14, 47, 22, 36, 27, 50, 9, 26, 47, 52, 28, 54, 16, 1, 13, 51, 39, 23, 63, 1, 30, 15, 26, 2, 57, 19, 37, 1, 44, 21, 50, 13, 63, 8, 24, 56, 1, 35, 25, 58, 20, 2, 28, 14, 51, 33, 59, 13, 30, 4, 49, 31, 24, 63, 26, 33, 3, 58, 38, 62, 24, 32, 8, 17, 45, 5, 48, 18, 3, 43, 11 },
95 { 21, 4, 24, 34, 59, 1, 37, 11, 53, 5, 47, 2, 22, 40, 32, 1, 24, 50, 21, 29, 38, 25, 63, 8, 55, 24, 53, 6, 62, 23, 59, 3, 54, 20, 58, 24, 5, 46, 15, 38, 48, 14, 27, 42, 23, 7, 46, 10, 17, 58, 25, 52, 23, 32, 49, 12, 55, 30, 40, 7, 59, 1, 56, 21, 39, 4, 23, 15, 37, 46, 55, 42, 21, 4, 48, 8, 45, 54, 37, 55, 32, 8, 46, 10, 30, 54, 4, 41, 25, 29, 36, 48, 11, 43, 14, 47, 5, 43, 53, 36, 61, 10, 45, 6, 41, 54, 27, 43, 16, 55, 6, 46, 18, 42, 23, 15, 1, 45, 12, 60, 37, 22, 62, 12, 39, 59, 16, 52 },
96 { 47, 35, 56, 7, 19, 46, 31, 50, 33, 24, 61, 35, 50, 7, 53, 44, 55, 6, 46, 10, 52, 5, 21, 43, 36, 10, 18, 41, 26, 37, 8, 29, 40, 36, 9, 49, 34, 26, 61, 21, 7, 59, 18, 62, 29, 54, 20, 32, 51, 0, 40, 10, 55, 6, 20, 36, 9, 61, 5, 51, 44, 19, 33, 43, 13, 57, 40, 63, 8, 24, 29, 10, 60, 34, 27, 40, 25, 18, 10, 42, 21, 49, 26, 62, 38, 12, 33, 61, 5, 57, 2, 19, 54, 28, 62, 22, 38, 31, 16, 7, 22, 47, 29, 17, 35, 8, 20, 51, 2, 40, 22, 50, 13, 61, 28, 53, 35, 20, 56, 30, 2, 53, 14, 41, 23, 34, 8, 31 },
97 { 12, 2, 42, 29, 52, 13, 21, 8, 55, 14, 41, 17, 28, 58, 23, 11, 17, 36, 31, 62, 17, 34, 50, 14, 28, 61, 33, 52, 2, 51, 17, 45, 7, 25, 62, 30, 18, 55, 0, 42, 30, 35, 45, 1, 12, 48, 3, 63, 21, 36, 30, 48, 19, 59, 43, 27, 46, 17, 34, 25, 12, 29, 53, 6, 48, 31, 11, 34, 49, 3, 36, 50, 19, 47, 14, 61, 11, 36, 58, 4, 60, 14, 39, 22, 6, 52, 15, 35, 17, 46, 31, 42, 9, 34, 3, 52, 12, 60, 26, 56, 40, 2, 53, 23, 57, 38, 62, 14, 36, 59, 10, 31, 39, 6, 49, 9, 41, 26, 5, 48, 43, 27, 33, 58, 1, 50, 25, 57 },
98 { 61, 37, 15, 61, 3, 39, 58, 43, 26, 0, 44, 10, 47, 3, 37, 63, 28, 43, 13, 39, 3, 57, 30, 59, 0, 48, 5, 43, 13, 22, 60, 33, 55, 15, 42, 4, 52, 10, 45, 13, 54, 4, 24, 49, 37, 26, 41, 14, 42, 9, 61, 13, 38, 23, 3, 53, 0, 58, 21, 42, 63, 10, 17, 61, 25, 0, 58, 28, 17, 44, 57, 12, 27, 0, 55, 5, 52, 28, 23, 47, 29, 0, 43, 17, 58, 28, 47, 23, 55, 10, 58, 23, 51, 40, 18, 33, 45, 0, 49, 8, 32, 61, 19, 48, 0, 26, 7, 47, 29, 18, 44, 0, 56, 34, 20, 59, 15, 51, 37, 18, 10, 52, 7, 20, 46, 9, 38, 17 },
99 { 6, 27, 48, 23, 45, 29, 5, 18, 38, 62, 27, 56, 20, 32, 15, 9, 48, 0, 54, 22, 45, 20, 7, 41, 23, 39, 19, 27, 58, 31, 44, 0, 12, 50, 23, 56, 20, 39, 32, 59, 16, 52, 33, 9, 57, 22, 6, 58, 28, 50, 24, 2, 56, 35, 16, 45, 32, 38, 15, 54, 2, 38, 46, 22, 35, 45, 20, 5, 52, 25, 7, 35, 59, 32, 22, 43, 38, 3, 51, 16, 34, 53, 32, 50, 3, 40, 8, 43, 0, 39, 27, 4, 14, 61, 8, 55, 15, 41, 20, 44, 27, 13, 39, 11, 46, 42, 54, 33, 4, 52, 23, 61, 14, 25, 43, 2, 33, 11, 63, 29, 61, 17, 40, 55, 22, 62, 28, 44 },
100 { 20, 54, 8, 56, 35, 10, 63, 31, 52, 12, 48, 6, 59, 41, 52, 33, 19, 58, 25, 49, 11, 37, 47, 12, 54, 15, 56, 35, 7, 47, 16, 53, 28, 34, 5, 37, 28, 8, 48, 3, 28, 38, 18, 61, 16, 43, 53, 32, 4, 17, 47, 27, 44, 8, 63, 10, 25, 49, 6, 37, 24, 52, 32, 3, 50, 12, 41, 56, 38, 14, 62, 20, 40, 16, 53, 31, 18, 63, 41, 9, 59, 7, 13, 25, 57, 20, 63, 26, 53, 18, 48, 62, 30, 46, 21, 25, 58, 29, 36, 4, 55, 34, 6, 60, 31, 16, 21, 12, 58, 38, 9, 29, 47, 7, 52, 30, 57, 44, 22, 0, 35, 45, 3, 31, 14, 36, 0, 51 },
101 { 42, 14, 33, 24, 16, 49, 40, 2, 22, 33, 16, 36, 25, 1, 21, 61, 38, 8, 33, 4, 62, 26, 29, 60, 6, 46, 30, 11, 63, 4, 36, 40, 19, 57, 46, 11, 41, 63, 22, 25, 58, 10, 46, 2, 34, 27, 11, 38, 56, 34, 12, 53, 18, 33, 41, 51, 13, 28, 60, 20, 47, 14, 29, 59, 16, 62, 8, 22, 32, 47, 9, 49, 2, 44, 7, 12, 45, 6, 20, 27, 45, 24, 62, 42, 36, 11, 33, 15, 37, 7, 32, 10, 37, 1, 35, 50, 6, 11, 63, 24, 52, 15, 50, 24, 3, 37, 56, 27, 34, 22, 49, 16, 36, 62, 17, 39, 4, 15, 54, 24, 50, 8, 58, 26, 49, 54, 11, 30 },
102 { 4, 59, 41, 1, 53, 12, 25, 45, 59, 7, 51, 39, 54, 14, 46, 4, 27, 53, 16, 44, 18, 51, 1, 32, 25, 2, 50, 40, 20, 54, 24, 9, 62, 2, 27, 60, 1, 17, 36, 50, 6, 40, 30, 55, 41, 19, 49, 1, 21, 60, 40, 5, 62, 1, 22, 30, 57, 4, 43, 31, 1, 55, 40, 7, 27, 37, 30, 54, 1, 19, 42, 30, 56, 26, 62, 49, 24, 57, 37, 56, 2, 39, 16, 5, 30, 55, 3, 49, 60, 23, 56, 44, 17, 52, 13, 42, 28, 48, 18, 45, 9, 37, 21, 41, 58, 10, 48, 1, 63, 5, 41, 57, 2, 24, 12, 48, 27, 42, 32, 46, 13, 38, 19, 34, 5, 41, 25, 60 },
103 { 39, 28, 21, 46, 32, 57, 36, 9, 19, 42, 4, 29, 11, 43, 30, 49, 13, 42, 35, 56, 9, 39, 15, 52, 36, 61, 18, 26, 45, 14, 31, 48, 21, 43, 14, 33, 49, 54, 14, 44, 21, 62, 13, 23, 8, 62, 15, 51, 44, 7, 30, 37, 20, 42, 56, 7, 39, 18, 50, 11, 61, 9, 19, 43, 57, 2, 48, 11, 39, 60, 28, 4, 37, 17, 35, 1, 33, 11, 31, 14, 48, 19, 35, 51, 46, 21, 44, 29, 12, 41, 2, 22, 58, 26, 54, 4, 59, 38, 2, 33, 57, 1, 63, 13, 28, 51, 15, 40, 18, 45, 8, 30, 43, 37, 54, 19, 8, 59, 21, 6, 60, 29, 55, 10, 63, 15, 47, 17 },
104 { 3, 50, 10, 62, 18, 5, 27, 49, 60, 23, 55, 18, 62, 24, 56, 10, 59, 28, 2, 23, 34, 59, 43, 20, 10, 42, 8, 49, 1, 37, 57, 6, 51, 29, 53, 7, 23, 31, 5, 32, 51, 0, 35, 54, 45, 31, 5, 26, 36, 24, 55, 15, 48, 29, 14, 48, 26, 60, 21, 41, 36, 26, 50, 33, 14, 44, 17, 24, 52, 15, 46, 23, 54, 6, 47, 21, 60, 50, 4, 53, 29, 61, 8, 23, 1, 60, 19, 6, 53, 16, 47, 34, 6, 39, 16, 31, 12, 20, 53, 22, 30, 43, 25, 46, 35, 6, 44, 32, 53, 26, 55, 19, 11, 59, 5, 33, 51, 1, 35, 53, 25, 3, 42, 23, 44, 32, 7, 53 },
105 { 22, 44, 37, 6, 26, 51, 38, 0, 34, 13, 31, 46, 3, 37, 6, 19, 40, 21, 47, 63, 12, 5, 29, 55, 22, 58, 34, 28, 60, 22, 11, 41, 17, 38, 9, 44, 59, 39, 56, 19, 11, 47, 25, 15, 3, 39, 57, 17, 61, 11, 46, 3, 58, 9, 54, 35, 2, 34, 8, 45, 15, 56, 5, 23, 53, 33, 63, 35, 4, 59, 10, 51, 13, 61, 29, 41, 15, 25, 43, 19, 40, 10, 54, 33, 41, 12, 38, 51, 31, 26, 61, 9, 30, 45, 24, 62, 49, 40, 10, 61, 14, 49, 5, 17, 54, 20, 60, 23, 3, 13, 35, 50, 32, 23, 46, 27, 38, 63, 16, 12, 39, 48, 18, 51, 1, 27, 56, 35 },
106 { 63, 15, 30, 55, 43, 14, 57, 17, 53, 44, 7, 48, 26, 50, 32, 60, 0, 53, 14, 31, 50, 24, 46, 0, 38, 13, 4, 52, 16, 45, 30, 59, 0, 25, 55, 35, 16, 10, 26, 42, 58, 29, 60, 38, 50, 22, 28, 47, 0, 50, 28, 19, 33, 39, 11, 44, 16, 52, 24, 59, 3, 38, 27, 51, 0, 21, 7, 42, 26, 34, 21, 40, 33, 18, 39, 3, 54, 38, 8, 59, 0, 44, 27, 15, 58, 28, 57, 9, 43, 0, 36, 50, 20, 59, 8, 34, 0, 27, 47, 7, 36, 19, 56, 32, 0, 38, 11, 29, 62, 47, 6, 61, 0, 41, 14, 56, 10, 23, 45, 31, 57, 8, 36, 13, 58, 38, 11, 19 },
107 { 0, 34, 12, 47, 21, 2, 40, 30, 11, 25, 61, 20, 40, 15, 35, 22, 45, 36, 7, 41, 17, 57, 9, 48, 32, 62, 44, 24, 35, 3, 54, 13, 33, 63, 19, 4, 48, 22, 62, 2, 37, 8, 33, 6, 20, 52, 9, 32, 43, 13, 39, 63, 25, 4, 49, 23, 62, 32, 9, 30, 48, 18, 63, 12, 46, 29, 58, 13, 48, 8, 57, 31, 0, 51, 9, 58, 12, 22, 47, 29, 35, 22, 49, 5, 46, 4, 34, 20, 63, 24, 56, 11, 41, 3, 51, 19, 56, 35, 17, 58, 28, 42, 9, 45, 59, 26, 51, 42, 17, 36, 25, 15, 53, 21, 44, 3, 30, 55, 5, 50, 21, 28, 61, 32, 6, 49, 28, 46 },
108 { 58, 42, 60, 4, 31, 59, 22, 63, 35, 38, 9, 54, 1, 57, 8, 51, 16, 58, 27, 53, 3, 38, 30, 15, 27, 6, 19, 56, 10, 50, 21, 36, 47, 5, 43, 28, 51, 32, 13, 46, 18, 54, 16, 43, 63, 12, 36, 59, 22, 34, 5, 52, 17, 59, 27, 41, 0, 19, 55, 37, 13, 43, 6, 34, 41, 10, 36, 55, 19, 44, 3, 16, 58, 27, 49, 25, 32, 62, 17, 55, 13, 63, 18, 52, 25, 37, 17, 48, 13, 32, 5, 46, 28, 37, 14, 43, 25, 5, 51, 39, 3, 52, 33, 22, 8, 40, 12, 4, 57, 9, 46, 39, 28, 58, 13, 62, 17, 42, 19, 36, 0, 47, 16, 43, 24, 21, 54, 13 },
109 { 25, 9, 23, 50, 36, 8, 45, 14, 3, 51, 16, 28, 44, 12, 42, 29, 4, 26, 10, 47, 22, 61, 18, 54, 51, 39, 46, 13, 41, 26, 58, 7, 18, 39, 12, 57, 15, 1, 52, 27, 41, 23, 48, 1, 27, 45, 18, 2, 57, 26, 55, 8, 43, 31, 6, 58, 14, 51, 40, 5, 61, 31, 24, 54, 17, 60, 22, 1, 39, 30, 53, 45, 36, 13, 43, 5, 45, 2, 37, 6, 34, 42, 2, 39, 10, 62, 7, 54, 40, 18, 60, 15, 52, 21, 63, 8, 55, 46, 15, 30, 23, 13, 62, 16, 50, 24, 58, 31, 48, 21, 34, 2, 49, 7, 31, 37, 26, 48, 9, 61, 40, 11, 52, 2, 60, 40, 4, 37 },
110 { 52, 28, 39, 16, 54, 19, 29, 55, 42, 20, 58, 33, 24, 63, 18, 55, 39, 62, 43, 34, 12, 40, 6, 35, 2, 25, 8, 62, 34, 1, 31, 42, 61, 27, 53, 24, 40, 61, 34, 8, 59, 4, 30, 56, 40, 6, 53, 42, 10, 48, 16, 37, 12, 46, 21, 36, 47, 11, 28, 45, 22, 10, 57, 2, 49, 31, 14, 44, 61, 11, 25, 6, 23, 63, 18, 36, 28, 56, 20, 51, 11, 48, 27, 56, 32, 22, 45, 30, 2, 42, 27, 39, 1, 44, 23, 31, 38, 22, 11, 61, 43, 54, 4, 47, 35, 2, 44, 16, 28, 54, 12, 62, 18, 43, 10, 52, 1, 58, 33, 15, 29, 56, 20, 34, 9, 30, 48, 17 },
111 { 46, 2, 56, 11, 41, 1, 49, 6, 27, 47, 2, 48, 5, 32, 37, 3, 13, 19, 32, 1, 55, 28, 60, 17, 43, 59, 32, 20, 49, 16, 55, 23, 14, 46, 2, 36, 6, 30, 20, 49, 12, 47, 35, 14, 21, 60, 29, 14, 35, 24, 46, 1, 56, 29, 53, 8, 33, 23, 56, 1, 35, 46, 20, 39, 26, 4, 53, 28, 17, 38, 60, 34, 48, 9, 55, 15, 46, 7, 41, 31, 60, 24, 16, 36, 1, 59, 19, 52, 35, 6, 55, 11, 59, 33, 7, 57, 4, 29, 48, 1, 19, 26, 37, 30, 18, 63, 37, 6, 59, 1, 40, 24, 56, 33, 46, 22, 35, 7, 24, 53, 39, 5, 26, 45, 55, 18, 62, 7 },
112 { 20, 60, 29, 34, 20, 62, 33, 52, 10, 36, 13, 60, 41, 21, 50, 27, 56, 49, 8, 51, 21, 45, 11, 48, 8, 23, 53, 3, 29, 44, 5, 52, 9, 32, 50, 17, 43, 56, 3, 38, 24, 10, 62, 25, 51, 9, 33, 49, 61, 7, 30, 62, 22, 19, 2, 42, 63, 5, 49, 18, 60, 15, 52, 7, 43, 56, 23, 50, 5, 50, 2, 20, 41, 30, 1, 52, 22, 61, 14, 26, 3, 43, 53, 7, 47, 28, 11, 14, 23, 58, 33, 25, 47, 13, 50, 17, 40, 54, 34, 60, 41, 6, 59, 14, 50, 7, 25, 55, 20, 42, 51, 8, 27, 4, 16, 60, 28, 50, 44, 3, 22, 49, 63, 12, 33, 1, 43, 31 },
113 { 36, 5, 46, 8, 44, 24, 13, 39, 25, 57, 31, 18, 8, 52, 10, 45, 6, 30, 36, 24, 63, 4, 33, 26, 57, 40, 15, 56, 37, 12, 40, 25, 37, 58, 11, 63, 21, 45, 16, 60, 31, 53, 18, 33, 3, 45, 23, 0, 20, 54, 40, 15, 50, 38, 60, 16, 25, 42, 29, 38, 7, 41, 25, 62, 18, 33, 8, 35, 42, 16, 32, 56, 12, 39, 59, 19, 34, 9, 49, 38, 57, 12, 21, 50, 14, 40, 61, 44, 50, 9, 49, 19, 3, 29, 35, 62, 12, 24, 7, 18, 52, 32, 10, 46, 21, 41, 32, 11, 36, 29, 14, 34, 60, 38, 54, 11, 41, 14, 19, 57, 32, 16, 7, 41, 51, 25, 14, 57 },
114 { 53, 18, 26, 50, 15, 58, 4, 63, 17, 43, 7, 40, 61, 35, 15, 41, 23, 60, 16, 38, 14, 42, 19, 50, 0, 31, 10, 46, 27, 63, 18, 60, 0, 20, 29, 39, 8, 26, 37, 5, 42, 0, 44, 39, 57, 17, 58, 41, 28, 37, 4, 32, 9, 44, 12, 31, 54, 10, 59, 14, 27, 53, 12, 36, 0, 47, 13, 63, 21, 58, 10, 24, 50, 27, 4, 26, 44, 53, 31, 0, 18, 42, 29, 33, 57, 4, 32, 26, 0, 38, 16, 61, 41, 53, 20, 0, 42, 44, 49, 27, 10, 56, 39, 0, 57, 15, 53, 49, 3, 61, 22, 47, 17, 5, 49, 26, 2, 63, 39, 10, 47, 27, 37, 23, 4, 59, 38, 10 },
115 { 23, 39, 61, 3, 37, 28, 48, 31, 0, 34, 51, 23, 2, 26, 58, 0, 53, 11, 46, 1, 57, 29, 52, 14, 37, 61, 21, 35, 2, 49, 7, 34, 47, 55, 4, 33, 54, 13, 58, 52, 19, 50, 22, 7, 13, 29, 36, 11, 51, 17, 60, 25, 55, 4, 34, 51, 0, 35, 20, 48, 32, 3, 51, 30, 59, 28, 40, 3, 46, 29, 54, 43, 7, 62, 47, 11, 39, 4, 23, 46, 55, 8, 63, 5, 25, 37, 18, 46, 21, 56, 31, 5, 36, 8, 45, 58, 26, 15, 2, 36, 47, 21, 29, 44, 25, 34, 3, 27, 43, 10, 52, 0, 45, 30, 24, 36, 43, 18, 34, 59, 0, 52, 61, 15, 44, 19, 30, 49 },
116 { 0, 27, 12, 43, 54, 9, 22, 53, 21, 46, 15, 55, 29, 47, 20, 33, 39, 28, 59, 35, 9, 44, 5, 24, 47, 7, 52, 17, 56, 22, 30, 42, 14, 26, 45, 18, 49, 1, 24, 34, 11, 27, 55, 32, 61, 47, 2, 56, 6, 44, 13, 47, 36, 27, 58, 22, 16, 47, 40, 4, 57, 38, 21, 45, 16, 9, 56, 26, 11, 38, 0, 22, 36, 17, 33, 57, 16, 30, 62, 15, 35, 40, 20, 45, 59, 10, 54, 8, 63, 13, 52, 27, 22, 57, 28, 12, 32, 51, 55, 22, 63, 4, 16, 54, 12, 62, 45, 19, 58, 13, 32, 40, 20, 56, 7, 57, 9, 54, 6, 29, 42, 21, 8, 55, 35, 47, 6, 41 },
117 { 56, 33, 58, 32, 19, 35, 42, 6, 59, 11, 38, 5, 49, 12, 62, 7, 52, 17, 5, 25, 54, 20, 61, 31, 54, 27, 41, 11, 44, 5, 59, 12, 36, 51, 10, 61, 28, 41, 48, 9, 43, 63, 5, 40, 20, 8, 49, 26, 34, 21, 58, 1, 18, 45, 7, 39, 61, 26, 8, 50, 23, 10, 63, 5, 55, 37, 19, 49, 52, 15, 59, 47, 13, 54, 1, 25, 42, 58, 10, 48, 3, 27, 50, 1, 17, 48, 34, 41, 16, 40, 2, 45, 10, 39, 17, 61, 5, 38, 19, 9, 41, 31, 60, 38, 5, 23, 36, 8, 30, 55, 24, 63, 12, 48, 14, 51, 31, 20, 45, 25, 12, 50, 32, 2, 28, 11, 62, 14 },
118 { 44, 16, 7, 48, 1, 62, 16, 50, 27, 33, 61, 25, 17, 44, 31, 14, 22, 43, 32, 48, 18, 40, 8, 36, 3, 16, 33, 62, 23, 38, 25, 53, 2, 21, 41, 6, 22, 15, 59, 29, 16, 37, 26, 15, 52, 42, 23, 15, 54, 39, 10, 30, 53, 11, 49, 24, 2, 43, 55, 17, 34, 44, 15, 31, 24, 44, 2, 32, 7, 35, 25, 5, 40, 45, 29, 51, 6, 21, 37, 52, 24, 60, 13, 31, 53, 23, 2, 28, 49, 24, 31, 60, 20, 51, 1, 34, 48, 14, 59, 33, 50, 1, 18, 33, 48, 60, 17, 51, 39, 6, 38, 2, 35, 29, 40, 23, 1, 62, 15, 53, 37, 17, 46, 57, 40, 51, 24, 22 },
119 { 5, 37, 52, 24, 45, 13, 40, 3, 45, 9, 19, 42, 56, 4, 37, 46, 56, 2, 63, 11, 51, 1, 49, 13, 59, 45, 39, 1, 48, 15, 58, 9, 46, 31, 54, 35, 57, 38, 3, 46, 56, 4, 47, 57, 1, 30, 38, 63, 3, 46, 28, 63, 41, 14, 33, 62, 19, 32, 13, 28, 61, 1, 53, 42, 11, 60, 22, 62, 27, 42, 61, 31, 19, 8, 61, 12, 32, 55, 2, 18, 33, 12, 43, 36, 9, 62, 30, 55, 6, 58, 35, 7, 43, 29, 54, 23, 43, 30, 3, 25, 11, 45, 52, 28, 7, 14, 42, 1, 22, 50, 16, 53, 19, 59, 4, 46, 33, 41, 4, 35, 58, 5, 26, 13, 20, 2, 34, 54 },
120 { 30, 63, 21, 10, 26, 55, 29, 59, 23, 39, 53, 1, 36, 24, 59, 27, 10, 34, 23, 38, 30, 60, 22, 42, 28, 19, 9, 57, 30, 19, 43, 33, 13, 63, 3, 19, 11, 50, 31, 20, 14, 34, 10, 35, 17, 59, 7, 31, 19, 25, 50, 5, 20, 57, 29, 6, 52, 41, 4, 46, 20, 37, 26, 17, 49, 6, 39, 18, 53, 14, 3, 49, 57, 23, 34, 48, 14, 41, 28, 38, 56, 6, 58, 25, 39, 19, 43, 15, 37, 11, 47, 18, 53, 4, 37, 9, 62, 21, 53, 40, 57, 24, 13, 40, 56, 26, 47, 31, 59, 25, 45, 27, 10, 43, 21, 61, 13, 27, 48, 9, 23, 43, 31, 62, 38, 59, 9, 47 },
121 { 25, 4, 40, 60, 34, 6, 18, 36, 8, 57, 12, 30, 49, 14, 6, 54, 41, 16, 50, 6, 43, 15, 34, 4, 53, 24, 50, 35, 4, 51, 7, 55, 28, 24, 39, 44, 60, 7, 25, 62, 42, 53, 24, 61, 28, 45, 52, 12, 48, 37, 9, 35, 43, 3, 37, 48, 12, 58, 30, 52, 9, 59, 6, 57, 33, 29, 48, 4, 37, 45, 20, 34, 10, 39, 0, 60, 22, 45, 8, 63, 21, 42, 14, 49, 3, 56, 11, 46, 21, 61, 0, 42, 25, 13, 63, 17, 36, 8, 46, 16, 6, 35, 63, 0, 21, 37, 4, 57, 9, 34, 5, 61, 48, 32, 8, 37, 54, 17, 56, 30, 60, 0, 50, 16, 7, 29, 42, 17 },
122 { 32, 50, 15, 48, 2, 43, 52, 25, 47, 16, 32, 63, 21, 52, 40, 19, 0, 61, 29, 58, 20, 56, 26, 46, 12, 55, 6, 22, 62, 32, 17, 40, 0, 49, 34, 8, 27, 32, 48, 0, 21, 39, 5, 44, 12, 6, 22, 40, 0, 57, 16, 60, 23, 17, 54, 22, 36, 15, 24, 39, 19, 34, 47, 23, 0, 54, 13, 51, 24, 9, 55, 16, 52, 27, 44, 20, 4, 54, 26, 49, 0, 30, 46, 16, 29, 51, 34, 4, 52, 28, 33, 15, 57, 39, 26, 49, 0, 56, 27, 31, 48, 20, 43, 29, 53, 11, 46, 19, 41, 13, 55, 18, 0, 57, 26, 51, 2, 44, 6, 38, 14, 40, 22, 45, 36, 53, 3, 57 },
123 { 44, 12, 37, 28, 22, 57, 11, 38, 0, 51, 9, 41, 4, 29, 11, 47, 33, 45, 12, 26, 3, 36, 9, 63, 31, 16, 38, 44, 14, 47, 25, 61, 20, 58, 15, 47, 17, 57, 13, 36, 9, 51, 18, 29, 50, 36, 54, 20, 61, 27, 32, 13, 53, 44, 9, 27, 0, 63, 45, 2, 56, 10, 14, 43, 41, 28, 58, 11, 35, 60, 30, 41, 6, 63, 11, 51, 37, 32, 15, 10, 35, 53, 5, 61, 22, 7, 26, 59, 23, 9, 44, 48, 21, 3, 51, 32, 24, 41, 12, 61, 2, 55, 9, 15, 35, 58, 28, 15, 62, 30, 37, 23, 42, 29, 11, 17, 35, 24, 63, 20, 52, 28, 8, 55, 11, 23, 47, 19 },
124 { 0, 56, 8, 53, 14, 31, 61, 20, 55, 28, 62, 18, 35, 60, 25, 57, 7, 23, 39, 54, 47, 17, 43, 0, 40, 59, 29, 2, 56, 10, 37, 5, 43, 11, 29, 52, 1, 23, 54, 41, 59, 30, 55, 1, 62, 15, 33, 4, 43, 10, 47, 39, 1, 31, 40, 60, 49, 33, 7, 55, 26, 50, 31, 61, 8, 18, 21, 32, 44, 1, 25, 47, 18, 36, 30, 23, 59, 7, 40, 59, 27, 19, 38, 32, 44, 54, 40, 17, 38, 60, 27, 6, 35, 55, 10, 14, 44, 5, 50, 17, 38, 26, 42, 50, 18, 3, 44, 52, 2, 49, 7, 52, 15, 46, 62, 39, 55, 10, 31, 48, 3, 58, 33, 18, 61, 34, 13, 59 },
125 { 39, 27, 63, 20, 35, 41, 4, 45, 26, 5, 38, 13, 44, 2, 50, 17, 37, 52, 2, 13, 28, 58, 24, 51, 21, 8, 34, 48, 27, 42, 18, 51, 31, 56, 5, 36, 38, 44, 4, 17, 26, 11, 38, 23, 42, 8, 56, 39, 24, 51, 5, 56, 21, 59, 14, 6, 18, 42, 22, 35, 16, 37, 3, 25, 39, 46, 63, 5, 50, 17, 58, 8, 55, 3, 50, 12, 43, 17, 47, 2, 51, 9, 62, 12, 1, 35, 13, 50, 1, 37, 12, 51, 19, 29, 46, 59, 22, 58, 33, 45, 22, 60, 10, 32, 61, 39, 8, 33, 25, 36, 20, 60, 38, 4, 21, 5, 28, 45, 12, 18, 42, 11, 49, 1, 27, 40, 6, 30 },
126 { 24, 16, 42, 1, 50, 10, 48, 17, 33, 43, 24, 48, 21, 55, 31, 42, 10, 21, 63, 35, 49, 6, 33, 13, 41, 53, 10, 20, 60, 6, 53, 26, 12, 41, 22, 60, 14, 28, 63, 33, 49, 3, 45, 16, 48, 26, 14, 46, 18, 30, 35, 26, 8, 50, 29, 51, 25, 57, 12, 47, 53, 9, 62, 20, 54, 2, 36, 15, 40, 28, 33, 13, 38, 24, 46, 1, 29, 56, 33, 20, 44, 24, 41, 26, 57, 20, 63, 8, 30, 55, 5, 41, 62, 8, 34, 2, 37, 10, 19, 6, 37, 1, 53, 23, 5, 27, 58, 22, 43, 12, 50, 26, 9, 34, 54, 32, 49, 1, 59, 37, 22, 46, 25, 36, 51, 15, 54, 46 },
127 { 52, 7, 45, 33, 26, 58, 14, 60, 7, 54, 3, 58, 8, 34, 14, 5, 59, 30, 18, 44, 8, 22, 48, 62, 3, 26, 55, 38, 23, 16, 39, 1, 62, 24, 49, 9, 53, 19, 46, 7, 19, 60, 31, 58, 2, 34, 53, 7, 59, 2, 62, 42, 46, 19, 36, 11, 44, 4, 38, 28, 1, 43, 32, 51, 12, 29, 56, 22, 52, 2, 62, 49, 22, 60, 14, 35, 63, 5, 25, 57, 14, 53, 4, 46, 18, 31, 42, 22, 47, 20, 58, 31, 16, 43, 23, 54, 30, 42, 52, 57, 29, 49, 30, 13, 45, 48, 16, 55, 6, 63, 1, 44, 14, 58, 19, 47, 15, 24, 51, 34, 6, 55, 5, 63, 20, 41, 21, 9 },
128 { 30, 62, 18, 55, 5, 23, 39, 29, 49, 30, 15, 36, 28, 46, 60, 25, 39, 46, 4, 32, 61, 40, 15, 30, 36, 45, 14, 2, 49, 33, 57, 45, 18, 32, 3, 45, 30, 2, 35, 52, 40, 27, 13, 21, 38, 63, 20, 28, 37, 23, 16, 10, 13, 55, 2, 62, 21, 32, 60, 17, 58, 23, 5, 40, 16, 48, 7, 45, 10, 26, 43, 19, 6, 31, 52, 21, 39, 16, 48, 9, 37, 28, 36, 55, 7, 48, 3, 59, 15, 45, 25, 1, 53, 13, 47, 7, 62, 15, 4, 25, 12, 41, 18, 60, 38, 11, 34, 19, 39, 31, 29, 56, 23, 42, 3, 27, 60, 41, 8, 16, 61, 29, 43, 9, 32, 2, 60, 34 },
129 { 3, 38, 13, 37, 52, 44, 2, 19, 12, 42, 63, 19, 40, 1, 20, 50, 12, 55, 15, 56, 27, 1, 54, 11, 57, 18, 32, 63, 44, 4, 29, 13, 37, 61, 35, 16, 42, 57, 12, 22, 6, 55, 43, 10, 50, 5, 44, 11, 48, 52, 34, 58, 28, 41, 38, 30, 7, 52, 11, 49, 30, 14, 45, 27, 59, 34, 21, 38, 32, 58, 11, 36, 56, 42, 9, 41, 3, 54, 31, 42, 0, 60, 16, 11, 39, 24, 52, 33, 6, 36, 10, 40, 32, 60, 26, 20, 39, 28, 47, 34, 63, 8, 54, 3, 24, 56, 0, 51, 13, 47, 16, 40, 7, 35, 52, 11, 36, 4, 57, 30, 39, 13, 18, 50, 58, 28, 12, 48 },
130 { 57, 24, 49, 21, 10, 31, 61, 36, 56, 0, 22, 53, 11, 56, 32, 7, 36, 27, 41, 9, 46, 19, 34, 42, 25, 7, 50, 9, 28, 21, 54, 8, 50, 7, 27, 59, 10, 25, 48, 62, 37, 0, 33, 58, 25, 18, 32, 61, 0, 15, 45, 5, 50, 3, 23, 55, 47, 17, 40, 6, 60, 34, 53, 8, 41, 0, 61, 13, 54, 4, 46, 28, 0, 17, 48, 27, 58, 13, 23, 61, 33, 21, 50, 30, 62, 8, 14, 29, 56, 27, 61, 49, 17, 2, 44, 11, 51, 0, 59, 17, 40, 20, 32, 47, 36, 21, 42, 28, 60, 4, 54, 10, 59, 17, 30, 62, 21, 43, 26, 48, 0, 56, 36, 25, 8, 44, 39, 17 },
131 { 10, 42, 4, 59, 27, 47, 8, 23, 51, 32, 45, 6, 37, 26, 48, 43, 62, 0, 21, 53, 38, 12, 51, 5, 60, 47, 24, 37, 59, 15, 35, 47, 22, 55, 0, 50, 21, 40, 6, 29, 15, 52, 24, 8, 41, 55, 13, 29, 40, 56, 24, 31, 19, 33, 61, 15, 0, 35, 24, 42, 21, 2, 19, 57, 24, 15, 30, 50, 20, 25, 40, 16, 57, 34, 61, 8, 29, 45, 6, 49, 11, 47, 2, 44, 19, 57, 38, 50, 12, 42, 21, 4, 35, 52, 28, 56, 23, 36, 13, 45, 4, 52, 27, 14, 6, 62, 9, 45, 21, 37, 25, 46, 33, 49, 0, 44, 7, 53, 13, 19, 53, 31, 3, 47, 15, 56, 22, 51 },
132 { 35, 28, 53, 32, 1, 16, 54, 40, 9, 17, 25, 58, 14, 59, 3, 22, 16, 51, 31, 5, 23, 58, 28, 17, 35, 20, 0, 42, 11, 52, 3, 31, 41, 17, 43, 13, 32, 54, 18, 60, 32, 45, 17, 49, 2, 36, 51, 22, 7, 36, 9, 63, 48, 12, 46, 26, 43, 28, 63, 13, 48, 37, 51, 33, 5, 47, 55, 9, 42, 63, 7, 51, 24, 12, 37, 19, 55, 34, 18, 38, 15, 28, 54, 34, 5, 43, 22, 0, 48, 14, 54, 24, 58, 9, 38, 5, 32, 55, 21, 30, 49, 9, 59, 43, 30, 51, 35, 26, 7, 53, 2, 22, 14, 27, 57, 18, 38, 24, 33, 45, 10, 41, 20, 60, 37, 5, 32, 0 },
133 { 63, 19, 15, 40, 62, 35, 14, 28, 46, 61, 4, 49, 35, 10, 29, 54, 33, 8, 45, 62, 37, 1, 43, 55, 10, 52, 61, 30, 19, 40, 25, 62, 11, 38, 27, 58, 36, 3, 46, 8, 39, 4, 62, 28, 47, 20, 4, 54, 47, 27, 43, 1, 21, 38, 8, 58, 10, 54, 4, 56, 9, 26, 12, 39, 60, 27, 18, 37, 1, 31, 35, 5, 45, 50, 2, 43, 26, 1, 59, 23, 56, 40, 7, 26, 58, 17, 32, 63, 25, 39, 7, 31, 45, 19, 63, 15, 48, 8, 37, 61, 16, 34, 1, 56, 18, 3, 15, 58, 49, 32, 63, 41, 55, 5, 40, 22, 50, 6, 59, 2, 63, 23, 52, 11, 26, 61, 44, 23 },
134 { 11, 56, 46, 6, 22, 43, 58, 3, 34, 21, 38, 30, 18, 44, 52, 13, 41, 57, 17, 28, 14, 49, 25, 7, 33, 39, 26, 6, 56, 48, 1, 20, 56, 5, 46, 9, 19, 51, 30, 25, 56, 21, 35, 14, 57, 42, 16, 33, 10, 57, 17, 59, 41, 25, 53, 37, 20, 40, 30, 18, 31, 62, 44, 22, 3, 44, 11, 48, 23, 53, 18, 60, 29, 22, 62, 15, 53, 47, 10, 41, 3, 19, 52, 36, 13, 46, 10, 35, 3, 61, 41, 16, 1, 50, 26, 42, 18, 46, 2, 25, 54, 20, 39, 23, 47, 31, 41, 12, 38, 17, 8, 19, 31, 48, 12, 61, 9, 54, 29, 35, 15, 38, 6, 43, 34, 14, 7, 47 },
135 { 39, 2, 33, 26, 53, 8, 18, 50, 41, 12, 53, 1, 63, 24, 19, 39, 2, 24, 47, 10, 60, 38, 19, 63, 48, 4, 15, 45, 32, 14, 60, 36, 29, 53, 23, 63, 34, 12, 61, 1, 43, 11, 53, 30, 1, 26, 60, 45, 23, 39, 3, 29, 12, 50, 4, 16, 51, 3, 45, 36, 50, 1, 16, 54, 35, 14, 57, 30, 58, 9, 46, 14, 41, 10, 32, 38, 4, 30, 21, 51, 32, 63, 25, 1, 60, 27, 53, 18, 51, 22, 28, 55, 34, 12, 40, 3, 60, 29, 57, 41, 6, 44, 11, 53, 8, 61, 24, 57, 1, 28, 44, 59, 36, 3, 34, 25, 41, 31, 16, 44, 22, 47, 28, 58, 1, 49, 54, 29 },
136 { 58, 25, 50, 13, 38, 30, 60, 24, 6, 57, 27, 42, 9, 45, 6, 61, 30, 50, 4, 34, 29, 3, 46, 13, 22, 42, 58, 28, 9, 39, 23, 44, 7, 15, 44, 2, 40, 15, 47, 41, 23, 37, 7, 59, 38, 11, 34, 6, 62, 14, 52, 35, 55, 19, 32, 61, 33, 24, 57, 6, 22, 59, 29, 7, 49, 25, 40, 3, 17, 39, 27, 52, 0, 55, 16, 57, 24, 61, 36, 6, 29, 12, 48, 39, 20, 44, 6, 40, 33, 5, 48, 10, 57, 36, 22, 51, 33, 9, 24, 12, 62, 29, 50, 35, 14, 43, 5, 33, 47, 52, 13, 23, 10, 51, 56, 16, 46, 1, 49, 4, 61, 9, 52, 18, 31, 21, 36, 17 },
137 { 19, 42, 9, 48, 2, 44, 11, 37, 48, 20, 33, 16, 55, 35, 49, 15, 37, 20, 59, 16, 53, 22, 56, 31, 50, 11, 34, 54, 16, 51, 4, 49, 33, 53, 21, 28, 56, 24, 31, 9, 52, 16, 48, 24, 44, 13, 51, 20, 31, 49, 18, 6, 34, 2, 44, 14, 47, 8, 15, 43, 13, 41, 33, 52, 20, 61, 7, 51, 34, 62, 4, 20, 36, 33, 43, 8, 46, 13, 53, 17, 45, 42, 9, 31, 52, 11, 30, 56, 13, 59, 17, 44, 27, 6, 62, 11, 43, 17, 49, 38, 26, 2, 16, 27, 58, 21, 54, 18, 26, 5, 35, 61, 43, 27, 7, 39, 14, 58, 37, 55, 20, 33, 13, 40, 62, 10, 55, 5 },
138 { 51, 14, 61, 29, 59, 20, 55, 31, 0, 49, 11, 60, 3, 26, 22, 56, 0, 40, 12, 43, 41, 8, 36, 0, 17, 57, 24, 2, 46, 26, 61, 18, 0, 38, 12, 59, 6, 49, 3, 57, 19, 63, 5, 33, 18, 54, 28, 56, 0, 43, 26, 46, 63, 27, 56, 22, 27, 54, 38, 28, 63, 24, 10, 45, 0, 31, 42, 21, 12, 25, 44, 49, 59, 6, 26, 50, 3, 34, 27, 59, 0, 35, 62, 16, 4, 58, 47, 0, 43, 24, 37, 2, 54, 20, 46, 31, 0, 56, 34, 5, 55, 45, 60, 37, 0, 40, 10, 38, 63, 46, 15, 20, 0, 53, 21, 62, 30, 11, 24, 27, 40, 0, 57, 26, 3, 45, 27, 35 }
139};
140
141EFL_ALWAYS_INLINE void
142_soft16_convert_from_rgba_pt(const DATA32 *src, DATA16 *dst, DATA8 *alpha,
143 const int x, const int y)
144{
145 DATA8 orig_r, orig_g, orig_b, orig_a;
146
147 orig_r = R_VAL(src);
148 orig_g = G_VAL(src);
149 orig_b = B_VAL(src);
150 orig_a = A_VAL(src);
151
152 if (orig_a == 255)
153 {
154 DATA8 dith5, dith6, dith, r, g, b;
155
156 dith = dither_table[x & S16_DM_MSK][y & S16_DM_MSK];
157 dith5 = dith >> S16_DM_SHF(5);
158 dith6 = dith >> S16_DM_SHF(6);
159
160 r = orig_r >> 3;
161 g = orig_g >> 2;
162 b = orig_b >> 3;
163
164 if (((orig_r - (r << 3)) >= dith5) && (r < 0x1f)) r++;
165 if (((orig_g - (g << 2)) >= dith6) && (g < 0x3f)) g++;
166 if (((orig_b - (b << 3)) >= dith5) && (b < 0x1f)) b++;
167
168 *dst = (r << 11) | (g << 5) | b;
169 *alpha = 31;
170 }
171 else if (orig_a == 0)
172 {
173 *dst = 0;
174 *alpha = 0;
175 }
176 else
177 {
178 DATA8 r, g, b, a;
179 r = orig_r >> 3;
180 g = orig_g >> 2;
181 b = orig_b >> 3;
182 a = (orig_a >> 3) + 1;
183
184 *dst = (r << 11) | (g << 5) | b;
185 *alpha = a;
186 }
187}
188
189static inline void
190_soft16_convert_from_rgba_scanline(const DATA32 *src, DATA16 *dst,
191 DATA8 *alpha, const int y, const int w)
192{
193 int x, m;
194
195 m = (w & ~7);
196 x = 0;
197 pld(src, 0);
198
199 while (x < m)
200 {
201 pld(src, 32);
202 UNROLL8({
203 _soft16_convert_from_rgba_pt(src, dst, alpha, x, y);
204 src++;
205 dst++;
206 alpha++;
207 x++;
208 });
209 }
210
211 for (; x < w; x++, src++, dst++, alpha++)
212 _soft16_convert_from_rgba_pt(src, dst, alpha, x, y);
213}
214
215void
216evas_common_soft16_image_convert_from_rgba(Soft16_Image *im, const DATA32 *src)
217{
218 const DATA32 *sp;
219 DATA16 *dp;
220 DATA8 *ap;
221 unsigned int y;
222
223 sp = src;
224 dp = im->pixels;
225 ap = im->alpha;
226
227 for (y = 0; y < im->cache_entry.h; y++, sp += im->cache_entry.w, dp += im->stride, ap += im->stride)
228 _soft16_convert_from_rgba_scanline(sp, dp, ap, y, im->cache_entry.w);
229}
230
231EFL_ALWAYS_INLINE void
232_soft16_convert_from_rgb_pt(const DATA32 *src, DATA16 *dst,
233 const int x, const int y)
234{
235 DATA8 orig_r, orig_g, orig_b, r, g, b, dith5, dith6, dith;
236
237 orig_r = R_VAL(src);
238 orig_g = G_VAL(src);
239 orig_b = B_VAL(src);
240
241 r = orig_r >> 3;
242 g = orig_g >> 2;
243 b = orig_b >> 3;
244
245 dith = dither_table[x & S16_DM_MSK][y & S16_DM_MSK];
246 dith5 = dith >> S16_DM_SHF(5);
247 dith6 = dith >> S16_DM_SHF(6);
248
249 if (((orig_r - (r << 3)) >= dith5) && (r < 0x1f)) r++;
250 if (((orig_g - (g << 2)) >= dith6) && (g < 0x3f)) g++;
251 if (((orig_b - (b << 3)) >= dith5) && (b < 0x1f)) b++;
252
253 *dst = (r << 11) | (g << 5) | b;
254}
255
256static inline void
257_soft16_convert_from_rgb_scanline(const DATA32 *src, DATA16 *dst, const int y,
258 const int w)
259{
260 int x, m;
261
262 m = (w & ~7);
263 x = 0;
264 pld(src, 0);
265
266 while (x < m)
267 {
268 pld(src, 32);
269 UNROLL8({
270 _soft16_convert_from_rgb_pt(src, dst, x, y);
271 src++;
272 dst++;
273 x++;
274 });
275 }
276
277 for (; x < w; x++, src++, dst++)
278 _soft16_convert_from_rgb_pt(src, dst, x, y);
279}
280
281void
282evas_common_soft16_image_convert_from_rgb(Soft16_Image *im, const DATA32 *src)
283{
284 const DATA32 *sp;
285 DATA16 *dp;
286 unsigned int y;
287
288 sp = src;
289 dp = im->pixels;
290
291 for (y = 0; y < im->cache_entry.h; y++, sp += im->cache_entry.w, dp += im->stride)
292 _soft16_convert_from_rgb_scanline(sp, dp, y, im->cache_entry.w);
293}
diff --git a/libraries/evas/src/lib/engines/common_16/evas_soft16_font.c b/libraries/evas/src/lib/engines/common_16/evas_soft16_font.c
new file mode 100644
index 0000000..fbad4d2
--- /dev/null
+++ b/libraries/evas/src/lib/engines/common_16/evas_soft16_font.c
@@ -0,0 +1,295 @@
1#include "evas_common_soft16.h"
2
3EFL_ALWAYS_INLINE void
4_glyph_pt_mask_solid_solid(DATA16 *dst,
5 const DATA16 rgb565,
6 const DATA32 rgb565_unpack,
7 const DATA8 *mask)
8{
9 DATA8 alpha = *mask >> 3;
10
11 if (alpha == 31) *dst = rgb565;
12 else if (alpha > 0)
13 {
14 DATA32 d;
15
16 d = RGB_565_UNPACK(*dst);
17 d = RGB_565_UNPACKED_BLEND_UNMUL(rgb565_unpack, d, alpha);
18 *dst = RGB_565_PACK(d);
19 }
20}
21
22static void
23_glyph_scanline_mask_solid_solid(DATA16 *dst,
24 int size,
25 const DATA16 rgb565,
26 const DATA32 rgb565_unpack,
27 const DATA8 *mask)
28{
29 DATA16 *start, *end;
30
31 start = dst;
32 pld(start, 0);
33 pld(mask, 0);
34 end = start + (size & ~3);
35
36 while (start < end)
37 {
38 pld(start, 16);
39 pld(mask, 4);
40 UNROLL4({
41 _glyph_pt_mask_solid_solid(start, rgb565, rgb565_unpack, mask);
42 start++;
43 mask++;
44 });
45 }
46
47 end = start + (size & 3);
48 for (; start < end; start++, mask++)
49 _glyph_pt_mask_solid_solid(start, rgb565, rgb565_unpack, mask);
50}
51
52EFL_ALWAYS_INLINE void
53_glyph_pt_mask_transp_solid(DATA16 *dst,
54 DATA32 rgb565_unpack,
55 DATA8 alpha,
56 const DATA8 *mask)
57{
58 DATA32 a, b;
59 int rel_alpha;
60
61 rel_alpha = *mask >> 3;
62 alpha = (alpha * rel_alpha) >> 5;
63 if (alpha == 0)
64 return;
65
66 alpha++;
67
68 a = ((rgb565_unpack * rel_alpha) >> 5) & RGB_565_UNPACKED_MASK;
69 b = RGB_565_UNPACK(*dst);
70 b = RGB_565_UNPACKED_BLEND(a, b, alpha);
71 *dst = RGB_565_PACK(b);
72}
73
74static void
75_glyph_scanline_mask_transp_solid(DATA16 *dst,
76 int size,
77 const DATA32 rgb565_unpack,
78 const DATA8 rel_alpha,
79 const DATA8 *mask)
80{
81 DATA16 *start, *end;
82
83 start = dst;
84 pld(start, 0);
85 pld(mask, 0);
86 end = start + (size & ~3);
87
88 while (start < end)
89 {
90 pld(start, 16);
91 pld(mask, 4);
92 UNROLL4({
93 _glyph_pt_mask_transp_solid(start, rgb565_unpack, rel_alpha, mask);
94 start++;
95 mask++;
96 });
97 }
98
99 end = start + (size & 3);
100 for (; start < end; start++, mask++)
101 _glyph_pt_mask_transp_solid(start, rgb565_unpack, rel_alpha, mask);
102}
103
104static inline void
105_calc_ext(const Soft16_Image *dst, const RGBA_Draw_Context *dc,
106 Eina_Rectangle *ext)
107{
108 EINA_RECTANGLE_SET(ext, 0, 0, dst->cache_entry.w, dst->cache_entry.h);
109
110 if (dc->clip.use)
111 {
112 int v;
113
114 EINA_RECTANGLE_SET(ext, dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h);
115 if (ext->x < 0)
116 {
117 ext->w += ext->x;
118 ext->x = 0;
119 }
120 if (ext->y < 0)
121 {
122 ext->h += ext->y;
123 ext->y = 0;
124 }
125
126 v = dst->cache_entry.w - ext->x;
127 if (ext->w > v) ext->w = v;
128
129 v = dst->cache_entry.h - ext->y;
130 if (ext->h > v) ext->h = v;
131 }
132}
133
134static inline void
135_glyph_scanline(Soft16_Image *dst, const DATA8 *p_mask,
136 const Eina_Rectangle ext, int dx, int dy, int max_x, int max_y,
137 int w, DATA8 alpha, const DATA16 rgb565,
138 const DATA32 rgb565_unpack)
139{
140 int size, in_x, in_w;
141 DATA16 *p_pixels;
142
143 if ((dx >= max_x) || (dy < ext.y) || (dy >= max_y)) return;
144
145 in_x = 0;
146 in_w = 0;
147
148 if (dx + w > max_x) in_w += (dx + w) - max_x;
149
150 if (dx < ext.x)
151 {
152 in_w += ext.x - dx;
153 in_x = ext.x - dx;
154 dx = ext.x;
155 }
156
157 size = w - in_w;
158 p_pixels = dst->pixels + (dy * dst->stride) + dx;
159 p_mask += in_x;
160
161 if (size > 1)
162 {
163 if (alpha == 31)
164 _glyph_scanline_mask_solid_solid
165 (p_pixels, size, rgb565, rgb565_unpack, p_mask);
166 else if (alpha != 0)
167 _glyph_scanline_mask_transp_solid
168 (p_pixels, size, rgb565_unpack, alpha, p_mask);
169 }
170 else if (size == 1)
171 {
172 if (alpha == 31)
173 _glyph_pt_mask_solid_solid(p_pixels, rgb565, rgb565_unpack, p_mask);
174 else if (alpha != 0)
175 _glyph_pt_mask_transp_solid(p_pixels, rgb565_unpack, alpha, p_mask);
176 }
177}
178
179static void
180_soft16_font_glyph_draw_grayscale(Soft16_Image *dst,
181 RGBA_Draw_Context *dc __UNUSED__, RGBA_Font_Glyph *fg __UNUSED__,
182 int x, int y, DATA8 alpha, DATA16 rgb565,
183 const Eina_Rectangle ext, int bw, int bh,
184 int bpitch, const DATA8 *bitmap)
185{
186 const DATA32 rgb565_unpack = RGB_565_UNPACK(rgb565);
187 int i, max_x, max_y;
188
189 max_x = ext.x + ext.w;
190 max_y = ext.y + ext.h;
191
192 for (i = 0; i < bh; i++, bitmap += bpitch)
193 _glyph_scanline(dst, bitmap, ext, x, y + i, max_x, max_y, bw,
194 alpha, rgb565, rgb565_unpack);
195}
196
197static inline void
198_glyph_create_mask_line(DATA8 *mask, const DATA8 *bitmap, int w)
199{
200 const DATA8 bitrepl[2] = {0x0, 0xff};
201 int i;
202
203 for (i = 0; i < w; i += 8, bitmap++)
204 {
205 int j, size;
206 DATA32 bits;
207
208 if (i + 8 < w) size = 8;
209 else size = w - i;
210
211 bits = *bitmap;
212
213 for (j = size - 1; j >= 0; j--, mask++)
214 *mask = bitrepl[(bits >> j) & 0x1];
215 }
216}
217
218static void
219_soft16_font_glyph_draw_mono(Soft16_Image *dst,
220 RGBA_Draw_Context *dc __UNUSED__, RGBA_Font_Glyph *fg __UNUSED__,
221 int x, int y, DATA8 alpha, DATA16 rgb565,
222 const Eina_Rectangle ext, int bw, int bh,
223 int bpitch, const DATA8 *bitmap)
224{
225 const DATA32 rgb565_unpack = RGB_565_UNPACK(rgb565);
226 DATA8 *mask;
227 int i, max_x, max_y;
228
229 max_x = ext.x + ext.w;
230 max_y = ext.y + ext.h;
231
232 mask = alloca(bpitch);
233 for (i = 0; i < bh; i++, bitmap += bpitch)
234 {
235 _glyph_create_mask_line(mask, bitmap, bw);
236 _glyph_scanline(dst, mask, ext, x, y + i, max_x, max_y, bw,
237 alpha, rgb565, rgb565_unpack);
238 }
239}
240
241void
242evas_common_soft16_font_glyph_draw(void *data, void *dest __UNUSED__, void *context,
243 RGBA_Font_Glyph *fg, int x, int y)
244{
245 Soft16_Image *dst;
246 RGBA_Draw_Context *dc;
247 const DATA8 *bitmap;
248 DATA8 alpha, r, g, b;
249 DATA16 rgb565;
250 Eina_Rectangle ext;
251 int bpitch, bw, bh;
252
253 dst = data;
254 dc = context;
255
256 alpha = A_VAL(&dc->col.col) >> 3;
257 if (alpha == 0) return; /* precision is 5 bits, 3 bits lost */
258
259 r = R_VAL(&dc->col.col) >> 3;
260 g = G_VAL(&dc->col.col) >> 2;
261 b = B_VAL(&dc->col.col) >> 3;
262
263 if (r > alpha) r = alpha;
264 if (g > (alpha << 1)) g = (alpha << 1);
265 if (b > alpha) b = alpha;
266
267 rgb565 = (r << 11) | (g << 5) | b;
268
269 bitmap = fg->glyph_out->bitmap.buffer;
270 bh = fg->glyph_out->bitmap.rows;
271 bw = fg->glyph_out->bitmap.width;
272 bpitch = fg->glyph_out->bitmap.pitch;
273 if (bpitch < bw) bpitch = bw;
274
275 _calc_ext(dst, dc, &ext);
276
277 if ((fg->glyph_out->bitmap.num_grays == 256) &&
278 (fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays))
279 _soft16_font_glyph_draw_grayscale(dst, dc, fg, x, y, alpha, rgb565,
280 ext, bw, bh, bpitch, bitmap);
281 else
282 _soft16_font_glyph_draw_mono(dst, dc, fg, x, y, alpha, rgb565,
283 ext, bw, bh, bpitch, bitmap);
284}
285
286void *
287evas_common_soft16_font_glyph_new(void *data __UNUSED__, RGBA_Font_Glyph *fg __UNUSED__)
288{
289 return (void *)1; /* core requires != NULL to work */
290}
291
292void
293evas_common_soft16_font_glyph_free(void *ext_dat __UNUSED__)
294{
295}
diff --git a/libraries/evas/src/lib/engines/common_16/evas_soft16_image_scaled_sampled.c b/libraries/evas/src/lib/engines/common_16/evas_soft16_image_scaled_sampled.c
new file mode 100644
index 0000000..9c9f03c
--- /dev/null
+++ b/libraries/evas/src/lib/engines/common_16/evas_soft16_image_scaled_sampled.c
@@ -0,0 +1,471 @@
1#include "evas_common_soft16.h"
2#include "evas_soft16_point_blend.c"
3
4static void
5_soft16_image_draw_scaled_solid_solid(Soft16_Image *src,
6 Soft16_Image *dst,
7 RGBA_Draw_Context *dc __UNUSED__,
8 int dst_offset, int w, int h,
9 int *offset_x, int *offset_y)
10{
11 DATA16 *dst_itr;
12 int y, w_align;
13
14 w_align = w & ~7;
15
16 dst_itr = dst->pixels + dst_offset;
17 for (y = 0; y < h; y++, dst_itr += dst->stride)
18 {
19 DATA16 *d, *s;
20 int x;
21
22 s = src->pixels + offset_y[y];
23 pld(s, 0);
24 pld(offset_x, 0);
25
26 d = dst_itr;
27 x = 0;
28 while (x < w_align)
29 {
30 pld(s, 32);
31 pld(offset_x + x, 32);
32
33 UNROLL8({
34 _soft16_pt_blend_solid_solid(d, s[offset_x[x]]);
35 x++;
36 d++;
37 });
38 }
39
40 for (; x < w; x++, d++)
41 _soft16_pt_blend_solid_solid(d, s[offset_x[x]]);
42 }
43}
44static void
45_soft16_image_draw_scaled_transp_solid(Soft16_Image *src,
46 Soft16_Image *dst,
47 RGBA_Draw_Context *dc __UNUSED__,
48 int dst_offset, int w, int h,
49 int *offset_x, int *offset_y)
50{
51 DATA16 *dst_itr;
52 int y, w_align;
53
54 w_align = w & ~7;
55
56 dst_itr = dst->pixels + dst_offset;
57 for (y = 0; y < h; y++, dst_itr += dst->stride)
58 {
59 DATA16 *d, *s;
60 DATA8 *a;
61 int x;
62
63 s = src->pixels + offset_y[y];
64 a = src->alpha + offset_y[y];
65 pld(s, 0);
66 pld(a, 0);
67 pld(offset_x, 0);
68
69 d = dst_itr;
70 x = 0;
71 while (x < w_align)
72 {
73 pld(s, 32);
74 pld(a, 8);
75 pld(offset_x + x, 32);
76
77 UNROLL8({
78 int off_x = offset_x[x];
79 _soft16_pt_blend_transp_solid(d, s[off_x], a[off_x]);
80 x++;
81 d++;
82 });
83 }
84
85 for (; x < w; x++, d++)
86 _soft16_pt_blend_transp_solid(d, s[offset_x[x]], a[offset_x[x]]);
87 }
88}
89
90static inline void
91_soft16_image_draw_scaled_no_mul(Soft16_Image *src, Soft16_Image *dst,
92 RGBA_Draw_Context *dc,
93 int dst_offset, int w, int h,
94 int *offset_x, int *offset_y)
95{
96 if ((src->cache_entry.flags.alpha && src->alpha) &&
97 (!dst->cache_entry.flags.alpha))
98 _soft16_image_draw_scaled_transp_solid
99 (src, dst, dc, dst_offset, w, h, offset_x, offset_y);
100 else if (!dst->cache_entry.flags.alpha)
101 _soft16_image_draw_scaled_solid_solid
102 (src, dst, dc, dst_offset, w, h, offset_x, offset_y);
103 else
104 ERR("Unsupported draw of scaled images src->cache_entry.flags.alpha=%d, "
105 "dst->cache_entry.flags.alpha=%d, WITHOUT COLOR MUL",
106 src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha);
107}
108
109static void
110_soft16_image_draw_scaled_solid_solid_mul_alpha(Soft16_Image *src,
111 Soft16_Image *dst,
112 RGBA_Draw_Context *dc __UNUSED__,
113 int dst_offset, int w, int h,
114 int *offset_x, int *offset_y,
115 DATA8 alpha)
116{
117 DATA16 *dst_itr;
118 int y, w_align;
119
120 w_align = w & ~7;
121
122 dst_itr = dst->pixels + dst_offset;
123 for (y = 0; y < h; y++, dst_itr += dst->stride)
124 {
125 DATA16 *d, *s;
126 int x;
127
128 s = src->pixels + offset_y[y];
129 pld(s, 0);
130 pld(offset_x, 0);
131
132 d = dst_itr;
133 x = 0;
134 while (x < w_align)
135 {
136 pld(s, 32);
137 pld(offset_x + x, 32);
138
139 UNROLL8({
140 _soft16_pt_blend_solid_solid_mul_alpha
141 (d, s[offset_x[x]], alpha);
142 x++;
143 d++;
144 });
145 }
146
147 for (; x < w; x++, d++)
148 _soft16_pt_blend_solid_solid_mul_alpha
149 (d, s[offset_x[x]], alpha);
150 }
151}
152
153static void
154_soft16_image_draw_scaled_transp_solid_mul_alpha(Soft16_Image *src,
155 Soft16_Image *dst,
156 RGBA_Draw_Context *dc __UNUSED__,
157 int dst_offset, int w, int h,
158 int *offset_x, int *offset_y,
159 DATA8 alpha)
160{
161 DATA16 *dst_itr;
162 int y, w_align;
163
164 w_align = w & ~7;
165
166 dst_itr = dst->pixels + dst_offset;
167 for (y = 0; y < h; y++, dst_itr += dst->stride)
168 {
169 DATA16 *d, *s;
170 DATA8 *a;
171 int x;
172
173 s = src->pixels + offset_y[y];
174 a = src->alpha + offset_y[y];
175 pld(s, 0);
176 pld(a, 0);
177 pld(offset_x, 0);
178
179 d = dst_itr;
180 x = 0;
181 while (x < w_align)
182 {
183 pld(s, 32);
184 pld(a, 8);
185 pld(offset_x + x, 32);
186
187 UNROLL8({
188 int off_x = offset_x[x];
189 _soft16_pt_blend_transp_solid_mul_alpha
190 (d, s[off_x], a[off_x], alpha);
191 x++;
192 d++;
193 });
194 }
195
196 for (; x < w; x++, d++)
197 _soft16_pt_blend_transp_solid_mul_alpha
198 (d, s[offset_x[x]], a[offset_x[x]], alpha);
199 }
200}
201
202static inline void
203_soft16_image_draw_scaled_mul_alpha(Soft16_Image *src, Soft16_Image *dst,
204 RGBA_Draw_Context *dc,
205 int dst_offset, int w, int h,
206 int *offset_x, int *offset_y, DATA8 a)
207{
208 if ((src->cache_entry.flags.alpha && src->alpha) &&
209 (!dst->cache_entry.flags.alpha))
210 _soft16_image_draw_scaled_transp_solid_mul_alpha
211 (src, dst, dc, dst_offset, w, h, offset_x, offset_y, a);
212 else if (!dst->cache_entry.flags.alpha)
213 _soft16_image_draw_scaled_solid_solid_mul_alpha
214 (src, dst, dc, dst_offset, w, h, offset_x, offset_y, a);
215 else
216 ERR("Unsupported draw of scaled images src->cache_entry.flags.alpha=%d, "
217 "dst->cache_entry.flags.alpha=%d, WITH ALPHA MUL %d",
218 src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha, A_VAL(&dc->mul.col));
219}
220
221static void
222_soft16_image_draw_scaled_solid_solid_mul_color(Soft16_Image *src,
223 Soft16_Image *dst,
224 RGBA_Draw_Context *dc __UNUSED__,
225 int dst_offset, int w, int h,
226 int *offset_x, int *offset_y,
227 DATA8 r, DATA8 g, DATA8 b,
228 DATA8 alpha)
229{
230 DATA16 *dst_itr;
231 int y, w_align;
232
233 w_align = w & ~7;
234
235 dst_itr = dst->pixels + dst_offset;
236
237 if (alpha == 31)
238 for (y = 0; y < h; y++, dst_itr += dst->stride)
239 {
240 DATA16 *d, *s;
241 int x;
242
243 s = src->pixels + offset_y[y];
244 pld(s, 0);
245 pld(offset_x, 0);
246
247 d = dst_itr;
248 x = 0;
249 while (x < w_align)
250 {
251 pld(s, 32);
252 pld(offset_x + x, 32);
253
254 UNROLL8({
255 _soft16_pt_blend_solid_solid_mul_color_solid
256 (d, s[offset_x[x]], r, g, b);
257 x++;
258 d++;
259 });
260 }
261
262 for (; x < w; x++, d++)
263 _soft16_pt_blend_solid_solid_mul_color_solid
264 (d, s[offset_x[x]], r, g, b);
265 }
266 else
267 for (y = 0; y < h; y++, dst_itr += dst->stride)
268 {
269 DATA16 *d, *s;
270 int x;
271
272 s = src->pixels + offset_y[y];
273 pld(s, 0);
274 pld(offset_x, 0);
275
276 d = dst_itr;
277 x = 0;
278 while (x < w_align)
279 {
280 pld(s, 32);
281 pld(offset_x + x, 32);
282
283 UNROLL8({
284 _soft16_pt_blend_solid_solid_mul_color_transp
285 (d, s[offset_x[x]], alpha, r, g, b);
286 x++;
287 d++;
288 });
289 }
290
291 for (; x < w; x++, d++)
292 _soft16_pt_blend_solid_solid_mul_color_transp
293 (d, s[offset_x[x]], alpha, r, g, b);
294 }
295}
296
297static void
298_soft16_image_draw_scaled_transp_solid_mul_color(Soft16_Image *src,
299 Soft16_Image *dst,
300 RGBA_Draw_Context *dc __UNUSED__,
301 int dst_offset, int w, int h,
302 int *offset_x, int *offset_y,
303 DATA8 r, DATA8 g, DATA8 b,
304 DATA8 alpha)
305{
306 DATA16 *dst_itr;
307 int y, w_align;
308
309 w_align = w & ~7;
310
311 dst_itr = dst->pixels + dst_offset;
312
313 if (alpha == 31)
314 for (y = 0; y < h; y++, dst_itr += dst->stride)
315 {
316 DATA16 *d, *s;
317 DATA8 *a;
318 int x;
319
320 s = src->pixels + offset_y[y];
321 a = src->alpha + offset_y[y];
322 pld(s, 0);
323 pld(a, 0);
324 pld(offset_x, 0);
325
326 d = dst_itr;
327 x = 0;
328 while (x < w_align)
329 {
330 pld(s, 32);
331 pld(a, 8);
332 pld(offset_x + x, 32);
333
334 UNROLL8({
335 int off_x = offset_x[x];
336 _soft16_pt_blend_transp_solid_mul_color_solid
337 (d, s[off_x], a[off_x], r, g, b);
338 x++;
339 d++;
340 });
341 }
342
343 for (; x < w; x++, d++)
344 _soft16_pt_blend_transp_solid_mul_color_solid
345 (d, s[offset_x[x]], a[offset_x[x]], r, g, b);
346 }
347 else
348 for (y = 0; y < h; y++, dst_itr += dst->stride)
349 {
350 DATA16 *d, *s;
351 DATA8 *a;
352 int x;
353
354 s = src->pixels + offset_y[y];
355 a = src->alpha + offset_y[y];
356 pld(s, 0);
357 pld(a, 0);
358 pld(offset_x, 0);
359
360 d = dst_itr;
361 x = 0;
362 while (x < w_align)
363 {
364 pld(s, 32);
365 pld(a, 8);
366 pld(offset_x + x, 32);
367
368 UNROLL8({
369 int off_x = offset_x[x];
370 _soft16_pt_blend_transp_solid_mul_color_transp
371 (d, s[off_x], a[off_x], alpha, r, g, b);
372 x++;
373 d++;
374 });
375 }
376
377 for (; x < w; x++, d++)
378 _soft16_pt_blend_transp_solid_mul_color_transp
379 (d, s[offset_x[x]], a[offset_x[x]], alpha, r, g, b);
380 }
381}
382
383static inline void
384_soft16_image_draw_scaled_mul_color(Soft16_Image *src, Soft16_Image *dst,
385 RGBA_Draw_Context *dc,
386 int dst_offset, int w, int h,
387 int *offset_x, int *offset_y,
388 DATA8 r, DATA8 g, DATA8 b, DATA8 a)
389{
390 if ((src->cache_entry.flags.alpha && src->alpha) &&
391 (!dst->cache_entry.flags.alpha))
392 _soft16_image_draw_scaled_transp_solid_mul_color
393 (src, dst, dc, dst_offset, w, h, offset_x, offset_y, r, g, b, a);
394 else if (!dst->cache_entry.flags.alpha)
395 _soft16_image_draw_scaled_solid_solid_mul_color
396 (src, dst, dc, dst_offset, w, h, offset_x, offset_y, r, g, b, a);
397 else
398 ERR("Unsupported draw of scaled images src->cache_entry.flags.alpha=%d, "
399 "dst->cache_entry.flags.alpha=%d, WITH COLOR MUL 0x%08x",
400 src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha, dc->mul.col);
401}
402
403static inline void
404_soft16_image_draw_scaled_mul(Soft16_Image *src, Soft16_Image *dst,
405 RGBA_Draw_Context *dc,
406 int dst_offset, int w, int h,
407 int *offset_x, int *offset_y, DATA8 r, DATA8 g,
408 DATA8 b, DATA8 a)
409{
410 if ((a == r) && (a == (g >> 1)) && (a == b))
411 _soft16_image_draw_scaled_mul_alpha
412 (src, dst, dc, dst_offset, w, h, offset_x, offset_y, a);
413 else
414 _soft16_image_draw_scaled_mul_color
415 (src, dst, dc, dst_offset, w, h, offset_x, offset_y, r, g, b, a);
416}
417
418void
419evas_common_soft16_image_draw_scaled_sampled(Soft16_Image *src, Soft16_Image *dst,
420 RGBA_Draw_Context *dc,
421 const Eina_Rectangle sr,
422 const Eina_Rectangle dr,
423 const Eina_Rectangle cr)
424{
425 int x, y, dst_offset, *offset_x, *offset_y;
426 DATA16 mul_rgb565;
427 DATA8 r, g, b, a;
428
429 if (!dc->mul.use)
430 {
431 r = b = a = 31;
432 g = 63;
433 mul_rgb565 = 0xffff;
434 }
435 else
436 {
437 a = A_VAL(&dc->mul.col) >> 3;
438 if (a == 0)
439 return;
440
441 r = R_VAL(&dc->mul.col) >> 3;
442 g = G_VAL(&dc->mul.col) >> 2;
443 b = B_VAL(&dc->mul.col) >> 3;
444
445 if (r > a) r = a;
446 if (g > (a << 1)) g = (a << 1);
447 if (b > a) b = a;
448
449 mul_rgb565 = (r << 11) || (g << 5) | b;
450 }
451
452 /* pre-calculated scale tables */
453 offset_x = alloca(cr.w * sizeof(*offset_x));
454 for (x = 0; x < cr.w; x++)
455 offset_x[x] = (((x + cr.x - dr.x) * sr.w) / dr.w) + sr.x;
456
457 offset_y = alloca(cr.h * sizeof(*offset_y));
458 for (y = 0; y < cr.h; y++)
459 offset_y[y] = (((((y + cr.y - dr.y) * sr.h) / dr.h) + sr.y)
460 * src->stride);
461
462 dst_offset = cr.x + (cr.y * dst->stride);
463
464
465 if (mul_rgb565 == 0xffff)
466 _soft16_image_draw_scaled_no_mul
467 (src, dst, dc, dst_offset, cr.w, cr.h, offset_x, offset_y);
468 else
469 _soft16_image_draw_scaled_mul
470 (src, dst, dc, dst_offset, cr.w, cr.h, offset_x, offset_y, r, g, b, a);
471}
diff --git a/libraries/evas/src/lib/engines/common_16/evas_soft16_image_unscaled.c b/libraries/evas/src/lib/engines/common_16/evas_soft16_image_unscaled.c
new file mode 100644
index 0000000..f53fdf0
--- /dev/null
+++ b/libraries/evas/src/lib/engines/common_16/evas_soft16_image_unscaled.c
@@ -0,0 +1,287 @@
1#include "evas_common_soft16.h"
2#include "evas_soft16_scanline_blend.c"
3
4static void
5_soft16_image_draw_unscaled_solid_solid(Soft16_Image *src, Soft16_Image *dst,
6 RGBA_Draw_Context *dc __UNUSED__,
7 int src_offset, int dst_offset,
8 int w, int h)
9{
10 DATA16 *src_itr, *dst_itr;
11 int y;
12
13 src_itr = src->pixels + src_offset;
14 dst_itr = dst->pixels + dst_offset;
15
16 for (y = 0; y < h; y++)
17 {
18 _soft16_scanline_blend_solid_solid(src_itr, dst_itr, w);
19 src_itr += src->stride;
20 dst_itr += dst->stride;
21 }
22}
23
24static void
25_soft16_image_draw_unscaled_transp_solid(Soft16_Image *src, Soft16_Image *dst,
26 RGBA_Draw_Context *dc __UNUSED__,
27 int src_offset, int dst_offset,
28 int w, int h)
29
30{
31 DATA16 *src_itr, *dst_itr;
32 DATA8 *alpha_itr;
33 int y;
34
35 src_itr = src->pixels + src_offset;
36 alpha_itr = src->alpha + src_offset;
37 dst_itr = dst->pixels + dst_offset;
38
39 for (y = 0; y < h; y++)
40 {
41 _soft16_scanline_blend_transp_solid(src_itr, alpha_itr, dst_itr, w);
42 src_itr += src->stride;
43 alpha_itr += src->stride;
44 dst_itr += dst->stride;
45 }
46}
47
48static inline void
49_soft16_image_draw_unscaled_no_mul(Soft16_Image *src, Soft16_Image *dst,
50 RGBA_Draw_Context *dc,
51 int src_offset, int dst_offset,
52 int width, int height)
53{
54 if (src->cache_entry.flags.alpha && (!dst->cache_entry.flags.alpha))
55 _soft16_image_draw_unscaled_transp_solid(src, dst, dc,
56 src_offset, dst_offset,
57 width, height);
58 else if ((!src->cache_entry.flags.alpha) && (!dst->cache_entry.flags.alpha))
59 _soft16_image_draw_unscaled_solid_solid(src, dst, dc,
60 src_offset, dst_offset,
61 width, height);
62 else
63 ERR("Unsupported draw of unscaled images src->cache_entry.flags.alpha=%d, "
64 "dst->cache_entry.flags.alpha=%d, WITHOUT COLOR MUL",
65 src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha);
66}
67
68static void
69_soft16_image_draw_unscaled_solid_solid_mul_alpha(Soft16_Image *src,
70 Soft16_Image *dst,
71 RGBA_Draw_Context *dc __UNUSED__,
72 int src_offset,
73 int dst_offset,
74 int w, int h, DATA8 a)
75{
76 DATA16 *src_itr, *dst_itr;
77 int y;
78
79 src_itr = src->pixels + src_offset;
80 dst_itr = dst->pixels + dst_offset;
81
82 for (y = 0; y < h; y++)
83 {
84 _soft16_scanline_blend_solid_solid_mul_alpha(src_itr, dst_itr, w, a);
85 src_itr += src->stride;
86 dst_itr += dst->stride;
87 }
88}
89
90static void
91_soft16_image_draw_unscaled_transp_solid_mul_alpha(Soft16_Image *src,
92 Soft16_Image *dst,
93 RGBA_Draw_Context *dc __UNUSED__,
94 int src_offset,
95 int dst_offset,
96 int w, int h, DATA8 a)
97
98{
99 DATA16 *src_itr, *dst_itr;
100 DATA8 *alpha_itr;
101 int y;
102
103 src_itr = src->pixels + src_offset;
104 alpha_itr = src->alpha + src_offset;
105 dst_itr = dst->pixels + dst_offset;
106
107 for (y = 0; y < h; y++)
108 {
109 _soft16_scanline_blend_transp_solid_mul_alpha(src_itr, alpha_itr,
110 dst_itr, w, a);
111 src_itr += src->stride;
112 alpha_itr += src->stride;
113 dst_itr += dst->stride;
114 }
115}
116
117static inline void
118_soft16_image_draw_unscaled_mul_alpha(Soft16_Image *src, Soft16_Image *dst,
119 RGBA_Draw_Context *dc,
120 int src_offset, int dst_offset,
121 int width, int height, DATA8 a)
122{
123 if (src->cache_entry.flags.alpha && (!dst->cache_entry.flags.alpha))
124 _soft16_image_draw_unscaled_transp_solid_mul_alpha
125 (src, dst, dc, src_offset, dst_offset, width, height, a);
126 else if ((!src->cache_entry.flags.alpha) && (!dst->cache_entry.flags.alpha))
127 _soft16_image_draw_unscaled_solid_solid_mul_alpha
128 (src, dst, dc, src_offset, dst_offset, width, height, a);
129 else
130 ERR("Unsupported draw of unscaled images src->cache_entry.flags.alpha=%d, "
131 "dst->cache_entry.flags.alpha=%d, WITH ALPHA MUL %d",
132 src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha, A_VAL(&dc->mul.col));
133}
134
135static void
136_soft16_image_draw_unscaled_solid_solid_mul_color(Soft16_Image *src,
137 Soft16_Image *dst,
138 RGBA_Draw_Context *dc __UNUSED__,
139 int src_offset,
140 int dst_offset,
141 int w, int h, DATA8 r,
142 DATA8 g, DATA8 b, DATA8 a)
143{
144 DATA16 *src_itr, *dst_itr;
145 int y;
146
147 src_itr = src->pixels + src_offset;
148 dst_itr = dst->pixels + dst_offset;
149
150 if (a == 31)
151 for (y = 0; y < h; y++)
152 {
153 _soft16_scanline_blend_solid_solid_mul_color_solid
154 (src_itr, dst_itr, w, r, g, b);
155 src_itr += src->stride;
156 dst_itr += dst->stride;
157 }
158 else
159 for (y = 0; y < h; y++)
160 {
161 _soft16_scanline_blend_solid_solid_mul_color_transp
162 (src_itr, dst_itr, w, a, r, g, b);
163 src_itr += src->stride;
164 dst_itr += dst->stride;
165 }
166}
167
168static void
169_soft16_image_draw_unscaled_transp_solid_mul_color(Soft16_Image *src,
170 Soft16_Image *dst,
171 RGBA_Draw_Context *dc __UNUSED__,
172 int src_offset,
173 int dst_offset,
174 int w, int h, DATA8 r,
175 DATA8 g, DATA8 b, DATA8 a)
176
177{
178 DATA16 *src_itr, *dst_itr;
179 DATA8 *alpha_itr;
180 int y;
181
182 src_itr = src->pixels + src_offset;
183 alpha_itr = src->alpha + src_offset;
184 dst_itr = dst->pixels + dst_offset;
185
186 if (a == 31)
187 for (y = 0; y < h; y++)
188 {
189 _soft16_scanline_blend_transp_solid_mul_color_solid
190 (src_itr, alpha_itr, dst_itr, w, r, g, b);
191 src_itr += src->stride;
192 alpha_itr += src->stride;
193 dst_itr += dst->stride;
194 }
195 else
196 for (y = 0; y < h; y++)
197 {
198 _soft16_scanline_blend_transp_solid_mul_color_transp
199 (src_itr, alpha_itr, dst_itr, w, a, r, g, b);
200 src_itr += src->stride;
201 alpha_itr += src->stride;
202 dst_itr += dst->stride;
203 }
204}
205
206static inline void
207_soft16_image_draw_unscaled_mul_color(Soft16_Image *src, Soft16_Image *dst,
208 RGBA_Draw_Context *dc,
209 int src_offset, int dst_offset,
210 int width, int height,
211 DATA8 r, DATA8 g, DATA8 b, DATA8 a)
212{
213 if (src->cache_entry.flags.alpha && (!dst->cache_entry.flags.alpha))
214 _soft16_image_draw_unscaled_transp_solid_mul_color
215 (src, dst, dc, src_offset, dst_offset, width, height, r, g, b, a);
216 else if ((!src->cache_entry.flags.alpha) && (!dst->cache_entry.flags.alpha))
217 _soft16_image_draw_unscaled_solid_solid_mul_color
218 (src, dst, dc, src_offset, dst_offset, width, height, r, g, b, a);
219 else
220 ERR("Unsupported draw of unscaled images src->cache_entry.flags.alpha=%d, "
221 "dst->cache_entry.flags.alpha=%d, WITH COLOR MUL 0x%08x",
222 src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha, dc->mul.col);
223}
224
225static inline void
226_soft16_image_draw_unscaled_mul(Soft16_Image *src, Soft16_Image *dst,
227 RGBA_Draw_Context *dc,
228 int src_offset, int dst_offset,
229 int width, int height, DATA8 r, DATA8 g,
230 DATA8 b, DATA8 a)
231{
232 if ((a == r) && (a == (g >> 1)) && (a == b))
233 _soft16_image_draw_unscaled_mul_alpha(src, dst, dc, src_offset,
234 dst_offset, width, height, a);
235 else
236 _soft16_image_draw_unscaled_mul_color(src, dst, dc, src_offset,
237 dst_offset, width, height,
238 r, g, b, a);
239}
240
241void
242evas_common_soft16_image_draw_unscaled(Soft16_Image *src, Soft16_Image *dst,
243 RGBA_Draw_Context *dc,
244 const Eina_Rectangle sr,
245 const Eina_Rectangle dr,
246 const Eina_Rectangle cr)
247{
248 int src_offset_rows, src_offset, dst_offset;
249 DATA16 mul_rgb565;
250 DATA8 r, g, b, a;
251
252 if (!dc->mul.use)
253 {
254 r = b = a = 31;
255 g = 63;
256 mul_rgb565 = 0xffff;
257 }
258 else
259 {
260 a = A_VAL(&dc->mul.col) >> 3;
261 if (a == 0)
262 return;
263
264 r = R_VAL(&dc->mul.col) >> 3;
265 g = G_VAL(&dc->mul.col) >> 2;
266 b = B_VAL(&dc->mul.col) >> 3;
267
268 if (r > a) r = a;
269 if (g > (a << 1)) g = (a << 1);
270 if (b > a) b = a;
271
272 mul_rgb565 = (r << 11) || (g << 5) | b;
273 }
274
275
276 src_offset_rows = (cr.y - dr.y) + sr.y;
277 src_offset = (src_offset_rows * src->stride) + (cr.x - dr.x) + sr.x;
278
279 dst_offset = cr.x + (cr.y * dst->stride);
280
281 if (mul_rgb565 == 0xffff)
282 _soft16_image_draw_unscaled_no_mul(src, dst, dc, src_offset, dst_offset,
283 cr.w, cr.h);
284 else
285 _soft16_image_draw_unscaled_mul(src, dst, dc, src_offset, dst_offset,
286 cr.w, cr.h, r, g, b, a);
287}
diff --git a/libraries/evas/src/lib/engines/common_16/evas_soft16_line.c b/libraries/evas/src/lib/engines/common_16/evas_soft16_line.c
new file mode 100644
index 0000000..92e14af
--- /dev/null
+++ b/libraries/evas/src/lib/engines/common_16/evas_soft16_line.c
@@ -0,0 +1,444 @@
1#include "evas_common_soft16.h"
2#include "evas_soft16_scanline_fill.c"
3
4/*
5 * All functions except by evas_common_soft16_line_draw() expect x0 <= x1.
6 */
7
8static inline int
9_in_range(int value, int min, int max)
10{
11 return min <= value && value <= max;
12}
13
14static inline int
15_is_xy_inside_clip(int x, int y, const struct RGBA_Draw_Context_clip clip)
16{
17 if (!clip.use)
18 return 1;
19
20 if (!_in_range(x, clip.x, clip.x + clip.w - 1))
21 return 0;
22
23 if (!_in_range(y, clip.y, clip.y + clip.h - 1))
24 return 0;
25
26 return 1;
27}
28
29static inline int
30_is_x_inside_clip(int x, const struct RGBA_Draw_Context_clip clip)
31{
32 if (!clip.use)
33 return 1;
34
35 return _in_range(x, clip.x, clip.x + clip.w - 1);
36}
37
38static inline int
39_is_y_inside_clip(int y, const struct RGBA_Draw_Context_clip clip)
40{
41 if (!clip.use)
42 return 1;
43
44 return _in_range(y, clip.y, clip.y + clip.h - 1);
45}
46
47static inline int
48_is_xy_inside_rect(int x, int y, int w, int h)
49{
50 return _in_range(x, 0, w - 1) && _in_range(y, 0, h - 1);
51}
52
53static inline int
54_is_empty_clip(const struct RGBA_Draw_Context_clip clip)
55{
56 return clip.w < 1 || clip.h < 1;
57}
58
59static void
60_soft16_line_point(Soft16_Image *dst, RGBA_Draw_Context *dc, int x, int y)
61{
62 DATA16 rgb565, *dst_itr;
63 DATA8 alpha;
64
65 if (!_is_xy_inside_rect(x, y, dst->cache_entry.w, dst->cache_entry.h))
66 return;
67
68 if (!_is_xy_inside_clip(x, y, dc->clip))
69 return;
70
71 dst_itr = dst->pixels + (dst->stride * y) + x;
72 alpha = A_VAL(&dc->col.col) >> 3;
73 rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col),
74 G_VAL(&dc->col.col),
75 B_VAL(&dc->col.col));
76
77 if (alpha == 31)
78 _soft16_pt_fill_solid_solid(dst_itr, rgb565);
79 else if (alpha > 0)
80 {
81 DATA32 rgb565_unpack;
82
83 rgb565_unpack = RGB_565_UNPACK(rgb565);
84 alpha++;
85 _soft16_pt_fill_transp_solid(dst_itr, rgb565_unpack, alpha);
86 }
87}
88
89static void
90_soft16_line_horiz(Soft16_Image *dst, RGBA_Draw_Context *dc, int x0, int x1, int y)
91{
92 DATA16 rgb565, *dst_itr;
93 DATA8 alpha;
94 int w;
95
96 if (!_is_y_inside_clip(y, dc->clip))
97 return;
98
99 if (x0 < dc->clip.x)
100 x0 = dc->clip.x;
101
102 if (x1 >= dc->clip.x + dc->clip.w)
103 x1 = dc->clip.x + dc->clip.w - 1;
104
105 w = x1 - x0;
106 if (w < 1)
107 return;
108
109 dst_itr = dst->pixels + (dst->stride * y) + x0;
110 alpha = A_VAL(&dc->col.col) >> 3;
111 rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col),
112 G_VAL(&dc->col.col),
113 B_VAL(&dc->col.col));
114
115 if (alpha == 31)
116 _soft16_scanline_fill_solid_solid(dst_itr, w, rgb565);
117 else if (alpha > 0)
118 {
119 DATA32 rgb565_unpack;
120
121 rgb565_unpack = RGB_565_UNPACK(rgb565);
122 alpha++;
123 _soft16_scanline_fill_transp_solid(dst_itr, w, rgb565_unpack, alpha);
124 }
125}
126
127static void
128_soft16_line_vert(Soft16_Image *dst, RGBA_Draw_Context *dc, int x, int y0, int y1)
129{
130 DATA16 rgb565, *dst_itr;
131 DATA8 alpha;
132 int h;
133
134 if (!_is_x_inside_clip(x, dc->clip))
135 return;
136
137 if (y1 < y0)
138 {
139 int t;
140 t = y0;
141 y0 = y1;
142 y1 = t;
143 }
144
145 if (y0 < dc->clip.y)
146 y0 = dc->clip.y;
147
148 if (y1 >= dc->clip.y + dc->clip.h)
149 y1 = dc->clip.y + dc->clip.h - 1;
150
151 h = y1 - y0;
152 if (h < 1)
153 return;
154
155 dst_itr = dst->pixels + (dst->stride * y0) + x;
156 alpha = A_VAL(&dc->col.col) >> 3;
157 rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col),
158 G_VAL(&dc->col.col),
159 B_VAL(&dc->col.col));
160
161 if (alpha == 31)
162 {
163 for (; h > 0; h--, dst_itr += dst->stride)
164 _soft16_pt_fill_solid_solid(dst_itr, rgb565);
165 }
166 else if (alpha > 0)
167 {
168 DATA32 rgb565_unpack;
169
170 rgb565_unpack = RGB_565_UNPACK(rgb565);
171 alpha++;
172
173 for (; h > 0; h--, dst_itr += dst->stride)
174 _soft16_pt_fill_transp_solid(dst_itr, rgb565_unpack, alpha);
175 }
176}
177
178static inline void
179_soft16_line_45deg_adjust_boundaries(const struct RGBA_Draw_Context_clip clip, int *p_x0, int *p_y0, int *p_x1, int *p_y1)
180{
181 int diff, dy, x0, y0, x1, y1;
182
183 x0 = *p_x0;
184 y0 = *p_y0;
185 x1 = *p_x1;
186 y1 = *p_y1;
187
188 dy = y1 - y0;
189
190 diff = clip.x - x0;
191 if (diff > 0)
192 {
193 x0 = clip.x;
194 y0 += (dy > 0) ? diff : -diff;
195 }
196
197 diff = x1 - (clip.x + clip.w);
198 if (diff > 0)
199 {
200 x1 = clip.x + clip.w;
201 y1 += (dy > 0) ? -diff : diff;
202 }
203
204 if (dy > 0)
205 {
206 diff = clip.y - y0;
207 if (diff > 0)
208 {
209 y0 = clip.y;
210 x0 += diff;
211 }
212
213 diff = y1 - (clip.y + clip.h);
214 if (diff > 0)
215 {
216 y1 = clip.y + clip.h;
217 x1 -= diff;
218 }
219 }
220 else
221 {
222 diff = clip.y - y1;
223 if (diff > 0)
224 {
225 y1 = clip.y;
226 x1 -= diff;
227 }
228
229 diff = y0 - (clip.y + clip.h - 1);
230 if (diff > 0)
231 {
232 y0 = clip.y + clip.h - 1;
233 x0 += diff;
234 }
235 }
236
237 *p_x0 = x0;
238 *p_y0 = y0;
239 *p_x1 = x1;
240 *p_y1 = y1;
241}
242
243static void
244_soft16_line_45deg(Soft16_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1)
245{
246 int dy, step_dst_itr, len;
247 DATA8 alpha;
248 DATA16 *dst_itr, rgb565;
249
250 alpha = A_VAL(&dc->col.col) >> 3;
251 if (alpha < 1)
252 return;
253
254 rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col),
255 G_VAL(&dc->col.col),
256 B_VAL(&dc->col.col));
257
258 dy = y1 - y0;
259 step_dst_itr = 1 + ((dy > 0) ? dst->stride : -dst->stride);
260
261 _soft16_line_45deg_adjust_boundaries(dc->clip, &x0, &y0, &x1, &y1);
262
263 len = (dy > 0) ? (y1 - y0) : (y0 - y1);
264 if (len < 1)
265 return;
266
267 dst_itr = dst->pixels + dst->stride * y0 + x0;
268 if (alpha == 31)
269 {
270 for (; len > 0; len--, dst_itr += step_dst_itr)
271 _soft16_pt_fill_solid_solid(dst_itr, rgb565);
272 }
273 else
274 {
275 DATA32 rgb565_unpack;
276
277 rgb565_unpack = RGB_565_UNPACK(rgb565);
278 alpha++;
279 for (; len > 0; len--, dst_itr += step_dst_itr)
280 _soft16_pt_fill_transp_solid(dst_itr, rgb565_unpack, alpha);
281 }
282}
283
284EFL_ALWAYS_INLINE void
285_soft16_line_aliased_pt(DATA16 *dst_itr, DATA16 rgb565, DATA32 rgb565_unpack, DATA8 alpha)
286{
287 if (alpha == 32)
288 _soft16_pt_fill_solid_solid(dst_itr, rgb565);
289 else
290 _soft16_pt_fill_transp_solid(dst_itr, rgb565_unpack, alpha);
291}
292
293static void
294_soft16_line_aliased(Soft16_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1)
295{
296 int dx, dy, step_y, step_dst_itr;
297 DATA32 rgb565_unpack;
298 DATA16 rgb565;
299 DATA8 alpha;
300
301 alpha = A_VAL(&dc->col.col) >> 3;
302 if (alpha == 0)
303 return;
304 alpha++;
305
306 rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col),
307 G_VAL(&dc->col.col),
308 B_VAL(&dc->col.col));
309 rgb565_unpack = RGB_565_UNPACK(rgb565);
310
311 dx = x1 - x0;
312 dy = y1 - y0;
313
314 if (dy >= 0)
315 {
316 step_y = 1;
317 step_dst_itr = dst->stride;
318 }
319 else
320 {
321 dy = -dy;
322 step_y = -1;
323 step_dst_itr = -dst->stride;
324 }
325
326 if (dx > dy)
327 {
328 DATA16 *dst_itr;
329 int e, x, y;
330
331 e = - (dx / 2);
332 y = y0;
333 dst_itr = dst->pixels + dst->stride * y0 + x0;
334 for (x=x0; x <= x1; x++, dst_itr++)
335 {
336 if (_is_xy_inside_clip(x, y, dc->clip))
337 _soft16_line_aliased_pt(dst_itr, rgb565, rgb565_unpack, alpha);
338
339 e += dy;
340 if (e >= 0)
341 {
342 dst_itr += step_dst_itr;
343 y += step_y;
344 e -= dx;
345 }
346 }
347 }
348 else
349 {
350 DATA16 *dst_itr;
351 int e, x, y;
352
353 e = - (dy / 2);
354 x = x0;
355 dst_itr = dst->pixels + dst->stride * y0 + x0;
356 for (y=y0; y != y1; y += step_y, dst_itr += step_dst_itr)
357 {
358 if (_is_xy_inside_clip(x, y, dc->clip))
359 _soft16_line_aliased_pt(dst_itr, rgb565, rgb565_unpack, alpha);
360
361 e += dx;
362 if (e >= 0)
363 {
364 dst_itr++;
365 x++;
366 e -= dy;
367 }
368 }
369 }
370}
371
372void
373evas_common_soft16_line_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1)
374{
375 struct RGBA_Draw_Context_clip c_bkp, c_tmp;
376 int dx, dy;
377 int x, y, w, h;
378
379 c_tmp.use = 1;
380 c_tmp.x = 0;
381 c_tmp.y = 0;
382 c_tmp.w = dst->cache_entry.w;
383 c_tmp.h = dst->cache_entry.h;
384
385 /* save out clip info */
386 c_bkp = dc->clip;
387 if (c_bkp.use)
388 {
389 RECTS_CLIP_TO_RECT(c_tmp.x, c_tmp.y, c_tmp.w, c_tmp.h,
390 c_bkp.x, c_bkp.y, c_bkp.w, c_bkp.h);
391 if (_is_empty_clip(c_tmp))
392 return;
393 }
394
395 x = MIN(x0, x1);
396 y = MIN(y0, y1);
397 w = MAX(x0, x1) - x + 1;
398 h = MAX(y0, y1) - y + 1;
399
400 RECTS_CLIP_TO_RECT(c_tmp.x, c_tmp.y, c_tmp.w, c_tmp.h, x, y, w, h);
401 if (_is_empty_clip(c_tmp))
402 return;
403
404 /* Check if the line doesn't cross the clip area */
405 if (x0 < c_tmp.x && x1 < c_tmp.x)
406 return;
407 if (x0 >= c_tmp.x + c_tmp.w && x1 >= c_tmp.x + c_tmp.w)
408 return;
409 if (y0 < c_tmp.y && y1 < c_tmp.y)
410 return;
411 if (y0 >= c_tmp.y + c_tmp.h && y1 >= c_tmp.y + c_tmp.h)
412 return;
413
414 dc->clip = c_tmp;
415 dx = x1 - x0;
416 dy = y1 - y0;
417
418 if (dx < 0)
419 {
420 int t;
421
422 t = x0;
423 x0 = x1;
424 x1 = t;
425
426 t = y0;
427 y0 = y1;
428 y1 = t;
429 }
430
431 if (dx == 0 && dy == 0)
432 _soft16_line_point(dst, dc, x0, y0);
433 else if (dx == 0)
434 _soft16_line_vert(dst, dc, x0, y0, y1);
435 else if (dy == 0)
436 _soft16_line_horiz(dst, dc, x0, x1, y0);
437 else if (dy == dx || dy == -dx)
438 _soft16_line_45deg(dst, dc, x0, y0, x1, y1);
439 else
440 _soft16_line_aliased(dst, dc, x0, y0, x1, y1);
441
442 /* restore clip info */
443 dc->clip = c_bkp;
444}
diff --git a/libraries/evas/src/lib/engines/common_16/evas_soft16_main.c b/libraries/evas/src/lib/engines/common_16/evas_soft16_main.c
new file mode 100644
index 0000000..6028744
--- /dev/null
+++ b/libraries/evas/src/lib/engines/common_16/evas_soft16_main.c
@@ -0,0 +1,594 @@
1#include "evas_common_soft16.h"
2
3static Evas_Cache_Image *eci = NULL;
4static int reference = 0;
5
6static Image_Entry *_evas_common_soft16_image_new(void);
7static void _evas_common_soft16_image_delete(Image_Entry *ie);
8
9static int _evas_common_soft16_image_surface_alloc(Image_Entry *ie, unsigned int w, unsigned int h);
10static void _evas_common_soft16_image_surface_delete(Image_Entry *ie);
11static DATA32 *_evas_common_soft16_image_surface_pixels(Image_Entry *ie);
12
13static int _evas_common_load_soft16_image_from_file(Image_Entry *ie);
14static void _evas_common_soft16_image_unload(Image_Entry *ie);
15
16static void _evas_common_soft16_image_dirty_region(Image_Entry *im, unsigned int x, unsigned int y, unsigned int w, unsigned int h);
17static int _evas_common_soft16_image_dirty(Image_Entry *ie_dst, const Image_Entry *ie_src);
18
19static int _evas_common_soft16_image_ram_usage(Image_Entry *ie);
20
21static int _evas_common_soft16_image_size_set(Image_Entry *ie_dst, const Image_Entry *ie_im, unsigned int w, unsigned int h);
22static int _evas_common_soft16_image_from_copied_data(Image_Entry* ie_dst, unsigned int w, unsigned int h, DATA32 *image_data, int alpha, int cspace);
23static int _evas_common_soft16_image_from_data(Image_Entry* ie_dst, unsigned int w, unsigned int h, DATA32 *image_data, int alpha, int cspace);
24static int _evas_common_soft16_image_colorspace_set(Image_Entry* ie_dst, int cspace);
25
26static int _evas_common_load_soft16_image_data_from_file(Image_Entry *ie);
27
28/* static void */
29/* _evas_common_soft16_image_debug(const char* context, Image_Entry *eim) */
30/* { */
31/* DBG("[16] %p = [%s] {%s,%s} %i [%i|%i]", eim, context, eim->file, eim->key, eim->references, eim->w, eim->h); */
32/* } */
33
34static const Evas_Cache_Image_Func _evas_common_soft16_image_func =
35{
36 _evas_common_soft16_image_new,
37 _evas_common_soft16_image_delete,
38 _evas_common_soft16_image_surface_alloc,
39 _evas_common_soft16_image_surface_delete,
40 _evas_common_soft16_image_surface_pixels,
41 _evas_common_load_soft16_image_from_file,
42 _evas_common_soft16_image_unload,
43 _evas_common_soft16_image_dirty_region,
44 _evas_common_soft16_image_dirty,
45 _evas_common_soft16_image_size_set,
46 _evas_common_soft16_image_from_copied_data,
47 _evas_common_soft16_image_from_data,
48 _evas_common_soft16_image_colorspace_set,
49 _evas_common_load_soft16_image_data_from_file,
50 _evas_common_soft16_image_ram_usage,
51/* _evas_common_soft16_image_debug */
52 NULL
53};
54
55EAPI void
56evas_common_soft16_image_init(void)
57{
58 if (!eci)
59 eci = evas_cache_image_init(&_evas_common_soft16_image_func);
60 reference++;
61}
62
63EAPI void
64evas_common_soft16_image_shutdown(void)
65{
66 if (--reference == 0)
67 {
68// DISABLE for now - something wrong with cache shutdown freeing things
69// still in use - rage_thumb segv's now.
70//
71// actually - i think i see it. cache ref goes to 0 (and thus gets freed)
72// because in eng_setup() when a buffer changes size it is FIRST freed
73// THEN allocated again - thus brignhjing ref to 0 then back to 1 immediately
74// where it should stay at 1. - see evas_engine.c in the buffer enigne for
75// example. eng_output_free() is called BEFORE _output_setup(). although this
76// is only a SIGNE of the problem. we can patch this up with either freeing
77// after the setup (so we just pt a ref of 2 then back to 1), or just
78// evas_common_image_init() at the start and evas_common_image_shutdown()
79// after it all. really ref 0 should only be reached when no more canvases
80// with no more objects exist anywhere.
81
82// ENABLE IT AGAIN, hope it is fixed. Gustavo @ January 22nd, 2009.
83 evas_cache_image_shutdown(eci);
84 eci = NULL;
85 }
86}
87
88EAPI Evas_Cache_Image *
89evas_common_soft16_image_cache_get(void)
90{
91 return eci;
92}
93
94static Image_Entry *
95_evas_common_soft16_image_new(void)
96{
97 Soft16_Image *im;
98
99 im = calloc(1, sizeof(Soft16_Image));
100 if (!im) return NULL;
101
102 im->stride = -1;
103
104 return (Image_Entry *) im;
105}
106
107static void
108_evas_common_soft16_image_delete(Image_Entry *ie)
109{
110 memset(ie, 0xFF, sizeof (Soft16_Image));
111 free(ie);
112}
113
114static int
115_evas_common_soft16_image_surface_alloc(Image_Entry *ie, unsigned int w, unsigned int h)
116{
117 Soft16_Image *im = (Soft16_Image *) ie;
118
119 if (im->stride < 0) im->stride = _calc_stride(w);
120
121 im->pixels = realloc(im->pixels, IMG_BYTE_SIZE(im->stride, h, ie->flags.alpha));
122 if (!im->pixels) return -1;
123
124 if (ie->flags.alpha)
125 {
126 im->alpha = (DATA8 *)(im->pixels + (im->stride * h));
127 im->flags.free_alpha = 0;
128 }
129 im->flags.free_pixels = 1;
130
131 return 0;
132}
133
134static void
135_evas_common_soft16_image_surface_delete(Image_Entry *ie)
136{
137 Soft16_Image *im = (Soft16_Image *) ie;
138
139 if (im->flags.free_pixels)
140 free(im->pixels);
141 im->pixels = NULL;
142 im->flags.free_pixels = 0;
143
144 if (im->flags.free_alpha)
145 free(im->alpha);
146 im->alpha = NULL;
147 im->flags.free_alpha = 0;
148}
149
150static DATA32 *
151_evas_common_soft16_image_surface_pixels(Image_Entry *ie __UNUSED__)
152{
153 abort();
154
155 return NULL;
156}
157
158static int
159_evas_common_load_soft16_image_from_file(Image_Entry *ie)
160{
161 Soft16_Image *sim = (Soft16_Image *) ie;
162 RGBA_Image *im;
163 int error = 0;
164
165 im = (RGBA_Image *) evas_cache_image_request(evas_common_image_cache_get(), sim->cache_entry.file, sim->cache_entry.key, &sim->cache_entry.load_opts, &error);
166 sim->source = im;
167 if (!sim->source) return -1;
168
169 sim->cache_entry.w = sim->source->cache_entry.w;
170 sim->cache_entry.h = sim->source->cache_entry.h;
171 ie->flags.alpha = im->cache_entry.flags.alpha;
172 sim->cache_entry.info = im->cache_entry.info;
173 if (sim->stride < 0) sim->stride = _calc_stride(sim->cache_entry.w);
174
175 return 0;
176}
177
178static void
179_evas_common_soft16_image_unload(Image_Entry *ie __UNUSED__)
180{
181}
182
183static void
184_evas_common_soft16_image_dirty_region(Image_Entry *im __UNUSED__, unsigned int x __UNUSED__, unsigned int y __UNUSED__, unsigned int w __UNUSED__, unsigned int h __UNUSED__)
185{
186}
187
188static int
189_evas_common_soft16_image_dirty(Image_Entry *ie_dst, const Image_Entry *ie_src)
190{
191 Soft16_Image *dst = (Soft16_Image *) ie_dst;
192 Soft16_Image *src = (Soft16_Image *) ie_src;
193
194 evas_cache_image_load_data(&src->cache_entry);
195 evas_cache_image_surface_alloc(&dst->cache_entry,
196 src->cache_entry.w, src->cache_entry.h);
197
198/* evas_common_blit_rectangle(src, dst, 0, 0, src->cache_entry.w, src->cache_entry.h, 0, 0); */
199
200 return 0;
201}
202
203static int
204_evas_common_soft16_image_ram_usage(Image_Entry *ie)
205{
206 Soft16_Image *im = (Soft16_Image *) ie;
207
208 if (im->pixels && im->flags.free_pixels)
209 return IMG_BYTE_SIZE(im->stride, im->cache_entry.h, ie->flags.alpha);
210 return 0;
211}
212
213static int
214_evas_common_soft16_image_size_set(Image_Entry *ie_dst, const Image_Entry *ie_im, unsigned int w __UNUSED__, unsigned int h __UNUSED__)
215{
216 Soft16_Image *dst = (Soft16_Image *) ie_dst;
217 Soft16_Image *im = (Soft16_Image *) ie_im;
218
219 dst->flags = im->flags;
220
221 return 0;
222}
223
224static int
225_evas_common_soft16_image_from_data(Image_Entry* ie_dst, unsigned int w, unsigned int h, DATA32 *image_data, int alpha, int cspace __UNUSED__)
226{
227 Soft16_Image *im = (Soft16_Image *) ie_dst;
228
229 /* FIXME: handle colorspace */
230 ie_dst->w = w;
231 ie_dst->h = h;
232 ie_dst->flags.alpha = alpha;
233
234 im->flags.free_pixels = 0;
235 im->flags.free_alpha = 0;
236 if (im->stride < 0)
237 im->stride = _calc_stride(w);
238
239 /* FIXME: That's bad, the application must be aware of the engine internal. */
240 im->pixels = (DATA16 *) image_data;
241 if (ie_dst->flags.alpha)
242 im->alpha = (DATA8 *)(im->pixels + (im->stride * h));
243
244 return 0;
245}
246
247static int
248_evas_common_soft16_image_from_copied_data(Image_Entry* ie_dst, unsigned int w __UNUSED__, unsigned int h, DATA32 *image_data, int alpha __UNUSED__, int cspace __UNUSED__)
249{
250 Soft16_Image *im = (Soft16_Image *) ie_dst;
251
252 /* FIXME: handle colorspace */
253 if (image_data)
254 memcpy(im->pixels, image_data, IMG_BYTE_SIZE(im->stride, h, ie_dst->flags.alpha));
255 else
256 memset(im->pixels, 0, IMG_BYTE_SIZE(im->stride, h, ie_dst->flags.alpha));
257
258 return 0;
259}
260
261static int
262_evas_common_soft16_image_colorspace_set(Image_Entry* ie_dst __UNUSED__, int cspace __UNUSED__)
263{
264 /* FIXME: handle colorspace */
265 return 0;
266}
267
268static int
269_evas_common_load_soft16_image_data_from_file(Image_Entry *ie)
270{
271 Soft16_Image *im = (Soft16_Image *) ie;
272
273 if (im->pixels) return 0;
274 if (!im->source) return -1;
275
276 evas_cache_image_load_data(&im->source->cache_entry);
277 if (im->source->image.data)
278 {
279 DATA32 *sp;
280
281 evas_cache_image_surface_alloc(&im->cache_entry,
282 im->source->cache_entry.w,
283 im->source->cache_entry.h);
284
285 sp = im->source->image.data;
286 if (im->alpha)
287 evas_common_soft16_image_convert_from_rgba(im, sp);
288 else
289 evas_common_soft16_image_convert_from_rgb(im, sp);
290 }
291 evas_cache_image_drop(&im->source->cache_entry);
292 im->cache_entry.info.module = NULL;
293 im->cache_entry.info.loader = NULL;
294 im->source = NULL;
295
296 return 0;
297}
298
299/* Soft16_Image * */
300/* evas_common_soft16_image_new(int w, int h, int stride, int have_alpha, DATA16 *pixels, */
301/* int copy) */
302/* { */
303/* Soft16_Image *im; */
304
305/* if (stride < 0) stride = _calc_stride(w); */
306
307/* im = evas_common_soft16_image_alloc(w, h, stride, have_alpha, copy); */
308/* if (!im) return NULL; */
309
310/* if (pixels) */
311/* { */
312/* if (copy) */
313/* memcpy(im->pixels, pixels, IMG_BYTE_SIZE(stride, h, have_alpha)); */
314/* else */
315/* { */
316/* im->pixels = pixels; */
317/* if (have_alpha) im->alpha = (DATA8 *)(im->pixels + (stride * h)); */
318/* } */
319/* } */
320/* return im; */
321/* } */
322
323static inline void
324_get_clip(const RGBA_Draw_Context *dc, const Soft16_Image *im,
325 Eina_Rectangle *clip)
326{
327 if (dc->clip.use)
328 {
329 EINA_RECTANGLE_SET(clip, dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h);
330 if (clip->x < 0)
331 {
332 clip->w += clip->x;
333 clip->x = 0;
334 }
335 if (clip->y < 0)
336 {
337 clip->h += clip->y;
338 clip->y = 0;
339 }
340 if ((clip->x + clip->w) > (int)im->cache_entry.w) clip->w = im->cache_entry.w - clip->x;
341 if ((clip->y + clip->h) > (int)im->cache_entry.h) clip->h = im->cache_entry.h - clip->y;
342 }
343 else
344 {
345 EINA_RECTANGLE_SET(clip, 0, 0, im->cache_entry.w, im->cache_entry.h);
346 }
347}
348
349static inline int
350_is_empty_rectangle(const Eina_Rectangle *r)
351{
352 return (r->w < 1) || (r->h < 1);
353}
354
355static inline void
356_shrink(int *s_pos, int *s_size, int pos, int size)
357{
358 int d;
359
360 d = (*s_pos) - pos;
361 if (d < 0)
362 {
363 (*s_size) += d;
364 (*s_pos) = pos;
365 }
366
367 d = size + pos - (*s_pos);
368 if ((*s_size) > d)
369 (*s_size) = d;
370}
371
372static int
373_soft16_adjust_areas(Eina_Rectangle *src,
374 int src_max_x, int src_max_y,
375 Eina_Rectangle *dst,
376 int dst_max_x, int dst_max_y,
377 Eina_Rectangle *dst_clip)
378{
379 if (_is_empty_rectangle(src) ||
380 _is_empty_rectangle(dst) ||
381 _is_empty_rectangle(dst_clip))
382 return 0;
383
384 /* shrink clip */
385 _shrink(&dst_clip->x, &dst_clip->w, dst->x, dst->w);
386 _shrink(&dst_clip->y, &dst_clip->h, dst->y, dst->h);
387 if (_is_empty_rectangle(dst_clip)) return 0;
388
389 /* sanitise x */
390 if (src->x < 0)
391 {
392 dst->x -= (src->x * dst->w) / src->w;
393 dst->w += (src->x * dst->w) / src->w;
394 src->w += src->x;
395 src->x = 0;
396 }
397 if (src->x >= src_max_x) return 0;
398 if ((src->x + src->w) > src_max_x)
399 {
400 dst->w = (dst->w * (src_max_x - src->x)) / (src->w);
401 src->w = src_max_x - src->x;
402 }
403 if (dst->w <= 0) return 0;
404 if (src->w <= 0) return 0;
405 if (dst_clip->x < 0)
406 {
407 dst_clip->w += dst_clip->x;
408 dst_clip->x = 0;
409 }
410 if (dst_clip->w <= 0) return 0;
411 if (dst_clip->x >= dst_max_x) return 0;
412
413 _shrink(&dst_clip->x, &dst_clip->w, 0, dst_max_x);
414 if (dst_clip->w <= 0) return 0;
415
416 /* sanitise y */
417 if (src->y < 0)
418 {
419 dst->y -= (src->y * dst->h) / src->h;
420 dst->h += (src->y * dst->h) / src->h;
421 src->h += src->y;
422 src->y = 0;
423 }
424 if (src->y >= src_max_y) return 0;
425 if ((src->y + src->h) > src_max_y)
426 {
427 dst->h = (dst->h * (src_max_y - src->y)) / (src->h);
428 src->h = src_max_y - src->y;
429 }
430 if (dst->h <= 0) return 0;
431 if (src->h <= 0) return 0;
432 if (dst_clip->y < 0)
433 {
434 dst_clip->h += dst_clip->y;
435 dst_clip->y = 0;
436 }
437 if (dst_clip->h <= 0) return 0;
438 if (dst_clip->y >= dst_max_y) return 0;
439
440 _shrink(&dst_clip->y, &dst_clip->h, 0, dst_max_y);
441 if (dst_clip->h <= 0) return 0;
442
443 return 1;
444}
445
446static void
447_soft16_image_draw_sampled_int(Soft16_Image *src, Soft16_Image *dst,
448 RGBA_Draw_Context *dc,
449 Eina_Rectangle sr, Eina_Rectangle dr)
450{
451 Eina_Rectangle cr;
452
453 if (!(RECTS_INTERSECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->cache_entry.w, dst->cache_entry.h)))
454 return;
455 if (!(RECTS_INTERSECT(sr.x, sr.y, sr.w, sr.h, 0, 0, src->cache_entry.w, src->cache_entry.h)))
456 return;
457
458 _get_clip(dc, dst, &cr);
459 if (!_soft16_adjust_areas(&sr, src->cache_entry.w, src->cache_entry.h, &dr, dst->cache_entry.w, dst->cache_entry.h, &cr))
460 return;
461
462 if ((dr.w == sr.w) && (dr.h == sr.h))
463 evas_common_soft16_image_draw_unscaled(src, dst, dc, sr, dr, cr);
464 else
465 evas_common_soft16_image_draw_scaled_sampled(src, dst, dc, sr, dr, cr);
466}
467
468EAPI void
469evas_common_soft16_image_draw(Soft16_Image *src, Soft16_Image *dst,
470 RGBA_Draw_Context *dc,
471 int src_region_x, int src_region_y,
472 int src_region_w, int src_region_h,
473 int dst_region_x, int dst_region_y,
474 int dst_region_w, int dst_region_h,
475 int smooth __UNUSED__)
476{
477 Eina_Rectangle sr, dr;
478 Cutout_Rects *rects;
479 Cutout_Rect *r;
480 struct RGBA_Draw_Context_clip clip_bkp;
481 int i;
482
483 /* handle cutouts here! */
484 EINA_RECTANGLE_SET(&dr, dst_region_x, dst_region_y, dst_region_w, dst_region_h);
485
486 if (_is_empty_rectangle(&dr)) return;
487 if (!(RECTS_INTERSECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->cache_entry.w, dst->cache_entry.h)))
488 return;
489
490 EINA_RECTANGLE_SET(&sr, src_region_x, src_region_y, src_region_w, src_region_h);
491
492 if (_is_empty_rectangle(&sr)) return;
493 if (!(RECTS_INTERSECT(sr.x, sr.y, sr.w, sr.h, 0, 0, src->cache_entry.w, src->cache_entry.h)))
494 return;
495
496 /* no cutouts - cut right to the chase */
497 if (!dc->cutout.rects)
498 {
499 _soft16_image_draw_sampled_int(src, dst, dc, sr, dr);
500 return;
501 }
502
503 /* save out clip info */
504 clip_bkp = dc->clip;
505 evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h);
506 evas_common_draw_context_clip_clip(dc, dst_region_x, dst_region_y, dst_region_w, dst_region_h);
507 /* our clip is 0 size.. abort */
508 if ((dc->clip.w <= 0) || (dc->clip.h <= 0))
509 {
510 dc->clip = clip_bkp;
511 return;
512 }
513 rects = evas_common_draw_context_apply_cutouts(dc);
514 for (i = 0; i < rects->active; i++)
515 {
516 r = rects->rects + i;
517 evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h);
518 _soft16_image_draw_sampled_int(src, dst, dc, sr, dr);
519 }
520 evas_common_draw_context_apply_clear_cutouts(rects);
521 dc->clip = clip_bkp;
522}
523
524EAPI Soft16_Image *
525evas_common_soft16_image_alpha_set(Soft16_Image *im, int have_alpha)
526{
527 Soft16_Image *new_im;
528
529 if (im->cache_entry.flags.alpha == have_alpha) return im;
530
531 new_im = (Soft16_Image *) evas_cache_image_alone(&im->cache_entry);
532
533 new_im->cache_entry.flags.alpha = have_alpha;
534
535 if (im->cache_entry.w > 0
536 && im->cache_entry.h)
537 new_im = (Soft16_Image *) evas_cache_image_size_set(&new_im->cache_entry, im->cache_entry.w, im->cache_entry.h);
538
539 return new_im;
540}
541
542/* Soft16_Image * */
543/* evas_common_soft16_image_size_set(Soft16_Image *old_im, int w, int h) */
544/* { */
545/* Soft16_Image *new_im; */
546/* DATA16 *dp, *sp; */
547/* int i, cw, ch, ew; */
548
549/* if ((old_im->cache_entry.w == w) && (old_im->cache_entry.h == h)) return old_im; */
550
551/* new_im = evas_common_soft16_image_new(w, h, -1, old_im->flags.have_alpha, NULL, 1); */
552
553/* if (old_im->cache_entry.w < new_im->cache_entry.w) */
554/* cw = old_im->cache_entry.w; */
555/* else */
556/* cw = new_im->cache_entry.w; */
557
558/* ew = new_im->cache_entry.w - cw; */
559
560/* if (old_im->cache_entry.h < new_im->cache_entry.h) */
561/* ch = old_im->cache_entry.h; */
562/* else */
563/* ch = new_im->cache_entry.h; */
564
565/* dp = new_im->pixels; */
566/* sp = old_im->pixels; */
567/* for (i = 0; i < ch; i++) */
568/* { */
569/* memcpy(dp, sp, cw * sizeof(DATA16)); */
570/* if (ew > 0) memset(dp, 0, ew * sizeof(DATA16)); */
571
572/* dp += new_im->stride; */
573/* sp += old_im->stride; */
574/* } */
575
576/* if (old_im->flags.have_alpha) */
577/* { */
578/* DATA8 *dp, *sp; */
579
580/* dp = new_im->alpha; */
581/* sp = old_im->alpha; */
582/* for (i = 0; i < ch; i++) */
583/* { */
584/* memcpy(dp, sp, cw * sizeof(DATA8)); */
585/* if (ew > 0) memset(dp, 0, ew * sizeof(DATA8)); */
586
587/* dp += new_im->stride; */
588/* sp += old_im->stride; */
589/* } */
590/* } */
591
592/* evas_cache_image_drop(&old_im->cache_entry); */
593/* return new_im; */
594/* } */
diff --git a/libraries/evas/src/lib/engines/common_16/evas_soft16_point_blend.c b/libraries/evas/src/lib/engines/common_16/evas_soft16_point_blend.c
new file mode 100644
index 0000000..8cd02d5
--- /dev/null
+++ b/libraries/evas/src/lib/engines/common_16/evas_soft16_point_blend.c
@@ -0,0 +1,149 @@
1/** NOTE: This file is meant to be included by users **/
2
3/** NOTE2: r, g, b parameters are 16bits, so you can pass 0 to 256 inclusive.
4 ** this is due our division by 256 when multiplying the color.
5 **/
6
7/*****************************************************************************
8 * Scanline processing
9 *
10 * _soft16_pt_<description>_<src>_<dst>[_<modifier>]()
11 *
12 ****************************************************************************/
13
14/***********************************************************************
15 * Regular blend operations
16 */
17
18EFL_ALWAYS_INLINE void
19_soft16_pt_blend_transp_solid(DATA16 *p_dst, DATA16 src, DATA8 alpha)
20{
21 if (alpha == 31) *p_dst = src;
22 else if (alpha != 0)
23 {
24 DATA32 a, b;
25
26 a = RGB_565_UNPACK(src);
27 b = RGB_565_UNPACK(*p_dst);
28 b = RGB_565_UNPACKED_BLEND(a, b, alpha);
29 *p_dst = RGB_565_PACK(b);
30 }
31}
32
33EFL_ALWAYS_INLINE void
34_soft16_pt_blend_solid_solid(DATA16 *p_dst, DATA16 src)
35{
36 *p_dst = src;
37}
38
39/***********************************************************************
40 * Blend operations taking an extra alpha (fade in, out)
41 */
42
43EFL_ALWAYS_INLINE void
44_soft16_pt_blend_transp_solid_mul_alpha(DATA16 *p_dst, DATA16 src, DATA8 alpha, DATA8 rel_alpha)
45{
46 DATA32 a, b;
47
48 alpha = (alpha * rel_alpha) >> 5;
49 if (alpha == 0)
50 return;
51
52 alpha++;
53
54 a = ((RGB_565_UNPACK(src) * rel_alpha) >> 5) & RGB_565_UNPACKED_MASK;
55 b = RGB_565_UNPACK(*p_dst);
56 b = RGB_565_UNPACKED_BLEND(a, b, alpha);
57 *p_dst = RGB_565_PACK(b);
58}
59
60EFL_ALWAYS_INLINE void
61_soft16_pt_blend_solid_solid_mul_alpha(DATA16 *p_dst, DATA16 src, DATA8 rel_alpha)
62{
63 DATA32 a, b;
64 a = RGB_565_UNPACK(src);
65 b = RGB_565_UNPACK(*p_dst);
66 b = RGB_565_UNPACKED_BLEND_UNMUL(a, b, rel_alpha);
67 *p_dst = RGB_565_PACK(b);
68}
69
70/***********************************************************************
71 * Blend operations with extra alpha and multiply color
72 */
73
74EFL_ALWAYS_INLINE void
75_soft16_pt_blend_transp_solid_mul_color_transp(DATA16 *p_dst, DATA16 src, DATA8 alpha, DATA8 rel_alpha, DATA16 r, DATA16 g, DATA16 b)
76{
77 DATA32 rgb, d;
78 int r1, g1, b1;
79
80 alpha = (alpha * rel_alpha) >> 5;
81 if (alpha == 0)
82 return;
83
84 alpha++;
85
86 r1 = ((((src) >> 11) & 0x1f) * r) >> 5;
87 g1 = ((((src) >> 5) & 0x3f) * g) >> 6;
88 b1 = (((src) & 0x1f) * b) >> 5;
89 rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK;
90 d = RGB_565_UNPACK(*p_dst);
91 d = RGB_565_UNPACKED_BLEND(rgb, d, alpha);
92
93 *p_dst = RGB_565_PACK(d);
94}
95
96EFL_ALWAYS_INLINE void
97_soft16_pt_blend_solid_solid_mul_color_transp(DATA16 *p_dst, DATA16 src, DATA8 rel_alpha, DATA16 r, DATA16 g, DATA16 b)
98{
99 int r1, g1, b1;
100 DATA32 rgb, d;
101
102 r1 = ((((src) >> 11) & 0x1f) * r) >> 5;
103 g1 = ((((src) >> 5) & 0x3f) * g) >> 6;
104 b1 = (((src) & 0x1f) * b) >> 5;
105
106 rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK;
107 d = RGB_565_UNPACK(*p_dst);
108 d = RGB_565_UNPACKED_BLEND(rgb, d, rel_alpha);
109 *p_dst = RGB_565_PACK(d);
110}
111
112/***********************************************************************
113 * Blend operations with extra multiply color
114 */
115
116EFL_ALWAYS_INLINE void
117_soft16_pt_blend_transp_solid_mul_color_solid(DATA16 *p_dst, DATA16 src, DATA8 alpha, DATA8 r, DATA8 g, DATA8 b)
118{
119 int r1, g1, b1;
120
121 if (alpha == 0) return;
122
123 r1 = ((((src >> 11) & 0x1f) * r) >> 5) & 0x1f;
124 g1 = ((((src >> 5) & 0x3f) * g) >> 6) & 0x3f;
125 b1 = (((src & 0x1f) * b) >> 5) & 0x1f;
126
127 if (alpha == 31) *p_dst = (r1 << 11) | (g1 << 5) | b1;
128 else
129 {
130 DATA32 rgb_unpack, d;
131
132 rgb_unpack = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK;
133 d = RGB_565_UNPACK(*p_dst);
134 d = RGB_565_UNPACKED_BLEND(rgb_unpack, d, alpha);
135 *p_dst = RGB_565_PACK(d);
136 }
137}
138
139EFL_ALWAYS_INLINE void
140_soft16_pt_blend_solid_solid_mul_color_solid(DATA16 *p_dst, DATA16 src, DATA16 r, DATA16 g, DATA16 b)
141{
142 int r1, g1, b1;
143
144 r1 = ((((src >> 11) & 0x1f) * r) >> 5) & 0x1f;
145 g1 = ((((src >> 5) & 0x3f) * g) >> 6) & 0x3f;
146 b1 = (((src & 0x1f) * b) >> 5) & 0x1f;
147
148 *p_dst = (r1 << 11) | (g1 << 5) | b1;
149}
diff --git a/libraries/evas/src/lib/engines/common_16/evas_soft16_polygon.c b/libraries/evas/src/lib/engines/common_16/evas_soft16_polygon.c
new file mode 100644
index 0000000..ca18bef
--- /dev/null
+++ b/libraries/evas/src/lib/engines/common_16/evas_soft16_polygon.c
@@ -0,0 +1,231 @@
1#include <math.h>
2#include <evas_common_soft16.h>
3#include "evas_soft16_scanline_fill.c"
4
5typedef struct _RGBA_Edge RGBA_Edge;
6typedef struct _RGBA_Vertex RGBA_Vertex;
7
8struct _RGBA_Edge
9{
10 float x, dx;
11 int i;
12};
13
14struct _RGBA_Vertex
15{
16 float x, y;
17 int i;
18};
19
20#define POLY_EDGE_DEL(_i) \
21{ \
22 int _j; \
23 \
24 for (_j = 0; (_j < num_active_edges) && (edges[_j].i != _i); _j++); \
25 if (_j < num_active_edges) \
26 { \
27 num_active_edges--; \
28 memmove(&(edges[_j]), &(edges[_j + 1]), \
29 (num_active_edges - _j) * sizeof(RGBA_Edge)); \
30 } \
31}
32
33#define POLY_EDGE_ADD(_i, _y) \
34{ \
35 int _j; \
36 float _dx; \
37 RGBA_Vertex *_p, *_q; \
38 if (_i < (n - 1)) _j = _i + 1; \
39 else _j = 0; \
40 if (point[_i].y < point[_j].y) \
41 { \
42 _p = &(point[_i]); \
43 _q = &(point[_j]); \
44 } \
45 else \
46 { \
47 _p = &(point[_j]); \
48 _q = &(point[_i]); \
49 } \
50 edges[num_active_edges].dx = _dx = (_q->x - _p->x) / (_q->y - _p->y); \
51 edges[num_active_edges].x = (_dx * ((float)_y + 0.5 - _p->y)) + _p->x; \
52 edges[num_active_edges].i = _i; \
53 num_active_edges++; \
54}
55
56static int
57polygon_point_sorter(const void *a, const void *b)
58{
59 RGBA_Vertex *p, *q;
60
61 p = (RGBA_Vertex *)a;
62 q = (RGBA_Vertex *)b;
63 if (p->y <= q->y) return -1;
64 return 1;
65}
66
67static int
68polygon_edge_sorter(const void *a, const void *b)
69{
70 RGBA_Edge *p, *q;
71
72 p = (RGBA_Edge *)a;
73 q = (RGBA_Edge *)b;
74 if (p->x <= q->x) return -1;
75 return 1;
76}
77
78void
79evas_common_soft16_polygon_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points, int x, int y)
80{
81 RGBA_Polygon_Point *pt;
82 RGBA_Vertex *point;
83 RGBA_Edge *edges;
84 int num_active_edges;
85 int n;
86 int i, j, k;
87 int y0, y1, yi;
88 int ext_x, ext_y, ext_w, ext_h;
89 int *sorted_index;
90 DATA8 alpha;
91 DATA16 rgb565;
92 DATA32 rgb565_unpack;
93
94 alpha = A_VAL(&dc->col.col) >> 3;
95 if (alpha == 0)
96 return;
97 alpha++;
98
99 rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col),
100 G_VAL(&dc->col.col),
101 B_VAL(&dc->col.col));
102 rgb565_unpack = RGB_565_UNPACK(rgb565);
103
104 ext_x = 0;
105 ext_y = 0;
106 ext_w = dst->cache_entry.w;
107 ext_h = dst->cache_entry.h;
108 if (dc->clip.use)
109 RECTS_CLIP_TO_RECT(ext_x, ext_y, ext_w, ext_h,
110 dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h);
111
112 if ((ext_w <= 0) || (ext_h <= 0))
113 return;
114
115 n = 0;
116 EINA_INLIST_FOREACH(points, pt) n++;
117
118 if (n < 3)
119 return;
120
121 edges = malloc(sizeof(RGBA_Edge) * n);
122 if (!edges)
123 return;
124
125 point = malloc(sizeof(RGBA_Vertex) * n);
126 if (!point)
127 {
128 free(edges);
129 return;
130 }
131
132 sorted_index = malloc(sizeof(int) * n);
133 if (!sorted_index)
134 {
135 free(edges);
136 free(point);
137 return;
138 }
139
140 k = 0;
141 EINA_INLIST_FOREACH(points, pt)
142 {
143 point[k].x = pt->x + x;
144 point[k].y = pt->y + y;
145 point[k].i = k;
146 k++;
147 }
148 qsort(point, n, sizeof(RGBA_Vertex), polygon_point_sorter);
149
150 for (k = 0; k < n; k++)
151 sorted_index[k] = point[k].i;
152
153 k = 0;
154 EINA_INLIST_FOREACH(points, pt)
155 {
156 point[k].x = pt->x + x;
157 point[k].y = pt->y + y;
158 point[k].i = k;
159 k++;
160 }
161
162 y0 = MAX(ext_y, ceil(point[sorted_index[0]].y - 0.5));
163 y1 = MIN(ext_y + ext_h - 1, floor(point[sorted_index[n - 1]].y - 0.5));
164
165 k = 0;
166 num_active_edges = 0;
167
168 for (yi = y0; yi <= y1; yi++)
169 {
170 for (; (k < n) && (point[sorted_index[k]].y <= ((float)yi + 0.5)); k++)
171 {
172 i = sorted_index[k];
173
174 if (i > 0) j = i - 1;
175 else j = n - 1;
176 if (point[j].y <= ((float)yi - 0.5))
177 {
178 POLY_EDGE_DEL(j)
179 }
180 else if (point[j].y > ((float)yi + 0.5))
181 {
182 POLY_EDGE_ADD(j, yi)
183 }
184 if (i < (n - 1)) j = i + 1;
185 else j = 0;
186 if (point[j].y <= ((float)yi - 0.5))
187 {
188 POLY_EDGE_DEL(i)
189 }
190 else if (point[j].y > ((float)yi + 0.5))
191 {
192 POLY_EDGE_ADD(i, yi)
193 }
194 }
195
196 qsort(edges, num_active_edges, sizeof(RGBA_Edge), polygon_edge_sorter);
197
198 for (j = 0; j < num_active_edges; j += 2)
199 {
200 int x0, x1;
201
202 x0 = ceil(edges[j].x - 0.5);
203 if (j < (num_active_edges - 1))
204 x1 = floor(edges[j + 1].x - 0.5);
205 else
206 x1 = x0;
207 if ((x1 >= ext_x) && (x0 < (ext_x + ext_w)) && (x0 <= x1))
208 {
209 DATA16 *dst_itr;
210 int w;
211
212 if (x0 < ext_x) x0 = ext_x;
213 if (x1 >= (ext_x + ext_w)) x1 = ext_x + ext_w - 1;
214
215 w = (x1 - x0) + 1;
216 dst_itr = dst->pixels + (yi * dst->stride) + x0;
217
218 if (alpha == 32)
219 _soft16_scanline_fill_solid_solid(dst_itr, w, rgb565);
220 else
221 _soft16_scanline_fill_transp_solid(dst_itr, w, rgb565_unpack, alpha);
222 }
223 edges[j].x += edges[j].dx;
224 edges[j + 1].x += edges[j + 1].dx;
225 }
226 }
227
228 free(edges);
229 free(point);
230 free(sorted_index);
231}
diff --git a/libraries/evas/src/lib/engines/common_16/evas_soft16_rectangle.c b/libraries/evas/src/lib/engines/common_16/evas_soft16_rectangle.c
new file mode 100644
index 0000000..bd38fce
--- /dev/null
+++ b/libraries/evas/src/lib/engines/common_16/evas_soft16_rectangle.c
@@ -0,0 +1,121 @@
1#include "evas_common_soft16.h"
2#include "evas_soft16_scanline_fill.c"
3
4static inline int
5_is_empty_rectangle(const Eina_Rectangle *r)
6{
7 return (r->w < 1) || (r->h < 1);
8}
9
10static inline void
11_soft16_rectangle_draw_solid_solid(Soft16_Image *dst, int offset, int w, int h,
12 DATA16 rgb565)
13{
14 DATA16 *dst_itr;
15 int i;
16
17 dst_itr = dst->pixels + offset;
18
19 for (i = 0; i < h; i++, dst_itr += dst->stride)
20 _soft16_scanline_fill_solid_solid(dst_itr, w, rgb565);
21}
22
23static inline void
24_soft16_rectangle_draw_transp_solid(Soft16_Image *dst, int offset, int w, int h,
25 DATA16 rgb565, DATA8 alpha)
26{
27 DATA16 *dst_itr;
28 DATA32 rgb565_unpack;
29 int i;
30
31 dst_itr = dst->pixels + offset;
32 rgb565_unpack = RGB_565_UNPACK(rgb565);
33 alpha++;
34
35 for (i = 0; i < h; i++, dst_itr += dst->stride)
36 _soft16_scanline_fill_transp_solid(dst_itr, w, rgb565_unpack, alpha);
37}
38
39static void
40_soft16_rectangle_draw_int(Soft16_Image *dst, RGBA_Draw_Context *dc,
41 Eina_Rectangle dr)
42{
43 int dst_offset;
44
45 if (_is_empty_rectangle(&dr)) return;
46 RECTS_CLIP_TO_RECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->cache_entry.w, dst->cache_entry.h);
47 if (_is_empty_rectangle(&dr)) return;
48
49 if (dc->clip.use)
50 RECTS_CLIP_TO_RECT(dr.x, dr.y, dr.w, dr.h, dc->clip.x,
51 dc->clip.y, dc->clip.w, dc->clip.h);
52 if (_is_empty_rectangle(&dr)) return;
53 if (A_VAL(&dc->col.col) == 0) return;
54
55 dst_offset = dr.x + (dr.y * dst->cache_entry.w);
56
57 if (!dst->cache_entry.flags.alpha)
58 {
59 DATA16 rgb565;
60 DATA8 alpha;
61
62 alpha = A_VAL(&dc->col.col) >> 3;
63 rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col),
64 G_VAL(&dc->col.col),
65 B_VAL(&dc->col.col));
66 if (alpha == 31)
67 _soft16_rectangle_draw_solid_solid
68 (dst, dst_offset, dr.w, dr.h, rgb565);
69 else if (alpha > 0)
70 _soft16_rectangle_draw_transp_solid
71 (dst, dst_offset, dr.w, dr.h, rgb565, alpha);
72 }
73 else
74 ERR("Unsupported feature: drawing rectangle to non-opaque destination.");
75}
76
77void
78evas_common_soft16_rectangle_draw(Soft16_Image *dst, RGBA_Draw_Context *dc,
79 int x, int y, int w, int h)
80{
81 Eina_Rectangle dr;
82 Cutout_Rects *rects;
83 Cutout_Rect *r;
84 struct RGBA_Draw_Context_clip c_bkp;
85 int i;
86
87 /* handle cutouts here! */
88 EINA_RECTANGLE_SET(&dr, x, y, w, h);
89
90 if (_is_empty_rectangle(&dr)) return;
91 if (!(RECTS_INTERSECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->cache_entry.w, dst->cache_entry.h)))
92 return;
93
94 /* no cutouts - cut right to the chase */
95 if (!dc->cutout.rects)
96 {
97 _soft16_rectangle_draw_int(dst, dc, dr);
98 return;
99 }
100
101 c_bkp = dc->clip;
102
103 evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h);
104 evas_common_draw_context_clip_clip(dc, x, y, w, h);
105 /* our clip is 0 size.. abort */
106 if ((dc->clip.w <= 0) || (dc->clip.h <= 0))
107 {
108 dc->clip = c_bkp;
109 return;
110 }
111 rects = evas_common_draw_context_apply_cutouts(dc);
112 for (i = 0; i < rects->active; ++i)
113 {
114 r = rects->rects + i;
115 evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h);
116 _soft16_rectangle_draw_int(dst, dc, dr);
117 }
118 evas_common_draw_context_apply_clear_cutouts(rects);
119 dc->clip = c_bkp;
120}
121
diff --git a/libraries/evas/src/lib/engines/common_16/evas_soft16_scanline_blend.c b/libraries/evas/src/lib/engines/common_16/evas_soft16_scanline_blend.c
new file mode 100644
index 0000000..c89eeaa
--- /dev/null
+++ b/libraries/evas/src/lib/engines/common_16/evas_soft16_scanline_blend.c
@@ -0,0 +1,353 @@
1/** NOTE: This file is meant to be included by users **/
2
3/** NOTE2: r, g, b parameters are 16bits, so you can pass 0 to 256 inclusive.
4 ** this is due our division by 256 when multiplying the color.
5 **/
6
7/*****************************************************************************
8 * Scanline processing
9 *
10 * _soft16_scanline_<description>_<src>_<dst>[_<modifier>]()
11 *
12 ****************************************************************************/
13
14#include "evas_soft16_point_blend.c"
15
16/***********************************************************************
17 * Regular blend operations
18 */
19static void
20_soft16_scanline_blend_transp_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size)
21{
22 DATA16 *start, *end;
23
24 start = dst;
25 end = start + (size & ~7);
26
27 pld(alpha, 0);
28 pld(src, 0);
29
30 /* work on 8 pixels per time, do data preload */
31 while (start < end)
32 {
33 DATA8 alpha1, alpha2;
34
35 alpha1 = alpha[0];
36 alpha += 8;
37
38 /* empirical tests show these give the best performance */
39 pld(alpha, 8);
40 pld(src, 32);
41
42 src += 8;
43 start += 8;
44
45 alpha2 = alpha[-7];
46 _soft16_pt_blend_transp_solid(start - 8, src[-8], alpha1);
47
48 alpha1 = alpha[-6];
49 _soft16_pt_blend_transp_solid(start - 7, src[-7], alpha2);
50
51 alpha2 = alpha[-5];
52 _soft16_pt_blend_transp_solid(start - 6, src[-6], alpha1);
53
54 alpha1 = alpha[-4];
55 _soft16_pt_blend_transp_solid(start - 5, src[-5], alpha2);
56
57 alpha2 = alpha[-3];
58 _soft16_pt_blend_transp_solid(start - 4, src[-4], alpha1);
59
60 alpha1 = alpha[-2];
61 _soft16_pt_blend_transp_solid(start - 3, src[-3], alpha2);
62
63 alpha2 = alpha[-1];
64 _soft16_pt_blend_transp_solid(start - 2, src[-2], alpha1);
65
66 _soft16_pt_blend_transp_solid(start - 1, src[-1], alpha2);
67 }
68
69 /* remaining pixels (up to 7) */
70 end = start + (size & 7);
71 for (; start < end; start++, src++, alpha++)
72 _soft16_pt_blend_transp_solid(start, *src, *alpha);
73}
74
75static inline void
76_soft16_scanline_blend_solid_solid(DATA16 *src, DATA16 *dst, int size)
77{
78 memcpy(dst, src, size * sizeof(DATA16));
79}
80
81/***********************************************************************
82 * Blend operations taking an extra alpha (fade in, out)
83 */
84
85static void
86_soft16_scanline_blend_transp_solid_mul_alpha(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, const DATA8 rel_alpha)
87{
88 DATA16 *start, *end;
89
90 start = dst;
91 end = start + (size & ~7);
92
93 pld(alpha, 0);
94 pld(src, 0);
95
96 while (start < end)
97 {
98 DATA8 alpha1, alpha2;
99
100 alpha1 = alpha[0];
101 alpha += 8;
102
103 pld(alpha, 8);
104 pld(src, 32);
105
106 src += 8;
107 start += 8;
108
109 alpha2 = alpha[-7];
110 _soft16_pt_blend_transp_solid_mul_alpha
111 (start - 8, src[-8], alpha1, rel_alpha);
112
113 alpha1 = alpha[-6];
114 _soft16_pt_blend_transp_solid_mul_alpha
115 (start - 7, src[-7], alpha2, rel_alpha);
116
117 alpha2 = alpha[-5];
118 _soft16_pt_blend_transp_solid_mul_alpha
119 (start - 6, src[-6], alpha1, rel_alpha);
120
121 alpha1 = alpha[-4];
122 _soft16_pt_blend_transp_solid_mul_alpha
123 (start - 5, src[-5], alpha2, rel_alpha);
124
125 alpha2 = alpha[-3];
126 _soft16_pt_blend_transp_solid_mul_alpha
127 (start - 4, src[-4], alpha1, rel_alpha);
128
129 alpha1 = alpha[-2];
130 _soft16_pt_blend_transp_solid_mul_alpha
131 (start - 3, src[-3], alpha2, rel_alpha);
132
133 alpha2 = alpha[-1];
134 _soft16_pt_blend_transp_solid_mul_alpha
135 (start - 2, src[-2], alpha1, rel_alpha);
136
137 _soft16_pt_blend_transp_solid_mul_alpha
138 (start - 1, src[-1], alpha2, rel_alpha);
139 }
140
141 end = start + (size & 7);
142 for (; start < end; start++, src++, alpha++)
143 _soft16_pt_blend_transp_solid_mul_alpha(start, *src, *alpha, rel_alpha);
144}
145
146static void
147_soft16_scanline_blend_solid_solid_mul_alpha(DATA16 *src, DATA16 *dst, int size, DATA8 rel_alpha)
148{
149 DATA16 *start, *end;
150
151 start = dst;
152 end = start + (size & ~7);
153
154 pld(src, 0);
155
156 while (start < end)
157 {
158 pld(src, 32);
159 UNROLL8({
160 _soft16_pt_blend_solid_solid_mul_alpha(start, *src, rel_alpha);
161 start++;
162 src++;
163 });
164 }
165
166 end = start + (size & 7);
167 for (; start < end; start++, src++)
168 _soft16_pt_blend_solid_solid_mul_alpha(start, *src, rel_alpha);
169}
170
171/***********************************************************************
172 * Blend operations with extra alpha and multiply color
173 */
174
175static void
176_soft16_scanline_blend_transp_solid_mul_color_transp(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, DATA8 rel_alpha, DATA16 r, DATA16 g, DATA16 b)
177{
178 DATA16 *start, *end;
179
180 start = dst;
181 end = start + (size & ~7);
182
183 pld(alpha, 0);
184 pld(src, 0);
185
186 while (start < end)
187 {
188 DATA8 alpha1, alpha2;
189
190 alpha1 = alpha[0];
191 alpha += 8;
192
193 pld(src, 32);
194 pld(start, 32);
195
196 src += 8;
197 start += 8;
198
199 alpha2 = alpha[-7];
200 _soft16_pt_blend_transp_solid_mul_color_transp
201 (start - 8, src[-8], alpha1, rel_alpha, r, g, b);
202
203 alpha1 = alpha[-6];
204 _soft16_pt_blend_transp_solid_mul_color_transp
205 (start - 7, src[-7], alpha2, rel_alpha, r, g, b);
206
207 alpha2 = alpha[-5];
208 _soft16_pt_blend_transp_solid_mul_color_transp
209 (start - 6, src[-6], alpha1, rel_alpha, r, g, b);
210
211 alpha1 = alpha[-4];
212 _soft16_pt_blend_transp_solid_mul_color_transp
213 (start - 5, src[-5], alpha2, rel_alpha, r, g, b);
214
215 alpha2 = alpha[-3];
216 _soft16_pt_blend_transp_solid_mul_color_transp
217 (start - 4, src[-4], alpha1, rel_alpha, r, g, b);
218
219 alpha1 = alpha[-2];
220 _soft16_pt_blend_transp_solid_mul_color_transp
221 (start - 3, src[-3], alpha2, rel_alpha, r, g, b);
222
223 alpha2 = alpha[-1];
224 _soft16_pt_blend_transp_solid_mul_color_transp
225 (start - 2, src[-2], alpha1, rel_alpha, r, g, b);
226
227 _soft16_pt_blend_transp_solid_mul_color_transp
228 (start - 1, src[-1], alpha2, rel_alpha, r, g, b);
229 }
230
231 end = start + (size & 7);
232 for (; start < end; start++, src++, alpha++)
233 _soft16_pt_blend_transp_solid_mul_color_transp
234 (start, *src, *alpha, rel_alpha, r, g, b);
235}
236
237static void
238_soft16_scanline_blend_solid_solid_mul_color_transp(DATA16 *src, DATA16 *dst, int size, DATA8 rel_alpha, DATA16 r, DATA16 g, DATA16 b)
239{
240 DATA16 *start, *end;
241
242 start = dst;
243 end = start + (size & ~7);
244
245 pld(src, 0);
246
247 while (start < end)
248 {
249 pld(src, 32);
250 UNROLL8({
251 _soft16_pt_blend_solid_solid_mul_color_transp
252 (start, *src, rel_alpha, r, g, b);
253 start++;
254 src++;
255 });
256 }
257
258 end = start + (size & 7);
259 for (; start < end; start++, src++)
260 _soft16_pt_blend_solid_solid_mul_color_transp
261 (start, *src, rel_alpha, r, g, b);
262}
263
264/***********************************************************************
265 * Blend operations with extra multiply color
266 */
267
268static void
269_soft16_scanline_blend_transp_solid_mul_color_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, DATA16 r, DATA16 g, DATA16 b)
270{
271 DATA16 *start, *end;
272
273 start = dst;
274 end = start + (size & ~7);
275
276 pld(alpha, 0);
277 pld(src, 0);
278
279 while (start < end)
280 {
281 DATA8 alpha1, alpha2;
282
283 alpha1 = alpha[0];
284 alpha += 8;
285
286 pld(alpha, 8);
287 pld(src, 32);
288
289 src += 8;
290 start += 8;
291
292 alpha2 = alpha[-7];
293 _soft16_pt_blend_transp_solid_mul_color_solid
294 (start - 8, src[-8], alpha1, r, g, b);
295
296 alpha1 = alpha[-6];
297 _soft16_pt_blend_transp_solid_mul_color_solid
298 (start - 7, src[-7], alpha2, r, g, b);
299
300 alpha2 = alpha[-5];
301 _soft16_pt_blend_transp_solid_mul_color_solid
302 (start - 6, src[-6], alpha1, r, g, b);
303
304 alpha1 = alpha[-4];
305 _soft16_pt_blend_transp_solid_mul_color_solid
306 (start - 5, src[-5], alpha2, r, g, b);
307
308 alpha2 = alpha[-3];
309 _soft16_pt_blend_transp_solid_mul_color_solid
310 (start - 4, src[-4], alpha1, r, g, b);
311
312 alpha1 = alpha[-2];
313 _soft16_pt_blend_transp_solid_mul_color_solid
314 (start - 3, src[-3], alpha2, r, g, b);
315
316 alpha2 = alpha[-1];
317 _soft16_pt_blend_transp_solid_mul_color_solid
318 (start - 2, src[-2], alpha1, r, g, b);
319
320 _soft16_pt_blend_transp_solid_mul_color_solid
321 (start - 1, src[-1], alpha2, r, g, b);
322 }
323
324 end = start + (size & 7);
325 for (; start < end; start++, src++, alpha++)
326 _soft16_pt_blend_transp_solid_mul_color_solid
327 (start, *src, *alpha, r, g, b);
328}
329
330static void
331_soft16_scanline_blend_solid_solid_mul_color_solid(DATA16 *src, DATA16 *dst, int size, DATA8 r, DATA8 g, DATA8 b)
332{
333 DATA16 *start, *end;
334
335 start = dst;
336 end = start + (size & ~7);
337
338 pld(src, 0);
339
340 while (start < end)
341 {
342 pld(src, 32);
343 UNROLL8({
344 _soft16_pt_blend_solid_solid_mul_color_solid(start, *src, r, g, b);
345 start++;
346 src++;
347 });
348 }
349
350 end = start + (size & 7);
351 for (; start < end; start++, src++)
352 _soft16_pt_blend_solid_solid_mul_color_solid(start, *src, r, g, b);
353}
diff --git a/libraries/evas/src/lib/engines/common_16/evas_soft16_scanline_fill.c b/libraries/evas/src/lib/engines/common_16/evas_soft16_scanline_fill.c
new file mode 100644
index 0000000..d31bef8
--- /dev/null
+++ b/libraries/evas/src/lib/engines/common_16/evas_soft16_scanline_fill.c
@@ -0,0 +1,86 @@
1/** NOTE: This file is meant to be included by users **/
2
3/*****************************************************************************
4 * Point processing
5 *
6 * _soft16_pt_<description>_<src>_<dst>[_<modifier>]()
7 *
8 * Scanline processing
9 *
10 * _soft16_scanline_<description>_<src>_<dst>[_<modifier>]()
11 *
12 ****************************************************************************/
13EFL_ALWAYS_INLINE void
14_soft16_pt_fill_solid_solid(DATA16 *dst, DATA16 rgb565)
15{
16 *dst = rgb565;
17}
18
19static void
20_soft16_scanline_fill_solid_solid(DATA16 *dst, int size, DATA16 rgb565)
21{
22 DATA16 *start, *end;
23 DATA32 rgb565_double;
24
25 start = dst;
26
27 if ((long)start & 0x2)
28 {
29 *start = rgb565;
30 start++;
31 size--;
32 }
33
34 end = start + (size & ~7);
35
36 rgb565_double = (rgb565 << 16) | rgb565;
37
38 while (start < end)
39 {
40 DATA32 *p = (DATA32 *)start;
41
42 p[0] = rgb565_double;
43 p[1] = rgb565_double;
44 p[2] = rgb565_double;
45 p[3] = rgb565_double;
46
47 start += 8;
48 }
49
50 end = start + (size & 7);
51 for (; start < end; start++)
52 *start = rgb565;
53}
54
55EFL_ALWAYS_INLINE void
56_soft16_pt_fill_transp_solid(DATA16 *dst, DATA32 rgb565_unpack, DATA8 alpha)
57{
58 DATA32 d;
59
60 d = RGB_565_UNPACK(*dst);
61 d = RGB_565_UNPACKED_BLEND(rgb565_unpack, d, alpha);
62 *dst = RGB_565_PACK(d);
63}
64
65static void
66_soft16_scanline_fill_transp_solid(DATA16 *dst, int size, DATA32 rgb565_unpack, DATA8 alpha)
67{
68 DATA16 *start, *end;
69
70 start = dst;
71 pld(start, 0);
72 end = start + (size & ~7);
73
74 while (start < end)
75 {
76 pld(start, 32);
77 UNROLL8({
78 _soft16_pt_fill_transp_solid(start, rgb565_unpack, alpha);
79 start++;
80 });
81 }
82
83 end = start + (size & 7);
84 for (; start < end; start++)
85 _soft16_pt_fill_transp_solid(start, rgb565_unpack, alpha);
86}