From e2776ae20cdf4f9ff15dd7f16503613532b6f8dd Mon Sep 17 00:00:00 2001 From: raster Date: Sun, 17 Aug 2008 07:44:18 +0000 Subject: [PATCH] move around - flatter. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@35497 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- .cvsignore | 28 + AUTHORS | 15 + COPYING | 28 + COPYING-PLAIN | 33 + ChangeLog | 0 Doxyfile | 139 + INSTALL | 17 + Makefile.am | 156 + NEWS | 0 README.in | 277 + autogen.sh | 16 + configure.in | 1850 + debian/.cvsignore | 1 + debian/changelog.in | 5 + debian/compat | 1 + debian/control | 319 + debian/copyright | 43 + debian/libevas-dev.install | 4 + debian/libevas-doc.dirs | 1 + debian/libevas-doc.doc-base | 10 + debian/libevas-engine-buffer.install | 1 + debian/libevas-engine-fb.install | 1 + debian/libevas-engine-gl-x11.install | 1 + debian/libevas-engine-software-generic.install | 1 + debian/libevas-engine-software-x11.install | 1 + debian/libevas-engine-xrender.install | 1 + debian/libevas-engines-extra.install | 0 debian/libevas-engines.install | 0 debian/libevas-loader-eet.install | 1 + debian/libevas-loader-gif.install | 1 + debian/libevas-loader-jpeg.install | 1 + debian/libevas-loader-png.install | 1 + debian/libevas-loader-svg.install | 1 + debian/libevas-loader-tiff.install | 1 + debian/libevas-loader-xpm.install | 1 + debian/libevas-loaders.install | 0 debian/libevas-saver-eet.install | 1 + debian/libevas-saver-jpeg.install | 1 + debian/libevas-saver-png.install | 1 + debian/libevas-saver-tiff.install | 1 + debian/libevas-savers.install | 0 debian/libevas0.install | 1 + debian/rules | 70 + doc/.cvsignore | 3 + doc/e.css | 161 + doc/evas.css | 178 + doc/foot.html | 6 + doc/head.html | 46 + doc/img/_.gif | Bin 0 -> 266 bytes doc/img/b.png | Bin 0 -> 40323 bytes doc/img/evas.eps | 149 + doc/img/evas.fig | 25 + doc/img/evas.png | Bin 0 -> 74944 bytes doc/img/evas.xcf | Bin 0 -> 2126397 bytes doc/img/evas_big.eps | 45178 +++++++++++++++++++ doc/img/evas_big.png | Bin 0 -> 937116 bytes doc/img/evas_mini.png | Bin 0 -> 753 bytes doc/img/evas_small.png | Bin 0 -> 3755 bytes doc/img/hilite.png | Bin 0 -> 6127 bytes doc/img/n.gif | Bin 0 -> 1700 bytes doc/img/n.png | Bin 0 -> 2057 bytes doc/img/t.gif | Bin 0 -> 979 bytes doc/img/t.png | Bin 0 -> 316 bytes doc/img/tl.gif | Bin 0 -> 74209 bytes doc/img/tl.png | Bin 0 -> 88378 bytes evas-cairo-x11.pc.in | 3 + evas-direct3d.pc.in | 3 + evas-directfb.pc.in | 3 + evas-fb.pc.in | 3 + evas-glitz-x11.pc.in | 3 + evas-opengl-glew.pc.in | 3 + evas-opengl-x11.pc.in | 3 + evas-software-16-ddraw.pc.in | 3 + evas-software-16-wince.pc.in | 3 + evas-software-16-x11.pc.in | 3 + evas-software-buffer.pc.in | 3 + evas-software-ddraw.pc.in | 3 + evas-software-qtopia.pc.in | 3 + evas-software-sdl.pc.in | 3 + evas-software-x11.pc.in | 3 + evas-software-xcb.pc.in | 3 + evas-xrender-x11.pc.in | 3 + evas-xrender-xcb.pc.in | 3 + evas.c.in | 222 + evas.pc.in | 11 + evas.spec.in | 552 + gendoc | 9 + m4/evas_converter.m4 | 83 + src/.cvsignore | 2 + src/Makefile.am | 3 + src/lib/.cvsignore | 6 + src/lib/Evas.h | 881 + src/lib/Evas_Data.h | 175 + src/lib/Makefile.am | 53 + src/lib/cache/.cvsignore | 6 + src/lib/cache/Makefile.am | 19 + src/lib/cache/evas_cache.h | 163 + src/lib/cache/evas_cache_engine_image.c | 692 + src/lib/cache/evas_cache_image.c | 853 + src/lib/canvas/.cvsignore | 6 + src/lib/canvas/Makefile.am | 43 + src/lib/canvas/evas_async_events.c | 169 + src/lib/canvas/evas_callbacks.c | 468 + src/lib/canvas/evas_clip.c | 300 + src/lib/canvas/evas_data.c | 161 + src/lib/canvas/evas_events.c | 1221 + src/lib/canvas/evas_focus.c | 98 + src/lib/canvas/evas_font_dir.c | 787 + src/lib/canvas/evas_key.c | 418 + src/lib/canvas/evas_key_grab.c | 238 + src/lib/canvas/evas_layer.c | 201 + src/lib/canvas/evas_main.c | 1023 + src/lib/canvas/evas_name.c | 67 + src/lib/canvas/evas_object_gradient.c | 1091 + src/lib/canvas/evas_object_image.c | 2463 + src/lib/canvas/evas_object_inform.c | 40 + src/lib/canvas/evas_object_intercept.c | 769 + src/lib/canvas/evas_object_line.c | 468 + src/lib/canvas/evas_object_main.c | 1424 + src/lib/canvas/evas_object_polygon.c | 460 + src/lib/canvas/evas_object_rectangle.c | 376 + src/lib/canvas/evas_object_smart.c | 628 + src/lib/canvas/evas_object_text.c | 1740 + src/lib/canvas/evas_object_textblock.c | 4939 ++ src/lib/canvas/evas_rectangle.c | 101 + src/lib/canvas/evas_render.c | 732 + src/lib/canvas/evas_smart.c | 190 + src/lib/canvas/evas_stack.c | 450 + src/lib/data/.cvsignore | 6 + src/lib/data/Makefile.am | 25 + src/lib/data/evas_array.c | 110 + src/lib/data/evas_array_hash.c | 122 + src/lib/data/evas_hash.c | 497 + src/lib/data/evas_inline_array.x | 41 + src/lib/data/evas_list.c | 1031 + src/lib/data/evas_mempool.c | 188 + src/lib/data/evas_mempool.h | 25 + src/lib/data/evas_object_list.c | 164 + src/lib/data/evas_stringshare.c | 205 + src/lib/engines/.cvsignore | 2 + src/lib/engines/Makefile.am | 5 + src/lib/engines/common/.cvsignore | 6 + src/lib/engines/common/Makefile.am | 100 + src/lib/engines/common/evas_blend.h | 12 + src/lib/engines/common/evas_blend_main.c | 329 + src/lib/engines/common/evas_blend_private.h | 35 + src/lib/engines/common/evas_blit_main.c | 491 + src/lib/engines/common/evas_convert_color.c | 244 + src/lib/engines/common/evas_convert_color.h | 20 + src/lib/engines/common/evas_convert_colorspace.c | 74 + src/lib/engines/common/evas_convert_colorspace.h | 13 + src/lib/engines/common/evas_convert_gry_1.c | 10 + src/lib/engines/common/evas_convert_gry_1.h | 13 + src/lib/engines/common/evas_convert_gry_4.c | 14 + src/lib/engines/common/evas_convert_gry_4.h | 13 + src/lib/engines/common/evas_convert_gry_8.c | 26 + src/lib/engines/common/evas_convert_gry_8.h | 16 + src/lib/engines/common/evas_convert_main.c | 604 + src/lib/engines/common/evas_convert_main.h | 13 + src/lib/engines/common/evas_convert_rgb_16.c | 1959 + src/lib/engines/common/evas_convert_rgb_16.h | 54 + src/lib/engines/common/evas_convert_rgb_24.c | 67 + src/lib/engines/common/evas_convert_rgb_24.h | 13 + src/lib/engines/common/evas_convert_rgb_32.c | 399 + src/lib/engines/common/evas_convert_rgb_32.h | 27 + src/lib/engines/common/evas_convert_rgb_8.c | 252 + src/lib/engines/common/evas_convert_rgb_8.h | 18 + src/lib/engines/common/evas_convert_yuv.c | 978 + src/lib/engines/common/evas_convert_yuv.h | 12 + src/lib/engines/common/evas_cpu.c | 238 + src/lib/engines/common/evas_draw.h | 38 + src/lib/engines/common/evas_draw_main.c | 559 + src/lib/engines/common/evas_font.h | 69 + src/lib/engines/common/evas_font_draw.c | 359 + src/lib/engines/common/evas_font_load.c | 598 + src/lib/engines/common/evas_font_main.c | 273 + src/lib/engines/common/evas_font_query.c | 344 + src/lib/engines/common/evas_gradient.h | 31 + src/lib/engines/common/evas_gradient_angular.c | 1899 + src/lib/engines/common/evas_gradient_linear.c | 1510 + src/lib/engines/common/evas_gradient_main.c | 924 + src/lib/engines/common/evas_gradient_private.h | 17 + src/lib/engines/common/evas_gradient_radial.c | 1147 + src/lib/engines/common/evas_gradient_rectangular.c | 1463 + src/lib/engines/common/evas_gradient_sinusoidal.c | 838 + src/lib/engines/common/evas_image.h | 32 + src/lib/engines/common/evas_image_data.c | 128 + src/lib/engines/common/evas_image_load.c | 117 + src/lib/engines/common/evas_image_main.c | 592 + src/lib/engines/common/evas_image_private.h | 13 + src/lib/engines/common/evas_image_save.c | 57 + src/lib/engines/common/evas_line.h | 11 + src/lib/engines/common/evas_line_main.c | 663 + src/lib/engines/common/evas_op_add/.cvsignore | 2 + src/lib/engines/common/evas_op_add/Makefile.am | 11 + src/lib/engines/common/evas_op_add/op_add_color_.c | 34 + .../engines/common/evas_op_add/op_add_color_i386.c | 34 + .../common/evas_op_add/op_add_mask_color_.c | 34 + .../common/evas_op_add/op_add_mask_color_i386.c | 34 + src/lib/engines/common/evas_op_add/op_add_pixel_.c | 34 + .../common/evas_op_add/op_add_pixel_color_.c | 34 + .../common/evas_op_add/op_add_pixel_color_i386.c | 30 + .../engines/common/evas_op_add/op_add_pixel_i386.c | 34 + .../common/evas_op_add/op_add_pixel_mask_.c | 34 + .../common/evas_op_add/op_add_pixel_mask_i386.c | 34 + src/lib/engines/common/evas_op_add_main_.c | 546 + src/lib/engines/common/evas_op_blend/.cvsignore | 2 + src/lib/engines/common/evas_op_blend/Makefile.am | 11 + .../engines/common/evas_op_blend/op_blend_color_.c | 110 + .../common/evas_op_blend/op_blend_color_i386.c | 139 + .../common/evas_op_blend/op_blend_mask_color_.c | 181 + .../evas_op_blend/op_blend_mask_color_i386.c | 252 + .../engines/common/evas_op_blend/op_blend_pixel_.c | 157 + .../common/evas_op_blend/op_blend_pixel_color_.c | 274 + .../evas_op_blend/op_blend_pixel_color_i386.c | 222 + .../common/evas_op_blend/op_blend_pixel_i386.c | 216 + .../common/evas_op_blend/op_blend_pixel_mask_.c | 185 + .../evas_op_blend/op_blend_pixel_mask_i386.c | 158 + src/lib/engines/common/evas_op_blend_main_.c | 563 + src/lib/engines/common/evas_op_copy/.cvsignore | 2 + src/lib/engines/common/evas_op_copy/Makefile.am | 11 + .../engines/common/evas_op_copy/op_copy_color_.c | 135 + .../common/evas_op_copy/op_copy_color_i386.c | 151 + .../common/evas_op_copy/op_copy_mask_color_.c | 167 + .../common/evas_op_copy/op_copy_mask_color_i386.c | 194 + .../engines/common/evas_op_copy/op_copy_pixel_.c | 119 + .../common/evas_op_copy/op_copy_pixel_color_.c | 234 + .../common/evas_op_copy/op_copy_pixel_color_i386.c | 256 + .../common/evas_op_copy/op_copy_pixel_i386.c | 132 + .../common/evas_op_copy/op_copy_pixel_mask_.c | 147 + .../common/evas_op_copy/op_copy_pixel_mask_i386.c | 177 + src/lib/engines/common/evas_op_copy_main_.c | 610 + src/lib/engines/common/evas_op_mask/.cvsignore | 2 + src/lib/engines/common/evas_op_mask/Makefile.am | 11 + .../engines/common/evas_op_mask/op_mask_color_.c | 51 + .../common/evas_op_mask/op_mask_color_i386.c | 59 + .../common/evas_op_mask/op_mask_mask_color_.c | 64 + .../common/evas_op_mask/op_mask_mask_color_i386.c | 14 + .../engines/common/evas_op_mask/op_mask_pixel_.c | 49 + .../common/evas_op_mask/op_mask_pixel_color_.c | 101 + .../common/evas_op_mask/op_mask_pixel_color_i386.c | 14 + .../common/evas_op_mask/op_mask_pixel_i386.c | 59 + .../common/evas_op_mask/op_mask_pixel_mask_.c | 63 + .../common/evas_op_mask/op_mask_pixel_mask_i386.c | 14 + src/lib/engines/common/evas_op_mask_main_.c | 309 + src/lib/engines/common/evas_op_mul/.cvsignore | 2 + src/lib/engines/common/evas_op_mul/Makefile.am | 11 + src/lib/engines/common/evas_op_mul/op_mul_color_.c | 66 + .../engines/common/evas_op_mul/op_mul_color_i386.c | 67 + .../common/evas_op_mul/op_mul_mask_color_.c | 73 + .../common/evas_op_mul/op_mul_mask_color_i386.c | 93 + src/lib/engines/common/evas_op_mul/op_mul_pixel_.c | 57 + .../common/evas_op_mul/op_mul_pixel_color_.c | 123 + .../common/evas_op_mul/op_mul_pixel_color_i386.c | 121 + .../engines/common/evas_op_mul/op_mul_pixel_i386.c | 67 + .../common/evas_op_mul/op_mul_pixel_mask_.c | 118 + .../common/evas_op_mul/op_mul_pixel_mask_i386.c | 64 + src/lib/engines/common/evas_op_mul_main_.c | 308 + src/lib/engines/common/evas_op_sub/.cvsignore | 2 + src/lib/engines/common/evas_op_sub/Makefile.am | 12 + src/lib/engines/common/evas_op_sub/op_sub_color_.c | 34 + .../engines/common/evas_op_sub/op_sub_color_i386.c | 34 + .../common/evas_op_sub/op_sub_mask_color_.c | 34 + .../common/evas_op_sub/op_sub_mask_color_i386.c | 34 + src/lib/engines/common/evas_op_sub/op_sub_pixel_.c | 34 + .../common/evas_op_sub/op_sub_pixel_color_.c | 34 + .../common/evas_op_sub/op_sub_pixel_color_i386.c | 30 + .../engines/common/evas_op_sub/op_sub_pixel_i386.c | 34 + .../common/evas_op_sub/op_sub_pixel_mask_.c | 34 + .../common/evas_op_sub/op_sub_pixel_mask_i386.c | 34 + src/lib/engines/common/evas_op_sub_main_.c | 542 + src/lib/engines/common/evas_pipe.c | 592 + src/lib/engines/common/evas_pipe.h | 20 + src/lib/engines/common/evas_polygon.h | 13 + src/lib/engines/common/evas_polygon_main.c | 301 + src/lib/engines/common/evas_rectangle.h | 11 + src/lib/engines/common/evas_rectangle_main.c | 77 + src/lib/engines/common/evas_regionbuf.c | 357 + src/lib/engines/common/evas_scale_main.c | 10 + src/lib/engines/common/evas_scale_main.h | 16 + src/lib/engines/common/evas_scale_sample.c | 338 + src/lib/engines/common/evas_scale_smooth.c | 525 + src/lib/engines/common/evas_scale_smooth.h | 23 + src/lib/engines/common/evas_scale_smooth_scaler.c | 205 + .../engines/common/evas_scale_smooth_scaler_down.c | 50 + .../common/evas_scale_smooth_scaler_downx.c | 250 + .../common/evas_scale_smooth_scaler_downx_downy.c | 378 + .../common/evas_scale_smooth_scaler_downy.c | 251 + .../common/evas_scale_smooth_scaler_noscale.c | 27 + .../engines/common/evas_scale_smooth_scaler_up.c | 263 + src/lib/engines/common/evas_scale_span.c | 657 + src/lib/engines/common/evas_scale_span.h | 18 + src/lib/engines/common/evas_tiler.c | 1328 + src/lib/engines/common_16/.cvsignore | 6 + src/lib/engines/common_16/Makefile.am | 29 + .../engines/common_16/evas_soft16_dither_mask.c | 294 + src/lib/engines/common_16/evas_soft16_font.c | 302 + .../common_16/evas_soft16_image_scaled_sampled.c | 474 + .../engines/common_16/evas_soft16_image_unscaled.c | 290 + src/lib/engines/common_16/evas_soft16_line.c | 444 + src/lib/engines/common_16/evas_soft16_main.c | 599 + src/lib/engines/common_16/evas_soft16_polygon.c | 231 + src/lib/engines/common_16/evas_soft16_rectangle.c | 126 + .../engines/common_16/evas_soft16_scanline_blend.c | 471 + .../engines/common_16/evas_soft16_scanline_fill.c | 86 + src/lib/file/.cvsignore | 7 + src/lib/file/Makefile.am | 23 + src/lib/file/evas_module.c | 443 + src/lib/file/evas_module.h | 83 + src/lib/file/evas_path.c | 379 + src/lib/file/evas_path.h | 15 + src/lib/imaging/.cvsignore | 6 + src/lib/imaging/Makefile.am | 17 + src/lib/imaging/evas_imaging.c | 220 + src/lib/include/.cvsignore | 2 + src/lib/include/Makefile.am | 12 + src/lib/include/evas_blend_ops.h | 177 + src/lib/include/evas_cairo_common.h | 169 + src/lib/include/evas_common.h | 868 + src/lib/include/evas_common_soft16.h | 147 + src/lib/include/evas_inline.x | 207 + src/lib/include/evas_macros.h | 218 + src/lib/include/evas_mmx.h | 735 + src/lib/include/evas_options.h | 70 + src/lib/include/evas_private.h | 751 + src/lib/main.c | 209 + src/modules/.cvsignore | 2 + src/modules/Makefile.am | 3 + src/modules/engines/.cvsignore | 2 + src/modules/engines/Makefile.am | 27 + src/modules/engines/buffer/.cvsignore | 6 + src/modules/engines/buffer/Evas_Engine_Buffer.h | 37 + src/modules/engines/buffer/Makefile.am | 32 + src/modules/engines/buffer/evas_engine.c | 360 + src/modules/engines/buffer/evas_engine.h | 57 + src/modules/engines/buffer/evas_outbuf.c | 361 + src/modules/engines/cairo_common/.cvsignore | 6 + src/modules/engines/cairo_common/Makefile.am | 22 + .../engines/cairo_common/evas_cairo_common.h | 59 + src/modules/engines/cairo_common/evas_cairo_main.c | 0 .../engines/cairo_common/evas_cairo_private.h | 0 src/modules/engines/cairo_x11/.cvsignore | 6 + .../engines/cairo_x11/Evas_Engine_Cairo_X11.h | 27 + src/modules/engines/cairo_x11/Makefile.am | 30 + src/modules/engines/cairo_x11/evas_engine.c | 1460 + src/modules/engines/cairo_x11/evas_engine.h | 41 + src/modules/engines/cairo_x11/evas_x_main.c | 55 + src/modules/engines/direct3d/.cvsignore | 6 + .../engines/direct3d/Evas_Engine_Direct3D.h | 30 + src/modules/engines/direct3d/Makefile.am | 38 + .../engines/direct3d/evas_direct3d_buffer.c | 88 + .../engines/direct3d/evas_direct3d_main.cpp | 84 + src/modules/engines/direct3d/evas_engine.c | 369 + src/modules/engines/direct3d/evas_engine.h | 141 + src/modules/engines/direct3d/evas_outbuf.c | 333 + src/modules/engines/fb/.cvsignore | 6 + src/modules/engines/fb/Evas_Engine_FB.h | 22 + src/modules/engines/fb/Makefile.am | 38 + src/modules/engines/fb/evas_engine.c | 284 + src/modules/engines/fb/evas_engine.h | 59 + src/modules/engines/fb/evas_fb.h | 95 + src/modules/engines/fb/evas_fb_main.c | 601 + src/modules/engines/fb/evas_outbuf.c | 401 + src/modules/engines/gl_common/.cvsignore | 6 + src/modules/engines/gl_common/Makefile.am | 42 + src/modules/engines/gl_common/evas_gl_common.h | 253 + src/modules/engines/gl_common/evas_gl_context.c | 536 + src/modules/engines/gl_common/evas_gl_font.c | 468 + src/modules/engines/gl_common/evas_gl_gradient.c | 256 + src/modules/engines/gl_common/evas_gl_image.c | 330 + src/modules/engines/gl_common/evas_gl_line.c | 30 + src/modules/engines/gl_common/evas_gl_misc.c | 14 + src/modules/engines/gl_common/evas_gl_polygon.c | 169 + src/modules/engines/gl_common/evas_gl_private.h | 90 + src/modules/engines/gl_common/evas_gl_rectangle.c | 32 + src/modules/engines/gl_common/evas_gl_texture.c | 620 + src/modules/engines/gl_glew/.cvsignore | 6 + src/modules/engines/gl_glew/Evas_Engine_GL_Glew.h | 26 + src/modules/engines/gl_glew/Makefile.am | 35 + src/modules/engines/gl_glew/evas_engine.c | 970 + src/modules/engines/gl_glew/evas_engine.h | 47 + src/modules/engines/gl_glew/evas_glew_main.c | 118 + src/modules/engines/gl_x11/.cvsignore | 6 + src/modules/engines/gl_x11/Evas_Engine_GL_X11.h | 32 + src/modules/engines/gl_x11/Makefile.am | 37 + src/modules/engines/gl_x11/evas_engine.c | 1026 + src/modules/engines/gl_x11/evas_engine.h | 49 + src/modules/engines/gl_x11/evas_x_main.c | 87 + src/modules/engines/glitz_x11/.cvsignore | 6 + .../engines/glitz_x11/Evas_Engine_Glitz_X11.h | 25 + src/modules/engines/glitz_x11/Makefile.am | 44 + src/modules/engines/glitz_x11/evas_engine.c | 671 + src/modules/engines/glitz_x11/evas_engine.h | 12 + src/modules/engines/glitz_x11/evas_engine_font.c | 4 + src/modules/engines/glitz_x11/evas_engine_glitz.c | 9 + .../engines/glitz_x11/evas_engine_gradient.c | 5 + src/modules/engines/glitz_x11/evas_engine_image.c | 4 + src/modules/engines/glitz_x11/evas_engine_ximage.c | 4 + src/modules/engines/software_16/.cvsignore | 6 + src/modules/engines/software_16/Makefile.am | 26 + src/modules/engines/software_16/evas_engine.c | 845 + src/modules/engines/software_16_ddraw/.cvsignore | 4 + .../Evas_Engine_Software_16_DDraw.h | 29 + src/modules/engines/software_16_ddraw/Makefile.am | 38 + .../software_16_ddraw/evas_ddraw_buffer.cpp | 85 + .../engines/software_16_ddraw/evas_ddraw_main.cpp | 71 + .../engines/software_16_ddraw/evas_engine.c | 616 + .../engines/software_16_ddraw/evas_engine.h | 59 + src/modules/engines/software_16_sdl/.cvsignore | 6 + .../engines/software_16_sdl/Evas_Engine_SDL_16.h | 22 + src/modules/engines/software_16_sdl/Makefile.am | 28 + src/modules/engines/software_16_sdl/evas_engine.c | 1257 + src/modules/engines/software_16_sdl/evas_engine.h | 54 + src/modules/engines/software_16_wince/.cvsignore | 6 + .../Evas_Engine_Software_16_WinCE.h | 31 + src/modules/engines/software_16_wince/Makefile.am | 37 + .../engines/software_16_wince/evas_engine.c | 716 + .../engines/software_16_wince/evas_engine.h | 80 + .../software_16_wince/evas_wince_ddraw_buffer.cpp | 195 + .../software_16_wince/evas_wince_fb_buffer.c | 212 + .../engines/software_16_wince/evas_wince_gapi.rc | 1 + .../software_16_wince/evas_wince_gapi_buffer.c | 342 + src/modules/engines/software_16_x11/.cvsignore | 6 + .../software_16_x11/Evas_Engine_Software_16_X11.h | 23 + src/modules/engines/software_16_x11/Makefile.am | 37 + src/modules/engines/software_16_x11/evas_engine.c | 585 + src/modules/engines/software_16_x11/evas_engine.h | 36 + .../engines/software_16_x11/evas_x_buffer.c | 186 + src/modules/engines/software_ddraw/.cvsignore | 6 + .../software_ddraw/Evas_Engine_Software_DDraw.h | 26 + src/modules/engines/software_ddraw/Makefile.am | 38 + .../engines/software_ddraw/evas_ddraw_buffer.c | 91 + .../engines/software_ddraw/evas_ddraw_main.cpp | 195 + src/modules/engines/software_ddraw/evas_engine.c | 346 + src/modules/engines/software_ddraw/evas_engine.h | 192 + src/modules/engines/software_ddraw/evas_outbuf.c | 465 + src/modules/engines/software_generic/.cvsignore | 6 + src/modules/engines/software_generic/Makefile.am | 22 + src/modules/engines/software_generic/evas_engine.c | 902 + src/modules/engines/software_qtopia/.cvsignore | 6 + .../software_qtopia/Evas_Engine_Software_Qtopia.h | 31 + src/modules/engines/software_qtopia/Makefile.am | 39 + src/modules/engines/software_qtopia/evas_engine.c | 299 + src/modules/engines/software_qtopia/evas_engine.h | 103 + src/modules/engines/software_qtopia/evas_outbuf.c | 245 + .../engines/software_qtopia/evas_qt_main.cpp | 109 + src/modules/engines/software_sdl/.cvsignore | 6 + src/modules/engines/software_sdl/Evas_Engine_SDL.h | 24 + src/modules/engines/software_sdl/Makefile.am | 31 + src/modules/engines/software_sdl/evas_engine.c | 1101 + src/modules/engines/software_sdl/evas_engine.h | 46 + src/modules/engines/software_win32_gdi/.cvsignore | 6 + .../Evas_Engine_Software_Win32_GDI.h | 28 + src/modules/engines/software_win32_gdi/Makefile.am | 9 + .../engines/software_win32_gdi/evas_engine.c | 0 .../engines/software_win32_gdi/evas_engine.h | 0 .../engines/software_win32_gdi/evas_outbuf.c | 0 .../engines/software_win32_gdi/evas_win32_buffer.c | 0 .../engines/software_win32_gdi/evas_win32_main.c | 0 src/modules/engines/software_x11/.cvsignore | 6 + .../software_x11/Evas_Engine_Software_X11.h | 43 + src/modules/engines/software_x11/Makefile.am | 42 + src/modules/engines/software_x11/evas_engine.c | 382 + src/modules/engines/software_x11/evas_engine.h | 127 + src/modules/engines/software_x11/evas_outbuf.c | 982 + src/modules/engines/software_x11/evas_x_buffer.c | 255 + src/modules/engines/software_x11/evas_x_color.c | 362 + src/modules/engines/software_x11/evas_x_main.c | 10 + src/modules/engines/software_xcb/.cvsignore | 6 + .../software_xcb/Evas_Engine_Software_Xcb.h | 43 + src/modules/engines/software_xcb/Makefile.am | 42 + src/modules/engines/software_xcb/evas_engine.c | 428 + src/modules/engines/software_xcb/evas_engine.h | 196 + src/modules/engines/software_xcb/evas_outbuf.c | 1052 + src/modules/engines/software_xcb/evas_xcb_buffer.c | 287 + src/modules/engines/software_xcb/evas_xcb_color.c | 426 + src/modules/engines/software_xcb/evas_xcb_main.c | 9 + src/modules/engines/xrender_x11/.cvsignore | 6 + .../engines/xrender_x11/Evas_Engine_XRender_X11.h | 25 + src/modules/engines/xrender_x11/Makefile.am | 44 + src/modules/engines/xrender_x11/evas_engine.c | 950 + src/modules/engines/xrender_x11/evas_engine.h | 176 + src/modules/engines/xrender_x11/evas_engine_font.c | 191 + .../engines/xrender_x11/evas_engine_gradient.c | 209 + .../engines/xrender_x11/evas_engine_image.c | 690 + .../engines/xrender_x11/evas_engine_ximage.c | 258 + .../engines/xrender_x11/evas_engine_xrender.c | 748 + src/modules/engines/xrender_xcb/.cvsignore | 6 + .../engines/xrender_xcb/Evas_Engine_XRender_Xcb.h | 24 + src/modules/engines/xrender_xcb/Makefile.am | 44 + src/modules/engines/xrender_xcb/evas_engine.c | 877 + src/modules/engines/xrender_xcb/evas_engine.h | 184 + src/modules/engines/xrender_xcb/evas_engine_font.c | 203 + .../engines/xrender_xcb/evas_engine_gradient.c | 182 + .../engines/xrender_xcb/evas_engine_image.c | 614 + .../engines/xrender_xcb/evas_engine_ximage.c | 580 + .../engines/xrender_xcb/evas_engine_xrender.c | 863 + src/modules/loaders/.cvsignore | 2 + src/modules/loaders/Makefile.am | 40 + src/modules/loaders/edb/.cvsignore | 6 + src/modules/loaders/edb/Makefile.am | 20 + src/modules/loaders/edb/evas_image_load_edb.c | 204 + src/modules/loaders/eet/.cvsignore | 6 + src/modules/loaders/eet/Makefile.am | 22 + src/modules/loaders/eet/evas_image_load_eet.c | 121 + src/modules/loaders/gif/.cvsignore | 6 + src/modules/loaders/gif/Makefile.am | 21 + src/modules/loaders/gif/evas_image_load_gif.c | 307 + src/modules/loaders/jpeg/.cvsignore | 6 + src/modules/loaders/jpeg/Makefile.am | 22 + src/modules/loaders/jpeg/evas_image_load_jpeg.c | 437 + src/modules/loaders/pmaps/.cvsignore | 6 + src/modules/loaders/pmaps/Makefile.am | 23 + src/modules/loaders/pmaps/evas_image_load_pmaps.c | 554 + src/modules/loaders/png/.cvsignore | 6 + src/modules/loaders/png/Makefile.am | 20 + src/modules/loaders/png/evas_image_load_png.c | 228 + src/modules/loaders/svg/.cvsignore | 6 + src/modules/loaders/svg/Makefile.am | 22 + src/modules/loaders/svg/evas_image_load_svg.c | 296 + src/modules/loaders/tiff/.cvsignore | 6 + src/modules/loaders/tiff/Makefile.am | 22 + src/modules/loaders/tiff/evas_image_load_tiff.c | 338 + src/modules/loaders/xpm/.cvsignore | 6 + src/modules/loaders/xpm/Makefile.am | 22 + src/modules/loaders/xpm/evas_image_load_xpm.c | 646 + src/modules/savers/.cvsignore | 2 + src/modules/savers/Makefile.am | 23 + src/modules/savers/edb/.cvsignore | 6 + src/modules/savers/edb/Makefile.am | 20 + src/modules/savers/edb/evas_image_save_edb.c | 40 + src/modules/savers/eet/.cvsignore | 6 + src/modules/savers/eet/Makefile.am | 22 + src/modules/savers/eet/evas_image_save_eet.c | 74 + src/modules/savers/jpeg/.cvsignore | 6 + src/modules/savers/jpeg/Makefile.am | 22 + src/modules/savers/jpeg/evas_image_save_jpeg.c | 139 + src/modules/savers/png/.cvsignore | 6 + src/modules/savers/png/Makefile.am | 22 + src/modules/savers/png/evas_image_save_png.c | 164 + src/modules/savers/tiff/.cvsignore | 6 + src/modules/savers/tiff/Makefile.am | 22 + src/modules/savers/tiff/evas_image_save_tiff.c | 130 + 543 files changed, 153148 insertions(+) create mode 100644 .cvsignore create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 COPYING-PLAIN create mode 100644 ChangeLog create mode 100644 Doxyfile create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 NEWS create mode 100644 README.in create mode 100755 autogen.sh create mode 100644 configure.in create mode 100644 debian/.cvsignore create mode 100644 debian/changelog.in create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/libevas-dev.install create mode 100644 debian/libevas-doc.dirs create mode 100644 debian/libevas-doc.doc-base create mode 100644 debian/libevas-engine-buffer.install create mode 100644 debian/libevas-engine-fb.install create mode 100644 debian/libevas-engine-gl-x11.install create mode 100644 debian/libevas-engine-software-generic.install create mode 100644 debian/libevas-engine-software-x11.install create mode 100644 debian/libevas-engine-xrender.install create mode 100644 debian/libevas-engines-extra.install create mode 100644 debian/libevas-engines.install create mode 100644 debian/libevas-loader-eet.install create mode 100644 debian/libevas-loader-gif.install create mode 100644 debian/libevas-loader-jpeg.install create mode 100644 debian/libevas-loader-png.install create mode 100644 debian/libevas-loader-svg.install create mode 100644 debian/libevas-loader-tiff.install create mode 100644 debian/libevas-loader-xpm.install create mode 100644 debian/libevas-loaders.install create mode 100644 debian/libevas-saver-eet.install create mode 100644 debian/libevas-saver-jpeg.install create mode 100644 debian/libevas-saver-png.install create mode 100644 debian/libevas-saver-tiff.install create mode 100644 debian/libevas-savers.install create mode 100644 debian/libevas0.install create mode 100644 debian/rules create mode 100644 doc/.cvsignore create mode 100644 doc/e.css create mode 100644 doc/evas.css create mode 100644 doc/foot.html create mode 100644 doc/head.html create mode 100644 doc/img/_.gif create mode 100644 doc/img/b.png create mode 100644 doc/img/evas.eps create mode 100644 doc/img/evas.fig create mode 100644 doc/img/evas.png create mode 100644 doc/img/evas.xcf create mode 100644 doc/img/evas_big.eps create mode 100644 doc/img/evas_big.png create mode 100644 doc/img/evas_mini.png create mode 100644 doc/img/evas_small.png create mode 100644 doc/img/hilite.png create mode 100644 doc/img/n.gif create mode 100644 doc/img/n.png create mode 100644 doc/img/t.gif create mode 100644 doc/img/t.png create mode 100644 doc/img/tl.gif create mode 100644 doc/img/tl.png create mode 100644 evas-cairo-x11.pc.in create mode 100644 evas-direct3d.pc.in create mode 100644 evas-directfb.pc.in create mode 100644 evas-fb.pc.in create mode 100644 evas-glitz-x11.pc.in create mode 100644 evas-opengl-glew.pc.in create mode 100644 evas-opengl-x11.pc.in create mode 100644 evas-software-16-ddraw.pc.in create mode 100644 evas-software-16-wince.pc.in create mode 100644 evas-software-16-x11.pc.in create mode 100644 evas-software-buffer.pc.in create mode 100644 evas-software-ddraw.pc.in create mode 100644 evas-software-qtopia.pc.in create mode 100644 evas-software-sdl.pc.in create mode 100644 evas-software-x11.pc.in create mode 100644 evas-software-xcb.pc.in create mode 100644 evas-xrender-x11.pc.in create mode 100644 evas-xrender-xcb.pc.in create mode 100644 evas.c.in create mode 100644 evas.pc.in create mode 100644 evas.spec.in create mode 100755 gendoc create mode 100644 m4/evas_converter.m4 create mode 100644 src/.cvsignore create mode 100644 src/Makefile.am create mode 100644 src/lib/.cvsignore create mode 100644 src/lib/Evas.h create mode 100644 src/lib/Evas_Data.h create mode 100644 src/lib/Makefile.am create mode 100644 src/lib/cache/.cvsignore create mode 100644 src/lib/cache/Makefile.am create mode 100644 src/lib/cache/evas_cache.h create mode 100644 src/lib/cache/evas_cache_engine_image.c create mode 100644 src/lib/cache/evas_cache_image.c create mode 100644 src/lib/canvas/.cvsignore create mode 100644 src/lib/canvas/Makefile.am create mode 100644 src/lib/canvas/evas_async_events.c create mode 100644 src/lib/canvas/evas_callbacks.c create mode 100644 src/lib/canvas/evas_clip.c create mode 100644 src/lib/canvas/evas_data.c create mode 100644 src/lib/canvas/evas_events.c create mode 100644 src/lib/canvas/evas_focus.c create mode 100644 src/lib/canvas/evas_font_dir.c create mode 100644 src/lib/canvas/evas_key.c create mode 100644 src/lib/canvas/evas_key_grab.c create mode 100644 src/lib/canvas/evas_layer.c create mode 100644 src/lib/canvas/evas_main.c create mode 100644 src/lib/canvas/evas_name.c create mode 100644 src/lib/canvas/evas_object_gradient.c create mode 100644 src/lib/canvas/evas_object_image.c create mode 100644 src/lib/canvas/evas_object_inform.c create mode 100644 src/lib/canvas/evas_object_intercept.c create mode 100644 src/lib/canvas/evas_object_line.c create mode 100644 src/lib/canvas/evas_object_main.c create mode 100644 src/lib/canvas/evas_object_polygon.c create mode 100644 src/lib/canvas/evas_object_rectangle.c create mode 100644 src/lib/canvas/evas_object_smart.c create mode 100644 src/lib/canvas/evas_object_text.c create mode 100644 src/lib/canvas/evas_object_textblock.c create mode 100644 src/lib/canvas/evas_rectangle.c create mode 100644 src/lib/canvas/evas_render.c create mode 100644 src/lib/canvas/evas_smart.c create mode 100644 src/lib/canvas/evas_stack.c create mode 100644 src/lib/data/.cvsignore create mode 100644 src/lib/data/Makefile.am create mode 100644 src/lib/data/evas_array.c create mode 100644 src/lib/data/evas_array_hash.c create mode 100644 src/lib/data/evas_hash.c create mode 100644 src/lib/data/evas_inline_array.x create mode 100644 src/lib/data/evas_list.c create mode 100644 src/lib/data/evas_mempool.c create mode 100644 src/lib/data/evas_mempool.h create mode 100644 src/lib/data/evas_object_list.c create mode 100644 src/lib/data/evas_stringshare.c create mode 100644 src/lib/engines/.cvsignore create mode 100644 src/lib/engines/Makefile.am create mode 100644 src/lib/engines/common/.cvsignore create mode 100644 src/lib/engines/common/Makefile.am create mode 100644 src/lib/engines/common/evas_blend.h create mode 100644 src/lib/engines/common/evas_blend_main.c create mode 100644 src/lib/engines/common/evas_blend_private.h create mode 100644 src/lib/engines/common/evas_blit_main.c create mode 100644 src/lib/engines/common/evas_convert_color.c create mode 100644 src/lib/engines/common/evas_convert_color.h create mode 100644 src/lib/engines/common/evas_convert_colorspace.c create mode 100644 src/lib/engines/common/evas_convert_colorspace.h create mode 100644 src/lib/engines/common/evas_convert_gry_1.c create mode 100644 src/lib/engines/common/evas_convert_gry_1.h create mode 100644 src/lib/engines/common/evas_convert_gry_4.c create mode 100644 src/lib/engines/common/evas_convert_gry_4.h create mode 100644 src/lib/engines/common/evas_convert_gry_8.c create mode 100644 src/lib/engines/common/evas_convert_gry_8.h create mode 100644 src/lib/engines/common/evas_convert_main.c create mode 100644 src/lib/engines/common/evas_convert_main.h create mode 100644 src/lib/engines/common/evas_convert_rgb_16.c create mode 100644 src/lib/engines/common/evas_convert_rgb_16.h create mode 100644 src/lib/engines/common/evas_convert_rgb_24.c create mode 100644 src/lib/engines/common/evas_convert_rgb_24.h create mode 100644 src/lib/engines/common/evas_convert_rgb_32.c create mode 100644 src/lib/engines/common/evas_convert_rgb_32.h create mode 100644 src/lib/engines/common/evas_convert_rgb_8.c create mode 100644 src/lib/engines/common/evas_convert_rgb_8.h create mode 100644 src/lib/engines/common/evas_convert_yuv.c create mode 100644 src/lib/engines/common/evas_convert_yuv.h create mode 100644 src/lib/engines/common/evas_cpu.c create mode 100644 src/lib/engines/common/evas_draw.h create mode 100644 src/lib/engines/common/evas_draw_main.c create mode 100644 src/lib/engines/common/evas_font.h create mode 100644 src/lib/engines/common/evas_font_draw.c create mode 100644 src/lib/engines/common/evas_font_load.c create mode 100644 src/lib/engines/common/evas_font_main.c create mode 100644 src/lib/engines/common/evas_font_query.c create mode 100644 src/lib/engines/common/evas_gradient.h create mode 100644 src/lib/engines/common/evas_gradient_angular.c create mode 100644 src/lib/engines/common/evas_gradient_linear.c create mode 100644 src/lib/engines/common/evas_gradient_main.c create mode 100644 src/lib/engines/common/evas_gradient_private.h create mode 100644 src/lib/engines/common/evas_gradient_radial.c create mode 100644 src/lib/engines/common/evas_gradient_rectangular.c create mode 100644 src/lib/engines/common/evas_gradient_sinusoidal.c create mode 100644 src/lib/engines/common/evas_image.h create mode 100644 src/lib/engines/common/evas_image_data.c create mode 100644 src/lib/engines/common/evas_image_load.c create mode 100644 src/lib/engines/common/evas_image_main.c create mode 100644 src/lib/engines/common/evas_image_private.h create mode 100644 src/lib/engines/common/evas_image_save.c create mode 100644 src/lib/engines/common/evas_line.h create mode 100644 src/lib/engines/common/evas_line_main.c create mode 100644 src/lib/engines/common/evas_op_add/.cvsignore create mode 100644 src/lib/engines/common/evas_op_add/Makefile.am create mode 100644 src/lib/engines/common/evas_op_add/op_add_color_.c create mode 100644 src/lib/engines/common/evas_op_add/op_add_color_i386.c create mode 100644 src/lib/engines/common/evas_op_add/op_add_mask_color_.c create mode 100644 src/lib/engines/common/evas_op_add/op_add_mask_color_i386.c create mode 100644 src/lib/engines/common/evas_op_add/op_add_pixel_.c create mode 100644 src/lib/engines/common/evas_op_add/op_add_pixel_color_.c create mode 100644 src/lib/engines/common/evas_op_add/op_add_pixel_color_i386.c create mode 100644 src/lib/engines/common/evas_op_add/op_add_pixel_i386.c create mode 100644 src/lib/engines/common/evas_op_add/op_add_pixel_mask_.c create mode 100644 src/lib/engines/common/evas_op_add/op_add_pixel_mask_i386.c create mode 100644 src/lib/engines/common/evas_op_add_main_.c create mode 100644 src/lib/engines/common/evas_op_blend/.cvsignore create mode 100644 src/lib/engines/common/evas_op_blend/Makefile.am create mode 100644 src/lib/engines/common/evas_op_blend/op_blend_color_.c create mode 100644 src/lib/engines/common/evas_op_blend/op_blend_color_i386.c create mode 100644 src/lib/engines/common/evas_op_blend/op_blend_mask_color_.c create mode 100644 src/lib/engines/common/evas_op_blend/op_blend_mask_color_i386.c create mode 100644 src/lib/engines/common/evas_op_blend/op_blend_pixel_.c create mode 100644 src/lib/engines/common/evas_op_blend/op_blend_pixel_color_.c create mode 100644 src/lib/engines/common/evas_op_blend/op_blend_pixel_color_i386.c create mode 100644 src/lib/engines/common/evas_op_blend/op_blend_pixel_i386.c create mode 100644 src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_.c create mode 100644 src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_i386.c create mode 100644 src/lib/engines/common/evas_op_blend_main_.c create mode 100644 src/lib/engines/common/evas_op_copy/.cvsignore create mode 100644 src/lib/engines/common/evas_op_copy/Makefile.am create mode 100644 src/lib/engines/common/evas_op_copy/op_copy_color_.c create mode 100644 src/lib/engines/common/evas_op_copy/op_copy_color_i386.c create mode 100644 src/lib/engines/common/evas_op_copy/op_copy_mask_color_.c create mode 100644 src/lib/engines/common/evas_op_copy/op_copy_mask_color_i386.c create mode 100644 src/lib/engines/common/evas_op_copy/op_copy_pixel_.c create mode 100644 src/lib/engines/common/evas_op_copy/op_copy_pixel_color_.c create mode 100644 src/lib/engines/common/evas_op_copy/op_copy_pixel_color_i386.c create mode 100644 src/lib/engines/common/evas_op_copy/op_copy_pixel_i386.c create mode 100644 src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_.c create mode 100644 src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_i386.c create mode 100644 src/lib/engines/common/evas_op_copy_main_.c create mode 100644 src/lib/engines/common/evas_op_mask/.cvsignore create mode 100644 src/lib/engines/common/evas_op_mask/Makefile.am create mode 100644 src/lib/engines/common/evas_op_mask/op_mask_color_.c create mode 100644 src/lib/engines/common/evas_op_mask/op_mask_color_i386.c create mode 100644 src/lib/engines/common/evas_op_mask/op_mask_mask_color_.c create mode 100644 src/lib/engines/common/evas_op_mask/op_mask_mask_color_i386.c create mode 100644 src/lib/engines/common/evas_op_mask/op_mask_pixel_.c create mode 100644 src/lib/engines/common/evas_op_mask/op_mask_pixel_color_.c create mode 100644 src/lib/engines/common/evas_op_mask/op_mask_pixel_color_i386.c create mode 100644 src/lib/engines/common/evas_op_mask/op_mask_pixel_i386.c create mode 100644 src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_.c create mode 100644 src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_i386.c create mode 100644 src/lib/engines/common/evas_op_mask_main_.c create mode 100644 src/lib/engines/common/evas_op_mul/.cvsignore create mode 100644 src/lib/engines/common/evas_op_mul/Makefile.am create mode 100644 src/lib/engines/common/evas_op_mul/op_mul_color_.c create mode 100644 src/lib/engines/common/evas_op_mul/op_mul_color_i386.c create mode 100644 src/lib/engines/common/evas_op_mul/op_mul_mask_color_.c create mode 100644 src/lib/engines/common/evas_op_mul/op_mul_mask_color_i386.c create mode 100644 src/lib/engines/common/evas_op_mul/op_mul_pixel_.c create mode 100644 src/lib/engines/common/evas_op_mul/op_mul_pixel_color_.c create mode 100644 src/lib/engines/common/evas_op_mul/op_mul_pixel_color_i386.c create mode 100644 src/lib/engines/common/evas_op_mul/op_mul_pixel_i386.c create mode 100644 src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_.c create mode 100644 src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_i386.c create mode 100644 src/lib/engines/common/evas_op_mul_main_.c create mode 100644 src/lib/engines/common/evas_op_sub/.cvsignore create mode 100644 src/lib/engines/common/evas_op_sub/Makefile.am create mode 100644 src/lib/engines/common/evas_op_sub/op_sub_color_.c create mode 100644 src/lib/engines/common/evas_op_sub/op_sub_color_i386.c create mode 100644 src/lib/engines/common/evas_op_sub/op_sub_mask_color_.c create mode 100644 src/lib/engines/common/evas_op_sub/op_sub_mask_color_i386.c create mode 100644 src/lib/engines/common/evas_op_sub/op_sub_pixel_.c create mode 100644 src/lib/engines/common/evas_op_sub/op_sub_pixel_color_.c create mode 100644 src/lib/engines/common/evas_op_sub/op_sub_pixel_color_i386.c create mode 100644 src/lib/engines/common/evas_op_sub/op_sub_pixel_i386.c create mode 100644 src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_.c create mode 100644 src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_i386.c create mode 100644 src/lib/engines/common/evas_op_sub_main_.c create mode 100644 src/lib/engines/common/evas_pipe.c create mode 100644 src/lib/engines/common/evas_pipe.h create mode 100644 src/lib/engines/common/evas_polygon.h create mode 100644 src/lib/engines/common/evas_polygon_main.c create mode 100644 src/lib/engines/common/evas_rectangle.h create mode 100644 src/lib/engines/common/evas_rectangle_main.c create mode 100644 src/lib/engines/common/evas_regionbuf.c create mode 100644 src/lib/engines/common/evas_scale_main.c create mode 100644 src/lib/engines/common/evas_scale_main.h create mode 100644 src/lib/engines/common/evas_scale_sample.c create mode 100644 src/lib/engines/common/evas_scale_smooth.c create mode 100644 src/lib/engines/common/evas_scale_smooth.h create mode 100644 src/lib/engines/common/evas_scale_smooth_scaler.c create mode 100644 src/lib/engines/common/evas_scale_smooth_scaler_down.c create mode 100644 src/lib/engines/common/evas_scale_smooth_scaler_downx.c create mode 100644 src/lib/engines/common/evas_scale_smooth_scaler_downx_downy.c create mode 100644 src/lib/engines/common/evas_scale_smooth_scaler_downy.c create mode 100644 src/lib/engines/common/evas_scale_smooth_scaler_noscale.c create mode 100644 src/lib/engines/common/evas_scale_smooth_scaler_up.c create mode 100644 src/lib/engines/common/evas_scale_span.c create mode 100644 src/lib/engines/common/evas_scale_span.h create mode 100644 src/lib/engines/common/evas_tiler.c create mode 100644 src/lib/engines/common_16/.cvsignore create mode 100644 src/lib/engines/common_16/Makefile.am create mode 100644 src/lib/engines/common_16/evas_soft16_dither_mask.c create mode 100644 src/lib/engines/common_16/evas_soft16_font.c create mode 100644 src/lib/engines/common_16/evas_soft16_image_scaled_sampled.c create mode 100644 src/lib/engines/common_16/evas_soft16_image_unscaled.c create mode 100644 src/lib/engines/common_16/evas_soft16_line.c create mode 100644 src/lib/engines/common_16/evas_soft16_main.c create mode 100644 src/lib/engines/common_16/evas_soft16_polygon.c create mode 100644 src/lib/engines/common_16/evas_soft16_rectangle.c create mode 100644 src/lib/engines/common_16/evas_soft16_scanline_blend.c create mode 100644 src/lib/engines/common_16/evas_soft16_scanline_fill.c create mode 100644 src/lib/file/.cvsignore create mode 100644 src/lib/file/Makefile.am create mode 100644 src/lib/file/evas_module.c create mode 100644 src/lib/file/evas_module.h create mode 100644 src/lib/file/evas_path.c create mode 100644 src/lib/file/evas_path.h create mode 100644 src/lib/imaging/.cvsignore create mode 100644 src/lib/imaging/Makefile.am create mode 100644 src/lib/imaging/evas_imaging.c create mode 100644 src/lib/include/.cvsignore create mode 100644 src/lib/include/Makefile.am create mode 100644 src/lib/include/evas_blend_ops.h create mode 100644 src/lib/include/evas_cairo_common.h create mode 100644 src/lib/include/evas_common.h create mode 100644 src/lib/include/evas_common_soft16.h create mode 100644 src/lib/include/evas_inline.x create mode 100644 src/lib/include/evas_macros.h create mode 100644 src/lib/include/evas_mmx.h create mode 100644 src/lib/include/evas_options.h create mode 100644 src/lib/include/evas_private.h create mode 100644 src/lib/main.c create mode 100644 src/modules/.cvsignore create mode 100644 src/modules/Makefile.am create mode 100644 src/modules/engines/.cvsignore create mode 100644 src/modules/engines/Makefile.am create mode 100644 src/modules/engines/buffer/.cvsignore create mode 100644 src/modules/engines/buffer/Evas_Engine_Buffer.h create mode 100644 src/modules/engines/buffer/Makefile.am create mode 100644 src/modules/engines/buffer/evas_engine.c create mode 100644 src/modules/engines/buffer/evas_engine.h create mode 100644 src/modules/engines/buffer/evas_outbuf.c create mode 100644 src/modules/engines/cairo_common/.cvsignore create mode 100644 src/modules/engines/cairo_common/Makefile.am create mode 100644 src/modules/engines/cairo_common/evas_cairo_common.h create mode 100644 src/modules/engines/cairo_common/evas_cairo_main.c create mode 100644 src/modules/engines/cairo_common/evas_cairo_private.h create mode 100644 src/modules/engines/cairo_x11/.cvsignore create mode 100644 src/modules/engines/cairo_x11/Evas_Engine_Cairo_X11.h create mode 100644 src/modules/engines/cairo_x11/Makefile.am create mode 100644 src/modules/engines/cairo_x11/evas_engine.c create mode 100644 src/modules/engines/cairo_x11/evas_engine.h create mode 100644 src/modules/engines/cairo_x11/evas_x_main.c create mode 100644 src/modules/engines/direct3d/.cvsignore create mode 100644 src/modules/engines/direct3d/Evas_Engine_Direct3D.h create mode 100644 src/modules/engines/direct3d/Makefile.am create mode 100644 src/modules/engines/direct3d/evas_direct3d_buffer.c create mode 100644 src/modules/engines/direct3d/evas_direct3d_main.cpp create mode 100644 src/modules/engines/direct3d/evas_engine.c create mode 100644 src/modules/engines/direct3d/evas_engine.h create mode 100644 src/modules/engines/direct3d/evas_outbuf.c create mode 100644 src/modules/engines/fb/.cvsignore create mode 100644 src/modules/engines/fb/Evas_Engine_FB.h create mode 100644 src/modules/engines/fb/Makefile.am create mode 100644 src/modules/engines/fb/evas_engine.c create mode 100644 src/modules/engines/fb/evas_engine.h create mode 100644 src/modules/engines/fb/evas_fb.h create mode 100644 src/modules/engines/fb/evas_fb_main.c create mode 100644 src/modules/engines/fb/evas_outbuf.c create mode 100644 src/modules/engines/gl_common/.cvsignore create mode 100644 src/modules/engines/gl_common/Makefile.am create mode 100644 src/modules/engines/gl_common/evas_gl_common.h create mode 100644 src/modules/engines/gl_common/evas_gl_context.c create mode 100644 src/modules/engines/gl_common/evas_gl_font.c create mode 100644 src/modules/engines/gl_common/evas_gl_gradient.c create mode 100644 src/modules/engines/gl_common/evas_gl_image.c create mode 100644 src/modules/engines/gl_common/evas_gl_line.c create mode 100644 src/modules/engines/gl_common/evas_gl_misc.c create mode 100644 src/modules/engines/gl_common/evas_gl_polygon.c create mode 100644 src/modules/engines/gl_common/evas_gl_private.h create mode 100644 src/modules/engines/gl_common/evas_gl_rectangle.c create mode 100644 src/modules/engines/gl_common/evas_gl_texture.c create mode 100644 src/modules/engines/gl_glew/.cvsignore create mode 100644 src/modules/engines/gl_glew/Evas_Engine_GL_Glew.h create mode 100644 src/modules/engines/gl_glew/Makefile.am create mode 100644 src/modules/engines/gl_glew/evas_engine.c create mode 100644 src/modules/engines/gl_glew/evas_engine.h create mode 100644 src/modules/engines/gl_glew/evas_glew_main.c create mode 100644 src/modules/engines/gl_x11/.cvsignore create mode 100644 src/modules/engines/gl_x11/Evas_Engine_GL_X11.h create mode 100644 src/modules/engines/gl_x11/Makefile.am create mode 100644 src/modules/engines/gl_x11/evas_engine.c create mode 100644 src/modules/engines/gl_x11/evas_engine.h create mode 100644 src/modules/engines/gl_x11/evas_x_main.c create mode 100644 src/modules/engines/glitz_x11/.cvsignore create mode 100644 src/modules/engines/glitz_x11/Evas_Engine_Glitz_X11.h create mode 100644 src/modules/engines/glitz_x11/Makefile.am create mode 100644 src/modules/engines/glitz_x11/evas_engine.c create mode 100644 src/modules/engines/glitz_x11/evas_engine.h create mode 100644 src/modules/engines/glitz_x11/evas_engine_font.c create mode 100644 src/modules/engines/glitz_x11/evas_engine_glitz.c create mode 100644 src/modules/engines/glitz_x11/evas_engine_gradient.c create mode 100644 src/modules/engines/glitz_x11/evas_engine_image.c create mode 100644 src/modules/engines/glitz_x11/evas_engine_ximage.c create mode 100644 src/modules/engines/software_16/.cvsignore create mode 100644 src/modules/engines/software_16/Makefile.am create mode 100644 src/modules/engines/software_16/evas_engine.c create mode 100644 src/modules/engines/software_16_ddraw/.cvsignore create mode 100644 src/modules/engines/software_16_ddraw/Evas_Engine_Software_16_DDraw.h create mode 100644 src/modules/engines/software_16_ddraw/Makefile.am create mode 100644 src/modules/engines/software_16_ddraw/evas_ddraw_buffer.cpp create mode 100644 src/modules/engines/software_16_ddraw/evas_ddraw_main.cpp create mode 100644 src/modules/engines/software_16_ddraw/evas_engine.c create mode 100644 src/modules/engines/software_16_ddraw/evas_engine.h create mode 100644 src/modules/engines/software_16_sdl/.cvsignore create mode 100644 src/modules/engines/software_16_sdl/Evas_Engine_SDL_16.h create mode 100644 src/modules/engines/software_16_sdl/Makefile.am create mode 100644 src/modules/engines/software_16_sdl/evas_engine.c create mode 100644 src/modules/engines/software_16_sdl/evas_engine.h create mode 100644 src/modules/engines/software_16_wince/.cvsignore create mode 100644 src/modules/engines/software_16_wince/Evas_Engine_Software_16_WinCE.h create mode 100644 src/modules/engines/software_16_wince/Makefile.am create mode 100644 src/modules/engines/software_16_wince/evas_engine.c create mode 100644 src/modules/engines/software_16_wince/evas_engine.h create mode 100644 src/modules/engines/software_16_wince/evas_wince_ddraw_buffer.cpp create mode 100644 src/modules/engines/software_16_wince/evas_wince_fb_buffer.c create mode 100644 src/modules/engines/software_16_wince/evas_wince_gapi.rc create mode 100644 src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c create mode 100644 src/modules/engines/software_16_x11/.cvsignore create mode 100644 src/modules/engines/software_16_x11/Evas_Engine_Software_16_X11.h create mode 100644 src/modules/engines/software_16_x11/Makefile.am create mode 100644 src/modules/engines/software_16_x11/evas_engine.c create mode 100644 src/modules/engines/software_16_x11/evas_engine.h create mode 100644 src/modules/engines/software_16_x11/evas_x_buffer.c create mode 100644 src/modules/engines/software_ddraw/.cvsignore create mode 100644 src/modules/engines/software_ddraw/Evas_Engine_Software_DDraw.h create mode 100644 src/modules/engines/software_ddraw/Makefile.am create mode 100644 src/modules/engines/software_ddraw/evas_ddraw_buffer.c create mode 100644 src/modules/engines/software_ddraw/evas_ddraw_main.cpp create mode 100644 src/modules/engines/software_ddraw/evas_engine.c create mode 100644 src/modules/engines/software_ddraw/evas_engine.h create mode 100644 src/modules/engines/software_ddraw/evas_outbuf.c create mode 100644 src/modules/engines/software_generic/.cvsignore create mode 100644 src/modules/engines/software_generic/Makefile.am create mode 100644 src/modules/engines/software_generic/evas_engine.c create mode 100644 src/modules/engines/software_qtopia/.cvsignore create mode 100644 src/modules/engines/software_qtopia/Evas_Engine_Software_Qtopia.h create mode 100644 src/modules/engines/software_qtopia/Makefile.am create mode 100644 src/modules/engines/software_qtopia/evas_engine.c create mode 100644 src/modules/engines/software_qtopia/evas_engine.h create mode 100644 src/modules/engines/software_qtopia/evas_outbuf.c create mode 100644 src/modules/engines/software_qtopia/evas_qt_main.cpp create mode 100644 src/modules/engines/software_sdl/.cvsignore create mode 100644 src/modules/engines/software_sdl/Evas_Engine_SDL.h create mode 100644 src/modules/engines/software_sdl/Makefile.am create mode 100644 src/modules/engines/software_sdl/evas_engine.c create mode 100644 src/modules/engines/software_sdl/evas_engine.h create mode 100644 src/modules/engines/software_win32_gdi/.cvsignore create mode 100644 src/modules/engines/software_win32_gdi/Evas_Engine_Software_Win32_GDI.h create mode 100644 src/modules/engines/software_win32_gdi/Makefile.am create mode 100644 src/modules/engines/software_win32_gdi/evas_engine.c create mode 100644 src/modules/engines/software_win32_gdi/evas_engine.h create mode 100644 src/modules/engines/software_win32_gdi/evas_outbuf.c create mode 100644 src/modules/engines/software_win32_gdi/evas_win32_buffer.c create mode 100644 src/modules/engines/software_win32_gdi/evas_win32_main.c create mode 100644 src/modules/engines/software_x11/.cvsignore create mode 100644 src/modules/engines/software_x11/Evas_Engine_Software_X11.h create mode 100644 src/modules/engines/software_x11/Makefile.am create mode 100644 src/modules/engines/software_x11/evas_engine.c create mode 100644 src/modules/engines/software_x11/evas_engine.h create mode 100644 src/modules/engines/software_x11/evas_outbuf.c create mode 100644 src/modules/engines/software_x11/evas_x_buffer.c create mode 100644 src/modules/engines/software_x11/evas_x_color.c create mode 100644 src/modules/engines/software_x11/evas_x_main.c create mode 100644 src/modules/engines/software_xcb/.cvsignore create mode 100644 src/modules/engines/software_xcb/Evas_Engine_Software_Xcb.h create mode 100644 src/modules/engines/software_xcb/Makefile.am create mode 100644 src/modules/engines/software_xcb/evas_engine.c create mode 100644 src/modules/engines/software_xcb/evas_engine.h create mode 100644 src/modules/engines/software_xcb/evas_outbuf.c create mode 100644 src/modules/engines/software_xcb/evas_xcb_buffer.c create mode 100644 src/modules/engines/software_xcb/evas_xcb_color.c create mode 100644 src/modules/engines/software_xcb/evas_xcb_main.c create mode 100644 src/modules/engines/xrender_x11/.cvsignore create mode 100644 src/modules/engines/xrender_x11/Evas_Engine_XRender_X11.h create mode 100644 src/modules/engines/xrender_x11/Makefile.am create mode 100644 src/modules/engines/xrender_x11/evas_engine.c create mode 100644 src/modules/engines/xrender_x11/evas_engine.h create mode 100644 src/modules/engines/xrender_x11/evas_engine_font.c create mode 100644 src/modules/engines/xrender_x11/evas_engine_gradient.c create mode 100644 src/modules/engines/xrender_x11/evas_engine_image.c create mode 100644 src/modules/engines/xrender_x11/evas_engine_ximage.c create mode 100644 src/modules/engines/xrender_x11/evas_engine_xrender.c create mode 100644 src/modules/engines/xrender_xcb/.cvsignore create mode 100644 src/modules/engines/xrender_xcb/Evas_Engine_XRender_Xcb.h create mode 100644 src/modules/engines/xrender_xcb/Makefile.am create mode 100644 src/modules/engines/xrender_xcb/evas_engine.c create mode 100644 src/modules/engines/xrender_xcb/evas_engine.h create mode 100644 src/modules/engines/xrender_xcb/evas_engine_font.c create mode 100644 src/modules/engines/xrender_xcb/evas_engine_gradient.c create mode 100644 src/modules/engines/xrender_xcb/evas_engine_image.c create mode 100644 src/modules/engines/xrender_xcb/evas_engine_ximage.c create mode 100644 src/modules/engines/xrender_xcb/evas_engine_xrender.c create mode 100644 src/modules/loaders/.cvsignore create mode 100644 src/modules/loaders/Makefile.am create mode 100644 src/modules/loaders/edb/.cvsignore create mode 100644 src/modules/loaders/edb/Makefile.am create mode 100644 src/modules/loaders/edb/evas_image_load_edb.c create mode 100644 src/modules/loaders/eet/.cvsignore create mode 100644 src/modules/loaders/eet/Makefile.am create mode 100644 src/modules/loaders/eet/evas_image_load_eet.c create mode 100644 src/modules/loaders/gif/.cvsignore create mode 100644 src/modules/loaders/gif/Makefile.am create mode 100644 src/modules/loaders/gif/evas_image_load_gif.c create mode 100644 src/modules/loaders/jpeg/.cvsignore create mode 100644 src/modules/loaders/jpeg/Makefile.am create mode 100644 src/modules/loaders/jpeg/evas_image_load_jpeg.c create mode 100644 src/modules/loaders/pmaps/.cvsignore create mode 100644 src/modules/loaders/pmaps/Makefile.am create mode 100644 src/modules/loaders/pmaps/evas_image_load_pmaps.c create mode 100644 src/modules/loaders/png/.cvsignore create mode 100644 src/modules/loaders/png/Makefile.am create mode 100644 src/modules/loaders/png/evas_image_load_png.c create mode 100644 src/modules/loaders/svg/.cvsignore create mode 100644 src/modules/loaders/svg/Makefile.am create mode 100644 src/modules/loaders/svg/evas_image_load_svg.c create mode 100644 src/modules/loaders/tiff/.cvsignore create mode 100644 src/modules/loaders/tiff/Makefile.am create mode 100644 src/modules/loaders/tiff/evas_image_load_tiff.c create mode 100644 src/modules/loaders/xpm/.cvsignore create mode 100644 src/modules/loaders/xpm/Makefile.am create mode 100644 src/modules/loaders/xpm/evas_image_load_xpm.c create mode 100644 src/modules/savers/.cvsignore create mode 100644 src/modules/savers/Makefile.am create mode 100644 src/modules/savers/edb/.cvsignore create mode 100644 src/modules/savers/edb/Makefile.am create mode 100644 src/modules/savers/edb/evas_image_save_edb.c create mode 100644 src/modules/savers/eet/.cvsignore create mode 100644 src/modules/savers/eet/Makefile.am create mode 100644 src/modules/savers/eet/evas_image_save_eet.c create mode 100644 src/modules/savers/jpeg/.cvsignore create mode 100644 src/modules/savers/jpeg/Makefile.am create mode 100644 src/modules/savers/jpeg/evas_image_save_jpeg.c create mode 100644 src/modules/savers/png/.cvsignore create mode 100644 src/modules/savers/png/Makefile.am create mode 100644 src/modules/savers/png/evas_image_save_png.c create mode 100644 src/modules/savers/tiff/.cvsignore create mode 100644 src/modules/savers/tiff/Makefile.am create mode 100644 src/modules/savers/tiff/evas_image_save_tiff.c diff --git a/.cvsignore b/.cvsignore new file mode 100644 index 0000000..bd35322 --- /dev/null +++ b/.cvsignore @@ -0,0 +1,28 @@ +config.guess +config.sub +ltmain.sh +aclocal.m4 +*.cache +config.h.in +Makefile.in +configure +config.log +Makefile +libtool +config.status +evas-config +*.pc +config.h +stamp-h1 +evas_docs.tar.gz +compile +depcomp +missing +install-sh +doc +*.tar.gz +*.oe +*.bb +*.spec +README +mkinstalldirs diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..a93633a --- /dev/null +++ b/AUTHORS @@ -0,0 +1,15 @@ +Carsten Haitzler +Till Adam +Steve Ireland +Brett Nash +Tilman Sauerbeck +Corey Donohoe +Yuri Hudobin +Nathan Ingersoll +Willem Monsuwe +Jose O Gonzalez +Bernhard Nemec +Jorge Luis Zapata Muga +Cedric Bail +Gustavo Sverzut Barbieri +Vincent Torri diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..474fcc5 --- /dev/null +++ b/COPYING @@ -0,0 +1,28 @@ +Copyright (C) 2000 Carsten Haitzler and various contributors (see AUTHORS) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies of the Software and its Copyright notices. In addition publicly +documented acknowledgment must be given that this software has been used if no +source code of this software is made available publicly. This includes +acknowledgments in either Copyright notices, Manuals, Publicity and Marketing +documents or any documentation provided with any product containing this +software. This License does not apply to any software that links to the +libraries provided by this software (statically or dynamically), but only to +the software provided. + +Please see the COPYING.PLAIN for a plain-english explanation of this notice +and it's intent. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/COPYING-PLAIN b/COPYING-PLAIN new file mode 100644 index 0000000..376875e --- /dev/null +++ b/COPYING-PLAIN @@ -0,0 +1,33 @@ +Plain English Copyright Notice + +This file is not intended to be the actual License. The reason this file +exists is that we here are programmers and engineers. We aren't lawyers. We +provide licenses that we THINK say the right things, but we have our own +intentions at heart. This is a plain-english explanation of what those +intentions are, and if you follow them you will be within the "spirit" of +the license. + +The intent is for us to enjoy writing software that is useful to us (the +AUTHORS) and allow others to use it freely and also benefit from the work we +put into making it. We don't want to restrict others using it. They should +not *HAVE* to make the source code of the applications they write that +simply link to these libraries (be that statically or dynamically), or for +them to be limited as to what license they choose to use (be it open, closed +or anything else). But we would like to know you are using these libraries. +We simply would like to know that it has been useful to someone. This is why +we ask for acknowledgement of some sort. + +You can do what you want with the source of this software - it doesn't +matter. We still have it here for ourselves and it is open and free to use +and download and play with. It can't be taken away. We don't really mind what +you do with the source to your software. We would simply like to know that +you are using it - especially if it makes it to a commerical product. If you +simply e-mail all the AUTHORS (see COPYING and AUTHORS files) telling us, and +then make sure you include a paragraph or page in the manual for the product +with the copyright notice and state that you used this software, we will be +very happy. If you want to contribute back modifications and fixes you may have +made we will welcome those too with open arms (generally). If you want help +with changes needed, ports needed or features to be added, arrangements can +be easily made with some dialogue. + +Carsten Haitzler diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..e69de29 diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 0000000..0f1a4da --- /dev/null +++ b/Doxyfile @@ -0,0 +1,139 @@ +PROJECT_NAME = Evas +PROJECT_NUMBER = +OUTPUT_DIRECTORY = doc +INPUT = evas.c.in ./src/lib +IMAGE_PATH = doc/img +OUTPUT_LANGUAGE = English +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = doc/head.html +HTML_FOOTER = doc/foot.html +HTML_STYLESHEET = doc/e.css +HTML_ALIGN_MEMBERS = YES +ENUM_VALUES_PER_LINE = 1 +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = YES +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = NO +HIDE_UNDOC_MEMBERS = YES +HIDE_UNDOC_CLASSES = YES +HIDE_FRIEND_COMPOUNDS = YES +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +INTERNAL_DOCS = NO +STRIP_CODE_COMMENTS = YES +CASE_SENSE_NAMES = YES +SHORT_NAMES = NO +HIDE_SCOPE_NAMES = NO +VERBATIM_HEADERS = NO +SHOW_INCLUDE_FILES = NO +JAVADOC_AUTOBRIEF = YES +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +DISTRIBUTE_GROUP_DOC = NO +TAB_SIZE = 2 +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ALIASES = +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +SHOW_USED_FILES = NO +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +FILE_PATTERNS = +RECURSIVE = YES +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +INPUT_FILTER = +FILTER_SOURCE_FILES = NO +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 2 +IGNORE_PREFIX = +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 +GENERATE_LATEX = YES +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = YES +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +GENERATE_MAN = YES +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = YES +GENERATE_XML = NO +XML_SCHEMA = +XML_DTD = +GENERATE_AUTOGEN_DEF = NO +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = NO +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +CLASS_DIAGRAMS = NO +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +CLASS_GRAPH = NO +COLLABORATION_GRAPH = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = NO +INCLUDED_BY_GRAPH = NO +GRAPHICAL_HIERARCHY = NO +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 512 +MAX_DOT_GRAPH_HEIGHT = 512 +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +SEARCHENGINE = NO diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..a4b76cb --- /dev/null +++ b/INSTALL @@ -0,0 +1,17 @@ +COMPILING and INSTALLING: + +please see the README file. + +NB: you will need pkgconfig package (available for debian and for redhat - +try www.rpmfind.net if you're lost, or go to the pkgconfig website: +http://www.freedesktop.org/software/pkgconfig/ ) if your are taking this from +CVS and having to run ./autogen.sh) + +NOTE: for compilation with MinGW, fnmatch.h is probably missing. + That file can be found here: +http://www.koders.com/c/fid2B518462CB1EED3D4E31E271DB83CD1582F6EEBE.aspx + It should be installed in the mingw include directory. + +NOTE: for the OpenGL engine on Windows, the glew library: +http://glew.sourceforge.net/ + is needed. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..5b16b84 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,156 @@ +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = src + +MAINTAINERCLEANFILES = \ +Makefile.in \ +aclocal.m4 \ +config.guess \ +config.h.in \ +config.sub \ +configure \ +install-sh \ +ltconfig \ +ltmain.sh \ +missing \ +mkinstalldirs \ +stamp-h.in \ +build-stamp \ +configure-stamp \ +depcomp \ +evas_docs.tar.gz \ +evas.c \ +README \ +evas-cairo-x11.pc \ +evas-directfb.pc \ +evas-fb.pc \ +evas-glitz-x11.pc \ +evas-opengl-x11.pc \ +evas-opengl-glew.pc \ +evas-software-buffer.pc \ +evas-software-qtopia.pc \ +evas-software-x11.pc \ +evas-software-16-x11.pc \ +evas-software-xcb.pc \ +evas-xrender-x11.pc \ +evas-xrender-xcb.pc \ +evas-software-ddraw.pc \ +evas-software-16-ddraw.pc \ +evas-direct3d.pc \ +evas-software-16-wince.pc \ +evas-software-sdl.pc \ +evas.pc \ +evas.spec + +bin_SCRIPTS = + +EXTRA_DIST = \ +AUTHORS \ +COPYING \ +COPYING-PLAIN \ +autogen.sh \ +evas.c.in \ +gendoc \ +Doxyfile \ +README.in \ +README \ +evas.pc.in \ +evas-cairo-x11.pc.in \ +evas-directfb.pc.in \ +evas-fb.pc.in \ +evas-glitz-x11.pc.in \ +evas-opengl-x11.pc.in \ +evas-opengl-glew.pc.in \ +evas-software-buffer.pc.in \ +evas-software-qtopia.pc.in \ +evas-software-x11.pc.in \ +evas-software-16-x11.pc.in \ +evas-software-xcb.pc.in \ +evas-xrender-x11.pc.in \ +evas-xrender-xcb.pc.in \ +evas-software-ddraw.pc.in \ +evas-software-16-ddraw.pc.in \ +evas-direct3d.pc.in \ +evas-software-16-wince.pc.in \ +evas-software-sdl.pc.in \ +evas.spec.in evas.spec \ +doc gendoc + +if BUILD_ENGINE_SOFTWARE_X11 +psoftwarex11 = evas-software-x11.pc +endif + +if BUILD_ENGINE_SOFTWARE_16_X11 +psoftware16x11 = evas-software-16-x11.pc +endif + +if BUILD_ENGINE_SOFTWARE_XCB +psoftwarexcb = evas-software-xcb.pc +endif + +#if BUILD_ENGINE_DIRECTFB +#pdirectfb = evas-directfb.pc +#endif + +if BUILD_ENGINE_FB +pfb = evas-fb.pc +endif + +if BUILD_ENGINE_GLITZ_X11 +pglitzx11 = evas-glitz-x11.pc +endif + +if BUILD_ENGINE_BUFFER +psoftwarebuffer = evas-software-buffer.pc +endif + +if BUILD_ENGINE_SOFTWARE_QTOPIA +psoftwareqtopia = evas-software-qtopia.pc +endif + +if BUILD_ENGINE_GL_X11 +popenglx11 = evas-opengl-x11.pc +endif + +if BUILD_ENGINE_GL_GLEW +popenglglew = evas-opengl-glew.pc +endif + +if BUILD_ENGINE_CAIRO_X11 +pcairox11 = evas-cairo-x11.pc +endif + +if BUILD_ENGINE_XRENDER_X11 +pxrenderx11 = evas-xrender-x11.pc +endif + +if BUILD_ENGINE_XRENDER_XCB +pxrenderxcb = evas-xrender-xcb.pc +endif + +if BUILD_ENGINE_SOFTWARE_DDRAW +psoftwareddraw = evas-software-ddraw.pc +endif + +if BUILD_ENGINE_SOFTWARE_16_DDRAW +psoftware16ddraw = evas-software-16-ddraw.pc +endif + +if BUILD_ENGINE_DIRECT3D +pdirect3d = evas-direct3d.pc +endif + +if BUILD_ENGINE_SOFTWARE_16_WINCE +psoftware16wince = evas-software-16-wince.pc +endif + +if BUILD_ENGINE_SDL +psoftwaresdl = evas-software-sdl.pc +endif + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = \ + evas.pc $(psoftwarex11) $(psoftwarexcb) $(pdirectfb) $(pfb) \ + $(psoftwarebuffer) $(psoftwareqtopia) $(popenglx11) $(pcairox11) \ + $(pxrenderx11) $(pxrenderxcb) $(pglitzx11) $(psoftwareddraw) $(psoftwaresdl) \ + $(psoftware16x11) $(pdirect3d) $(psoftware16ddraw) $(psoftware16wince) $(popenglglew) diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/README.in b/README.in new file mode 100644 index 0000000..b0897f9 --- /dev/null +++ b/README.in @@ -0,0 +1,277 @@ +Evas @VERSION@ + +Evas is a clean display canvas API for several target display systems +that can draw anti-aliased text, smooth super and sub-sampled scaled +images, alpha-blend objects much and more. + +Requirements: +------------- + +Must: + libc libm freetype2.1.9+ + +Recommended: + libX11 libXext libXrender fontconfig libpng libjpeg eet libpthread + +Optional: + XCB SDL OpenGL Qtopia librsvg libtiff libgif edb DirectFB + +-------------------------------------------------------------------------- +Evas as of 0.9.9 has a new (and incompatible) API. Why? It's much cleaner +and more compact. Designed for portable access to different display systems. +It is also much more optimised internally, uses much less ram than previous +Evas libraries, and is tiny. Evas when compiled for the Ipaq is a grand +total of 191Kb (thats all of Evas minus libjpeg, libpng, libz (required for +libpng), and minus freetype (required for font rendering)). I have plans that +may involve having an alternative font engine other than freetype to minimise +requirements, and having a native (optional) image loader for an image +format that may end up being custom to evas, but will minimise code & +requirements especially for embedded use. + +Evas uses very little RAM too (try profiling it in memprof if you want to +know) most of the ram allocated, if you look, is for freetype itself, +image pixel data, and font glyph data. You can't really avoid this, though +evas tries to share this data as much as possible and not duplicate where it +can. Feel free to point me at sensible memory optimisations etc. though :) I +want this baby to be lean, mean tiny, fast and do everything from your +massive multi-cpu desktop with gobs of ram and disk to a tiny watch. + +Evas also supports full UTF-8 for text object strings, thus allowing for +full internationalised text strings (if your font gives you all the +characters). I've tested with quite a few fonts and it works quite well. +Though this requires a unicode compatible font with unicode charmap support +(cyberbit is quite good actually as a font). For now Evas draws the fonts +only from left to right, so arabic, hebrew etc. won't display quite right, +direction-wise, but the characters do. + +-------------------------------------------------------------------------- +if you want to know what options to enable +./configure --help + +Notes: + the small dither mask is faster on the ipaq, but is not as good looking. on + desktop machines it makes no speed difference so only use + --enable-small-dither-mask if you are compiling for the ipaq + you need at least 1 image loader if you want to load images. + gcc 3.0.x on solaris screws up the jpeg code so erroring out doesn't work. + use gcc 3.2 on solaris. + +-------------------------------------------------------------------------- +notes on features: + +SCALING: +--enable-scale-sample + +this enables the sampling scaler code. this is the fastest image scaling +code, but also the lowest quality. when scaling up pixels will become blocky +and when scaling down you will see shimmering/aliasing artifacts. this is a +speed vs. quality tradeoff + +--enable-scale-smooth + +this is the nicest looking scaler that is not that much slower than +tri-linear, but it looks really good. it also uses mipmaps and is optimised +heavily. it is recommended to always use this unless you are really +struggling for speed and are qilling to forego the quality + +DITHERING: +--enable-small-dither-mask + +this uses a 4x4 dither mask instead of 128x128. on desktop boxes these days +(pentium, pentium2, amd etc.) the speed difference is not really measurable, +but the quality of the 128x128 dither mask is quite a lot better. patterns +of dithering are much less noticable, so it is recommended to not enable +this unless you are struggling for speed. the compaq ipaq for example shows +a slowdown with this large a dither mask so enabling a small dither mask is +recommended unless you really want to forego the speed. + +ENGINES: +--enable-software-x11 + +this enables the software x11 rendering engine that renders to X drawable +targets using highly optimised software routines. there is no hardware +assist here. this engine requires X11 to be installed to build (and run). +This is a godo generic engine that is fast and can run in X for good +development and debugging purposes. + +--enable-software-xcb +this enable the software xcb rendering engine. It allows the same +features than the software x11 engine. It require the XCB and XCBImage +libraries. For the test programs, XCBICCCM is also needed. + +--enable-fb + +this is the software framebuffer driving engine. this uses the linux +framebuffer device (/dev/fb) and will currently just inherit the current +framebuffer settings on the fb device and use them to run in. this engine is +almost fully functional except for the fb management itself. i'd be quite +happy for people to help out with fixing up the fb init & management code to +properly set up a vt and release it etc. this engine is specifically geared +towards peoel writing minimalist display systems for embedded devices such +as the ipaq, zaurus, etc. it also scales up to high-res desktop systems as +well and performs outstandingly. i have measured up to 67% speedup over X11 +using the fb driver insetad of X11. + +--enable-direcfb + +this is the direct fb engine that uses direcftb (http://www.directfb.org) on +linux to access the framebuffer with (or maybe without) acceleration. for +people making set-top boxes or just wanting an alternative to X this is +really good. it may also be useful for embedded devices supported by +directfb that offer acceleration (otherwise the fb driver will likely be +faster). + +--enable-sdl + +this is the sdl engine that uses sdl library (http://www.libsdl.org). This +library should work on many operating system. + + +CPU: +--enable-cpu-c + +this enabled the c code. you can actually build the code withotu the c +fallback code and only have the mmx routines for example. it is suggested to +always use this regardless uness you have some definite size issues with the +code. + +--enable-cpu-mmx + +this enables the mmx optimised routines. this works for pentium, pentium2, +pentium3, pentium4, athlon and duron processors. it can get quite +considerable speedups, souse it if you can. ppc owners just have to live with +the c fallback functions unfortunately as no one has provided any ALTIVEC asm +routines yet. :) arm owners will also have to rely on the c fallback +routines as i haven't managed to come up with any arm assembly that actually +can beat the c code (when compiled with all optimisations) in speed. + +--enable-cpu-sse + +this enables sse optimizations availbale in he pentium3 and 4 cpus (not +athlon and duron or pentium 2 or pentium cpu's). ppc owners just have to +live with the c fallback functions unfortunately as no one has provided any +ALTIVEC asm routines yet. :) arm owners will also have to rely on the c +fallback routines as i haven't managed to come up with any arm assembly that +actually can beat the c code (when compiled with all optimizations) in speed. + +IMAGE LOADERS: +--enable-image-loader-png + +this enables the loader code that loads png files using libpng. there may be +call for embedded devices later that have custom written small image +loaders that uses less disk space than libpng to load custom format images. +for now this is the only loader so you may as well include it. + +--enable-image-loader-jpeg + +this enables the loader code that loads jpeg files using libjpeg. + +CONVERTERS: +--enable-convert-16-rgb-565 + +the most common converter you'll want for 16bpp. this means 5 bits for red, +6 bits for green and 5 bits for blue are used. + +--enable-convert-16-rgb-555 + +this is a converter for what many people know as "15 bit" color. you might +want to enable this for X output as it used to be common to find many cards +that do this. + +--enable-convert-16-rgb-444 + +this converter outputs to 12bit packed (int 16 bit WORDS). + +--enable-convert-16-rgb-ipq + +this converter was written specifically for the ipaq (and may apply to +similarly configured devices) because it lies about its screen depth. it +says it is 16bit 565 (that means 5 upper bits of the WORD are red, the next 6 +bits are for green abd the next 5 for blue) but in fact only the upper 4 +bits of each color component (red green and blue) are significant and work, +so effectively the display is 12 bits of color, not 16, but padded out to +fill 16bits, with unused bits in the color masks. X on the ipaq advertises +it as a full 16bpp 565 display (i can't remember what the linux framebuffer +advertised it as) and so many lumps of code can be fooled into rendering +data badly because they think the output will look as the expect. This +renderer assuems the upper 4 bits fo each color primitie only are +significant and renders accordingly. this produces nice quality images on +the ipaq and even still works in 16bpp 565 on your pc. it is highly +recommended to use this renderer if your target is an ipaq or your device +dislpays similar qualities of the ipaq for display purposes. + +--enable-convert-16-rgb-rot-0 + +this enables the 16bpp converters to run with 0 degrees rotation - this is +normal display and you should really include this (though it is optional if you +only ever want to do portrait mode - perhaps like on an ipaq embedded device) + +--enable-convert-16-rgb-rot-270 + +this enables the portrait mode (270 degree rotation) converteres for 16bpp. +this is the standard display mode for things like pocketpc on the ipaq and +the zaurus etc. thsi si a optimized part of the rendering pipeline to allow +portrait display with a much lower overhead than doing it through X. + +--enable-convert-24-rgb-888 + +To be documented... + +--enable-convert-24-bgr-888 + +To be documented... + +--enable-convert-32-rgb-8888 + +To be documented... + +--enable-convert-32-bgr-8888 + +To be documented... + +--enable-convert-32-rgb-rot-0 + +To be documented... + +--enable-convert-32-rgb-rot-270 + +To be documented... + +... + + +------------------------------------------------------------------------------ +COMPILING AND INSTALLING: + + ./configure + make +(as root unless youa re installing in your users directories): + make install + +------------------------------------------------------------------------------ +BUILDING PACKAGES: + +RPM: To build rpm packages: + + sudo rpm -ta @PACKAGE@-@VERSION@.tar.gz + +You will find rpm packages in your system /usr/src/redhat/* dirs (note you may +not need to use sudo or root if you have your own ~/.rpmrc. see rpm documents +for more details) + +DEB: To build deb packages: + + tar zvf @PACKAGE@-@VERSION@.tar.gz + cd @PACKAGE@-@VERSION@ + dpkg-buildpackage -us -uc -rfakeroot + cd .. + rm -rf @PACKAGE@-@VERSION@ + +You will find all the debian source, binary etc. packages put in the directory +where you first untarred the source tarball. + + +NOTES: + +For the arm optimizations you want to try: + export CFLAGS="-O2 -march=armv5te -mcpu=arm1136jf-s -fomit-frame-pointer" diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..995ff2f --- /dev/null +++ b/autogen.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +rm -rf autom4te.cache +rm -f aclocal.m4 ltmain.sh + +touch README + +echo "Running aclocal..." ; aclocal $ACLOCAL_FLAGS -I m4 || exit 1 +echo "Running autoheader..." ; autoheader || exit 1 +echo "Running autoconf..." ; autoconf || exit 1 +echo "Running libtoolize..." ; (libtoolize --copy --automake || glibtoolize --automake) || exit 1 +echo "Running automake..." ; automake --add-missing --copy --gnu || exit 1 + +if [ -z "$NOCONFIGURE" ]; then + ./configure "$@" +fi diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..e5a3e1d --- /dev/null +++ b/configure.in @@ -0,0 +1,1850 @@ +# get rid of that stupid cache mechanism +rm -f config.cache + +AC_INIT(evas, 0.9.9.043, enlightenment-devel@lists.sourceforge.net) +AC_PREREQ(2.52) +AC_CONFIG_SRCDIR(configure.in) +AC_CANONICAL_BUILD +AC_CANONICAL_HOST +AC_ISC_POSIX + +AM_INIT_AUTOMAKE(1.6 dist-bzip2) +AM_CONFIG_HEADER(config.h) + +AC_PROG_CXX +AC_PROG_CC +AM_PROG_CC_STDC +AC_HEADER_STDC +AC_C_BIGENDIAN +AC_C_CONST + +AC_LIBTOOL_WIN32_DLL +define([AC_LIBTOOL_LANG_F77_CONFIG], [:])dnl +AC_PROG_LIBTOOL + +VMAJ=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $1);}'` +VMIN=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $2);}'` +VMIC=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $3);}'` +SNAP=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $4);}'` +version_info=`expr $VMAJ + $VMIN`":$VMIC:$VMIN" +AC_SUBST(version_info) + +LT_PROG_RC +AC_FUNC_ALLOCA + +MODULE_ARCH="$host_os-$host_cpu" +AC_SUBST(MODULE_ARCH) +AC_DEFINE_UNQUOTED(MODULE_ARCH, "$MODULE_ARCH", "Module architecture") + +PKG_PROG_PKG_CONFIG + +WIN32_CFLAGS="" +lt_no_undefined="" +lt_enable_auto_import="" +case "$host_os" in + mingw*|cegcc*) + PKG_CHECK_MODULES(EVIL, evil) + AC_DEFINE(HAVE_EVIL, 1, [Set to 1 if evil package is installed]) + dnl needed for correct definition of EAPI + AC_DEFINE(EFL_EVAS_BUILD, 1, [Define to mention that evas is built]) + if test "$host_os" = "cegcc" ; then + WIN32_CFLAGS="-mwin32" + lt_enable_auto_import="-Wl,--enable-auto-import" + fi + lt_no_undefined="-no-undefined" + ;; +esac +AC_SUBST(WIN32_CFLAGS) +AC_SUBST(lt_no_undefined) +AC_SUBST(lt_enable_auto_import) + +x_dir="" +x_cflags="" +x_libs="" +gl_dir="" +gl_cflags="" +gl_libs="" +qt_dir="" +qt_cflags="" +qt_libs="" +qt_moc="moc" + +dnl when used, that option makes configure script fails when +dnl a requirement is selected, but not met. +AC_ARG_ENABLE(strict, + AC_HELP_STRING( + [enable strict mode]), + [use_strict="yes"], + [use_strict="no"] +) + + +##################################################################### + +# blah-config style checks +# qtdir setting +AC_ARG_WITH(qtdir, +AC_HELP_STRING([--with-qtdir=QT_DIR], [use qt directory specified]), +[ + qt_dir=$withval; + echo "using "$qt_dir" for qt directory."; +], [ + qt_dir="/opt/Qtopia"; +]) + +# check for freetype +PKG_CHECK_MODULES(FREETYPE, freetype2 >= 9.3.0) + +####################################### +## Simple X11 build/link + +AC_ARG_ENABLE(simple-x11, + AC_HELP_STRING([--enable-simple-x11], [enable simple x11 linking]), + [ want_evas_simple_x11=$enableval ] +) + +####################################### +## FontConfig + +want_fontconfig="auto" +have_fontconfig="no" +AC_ARG_ENABLE(fontconfig, + AC_HELP_STRING( + [--disable-fontconfig], + [disable fontconfig for finding fonts. [[default=enabled]]] + ), + [ want_fontconfig=$enableval ] +) + +if test "x$want_fontconfig" = "xyes" -o "x$want_fontconfig" = "xauto" ; then + # Check if really available + PKG_CHECK_MODULES(FONTCONFIG, fontconfig, + [ + have_fontconfig="yes" + AC_DEFINE(HAVE_FONTCONFIG, 1, [have fontconfig searching capabilities]) + ], + [ + if test "x$want_fontconfig" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([Fontconfig not found (strict dependencies checking)]) + fi + ]) +fi + +############### +## dlopen + +dlopen_libs="" +case "$host_os" in + mingw32ce*|cegcc*) +dnl managed by evil + AC_DEFINE(HAVE_DLADDR) + ;; + mingw*) +dnl nothing on mingw platform + ;; + *) + AC_CHECK_FUNCS(dlopen, res=yes, res=no) + if test "x$res" = "xyes"; then + AC_CHECK_FUNCS(dladdr, AC_DEFINE(HAVE_DLADDR)) + else + AC_CHECK_LIB(dl, dlopen, res=yes, res=no) + if test "x$res" = "xyes"; then + AC_CHECK_LIB(dl, dladdr, AC_DEFINE(HAVE_DLADDR)) + dlopen_libs=-ldl + else + AC_MSG_ERROR(Cannot find dlopen) + fi + fi +esac +AC_SUBST(dlopen_libs) + +AC_CHECK_HEADER(fnmatch.h, , AC_MSG_ERROR([Cannot find fnmatch.h. Make sure your CFLAGS environment variable contains include lines for the location of this file. MinGW users: see the INSTALL file])) + +fnmatch_libs="" +AC_CHECK_FUNCS(fnmatch, res=yes, res=no) +if test "x$res" = "xno"; then + AC_CHECK_LIB(fnmatch, fnmatch, res=yes fnmatch_libs="-lfnmatch", res=no) + dnl Test for compilation with MinGW. + dnl fnmatch function is in the libiberty library + if test "x$res" = "xno"; then + AC_CHECK_LIB(iberty, fnmatch, res=yes fnmatch_libs="-liberty", res=no) + fi + if test "x$res" = "xno"; then + AC_MSG_ERROR([Cannot find fnmatch() in neither libc nor libfnmatch, nor libiberty]) + fi +fi + +AC_SUBST(fnmatch_libs) + +##################################################################### +## Engines + +####################################### +## Check if we should build the software_ddraw engine +want_evas_software_ddraw="auto"; +have_evas_software_ddraw="no"; + +AC_MSG_CHECKING(whether software directdraw backend is to be built) +AC_ARG_ENABLE(software-ddraw, + AC_HELP_STRING([--enable-software-ddraw], [enable the Software DirectDraw rendering backend]), + [ want_evas_software_ddraw=$enableval ] +) +AC_MSG_RESULT($want_evas_software_ddraw) + +if test "x$want_evas_software_ddraw" = "xyes" -o "x$want_evas_software_ddraw" = "xauto" ; then + AC_CHECK_HEADER(ddraw.h, + [ + have_evas_software_ddraw="yes" + AC_DEFINE(BUILD_ENGINE_SOFTWARE_DDRAW, 1, [Software DirectDraw Rendering Backend]) + ddraw_libs="-lddraw" + ], + [ + if test "x$want_evas_software_ddraw" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([DirectDraw not found (strict dependencies checking)]) + fi + ] + ) +fi +AC_MSG_CHECKING(whether software directdraw backend will be built) +AC_MSG_RESULT($have_evas_software_ddraw) +AM_CONDITIONAL(BUILD_ENGINE_SOFTWARE_DDRAW, test "x$have_evas_software_ddraw" = "xyes") + +####################################### +## Check if we should build the 16bit software_ddraw engine +want_evas_software_16_ddraw="auto"; +have_evas_software_16_ddraw="no"; + +AC_MSG_CHECKING(whether 16 bit software directdraw backend is to be built) +AC_ARG_ENABLE(software-16-ddraw, + AC_HELP_STRING([--enable-software-16-ddraw], [enable the 16bit Software DirectDraw rendering backend]), + [ want_evas_software_16_ddraw=$enableval ] +) +AC_MSG_RESULT($want_evas_software_16_ddraw) + +if test "x$want_evas_software_16_ddraw" = "xyes" -o "x$want_evas_software_16_ddraw" = "xauto"; then + AC_CHECK_HEADER(ddraw.h, + [ + AC_DEFINE(BUILD_ENGINE_SOFTWARE_16_DDRAW, 1, [16bit Software DirectDraw Rendering Backend]) + ddraw_16_libs="-lddraw -lgdi32" + have_evas_software_16_ddraw="yes" + ], + [ + if test "x$want_evas_software_16_ddraw" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([DirectDraw not found (strict dependencies checking)]) + fi + ] + ) +fi +AC_MSG_CHECKING(whether 16 bits software directdraw backend will be built) +AC_MSG_RESULT($have_evas_software_16_ddraw) +AM_CONDITIONAL(BUILD_ENGINE_SOFTWARE_16_DDRAW, test "x$have_evas_software_16_ddraw" = "xyes") + + +####################################### +## Check if we should build the direct3d engine +want_evas_direct3d="auto"; +have_evas_direct3d="no"; + +AC_MSG_CHECKING(whether direct3d backend is to be built) +AC_ARG_ENABLE(direct3d, + AC_HELP_STRING([--enable-direct3d], [enable the Direct3D rendering backend]), + [ want_evas_direct3d=$enableval ] +) +AC_MSG_RESULT($want_evas_direct3d) + +if test "x$want_evas_direct3d" = "xyes"; then + AC_CHECK_HEADERS(d3d9.h d3dx9.h, + [ + AC_DEFINE(BUILD_ENGINE_DIRECT3D, 1, [Direct3D Rendering Backend]) + direct3d_libs="-ld3d9 -ld3dx9d" + have_evas_direct3d="yes" + ], + [ + if test "x$want_evas_direct3d" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([Direct3D not found (strict dependencies checking)]) + fi + ] + ) +fi +AC_MSG_CHECKING(whether direct3d backend will be built) +AC_MSG_RESULT($have_evas_direct3d) +AM_CONDITIONAL(BUILD_ENGINE_DIRECT3D, test "x$have_evas_direct3d" = "xyes") + + +####################################### +## Check if we should build the 16bit software_wince engine +want_evas_software_16_wince="auto"; +have_evas_software_16_wince="no"; + +AC_MSG_CHECKING(whether 16 bit software WinCE backend is to be built) +AC_ARG_ENABLE(software-16-wince, + AC_HELP_STRING([--enable-software-16-wince], [enable the 16bit Software WinCE rendering backend]), + [ want_evas_software_16_wince=$enableval ] +) +AC_MSG_RESULT($want_evas_software_16_wince) + +if test "x$want_evas_software_16_wince" = "xyes" -o "x$want_evas_software_16_wince" = "xauto"; then + AC_CHECK_HEADER(windows.h, + [ + AC_DEFINE(BUILD_ENGINE_SOFTWARE_16_WINCE, 1, [16bit Software WinCE Rendering Backend]) + wince_16_libs="" + have_evas_software_16_wince="yes" + ], + [ + if test "x$want_evas_software_16_wince" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([WinCE not found (strict dependencies checking)]) + fi + ] + ) +fi +AC_MSG_CHECKING(whether 16 bits software WinCE backend will be built) +AC_MSG_RESULT($have_evas_software_16_wince) +AM_CONDITIONAL(BUILD_ENGINE_SOFTWARE_16_WINCE, test "x$have_evas_software_16_wince" = "xyes") + + +####################################### +## Check if we should build the software_x11 engine +want_evas_software_x11="auto"; +have_evas_software_x11="no"; + +AC_MSG_CHECKING(whether software x11 backend is to be built) +AC_ARG_ENABLE(software-x11, + AC_HELP_STRING([--disable-software-x11], [disable the Software X11 rendering backend]), + [ want_evas_software_x11=$enableval ] +) +AC_MSG_RESULT($want_evas_software_x11) + +if test "x$want_evas_software_x11" = "xyes" -o "x$want_evas_software_x11" = "xauto"; then + AC_PATH_X + AC_PATH_XTRA + AC_CHECK_HEADER(X11/X.h, + [ + AC_DEFINE(BUILD_ENGINE_SOFTWARE_X11, 1, [Software X11 Rendering Backend]) + if test "x$want_evas_simple_x11" = "xyes"; then + x_libs="${x_libs} -lX11 -lXext" + else + x_dir=${x_dir:-/usr/X11R6} + x_cflags=${x_cflags:--I${x_includes:-$x_dir/include}} + x_libs="${x_libs:--L${x_libraries:-$x_dir/lib}} -lX11 -lXext" + fi + have_evas_software_x11="yes" + ], + [ + if test "x$want_evas_software_x11" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([X11 not found (strict dependencies checking)]) + fi + ] + ) +fi +AM_CONDITIONAL(BUILD_ENGINE_SOFTWARE_X11, test "x$have_evas_software_x11" = "xyes") + +####################################### +## Check if we should build the software_x11 16bit engine +want_evas_software_16_x11="no"; +have_evas_software_16_x11="no"; + +AC_MSG_CHECKING(whether software 16bit x11 backend is to be built) +AC_ARG_ENABLE(software-16-x11, + AC_HELP_STRING([--enable-software-16-x11], [enable the Software 16bit X11 rendering backend]), + [ want_evas_software_16_x11=$enableval ] +) +AC_MSG_RESULT($want_evas_software_16_x11) + +if test "x$want_evas_software_16_x11" = "xyes"; then + AC_PATH_X + AC_PATH_XTRA + AC_CHECK_HEADER(X11/X.h, + [ + AC_DEFINE(BUILD_ENGINE_SOFTWARE_16_X11, 1, [Software 16bit X11 Rendering Backend]) + if test "x$want_evas_simple_x11" = "xyes"; then + x_libs="${x_libs} -lX11 -lXext" + else + x_dir=${x_dir:-/usr/X11R6} + x_cflags=${x_cflags:--I${x_includes:-$x_dir/include}} + x_libs="${x_libs:--L${x_libraries:-$x_dir/lib}} -lX11 -lXext" + fi + have_evas_software_16_x11="yes" + ], + [ + if test "x$want_evas_sofware_16_x11" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([X11 not found (strict dependencies checking)]) + fi + ] + ) +fi +AM_CONDITIONAL(BUILD_ENGINE_SOFTWARE_16_X11, test "x$have_evas_software_16_x11" = "xyes") + +####################################### +## Check if we should build the software_xcb engine +want_evas_software_xcb="no"; +have_evas_software_xcb="no"; + +AC_MSG_CHECKING(whether software xcb backend is to be built) +AC_ARG_ENABLE(software-xcb, + AC_HELP_STRING([--enable-software-xcb], [enable the Software XCB rendering backend]), + [ want_evas_software_xcb=$enableval ] +) +AC_MSG_RESULT($want_evas_software_xcb) + +if test "x$want_evas_software_xcb" = "xyes"; then + PKG_CHECK_MODULES( + XCB, + xcb xcb-shm xcb-image pixman-1, + [ + AC_DEFINE(BUILD_ENGINE_SOFTWARE_XCB, 1, [Software XCB Rendering Backend]) + have_evas_software_xcb="yes" + ], + [ + if test "x$want_evas_software_xcb" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([XCB not found (strict dependencies checking)]) + fi + ] + ) +fi +AM_CONDITIONAL(BUILD_ENGINE_SOFTWARE_XCB, test "x$have_evas_software_xcb" = "xyes") + +####################################### +## Check if we should build the directfb engine +#want_evas_directfb="no"; +#have_evas_directfb="no"; +# +#AC_MSG_CHECKING(whether directfb backend is to be built) +#AC_ARG_ENABLE(directfb, +# AC_HELP_STRING([--enable-directfb], [enable the DirectFB rendering backend]), +# [ want_evas_directfb=$enableval ] +#) +#AC_MSG_RESULT($want_evas_directfb) +# +#if test "x$want_evas_directfb" = "xyes"; then +# PKG_CHECK_MODULES(DIRECTFB, directfb >= 0.9.16, +# [ +# AC_DEFINE(BUILD_ENGINE_DIRECTFB, 1, [DirectFB Rendering Backend]) +# have_evas_directfb="yes" +# ], +# [ +# if test "x$want_evas_directfb" = "xyes" -a "x$use_strict" = "xyes" ; then +# AC_MSG_ERROR([DirectFB not found (strict dependencies checking)]) +# fi +# ] +# ) +#fi +#AM_CONDITIONAL(BUILD_ENGINE_DIRECTFB, test "x$have_evas_directfb" = "xyes") + +####################################### +## Check if we should build the sdl engine +want_evas_sdl="no"; +have_evas_sdl="no"; +ENGINE_SDL_PRG=""; + +AC_MSG_CHECKING(whether SDL backend is to be built) +AC_ARG_ENABLE(sdl, + AC_HELP_STRING([--enable-sdl], [enable the SDL rendering backend]), + [ want_evas_sdl=$enableval ] +) +AC_MSG_RESULT($want_evas_sdl) + +if test "x$want_evas_sdl" = "xyes"; then + PKG_CHECK_MODULES(SDL, sdl >= 1.2.0, + [ + have_evas_sdl="yes" + ENGINE_SDL_PRG="evas_sdl_test" + AC_DEFINE(BUILD_ENGINE_SDL, 1, [SDL Rendering Backend]) + ], + [ + if test "x$want_evas_sdl" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([Sdl not found (strict dependencies checking)]) + fi + ] + ) +fi +AM_CONDITIONAL(BUILD_ENGINE_SDL, test "x$have_evas_sdl" = "xyes") + +## Check if we want to use some SDL primitive +sdl_primitive="no"; + +AC_MSG_CHECKING(whether to use SDL primitive when possible) +AC_ARG_ENABLE(sdl-primitive, + AC_HELP_STRING([--enable-sdl-primitive], []), + [ sdl_primitive=$enableval ] +) +AC_MSG_RESULT($sdl_primitive) + +if test "x$sdl_primitive" = "xyes"; then + AC_DEFINE(ENGINE_SDL_PRIMITIVE, 1, [Use SDL primitive when possible]) +fi + +####################################### +## Check if we should build the fb engine +want_evas_fb="no"; +have_evas_fb="no"; + +AC_MSG_CHECKING(whether fb backend is to be built) +AC_ARG_ENABLE(fb, + AC_HELP_STRING([--enable-fb], [enable the FB rendering backend]), + [ want_evas_fb=$enableval ] +) +AC_MSG_RESULT($want_evas_fb) + +if test "x$want_evas_fb" = "xyes"; then + AC_CHECK_HEADER(linux/fb.h, + [ + AC_DEFINE(BUILD_ENGINE_FB, 1, [Linux FB Rendering Backend]) + have_evas_fb="yes" + ], + [ + if test "x$want_evas_fb" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([FB not found (strict dependencies checking)]) + fi + ] + ) +fi +AM_CONDITIONAL(BUILD_ENGINE_FB, test "x$have_evas_fb" = "xyes") + +####################################### +## Check if we should build the buffer engine +want_evas_buffer="yes" +have_evas_buffer="no" + +AC_MSG_CHECKING(whether buffer backend is to be built) +AC_ARG_ENABLE(buffer, + AC_HELP_STRING([--disable-buffer], [disable the Buffer rendering backend]), + [ want_evas_buffer=$enableval ] +) +AC_MSG_RESULT($want_evas_buffer) + +if test "x$want_evas_buffer" = "xyes"; then + AC_DEFINE(BUILD_ENGINE_BUFFER, 1, [Buffer Rendering Backend]) + have_evas_buffer="yes" +fi +AM_CONDITIONAL(BUILD_ENGINE_BUFFER, test "x$have_evas_buffer" = "xyes") + +####################################### +## Check if we should build the software_qtopia engine +want_evas_qtopia="no"; +have_evas_qtopia="no"; + +AC_MSG_CHECKING(whether software qtopia backend is to be built) +AC_ARG_ENABLE(software-qtopia, + AC_HELP_STRING([--enable-software-qtopia], [enable the Software Qtopia rendering backend]), + [ want_evas_qtopia=$enableval ] +) +AC_MSG_RESULT($want_evas_qtopia) + +if test "x$want_evas_qtopia" = "xyes"; then + AC_LANG_PUSH(C++) + AC_CHECK_HEADER(qdirectpainter_qws.h, + [ + AC_DEFINE(BUILD_ENGINE_SOFTWARE_QTOPIA, 1, [Qtopia Rendering Backend]) + qt_cflags="-fno-exceptions -fno-rtti -I"$qt_dir"/include" + qt_libs="-L"$qt_dir"/lib -lqte -lqpe" + qt_moc=$qt_dir"/bin/moc" + have_evas_qtopia="yes" + ], + [ + if test "x$want_evas_qtopia" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([Qtopia not found (strict dependencies checking)]) + fi + ], + [ + #include + #include + #include + #include + ] + ) + AC_LANG_POP(C++) +fi +AM_CONDITIONAL(BUILD_ENGINE_SOFTWARE_QTOPIA, test "x$have_evas_qtopia" = "xyes") + +####################################### +## Check if we should build the gl_x11 engine +want_evas_gl_x11="no"; +have_evas_gl_x11="no"; + +AC_MSG_CHECKING(whether gl x11 backend is to be built) +AC_ARG_ENABLE(gl-x11, + AC_HELP_STRING([--enable-gl-x11], [enable the OpenGL X11 display engine]), + [ want_evas_gl_x11=$enableval ] +) +AC_MSG_RESULT($want_evas_gl_x11) + +if test "x$want_evas_gl_x11" = "xyes"; then + AC_PATH_X + AC_PATH_XTRA + AC_CHECK_HEADERS(GL/gl.h GL/glu.h X11/X.h, + [ + AC_DEFINE(BUILD_ENGINE_GL_X11, 1, [OpenGL X11 Rendering Backend]) + if test "x$want_evas_simple_x11" = "xyes"; then + x_libs="${x_libs} -lX11 -lXext" + else + x_dir=${x_dir:-/usr/X11R6} + x_cflags=${x_cflags:--I${x_includes:-$x_dir/include}} + x_libs="${x_libs:--L${x_libraries:-$x_dir/lib}} -lX11 -lXext" + gl_cflags="-I/usr/include" + fi + gl_libs="-lGL -lGLU -lpthread" + gl_dir="" + have_evas_gl_x11="yes" + ], + [ + if test "x$want_evas_gl_x11" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([OpenGL X11 not found (strict dependencies checking)]) + fi + ] + ) +fi +AM_CONDITIONAL(BUILD_ENGINE_GL_X11, test "x$have_evas_gl_x11" = "xyes") + +####################################### +## Check if we should build the gl_glew engine +want_evas_gl_glew="no"; +have_evas_gl_glew="no"; + +AC_MSG_CHECKING(whether gl glew backend is to be built) +AC_ARG_ENABLE(gl-glew, + AC_HELP_STRING([--enable-gl-glew], [enable the OpenGL Glew display engine]), + [ want_evas_gl_glew=$enableval ] +) +AC_MSG_RESULT($want_evas_gl_glew) + +if test "x$want_evas_gl_glew" = "xyes" -o "x$want_evas_gl_glew" = "xauto"; then + AC_CHECK_HEADERS(GL/gl.h GL/glu.h GL/glew.h, + [ + AC_DEFINE(BUILD_ENGINE_GL_GLEW, 1, [OpenGL Glew Rendering Backend]) + glew_libs="-lglew32 -lopengl32 -lgdi32" + gl_libs="-lglu32" + have_evas_gl_glew="yes" + ], + [ + if test "x$want_evas_gl_glew" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([OpenGL Glew not found (strict dependencies checking)]) + fi + ] + ) +fi +AC_MSG_CHECKING(whether gl glew backend will be built) +AC_MSG_RESULT($have_evas_gl_glew) +AM_CONDITIONAL(BUILD_ENGINE_GL_GLEW, test "x$have_evas_gl_glew" = "xyes") + +# common gl +have_evas_gl_common="no" +if test "x$have_evas_gl_x11" = "xyes" -o "x$have_evas_gl_glew" = "xyes"; then + AC_DEFINE(BUILD_ENGINE_GL_COMMON, 1, [Generic OpenGL Rendering Support]) + have_evas_gl_common="yes" +fi +AM_CONDITIONAL(BUILD_ENGINE_GL_COMMON, test "x$have_evas_gl_common" = "xyes") + +####################################### +## Check if we should build the cairo_x11 engine +have_evas_cairo_common="no"; +want_evas_cairo_x11="no"; +have_evas_cairo_x11="no"; + +#AC_MSG_CHECKING(whether cairo x11 backend is to be built) +#AC_ARG_ENABLE(cairo-x11, +# AC_HELP_STRING([--enable-cairo-x11], [enable the Cairo X11 display engine]), +# [ want_evas_cairo_x11=$enableval ] +#) +#AC_MSG_RESULT($want_evas_cairo_x11) + +if test "x$want_evas_cairo_x11" = "xyes"; then + PKG_CHECK_MODULES(CAIRO, cairo >= 1.0.0, + [ + have_evas_cairo_common="yes" + AC_CHECK_HEADER(X11/X.h, + [ + AC_DEFINE(BUILD_ENGINE_CAIRO_X11, 1, [Cairo X11 Rendering Backend]) + AC_DEFINE(BUILD_ENGINE_CAIRO_COMMON, 1, [Generic Cairo Rendering Support]) + if test "x$want_evas_simple_x11" = "xyes"; then + x_libs="${x_libs} -lX11 -lXext" + else + x_dir=${x_dir:-/usr/X11R6} + x_cflags=${x_cflags:--I${x_includes:-$x_dir/include}} + x_libs="${x_libs:--L${x_libraries:-$x_dir/lib}} -lX11 -lXext" + fi + have_evas_cairo_x11="yes" + ], [ + have_evas_cairo_common="no" + have_evas_cairo_x11="no" + ] + ) + ], + [ + have_evas_cairo_common="no" + have_evas_cairo_x11="no" + ] + ) +fi +AM_CONDITIONAL(BUILD_ENGINE_CAIRO_X11, test "x$have_evas_cairo_x11" = "xyes") +AM_CONDITIONAL(BUILD_ENGINE_CAIRO_COMMON, test "x$have_evas_cairo_common" = "xyes") + +####################################### +## Check if we should build the xrender_x11 engine +want_evas_xrender_x11="auto"; +have_evas_xrender_x11="no"; + +AC_MSG_CHECKING(whether xrender x11 backend is to be built) +AC_ARG_ENABLE(xrender-x11, + AC_HELP_STRING([--disable-xrender-x11], [disable the XRender X11 rendering backend]), + [ want_evas_xrender_x11=$enableval ] +) +AC_MSG_RESULT($want_evas_xrender_x11) + +if test "x$want_evas_xrender_x11" = "xyes" -o "x$want_evas_xrender_x11" = "xauto"; then + AC_PATH_X + AC_PATH_XTRA + AC_CHECK_HEADERS(X11/X.h X11/extensions/Xrender.h, + [ + AC_DEFINE(BUILD_ENGINE_XRENDER_X11, 1, [XRender X11 Rendering Backend]) + if test "x$want_evas_simple_x11" = "xyes"; then + x_libs="${x_libs} -lX11 -lXext" + else + x_dir=${x_dir:-/usr/X11R6} + x_cflags=${x_cflags:--I${x_includes:-$x_dir/include}} + x_libs="${x_libs:--L${x_libraries:-$x_dir/lib}} -lX11 -lXext" + fi + have_evas_xrender_x11="yes" + ], + [ + if test "x$want_evas_xrender_x11" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([XRender X11 not found (strict dependencies checking)]) + fi + ] + ) +fi +AM_CONDITIONAL(BUILD_ENGINE_XRENDER_X11, test "x$have_evas_xrender_x11" = "xyes") + +####################################### +## Check if we should build the xrender_xcb engine +want_evas_xrender_xcb="no"; +have_evas_xrender_xcb="no"; + +AC_MSG_CHECKING(whether xrender xcb backend is to be built) +AC_ARG_ENABLE(xrender-xcb, + AC_HELP_STRING([--enable-xrender-xcb], [enable the Xrender XCB rendering backend]), + [ want_evas_xrender_xcb=$enableval ] +) +AC_MSG_RESULT($want_evas_xrender_xcb) + +if test "x$want_evas_xrender_xcb" = "xyes"; then + PKG_CHECK_MODULES( + XCBRENDER, + xcb xcb-shm xcb-render xcb-image, + [ + AC_DEFINE(BUILD_ENGINE_XRENDER_XCB, 1, [Xrender XCB Rendering Backend]) + have_evas_xrender_xcb="yes" + ], + [ + if test "x$want_evas_xrender_xcb" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([XRender XCB not found (strict dependencies checking)]) + fi + ] + ) +fi +AM_CONDITIONAL(BUILD_ENGINE_XRENDER_XCB, test "x$have_evas_xrender_xcb" = "xyes") + +####################################### +## Check if we should build the glitz_x11 engine +want_evas_glitz_x11="no"; +have_evas_glitz_x11="no"; + +AC_MSG_CHECKING(whether glitz x11 backend is to be built) +AC_ARG_ENABLE(glitz-x11, + AC_HELP_STRING([--enable-glitz-x11], [enable the Glitz X11 rendering backend]), + [ want_evas_glitz_x11=$enableval ] +) +AC_MSG_RESULT($want_evas_glitz_x11) + +if test "x$want_evas_glitz_x11" = "xyes"; then + AC_PATH_X + AC_PATH_XTRA + AC_CHECK_HEADER(X11/X.h, + [ + PKG_CHECK_MODULES(GLITZ, glitz glitz-glx, + [ + if test "x$want_evas_simple_x11" = "xyes"; then + x_libs="${x_libs} -lX11 -lXext" + else + x_dir=${x_dir:-/usr/X11R6} + x_cflags=${x_cflags:--I${x_includes:-$x_dir/include}} + x_libs="${x_libs:--L${x_libraries:-$x_dir/lib}} -lX11 -lXext" + fi + AC_DEFINE(BUILD_ENGINE_GLITZ_X11, 1, [Glitz X11 Rendering Backend]) + have_evas_glitz_x11="yes" + ], + [ + if test "x$want_evas_glitz_gl_x11" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([Glitz X11 not found (strict dependencies checking)]) + fi + ] + ) + ], + [ + if test "x$want_evas_glitz_gl_x11" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([Glitz X11 not found (strict dependencies checking)]) + fi + ] + ) +fi +AM_CONDITIONAL(BUILD_ENGINE_GLITZ_X11, test "x$have_evas_glitz_x11" = "xyes") + +##################################################################### +## Image loaders + +####################################### +## GIF +want_gif="auto"; +have_gif="no"; + +AC_MSG_CHECKING(whether to enable gif image loader) +AC_ARG_ENABLE(image-loader-gif, + AC_HELP_STRING([--disable-image-loader-gif], [disable GIF image loader]), + [ want_gif=$enableval ] +) +AC_MSG_RESULT($want_gif) + +if test "x$want_gif" = "xyes" -o "x$want_gif" = "xauto"; then + AC_CHECK_HEADER(gif_lib.h, + [ + AC_CHECK_LIB(gif, DGifOpenFileName, + [ + gif_libs="-lgif" + have_gif="yes" + ], + [ + AC_CHECK_LIB(ungif, DGifOpenFileName, + [ + gif_libs="-lungif" + have_gif="yes" + ], + [ have_gif="no" ] + ) + ] + ) + ], + [ have_gif="no" ] + ) +fi + +if test "x$have_gif" = "xyes"; then + AC_DEFINE(BUILD_LOADER_GIF, 1, [GIF Image Loader Support]) + gif_cflags="" +else + if test "x$want_gif" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([GIF not found (strict dependencies checking)]) + fi +fi + +AM_CONDITIONAL(BUILD_LOADER_GIF, test "x$have_gif" = "xyes") + +####################################### +## PNG +want_png="auto"; +have_png="no"; + +AC_MSG_CHECKING(whether to enable png image loader) +AC_ARG_ENABLE(image-loader-png, + AC_HELP_STRING([--disable-image-loader-png], [disable PNG image loader]), + [ want_png=$enableval ] +) +AC_MSG_RESULT($want_png) + +if test "x$want_png" = "xyes" -o "x$want_png" = "xauto"; then + PKG_CHECK_EXISTS(libpng12, + [ PKG_CHECK_MODULES(PNG, libpng12, [ have_png="yes" ], [ have_png="no"]) ], + [ + PKG_CHECK_EXISTS(libpng10, + [ PKG_CHECK_MODULES(PNG, libpng10, [ have_png="yes" ], [ have_png="no"]) ], + [ PKG_CHECK_MODULES(PNG, libpng, [ have_png="yes" ], [ have_png="no"]) ] + ) + ] + ) +fi + +if test "x$want_png" = "xyes" -a ! "x$have_png" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([PNG not found (strict dependencies checking)]) +fi + +AM_CONDITIONAL(BUILD_LOADER_PNG, test "x$have_png" = "xyes") + +####################################### +## JPEG +want_jpeg="auto"; +have_jpeg="no"; + +AC_MSG_CHECKING(whether to enable jpeg image loader) +AC_ARG_ENABLE(image-loader-jpeg, + AC_HELP_STRING([--disable-image-loader-jpeg], [disable JPEG image loader]), + [ want_jpeg=$enableval ] +) +AC_MSG_RESULT($want_jpeg) + +if test "x$want_jpeg" = "xyes" -o "x$want_jpeg" = "xauto"; then + AC_CHECK_HEADER(jpeglib.h, + [ + AC_DEFINE(BUILD_LOADER_JPEG, 1, [JPEG Image Loader Support]) + jpeg_cflags="" + jpeg_libs="-ljpeg" + have_jpeg="yes" + have_jpeg_saver="yes" + ], + [ + if test "x$want_jpeg" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR(JPEG not found (strict dependencies checking)) + fi + ] + ) +fi +dnl Windows has no sigsetjmp function, nor equivalent. +dnl So we disable the jpeg saver. +case "$host_os" in + mingw*|cegcc*) + have_jpeg_saver="no" + ;; +esac +AM_CONDITIONAL(BUILD_LOADER_JPEG, test "x$have_jpeg" = "xyes") +AM_CONDITIONAL(BUILD_SAVER_JPEG, test "x$have_jpeg_saver" = "xyes") + +####################################### +## EET +# +# first, check whether the user WANTS to use EET +want_eet_image_loader="auto" +want_eet_font_loader="auto" +have_eet=no +AC_ARG_ENABLE(image-loader-eet, + AC_HELP_STRING( + [--disable-image-loader-eet], + [disable EET image loader. [[default=enabled]]] + ), + [want_eet_image_loader=$enableval] +) + +AC_ARG_ENABLE(font-loader-eet, + AC_HELP_STRING( + [--disable-font-loader-eet], + [disable EET font loader. [[default=enabled]]] + ), + [want_eet_font_loader=$enableval] +) + +# next, if she does, check whether EET is available +if test "x$want_eet_image_loader" = "xyes" -o "x$want_eet_font_loader" = "xyes" -o "x$want_eet_image_loader" = "xauto" -o "x$want_eet_font_loader" = "xauto"; then + PKG_CHECK_MODULES(EET, eet >= 1.0.1, [have_eet="yes"], + [ + if test "x$want_eet_image_loader" = "xyes" -a "x$use_strict" = "xyes" -o "x$want_eet_font_loader" = "xyes" -a "x$use_strict" = "xyes"; then + AC_MSG_ERROR([EET not found (strict dependencies checking)]) + fi + ] + ) +fi + +# finally, spew out the result +AC_MSG_CHECKING(whether to enable eet font loader) +if test "x$want_eet_font_loader" = "xyes" -o "x$want_eet_font_loader" = "xauto" -a "x$have_eet" = "xyes"; then + AC_DEFINE(BUILD_FONT_LOADER_EET, 1, [EET Font Loader Support]) + have_eet_font_loader="yes" +else + have_eet_font_loader="no" +fi +AC_MSG_RESULT($have_eet_font_loader) + +AC_MSG_CHECKING(whether to enable eet image loader) +if test "x$want_eet_image_loader" = "xyes" -o "x$want_eet_image_loader" = "xauto" -a "x$have_eet" = "xyes"; then + AC_DEFINE(BUILD_LOADER_EET, 1, [EET Image Loader Support]) + have_eet_image_loader="yes" +else + have_eet_image_loader="no" +fi +AC_MSG_RESULT($have_eet_image_loader) + +AM_CONDITIONAL(BUILD_LOADER_EET, test "x$have_eet_image_loader" = "xyes") + +####################################### +## EDB +# +# first, check whether the user WANTS to use EDB +have_edb=no +AC_ARG_ENABLE(image-loader-edb, + AC_HELP_STRING( + [--enable-image-loader-edb], + [enable EDB image loader.] + ), + [want_edb_image_loader=$enableval], + [want_edb_image_loader=no] +) + +# next, if she does, check whether EDB is available +if test "$want_edb_image_loader" = yes; then + PKG_CHECK_MODULES(EDB, edb, have_edb=yes, have_edb=no) +fi + +# finally, spew out the result +AC_MSG_CHECKING(whether to enable edb image loader) +if test "$want_edb_image_loader" = yes -a "$have_edb" = yes; then + AC_DEFINE(BUILD_LOADER_EDB, 1, [EDB Image Loader Support]) + have_edb_image_loader=yes +else + have_edb_image_loader=no +fi +AC_MSG_RESULT($have_edb_image_loader) + +AM_CONDITIONAL(BUILD_LOADER_EDB, test $have_edb_image_loader = yes) + +####################################### +## TIFF +want_tiff="auto"; +have_tiff="no"; + +AC_MSG_CHECKING(whether to enable tiff image loader) +AC_ARG_ENABLE(image-loader-tiff, + AC_HELP_STRING([--disable-image-loader-tiff], [disable TIFF image loader]), + [ want_tiff=$enableval ] +) +AC_MSG_RESULT($want_tiff) + +if test "x$want_tiff" = "xyes" -o "x$want_tiff" = "xauto"; then + AC_CHECK_HEADER(tiffio.h, + [ + AC_CHECK_LIB(tiff, TIFFReadScanline, + [ + tiff_libs="-ltiff" + have_tiff="yes" + ], + [ + AC_CHECK_LIB(tiff, TIFFReadScanline, + [ + tiff_libs="-ltiff -ljpeg -lz -lm" + have_tiff="yes" + ], + [ + AC_CHECK_LIB(tiff34, TIFFReadScanline, + [ + tiff_libs="-ltiff34 -ljpeg -lz -lm" + have_tiff="yes" + ], + [ + have_tiff="no" + ] + ) + ] + ) + ] + ) + ], + [ have_tiff="no" ] + ) +fi + +if test "x$have_tiff" = "xyes"; then + AC_DEFINE(BUILD_LOADER_TIFF, 1, [TIFF Image Loader Support]) + tiff_cflags="" +else + if test "x$want_tiff" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([TIFF not found (strict dependencies checking)]) + fi +fi + +AM_CONDITIONAL(BUILD_LOADER_TIFF, test x$have_tiff = xyes) + +####################################### +## XPM +have_xpm="yes"; +AC_MSG_CHECKING(whether to enable xpm image loader) +AC_ARG_ENABLE(image-loader-xpm, + AC_HELP_STRING([--disable-image-loader-xpm], [disable XPM image loader]), + [ have_xpm=$enableval ] +) +AC_MSG_RESULT($have_xpm) + +xpm_cflags="" +xpm_libs="" + +AM_CONDITIONAL(BUILD_LOADER_XPM, test x$have_xpm = xyes) + +####################################### +## SVG +want_svg="auto"; +have_svg="no"; + +AC_MSG_CHECKING(whether to enable svg image loader) +AC_ARG_ENABLE(image-loader-svg, + AC_HELP_STRING([--disable-image-loader-svg], [disable SVG image loader]), + [ want_svg=$enableval ] +) +AC_MSG_RESULT($want_svg) + +svg_cflags="" +svg_libs="" +if test "x$want_svg" = "xyes" -o "x$want_svg" = "xauto"; then + # Check if really available + PKG_CHECK_MODULES(SVG, librsvg-2.0 >= 2.14.0, + [ have_svg="yes" ], + [ have_svg="no" ] + ) + if test "x$have_svg" = "xyes"; then + PKG_CHECK_MODULES(CAIRO_SVG, cairo-svg, + [ + have_svg="yes" + svg_cflags="$SVG_CFLAGS $CAIRO_SVG_CFLAGS" + svg_libs="$SVG_LIBS $CAIRO_SVG_LIBS" + ], + [ + PKG_CHECK_MODULES(LIBSVG_CAIRO, libsvg-cairo, + [ + have_svg="yes" + svg_cflags="$SVG_CFLAGS $LIBSVG_CAIRO_CFLAGS" + svg_libs="$SVG_LIBS $LIBSVG_CAIRO_LIBS" + ], + [ + have_svg="no" + ] + ) + ] + ) + fi +fi + +if test "x$want_svg" = "xyes" -a ! "x$have_svg" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([SVG not found (strict dependencies checking)]) +fi + +AM_CONDITIONAL(BUILD_LOADER_SVG, test x$have_svg = xyes) + +####################################### +## PMAPS +have_pmaps="yes"; +AC_MSG_CHECKING(whether to enable pmaps image loader) +AC_ARG_ENABLE(image-loader-pmaps, + AC_HELP_STRING([--disable-image-loader-pmaps], [disable PMAPS image loader]), + [ have_pmaps=$enableval ] +) +AC_MSG_RESULT($have_pmaps) + +pmaps_cflags="" +pmaps_libs="" + +AM_CONDITIONAL(BUILD_LOADER_PMAPS, test x$have_pmaps = xyes) + + +##################################################################### +## Cpu based optimizations + +####################################### +## PTHREADS +pthread_cflags="" +pthread_libs="" +build_pthreads="no" +has_pthreads="no" +# sched_getaffinity pthread_attr_setaffinity_np +AC_CHECK_HEADERS(pthread.h sched.h, + [ + AC_CHECK_LIB(pthread, pthread_attr_setaffinity_np, + [ + AC_CHECK_LIB(pthread, pthread_barrier_wait, + [ + build_pthreads="yes" + has_pthreads="yes" + ], + [ build_pthreads="no" ] + ) + ], + [ build_pthreads="no" ] + ) + ], + [ build_pthreads="no" ] +) +### disable pthreads by default for now - some wierd deadlock issue with +# barriers (makes no sense) +#build_pthreads="no" +AC_MSG_CHECKING(whether to build pthread code) +AC_ARG_ENABLE(pthreads, + AC_HELP_STRING([--enable-pthreads], [enable threaded rendering]), + [ + if test "x$enableval" = "xyes" ; then + if test "x$build_pthreads" = "xyes"; then + AC_MSG_RESULT(yes) + AC_DEFINE(BUILD_PTHREAD, 1, [Build Threaded Rendering]) + build_pthreads="yes" + pthread_cflags="" + pthread_libs="-lpthread" + else + if "x$use_strict" = "xyes"; then + AC_MSG_ERROR(pthreads headers or functions not found (strict dependencies checking)) + else + AC_MSG_RESULT(no: pthread headers or functions not found) + fi + fi + else + AC_MSG_RESULT(no) + build_pthreads="no" + fi + ], + [ + AC_MSG_RESULT($build_pthreads) + if test "x$build_pthreads" = "xyes" ; then + AC_DEFINE(BUILD_PTHREAD, 1, [Build Threaded Rendering]) + pthread_cflags="" + pthread_libs="-lpthread" + fi + ] +) + +####################################### +## Async events +build_async_events="auto" +AC_MSG_CHECKING(whether to build Async Events support) +AC_ARG_ENABLE(async-events, + AC_HELP_STRING([--enable-async-events], [enable async events support]), + [ build_async_events=$enableval ] +) +AC_MSG_RESULT($build_async_events) + +AC_MSG_CHECKING(whether we can build Async Events support) +if test \( "x$build_async_events" = "xyes" -o "x$build_async_events" = "xauto" \) -a "x$has_pthreads" = "xyes"; then + AC_MSG_RESULT(yes) + AC_DEFINE(BUILD_ASYNC_EVENTS, 1, [Build async events support]) + build_async_events="yes" +else + AC_MSG_RESULT(no) + build_async_events="no" +fi + +####################################### +## MMX +build_cpu_mmx="no" +case $host_cpu in + i*86) + build_cpu_mmx="yes" + ;; + x86_64) + build_cpu_mmx="yes" + ;; +esac +AC_MSG_CHECKING(whether to build mmx code) +AC_ARG_ENABLE(cpu-mmx, + AC_HELP_STRING([--enable-cpu-mmx], [enable mmx code]), + [ + if test "x$enableval" = "xyes" ; then + AC_MSG_RESULT(yes) + AC_DEFINE(BUILD_MMX, 1, [Build MMX Code]) + build_cpu_mmx="yes" + else + AC_MSG_RESULT(no) + build_cpu_mmx="no" + fi + ], + [ + AC_MSG_RESULT($build_cpu_mmx) + if test "x$build_cpu_mmx" = "xyes" ; then + AC_DEFINE(BUILD_MMX, 1, [Build MMX Code]) + fi + ] +) + +####################################### +## SSE +build_cpu_sse="no" +case $host_cpu in + i*86) + build_cpu_sse="yes" + ;; + x86_64) + build_cpu_sse="yes" + ;; +esac +AC_MSG_CHECKING(whether to build sse code) +AC_ARG_ENABLE(cpu-sse, + AC_HELP_STRING([--enable-cpu-sse], [enable sse code]), + [ + if test "x$enableval" = "xyes" ; then + AC_MSG_RESULT(yes) + AC_DEFINE(BUILD_SSE, 1, [Build SSE Code]) + build_cpu_sse="yes" + else + AC_MSG_RESULT(no) + build_cpu_sse="no" + fi + ], + [ + AC_MSG_RESULT($build_cpu_sse) + if test "x$build_cpu_sse" = "xyes" ; then + AC_DEFINE(BUILD_SSE, 1, [Build SSE Code]) + fi + ] +) + +####################################### +## ALTIVEC +build_cpu_altivec="no" +case $host_cpu in + *power* | *ppc*) + build_cpu_altivec="auto" + ;; +esac +altivec_cflags="" +AC_MSG_CHECKING(whether to build altivec code) +AC_ARG_ENABLE(cpu-altivec, + AC_HELP_STRING([--enable-cpu-altivec], [enable altivec code]), + [ build_cpu_altivec=$enableval ], + [ + if test ! "x$build_cpu_altivec" = "xauto"; then + build_cpu_altivec="no" + fi + ] +) +AC_MSG_RESULT($build_cpu_altivec) + +if test "x$build_cpu_altivec" = "xyes"; then + AC_CHECK_HEADER(altivec.h, + [ + AC_DEFINE(BUILD_ALTIVEC, 1, [Build Altivec Code]) + AC_DEFINE(HAVE_ALTIVEC_H, 1, [Have altivec.h header file]) + build_cpu_altivec="yes" + ], + [ + save_CFLAGS=$CFLAGS + save_CPPFLAGS=$CPPFLAGS + CFLAGS=$CFLAGS" -maltivec" + CPPFLAGS=$CPPFLAGS" -maltivec" + unset ac_cv_header_altivec_h + AC_CHECK_HEADER(altivec.h, + [ + AC_DEFINE(BUILD_ALTIVEC, 1, [Build Altivec Code]) + AC_DEFINE(HAVE_ALTIVEC_H, 1, [Have altivec.h header file]) + build_cpu_altivec="yes" + ], + [ + if test "x$build_cpu_altivec" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR(Altivec not found (strict dependencies checking)) + fi + build_cpu_altivec="no" + ] + ) + CFLAGS=$save_CFLAGS + CPPFLAGS=$save_CPPFLAGS + ] + ) +fi + +if test "x$build_cpu_altivec" = "xyes"; then + AC_MSG_CHECKING(whether to use altivec compiler flag) + if test "x$GCC" = "xyes"; then + if echo "int main(){return 0;}" | ${CPP} -faltivec - > /dev/null 2>&1; then + altivec_cflags="-faltivec" + AC_DEFINE(BUILD_ALTIVEC, 1, [Build Altivec Code]) + elif echo "int main(){return 0;}" | ${CPP} -maltivec - > /dev/null 2>&1; then + altivec_cflags="-maltivec" + AC_DEFINE(BUILD_ALTIVEC, 1, [Build Altivec Code]) + fi + fi + AC_MSG_RESULT($altivec_cflags) + CFLAGS="$CFLAGS $altivec_cflags" +fi + + +####################################### +## C +build_cpu_c="no" +build_cpu_c="yes" +AC_MSG_CHECKING(whether to build c code) +AC_ARG_ENABLE(cpu-c, + AC_HELP_STRING([--enable-cpu-c], [enable C code]), + [ + if test "x$enableval" = "xyes" ; then + AC_MSG_RESULT(yes) + AC_DEFINE(BUILD_C, 1, [Build plain C code]) + build_cpu_c="yes" + else + AC_MSG_RESULT(no) + build_cpu_c="no" + fi + ], [ + AC_MSG_RESULT($build_cpu_c) + if test "x$build_cpu_c" = "xyes" ; then + AC_DEFINE(BUILD_C, 1, [Build plain C code]) + fi + ] +) + +##################################################################### +## ARGB engine options + +####################################### +## Nearest sampling scaler +scaler_sample="no" +scaler_sample="yes" +AC_MSG_CHECKING(whether to build sampling scaler) +AC_ARG_ENABLE(scale-sample, + AC_HELP_STRING([--enable-scale-sample], [enable sampling scaler code]), + [ + if test "x$enableval" = "xyes" ; then + AC_MSG_RESULT(yes) + AC_DEFINE(BUILD_SCALE_SAMPLE, 1, [Sampling Scaler Support]) + scaler_sample="yes" + else + AC_MSG_RESULT(no) + scaler_sample="no" + fi + ], [ + AC_MSG_RESULT($scaler_sample) + if test "x$scaler_sample" = "xyes" ; then + AC_DEFINE(BUILD_SCALE_SAMPLE, 1, [Sampling Scaler Support]) + fi + ] +) + +####################################### +## Smooth super and sub sampling scaler +scaler_smooth="no" +scaler_smooth="yes" +AC_MSG_CHECKING(whether to build smooth scaler) +AC_ARG_ENABLE(scale-smooth, + AC_HELP_STRING([--enable-scale-smooth], [enable smooth scaler code]), + [ + if test "x$enableval" = "xyes" ; then + AC_MSG_RESULT(yes) + AC_DEFINE(BUILD_SCALE_SMOOTH, 1, [Smooth Scaler Support]) + scaler_smooth="yes" + else + AC_MSG_RESULT(no) + scaler_smooth="no" + fi + ], [ + AC_MSG_RESULT($scaler_smooth) + if test "x$scaler_smooth" = "xyes" ; then + AC_DEFINE(BUILD_SCALE_SMOOTH, 1, [Smooth Scaler Support]) + fi + ] +) + +####################################### +## YUV -> ARGB converter +conv_yuv="no" +conv_yuv="yes" +AC_MSG_CHECKING(whether to build yuv converter code) +AC_ARG_ENABLE(convert-yuv, + AC_HELP_STRING([--enable-convert-yuv], [enable yuv converter code]), + [ + if test "x$enableval" = "xyes" ; then + AC_MSG_RESULT(yes) + AC_DEFINE(BUILD_CONVERT_YUV, 1, [YUV Converter Support]) + conv_yuv="yes" + else + AC_MSG_RESULT(no) + conv_yuv="no" + fi + ], [ + AC_MSG_RESULT($conv_yuv) + if test "x$conv_yuv" = "xyes" ; then + AC_DEFINE(BUILD_CONVERT_YUV, 1, [YUV Converter Support]) + fi + ] +) + +##################################################################### +## Output rendering features + +####################################### +## Small dither mask instead of big one (lower quality) +conv_small_dither="no" +AC_MSG_CHECKING(whether to build small dither mask code) +AC_ARG_ENABLE(small-dither-mask, + AC_HELP_STRING([--enable-small-dither-mask], [enable small dither mask code]), + [ + if test "x$enableval" = "xyes" ; then + AC_MSG_RESULT(yes) + AC_DEFINE(BUILD_SMALL_DITHER_MASK, 1, [Small Dither Mask Support]) + conv_small_dither="yes" + else + AC_MSG_RESULT(no) + conv_small_dither="no" + fi + ], [ + AC_MSG_RESULT($conv_small_dither) + if test "x$conv_small_dither" = "xyes" ; then + AC_DEFINE(BUILD_SMALL_DITHER_MASK, 1, [Small Dither Mask Support]) + fi + ] +) + +####################################### +## No dither mask at all for 16bpp +conv_no_dither="no" +AC_MSG_CHECKING(whether to build without dither mask for 16bpp) +AC_ARG_ENABLE(no-dither-mask, + AC_HELP_STRING([--enable-no-dither-mask], [enable conversion to 16bpp without dither mask]), + [ + if test "x$enableval" = "xyes" ; then + AC_MSG_RESULT(yes) + AC_DEFINE(BUILD_NO_DITHER_MASK, 1, [No Dither Mask Support]) + conv_no_dither="yes" + else + AC_MSG_RESULT(no) + conv_no_dither="no" + fi + ], [ + AC_MSG_RESULT($conv_no_dither) + if test "x$conv_no_dither" = "xyes" ; then + AC_DEFINE(BUILD_NO_DITHER_MASK, 1, [No Dither Mask Support]) + fi + ] +) + +####################################### +## Convert to 8bpp RGB 332 +EVAS_CONVERT_COLOR(8, RGB, 332, [yes]) +## Convert to 8bpp RGB 666 +EVAS_CONVERT_COLOR(8, RGB, 666, [yes]) +## Convert to 8bpp RGB 232 +EVAS_CONVERT_COLOR(8, RGB, 232, [yes]) +## Convert to 8bpp RGB 222 +EVAS_CONVERT_COLOR(8, RGB, 222, [yes]) +## Convert to 8bpp RGB 221 +EVAS_CONVERT_COLOR(8, RGB, 221, [yes]) +## Convert to 8bpp RGB 121 +EVAS_CONVERT_COLOR(8, RGB, 121, [yes]) +## Convert to 8bpp RGB 111 +EVAS_CONVERT_COLOR(8, RGB, 111, [yes]) +## Convert to 16bpp RGB 565 +EVAS_CONVERT_COLOR(16, RGB, 565) +## Convert to 16bpp BGR 565 +EVAS_CONVERT_COLOR(16, BGR, 565) +## Convert to 16bpp RGB 555 +EVAS_CONVERT_COLOR(16, RGB, 555) +## Convert to 16bpp RGB 444 +EVAS_CONVERT_COLOR(16, RGB, 444) + +####################################### +## Convert to 16bpp RGB 565 (444 ipaq) +conv_16_rgb_ipq="yes" +AC_MSG_CHECKING(whether to build 16bpp 565 (444 ipaq) converter code) +AC_ARG_ENABLE(convert-16-rgb-ipq, + AC_HELP_STRING([--disable-convert-16-rgb-ipq], [disable 16bpp 565 (444 ipaq) converter code]), + [ + if test "x$enableval" = "xyes" ; then + AC_DEFINE(BUILD_CONVERT_16_RGB_454645, 1, [16bpp 565 (444 ipaq) Converter Support]) + conv_16_rgb_ipq="yes" + else + conv_16_rgb_ipq="no" + fi + ], [ + if test "x$conv_16_rgb_ipq" = "xyes" ; then + AC_DEFINE(BUILD_CONVERT_16_RGB_454645, 1, [16bpp 565 (444 ipaq) Converter Support]) + fi + ] +) +AC_MSG_RESULT($conv_16_rgb_ipq) + +####################################### +## Convert to 16bpp RGB with rotation of 0 +EVAS_CONVERT_ROT(16, RGB, 0) +## Convert to 16bpp RGB with rotation of 180 +EVAS_CONVERT_ROT(16, RGB, 180) +## Convert to 16bpp RGB with rotation of 270 +EVAS_CONVERT_ROT(16, RGB, 270) +## Convert to 16bpp RGB with rotation of 90 +EVAS_CONVERT_ROT(16, RGB, 90) + +####################################### +## Convert to 24bpp RGB 888 +EVAS_CONVERT_COLOR(24, RGB, 888) +## Convert to 24bpp BGR 888 +EVAS_CONVERT_COLOR(24, BGR, 888) +## Convert to 32bpp RGB 8888 +EVAS_CONVERT_COLOR(32, RGB, 8888) +## Convert to 32bpp RGBX 8888 +EVAS_CONVERT_COLOR(32, RGBX, 8888) +## Convert to 32bpp BGR 8888 +EVAS_CONVERT_COLOR(32, BGR, 8888) +## Convert to 32bpp BGRX 8888 +EVAS_CONVERT_COLOR(32, BGRX, 8888) + +####################################### +## Convert to 32bpp RGB with rotation of 0 +EVAS_CONVERT_ROT(32, RGB, 0) +## Convert to 32bpp RGB with rotation of 180 +EVAS_CONVERT_ROT(32, RGB, 180) +## Convert to 32bpp RGB with rotation of 270 +EVAS_CONVERT_ROT(32, RGB, 270) +## Convert to 32bpp RGB with rotation of 90 +EVAS_CONVERT_ROT(32, RGB, 90) + +## valgrind +want_valgrind="no" +have_valgrind="no" + +AC_MSG_CHECKING(whether to enable build with valgrind) +AC_ARG_ENABLE(valgrind, + AC_HELP_STRING([--enable-valgrind], [enable valgrind fixes to stop false reports]), + [ want_valgrind=$enableval ] +) +AC_MSG_RESULT($want_valgrind) + +if test x$want_valgrind = "xyes"; then + PKG_CHECK_MODULES(VALGRIND, valgrind >= 2.4.0, + [ + AC_DEFINE(HAVE_VALGRIND, 1, [Valgrind support]) + have_valgrind=yes + ], + [ + if test "x$want_valgrind" = "xyes" -a "x$use_strict" = "xyes" ; then + AC_MSG_ERROR([Valgrind not found (strict dependencies checking)]) + fi + ] + ) +fi + +### if software 16 x11 is enabled - build software_16 (the generic 16bit +### engine). later enable it fb_16 or other "16" bit engines are enabled. +have_evas_software_16="no" +if test "x$have_evas_software_16_x11" = "xyes"; then + have_evas_software_16="yes" +fi +if test "x$have_evas_sdl" = "xyes"; then + have_evas_software_16="yes" +fi +if test "x$have_evas_software_16_ddraw" = "xyes"; then + have_evas_software_16="yes" +fi +if test "x$have_evas_software_16_wince" = "xyes"; then + have_evas_software_16="yes" +fi +AM_CONDITIONAL(BUILD_ENGINE_SOFTWARE_16, test "x$have_evas_software_16" = "xyes") + +##################################################################### +## Fill in flags + +AC_SUBST(ddraw_libs) +AC_SUBST(ddraw_16_libs) +AC_SUBST(direct3d_libs) + +AC_SUBST(glew_libs) + +AC_SUBST(x_cflags) +AC_SUBST(x_libs) + +AC_SUBST(gl_cflags) +AC_SUBST(gl_libs) + +AC_SUBST(qt_cflags) +AC_SUBST(qt_libs) +AC_SUBST(qt_moc) + +AC_SUBST(gif_cflags) +AC_SUBST(gif_libs) +AC_SUBST(jpeg_cflags) +AC_SUBST(jpeg_libs) +AC_SUBST(tiff_cflags) +AC_SUBST(tiff_libs) +AC_SUBST(xpm_cflags) +AC_SUBST(xpm_libs) +AC_SUBST(svg_cflags) +AC_SUBST(svg_libs) +AC_SUBST(pmaps_cflags) +AC_SUBST(pmaps_libs) +AC_SUBST(altivec_cflags) +AC_SUBST(pthread_cflags) +AC_SUBST(pthread_libs) + +##################################################################### +## Output + +AC_OUTPUT([ +Makefile +evas-cairo-x11.pc +evas-fb.pc +evas-glitz-x11.pc +evas-opengl-glew.pc +evas-opengl-x11.pc +evas-software-buffer.pc +evas-software-qtopia.pc +evas-software-x11.pc +evas-software-16-x11.pc +evas-software-xcb.pc +evas-xrender-x11.pc +evas-xrender-xcb.pc +evas-software-ddraw.pc +evas-software-16-ddraw.pc +evas-direct3d.pc +evas-software-16-wince.pc +evas-software-sdl.pc +evas.pc +src/Makefile +src/lib/Makefile +src/lib/canvas/Makefile +src/lib/data/Makefile +src/lib/file/Makefile +src/lib/imaging/Makefile +src/lib/cache/Makefile +src/lib/engines/Makefile +src/lib/engines/common/Makefile +src/lib/engines/common/evas_op_add/Makefile +src/lib/engines/common/evas_op_blend/Makefile +src/lib/engines/common/evas_op_copy/Makefile +src/lib/engines/common/evas_op_mask/Makefile +src/lib/engines/common/evas_op_mul/Makefile +src/lib/engines/common/evas_op_sub/Makefile +src/lib/engines/common_16/Makefile +src/modules/Makefile +src/modules/engines/Makefile +src/modules/engines/software_generic/Makefile +src/modules/engines/software_ddraw/Makefile +src/modules/engines/direct3d/Makefile +src/modules/engines/software_16_wince/Makefile +src/modules/engines/software_x11/Makefile +src/modules/engines/software_xcb/Makefile +src/modules/engines/fb/Makefile +src/modules/engines/buffer/Makefile +src/modules/engines/software_win32_gdi/Makefile +src/modules/engines/software_qtopia/Makefile +src/modules/engines/gl_common/Makefile +src/modules/engines/gl_glew/Makefile +src/modules/engines/gl_x11/Makefile +src/modules/engines/cairo_common/Makefile +src/modules/engines/cairo_x11/Makefile +src/modules/engines/xrender_x11/Makefile +src/modules/engines/xrender_xcb/Makefile +src/modules/engines/software_sdl/Makefile +src/modules/engines/glitz_x11/Makefile +src/modules/engines/software_16/Makefile +src/modules/engines/software_16_x11/Makefile +src/modules/engines/software_16_ddraw/Makefile +src/modules/engines/software_16_sdl/Makefile +src/modules/loaders/Makefile +src/modules/loaders/edb/Makefile +src/modules/loaders/eet/Makefile +src/modules/loaders/gif/Makefile +src/modules/loaders/jpeg/Makefile +src/modules/loaders/png/Makefile +src/modules/loaders/tiff/Makefile +src/modules/loaders/xpm/Makefile +src/modules/loaders/svg/Makefile +src/modules/loaders/pmaps/Makefile +src/modules/savers/Makefile +src/modules/savers/edb/Makefile +src/modules/savers/eet/Makefile +src/modules/savers/jpeg/Makefile +src/modules/savers/png/Makefile +src/modules/savers/tiff/Makefile +src/lib/include/Makefile +README +evas.spec +]) + +##################################################################### +## Info + +echo +echo +echo +echo "------------------------------------------------------------------------" +echo "$PACKAGE $VERSION" +echo "------------------------------------------------------------------------" +echo +echo "Configuration Options Summary:" +echo +echo "Engines:" +echo " Software Memory Buffer.....: $have_evas_buffer" +echo " Software X11...............: $have_evas_software_x11" +echo " XRender X11................: $have_evas_xrender_x11" +echo " OpenGL X11.................: $have_evas_gl_x11" +echo " Glitz X11..................: $have_evas_glitz_x11" +echo " Cairo X11..................: $have_evas_cairo_x11" +echo " Software XCB...............: $have_evas_software_xcb" +echo " XRender XCB................: $have_evas_xrender_xcb" +echo " Software DirectDraw........: $have_evas_software_ddraw" +echo " Direct3d...................: $have_evas_direct3d" +echo " OpenGL Glew................: $have_evas_gl_glew" +echo " Software SDL...............: $have_evas_sdl (primitive: $sdl_primitive)" +echo " Software Framebuffer.......: $have_evas_fb" +echo " Software Qtopia............: $have_evas_qtopia" +echo " Software 16bit ............: $have_evas_software_16" +echo " Software 16bit X11.........: $have_evas_software_16_x11" +echo " Software 16bit Directdraw..: $have_evas_software_16_ddraw" +echo " Software 16bit WinCE.......: $have_evas_software_16_wince" +echo " Software 16bit SDL.........: $have_evas_sdl (primitive: $sdl_primitive)" +# FIXME: opengl engine needs to be fixed and tested lots for all drivers +# FIXME: xrender engine to be written +echo +echo "Image Loaders:" +echo " GIF.....................: $have_gif" +echo " PNG.....................: $have_png" +echo " JPEG....................: $have_jpeg" +echo " EET.....................: $have_eet_image_loader" +echo " EDB.....................: $have_edb_image_loader" +echo " TIFF....................: $have_tiff" +echo " XPM.....................: $have_xpm" +echo " SVG.....................: $have_svg" +echo " PMAPS...................: $have_pmaps" +# FIXME: need to add modular image loader system +# FIXME: add more image loader modules +echo +echo "Font Sourcing Systems:" +echo " EET.....................: $have_eet_font_loader" +echo +echo "Font Searching Systems:" +echo " Fontconfig..............: $have_fontconfig" +# FIXME: add non freetype2 font engine support +# FIXME: make freetype2 optional +echo +echo "CPU Specific Extensions:" +echo " Fallback C Code.........: $build_cpu_c" +echo " MMX.....................: $build_cpu_mmx" +echo " SSE.....................: $build_cpu_sse" +echo " ALTIVEC.................: $build_cpu_altivec" +echo " Thread Support..........: $build_pthreads" +echo +echo "Async Events..............: $build_async_events" +echo +echo "ARGB Software Engine Options:" +echo " Sampling Scaler.........: $scaler_sample" +echo " Smooth Scaler...........: $scaler_smooth" +# FIXME: add an mmx scaler routine +echo " YUV Converter...........: $conv_yuv" +# FIXME: add more YUV format and colorvariant support +echo +echo "ARGB Conversion Options:" +echo " Smaller Dither Mask.....: $conv_small_dither" +echo " No Dither Mask for 16bpp: $conv_no_dither" +echo " 8bpp RGB 332............: $conv_8_rgb_332" +echo " 8bpp RGB 666............: $conv_8_rgb_666" +echo " 8bpp RGB 232............: $conv_8_rgb_232" +echo " 8bpp RGB 222............: $conv_8_rgb_222" +echo " 8bpp RGB 221............: $conv_8_rgb_221" +echo " 8bpp RGB 121............: $conv_8_rgb_121" +echo " 8bpp RGB 111............: $conv_8_rgb_111" +# FIXME: add grayscale and B&W support +echo " 16bpp RGB 565...........: $conv_16_rgb_565" +echo " 16bpp BGR 565...........: $conv_16_bgr_565" +echo " 16bpp RGB 555...........: $conv_16_rgb_555" +echo " 16bpp RGB 444...........: $conv_16_rgb_444" +echo " 16bpp RGB 565 (444 ipaq): $conv_16_rgb_ipq" +# FIXME: add 555 (444 ipaq) support +# FIXME: add 24bpp 666 support +# FIXME: add 32bpp 666 support +# FIXME: add 30bpp support +# FIXME: add palletted support +# FIXME: add 8bpp and below rotation +echo " 16bpp Rotation 0........: $conv_16_rgb_rot_0" +echo " 16bpp Rotation 90.......: $conv_16_rgb_rot_90" +echo " 16bpp Rotation 180......: $conv_16_rgb_rot_180" +echo " 16bpp Rotation 270......: $conv_16_rgb_rot_270" +echo " 24bpp RGB 888...........: $conv_24_rgb_888" +echo " 24bpp BGR 888...........: $conv_24_bgr_888" +# FIXME: add 24bpp rotation +echo " 32bpp RGB 8888..........: $conv_32_rgb_8888" +echo " 32bpp RGBX 8888.........: $conv_32_rgbx_8888" +echo " 32bpp BGR 8888..........: $conv_32_bgr_8888" +echo " 32bpp BGRX 8888.........: $conv_32_bgrx_8888" +echo " 32bpp Rotation 0........: $conv_32_rgb_rot_0" +echo " 32bpp Rotation 90.......: $conv_32_rgb_rot_90" +echo " 32bpp Rotation 180......: $conv_32_rgb_rot_180" +echo " 32bpp Rotation 270......: $conv_32_rgb_rot_270" +echo +echo "------------------------------------------------------------------------" +echo +echo "Now type 'make' ('gmake' on some systems) to compile $PACKAGE," +echo "and then afterwards as root (or the user who will install this), type" +echo "'make install'. Change users with 'su' or 'sudo' appropriately." +echo diff --git a/debian/.cvsignore b/debian/.cvsignore new file mode 100644 index 0000000..6d10dce --- /dev/null +++ b/debian/.cvsignore @@ -0,0 +1 @@ +changelog diff --git a/debian/changelog.in b/debian/changelog.in new file mode 100644 index 0000000..a906310 --- /dev/null +++ b/debian/changelog.in @@ -0,0 +1,5 @@ +evas (@VERSION@-1) unstable; urgency=low + + * a CVS snapshot release. + + -- Falko Schmidt Fri, 4 Apr 2008 15:13:56 +0000 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..1e8b314 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +6 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..5cd8edd --- /dev/null +++ b/debian/control @@ -0,0 +1,319 @@ +Source: evas +Section: libs +Priority: optional +Maintainer: Falko Schmidt +Build-Depends: debhelper (>= 6), cdbs, libeet-dev, libfreetype6-dev, libpng12-dev | libpng-dev, libx11-dev, libxrender-dev, x11proto-xext-dev, zlib1g, libjpeg62-dev, libtiff4-dev, libgif-dev, libfontconfig1-dev, libglu1-mesa-dev, mesa-common-dev, libxpm-dev, librsvg2-dev, doxygen +Standards-Version: 3.7.3 +Homepage: http://www.enlightenment.org + +Package: libevas0 +Architecture: any +Depends: ${shlibs:Depends}, libevas-loaders, libevas-savers +Suggests: libevas0-engines +Provides: libevas +Description: enlightenment advanced canvas library + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains the core library. + +Package: libevas-doc +Architecture: all +Section: doc +Enhances: libevas-dev +Description: Evas API Documentation + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package provides development documentation (html and manpages) for the + Evas library. + +Package: libevas-dev +Section: libdevel +Architecture: any +Depends: libevas0 (= ${binary:Version}), libjpeg62-dev, libx11-dev, libfreetype6-dev, libfontconfig1-dev, libeet-dev, pkg-config +Suggests: libevas-doc +Description: Enlightenment DR17 advanced canvas library development files + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package provides headers and static libraries required to develop against + evas. + +Package: libevas-dbg +Architecture: any +Section: libdevel +Depends: libevas0 (= ${binary:Version}) +Priority: extra +Description: enlightenment advanced canvas library + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + . + This package contains unstripped shared libraries. It is provided primarily + to provide a backtrace with names in a debugger, this makes it somewhat + easier to interpret core dumps. The libraries are installed in + /usr/lib/debug and are automatically used by gdb. + +Package: libevas-engine-fb +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas-engine-software-generic +Description: Evas module providing a framebuffer render engine + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas engine module for framebuffer rendering. + +Package: libevas-engine-software-x11 +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas-engine-software-generic +Description: Evas module providing a software X11 render engine + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas engine module for software X11 rendering. + +Package: libevas-engine-software-generic +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas0 +Description: Evas module providing a generic software render engine + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas engine module for generic software + rendering. + +Package: libevas-engine-buffer +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas-engine-software-generic +Description: Evas module providing a buffer render engine + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas engine module for buffer rendering. + +Package: libevas-engine-xrender +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas-engine-software-generic +Description: Evas module providing a Xrender engine + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas engine module for Xrender. + +Package: libevas-engine-gl-x11 +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas-engine-software-generic +Description: Evas module providing an OpenGL engine + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas engine module for OpenGl. + +Package: libevas-loader-eet +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas0, libeet1 +Description: Evas module providing an Eet loader + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas loader module for Eet. + +Package: libevas-loader-png +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas0, libpng12-0 +Description: Evas module providing a PNG loader + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas loader module for PNG. + +Package: libevas-loader-jpeg +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas0, libjpeg62 +Description: Evas module providing a JPEG loader + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas loader module for JPEG. + +Package: libevas-loader-gif +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas0, libungif4g +Description: Evas module providing a GIF loader + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas loader module for GIF. + +Package: libevas-loader-tiff +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas0, libtiff4 +Description: Evas module providing a TIFF loader + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas loader module for TIFF. + +Package: libevas-loader-xpm +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas0, libxpm4 +Description: Evas module providing a X11 pixmap loader + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas loader module for XPM. + +Package: libevas-loader-svg +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas0, librsvg2-2 +Description: Evas module providing a SVG loader + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas loader module for SVG. + +Package: libevas-saver-eet +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas0, libeet1 +Description: Evas module providing an Eet saver + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas saver module for Eet. + +Package: libevas-saver-png +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas0, libpng12-0 +Description: Evas module providing a PNG saver + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas saver module for PNG. + +Package: libevas-saver-jpeg +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas0, libjpeg62 +Description: Evas module providing a JPEG saver + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas saver module for JPEG. + +Package: libevas-saver-tiff +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, libevas0, libtiff4 +Description: Evas module providing a TIFF saver + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package contains an Evas saver module for TIFF. + +Package: libevas-engines +Architecture: any +Depends: libevas-engine-buffer, libevas-engine-software-generic, libevas-engine-software-x11, libevas-engine-xrender +Description: virtual package providing important Evas engine modules + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package will install the following Evas engine modules: + - buffer + - software/genenric + - software/X11 + - xrender/X11 + +Package: libevas-engines-extra +Architecture: any +Depends: libevas-engine-fb, libevas-engine-gl-x11 +Description: virtual package providing optional Evas engine modules + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This package will install the following Evas engine modules: + - GL/X11 + - Framebuffer + +Package: libevas-savers +Section: graphics +Architecture: any +Depends: libevas-saver-eet, libevas-saver-jpeg, libevas-saver-png, libevas-saver-tiff +Description: virtual package providing all available Evas savers + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This is a virtual package providing all available Evas saver modules. + +Package: libevas-loaders +Section: graphics +Architecture: any +Depends: libevas-loader-eet, libevas-loader-jpeg, libevas-loader-png, libevas-loader-tiff, libevas-loader-gif, libevas-loader-xpm, libevas-loader-svg +Description: virtual package providing all available Evas loaders + Evas is an advanced canvas library, providing six engines for rendering: X11, + OpenGL (hardware accelerated), DirectFB, the framebuffer, Microsoft Windows + and Qtopia. + Due to its simple API, evas can be developed with rapidly, and cleanly. + . + This is a virtual package providing all available Evas loader modules. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..3abfc3b --- /dev/null +++ b/debian/copyright @@ -0,0 +1,43 @@ +This package was debianized by Falko Schmidt on +Fri, 4 Apr 2008 12:37:17 +0000. + +The source code is from the e17/libs/evas module of the enlightenment CVS +tree. For more information, see: + + http://www.enlightenment.org + +Upstream Authors + + Enlightenment team + +Copyright: + + Copyright (C) 2000 Carsten Haitzler and various contributors (see AUTHORS) + +License: + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies of the Software, its documentation and marketing & publicity + materials, and acknowledgment shall be given in the documentation, + materials and software packages that this Software was used. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +On Debian systems, the complete text of the BSD License can be found +in `/usr/share/common-licenses/BSD'. + +The Debian packaging is: + (C) 2006 2007,Debian Pkg-e Team + and is licensed under the GPL, see `/usr/share/common-licenses/GPL'. diff --git a/debian/libevas-dev.install b/debian/libevas-dev.install new file mode 100644 index 0000000..ecc67bb --- /dev/null +++ b/debian/libevas-dev.install @@ -0,0 +1,4 @@ +debian/tmp/usr/include/* +debian/tmp/usr/lib/lib*.so +debian/tmp/usr/lib/lib*.a +debian/tmp/usr/lib/pkgconfig/* diff --git a/debian/libevas-doc.dirs b/debian/libevas-doc.dirs new file mode 100644 index 0000000..fc70dc0 --- /dev/null +++ b/debian/libevas-doc.dirs @@ -0,0 +1 @@ +usr/share/doc/libevas-doc diff --git a/debian/libevas-doc.doc-base b/debian/libevas-doc.doc-base new file mode 100644 index 0000000..397f3dd --- /dev/null +++ b/debian/libevas-doc.doc-base @@ -0,0 +1,10 @@ +Document: evas +Title: Evas Guide +Author: Carsten Haitzler +Abstract: This document describes Evas API + and provides sample C code. +Section: Programming/C + +Format: HTML +Index: /usr/share/doc/libevas-doc/html/index.html +Files: /usr/share/doc/libevas-doc/html/*.html diff --git a/debian/libevas-engine-buffer.install b/debian/libevas-engine-buffer.install new file mode 100644 index 0000000..308f4d8 --- /dev/null +++ b/debian/libevas-engine-buffer.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/engines/buffer/*/*.so diff --git a/debian/libevas-engine-fb.install b/debian/libevas-engine-fb.install new file mode 100644 index 0000000..7699749 --- /dev/null +++ b/debian/libevas-engine-fb.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/engines/fb/*/*.so diff --git a/debian/libevas-engine-gl-x11.install b/debian/libevas-engine-gl-x11.install new file mode 100644 index 0000000..a049780 --- /dev/null +++ b/debian/libevas-engine-gl-x11.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/engines/gl_x11/*/*.so diff --git a/debian/libevas-engine-software-generic.install b/debian/libevas-engine-software-generic.install new file mode 100644 index 0000000..33d4c72 --- /dev/null +++ b/debian/libevas-engine-software-generic.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/engines/software_generic/*/*.so diff --git a/debian/libevas-engine-software-x11.install b/debian/libevas-engine-software-x11.install new file mode 100644 index 0000000..8fdfca2 --- /dev/null +++ b/debian/libevas-engine-software-x11.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/engines/software_x11/*/*.so diff --git a/debian/libevas-engine-xrender.install b/debian/libevas-engine-xrender.install new file mode 100644 index 0000000..0f774fe --- /dev/null +++ b/debian/libevas-engine-xrender.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/engines/xrender_x11/*/*.so diff --git a/debian/libevas-engines-extra.install b/debian/libevas-engines-extra.install new file mode 100644 index 0000000..e69de29 diff --git a/debian/libevas-engines.install b/debian/libevas-engines.install new file mode 100644 index 0000000..e69de29 diff --git a/debian/libevas-loader-eet.install b/debian/libevas-loader-eet.install new file mode 100644 index 0000000..3b2d85f --- /dev/null +++ b/debian/libevas-loader-eet.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/loaders/eet/*/*.so diff --git a/debian/libevas-loader-gif.install b/debian/libevas-loader-gif.install new file mode 100644 index 0000000..76ac25e --- /dev/null +++ b/debian/libevas-loader-gif.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/loaders/gif/*/*.so diff --git a/debian/libevas-loader-jpeg.install b/debian/libevas-loader-jpeg.install new file mode 100644 index 0000000..03da4b4 --- /dev/null +++ b/debian/libevas-loader-jpeg.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/loaders/jpeg/*/*.so diff --git a/debian/libevas-loader-png.install b/debian/libevas-loader-png.install new file mode 100644 index 0000000..4b2c939 --- /dev/null +++ b/debian/libevas-loader-png.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/loaders/png/*/*.so diff --git a/debian/libevas-loader-svg.install b/debian/libevas-loader-svg.install new file mode 100644 index 0000000..ef17025 --- /dev/null +++ b/debian/libevas-loader-svg.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/loaders/svg/*/*.so diff --git a/debian/libevas-loader-tiff.install b/debian/libevas-loader-tiff.install new file mode 100644 index 0000000..8a91a81 --- /dev/null +++ b/debian/libevas-loader-tiff.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/loaders/tiff/*/*.so diff --git a/debian/libevas-loader-xpm.install b/debian/libevas-loader-xpm.install new file mode 100644 index 0000000..253cd6f --- /dev/null +++ b/debian/libevas-loader-xpm.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/loaders/xpm/*/*.so diff --git a/debian/libevas-loaders.install b/debian/libevas-loaders.install new file mode 100644 index 0000000..e69de29 diff --git a/debian/libevas-saver-eet.install b/debian/libevas-saver-eet.install new file mode 100644 index 0000000..2b26d8d --- /dev/null +++ b/debian/libevas-saver-eet.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/savers/eet/*/*.so diff --git a/debian/libevas-saver-jpeg.install b/debian/libevas-saver-jpeg.install new file mode 100644 index 0000000..bc210c4 --- /dev/null +++ b/debian/libevas-saver-jpeg.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/savers/jpeg/*/*.so diff --git a/debian/libevas-saver-png.install b/debian/libevas-saver-png.install new file mode 100644 index 0000000..07b3edd --- /dev/null +++ b/debian/libevas-saver-png.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/savers/png/*/*.so diff --git a/debian/libevas-saver-tiff.install b/debian/libevas-saver-tiff.install new file mode 100644 index 0000000..10802ed --- /dev/null +++ b/debian/libevas-saver-tiff.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/evas/modules/savers/tiff/*/*.so diff --git a/debian/libevas-savers.install b/debian/libevas-savers.install new file mode 100644 index 0000000..e69de29 diff --git a/debian/libevas0.install b/debian/libevas0.install new file mode 100644 index 0000000..1ba4f52 --- /dev/null +++ b/debian/libevas0.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/libevas.so.* diff --git a/debian/rules b/debian/rules new file mode 100644 index 0000000..74c2396 --- /dev/null +++ b/debian/rules @@ -0,0 +1,70 @@ +#!/usr/bin/make -f + +include /usr/share/cdbs/1/class/autotools.mk +include /usr/share/cdbs/1/rules/debhelper.mk + +DEB_MAKE_CLEAN_TARGET := clean + +#DEB_INSTALL_MANPAGES_libevas-doc := $(DEB_SRCDIR)/doc/man/man3/*.3 +DEB_DH_STRIP_ARGS := --dbg-package=libevas-dbg + +DEB_CONFIGURE_EXTRA_FLAGS := --enable-strict \ + --enable-fontconfig \ + --enable-software-x11 \ + --enable-fb \ + --enable-buffer \ + --enable-gl-x11 \ + --enable-xrender-x11 \ + --enable-image-loader-gif \ + --enable-image-loader-png \ + --enable-image-loader-jpeg \ + --enable-image-loader-eet \ + --enable-font-loader-eet \ + --enable-image-loader-tiff \ + --enable-image-loader-xpm \ + --enable-image-loader-svg \ + --enable-scale-sample \ + --enable-scale-smooth \ + --enable-convert-yuv \ + --enable-small-dither-mask \ + --enable-no-dither-mask \ + --enable-convert-8-rgb-332 \ + --enable-convert-8-rgb-666 \ + --enable-convert-8-rgb-232 \ + --enable-convert-8-rgb-222 \ + --enable-convert-8-rgb-221 \ + --enable-convert-8-rgb-121 \ + --enable-convert-8-rgb-111 \ + --enable-convert-16-rgb-565 \ + --enable-convert-16-bgr-565 \ + --enable-convert-16-rgb-555 \ + --enable-convert-16-rgb-444 \ + --enable-convert-16-rgb-ipq \ + --enable-convert-16-rgb-rot-0 \ + --enable-convert-16-rgb-rot-180 \ + --enable-convert-16-rgb-rot-270 \ + --enable-convert-16-rgb-rot-90 \ + --enable-convert-24-rgb-888 \ + --enable-convert-24-bgr-888 \ + --enable-convert-32-rgb-8888 \ + --enable-convert-32-rgbx-8888 \ + --enable-convert-32-bgr-8888 \ + --enable-convert-32-bgrx-8888 \ + --enable-convert-32-rgb-rot-0 \ + --enable-convert-32-rgb-rot-180 \ + --enable-convert-32-rgb-rot-270 \ + --enable-convert-32-rgb-rot-90 \ + --disable-rpath \ + --enable-pthreads + +build/libevas-doc:: + cd $(DEB_SRCDIR) && ./gendoc + +install/libevas-doc:: + cp -R $(DEB_SRCDIR)/doc/html debian/libevas-doc/usr/share/doc/libevas-doc/ + cd $(DEB_SRCDIR)/doc/man/man3 && ls -1 | grep -vi evas | xargs rm + +clean:: + rm -rf $(DEB_SRCDIR)/doc/html $(DEB_SRCDIR)/doc/latex $(DEB_SRCDIR)/doc/man + ./autogen.sh --prefix=/usr $(DEB_CONFIGURE_EXTRA_FLAGS) + diff --git a/doc/.cvsignore b/doc/.cvsignore new file mode 100644 index 0000000..cc370ed --- /dev/null +++ b/doc/.cvsignore @@ -0,0 +1,3 @@ +html +latex +man diff --git a/doc/e.css b/doc/e.css new file mode 100644 index 0000000..604ee7f --- /dev/null +++ b/doc/e.css @@ -0,0 +1,161 @@ +body { + background: url("b.png"); + background-repeat: repeat-x; + background-position: top left; + background-color: #f4f4f4; + text-align: center; + font-family: sans-serif; + padding: 0; + margin: 0; +} + +div.main { + margin: 1em auto; + vertical-align: top; + font-family: "Bitstream Vera", "Vera", "Trebuchet MS", Trebuchet, Tahoma, sans-serif; + color: #444444; + font-size: 0.8em; + text-align: justify; + width: 80%; +} + +td.t { background-image:url("t.gif"); } +td.t[class] { background-image:url("t.png"); } +td.tl { background-image:url("tl.gif"); } +td.tl[class] { background-image:url("tl.png"); } + +td.nav, td.lnav, td.rnav { + align: middle; + text-align: center; + vertical-align: middle; + width: 100px; + height: 25px; + font-family: "Bitstream Vera", "Vera", "Trebuchet MS", Trebuchet, Tahoma, sans-serif; + color: #000000; + font-size: 9px; + font-weight: bold; + white-space: no-wrap; +} + +td.lnav[class] { background-image:url("n.png"); } +td.lnav[class] { background-image:url("n.png"); } +td.rnav { background-image:url("n.gif"); } +td.rnav[class] { background-image:url("n.png"); } + +hr { + width: 200px; + height: 1px; + background: #dddddd; + border: 0; +} + +p { color: #444444 ;} +p.tiny, small { + color: #888888; + font-size: 0.5em; +} + +h1 { + text-align: center; + font-size: 1.3em; +} + +h2 { font-size: 1.1em; } +h3 { font-size: 0.9em; } + +span.keyword { color: #008000; } +span.keywordtype { color: #604020; } +span.keywordflow { color: #e08000; } +span.comment { color: #800000; } +span.preprocessor { color: #806020; } +span.stringliteral { color: #002080; } +span.charliteral { color: #008080; } + +a:link { + color: #445566; + text-decoration: underline; +} + +a:visited { + color: #667788; + text-decoration: underline; +} + +a:active { + color: #88cccc; + text-decoration: none; +} + +a:hover { + color: #112266; + text-decoration: underline; +} + +a.nav { + text-decoration: none; + display: block; +} + +a.nav:link, a.nav:visited { color: #888888; } +a.nav:active { color: #000000; } +a.nav:hover { color: #444444; } +a.code:link, a.code:visited { text-decoration: none; } + +div.fragment { + font-size: 1em; + border: 1px dotted #cccccc; + background-color: #ffffff; + text-align: left; + vertical-align: middle; + padding: 2px; + margin-left: 25px; + margin-right: 25px; + overflow: auto; +} + +td.indexkey { + font-weight: bold; + padding-left: 10px; + padding-right: 0; + padding-top: 2px; + padding-bottom: 0px; + margin: 0; + margin-top: 2px; + margin-bottom: 2px; + border: 1px dotted #cccccc; + border-right: 0px dotted #cccccc; +} + +td.indexvalue { + font-style: italic; + padding-right: 10px; + padding-left: 0; + padding-top: 2px; + padding-bottom: 2px; + margin: 0; + margin-top: 2px; + margin-bottom: 2px; + border: 1px dotted #cccccc; + border-left: 0px dotted #cccccc; +} + +.mdescRight { font-style: italic; } +.memitem { + padding-left: 2px; + padding-right: 2px; + border: 1px dotted #cccccc; + background-color: #ffffff; +} +.memname { + white-space: nowrap; + font-weight: bold; +} +.paramname { font-weight: normal; } + +div.ah { + border: thin solid #888888; + font-weight: bold; + margin-bottom: 3px; + margin-top: 3px; +} + diff --git a/doc/evas.css b/doc/evas.css new file mode 100644 index 0000000..6117b39 --- /dev/null +++ b/doc/evas.css @@ -0,0 +1,178 @@ +td.md { + background-color: #ffffff; + font-family: monospace; + text-align: left; + vertical-align: center; + font-size: 10; + padding-right : 1px; + padding-top : 1px; + padding-left : 1px; + padding-bottom : 1px; + margin-left : 1px; + margin-right : 1px; + margin-top : 1px; + margin-bottom : 1px +} +td.mdname { + font-family: monospace; + text-align: left; + vertical-align: center; + font-size: 10; + padding-right : 1px; + padding-top : 1px; + padding-left : 1px; + padding-bottom : 1px; + margin-left : 1px; + margin-right : 1px; + margin-top : 1px; + margin-bottom : 1px +} +h1 +{ + text-align: center; + color: #333333 +} +h2 +{ + text-align: left; + color: #333333 +} +h3 +{ + text-align: left; + color: #333333 +} +a:link +{ + text-decoration: none; + color: #444444; + font-weight: bold; +} +a:visited +{ + text-decoration: none; + color: #666666; + font-weight: bold; +} +a:hover +{ + text-decoration: none; + color: #000000; + font-weight: bold; +} +a.nav:link +{ + text-decoration: none; + color: #444444; + font-weight: normal; +} +a.nav:visited +{ + text-decoration: none; + color: #666666; + font-weight: normal; +} +a.nav:hover +{ + text-decoration: none; + color: #000000; + font-weight: normal; +} +a.qindex:link +{ + text-decoration: none; + color: #444444; + font-weight: normal; +} +a.qindex:visited +{ + text-decoration: none; + color: #666666; + font-weight: normal; +} +a.qindex:hover +{ + text-decoration: none; + color: #000000; + font-weight: normal; +} +p +{ + color: #000000; + font-family: sans-serif; + font-size: 10; +} +body { + background-image: url("hilite.png"); + background-repeat: no-repeat; + background-position: left top; + background-color: #dddddd; + color: #000000; + font-family: sans-serif; + padding: 8px; + margin: 0; +} +div.fragment +{ + background-image: url("hilite.png"); + background-repeat: no-repeat; + background-position: left top; + border: thin solid #888888; + background-color: #eeeeee; + padding: 4px; + text-align: left; + vertical-align: center; + font-size: 12; +} +hr +{ + border: 0; + background-color: #000000; + width: 80%; + height: 1; +} +dl +{ + background-image: url("hilite.png"); + background-repeat: no-repeat; + background-position: left top; + border: thin solid #aaaaaa; + background-color: #eeeeee; + padding: 4px; + text-align: left; + vertical-align: center; + font-size: 12; +} +em +{ + color: #334466; + font-family: courier; + font-size: 10; + font-style: normal; +} + +div.nav +{ + border: thin solid #000000; + background-color: #ffffff; + padding: 1px; + text-align: center; + vertical-align: center; + font-size: 12; +} +div.body +{ + border: thin solid #000000; + background-color: #ffffff; + padding: 4px; + text-align: left; + font-size: 10; +} +div.diag +{ + border: thin solid #888888; + background-color: #eeeeee; + padding: 4px; + text-align: center; + font-size: 8; +} diff --git a/doc/foot.html b/doc/foot.html new file mode 100644 index 0000000..0d3303d --- /dev/null +++ b/doc/foot.html @@ -0,0 +1,6 @@ + +
+

Copyright © Enlightenment.org

+

$projectname Documentation Generated: $datetime

+ + diff --git a/doc/head.html b/doc/head.html new file mode 100644 index 0000000..ee04610 --- /dev/null +++ b/doc/head.html @@ -0,0 +1,46 @@ + + + + + $title + + + + + + + + + + +
+ + + + + +
Download
+
+ + + + + + + + + + +
+
+
+ + + + + +
Support
+
+ +
diff --git a/doc/img/_.gif b/doc/img/_.gif new file mode 100644 index 0000000000000000000000000000000000000000..60fa7a1acfebae5abb3f687985ff70ca668a9397 GIT binary patch literal 266 zcmZ?wbhEHbWMp7uSjxb_%*?Eypy1`@Ra;xz-rhcM-n<<(9l@1Vg(l$ z*S~-N?Ck8)($dbIJNKW)K=Ge~bACZ(QD%BZi9$$5szOj=aY<@XZepH-hO?%E5zv7Q aia%KxxftXbbQpjD_C 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 literal 0 HcmV?d00001 diff --git a/doc/img/evas.eps b/doc/img/evas.eps new file mode 100644 index 0000000..dccb8e9 --- /dev/null +++ b/doc/img/evas.eps @@ -0,0 +1,149 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: evas.eps +%%Creator: fig2dev Version 3.2 Patchlevel 3c +%%CreationDate: Wed Oct 23 16:18:00 2002 +%%For: raster@dugong.fluffyspider.com.au (The Rasterman) +%%BoundingBox: 0 0 404 396 +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +newpath 0 396 moveto 0 0 lineto 404 0 lineto 404 396 lineto closepath clip newpath +-8.0 450.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def + /DrawEllipse { + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def + /savematrix mtrx currentmatrix def + x y tr xrad yrad sc 0 0 1 startangle endangle arc + closepath + savematrix setmatrix + } def + +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +%%Page: 1 1 +10 setmiterlimit + 0.06000 0.06000 sc +% +% Fig objects follow +% +% Ellipse +n 3450 4200 3300 3300 0 360 DrawEllipse gs 0.00 setgray ef gr +% Ellipse +n 3825 4200 3000 3000 0 360 DrawEllipse gs col7 1.00 shd ef gr +% Ellipse +n 1725 4200 600 600 0 360 DrawEllipse gs 0.00 setgray ef gr +% Ellipse +n 6238 4200 600 600 0 360 DrawEllipse gs 0.00 setgray ef gr +% Rotated Ellipse +gs +3225 4200 tr +-90.000 rot +n 0 0 600 600 0 360 DrawEllipse 90.000 rot +gs 0.00 setgray ef gr gr + +% Rotated Ellipse +gs +4725 4200 tr +-270.001 rot +n 0 0 600 600 0 360 DrawEllipse 270.001 rot +gs 0.00 setgray ef gr gr + +% Rotated Ellipse +gs +3225 4132 tr +-90.000 rot +n 0 0 545 545 0 360 DrawEllipse 90.000 rot +gs col7 1.00 shd ef gr gr + +% Rotated Ellipse +gs +4725 4268 tr +-270.001 rot +n 0 0 545 545 0 360 DrawEllipse 270.001 rot +gs col7 1.00 shd ef gr gr + +% Arc +n 6306.0 4200.0 545.0 180.0 0.0 arc +6306.0 4200.0 l 5761.0 4200.0 l gs col7 1.00 shd ef gr +% Arc +n 6170.0 4200.0 545.0 180.0 0.0 arcn +6170.0 4200.0 l 5625.0 4200.0 l gs col7 1.00 shd ef gr +$F2psEnd +rs diff --git a/doc/img/evas.fig b/doc/img/evas.fig new file mode 100644 index 0000000..a585901 --- /dev/null +++ b/doc/img/evas.fig @@ -0,0 +1,25 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +500.00 +Single +-2 +1200 2 +6 150 900 6825 7500 +1 4 0 0 0 0 48 0 20 0.000 1 0.0000 1725 4200 600 600 1125 4200 2325 4200 +1 4 0 0 0 0 50 0 20 0.000 1 0.0000 3450 4200 3300 3300 150 4200 6750 4200 +1 4 0 0 0 7 49 0 20 0.000 1 0.0000 3825 4200 3000 3000 825 4200 6825 4200 +-6 +6 5625 3600 6900 4800 +6 5625 3600 6900 4800 +5 2 0 0 0 7 30 0 20 0.000 0 0 0 0 6306.000 4200.000 5761 4200 6306 3655 6851 4200 +5 2 0 0 0 7 30 0 20 0.000 0 1 0 0 6170.000 4200.000 5625 4200 6170 4745 6715 4200 +-6 +1 4 0 0 0 0 40 0 20 0.000 1 0.0000 6238 4200 600 600 5638 4200 6838 4200 +-6 +1 4 0 0 0 0 40 0 20 0.000 1 1.5708 3225 4200 600 600 3225 4800 3225 3600 +1 4 0 0 0 7 39 0 20 0.000 1 1.5708 3225 4132 545 545 3225 4677 3225 3587 +1 4 0 0 0 0 40 0 20 0.000 1 4.7124 4725 4200 600 600 4725 3600 4725 4800 +1 4 0 0 0 7 39 0 20 0.000 1 4.7124 4725 4268 545 545 4725 3723 4725 4813 diff --git a/doc/img/evas.png b/doc/img/evas.png new file mode 100644 index 0000000000000000000000000000000000000000..47597a8d4439b4999a1c1f6d5f4ae1427e4f1097 GIT binary patch literal 74944 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

K5@fs&u&U7H5(~;!esNbm?k7{RVZo42B!;& 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 Eg86MPumAu6 literal 0 HcmV?d00001 diff --git a/doc/img/evas.xcf b/doc/img/evas.xcf new file mode 100644 index 0000000000000000000000000000000000000000..2fdf355e45fb8e9ffd2bf8e3cc2bc87625d5e915 GIT binary patch literal 2126397 zcmeFa2bf*Qb>~^(h8H`51Vw;3O3Va<7!+)2R%2VXN9at^GhIy}wiUbpxPed;IP9t!KX> z$n(0Y&Z(+XbwgGC&#Ah<_1nMmmFpIM;fvRO@wfl;Zz`pN@q`E}RS9X$&nzhQscxl& z_;(rPLFLfwQds1s|9wGKRXjHxxu{T)$$skBzVPMW`h(wl;&*>TBuq&x;I9-p1*J-1 z5l@%G{85>U!r6<$xr@U2i^8Iwlr{Y?Bp`Ljzv(7S*H4nJa-0i&fUJImrbu&s4_XAZ zKz*0W<+dx8JD^nAH=uW*??OMMcPP7@GRtp(=0Tr=s-a(p{s3AE^+KDWeb6_cccAY= zKUAv1KvmEU&^+izOcYKB^&^$B2ATui20a4(0`z(4 zOHeb^3ay8>LkFN!(08EkLlbmUhAWH?v(aHTI?P6g+2}AE9cKRlv=r)vHbeWMZ$R%r z--Ujt)D;G*f^LB3L7#%EpiGCor1mteIJ@oYHkLa1KkEa0{sH?d8MvKhpW-yYIL|79j-=) ztI^@=Z$R%r--Ujt)HOz_8-G!$n;uu{o+p+1=c`u1|A{&I~{-{Zdh-c8W`(7%Cdq2GZ15JKjA{Yw4KMra3g2s#b@1@wPH1*QHr zr_{N(mG&Q3`nI`B|MFs`e{Z|e9si*8j&CXb%}S;J=95ZK{G2j8VkTPwT?gF*{S5Ru z=vSeyK#?-}RnS`KWoR7wCiG{@l$}-P>Z_HRw^^BnJCu3yFO}*43uX3wSecXL`|D%M z2EV54P0uR(GgZp|!rwseDf?L;x*WP0dI0+0pgQO`mHnmPffhp@&?ac7vj6T%W#^Os zOTVma>jq_?e_Pp;r2pWX%De1{@*erJ^8WqZ%4_~b<@M&3_tG5YZT|rjEAQ1Z=o;uQ z=o8Q{L;nH#UFGe35?TojLN7w2&;t;2b6zyl?twYPX#yM0zC+Q2C9d?2t5g{ga)A(RdDMr=m_){^k1PLK(Pw$ ze?bL5w_F8Z{WBE|yvu9pS5@$xNfk`aR^go0D*X7vDr{_4;S;~1!mc+|xcldzM(965 z3!zoeTIgkH9QvjT_kIidE9f6o$gLjktAMUk;n$J>i(ge?u}7t@PpcGtoO<$lm0EXJ zr4FxBsdsj%)R}oIUGe)Wef2M^^w0jGN`IyqYK7KA+o1!{Dd;=U_f`7meyGwvZ=fpZ z28jGW|0$JjK=!LotMvM-RC@f7O8=LQDigG;%w6xQ%x8vFruGXe^Pf+uOxIf~)BB*x z?E8w!93gz~B?m!RJ)IxQ<_cbd2`Ye_I-nUi$$Gy;~ z%D?wxRptk(?51i}Ht(yd?18IP*~i9J*{6=HvY-DX^zWem2>l+k1nPpGgLbR3&yGPS zp+ANG8+2Bc{bH!ferdKU`;R@Utm$u6S{}10vVZsuRX+PqRrx2Z zDzDk1%D z{5e(m>2Isb>O-pXH#Vut-yT$zzcUN^EocGM0q)YTUF&-f2At__%T)aXZ6q*p(ml0 z5Ox3Ai_j=^0{Y*fzg3mr`2iHG%0DlIu7U1?J^}qQ^dF$#Rh57FV^#UxBdYT6k@?Yp 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

xs*@XWq(|19 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

-jJY-Nwoen^du$IAdk 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%0AAb*M@Nh-nsLMeF8$hmhV8h5Zu;bUJdF+AF9X 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
  • ;0) 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

    }p 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�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%0Dve7!)a;4?1K1Jjc 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 literal 0 HcmV?d00001 diff --git a/doc/img/evas_big.eps b/doc/img/evas_big.eps new file mode 100644 index 0000000..97535e4 --- /dev/null +++ b/doc/img/evas_big.eps @@ -0,0 +1,45178 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.11 by Peter Kirchgessner +%%Title: /home/raster/C/ecore/doc/img/ecore_big.eps +%%CreationDate: Fri Feb 21 15:39:04 2003 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 0 0 171 171 +%%EndComments +%%BeginPreview: 255 256 1 256 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000001000080000000000000000000000000 +% 0000000000000000000000000000000001400100000000000000000000000000 +% 0000000000000000000000000000020002400240000000000000000000000000 +% 0000000000000000000000000000010005500150000000000000000000000000 +% 0000000000000000000000000000028002900520000000000000000000000000 +% 0000000000000000000000000000014005240a48010000000000000000000000 +% 000000000000000000000000000002500aa80aa4024000000000000000000000 +% 000000000000000000000000000001480a492848048000000000000000000000 +% 000000000000000000000000000005542aaa2a944a2000000000000000000000 +% 0000000000000000000000000100054895525520894800000000000000000000 +% 00000000000000000000000000a005552a94aa55142000000000000000000000 +% 0000000000000000000000000140054a2aa55488294800000000000000000000 +% 00000000000000000000000000a80aa8d5555525525400000000000000000000 +% 00000000000000000000000001542aaaaaaaaaa9548092000000000000000000 +% 00000000000000000000000001520aaaaa955492a52a05000000000000000000 +% 0000000000000000000000000155555555555525524849000000000000000000 +% 00000000000000000000000001541552aaaaaaaaa92294800000000000000000 +% 0000000000000000000000400155aaabffdd552aa49452a00000000000000000 +% 00000000000000000000000001552af5556feaaaaaa54a400000000000000000 +% 00000000000000000000005002aaaf5affd57d55491524980000000000000000 +% 0000000000000000000000280aaab555557bd6d55254a9500000000000000000 +% 00000000000000000000001602aaaaaabdad7d754aaa85200000000000000000 +% 00000000000000000000002952adaab6d56ad7dea952a8824000000000000000 +% 000000000000000000000015456b56aaab5b5d75452a25540000000000000000 +% 00000000000000000000002a8adcaad5b56aabdfdaa549009000000000000000 +% 00000000000000000000002aa563555aadad6ab5655494aa0200000000000000 +% 00000000000000000000002aadad6aab6ab5ad6fdaaa4924a000000000000000 +% 00000000000000000000002ab2aaad6d56d6b5aaba9492520800000000000000 +% 00000000000000000000002aad5555aadaaad557eca92554a100000000000000 +% 0000000000000000000400aab2aad55555b556aabaaa48aa8800000000000000 +% 00000000000000000000002b6d555ab6db56aad56fa92b552200000000000000 +% 00000000000000000002825552aaab55556adaaaaa9244aa4800000000000000 +% 00000000000000000000a02dad55aaadb6ad55555fd493555000000000000000 +% 00000000000000000002a4ab5555556aaad5ab55556a4aaa8480000000000000 +% 00000000000000000000aa2caaaaadadb6b6b55555aa936aa800000000000000 +% 0000000000000000000155d75555557b6d5556aaaaf525550000000000000000 +% 000000000000000000015528aaaabfdfdbedaaaaaaae936aa800000000000000 +% 00000000000000000000ab6f5555ea5576bab555556aaaaa8100000000000000 +% 00000000000000000000acd155555adfddef5555555b45552800000000000000 +% 00000000000000000002ab2eaaafd5a9775ad55554ad76d48000000000000000 +% 00000000000000000000ad52aabaab56ddf7f5555292aaaa5000000000000000 +% 00000000000000000004b555556ead6ab75d5aaaaaadaaa90000000000000000 +% 00000000000000000001555555b155b6ddf7f6aa95555554a000000000000000 +% 00000000000000001408755556eebaaaaaad5f555492aaa20000000000000000 +% 000000000000000009129aaaab515555557bf5aaaaab55548000000000000000 +% 0000000000000000056aaaaaadaeaaab6aaeaf555294aaa10000000000000000 +% 0000000000000000055555555b52aaad5555faf4aa52aa941000000000000000 +% 000000000000000002aaaaaad4ad55555555afaa9548aaa10000000000000000 +% 000000000000000001552aab6aaaaaaaaaaafafaa928554a0000000000000000 +% 00000000000000000156d556aaaaaaaaaaaaadad25402a900000000000000000 +% 00000000000000000155555555555555555556d6aa482aa48000000000000000 +% 000000000000000000aaaaaad555555555555b5a928015280000000000000000 +% 000000000000000004aaaaad9555555555552aab540015420000000000000000 +% 0000000000000000006aaab66aaaaaaaaaaaa75521000aa84000000000000000 +% 000000000000000005555555555555555554aaaac80005520000000000000000 +% 0000000000000000006aaad555555555554a955540000aa48000000000000000 +% 00000000000000000915555aaaaaaaaaaaa952aaa00005520000000000000000 +% 0000000000000000005555aaaaaaaaaaaa9528aaa00002489000000000000000 +% 000000000000000005555555555555555554a57aa00012aa2000000000000000 +% 0000000000000000002aab555555555554aa880d500042554000000000000000 +% 0000000000000000095555555552aaaaaa912036a80201548000000000000000 +% 000000000000000000555555554a55554954000d501000952800000000000000 +% 000000000000000002aaaaaaaaaaaaa92a420017284000554100000000000000 +% 0000000000000000005555555554952552900004d40000952800000000000000 +% 000000000000000005aaaaaaaa8952aa4920000ba8000052a200000000000000 +% 000000000000000000aaad555552554954400005540000954800000000000000 +% 000000000000000000aaaaaaaa8494aa42800002d200004aa480000000000000 +% 0000000000000000035555555528a510942a0002aa00002aa900000000000000 +% 0000000000000000015555555480094400000004ea0000495200000000000000 +% 0000000000000000015555555554922800000001540000255440000000000000 +% 000000000000000002aaaaaaa4aa0000000000015400004aa900000000000000 +% 000000000000000002aaaaaa95494400000000027500002aaa48000000000000 +% 000000000000000002aad55554aa5020000000005a0000456a80000000000000 +% 000000000000000005552aaaaa928a8900000000a90000125420000000000000 +% 00000000000000000552d55524aa5250000000015a0000256a80000000000000 +% 0000000000000000054aa924aa912484400000002d00000aaaa8000000000000 +% 0000000000000000052aa55549254929000000013a000024b500000000000000 +% 000000000000000005555aaaaa489540080000002500000aad50000000000000 +% 00000000000000000aaaaa5492a52914000000013c000022b544000000000000 +% 00000000000000000aaaaaa2aa925241000000005500000a6d28000000000000 +% 00000000000000000aaaab552a554a9400000000950000255aa0000000000000 +% 000000000000000015555554b554a921000000002c000009754a000000000000 +% 00000000000000000aaaaaa97d529244000000012a0000252ea0000000000000 +% 00000000000000002aaab5452f4aa510000000002d0000095aaa000000000000 +% 00000000000000000aa556a8fbd52880000000002a0000255d50000000000000 +% 0000000000000000252aaa856ef4852400000000b400000936a5000000000000 +% 00000000000000001aa56a28ddbd280000000000ac0000255b50000000000000 +% 00000000000000005255ad457bef4aa0000000005400000956aa400000000000 +% 0000000000000000154aa8926f7bd10a000000002c0000253d50800000000000 +% 00000000000000002a52b524dadef450000000002a000012abaa000000000000 +% 00000000000000005495a89277b5bd00000000003400004a7ea8800000000000 +% 000000000000000012a55249dd6fef040000000004000012ab52000000000000 +% 0000000000000000552ab524b7dabbd0000000000000004abed4800000000000 +% 000000000000000014a9a092ed6feef000000000000000126b52000000000000 +% 000000000000000092a55524b55abbbc000000000000004abea8800000000000 +% 000000000000000035556249d6ab6eef0000000000000092b5d5000000000000 +% 000000000000000044958892aab5bbbbc0000000000000253f54200000000000 +% 00000000000000009552aa48b5556eeef000000000000094b5a9400000000000 +% 00000000000000000aaaa125555555bbbc0000000000004afed4000000000000 +% 0000000000000000a9254a90aaaaad6eef0000000000012555aa800000000000 +% 00000000000000000aaa944a544556dbdbc0000000000094ff54000000000000 +% 0000000000000000aaa952a4a91255b6bef000000000012ab5a9400000000000 +% 00000000000000000a4a49125249555df7bc000000000252ff6a000000000000 +% 0000000000000000aaa924a948922aab5def000000000095d5a9200000000000 +% 00000000000000000a92aa9252008556f77bc00000000554ff54400000000000 +% 0000000000000000a52a49254892295aaddef00000000125aad5000000000000 +% 000000000000000014a49254920044a5bb77be0000000a55ff54400000000000 +% 00000000000000008a92aa924400092aaeddeb80000002ab6ad5000000000000 +% 0000000000000000255492495000809555b77f4000001491ff54400000000000 +% 00000000000000004a4a495524000a22aaeddbf000000557aad2800000000000 +% 80000000000000009551552490800049555b76de00002aab7f54000000000000 +% 0000000000000000052a4a9552000004aad6dff700001257ead5000000000000 +% 80000000000000005549245244000091155bb55de0004aa6df50400000000000 +% 00000000000000000aaa92aaa80000024aaaefff7800155ff5aa800000000000 +% 8000000000000000a54929492100000011555aabde00952dbea8000000000000 +% 00000000000000000aaa452aaa000004a4ab6ffef780355feb55000000000000 +% 8000000000000000254928a494000000024aaaabbde128bb7d50400000000000 +% 000000000000000009524a955200000008955b7eef786937d6aa000000000000 +% 800000000000000052c952524a0000000122aad5bbdf104efda4800000000000 +% 00000000000000000554894aa900000000092abbeef6d0abaaa8000000000000 +% 000000000000000012a92aaa552000000444a2aebbbfe012fea5000000000000 +% 800000000000000024b252494a80000000110155d6eda02baaa8000000000000 +% 800000000000000002a9255552400000000200aabdbbc011fb52000000000000 +% 000000000000000014aa949295400000000000256bef000aad44000000000000 +% 800000000000000001592aaa54a0000000020014aebb00057550000000000000 +% 0000000000000000155651254a9000000008200a95d600026d49000000000000 +% 800000000000000000ad4aaaa954000000008015557c00055aa0000000000000 +% 00000000000000000a569494952a00000054000495a80000aa88000000000000 +% 8000000000000000015552aaaaa4800001010002aaaf50013551000000000000 +% 000000000000000008aba525249540000454240252b1ea004a80000000000000 +% 8000000000000000022d54a955525000910080009552b5402aa8000000000000 +% 000000000000000000abd295292a8aa524aa0000a4a2afe81500000000000000 +% 800000000000000004556952a549524892009200554152be0aa8000000000000 +% 00000000000000000112b52a54aa552a495400019200ab6bc500000000000000 +% 800000000000000000554aa54a9292a5240148056a0152dd5150000000000000 +% 00000000000000000220aa54a955544892aa008aaa00a555aa02000000000000 +% 8000000000000000008a5392952492aa4840a215d4004ab6aad0000000000000 +% 00000000000000000029285552aaaa9292950856a00029555504000000000000 +% 80000000000000000084956a4a4924a449204156a0004aaaaa50000000000000 +% 000000000000000000292a955555552aa44a955aa80012aaaa80000000000000 +% 800000000000000000024554a924929112900576aa00292aaa54800000000000 +% 000000000000000000549a954aaaaa4a49255ad4158005555540000000000000 +% 800000000000000000012a55a92524a95248ab541520148aaa94000000000000 +% 00000000000000000014d552aaa8aa9224935da0165402a95549000000000000 +% 80000000000000000022b4955a4a924a922cb54014880a455522200000000000 +% 0000000000000000002aad24a7a95528a555f500192501155554400000000000 +% 80000000000000000045a95296d692a52afd8a08125442a2aaa9000000000000 +% 0000000000000000002d6c8a51fd6a556b5552204a92814a5552400000000000 +% 80000000000000000055aa52aa57b7db5daaa58004aa2892aaa9100000000000 +% 000000000000000000aab52552bd6aaaaa5506a109294254aaaa420000000000 +% 8000000000000000005b5496cb47dd6b555055500a952892aaa9100000000000 +% 000000000000000001aaad25527577aaa92505240455422aaaaa400000000000 +% 80000000000000000155684d490b2d6d54885494054a54925555290000000000 +% 0000000000000000005b5d35a4aa5bb542e28249225549255552400000000000 +% 80000000000000000002a8aa9295445295142927849552555554920000000000 +% 000000000000000000295955492a2aa924a904aac2a54aa4aaaa440000000000 +% 8000000000000000000552aaa4aaa4aa49545247a11554955551100000000000 +% 00000000000000000052b9556955495492a90492f2aaaaaaaaa4a08000000000 +% 8000000000000000000552ada255255525244257a8455555554a040000000000 +% 000000000000000000aaaab568aa92aa4955148afd5555555524a00000000000 +% 800000000000000000055555e355495492aa82a3544aaaaaaa91080000000000 +% 00000000000000000052b555a95525552512a916ea92aaaaaa4a200000000000 +% 8000000000000000008aaaabe2aa92aa48abc2535d5555555490000000000000 +% 00000000000000000012aaab6aaaa55592a5648ad549555aaa44800000000000 +% 80000000000000000084aaafc555c954a529c92555b6aaab5490080000000000 +% 00000000000000000029577aeaabc54bc49572536aaad5b55221000000000000 +% 80000000000000000082aad7aaab55559253d12555555aaaaa84000000000000 +% 00000000000000000014556d4aabc52b454ab49556aaab555420000000000000 +% 800000000000000000214ab7d55754abe893d922aab6d55aa940000000000000 +% 00000000000000000084955a9557e556c52aaa4aaaaaaaaaa408000000000000 +% 800000000000000000012aadeaaed54da947752aaaaab55552a0000000000000 +% 000000000000000000124ab7555dea57f22dac92aad6d6aa9400000000000000 +% 8000000000000000000012aadf5ba556b4956b65555aaaaa4940000000000000 +% 000000000000000000024955b5f7692fe2a75aaaaaab55555208000000000000 +% 8000000000000000000012aadeaeeaad5915ab5555556aa88440000000000000 +% 0000000000000000000084ab55fbd24ffa4b756aaadaaaa52880000000000000 +% 80000000000000000000292ab6aeff5aafa6ad56d556d5524200000000000000 +% 00000000000000000000025555fbabf7faddd5aaadaaaa889010000000000000 +% 80000000000000000000088aad56feaeaf76b6b5555b55520480000000000000 +% 00000000000000000000212955bbabfbfadb5ad6daaaaa24a000000000000000 +% 800000000000000000000245556d7eaeafb6eb5b555555480000000000000000 +% 0000000000000000000000125557d5fbfadb5ab56aaaaa410400000000000000 +% 8000000000000000000004a4955abb56adb6d6d6ad5554941000000000000000 +% 0000000000000000000000012aaad6fdf76dbb6db55552200000000000000000 +% 80000000000000000000004a49555b575adb6aaaaaaaa9400000000000000000 +% 00000000000000000000000092ab6aedb76dadb6d55524088000000000000000 +% 800000000000000000000009255556b6dadb7555555249400000000000000000 +% 000000000000000000000020089555556db6ab6daaa492100000000000000000 +% 8000000000000000000000009252aadbaaaad555551244400000000000000000 +% 0000000000000000000000000125555555b6ad5554a490800000000000000000 +% 800000000000000000000000244895555aaab555524904000000000000000000 +% 000000000000000000000000011252aaaaaaaaaaaa9020800000000000000000 +% 80000000000000000000000004448a5555555555442244000000000000000000 +% 000000000000000000000000001124aaaaaaaa49294000000000000000000000 +% 8000000000000000000000000104491252aaa492440800000000000000000000 +% 0000000000000000000000000020024924952924912080000000000000000000 +% 8000000000000000000000000001289249224489240000000000000000000000 +% 0000000000000000000000000004022492492922008000000000000000000000 +% 8000000000000000000000000000008924924208540000000000000000000000 +% 0000000000000000000000000000121000249441000000000000000000000000 +% 8000000000000000000000000000002249010008000000000000000000000000 +% 0000000000000000000000000000000000482200240000000000000000000000 +% 8000000000000000000000000000004001024020000000000000000000000000 +% 0000000000000000000000000000000220000000000000000000000000000000 +% 8000000000000000000000000000000000080000000000000000000000000000 +% 0000000000000000000000000000000000004000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +%%EndPreview +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +0.000028 0.000028 translate +% Translate to begin of first scanline +0.000000 170.078740 translate +170.078740 -170.078740 scale +% Image geometry +1720 1720 8 +% Transformation matrix +[ 1720 0 0 1720 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 1720 string def +/gstr 1720 string def +/bstr 1720 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 3234763 ASCII Bytes +colorimage +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcC<$JcC<$JcC<$JcEjlJ,~> +JcC<$JcC<$JcC<$JcF=$jo0i2JcC<$JcC<$OT0h~> +JcC<$JcC<$JcC<$JcF=$jo0i2JcC<$JcC<$OT0h~> +JcC<$JcC<$JcC<$JcF=$jo0i2JcC<$JcC<$OT0h~> +JcC<$JcC<$JcC<$JcFX-d/JUrJcC<$JcC<$SH"*~> +JcC<$JcC<$JcC<$JcFX-d/JUrJcC<$JcC<$SH"*~> +JcC<$JcC<$JcC<$JcFX-d/JUrJcC<$JcC<$SH"*~> +JcC<$JcC<$JcC<$JcFg2a8UYiJcC<$JcC<$T`9N~> +JcC<$JcC<$JcC<$JcFg2a8UYiJcC<$JcC<$T`9N~> +JcC<$JcC<$JcC<$JcFg2a8UYiJcC<$JcC<$T`9N~> +JcC<$JcC<$JcC<$JcFs6^]&faJcC<$JcC<$V#Pr~> +JcC<$JcC<$JcC<$JcFs6^]&faJcC<$JcC<$V#Pr~> +JcC<$JcC<$JcC<$JcFs6^]&faJcC<$JcC<$V#Pr~> +JcC<$JcC<$JcC<$JcG'9]DdB]JcC<$JcC<$V>l&~> +JcC<$JcC<$JcC<$JcG'9]DdB]JcC<$JcC<$V>l&~> +JcC<$JcC<$JcC<$JcG'9]DdB]JcC<$JcC<$V>l&~> +JcC<$JcC<$JcC<$JcG3=[/PXVJcC<$JcC<$W;hA~> +JcC<$JcC<$JcC<$JcG3=[/PXVJcC<$JcC<$W;hA~> +JcC<$JcC<$JcC<$JcG3=[/PXVJcC<$JcC<$W;hA~> +JcC<$JcC<$JcC<$JcG<@Y5X"PJcC<$JcC<$X8d\~> +JcC<$JcC<$JcC<$JcG<@Y5X"PJcC<$JcC<$X8d\~> +JcC<$JcC<$JcC<$JcG<@Y5X"PJcC<$JcC<$X8d\~> +JcC<$JcC<$JcC<$JcG?AW;_AJJcC<$JcC<$YlB4~> +JcC<$JcC<$JcC<$JcG?AW;_AJJcC<$JcC<$YlB4~> +JcC<$JcC<$JcC<$JcG?AW;_AJJcC<$JcC<$YlB4~> +JcC<$JcC<$JcC<$JcGHDU],iEJcC<$JcC<$ZN#F~> +JcC<$JcC<$JcC<$JcGHDU],iEJcC<$JcC<$ZN#F~> +JcC<$JcC<$JcC<$JcGHDU],iEJcC<$JcC<$ZN#F~> +JcC<$JcC<$JcC<$JcGNFT)QJ(qu20HJcC<$JcC<$rr7K~> +JcC<$JcC<$JcC<$JcGNFT)QJ(qu20HJcC<$JcC<$rr7K~> +JcC<$JcC<$JcC<$JcGNFT)QJ(qu20HJcC<$JcC<$rr7K~> +JcC<$JcC<$JcC<$JcGTHRJt_9ec(."JcC<$JcCl4J,~> +JcC<$JcC<$JcC<$JcGTHRJt_9ec(."JcC<$JcCl4J,~> +JcC<$JcC<$JcC<$JcGTHRJt_9ec(."JcC<$JcCl4J,~> +JcC<$JcC<$JcC<$JcG]KeGeq8dJhu%bPm(mJcC<$JcD&9J,~> +JcC<$JcC<$JcC<$JcG]KeGeq8dJhu%bPm(mJcC<$JcD&9J,~> +JcC<$JcC<$JcC<$JcG]KeGeq8dJhu%bPm(mJcC<$JcD&9J,~> +JcC<$JcC<$JcC<$JcFF&hYkq&m/O]sJcC<$JcC<$Sc=3~> +JcC<$JcC<$JcC<$JcFF&hYkq&m/O]sJcC<$JcC<$Sc=3~> +JcC<$JcC<$JcC<$JcFF&hYkq&m/O]sJcC<$JcC<$Sc=3~> +JcC<$JcC<$JcC<$K)aX*eG[hpr;Wr!JcC<$JcC<$U&TW~> +JcC<$JcC<$JcC<$K)aX*eG[hpr;Wr!JcC<$JcC<$U&TW~> +JcC<$JcC<$JcC<$K)aX*eG[hpr;Wr!JcC<$JcC<$U&TW~> +JcC<$JcC<$JcC<$L&^$/bPd"krVhBJJcC<$JcDJEJ,~> +JcC<$JcC<$JcC<$L&^$/bPd"krVhBJJcC<$JcDJEJ,~> +JcC<$JcC<$JcC<$L&^$/bPd"krVhBJJcC<$JcDJEJ,~> +JcC<$JcC<$JcC<$aT(c/df82'm/?DNm/;M7rVhBJJcC<$JcDSHJ,~> +JcC<$JcC<$JcC<$aT(c/df82'm/?DNm/;M7rVhBJJcC<$JcDSHJ,~> +JcC<$JcC<$JcC<$aT(c/df82'm/?DNm/;M7rVhBJJcC<$JcDSHJ,~> +JcC<$JcC<$JcC<$dJq_qm/Pi>nbq;Anbn% +JcC<$JcC<$JcC<$dJq_qm/Pi>nbq;Anbn% +JcC<$JcC<$JcC<$dJq_qm/Pi>nbq;Anbn% +JcC<$JcC<$JcC<$f`.38oDR2:o)4.=!<.QLJcC<$JcDbMJ,~> +JcC<$JcC<$JcC<$f`.38oDR2:o)4.=!<.QLJcC<$JcDbMJ,~> +JcC<$JcC<$JcC<$f`.38oDR2:o)4.=!<.QLJcC<$JcDbMJ,~> +JcC<$JcC<$JcC<$h>`Z;o_n+Rq"sCToDO7>!<.QLJcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$h>`Z;o_n+Rq"sCToDO7>!<.QLJcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$h>`Z;o_n+Rq"sCToDO7>!<.QLJcC<$JcDkPJ,~> +JcC<$JcC<$JcC<$i;\u>p&4IZj88BEo_j@?JcC<$JcC<$YQ'+~> +JcC<$JcC<$JcC<$i;\u>p&4IZj88BEo_j@?JcC<$JcC<$YQ'+~> +JcC<$JcC<$JcC<$i;\u>p&4IZj88BEo_j@?JcC<$JcC<$YQ'+~> +JcC<$JcC<$JcC<$jo:GAp&4O\fDG4 +JcC<$JcC<$JcC<$jo:GAp&4O\fDG4 +JcC<$JcC<$JcC<$jo:GAp&4O\fDG4 +JcC<$JcC<$JcC<$kl6bDpAO^_bkq)2o_m)7i;MC/JcC<$JcC<$ZN#F~> +JcC<$JcC<$JcC<$kl6bDpAO^_bkq)2o_m)7i;MC/JcC<$JcC<$ZN#F~> +JcC<$JcC<$JcC<$kl6bDpAO^_bkq)2o_m)7i;MC/JcC<$JcC<$ZN#F~> +JcC<$JcC<$JcC<$l2QqGp&4X_`r#H,o_mD@eG\5&JcC<$JcC<$[Jta~> +JcC<$JcC<$JcC<$l2QqGp&4X_`r#H,o_mD@eG\5&JcC<$JcC<$[Jta~> +JcC<$JcC<$JcC<$l2QqGp&4X_`r#H,o_mD@eG\5&JcC<$JcC<$[Jta~> +JcC<$JcC<$JcC<$li3.Ip&4X__>Es(o)7YK`r4ipJcC<$JcC<$\,Us~> +JcC<$JcC<$JcC<$li3.Ip&4X__>Es(o)7YK`r4ipJcC<$JcC<$\,Us~> +JcC<$JcC<$JcC<$li3.Ip&4X__>Es(o)7YK`r4ipJcC<$JcC<$\,Us~> +JcC<$JcC<$JcC<$mJi@KpAOa`l20fCkkk,PnGVeSjSeTGli#iBJcC<$JcC<$\c70~> +JcC<$JcC<$JcC<$mJi@KpAOa`l20fCkkk,PnGVeSjSeTGli#iBJcC<$JcC<$\c70~> +JcC<$JcC<$JcC<$mJi@KpAOa`l20fCkkk,PnGVeSjSeTGli#iBJcC<$JcC<$\c70~> +JcC<$JcC<$JcC<$n,JXOp&4[`m/,W8m/-PTbPgAsnGVGIJcC<$JcC<$])R9~> +JcC<$JcC<$JcC<$n,JXOp&4[`m/,W8m/-PTbPgAsnGVGIJcC<$JcC<$])R9~> +JcC<$JcC<$JcC<$n,JXOp&4[`m/,W8m/-PTbPgAsnGVGIJcC<$JcC<$])R9~> +JcC<$JcC<$JcC<$nc+mRp&4X_n,)\PnbMbPmec\Tg&9=roDReMJcC<$JcC<$]`3K~> +JcC<$JcC<$JcC<$nc+mRp&4X_n,)\PnbMbPmec\Tg&9=roDReMJcC<$JcC<$]`3K~> +JcC<$JcC<$JcC<$nc+mRp&4X_n,)\PnbMbPmec\Tg&9=roDReMJcC<$JcC<$]`3K~> +JcC<$JcC<$JcC<$oDdGAi;Md:nbr7\n,)kUi;**CmecYSjSd-so_mtPJcC<$JcC<$^&NT~> +JcC<$JcC<$JcC<$oDdGAi;Md:nbr7\n,)kUi;**CmecYSjSd-so_mtPJcC<$JcC<$^&NT~> +JcC<$JcC<$JcC<$oDdGAi;Md:nbr7\n,)kUi;**CmecYSjSd-so_mtPJcC<$JcC<$^&NT~> +JcC<$JcC<$JcC<$p&EhHd/ES8meunXnb`(Wo(i"SnbMtVn,)VPp&4+PiVW3DpAO1RJcC<$JcC<$ +^]/f~> +JcC<$JcC<$JcC<$p&EhHd/ES8meunXnb`(Wo(i"SnbMtVn,)VPp&4+PiVW3DpAO1RJcC<$JcC<$ +^]/f~> +JcC<$JcC<$JcC<$p&EhHd/ES8meunXnb`(Wo(i"SnbMtVn,)VPp&4+PiVW3DpAO1RJcC<$JcC<$ +^]/f~> +JcC<$JcC<$JcC<$pAa%LY5S+m!W/qhqt^*_q;_8Dq>'mUqpkVoqt9m\rTO63s+13$s+13ds*t~> +JcC<$JcC<$JcC<$pAa%LY5S+m!W.oKqt^*_q;_8Dq>'mUqpkVoqt9m\rTO63s+13$s+13ds*t~> +JcC<$JcC<$JcC<$pAa%LY5S+m!W,siqt^*_q;_8Dq>'mUqpkVoqt9m\rTO63s+13$s+13ds*t~> +JcC<$JcC<$JcC<$pAa+NYl4:nrVQW.p\Xg`q"`S;q"aa^mebr?bPV#2p\j@UJcC<$JcC<$_>f#~> +JcC<$JcC<$JcC<$pAa+NYl4:nrVQVWp\Xg`q"`S;q"aa^mebr?bPV#2p\j@UJcC<$JcC<$_>f#~> +JcC<$JcC<$JcC<$pAa+NYl4:nrVQUrp\Xg`q"`S;q"aa^mebr?bPV#2p\j@UJcC<$JcC<$_>f#~> +JcC<$JcC<$JcC<$q#BCRmeu2Dir/NIqYU9*qtp6dq>&D4q>'j_lhg/K^AI[&p\j@UJcC<$JcC<$ +`;b>~> +JcC<$JcC<$JcC<$q#BCRmeu2Dir/NIqYU8Sqtp6dq>&D4q>'j_lhg/K^AI[&p\j@UJcC<$JcC<$ +`;b>~> +JcC<$JcC<$JcC<$q#BCRmeu2Dir/NIqYU7nqtp6dq>&D4q>'j_lhg/K^AI[&p\j@UJcC<$JcC<$ +`;b>~> +JcC<$JcC<$JcC<$qu>dWnboflp\OrjrOr7.qYL'ameH8FmJ-MQqYHKSq#'pclMcA7JcC<$JcE^h +J,~> +JcC<$JcC<$JcC<$qu>dWnboflp\OrLrK7-WqYL'ameH8FmJ-MQqYHKSq#'pclMcA7JcC<$JcE^h +J,~> +JcC<$JcC<$JcC<$qu>dWnboflp\OqkrE'$rqYL'ameH8FmJ-MQqYHKSq#'pclMcA7JcC<$JcE^h +J,~> +JcC<$JcC<$JcC<$rVu!YoDPrlp%ncj]`#P@qYU*XpuD, +JcC<$JcC<$JcC<$rVu!YoDPrlp%n`Jr/pmQqt]aVj7i'KUXJcC<$JcC<$ +`rCP~> +JcC<$JcC<$JcC<$rVu!YoDPrlp&"Vfqtg3cnG)& +JcC<$JcC<$JcC<$rr;-[o_n1Tm/,T9nG<9g]Y+6W!P\F,q=OIVpZhJHp[\+Uq>'m9qq:i6qt^0c +rTjH6s+13$s+13js*t~> +JcC<$JcC<$JcC<$rr;-[o_n1Tm/,T9nG<6FOSk4@qYL$[q"OOJp@n=Pq"jg^qU>>pqX47Vr;$ +JcC<$JcC<$JcC<$rr;-[o_n1Tm/,T9nG<5h>pqX47Vr;$ +JcC<$JcC<$JcC<$!<;6]pAOU\e,/\5lMCVYXT#m3]`>eFq=OIXpYY]?p[e1Vq>'m]qZ+\"qsXCM +q=FIPqt^0crTsN7s+13$s+13ks*t~> +JcC<$JcC<$JcC<$!<;6]pAOU\e,/\5lMCYZN0*q!rV?*\q=ie?q=jLUqYBs`p\OrUkPO`En+lSO +nGE%Zq>K[ZJcC<$JcC<$aT$b~> +JcC<$JcC<$JcC<$!<;6]pAOU\e,/\5lMCYZ=]YE$rV?*\q=ie?q=jLUqYBs`p\OqmkPO`En+lSO +nGE%Zq>K[ZJcC<$JcC<$aT$b~> +JcC<$JcC<$JcC<$kl1;Sp&(lfrqcYrrOi0Ds1\1$qY0aXl1OfEqY0XWqYBj]rVQW8n,)YOhtd!B +nb`1\q>K[ZJcC<$JcC<$b5Zt~> +JcC<$JcC<$JcC<$kl1;Sp&(lfrqcYRs,d,?p%\CXp\*kEp\+IXo_A:YpA4abs-<'MnbV/=pA4=V +qY^0fm/DS9JcC<$JcEmmJ,~> +JcC<$JcC<$JcC<$kl1;Sp&(lfrqcXt!EW>!=7u@bp\4CGp%S1Vp[n7Wq=a[`qu9deqsjO?q=a[T +qtg6drTsN7s+13$s+13ms*t~> +JcC<$JcC<$JcC?%l2LDTpACugqtg>nrOi-Cs1\=(qtKs\g\(F:qY0XWq>'g^!3?+>kPFZCoD%nP +q>0[Zqu$9gli)J8JcC<$JcEsoJ,~> +JcC<$JcC<$JcC?%l2LDTpACugqtg>OrfI#>q=sj]qY&\:qY'd[o_A7Xq"auOrfu[Cn+lSMo(i+X +o)&=^q>KXYJcC<$JcC<$bl<1~> +JcC<$JcC<$JcC?%l2LDTpACugqtg=qpfI:dqtKs\g\(F:qY0XWq>'g^!*T;'kPFZCoD%nPq>0[Z +qu$9gli)J8JcC<$JcEsoJ,~> +JcC<$JcC<$JcCE'l2LGUp\_)hq>1-es/H(2rOi0DrkA@+r:g']de3M2qtKaXq"aja!36% +JcC<$JcC<$JcCE'l2LGUp\_)hq>1-es,-lrV6 +JcC<$JcC<$JcCE'l2LGUp\_)hq>1-es&o2"!a&N*rV6 +JcC<$JcC<$JcCH(l2LJVq#'"G!;b(>q"jpas/Q+2rk/-AqtL$^nb)2>o(DnRqtKaXp\=lja2e.u +q"jOVeG/k8qYKj]qY^3gl2H86JcC<$JcF0uJ,~> +JcC<$JcC<$JcCH(l2LJVq#'"G!;b(>q"jpas,?u=rfI#>qtL$^nb)2>o(DnRqtKaXp\=fMqj$sQ +nbL]0q>'m`o_\L_qYf[XJcC<$JcC<$df4g~> +JcC<$JcC<$JcCH(l2LJVq#'"G!;b(>q"jpas'#5"!a&N*qtL$^nb)2>o(DnRqtKaXp\=emqcNXi +nbL]0q>'m`o_\L_qYf[XJcC<$JcC<$df4g~> +JcC<$JcC<$JcCK)lMgVXq#'ITh"p=5pA4U\ri5t0rk/3C!kuABqtB^Up[n"Ip@S%NqtBp]o(`1Z +!ij;]r5S:&aS>W-qtfs^qu$ +JcC<$JcC<$JcCK)lMgVXq#'ITh"p=5pA4U\rf$i;rK.#@!g8]?qtB^Up[n"Ip@S%NqtBp]o(`1Z +!0?uAnbL9$qYC$bo_\O`qYfRUJcC<$JcC<$f)L7~> +JcC<$JcC<$JcCK)lMgVXq#'ITh"p=5pA4U\r`],!r`B2&p\X[Wp%S+KoChhLp&"I[p[\+Xq#FUp +=Rl4.q"jg`qXj[^r;-BSrdk*#s+13$s474#~> +JcC<$JcC<$JcCN*li-\Xq>B[X\GH$srqQJmr4;sAqRun%p@\:Siq*$=p@\=VqtK[Vs/Q(=rPn[/ +j7r$9meH\Tqtg!_qu$9gir4N/JcC<$JcFR+J,~> +JcC<$JcC<$JcCN*li-\Xq>B[X\GH$srqQJOr/^i=r/q!Pp@\:Siq*$=p@\=VqtK[Vs,[#Aq>'(G +mJ$&Dqt^-cp&"Xaq>K=PJcC<$JcC<$h>`!~> +JcC<$JcC<$JcCN*li-\Xq>B[X\GH$srqQIrpfIGs!*B0np@\:Siq*$=p@\=VqtK[Vs&f>'qcN[i +j7r$9meH\Tqtg!_qu$9gir4N/JcC<$JcFR+J,~> +JcC<$JcC<$JcCW-lMgVXq>BaZo_RSCjne`IqY:&i!5/6A!5/0Aq"=OVqX`n@q=FLUp@\=VqtKgZ +s/Q+>!QN1Y`o[!Op[\+Vq>C*_qtg6erS@I(s+13$s+141s*t~> +JcC<$JcC<$JcCW-lMgVXq>BaZo_RSCjne`IqY:&K!0I,>rfI)@!0[-Mqt0aVkOSH?qt0UTqtBp] +pA"ZKs-3SKr0?C=h=pL8qt^0dpA=^aqYf7LJcC<$JcC<$j8XW~> +JcC<$JcC<$JcCW-lMgVXq>BaZo_RSCjne`IqY:%n!*K%ur)iaeqt0aVkOSH?qt0UTqtBp]pA"Yj +r`B#"jnR[+o(`+Xr;--aqY^3gh>W!*JcC<$JcFd1J,~> +JcC<$JcC<$JcCZ.lMgVXqY]m\p\N84q>0[Xq"XfeqRZa?qRuh"r:KmXh"(@6qt0XUqtBm\qtU/j +s2Y/Zs2FuWmJ->Jkk=cFp%\F[r;--aqu$9gg\ud(JcC<$JcFp5J,~> +JcC<$JcC<$JcCZ.lMgVXqY]m\p\N84q>0[Xq"XfGs,d,=s,d2A!0[9Qr:KmXh"(@6qt0XUqtBm\ +qtU/Os-K(IJcC<$JcC<$kPp&~> +JcC<$JcC<$JcCZ.lMgVXqY]m\p\N84q>0[Xq"Xejs&f(ur)imir:KmXh"(@6qt0XUqtBm\qtU.n +qcEc!mJ->Jkk=cFp%\F[r;--aqu$9gg\ud(JcC<$JcFp5J,~> +JcC<$JcC<$JcCZ.m/HhZqY]s^q"jXYk4ms3o(W3`rhoS(s1J6Br:KmXnac;AnacSKr:KaVqtBgZ +s/Q%JtFJcC<$JcC<$m/MS~> +JcC<$JcC<$JcCZ.m/HhZqY]s^q"jXYk4ms3o(`0A!g/S+qi:`=rK7,Cr:KmXnac;AnacSKr:KaV +qtBgZs,d2Er075HpA"=Tnb2\LoCi%TpA"R]r;--aqu$9gf`$I%JcC<$JcG*:J,~> +JcC<$JcC<$JcCZ.m/HhZqY]s^q"jXYk4ms3o(`/dr`K"uqcNdgqt'@KoC;AAqt'aXp\"FWq"Oel +pfIJtpA"=Tnb2\LoCi%TpA"R]r;--aqu$9gf`$I%JcC<$JcG*:J,~> +JcC<$JcC<$JcC]/li-bZqY^!_q>0j]eG/b5m.gVTrMTJ'rk/-A!;-3\p%%26o^_qOr:KaVqY'm^ +ri5q;s2OuU!64R'p%IJ>q"FUZpA"R]r;--aqu$ +JcC<$JcC<$JcC]/li-bZqY^!_q>0j]eG/b5m.gVTrJLc@Ocbb&NrY:?OoLREo_e=Ro&T?5o)/+W +o_8%TpAOabOStI@PQ7!=p\"7@p%\7Xp\+C[q>C*_qtp +JcC<$JcC<$JcC]/li-bZqY^!_q>0j]eG/b5m.gVTr)s#$qH*Pr!;-3\p%%26o^_qOr:KaVqY'm^ +r`]"s!*Jdcp%IJ>q"FUZpA"R]r;--aqu$ +JcC<$JcC<$JcCc1li-bZqY^!_qYL$`ZhXIms/,dnpq-OJ;3JcC<$JcCB&J,~> +JcC<$JcC<$JcCc1li-bZqY^!_qYL$`ZhXImr/CZ=s,d;Cqi:`=rfR2Cs7?!UqXNe=qXO:Mr:BjY +p@\:U!frG)r0@)Bq=jRUfCf"6qtKj[rV?BfpA=abq>J;3JcC<$JcCB&J,~> +JcC<$JcC<$JcCc1li-bZqY^!_qYL$`ZhXImqHC*_qtp +JcC<$JcC<$JcCi3li-bZqY^$`qYL'aZhXCks7ZAes18'=rOi!?qss[TqXEe=q=+=Pp[\7Rr:K[T +!;?Ajr5\fVqo/:&kOnWBmIgAMr:g!]rV?Bfp\Xgbq>J#+JcC<$JcC`0J,~> +JcC<$JcC<$JcCi3li-bZqY^$`qYL'aZhXCks7ZAKrK72DOSb(=OT(C@P5FhJnbVb?n+lJNnb;VP +oDJ7Ro`4^aO8P:C*`qtg6drOr2]s+13$s,I&/~> +JcC<$JcC<$JcCi3li-bZqY^$`qYL'aZhXCks7Z=lr`T8'qcESqqss[TqXEe=q=+=Pp[\7Rr:K[T +!;?@o!*Jkpp@d\Bq"3tHqtBs^q"Xg`r;-0bqY^0f^&ET_JcC<$NW4M~> +JcC<$JcC<$JcCu7l2LMWqu$9e"0''4qtp6dqpZ;2Fp\X[^V>e(&]DT>=]`@X$nbhn5n,)VP +nbD\QoDJ7Tp&1lea8a0V`;mpBp#>W9p&+O]p\=O^q>C*`qtp +JcC<$JcC<$JcCu7l2LMWqu$9e",r?=qtp6dqpZ;2Fp\X[^MYrV +JcC<$JcC<$JcCu7l2LMWqu$9e"'AY%qtp6dqpZ;2Fp\X[] +JcC<$JcC<$JcD,;k5P5Uqu$3c!iWlKr;- +JcC<$JcC<$JcD,;k5P5Uqu$3c!fW5&r;-Gq31lEnFcJHmIU)Ep@\@WrV-*^rV?Bfp\Xjcq#.i(JcC<$JcCr6 +J,~> +JcC<$JcC<$JcD,;k5P5Uqu$3cs&]8&r;- +JcC<$JcC<$JcD8?jSnuRqu$0b!3#n3!P\F.q=OIVpYPW2p\4CXp&(TdV7HK7qn)g>qn3"!p[@nF +o^2GAp@%qKrUKXQr:BgXs/>ssrPnoXrl>&YqS`HSq=XLSo(2VHp%/%Pp\"LYrV-*^rV?Egp\Xgb +q#.f'JcC<$JcD&9J,~> +JcC<$JcC<$JcD8?jSnuRqu$0b!0$o=!K[*Tq=OIVpYPW2p\4CXp%sXHOo1@BOo1:=OSb1@nFuDH +me#oAme6,InGVnOo)/+Vo`'sOO8Y=AQ2$RDQ21+Io^_VJo(DVNo_8%WpAOa\q#1$eqY0m`r:p6% +rdk*#s+139s*t~> +JcC<$JcC<$JcD8?jSnuRqu$0br`B5'=Shsko_A1ThY-@2p\+IVqc=#)='&L+=]nl)=8,esnFuDH +me#oAme6,InGVnOo)/+Vo`&%n=moGfp%S+LoCqhKoD8+Rp&4U_p\=O^q>L0aqtg6crOVuZs+13$ +s-E\8~> +JcC<$JcC<$JcDGDi;WTOqu$0bs7u_nrk8EJ^Ads%q"a[Vp@.b2p@\+UV#Rt+]"@mOr4Dp?qn;mq +r9j:Gq<[hBqsO7JrUBaTq""=R!;-8gs/>q:s2Y#Vqo/TTp[n4OiUZj:qt0[VrV$3aqY:!arVH9c +qY^*d\c.0[JcC<$Rf@m~> +JcC<$JcC<$JcDGDi;WTOqu$0bs7u_SrK%#?rqZ9_q=jOTnFbW2p%A3>rK7&A!0I,>rK%#Ar0$sG +r9j:Gq<[hBqsO7JrUBaTq""=R!;-2Lr07/Fq3:oEp[n4OiUZj:qt0[VrV$3aqY:!arVH9cqY^*d +\c.0[JcC<$Rf@m~> +JcC<$JcC<$JcDGDi;WTOqu$0bs8)[r!EWD&q=aUZp[n1Kp"f?7p%h_p=BAR+=BSd/r)`VpqsXIN +p?h\Bp?hbFq!\1Nr:0RQqssg[r)iAgp[n4OiUZj:qt0[VrV$3aqY:!arVH9cqY^*d\c.0[JcC<$ +Rf@m~> +JcC<$JcC<$JcDVIh>[6Kqu$0brqcYmr4_n"qtKmZeb/h5m.CGPUnmpbrji$?rOVs>rOi!?!:TmS +qX*G3qsF=Lq!\1NrUKUP!VC*`qtg6` +rOVuZs+13$s.01?~> +JcC<$JcC<$JcDVIh>[6Kqu$0brqcYRrfI/@pA"OZq"E82qtBCL!;-,Fr/h,FOcklhrK$o=s,m5B +!:TmSqX*G3qsF=Lq!\1NrUKUP!;$2Lrf6o@rK[/Bs-3TVp@Hi*qt'aXq=X^[rqH6`rV?Bfp\Xgb +p&2K$JcC<$JcD;@J,~> +JcC<$JcC<$JcDVIh>[6Kqu$0brqcInpA"OZq"E82qtBCL!;-%f!*K5%"'A]/=T)=p=9.ggmeZ>5 +m/-2JmeH8LnGVnNnc8:\=9D].=B=ik!;-!VeaiV/r:KgXrV$6bq=spar;-0bqY^$b])I9\JcC<$ +Sc=3~> +JcC<$JcC<$JcDbMgA^sIqu$0brV?TkVl0F+qtU'_qY%Glr:L#br2'D'!4r0Ar4;m>rOi!?r9`5) +r9aINq="7NrUK^S!iDfjrh]_7`VIOL`W!mWoBc&5nauDMoDS=Wp&4U`p\FU_q>L0`qtg6^rO`&[ +s+13$s.KCB~> +JcC<$JcC<$JcDbMgA^sIqu$0brV?TkN/[atrf?sOqtKs\\FodlqMP<7qiLrCOc]O&rK.#@rK@*G +g?eb)rU0LMr:'[Tq=4THN/[aqqiq&Eq3:lDs7>UJlLFN;r:BmZq=X^[rqH6`rV?EgpA=^aoDQ<# +JcC<$JcDDCJ,~> +JcC<$JcC<$JcDbMgA^sIqu$0brV?Niq,mOhqtKs\\FodlqH*\t!EWD&L0`qtg6^rO`&[s+13$ +s.KCB~> +JcC<$JcC<$JcE"Tec,FDqY^*br;-Hhs/5_-rqQEcqtB@Kp@R,4q=O[Xrh]Ogrj`$?rk&$L0` +qtU*ZrP/>_s+13$s.]OD~> +JcC<$JcC<$JcE"Tec,FDqY^*br;-Hhs,?r=rK$sQr:g*^lh0uDg\(C7rq$,Hr/(E7r/h&DOc]R' +rK-u?rK?pAkNhj.rU'ROq!\1Nr:0dWqi(K +JcC<$JcC<$JcE"Tec,FDqY^*br;-Hhs&f;&r)isnr:g*^lh0uDg\(C7rq$+jqc3c"=BPQ(#?Y,2 +=B8I(=8Z2#=8c7qm-!^.m/?>MmeH8LnGMhUo)Dhl=oVV(L0`qtU*ZrP/>_s+13$s.]OD~> +JcC<$JcC<$JcE=]c2RSl&~> +JcC<$JcC<$JcE=]c2RSMmeQ>LnGVnSMu].>Pl6mBPl?sGo(_bJnFc8DnGDbNo)81Zo_S7Z +pAXg^q#1$eqY'g\r9F7#rdk*#s+13Hs*t~> +JcC<$JcC<$JcE=]c2RS,=]ed, +<``B#=T;J$=T.U`lfm^2lhKiFmJZJKn,2\RnbuYi=TVW(L0`qtL$RrPnhfs+13$s/#aG~> +JcC<$JcC<$JcELbbPq>9qu$0brVHHf!r/[krP& +JcC<$JcC<$JcELbbPq>9qu$0brVHHf!r._5rK-r +JcC<$JcC<$JcELbbPq>9qu$0brVHHf!r,l"q,[T!p\aaXp%\1?oBPuCoDJ1W=8u>$=8l5%='/T( +=8c8$#=T7X`lKRR1lMTuCm/?>MmeH8MnG68b +JcC<$JcC<$JcEai`r>f4qY^*br;-BfrqQJjrkA +JcC<$JcC<$JcEai`r>f4qY^*br;-BfrqQJOrfI# +JcC<$JcC<$JcEai`r>f4qY^*br;-BfrqQIppfILhp@\:Sp%.bFht-R4q,dJp!`rK+r`B&#r`9&# +r`K,#s&]8&rp&A)r9F7Hq<\(IrU0ILqH3Vps&SVjqXE&(r:'[Tq==OVrUg![rq? +JcC<$JcC<$JcEso_Z'?/qu$3cr;-Bfr:p8hrkA3AqXsaXqX_Dk!:ff[!kGhNrODp>rO`!=rjr0C +pq?LflKIs+rTa@Iq<\(IrU0XQrMTUkqo&HP!64TKnF,Q.p@%qKrpfjUrq$*\qt9s^rqH6`rV?Bf +o_\.Uh>Q..JcC<$JcDeNJ,~> +JcC<$JcC<$JcEso_Z'?/qu$3cr;-Bfr:p8MrfI#Q..JcC<$JcDeNJ,~> +JcC<$JcC<$JcEso_Z'?/qu$3cr;-Bfr:p7np/h+`qt0aV^%)0np/h5o!*B/%r`B)$"'8K'Q..JcC<$JcDeNJ,~> +JcC<$JcC<$JcF*s_#F--qY^*brVHHfqtU/f!kl=^pq?\"r:KmX^%2'j!2]Xir1j;&s1&$!5/*?!9sFFki_j,q<@kCrTj:GrU'ROqPOA4_u%C>`VT&tmcs39me?2LnGVnSo)A7[o_S7[ +pAXg_q#'scqXXOIr8dh7rdk*#s+13Os*t~> +JcC<$JcC<$JcF*s_#F--qY^*brVHHfqtU/L!frG)qiC`:rq63]qt%MlqsjE;p5o<:q2kE7s,mBH +r93A-qrmk?rTa@Iq<\(IrU0N@!LB#CPl?sFPl6mDn+Z88mJ?8Fn,DhTnb_nVoD\CYp&=[ap\O[_ +q>C*[qrmt=rS[[+s+13$s/c6N~> +JcC<$JcC<$JcF*s_#F--qY^*brVHHfqtT_`rq63]qt%MlqsaYfpf@Dsr`0##r`K/$r`B8(MmeU#d='#2us&SSiqX=1HlL"H9p[A+NrUKdUrq$-]qXsj] +rqH9ar;$9eo)%YKjSe$9JcC<$JcDhOJ,~> +JcC<$JcC<$JcF7"^Adp+qY^*br;-BfqY:#cs1SHHpq?\!r:BLMj72R.p[S1NpS7_us1&$C*Yqqq> +JcC<$JcC<$JcF7"^Adp+qY^*br;-BfqY:#Js,[2AqiC`:rq--[o((i2mdg,Br:'H;oT0'8qN1K7 +s-!GqX4.GlKnB7r9jCLrp]pWqssaXrq-*\ +rV$6bqY:!ar;,p[hu)j>ir4N/JcC<$YQ'+~> +JcC<$JcC<$JcF7"^Adp+qY^*br;-BfqY1%kr`/Slrq--[o((i2mdg,Br:'G]r`K/#!*B/%r`B)$ +"'8K&rCJcC<$JcDqRJ,~> +JcC<$JcC<$JcF=$^]*s*qY^*brVHKgq=jsarM9LioY(4pp%%kIm-s3.q!e:Op7qVtrj_p;!4r-@ +r4;p?rk/'?o]H#3o&fl5rTO+BrTa@Iqs= +JcC<$JcC<$JcF=$^]*s*qY^*brVHKgq=jsarJU`7plGB6rU]^Qp[RV>kOJ?:rpTQ;l]Ck'!0[!: +qW7;1r9+%BqW[tDrTj@Is,-Z2s-EYLop#?=s-3GHqsE/)r9aINqX=CPrpfmVs7?6^qt9s^rV-0` +r;$9elhfW +JcC<$JcC<$JcF=$^]*s*qY^*brVHKgq=k$cC*Tqr%D@rT!m.s+13$s0;TS~> +JcC<$JcC<$JcFC&_>a-+q>C!ar;-BfqY:'a!2]Xirk/\G`r<])B5A]"@sQ!5&3Bq7ZgjpuV;3puV84rTF1Dq<@kCrTjLMs.oLf!lMspqSN +JcC<$JcC<$JcFC&_>a-+q>C!ar;-BfqY:'a!0$l7rf7&>r/^c9p[\4Oo^MPBi:-L0r/(<,s,[5A +mZ@.)!g;^.puV;3puV84rTF1Dq<@kCrTjLMs,-Z2!gK":rg!2Aq3:rEr0?j>mHaE2rU'UPqX=FQ +rpfpWrq$-]qt9s^rqH6`r;$6dj87s9oDRbLJcC<$JcE%UJ,~> +JcC<$JcC<$JcFC&_>a-+q>C!ar;-BfqY:'ar)WDjp[\4Oo^MPBi:-L0p/_2q"]nf-<`W<#=T2D$ +=9DT( +JcC<$JcC<$JcFI(_uB9+q>Bs`rVHKgqY:$`!;?>drOi3DrOr0Bs1S@$qsjOP_X@KmoqMGr!P#]= +\Gj&=])K;F]">Pb]=\$Sq7Qdiq;h80q;hG7q<%Y=roj1BrTXCKpnS%h_o'F2q8<*Kq8E0Lr9X4E +mcsW6q!@tHrpK[Prp]pWr:9jYrq-*\rq??cq=sm`qtetBmel_Uk5Kr3JcC<$Zi>O~> +JcC<$JcC<$JcFI(_uB9+q>Bs`rVHKgqY:$`!VVHMMZ8_:NrY4=O8Ft8o)%tRnA=VomeVb;L]3A8 +O84k;O8"b/OT=M=jS%X0jSS'7k5FKBkkXKAl2^/FM?Jj%Pa7X7Q1gI6Q2L"DlgF'6lhKiFmJcPN +n,DhUnbhtWoD\CZp&=[ap\FU^q>:$@qsOCSrT=*1s+13$s0M`U~> +JcC<$JcC<$JcFI(_uB9+q>Bs`rVHKgqY:$`!;?=knlPb[qsjOP_X@Kmoi:un"]nf-<`W<"=T;J% +=9DW)<`\lp!9O%;p>bu0qrRY9rTF1Dq<@kC!:0D\#$4f)='&F'qc3Ys!*B/%oiM/or9X4EmcsW6 +q!@tHrpK[Prp]pWr:9jYrq-*\rq??cq=sm`qtetBmel_Uk5Kr3JcC<$Zi>O~> +JcC<$JcC<$JcFO*`r>K+q>Bs`r;-BfqY:'arq?8c!5/ +rODj;s18-?s1/3Br4Mj=jl?:"rT3k;roa7Dq<7qFV>6qc_uI[O_uI[O`V[UN`Vo,slL4!6lMKoD +m/?>NmelPQnG_tUo)A7[o_eC\pAXg^q"sm`qUPK6r:U$Mrdk*#s+13Ys*t~> +JcC<$JcC<$JcFO*`r>K+q>Bs`r;-BfqY:'arq?8Irf.&@NfO+"qi1]:o)/%UnA=Yjmeqq:LAm;7 +O84n;O84n0OlbX$jSe39k5OQBkkXHClM-88PQ@&8rK[/Bns01>pZh53qWdtDqX"1JrpK^Qrp]pW +r:9jYrq--]rV$6bq=sj_qYJb>o)/1Zjo0i2JcC<$[f:j~> +JcC<$JcC<$JcFO*`r>K+q>Bs`r;-BfqY:'arq?@mr`9)#nlGh^r:0^S_XI?hoi:uns&T>*=&r@' +r)iu#r`B5'<`\iojl?:"rT3k;roa7Dq<7nEpf@Dos&B/%=&rB""lhB]5l2']B +lh]uHmJcPOn,DhUnbhtWoD\C[p&4U`p\FU]q>0s +JcC<$JcC<$JcFU,c2R#,q#'j_r;-BfqY:'arUp6ar1j;)rk8?Erk80@!:g!Vp$^#jqsF'NrOMd7 +rji'?r4E!?!5&3Bpq?XdnDa-$rT*t>q<%\>rTO4Eq5++e!6"lSs2=lR!6"lSs2=`PrP\QOs6AG) +r9F7HqX"4KrpK^Qrp]sXqssdYrq-*\rq? +JcC<$JcC<$JcFU,c2R#,q#'j_r;-BfqY:'arUp6ar/(H5r/Uc;qi1]:nbhnLn&b"pmIc54OT1C: +O8t@ +JcC<$JcC<$JcFU,c2R#,q#'j_r;-BfqY:'arUp6ar)`o!nlGh]r:'CJamT&noi:rmr`B)"!*B)# +!*B,$!`rE'oN2"OnDa-$rT*t>q<%\>rTO4EpK%8m!*/tuqc3Yss&]5&oN2&ns6AG)r9F7HqX"4K +rpK^Qrp]sXqssdYrq-*\rq? +JcC<$JcC<$JcFX-e,JP/pAFU\rVHKgq=ss`rq??aqkO2(s1SBD!583@!5&!oq6roNt +JcC<$JcC<$JcFX-e,JP/pAFU\rVHKgq=ss`rq??as,$]1s,Ho9!0@#;s,@#=p[@qGh6roNt +JcC<$JcC<$JcFX-e,JP/pAFU\rVHKgq=ss`rq??as&](unQ5JRqq<%\>roj&Vr`&ntrDreqs&T/$s&eqqr`8dXm-+0-rTa@I +qs==Ls6fgRrp]pWr:9mZ!`\gaqt9s^rV-*^qYBj]eGJt;p\j=TJcC<$JcE7[J,~> +JcC<$JcC<$JcF^/f`(%3o_e=XrVHHfqY:'arq?9_qkX5(s1S*nO5_u@UR_Z7XS_uI[L`W*mT`W!gOkj.F. +kkXKBlM^&Hm/HDPmelPQnGi%VncJF3e,K":p&=[`p\4IYq="18qtBs_rTX<4s+13$s1//[~> +JcC<$JcC<$JcF^/f`(%3o_e=XrVHHfqY:'arq?9_qhb<3ooB!1r9sROq!I&,qsEhq<%_?p58m8rKR>I!1*SKr0.2HrfmDIrg*>Eq<7/-qWRb> +rp'IJr9XFMs6fgRrp]sXr:0p\S=KTNqt9s^rV-']q>'LUh#$gCq#0IVJcC<$JcE:\J,~> +JcC<$JcC<$JcF^/f`(%3o_e=XrVHHfqY:'arq?9_pf?odr9sROq!I&,qsEhrp'IJr9XFMs6fgRrp]sXr:0p\<)ikhqt9s^rV-']q>'LUh#$gCq#0IVJcC<$JcE:\J,~> +JcC<$JcC<$JcFa0h#?C5o)/.Wr;-BfqY:$`rq?9_rM9Ffpq-U=r4E0E]Xteer9jLM`U*QhqP*h[ +qmlO4rODp>qRc^=pV$@[s53A)r8IV6qW%S9rT4"?s.oCc!li3urPSWQrkncSs2+iTn\tIFqrd5+ +qrdqAqW\"Erp0LKrpBaRr9sXSs7-*Z"M3(2oCMtRqt9s^rV-$\p\F%LjSS`Mq#0IVJcC<$JcE@^ +J,~> +JcC<$JcC<$JcFa0h#?C5o)/.Wr;-BfqY:$`rq?9_rJCN0r/LH2r/LXBr9_JirTj<7qM"g.rJpu@ +Oo1=>O8G%2Ondl7hsoY&iVhd4j8S-)o,Q2QsIPlR-JQ2[$JQ2d*IQ2HsEQ2Bb/k54?? +kkaQClMg,Im/HDPmelPQnGi%XncY;LSFc@Oo_\=\pAOaZq"OUJqW.PKr:p6Trdk*#s+13^s*t~> +JcC<$JcC<$JcFa0h#?C5o)/.Wr;-BfqY:$`rq?9_r`/_onlPbWr9_JirTj;[qGd>or`B)"!*B&" +!*B)#!*8\mpu)20n_j?(rSm\6roF%>rT=,[qc +JcC<$JcC<$JcFj3i;Vprk.s +JcC<$JcC<$JcFj3i;Vp+r.t3/pl>93rU'1Bjm2[-p$;SA!/:9( +qh=m.rJpu@Oo1==O8"b3OoO>2hYH((i;V^6iqh^7jSe3?M>)o+Q2QsIPlR-JQ2[$JQ2d*IQ2?mE +Q/:[%kPaWAl2KuIlhp,LmJlVPn,MnVnGnpSSGr-[o_S7[pAF[Wq!n1EqWn%Rr;$ +JcC<$JcC<$JcFj3i;Vpl@Y$oDeIZp&=[_p[n7Nq<@bAqtU*brTX<4s+13$s1SG_~> +JcC<$JcC<$JcFm4iVr3BlMU,Jr;-?eqY:'arq?6^rq-#]pq6X=rOi*@s17skq!7)-q!7VeOppg=6s18*>rk.sKUXJcC<$JcEIaJ,~> +JcC<$JcC<$JcFm4iVr3BlMU,Jr;-?eqY:'arq?6^rq-,Ere^K2q2Y?3p[%\@k3Da-p$2J>o7d+( +!frG)rK$u@r/gf:n +JcC<$JcC<$JcFm4iVr3BlMU,Jr;-?eqY:'arq?6^rq-+hr`AttnlPSPq!7)-q!7VC'elMcA7JcC<$ +^Ai]~> +JcC<$JcC<$JcFs6ir8HGkksfEqtg9eq=ss`rq?6^rq$3^qkO1c!5&0A!5&6Crk&3CrO`*@!4i'p +r9O.CjQZU-n*0D:rj_s]_/u(h>H..htl:1iVhd7j85YNV>d7ja8O!Z`Pf^n +_u@RS_u%CC`Vd[IjS\'3jS\-8k5OQCkks]ElMp2Jm/QJQmelMT\^T%*dK&k;oD\CYp&4U^pZqV> +q=OOQqt^0crTjH6s+13$s1eSa~> +JcC<$JcC<$JcFs6ir8HGkksfEqtg9eq=ss`rq?6^rq$9`Lku"ds+pH0qi:N4rTsIJq!-r)r9Eb8 +nqHt&!KW??O8k@?OSY%.OR(a#hYl@.i;V^6ir.p7M>E)0QMQmHPlI$KQMZsIPl?pJPl?sDQMd$@ +jS\'3jS\-8k5OQCkks]ElMp2Jm/QJQmelMRQMR-Po)A7[o_S7ZpAF[Nq!.\IqXFCXr;$ +JcC<$JcC<$JcFs6ir8HGkksfEqtg9eq=ss`rq?6^rq$9`<`]0#pf?rerTsIJq!-r)r9Eb8nl5Kg +!EWD%=8u;'='/R-pK6ufleVKqrSRJ0ro*h8rT!cTq,[Gos&Atts&T/$!`i9"r`/u!r`9)%p/h/m +p#Q&2p>l/5q<%\>roj:Erp'OLr9XINs6fgR!*oA"!:p-\rq-'[rV$0`lhKc@o_S(Sq>C'eli)J8 +JcC<$^]/f~> +JcC<$JcC<$JcG!7jSn`KlMTlCqtg6dq=ss`rq?6^rq-3]q4[l#rk&0B!kZ+XrOW'BrO`*@s1/-p +qs);frTO9SoV)2ms1&0?\bEW4\H'5>]D]D8^$shOh>Q40htl:1iVhd0U][HhaN+4us2=lRrknfS +qo&'Er5@^Wr8dhp\OFWqY^0f +li)J8JcC<$_#Jo~> +JcC<$JcC<$JcG!7jSn`KlMTlCqtg6dq=ss`rq?6^rq-3]re^Q/pPo*2q2PC>qs);frTNg+qN(`= +OSk1>OoLLCO8b7$h"TY'hYuF/i;V^6ir"W0M>rG5QMHgGPlI$KQMZsIPl$a@QMd$0j8A!: +jnn3>kPj]Dl2KuJli$2LmJlVSn,J^LScA9[oD\CYp&+O\pZ2, +JcC<$JcC<$JcG!7jSn`KlMTlCqtg6dq=ss`rq?6^rq-3]r`B&!!*Aqro2kqWqs);frTNfOqH*c" +=T)>$r8dh< +qr[n@roj=Frp'OLrTsONs6fpUs',:us760\rq-'[r:^$^jS83>p\OFWqY^0fli)J8JcC<$_#Jo~> +JcC<$JcC<$JcG'9jo4lMmel)Aqtg6dq=sp_rq?6^s7H<^s76,_rLj8(])K>A]`5VD]_f>>])K8? +lLX8hkksWAT`:_\T_c/#\[]2\ppg:5!4r-@rk.m:pY,Gtr7q,(rndV2qr%M5rh]Ccs.oe=a2e+t +s2=lRrknfSr5A0Fr5AQonDa-$rT*t>qr[n@s60CFs6BXMrTsON"7E_1e+hAjo)A7[o_J1XpA+I= +q"=IYqXXO[r;-BXrdk*#s+13es*t~> +JcC<$JcC<$JcG'9jo4lMmel)Aqtg6dq=sp_rq?6^s7H<^s76,ErJ1'*rf6c5s6B4?e*-_mnV-e# +!frG)rK$u@s,[5ArfI#kPscDl2U&Kli$2Lm/l^AQM6sLo)A7[o_J1XpA+I=q"=IYqXXO[r;-BX +rdk*#s+13es*t~> +JcC<$JcC<$JcG'9jo4lMmel)Aqtg6dq=sp_rq?6^s7H<^s76+io2bHas6B4?e*-_mnPoq:ki&q;)&,rSRM1s5EWNs&T/$!*9"t!*&qts&T/$!*0"t!``9%nlP`irT!D, +p#H#3roO%>roa=Fr9=7Hs6KXMrp9dT>?gi$rpp'[rq-$Zr:]s\h>$[=q>0[ZqY^3gli)J8JcC<$ +_Z,,~> +JcC<$JcC<$JcG*:k5P#Onbh>Bq>1$bq=sp_rq?6^rq-6^rUTo\rLa.arjr-As1J?C"2)7W])K>? +])K5?\GPOdkg\emk4,)E\+mK5\bN]5\H'5>])oXY]_/r<]^FMPg\oq(h>Q40hu2L3V>$bfbK7fF +r5ScTrknKKo#:OF!93A(qr7G3roF(?r9""As60CFs6BXMrTjOOrj`$XpX9$2rq$-]q"=OXq"NV> +p\FX]o_\L_q>K[ZJcC<$JcEXfJ,~> +JcC<$JcC<$JcG*:k5P#Onbh>Bq>1$bq=sp_rq?6^rq-6^rUKrEreLH,!/L6,rf6`4qs!q?eE?_k +pkAR!!0?u"gATe)h"ok*hYuF2huSXjrJ:9+!go=?p6GZDo9K*: +r079Am,@j$q;_J8roO(?roa=Fr9=7Hs6KXM!:BcOp7;0Qrq$-]q"=OXq"NV>p\FX]o_\L_q>K[Z +JcC<$JcEXfJ,~> +JcC<$JcC<$JcG*:k5P#Onbh>Bq>1$bq=sp_rq?6^rq-6^rUTnfrDiMko2khRq<6>kqr[EJpfIT! +=BPQ(!`iB(oN:]d!*8OArS.;+qVD,,rnm\4s&AYkr`9)#r)Ebsp\FX]o_\L_q>K[ZJcC<$ +JcEXfJ,~> +JcC<$JcC<$JcG0]">TR]E,^Yot:@0s[ +qtg6erTsN7s+13$s2=qf~> +JcC<$JcC<$JcG0rfI#Mrg`oWrq$*\q"=LWo(V/=q>'m`o_\L_qYfd[JcC<$JcE[gJ,~> +JcC<$JcC<$JcG0'm`o_\L_qYfd[JcC<$JcE[g +J,~> +JcC<$JcC<$JcG3=kl1;Sp&*\DpA4[^p\=a^rV$-]s7H<^r:0jXrh0+]!5&0?"M;=Y]=S!R!P5i> +])K8>\GbU:k5"-;T`(M]T)PA^T)Q4n\,a)6\Gj#A]">Se]^ri:]_pCVf_jFugATe*h"oh,UA:S] +U]nucbK@oHr5ScUrPSBJo>UUFk2?3srSmb8roF+@r9"%Bs60FGs6BULrji!VqpPJks7-$XrU^$\ +p@\.Qm.]lAqYC!ap&"XaqYfg\JcC<$JcE[gJ,~> +JcC<$JcC<$JcG3=kl1;Sp&*\DpA4[^p\=a^rV$-]s7H<^r:0jXreC9)rf$orf@)@qiC9/r7C_rr7Uo"rS.>,qV;.,q2"p)rg3_QQM$OCQLgC; +QMZs0i;MX5ir%j9jT"?>k5XWEkl'cGlMg,KQMI*LSH&-Wo)81Zo_.tOp?_P?q"jg_qXsa_r;-BZ +rdk*#s+13gs*t~> +JcC<$JcC<$JcG3=kl1;Sp&*\DpA4[^p\=a^rV$-]s7H<^r:0jXr`/eqr`/_opf@Grr)`j[cfY&b +rD`\nq,I&is&T2&rDs##=7o\e=8u>!fD+"rg%jA#g]$")h>C1H;u]esk5XWEkl'cGlMg,K>P(npnbhtVoD\CUp%J+Gp[%\Oq>0s\qtp +JcC<$JcC<$JcG9?kl1;SpAEkGo_SF[p\=^]rq?6^rq-3]r:9mX!hc6\rh'7brh0(us1A9A!kZ%T +rji'?rji$UUFs53M+q;:u*ro*k9r8[e;s5j4As6'FGrTX@IrOM^P +s3gnorpfmVrq$'[o_%_Inb;MIqt^-cp&"XaqYfj]JcC<$JcE^hJ,~> +JcC<$JcC<$JcG9?kl1;SpAEkGo_SF[p\=^]rq?6^rq-3]r:9mX!/CB+reCB2!06`3s,Ql6pZC/j +pZ)>7q1\Qrrf?o;rf7&@rK$r>rf7&@qN(60!KW?5fDO;"g%sG%g]$"-h>)g+M#3&-QiWP>oT]EB +q3:rGrK[/Dqj%3=p"oN%pu)/1ro3k9roF+@rT=.Cs60FGs6BQKpmq>QrpfmVrq$'[o_%_Inb;MI +qt^-cp&"XaqYfj]JcC<$JcE^hJ,~> +JcC<$JcC<$JcG9?kl1;SpAEkGo_SF[p\=^]rq?6^rq-3]r:9mX!*/nsrD`o" +JcC<$JcC<$JcG<@l2LGUp\a+LnbW%Vp\=[\rq?6^rq-3]r:9mXs7#`TpppI;rji0C]"7aKrj`!; +s5s4?g>qqem[a?dp:(+5pUL76!4r0As1J!;s1J$UpXfDsrRq&$rnI1@s.]Ogs.fkDbfn8RaiF:u +s2FrSpr)dCqS_p[qVM2.qV_D4ro3k9s5a4ArT=.Cs60IHrODpXpXB/jrm:`8rpfmVrU]sZme-#A +p@n.Qqt^0dpA=abqYfj]JcC<$JcEaiJ,~> +JcC<$JcC<$JcG<@l2LGUp\a+LnbW%Vp\=[\rq?6^rq-3]r:9mXs7#i>s+UN-rf-rrf7&@qN(91s,Zj(pXfDsrRq&$rnI.%reUT2r0RMOQL'n: +QMm*EQMQm:h>6",htl:2iVqj7j8\3?jo+?AkPscFl2?nJT(efRS,i'Xnb_nUoDJ7Kp$VPIp[\+V +q>C*_qtp +JcC<$JcC<$JcG<@l2LGUp\a+LnbW%Vp\=[\rq?6^rq-3]r:9mXs7$%hr`/hr"'&B& +JcC<$JcC<$JcGBBl2LGUq#'CRnG;hRp%\L[rV$-]rq-3]r:9mXrpTpVp7MN!\[o?M\cB;?])T>@ +](ro9\Gs&8jO*#dipN?;[f3c4\,a#;\,a)6\Gj&=]DfJ8]`>_CeG7Ymf(mqrf`'S%gAdfCT_P2d +UH./htu@3iVqj8j8\3?jo+?AkPs`G\,Nl=\^].'df@hq +d/q\anG_tSo)81Wo]>c +JcC<$JcC<$JcGBBl2LGUq#'CRnG;hRp%\L[rV$-]rq-3]r:9mXrpTpVr.k6*s+UE2rf6Z2!06i6 +qrH/brSm6u!07&>qN1Z:!0I)=!0I2@!0I&c +JcC<$JcC<$JcGBBl2LGUq#'CRnG;hRp%\L[rV$-]rq-3]r:9mXrpU!Xq"OIVqt^0dpA=abqu,s^JcC<$JcEdjJ,~> +JcC<$JcC<$JcGECl2LJVq>BUVnG;bPoD&:YrV$*\rq-6^r:9jWs7$$Vqk3kZ"M2.S]".gOs1/-? +rj`$?rOE!>\[h^LrjVO[guA4irgrbQrLEnrrjVa6s0qX1rji'@s1J!;!5.jOrRLktqUb`!rRh1A +rLWt[rh01_rltJe"3\j/a8EsW`W*mV_tV+A`VIIAh"]_)hYuF1i;V^8ir.p;jT"??k5XWE[KO(L +\CB%&e,RkrdJqSmnG_tRo)/+To]#Q=pA+IVq#'scqY'g`r;6H\rdk*#s+13ls*t~> +JcC<$JcC<$JcGECl2LJVq>BUVnG;bPoD&:YrV$*\rq-6^r:9jWs7$$VqhP0*s+UB1rf6<(o]+`d +qr.'urIb-1rf?o;nrNg4r/^K3!0?["rRLktqUb`!rRq+'onWF3s-E_Orfll:rg*PKqNgrBnD*fp +rndY3r8@S5s5O";s5a4ArT=.Cr0@;RpRV2Orp]pWq==ITq=N\>q"FOXpA"R]r;--aqu$?imf%e; +JcC<$ao?k~> +JcC<$JcC<$JcGECl2LJVq>BUVnG;bPoD&:YrV$*\rq-6^r:9jWs7$$VqcrRLktqUb`!rRq*H!)rbmr)3Sq +r`8u!!*9)!!`i<$q,[Mqs&AtuoN1ihnD*fprndY3r8@S5s5O";s5a4ArT=.Cr`T8)qGdAmqc*Ra +rpfgTr:BaViq<*?q=jUXr;$9epA=abqu,s^JcC<$JcEjlJ,~> +JcC<$JcC<$JcGHDlMgSWq>B[XoD8%RnG)qUrV$*\rq-3]r:9mXs7$!UrLj"Z!MI%%\c02>\H'5< +\HKFQ\@B*K\Gir=[c?EDinWMgi;0#BSG\lUS,g%t[K*f4\Gs&2\G`u;])]M9^%KkKeG[qsf)!tu +f_qB>T),)YT`348bQH&2aiF>!s2G#Vs24TLoYpXEp=fAtrS78*rnd\4r8@V6s5O";s5a4AroO?h +ZaI6MrRCSjs3^nprm:]6rp]pWq"":Qp%7D>q=a^[p\=[^r;-0bqu$?imf%e;JcC<$b5Zt~> +JcC<$JcC<$JcGHDlMgSWq>B[XoD8%RnG)qUrV$*\rq-3]r:9mXs7$!UrJ1?+rIt93rJgf:l](r) +q;U2gq;D+&r.Fp!rdt33rf-u>q2k3/rfI&=oT8appXK/lrmpqt!8.+%pP8[6"IYXDQ^7W8n!3m< +s-pRV5P!h8ZIrp]pWq"":Qp%7D> +q=a^[p\=[^r;-0bqu$?imf%e;JcC<$b5Zt~> +JcC<$JcC<$JcGHDlMgSWq>B[XoD8%RnG)qUrV$*\rq-3]r:9mXs7$!UrDr_o!*&qtr`9&!rDrnt +rDio"qcq=a^[p\=[^r;-0bqu$?imf%e;JcC<$b5Zt~> +JcC<$JcC<$JcGHDli-_Yq>BaZpA4@Um.gMQr:^![rq-3]r:9mXrp]mT!:KNQ!M?t$\c98>\H9@Q +\G`u7\Giu:[eet5i;_[7SbnrWRfJoPRfT%grO)^8qRHL5p:(48]",EO])]M:^&$.QdeqSieGe"s +f)O@tSc,/WT)kV1rltGd"3\j/a8EsW`W*mV_t_1@`VROAgATe*h##q-hYuF2i;_d9ir.p;jT" +JcC<$JcC<$JcGHDli-_Yq>BaZpA4@Um.gMQr:^![rq-3]r:9mXrp]mT!:Kc?s+^H*#_\4uNK0!X +NfN@`qVfu_s53[*on!3sO8Y(=O8=t/NrkE*OSk14OS[B$deqSieGe"sf)O@pLAHZ*RJ`ETR@'>- +QN!-KPlR'?Q2R$KQ2$[AQ1*H*g]$"*h>c@2hu2L5iW%p9j8\3?jnt8CPF\9DT(efRS,f&Xn,DhT +nb;VKoC;J>p&"I[p\4I]q>C*`qu$BhrU0Z9s+13$s3(Fm~> +JcC<$JcC<$JcGHDli-_Yq>BaZpA4@Um.gMQr:^![rq-3]r:9mXrp]mT!:Kbcq,IDorDiht!*/tu +r`/Ymr)`aRe_pJbrDNDhqc!Pqq,dGqoiM,p!a/W,r)iYoqU,/fr6tJkrmgtus47?N;c?Tm;ZK_p +;uKVn;uTes +JcC<$JcC<$JcGKEli-_YqY]m\p\ORYl1k/Mr:]sZrq-3]r:9jWs7#sTs6fWS".u0V])9)E\@T8^ +\[]/[\c0)=\bWc7\,Wl:[Hlc7hu2F1SGerQRK/iURfBkq[K*f5\G`o1\-':Q\[qdP!5/$=nBq3_ +rR:Vmrm_&#SFrHQT)PA^cN)8ic2Gifb/q^%`rF$X_uR^N_u[iqn\tCDo\'#nrnIG-r8%D0s53e5 +s5F";rSmn=ricO1ZEhs.psf5js3gqprm:T3rp]mVoCDMEoCVSGr:^'_p\=^_rVH9cr;?Hjmf%e; +JcC<$bl<1~> +JcC<$JcC<$JcGKEli-_YqY]m\p\ORYl1k/Mr:]sZrq-3]r:9jWs7#sTs6flA!/CB)re192rJgi; +l&G#ekhl?qpOiHsq1A^.O8Y(=O8=t/NrkE*OSk15ORUZrdf%YkeGdu!eqNXK!/LN@rL!VQs-EtV +Q'@MuQ'@O,Pl[29rKdJKpQk]Ao\'#nrnIG-r8%D0s53e5s5F";rSmn=qi^fHrLWqXr1*eVr9sXS +rUKLMoCMSGnb)hRr:fs\rV?Egp\Xmdqu,s^JcC<$JcEsoJ,~> +JcC<$JcC<$JcGKEli-_YqY]m\p\ORYl1k/Mr:]sZrq-3]r:9jWs7#sTs6fV^r`&qtr)N\r!*0#! +!``3!p/_,n!*8FDkhl?qrDNDhq,I)ir)iVnr`B;+=BAU+r`JnrnBq3_rR:Vmrm_/&;GpFlqc*Ai +s&]/!$s$G3=BAR)<`N.#<`Srrr`'##='"imqc<@BptG`%rnRG-s5*e5rS[_7s5O";!9F#Ypf.)i +r)E\pr9sXSrUKLMoCMSGnb)hRr:fs\rV?Egp\Xmdqu,s^JcC<$JcEsoJ,~> +JcC<$JcC<$JcGQGli-_YqY]s^q"ja\kP4lIr:]pYrq-3]r:9jWs7#sTs6fpSqOdh\r13o"rji!; +!4r0?rO;s=\@B*K\Gir;\Giu:[K_ +rk%m;r6P/bpsK)hrR:\opRM#Lrm(\lbg"E2bQQ)0a2Z*t`WX9!`5BLg`9kPC`;/$]f_sM"gA]k, +h#-".hZ)L3i;_d9iW/$9YQ1s-e+hGje,Ri!dEp7dmeZDNnGMhEo()DIo^qhSpAF[\q#'sdqY9sb +r;6H]rdk*#s+13ps*t~> +JcC<$JcC<$JcGQGli-_YqY]s^q"ja\kP4lIr:]pYrq-3]r:9jWs7#sTs6fpSs+^H*qh4p.rJ^f; +r/C]8mZ%8)pYXueqVC[o!.t0%qi:];qN1Z:!0Hr9!g&P+rK$Z6r6P/bpsK)hrR:\opP&Bsr0dMN +s-X(XQBd`"Q'M<4pQbT@!1!5Crg!<2qUkc"qV(r's4mP.s5*e5rS[_7s5F+?OcfR)qORPUr13bU +!LrNRn,;bRna>u=oD%tMp&+O]p\FU^q>L0bqtp +JcC<$JcC<$JcGQGli-_YqY]s^q"ja\kP4lIr:]pYrq-3]r:9jWs7#sTs6fpSpf@>ns&AnrrDinu +r`0)#<)iQlrDs&$i8F@einjOfpJ^cboiM)or`9)%q,dPt#$G&0=BAU,pK.:=psAf`rmLbor7(^D +qG[5is&/u"=',?#"BJT+=BGK&!*/Yls&B&"m8s9fq:GJqrRq&$rnIJ.r8%D0s53e5s5F";!omBb +r)`VlqGmGm!E8F_n,;bRna>u=oD%tMp&+O]p\FU^q>L0bqtp +JcC<$JcC<$JcGTHm/HhZqY]s^qYL!_kkOoHqtBgXrUg*\qssdWrp]mTs6fmR!:9ZW!2'(Y!4r0? +r4)a:s0r3@\@B#Wrj_g6rO2a6q;0i]!o0<9oUGlLrgEeRs0hs:rjDg9ppg=4!P#W7\-TXV]",D` +]=Y`N^%]hLchu/ddJhSne+K7,Sc-k:c-4DVrlbPhb/hWC`W!mV`;daN`9bGC`:;IXf_sM$gA]k, +h#6(/hZ)L3i;_a:iii9as4%(tpXK,i"k(fGd*U, +JcC<$JcC<$JcGTHm/HhZqY]s^qYL!_kkOoHqtBgXrUg*\qssdWrp]mTs6fmR!:9ZC*aqu$BhrU9`:s+13$s3CXp~> +JcC<$JcC<$JcGTHm/HhZqY]s^qYL!_kkOoHqtBgXrUg*\qssdWrp]mTs6fmR!:9S`r)Nbtr`&eq +rDrqus&T+uoiD)os&SsPg>)bar)<)aoN1unr`9)%q,dSus&f>(r`B,%pfI48qp52eqU,;jrmUO= +q,@Gr<``B$< +JcC<$JcC<$JcGTHm/Hk[qY^!_qYL'alM1)Iq=aRUrUg*\qssaVs7#sTs6fpSs6T`Xs.B4\rgj(Z +!4r0?#.V.P\%&rYrj_g6$FmRS[^W]S[^NTPrjChCo%a6!s.'(Xp6tuKrg9qof/cb/q^&`W4!W`;[[N`9bJ@ +ebRelfDaG%g&0S(g]-(-h>c@3hu2L3YPtcteGReqdf7_ociEJ4meQ>KnFuJ9o(qtTo_8%WpAOa] +q#1$eqY9scr;6H^rdk*#s+13qs*t~> +JcC<$JcC<$JcGTHm/Hk[qY^!_qYL'alM1)Iq=aRUrUg*\qssaVs7#sTs6fpSs6TK6re1<(s,I&= +s,I&;qi1T6mu?Dao%a6!s+C<&n:CV!qi1Z;plPK9!0Hu:"H\b.OHBI&plPI!o?R<\rQtDg!n)aT +rIb!#s+U?)!1<\PrL!VQ!go=?r0@,CpQb35r71Voq:GVurn75's4dS/rS@M1s53e5rK7)B"J20T +S=KMJrLWqXr1*eV!:BdRq="4Mp[RG;qXaUVp\"LYrV--_rV?Egq"t!equ-$`JcC<$JcF$qJ,~> +JcC<$JcC<$JcGTHm/Hk[qY^!_qYL'alM1)Iq=aRUrUg*\qssaVs7#sTs6fpSs6T;WrD`_qrDrqu +s&K5%<)clkoDA1Sp&4U_p\FU_q>L0bqu$BhrUBf;s+13$s3CXp~> +JcC<$JcC<$JcGWImJcq[qu$-aqYL'ameHJLq"FCRrUg'[qssaVs7#sTs6fpSrTjQXTDY;ZSH,2Z +RfL&!\c9/E\%&oV\@K,ZrO2j:\$l7Er3lL1s5!>&l.c*h!h5XIqjIANr0dPO!13Vls0r$:!4Va5 +rjMs=\$u4D!4i'>rk&0Br4VjKqp"r^rQkJis3^Y2!h5^Mr13eV!1j&6!RAsebQH&2aiOG#!6+rU +rkn]Q!QE"E`V@s[ebn"qfDaG&g&0S(g]-(.h>c@3hZ2U2Y5kfteGReqdK%\nd/NG2me?2GnFQ2< +o)&%Vo_A+XpAOa]q#:*fqY9scr;6H]rdk*#s+13ss*t~> +JcC<$JcC<$JcGWImJcq[qu$-aqYL'ameHJLq"FCRrUg'[qssaVs7#sTs6fpSrTsB7q1SU(s,?i7 +rJ^6*s5!>&l.c*h#(hDWJ:N-!rIFlupji=&r/Uf +JcC<$JcC<$JcGWImJcq[qu$-aqYL'ameHJLq"FCRrUg'[qssaVs7#sTs6fpSrTsJ_p/_,kr)N\r +s&K)""'&<"$\$i`SrjMj9qR6:/q:jc[!87@?rL*VQqjIDMs-E_nr3lX7s0_p:ppg@5 +rj`!;qmZX:rOW!?rk/3CoZR0VrQY/`s3L8)rL +JcC<$JcC<$JcG]KmJcq[qu$0b!/UOKqt]aVp%S1Ro_&.SrU]pWrpg$Xr9s[Rs6]aN!:0Q:qLnj% +q2PB4qi1T6qi1W7pl5+(hV%t_rdaZks+'urs,?r:r/Uf +JcC<$JcC<$JcG]KmJcq[qu$0b!)rdkqt]aVp%S1Ro_&.SrU]pWrpg$Xr9s[Rs6]aN!UEbW +JcC<$JcC<$JcG`LmJct\qY^'a!rBI0rqcNfoD&(Sp@e%Lqt0jYqXXXUs7#sTs6fmRrTsRM"R;SM +SXobMpmV>r\[h^LrjVp9#e.=R\$i`Q[^Q1C!k5VHqmHI2rjD+HnCdcms-inSrL3bSqj@DMr0@>j +r3lX7s0h[3s0r!;s0qs:rji!=rk&-As1S0LpWNNZrQY;dr0mPOp6kuNqTf2fc25]lbK@rI`l5s: +`Pf^n_u7LS`Ph5aqU55hq:,Dos47,"s4IA)rS%;+s4mY1poabIe'mm;rR:bos3^hmrTsLMqsNqA +o^M\Hp@A.QrUfpYrq? +JcC<$JcC<$JcG`LmJct\qY^'a!rA+:rqcNfoD&(Sp@e%Lqt0jYqXXXUs7#sTs6fmRrTsRM!pYJn +qLn^!q2PB4qi1T6qi1Q5qMjjqnCdcms+'`kq0r?ns,?o9rJpl8irmh&"r7Cu$s4RA)s4dS/ +s5!I4r1 +JcC<$JcC<$JcG`LmJct\qY^'a!r?%urqcNfoD&(Sp@e%Lqt0jYqXXXUs7#sTs6fmRrTsRM!:'8Y +r)N\pr`/tts&K&!r`'## +JcC<$JcC<$JcGcMmJct\qu$0brqZW*riZ4qo_A7Vp@dqIqt0jYq==OTs7#sTrpKgRrTsRMs69[M +SXobMp6u,q]".dL!4Vm7"1YhL[edE2[f3Z8['fn?rj;a5pY"lbq:GP4rg3\RrL!JKqj.)es0r$: +pUL74rjW$=\@;IIrOMp=rO`$@rQ+cUr6"iYrQG>fR$[N6rL*PO!7(Ge"4#08bPo`cb6,o/a2\+t +rl"`Prl"]Q!6"iT!6"`Qp +JcC<$JcC<$JcGcMmJct\qu$0brqZVYre^ULo_A7Vp@dqIqt0jYq==OTs7#sTrpKgRrTsRMs69UK +pOrO"re191s,?o9rf$`6rf$`6qi(E3pY"lbq:GXsrdXorr."Bgrf$f8rJpl/WSGo#Sm/68Imcs9:nG;\Mo)/+Yo_S7Z +pAXg_q#1$fqY9sdr;6H^rdk*#s+13us*t~> +JcC<$JcC<$JcGcMmJct\qu$0brqZUtr_rdko_A7Vp@dqIqt0jYq==OTs7#sTrpKgRrTsRMs69UK +q,[;ks&8kqs&K(us&K&!r)E_rr`/MipY"lbq:GODpf$lc!EWD& +JcC<$JcC<$Jc>`MmJct\qu$0brV?Q)\,NN1q=XOZp\FOMp%n=XoD.tVnc&%Un,DbTmJZDOli68M +l2R:ES,U"t\Gs&;[f[/[Q6[/JY9fDjFtR.lsCQ2n>h[f\%&oVrj_s:-gqu-$`JcC<$JcF4!J,~> +JcC<$JcC<$Jc>`MmJct\qu$0brV?\\ObejNq=XOZp\FOMp%n=XoD.tVnc&%Un,DbTmJZDOli68M +l1p#2L&?W'NW+n8NW+n6NW+n7NVSP2NW%MgfDjG#J,OiqI/n`oI/n`pIK+crIJf''NW"n9O8=q< +O8b4AO-'=$s,d2A!K`B>OR^Eiao0B[bPltfJ,b$!Jc(,tK*$XmRJN&arR1\or7(bss47/#s4IA)rS%:5s,m5@!h>gPrLX%[r1!bXr1:-gqu-$`JcC<$JcF4!J,~> +JcC<$JcC<$Jc>`MmJct\qu$0brV?Ot=T25!q=XOZp\FOMp%n=XoD.tVnc&%Un,DbTmJZDOli68M +l2"HV&arR1\or7(bs +s47/#s4IA)rS%9Rs&o;&"'JT':-gqu-$`JcC<$JcF4!J,~> +JcC<$JcC<$JcG-:qYg?ipA=da!r9=7rN>qjqtKp[n+HJJqt'URrUKmVr9sXQs6]dOs6K^MrTXmIfoL0cqu-HirUBf;s+13$s4%(!~> +JcC<$JcC<$JcG-:qYg?ipA=da!r7t@reLQ2q"Xa\q=a:Mq"4ITq""CRrp]jSrpKgRrTsRMs6BRI +n:Uk'NK*mqrJgf8qi1T6r/LH0rf-X'mah6b!IoR_IJ]!&NW"n8O8"_;O-#J&O8k=?Ont1;`q[UL +aSs<\b5HbgIf4cqJH(3"JcLB$Jcp^XR$jB=R/WNQR/`TSR/`NQQ1U=0Q1rW&d/)/hdf7eoeGn)! +f)=5#fE'[ZpQ5EFs.0+[s.0(X!1j%ZrLNkVrgWrQrTj1Dp[.YAo'cMGrUK^Srq$*\qt9s^rqH9a +rqZNhq>:-gqu-$`JcC<$JcF7"J,~> +JcC<$JcC<$JcG-:qYg?ipA=da!r5r#rDWLdqtKp[n+HJJqt'URrUKmVr9sXQs6]dOs6K^MrTX8] +qGmDn!*&qrrD`ess&B"ur`8bno2bS:mah6bs&AVhqc*Jns&K2&=BGK&nlP`k!`rK+r`B#"q,dL6 +prE0NrlP/^peq&hqGdGm!)i_pr`9&#!*9)!s&T)"rDrqup/^ifr`9#"pWrcaqU,;js3pnqs4./# +rR_)%&)#Z;='/O*=BJX,=B&7"r:'[Tq==OVrUg![ +rq??cqY:'crVH?erVZQknG\"=JcC<$eGk%~> +JcC<$JcC<$JcG0;qYg?ip\XmbrqZT&r3#tmqtL!]nFcSKq=F@OrUKmVqsXOPs6]dOrp0ULrosIH +pRD,OrL3o$]"5HO\Gs&;[f3]6[K*`6Zi[S@[/RK/ZiIN5[/AMDeb.GjR/<6LQM6[CQN+;l[J@64 +\$id:\-BFP\@8rW\G`u;])TDA]_BDB`r3sRaS;)!QhZpPREWn#c-FW4cNDJ;bfot-"Nnj,`Pqeo +qnrHPqo/QQrl+fRp!3N^rQtJirmLhqrRCkts47/#!8.%KrQtSl!RfHgeGRepdeqJml2BoFlgjE9 +mJ-,Bn,;bSnbVhUoDS=Yp&=[ap\Xabq>L0cqu-HirUBf;s+13$s4.."~> +JcC<$JcC<$JcG0;qYg?ip\XmbrqZSUrJ1H1r:p0`qtBOPq"4CRp[\:Qrp]gRrpKgRrTsOLs6BUJ +s60'-rIY-2NVe\6NW+n7NVnb7NV&/0NVqAreb.GjIeJ3eIf+TqI#X-`N;\b8Nr4t4O9Uc-OH5Ha +OSk7;OS?`k`r3sRaSgPbIf4cpJ-(:PJGk'!QiNQMR/WNQR/`TSQi`V?Q1L70Q1`H$ci)5gdJhSo +e,@erec45!f)XItOSt^LSc,/[Sc"uXSc,/XSc##WRfM^OlMTu=m.TiAme-&InGVnRo)A7Zo_\=\ +pAXg`q#:*fqYC$er;6H^rdk*#s+14#s*t~> +JcC<$JcC<$JcG0;qYg?ip\XmbrqZRqr)Pc]=bfR`:_+J`r3pZaHi+iQMm*KQMQsFR/bA7c-FSZcHjl:cNDJ;bfp". +s2kGca2Q$r`;@IP`;@OQ`;[aT`:hIOcMl/hd/;;kdf7epeGn)!ec==qY5Q`Id/qbFe+;)ee,Rkq +d/qbDdJ`>-lMKo8m.fuFme?2KnGVnSo)A7[o_\=\pAXg`q#1$fqYC$er;?N_rdk*#s+14#s*t~> +JcC<$JcC<$K)b9 +JcC<$JcC<$K)b9Nli68K +l2TrIkOqmV<)rcor_r_os&B%ur`/qupf6re!7g5]qU>FDr)E)arDrr#!*B,"nlPZis&])"qH*R4 +ou6mLrPnoZqbdDmr_iSkq,@Ap<;]`"<``='='#<#s&T,#rDrkspK$rgr`8a;q9Jucrm:Sjs3gqr +rRCkts4.2%r)W\rrD`esr)Nhu<;TSo<;BPk<<#nql29iDlgF-7mJH>Gn,;bSnb_nVoD\CZp&=[a +p\Xaaq>U6dqu-HjrUBf;s+13$s4.."~> +JcC<$JcC<$KE(B=qu-Hjp\XmbrV?Hfs0Vg1s0)F)s7cHbo_&%Pq=F1Jr:0aTqsXOPrpBXMs6K^M +rTX@Gs5sCEqjR2Is189Brj`$Zi7<3[Ipp(eFD#]df,U1QN*5.c2Z&icd;[;!mSs5 +qof#^#KXp(`Pf[4`;@IP`;@OQ`;dgU`;@aSbl,f`cMl/id/;;kdf7eqeGn(lY5HZHd/h\Eo$mTd +rR1Ylq<@eAq!7A7qsF=Lq=":OrpfmVrq$-]qt9s^rqH:-gr;H-aJcC<$JcF=$J,~> +JcC<$JcC<$KE(B=qu-Hjp\XmbrV?Hfs,[2:r.tCIr:]dUq=OLSo()_KrUB^QrpKdQr9XILs6BRI +s60LG!9X65o7R('!0-u:!/pf7rf$o:r/LT4rf-Q/qpb/bpMnG_tTo)A7[ +o_\=\pAXg`q#:*gqYC$er;?N_rdk*#s+14$s*t~> +JcC<$JcC<$KE(B=qu-Hjp\XmbrV?Hfs&T/!r) +rO;X5!4Vd6s0r!;rj`$?r4DR;r58KOrl+o%!1!MIpQbWArg*W.rlk>c$I6uEcd0n]bfn8QrQG5` +#KXp(`Pf[3`;@FP`;@OP`;dgV_uRsObPfZac2>leci;AjdJqYpe,RqsXn]%!chl)hd/h\Eo@3]e +r6kPks601@q!.V>oBcDBr9jFMrp]pWqssaXrq--]rq??cqtU0drqcHfrVZTlnG\"=JcC<$fDg@~> +JcC<$JcC<$K`CK>qu-Hjp\Xpcr;$O84n;O8b7> +Oo1=4_Yh=M`;[aPIJeQiIJnWpIfPi.R/NHQR/`TSR/`KRQBh*,rKRDJQ2QsGPlStubPfZac2>le +ci;AjdJqYpe,RqmO8b4@S,8`USc,/[SbnrPSc##VS,_^Gl1jQU6dqu-HjrUBf;s+13$s4@:$~> +JcC<$JcC<$K`CK>qu-Hjp\Xpcr;$tt<<#no:FCrP\]Sr)3PnpJh/ks&Atts&B#!!EE+s<<-)!U6dqu-HjrUBf;s+13$s4@:$~> +JcC<$JcC<$L&^T?qu-Hjq"t!crV??cs0Md4riu[3Yct=7p\"FUqXa:KqXOIPq="=NrpBXMrp0UL +rTX@Gs6'@Cs-iPKrLEku#e@IU\@8uW\$l+?s0VX/osF,6pX&rdpm1]?rfm5B"1#;@Zi7?3[JRE2 +\,*T7\,!Q6\,Wu:\H'5>]DfV@_=thG_tfPfPlR-LQiG8.bl,cncd:%bcd'eZbfe0-bQ#]faMu3< +`;.=M`;IUP_u[iqqoS`Xq9/c]s3:Jes3L_lrR(YnriPpts3LShs3Ukqe+;)ee,7YmdJrD.kjn!4 +lM9c>m/?>MmeZDOnG_tUo)A7[o_eC]pAamaq#:*gqYC$er;?N_rdk*#s+14&s*t~> +JcC<$JcC<$L&^T?qu-Hjq"t!crV??crf@&9re^Z2p\"FUqXa:KqXOIPq="=NrpBXMrp0ULrTX@G +s6'@Cm=Y@ss,?u9",r.sN;8J0N;nn1N:#$ed/VGeI/&$gHMi-fHM`^"N;eh7Nr+krkSGrL*\Qs-`nSs-EbPQ1U=>Q26^GQ'D0fqo\`XrlkDer6G>g +s3U_ls3g\'rK.&Kqjd\WrLX%[qjdGPr1*_Ts6'@Eo',o6q:-gr;H-aJcC<$JcFC&J,~> +JcC<$JcC<$L&^T?qu-Hjq"t!crV??cr`8hop\"FUqXa:KqXOIPq="=NrpBXMrp0ULrTX@Gs6'@C +r)EVnp/Lof!E)kp<<#qu<;ontleci;Aj +dJqYoU6dqu-HjrUBf;s+13$s4I@%~> +JcC<$JcC<$L&^W@qu-Hjq"t!crV?!4_s9!4Dg5rO)X3qQon&rmCGdp!kjRd3 +lMKoBm/HDNmecJPnGi%Uo)J=\o_eC]pAamaq#:*gqYL*er;?N`rdk*#s+14&s*t~> +JcC<$JcC<$L&^W@qu-Hjq"t!crV?<5oo/mtp<`KYqp,1gq0VOUqi1N4s,Ho9q2b?5s,[2Ar/pu? +pV6U@rPAHLs*XNg!.ONfr0R/FrL*\Qs-X"WQ^=#'o9B3=qNLuFpW3#\s31JerQbGhs3Ubm +!KE-;O8P+=S,/ZTSc,/[SbnrPSc,)VRfMUKkPOK3l1sWAlhKiGmJZJMn,DhVnb_nWoD\C[p&=[b +p\Xabq>U6equ$BirUKl +JcC<$JcC<$L&^W@qu-Hjq"t!crV?JcC<$f`-I~> +JcC<$JcC<$LB$`Aqu-Hjq"t$drV?9a!;HGt!4;^2s0DX/!;69^r:BROqXOFOp@%tJrU'LKs6K[L +rTX@Gs6'@Cs5a:Bj6W97])T>@\,a#:[K*`7[/IE4[.q!%[/828cMu/cQ2d*KPQ-gDOnk1=^@]2=_"s8jPkLCBQN,2.bP]Tabm_qFd*L%`c-4DS +b0/!-aooi,`Podj_u.IP`Vd[Na8!aSaoBN]bPo`cc2Gohcd:& +JcC<$JcC<$LB$`Aqu-Hjq"t$drV?9a"o"%;O,o7uMuS\6M#d5Ho_e=Qo(qnQnFl>LmeuPMm/QDN +lM]uIkl9iEk5XNDjQ#TZqi(T7rJUZ6qi0s$qp4TRs3:CerHe +JcC<$JcC<$LB$`Aqu-Hjq"t$drV?9a!V]Xo=8Gqr;ulUho_e=Qo(qnQnFl>LmeuPMm/QDNlM]uI +kl9iEk5XNGjPs3<;uT\p;tO&c;u]_q;uK\nrdc2u>=d.LE@=&i8p<<#tt:-gr;H-aJcC<$JcFI(J,~> +JcC<$JcC<$L]?iBqu-Hjq"t$drV? +s0;d6['[0Grj;^5r3lR5qmcX7qmcX7s1&'="1l+V]_9&:^AG\APP17@Q2HsJPld8pbl#Z^bR)P? +d*U+ac-4DTrlY8as2kJda2Q$9pr!!I!6+lSrl+`RrQ"cUs2k8_rQG5bs3:Mfri?%"riQ+$!7(Ph +qp>Aj!RfHgeGRendf%Snjn@j4kP496l29iFlh]uImJcPOn,DhVnbhtXoD\C[p&Fabp\agcq>L0d +qu-HjrUBf;s+13$s4dR(~> +JcC<$JcC<$L]?iBqu-Hjq"t$drV?Ubap!*?W!.4Nfpj)LXq2P?3rJg`8plG<6rf@)@ +rK7,A!5/$=r4`'CqL&!bqL/KoIX_*ZpmD#Jqj@DMs-E8@rKRGKPEZ!1rl+`RrQ"cUs2k8_rQG5b +s3:Mfr/C]:rf?u=!1NkUqjd\WrLX%[qOIAPr1*_Ts5it:q<.P:p$)D>rTj=HrpB^Qr9sXSs7-$X +s7?6^r:U*`rqH?crqZNhqYU6hr;H-aJcC<$JcFL)J,~> +JcC<$JcC<$L]?iBqu-Hjq"t$drV?rTj=HrpB^Qr9sXS +s7-$Xs7?6^r:U*`rqH?crqZNhqYU6hr;H-aJcC<$JcFL)J,~> +JcC<$JcC<$M#ZrCqu-Hjq"t'erV?U*Zi@?2oCqhQnbVbIn,)POmJ?2Kli-2I +l2TuIkPaQCjo=E@j7JfTBq3D*)bfp". +r6,Jlcd:"acHXSWbPoZabQ#]faN)9=`;%7D`:_+J`r=$UaT'B^b5KN`bl>raX8f:#XoGR'cMc)d +d/VJodaRg;r6tVmr6YN*r8mM3q<.Y=pZ_YArTj@IrpB^Qr9s[TrpfsXrq$0^r:U'_s7cEcs7uWi +qYU6hr;H-aJcC<$JcFO*J,~> +JcC<$JcC<$M#ZrCqu-Hjq"t'erV?l[o.sqi(T7rJUW5r/LH0!/pZ3qp"lZoZQrSs*=s-3MH!0m/qrPniWqoJfZ +s2t;`s31MfqMkN8rf@)@!goCErL<\Ss.0+[s.0%WpmqARr0m]Ir8mM3q<.Y=pZ_YArTj@IrpB^Q +r9s[TrpfsXrq$0^r:U'_s7cEcs7uWiqYU6hr;H-aJcC<$JcFO*J,~> +JcC<$JcC<$M#ZrCqu-Hjq"t'erV?MlMToH +kl9iEk5XQCjSn3=;?0Y_<;KPn;ZB\p<;fhq!8 +<<#tq;ufkr<;fhs<;TSo<;BPm<;]YpjS\-1k5"3;kkF??lM^&Gm/HDOmelPRnG_tVo)A7\o_eC] +pAamaq#C0gqYL*fr;?N_rdk*#s+14*s*t~> +JcC<$JcC<$M?!&Dqu-Hjq>:-erV?M +lMToGkl9iEk5XQCjSn3>iq&TZ2_-0ZN@M?Zi7?2[J[K3\,Ei8[fO"JrODj9!4`! +JcC<$JcC<$M?!&Dqu-Hjq>:-erV?s5NHurIb-1qi(T7rJLc:Mil2BoHlhp,KmJcPOn,MnWnbhtXoDeI\p&=[bp\agcq>U6dqu-HjrU9`:s+13$s5*d+~> +JcC<$JcC<$M?!&Dqu-Hjq>:-erV?orDj#%<`W6";ufqts5O(;lBqge]=YYc\brr9[0*eD['T\;q6U+,s0MU0r6+lXprWKUrf[;D +r0$W5q2kT\!4)U1!jo;?rj;X3rO2^7r4)^7!P#W<\G`l:\Gj#=](NW3])K;AP4t15Pl$aGQN##- +bKTn-rlbbnbg+P]cd0n]bfn90ap6,4b/q`E`PhbnrkeNLr5ABIr58NPqo/TTrl=uYs2b;abPnL? +WqrdrXT$QGcMu5dcihbEdF-MBe,[tneGRendeqMij8.j4jn.^5kPaW@l2KuIlhg&KmJcPPn,DhV +nbr%XoDeI\p&Facp\Xabq>U6equ$BirU'T8s+13$s5O'/~> +JcC<$JcC<$M?!&Dr;HQkq>:-erV?O8b7@OnH9_])K>?IJS?[IK+cjQiUIS+rNRSc,/[SbnrQ +Sc##US,;7BjS@p0k5=E@kkaQClMg,Hm/QJPmeuVRnGi%Wo)A7\o_eC^pAamaq#:*gqYL*er;?N\ +rdk*#s+140s*t~> +JcC<$JcC<$M?!&Dr;HQkq>:-erV?flrX-f +!*Aj(r4;m>qbd8hmo06cs&K"u!`rE'r`&ntr`8u!!*8tsqc<\rq,RMt +JcC<$JcC<$MZ:-erqZEcrqHBbs7HZ"XK/A#Wi(nH_u@UQ`W!mWa8X-aaeku6W2Zcq +WqrdocN;D +JcC<$JcC<$MZ:-erqZEcrqHBbs7QDOqMb<2s,?r8rpfsVp@%nHqsF.Er9O@Iqs"+D +s6'=Bs5j:Aro=%s,m)dpUU3Mqg@dZp6YcGrKm2ErKdMLp65TCPl6mI +Pkr5k_Z%IP`;R[S`rF*Ya8j?ZMuJ\3NW#4HR@9V7q4.JUr1 +JcC<$JcC<$MZ:-erqZEcrqHBbs7Q:js&T5%JmecDGm/62KlMKiF +kl9iDk5XQCjSn3>ir@s;i:0eC;uBSr;c6Nm;[69#;GpFl<)icqs&K,$pf72lqT83Is2Y"9!*/kr +r)E_rrDiYm!)reqn5emWrE'&$ppg(/s%rborDEMkm8F'e!=8Kc._Z%IP`;R[S`rF*Ya8j?]U6equ$BhrTjH6s+13$ +s5s?3~> +JcC<$JcC<$MuW8Fr;HQkq>:-erqZEcrqHEcr:U)j"feQ#W4',2ZiIN3[/TRhn,2VNmIooFli$,F +l2KoHkPXKBjo=E?j8\-=iVqd-RJE6KRK'hs])T>=[fa(G['Tb=!42X2pp:"+s0M^3ouQsLqo7KT +s0;^2ZEjJ9qR$4/rjMg8r4)U4s1&';!4`!,_!6Y;arlb_mbg"J\ +cd'eZbfg".s2tVhaiVWD`Ph_mr5/?K!6"iNqnW0Hqni?Ms2=iSs2G5_aJG`1VZ*IoW2]crr2]V= +qToAmdaHUnrRCborRCbor6kMj!RTg&iq)4,jS\-8k5FKBkkjWElMg,Im/QJQmeuVSnG_tVo)J=] +o_eC^pAXgaq#:*gqYL*er;6HVrdk*#s+148s*t~> +JcC<$JcC<$MuW8Fr;HQkq>:-erqZEcrqHEcr:TrG!/pi8r/LW5rp][Nr9jILp?_bDrTa7DrojCF +r9"%@s5a.=s5O(;ro!O'rdt-#!.t#ts,?r:rf$i9!K;s9M?&S5N;eh3N;nh6N:k9fa8rK$r>!0R/eqR?C4rI"Wnqg@dZ!1*>Frg3NVo.GR@9V7q4.JUrLX%[qOIDQr1*YR!9*h7 +oAf].r8mb:rTF1Dqs".Grp0LKs6]jSrU9dUrpfsXs7?9_r:U*`rqH?crqZQiqYU3gqu,aXJcC<$ +JcG$8J,~> +JcC<$JcC<$MuW8Fr;HQkq>:-erqZEcrqHEcr:U"is&K,"pK%8nrp][Nr9jILp?_bDrTa7DrojCF +r9"%@s5a.=s5O(;ro!EJq,@2js&8qss&/kqs&Anpr`&hrs&K/%U6equ$BhrTO63s+13$s6BW7~> +JcC<$JcC<$N;rAGqu-Kkq>:-erqZEcrqHEcqt1#jWMofq"1>SE[Ipp(n,2VNmIooEli$,El2KoG +kPXKBjo=E?j8\-=iVqd8htEK7R/NHPQiak0\c02?\-TRP[^W`R['R+R1rVl6Pn +WiE,#d.bl_cihbEdaQ\DeGI_oeGRendf%Pqd*LY.qr.D2o],l1rT3n +JcC<$JcC<$N;rAGqu-Kkq>:-erqZEcrqHEcqt9lGrep`6rJg]5qsXINqsF+Dr9O=Hq<@nBroa4A +s5j:ArT!q;s5Et8s53X)!.s`lrf$i9rf$i9!K;s9M?&S5N;eh3N;nh7N;LZk`q@:NHMi-dHMDjZ +HN&m)N/dgsqi1W7rJg`8r/^f:rK$u?rK$r>s0_F+r-[US!L8uEQiEHMQhHgFQhH[DPlR'JPl[,` +p:pRArk\NLs24lTrP\cVregQ1qMYKCQ^@Z<".>UIS,&TSSc,/[SbnrQSc##URf]&:i;;L0iq2:/ +jSe3:k5OQCkks]ElMp2Jm/QJQmeuVSnGi%Wo)J=]o_eC^pAXgaq#:*gqYL*er;6HUrdk*#s+14: +s*t~> +JcC<$JcC<$N;rAGqu-Kkq>:-erqZEcrqHEcqt9tjrDrqup/_/mqsXINqsF+Dr9O=Hq<@nBroa4A +s5j:ArT!q;s5Et8s53WPr`&_mpf.8ls&9"t;Z9Sp<;TVo<;fhsM1M_uI[R`;mpQU6equ$BhrTF02s+13$s6Tc9~> +JcC<$JcC<$NW8JHqu-Kkq>:-erqZHdrqHEcqt:!]!36$tri5t*oX+YerU0UNp?__Cr9F+BrTO7D +r9"%@roF%7qm?7.s0hp9rOD[4s1&';!k>eOpU'h*qN(Q9!g8b2mZ[dla3">'s2tem +bK@uNbKS2RbK\?3cNMPM1M_Z@]prM9Ii +r20Ll#,nGuWN+=lpWr``s3^kps3pqrq9o>nr6kMjrQtSjq;D,.qVq80rT*q=qr[n@roj=Frp'OL +rTsROs6fjSs7$'YrUTsZs7H9_s7ZHdr:p9erqcKgr;?Hjk5Kr3JcC<$mf.e~> +JcC<$JcC<$NW8JHqu-Kkq>:-erqZHdrqHEcqt:!]rf$`4r/CW7qi(RDrU0UNp?__Cr9F+BrTO7D +r9"%@roF%%=OSt7?OS?-Z[JP@DIK"]gI0,XuQM-[FR/30DR/WEP +QM$ICQ'D95qn;pAqS3$Fs2"WMs2+lU`VYPiMu/J5R/WHOQiibFS"'5Ds.0+[s.0%WrgieRrL +JcC<$JcC<$NW8JHqu-Kkq>:-erqZHdrqHEcqt:!]!*B,"s&T2#r)Netqc<\rs6opSr9a4Er9O:G +q<@kAroa4As5j7@rT!q;s5Et8s53k5qc3)as&K(us&8qs"]J;s;c?Zm;ZKep +o#:ID!5n;*s&8bnnQ#$YlW4'gpU'h*ohkWbq,./ir_ierr`/r"s&BA+=&r@'=&r=#<;onsM1M_Z@]poiD)mrDrYls&JqqrDWSmqc!Mo!*/bmqc!=K +qVh;1pZ)55rT3q=roa:ErTX=Hs6KXMs6]jSrU9dUs7-'Yrq$0^rUp3arqH?crqZQiqYU3gqu,[V +JcC<$JcG0 +JcC<$JcC<$O8nYIr;HQkq>:-erqZHdrqHEcqt9s\!i`3"rMfe(pU'n,s6fjQp[%hDqs*t@roj=D +r9""?s5a+nrOMp:%^rdR[^pQ597s0;L-rNlC.qmHF3s0qs:q7$C6s0r$iebg-46#0tK;bfe/OrlYJfaiMNB`;ION_?7]m_o)8^rOr3EqnN0Hs2"ZN +!5nf2rM9Cg!2fXk!iXJmpWr]_!7Ceos3pqrq:#8ir6bGh!71Z%o\fW*qr7G3rT*t>qr[qAroj=F +rp'OLrTsROs6fjSs7$'YrUU![s7H9_s7ZHdr:p9erqcKgr;?HjjSj`1JcC<$nc++~> +JcC<$JcC<$O8nYIr;HQkq>:-erqZHdrqHEcqt9s\rf$f6s,$f7o8N_;rU'@Gr9O7Fq!%eArTF+@ +roO1@r8[h:s5Et8s53k5!8[R)!.juspjr?nr/CZ8r/:l?N/NUOMMmDkMu\k3N;eb8N;^`l`;7CK +_Z+rWHi89bH1lRaN;S\8Nr"_8N;S\8O8b1;O8P%:NrY:?NrY:5ZN.B2I.;X`IeJ0kPa.R.QiqLHMZ/P4N;o:CQNW\DR[]fASH#/YT)YAYSH#/S +SG\iVRf;4:i;;L1iq_X5jSn9 +JcC<$JcC<$O8nYIr;HQkq>:-erqZHdrqHEcqt9s\rDro!!E3"qlC0s6'CFrTX=Hs6KXMs6]jSrU9dUs7-'Ys7?9_rUp3arqH?crqZQiqYU3gqu,UTJcC<$JcG9? +J,~> +JcC<$JcC<$PQ1"Kqu-Hjq>:0frV??crqHHdqt9s\s7?&crO)[4s0_a2rj;anq!@qEr9F%@rTO4C +qr[n>s5a+/`rQ5,`rlkDc"jG9;cd0l8bl>idb5TQfb/q`F`l.blrPAZS_SWn]]D9,=^&GbE +^]2+L_#V@OUAgqeV#@.iVZ!Fkd.bl_ciDJke,@ele,7YldJV>kci)_tht5k)iVhd4j8S-=jo"9? +kPscEl2U&Kli$2MmJlVQn,MnWnbr%YoDeI]p&Fabp\agcq>U6equ$BhrT*s/s+13$s762?~> +JcC<$JcC<$PQ1"Kqu-Hjq>:0frV??crqHHdqt9s\s765LqMYB2s,6N.!:BRJr9O:GpZ_Y?rTF(? +roO1@r8[h:s5Eq7s5*h5rS@L*s+0Hcs,6i7s,Hr8"-&7uMuJS6Mt2i+MZA_5_t1bE_>/HUHLlFV +HN&m%NW+t1NW5(=Nr>%9Nr>"=OSt7[qPEhF,QiU6equ$BhrT*s/s+13$s762?~> +JcC<$JcC<$PQ1"Kqu-Hjq>:0frV??crqHHdqt9s\s7?7kqcb<<#tq<;fbl<;TVe<;TVmhYZ4& +i;DR4iqh^7jSn9=k5OQDkl'cGlMp2Km/QJQmeuVSnGi%Wo)J=]o_nI_pAXgaq#:*gqYL*er;6HR +rdk*#s+14@s*t~> +JcC<$JcC<$Q2g1Lqu-Hjq>:0frV??cs7cNdqt:!]rpp-\rMfaqr3ZO3rO)O0rjD^kr9O:Gq!%_? +rTF%>roO.?rT!n:s5Eq7s5*h5rS7M0g\mN6R/r\Ap6Gij\@K2^rO<-B[^NTO[^ENLriuR2[.:O) +ZEpn6_YV+F^]BOXrK-u?jcBJHrilR2Z*CV4Zhq-+[K!]7\,Wu5\,Nl<\%24:riu6Zr/U]9rK.#@ +!0[8DrfdT%_Sa@5ao0?^bP]KabKS30b6?,8cd0n]rlkDc!6Y;a"j4p-a2Z'p_u%=K\bs&;]DT>@ +^&PhF^Au(HUAgqeV#@.iVZ3OodJ_GdchbugdJhVmeG.MjdeqMkd/VGih>?(*htQ(-iVqj6j8S-= +jo+?@kPscEl2U&Kli$2Mm/ZSQn,MnWnbr%YoDeI]p&Fabp\agcq>U6equ$BhrT!m.s+13$s7H>A~> +JcC<$JcC<$Q2g1Lqu-Hjq>:0frV??cs7cNdqt:!]rpp0]N;eb6N;nh9M?&S,Mu\k9m/62IlM0WA +kl']@k5OKAjSe-2O8k7IK+]pIJS?jIK,E3P*;/rp6YfH +!13\Nrg3YPs-NPKs-EbPQ1U==\bs&;]DT>@^&PhF^Au(JM#W>3M?&M4MZ8P5L]`KkMi7M#r0IPR +R@9V7q4.GTrgs.\qOISVpRM2Os-ilAqqh2,pYc#/ro3h8roF(?rT=+Bs60FGs6BXMrTsRO!:KgS +s7$'YrUU![s7H9_s7ZHdr:p9erqcKgr;?Hjj8OW0JcC<$o`'F~> +JcC<$JcC<$Q2g1Lqu-Hjq>:0frV??cs7cNdqt:!]rpp-\rE&r"s&/qtj8S' +JcC<$JcC<$RK)ONqYg?iq>:0frqZHdrqHEcr:U']s7?6\s/Gjp"1>MD[JmN5[e@--li$,Cl2BiD +kPF?>jo=E=j8\-=iVh^7huDR3h#cBdg]!T;RJiNQQh6RJQ+"03]"5EM\,Wo9[0!eDZi763Za@+0 +Zi7f;_"PMENfT7qOSt71OSk1>Yl:m0ZE^[?r3Q:-q6^42rO2d:pp^43pTOS#!06r;p5]$2rK%&B +P5CIC^]_Kk`Q-+!aoKW_ao]c1bl5chc-FY]cHZ=3!R&Xbb65u/a2Z*p_u.CM\G<]6])TD?]`5\E +^A=T(U&UheU].(fV$!TmdF%p>pWr]_!7L_m!7^hnr6kMjr6YJip"fN%r87>.rSdb8r8[e;s5j1@ +s6'FGrTOCKlg+N9s6]jSrpTmVs7-'Ys7?9_rUp3arqH?crqZQiq>:*fqu,FOJcC<$JcGTHJ,~> +JcC<$JcC<$RK)ONqYg?iq>:0frqZHdrqHEcr:U']s7?6\s,6`4regi8Mi77e!0-sCrTa.ArTO1B +qW@boQoeJs*=['rJ^]7 +s,Q`2"HJP(NfO$uqMtH6pTOS#!.4Tjr-SHkq0hj^rfI;HPa.O-QiEESQ^3s9QiEHOQi!-OQ^3p/ +Pl8,f\c',>]DT>A^&Gb@M#N81M?&M4L]N?jqj@;J"IPUFS"'5DrLNt[s.0%Ws./nSr1!_Tp"fN% +r87>.rSdb8r8[e;s5j1@s6'FGrTOCKlg+N9s6]jSrpTmVs7-'Ys7?9_rUp3arqH?crqZQiq>:*f +qu,FOJcC<$JcGTHJ,~> +JcC<$JcC<$RK)ONqYg?iq>:0frqZHdrqHEcr:U']s7?6\s&]/$r`0,!;cHcpdp"fN%r87>.rSdb8r8[e;s5j1@s6'FGrTOCKlg+N9s6]jSrpTmVs7-'Ys7?9_ +rUp3arqH?crqZQiq>:*fqu,FOJcC<$JcGTHJ,~> +JcC<$JcC<$SH%dOqu-Hjq"t'erqZHdrqHEcr:U']s7?3[qPsRprNug;[C!Z3%A> +[.CU([._92^AknGNh() +rf@2DP*5a,%)9Tn_8O=5b0%iKb00_*s31Gb"jP?qSWmcd(;Bh"KS%hYl@.i;V^7ir%j:jT"?> +k5XTEkl'cGlMp2Lm/QJQmeuSUnF?&Io)J=]o_nI_pAXgaq#:*gqYC$dr;-BIrdk*#s+14Ms*t~> +JcC<$JcC<$SH%dOqu-Hjq"t'erqZHdrqHEcr:U']s7?3[qMbH4!/gZ3oo&m1rp':Cr94+Bq<%Y; +roEt:s5O%:rS[_5s5*b2s4mY/s4[L'q1%g_qMY--!f`.sre^f9N/W\eMu\k2^\Y\E^%m!5H2ig% +N;eh9NqA;6NfT6]Nr4t6Nr4t7Xo5EoHiJKiIIhjbOTUf3Q'V-1!LT5QQMm0MR/ETc +qmZO6qml^;s1A3As+gN.r.b?0M2D4h!f;_hq3_)H"IPUFR[a,CrLNt[s.0%Ws./nSr1!_T!8ID+ +p>,Z'rSRJ0ro*k9r8[h:*fqYf4KJcC<$JcGcMJ,~> +JcC<$JcC<$SH%dOqu-Hjq"t'erqZHdrqHEcr:U']s7?3[r`K2%s&T/""Ar&q<)rfrs&8tur`0)# +<)ik^q!%_?rTF"=rT4%>qr@_9ro*h6s53k5rn[V0s4dS-qGdAks&APh!)rkrs&B%ur_j##;c6Ll +;cNWmq,R>nr`&r!p:pI,Z'rSRJ0ro*k9r8[h:*fqYf4KJcC<$JcGcMJ,~> +JcC<$JcC<$TE"$Pqu-Hjq"t'erqZHdrqHEcr:U*^rq$'Yr2Taq%&g)3[^ENO[C!qW%V8ro*h6s53k5rS@M/s4dP,!87@%q833Lp9st0rj_m: +rjr-ApnIYZ!huHcrMBAQ4/htu@3iVqj8j8\3> +jo+U6dqtp +JcC<$JcC<$TE"$Pqu-Hjq"t'erqZHdrqHEcr:U*^rq$'Yr/CQ3!/gW2oo/b3rTO4Cpu_P:roEq9 +s5O%:rS[_5s5*_1s4mY/rn7A*r.+Ehpji?nqMY--!0-u9s,-`4oo&mcqnDs@qRlfRpNca_l$<8d +rf$i9rf6W1"HJP(NfO(!pQ#66rN,munTt7`pjMg_rK.5GPEhE!p6PfIQi<:'eqYf1JJcC<$K)^?~> +JcC<$JcC<$TE"$Pqu-Hjq"t'erqZHdrqHEcr:U*^rq$'Ys&]2#r)Ent;H$Lo$<<0f2^AGV?]E1u.;>*of;uK\pQ4/htu@3iVqj8j8\3>jo+U6dqtp +JcC<$JcC<$U&X3QqYg?iq>:0frqZHdrqHHdr:U']s7?0Zs7-&fri$=)Vl$l0[^NQN[^+f\$1in!=!=qNM,j['d?OrjVs;rjMj7rNuR1 +s0;d6ZEpmCqQg1-rj)[5]tO*OrO_ocs,I)?q2YH8!fi>%pQ,<6s,I&;s0)O-Yl1j,YQ2!-Zi7<3 +Zi7?2[/dZ6[/dZ-\,Nl;Wqi^]Nq\V7OT1IBP5`3%^qmn+`lQW"JVZeV5nqqM)) +q;)#+rnmY3ro*n:rT!q=s5j4As6'FGrosIJs6K[Ns6]jSrpTmVs7-*Zs7?9_rUp3arqH?crqZQi +q"t!eq>K%HJcC<$L&ZZ~> +JcC<$JcC<$U&X3QqYg?iq>:0frqZHdrqHHdr:U']s7?0Zs7-&Hr/:Q3qMY$*!KH@Bkl']?k5=?? +jSIp9ir7p7i;_^7hYl:1g]6+-g&fs[f`$E`J,"rsN;eb8MYrD/Mu\e8Muo!P^%K&:]D$UHGj9SQ +MuJ\7NW5%2NW+t7O8+b7NrZ3UX7(E6I/A?cI/K*0P*;/rQM-XGR$[fZSH#/TSG\lUReb\7g\oq' +h>Q40hu)F3iW%p9j8\3?jo+?AkPscFl2U&Kli-8NmJlVRn,MnWnc&+ZoDeI]p&Fabp\agcq>U6c +qu$BfrS%7%s+13(s*t~> +JcC<$JcC<$U&X3QqYg?iq>:0frqZHdrqHHdr:U']s7?0Zs7-%gr)F#%;Gg=i;cHasr`08(<)cjt +<`W6";ul1]kl']?k5=??jSIp9ir7p7i;_^7hYl:1g]6+-g&fs[f]uN:]`#GB;tk;Z9Vp;?0bq=8l;(=&i7$r)Wkur)E\rs&K,$pf@AqpJq>s<`].*rO)L1rjVp;r42W'rDrqu +pf@/inPo?`rD`Yms&AJdq:b`#rS75)rSIP2r8@S5s5O";s5a4ArT=.Cs60IHs6BXMrp9[Ps6fmT +s7$'Yrpp*\s7H9_s7ZHdr:p9erqcEer;?BhgAZ['JcCH(J,~> +JcC<$JcC<$U]9BRqYg?iq>:0frqZHdrqHHdr:U']s7?0Zs7$*Yr2KdsVuc:1g\oh0g"=s/Q^@0,!1!;Cs0_m6s0hm8!4Mg5s0D^4rj2R/ +pp9t*s0M[:r4Dj;rjhiaq2YH6q2Y<4s,R,=rf$l]ric:*s0)L/rNlL1!jf8@rNuX6r3ZO5osat2 +po=1NrK$f8s,[2?pQ,<8!0R8DrP&WR_8=13ai_cJqT8l_bfp%/!6tMgs3:Per6#8daiDHA`;RUR +_uR^NZi.91[J[K4\,Wu/UALYaUB&[8d/_PgchbugdJ_Mce,@_odJqSkcN2>Dr7Uhur7h2*qq_8. +rnmY3s5F";rT!q=s5j4A!pAe2rTOCKlg+Q:s6]jSrpTmVs7-*Zs7?9_rUp3arqH?crqZQiq"ssd +q>K"GJcC<$M#Vu~> +JcC<$JcC<$U]9BRqYg?iq>:0frqZHdrqHHdr:U']s7?0Zs7$*Yr/CZ6re^]4regT2oo&m1rTF"= +rT4"=qW%P6s5Ek5s53k5rS@M/s4dM+"khP\f78D4J+nlrN;eb8MYrD/N;nh9N;^Ee]DK2=\bCCE +GjBYPMuJ\7N<#"2NW+t7O8+b8O8,aOHi8?gHi&3hIJ/'cOTgo4Q'IZ$pQkoJQi<9PQ^F-=R/**J +QiWM +JcC<$JcC<$U]9BRqYg?iq>:0frqZHdrqHHdr:U']s7?0Zs7$*Yr)WhtrD`bns&/krs&K)"!*0"t +#$"])ZfA]a3<`E!rr)ESms&/kq!*&kp +r`&\nr`9&!rOi'?qmud;!E<"h;Z9Vk<<#nith +JcC<$JcC<$VZ5WSqu-Eiq>:0frqZHdrqHHdr:U*^rq$*Zrpg$Xri-+#W2HMirMBM$s0hp7!4;C, +qW@b&ns-3DEr07/e!4Dd6!OoN:[K!W4ZN7A< +rNcF/!4)O/riuO1r4;U4!4_c_rf6f6q2YB6rf6u;!K<$:YlCp+Z2Us-ZMh-0[/[K4[/IB6[^ELA +[0*kH\$l(@!4_j'q2Y31!06Z3rK.#Ar4`BM_8F74rQ4oY!mAg3rlY>dc2Q#gc2GlcbQ#]faN)?? +`;RUR_uR(?ZMCj+[/[Q3[K*#kUALVcUc@2hu2L5iW%p9j8\3?jo4EBkPscFl2U#Kli$/OmI'EAn,MnWnc&+ZoDeI]p&Fabp\agcq>U6c +qtp +JcC<$JcC<$VZ5WSqu-Eiq>:0frqZHdrqHHdr:U*^rq$*Zrpg$Xrf$l8reg`4s+pZ3qMY'+!0-j; +rT4"=qW%P6ro*b4s53h4rS@M/s4dP,s4RG)rn$+YpP\g*repf6qht?1s,-l9r4;U4!4_]Iq0;UY +rcn9b!.+U%!fW%qrf$i9!06]2rf6l:pPo67q5F+9pNusfqgA?jp3c_!"Ho"7Q'V-1#FLjDQC!r* +Qi,qq_;/rnm\4s5F";rT!q=s5j7Bs6'FGrosIJ!:0UM!q#FDrpTmVs7-*Z +s7?9_rUp3arqH?crqZQiq"ssdq#/kEJcC<$MuS;~> +JcC<$JcC<$VZ5WSqu-Eiq>:0frqZHdrqHHdr:U*^rq$*Zrpg$Xr`9&!r)E\r$W0f!;GpFm<)lq! +k<;KMn<;ohm +JcC<$JcC<$WW1oUqYg?iq"t'erqZHds7cNdr:U*^s7?0Zs7--Ys6g5oWiE"pVPg;grh]V%rjMd5 +oX=e^roO+>q;_G5ro*b4rnmb4r8%D.s4dM+s4ID)rRV/&eX)X!QMZsGPk:.CZEppFZaB\>!k5VG +rNuO0"1#8=Zi.01Za0M8riuO1r42^7rO;'OpQ#!-r364)#-bDc@3hu)C6iSrkqj8\0?jo+L0bqtp +JcC<$JcC<$WW1oUqYg?iq"t'erqZHds7cNdr:U*^s7?0Zs7--Ys6ouH!/pf5s,$c3!/LQ2rJLZ7 +repK/!fc@)roO+>q;_G5ro*b4rnmb4r8%D.s4dM+s4ID)rRV/&eUW23J,autMZ8V7MYi>,N;ne9 +MY`8.N;ne9N;U6`\G`o.H2Dj]H2DjbH2W'eMZSiqMuAV,N<,'!rJpc9qMkW"Ho"7QBq62rKdJM!LT5QR.cjJQBda6PQ7!HYl(d*ZMV!.[/[Q*L\QT)LRA(-pR(lF"IPUF +R[a8G!1j+ZrLNnYq47;Nr0m];pXfArr7Ur#rnIG-r8%D0s53b4!o`.urT!q=!9O1A!pAe2rosIJ +!:0UM!q#FDrpTmVs7-*Zs7?9_rUp0`s7cHdrqZNhq"ssdp\i_CJcC<$O8j_~> +JcC<$JcC<$WW1oUqYg?iq"t'erqZHds7cNdr:U*^s7?0Zs7--Ys6oqf!*/qrs&K/#;uBMn;uTbr +<<-)!;ufqtc:1g\ok+f`9\'f)sUStiO2^;uKVf;?'Ph=8l>$nr=8,_q=8]<#Z2V'+Zi@E4 +[II5s +JcC<$JcC<$XT./VqYg?iq"t'erqZHdrqHHdr:U*^s7?0Zs7--YrpKlgWrAprVZ*FkV#Ib'[^ERA +[K!Z8[J.-/jS@j7ir7p5i;_^6hYc40h#H.-gAfk+f`'M&f)O8#Qhm$EQ2[$>P6[8UZEggDZaB_> +s0_p8rNuO0s0DX1rNZI1ZM_'.ZN%H4\,!K+N:`)0Nq&,.N;Tp[Y6(r6Z2Us-ZMq30[/[K4Zj*qH +[C3NO[/RH9[^W`S[f!T8\@;I6rh][Vqi:];s,Q]3s,d8Arf@,@q2bZ?^:sQ\"i.sk`5]mrans3] +bKTq."3f$8cMl)ebl>ldap#o.a2c0;rPST;q69k's0DR/q4[JUr1X/:q9])frQtGfr6YGjr6kPm +p!Wies3Ubkrmgqtpt,JsrRq)%rnIG-rS@M1rnm_5s5F";rSmt?jlQL(s5sCGrTOCKlg+Q:!q#FD +rpTmVs7-*Zs7?9_rUp0`s7cHdrV?Hhp\XgbpANYCJcC<$P5g%~> +JcC<$JcC<$XT./VqYg?iq"t'erqZHdrqHHdr:U*^s7?0Zs7--YrpKlHMuJV6M>i>1L]320MuSb8 +MtW)0NW/#7j8J!:iVML4hu;L1h>c:1g\ok+g&K_(fDjG%eGt-hJ,FcqJ,OirI0"eFreg`6qhkE3 +pl+p)r/CZ6s1&!9q6oj>!-n0^q0;j`!.+Wir/1W8Mi7OmoSim3NW"n7O8=k;O,j49rh][Cqg8?j +s*O9`qgJ9f!e$/lqiM&FPEhE!QM-[DQN* +JcC<$JcC<$XT./VqYg?iq"t'erqZHdrqHHdr:U*^s7?0Zs7--YrpKkhl=8Q%u +=8Gtt=8o&qVZ'Kn;?'Po;u]be;u0De;#jMh=8c5&=&rB"=8u;$nr=8,boYPGF% +Z2_--ZgLijqlFf(dkqf_sM#gA]k+h#6(/hYuF3i;_d9ir.m= +jQ5M&k5XTEkl'`IlKdd8liQSBmf)\TnGi%Xo)J=]o_nI^pAambq#1$fqY0m`r:^*Ardk*#s-!D4~> +JcC<$JcC<$YlEMXqYgd7j[/IB: +[^EQO[C3L8[eo+air.j4i;VX5hYc40h#?(,gAfk+f`'M&f)O;#eGGR.Q2[$EPPUI@PQ%ieZi@?1 +[K!Z8[JmN6Za0S:rj)R1rNZL2ZEjG8s0DI/r3ZR4N:r2.N9ZE$N;nh5YlCm2Yd1Oldb5]T``rX/trkncgrR(PkrR:Gf +s3^hms3LSlrRLhsq:GVurn72&s4dS/r8%D0s53h6s5F";ro=%>!9O1A!pAe2rojLLlg+Q:s6TgS +rpTmVs7-*Zs7?9_rUp0`s7cEcrqZNhq"smbpAN\DJcC<$PQ-.~> +JcC<$JcC<$YlEMXqYgi>2L]!&.MuSb9 +MtW)0NVhc8ir.j4i;VX5hYc40h#?(,gAfk+f`'M&f)O;#eG+OlJGt&nIe\?jMZ8V3MZ/P0N:r2. +N;nh3[f!N5[,ZH0GklXbGl3L"N;nh6N:r82NWb?%NfB(rO8=k;O,j17k'[#Rq0W0jrK-r>"d5(7 +Q'Ra0Qi36MQi*6EQNEJ;L5,S\qhG-;s-NeQpR(lF!1
    !9O1A!pAe2rojLL +lg+Q:s6TgSrpTmVs7-*Zs7?9_rUp0`s7cEcrqZNhq"smbpAN\DJcC<$PQ-.~> +JcC<$JcC<$YlEMXqYgth + +JcC<$JcC<$ZiAeZq>L3gq>:-erqZHds7cNdrUp0^s7?3[s7--Yr9jdVWMl_mrh]^mV#6tf[/IB8 +[^EQO[IUd)ir.j4i;VX5hYZ./h#?(,gAfk+f_sD'f%&=MeGn"kQ2[$EPOt"?Z*:LOT1C?OSFq=P*,[*s1JBGrP&NO_8F74 +aSa0Wb5BH_bl>udc2PrebQ#`baTBN&`;[XSXSApsY5YX'YkFdiT`1YbUACPabg-46n'M$ZrQtMj +rR1Ynp!Wies3UelrmUYlrRLktqUb`!rn75's4dS/rS@M1s53h6s5 +JcC<$JcC<$ZiAeZq>L3gq>:-erqZHds7cNdrUp0^s7?3[s7--Yr9j^TMMh:f!/UQ.r/1H2rf$l8 +pP]*3rSme7qV_A1rndP.s4mV.rS%;)s4I;%!nPoPrm^tsqLAHordX]lp3d1'M2I1KMi*AhMZ8V2 +N:`&-N;nh8[J[E0Zf??2GklX_Gl*F!Mu\e5N:r82NWb?%NfB(sO84e9O8bpSHi/9kIJ/'gIJ\Eg +IJJ6jIJf3)OTgo4Q'IZ$p6YcEs-NSLpQkoHQ2[!JXSApsY5YX'Yl0@ULAll.KS>-ZLAQc*L'!^/ +Qh-UBQN3EPR/i`TSGA`ST(nlPSH#)Xe+hGkec"(qfDaG%g&0S(g]-(-h>c@3hu;R6i;hm9ir\<' +jo4BDkNM./klU/9li-8Nm/ZSRn,MnWnc&+ZoDeI]p&=[bp\Xabq>L0aqt^0^rS.=&s+138s*t~> +JcC<$JcC<$ZiAeZq>L3gq>:-erqZHds7cNdrUp0^s7?3[s7--Yr9j^T +JcC<$JcC<$[K#"\q#1*fq>:-erqZHds7cNdrUp0^s7?3[s7--YrU9dS!puqarMBRjqP4(trNuX6 +r3cL3!4DU1s5Eh4rSRV2qq_8,s4dJ*s4RG)rR_)#s4.+us3h"sdJ0"+PkpU8Oogc-Z2V!-Z2q59 +rj;^5!OfB7ZN.9,Z2h60ZN%92ZLkL&Z2fdRMtDu(NW"h8MuJV4YQ1m+YlCm4Z*L[>Z*CU@Zi7?1 +ZN.B1[Ka.H['dOn+V0OoLUCP5pjH]`5_F^]2(Q_8F74aN=G&s2k2]r6,,a +s3CPerlkDcrlPDc`l?!8_u-S6XS]."Y5b^)T_Y;YT`:\cT_b>abg"GYrQju[rm1Sjr6bJkrR:Gf +rmCbms3^enr6tJkrRLnuqq(l#rn78(s4dS/rS@M1!8mb5!o`.uro=%>!9O4Bs5sCGrosIJ!:0XN +s6TgSrU0gWnaZVLs7?9_r:U*`s7cEcrqZNhp&"R_oDRJDJcC<$R/_[~> +JcC<$JcC<$[K#"\q#1*fq>:-erqZHds7cNdrUp0^s7?3[s7--YrU9dS!UYdAM>i>1LB*)+MZ&J4 +N;nh1Muo!tiVML2hu;L0h>Z40g\fe*g&K_'fDjG%ec+(udfInEr."ZqrdXWjpO3'h!/gc4s,-r9 +M2D1gs,6`4oS`[,pp9t*!-mRMs*F]js*FWhqfqsqs,6r9qi(6.r/Uf:!07#=qMkWc=3hu2I7 +iSrkrj8\0?jo4EBk5a`Fl2U#Kli-8Nm/ZSQmfN"Knc&+ZoDeI\p&Facp\Xabq>L0_qt^0]rS7C' +s+13;s*t~> +JcC<$JcC<$[K#"\q#1*fq>:-erqZHds7cNdrUp0^s7?3[s7--YrU9dS!:BV`qc3Vpr)0rndP.rnRP.r7_2(s4I;%s475#rm^ts!RfBg<;f_q;Yj8j;Z9Vn;ZBSod;Z'Al;Z'Mk;uK\o;ZTcnoMPci%c=3hu2I7iSrkrj8\0?jo4EBk5a`Fl2U#Kli-8Nm/ZSQmfN"Knc&+ZoDeI\p&Facp\Xabq>L0_ +qt^0]rS7C's+13;s*t~> +JcC<$JcC<$\Gt:^q#1*fq"t$drqZHds7cNdrUp0^s7?3[s7--YrU9dSs6Tfarh]^mV"pbeU9h6$ +[JdQ6[J730i;MR4hYZ..h#?(+gAfk+f_sG%f)O;!e-+7Kda?JqiUN4pQ5H=rf[PN]Xthh^:sT]s1efS`5]m? +ao9B\ao0B[bQ#fdcMYrebl>lbaoof*`l5jlWr9!tXSo:#TDbG[U%k;XT`iQ_c-FW5cgT6\ci2;h +dJ_Mle+V5hdJqSgdJ_Mle,%Snec+.tfDjM'g&0P*gYCT_h>c=3hu;R6iW%p:irS6&roX7D!9jFH +s69UMrp9[P!:KjTs7$'Yrpp*\s7H6^s7ZKeqtU-crVH3ap\aX]hYr*+JcD2=J,~> +JcC<$JcC<$\Gt:^q#1*fq"t$drqZHds7cNdrUp0^s7?3[s7--YrU9dSs6]`@rJ:K/rItiD3M>iD3MuJ\8MZA_.MuJY8Zi.3-YlM$,Gj0MKHM`!fGlN'bMuS_9NW+k:MuJ\/NW"n; +N<#";O8=n:T`0<9I/&-gI/SKlHiSNbHineYO,s1"rfI>IQ'IZ$p6Y`Ds-NSLpQtoG!0m>[rN#q! +rN6'QqM,!'qh5!'!/CB+rg3/Br0IPRR@0M5rLE\SrLWhUq4.6-rR1YnqUGMprmq#!s4IA)r7V5, +gt_kas5!b5ro!h8s5O% +JcC<$JcC<$\Gt:^q#1*fq"t$drqZHds7cNdrUp0^s7?3[s7--YrU9dSs6]edq,R;kr)o<`N1$q,dMss&T2$qH")+ +JcC<$JcC<$]`6X`q#1'eq"t'erV?BdrqHHdr:U*^s7?3[s7--YrU9dSs6]jQrh]anUndp`rM0Ce +s0;X2p9jq/"LkhI[^Q1ErO2a`rndM-rnRM-r7_2(rn.2$s475#rm^tss3gno!mm0rrK[5Drfd&= +r/gu@rK$u`ril@+$*pnE[C*HMZa6t:Z2Cm-Zi%-/Zi@?2ZN.9*YQ0U[MZ&D0MZ&J/N;\_9N;eh2 +N;\\4YlCm/Z*:F9rNQI/ZEgh7[/RB4['fnAs0_m6rjDU2!1s1Os,[/@s,[2AqiUN4pQ>E;!0dAo +!PQ5H^BhWk_8=.1a2uI&aSsudc2Z#fbPfQeaMu6=W2TZoqPsOq"0A#aT)P>^T_P5X +T`:VaT`1Yab6,u5cHcC7nBh3]r6YDirR1Ynq9o/f!mo9>rQtAfrR1YnqpbVqs47,"s4IA)rRq>- +gt_ka!oDhlrnmk:_o)K6!p&J)roO7Ekl0iHl2^/Lm/QGQmeuSUnF?&Jo)J=]o_eC^pAXg`q#:*e +qXsaZr:BmFrdk*#s-s%=~> +JcC<$JcC<$]`6X`q#1'eq"t'erV?BdrqHHdr:U*^s7?3[s7--YrU9dSs6]jQs+pc6M>i>1L]3&. +L&Zr/M>W80MuJ\8Mt`/3NSiXmhYQ(-h#?(+gAfk*f_sG%f)O;"eGn"tdf.Vqd!pQDJGOcpIeA-h +I/83iMZ/J3MZ/J3MZ/P5N:;c*Mu^-XYQ/tIGl)ddHLuL]H2r6iHM)OaH?o@Frepu>N/W[Qrf$Q1 +rf6u;!07#=qi1ZJr-S?hq0hp`qKr$c!e$/lrf?r<#*G(4Q'IZ$p6Y`Ds-N_P!1EhRpQtoGs/>mq +qPsOq"0@-.K`6]%LAlo(K`?`+LAlr.R/NBBR/E9NR/WKRRf&]OSc,/USbelVci)5ddJ_Mle,.Yo +ec44ufDjM'g&9V+gYCT_h#cHjhu;O8iK00#ir\<'jo4BCkNMp0s69UMrp9[P!:KgS!q>aMrpp*\ +s7H6^s7ZHdqtU0dr;-*`pAFO\i;S<-JcD5>J,~> +JcC<$JcC<$]`6X`q#1'eq"t'erV?BdrqHHdr:U*^s7?3[s7--YrU9dSs6]jQpJpufrDW\n!)rep +s&8qsrDihrs53h4qVD/+rnIA)s4RD(rR_)#s4.+us3q"rrm:_moMkfgqGR/gs&/bls&Jtr!``2u +r)E\p"BAE#;cEBhqc*X$poj`srDNYmrDNYos&/hn!)i_nqc!Por`&Ddr)E\r!*&qtr`&ksk#MJR +r_rhpr_rhps&8eoohtigqbd/e!)rhspfIDrpK.Aq$<:&*C*^qtBsZrS[[+s+13>s*t~> +JcC<$JcC<$^AlmcpAOmdp\XpcrqZHds7cNdrUp3_rq$*Zs7$*YrU9dSs6]gPs/#mpUnja_U]-tk +TqJZrZaBJ7s0`*?[^ENO[emQ1h>Z4/g\fe)g&K_&fDjG%ec!u!e'c\DdJqSnchW80Mt)`+Mtr>1Mu0aY +Y6;,7YHY81Ylh59ZEsJ9rj)X4[JmT7[JmQ3[J[H8O-#HcplPK;rf@,@ooT39rK@#>!Kt(m]E,^[ +rkA`S_84",a2lBErlG&[r6"u]"O,09bfp%1!mJj2rQ52^`l@qSrM]^prMg9pS"-%@StD[KTqS3T +rLs.^rLa+_!29A7"3f$8cMl/aciDDgd/MAjd/DAidf%YjdeqMjcMc)fd.u)gdf._neGe"uf)=5# +f`0Y'g&g$ah#?.0h?Mlqi;^^4ir8! +JcC<$JcC<$^AlmcpAOmdp\XpcrqZHds7cNdrUp3_rq$*Zs7$*YrU9dSs6]gPs,$i6M#<&.LAZ`, +LPUfaMZ/P5N;nh1Mu\k6h>Z4/g\fe)g&K_&fDjG%ec!u!e'c\DdJqSnch;kgIK=kGomQjfs*OWh +!f2\jrJCQ3r/(H2s,6l8n;@=+Yl(^(Y5`hAH2`-WGlW*`Gl`5:q2>62!f`.trepc7pPo04rf$o< +rf?r:!.+Nhr-\Hkrd4]mp3c[_qg8EmO8Y1>O8P(DOckroQ'Ra0Qi36MQiQMdZZ +W;`dpWr%DMKS>-VLAlo,K`$Q(L'!-sR/NBBR/E9NR/WKSR[a;HpmqATq47GRr6G8erQtAfrmLep +r7(_rs47/#s4IA)rRq>-gt_nbs5!t;i8DtCOQ-9"s5X1AroOIKkih9qlK[^7m/QGQmeuSUnF?&J +o)J=]o_eC^pAXg`q#1$eqXaUXr:BmHrdk*#s.'+>~> +JcC<$JcC<$^AlmcpAOmdp\XpcrqZHds7cNdrUp3_rq$*Zs7$*YrU9dSs6]gPpf6udrDW_o!)rep +r_rhrrDiksqVD/+rnIA)rn7>(r7Cu"s4.(t!n5TGrmCbms3L77qbm2f!)ibms&&ns<)riq!*/kp +s&8nrs&8Vjr)Ea$r3-+&qG[8hr_iepr_WYnnl#Ndo2GNcs&B%ur`/qsr`/,^"&r9"<;9Dk<;oer +;YF#h;Yj8f;?9]tr)WPnr`Jnrs&KA)<)lq!<``?#<c=9hr*F::/BmKj8\0?jo4BIkNM-ol0@R"rp9[P!:KgS!q>aMrpp*\s7H6^s7ZHdqtU-crVH-_ +pAFO\ir4N/JcD8?J,~> +JcC<$JcC<$_>i3fpAOgbq"t$drV?BdrqHHdr:U*^s7?3[s7--YrU9dSs6]gP!:0W\"/M]fV#I+i +U7qRZ#bS9(Z*L^D[C5n=#.D"M[C*HOqmZU]rnRM-qqD)'rn./#s475#rRCkrs3gnos3LhncHc0K +qNLc=qiUf)rRq>-gt_nb!oDi7rPSZps5X.?!9O4B!pAe2rojIKli-8Nm/ZSQmfN"Knc&+Z +oDeI\p&Fabp\Xaaq>C*[qt9mZrSmg-s+13Bs*t~> +JcC<$JcC<$_>i3fpAOgbq"t$drV?BdrqHHdr:U*^s7?3[s7--YrU9dSs6]gP"7(f"M#E,.LAQ]( +LB`QkMMd=LMZ/P5N;eb1Muo!ph>Z4/g\]_)g&BY%fDjG%ec""te,RkqdJqPpcd'i1J,auhIK+]p +Hhi!fM#W;3MZ&A3MYr>1MZ8V7N!"uqMi..bs/u4#s*EXLq0;g_!IB%eMuAS9NJrhqMuJ\0NW+t; +N<#"-VLA6K&LAI8-R/E9NR/WKVR[]e:SGA`RT)"rUSGpe/cMc)fd/25idf._o +eGe"uf)=5#fDsV'g&g$ah#?+2hVZWXNsCd+ioB([jQ6C'!pAe2rojIKli-8Nm/ZSQmfN"Knc&+Z +oDeI\p&Fabp\Xaaq>C*[qt9mZrSmg-s+13Bs*t~> +JcC<$JcC<$_>i3fpAOgbq"t$drV?BdrqHHdr:U*^s7?3[s7--YrU9dSs6]gP!:0J]pf%Q"<)cdq +<)Zap;uT\l<<#ns<;fhs<<(eRh#?(*gAfk*f_jA$f)O;!eGn"tdf.YociVP=cLXs(;u';o<)Zaq +g;ZK_p;uBVk)!o)Mc +rnRY4hfeuo#>a@=j5]4]jo4BDkNM./klL)8rp9[P!:KgS!q>aMrpp*\s7H6^s7ZHdqtU-cr;-!] +p&+I\ir4N/JcDABJ,~> +JcC<$JcC<$_Z/?hp&4abp\XpcrV?BdrqHEcrUp3_s7?3[s7--YrU9dS!:BaOs6BZ]r1s@f"eq]` +TV%kUSd2F%Yd1UB[C5n=s0`-@[C*HO\%)@Fs4dG)rn7>(r7Cr!s4.(ts3q"rrmCbms3L\i!6t)! +!0d8BqiUZ8(6>])Z*:I9Yck77Yd(L>Za7$GZEga?rilC,qm-1,!j\r1r2fpX!0$l7pknm*repi8 +rJ^E-rf$i7ric7(s0)I-!jAi4rNZC.!42U1s0Ma4"LY\H[C-"@rNug;O,f6]O8P.6OSOt6OSt:A +OSk7@OoW,j]F;Kf^V@S"_84%.a2uI#aSsogbfft-!QiF^V#@.hVZ!CmRJ`NR +SH#,bStD[LTq\9TqOmbY!m/U-rlb>c!6tMgs3LGdp! +JcC<$JcC<$_Z/?hp&4abp\XpcrV?BdrqHEcrUp3_s7?3[s7--YrU9dS!:BaOs6BZ@r.k<,r.Y*& +reCW4M2@+Jre^`8MuAV7Mu8M6NW+n:NW7c1gA]e*f_jA#f)O;!eGn"tdf.Yod/VGkc2c,bJ,aug +IK+]pHhVjcM#W;3M#N52MYr>1MZ8V7Mu\e8MY)i,Xo,:#HK0;DGl)adMYW2/MunutN;eb6N;/D4 +Nr=q;NrG+>NWaZRH$Xf6HhVp`Hi8?fHi/9kI/o?*OT(==O9gu4Pa.Q#Q^=*8Qi36KQiEEQRJiNK +Qid@jVu;5JK)1*$KS>-VLAur-LAZ`+Q'V<6nX06@!1 +JcC<$JcC<$_Z/?hp&4abp\XpcrV?BdrqHEcrUp3_s7?3[s7--YrU9dS!:BaOs6KP^p/D,o<)cfp +<;ohr;YsGn;uTbqd@jVuBZp;u]hp +JcC<$JcC<$`;eTkp&4^apA=gbrqZHdrqHHdr:U*^s7?3[s7--YrU0gUmHsl=!pf.:r1s@f!MZ:d +TDb>fSZ]-"Z*LaE[^Q%?s0`'>[^EQPrjVj9rn@A)rn./#s472"rRCkrs3gkns3LblrQYJhbfosK +!0d;ErKI/BrK.,BOnOn:YQ(j-Yl(^(YQ1s,Z2h61Z2Cj+Z2Cp*Zi7$)WW\cec-+8]TDkM_ +U&1M]TE!%5b5TTabQ,oecMl/bd.P]bd/;;ide_Gjdf7\pb5'6[bl,f_cMu5id/;;kdf._oe,n1O +f)=2%f\+sWg'$0ch#%'H_ZA`Uro4%?jo4BDkNM./klL)8rp9[P!:KgS!q>aMrUU![s7H9_rq??c +qY:$bqtfdYp&+L]jo0i2JcDMFJ,~> +JcC<$JcC<$`;eTkp&4^apA=gbrqZHdrqHHdr:U*^s7?3[s7--YrU0gUmHsl=!pf.:r.k<,s+U6$ +rJ(]8M2I4LMMd@OMuJ\8Mu&D2NW.Z2g&BY%fDjG$ec""te,RkpdJqPnci),jc-4E/J,aufIK+]p +HhMd]M#W;3MYi81MZ8V7N;nh9MY2o,X8]-VH1uRZGlW`tMuAS9NJrhqMuAV0NW5%;N<#"-TLAcf-Pa.R3Qi!-MQhZsGQN3EPR08tJS"-#ESberUSc>2[b5'6[bl,f_ +cMu5id/;;kdf._oe,n1Of)=2%f\+sWg'$0cgr@J5NrkF%ir7s=jQ6C'!pAe2rojIKli-8Nm/ZSQ +mfN"Knbr%YoDeI]p&=[ap\O[`q>:$Wqt9m[rT4$0s+13Fs*t~> +JcC<$JcC<$`;eTkp&4^apA=gbrqZHdrqHHdr:U*^s7?3[s7--YrU0gUmHsl=!pf.:rDibpr_r\n +s&K(u#uaf&jAp;cH^pr`&hps&8tuq,@>mr`&kqpJh,lri?$u!)rhojAY\Kr)*Glqc*Dlr`&ksoiD)mqc<_r +r_rhrr`&qtpJV&ilr!^Zs&/nur`Attq,dSup/h8prDibrr`'&$='&H#=8nukV#I1jVY='Z +JcC<$JcC<$`rFloo_nR_pA=gbrV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6K^M!9sKYrhBLf +T`(M]T)Y>gXfeh1Yd(OA[C3O?[0="J[^EQPrjVj9!87A(qq(l!rmgtss3q"rrR(Yls3L\is31Vh +bKKgJooo?;rK6r#*4eJYHY:9ric@)rNQ:+!OB'2Z2Cj*Z2M!,Zi-p(WW.qWN<"q-MZAY0 +MuAS7MuJ\7Mt`2/YPbX)YQ(j,YQ(j+Z2V$0['Tb=s0Da5[JmT7[JdH6[?$CHNWY?(OHK@#!0R5A +qN(?3!0R5Crf[Ao]D9)O]t_=t^qmn*`5]j>aiMNCaN4>%qo\r^!R/gdbQH,6bfg".s.TCcrhKFf +qO.AP!LoVXSc>8]TDkM`U%k;\aT0K]bQ#cdc2Q#fchYr[cN;J@df.YmdeM;jdK%\oao0BYbPo`a +c2>ldci;AidJqYpe,@ereH"2!f)jUXg&B\,p%ZK$_ZA`Uro47EjlPXekND(.klL)8rp9[P!:KgS +!q>aMrUU![s7H6^s7ZHdq=spaqtfaXpAFU^k5Kr3JcDPGJ,~> +JcC<$JcC<$`rFloo_nR_pA=gbrV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6K^M!9sKcr6G;fs3U\ks3gqrrRCkt!7q,#!nc2Zrn7Cg`;>VpO9+>"ro47EjlPXekND(.klL)8 +rp9[P!:KgS!q>aMrUU![s7H6^s7ZHdq=spaqtfaXpAFU^k5Kr3JcDPGJ,~> +JcC<$JcC<$`rFloo_nR_pA=gbrV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6K^M!U3V^<;fbk +<;ont<<#nqmr`&kqpJh/mrMomsr_ieroi(cds%rbop/:rhr_r_mq,.)hqGd>l +r`&ks!EN4p"ldci;Ai +dJqYpe,@ereH"2!f)jUXg&B\+DK,MJr_ +JcC<$JcC<$aT(,ro_nO^p&"^arV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6K^Ms69QZs.]Uh +T`(M^T)5&cXfeh1YHbF@[C3O?[0X4M[^ENO[^WaE\GXtYf)F4teGn"tdf%Snd/VGjc2u87bl5cc +b5RXuPPgUBOnt.@O,f8!O8k4?NW-*fYd(I9Y-5"2YHRl.!O8s0YlM!+Yl:p+ZMh-.W;_bTN<5&s +MuJV-MZAY0MsZK&Xobf0YPbU/YHY77YHY81Z2V'/Zi7<6Za@*IrjDg7rj2`eO,s-trf?r9bfe/OT_Y;]UA:5TRK8nJ +rLEt\TCnlUaT0K]bQ#fdc2Z)fchc#\cN)>kdK%\mdeD5jdeq2bao0BZbPo`bc2>leci2;idJqVp +e,@ereH"2"fDjJ*g"Plarl"WM!TE&;is4Z,jlY^gkNMp0!UB"Mm/QGQmeuSUnF?&Io)J=]o_eC^ +pAOa^q#'saqX47Sr:^*Prdk*#s/#aG~> +JcC<$JcC<$aT(,ro_nO^p&"^arV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6K^Ms69Q=s+^Q- +p4WI"!/CE,#)J+nMi3INr/CW5qi(K5r7Cu"rmgqrs3q"rrR(Yls3LYh!mSs5rlY;ardXfos*alo +!.Fios*a]j!.4BbqhY9-reLT3M#<,/MYrD4MY;u,W;(Z;Gk64ZHKoeUM>iD0MuAS9NJrhqMu8P1 +NW+t:NW+8#H1lRYHh;^^HiK0-O84kJO-#HaO-#HdPa.N"QC!r*q3V&Grg3YPs-`hQrKdMWq4[h_ +q1JNqr.>!&re:3's+gTle +ci2;idJqVpe,@ereH"2"fDjJ*g"O'OqiCZ:!TE&;is4Z,jlY^gkNMp0!UB"Mm/QGQmeuSUnF?&I +o)J=]o_eC^pAOa^q#'saqX47Sr:^*Prdk*#s/#aG~> +JcC<$JcC<$aT(,ro_nO^p&"^arV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6K^Ms69J]r)<;g +r`';);c?Xqleci2;idJqVpe,@er +eH"2"fDjJ*g"L1Wqb@#a!`.e7ro47EjlPXekND(.klL)8rp9[P!:KgS!q>aMrUU![s7H6^s7ZEc +qY:!aqYKXWpAFX_kPg&4JcDSHJ,~> +JcC<$JcC<$aoC8to_nO^p&"[`rV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6B[MrTOH\USFQV +rLX(]q4.qaX/rJ,YHP18['d?Nq6^I9\$`WP[^WaD\Gt.Zec""se,RkpdJqSnci)/hblGudb6,o/ +acuF]rK@,Aq2bT;pPo65riZC-Z*F50qQBq(Z2(X'Z2M!-Zi6m#N!#&uN/RUks,6`2s,-l7pl"^% +",i+sMuBd[YHG),YQD#4Yl:j+YlD!-ZN%9/[/[Q6[K%)0Kk^qde'`5Ta:aiXM%!6G)[rQ>,_qTK)ebfn8QrLa%]s.T.Sr0dYUSGo)ZScGDW +TE*.5aT0K]bQ#cfc-FW3chl)]cN)Agde;,i`r3sSaSs<\b59B]bl5lccMu5jd/DAldf7eqe,n1O +f)F8'io]OorP\QM%H-4)ioB([jlPXekND(.km-M>lg4!*mI'rA!q>aMrUU![s7H6^rq??cq"Xd_ +qYKUVp\adakPg&4JcDYJJ,~> +JcC<$JcC<$aoC8to_nO^p&"[`rV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6B[MrTOE>L5(EU +K`6Z,KS>0XLBWNlMi3IMqi(N4r/CQ5s472"rRChqs3gkns3UelrQbGf!6kDb"3Sa-J,+QmIIhj_ +Hi&-hHN8BhM#W8/L]N?gqhb?1rJU]5pP]$Kqg&!^s*=Hcqg&0ems,+^H$OXjLl)+gqht<0rep]5 +qMkN8rf-Pqr-A?gr-J0coR-L^"-8P*O84kJO-#HaO-#HePa.N"Q^=),q3V)HrKmPOs-`hQrg3SU +rLj1ap4N3nre(3'pP&[5rfdGKQMQsGR/NBKR/NBOR/WKVR[]e:SGA`LScHe/a83mVao9H[bPo`b +c2Grfci;AjdJqYpe,Ihue^i=Nf)r4^\%DR!qiD9FiSrkWj5f=`k2tjikl0fOlKdd&m-X3.rU0gW +naZSKs7?9_r:U'_rqH3_r;$3cmJHYUp\j:SJcC<$VuM8~> +JcC<$JcC<$aoC8to_nO^p&"[`rV??crqHHdr:U*^s7?3[s7--YrpTmTs6]gPs6B[MrTX;\r)<>h +!`N&trDikr!*&qt"&r2t;YsGn;uK\nlr`&eqpf@Aor)EYo +p/D#jrD`eq!)iAbr_iSirDrkur)WVps&etrs&T,!r)Wbr!*9#!rLa%]s.Ss^nl>Zgr_ihslg4!*mI'rA!q>aMrUU![s7H6^rq??cq"Xd_qYKUV +p\adakPg&4JcDYJJ,~> +JcC<$JcC<$bQ$Q#oDSF]oDAL_rV?!+r/:T6s,6cW +!3c=)s/uF,ric@+s0;R/s0MX1!4Dg7!O[paNr=t8NWP9'OT(@EOHGZepQ,-3!KiQAP5r5o\cBA< +]F;Nh^VIY$_SjF5aN;O%`rO3Yao0B\bP]Tac2Yufb5._0TD"]KRKT+MSXlAOTD>/[b5TN_b5BH_ +bQ?&7cMPrbd.u#fcMl,idJ;5be,I>b`r=$TaSs<\b5BH_bl5lccMu5jd/MGmdK%bpe-=ISf%Jj; +jnm!m_[YP_io9"YjQ,Fbk3(pkroj[Qlg*p(mHs??mfN"Knbr%YoD\C[p&=[ap\=O\q>'mSqtU*` +rTO63s+13Ls*t~> +JcC<$JcC<$bQ$Q#oDSF]oDAL_rV?.N;eb4N;S\7 +NW>(.H2`-hH2;jaHglF_O8k:AO84kJO-#HaO-#HeQ'IZ$Q^=),qNq/HrKmPOs-`kRrg3JQs.At: +q1ATu!/1?*qM#',Q'M?5!L8uIQi*6LQi!0KQiEHPR08tJS"-#@Sc#)Y`VmgUa83mVao9H\bQ#fc +c2Grfci;AkdJqVpe,@c#e^i +JcC<$JcC<$bQ$Q#oDSF]oDAL_rV?tt<;okt<;ohg<;fhpeGn"sdf%Snd/VGjcMu/hbl5fcao]]+aSo*<;X[Q_;Z9Vn +;?0Yo<;]\p<<#nr<;oec<<#nq<;onslrD`_q +qc3f#<`W5t<;ohc;ufkl;Yj>d;Z'So=8Z+q=8uCr=8u>"lg4!*mI'rA!q>aMrUU![rq--]rq??cq"Xa^ +q>0LUq#'mbkl-/5JcD_LJ,~> +JcC<$JcC<$bl?]%o_nL]oDAI^rV??crqHEcr:U*^s7?3[s7$*YrU9dS!:BdPs6K^MrosIH!p?>P +rh'1]r13YR%'-J3Y-+t3Yd1XD[C5q>qmQL5rODjUs3ghms3UelrQbGfs31Jcs2tA`rl>)[nWX!9 +!g/S,qN(]QMu/G5Mu/D0M><&+Mt`2. +MuJY9MlllZ!3cC+!O8m,YPtd*Z2_-/Zi.6:[C3N&N/`gWNqeV5NrP1?O9:W,O-''rq2bW>P5:@C +]"@sQ!5&*?!58BH$,FBo_o0O6aN;O%`rO3Yao0B\bPfWhc-FSXbab4%Sc>;\R/`TSR/<6b0'_*!6Y5_rlbGgcHc=5qp>/brQYGjdJ;5ce,RA_`W!mUa8F$Xao9H]bPo`c +c2Q#gci;AkdJqVpe,Ii#e^2dtgr9-.qSNd#iSieVj5f:_k2tjikl0fIlKeH9s6TgSrU9dU!:g$Y +s7?6^r:U'_rV-']qt^$`n,)kWq#0IVJcC<$WrIS~> +JcC<$JcC<$bl?]%o_nL]oDAI^rV??crqHEcr:U*^s7?3[s7$*YrU9dS!:BdPs6K^MrosIH!p>;l +q1Sa$q1Jd&LAHZ/M2I1KMMqCkrJUT4rJgg*s3ghms3UelrQbGfs31Jcs2tA`rl>)[qL8Elq0`3h +!.=WirHeBgqKhsns+gN.qhb?1rJUZ4q256Kq0D^Zr-.p\np1.XrcnKgreUT2s,-]3qMbE3qi(H4 +s,Q8fr-J6en9k4rs,[5ApQ5B8$BUC6Q'IZ$Q^=),qNq/HrKmPO!1EeQs-NbUrLNt[rdt0&s+:'! +r.=j!s+LB*qhG6;Q'M?5!L8uHQi3 +JcC<$JcC<$bl?]%o_nL]oDAI^rV??crqHEcr:U*^s7?3[s7$*YrU9dS!:BdPs6K^MrosIH"6WW^ +;tj8e;u]hptt<;okt<;ohh<;fhre,RkodJqSnci)/hc2Z#ebQ#`bao9?]a5p8!;?0Yn<;BGo +<)Z`pg<;T\o<;]bo +JcC<$JcC<$cMuu)o_nL]nb`7\rV?s6B[MrTOIKkND!$ +rh'1]s./hQs/QF,Xfeh1YHY:2Nr>"=Nr4t9NW>.:O91Q-P5:CB\cBAA +](ru=^&GbQ^qmn*`5Ta;aiOG$qoSfZrlb5`"3o-9bl!t1SGnlOR.m$JRfAiWSGo,ZT`1VgTZ>-p +b0'_*!6Y5_rlbGgcHc=5qp>2cr6>>idJ;5ee,R;`_u@UO`W!mVa8 +JcC<$JcC<$cMuu)o_nL]nb`7\rV?s6B[MrTOLLkNCu] +L&?W(L%U-!K`Hl(LB*//MZ8V5N;\\4N;eh:df%Smd/VGjcMu/hbl,]db/qd)aT'9^`dWC8I0>"I +I=-G@HN8HhHNJM?Hi/3fHhr$gH2*3qL\uu)M>rJ4MuJV1MtqYdGl;jcGk64XGlN$hGlrJ0 +Mu8P4MuJY8MuJ\6NV.PsHLlF[HMi$gHN&9_I/K&uOT(:JOHGcmQ'R`&Q^F0:Qi36LQiI!gf:ArgNapQ5E;%H-4(ioB([jQ5OdkND(.klU/9 +li-5PmI'EAn,MnWnbr%YoDeI[p&=[`p\+CYq>'mUqtU*arTaB5s+13Ns*t~> +JcC<$JcC<$cMuu)o_nL]nb`7\rV?s6B[MrTOFJkND"& +<:j)h<;T\q;ZKeq[;YX/j;Yj8i;ZBYq;Ya8f<;]bo<;]brnf<;]\m<;oho;Yj>j;YsAm;YsMm=8c1q=8uCr=8u>"'mUqtU*arTaB5s+13Ns*t~> +JcC<$JcC<$ci<,+o_nL]nb`7\r;$3arqHHdr:U*^rq$-[s7--YrU0gUmHso>s6B[MrosIHs6'FE +!2'4]!1ihRr0m\eri?I/Y-+t3Z*UgF[C5q>qmQO6rj`!Us3UbkrQbGfs31Gbs2k>`rQ#,^`l?!: +plYW@rK@2CpQ5B8qi:B0!3Z7'!jJr6riZ4%r2p((Yl(^)YQ1m+YQ;#7rf$c5qMbE3onrI$r/CE/ +rf$fX!NrR'Xp)#5Yd(F:ric@+qm$1,s0M^3rJU]7mZ%4+!0-r;r/L`:qMtZ=Oo1CBPQ&,q]=PSc +q7H^@rkAZQ_8=./`Q%nurl5#[qoSi[rQG,_!mT$8rL3bUqj7/HpR2#L!h5^Nrh'1_s.Kh?a2l?E +b/qcJbKJ-/bPo]ec-FW4chl)bci),icd;F7r6kY^qni"k(-#_o^4&`VROL_uJX&iSrnXjQ,Fbk3(pkrojLLlg+Q:!q#FDrpTmVs7-'Ys7?6^qt9s^ +rV-$\q>'j_n,)qYq>KRWJcC<$XoEn~> +JcC<$JcC<$ci<,+o_nL]nb`7\r;$3arqHHdr:U*^rq$-[s7--YrU0gUmHso>s6B[MrosIHs6'FE +re1E,Kn]5Rr.>!'reC<*#De4oMMm@MMuJ\6Mu8P5NW7E+d/MAicMu/hbl,`baoKQ^a99Q'`l5pr +I/eWmI.Vd]HMr3dHN&3bM#W8.M#)u.MYrA4MYrD,H16(UGQ)j]H2)X`H2EC!M2I2eMu8P5MuJ\8 +MuJ\8NVdtsH2W'_GlW*fH2W!eH2W'`HiJKjO7eV6Ns:]/Pa.N"QM-[EQMm0GR/NKRS,7d5K):3" +K)L?$K`6])LB!&+Q2d'MQ'Ra3QiD+J_u@UO`W*sWa8F$YaoBN^ +bQ#cdc2Gohcd:& +JcC<$JcC<$ci<,+o_nL]nb`7\r;$3arqHHdr:U*^rq$-[s7--YrU0gUmHso>s6B[MrosIHs6'FE +qc*&`!`W0!rD`nu;cN`r!EN4l<;ontdJqSmci)/hc2Z#dbQ#]bao09`a2Z-<`V<=2;u'>f;tj8b +;Zp&u<)cfq#D+J_u@UO +`W*sWa8F$YaoBN^bQ#cdc2Gohcd:&'j_n,)qYq>KRWJcC<$XoEn~> +JcC<$JcC<$dJr>-p&4U^nGE+ZrV?s6B[MrosIH!9a@D +!9O0N!1j+Z!1WnVq3qemX/rD)Xfeh1YHY=>p9jh,rjN!>d*L&9cMu/hbl,`bb5]T_aT'9\`r3jW +`09kWs,m&;rf@#utqMkW&[qoSl\rQG,_!R8phQiNQKQhm*ERJiQUS=Q8NT*V*`TuP*m +aN2O'aTK]/bKTt/rlbGgcHc@6rQkSkd.u#dc2l8a +s31MfrltVld*U2>^&c$dqo/HNq8<6j$fU+*j5f:_k2tjikl0fJlKdd8liQSBmf)\TnGi%Wo)A7\ +o_S7[pAF[Xq"aa]qXOIYr;$ +JcC<$JcC<$dJr>-p&4U^nGE+ZrV?s6B[MrosIH!9a@D +!9O36!JZ=-KE-Z&K_^9#L&Zo(LBWKjMM[4Jrepc7rJUT4"-([Rchu)gc2Z#dbQ#`bao9B]`rO-X +`;mjPI.Vd]HN&9kHN&3fHMr*hLA6T)L\uu)M>rJ5MZ\ipMi.Ikpj):Pqfi'bpj)RXs*4ThqhY9/ +!/gW2r/CW5rf$l8rf$\urH\'^qg%p\qfr0fpj<$gqN(W;!0@#=!KiKCNs1W.Pa.N"qj.;KrKmJK +rKm8G!1ES4qL\?lre19)!euJcqj%/F!gT(;q3V)JrKmJM!13PLrL!\TS,JlMSc6G(_>D+K_u@UO +`W*sXa8F$YaoBN_bQ#fdc2Puucd:%dQBd\uQBIAmOHG\$OSb1?i!\N'j5]4]jlY^gkNMp0!p]+; +rp0^RmdC)Cs7$'YrUTsZs7H0\rq?9ap%\@Yq>0XYq>C'elMcA7JcDnQJ,~> +JcC<$JcC<$dJr>-p&4U^nGE+ZrV?s6B[MrosIH!9a@D +!9O,Xn5BBd;cNWo!`W)tr`'##g;ts8h;u9Ji;ZTirq,[Gqr)WVps&f8%s&T/$!*9)#!*9%uqc<\r!EN;$QiNQR +<;BJi;Y3o_<<6&tr_i_o"]SK&<``?#cs3:Pg#g^lEd8j7G;cN?_r([_ti8ESRj5]4]jlY^gkNMp0!p]+;rp0^RmdC)C +s7$'YrUTsZs7H0\rq?9ap%\@Yq>0XYq>C'elMcA7JcDnQJ,~> +JcC<$JcC<$df8J/pAO^_nGE+Zr;$0`rqHEcr:U*^s7?3[s7--YrpTmTs6]gP!pf.:rosIH!9a@D +s5j9Ps.'.[rgWhUqO@JS"0/E&XT#@%Y5b[,Z*Uh3[/m_FrjMg8!4`$RrltJerQG5`s2k8]s2Y/Z +rl+oU!5n_us-!>E!0[8BqN1`utqMtT:rK.&A +s,mGI]"@sQ"1u.U]D9,>^AkqS_8=+.`Q#s>aiOJ%s2b5^!6G/]s2t;`rQGJjcBjocQ'V02r0[8I +rgNkVs-s:aStDXJTuI#N!QW:ZaT0K\bPo`bcMZ#ed.biicHXVZcdDF6qnN-Grk\KKrkn`RrPecU +s2Y)Z!m/U-rQ>8dc-?75!71SW!5JBLqo&?Krnmh9ir7s=jQ6C'!U&\GklU/9li-5PmI'EAn,MnW +nbhtXoD\CYp&4U^p[n7Wq>'mXqt^0crTjH6s+13Rs*t~> +JcC<$JcC<$df8J/pAO^_nGE+Zr;$0`rqHEcr:U*^s7?3[s7--YrpTmTs6]gP!pf.:rosIH!9a@D +s5j67!JQ4+KD^DtK*6j^KnY9WLBNHkM2I2hMuSb7Mu8M6NW.6&c2Z#dbQ#`bao9B]a8a0Y`W*jV +_tJKPHhi!eHiJEjH2N!dGlWToM#W8-M#W;3M#E2/MZ8V6MYDDaGl)^aGklXVGl!6rM>rJ1MZ\or +N/[aorJ^`6q0;g_s*FTgpNl^^rHS3brHeBgrd=^+!0I/?s,d8Ar/gr@rf7/COcu(0QM[!OQC!r( +Qi36KQi!-OQ^F05Jc(,mKDU?%K`[!aPkp[EPQI,9QMQsHR/NBMR/`NMR/NERR[a,CqjmW!rkSNL +qni?Mrl"cSrl4uYrQ#&^b0'\+!mJp6rlteqR$X,(P`q;or/pl +JcC<$JcC<$df8J/pAO^_nGE+Zr;$0`rqHEcr:U*^s7?3[s7--YrpTmTs6]gP!pf.:rosIH!9a@D +s5j2YmSa3b;c?Zm$D+K_u@UQ`W!mWa8O'\ai_d)b6#o4c2PumcWO@N0[Zq>C'eli)J8JcDqRJ,~> +JcC<$JcC<$e,SV1p\jg`n,*"Yr;$0`rV-I+YHbC?[.q'/[KX/rH#Y5tl4rN6.&riH(#!NrX)Y5b[+Ycmq_qMY<2 +s,6i5s,$]3s,$H,p5Ag*s,6]Ts/la3Y-5%5Z*:I9YHY81Z2_-/Z29FXMu&CsNVSV3O8b4AOcoUQ +s18^AkqS^r""-`Q#s>aiOJ%s2b5^!6G/]s2t;`rQGMkQBmc"Q'I[3Qhm*JRK&ZQRJr]S +Sc>;]TDlh0`W=-$r5er]qTJo_rm(GfrQt;b"jYB;cHsu4df7#[^AG\E_#D1J_Z%IQ`;R[T`rF*X +aT'?^b5KKbbg"E3^&>\@`Vd[N_uIUQhuVfrro4%?jo4BCkNMp0!p]+;rp9[P!:KgSs7$'YrUTsZ +rq-'[rV$-_o_A7XqYKd[qY^0fm/DS9JcDtSJ,~> +JcC<$JcC<$e,SV1p\jg`n,*"Yr;$0`rV-93repc7s,6Ysnp0kRp3HX`r-SEjrJpr?rK$u?s,[)>s,m;A"-AY/Q2[*LQN3?N +QNWV@Q^4!:QMm0JR/`KPJG4WkK)L?%K)L>sK`?c*Pl$aFPQI,9QMQsHR/NBMR/`NMR/NERR[`u? +!hI$0sYqtg6drTsN7s+13Ss*t~> +JcC<$JcC<$e,SV1p\jg`n,*"Yr;$0`rV-kc2Z#cbQ#`bao9B]a8a0Y`W*mV_uIUQ;XIE^;Yj>j +;YF#l<)Zaq;u9Ms;c6Lm(='&F'rDies#Zk&, +EO;cENlr_reqq,@;krDW\ppJq5ms&/nqrDNl!?b96=B8Go:&%K_huVfrro4%?jo4BCkNMp0 +!p]+;rp9[P!:KgSs7$'YrUTsZrq-'[rV$-_o_A7XqYKd[qY^0fm/DS9JcDtSJ,~> +JcC<$JcC<$ec4h3p\jjan,*"Yqt^'_rV-S,AfKRg#7ZWiE,$riQ1&"L#&7ZaBM8s0hp9!k,SIrQG2_s2k8]s2Y/ZrP\iV_o)Jj +s2"Al!0[;CrK.#>r/Uf:q2G'-"0/E(Y5>C'Z*4/0"0JZ*XSo7%Y-7c+!jAhfrf$T0!0$o8regW1 +!/g]2pkf'.regZ4pPK$1MMh22%'H_7YHP18Yct=7Yd",3s0;X0pPJs/pl,64s,?i7q2G<4q2Y?5 +s,[AEOcm8cr4;p?!4qs<&&#]l^VI_(`5Ta:aN;NDa8X0[aT0E]aoBN_bP]QcQ'7F2PlI!KQMQsG +R/WNOR/`QWR[]e:SbnuY`;[^X`lH0Ar5er]q9&c_rm(GfrQt>c!7(Sg!m]0?pX9#Qrk8'm`o_\L_qYfd[JcC<$Z2]=~> +JcC<$JcC<$ec4h3p\jjan,*"Yqt^'_rV-93repc7qKVISr-IdVrd+Qjr-\F'!0I/?s,d8Ar/gr@rf7/CP*D72QN*9WQC!r(QC!r( +Qi36LQi*3PQ%+;_JG4WmK)UE#K)UDsK`./3Q2d'LQ'V64rL!PMrL!SNrL!POs-`qWopkunrk8 +JcC<$JcC<$ec4h3p\jjan,*"Yqt^'_rV-b5]T_aT'<\`r3jX`5BLl_Z.IL;Xm]b;Yj>i +;YX2j;?]uu<)Zapqc*So!`Dutr`&eq!`W)sr)ESms&&hor_iVlrDNYmlVd^\p/:oh##\K%<)Zap +r_i_oq,I;mrD`Jg!)rbmqbmJoqG[Akqc!MoqG[;irDN\opK%2nrDr_qs&f5$s&K>*<`W:'<`]0! +r`9&#s&K/#Q2FSQ<;]\m;Z9Vn<;9Jn<;KMs<)lt#='#6!s&B"urD`\pq,@>mr_`er<)iTlrOi-C +rkA9Es1nWMr5/KOs2=lTs2P)ZrlG,]!6Y8`s'#D+!a8`.ohG-T"Q/.qiSsjs!T`AAjoOZ/rosIJ +!:0XNs6]jSrpTmVs7-$Xrq$-]q=X[ZqtKaXq>'m`o_\L_qYfd[JcC<$Z2]=~> +JcC<$JcC<$fDk(6p\jjan,)tXqt^$^rqHBbr:U*^rq$*Zs7$*YrU9dS!:BdPs6B[MrosIH!9a@D +s5a7Aro4'MS"';FoUGiK"K/9"X/u9%riQC-Z*UgEppL.1rO2pQb0%iJrQ,#Zs2P#V!lW!orke]O +s1nJpqNCl@qiCf=qi1Z9o8N^/rJ^cV!irE*ql^7/YHG%1XfST$XT,F'YPkU,N/`gUN;8D2N;eb4 +M>rA5M26ueM>N2-M>`>2M$&QjM2M4f!K)a4XT5O%XTkr1Xfek3Z2Us.YH\#2s0;W]pPS^'pPf*0 +r/CZ8pl>95s,d8A!K`HC\bs&=])]G;]FV]i^V@S$_o0O6a2lBDa2e2#s2bDbaiV]JrQG/`!L/fG +PQ7!JQMQsIR/WNMQj&nHR[]h)[s2b;abPo-R]`,SE`:q7L`;RUN_?AcSi8N\pirS6& +roO7Ekl0iHl2^/Lm/QJQmf)\TnG_tUo)J=[o_J1XpA=UUq"jg`qXj[]r;$ +JcC<$JcC<$fDk(6p\jjan,)tXqt^$^rqHBbr:U*^rq$*Zs7$*YrU9dS!:BdPs6B[MrosIH!9a@D +s5a7AroHb/qd(aT'<\`r3jX`5BLl_Z.IP +_"N0THi&-hHi89iHi89hH2N!gH2i3hH2WHtL[p9$M>rD1M>iD3HN/9gGQ<$bGk6.VGlN!fGl)^a +Foul1G'Ek-!I&_cL]E;0M#W;3MYW/1N;\Y7N;.Y`H2`'YH2`-iHiAElHi&j(OSt7?OT1C>OT1IB +NsCc0Pa.Q$QC%T:#+(XAQ^=#)rg*MLrL!G3p4<3pre('!re('#r06r@s-EJIrL!SNrL!SN!LT;S +R/NERR[`u?rk&'?rk8)[s2b;abPmh-Qi:$\qtg6drU'T8 +s+13Us*t~> +JcC<$JcC<$fDk(6p\jjan,)tXqt^$^rqHBbr:U*^rq$*Zs7$*YrU9dS!:BdPs6B[MrosIH!9a@D +s5a7Arob0%iJrQ,#Zs2P#V!lW!orke]Os1nJ/ +k>V=Wr)V7N_uI[R`W*pXa8X0[aT9Q-r`T8)s'#M-9_M3Q:'BJ4 +i8N\pirS6&roO7Ekl0iHl2^/Lm/QJQmf)\TnG_tUo)J=[o_J1XpA=UUq"jg`qXj[]r;$ +JcC<$JcC<$f`117q#1!cn,)qWqt^$^rV-OTSXuFk_o0Lm`<4-#aN4>%rlY,]"3f$8cMZ#ed.biicHXVZcd;L9rji$>rk&'?s1SEG +r4i9Is2"ZNs24lTrl+oW!6>)[!QhqO]DoMD^&GtE`VmaS_u%:S_;F2/iSsjs!T`AAjoOZ/rosIJ +!:0XNs6]jSrU9dUs7-!Wrq$*\q"=RYqtK^Wqt^-cp&"U`qYfg\JcC<$Zi>O~> +JcC<$JcC<$f`117q#1!cn,)qWqt^$^rV-O9gu1O,oBbPEhI4Qhm!J +Qi*0JQiEHQJ,k0!JFnElK)L?"K)UE!K_q#.Q2d0GQNEP@R/NBMR/WETR$jA0R/NERR[a&Arji$> +rk&'?s1SEGr4i9Is2"ZNs24lTrl+oW!6>)[!6P/)s-E_Qrf[2Cs-!DE!0Zr9"Q/.qiSsjs!T`AA +joOZ/rosIJ!:0XNs6]jSrU9dUs7-!Wrq$*\q"=RYqtK^Wqt^-cp&"U`qYfg\JcC<$Zi>O~> +JcC<$JcC<$f`117q#1!cn,)qWqt^$^rV-qr;Y3i\;Z0Gm;Ya2i;Ya5k<;ohr;Z9Sr;Gg]DK8@^&GbD^]2+L_>V7N_uI[S`W*pXa8X-]a]_mI=oVY*>Q.=k:%M*`:Z(*g +iSsjs!T`AAjoOZ/rosIJ!:0XNs6]jSrU9dUs7-!Wrq$*\q"=RYqtK^Wqt^-cp&"U`qYfg\JcC<$ +Zi>O~> +JcC<$JcC<$g&L=9q#1!cnGE%Xqt^!]rV-9ar:U']s7?3[s7--YrU0gUmHso>s6B[MrosIH!9a@D +$0C7/j5].YiLHG3RfJoTS,/Q[W2HSoX/i>(XfVK(s02R0rj;L/!4Mm9s2b5\s2P#Vs24oTrPJTN +!5STKs1SPtPEYp-q2tZ;"-AS)Nr4n/N:r/5W2ckuXKDB'#I(D7Y-"h-X8T+#X0)B(rJ^K/s,6u: +MZ/J+M#<,/L]E;0M#N82M#2u,M#<)0XT#@%Y5GC+Y,nb.YHY;0YQM.cLktk`onrR'qMP60!0$f7 +r/UQ5!4`!pq.-O^V@S#_Sa@4a2c +JcC<$JcC<$g&L=9q#1!cnGE%Xqt^!]rV-9ar:U']s7?3[s7--YrU0gUmHso>s6B[MrosIH!9a@D +#Nb%-j5].YiVJ3,K_pE#K)^B%K)L9#L'NEeLPCP=LPG\]!JlX4M>rJ.MuUlua8a0X`W*jV_u7IP +_#V:M^]2%BI/\KSHM2XaL'*-aL55>Ure^Z2re^Z$s*=Ebs*=Whp36IYr-/*_!-e?as*"HdpiZFV +!/LN/!/^W0s,$c5qMPB5MtqSrGjfqXGkuXYGl)dbH3&A?rd+X*qMtWs-EMJs-NhRR/NBMR/WEPR/WKR +R/NESR[]fBSH$+r\c02>]DT>A^&GbE^]2+L_>V4P_o0Lm`W*pZa2jPCQN*:$]qtp +JcC<$JcC<$g&L=9q#1!cnGE%Xqt^!]rV-9ar:U']s7?3[s7--YrU0gUmHso>s6B[MrosIH!9a@D +#Nb%-j5].YiV6@L;?0Yh;?Kio:f73ks&B%urDikr!`W0"r`8ttqc*U:s2Y/ZrPefT!5ncPs1n]N +rkJKIs&/nqnP]Eelr3XV!)`Yns&8eorDNet;c?Zn<<-"p;uT\h;tNr\;Z0Jm;Z9Pn;#O8j;Z9Vp +;Z0\sX2_;>a>k;>j>g;?'P`;Z]io;=moe=8Z+q]DT>A^&GbE^]2+L_>V4P_o0Lm`W*pYa2n*[s'#Cqq+^BS"]+%6i8N\pirS6&roOIK +kih9qlK[^6m/QGQmeuVRnGi%Uo)A7Zo_A+VpA=UVq"smaqXsa_r;-BZrdk*#s0VfV~> +JcC<$JcC<$gAgF:q#1$dnb`.YqYBm\rV-9aqt:!]rq$*Zs7--YrU0gUmHso>s6B[MrojLJkNDj, +!TiDAj8\*>iSaO$r0mSRr0mPO$E0l#WiN2%Xf\\,riQ=+Z*O>8q6^@6\$sAsrPefT!5ncPs1n]N +rP&HK]tM)XP5g^GP5(1>O91K'Nr"b-N:`#4VlHbtX0&Q%YPt^)XTGT)X8]1%X/rK$N;eb8N;e_= +MMm@LM2D+cs+gQ/pP8L!q1es+r/(HTriQ4'r2g.*XK8S.YPbX)L]<2+M +JcC<$JcC<$gAgF:q#1$dnb`.YqYBm\rV-9aqt:!]rq$*Zs7--YrU0gUmHso>s6B[MrojLJkNDj, +!TiDAj8\*CiS]??JqJ^TK_pDuK):*-Knb;9LPCP=LPCP=M#N/1Ll2.fs,-W1s2P#Vs24oTrPJTN +!5SQJ"2;I^]_d*THN8BkHiJEkH0fkLGlWQsL&d#"M#N82L]E;1HN/9aGlDpdG5c^[G5HF\Fp)r2 +G'.p&Fo$:]L]*#/M>W20M>rJ0MZA"tGQ)jVGlW*fG5ugbGQ2mfH2;d]H2i0jI/SElNr"e:OSt4? +OT(==O9gu1OH5KcPEhI4QhZjHQ2['LQi;F7It6j9!eQ&Vr.Fj!s+LH +JcC<$JcC<$gAgF:q#1$dnb`.YqYBm\rV-9aqt:!]rq$*Zs7--YrU0gUmHso>s6B[MrojLJkNDj, +!TiDAj8\*AiS[X5;Z'J^;ZBYs;,C-h<<#tu<;ol#<)Zarh +r_rhp!*K2$s&K(ur_i_or`&ntr`&blqbZcZqG@)erDN8d"]A8s;Gg<_ng<;]Yp<;ohn<<#nn<<#qu:$^qtp +JcC<$JcC<$g]-RaNreg]3reUH, +!/CK.reCE+reCH.pk\^#qhY9Q!3H1%s/u:%"g4u/Xfnr-Yl':PM#N7tMYN)0N;8J4Nr+k;OT)ch +\biu;]DoPD^&>SS]tV7r^qmn+`Q#s=aiVWEq8`WZb*2gh!0d;Erg!MLoU#NEs-ihSrLE`&rP\iX +a2n/"s2t5^!6kDerQkGhps/rcrlkMid*_g?!4D^4rjVm:r42j=rk&-As1SHHrP&EL_86,fs2+oV +\@DLJs186Bs2FoSp;R$L!5nfQqnWHmhr*GOir7s=jQ6C'!pAe2rojLLlg+N9!q#FDr9s[TrpfmV +rU]sZp\"FWqtKdYr;$9epA=abqYfg\JcC<$\,Us~> +JcC<$JcC<$g]-Rh=M +^]2"J^&GYE]Dd3VHi89cH1-(VH2i3jH2i3iGl`YRr.Y3,o8*C&!/UMus*=Ebrce9`rce0]q/l[\ +r,qs[q/u^\rH/0tLPPha!/^W0s,$c5r/:T"q02UYp3?X_rHJ9brce*]q0E!dr-SF'qMtW +JcC<$JcC<$g]-RTjrE'#!s&Atqr_reqr`/bkr(ul[pJClerDN8dr_i_m!*B/#!*/borE&eqr)Wl#rE'#" +!*B%ur`/nq!`Drqoi1Zaoi1lis&T,#!*9)!rDWbqrD`ess&K/%_=O_Z7XR>5_S->$4Ws:/1^]qG$HS"lA.pi8N\pirS6& +roO:Fkii$1!p]+;rTjUQmdC#As7$$Xqss^Wr:KaVqtBp]p%\I\r;--aqu$ +JcC<$JcC<$h#H[=q>L-eo)&:[qYBj[r:g0`qt9s\rq$*Zs7--YrU9dS!:BaO!pf.:roj[OkND!i +jlPS&irS/urnme6rgNhUrgNkVq3q/Js-O1kVl6MlWiN2%XfSW'Xotr4Z*Ue9[/%*3[`$)$rke]O +s1nWKs1\NHrk&9D](V2M[-2YW2ckuXKMN*!j8`1riZ:'s/Z1$ +oo/m.s,$l7Lku%cre:T3L5(D:LAHW'LAlu,M"6<$M#N/3Lo[SXrN-(&r2g1+XfSY.YH[VRs+gZ3 +m#(Rrs,?f6rJpl&rj_p;qmug>rk/9ErO`KN^;%Fu_8=.0`Q.qu!6=oVs,mMKPa%Aqqiq)F +s-E>Es-WeRqj[MRq8E9Os2G)[aSO$Tb5oi3rm(Mhs3Lemd.biicHXVZcd;X=!42[3s0_a4rjVp; +r42j=s1A6Bs1SHHrkJKK!5\ZOrODg:s1/3Brl+fRp;R'Ms24lRqS +JcC<$JcC<$h#H[=q>L-eo)&:[qYBj[r:g0`qt9s\rq$*Zs7--YrU9dS!:BaO!pf.:roj[OkND!i +jlPS&irS/urnmn9JqJ^TK`$K$K)L?%K)U?"J-gm_L5(D:LPCP=re:H/M#N2,M>rJ1MZUi7_u@OQ +_>h=M^]2%J^&GYF]=RuhrHnKhs*4Thp3HU_s*=Heqg&!`rcnO!L&?Z*L]*#/L\Zc*M>DMuH2)Ua +GPQF]GPQFWFng(QFoHIbFbkg.rJ1H1r.tB0s,-f6rcn3^q0;g_qfr$_s*"Bcqfi*drHS0as*F]l +"F>EANK*pt!KW9>NrY:@O8k=?O8Y.GOcYZcOHPinQ2[-KQ2m3JQ2m3KIf=isJEh^bK)L?%K`$Q( +Q2$U=Q2d0FQN3ENQi3_=J +PlR-LQhcgDPPLC6OTjV!i8ESRro47EjlPXekND(.l2U#Kli$2MmJlVPn,MnVnbVhSoDS=Tp&"I[ +p\+C[q>C*`qtp +JcC<$JcC<$h#H[=q>L-eo)&:[qYBj[r:g0`qt9s\rq$*Zs7--YrU9dS!:BaO!pf.:roj[OkND!i +jlPS&irS/urnme6r_i_ol;IX\!`;ckr_rktr`&nt"B8;u<)iitr`&r!r`/tt!lW!orke]Os1nWK +s1\NHrk&9D])>P);uK\q;ZK_m;>jDl;u]bl;u9Jg;uT\p;uBVp;uT_t;cH`m;u]hq;u]es*o_;>jDj;#jMn;#jMn=T2A(<`N*tr_i_orD`\ls&/kor(ur]ohbZcrDN8dr_i_ms&]2# +s&Jkqr)`Yoq,dPr!*B%u!*/qqs&/kqoMkWbp/LriqcC*`qtp +JcC<$JcC<$h>cg?q>L-eoDAC\qYBgZr:g0`qXsj[s7?0Zs7--YrU9dS!:BaO!pf.:rojIIkPjWD +jT+B@irS/urnn%=hO9n&S!ofES,/TLRJiKXVPgAjW2ckurN$"$riQC-Yd1UArj;O0rke]Os1nWK +s1\NHrk/9C!kPqQr0%#@$BUC3OH5E]NfB$WqhkH5qhtE3s,H]1rJM2FVl-JnWiN5'YHP16Y-5&. +Y5bU*XK/GqN!5,sMM[1GreLE+qh>$&r.Y0*reCK0q1nm&pP8aKs/c4%!NrO&XTbl0XKA[\nqR7% +MeG^]2(L_>Cb@\H'5=`Vd[J`W*mV_uIUM_%>J\i8ESRioB([jlPXekND(.l2U&K +li-8NmJcPOn,MnVnbMbSoDJ7Sp&"I\p\4I\q>C*_qu$BgrU0Z9s+13\s*t~> +JcC<$JcC<$h>cg?q>L-eoDAC\qYBgZr:g0`qXsj[s7?0Zs7--YrU9dS!:BaO!pf.:rojIIkPjWD +jT+B@irS/urnmt;hLgH6K`$K%K)C6$K)C2sJ-:OZKnbeG^]2(L_>'8rQC%?/!0d/?oT9^Ahr*GO +io9"YjQ5Lck3(pkrosIJs6K[Ns6]gRr9s[TrpfgTrU]sZp@\=Vr:fs\r;$9epA=dcqYfj]JcC<$ +\c70~> +JcC<$JcC<$h>cg?q>L-eoDAC\qYBgZr:g0`qXsj[s7?0Zs7--YrU9dS!:BaO!pf.:rojIIkPjWD +jT+B@irS/urnn(>hGR6M;c6Lll;IX\"&_rm;u9Pn<h=M^]2%J +^&G\E])oRS\boA';ZKep;uTYp;>jDl;ts8g;u]bk;uKVn;uBVp;uT_t;cH`h;ts>l;u9Gk;"dc[ +;X.-X=T2A(<`N*tr_i_os&Akms&/kor(ur]ohbZcrDNMk!)i_nrDNVls&]/"s&Jkqr)`Yoq,dPr +!*B,"qc!Gks&8MgqG[8js&B%uqc3Jo!`i<$pf.8ns&T/$!*8qrr)EVppJ_;p;GpFm<;onpZi@E3 +[J[K4\,Wu:\c98@]D]DB]`>eG^]2(L_>.:6=o;%r:/1^]qG$HS&Dl=&i8N\Tj5]4^jlY^gkNMp0 +s6BXMrp9[PrpK^Qs7$$Xq==LUr:K^UqtBs^p\=[^r;--ar;?Eimf%e;JcE:\J,~> +JcC<$JcC<$hZ)p@q>L0foDAF]qYBgZr:g-_qXsj[rq$'Ys7--YrU0gUmHso>s6B[MrosIH!9a@D% +cud4j5].YiS`YOhqm1XqO@;LrL!YSrgEYN%&]u$W2HVpX/rD)XKDK)"L#&7ZEsM:qm?LA^qfras +1\NHrk/9C!4r->rf[/@rf@2BNfEsqoo&9tqMPKQVl6Pori6:+Y->.6Y-+u-Y5bU(XS7\RMuS\6M +$&QhLPG\[s+CB)re(?*KS98Wr.b6,onN3rrN#t"rN-($rN-4*XfR83reL0$!JcL0M=-8tMuJ\1N +V\\6\GWo:\d>pY]">Se]Y2%mrO`-ErkJKL"N/3t`lInrrKI5Dr0.,EqN_)Hpm;#JrL*\SrLs1A9Cs +1SHHs1\TC\,3]7\ba;D`:h1L`;daT_YV(VhV[8LiSrkWj5f:_roO:Fkii$1!p]+;rTsROrpK^Qr +p]pWq==ITr:K^Ur:^'_p\=^_r;-0bqu$?imf%e;JcE=]J,~> +JcC<$JcC<$hZ)p@q>L0foDAF]qYBgZr:g-_qXsj[rq$'Ys7--YrU0gUmHso>s6B[MrosIH!9a@D +&EW!6j5].YiS`YOhqm1AKS9>Wr.=p#s+:0"pj`O%KS>/7L&H`-LPCQ]L]<2.M#`G2MZU`1_#D+K +^AknG]`5SD])B2=I/J?iHN/9fGk?:NHMVmfK8'/V"c/"lLkgc`L]N?grd+QhrcnEds*4Neq/ua^ +r-&*_"*A[.G5cX[FSp4LFT.*qL]3)0M>W20M#rQYGQ)jVG5umeGlW*`GQ)dcGPZOaH2W!aH2Dmf +Hi8s'NWG3$q2bQ;rK$c9"Hen5Q'VE9rKdJKrI=fqr."]rmt(:drdt3(re1?:rK[2Cr078JrK[DK +nsBs1A9Cs1SHHs1\PupQb'-o8sF;hr*GO +io9"YjQ,G%joX`0kl0fJlKdd7m/QJPmelPQnG_tRo)/+Wo_.tUpAF[Zq#1$dqY0mar;6H\rdk*# +s185\~> +JcC<$JcC<$hZ)p@q>L0foDAF]qYBgZr:g-_qXsj[rq$'Ys7--YrU0gUmHso>s6B[MrosIH!9a@D% +cud4j5].YiS`YOhqm0er)<2b!)rShs&8qo!)rkr!``3!r`&qtr_ierr`9&!r`0/%<5HAcrkJKIs +1SEEs189BrOM`%oi(ifr_rVjs&&bnp/Cid"&i)r;uBVp;uTbr;ZKej;uK\l;ZK_p;>a8a;>F,g; +>sD[;>aPq +JcC<$JcC<$i;`-Bq>L0fo_\L]qt]p[qtL'_q=XaZrq$'Ys7--YrU9dSs6]gPs6B[MrosIH!9a@D +!TiDAis=Z'iS`YOhqm2bS,&KQRJiTRRJN9\VPg;hW2HVpWiW;(XK8Q'Y5ba+Z2h60[/IE3^]2%J +^&G\E]DoJA\HKFO[uupOOoCFDO,f4uN:MnsN;8A8N2rA5LPCQ_L&H])K*6dYK7\aSK`6]$LAur/L4t?YLA-K$X8f7(XfSY,XT#@%Y5X1TL\-<&LPUca +M=HJuMuSb3N<5-"NW"n8\,j.Orj`HK\[o>_]">Se]Y2%mrk&9F^AbnI_$.`q`Q#s=r5ei"s-!GG +qNLlBrK[AJpQtlHrg)[r5nu]rQ>>fc-=PZrQkMjp!3fec-=P\dJU6J +Z2_--Zi7?3[JdQ6\,Wu:\c98@]DfGH]sb>V[^Z.Ds1.sEs2=QKrl"iSs2+ZL%,Kdti8ESQioB([ +jQ6C'!pAe2rosIJs6KXMs6]gRr9sXSrUK[Rr:BjYp\"IXr:g!]rV?Bfp\Xmdqu,s^JcC<$]DmB~> +JcC<$JcC<$i;`-Bq>L0fo_\L]qt]p[qtL'_q=XaZrq$'Ys7--YrU9dSs6]gPs6B[MrosIH!9a@D +!TiDAis=Z'iS`YOhqm2gK`6W%K)^K&K)C2oJ-L[\KS>/8L&H`+L]3&-LBE?fLku"d!/g`5rkJKI +s1SEEs1A2GQ)j[GPu^bGPudWGP-4WH2DmfHi&g$Nqn_9OSk19O9Lc0 +Pa.N"rg3SLrI4cr!.OcorIFBgqh"d!s+LE+s-3JIrfdDJrKR8Gs-EVKs-E5BrL!SN!1Hpm(--oT9R +JcC<$JcC<$i;`-Bq>L0fo_\L]qt]p[qtL'_q=XaZrq$'Ys7--YrU9dSs6]gPs6B[MrosIH!9a@D +!TiDAis=Z'iS`YOhqm2d;ta,f;tNuf;[?8t;H$Oo_Kp/:K\q,7,fs&/Vjq,.;n;H$Nl<<#nq<9[?[;>a8a;>jAn;c( + +JcC<$JcC<$i;`0Cq>L3gpA4liqtp6eq=XO[p\aa\p&=U_oDJ1Ync/+Wn,MhUmJcGRlg!d7klU)3 +kPjTEjlHF$!TN);huV`lrn[F?opYoKr0[MPrL!V_!N)doW;ik$X/rG)XKDK)s0)U1ZEpn9[/RH7 +^:h5Z]`5VD])K8?\,a#;[K)KfOoCFEO,f3ZrJ^E-s,6r9pPf*0!0$T/&Z)A'Vl?\tX/rJ-YHY45 +YHG&)N;eb8MZ/J3L]W?dLAci)K`?]'JcLH%KE-`&L@p9"LAZi)LA\(VXKAS*Xf\](Xo3tCLB!&- +L]E;!MYrD1N;SY8Nr4k;Njnqr!P,f@\I6!Z]",D`]=Y_g]tOBW%_]Tk^VIY%_o0O6a2c9BqNCiA +s-3GFrKR>Irg*;Frg +JcC<$JcC<$i;`0Cq>L3gpA4lEqtp6eq=XO[p\aa\p&=U_oDJ1Ync/+Wn,MhUmJcGRlg!d7klU)3 +kPjTEjlHF$!TN);huV`lrn[U-!/(-"s+C<&r.4Nks+LT/KnY88rIt<-reCE-rJ:E/s,-f6!ku@] +rk/9Cs183?s0r' +JcC<$JcC<$i;`0Cq>L3gpA4kiqtp6eq=XO[p\aa\p&=U_oDJ1Ync/+Wn,MhUmJcGRlg!d7klU)3 +kPjTEjlHF$!TN);huV`lrn[QPpJUido25Qcr_its;,^Fn\,Ni.;YO,c;Yj8j;YX2c;?Kiq;cENl!)rkr!E2tq;uK\g;ZK_p;>sDb;>sJm;ZK_o +;>a5j;>a8d;>a5j=8l;'='/Q'3le;>sDi;>O,a;=mcc;u9Gmt?b64=T2J(=oMV!:B4/b:%(g^h;7&Ii8NYSro4%?jo4EBk5a`E +l2U&Kli$2MmJcPNn,DhTnbD\QoDJ7Tp&+O^p\=O^q>L0aqu$BgrU9`:s+13_s*t~> +JcC<$JcC<$iW&9Dq>L3gp%nd\W;ZSiq=XO\p\aa[p&=U_oDA+Ync&%Vn,MeUmJZAQlg!d7km-G8 +kN:pgjlHF$!TN);huV`lrnRS0qj[ALr0dMNrgEYNs/5mori#gr"K\`,XKDH(!jJr7rj2R1!4Dd< +!kZ%Trji'=s0r!9!O\*cOTCN'rJg]5qMXs(rJU]5p5AsI$)XZ!W2Zl!X0&T)YQM&3Y)N@>rJ^c7 +!fDhkreUT0s+^H*s+L<&rIP3*KS4u2L&HbtL&Qf,L\QW$X8f=%X9,N*XS[_>LAlu.M"li#MYrD1 +N:r82NW?Qd\Gs/>\I6!Z]",A_]=Y_g]tOBW!58BH"Mhjj`5V_q!6=kts-*GHrKI5Frg!MLpQtoI +qjIGPr1!Z&p;I!Ms2G&Zr5eo[rQ>,_"O,-8cHcF8s3UGbs3:\jcHlKlriZ7(r364+s0DR/s0Vg6 +rjMj9s1&'=!kPeIrjMg6!4Vp:s2O9As24oTrPJHJ!o;_jrnmh9ir7s>jQ5M&joX`0kl0iHlMp2J +m/QJPmecJOnGVnOo)/+Xo_8%WpAOa]q#'sdqY9scr;-B\rdk*#s1SG_~> +JcC<$JcC<$iW&9Dq>L3gp%nd#L&LlFq=XO\p\aa[p&=U_oDA+Ync&%Vn,MeUmJZAQlg!d7km-G8 +kN:pgjlHF$!TN);huV`lrnRY2KS0,Qs+C<&r.4Kj#ChG]KS5&6L&H`+L]3&,L]3,-M>rG5MuC9i +]=PTQ\c92>\,Nf:[=%arqg/*ar-7s]r-JjQ5M&joX`0kl0iH +lMp2Jm/QJPmecJOnGVnOo)/+Xo_8%WpAOa]q#'sdqY9scr;-B\rdk*#s1SG_~> +JcC<$JcC<$iW&9Dq>L3gp%nbt<;l[jq=XO\p\aa[p&=U_oDA+Ync&%Vn,MeUmJZAQlg!d7km-G8 +kN:pgjlHF$!TN);huV`lrnRV1;ta,c;t\,Nf9[J*T!;ZK_p;ZK_m;u9Gm;uTZ!;,U7h;,UO2j;ZK_m;?'Jm;>a8h;>O,g;>j>i;>O,`;=.9];ZKks +=8l8"L& +YPbX)Z2_--Zi@E4[JmW7\,Wu;\HocK=B\p5>$+o+>5qb*;#!id:AR]P:'08.hu;O7iSsjs!p&J) +roO:Fkii$1s6BXMr9XINrpK[PrUBdUp[\7RrUfjWrV$3aq=sm`rVH +JcC<$JcC<$irABEqYgI*YHY:;rj2R1 +!kZ%Trji'=s0r!9#dq%HZ]L92OHBF'!KW9>NV8>2MuSb7NW4q;Mu8P5Mu/D+MuKRPVZ<^qWr]?* +ricC*r/LZ6s,-u:M2@&fL]<,*K`Hf)KD^?"K*$^[LAci+K^sisLAZc)LAS%OXoGI&Xnmb;L&m'c +pke[$rJUT4pPo04!OfK9\,s4P])K5J]",D_\[oDb]Y(qkrO`-ErkAZQ_8=.0`l@b9!0d8D#*Y:9 +Q'IZ$p6Y]EqjRGPqnr-G!6+rWqoJfZrQ>,_"3f$7cMc)hd.P`ac2apEXSf4"Y5b^'YlD!.ZMh-0 +[/[Q5[f +JcC<$JcC<$irABEqYg9rItE0L4tB]L]*&-M>iA6 +]=PTQ\c92>\,Nf<[C!1HN&3gGk-%_ +G'A.RG'.s*FSg+ZFSKqWErU4SFS^(PL]DSpG5ZUbG5ZOcFEMbMrce?bms"bUr-/!^qK_p`!dflb +r/LW7qi:f?O-':#!K`B@O9^o2PEhE!Q@8OW!.XosrI4ftnq$^jqLea"qiq)Fq31oFQN!0JQ3*>; +QL^C?R/`KQR/*-NR]HFhr2ot$s0)@)s0;U0rNlO2s0_j7s0i$=P4t1>Pld26PNS)/Oo(==OTO@q +hu;O7iSsjs!p&J)roX7D!9jCGs6BXMr9XFMrpKXOrUBdUq""@Sr:KgXrV$3aq=sparVH +JcC<$JcC<$irABEqYgC/q=XO\p\X[Zp&=U^oDJ1Ync/+Wn,MhUmJcJPli68Lkm-G8 +kN:pgjlHF$!TN);huV`lrnRV1g\k"M;u9Jh;t*lg;c +JcC<$JcC<$j8\KFqYg_KrjMj7!4;a3q2bZ?O,j-tpl,64repi:rJpl9!/pc6!/pZ1pl#*I"/_uoW;Wb(Y->-i +NJrjUN/NYnMuS\7M#W81LA?N'K`-Q%K):3!L&H]%L&ZhtL&Qi'X8f:%XS%;8L&d#-M#<,'MYrD1 +N:`)2[C3RC\,s4P])9)@]",A_rk&3Cs1SEE!58BH"2Maj`:fAoPQ$gFQ2[!OQ'R`&R$dl>s-NeQ +qO%;NrgN_R!1`l&pr*3Orl+rYr5eo[rQ>,_"3f$8cMc)hd.P`bcMjjCX8f:!Xo>L'YPk^*Z2_-. +ZN@MA[JmW5Zi@E4[K!]7[/mbHrPn'?!6"lSrPJHJ%Gfmuhr*GOio9"YjQ,G%k5XWEkl'cGlMp2J +m/HDOmeZDMnGVnPo)/+Xo_J1YpAOa]q#1$eqY9scr;6H]rdk*#s1eSa~> +JcC<$JcC<$j8\KFqYggA?L%KDgE"Jb4HmJ,XlsKDpT)KE?j^L&H`.LPCM;reLH. +rJCQ3rOE!>\$u@Fs0Vj6rj2BHqg/9fs*4NgpiuOYrd"Qir-86e!IB+jHN&0mK7no1K_gE+LP^k6 +HN&3dGjoqWFoZ[^FR4)BFSg.WL]E5/M#VVkFoZ[`F96T.G4p.YG5-:\Gl2d^Gku^]HN&m$NVeb6 +O8b7>O8k=AO8b4COcu#pp4!$krdY3(J:N-!J:RTLs+:6$s+16%qL\NqrIk!2s- +JcC<$JcC<$j8\KFqYg\$u@Fs0Vj6rj28qr_r\l!)rbmn5KNar_i_mqb[;ip/(chs&]/$!EW:n;>*fg;,U:hq,%#e!)WVkr_i\ll;IU^!`rE(rDrnt +qc0>$>'2=B\m':Jam^:BXEe:/+IW:&n)^:(?%9hr!AM +iSrkWj5f:_roX7Ds60FGs6BXMr9XFMrpKXOr:'[Tq""@SrUfpYrV$3aq=sparVH +JcC<$JcC<$jT"TGqYg$Lo.s'#M,>5hY(>5X*QK`-W)LA@kNXbQM& +m=tXrs+pN.pko!-qMbE5rf$c7s0Vm9\,Ef<\[oBM\HBFR\[qdPs1JBFrk&6ErkAKL_Y'&lPPp^P +Q'R`&QBd]"QC%00rgEeTqj[VUpqumFs2G#Xs2Y&Ys2k5^s2tPhc-=PZrQkMjp!3]bWN#cps/Z1$ +r2p"%s0)C*s0;U0rj2X3!O]62Zi@E4[K!]7[/d]6`r +jQ5M&k5XWEkl'cGlMp2Jm/HDNmeZDMnGVnPo)81Xo_S7ZpAOa^q#1$eqY9scr;6H]rdk*#s1nYb~> +JcC<$JcC<$jT"TGqYgrG7\@8sH +[f<`8[/I<5ZE\e)rd4Wlqg/9f!I/h[GkZL`H2r6hGQ<$gHN&9fH3AkRKS+sRL&cT!H22^^G5ug\ +G62r1Fo$4YF8o#:;,I0dr_NSjr_NVk;#GG0F8LapLPUccFnTtYFo?C`F`qs%GPu^]GPud`GPZRY +H2MsgNW+n7NW5"=NW+t9O8b7>O8k=AO8k=AOT:UDIKP(KIXhhV[5Ki8NYSro4(@jlQL(s6'FGrTX@Is6KULrpB[PqX=@OrUK[RrU]sZqXsg\rV-0` +rV?Egq"t!equ-!_JcC<$_#Jo~> +JcC<$JcC<$jT"TGqYg#%gg:f.-es%`Jfs%WPgpJ1]`oM,\JhV[5K +i8NYSro4(@jlQL(s6'FGrTX@Is6KULrpB[PqX=@OrUK[RrU]sZqXsg\rV-0`rV?Egq"t!equ-!_ +JcC<$_#Jo~> +JcC<$JcC<$jT"WHqu-EipA=darV?KnrM]Yhr:g-_p\"LWrU]pWrpg!Wr9s[Rs6]gPs6K^MrojLJ +kNDj,!TiDAirS/urnmh7hYu=3gtVh^!nj'4qO7;L!1<_Qq3^uEs/#^m#H"DtW2ZesX8T+"Xo>L' +Y6(r5ZMq07['mEN[C!=?ZNIM$G81>Q%b)=oMS)>l%\(>5h\)=oqo3=T2P)>5qh, +=o__%=9D^-X/c-!s+^3#qh>*)o7d=%Lktnapko!-qMbH6qi(N6rj;g9\$u@H!kGnRr4)p@\[fc=3hu;O7iSsjss5X1ArT41Ekihs/s6BXMqs=:KrpKUNr:'[Tq==LUrUfpYrq? +JcC<$JcC<$jT"WHqu-EipA=darV6W?b_1Y'L&C`Dp\aaZp&4O]oDA+Xnc&%Un,MhUmJcJPli68L +klU)3kPjTEjlHF$!TN);huV`lrnRV1g]#n,g%^0rJb4HmJ,OiqJ,b0$K`[!^K_U9)KnbA=L]3,- +M$AjG[^ENM[/RB6ZE^[=q0W0hr-JBg!-n?apNZ=Us*4Qho6LOlKS4u1r.Y9.H@#O8qKVm]rc\(prr2Tdts/c.#s/uC*rilF-s0;d6Ocbfip65N@ +qNLi>k*#V(s5!_3!8me6!TE&;j8\0?jo+L0cqu$BhrU9`:s+13ds*t~> +JcC<$JcC<$jT"WHqu-EipA=darV?J1!)rkrr:p3ar:]mXrUg'[qssaVrp]jSs6fpSrp9[Ns6BUJ +!pJh1roO7CjSn0?io0mp!T2c5h#ZnAs;c?Ol;u9Po +<<,qr;u]hq`g;H$Km;t*cc;uBPm;ZSg?r]^F&b;>=&h;tX&c;>sGo +<)ris!*B,"r`/hrrDs##=8Gtt;u]bj;ZK_l;uT_r;sdQ`prr2Tdts/c.#s/uC*rilF-s0;d6=BJ^/r`T;)r)io#r_EJhs%rVgr(m#] +r(lu\s5!_3!8me6!TE&;j8\0?jo+L0cqu$BhrU9`:s+13ds*t~> +JcC<$JcC<$jo=`Iqu-EipA=dar;$?l"fS>tW;-/cp\aa[p&+I\oDA+Xnc&%Un,MhUmJZDOlN$5K +km-G8kN:pgjlHF$!TN);huV`lrnRh7gY1B7f[u\mRfAlWReiEPRf8`NR.lsIV>d@nVPjEls/H(" +rN$"$rN6I1YctF=Za7'H[/RE3Z2h0/YQ:qiqiCi>NqJD3N;eh/N;SS6N:Vu)MuolQVZ*FkVZNm! +N;eb3M?&M2KE[!]KN_Vcr`]P2>$G06=o;G'>l@n*>QA"-=T_i4>$Lr.s'#D+r*&u#s&f;(s'#E' +rN#s&!*]>(q1\g&qh=`us+gW1rJC6*rJU6*rf-la"h(nL\@B*K])9)@]",A_rO`!?"22F3PP(+= +PQ$dLQ'Rc(R/E`6khV\=j!o`.uro4(@jlQL( +s6'FGr9=7Hrp0IJrU'ROq=":OrUK^SrU^![qXsj]rqH9arV?Egq>:*fqu-$`JcC<$_>f#~> +JcC<$JcC<$jo=`Iqu-EipA=dar:pWCcH_)rKn]rK$u?s,R20J,FcqIfP#uIfb(KJ,Xut +JcC?"JbOcpKD^?!KDgH(Pa1s,!1!PJs-qjIJ]r29Oms/Gprs/Z1$rN6+& +!3c@*!3uKbs-!/@s-3ADs-!;Bk*#V(rnRV3hu;O8iSrkrir\<'jo4EBkPscDl2U&Jlhg&ImJZJK +n,;bSnbMbSoDS=Xp&=[ap\O[`q>L0cqu$BhrUBf;s+13ds*t~> +JcC<$JcC<$jo=`Iqu-EipA=dar:pV9Df8NP<)iYfr:g-_q"=RWrU]pWrpg!Wr9s[Rs6]dOs6B[M +rTORNkND!ijlPS&irS/urnmh7hYu=9gtUQ:g"=qVr_rbpqG[Am!)rkps&&\ls&/nsr)Eer;,dHk +"]A8t;H$Nk<<#tu;ZB\p<<#r"[C!=?Zi@<2Z2Us-YN/UX;uTbn;uKVa;Zfop;H!Hlo2G`h2?#H4 +2$>fr4[)(/4oRVK4[(qj4?WL&!B`OD48h8H4Zkkh3]fGbqDnO9rB(9G3]]>a4?WUC"]e],=?&;= +2ZPc3;>3lh;,U:hq,$rcpeq)iohtZar_`o#<)lt":*fqu-$`JcC<$_>f#~> +JcC<$JcC<$k5XiJqu-Eip\XmbrV?Hfrr<"r!iW#qrqH?aq"=RWrU]mVrpg!Wr9s[Rs6]dOs6K^M +rosIH!9a@Ds5aFFj5].YiVqaDhqm2Fgt^Z7s0;X0rNH@,Y*&UC!KW9>NW4q=NJrhlNV&2+MZSiqMuJ\4Mti81 +VZ*FkVu;PPJcLB#JcgR0?!R>4$sZt>>Zt95>$>-6>?q,2rETA*#$P59>?b96r*')($X-Y9>Zt?8 +>$4s0=o);%>Q.h*XT#7&W`r\2qcWr&rE9/Tqh=d!rJ(B/pPJg*rJLZ7rJUN2s,-l9rf-i`!OfK: +\,a)=])9)@]",A_rO`!?s-!DGpQGK="I,1;QC%K9!13JJpmM,MqO@N&!6"TKq8<9PrPncVrlP/^ +rQ>;ec-FW6ci;AdcN'd?V>mFjVuEXpWVrjsX8f:"XTbl2YHY::ricI/ZEjG8!4;^4"1H:ka8O$W +`Vd[G`V[UQ_u7IL_$\uRh;7&Hi8ESQir8!MmeQ>MnGVnQo)A7Z +o_\=[pAXg_q#:*fqYC$dr;?N^rdk*#s2+ed~> +JcC<$JcC<$k5XiJqu-Eip\XmbrV?HfrltY"K7no3rqH?aq"=RWrU]mVrpg!Wr9s[Rs6]dOs6K^M +rosIH!9a@Ds5aFFj5].YiVqaDhqm2Fgt^Z,7KSB5V!elA` +reLK/rJCQ\s0;X0rNH@,Y'g1ps*Ofnr-JBg!-n3]s*4Ngqfqg[ms=nb"+u;^LAcAtAc?3E@q9([ +A7JR9;?0Sn:^0cm:f1+f;#X>e;#=&e:Amrg;#X5p:/+JX9hnIW:]=,dL]E5*:&@W_Fo?LZGPlXW +G5umbGPl^\H2i*hH2`-fN<5&uNrG%;NrP+%It.BFrdalq!.b$!qgng!rIP$# +qh"g"qL\Wts+LE:!1!,>rfmYOQ'R`$Q2Hs;Qi!0IR/j&^V>mFjVuEXpWVrjsX8f:"XTP`0YH[qe +!0[&>!0m>Drf[2Ak*#V($JaInhV[5Ki8NYSro=%>s5j7Bs6'FGr9=4Grp0IJrU'ROq=":OrUK^S +rq$*\qt9p]rqH9arqZNhq>:*fr;H*`JcC<$_Z,,~> +JcC<$JcC<$k5XiJqu-Eip\XmbrV?Hfrbqg6!`DrrrqH?aq"=RWrU]mVrpg!Wr9s[Rs6]dOs6K^M +rosIH!9a@Ds5aFFj5].YiVqaDhqm2Fgt^Z\f48h8H4Zkhg4$>Yer]($@3B@'us#9m9q`4U9s#C'= +r`',&='/N`3;b]82Z,H42ZHYO;#aDm;?0Sl;#!od;ZBVn;ZB\f;Ys>j;ZBc%<*!%"j;Z'JM<<#u!=8#\n +JcC<$JcC<$kPsrKqu-Eip\Xpcr;$9crr;qps/>niq"=UXrU]jUrpg!Wr9sXQs6]dOs6B[MrTOCI +kNDj,&EW!6j5].XiS`YOhVR)EgtVh^"PMGZf@Knis-itUqjRMPr0[8GrKdGLs.o[k"K/,pVPjEl +!ii<%riH.%riZ:)s0)X2ZEga?rilF+"0Sc.Oo1=@NrY4>NW+n9MuSb6NVJJ4NW"h5Mu&D2MtW)7 +V5C)dV5:&erdk6)>[:Y4>QA"-=o_e+=o__)>52>%>Qn>8>$5$5r*&u%rE9J3>$>'2='&L+r)Wr% +=]tW*s'#J+riH+""0,R0>5MJ&>5_V'=T2CqLAlu.M"cc)MYrA4N;AJ2N;eb7N;Bp^\,Nl;\c029 +\H'5=])]MCP5ga?P5UUEPQI,9QgpIL0c +qu$BirU9`:s+13fs*t~> +JcC<$JcC<$kPsrKqu-Eip\Xpcr;$9cs3:VgrIk3)rV$$ZrUg'[q==OTrp]jSrpKgRrTsRM!:'OI +!pJh1roOdRjQ,@]io/kSi8r0@;Jrg!GJnr0dJYrh]Xlr29Rns/Gsss/Z1$riQ!Y!0[)?!0m;Crf[2A +k*#\*s,[E>h;-rEhu;O8iSrkrj8\0?jo+?AkPj]Cl2KuIlh]uHmJcPLn,;bSnbVhUoDS=Yp&=[a +p\O[aq>L0cqu$BirU9`:s+13fs*t~> +JcC<$JcC<$kPsrKqu-Eip\Xpcr;$9crbqd5!`N&trV$$ZrUg'[q==OTrp]jSrpKgRrTsRM!:'OI +!pJh1roOdRjQ,@]io/kSi8f?62`Nhs;?'Mo;>a8c;>sJl;?'Po;tNu_;>sT#$=8l5#;Z9Sp;Z0Gm;YsDl;YsDLLI>.$Cs+Uc6 +L5(JmObB?!LW=>?kG2?2\+,?NON=ZMq3,>l@t+>l@n,=oMV->$5!4q-*f$"J3WRaN4A&qTAfZ!6G/2 +s.JqVpS.Y_qka4frMBOkrho4^rhfdobl#Zab5KHZb5]Z^b4EdVbl5lYc2c,gbl>lcaoKN^WWB0% +riH7)YHRr0!O8s0Zi@B4[JmW7\,Wu;\H9@S]DfJC]`>eG^]2+L_>_:V_o0L4`Q#p^s+14&s*t~> +JcC<$JcCo5k5P5Ur;?EgrqcWir:p$G-4r`B/'rE0)#rDs;9?sR#@>$GHFA,]s;@0pFPA7K1M<)ln@repf3 +!JlL0L&Zf-K7\aSJJ`lSDf]>tARoCaAn,:Z@q9+]AnPjnDfp3fG5l[eG'.tOrH/3aF)l=#F8p:[ +EW9tXDu=SSEW:(ZEVa_UEW:"VDu=MQDt7f=D?"MJD>eAMD?"MQD>nDQD>S5MDuFSBDuOYSD[16" +DJj<.DJo2er,2OQrb_[OrG2FI%qo]mBkM-n@U`bZB5)'p;Z0Mo;Yj>l;?0Sj;Z0Jl;?]uu<)\^5 +rf$\Os&8blrDjDl;>3lgKTqbuQN!0JQ3!>iD1MtW%oMuJY9 +MjX4)qNq8Lq3L$,rK[GKrKR;]!NW=$XTGZ/YPta,Z*OA8s0Md6rjMj9s1&'=!kQ"Urk/9E!5AHI +s1nZNrk\oX`5KX6`l?'ua?@Yfb0.uPc-=PZcd:%ddF-LneCE+#f@S[.g=k<:h;-rEhr*GOioB([ +jlY^gkih9qlKdg'mHs?1n*oi:rpg-^o^r.Us7QHerV6Bfs8)Wirqu`noDX=@JcFC&J,~> +JcC<$JcCo5k5P5Ur;?EgrqcWir:phqm3k<`W6"sGq<)Z^pr_id/'"b`c\[],W[^EKK +Za-j?Yck43nPfHcr'LTQ6:+%+r^-ZPr]qPl1,1F8/hS\21,1L>0f([E1c7*I5!(kh7S6?H8cD?^ +8cM +JcC<$JcCu7jo5,Tr;?BfrqcWir:pIra,e9@qK:_raQFI +@:E\S@:3PP?t>J3\[MCA+L/5VY,n\(X/r:`R#n)XEH-#>F)5T+D/aH4F*MqXKSK8W!/C-$!JZ=+ +LAuu-K`$E'JUi:LJcC?%JHC@OJ,+WmIfk+HI!ts@rHnKhr-A?(H$Xa[G'J4SF`MSIF`_\Hrb;[R +G'e^jJR2[]?2n72?2n10>Q7t+?2\+,?NOQ>ZMq3,>l@t+>l@n,=oMY*=TM]1q-*f$s2G,\aN4>% +qo\f-!M?%\U&Uk_U&(JbUSO^`V>I.gV>mFkVsgM_VuP!Abl#Zab5KHZb5]Z^b4EdXbg"E'c2c,g +bl>ldao]\`WW&n&X/rD)Xfeh1ricI/ZEjJ9!joACrjMj9!4`$=s1/3BrO`3F^:sT]!l2Xgrk\]R +`;[aU`WaE(aN;QHrl[%?c-FV\cd:(edaQ^qe^`7&f@\d1g=tE=h;7&Ii8N\Tj5]4^k2tjjl07Ku +lg4!*mf)Y[nF?&>o(2JFrq6 +JcC<$JcCu7jo5,Tr;?BfrqcWir:phqm2FMMd8gM?&S6MZ8P3L]E5.LAci*K_^6'Joc99K)L?$K`-N;KY+h+\[],W[^EKK +Za-j?Yck43XmgcC?!:H8=]bT*r)a)'=BAO)rDj#%=BAT'RcB4GC[@q9._B4u'uF8^7YFoZ[TG4p%\FE;JCrc8'[rc.sWs)7gSs)J'Zs)ImU +s)J'XrGVUOs)7IGp20eHpMKkHr+uFOrGD:HrbqgS!c;gmq/?1KrbqaQ$#ad%Df0H0D/O7cDu=MQ +DuO_UD?OlpCi!ncCB%rLC1h6qraH%>BPVI*E;if8;Z'Jn;?0Sj;Z0Jl;?]uu<)\^5rf$\Os&8bl +"]8)n;,C-g;Z9Pf;#ca[Q26gGQ2d0GLB*/-LB`QkM26tCL]*&-M>E,.MtW%nMuSb9R/iWJQhm'L +Qhcs,Qi33MQ2[!KW2]cr#HOr-Xf\b/YPta-Z*L\7ZN@MA[JmW7[fEr;\c95@]D]AD]tV5[^B23e +_>_:P_o2Pns2G5_aN2KFb5TR=bg"GYcd0tcdF-LneCE+#f@S[.g=k<:h;-rFi8ESRioB([jlY^g +kiq?slKdg'mI'uB#Oq9Ro()DDo`"O`pAamcq#C0iqYU0hr;?Ncrdk*#s4I@%~> +JcC<$JcCu7jo5,Tr;?BfrqcWir:pV9`@cd:'49g<`/Wi!)_fT!)`Yjq+prcrDEPjqb[>inkfHb +;,R9gqG.,e:]=2j:]F8g:B45d;#jGl:]F8j:]F2f:\R]a:]4,Y:]F5k:[1dU;%QQ":esnb;c6Li +<)?Lm;c6Tn8d@gV8kVc?5^ +JcC<$JcD#8k5P5Uqu$9erqcWir:pd:iU]7%jTqJ'NrLX%[!1a%Xs-itT#\]ZtM56rDW2KTm +(8Rh)\[f5Z[^NTNZa6sBYct=6Xf\[io9LDFG("abIqN5#@UWSL?t!DM?sd2I?t!GPAn>O`A,Kg8 +@4Ykq?t5;/\[SrP['[0GZ*LU;XK/A&WMc/IUU?GEO)f;\CM@^+EH$)HH@^eKLA6N(L@g6$LAlo* +L'!'^K`-N&JcC9!JcC?%Jc:/oJGt&uIK=hErI"NirHeBeq0Mmas*Xfms*=Zjr-86e!-nKg!dK!9 +rH\KkI//-fHN&/>l7n*>lIt-=oMY*=TM]1q-*f$s2G&ZrlG&[s2tA4 +qk!h[!204_rM'7as.BIfTV8(WUAq%eV>@(fV>mFlVs^DaVp3K1qof#^rQ4rZs3(;^o?.3Zc-?13 +rQY8cs3:SfrlY;arhfdqWW&muX/u<&s/l@*rilF-!4)U1s0Md6rjMj9!4`$=s186Brk&U6gqu-HkrUg)?s+14&s*t~> +JcC<$JcD#8k5P5Uqu$9erqcWir:pLH@0`3KD^B=K7\c0\[f5Z[^NTNZa6sBYct=6 +Xf\[Qo6q0U>$YHA@TQZ7=BAU+=B>E&!a&K(rDs>.='&F'='&F(<`])t"EKH[Mhq@fre:B*s+;2@ +JUr8uDfU5ZEcH86An>I]A7T7`BPVI*FT$=`G'.s)FoZ[TG5-4[F9$C\ErU1\ErL(YDuahRE;sqW +EXHf,EcH,>EcH)A)JDuOVRDZ"GKDZ4SRDZ=YT +DujlprbVXQp2BnIrGVUQ!cDjmrbW9aCM[d#BkV3nC1q$b@UN\U@UT16s&/hprDNVlr)3Jjr_i\n +s,6l8!)rbms&8_k"Ahrm:f70hr_`Dds-*MKqNh/HnV7+#rJC?+s,$Q/rJUB,l&,Y&R@0H8Qhm'L +Qhcs,Qi33NQ'D9G!N_=O_Z7XS`<"!!rl>,^b5TQobg"GYcd0tcdF-LneCE.Lf-K#%g=k<:h;-rFi8ESRj5]4^k2tji +kiq?slg4!*mI'H3nF5uIncJFTo`"Lbp@n=[q#C0hqY^6hr;HTdrdk*#s4I@%~> +JcC<$JcD#8k5P5Uqu$9erqcWir:pI`rDFJ3;c6Rm\[f5Z[^NTN +Za6sBYct=6Xf\[&o2>iE.P!&&/NEVo%mrWK6:+%*5X@\&5X.Lt55mbr5!M7s5<_7o4$?&+91hcI +8kMZH84Z6A84H$;7R\pm5<^qo852oS9hS=^:&dri:K:=#h;<1UT;>a8d:]4)j;,I6h!)WPi +s%r;as%r_mrD3Mj:Amug:'+3f;#X8j;#=&_;#jGl:B45i:]F2f:\R]a:]4,Y:ZkRO;&`>,:Jjqe +;,U4h;,gFl;H$Fa8kDWI9gh?55!Jd*s#ga5j:]=&i:/=[[;#[?nW2]cr!NW=$XoGO(YPtd+YlM*/Zi@B4[JmW7[fEr;\c98@]DfGE]tV5[ +^B)-drke]Q!6"lU!QN1Za8sE*rlYeqc-FV\cd:(edaQ^qe^j`O,hUf(g=tE=h;7&Ii8N\Uj5f=a +k3(pkl07L!m-O-,mdKW6nF?MK!qZ'Vrq-?dp\4X]s7uZjr;6HjrVcBfJcC<$f`-I~> +JcC<$JcD):k5P2Tr;??erqcWir:psqs/#dmrM9Ffs.]Od!2'1\rgbR0S"#k8R@'A.QBRe=UnjiaW2Q\o +WMZMg\$i`Q['R*EZ*:I9Y-"h-X/_HXQ48:dI=6HjB5"EKW23j-ra?7D?=.#I@:*JUA7]7]A,Kg9 +@4bqs?t5G3\[]&R['[0GZEg^a?3":/>QJ&6 +r*B8-!af>Br*BB/rj2W1r*9/*r*95*#[1A7>?b65>$Lf+s&oBA!6>)[s2k51qO[_Z!201^rhBCc +r1O(`r1X4eV#7(cVYm7jVZ*L_VZ3RmblGubbQ#``ans6\bPTHRb5fcbc2Q#ec2>leblGudb5nH: +rhfdqWW&n&X/rD)Xfeh1rilF-!4)U1s0Vg6rjDm;\@DOK!kQ"Urk& +JcC<$JcD):k5P2Tr;??erqcWir:p$&q1As)K7ec,FF-i9re(-%rdtim[^NTNZa6sB +Yct=6Xf\\*WdXPh!FAt/?3t%AlqGIGn:f1(dr)3MkpJCmS!1!JJrJ:$"s+p]3pk\s,regZ2s,-c5p583ps,?oE!1TR]E5d\ +^AbkJ^qp#es2,>b`Poj:a2l?Dai_fMbg$.4-I:&ddF-LneCE.%f@\d1g=tB;h;-rFi8ESRj5]4^ +k2tjjl07L!rp0[Qmf)YUnF?MK!qZ'Vrq6 +JcC<$JcD):k5P2Tr;??erqcWir:p*3&X,i5X,07r]pTP5sbK:)*pJO5!D1r5<_:r5X.Fr4?G\q91qlK +8P2VS8HVLR84`_L#t6[75!;A)7nleV9a"3c:/4jc;>F,h;<:^U;>sDe:]4)n;,C(d;,I0fr_W5a +r_WVlrDAhr=Su+n;Z9Mp;H$Nk;Z0Go;H-Wp;ts8h;>a5j +:B!rg:/CU\!Mu[mVZE`qri-4(XK8P+Y-+u-YlCs.ZMq31[/[Q5[KTR]E5d\^AbkJ +^qp#es2,>b`Poj:a2l?Dai_fMbg$.4-I:&ddF-LneCE.%f@\d1g=tB;h;-rFi8ESRj5]4^k2tjj +l07L!rp0[Qmf)YUnF?MK!qZ'Vrq6 +JcC<$JcD/=NS,SiVRJ`BVJsoc[< +qK`0hI/A9iHMr3aHMMpfI/J?fI.r!fI/JBmIf"WpJ/`i[H[0mYGB\4QE-?AKCM7HsCi+E[@53rE]>+r`]Y3=^#$6=]np4q-*f$s2P)ZqjmSTrh'4` +qP!n_s.T=_s.TCc!McIgV>6tgVe#L(B7 +Unji`VZ*IoW2]crs/Q.$riH7)YHRr0!jT&:rj)[5[C-"Bs0i!_:P +_o2Pn!QN1Za?I_gbKJ,Sc-FV\d*^7he'umtf%8O+g"P07gtgfChr*GOioB([jlY^gkih9qlKdg' +mI'E2n*ol;o()DDo`"O`pAamcq#C0iqYU0hr;HTcrdk*#s4RF&~> +JcC<$JcD/['R*EZ*:I9 +Y-"h-X/bf@%pWCI?=6i8JqAGuH?XLREr9#= +qf2XTqetk>pMKbErGDRPrb_XPrG2OPDJoAhqJH:Orbh[O!,h^QnS\AFr,21GrGMLNqJcFR")r0q +DuOSdChmg"BPM3p@q&qV@Uj%]@Vo$B;uKVn;>a>j;>jDk;ZMaTN;6?O;u0Ap;,C+e;#F5j;>3oe +PQ@&8reLH.nV?ams,$c5rJCH0s,6]1l&,S$R/NEQR.ZgBQiNKKQM-[EQLL7@Q3EPLUnsobrhfdq +WW&ptWrT7#XTGZ/YPta-Z*L\7ZN@MA[JmW7[fEr;\c95@]DfGE]tV5[^B)-drk\]R`;[^V`lJ)" +50:sjbKS5UcHab_dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^k2tjjkiq?slg4!*mdBQ4nF?&> +o(2JFrq6 +JcC<$JcD/F,h;<1UT;>sDe:\mo`;>sDb;>j>k +;>sAn:JO[a:]=)i:Jh!c!)WPg!)WVks&/em!)WJe!)EGfqb[&`r_W&Zk>:qNqbR\r:f1%f:K(1i +<)lmqr^mGf91_T@6T.(kpc\Ij;$'Wo;u9Jk;$'Zq<;ohk;Z0Jk:]X?er_3Dg +:\dieV#R7kVZ*IoW2]crs/Q.$riH7)YHRr0!jT&:rj)[5[C-"Bs0i!_:P_o2Pn!QN1Za?I_gbKJ,Sc-FV\d*^7he'umtf%8O+g"P07gtgfChr*GOioB([jlY^gkih9q +lKdg'mI'E2n*ol;o()DDo`"O`pAamcq#C0iqYU0hr;HTcrdk*#s4RF&~> +JcC<$JcD5>jSnuRqu$9erVHNhr:p^S=BJG!13PL*L`R8VPU/fVl6Sn +WMZMuZa-j?Yck43XfSS'Wi;9XQ61BpH[L0QB:c6)Vl$5ZR$O#!MM?\1H?j^HAS#C^@q#@cs*t2\ +?t!UF\HB@LZaB_<)mZ`RYcb(/X.YiM_h3u/FDu/6DfTo?Fa/LjK_pH)L4t?\LA6Q&LAcl4L51P= +LPLVlS".>l7n-?N4C4?iXR3?N7>2ZNFH<>[@;5rE]>+r`]Y3=^#$6=]np4q-*f$ +s2G&ZqjmSTrLa+_qk="`rh97_rh9:b!McIhV>[:hVs(#SblGucbQ#`_ans6\bPTHRb5fcbc2Z)e +c2Z)ebm;P:U8+N[V5:'gVZE`qri6"!!3H1%s/l@*rilF-!4)U1s0Md6rjMj9!4`$=!kQ"Urk&9F +^Abk]^qmk(_Sa:0`Poj;a2l?Db0.uPc2Q!7cd:(edaQ^qe^i@(f\,!4gYCW@hV[8LiSrnXjQ5Od +kNM0plKeH9#4:jIn*oi:rpg*]o_nFap@n=[q#C0iqYU0hr;HTcrdk*#s4RF&~> +JcC<$JcD5>jSnuRqu$9erVHNhr:pYAZa-j?Yck43 +XfSS'Wi:F@IMlBm?!^i>=*]CHI!U*^FE2>:BOtX]?!LQ8qcEf-$XmLTi>2K`Qp^ +rdtr;JUqrdHAuccG%PAr@q9.^BPM=%ErL1\FoQObF`_a)Fng.YFo$7bF`qqNG'E,]`6qf)IQ!-8$X")r7"E;FM?DYS)EDZ4MQDZ+GPD?+PQD#\>PDYn;JDZ=YSDZ+DPDZ"GC +DZ=YQDY\5NDuahSD?4ZnrGVRPrc.jT%W?6&Ci+$)C2.EqBkM-grF,k=ARo9L;uKVn;>X8j;>jDk +;ZMaTN:BdK;,C+e;#F5j;>3oePQ7$JL]*%uL\?Q'M>rJ4L]E;1MZ8V1MWp&qR/iWIQhm'LQhcs@ +Qi< +JcC<$JcD5>jSnuRqu$9erVHNhr:pjDm<<#nsZOO4F +Yct=6Xf\\*WiE$rpJW.`-nQu%3&Wue5sIIq4$,G^3&E?F0J=t/5l;?0Sh;Z0Jh;?0S];?B]l;"d]^ +;#4&e;"dcb;#aDl:]aEf:B"&g:'"-ep.kZbr_`\nr)*8cs%`JfrD<2`r_NVk;"7?F;"mic;#aB' +:esn`:Jjtf;,L4g;cHUnr^mAd9M%T?69b0-qEO^<5?(T_ +n5B?eTR +]E,^[rkB/__84"*_o'F3`Q#s=aN2KGbKJ,Srluh9d*^7he'umtf%8O+g"P07gtgfChr*GOioB([ +jlY^gkiq?sli-5TmI'H3nF5uIncA@SrUg6cp\4X]s7u]kqtpBjrVc?eJcC<$g&HR~> +JcC<$JcD;@jSnuRqu$6drqcWiqtU3cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA +irS/urnn+?hVI#CgtUQ:g&7cNVl$>fV>d:hUB70`T`1S\T)Y>^S=BJGs-WhSqj7SMRolP`Uo!se% +]$D8Yct=6XfSS'Wi;qppm)tJFa\XbI;!2oWMcYiSX>_.Nf/XEIsQ?_Fb#!kIt@TJ#(M5WJm_tsr +j`-?[Bm7>ZQ6?VZ*:C5XJhn[Y*Os5O)o>XDfTo?G'S^mKnY25qh5$)re:?+s+^`3LPLV>r.b0*s ++U]4L51P=L&Qc'K`QjZrdsutr.+]pr.+`qrdOfnq0W'drH\3bq0N-iHiA[:"a,$5FE;F#FpVr!BkqO2E +Gf)hrETA,!*oJ.ra,V3s'Ph6r*KB.!OH&1?2\%,?2Rt,>6nD8>$G05=^#&*>5q_-`lH,%rgikVr +h'1_qP!k^!29@arLs4brhBIhrh]RjqkjFkr29"\prrZZs2t;^qTAi]qo\QSs31Gds3CVgrQb>cs +.K[lUSFW\V5:'gV['0"WN)u!X/u<&s/l@*rilF-!4)U1s0Md6rjMj9!4`$=!kQ"Urk&9F^AbkJ^ +qp#e!Q2kT`@]*MaN2KGbKJ,Rc-FV\d*^7he'umtf%8O+g"P07h;-rFi8ESRj5]4^k2tjjrojUOl +g4!*mf)YUnF?MK!qZ'Vrq6 +JcC<$JcD;@jSnuRqu$6drqcWiqtU3cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA +irS/urnn.@hVI#CgtUQ:fo#ccreg`4reLQ0rJ(6(qh4ctrIXot!ciWarIb$$%tfJ>Z*:I9Y-"e+ +WiE%sVtb]`>Zk?=?XQr9Jpr)nH?XIODes-"@piVI>$59C@:dYG\@"d$"da^C2J!3FEDU&F9?Z-FERS)rcS6a"Eem2Fa!\*qK<6hG'8"OG'.qL +F`hg*FTQZ+F8BqVEW:"XDu4MOE<(%YEW:"XEVXP?DYe5EDZ=SQDZ+GPD?+PQD#%rED?=`oDYn;L +Ds;08DuXeTDuX_TDZF\SDu+GPEW'kVE>`e:Df0E1D/F')Bk_3ljPa.P1LPPhamt^[oqhb9-!f;ekp58*mq3_5Mp6YTB +!13MIpQtiEnWcHjkbdF-LneCE.%f@\d1g=tH>hV[8LiSrnX +jQ5OdkNMp0"mYF?m-X6?mfDqJrpg-^o^r.Us7QHerV6EgrqcQirVZWmo_sFAJcFF'J,~> +JcC<$JcD;@jSnuRqu$6drqcWiqtU3cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA +irS/urnn+?hVI#CgtUQ:g&4kI<<#nqcOr[emF1dODl4[(ti3]B#S2)?p>/hJV.1G\qcs"js:1c7-R3^$:<9*7aX +91o1T(J%%c7n6$,2*O/[77pa8j;?'Go:JOX_:]=)i:Jga\r_`YmrDhohYN_mSE%C +q,.)es%rbmr_F>,;,C%`:f((f;,U@m;c6Id8kMZI7RKQ<4o.D;56"X_#=8l>%=nPnf=oVUr=8>eq;u0Dk;$'Wo;u0Dj +;$'Zq<;ohl;Z'Dj:]aEf:&[lf:]+&hTa.TR]E,^[rkAKL_>_:P_o2Pn/]PiPaN;TJbKS2TcHab_dF$CkeC<%"f@S[. +g=k<;h;7&Ii8N\Uj5f=ak3(t-klpAU6gqu-HkrUg)? +s+14's*t~> +JcC<$JcDABjSnuRqY^-crqcWiqtU3cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp13^lK[Wuki_-kk2k[b +j5].Xrnmh7hYu=7gtUQ:g"?5"rh]UirhKLf!29=_qk!hY#+V0PR[KS2r0dGL#+J\cVPU/frMU1) +VQd8,Xf\\*WiE%sVtlVoIa>Xf87qURmm>Q][/\KRS:IGQW,=J:@HH$@[PXJ72hqVRa7H +rNuU2!4)U/'X+WuS!(FKLQdpDFE28=EccPOKS98Ws+L-#reCH.!JZC)LAlu*L&cr+K`$N(K`6T! +JbsurJ,FirJ,OipI//-fHMr-bHMMmgI!bj=!."Kerd"Hgqg&3frd4Qhr-8BjH[C)3HhVjWHi&3g +Hhr-fIK+coJ,OosJ,Fg5I!^-bH?jXXG][nIF*;>6CMIU#E,gkCr`oJ-s'5P/ra,V3s'Ph6r*KB. +!OH&1?2e+-?2In+>6nD8=^,'4=^,,+>5qb*`WF1_SbSfTTDkM\U&C_cT`Cb^U&UkdUB%+hV>[:j +VuN^kVt[(fVuERebQ,icao]c/b5KHZb5]Z^b4EgTbl>ofcMl)dcMu/hbl=@9U&UheU].%iV5F6i +!iW)tri-%#XK;E'!j8`1ricI/ZEjJ9#ILnH[^NZS\Gj$<]">Se]Y2"m^V@S"_8=(,`5KX6`lH0A +ai_fMbfn>WcHjkbdF-Lne^i@(f\,!4gYCW@hV[8LiSrnXjQ5OdkNM0plKdg'mHs?1n*ol;o()DD +o`"O`pAamdq#:*hqY^6hr;HTcrdk*#s4[L'~> +JcC<$JcDABjSnuRqY^-crqcWiqtU3cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp13^lK[Wuki_-kk2k[b +j5].Xrnmh7hYu=7gtUQ:g"?7[s,-f4s+p]1rJ(<*q1SWtq1AKp"aX!nK7nmSKFEI:YHG"0XK/A$ +WMl`jINDj">[CfH;BP:pb?sHo?>%(lK@JjU7AH,X5YJ,ODf0IjD#eJQDs2*7DuXeQ +DuOYRDu=SREVsbUEVsheDf0H0DJa3+C2%?qB5;&V@KU+N@rM?Er)*Air_`VlrDW`S",r4:;>a;l +;u';t;,C+e:f1+g;,[BjpJ;$XQ'P4$L]*%uL\ci%M>`81M=ui(MZA_1MuJ\7MZB.>R/iWJQhm'L +Qhcs@Qi36?QiE`YU&UheU].%iV5F6i!iW)tri-%#XK;E'!j8`1ricI/ZEjJ9#ILnH[^NZS\Gj$< +]">Se]Y2"m^V@S"_8=(,`5KX6`lH0Aai_fMbfn>WcHjkbdF-Lne^i@(f\,!4gYCW@hV[8LiSrnX +jQ5OdkNM0plKdg'mHs?1n*ol;o()DDo`"O`pAamdq#:*hqY^6hr;HTcrdk*#s4[L'~> +JcC<$JcDABjSnuRqY^-crqcWiqtU3cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp13^lK[Wuki_-kk2k[b +j5].Xrnmh7hYu=7gtUQ:g"?7%pf%5nq,RJqr)WbrrD`_qq,@Mi78QiZ;>jDm<")^0YHG"0XK/A$ +WMl`k;ZfuM-nG9K+u_AF5sIOs4?GV`3&ENK0etC6/1WG21GUaB1c$sF1Hdc_rC[,^r_*5^*_8dj +84PQk5!gto7nl`S:/=VY9i+S\<)?Fh;c?Rkr_NSlr_WVlqbdDkrDNMir)3Mkm8iooiLle!)r_lr_W_p;cEQkrDaN;TJbKS2TcHab_dF$CkeCE.%f@\d1g=tE=h;7&Ii8N\U +j5f=ak3(sml0@U$m-X3.n*fc9nac8BoCW%Ts7ZKerqQKgs8)ZjrVZWmoDX=@JcFI(J,~> +JcC<$JcDDCjo5&Rqu$3crqcThr:p!;G&q_CDfKlFH\-qHL&Zi"L%C&uL\c`*L&H]'L&Zf-K7\^RJH1<$ +JbsurJ,OorJ,XosIK+]iHi89iH2)^^HiJHnHiA?hGlE!dH3/A[:!.+Qg!.+Qi +"FPQCI!kj=pNlFXqL&3fqL&3hs*jips+(&tr.+cts*PK,H$FRXG'A%GF`qS;C1h9rF`MC!>lS%. +>lJ%.?N4C4?iXR3?N.52ZX!K8s'5J-qcs,)#[1A6>?Y04>?go,s&oBA!lnDDpn%GVrh0.^rM'%[ +rM'=e!MlRiVZ3RnW;3@dVZ!FmV=i%4bPfT`b5f]aans6\bPTHRbPTN^c2>lec2X@?T:hjNTq\ +JcC<$JcDDCjo5&Rqu$3crqcThr:p**ccU?=?o;?Y0=@U]7Fs'l7DAnG%CY3liPa.P1:]6+W/0M>)o)MuSb2MuAV7MZ9(=R/iWOQiEHPQhm'LQhcs@ +Qi36AQiEW^T:hjNTq\ +JcC<$JcDDCjo5&Rqu$3crqcThr:p1G^dB1GgsF2)@EX4[_t:91_`K9E%Kj84Q-? +7lO,h;>a>k;>sJk;>X8j;=.6];>a5h;#O2e;#4&h +;#a;k;#!ob;#aDm:BF9c:&Rle:B+/b:B=9hr)*Yp;Gp@grD3;cohPQaqbR2fmSE%Cpeh#es%rbm +r_NGgr_`Yk$W0\s;Gg4g;HHgk9E%Nc9LD3:r]^?Fs$$k;$'Wo;u9Jk +;$'Wo<;fbk;Z9Pj:]O;h:(0op:S+/MTV/!PU8+L_U]IaN;TJbKS5VcHjkbdF-LneCE.%f@\d1 +g=tE=h;@/KiSrnXjQ5OdkNM0plKeH9#4:jIn*oi:rpg*]o`"O`pAamcq#C0iqYU0hr;HTcrdk*# +s4[L'~> +JcC<$JcDDCk5P/Squ$3crVHNhr:p9cs7ZEas7H?_rpp*Z!:^!V#O_!Hm-O'(lMg#dki_*jjlPR` +j5T%Vi8EMLh;-lAgY1B7f[naSV?!IjV#R4iU&q$]T_tGZT)YA]S,o+Jr0dSPs-`_Ns-FIi=/Vpl +Vl-JkW2Q\sX/`2!W2HPjV#6MnG]\=\I:m2(XJi(nSsbt3P)G-MJ:%9?%sNSSIXlouIt*$&JV7H? +F8i]M\,Nc7Zi76EYcj"TNk1L3RZV]6Ec?#>Fa8RlK_L3#K_C,kLAlr1L4tA9re:E,rIk*&s+:<' +r.+j"rIP!!!eGlPrI=crrdXlqrd=copj;scs*=Bcq0W-h"+,??H2W!eH2)^bH2W'fH2i3gH2`-g +Hi8?iHh_pXHi&3gHhr-fIK+clIfP#uJ,=cqJc:3"Hjb7FH$FOWF`VYICi')c$#G!/Dd6OO>?kG4 +?2e11?iOL6?i47/Z2e//>l\.,?2In+>6nD8=^,'4=^,,,>5h\)`WF1_;[TDbG\U&C_[ +U&C\cU].%hV>R4_VtHneV=Vn2bPfT`b5f]]aoBN`bPTHRbP]T^c2>ifc(4j*#G7Z^TqS3TU].%o +V5C,fVl6Pnri6"!!3H1%s/l@*rilF-!4)U1#ILnH[^NZS\Gj#>]"@sS6+t"I^VI\%_SX4/`Poj; +aN2KGbKJ,ScHab_dF$CkeC<%"f@S^0g=tE=h;7&Ii8N\Uj5f=ak3(sml0@U$m-X6?mfDqJrpg-^ +o^r.U!quB_rV6Egs8)Wirqu`noDX=@JcFI(J,~> +JcC<$JcDDCk5P/Squ$3crVHNhr:p9cs7ZEas7H?_rpp*Z!:^!V#O_!Hm-O'(lMg#dki_*jjlPR` +j5T%Vi8EMLh;-lAgY1B7f[naSMYr>2L]E5.LAlo&K_pDrK)C3!J-1*oK7iuQ$*:2-Wi;qpVl$9f +IN2Tp?=.&@=&jj$IOI +M/RB\HtR,)AS5XlCiOOqFT$7\FSg.RFRsYPG5ZR`FT6L`F9$I_F96N*F8BqSEW9tXDu=SSE<'tT +EVseODte,LD>A)FD!NDWRP;Z9Vj;@-2s:f1%d;Gp@i +r_`Dd"I,1;:J^tGmt^drpPB*3M2@%EM2D"bqhtH4onrg-rL!DKs-W\Ms-WSJ!LT5LQM-[DQLpLD +Sc52cT:hjNTq\9VrhKdqVP^8hW2Q]pWrK+"XT#@%XoP[)YlCs.ZMq08['daN;TJbKS5VcHjkbdF-LneCE.%f@em3gYCW@hV[8LiSrnXjQ5OdkNM0p +lKdg'mI'uB!V#XYncJFTo`"Lbp@n=[q#C0iqYU0hr;HTcrdk*#s4[L'~> +JcC<$JcDDCk5P/Squ$3crVHNhr:p9cs7ZEas7H?_rpp*Z!:^!V#O_!Hm-O'(lMg#dki_*jjlPR` +j5T%Vi8EMLh;-lAgY1B7f[naO<;fet<)r`p!*/tur)Nbrr)E_rr)FjF8kM`Lr^dhq +7n-$-0g.`V84QBM:JO_]:/=__<;oeq;>sAl;>sGn;>O)h;>X8j;>jDk;>X8j;=.6];>j;h;#O2d +;#4#k:esk`q,-ub##S2m:JOVYr_NJfs%rGc!DlYh;?9Wkr_NDdm8*^XmSE%Cq,.)es%rho:J^ja +r)*Jj$rTku;H-Lktr=TV],=8c7j=oVV(=8Gqt;ta2j;u'>j;?'Pn;>sJl;$'Wo +<;ohm;ZB\q;?9WkqbR,bs%`Wcrgj@eTV/!PU8"F^U^*`nVPg>jW2]crs/Q.$riQ4'!3cC+s02R0 +rj)j:[C*HO\$rmH\H0:Rrk(P1^;%Fu_84"*_o0O5`lH0Aai_fMbg"GYcd:(edaQ^qe^i@(g"P07 +gtgfChr*GOioB([jlY^gkiq?slg4!*mf)YUnF?MK!qZ'Vrq-?dp\4X]s7u]kqtpBjrVc?eJcC<$ +gAc[~> +JcC<$JcDJEk5P/SqY^*brqcThr:p9cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-'BS<8 +j5T%Vi8EMLh;-lAgY1B7f`'J'VPX3drhBUjTqS-PrL`nWs.01["IkjKR@4&ArgEVMs-NbQ"]p8P +Vl$BiW!KE&W2HPjV50CUQ54jiI=-EjB4md7W2?5YR$EtrM2$Y2H2`$uJUi6$I=H`pIY33&?smLD +\H04Jrj;^3'XG*NYDU2f^4qZ@F`__GEH65KIY7WRs+L0$s+L*"re:E,pP/[&#)7hbKnb;8r.P!% +!eZ)Vr.4m"rdjutrI=fsrI=fqrI"ZnrHeNlrHnKh!."?cpj<$g"+,??H2`'fH1uXbGl`5:rd"Wk +G^0%0rd+TkqgA?h)3s'>V1s'Pe6!+5Y1rNZE.pKdZ$r`]Y3=]ns4>$5'6qHEo%#$Amca&lDEr13kZrh'.^ +rLs.`p7_M\s.fRhs/#XjoV_AZr6+lZ!6b;_s2tDbqT8]YrQ4lXq9/][r6>/b!h5^Nrgj@eTV/!P +U8"F^U]RBiVZ*IpW2ZcqWWB0%riQ4'!3cC+s02R0rj)X4[JmTB\%&rY\[oDb]Y(qlrkC_6_8=(, +`5T^8a2l?Db0.uPc-FV\d*^7he'uq!f@S[.g=k<:h;7&Ii8N\Uj5f=ak3(sml0@U$m-X6/n*fc9 +rpg-^o^r.Us7QHerV6EgrqcQirqu`noDX=@JcFI(J,~> +JcC<$JcDJEk5P/SqY^*brqcThr:p9cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-'BS<8 +j5T%Vi8EMLh;-lAgY1B7f`'M&MYr>2L]rQgL51M%WN!"omLkkt`re(r$ +S9Tm/G(=4S5HD=)3@D>\5ID>J,RDf0H0Ci')frGUqj;Z9Pl;Z0N!Mi +JcC<$JcDJEk5P/SqY^*brqcThr:p9cs7ZEas7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-'BS<8 +j5T%Vi8EMLh;-lAgY1B7f`'M#<;fhs<<#tqjB";cKcrW2HPj +V5.)i<@KII.kE8(2`*]a51,CgF1GgpE4ZYc&r_"5'91qlK8OuBB +82X4-5=J+89heDX;,0k\;,U7gr)3Plr_N\o;GpBg:]OAl;?Bcp;Z0Jl;Z0Jj;Z'D[;?0Pl:]4,g +:\moa;$0Wj:Jgmbq+q8m:esk^9ht[`r_'55[Y>56"X_a5P7;@5m9VB5s[b#r'16J +rBCTR5sRY6<`VIM5lOa[;uKYqsJl +;#jMn;ts8j;u]_r;,I-crD*Ag!h5^Nrgj@eTV/!PU8"F^U]RBiVZ*IpW2ZcqWWB0%riQ4'!3cC+ +s02R0rj)X4[JmTB\%&rY\[oDb]Y(qlrkC_6_8=(,`5T^8a2l?Db0.uPc-FV\d*^7he'uq!f@S[. +g=k<:h;7&Ii8N\Uj5f=ak3(sml0@U$m-X6/n*fc9rpg-^o^r.Us7QHerV6EgrqcQirqu`noDX=@ +JcFI(J,~> +JcC<$JcDPGk5P/SqY^*brVHKgr:p9cs7ZEas7H?_rpp*Zs7$'Ws6]mSrp0jTlK[Wuki_s-)!0i= +j5T(Wi8EMLh;-lAgY1B7f[na+etr>@rM0@crh0:`pn%MVs-s(YrgEhTrL!VQo9]M[rMKUn25dCP +W2HPiUnjcOQ@!h%H[^ETB4\'@VP0WMQB[DeKn=c"H$FL_It)utIt2uuJV/Pa?t6VD\H');[/[HH +ZEpj?X-]uSM4A^1FE2AAFa8CfKD^H&K_U9$K_L3#LAlo%LB!&/L&m!]rIt0&rIk?,K7\^RJc13" +Jc1,sJ,b&uJ,OipI/nZnHN8HlHi86jH22d\HiJHsH[:!`G^045p3Q[_s*=`lG^0%0r-A?ir-\Eh +pj2LXqL&6gqL&6irdONiq1&HrrIFlu*.i`hH[C'`H$FOUE,]Z2ChdU#Cj0o=>?b?;?![G9s'Pe6 +!+5Y1rNZE.pg*`$r`]Y3=]ns4>$5'6qHEo%#$Ajba&lDErLNt[s.B4^rh94`qk=%_rh9=crM9Fh +r20+apSRf1q98l^r6#&_!6Y/[rQ>)\q9&NVr65)`rltM4rgNqYSc52cT:hjNTq\9VrhTRj!2fan +!iW)tri-%#XK;E'!NrX*YlCs.ZMq02['fnA!OoT<\Nd[;]Y(ql^;%Fu_8=(,`5T^8a2l?Db0.uP +c-FV\d*^:jeC<%"f@S[.g=tE=h;7&Ii8N\UjQ5OdkNM0plKeH9$gmBNn*ol;o()DDo`"O`pAamd +q#C0hqY^6ir;?Ncrdk*#s4[L'~> +JcC<$JcDPGk5P/SqY^*brVHKgr:p9cs7ZEas7H?_rpp*Zs7$'Ws6]mSrp0jTlK[Wuki_s-)!0i= +j5T(Wi8EMLh;-lAgY1B7f[na+er'E_reLZ3L51Q`LAuu(K_^8pK)L8qJ36Y\KS4u2K7noWW2HPi +Unjc7IU62_?!gu>=&sg!H[0jYEH#`.ARf.S>[(B@@:sJn;ts6!;,C(d:f1+g;,U:h;>3lj +Pa.M0:JgnCreUH,rJ:H.s+pB*reUN0r/1<.r/CB.qO%)H!1Vf]tV4q +^VI\&_Sa=2`Q#s>aN;TJbKS5VcHjkbdaQ^qe^i@(f\,!5gtgfChr*GOioB+]k2tjjl07L!rp1$[ +mdKW6naZ2@oCMVRp&Facp\ssfq>U6gqu6NkrUg)?s+14(s*t~> +JcC<$JcDPGk5P/SqY^*brVHKgr:p9cs7ZEas7H?_rpp*Zs7$'Ws6]mSrp0jTlK[Wuki_s-(Zj`< +j5T(Wi8EMLh;-lAgY1B7f[na+f)8SHjDl;>a>i;=7tr=o2=h=oVS(=8Z+t;ta/j;ts8i;?'Pn;>sJl +;#jMn;ts8j;u]_r;,I-crD!?]rgNqYSc52cT:hjNTq\9VrhTRj!2fan!iW)tri-%#XK;E'!NrX* +YlCs.ZMq02['fnA!OoT<\Nd[;]Y(ql^;%Fu_8=(,`5T^8a2l?Db0.uPc-FV\d*^:jeC<%"f@S[. +g=tE=h;7&Ii8N\UjQ5OdkNM0plKeH9$gmBNn*ol;o()DDo`"O`pAamdq#C0hqY^6ir;?Ncrdk*# +s4[L'~> +JcC<$JcDSHkPk8TqY^'arVHKgr:p9cs7ZEas7H?_rUL$[nF6GG&FSrQm-O'(lKRQski_*jjlHF$ +"leM!i85[RfStGrg3bRR$mH2!36$q1oI:M +W2HMhUnjc[Q?I\(H[TR?AZDZ*U7[j?Q&UWSKReAoG]n=^Jq&9$IXcs#KS+td@@dD.!4Vm5rj!,V +MiG!.NMCW;EH#r?G^G$rK_gE$K_U6$K_L3#LAlo%LB!#3L4t>7K`6]'K`-W)KE-Z&Jc(-"Jc1,s +IfP#tJ,XopI/nZoHiAElHh;XYHiJHrH[9s_GlE!]HMr-hH3/A:GklX_H2r[:Y7?N4C4?iXR3?N%/0 +>khV$>lIq5>$5!4>$>'5>P_P'=ThjGa2_<]=8nciTDP;\U&:Y`U&:S`U&UheU\pqeV>R4fVt$Y[ +bPBB^bPfT_b5f]]ao0B\ana*SbPfZ_c2Z)hR/i]TRfT%Mrgj1`TV2:X#GRugUnji`VZ*LnVuWgr +WWK6&XT#=&Y-7i/s03'>Za7$G[C3NQ\%&uZ]"@sS5/"\F^VI\&_Sa=2`Q#s>aN;TJbKS5Vcd:(e +daQ^qe^rF*g"P07gtgiEi8ESRj5]4^k2tjjl07L!m-O--rpKmWnc&([oCW%Ts7ZKerqQKgs8)Zj +rVZWmo_sFAJcFI(J,~> +JcC<$JcDSHkPk8TqY^'arVHKgr:p9cs7ZEas7H?_rUL$[nF6GG&FSrQm-O'(lKRQski_*jjlHF$ +"leM!i8o@$O=&j`sH[0gVEH,c-ARo4U>[(B:@UikVraQ=I@q9._ReCi+-4qfMj\s)dpT!H`J[FT6L_FSL"VG5cXXFT-@YErL%[E,fmgE;sqRE;FMKDZ=PTDJa7h +DYS)8D?+POD#8)ED?+PQD#\>PDZ4S=DX_TCDZ4PXE,T]7EH1nqs)IjT!-A!WrG`$\DfBT4DJoGg% +;]NbA7B(Y@;9=_:f1*g;Z9Pl;Z0MoMuJ\?:f1(f;H$Nl;?0Sn;@HE!:f1%d;Gp@i;GgT.rilF-%^NFI['[6L[^W`U\[f;`rk(G.^ +;%Fu_8=(,`5T^8a2l?Db0.uPc-FY^dF$CkeC<%#f@\d1g=tE=hV[8LiSrnXjQ5OdkNM0plKdg'm +I'uB!V#XYncA@Srq6 +JcC<$JcDSHkPk8TqY^'arVHKgr:p9cs7ZEas7H?_rUL$[nF6GG&FSrQm-O'(lKRQski_*jjlHF$ +"leM!i8qt<;]\o<:s2i;?0Sm;C\TA +V50o^U/`Wn/1W>42Dm]`5!:th3B/rS1G^a>0.nh-1,CaB1c%!G2#]?:4$6&.91qnV9E.T`8.A'N +5!;+f7nQNN:esh_r_W\p;Z'Jh;?Kcm:f73ir_`Yks&&bns&8knrDNSkr)3Dhn5B9`!`2Zgqb[5e +qb[,d!)WYjqbd&`s%`\k9ht[`r_4oeU^hs&]8&rDrhpp/D#jqGI>m;Z9Pn +;Z9Pm;Z0Gm;Z9Vj;Z9Vp;?9WkpeUpX!1NnV!M#_[ScYOWT`1ViU8+KZUnsobrhodp!3,st!irE( +riH4(YPtd+Yn"(GZa@*I[^NZS\@K/]]DfH,]tV7r^qmn)_o0O5`lH0Aai_fMbg"GZd*^7he'umt +f@S[.g=k<:h;7&Ii8N\Uj5f=ak3(sml0@U$m-X6?mfDqJrpg*]o`"O`pAamdq#:*hqY^6hr;HTd +rdk*#s4[L'~> +JcC<$JcDYJkPk5SqY^'arVHKgqtU3cs7ZB`s7?<_rUL$[nF6GG)=HnZm-O'(lKRQski_*jjlGL_ +j5T%Ui82;(\[]&Trj;^2 +&%$J[QEGt2Q?@=kEHHGRJbt,tL&?W"K`Hf$L&Qi*L%pB(LPCN^K`6])KE6d[rIt9)!/(6$qh"ct +!.arr!.b&urI4Zm!.=cmrd=]lom6=Ys*Xims*4ZjH$T(/r-8[:Y7?N4C4@/F:/Z2e/)?27b*>6nD8 +=^,'5=^,,,>5q_5=N/>$=BAU+SXl@Eqk3n]rM'7aqk*q_rhBFf!2TLgqkj:hntu0)q98l^rQ>/` +!6Y,ZrQ>)\q9&KUrQP2a$C@-IR@9S6S"-">rgj1`TV2:X!huHbrhKRkVZ*LnVuWgrWWK6&XT#=& +Y-7i/$aI"CZa7$H[C3NQ\Gj$)]">Vf]tV7r^qmn)_o0O5`lH0Aai_fMc-FV\d*^7he'uq!f@S[. +g=tE=h;7&IiSrnXjQ5OdkNM0plKdg'mI'uB!V#XYncJFTo`"Lbp@n=[q#C0iqY^6hr;HTdrdk*# +s4[L'~> +JcC<$JcDYJkPk5SqY^'arVHKgqtU3cs7ZB`s7?<_rUL$[nF6GG)=HnZm-O'(lKRQski_*jjlGL_ +j5T%Ui8?bTH@:E^F@g?OSAS+tCCQ&1NreUN-&qj\DFb+IYI:m/'AnPst +E--2CqK2a[s)dpT!d&R-qfMg[rH.gWr,r'_olU1Src/'[EcV/!!cW.!rbqjUr,;XUrbqsXE,fmn +E;FMKDZ"AMDYS)8D?+PPD#/#DD?=ZkD#S;ODs2*.Du=MMDuObTE;jkJErC"WEXm)-Df0E/Ci!m$ +AnPXbA,]p?Ht6\`;>jDl;>jDk;ZMaTNsH%;,C(d:f1+g;,U:h;>3lkPa.M0 +:JamdL]*&+L]3,.LB*/*M>W2-M>N2-Mu/J/Mu&eBQ^F09R/iWPQirgj1`TV2:X!huHbrhKRkVZ*LnVuWgrWWK6&XT#=&Y-7i/$aI"CZa7$H[C3NQ\Gj$)]">Vf +]tV7r^qmn)_o0O5`lH0Aai_fMc-FV\d*^7he'uq!f@S[.g=tE=h;7&IiSrnXjQ5OdkNM0plKdg' +mI'uB!V#XYncJFTo`"Lbp@n=[q#C0iqY^6hr;HTdrdk*#s4[L'~> +JcC<$JcDYJkPk5SqY^'arVHKgqtU3cs7ZB`s7?<_rUL$[nF6GG)=HnZm-O'(lKRQski_*jjlGL_ +j5T%Ui8]hrDiht"]\N%^,5!DG,;,C"` +:esqa;u9Jk;u'>k;#sKjr_i\ls%i\mr_i_o!)ien"&`&r;Z'Dk;Yj8^;?fur;Gg:f:\mod:]!ud +;$'Wm;#X5j;#F2a;#a>j:B"&g:'+3f;#3ue:]OAg;?0Sm:\mi_:]4&b:]F8Y:ZbLN;>j>k;>sA_ +;#aDk;#aAm;Z9K";,gFj;,U:k<(p$b8d%mU6pAeh;ufkm;Z0Jm;Z9Pm;Z0Gm +;Z9Vj;ZB\p;?9WkqG.HbR$a;1R[]e:S=TYN!hZ-Yrh0CfUSIga!Mu[mVuN[qWW&n!X/rE%XT>T. +ricd8ZEggC['d^ +JcC<$JcD\KkPk8TqY^'ar;-EgqY:*brq?<`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-(?OW; +j5T%Ui85[Rf]%HRJrQKR/NBIQk>[NQDpdZ +Vl-JkUS=HUTV%firb!=OV5'WOQ^!YmLkU>+G^4OWJU`/uIt*!!Jq8K)@:=T_])B#O['R'EGF"i< +LR`O2F`_\JH[g[&L5#MXrIt-%nq@."Kn]M\rIss"s+UK+re:?)!JQ4+L&Q`*K)L8rK)^B%JG4Ql +If+TuI!^3fI!pDAHhMdYHiJHnHMi'\HMVpdGklX`H2rlJ%/?N"7.?Mq,(?27b*>6\86=^,'5=oMY&>5q_- +=N/>$r`B;)=Iu.Wr1O"^rhB:`rLa.ar1X1eq5+"dr29Rlqka.dp<39Us3(A`s2tDbqT8]Yr5ncW +q9/][rQPS5Q^=),R@0NCRfT%Mrgs.^!20=bs.TLgrhKUlVPa?j!N^ +JcC<$JcD\KkPk8TqY^'ar;-EgqY:*brq?<`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-(?OW; +j5T%Ui8?PG7@K0dCA7K.ZA7S\?AW-PH!/^]2re;,?A9<0XEI;G4AnPdkDfKi= +F`_\GqK)^[rcIgS!-J3_s)\JD>.oQD/=$*D/O91k\fm.rGMLN!cW.!r,DXTnoF_Lqf3EmE,TZ4Df'?, +C2%Bl@U`bS@XM]q;>jDl;>jDk;[JAANJrfn;,U:jrDNVlr_a)#:f("c:f:1g;H!KkpeV*XQ'G-@ +r_NTMr.t6*reUT0reUB,r.t6,qhjd!q3_2K!1T.ricF.ZMq1!['d?N\$rlX\[oDc]Y2%o +^VI\&_Sa=2`Q#s>aN;TJbg"GYcd:(fe'umtf%8R-g=k<:h;7&Ii8N\Uj5oFckNM0plKeH9"mtaH +n*olHncJFTo`"Lbp@n=[q#C0iqYU0hr;HTdrdk*#s4[L'~> +JcC<$JcD\KkPk8TqY^'ar;-EgqY:*brq?<`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-(?OW; +j5T%Ui8f +qb[2f##\;p:JXe`r)*/as%`\j:/:dar_A +JcC<$JcDbMkl1AUq>Bp_rVHKgqtU0brq?<`s7H?_rpp*Z!:^!Vs6]mSrp0jTlK[Wuki_s-"m+h* +j5T%si!nT#h;-l@g=k64f@SU(rmV"uUS@[[rh04^qk!YTs.'+X!h#FCrg3MLr0R8Is-NYL!1!M\ +.&`i4T:VXFS7SUqU7Rg@QBR8_KReDqH?aXaJUi6!J:<$#JqJed@=%m`!4Mm7(UUNSZ@A:RQ&D8X +G'.nJG^b:!L51MqJ,Fcn +I0"_Brd4`pI/\KdHM)UcI!bd:o6U:Zrcn6ar-A?irI"QjpNl@VqgAlS"0>$5#-=p%o2>?gu. +s&fG+`Q-$r=9+ukT`1Y`UALYaT`(SaUAptgV"pkaVYm@lVYd4fVZ+a=bl#Z_aoKW]bl>lbb5]Wb +b506Yb5KHWb5'6Ybl>rePl[2;rg3bTR[X5F#Fq?USt;RHT`1YbU&^tfU]RBiVZ*IoW2]cr&?Dn6 +Xf\b/YHY79Z*L^B['fnA::IaD\[oDc]Y2%o^VI\&_Sa=2`Q#s>ai_fMbg"GZd*^7he'uq!f@S[/ +g=tE=h;7)JiSrnXjQ5OdkNM0plKdg'mI'H3nF?&>o(2JFrq6 +JcC<$JcDbMkl1AUq>Bp_rVHKgqtU0brq?<`s7H?_rpp*Z!:^!Vs6]mSrp0jTlK[Wuki_s-"m+h* +j5T%si!nT#h;-l@g=k64f@SU(rmV&!M2@&eL]3&,L&Qc*K)gT%KD:&oJb=QiIfOrsK`?ZATqJ$L +St2BNI=-<`FE;D=C1^sc?sR#A>Q/+3@K'a@ARf7`jDm:^9io;,U:h;H!KkpeV*XQ'G-@ +r_NSirJ:?+qhY0,!/gc4qhY0,qMO^!rg3\Rr0[GL!1[SF
    +JcC<$JcDbMkl1AUq>Bp_rVHKgqtU0brq?<`s7H?_rpp*Z!:^!Vs6]mSrp0jTlK[Wuki_s-"m+h* +j5T%si!nT#h;-l@g=k64f@SU(rmV"usJl;u0Dk;ts8j;>O2j;$Bir;c6Omr_ibn!)iepr)*GkqGHrarDe>s;,C4n9`@Zf8kVfF7/]@M5kmMCe;>sJl +;#jMn;uT\p;>jDm;u]_s;,C*f:]?U[QC%T +JcC<$JcDeNkl1AUq>Bp_rVHKgqtU0brq?<`s7H?_rUL$[nF6GG-1:0fm-O'(lKRQskND!ijlGI^ +io8qTi8t8R/WHPQiNQQR/<6KR/WHMQMd!e +VPg>jSt;LCS"#k7T:;46PE(HQJUVrjG]e.ZrI,$%IY*3)Jmi(urON!qJ,Fcn +IJnQnI/nZoHhVjYHNAM?rcnKgqg&6fq0MsarHS-`r-A?ird=WjpNlCWqgA7"J9=^#!5 +=^#$6qca#&$!>3ea&lGH=BS`'T_b>^T_G/YU&q*cV"pkbVYd7kVY[.fVYA:5b5]Z]bQ,i^b506Y +b5KHWb5'6YbQ?%QPl?pKQC%TXcd:(fe'umtf%8R-g=k?< +h;7&Ii8WeWjQ5OdkNM0plKdg'mI'H3nF5u=o(2JFrq6 +JcC<$JcDeNkl1AUq>Bp_rVHKgqtU0brq?<`s7H?_rUL$[nF6GG-1:0fm-O'(lKRQskND!ijlGI^ +io8qTi87uKD>.oJD>\5JD>.oLD/=%fD?"PQE,kborc.XP!-/!YrGh[Ss)\0[$#jg# +D/O6.Chm\_@fTs:@KC"LpJUrg$&jk'N/UV2;GpHl;Z0Jl;ZBPu;,C+f;Gg=ir_`Ge"I,1::J^sd +!)EKKqhP0,r/(E1re^Q/qhb0,qhkH5oo&R3rg3YPqO%>Nr0RDMr0RDKrg3SLrKmGJqj78IrKdPK +Pl?pKQC%TXcd:(fe'umtf%8R-g=k? +JcC<$JcDeNkl1AUq>Bp_rVHKgqtU0brq?<`s7H?_rUL$[nF6GG-1:0fm-O'(lKRQskND!ijlGI^ +io8qTi8V,K#t[ZY/hfCQ2+C@?:BXKh;,gEl;Z'Jk +;?Tip;H$Nh;?0Si;ZBSt;H$Ll;cEZn"]8/q;c?Tk;#jMi;>*od;#jMm;>j>g +;>*ff:JO[`:]4#h:JgsbqbR8iqbmGk!)WViqbHr_r_E;cs%r,Zk"tkNlVIX[;GmEi!)`YlrDe;>sJl;?'Po;ZK_o;>jDm +;u]_r;,I3e!L&cIPl[2;rg<_R!1NnV!h>gPrgj@eTV/!PU8"F^V#R7kVZ*IoW2]cr$`gA1Xf\b0 +YHY79ZMq1-['d?N\%&uZ]">Vf]tV7r^qmn)_o0O5a2l?Db0.uQcHab_dF-LneCE.%f\,!4gtgfC +hr*GPj5]4^k2tjjl07L!m-O--n*fc8nac8BoCW%Ts7QHerV6Egs8)Wirqu`noDX=@JcFL)J,~> +JcC<$JcDhOkl1AUqY^$`r;-BfqtU0brq?<`s7H?_rUL$[nF6GG#O_!Hm-O'(lMg#Oki_*jjlHF$ +(ZOE3i8Mrg3JI +rKSe&R]!'\Vk'?IS!ob4R$DALkphAL4t?ZK`?])KE-`(K_^<%K_pK"LAci#LAci'K`?`/KS>,5K`6W&Jbt&u +JH15qJ,=ZqI=2$Bs*Xcn!.=cmpj2LX!.+Thr-JBgq0N!br-8$_rHeKjrd=Wjpj2IWqgA$G5.=q=b<=N8A$=BJ^.=BD/fT:l.V"/)?\T_Y;YU&q*cV"pkaVZ*LmVY[.f +V?"j7bPoZabPTK`bP96Vao0B\ammLRbPfZbP5g^GPl?pQQC!r*R$jA2rgWqX!1j+\!hZ-Yrh0@e +U].(hV#[ClVZE`qri-""XT#=&Y-7i/9!P\.Za@-K[^WcW\[oDc]Y2%o^VI\&_Sa=2`lH0Aai_fN +c-FV]dF$CkeCE.%f@em3gYCWAhr*GOioB+]k2tjjl07L!m-O--rpKmWnc&([oCW%Ts7ZKerqQNh +rqcQirqu`noDX=@JcFL)J,~> +JcC<$JcDhOkl1AUqY^$`r;-BfqtU0brq?<`s7H?_rUL$[nF6GG#O_!Hm-O'(lMg#Oki_*jjlHF$ +(ujN4i87aVr.b3)!ec8]re19'pk&6komlmgrI+cjE;kM*K:SO% +S!ob4Qu?q[BP(d`?%7J>s'l"aG_U*aIVSjq"_r!sF*;g- +GQ2gfF`_a)F8p@^F8L(QEr^=TFo?FRFoHL_F8g7aF*)MFF8g4VEVj_TDu"AODZk$!EH#jnE;FML +DZ"AODZ+DPD#/#EDZ=SJDZ=SQD#J5EDZ=SRD#\>RDJsIWDXhZCDZ"DSE,fmsE;OYLErU.YEr9qS +EWU<&ErC(ZDuOV`D/=!'An5F]@UikVARkL5rDO#]NK&mU:f1+g;uKVm;>sJn;#X>l;ZBSo;Z9Pg +;#cabPtt1P:esiBq1ns*re^Q1re^Q/r/(9-qMYB4p58p=pR(rHs-W\O!1aN;TJbg"GYd*^7he'uq!f@S^0g=tE= +hV[8LiSrnYjlY^gkiq?slg4!*mf)YUnF?MK!V>s_p&Facp\ssfq>U6gqu6NlrU^#>s+14)s*t~> +JcC<$JcDhOkl1AUqY^$`r;-BfqtU0brq?<`s7H?_rUL$[nF6GG#O_!Hm-O'(lMg#Oki_*jjlHF$ +)rfi7i8k#%S"#k7R$]fm3&WTK0eb74/M&S21GUaB2D[0I1Gq6Y8GYsl8OuB01-[rk8P`,W:Jabb;,L0f +;Z0Pl;ZBVo;?0Yd;ZB\o;YsDk;Z9Sp;Ys;k;Ya2`;YX,f:]O;i;#X8f;#X;q:f:1g:f-sbp.tfd +:/:a`rD*2bqbR8iqbmGkrD38bqG7)cq+q#emn`%Aq,.,fs&&;_#>nAs;,C%b;>jDg;?'Gn;,I3h +&5uS/9h\/Q8kDWD6pEn$5X5'.r)Ne_r]g6Es$$lW6:*t(6:*t(5X.L35QF+J56=)95Q4X_62j.L +5lapa5h\#=Sc1s=SQ#!<:j,h<<#ts;ufkl;Ya2h;Z0Jm;ZBYq;Z9Pk;ZB\q;@$,r +:J[.:PEV71PmT.rif#" +ZEpmE[C3NQ\@K/]]=bei^;%Fu_8=(,`5Ta:aN2KGbKS5VcHstddaQ^rf%8O,g=k<:h;7&Ii8N\U +jQ5OdkNM0plKdg'mI'uB!V#XYncA@Srq6 +JcC<$JcDkPl2LMWq>Bp_r;-BfqY:'arq?<`s7H?_rUL$[nF6GGs6]mSrp0[OlMg#nki_*jjlPR` +j5T%Ui82^S!ob5rg<_Rr0[>Irg<\OqNh,G +"IbU9L40'!%%E]RR$a5+Q&13IIsV*<%sEMSI=6WpIXm!&JqINAB)]@A\,NcJ['R'#V4ktfSTT+# +F`hnWJVB![M>rD3LB<3aL&?W(KDC2rK`Hf'L&-Q&L%^9#L&-K$K`Hf*K)gN$Jc(-!JH15qJ,=Zq +I=2$Bs*Xcn!.=cmpj2mc!.+Bd!.+ThrHeKhq0Msar-8$_rHeKjrd=ZkpNlCWq0`0grI"Wl!.=co +s*arrrI+`rrI4Zos+(&tqgeWrs*t0%JqElPs+L6&'n:UYH[9s_G'@\8D/*m$Ci+64?!Ue8?i47/ +Z2q::qH`l$s'#J,r`T8)"'Jf3>Pq\)=oVV(`X'Ue=BSa.=*pS7T_kGYUAptgV"pkaVZ*LmVZ*Fg +V?5,ibkK<[b5]Z^bQ,i]b506Yb5KHPaoKWablVf]tV7r^qmn)`5T^8a2lBF +bKJ,TcHjkbdaQ^qe^rF*g"P39h;-rGi8N\Uj5f=akNM0plKdg'mI'E2n*olHncA@Srq6 +JcC<$JcDkPl2LMWq>Bp_r;-BfqY:'arq?<`s7H?_rUL$[nF6GGs6]mSrp0[OlMg#nki_*jjlPR` +j5T%Ui8Ec5]&?A*uaS!ob4 +R$X,(BP(a`?X$]<>%1oK?t*PSA,^!@AQ;c3repi8reM2AKnXAjH]N5sBk_Cs).mTrbhgVEW'kSEV=DQEW1"U +EVOSSEr^7[F8p4ZDZF\SD?"DNA-HFP@UWhWq,7/i$&jk'N/US1;GpHl;Z0Jl;ZBSm;>sGo;,[Bj +pe_!T#F/(\:f'q_A,:u[M#N8.MYr;2M#E/2MM_1eqhtH4pPT*AR@3f:rg3YPqj@GOrg*\RQ^@]= +r0RDKrg3SLrKmJKqNq/H#FCR8P*2#mPl?pQQC!r*R$jA2rgWqX!1j+\!hZ-Yrh0@eU].(hV$3`o +Vl6Pnri0&#XKAV-Y-5(6Z*L^B['d?N\%&uZ]">Vf]tV7r^qmn)`5T^8a2lBFbKJ,TcHjkbdaQ^q +e^rF*g"P39h;-rGi8N\Uj5f=akNM0plKdg'mI'E2n*olHncA@Srq6 +JcC<$JcDkPl2LMWq>Bp_r;-BfqY:'arq?<`s7H?_rUL$[nF6GGs6]mSrp0[OlMg#mki_*jjlPR` +j5T%Ui8jr_iepr)*GkrD*fe:JUjar(d)aqb[,e!)`YiqbHr_r_E8b!)W)Zk"u(T!)WSjrD5h\#=T2Ir=Sl5'=B/="r_ierpf%2ls&K"s!)rYj +q,.,hrDESms&/nqr_`Sks&8qq#uOMpOcbfiPEV71PmjW2]cr=0&F)Xfeh1YctCai_fMbg+M[ +d*^:jeC<%#f@\d1gYCW@hVd>NioB([jlYail07L!m-O--mdKW6nc&([oCW%Ts7ZKerqQNhrqcQi +rqu`noDX=@JcFL)J,~> +JcC<$JcDqRl2LJVqY^!_r;-BfqY:'arq?<`s7H?_rUU!Y!:^!Vs6]mSrp0jTlK[Wuki_s-$0C7. +j5T%Ui8Pq\)=oVV(`WsRe=BSa.=+^4?rLrnY!2TIfr20CioVM];d*D@. +rlY8aqof&`pr`HTrQ>)\n]D6_bfl-0OcbfiPEV71Pld8rgs.^!20=b!MZ@g +UgU$rVPg>jW2ZesX/rD)Xfek3Yd(L?Za@*I[^NZU\[oDc]Y2%o^VI\&_o0O5`lQ6Cb0/#RcHaea +dF-Lne^i@)g"P07h;-rFi8EVTj5f=ak3(sml0@U$m-X60n*olHncJFTo`"Lbp@n=[q#C0iqY^6i +r;HTcrdk*#s4dR(~> +JcC<$JcDqRl2LJVqY^!_r;-BfqY:'arq?<`s7H?_rUU!Y!:^!Vs6]mSrp0jTlK[Wuki_s-$0C7. +j5T%Ui8[1HBrF,_8#\7FUA7ehC +JcC<$JcDqRl2LJVqY^!_r;-BfqY:'arq?<`s7H?_rUU!Y!:^!Vs6]mSrp0jTlK[Wuki_s-$0C7. +j5T%Ui8oh +!)rbmr_`/_r_rhpq,@8js&8qqr)*GkrD*i`:]4&a:]+#h;>O/j;#F,e:A@Wa:AIZc;"%3A:]OAk;#X>k;#O5k;#O8d:^Bor +;G^1c:f1*h;Ya2g;#O8k:^'Wm;,gOtr(@5c91)*45X5'.r)Wh_s$-BG!^T(9r^-WNs$H`O!^Jt7 +r]pKL!'pKI!^K%:r`&qar]pKL"@uTq=BG<#pfRT#qcWi!s&nqqrE0;+='&C%<;f_q<;9Dl<<#ts +;ufkl;Ya2h;Z0Jm;ZBYq;Z9Pk;ZB\q;@68tO-#KdP*2#mPl?pLQC!s;Qj9%JR[]e:S=TYNs.9:a +rh0@eU].&sV5C,fVl6PnWiE,$XKAV-YHY79ZEpmE['d?N\%0&\]=bei^;%Fu_8=+.`PojhV[8LioB([jlY^gkiq?slg4!*mdKW6nc&(\oCV\So`Fj]p\jme +q>^s+14)s*t~> +JcC<$JcDtSl2LMWqY^!_r;-BfqY:'arq?9_s7H?_rUU!Y!:]sU!Uf@SljrFIlKRQskND!ijlGI^ +io0mp(>n!)h;$c=g=b-1f@JL%eC2jndEp4bqk3kZrLWqXs.'+Y!1NhRs-WDEs-WhQpm*D!P`CHG +IXQWnB5OQEQ^3o%P`q8nOa2(mJUi3!JUW*!K7ebb@Usbq]!qXG&@ActO-l2kWHNN1F*2t^Jr9Pd +!/pc3!/UT/!/CE)r.Fm"qM"p%r.Xs$re:9)"GMSbKnfMZs+CB)rIk3)#)%V]JqJZ,rIOlurIFs! +pj`6k!e#HDr-\Qord=iqH[GO6rHeTlH[>O8s*F]js*+Nhrd+Qhpj2marHS-`r-A?ird=Wjq0MRX +npLIa!.=cos*jrqs*artrI4Zos+(&tqLJTsrdb$"rdt'#!/16'qh>c7I$G5/>5qb*=:3'gaB2PI=BJU\\GMruU%=uZUSRgaqkj7g +p87l:!n#B?p<3HXs3(;`!R&X`ans6Zao0B\ammLSbDuR_!K`HCP5g^GPl?pLQC!s;Qj9%JR[]e: +S=TYN!hZ-Yrh0@eU].%iV5F6i!N +JcC<$JcDtSl2LMWqY^!_r;-BfqY:'arq?9_s7H?_rUU!Y!:]sU!Uf@SljrFIlKRQskND!ijlGI^ +io0mp(>n!)h;$c=g=b-1f@JL%eC2jndEp4bqhG$&rIjlrqLS3fp4!p#De`cg?XI2KRDJsIXDXhZCDZ=YSDZ=VTEW'kSEVa_UE<(%XE<(%TEVFMPF8g7_ +F`DC"DZ4J[ChIW8-M=lc&Mu/J0MuK1HR[Nl:rg3YPqj@GOrg3DIs-N_Nrg3SLrKmJKqNq5J!07&> +!K`HCP5g^GPl?pLQC!s;Qj9%JR[]e:S=TYN!hZ-Yrh0@eU].%iV5F6i!N +JcC<$JcDtSl2LMWqY^!_r;-BfqY:'arq?9_s7H?_rUU!Y!:]sU!Uf@SljrFIlKRQskND!ijlGI^ +io0mp(>n!)h;$c=g=b-1f@JL%eC2jndEp4bqc3Vpqc3Yqr)NVnr)N_qnPf9`+#Yr0/h8G'/hK%A +;GrjIQ'IStP*1q[/M&S31GgpE2#]?O1H[c_5tXgC8kVfL8P(a$4YoW$:esk^:/b%erDNPjoht]b +n5B6a!)iVkr_ibps&/blrDNVlr_NSlr_i_m!`DlnrDESk"&Vll;>sDk:C'co;,C%b:f1*d;#aGm +;#jMk;>*i_:]4&a:]+#h;>X5l;,I-cr_E2`r_E;cs%r/[k"u(Tr(mAjrD<8dq+q&gr_`kq:JXea +r_iPhr)!Dj!DlSj;?'N(:f:1k9M.rN8kM`D6pO!455eLb:d@915Pm\L5sRY#6:1Z;"[YL@5X.L4 +5lX+M5lEnK5X@[7<<,>a5QjA<8PrXd=Su>%=SGtu=Su=n=T2G.=BAR(!K`HCP5g^GPl?pLQC!s;Qj9%JR[]e:S=TYN!hZ-Y +rh0@eU].%iV5F6i!N +JcC<$JcE"TlMgSWqY^$`r;-?eqY:'arq?9_s7H?_rUU!Ys7$$V&FSrQm-O'(lKRQski_*jjlHF$ +)rfi7i85ZRfJoVRK&ZQQN3EIQiQ.e)=ohc0r`fA*s&o>'$HC--=BJ^.=&tBlrLj.`qP+"bqk=+d +V#."gVYI(_VZ"jBccu1,rlP5aqTJu`b43URb4<[PaofhHNfO+"!K`HCP5g^GPl?sJQ2m9NQi`\E +Rf8cWS=TYNs.9:arh0@eU].%iV5F6i"fSE#WiN6#X]2I,YctC^ +JcC<$JcE"TlMgSWqY^$`r;-?eqY:'arq?9_s7H?_rUU!Ys7$$V&FSrQm-O'(lKRQski_*jjlHF$ +)rfi7i8C2S$2Ed)eSGkcL^G5l[b +FSKqVFS'VSFS'\UFSg1cFEM\IF`__JrcJ0]!-7sXs)S!Vs)7sXqf)OQpi-4Ns)A!Vqf)FNpMU"J +rb_^QrG;@JqJQ:Lp20qKCi')foPX\Gs(hdSDJjCVDXhZCD?+VRD?+VQE;FSPErL%YEr9nWE;FSL +ErC(WFT6IdEH#l7DZ+DYAn,@^@UikoAn1^9rDNoZNJp\1;,R6hr)*Gks%r\l"B&/r;,[?iq+qE_ +Q'G-@:esh\EJaUKs+pW2qMFg$qht?1q2>6A!h,OFp6biG!1^ +JcC<$JcE"TlMgSWqY^$`r;-?eqY:'arq?9_s7H?_rUU!Ys7$$V&FSrQm-O'(lKRQski_*jjlHF$ +)rfi7i8X5k;uKVl;=IKU;ZK_p;ZK_m;>jDl;>sAl;>sJm;#jMk;?'Gn;,I6hs%r\j"]/&n:espe;>O,h +;ZBVo;Ys>b;#3ue:A@W_:]OAi;?9WkqbR2dpeUlaq+guemn`%A!)`Jep/1Z_"&Vro;>s>l:f73i +q,.)es&&emr_NPk!DlYl;@??"91_cK9M8#H76gQ2r`0.u5X7Ouq`k_5Qs_V=]eg0r`K,%r)iDjoiV5s!*K5%r`'##^ +JcC<$JcE%UlMgVXqY^$`qtg9eq=ss`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#rki_*jjlGL_ +j5T%Ui8Gs-NeQ +qNabs,I2@N/WYlM#`A1LB<3aL&H]'KD^DuL&H]'L%pB&L&?]'K`Hl*L&Zf+KDgK'K`Zp[ +KDgE#Jc:9$K)gN&JH15qJ,XosI/nZmIK+cqI0"_BpNljdr-JE@H$T@5rHeHgq0N!br-8'` +r-A?irI"Qjq0MOWo6gOa"FPWGIX_9EqL8$c!J#[tJH(-!JH(3#K)L?%KE-`*K`?c*L'r]gKS>,7 +Lk'l"H@#R8$[69"DJs<(D3Ap6:AJ5rZN!`$>l.h$>lS"5=]eg1=^"s2r`fA*s&o>'%`ZQ1=BJ^. +=&tZsTV/!Pq4dna!MlLgU&h$bqka:hq5,VgTqS3TUSO]^V5C/gW2]cr=0&F)Xfek3 +Yd(L?Za@-K\%&uZ]">Vg^;%Fu_8=+.`Q#s>aND]Lbg+M[d*^:jeCE.%f\,!4gtgfChr*JQj5]4^ +k3(sml0@U$m-X60n*oi:o()DDo`"O`p&Ojcq#C0iqY^6hr;HTdrdk*#s4dR(~> +JcC<$JcE%UlMgVXqY^$`qtg9eq=ss`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#rki_*jjlGL_ +j5T%Ui8DJa>i;>sJn +;#X;n;H$Kj;>O)s;3[?2:JXe_:/,nhrJ1E0regK-reg`4qMP--qi(?/rgWqVs-`\M!h#FCrg*VP +qO%>Nrg3GJs-N_N!gf:ArKmPOs-NSJrKmMB!f`5#rf7)AOoCODP5pjHQ2d-MQi^ +JcC<$JcE%UlMgVXqY^$`qtg9eq=ss`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#rki_*jjlGL_ +j5T%Ui8i;ZBVm;#4#h;Z'Di;#X>l;#X5l:f1*h;#X>i:^9cm +;Gp@h;H!EioMGE\r_EDf!)EMhqbR8iqbdDkqG7)cpeUlaqbR2fmn`(Bs&&MeohkW`s&&eo!)WYj +!`2cmp/1ids&&emr_E_p;,U4f:fRBk"&i)l8cD?c9MIlK:AI*RRj!*K/%qcN;ioiV5ss&f;&rD`o",VgTqS3TUSO]^V5C/gW2]cr=0&F)Xfek3Yd(L?Za@-K\%&uZ]">Vg^;%Fu_8=+.`Q#s> +aND]Lbg+M[d*^:jeCE.%f\,!4gtgfChr*JQj5]4^k3(sml0@U$m-X60n*oi:o()DDo`"O`p&Ojc +q#C0iqY^6hr;HTdrdk*#s4dR(~> +JcC<$JcE(VlMgVXqY^$`r;-?eqY:$`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#Kki_s-,N\"H +j5T%Ui8=NS,SlMR/WHPR/N?OR/WHLQ9Lh- +ObeO3I=6W[BWeJ8VPBcOQBJ/.OH5H_NJrgSMh$D3K7m`E@U?XV\$WQN['XalQ^*N1GBnF[H@UU' +N;SYd@fVt[(bciMJ;qTJl^!6bAa!6b5_!R&XVaoBNRao9E`MMqIm!f`5#rf7;GOcbfiPEV71 +Q2d-MQi +JcC<$JcE(VlMgVXqY^$`r;-?eqY:$`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#Kki_s-,N\"H +j5T%Ui8pPI!U$ZEc-PmOH5H_NJrgSMdp4+A7ba@"'(>>MuJP4L'D!oG&VMWCAquNDK9c?r-86e +rcn9`rc\C!,qjSs)7gSpi6:RrGh[QqJl=O +r,Vm\F8g:]FV].EGBe.HE,TT2DJa6)An5F^@Ua"^:&[oc;ZMdU;#X>i;Z9Mo:f73is%r\l!`Drp +qbd2ds&&f]s%a#!:JOW2MMd1FLl%#_M#`G3M>E,+Mu/J0Mu9(ERfAfPR/WKRR/WEPR/33NR/WHJ +R/`NPQ3*D?R/NBOR/`NLQN!3OMMqIm!f`5#rf7;GOcbfiPEV71Q2d-MQi +JcC<$JcE(VlMgVXqY^$`r;-?eqY:$`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#Kki_s--0=4J +j5T%Ui8X5k;#3ue:A@Wa:A[id;".9B:]OAl:]OAi;"[]`;#aDm;?0Sm +:B=sJm;$9cq;c6Ni;?'Mq;i6M4Muo!!NrG(EOHGZgP*;)org!ML +!13\Ps-WkUrgNqYSc52gT:hjNTq\ +JcC<$JcE+WlMgYYqY^3e!*K3sr;-?eq=ss`rq?6^s7H?_rUU!Ys7$$Vs6]mSrp0[OlMg#Kki_s- +,N\"Hj5T%Ui8_ViQn!NJrgSMM[1GK4AD#@'7#K[C-"@%<6H6J;ps\H$FX] +JqAmUNrD1LB*).L&?W(KD^DuL&H]'L%U0%Knb?]K`Hf)Ka!3bKnP,3rIb6+KS0/R +r.4m"s+:<'rdb'"pj`9l!e#HDr-eTord=fpHhVgeI!bj="*o3>Hi89jH2VsfH2`-hH2DpaH2W!` +H2W'hHiJKkHhi!WHh2XaHiJHpI=?YEIJJ?dJ,XoqJ,b&sJ,b'!JcC?%KDpN(KDpN(L&Qi*KER!` +Ll$ufM@kAbI!L!`H?j^IDf9N/Bl%s5r_EJhra,P"qH`f"#[:J7=^"s3=]t`.r`T;)rE'M1aN7Oe +=]ea+V73k,UA^ecU&^tfV#R4iUAgqfV#7(hVY-k`VYSR>ccu=0rlbAcrlP5aqoo)`!6XlSs2slR +"j2[YMMd>kMuo!!NrG(@OHG\)Op@28Pa.N"QC%T +JcC<$JcE+WlMgYYqY^3e!)idmr;-?eq=ss`rq?6^s7H?_rUU!Ys7$$Vs6]mSrp0[OlMg#Kki_s- +,N\"Hj5T%Ui8S5MD>S2ND>eAPD#eDOD=h`DD>nJ;DXq`DDZ=YSDZ=YQE;=MQ +EW^<#E,k_ns)A$Xr,MRRq/cOWs)eBdGBa%2&TVi0DJa9-DJWosA7]7[@qK9N:B+,h;uKPl;>a>k +;#sKjr_ibmr_W_p;ckMuo!!NrG(@OHG\)Op@28Pa.N"QC%T +JcC<$JcE+WlMgYYqY^3e!(Qqar;-?eq=ss`rq?6^s7H?_rUU!Ys7$$Vs6]mSrp0[OlMg#Kki_s- +,3@nGj5T%Ui8jrDWbsoi(rj<;KPm<&uZj +1GCF2.kE;)3&3cc5Wq7l4#f/W1fBBqNfB!VMi*@JLc%=X5!;J18P)QJ8P)6:77B^?:Jstb;#=,j +;uK\o;ZK_k;>sJm;uBPn;>a;l;tX&Z;u]bm;>jDm;>a8`;>X2i;?'Jl:BXKk;,C*f;>j>k:BjWn +;Gg:h;Z0Jd:]aKj;#=&f:B"&h:B"&e:]OAi;?0Sk:BOEh:/:R[r_E>dr_W)[j\YtSp/(T_s&&ho +qbRAl;GpBj:B45_;$9]m;,C*g:BOHl;H*Nl&Pl5";,L7h;cc^g92%uM9LM>K:B+,h55e:Y5sYE6 +r'1EO5X.P$6N'1Q5X@\$5Q3qJ64,tB5!D1q5sRY7Q7n(=oVV' +=o)8"=oVS(<;TZ%<`N.!;c?Xp;cEWor_ikt +JcC<$JcE.Xli-_Yqu$6ds0D_&r;-?eq=sp_rq?9_rq-6^rUU!Ys7$$Vs6]mSrp10]lK[Wuki_-k +k2k[aj5T%si#:M0h;-l@g=b-1f@JL%eC2jndEp4bcHOJTb5Iq*Sc>5[S,Si@R/<3kSXGUrJ9ZNn +Iq`T!XJr%lSXPn0Nf&UFJ9d-5N/NSmM$\unL14SN\@8lRrj32lF*<(o[Wd"BH?t3qMNQA(*>R4P:=BSg1>$5&.>Q.e+=oDG2=3/Kc +=]nj.?E:QCUA^ecUAq"fV#@(eV#@.iVY$e`VYAF +JcC<$JcE.Xli-_Yqu$6ds,R0Wr;-?eq=sp_rq?9_rq-6^rUU!Ys7$$Vs6]mSrp10]lK[Wuki_-k +k2k[aj5T%si#:M0h;-l@g=b-1f@JL%eC2jndEp4bcHOJTb5-ecKE$Q&Jc1*!Jc(&tJ,4]jIi``P +D.R*Y?XR8DmOH?sdWEc>c*A7K"RNJrgSMZ/Gi;@L2171CitYMCMIU%F)lI" +GlE!dGl2d`G5ZL_F8g:]F8L(SF8g:PFTur1F`__HF8^4XF8U(VE<'tWEW:"VDuXeTDte5NDuXeU +DuXeVDuXeUDt.`ED?"DPC]/,MC]J>LDZ4MODZ=SODZ4JOD=h`ED#eJQDrts0Du=JQDuOYSDu=SM +EW'nXEVOMQEW:"VEVXYNF8g7^Fa!b.r-/lrE,TW2DJj<-AS,L`@prk[A55o!:]!uf;>a>k;#sKj +r_ibmr_W_p;cIs-N_N!gf:ArKmPOs-NSJ!/UW2!fDnorepoVf^;%Fu_SX4/`Q#s>ai_fN +c-FY^dF-Lne^i@)g"P39h;-uHi8N\UjQ5OdkNM0plKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^ +JcC<$JcE.Xli-_Yqu$6ds&9!qr;-?eq=sp_rq?9_rq-6^rUU!Ys7$$Vs6]mSrp10]lK[Wuki_-k +k2k[aj5T%si#:M0h;-l@g=b-1f@JL%eC2jndEp4bcHOJTb5,-8<;TYs<)lrs;ufqr<;ohm<;KPn +<$""V1bUC//1iG52FKhq5!D(h3]ArR1GLU:NJrgSMZ/GNLkg^K5"&"78P;]K8Mrk'6qC!K;GU(b +;c6Nm;>sJk<<#nr;Yj8i;Z0Pn;Z9Pk;?0Yg;Y!cc;Z'Dk;ZBVk;#*rg;#X>h;#aDm;#X5n:f1(d +;#O8i;#a;q:f:1g;,UjDm;#jGk:BaKi:esh]peUlaqbR2fn5&mW +r_MuZ!)`Abr)*Djr)!Djs&/kns%`Vkn593^r_EVm;GpHk;ZB\p;#aB&;Gg=j9he8Q8kD]E6r$MV +:]!rh5sYE6rBU?J"$](<6N0:N5lX+N5X565s$@&Y5<_7q5=%P!Q7n"=nc%uVf^;%Fu_SX4/`Q#s>ai_fNc-FY^dF-Lne^i@)g"P39h;-uHi8N\UjQ5Od +kNM0plKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^ +JcC<$JcE1Yli-_Yqu$0bs0D]-rqcThq"Xj_rq?6^rq-6^rUU!Ys7$$Vs6]mSrp1$YlK[Wukih3l +k2k\'iud:>i8EMLh;-l@g=k64f@JL%eC2jndEp4bcHXPUb/sURpmqAR!1NkSoU,ZFq3_,I%%`oM +Ne;_,I=-QZB!2-3)k`^hQB$oZL4F\sG'KpCMM[1GLPCP;KS-_@[JmNFQ)o1[O1KO\H@:*kJr5_Q +O,j$q!fi8!reg`4reUK-!/CH+rIb0'r.Oj!re16(onNBus+L3%r.G-*KS05Ts+(0%r.4m"s+C9$ +!.aiordFlrI/A$+p2=^"s3r`fA*rE0)$$cpFl=]nj.A[8eQ[/H[" +U8+L_U]@1dV#@.iVX^S`VYAI;cN)2cbPo]gbK@uNbPTKabKBP#rQ#)_b0%j)aS3gVLB*/0M#rQm +MuJY:NK0%uNrkE*OoCLKPE_;sQ'R`&rg4(]R[T_8S=Q4BStD\TTj"1cUnjiaVl-JmWiE,$Xf\b0 +YctCVg^;%J"_Sa=2`Q-'@b0.uQcHaeadF6Upf%8O,g=k<;h;7&IiSrnYjlY^g +kiq?slg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Wirqu`no_sFAJcFL)J,~> +JcC<$JcE1Yli-_Yqu$0bs,R.XrqcThq"Xj_rq?6^rq-6^rUU!Ys7$$Vs6]mSrp1$YlK[Wukih3l +k2k\'iud:>i8EMLh;-l@g=k64f@JL%eC2jndEp4bcHXPUb/sX9!el;\p4N9os+(*"s+(#s!e>cM +q1/En.dKH['^UE,96#ARJnN>$Q`=MM[1GLPCP;KS,0]M%>DsE.MYC!c2Xgrb_XN!,_UNrb_XPrb_UO!c;airGD1ErG;OPrbqXNrbq:D +rbqdRqeuCMs)7mSs)7jTpi6:R!-.aPs)J'Xrc.[Qq/cRX!HiSbGPl^cH3/,+Du=GQCLd?S"_(th +Akl,#:]!uf;>a>k;#sKjr_`bo;#X;n;H$Kj;>X2h;?)p]:Bs]l:037/MMUeZqhk9/q2><3rf$i7 +!1N_Qs-itUqO%8M"IPOBR$dc=!1,%dfUnsrdVl6SpWiN5'Xfek3Yd(L?['d?N +\%0&\]=bhk^VI\&_o0O5a2l?EbKJ/UcHstde'umuf@S^0g=tH>hV[8MioB+]k2tjjl07L!m-O-- +n*fc9rpg*]o`"O`p&Ojcq#C0iqYU0hr;HTdrdk*#s4dR(~> +JcC<$JcE1Yli-_Yqu$0bs&8tfrqcThq"Xj_rq?6^rq-6^rUU!Ys7$$Vs6]mSrp1$YlK[Wukih3l +k2k\'iud:>i8EMLh;-l@g=k64f@JL%eC2jndEp4bcHXPUb/sW_!`i<$qc*Jns&Atts&B"u!`i<# +r)3Yr;cEKkrDPj<2)I$@.kUR5sIOr4?GM]2Dd0D0.nk1;N$EhM26qAL4t;58P)QJ8kCZu +6q'[@;,L+c:f:.g;Z0Jl;?0Yo<<#nr;Yj8h;Z0Po;Z9Pk;ZB\i;Xm]c;Ys>k;Z9Pj;#*ug:]OAh +;#aDm;#X5m:f1(dr)*Dhs%`Yl;Z9Mn;Z0Jd:]O;j;#F,f:&n)g:B"&g;#X>k;Z9Mn;#X5p:/=\_ +:JO[[:]F2d:]=2\:\did:[h3\;=dW_;>sGn;>j>k;?'Mt;,C(b:JgRYr_WVjs%r_n!)rhor_rhp +rD3u$;GpIo9h\/Q8kMcF:/:daqbR;Z5lO"H5lO%O5=%V&r^$QLs$6ZN5Q3qJ63'=N56!kI5n6+Z +r!=^(Z+!*\tspfRMqr`&hr#$+`(<)cdqr_rbps&8qss&K"s!)rPgr)*Gk +r_Wer;c?RlqbdBK!/UW2!fDnorepo,%dfUnsrdVl6SpWiN5'Xfek3Yd(L?['d?N\%0&\]=bhk^VI\&_o0O5a2l?EbKJ/UcHstde'umu +f@S^0g=tH>hV[8MioB+]k2tjjl07L!m-O--n*fc9rpg*]o`"O`p&Ojcq#C0iqYU0hr;HTdrdk*# +s4dR(~> +JcC<$JcE4Zli-bZqY^'as8)c%!*B*oq=sp_rq?6^s7H<^rUU!Ys7$$Vs6]mSrp9[N!:'RJ.d6'X +k2k[bj5].Xi8EMLh;-l@g=k64f@SU'eC2jndEp4bcHXSVb/q_rq47DQ!h5XIrL!eUQ^=)+r0[DK +qO%5J.[lQ]L4=DqIt26GYH4V"V4O'APE(KUKn"DmG^t`;3MuASHIX?BdG^4OXEG9B1CMI[qE_cU0qb[/q!*oM/q-420>$+p2=^"s3r`]G-=^(c+s&TTL +a]M\K=BB@K\$`UBT`Us`U\LVcUSRjbs/,=a!N)dfciVP=bkfN^bQQ,3b0/!*bQ5o0p +JcC<$JcE4Zli-bZqY^'as8)bV!)`[iq=sp_rq?6^s7H<^rUU!Ys7$$Vs6]mSrp9[N!:'RJ.HosW +k2k[bj5].Xi8EMLh;-l@g=k64f@SU'eC2jndEp4bcHXSVb/qa(K`Hf&KDpN)K7`fJs+'opqLJNo +4*#4R@piJI@:<8>Jq/2qHZsOPDe`lq@UNMG>[q;TKSbM?LPCP;KS+o/M2-h*EHuSKW+g$_Ci4<7 +GPla_Gl)ddGl2d`FoZ[`F9$CTFSp4YFRaMOFT-@]FS^%\EcH)>qf2XT!-/!WrGM[Tr,;=K!,qjU +qJQ@Qrbq=ErGDRM!c2^jrG;=Jrb_[QrGDLN!c;airGD4FrG;OPrbq^Pqeu"BrGVUOrGVUO!,qjS +s)7gSq/Q@R!-.dQs)J!V!-.^Qq/cRX!-\hs-e2k>DnDsM"?K"MYi>0N;8A3N;f:ARfJoVRJN +JcC<$JcE4Zli-bZqY^'as8)ap!(Hh]q=sp_rq?6^s7H<^rUU!Ys7$$Vs6]mSrp9[N!:'RJ.HosW +k2k[bj5].Xi8EMLh;-l@g=k64f@SU'eC2jndEp4bcHXSVb/qa(b!)NSjrD32`rD3GirDESmr_WYlrD*Mj:Jame:A@Tb:ARcc +;".9W;#X8Z:]OA`;#X>j;?0Sm;#aAn;GmEi!)NSjnkoE`r_EVm;,U?k;Z9Vm;?Tip:f($g;@-8q +91qlL927iLr_NDf!C9!M5Q*kH5m'>:6:1Z;s$6TM!C/mK5ScXP5sIOs5Q%at=nl+ssJm;$9cq;c6Nl;>u:O +LPUccM#rQmMuJY:NK0%uNrkE*OoCLKPE_;sQ'R`&rg3_SRf8cWS=TYN?([d`Tq\ +JcC<$JcE4Zm/Hk[qu$-arqZf)['Wq;q>'gap\sm`p&=U`oDJ1Znc/+Xn,MeUmJcJPlN$5Lkpko[ +k2tdejQ#:[iS`YOhVI#CgY1B7f[na+e^W'rdF$=ecHa\YbK@rJaS_V-SH#/ZSH#)VRK&ZGQhm*L +QURF3Nei74I=?ZtAn\?HVP^#UR[B.pL4Xu)H$4F_K7SW-KSP;:KnP)2Jq8K'I]edMO4AH#H@:9q +K8YqWP*1rhO,f3Yq2PB3s,$f5reUK-!/CH+p4W3ps+L?)p4iHure1-%r.G-*KS08UpjrHs!eZ)V +rIO`n"FbiLI=1d;$[d;JH?spbI!^0cH2`-gGli>=HN&3dGl;sfGli;;HMVpaGklX`HN/?lI/J?h +HL6(ZHLcCbI!pHmrdFWl!.FiqqL8KorI+]ps*srqrdP!"JV!fPs+:<'re(3's+C<(!JQ:-M#W>2 +MZ8V4N"_2!IX??eH?aXNDej6-Bl/*9:J^jar_`Jsq-420>$+p2=^"s3r`]G-=^(c+s&TZNa]M\K +=BBUR\$iZKUAgqbV#I+iU87dbrhfUk!2fFeo[!ZccHQ..rlbMgb0%oNrQGAebfe0&ao09_ai_cJ +rQ+iWs+UH,!f)SfreU]6Mi7Rns,@#=rf7,BOcfX+#EtC:Q'IZ$Qi<@`R@9V7S=H.AStD[LTq\9V +UnjiaVl-JmWiN5'Xfek3Z*L^B['mEP\@K2_]Y2%o^qmn*`5Ta:aN;TJbg"GZd*^:jeCE.%f\,!5 +gtgiEi8N\Uj5f@bkNM0plKdg'mI'H3nF?MK!V>s_p&Facp\ssfq>^ +JcC<$JcE4Zm/Hk[qu$-arqcVTs&&jmq=sp_rq?6^rq-6^r:9mXs7$$Vs6]mSrp9[N!:'RJ/a2B[ +k2k^cj5].Xi8EMLh;-l@g=k64f@SU(eC2jndEp4bcHXSVb/q`GKnP-VKDpQ(KE$PsJcC8rJ,4]q +IlhakCLppZ?=.)MnoKnP)2Jq8K'@srEXG,8ngCi+*3 +F*IJ+qKVj^s*4Kdr,r'_rH&$\oQ:%QrH.UQqfMgYs)e*Y"*/C$Er9qSE;XVSE;OSKDuahUE;"5@ +DZ"AOCBAe;IDZ4JQDZ"AMDZ=POD=h`ED#eJQDuX_NDt%ZDDu4GODu=MQDuOVSDu=SLEW0tY +EVFDPEVsbUEVa\UEW1"SErgB*r-/-bs*=Tjrd+Ta&8uH)DJj9&A7]=_@q01`:J^jarDEJjs&&em +!)`_n#>n;o;,L4i;Ys>h;#O8kPmU8^:eshpMi3IKL\?T$MYi>0N;8D3Mu]:FRe`EQRf8`OR/WKV +R$X/,R/NESR$j?@QhZsJQi<9PQ^F0=QiEHQQi<ai_fNc-FY^dF-Lne^i@)g"P39h;7&IiSrnXjQ>Ufkiq?slg4!*mdKW6nc&([oCW%T +s7ZKerqQNhs8)Wirqu`no_sFAJcFL)J,~> +JcC<$JcE4Zm/Hk[qu$-arqcUns$d"aq=sp_rq?6^rq-6^r:9mXs7$$Vs6]mSrp9[N!:'RJ/a2B[ +k2k^cj5].Xi8EMLh;-l@g=k64f@SU(eC2jndEp4bcHXSVb/q`G<`N/s<;ono<;fhqX8k;u'>g;Z]os<;TVm;Z'Dl +;Z0Ji;#=,`;#X>l;#a;k;#*rl:f1%c:Jgg`p/(cbs%rVhrD!>grD*>fr_WPj!`Dlmr_WPh"\qii +:JO[R:]=2\:\did:[h3\;>3oe:]F8i;>sGn;>j>k;?'Po;#sKhrD<;e!)WSjr_WVj"&Mim;uKVn +;ZTcnqbmGks%j2(;Gg=g:/";R8kDB<:J^jar_`YZrBU?J"$]%;6N0:N5lX+N5X565'L>&O5<_7q +5=%S"!g&P,rfRMMPa%GuQBmm:Qt;\SS"#qVg^;%J"_Sa=2`lH0Bb0/#RcHjkbdaQ^r +f%8R-g=tE=hV[8MioB([k2tjjl07L!m-O--n*fc9rpg*]o`"O`pAamdq#C0iqYU0hr;HTdrdk*# +s4dR(~> +JcC<$JcE:\m/HhZqu$0br;$Nk['d=@=Sqmlp\sm`p&=U`oDJ1Znc/+Xn,MeUmJcJPlN$5LklL#2 +roPWjjQ#:[iS`YOhVI#CgY1B7f[na+e^W*tdF$=ecHa\YbK@rJaN'jBrLEhW!1a"W!1NhRs-WeP +rg*AHqNs@2S)5L&?T) +KnK>Upjr?prIOZl!e,NEr-\QmrdFfos*FusH[C-fH[9u9HMr-hHN&3gGQ;seGlE$gGm8S?H$Xa] +HN&3dGku^`H2r$Co0s&fA+=oMP'=9$DB=UA87>(*lh[^<<7qkX7erLsChUnspeVZ3RmVYm@kW;WXcciMJ2`prWKU!6P5_!6P2\r5ntk!ec8]re:K0Lku%es,$f7rf$l:!07&>!g&P,rfR;G +Pl?pUQC!r*R$jD3S"#q=rgm;cTV8'RUSO]^VPg>jWN*##Xf\b0Yd(L?ZaI6M\%0&\]Y(qm^VI_' +_o9U7aN2NIbK\>Xd*^:jeCE.%f\,!5gtgiEi8EVTj5f=akNM0plKdg'mI'H3nF?MK#kR]\p%A%P +p\4[^s7u]kqtpBjrVcBfJcC<$g])d~> +JcC<$JcE:\m/HhZqu$0br;$Ehrf@%VqtU-arq?6^rq-6^r:9mXs7$$Vs6]mSrp9[N!:'RJ!U/_G +js]?Pj5].Xi8EMLh;-l@g=k64f@SU(eC;spdEp4bcHXSVb/q`Ga+T-EKDgK&KDpJrJH15qJ,Fir +Il_[iBjt=R?XR8AgJH[0gXEc>i.AR]+T=^#h;ZBVn;#X>t;,C(d;,U=jqbd8frDET[!DZGi:^(EgMi*=GpPJd)qht<0qMYB4rgEeTq3qGS +R@3lrG5MuJ\8N<#"< +NrkE*OoCLEPEc'3$^R-GR$a;1R[]e:Sc53aT:hmOU8+N[V5C/gW2ZetXKAV-YHY:;Za7'J[^WfX +]"G\h^V@S$_Sa@3`lQ6DbKJ/UcHstee'uq!f@\d1gYCWAhr*GPj5]4^k3(sml0@U$m-X60n*olH +nd+jZo_%nNp@n=\q#C0iqYU0hr;HTdrdk*#s4dR(~> +JcC<$JcE:\m/HhZqu$0br;$Ehr`&kdqtU-arq?6^rq-6^r:9mXs7$$Vs6]mSrp9[N!:'RJ!U/_G +js]?Pj5].Xi8EMLh;-l@g=k64f@SU(eC;spdEp4bcHXSVb/q`Ga&Q.<<;fhl<;fhqJ]2Dm6E0eY+11c$pEr\G?I22-^:K7ec,J:KO?5"A7@:esqd +;c6Ki;Z9Pm;#aDm;Ya8j;ZBVn;#O8k;?p,u;Gg7e;,R6hs&8hns&/nqqbmPqc;#X8j;#F,g:&n)f:B"&g;#X;n;Gg*id:]F8j;>sGn;>a5l;,U+_I] +Tq\ +JcC<$JcE=]m/Hk[qu$0br;-Bf"gthL\6)l4q#0sdpA=O^o`"I\o)J7[nGVhUmJuYRm/QAOlMg#K +ki_s-.coaOj5T%Ui8,8LUr+iJUi99Qc+WY +GBnI_JV8`9P5LODP5gXGOH,>"N;JV4MZ\inM2;(b!/CH+on<*o!/1<)p4`U%K`6](KER!^KS>*Y +L&?T(KDgDtJc:6&JV&LQJHULQIsukCIfY"GrI"frI=-Hkrd=`m#C:`DI!g9eH2`-fH2i3iH2Vsi +GBe@Xrd+He#'tQ?H?a^\qKVj^r-AKmI!g9fq0MIUpj2jbrd"]oI!pHmrdFWl!.FiqqL8KorI+Hi +rdXrurdjrus+:]4K7\`.KS5&6LPL]aM>rJ5Mu8P6NrP.PKm\8pH[0p]EGBB1D/3pMF&2^1r_`Ym +s&8l%q-3u*>$1`+s'#D+s&fA+=oMP'=9$DB=U826@>),![^<=;U]@1eU'@BgV5:&cV>I.fVuEXo +Vt87;cd:"`q9/c]s2tGcbP]T_b5f][ao09_ai_cJrQ+oY!.t3&!ec8]re:K0Lku%es,$f7rf$l: +!07&>!g&P,rfR;GPl?pKQC%T<@[W[SS"-">St;RITqS3UUnjiaVl-JnWiN5'Xfnt5Z*L^C[C3QS +\[oDc]tV7s_8=+.`Q#s>aihlOcHaeadF6Upf%8R-g=tE=h;@/KiT&tZjlYail07L!m-O--n*fc9 +rpg?do^qhLp@e7TrqQNhs8)Wirqu`no_sFAJcFL)J,~> +JcC<$JcE=]m/Hk[qu$0br;-Bf"cne.P#>3Wq#0sdpA=O^o`"I\o)J7[nGVhUmJuYRm/QAOlMg#K +ki_s--fsFLj5T%Ui8@X?!:HAqd^ISAS#M6K7\Z)J8o[kEJ8+B +D/XB8Fa3n2!.+KerHS?f!-n9a!-nKer,r'_rH&$\oQ:%Q"*A[.FRjPTFE@G'"ESU)F*.D&!ci@' +rc7gSr,D:Hs)A!Vq/H7M"E&-qDf>/`rGDRNs(_XOD>e8ND>S5JD?"DWD/O3.DJa3+rGD4FrGDFL +pi#\?rbq[Or,;RPs)7mS!,qdSpMp4R!-.sV!-.^Os)IpVrc.sYqJua\F`qs+GQ2mhH$Xi5H4b:= +E,TZ4Df'2tAn5F^@XMc`r)!Air_ibpr_`_nr_WSl"Aqul;,R0=s-ieRs-itUq3_/Ls-NhRR/EBDR/`NPQ3*D?R/NBOR/`KRQ@f*g!ec8]re:K0 +Lku%es,$f7rf$l:!07&>!g&P,rfR;GPl?pKQC%T<@[W[SS"-">St;RITqS3UUnjiaVl-JnWiN5' +Xfnt5Z*L^C[C3QS\[oDc]tV7s_8=+.`Q#s>aihlOcHaeadF6Upf%8R-g=tE=h;@/KiT&tZjlYai +l07L!m-O--n*fc9rpg?do^qhLp@e7TrqQNhs8)Wirqu`no_sFAJcFL)J,~> +JcC<$JcE=]m/Hk[qu$0br;-Bf"]SK%<^oRXq#0sdpA=O^o`"I\o)J7[nGVhUmJuYRm/QAOlMg#K +ki_s-.coaOj5T%Ui8jAn;cNZnr_`_nr_WMirDEVmr_WVlr)*Mnr)3Pn!)i\m"&r9"<;]\n;Z'Al +;Ys>h;#=,_;#aDm;#X8i;#4&g;#X;p:f1%d;>!cb:B45g:]=)h:]*ue:]F8f;?'Jm:C0cl:JOY] +:esh]qbI2ep.tZank]'Xr_NMis%i;as&&Mer_EMjr)*Jl!)`\ks%rborD!g&P,rfR;GPl?pKQC%T<@[W[S +S"-">St;RITqS3UUnjiaVl-JnWiN5'Xfnt5Z*L^C[C3QS\[oDc]tV7s_8=+.`Q#s>aihlOcHaea +dF6Upf%8R-g=tE=h;@/KiT&tZjlYail07L!m-O--n*fc9rpg?do^qhLp@e7TrqQNhs8)Wirqu`n +o_sFAJcFL)J,~> +JcC<$JcE@^m/Hk[qu$0br;-Bf"o,O8\@K0L=T8'npA=O^o`+O\o)J7[nGVhUmJuYRm/QAOlMg#K +ki_s-.-9OMj5T(Wi8EMLh;-l@g=k32f@JL%eC2jndEg+`c-4ASb/hZE`l7kHs.&tUrgNkT"dk^G +R$X0;QMm0FQmQF6Nei:1I=-NWBs"A3VP0EEQ'@;cKn4]"G'ALgJq8Q,KSG/7L]4jq]7GKuOdql0 +G'\LaIt`Q6rf[2Cs-!DE!g&J&rf$`6!0$i6re^T/s+^H*re(9*q1SBop4`U%K`6]%KER!^KS>-Z +K`6W'K(sorJdR'\Jq8H'J:E&tIenNpI=2!Ard=`ord=Zkrd4iqH$O^^qg&3frd"Kfs*+Kf!."Qi +r-ArJ5Mu8P6NrP1?OV!"jH?jg^H$=1BDK0N/D=r&L;#X>k +;Z0Po?27b*>6%e(=TDY(>Q7h,>$:i,s&TWMa]VeN=_Wi(\$iZKrM0Fgqk=+dV#7(dVYd:kW;`^c +d/VDmcHZ4/rQP5`rQP2_!6Y)YrQ#)_b0%j)aSj3^JV&LQK*$^[L&Qi,LB*/0M>rG5MuJ\8N<#"< +O*m%OOcklkPE_>tQBml)R$jD3S"#q=St;RITqS3UUnjiaVl6SpWiN5'Y-5(6ZEpmE[^NZU\[oGd +]t_=u_SX71`lH0Bb0/#RcHjncdaZdtf@S^0g>(N?hr*GOj5]4^k2tmll0@U$m-X60n*ol;o()DE +o_%nNp@n=\q#C0iqYU0hr;HTdrdk*#s4dR(~> +JcC<$JcE@^m/Hk[qu$0br;-Bf#l'LDP*1r+;H!MgrV$-]rq-6^r:9mXs7$!Us6]mSrp9[N!:'RJ +!U/_GjsoKRj5].YiS`YOhVI#CgY1B6f@SU(eC;sqdF$:ccHXSVbK@oIa2Z)NKDpPtK)gMuJcC9# +J+\=CM.0e?s[&AraZ"=raZdVAS,M6NK&mJJ8fLSEdVS:D/XB8 +FF*\,!dK!9rHRs[rc\NhF`qqNFmjGNEr^=NFTHT*rcA6`EcZ:"F8p7aF)l;@EH(hqqJc4J#&\?t +E,]`6qJc=MrbhaSno"ABs(q^N!GlWOC]J>LDZ"AND#S;OD?4Tjr,)+Erb_LLq/>b?rbq^Pr,;OO +!,qjSs)7dRpi-=TEW'kVEV=AOEVskUEW:(VErgB*rc\3`s*+NhpNlje"EJI"DJoGj#\[a]ARo7[ +^LmC?r_`YmrDN_p;>sDk;?Tin:f1*h;Ys>i;#O6#:m@5?:JakkDi9O2LkkkaqMP0.q2G--qj@GQ +q4%DQs-`_NrL*VOrL*5Ds-N_N!gf:ArKmPOs-Ee +I#sJQP*2#mPa.N"QC!u+R@9S6S"-%@StD[LTq\o(2MG +p%A%Pp\4[^s7u]kqtpBjrVcBfJcC<$g])d~> +JcC<$JcE@^m/Hk[qu$0br;-Bf!r,_pr`9"frqHBbqt9s\s7?0Zs7--YrU9dS!:BdPs6B[MrojII +kPjTljlGI^io8qTi8);G^4e +;GpIj92%uP8P2fJr)!Air_i\ns$6TM"[>7=6:!p:5lX.M5Q3n^5sdh$4Zu"o5X@Y8sJY=nl+u=8Ptr<sJm;$Tut;c6MEJqEuS!ec8]reCH. +!/UW2s,$f7rf$l:!07&>I#sJQP*2#mPa.N"QC!u+R@9S6S"-%@StD[LTq\o(2MGp%A%Pp\4[^s7u]kqtpBjrVcBfJcC<$g])d~> +JcC<$JcEC_m/Hk[qu$3cr;-?erqQK&!P5oB=9/*ppA4I^o`"I[o)J7[nGVhUmJuYRm/QAOlMg#P +ki_-kk2k\'j!E^Di8EMLh;-l@g=k64f@JL%eC2jndEp1ac-4ASb/hZE`l5ogrgj(Zr1!YR!h#FC +rgoL%^6%KnTGZqLf', +KS5&5KS9>WrIXfqs+:9%!ePuSrdb#us*jfo!I]@pIJnNnIJnQlHiABnH[5U:qg&3frd"NgrceBe +!."Qir-A*s&fA+=oMP'9qTJi]rQG/`rQG5`prWHTprWPds+(0%rIY0)Kn]M\!f)Sfre^Z4!/pi8!f`5# +rf7)AOoCLEPEc'3!LB)OQtr+YS"#q=St;RITqS3UUnjibVl6SpWiN8(Y-5(7ZEppG[^WcW]">Vg +^;%J"_Sa@3a2l?EbKS5Vcd:(fe'uq"f@\g2gYL]Bi8ESRj5f=ak32'olKdg'mI'H3nF?&>o(2MG +p%A%Pp\4[^s7u]kqtpBjrVcBfJcC<$g])d~> +JcC<$JcEC_m/Hk[qu$3cr;-?erqQGS"HlV[;YU1aqXsm\rq$'Ys7--YrU9dS!:BdPs6B[MrojXN +kND!ijlHF$.,s4Di8@UE8D?XQl>IscQeG]RkCC1_'f?sd2D>@V,QAH$-BB4bagr/D.h?[?^=BkhL&EHH;JHM2Xa +GQ<$eGkH=fG^"=SF`hkMFo6=]F7jYREr^=NFTHT*rcA-]rc7sYr,MjYE,b_pqJc4J#&\?tE,]`6 +qJc@NrGDURnS\8A!,VXMs)%^N!,_UNrGDOMrb_XPs(qXNoPOYGq/5tGnS\>Er,2CMrbhaSrb_^S +qJc.JrG_aUpi-7Qr,VaUrc7mWs)nj;#F0":m@5?:JakoFGl'7Lkknbqhk0,qi(B0!1Vg^;%J"_Sa@3a2l?E +bKS5Vcd:(fe'uq"f@\g2gYL]Bi8ESRj5f=ak32'olKdg'mI'H3nF?&>o(2MGp%A%Pp\4[^s7u]k +qtpBjrVcBfJcC<$g])d~> +JcC<$JcEC_m/Hk[qu$3cr;-?erqQIns&T:k7Rm.OpA4I^o`"I[o)J7[nGVhUmJuYRm/QAOlMg#P +ki_-kk2k\'j!9h\&M4YoT( +:Jjnc;cj!)`\ks&&Mgpeq8osDl +:B45i;=m]b;>sAl:]4,d;?'Jl;>j;k;>!c[:]=,h:]*ue:]F8h;#jGl:]F2h:B4/h:]F2g:]4&^ +:]F8^:\did:]=2i:\IWb;>3od:B45e;>j;m;,Ua8j;#jMm;>sAo;,U:hr(mAjqbmGm!)i_l +rDNYoqG[Glr_NSlr_s,!9MS2Q8Ou8I;#X>l;YsAq5XIb$5lO(M62j.L62s1K5Sl^Q5X.Fq5X8k;u_CJJH1<# +K*$^[L&Qf.LPUccM>rG5MuJY:NK0%uNrb?)rfR;GPl?pKQC%T^ +JcC<$JcEC_mJct\qu$3cr;-Bfr:gK+\%0)_^;'YLqXsj[rq$*Zrpg$XrU0gUmHso>s6B[MrojXN +kND!ijlHF$-K="Bi8K->B$9Mh6;*It20EXf/+pSXPq3Nf/[JJUD`eG(5!mJ:`<)L4t>/8LPYncrJLW5rf$l:s,[2AqiUl+%!d5FH?X4FDJ +O'+\9.^Hr_`Ymqc!Mo!F/k,>lS".=T)A&>5_\*=TM]/r`K2%&'2jq>$>'QS%#l8['d@dVZG)hn^.<^!RAsbb5fcabPfZ`b5f]Zao'6UaT-hiJH(0#K)L<'KS>-ZL'!-dM#N82M? +&S6N!G?&NfT6_OHKO*F-DiRQ'R`&R$a;1S"#q=St;RITqS3UUnjibVl6SpWiW>)Y->.8Za7$I[^ +WfX]"G\i^V@V%_o0O6a2lBGbK\>Yd*^:jeCE.%f\5'6h;-rGi8N\UjQ5OdkNV6rlg4!*mdKW6na +Z2@oCV\Jp%J+Rp\ssfq>^ +JcC<$JcEC_mJct\qu$3cr;-Bfr:g;TOSt:DP#G7VqXsj[rq$*Zrpg$XrU0gUmHso>s6B[MrojXN +kND!ijlHF$.H9=Ei8E=+YmKH?OFPE,00#AR]"P>?YNG@q0%YAS,RdB9)qM%p*%CM0Ph2DJsH8G'J@\ +HM2X[GkH=aG^"=Sr,qFLrc8']n9+bQs)S6`F*%>$s)\$W!c`0ur,MRPphp7PDf9UoDu+GNDuFPR +Dt.`DD?"GPCBAe;IDZ+GOD#S;OD?4Tjr,)+E!,_LKpi#\?rbq^Pr,;OOrbhjUDf>Mlp2U%M +rGhXPs)IpVrc.mWr,Vp]F`m\,!I&_dG5umeH2;jeHiJKlIK"0oDJsB/Ch@6iA7K/8B)YX+;>sJj +;u]hs;#O;l;#aAo;Gg?h;>sDi;%QQgPtk+O:h+d/Mi*=G8Vr<$MYE&+N;AG5Q^IW;!1N_Qs-itU +pm;&Lr0[GNnsKHDrKdJMs-WeP!.Xuus+(0%rIY0)Kn]M\!f)Sfre^Z4!/pi8#E=b(O,oBaOoCMb +PE_>tQBml)R$jD4S"-%@StD[LTq\ +JcC<$JcEC_mJct\qu$3cr;-Bfr:p+hr^QbWrq-3]rUTsXs7$!U!q,ICrp9[N!:'RJ#3b75k2tdd +ro5UR5X.Fo4?GJ\2Dm6E0/"k/1GgjA1G^jE2)I-`r_3bo7S-6:7o)rY:f:6j +;Z'Dg;Z9Mr:esk`;>sJn;u]et;cd;Ya8k<;okt<;fbo;Yj:]OAd;"d]a:B+,g:Amug;#F/j;#X8j:B+,i:B"&h:B"&f:A.K_ +;"IKX;#X8i;#X8h;#aD_;#O2c;>j>k;?'Pn;>a8j;?'Pm;?'Gr;,U:h:f73g!)`Vks&/nqqbd>j +s&8\l&5uG&;G^@k;,U+]9hJ&N:.,"Wr_`Ymqc!Mo!^T%9r^$TNr]pKLs$-HI(I:;N5!;+p5X@Y8 +<'`c65=A.?;,U:h3pg)E=9;Q&;u0Jm<<-"s;Zp'"V(P&lhOQ'IZ$Q^F/.R[]e:SXuFFTV8'RUSO]^Vl-Jm +WiE/&Xfen4Z*UdD[^NZU\[oGd^;%G!_Sa=2`lH0BbKJ/Ucd:(fe'uq!f@\g2gYL]Bi8ESRj5f=a +k3)!nlKdg'mI'H3nF?&>o(2MGp%A%Pp\4[^s7u]kqtpBjrVcBfJcC<$g])d~> +JcC<$JcEF`mJct\qu$3crVHHfqY19)\[oJg^Vg%QrUp0^rq$'Ys7--YrU9dSs6]gPs6B[Mrol-# +kND!ijlGL_j5T%Ui8`5*K`Hf)L&6PrL%g<%L&Qc) +L%p?$L&Zi+KDgE$JH15tJcC?%JH:@Rrdb#urdO`o!.OiorHnTnrI"TkrHnTjrd+Hes*FWhs*4Qf +s*+Nhrd+He!.+Wi!dK!9qKW!brceEgr-AEkI!bd;s*=WjmX#"]H$TC8rd"re^Q1s,6o9s,@/AO,oBarK7)B!/gc'%XEDI +G&hG=Dej-,G&pJVr_`Ymqc!Jn!EEA&>lS".=T)A&>5_Y-=]ej1r`K2%!Q`C^=p\G_U:7V?['?j1 +r1X7fUnmd^s/,Og!m]-rG5MuJZ_NK0$[O-#KdP*2#nPa.N"Q^F/.R[]e:SXuFFTV8'RUSO]_Vl-JmWiN5'Y-5(7 +ZEppG[^WcW]">Vg^V@S$_SjF5a2lBFbKS8Wd*^:jeCE.%f\,!5gtgiEi8N\UjQ5OdkNV6rlg4!* +mdKW6naZ2@oCV\Jp%J+Rp\ssfq>^ +JcC<$JcEF`mJct\qu$3crVHHfqY1&PrfI8FPEl,FrUp0^rq$'Ys7--YrU9dSs6]gPs6B[Mrol0$ +kND!ijlGL_j5T%Ui8rJbsuo +Ii)1*ChI0^?=7/B7+kLA7K+\AS,RdBDmeu=C#3?AuTN]DJsNL_@qK:K;#X>k +;YsDl;uourr_ibms%rhq;,[9gr_WPjs%j/hPtk+O;.tB9Mi*@HLAHf$Mu8P3MuS_;Q^F0:R/i]O +S,\oXR$m`:!1EbPrL*5Ds-N\Ms-NbQs-Ee9It.HJs+(0%rIY0)Kn]M\s+^T1re^Z4!/pi8I#X/H +O,oBbOcklkPa%GuQC!u+R@9V7S=Q7CT:hmOU8+N[VPg>jWN*##Xfek3Z*L^C[C3QS\[oDc]t_=t +_SX71`lH0Bb0/#ScHstee'uq!f@\d1gYCWAhr*JQj5f=ak3)!nlKdg'mI'H3nF?&>o(2MGp%A%P +p\4[^s7u]kqtpBjrVcBfJcC<$g])d~> +JcC<$JcEF`mJct\qu$3crVHHfqY9th"BAAg7Rm@Lrq-3]r:9mXs7$!Us6fpSrp9[N!:'RJ0^.]_ +k2tddjQ#:[iS`YOhVI#CgY1B7f[na+e^W'rdF$=ecHXSVbK@rJa2Z*;`5;IQpf.2j!*&hqs&AYi +(G@[%0J+b*/M9"?5sRXt4$#A\2Dd-D0`sDk;>3ua;u]hr<<-"s;uKVc;$0Wj:Jh!es%i\k +pe^rer_NSjrD<>fs%r\lrD3Jkp/(HYr_EJhrD*>fr_WMi!)WYjs%`Sis%`Sir_EGgrD*&^r_W2^ +q,%&dr_WSir)!Air_NSlp/(`a!)WJgr_WVlr_ibnqb[;ir_i_ms%iep;GpBi:]OAi;ZBYq;Ys>k +;Z9Vg<<#c+:Jahc:fC4a:/";S8OPsC;#X>k;YsDl;uou`r^$iU5X7P"5sIU45Sl^O5<_4p5jWN*##Xfek3Z*L^C[C3QS\[oDc]t_=t_SX71`lH0Bb0/#ScHstee'uq!f@\d1gYCWAhr*JQ +j5f=ak3)!nlKdg'mI'H3nF?&>o(2MGp%A%Pp\4[^s7u]kqtpBjrVcBfJcC<$g])d~> +JcC<$JcEIamJct\qu$6dr;-Bfq=k9j\@K8c^;7e0>5hV(p&=U_oDJ1Znc/+Wn,MhUmJcJPlN$5L +kqVDbkN:pgjQ,@]io/hRhqm2FgtUQ:g"=p.f%&:"da?Ihcd'h[bKJ&MaN)<>`Pf[2rLNkUs-itU +!LT5QR/WKWR$X,)Q^@ZDNrG%rd+Hes*FZis*4Ne +s*+Nhrd+Kfrd+Kfqfr*crHJTnH?sj^H@1'dr-A?grd+!Z!d]-;rd+QhqKi-fs*X`mrI4]n!.Oco +rdOlqrI4`q!.Olrs+'Zks+1E,KnY89L]3/-MZ8S?N/`gWNfT6_OSt=?OqEn2I!pEiG^+CLD/O6, +DL$A$r_`Ymqc!Jnr`/o%s'#J*r`K5'r*02'!ErY*=T;G3aN7Xi>%<;e\$rfQZ*=,"!McIiV>d:i +V>d@fVuG!Acgf?accsbZpri]]rQG/`rQ>2`pWb]tV7s_8=+/`Q-'Ab0/#ScHjnce'uq!f@\d1gYCWAhr*JQj5f=ak3(smlKdg'mI'H3nF?&> +o(2MGp%A%Pp\4[^s7u]kr;6HjrVcBfJcC<$g])d~> +JcC<$JcEIamJct\qu$6dr;-Bfq=k6iOH>TePE_?!rDEXgrq-3]r:9mXs7$!Us6fpSrp9[N!:'RJ +1$If`k2tddjQ#:[iS`YOhVI#CgY1B7f[na+e^W*sdF$=ecHaYWbK@rJa2Z*;`5BIjK`$K!K)1&o +JGamD<`3pRA6rJJ?=?l8J9uTgF`_S=Bk1a`?X6i<@U`kXA7T7_B4YZPN=0i6?tEtdCi435Fae8ND>S5KD>nAOD>nDQD#A/9DYe;?DZ4SQDYnANDYnALE:n5ME;jkP +E;sqUErC"TErL+[FT-F\G5c^cGlN'cHN/?iIJnU+FDl/:Df'?-An,C`@q04b;#X>k;YsDl<;ons +;ZBSl;#jMk;>sDj;?'H%Pa,$?:f_CcMi3ILLPG_aoo&a,!/pc6rg3YPqjIJQq3qDRRJ*$JRJiNO +RIZaFQi36MQiEHQIK+crJ,XuuJH1<$KE$W)L&Qf.LPUccM$JorMi +JcC<$JcEIamJct\qu$6dr;-Bfq=k-f<`N1$<;oer7K,aVp&=U_oDJ1Znc/+Wn,MhUmJcJPlN$5L +kqVDbkN:pgjQ,@]io/hRhqm2FgtUQ:g"=p.f%&:"da?Ihcd'h[bKJ&MaN)<>`Pf[2rDiVlrDN\q +r)N_q!)rhqr)4[l0/bU?/1N2&/N5RR5<_7m3]K&V1bg^l:]O;d;#X>k:]O;i;#4&h;#aDj:]OAd;"d]a:&n)f:B"&h;#=,h:]F2h:B4/h:]F2h:]*u] +:]F8_:\[cc:]=2i:]4,e;>!ca:\[fd;#aDl;ZBVl;#aDk;Z9Mr:f1+g;>a5j;>O/k;c5=%S"5Q*hd5sIRt4[)(q5sSFL5s[_# +7SQZU;Gp@j=]eg0rE/espK7Gpr_r\nrDibo!`W0"p/M&lrD`_qs&Aqqp/:idrDNZDs*jutrdb$" +!.t3&s+LE+re:K0Lku%e#E"FtN/WaUNrG(?OHKO*E0HNOQ'Rc(R$jD4S"-%@StD[LTq\b]tV7s_8=+/`Q-'Ab0/#ScHjnce'uq!f@\d1gYCWAhr*JQj5f=a +k3(smlKdg'mI'H3nF?&>o(2MGp%A%Pp\4[^s7u]kr;6HjrVcBfJcC<$g])d~> +JcC<$JcEIamf*(]r;?K2enkKO+i"2I"-]\YH"LtTUV@9NerLDIW81MuJ_9NrP1?OSt=@P5g^XP*:BDH[L3cG'.S>CMdm+JUdYrs&/\l +r`&ks!ENJ(>6%e)=TDS%>Q7e+>$:i,s&TZNa]hqPCQ>^0\$iZKYl(3qU].%kUSOZ\rh]Ukq5=2: +s3LDc!71Vj"4,6:bk]H[bl>lbbl,]bb4s*TaSs9]I/\QoIfFosJH(0#K)L<'KS>-ZL'!-dM#N5F +MMmCON/`jXO,oBbOcklkPa.N"Qi<@`R@B\9SXuFFTV8'SUnjiaVl6SpX/rG+YHY:;Za@-K\%&u[ +]Y(tn^qmn*`5Ta;aND]Mc-FY_dF6Upf%8R-g=tE=hV[8MioB+]k2tjjl0@U$m-X60n*ol;o()DE +o_%nNp@nO\s7u]kr;6HjrVcBfJcC<$g])d~> +JcC<$JcEIamf*(]r;??YKG@Us$KAHQOWAS(h"$Zq53@qKIkCiFH< +Gkl^dHM2XYGkcOcG^"?0FoHRaFmsJRF*-kn!d&L(rc@^Ps)J$Ws)J$W!,qgTq/?:Nqeu@Nr,:q> +r+uFMrbDOND>e8ND>S5LD>nAND?"MMDL_A8lJd;?'Pj;uTbq<sDj;?'H%Pa,$?:g7srMi3ILLPGecoSWd0Mi7Ci!1t +QC%T +JcC<$JcEIamf*(]r;?k<;ol)<^K)<5X.J!5sR[55QX595Q3hY5tQC%T +JcC<$JcELbmJd"]qu$6drVHKgq=sp_s7Qo7^V[t2bgG,&>$+j.oDJ1Znc/+Vn,MeUmJZAQlg!d7 +kqhPdkN:pgjlGI^io/hRhr!;Hh;$c=g"=p.f%&:"e'cXjcd'h\bfe/NaN2B?`Pf[2_8,u=s-s%W +pmM)J!13MKs-FjUB:G-DJUDorIqNGtWMZJaR@'4uM2$V2GBe:\It3-(re1H0KSI):]*l$2Rr`e! +I=[$(M2qFos,lr:s,dMIO,f6[N/[Xn!0$o8"H&%mLku"b!/C0#qh4ZspP&m+KS+o1Kn]8S!/:E* +s+:T.JqAQ)J:N3$rIFs#r.+p"It.BFqgSTprI+Wl!.Ffnrd4TkrHe?drd+Qh!-nKercnEgqg&3f +s*4ZjH$T72rd"Kf#C1WAH$O^_Hi&*hH2W'XHNJM=H2`-hH2`-iH2i3iHi&3hI/n`pI/n`lJ,+Nq +It3#tr."3e!J5t'Ka*9eLl$tGM>iD2MuSe:NrP1>OSt=AP5g^KP*;)oMZ/&'H4"h7DJsE.DMj!B +;>sJj;uTbp6%e)=TDS%>6A#1>$:i,#Zk-LaBMhOF-cg7"Lb\BY[d[,rM'FgUSId`s.o^m +q5=/9s3LDcs3L\k"4#08bk]HZbQ,ibbl,]bb4s*UaT'B^HiJKmIK+crJ,XuuJH1<$KE$W)L&Qf3 +LPUbCM2I1Krepl;NrG(COHG]hPEc'3BU5!PR$jG5S=Q7CT:hmPUSO]^Vl-JnWiN5'Y->.8Za7$I +[^`lZ]=bhl^VRe)`5Ta;aND]Lc-FY^dF-Oof%8R-g=tE=hV[8MioB(\k2tjjl0@U$m-X60n*ol; +o()DEo_%nNp@nO\s7u]kr;6HjrVcBfJcC<$g])d~> +JcC<$JcELbmJd"]qu$6drVHKgq=sp_s7QnaPEV5sR%'eK;Gg:hoDJ1Znc/+Vn,MeUmJZAQlg!d7 +kr.bgkN:pgjlGI^io/hRhr!;Hh;$c=g"=p.f%&:"e'cXjcd'h\bfe/NaN2B?`Pf[2_8(\UK)L?% +K)L9#K):,nJH(*A>uPi_BOP4S?sm#9Jpr)mG]\"FBkCmb?X6l?@q&qZAH$-AB4YZPN=1A[FD#<& +D/XH;G^B.3s*FBap3?CY!dJp4rH8-`rcS!X!-S'Ymr\eUF)l;BF7XDPEW0qWEW:"XDuFYNDuX_P +Du4MODuFPRDt7fCD$=`kCM[j)rG;@Kr,)FLrb_[Q!,VRMlYcN:n8A5DrGMLNrbhRN!cW'rrG_LN +rG_aUpMg"Mqf2OS$ZgE4F`_bKG'.qNG5c^cGlN'dH3/G@I/\QhIK4TkE"-`'Des#sB4YU`F)OoQ +r_iVlr`&hrr`9%qrD.8Za7$I[^`lZ]=bhl^VRe) +`5Ta;aND]Lc-FY^dF-Oof%8R-g=tE=hV[8MioB(\k2tjjl0@U$m-X60n*ol;o()DEo_%nNp@nO\ +s7u]kr;6HjrVcBfJcC<$g])d~> +JcC<$JcELbmJd"]qu$6drVHKgq=sp_s7QIn<;ohr;?g-*77K^8oDJ1Znc/+Vn,MeUmJZAQlg!d7 +kqhPdkN:pgjlGI^io/hRhr!;Hh;$c=g"=p.f%&:"e'cXjcd'h\bfe/NaN2B?`Pf[2_8,hFq,78m +r`/bnrDOac/iPUA0.JM(/N>UR5s@Fo4$,AY1bga>0J5"81,Ahc%Poq"2)@s$:JFMA4u?#1r_N\p +<)HNk;Z9Vp;Z'Df;YO#o;H$Oo;c6Ii;Z9Vn;YErg:f7!c!Dubi;ZKep6Yr_NMir_EMjpJLW\r_EMjq,.)e!)`\m!)`Shqbm;gr(mAjpeprcs&/eoqGdJnqG[c" +;,C+e:f1.g:Ad`e8k`)Zr_iVlr`&hrr`07i5X.J!5sR[55QX5:5Q3hZ5.8Za7$I[^`lZ]=bhl^VRe)`5Ta;aND]Lc-FY^dF-Oof%8R-g=tE=hV[8MioB(\k2tjj +l0@U$m-X60n*ol;o()DEo_%nNp@nO\s7u]kr;6HjrVcBfJcC<$g])d~> +JcC<$JcEOcmJd"]r;?+`(h[OGA@2IXZ$EAuqr-Un!m>P`(6NJ:)QbG(5$nK7ejVL'!-l])K;LMj_;7T6Yd5JqSu@ +plPNi>0L]<,&L&-JsL%pE&Ka!-^K7no3pOiO#re1<(!J,k% +JcC6$JUm]M!.t-"!e>cMrI4Wns*joprHnTnrI"TkrI"Qiqg&3frHSBfrceBe!."Qir-A9fs*4Zj +H$T:3rd"He#C1WAH$O^_Hi&*hH2W'XHiArJ3MZo'!NK0$[rK-u?!0[8Ds-3PK%tT.VH[C']F`)&6Chdg+K)S[E +;uTbqQ%\)=SuA*=]ej1r`B_5=NJQf>$?6C\$rfS['HoMqP*q`rhKRkVZ!FmV?!OjcMu5a +d/MAkcj%e?bfn8Rb5BHWbl#Wab4s*Ua9Kb4H@(!dI/\QoIfFosJH(0#K)UE&K`?c+LB!#/M#N6L +MMmCON/`jXO,oBbP*2#mPa.N"Q^F//S"#q=St;RJTq\Yd*^:keCN7'g"P39h;7&IiSrnXjlY^gkiqBum-O--n*fc9rpg*]o`"O` +p&Ojcq#C0iqY^6hr;QZdrdk*#s4dR(~> +JcC<$JcEOcmJd"]r;?\=r;H!)Vrpg$XrU9dSs6]dO!pf.: +rojgSkND!ijlPR`j5T%si$I:;h;-l@g=k64f@JL%eC2jnd*L"_c-4ARaiMQC`Pod5_SO%&rdt*$ +qgnd!qgnHk(fjUVD.R*Z?sm);LDZ"AND#S;ODZ"A:DYe;?DZ=YQDZ"GPDYe;OE;skUE;OVTE;aeT +E;sqOE;FVQEVsh[FEM_JFSp:]G5ldcGlN'eHN/

  • sDk;?'JmPlFMd:h>$5Mi3ILLPAq+Mu8J4MuAV7MZA_6R/`NQR/<s-N\M#+'X^H[C-frdFfqs*t#us+(0%re(6(s+UK-s+^T1reYQNMi3OQNK0$[ +O-#KeP*;)oQ'IZ%R$a>3S"-%@StD^MU8+N\VPg>kWiE/&Y-5(7ZEppG[^WfX]=bhk^VI_'`5Ta: +aN;WKc-FY^dF-Oof%8O,g=tE=hV[8MioB(\k2tjjl0@U$m-X60n*olHncA@Srq6 +JcC<$JcEOcmJd"]r;?p;,U:jrDNYos&/blq,6ra$;sf%<)Z[l;,U:jr)3/a!E)km;?B]n;Z0Mo<;oer<;T\q<<#ns +;Z'Dl;#!li:esk`rDESjq,%&frD3Jir_WDf!)WYlrD3Jkp/(]`!)EDer_EJhrD*>fs%rSir_NMg +s%`Vir_NPhr_NGepJ:cboM>3Xr_NPjr_NPjpJLW\r_EMjr_WYlrDEMi!)`_ns&&VhqGR5gr)!>i +!)`\mq,./irDWSmr_r\n!)rkr%o?,#:Jt(i:eaYX91hcK8cDWa;uTbq*YHY:;Za@-K\%0&]]Y2%o^r!t,`Q#s>aihlPcHjkbdaZdtf@S^0 +gYCWAhr*JQj5]7`k3(smlKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^s+14)s*t~> +JcC<$JcERdmJd"]r;?$+j.naZVJrU9dSs6]gPs6K^M +rojgSkND!ijlPR`j5T%si$[F=h;-l@g=k64f@JL%eC2jndEg+`c-4ARaiMQD`Pod5_SO%&^Rb@o +!h5XIrgE,?-#&j8O,&7/DJNotBWJ,2UR[g>OGegFJ9uQeJ:N6&Kn=u3L4k<[]*k=(WM#`*G^P0u +M2V(hrK6f:s,dGGO,f6[rf$c7!0$o8!/g`2rJ1B,p4`BspP&Bs!el;\rdt6)L%g6#L&Qc*K)pOT +rdk*"!J,e"JH1<"JHC@OJ,OinIfOrrIJeHmIJnQmHi8?jHM`!fHN&3iGlDpeGQ<$gHMi'fH38G; +H$T72rd"Kf!dT*6A#1>$:i,&6DuTaBMkVJY]ca[^NQJY]0K6rM0@f!i;cjqkj27!71>br6PDf!6kGc +!6Y5_q98]Y!6Y)YqoJ_^s*OcnrdFfqs*t#us+(0%re(6(!/:E,s+^T1reUZ5MuJZKNK0'\OHGZg +P*;,qQ'Rc(R$sM6S=Q7CTV8'RUnjiaVl6SpX/rG+YctC=ZaI6N\@K2`]Y;.r_8=+/`Q-'AbKJ/U +cd:(feC<%#f@em4gtgiEi8N\UjQ5OdkNM0qlg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Zjrqu`n +oDX=@JcFL)J,~> +JcC<$JcERdmJd"]r;?BP(d`?X$e6@g?RTAS#LcAWHbL$[6cCGC4.? +E,fuBH1lUbHLuLUGku[eG^"?/FT?UaFng(YFnp.KFTQZ+F74,LEW0nWEW0qWDuFYODuOYPDu4MO +Du=JQDt7fDD?"GPCB86grG2INqel@LrbVRNs).^Nl>HH:n8A5DrGMLNrbhRN!-%mTs)@mUs)@sW +r,D[UpMg.Pr,VgW!-%pWr,Mp^F`heJr,r$_s*+Hes*=Ng!IK4nIIqt"I=#pPDJsK3ChI<,-rBMi3IML5&t/Mu8J4MZAY3Mu/nAQN3ELRK&`T +S,8WSRJ3*ERIHUDQi36KHN/?lI/\QoIfFosJH(0#K)UE&KE-`*LB!#/M#N53MMqImBT8%5O-#Kd +P*2#nQ'IZ%R$a>3S"-%@StMdNU84T]VPgAlWiN5'Y->.8Za7'J\%&u[]Y(tn^qmn*`Pom=aihlP +cHjkbdaZdsf@S^0gYCWAhr*JQj5f=ak3(smlKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^s+14)s*t~> +JcC<$JcERdmJd"]r;?[2)R*B0/"q71,:[B1GgpH2)@s&:JO,h;>a>i +;>X2g;?0Sm;?0Pi;?'Pm;uK\q;Z]iq;u0Gr +JcC<$JcERdmf*+^qu$6drVHKgqY:'arV$3_s2>/`d+I4;l2BuQ='A[,=Rc7Ws6fpSrp9[Ns6BUJ +3p>bik2tdejQ#:[iSi_Qhqm2FgtUQ:g"=p.f$r3uda?IhcHa\YbKJ#KaN)<>`5BI.^q[XuSXc1= +rgNhSp6bZB-@0BrOc!deDJO$&BWeA5VP0HFQ&^fVKn"GnG_(EuJqSf4L4tGKrOWEbr6GGhbfp(0s2t;`q98`Z +!6Y&XrQ#%bH$T@7s*F`nrI+]p!.Xrt!eGrTrdt9*Kn]M\!JcL1M/8'-Mit +QC+&-R[]e:SXuIHTq\Vg^V@V%_o9U8aN;TJbg+M\dF-Ln +e^rF+g=tE=hV[8MioB+]k2tjkl0@U$m-X60n*olHncA@Srq6 +JcC<$JcERdmf*+^qu$6drVHKgqY:'arV$3_&X/HGS"Z^\Yd1R>Y>/"n;,Zo]n,MhUmJcJPli68L +kr.bgkN:pgjlGI^io/kSi8ZGi^BDl$6=W:IpJ:)`gFE2>:BkCmb?<^ZF@qB1^AS5XfB6O65$@ZuVFae(BE-$/IoR$R` +om-4TqKW-eGBW_'q/lUYqK24L!H`DNEWC+YDuanWE;skTE;FMPDZ"GME;XYADYn8ND#S2NCi0,e +!,_UNrGDOMrb_[Qr,(_:qJYh?rbqdRqeuLPq/?:PrGM[Tqf2US!-.pUs)IdPrc.mW!-/!Ws)IsW +!crL,rcJ'\s*"Eds*4NgrHeKjrdFEfrI#6!E,]`6DJa-#An>O_@Us%Jqc!Gmr`/bp!EW1o;>sB* +;,U7f:m@2?:K_RiN/NUOMMHpoqMY0,qhkH@qNq;MR/33NRf/`QRK/cLR/36?R/`NQQ3);VH2W'h +HN8HlIK+`rJ,Om!JV&LQK*$^[L&Qf-LPYqdCl4./N/WaVO,oBaOcklkPa.N"R$a;1S"#q=StD[L +U8+N[VPg>kWiE/&Y-5(7ZEppH[^`lZ]=bhl^VRe)`Pom=ai_fNcHaeadaQ^rf@S^0gYCWAhr*JQ +j5f=ak3)!nlKdg'mI'H3nF?MK!V>s_p&F^cp\jmeq>^ +JcC<$JcERdmf*+^qu$6drVHKgqY:'arV$3_&Q;S);H@"0@U`bR>sCbI77QeEn,MhUmJcJPli68L +kr@nikN:pgjlGI^io/kSi83ub;uT\n;>=&a;$Bir<)cdor_WYnrDESmr)!GlqG@5jr_r_ms&&eos&8nr!`N&tqc3Yq!)rkp +r)*Jjr_WYlr)!Pm:JXgc;?'Gf;#X>j:]O;j;#4&h;#aD_;#O/i:A[ic:&n)f:B"&h;#F/j;#X8j +:B+,i:B+,h:B"&f:A.Ha:f6j\pJCibr_WVjs%rJfohbW`rDEPj##S2m:Jakbr_ibnqb[8hrDNPj +qbR8ir_ibnr_`bo;#=,h;Z0Pn<<#ns;ZB\m<;TZ-<)?Fh:f1(g:eaPV91qiI6W3e[rD`brq,RW" +5s[b#q`t*Es$6TMs&K%a!Coi_:]sZp;,]aQ=T2J#=9)=t<t +QC+&-R[]e:SXuIHTq\Vg^V@V%_o9U8aN;TJbg+M\dF-Ln +e^rF+g=tE=hV[8MioB+]k2tjkl0@U$m-X60n*olHncA@Srq6 +JcC<$JcEUemf*+^qu$6drVHNhqY:$`rq?6^#P?$\e_K3Km/HAVm-*P6=]\`)n,MhUmJZDOlN$5K +kre1mkN:pgjlGI^io/kSi8uK_U8rL&m!]rIacr!/:E*"+u2VK)U?$ +J,t4OpjiKsIt.BFqgSTprI+Efs*O]lrHe?drd+Qh!-nKercnEgr-A9f"F56:H$T:3rd"Hes*FZi +rd4Qh!."Nhrd+Wmo6UObH$TC8rd"Khs*=Tir-SBir-\WoI=D$B!J#[rIKG"LJGOcpJFe=(JqJ`0 +KnY8;Ll$qDM2@+IMi7Rns,@&>O8Y1=OT:RDP6@&4PE_=1PnKCLPC@n,H?sj\EGTT2Ci"!3;YsDl +<;fhn6A#1=]tZ)s2b4E$>ts3\$rfS['HobrM'7cqkX.d!m8a3q9Audp<```"4#08 +bl5fcb5KNZbkoQ`b4j$Wa96^3G^4T5HN/
  • ,7L51P?M2@+IMitQ^F/.R[]e;St;RJTq\s_p&F^cp\jmeq>^ +JcC<$JcEUemf*+^qu$6drVHNhqY:$`rq?6^&bM?UT;/BhZ*LX=Xf83q;Gg?kn,MhUmJZDOlN$5K +kr7hhkN:pgjlGI^io/kSi8[(?7>?P*1=+YmKH?aINEGK3!@piVJ>@V2Srac^SBP(k:NK&s:F,=jdC2@g/Fa3J( +rd+6_om$=Y!dJp4pN?:RrcS'Zn9"bRF7+&KEW0nWEW0qWDuFYODuOYPDu4MODs_H>D#eDOC]A8M +D#8,JD>nAND?"MPDsB+ +;,U7f:m@2>:L&"!NJi^PMMHpsHiAp(N/RLhr/:Q@pmCoG!1NnVr0dYSRdujERIHUDQN`\!G^+LZ +rHeKj!.=`ns*artrI=s#JqEuS&;5akL5(J=Ll$tGMMmFPNK4"!@??V7P*;,qQ'[l*R@9V7SXuFF +TqS3UUnsrdW2ZetXf\e2Yd1UB[C3QT]">Vg^V@V%_o0O7aN;TJbg+M\dF-Lne^rF+g=tE=hV[8M +ioB+]k2tjkl0@U$m-X60n*olHncA@Srq6 +JcC<$JcEUemf*+^qu$6drVHNhqY:$`rq?6^"nYYi<*EW-@K^+G>Zt8/70#gVn,MhUmJZDOlN$5K +krItjkN:pgjlGI^io/kSi83ua;$Bir<)cdope_#hr)!GlqG@5jr_r_mr_Wnu;cH^r<)Zck<<-"t;Z'Dl +;#X>l;#O5n:esk`rDESjq,%&fq,$obs%r_mnPK0[!)EDer_EJhrD*>fr_WMir_NMgs%`Vir_NPh +r_NJfp.tZaohYO,g;>jDk;>X/i +;>sJm;?'Mq;,C*e;>jDk;u]hs;u]bq;u9Pj<=2]*>m6V1!J;,L4i;,]bQr`B/'qcNi#r)iqtqc*f!;c?Xp +JcC<$JcEUemf*+^r;??erVHNhqY:$`rq?6^s7?K:dFmI?li-8\m-3Wlj&]Dd='4nYmHsl=s6B[M +rosIH!9a@Ds5c6$j5].XiS`YOhVI#CgY1B7f[na+e^W*sdF$=ecHXSVbK@oIa2Z*:_ns:+^V@Lr +]UYL]R[TY4pmCcA-#[[DO8b.;N;\_9N;e_8MZ/G0L\uo%L&$DtL%pB(KnP-YKCsltL&Q`-K7\Z+ +rdk*""+buRJGOfuJ:E(HIf"TpIf4]hI/eQlI/SBgH2`-hH2VpgG^"H4HMi'fH38G;H$T72rd"Kf +!I9"jGli;=Hi/0iH2W'WHiA?kGlW0iH2`-hH2i3hHi8/9r.tB0s,-i7rf$l:s,[,?rfI2Drf[JJPEV5qrKS(_Q^F/.MLBo"H?saYD/F3.C2Im1 +r)[)B=[^W`S[^``cN)8i +bl>lcb5KNZbkoQ`b4j$XaSpD`GlN'fHN/
  • uQ^F/.R[]hkWiN5'Y->.8Za7'J\%0&]]Y2%o_8=+.`Q$!? +b0/#ScHstee'uq"f@em4gtgiEi8N\UjQ5OdkNV6rlg4!*mdKW6nc&([oCW%T!quB_rV6Egs8)Zj +rqu`no_sFAJcFI(J,~> +JcC<$JcEUemf*+^r;??erVHNhqY:$`rq?6^s7@(nS=uj_Yd1O=XfA:rVbU,e;,ZiMmHsl=s6B[M +rosIH!9a@Ds5burj5].XiS`YOhVI#CgY1B7f[na+e^W*sdF$=ecHXSVbK@oIa2Z*:_ns:+^V@Lr +]_mBTJc:3"J,=cr?N4:/>5q_T<`ad#H?j^VEc,W)A7JtQ>[1cK@V'+_B4kd[NK&s3EdMqWC2@g- +Fa&0%HiA?aH1cFYGlr;8G'irGDOMrb_[Qr,(_:qJYnAs)7pT!,qjSqeuLPq/67Pr,;RRrc.mU!-.pU +s)IdPrGhgW!-.sV!-.sX!-A$ZqfVp^s*+BdrHeKks*aQhr-eNm!-eE]rb`!VAnG[f@q&t\r)b]tV7t_Sa=2`lQ6DbKS8Wd*^:jeCE1& +g"P39h;7&IiSrnYjlY^gl07L!m-O--n*fc9rpg*]o`"Lbp@n=[q#C0iqY^6ir;HTdrdk*#s4[L'~> +JcC<$JcEUemf*+^r;??erVHNhqY:$`rq?6^s7@((;cm:5@U`bQ>?Y-1=[5DF77Q_5mHsl=s6B[M +rosIH!9a@Ds5c&tj5].XiS`YOhVI#CgY1B7f[na+e^W*sdF$=ecHXSVbK@oIa2Z*:_ns:+^V@Lr +]Mql);ZKerl;#X>l;#a;k;#O8k:]=/j:]4,h;>F&b;?'Jm;=RK]:B4/e:]=,h:]4#k:JO\^;#F/j +;#X8j:B+,i:B"&h:B"&f:A.Hb:f1'^:\7K`:B45j:B45d;#sKhpJClc!)WYlrD3Yp:ejb^;#F2e +;#O8j;Z'Di:]OAl;Z9Pn;?0Sn;#O8h;Z0Mq<)Z`p;?0Ym<;KSq<)rlr%T$"u;G^7e9h\5R8k;NA +r) +JcC<$JcEXfmf*+^r;??erqcThqY:'arq?6^rq-6^"4c5gli$2OlK/$)#3"QH>$"g.rTsRMs6BUJ +s6'IGroQ-#jQ,@]io/kSi8C2.HtDJXopG(5-rJq\l4L5:\]rjrZ?Njk%tH$t3r +LQ.CWO,rgmrfR,A!0R5C#*G"/O,f3ZrJ^]7!0$o8!/gc3r.k3)pP&Hsq1\Tu!el;\rIafs!/:E* +"+u2VK)U?"J,t4OqLJ]uIt.BFr-n]qrI+Efs*O]l!.4]kqK`*ercnKgrHJ9d!."Qir-A9f"*o-: +H2DjcH2VsgH$]I8!d]3?rH\Hhr-J?h!.=EcrHeKhqKi*c!.+Qird=`os*Xip"+5NFIf"WpJ,k)u +IKb4MIXcluqg\QpoRR!ordt?,KnbA&rK.&As-!DGs-!DGs-3JIs-NbQ +&Xf#SIscTgH[9mWCiXE0CMn:m;uTbp6.l/r`T5&&6[)r>[2]L[^W`S[^``cN)5hbl>lcb5KNZbkoQ`b4j$XG5ZXbGlN'fHN/
  • ,7L51P?M2@+Jret?HNfT6_OckllQ'IZ%R$a>3S"-%@T:hmPUSO``Vl6VqXKAY/Yd(O@ +[C3QS\[oGd^;%J#_SjF5aN2NIbg+M\dF-Lne^rF+g=k? +JcC<$JcEXfmf*+^r;??erqcThqY:'arq?6^rq-6^".uBhYPtd8Y,\CrVP^2e;c6Ij;Z5t^li68L +l2TrIkPjU#jlGL_j5T%Vi8EMLh;-l@g=k64f@SU(eC;podEp4bcHOJTb/q`F`l5m6_SX.(^V7Co +]DR9ZJH1?Zt96>%:T6JU_umGB\+ID/!Qk@UEAE@q9%YrFZ(C&q5h"NdPf$ +FeihkEH65IH[C'bo6^I_qKW'crH\'\rHSWmH$OXYGBS0)Fo$4ZFo$4LFTQZ+F7=5MEW9tYDfPbq +s)7mUqJZ=Mr,;LPr,:t?qec@Ls(_XOD>e8ND>S5LD>nAND?"MPD(N@hr*JQj5f=ak3)!nlKdg'mI'H3nF?MK!V>s_o`Fj]p\jmeq>^ +JcC<$JcEXfmf*+^r;??erqcThqY:'arq?6^rq-6^!`iK3raH.@?!:<1=BJX-r^HiVrTsRMs6BUJ +s6'IGroQ*"jQ,@]io/kSi8O2b;ZK_o;>=&b;$Bir<)cdonkoEbqb[>kr_r_m"]8)n;H$Nnk;?0Ym<;0Dj<";\u;,:+h:f'hY9MA#N7/U!_<;fhn(N@hr*JQj5f=ak3)!nlKdg'mI'H3nF?MK!V>s_o`Fj]p\jmeq>^ +JcC<$JcEXfn,E4_r;??erqcThqY:'arq?6^rq-3]"5;\sm/HAQlK8**%cH=*iE08c='4hUlg*j$ +rojLJkNDj,3p#G`j5].XiS`YOhVI#CgY1B7f[na+e^W*tdF$=ecHaYWbK@rJa2Z*;_ns:,^V@Lr +]XtbER[TY4p6bfF!1HrfmPNQ^@Z< +&=JoFI=-?gH?OILDes6(Dfu"Wr`&hrq,[GqrE'&'r`]M/=BSg1r`B_7aN7[tKVl2e\$i`PZETLd +r1j.brhTV:rQ>/aqTf,ep<```"jP67bfe3/b5KNZbkoQ`b4s*YFoQX`GQ2pfH2`-iHiJKmIK+cr +J,Xs'JV&K+K7no3re:T3Ll$tGMuJZJNK0'\OHPcjPa.N"Q^F20S"#t?StMdNUSO]_Vl6SpX0&M- +Yd(L?['mEQ\[oGd^;%J#_SjF5aN2NIbg"G[dF-Lne^rF+g=k? +JcC<$JcEXfn,E4_r;??erqcThqY:'arq?6^rq-3]%&'W%Yd(I:X/MkkVPF-e$;OJs;,ZcIlg*j$ +rojLJkNDj,2ZtD3=qk@R<`Xd"I!TsWEc5`*An5=W>[:ke;ND>eAMD>nAND#eJODQhZsER/i]TS,A]TRJrTPQfOP6FoQX`GQ2pfH2`-iHiJKmIK+crJ,Xs'JV&K+K7no3re:T3 +Ll$tGMuJZJNK0'\OHPcjPa.N"Q^F20S"#t?StMdNUSO]_Vl6SpX0&M-Yd(L?['mEQ\[oGd^;%J# +_SjF5aN2NIbg"G[dF-Lne^rF+g=k? +JcC<$JcEXfn,E4_r;??erqcThqY:'arq?6^rq-3]&6W:I@U`bP>$+g,=B/I+=[2mS#"ItGlg*j$ +rojLJkNDj,2AoY4$#DR/iY^S5!M1l4$#;Z2)I'C0.ee31Gq!G2)I3K1egh@/j;NZ92/8\ +;c?OlrDNVlr)38fr_ibnpJUib"]A8u<)Z]c;?'Pk;#jMn;uKVo;$9]m;H$Nnfs%i\mn50*[!)EAdr_j;k;>sJn;?'Mq;,C'f;#O8i;Yj>l;?0Yl<;0DitQC!u,R[]e;St;UKTqeEZVPgAlWiN8(YHY:;Za@0L\@K2`]Y;.r_SX71`lQ6D +bKS5Vd*^:jeCE1&g"P08h;7&IiSrnYjlY^hl07L!m-O--n*fc9o()DDo`"Lbp@n=\q#C0hqY^6i +r;HTdrdk*#s4[L'~> +JcC<$JcE[gn,E4_r;??erqcThqY:'arq?6^rq-6^rpg9Tm-O-,lK8**%H-4)iS`SJ?!CE4=R,2M +klU)3kPjTEjlHF$1ZIBPi8EMLh;-l@g=k64f@SU(eC;sqdEp4bcHXSVb/q`F`l5p8_SX.)^V7Co +]=PPBRf8`KR/`NPR/`L/EGfW-NeDk3It)'CWi;niS!]P(MM[+>I!KmZJV&N+K8,)8Ll/gWEjM"S +S!SGJK858CqiLftK_gDuLAuu-K`-Pt +K`?c*KE[![JV&H(r."g!JGOfuJ:E(HIf+ZuIXQWlIJ8-hHi8?jHMVpeHN&3gG63#5GlE$eH2`*l +H$FU[qfr'brceHhHN&3iH2rq3(cAs-3PKs-E\O!LT5PR/`Qc +Jp_rmH?j^TD/aE/C2\2m;uK\p$+p2=oMM6=ie]iCQ#='\$rfS['Hp'r1j+a +s/#b;rQ52bc-?.2s3LDcr6GAfr6,)^r6+u]qTAl]q8rYYs)n?brHJ9ds*=Tis*OcnrdFfq!.Xuu +s+(0%rdt6)L&Qf1LPUeDMMqImArVk4OHG]hPE_>tQ^F/.R[]h +['d?P\[oDc^;%J"_SjF5a2lEHbg"GZdF-Lne^rF+g=tE=hV[8MioB+]k2tmll0@U$m-X60n*ol< +o(2JFrq-?dp\4[^s7u]kqtpBjrVcBfJcC<$gAc[~> +JcC<$JcE[gn,E4_r;??erqcThqY:'arq?6^rq-6^rpgGsYd(I:X/VtmVPBsdV$Nll<)ZXk;X3QG +klU)3kPjTEjlHF$1ZIBPi8EMLh;-l@g=k64f@SU(eC;sqdEp4bcHXSVb/q`F`l5p8_SX.)^V7Co +]=PP)K):,uK)U?$JcLB!J0A6)?!M,S?=72M<`ad!H?aRREG]H'A7AnO>$GKHA7T7`rFl4j$X8.( +OaMUnD/aQ?H2DsfHM;aeI!bj=qK`$a!."6^s*4WiH2W!eGQ)d^FTHT*qfMg[qK2:Ns)e9^n8ePK +s)8'YEH#mrDuO_PDuOYODu=SRDZO`om;Df&]7VNJi^PMMR"1I#EpXMZ8V7Q2I!CR/33NRf8fSRK/cTR/<65R/_:.FoQX`GQ2pfH2`-i +HiJKmIK+`rJ,XuuJH1<$K)pXZre:T3Ll$tGMuJZINK9-^OcklkPa.N#R$a;1S"-%@T:hmPUSO`a +Vl?\sXKAY0Yd1UB[C3TU]">Vh^VI\&`5Ta:aND]Mc-FY_daQ^rf@S^0gYCWAhr*JQj5f=ak32'o +lKdg'mI'H3nF?)?oCMVRo`Fj]p\ssfq>^ +JcC<$JcE[gn,E4_r;??erqcThqY:'arq?6^rq-6^rpg%rraH+>>$+g+=B/H$=U/%s77K^8lK\?4 +!pJh1roO7CjSn0oio/kSi8sJj;#jMm;uT\p;$Bcn;H$Lnr`&qtpf.Ap;cfs%i\mnPK0[!)EDer_EJhrD!Jk:/=\_qbd>gs%`Sis%`Ph +!)EJgrD*&^s&&Jcq+q&er)!Dhr)!2d!)WYjr_WVlrDj;Yj8i +:]OAl;Z9Pn;ZBPp:Jamc;>jDi;u]_q;u'Deb0/#RcHjnde'uq"f@em4 +gtgiEi8N\UjQ5Odkiq?slg4!*mdKW6nac8BoCW%T!quB_rqQNhs8)Wirqu`no_sFAJcFI(J,~> +JcC<$JcE^hmf*._r;??erqcThqY:'arq?9_rq-3]rUL`fm-X6-kMtR]iSieUiSWJHgeh6X='5Id +s60LGroO7CjSn0?io0mp0AkXBh;$c=g=b-1f@JL%eC2jnd*L"_c-4ARaiMQC`Pod4_SO%&^:h1k +]",A?Rf8`HR/WElI@lmkMLg/)JV.QGWMQGaR[98!M1pY5I!9gcJc:97KS+o4LmkrgOdWe?dWg1j +KnkZ`OT(=3OT(C@P5C@AOSt1>NW"h6NW4q?Mi*@IM#<&+LA$>sK_pK!LAuu-K`-PtK`6]*KE6^W +rIOls!J,duJHC@OJ,=]mIfOrrIJ8-hHiABmHiA?fH2`-hH2VpiG^"FZHMi'eHN/3iH2;dbH2W!c +Gl`50YL]<21M#iKlr/:`;NfT8"OS=nCPE_;sQ'Rc'qj8%bR$jA%IXQTjH$41CDf0B,DK\tW<;onn +?Y34=^"u-=:\QUaBWbL['mHQ[^NQKYd")$qP=.frlGAebK@uNc-?.2s3LDcr6GAf +r6,,_qoel\qTAl]qoSeYrcS6arHJ9d!."Nhs*Ocnrd=isIt.HJ!J,k%K6)^"Knb>;Ll$tGMi3S"6.BTV8'SUnsrdW2cl!Xfek3Z*UgF[^WfY]=bhl^qmn*`Q#s>aihoQ +cHjnde'uq"f@em4gtgiEi8N\UjQ5Odkiq?slg4!*mdKW6nac8Bo^r.U!quB_rqQNhs8)ZjrVZWm +o_sFAJcFI(J,~> +JcC<$JcE^hmf*._r;??erqcThqY:'arq?9_rq-3]rUL`+Yd(F7Wi)\jV50raVPU&_Ude6\;,[DX +s60LGroO7CjSn0?io0mp0AkXBh;$c=g=b-1f@JL%eC2jnd*L"_c-4ARaiMQC`Pod4_SO%&^:h1k +]",A'K):,uJcLB#K)^E#J21DREGfGu?!q)N=&j`sHZsRPDes&sA78eK>@D#PA7]@`AnPe&NK%k! +M0,G,DJsT?H22gdHM;dcI/eNhH16(YGl`/8rHSn>QD/O4iDZ"AND#S8ODZ+GMD?+VCDYe;HDZ=SP +DZ=YTDYJ)LDY\2NE;XYOE!1)uE,fmqDuanPE;aeUEWC+XDuanUEr0tWFoQR`FoQUdGBeB2H2i3j +Hi8BfIf+WjIf=fsJGt*1H?!nBE,KK,AnP^d@Uj"KrD`brq,[DprE0&%)c9F/;,C+e;Gp=fPa,$N +Fc26=Mi3IMLk^Y3Mti20MuJtBQ^Ic=pR(fF!1NnVr0dVRrL!GJl^7WmrcS6arHJ9d!."Nhs*Ocn +rd=isIt.HJ!J,k%K6)^"Knb>;Ll$tGMi3S"6.BTV8'SUnsrdW2cl! +Xfek3Z*UgF[^WfY]=bhl^qmn*`Q#s>aihoQcHjnde'uq"f@em4gtgiEi8N\UjQ5Odkiq?slg4!* +mdKW6nac8Bo^r.U!quB_rqQNhs8)ZjrVZWmo_sFAJcFI(J,~> +JcC<$JcE^hmf*._r;??erqcThqY:'arq?9_rq-3]rULS0@U`bO=]\X+='/U.>$4s0=Z-1I!(QtP +s60LGroO7CjSn0?io0mp/`5F@h;$c=g=b-1f@JL%eC2jnd*L"_c-4ARaiMQC`Pod4_SO%&^:h1k +]",B>;uT`7.Q]OG0eFn,/MB%>5s@Fp4#o5Y2)?s@0J5!W1(Q2t1c$sG2FUA:2a0Js<)EQl!*&_k +r_`SkpJ^NYrD<_r;cH^p;Y*cb;Ys;k;Z0Pn;?p&q:f1+h;cN`r!*&\m!E2nn;?'Jl;?'Jl;?'Jm +:B45j;>sAj:]O;j;#X>e;#4#l:f1(d:\.E^:]F2e:]=,h:]4#k:JO\^;#F/j;#X8j:B+,i:B+,i +:B"&e:A7Nc:f1'_:]!ug:]!ug:]+&b;>sAi:]OAj;#a>f;#aAq:JO\];#=,f;#O8j;Ya2i:]OAl +;Z9Pn;?0Pm:]F8k;$'Qk;>jDj;u]_q;u'De5MJ#u +Q^F//S"#t?StMdNUSO``Vl6VqXKAY/Yd(OA[C3QT]">Vg^VI\&_o9X9aN;WLc-FY_daQ^rf@S^0 +gYCWAhr*JQj5f=ak32'olKdg'mI'H3nF?)?oCV\So`Fj]p\ssfq>^ +JcC<$JcE^hn,E7`r;??erqcThqtU0brq?6^rq-3]r:1$]mI'B*jndsHhqm2FgXt"W>$+j.kih4/ +k5XNCjSn0?io0mp/`5F@h;$c=g=b-1f@JL%eC2jndEg+`c-4ARaiMQD`Pod5_SO%&^:h1l]",BN +Rf8`HQo(.VCndA\Lk0l$Jq@X7W26AaR[91tMhck4H[0d`JV&Q/KnbAi +OSk1LkpnEMYrG5N<5-$O8b4@Onk.FPEM,oQ'IZ$rKdSQQ^@Z<&Xf)VJpVlmH$=FNCiX?,CN%=p%l0>$:i,%p?up>^;dH[^W`S[^; +Ll$tGMi +JcC<$JcE^hn,E7`r;??erqcThqtU0brq?6^rq-3]r:1$]Z*CI4W;`[nV#[CkU^EroUJ=]a;,ZWA +kPjWDjT+B@irS/urnoBchVI#CgY1B7f[na+e^W*tda?IgcHa\YbK@rJaN)9=`5BI.^q[Us]Y(hd +\c.3XJbaorJ2:G3H#db5@9d/K@9.l,H[BsZEc5`,ARo1T>ZtQGA7]@bBP2$mNf@1jI!:9qCi=?: +GC'%2rHeEhs*FZkrd=`mqK_RTs*=Hcs*+HcqK;gZqfMg[piQ.Ns)e9^n8ePK!cW'rrc%jTrc%^P +rbhUOrG_XPn888DDYn;ND#\8OCi0,es)%^Pr,)FLrbVXQrGDIM!,q=DqJZ.Hrb_UO!cMsop2BtK +qJZCQrGVRPs)7pV!-.pUs)IdPrc.pX!-.sV!-.mVr,hm[rcJ0_s)nHfG^014s*=]mI/SKgIf4]k +If4cpJcC<3F)Gr9DJX*$AS#Ia@V&L;<;fhn/8LPUeDMMmFPNK0'\OHG]hPa.N"R$a;1S"-%@T:qsQUnjlcW2ZetXf\e2Z*UdE +[^WfX]=bhl^VRe)`Q#s>aihoQcHjnde'uq"f@em4gtgiEi8N\UjQ5Oekiq?slg4!*mdKW6nac8B +o^qhLp@e7TrqQNhs8)ZjrVZZnoDX=@JcFI(J,~> +JcC<$JcE^hn,E7`r;??erqcThqtU0brq?6^rq-3]r:1-`@U`YI='&L+r`K5)r`T5(#[9M^7R]f1 +ki_s-s5a7Aro4%=iVqaehqm2FgtUQ:g"=p.f%&:"e'cXkcd'h\bfe/NaN2E@`Pf[2_8*h"]tD"h +\[hQ8s&/Ph),qt=3ArZI/1E,%/iGpZ5!;%k3]8oR1GLT_/eTlo1GgpG2)I-J9i3H!4uGu1;"IT` +;>X8e;smQ_;$Bir<)cdoo25Kbqb[>krDW\n#>n;o;,U:j<;okt<;0An;ca8i;>sJg;?'Go;,Uj;j:]XEir_`VlrDW_os&8bnp/Uid&62\+:/Fec;,BkX9M8#N8Q5UfrDi\pr)`i!r)j1f +5X.Iu5lEtR/8LPUeDMMmFPNK0'\OHG]h +Pa.N"R$a;1S"-%@T:qsQUnjlcW2ZetXf\e2Z*UdE[^WfX]=bhl^VRe)`Q#s>aihoQcHjnde'uq" +f@em4gtgiEi8N\UjQ5Oekiq?slg4!*mdKW6nac8Bo^qhLp@e7TrqQNhs8)ZjrVZZnoDX=@JcFI( +J,~> +JcC<$JcEain,E4_r;?BfrVHNhqtU0brq?6^rq-6^r:9jWs6]pQk5FB@iXb)-hqm5Gg=F]saBVkM +=6KSFs5a7Aro4%=iVqahhqm2FgtUQ:g"=p.f%&:"e'cXkd*Bq]bfe2OaN2E@`Pf[2_8*h"]tD"h +\[f5=Rf8`TR/`NKR/WF/Hto7?PDFd>IY)9GXf/%iS=5b,M26q$+p2=]ea-=ieZkJ>0K\\$rfR['Hp?USI[]"/X&YaSs<\b6,o1 +bg$%1!71>brQbMibl#Zab59B]bQ>u3bkoQ`b5B?]ErL.YFT6L`G5ZXbGlN'fH3/G@I/\PDIXcit +J:W9'K7ei1Knb>;Ll$tGMi1:Za@0M +\@K5a]t_=u_Sa@3a2lBGbg"GZdF-Lne^rF+g=tE=hV[8MioB+]k3(sml0@U$mI'H3nF5u=o(2MG +p%A%P!;HHes7u]kr;6KkrVcBfJcC<$g&HR~> +JcC<$JcEain,E4_r;?BfrVHNhqtU0brq?6^rq-6^r:9jW"0o&2WVrapV%9H"UnjiaVPKrXRo3-] +;CdIH$4:LDJ<]oA7/\I>@V2SAnM$T%VTI7NH00!Gd;.' +E--;Mp3Zaar-SEh!.4]ms*Oclr-A-`!."?as*=Hcs*+HcqK;gZqfMg[piQ.Ns)e9^n8ePK!cW'r +rc%jTs)@dPrbhUOrG_aS!cDppmV_o=s(q^N!GlWOD#\ANDZ"AND#\>PDZ+GMDZ=YDDYe;IDZ4MO +DZ=YTDYJ)LDY\2NE;XYOE!(#tE,kbo!-.pU!-.sVrc.mW!-/!W!-.mV!-A'[rcS0]s)n?bs*4He +s*=]mI/SKmIK4fpIf4]jIf=fsJGt,uJcL&oE!pQ"Bk:me@Uiq\<)ifrq,[GqrE/o!s%rbmrDESk +s-3X`BR]r?s,6o7",M\dI//X"Mu8h?QN!9OQhZsDRJiWRRfAfRR/**JQiNKEQiM1+F8^4\FoQX` +GQ2pfH2W$jH[L5?I=H]qIt3'#JV&N,KS5&6L51SAM2I4MN/`jYO-#NfPE_>uQ^F//S"#t?T:hmP +USO`aVl?\sXKAY0Z*L^C[^WcW]=bhl^VRe)`Pom=aihoQcHjnde'uq"f@em4gtgiEi8N\UjQ5Oe +kiq?slg4$,n*fc8nac8Bo^qhLp@\L\rV6Egs8)Zjrqu`no_sFAJcFF'J,~> +JcC<$JcEain,E4_r;?BfrVHNhqtU0brq?6^rq-6^r:9jW"CbbC=BPQ+s&f>*r`KV4>?kE:>$49_ +7RcM>k5XNCjSn0?io0mp0&POAh;$c=g=b-1f@JL%eC2jndEp1ac-4ASaiMQD`Pod5_SO%&^:h1l +]",A]r)?_1_Vc(2)@*a:GG$u7Slr[ +:fL=j;cEHhrDEAgq,?ra!)renr_Wes<)cdoo25Kbr)*JlrDW\ns%rqr;,U:j<;okt<;0An<)WWk +r_WSks%r\ls%r_k!)WYlr_NPjs%iVjr_`GeqbdAis&&;_r_NPhqbR2d!)NJe!)NSjr)*Ghs%`Ph +!)EMh!)EJgrD*)_!`2`jpJ:Z_r_NDfs%iPhq,.,erD3Jkr)!DhqG7An:esh^:f.!crD;Ll$tGMi1:Za@0M\@K5a]t_=u +_Sa@3a2lBGbg"GZdF-Lne^rF+g=tE=hV[8MioB+]k3(sml0@U$mI'H3nF5u=o(2MGp%A%P!;HHe +s7u]kr;6KkrVcBfJcC<$g&HR~> +JcC<$JcEain,E7`r;?BfrVHNhqtU0brq?6^s7H<^r:9jWs6pB]kN1jgkN(X_iSXXk'\qBkd)sAD +='A^-=Q\`+jQ#:[io0mp1uI0Gh;$c=g=b-1f@JL%eC2jndEp1ac-4ASaiMQD`l5m6_SO%&^:h1l +]",A][[NYQR$di=pm7=NeW"6IXu*FX/W"lSXGe,MMR">H?aX`K7\c/K8##8LPrc]\"'(i +H$k*pLQ.FZrfR&=r/^c;r/^c;rfR2Cr/gu@rf@&=!0-r9qi(`;Mi*@Ir.k3)p4`9prIt$$s+UK+ +rIaitre:B*!J?"&JbjopJcC6#J,=]mIg(:LI=-HkpjE*grHnZnH@#C4s*FZiqf`*eH@#O8r-JBf +!."HdrH\?dr-@s]s*Ocnpj;g_s*=EdrcnNjHiA8r6,,_qoeu_s2tDdqo\u^rlP1[s)S-\r,hs]s*"?bs*4Qhrd+Tk!.=co +s*artrd]'@JqJ]/KS>/8LPUeDMMmFPNK0']OcklkQ'IZ%R$jD4S=Z=ETqS6WV5C/hWiE/&Y->.9 +Za@0M\@K5a]tV7t_Sa@3a2lBGbg"GZdF-Lne^rF+g=tE=hV[8MioB+]k3(sml0@X%mI'H3nF?&> +o(2MQp&F^cp\jmeq>^ +JcC<$JcEain,E7`r;?BfrVHNhqtU0brq?6^s7H<^r:9jWs6q57Wi2kqWhuViV50o`VPg;dTq.X= +:/Xqd;Wd*%jQ#:[io0mp0AkXBh;$c=g=b-1f@JL%eC2jndEp1ac-4ASaiMQD`l5m6_SO%&^:h1l +]",A][ePFRK)1$BJ6l5tE+rfg@:3ME=+YmJH?XFMD.mQn@pN;D@Us"\A7]EQBF\a9=+bdAKkbFD +F*;hUI.hpcHMi-gH3ASBI!^5>HMr-cGlN'bGlN'cGlN!eG5?@\F8U.ZFng(NFT?O_F7=5MEOD>A&MD/T2e!,VXMs)%^Ns)%aQr,)FLrbVXQrGDIM +!,q=DqJZ.Hrb_UO!cMsoq/6:QDuOYNDuXeSDuFYSDuXbVEV=AOEW0qUEW0tYEW'kRErU4YFT6L] +FT6IcG'A1UrH\Eh!dfJV&N,KS5&6L51SAM2I4MN/`jYOHG]h +PEhE!Q^F20S"-(AT:qsRUnsrdW2cl!Xfen4ZEppH\%&u\]Y2%o_8=+/`Q-'AbKS5VcdC1ieCE1& +g"P39h;7&IiSrnYjlYail07L"m-X60n*ol;o()DErq6 +JcC<$JcEain,E7`r;?BfrVHNhqtU0brq?6^s7H<^r:9jWs6p4u>$5$5>[%&.$!LP`5BI.^q[Us]Y(hd +\[]*I;u9Ji;uKZ;-nmV=1G:4//1rk>5X7Ot4$#>Z2`*6C0.nk41GUdCr\Op=1c8#Z2a0)k;#X;o +<)QXor_rVjrDE;eqG[)cs&8kor_Wer<)cdoo25HarDESmrDW\ns%s)!;,U:j<)cjt<;0An<)WWk +rD3Jkr_WSks%r_k!)WYlr_NPjs%iYkr_`GeqGI8hs&&;_s%iYiqbR2ds%iMe!`)Whr)!Gjr_NPh +s%iYis%`VirD3Aep.k`d;,I!_qb[8fr)!Dhr)!2d!`2ZgrDi<<#kt<)``prDNqu:f0ta;,C$e +9*7dZ6WF"aq,[GqrE/hts$-KJr]pch<'s5O:esmd;$9fp;H$3`=oD=tqu +<)`co!)rhqr`/bnr`/tt!*/nqrDW`9s)S-\r,hs]s*"?bs*4Qhrd+Tk!.=cos*artrd]'@JqJ]/ +KS>/8LPUeDMMmFPNK0']OcklkQ'IZ%R$jD4S=Z=ETqS6WV5C/hWiE/&Y->.9Za@0M\@K5a]tV7t +_Sa@3a2lBGbg"GZdF-Lne^rF+g=tE=hV[8MioB+]k3(sml0@X%mI'H3nF?&>o(2MQp&F^cp\jme +q>^ +JcC<$JcEdjn,E4_rVZKgrVHNhqtU0brq?6^s7H<^r:9mXrpUorl/q3nl0%'dio/hQhqd)>e'6"O +^:LdZ>$+j.ro=%<38rfRhr!;Hh;$c=g=b-1f@JL%eC2jndEp4bc-4ASaiMQD`l5m6_SO%&^V.:m +]",A][^MWmR@*o=qj@DM+FSWMR?NYcIXcftBP+3?VP'HGR#[,[L4OYqGCY6tK7s5Y%Z-"R]Si#e +No521K8>DHrf[8CqN1W9s,d8A!0I&rK`-W" +LAuu,K`6VuK`6]*KE6^WrIP!!!.XrtqgecuJ,=]mIg(:LI=-Hkpj<'grI"Wls*FNerd+Ti!-nEc +"*f*;HMr-fH2r6cGl;peGl2jZH2r$+j-=ie[%O0H($\$rfR['Hp?U].(gV>J=5aT0K] +b5fc_c2c2ad/;2jcHQ40s2t8_rQP&[!m8X,rGhjXs)\*[s)n?brHJ9d!."Nh!df.9Za@0L\@K2` +]tV7t_Sa@3a2lBGbg"GZdF-Lne^rF+g=tE=hVd>Nj5]4^k3(sml0I^&mI'H3nF?MK!V>s_p&F^c +p\jmeq>^ +JcC<$JcEdjn,E4_rVZKgrVHNhqtU0brq?6^s7H<^r:9mXrpU6_XJr5"XJr%nVZ*D&Vl6MiU7[sC +QB[S3;c-Ciro=%<1u[BNhr!;Hh;$c=g=b-1f@JL%eC2jndEp4bc-4ASaiMQD`l5m6_SO%&^V.:m +]",A][^Ps^!.t-"s*uk0>ubl^Bk(FV?t*5=IX?BbF`MJ(D +Ci468GC0=:o6UXeH[C'bHi/3gHiA?iH2;dbH2;dcH2;dcGQ)daFTQZ-FoHI[FT-FXFS'\UFT$:N +ErU+_E,TZ6DfG\os)@mS!H;uUDZ"GNE;jbWDJsIiD?+PLD?4TlqJ?@OCMRa'rG;LNrGMOMrbVFJ +r,2OQmr%u?q/61KrGMXRs).XN")r0rDYe;OE;OSQE;jeHE;sqWE;jkVEWC+XDuanUErU4YFT-F\ +FT6L`GQ2peH2`*kH[L5>I/n`qIK+cnIJSBpIsultrIOlus+:f'E,]`6Chm]qAn>O`AnM$Bq,[Gq +rE/es!Er=u;?'JmPmpr;LQ.:PMi3IMLk^Y3reg]5rK[DIs-3SMrKmSOpmCoG!1NnVr0mYRqj@8I +rL!8ErGhjXs)\*[s)n?brHJ9d!."Nh!df.9Za@0L\@K2`]tV7t_Sa@3a2lBGbg"GZdF-Lne^rF+ +g=tE=hVd>Nj5]4^k3(sml0I^&mI'H3nF?MK!V>s_p&F^cp\jmeq>^ +JcC<$JcEdjn,E4_rVZKgrVHNhqtU0brq?6^s7H<^r:9mXrpU-\>?Y69?X3M3!a8i7ra#V1>5hY. +=@>SI77R::s5Gloi8EMMhVI#CgY1B7f[na+e^W*tda?Ihcd'eZbKJ#KaN)<>`5BI.^q[Xt]Y(hd +\[])Vr_r\lr_r_o(apgd2Dd-@.kE5(3&Wuc4Ztkf2`EWN1G\q^(,I^'1Gh!G1c7-b:c:I$7p8_d +;,U@lr`&kqs&/korDNSkoht]dqGI;lr_i_or_i_m"B&2u;c<0`rDNVl!)i_nrDEu":f1+g;cH^r +l;#a;k;#X>k:]F8k:]F8j;>k:A[id:&n)e +:B+,i;#F/j;#X8j:B+)i:B"#h:Amue:A7Nc:f1*a:]!uf:]!ug:]4,b;>sAj;#aD_;#a8j:]4,e +;>sDk;>sJj;?'Mp;,I6h!)ibm!E)bi:]F8k;>jDf;ZKer;ta5h<;]Yr<)Zcn;[uZ$;,C(d;G0\V +91hiN6iL*]!N!Or]pch<(';Q:espe;$9co;H$3b=o21rM2@+JN/WdXO-#KePE_>uQ^F20S"-%@T:hmPUnjlcW2cl!Xfen4ZEppH[^`lZ]Y2%o_8=+/ +`Q-'AbKS5VcdC1ieCE1&g"P39h;7)JiT&tZjlYail07O#m-X60n*olHncA@Srq6 +JcC<$JcEdjnG`=`rVZKgrVHNhqtU0brq?9_rq-6^r:9jWs7$!Us6(;N;AM9N/EIKr.k3)p4`9prIt$$s+UH*re'ru +re:B*!/(3#s*t*!rIFlu"G22UIt.?ErI=fq!e#HEpNusfrHnTlrd+Eds*FZiqf`*dH$]F7r-AEi +G^912r-A9dr-@s]s*Ocnqg/BjH[GR7s*=EdrcnNjHiA?iHiSTlI/\O!I!pElIXcitqLABms*sut +oR[$ordt3(r.Y0*s+gT0",`"pN;\b7O84q8Op.&6Q'@Q!rg*SL#*tUAQ^F20rgE_R&Y"`-I!U-a +GB.M;Dej!'G#_Q<5hS8=ie[,QFF<2\$rfR['Hp?USIdaqSrZYaiaP)!6k;b!71Ac +r6GDhbl5cfb0.rMqof#`pWET[ao$/XErU4YFT6L`G5c^cGlN'gH3/G@I/\NpIXh?ICk71jK7nr4 +L5(J>M2I4MN/`jYO-,TgPEhE!R$a;2S"6.CTV8*UUo(&gWN*#$Y-5(8Za@0L\@K2`]tV7t_Sa@3 +a2lBGbg"G[dF-Lne^rF+g=tE=hVd>Nj5]4_k3(smlKdg'mI'H3nF?MK!V>s_o`Fj]p\jmeq>^ +JcC<$JcEdjnG`=`rVZKgrVHNhqtU0brq?9_rq-6^r:9jWs7$!U"KSW,XJl&o8uJYfVkg&YR@';( +OcYW%;c-HQio/kSi8@V2RAS#OfBP1tPrgWhSs-`bO!1*PLrg,7L51SAMMmFPNK0'\OcklkQ'IZ&R$jG5SXuIHTq\?Y +VPgAlWiN8)YHY==['mEQ\[oGe^;%M$_o9U8aN;WLc-F\`daQ^rf@S^0gYCWAi8ESSj5f@bkNM0q +lg4!*mdKW6nc&([oCW%T!quB_rV6Egs8)Zjrqu`no_sFAJcFF'J,~> +JcC<$JcEdjnG`=`rVZKgrVHNhqtU0brq?9_rq-6^r:9jWs7$!U"C,5??X*J3%U*+C?XR8J>Zt<6 +=BAO(r^Ah:j5T%Vi8EMLhVI#CgY1B7f[na+e^W*tda?Ihcd'eZbKJ&LaN)<>`5BI.^q[Xt]Y(ke +\[])V[Jj,&;ZB\m<#d;90/bXA0.SS*0/b^Q5l;#a;k;#X>k:]F8k:]F8j;>h;#*ri:esmc:]OA_:]jKg:J^pc +qbdAirDEPlr)*Gk!Du\h;#jGi:BjWk:Jakb;>jDc;tX/i<;BGm<;KMo<)``l$WBnr9hS2Q91hTP +; +Ll%"IN/WaVO,oEdP*;/rQC+&-S"#t?T:hmPUnjlcW2ZetXfek3ZEppH[^`lZ]Y2%o_8=+/`Q-'A +bKS5Vd*^:jeCE1&g"P39h;7)JiT&tZk2tjjl0@U$m-X60n*olHncA@Srq-?dp\4X]s7u]kr;6Kk +rVcBfJcC<$g&HR~> +JcC<$JcEgkn,E7`r;?BfrqcThqtU3crq?9_rq-6^r:9jWs7$!U=RPPClfdEiio9"WiSNDDe'5tM +^:C\ZZa$^:>$+j.iS`YOhVR)EgtUQ:g"=p.f%&:"e'cXkd*L"^bfe2PaN2EA`Pf[2_SEq$]tD"i +\[f5Z[^EK1R@*lUn3s@P)bEUJphlhG_1O#KnG,6LPLc"Ocm\C +h0OL%LP_+TOckn*Ont1;O8b79O8=t7OT:LAO8k4?NW"h4N,5re:B,s+gW1s,$l9N/[aq!07&>!0I#=rfRAGP*;+.Pl6jOPa.Q#Q^=*;RJrZS +Rh(j:I!g6aG]dnADe`s"QWcs3LDcr6GAfrQG,]nB:fMr,M^Vs)\-\s)n?brHJ9d!."Qis*F`nrd=frJ,Xt;JV&N, +KS>/8LPUeDMMmFPNK9-^OckomQ'Rc(R@9V8St;UKU8+N\Vl-MoX0&M-Yd(OA[C3TU]"G_j^VRe) +`Pom=aihoQcHstee'uq"f\,!5h;-rGi8WeWjQ>UfkiqBum-O--n*fc9o()DDo`"Lbp@n=\q#C0i +qYU0hr;HTdrdk*#s4RF&~> +JcC<$JcEgkn,E7`r;?BfrqcThqtU3crq?9_rq-6^r:9jWs7$!U"n&LrY,eK"VG*qfWi;tpUS"$C +Q^!VoO,f3Z;Gg:hiS`YOhVR)EgtUQ:g"=p.f%&:"e'cXkd*L"^bfe2PaN2EA`Pf[2_SEq$]tD"i +\[f5Z[^EL>uu8kCh7$[?XdJGRM!,2@E$ttW;EfP:E +Ci=<8GC0:9p3Zacr-S9dr-SHir-A-`rH[pXrc\6_rcJ-\r,hp\piQ.N!-J0\noF_L")r0sE;XYS +E;a\VE,T[nDZ"GOE;jeUD?+VOD?+PLDYS)KD#\8OCi0,es)%aQr,)FLqJH.Js)7@DqJZ1Irb_UO +s)7pTq/6@SDf0IhDuXeRDuO_TDuO_UEVOMOE<'tUEW:%ZEW0nWEVa_UF8U+[Fo-:\FoHUbGR&M? +H?jg`H[PX;"+GZHI/SKgIK=qKrIOitrIYW3Ec>u9DJa-$An>L`@XhDR/8LPUeDMMmFPNK9-^OckomQ'Rc(R@9V8St;UK +U8+N\Vl-MoX0&M-Yd(OA[C3TU]"G_j^VRe)`Pom=aihoQcHstee'uq"f\,!5h;-rGi8WeWjQ>Uf +kiqBum-O--n*fc9o()DDo`"Lbp@n=\q#C0iqYU0hr;HTdrdk*#s4RF&~> +JcC<$JcEgkn,E7`r;?BfrqcThqtU3crq?9_rq-6^r:9jWs7$!U"R]W*@:&n89Nte/?t!JO?<^T: +=]\X(`5BI/^q[Xt]Y(ke +\[],W[C#p3r_i_oqc"C\0fV'I0.\P'/M8n<5sILo4$#8Y1c-p?r\"4+">hnk1Go(g#Z!?A5XnpQ +;GmElrD`\ns&/emr)*Mlohkcgr_rkrqGR8j!)ibo!)ien!)iep!)i_ls&/Sgr_`ep;H!EkrDEkt +:f1+g;c?Zf<sDl;>sDl:B45j;>sAk;#a>k;#X>e;#4&h:]aKj:\.E_:]=,e +:]4#g:]!lg:Jamc;#jGl:]F2i:]F2i:B4/g:]4&^:]F;e:\moe:]!ug:]4,b;>sAj;#aD_;#X8g +;#=)i;#F2j;Z'Dj;?0Ph;#jGf:]=2j;>jDd;ZKei@c`8kDWL; +Ll$tGMi +JcC<$JcEgknG`@ar;?BfrqcThr:p9crq?9_rq-6^r:9mXs7#sTs6_&tmd'&sj5]4\io&_Lf$VUX +^Ugk\Za$^;XfSR+=BOM=hYu=cgtUQ:g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pf[2_SEq$^:_+j +]",>[[^EKKR$dQ5s(a6VQ]?iMIsur`Bp,KqURms@Oc,'PJUD`fItE6+L5:S=M2SudZ]q&ZGC"dn +M2hIrs-!ADpQ5?7rfHo9q2kK9!0I/?s,I)=r/CN4"H87sMMV.breC<(!/1<)pk8X#pP/^%re19' +pOrR#re(9(rIOru!.Xuuqgeg!It.?ErI=ir"+>QFIJ8*hHiAElHN8BfH2i3jGlW*eG6<)8H@#R9 +r-A?gq0;g_rcn?dom6Xbrd=]lrd+Tkq0N'dqKi*c!IB+lHMr3kIJ\EkIK"TqI=?\FJGOcgJG"Kn +K)^H-KS>,5KS>-ZLB!#9Ll%"HMi6%h*eL2`ra?(b5BE_bko]cch>``cN)5gbP]NQbPuM[E;X_UErL.YFT6L`G5c^cGQ<$gHN/
  • +JcC<$JcEgknG`@ar;?BfrqcThr:p9crq?9_rq-6^r:9mXs7#sTs6^0[Ycb"(VPgDmri-^4V4sNL +R$EhrO,f3ZN/NTm;,Z?0hYu=agtUQ:g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pf[2_SEq$^:_+j +]",>[[^EKKqLSKns'IC#E,&oj@:*GF=)i_C_q,[GqrE/htr*',)r_`\ls-3V! +J,YE:N/NUOMMR"AI!gj9PEc!1rfdGKQh-U@R/i]TS,A]TRJN;Ll$tGMihr*GPj5]7`k3)!n +lKdg'mI'H3nF?)?oCV\So`Fj]p\ssfq>^s+14's*t~> +JcC<$JcEgknG`@ar;?BfrqcThr:p9crq?9_rq-6^r:9mXs7#sTs6^!V@UWO@=V4kD?=75O@:3AF +>$+j,[[^EKK;cEZnrDWVn)FHqQ2)-d9.kE842EO2h4Zkbd2`a>l;tj2i;uTbm;YX/j;Z9Mn;Z9Sp;Z'Dk;YX,d;Z'Jl;Z9Pm;?9]q +oMkrl;ck:]F8k:]F8j;>k:A[id:&n)d +:'+3f;#F/j;#X8j:B+)i:AI]a:A7Nc:f1'a:\moe:]+&h:]+&b;>sAi:]OA_;#X8f;"[Zc;Z'Dj +;YX)h;#3rj:/=Y^;#X>j;Z'Gs;H$Il;cNBh!*&Jes&Aqs!E)_l:^9ci9hS2P9254_rE&r"pf[Mu +s'#Lg5lO(L<;Ll$tG +Mihr*GPj5]7`k3)!nlKdg'mI'H3nF?)?oCV\So`Fj]p\ssfq>^ +s+14's*t~> +JcC<$JcEjln,E7`r;?EgrVHNhqtU0bs7ZB`rq-6^r:9mXs7#sTs6fmR(?suAjQ>OaiSiYHe'#bH +]XG2QZ*1@6ri61$>$+j.rnT?bgY1B7f[na+e^W*tda?Ihcd'h[bKJ&MaN)<>`P]R0_8!b!]tCtg +\[],W[C!9GR$dW7rbMOK/89fdIXZi\Br\21Tq.R;PDtq2kW=!0[>D!0[;Es-3PKs-3PKs-``cN)5gbP]NRb5cGZDuXeREW:(ZF8^4\FoQXaGQ2pfH2`*jH[Pg@!IfOtJ9-9n +K7ei2L5(J>M2I4MN/`mZOHG]iPa.Q%R$jG5SXuIHTq\?ZVPgAmX/rG,Yd(O@[C3TU]"G\i^VRe) +`Pom=b0/#ScHsteeC<($f\,!5h;-uHiSrnYjlY^hl07L!m-O--n*fc9o()DEo_%nNp@nO\s7u]k +r;6KkrVcBfJcC<$f`-I~> +JcC<$JcEjln,E7`r;?EgrVHNhqtU0bs7ZB`rq-6^r:9mXs7#sTs6fpS'X4^=VPpMpX/`5$Vk]lR +R?j%uNfO*urego:;Gg:hrnT9`gY1B7f[na+e^W*tda?Ihcd'h[bKJ&MaN)<>`P]R0_8!b!]tCtg +\[],W[C!9Gr.4]p!a]5@r`oM6ra-FM<`ss%H['^UEc,W'ARf"O>@V/UAS1pS%;9I9H#epeX_hur +FEi--I.r!dI/J?fHMi-gHN&0jG^'(1rH\!Z"F569GBWq-s)e0[rcJ*]pN6(N"E\^*F*$nmrc&9a +DJsK4Df0K3E,bbo!H;uTDZ"GOE;jbWDJsIiD?+PMDZ=PRDYe2QChmg&D>e;ND>nGMD>nAJD>nGP +DsqT?Du";MD>eAPDuX_NDZarsDJo;hs)@jRrc%jTrc%gUr,;[VE:n5LDuanSErL.ZFT6L[FT6Oa +GQ2pfHN&0jH@,I8!e#HErd=]npjW6m!.b'"r.=`s%toIRE,]`5D/*ZoB4PL_B)>X-=8c7r=o;J% +>6%P";#cd]D2%qJs,.5AM26n@I!h-APa)*2rfdGKQh-U@R/i]TS,A]TRJW?QQ^3s9QiM2I4MN/`mZOHG]iPa.Q% +R$jG5SXuIHTq\?ZVPgAmX/rG,Yd(O@[C3TU]"G\i^VRe)`Pom=b0/#ScHsteeC<($f\,!5h;-uH +iSrnYjlY^hl07L!m-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$f`-I~> +JcC<$JcEjln,E7`r;?EgrVHNhqtU0bs7ZB`rq-6^r:9mXs7#sTs6fpS&n50N=]o!8?XR>S@UWPI +>?P$.r)EVpr^?fVrnTBcgY1B7f[na+e^W*tda?Ihcd'h[bKJ&MaN)<>`P]R0_8!b!]tCtg\[],W +[C!9G;c?Tm;uBVo74q%s6n^&@/1rk?5a>j;uT\o;tO&i<:Wue<<#r2<)lq!;bp4f:fC7f9h\5Q8k;>H5_\*5lX.M<<5ZdrDJV&N,KS>/8LPUeEMihr*JQj5f=ak32'olKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`no_sFAJcFC& +J,~> +JcC<$JcEjlnG`=`rVZKgrqcWiqtU0bs7ZB`rq-6^r:9mXs7$!UrpKgRs6LKajlP[fjl>@Ygss]k +_S*FcZE^U:Y5YL%WB$oS=]ee^gtUQ:g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Poa3_SO"%^:h1k +]",>[[^EKKZE]dapm:tq05>38BP(k*JnJbsW2?8WR[B+pKSY/)H?OpmKS5&7KnkMB]W@OS=h3OT1I@OT(=@NrG%;N;JS7N;e_9M2;(brJ('#q1S^#pP/^%re16& +pk8[$re(E+JUi<&qgeWr"G22TJ:IEErI=ir"+>QFIJA0iHi8?lHiJEgH2i3iH2MmdGlN*hH2`-i +HN8BfGl2jcGl;p[H2rcr6GAfrQG&[p<3DPrbqdTr,MaWs)\-\s)n?brc\EgH$TC8!IK4nI;s^cJ:N3& +K7ei2L5(J>M2@+JN/`jYOHG]iPa.Q$R$jG5SXuIHTq\?YVPgAmX/rG,Yd(OA[C3TU]"G_j^VRe) +`Q#s>b0/#ScHsteeC<($f\5'7h;7&IiSrnYjlYail07L!m-X60n*ol;o()DErq6 +JcC<$JcEjlnG`=`rVZKgrqcWiqtU0bs7ZB`rq-6^r:9mXs7$!UrpKgRs6KoiW2ZesXT#7,WhlAY +R?s,!NfO*urepc52Mk@0;Vg-_g=k64f@SU(eC;sqdF$=ecHaYWbK@rJa2Z*;_ns:,^V@Lr]Xtbc +\@8oS['R'Crdjlqs'Gb4rEU:G>@Cu@Ji!,_OL!Gu`OD?"GPCB86grG;LNrbhUMs(qOK +rGMUQmr%u?q/61KrGD[TDJo8gs)A!Uq/67PqeuIQrbqdTrGh^Ro5XbK!-.pW!c`7$rcA'\s)n3\ +rc\`G6M[G>uLk^Y3I$9bYPl-gGPQ@&9nsK/8LPUeDMMmFQNfT9a +P*;,qQC!u,S"#t?T:hmPUnjlcW2co"Xfnt6Za@-K\@K2`]tV7t_Sa@4a2lEHbg+M\dF-Oof%8R. +g>(N@hr*JQj5f=akNM0plKdg(mdKW6naZ2@oCW%Ts7QHerV6Egs8)Zjrqu`no_sFAJcFC&J,~> +JcC<$JcEjlnG`=`rVZKgrqcWiqtU0bs7ZB`rq-6^r:9mXs7$!UrpKgRs6LJ*=]o!8?XR>SA7AkM +>?Y-/<)Z^p<;]`T<)Z4T7bukSg=k64f@SU(eC;sqdF$=ecHaYWbK@rJa2Z*;_ns:,^V@Lr]Xtbc +\@8oS['R'Cr)X8k;Z]io;>O/j;uT_r;u'>f;uTYq;,[Bl!)i_lrDNDfqbmAkr)3Plr_`er +<)iNj!`W)rrDsDl:B45j;>s>k;#X5j;#X>d;#4#k:f1(co2,E^s%`Ger_5VV)>R!GZ5ZLfV:]4,h;$g,t;,U"Y;c6Omq,I>nr)ESor_ierr)Wes##nN!;H$OnrD`es +!*&qrrD`brs&AqqrGMUQrc%dTs)S-\rH/'^s*"Bc!dK!9rd"TlI/\P6IXcluJV&N,KS>/8LPUeD +MMmFQNfT9aP*;,qQC!u,S"#t?T:hmPUnjlcW2co"Xfnt6Za@-K\@K2`]tV7t_Sa@4a2lEHbg+M\ +dF-Oof%8R.g>(N@hr*JQj5f=akNM0plKdg(mdKW6naZ2@oCW%Ts7QHerV6Egs8)Zjrqu`no_sFA +JcFC&J,~> +JcC<$JcEjlnG`@ar;?EgrVHNhr:p9crq?<`rq-6^r:9mXs7$!Us6fpSrTkTgk3(mhjQ,=Wf[7gY +^:1MVZ*:F7XK/D%WMl\jUnmuls4T0[f[na+e^W*tda?Ihcd'h[bKJ&MaN)<>`P]R0_8!b!]tCtg +\[],W[C!9GZ*9U_qNh2JrbF*#Bk_6nAn>RcAZDZ)TUD47NJiODIscNcJ:iK.KnbANrY4=NW4t7N<"q:MZSclM#E,-LA-DtK`6]!LAuu, +K`-Q!K`6])KEQmXJ:W:KJGk$%Jq8H&J,4WmJ,as"I=-Hkpj<'grI"Wls*FNes*FZirHJ9d"F5<> +H$T@7!df6=q0;g_rcn?dom-Ubrd=]lrH\Hjpj2scqKi-d"aYNBH?sr;HiSTlI/\QnHie_FJ,Fip +J+eBoIt3(CJc13%KSBAXs+UK-s+gW2s,$i8N;eh:NrP.@OH9:#qiUi?s-*AFs-crQbMibl,`[b5'6YDZ4SRE;X_UErU4ZFT6L`G5c^cGQ<$gH3&A?rdAR2 +It3'#JqJ]/Knb>;Ll%"IN/WdXO-#NfPEhE"R$jD4S=Z=FTq\?YVPgAmWiW>+Yd(O@[C3TU]"G_j +^VRe)`Q#s>b0/#Scd:(feCE.%f\5'7h;7&IiSrnYjlYail07O#m-X60n*olHncA@Srq-?dp\4X] +!;ZWjr;6KkrVcBfJcC<$f`-I~> +JcC<$JcEjlnG`@ar;?EgrVHNhr:p9crq?<`rq-6^r:9mXs7$!Us6fpSrTk,rWN3)$X/i>&VkKZM +Q]mPmNrG%:MuSYpM26qB;,L6Fg=b-1f@JL%eC2jndEp4bcHOJTb/q`F`l5p7_SX.(^V7Co]=PP_ +\$i]OZa-j?JV!WIs'Gb4rE]G-(L:6K>CV$GG]\"HCM79i@:*;FA7T7`Ac??BBF8ZuM0#V4D/jZA +HhMj]Hi8?iHN8BjH2i3gHi/3iGlW*fGQ2pdH1Q:\Gli57GPu[`FT$:[FT$@VFS0bZFE;JDF7OAN +E<0uqrGMdUDf9UnDuXbVDuFSNDuFYSDZXfpDt.]GD/T5fs(q^Ns)%^Ns)%aQr,)FLqJH4LrGV1C +qJZ1Irb_UOs)7pTq/6@SDf0IhDZFbRDuO_TDuO_REVseLE<1#urGVaVqf2gZEcQ5BrcJ-^qfMj] +rc\EgH$]I8s*F]l"akZEH[L2;I/\QgIfFrsJc:8sKD^B4Km[lZDfBQ/BP(gd@q're5_\'>lRY#PlQ%+NW4nAMM[.DL4"B4rfm>GrfdDKnX03A!1NnVrL3bSqj7GOQBqK9rg/8LPUeEMi +JcC<$JcEjlnG`@ar;?EgrVHNhr:p9crq?<`rq-6^r:9mXs7$!Us6fpSrTk5%=^56>?t*_Z@piSI +>$"a(;c?Xpr)GjY;c?Xp77Kc#g=b-1f@JL%eC2jndEp4bcHOJTb/q`F`l5p7_SX.(^V7Co]=PP_ +\$i]OZa-j?;cH[oqc*Sa*CN7`6UX:.6UO1/5sILo4?>G\2Dd'@0.nk41,Llf2#fE@1bLpU7oW;^ +:fC7jp/D#jqbmAiqbmGm!)ibmr)3Pns&8tspepufr)3Mm!)i\k"&`&q;Ya2e;Z0Pl;ZBVn;?Bcr +<:j/k;ck:B45j:B45j;>3oa;?'Jm;#jD`;#X8j:Adoe:B+,e +:'+3f;#F/j;#X8j:B+)i:AI]a:A7Nc:f1'c:\did:]!ug:]4,c;$'Qi:]4)i;=RK^:]!u^;#jGi +;>jDl;>a5k;,I*bs%`Sir_WVlrDNVnr_i\noi1uknl,Kd!*0"t!*/qt%9$)#:f:.b:/+AT8kMeV +5_\'>Qd>Xl;ZBVo9)V]a<;onq<;fes<;oer<;]er<;Ll%"I +N/WdXO-#NfPEhE"R$jD4S=Z=FTq\?YVPgAmWiW>+Yd(O@[C3TU]"G_j^VRe)`Q#s>b0/#Scd:(f +eCE.%f\5'7h;7&IiSrnYjlYail07O#m-X60n*olHncA@Srq-?dp\4X]!;ZWjr;6KkrVcBfJcC<$ +f`-I~> +JcC<$JcEjlnc&FarVZKgrqcWiqtU3crq?9_s7H?_r:9mXs7$!Us6fpSrTkNikNM*ljlPR]gX=6_ +^U^bYZEUO8XfJM&WMcShrM0Fgr`Cl,f@SU(eC;sqdF$=ecHa\XbK@rJaMu3<`59C-^q[Us]Xtbc +\@8oS['R*DYcsL^r0RGL"`.siC2%G^AcQEAAg1\oA"8mOP`1EOJphoiGCbC#KnbD=LQ&j0Nm+/a +I=Hp,Nr,";OoLUDOnb%9O8k=9O7JD1O8Ot;N;JS7N;e_:MM[/fL])u)K`Hf*L&$E$L%^9$L&Qc( +KDC3"L&Zf0K7\Z)JV!]Krdk*$"+buQJ,=]nJ,XluI=-J;HiSNlI/eQnHMVpeHN&3gGQ2miH$Xd^ +rHeKj"+#6;H2DjbH2W!cH1cI`HiAEmHi/0iHhi!fH2;jcGl`5(N@hr*JQj5f=akNM0qlg4!*mdKW6nc&([oCW%T +!quB_rqQNhs8)Wirqu`no_sFAJcFC&J,~> +JcC<$JcEjlnc&FarVZKgrqcWiqtU3crq?9_s7H?_r:9mXs7$!Us6fpSrTjRNX8]1/X/rJ*WM5uQ +Q^!SmNrG"[ +[^EKKZa$a=JV!`Ls*k)X?XE_;s'#J/rEBh<>?Z2jEc>`)@q8qP?!ClOrau1D$tj=8EH..kJ8K7H +G'W_-p3ZacrHnQjrd"Niqg89fs*4ThrHJ9drH\!Zs*=Wh!I&_dFoHL]F8g:[Fn^"NFTcf-EcZPVM+:mI;or/L`7#)\7nL5()'rKR5FrfdDKnX03ArL/9Ll$tGN/WaVO-#KePEhE! +R$a>3S=Q7ETq\*Yd(O@[C3TU]"G_j^VRe)`Q#s>b0/#Scd:(geCE.%f\5'7h;7&I +iSrnYjlYail0@U$m-X60n*olHncA@Srq-?dp\4[^s7u]kqtpBjrVcBfJcC<$f`-I~> +JcC<$JcEjlnc&FarVZKgrqcWiqtU3crq?9_s7H?_r:9mXs7$!Us6fpSrTk6a>$P?>?t*_[ARSkL +>$+g);c?Xpr)N_ps&B"u!*&qe0%ee-f%&:"e'cXkd*L"_c-+;QaiMQC`Pod4_SO%&^:h1k]",>[ +[^EKKZa$a=qGdJn*C`Ic6UO7/6:4+,6UaC069@.f2`EQL0eb43/M]*\1_2H#1cA)d4[;S6:Jt"f +;H*6f"B/2r;,R9is&&Yks&8qqr_`Sks&8qss&8_kqc!GkrDN\oqb[Jo;c?RlqGI5i!`MuprDWVl +s&&bns&/nsoMkoj;Z0H#:esk`;,C%b;,L.dr_EMjr_`Yj!)WYj!)WYlpe^fas%ibo:f$[Zr_EMh +qbR2ds%iPfs%iYkr)*Ghs%`Sis%`DdrD*&^s&&Sfq,%&dr)!DhrD<8dr_NMis&&;_r_NGgohb]c +qbd>jr_`\l!)NPiqG7)cs%iYkr_`Vls&8nprDN\qp/M)lo2GE`s&B)#e.XI=6QnIt3'#JqJ]/KnbA= +M2@+KN/`jYOHG]iQ'IZ&R$sM7SXuLJU8+N]Vl6VqXKAY0Z*UdE[^`lZ]Y2%o_8=+/`lH0CbKS8X +d*^=le^i@)g=k?s_o`Fj]p\ssfq>^ +JcC<$JcEmmnc&FarVZKgrqcWir:p9crq?<`rq-6^rUTsXs7$!Us6fpSrTsRM!p]"5roFjRh:9`g +^Ugk\ZE^X;Y,eV&W2HJgrM26EU8"EX=P)-SeC;sqdF$=ecHa\XbK@rJaMu3<`59C-^q[Us]Xtbc +\@8oT['R*DYcsMmQi<9TI;,?gBPD,WAcuXQ@q90MA/gD_L4Xf!H@pg%KnY>;KnkP+Su@S(H[gR# +M3.Rsr/q#BrfQu;n;m.%qiC]8!0$f7!0$o8s,$f4rJ1<*r.P-(re:3%rIss"s+UH*rIap!re:B* +"bVDXJ:W:KJGt-"JcgRSIt.?ErI=fqrdFQhs*O]l!df6>qK`*ercnKgrce?drd"QirHeKj"+#3: +H2DjbH2`'dH1cL`HiJKmHi86jHh_peH2;jdGl`5]FZ +IPVP(>lr)QVZ+('[Ka.HZ`p[0V#J=5`r!gVa8jB\b5oi3qp,2e +p<`fb!RApfb5f]aao'9abKA#Nb5H2SDZ4SSE;X_UErU4ZF96T.G5c]2G^4R\H@(!dI=6QoJ:N3& +K7ei2L5(J>M2I4MNK0']OckomQ'Rf)R[]h +JcC<$JcEmmnc&FarVZKgrqcWir:p9crq?<`rq-6^rUTsXs7$!Us6fpSrTsRM&*g6tX0&S-Whc8V +Q^*\oNrG"[:S5>l._+>[%,0)JWkp@p`PKAn,CaAnPagB4tIkIrqf0DK0`AnpL.X +rI"Qjs*FZird+Efs*F]j!-nHds*4HeoQ^C]s*+QgG5cX`F9Q`-F)uGFr,qaUolUCZF)l>CnoFbM +!cW'qrGMdUDf9UoDuO\UDuFSODuFYPDt@iHDuOYOD?"GPCB86grG;LNrGMRNrbVRN!,hdQrbh[Q +mr&#@q/61KrGMXR!,hUNs)8$XDJo;h!-%gRrc%jTrc%dTr,D@LqeuOTr,VgWrc8![rH/-_FoHL_ +FoQXbGPZUbH3&A=qg86gs*afo!.Ffps*k$!rIOp!qLea"rIt9)$$L<,DJj6)An>ZTA,p3>=8c7s +=oDP%>PVP(>lp9sJc(N-M[#&qLk^Y3I/T<.Q2QpIQLU@?R/i]RS,SlVRJW?PQ^7Q9"IPOCQ^@Yf +qelCOs)@mUs)S-\rH&*`G';Ll%"IN/`jYOHG]iPa.Q% +R$sM7SXuIIU8+N\Vl6VqXKAY0Z*UdE[^`lZ]Y2%o_8=+/`lQ6DbKS8Xd*^=le^rF+g=tE=hVd>N +j5]4_k3(smlKdg'mI'H3nF?)?oCMVRo`Fj]p\ssfq>^ +JcC<$JcEmmnc&FarVZKgrqcWir:p9crq?<`rq-6^rUTsXs7$!Us6fpSrTsRM''`b/?t*_\An#(O +>$+g);c?XprD`hsr_req!*0"ts&L^Af@JL%eC2jndEp4bcHXPUb/q`G`l5p8_SX.)^V7Co]=PP_ +\$i`PZa6p@YkqE!;ZeI'3^id2'1G8U6:=1-68g\W0eP%11,:[C2>o?;2Cp[K7p&Sc:]+/ak;Z0Mo;Ys>k;?Bcp;Ya2i;?Bcp;Z0Pl;ZBVn;ZBYq<:j/k +;ck:BXKi:Jame;>k:A[id:&n)e:&n)h +;#O5k;#X8j:B+)i:B"#h:Amue:A7Nc:f1'c:\did:]!ug:]4,c;$'Qi:]4)i;=RK^:]!u^;?'Jj +;>sJm;?'Jm:]=2e:]4&g:]F8k;>a;l;uT\n;u]hk<<-"h;ts>ktt5nr_`\ns&&egrDWMkr`/kqrD`hsr_iku<`T-"r`')#;c?Rmqc*Sq +!`W)sr)1;ZaI6O\[oGe^;%M$_o9X:aND]McHjkb +e'uq"f@em4gtgiFi8N_VjQ>UfkiqBum-O--n*fc9o()DDo`"Lbp@n=\q#C0iqY^6hr;HTdrdk*# +s4I@%~> +JcC<$JcEpnnG`@ar;?EgrqcWiqtU3crq?9_s7H?_rUTsXs7$!Us6fpSrp9[Ns6BXKroOjShUg&n +_7[7aZa-j>YH4b(W2KWkrhM?FU7no6C2%R/=',?&q-!W!rEK&%rETG1Xo>g.[Ka.HZ`p[;V#J@0`ra?( +b5BE_bkfWach,Qccd'c5bPfQ]b5]ZaaoH8VD>S5MDuO_SEW:(ZF8^1^F`qs-G6W;;H$Xd`I/\P8 +IXcluJV&N,KS>/9Ll$tHN/WdXO-,TgPa.Q$R$jG5SXuIITqeE[Vl6VqXKAY0Z*UdE[^`lZ]Y2(p +_8=.0`lQ9EbK\>YdF$Fme^rF+g=tH>hVd>Oj5]7`k3)!nlKdg'mI'H3nF?)?oCV\Jp%J+RrV6Eg +s8)Zjrqu`noDX=@JcFC&J,~> +JcC<$JcEpnnG`@ar;?EgrqcWiqtU3crq?9_s7H?_rUTsXs7$!Us6fpSrp9[Ns6:-ZXfSY.Y,eFm +S!]M(O,o>#NW+h:MM_=gr.k3)/;I-QeC2jndEp4bcHXPUb/q`G`l5p8_ns7*^V7Co]=PP`\$i`P +Za6p@YcdqTrdP;b?WMAlDJ*3Z>?Y50>6J,6>$4u,=oV\*>81@Q@qB4`AnPaWDL$AaH%BjPF*;iu +I.hpdI/Jn>QD/O4hDZ+GPD#J5N +DZ=SQDZ+MCDYe;IDZ4MOD?=`oDY\2QE,TW3qJZCQqeuIQrbqdTrGhaSp2TtK"`\R'EH6+!EW:%\ +F*)O#FoQR`FoHOdGBeCXrH\Eh!IK.iHi/9jIJnWpIK"]qJ,b&tJc:9#K)gN&KDgK&L&?T7HZF+E +Df'9%AS,I_A7ntFrE/kur*'&'pg!c'!FCNYNW4n@MM[.DL4t$SPl-gGPQ@&8nX06B!1NbR!h,OF +qj7DNQMm0MR/WEPD#J5JDZ4SRE;aeVErU4ZF96T.G5c[iG^4R\H@(&=I<0jeJ:N3&K7ei2L51SA +M2R=ONfT6`P*2&pQC!u,S"#t?T:qsRUnsufWiE/&Y->1;ZaI6O\[oGe^V@V%`5Ta;ai_fOcHjnc +e'uq"f@em4h;-rGi8WeWjlY^gl07L!m-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVc?eJcC<$ +f`-I~> +JcC<$JcEpnnG`@ar;?EgrqcWiqtU3crq?9_s7H?_rUTsXs7$!Us6fpSrp9[Ns6:3\?=./RB4k^] +>[(<2<)cdq<;fes<;ohm<%qk:BXKi:Jame;>O)`;#X8g;#a>i;#!oe:]=2j;=[Q_ +:]!u^;>sDj;>jDm;#jGk:B45e:]4&f:B45j;>jAm;uT\n;u]hk<<-"h;ts>jl;Z9Mn9)_cb<;fhq<;]_r<;oetS5MDuO_SEW:(ZF8^1^F`qs-G6W;;H$Xd`I/\P8IXcluJV&N, +KS>/9Ll$tHN/WdXO-,TgPa.Q$R$jG5SXuIITqeE[Vl6VqXKAY0Z*UdE[^`lZ]Y2(p_8=.0`lQ9E +bK\>YdF$Fme^rF+g=tH>hVd>Oj5]7`k3)!nlKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`n +oDX=@JcFC&J,~> +JcC<$JcEpnnG`@arVZNhrVHNhr:p9cs7ZB`s7H?_rUU!Ys7$!Us6fpSrTsRMs6BUJs5t$ViRuT! +_nNXfZa-j>Y-"_(W2KTjs.f^kU7qCW.FZ_mdEp4bcHXPUb/q`G`l5p8_ns7*^V7Co]=PP`\$i`P +Za6p@Yck2.Qi<9WJpqI*R?E;WItIZ3,%>%mARf4\A7]@aC27KqB4tsjAnPXbB=>+1U;(u'JVT/F +rKI,Ar/puAs,m&;qN(Z:qN(Q9rf?o;qiCc;s,I&;r/C]8rJL]6M>W/-LAZ`*K`6]%K`-VuLAuu, +K`-Q"K`6Z2L4k54Jq8H'Jc1,tJc:6'JUi6"qgSKns*joppjE*grHnZnH@#F5s*FZi!dJp5rceEg +qKi0g"F>?J/MDuO_SEW:(ZF8^1^F`qs-G6)r6rd&7)I!pEl +It3'#JqJ]/Knb> +JcC<$JcEpnnG`@arVZNhrVHNhr:p9cs7ZB`s7H?_rUU!Ys7$!Us6fpSrTsRMs6BUJ'X"[DXJ_b] +R$NnsO,f3ZN/W[QMM_:fs+^W0L\uo,L]<)Xe'cXkd*L"_c-+;QaiMQC`Pod5_SO%&^:h1k]",A\ +[^NQLZa$a=YH@eSrdP_l?<2/fCh7'`@U!#?>$G-5=^"s2=BSf*>7t%A=^"s1='/L\JTQ0uC2Is4 +GOBkYHN8BfHiAEjHN8BkH2`-iHN8HlHiALDZ+DP +D#J5NDZ=SPDZ4SCDYnAIDZ=SPDZ=VTDY\5NDusrqDYe8OE;OSQE;jeTE;X_SE;";KE!C<&EcH)> +ErL%ZEc_5%qK2d[rcS6a!-eBdrH\?fr-S?hqgANpI=;*DrdXrurdk$"s+:<'rIb*&re:3%$%I#8 +DfBQ/C1h2YA-%3^rE/kurEB/(pg!c'ra#S_r/L`7#)\7nL5(D0rfm>GrfdGKQgpI@R/i]QS,\rW +RJWBOQMm0MR/`NPD#S;JDZ=YSE;aeVErU4ZF96T.G5c[dG^9:7BR>,TI=?ZrJ:W<)K7nr5L5:\C +MN!LRO,oBcP*D5tQ^F21S"6.CTqS6WV5L8kWiW>*Yd(O@[C3TU]"G_k^VRe*`Q$!@b0/&TcdC1i +eCE1'g"P3:h;@/KioB(\k2tmll0@U$m-Xf@$h3]Wo(2MGp%A%Pp\jmeq>^ +JcC<$JcEpnnG`@arVZNhrVHNhr:p9cs7ZB`s7H?_rUU!Ys7$!Us6fpSrTsRMs6BUJ'4PNdBOkLT +>?Fs,<)Zarr]pHI&O&HF5sRRs9K,*o8l/A];H$Nn +;ZB\f;uooprD3Pm;H!KmrDNVn!)ienr)3Jl!E<"n;Yj>k;Z9Vp;Ys>k;ZBYq;Ya2i;?Bcp;Z0Pl +;Z9Pm;?9]qoMkok;Z9Pn;#a;s:f1%b:f1(d;#X5u:f1(d:JXe`:JXe`r_`GeqbdAis&&>`r_EMh +qbR2ds%iSgr_NPj!)ibmr_NPhs%iYis%iYir_NMgp.k`d;,I*bpe^udqb[;grD<;e!`2ZgrD3Jk +nPK3\r)!)ar_WPjrDNYm!)WVis%rMerD*Ag!)WVkq,72js&B"u!*&hqs&Ako!*&_l!E<"o<;ons +/8Ll$tGN/WaWO-#NfPa.Q$R$jG5SXuIITqeE[Vl6SpXKAY0Z*UdE[^`lZ]Y2(p +_8=.0`lQ9EbK\>YdF-Lne^rI,g=tH>hr*GPj5]7`k32'olKdg'mJcP^nF?)?oCV\Jp%J+RrV6Eg +s8)Zjrqu`no_sFAJcF@%J,~> +JcC<$JcEpnnc&Ibr;?EgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!U!q,ICrTsRMs6BUJs6(HbinMo& +`4rmk['Hs?Y,nY&W2HJfV59u`US=HUr1X1brLt[ed*L"_bfe2PaiMQC`Pod5_SO%&^:h1k]",A\ +[^NQLZa$a=YH=r+QiE@(J:V@(P`UWLJqJehXK>rCAR]+ZAS,LdCMINpBP;$jAn>LaB6'WDMq`T0 +KSY]dPP^O@OoCODOnXt6O8k7:O8P+rJ7N/daqrK$c9r/pr@rKI5F"dP=; +QBmm:R/WKRR/WNPRfAlPRLPU:J:)]eFE;;:Chda)rE/kurEB/(q-crm15`s3C\irQ>2`rQ5#\s3(FXrG;IMqelCOs)@mU!ci@'rH*4*G'8(R +G^+L[H@(!dI=6QoJ:N3&K7el4L51SAMMmFQNfT9aP*;/rQ^F21S"6.CTqS6WV5L8kWiW>*Yd(OA +[C3TU]"G_k^qmn+`Q$!@bKJ/UcdC1ieCN7(g"P3:h;@/LioB+]k3(sml0@X%mI'H3nF?MK!V>s_ +o`Fj]p\ssfq>U6gqu6NlrUg)?s+14%s*t~> +JcC<$JcEpnnc&Ibr;?EgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!U!q,ICrTsRMs6BUJ'^2d*Xf8%a +R$X"uOH,<[N/W[QMM_:fs+^]2LPCN^LB!&.L+.n4dEp4bcHOJTb/q`G`l5p8_ns7*^V7Co]=PP` +\$i`PZa6p@Yck12rdb#u%piXCF_tr*?=IDSQ.h(=Tr&6>?b65r`Th7='&F0FaeD3D/XH; +H%(21I._jbI/\HmHMr-hHN/?lI/\KkHN/6hGQ2pcH1Z@\H2i*hG5ZR`F9Q`-FE;MFqfVXTp2pFY +F)q8$o5akN!cW'qqeuLRs)7jT!,qgRr,;OQr,;4FrbqdRqeZIPCMRa'rG2INr,2IMs(qXNs).jR +rGMUQn8A)@q/61KrGDXSDYS,PE,TW3qJZCQr,;RRrbqdTr,MXRp2TtKs)S*Y!-8'Y!HN8\FS0eV +G5Z[`H2W'fHi/9gI0+kGIK"]qJ,XusJc:9$KE$Q&KDgK'L%g6#F8g+aDJX!"An>I^AGoX+=oDP& +>PVP&?2\(0?i,i_MuSY;Lk^Y*Yd(OA[C3TU]"G_k^qmn+`Q$!@bKJ/UcdC1ieCN7(g"P3:h;@/LioB+]k3(sm +l0@X%mI'H3nF?MK!V>s_o`Fj]p\ssfq>U6gqu6NlrUg)?s+14%s*t~> +JcC<$JcEpnnc&Ibr;?EgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!U!q,ICrTsRMs6BUJ%HqA:Bk:^W +>?P$-j:^'Wk;,L.dr_F##;,L.c:Jak`:Jakb;Gm3cqb[Dk;,Qj[r_EMhqbR2d!)NMf +s%iYkr)!Gjr_NPhs%`Vir_NPhr_NMgp.k`d;,I-cpe^rcr)!DhrD<8dr_NMis&&>`r_NDfp/1fc +r_`Sks%rbmr_NPjpeUi`s%iSjpeq,js&B"us&Anrs&Akos&A_kqGdDns&K5%<)Zco;[l]&;,L.e +:eXSU:/"8PrE/kurEB/(q-;Ll%"I +N/`jYOHG]iQ'I]'R@B\:StD^MUSO`aW2ZeuXfen5Za@-K\@K2`]t_A!_SjF5aN;WKc-FY_daQ^s +f@\d1gYL]Ci8N\UjQ5Oekiq?sm-O--n*fc9rpg*]o`"Lbp@n=\q#C0hqY^6ir;HTdrdk*#s4@:$~> +JcC<$JcEsonG`@arVZNhrVHQiqtU3crq?<`s7H<^rUU!Ys7$!U!q,ICrTsRMs6BUJs6(?`jPA>/ +`k]3q['R$AY,nY&W2?DeUnsl_U]$nbUApqdUA^c2cHOJTb/q`G`l5p8_ns7*^V7Co]XkYa\$i`P +Za6sAYck12XT"P>Q@41SS!K"_IY!-*BWS;5V5.R2A7]@aBkqEsAnbpiB4YXbAnH1U^m'%jJ;/rD +plkW=r/q#BrfQu;qN(Z:qN(Q9r/^c;qiCc;!0-u:r/C]8rJL`7M2;+cr.b0(s+LB*qh4p%p4iU$ +rIk0&qh4s&s+^Q,"bVDXJ:W:NJGk&uK)^B'J:E(HIf+]qIf=cjI/\KlHiSNmHM`!fHN&0jG^'+2 +!."Bd!IK.kH2;dcH2VsfHN&3eH2rPVP&?2\+/?i@J4[L9LM['6d&s)e/9Ll%"IN/`jYOHG]iQ'I]'R@9V9StD^MUSO`aW2cl!Xfnt6Za@0L\@K5a +]t_A"_SjF6aN;WLc-F\`daZdtf@\g2gtgiEi8N\UjQ5OekiqBum-O--n*fc9o()DDo`"Lbp@n=\ +q#C0iqYU0hr;HTdrdk*#s4@:$~> +JcC<$JcEsonG`@arVZNhrVHQiqtU3crq?<`s7H<^rUU!Ys7$!U!q,ICrTsRMs6BUJs6(*YY,\7f +R$X&"OH5B\N/NROMM_:fs+gW/re:B,s+^W0L&-NLcHOJTb/q`G`l5p8_ns7*^V7Co]XkYa\$i`P +Za6sAYck12XT!_UIp66'F)Yi$?2e=<=+PpNH[8lo=WCOH>[(B7>$5$4=]ea,5_\$>l@t, +?N+=/NW4q:M?J`iL4t$SPl-gGPQ@&9nsK&s)e/9Ll%"IN/`jYOHG]iQ'I]'R@9V9StD^MUSO`a +W2cl!Xfnt6Za@0L\@K5a]t_A"_SjF6aN;WLc-F\`daZdtf@\g2gtgiEi8N\UjQ5OekiqBum-O-- +n*fc9o()DDo`"Lbp@n=\q#C0iqYU0hr;HTdrdk*#s4@:$~> +JcC<$JcEsonG`@arVZNhrVHQiqtU3crq?<`s7H<^rUU!Ys7$!U!q,ICrTsRMs6BUJs6'dPBkCdY +>?P'/j:^'Wk;,L.dr_Enu;,L.c:Jak`:Jame;>F&b;$'Qk;=[Q^:B4/e:]F2i +:]4&f:]F8h;$]uo:JOY\:JO[a:]F2i:]=,_:BF?i;#=&_;#a>g;#a>i;#*uf:]4)i;=[Q_:]!u^ +;>sDj;>a;m;,I6fs%rJdrD*Ag!)WVkq,75ks&B"us&Att"&r9"<;f_t<)Zaqp/CferD`o"+Yd(OA[^N]V]=bhl^r!t,`Q-'A +bKS5Vd*^:keCN7(g=k?^ +JcC<$JcEsonc&Ibr;?EgrqcWir:pYH=q.X8\GLbFaTFKdcMr-nNm!.OoqrHnTnrI"Tkrd4]mrd+Hes*FZi!I/hf +GlN'cHN/A?>5_\$>l@t,?Me+/ +[h#pV[^NTN['6dS5NDuO_S +E<:0%F8g:]FT?UaG6)r6rd&L0I!pElIt3'#K7ei2L5(M@M2R=ONfT9aP*;,qQ^F20S"6.CTV8-V +V5L8lWiW>+Yd(OA[^N]V]=bhl^r""-`Q-'AbKS8Wd*^:ke^i@)g=k?^ +JcC<$JcEsonc&Ibr;?EgrqcWir:pM +R?s2%OcPK]N/R[ms,$`2!/LQ.re:B,s+^`3Knb>9rJ(<*,0S-NaN2B?`Pf[2_8*h"]tD"h\[f5Y +[^EHJZEUR:Xf\\*rdb#T/9l,OBOP7V@UrJiIXQQgF`VM==]ej4>?Y-4=^"s2=BAR3Ap&EmCMe$4 +G^fXA!IfIdI.Vd_I/S?oH$Xd`Hi/9hH2r6iGQ2pcH1Q:\H2i*hGPu[^FT6C^FSg4TFS9hYFE;L% +F7XGPEn>OD>\;GD?"MQ +D>nGPDt%Z@Du";MD>e>QDf5>g")r0rDYe8OE;OSQE;jeTE;X_SE;";JE;stTE<^H)FEDYKG5$.Z +FoZabGl;pdHMr3hI/&-hIf=irJGk&uJcLB$K)L?$KE-_tKFN6IE,TW1CM.9lARf:aqHe.XI=6QoJ:N3'K7nr5L5:\CMi(N@hr*JRj5f@bkNM0qlg4!* +mdKW6nac8BoCW%T!quB_rqQNhs8)ZjrVZWmo_sFAJcF@%J,~> +JcC<$JcEsonc&Ibr;?EgrqcWir:p?P'0 +YH=q.X8Z)u.2Y''1bgU5/M8Y56:!e!4?PVa2aThr5sRX55Q3nW5sRV"4$GW(:/Fhd<)`cqs&8ko +!)rPis&/nqr_`\ls&&epr)3Pn!)ibmrDNPlpeprerDNVn!)iYjs&&kr;Ya2h;?9]or)f;#4#j:f1*g:]OAe;"mcb:B+,g +:B"&h;#F2i:]F2i:B4/h:]F2h:]F2_:BF?i;#F,`;#X8g;#a>i;#*ri:esmc:]OA_;#X8g;"dcb +;#X>i;?9WkrD*DipJ:`_s%`VkrDEDhs&8nrs&K(us&K"srDN_r;uTbi;u0Jm</8Ll$tH +N/WdXOHG]iPa.T&R@9V9StD[LUSO`aW2cl!Xfnt6Za@0L\@K5a]t_A"_o0O7aN;WLcHaeadaZgu +f@\g2gtgiEi8N_VjQ>UfkiqBum-O--n*fc9o()DDo`"Lbp@n=\q#C0iqY^6hr;HTdrdk*#s4@:$~> +JcC<$JcEsonc&IbrVZNhrqcWir:p9cs7ZB`s7H?_rUU!Ys7$$Vs6fpSrTjUOlK\?4)sHJJk2t=A +aMYa&['R'BY,nY&W2?DeUna`\U]$nbUA1G]T`(KYaMu3<`5BI.^q[Xt]Y(hd\[])V[Bm3FYct=6 +XfSS'Q\0^$U77@$JpW'%LhEihV5BuXS-rjN6C\$i`Q['['A +YGM6:rl4rXs2Y2^qo\uaqp+o]r6PPlcHXT4b5f]`ao9H[C]/)KD>S5NDuXeTEW:(ZF8g91F`qqP +GBe@XH?spcI=6QoJ:N3&K7nr5L5:\CMN!LSO,oEdPE_>uR$jD4SXuIITqeE[Vl6VqXKA\1Z*UgG +\%&u\]Y;.r_Sa@3a2lEHbg+P]dF6Uqf@S^0gYCWAi8EVTj5oFckNV6rlg4!*mdKW6nac8Bo^qhL +p@e7Zq#C0iqY^6ir;HTcrdk*#s4@:$~> +JcC<$JcEsonc&IbrVZNhrqcWir:p9cs7ZB`s7H?_rUU!Ys7$$Vs6fpSrTjUOlK\?4&Er(OcYT_N/R[ms,$c3s+gT.re:B,s+^T/r.P9.Knb;8rId=daMu3<`5BI.^q[Xt]Y(hd\[])V +[Bm3FYct=6XfSS'J7;hdH#mk7?sR5OAQ=>3H[0jZF)c&/An5@X>Q.b9>$4s/=BAmNLin\pDfKoG +r-n`rII_dVHi&3jHi/3hHi8nGPD>nGQ +DsqT@Dtn5MD>eAGDuXeVDYe;OE;OSQE;skUE;X_RE;";KDujs!qJlOU"ES[-G'- +rJ_,BMi3ILLk^YR/i]QRfJoVRJWBOQN!6JC]/)KD>S5NDuXeTEW:(ZF8g91 +F`qqPGBe@XH?spcI=6QoJ:N3&K7nr5L5:\CMN!LSO,oEdPE_>uR$jD4SXuIITqeE[Vl6VqXKA\1 +Z*UgG\%&u\]Y;.r_Sa@3a2lEHbg+P]dF6Uqf@S^0gYCWAi8EVTj5oFckNV6rlg4!*mdKW6nac8B +o^qhLp@e7Zq#C0iqY^6ir;HTcrdk*#s4@:$~> +JcC<$JcEsonc&IbrVZNhrqcWir:p9cs7ZB`s7H?_rUU!Ys7$$Vs6fpSrTjUOlK\?4&Er?Y-1<`N*u +YHG"/X/],L.5jr_iepqGI8j!E2nl;>sGo;ck:]F5k:]=2i;>F&c;?'Jm;>j;k;>3o]:]=)h:]4&f:]F8h +;#jGl:]F2i:B4/h:]F2i:]F2_:BF?i;#F,_;#a>g;#a>i;#*uf:]=2j;=[Q_:]!u^;>sDj;>jAn +;,HdYr_EJh!)WSjqbmGmrDWo"<)cjtrD`_oqc*So!)iYlpf%;p<)iBd$rBf!;GU+b91qiK92>@e +rEB/(q--r)!Ais&/ko"Ah`i;H!Kmr)EYqr)EVp!*&qr!`W3$qc*Vqr_rbp"'&<"S5NDuXeTEW:(ZF8g91F`qqPGBe@XH?spcI=6QoJ:N3&K7nr5L5:\CMN!LSO,oEd +PE_>uR$jD4SXuIITqeE[Vl6VqXKA\1Z*UgG\%&u\]Y;.r_Sa@3a2lEHbg+P]dF6Uqf@S^0gYCWA +i8EVTj5oFckNV6rlg4!*mdKW6nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTcrdk*#s4@:$~> +JcC<$JcF!pnG`@arVZNhrqcWir:pn`b_8*h#]tD"h\[f5Y[^EHJZEUR: +Y-"e+Wi:JsBUkHOL4au.K4SYsW26;_R[TJ%M2-k:I!^U&LPh"HMi3UO8b1>NW4t7NW4t:MZScmM#E,+LAlo,K`6]'K_pJtLAuu+K`6W%K`-W) +LAuo-K7a&Qrdb!!rIY'#!e>cMr-nNm!.OoqrHnTnrI"Tkrd=Zjr-A[:"aYNBH?sr;HiSTlI/\QnHie_G +J,OoqJ+eEmIft:QJUi:JJc(-"KE$T*K7s5XreCH.s,$c5!fN"sqMkQ:r/_/GOH>NbO-#J%OTL]0 +PPg[DPm*J?R$a5,rg<\Q".5LFRIcjISGo&gR"Kg9H?XLRD/X<+CR4m$rEB2)q-&[!6P,]!6tAcp!idb5KE^b5#iOD#S;KDZ=YTE;aeV +EWC1[FT6I`G5c]&G^4U]H[L6iIXcluJV&N,Knb>;M2@+KN/`mZOckomQ'Rf*R[]h=T:qsRUnsuf +WiN5'YHY==['mHS\\#Mg^VRe)`Q$!?b0/&TcdC.heCE1'g"P3:h;@/LioB+]k3(sml0@X%mI'H3 +nF?MK!V>s_o`Fj]p\ssfq>U6gqu6NlrUg)?s+14$s*t~> +JcC<$JcF!pnG`@arVZNhrqcWir:p!k_BP@?Y$"8"@DF*E!0IfFosIe.sX +Hhr-iHi89iHi8?kHiJBoH$FRXrcnBeo6C:\s*+NfrH8!Z!HWA[FnTqOFTQZ+ErC(OErU+_E,TZ6 +DfG\oqJcIQrbhXPr,DRPrGDURr,2FNrGMRNs(q^Ns)%aO!,_UNphg"Jrb_[Qrbq:DqJZ1Is)%[O +qelIRrGMdWDf0IhDZFbRDuO_TDuO_SEVseLEVaVSEr'eUEWgH*F`qs&FoQXbGPudbH2W'fHi8?e +I/n`oJ,OosJcC?%Jc:9#K*-^XKS/lL!/:E,#D@2=DfBN/C&V`E@fUuU=oDP'>PVP&?2\+*?iOO5 +NGrfdDKnX03AqO7JRrL*VO".,=>QhbFqD#S;KDZ=YTE;aeVEWC1[FT6I` +G5c]&G^4U]H[L6iIXcluJV&N,Knb>;M2@+KN/`mZOckomQ'Rf*R[]h=T:qsRUnsufWiN5'YHY== +['mHS\\#Mg^VRe)`Q$!?b0/&TcdC.heCE1'g"P3:h;@/LioB+]k3(sml0@X%mI'H3nF?MK!V>s_ +o`Fj]p\ssfq>U6gqu6NlrUg)?s+14$s*t~> +JcC<$JcF!pnG`@arVZNhrqcWir:p?Y-2=&i4!i;ZBYq;Yj8h;Ya2h;?9]or)sAk:]O;j;#X>f;#=,i;#aDk:]OAe;"mcc:B+,g:B"&h;#F0!:esk^:/=Y\ +:/=Y\:B"&h:A%Ba:f1'f:\IWa:]+&h:]4,c;$'Qi:]4)i;=RK^:]+&_;>sDj;>a;l;#F)h;"d]b +:B+,i;#O8g;ZB\o;ufqt;ufqs<;f_u<)lpt<;ohr;Yj>hU91hfL +r)ru%r`f2'rE]A.q-X/0rDYdF$Fme^rI, +g=tH>hr*JQj5f=akNM0plKmm)mdKW6nc&([oCW%T!quB_rqQNhrqcQirqu`no_sFAJcF=$J,~> +JcC<$JcF!pnc&IbrVZNhrqcWir:p9cs7ZEas7H?_rUU!Ys7$$Vs6fpSrTjUOlK\B5s60LGroOgS +jMepH\$NBFYH=h(W2HJfV#@(gUApqcUA1G]T`:YaSc,/YSO^K1^V.:m]=GJ^[^NTMZa-j?YHG"/ +X/`.tJ8(L>NJ3"7J;%X8XJVegSsu(2O,/LDJ:2m"LPUeFM2R@KJ=i[jH%1O&N03t"rKHl:plYB6 +r/^i;qN(W;q2bN:rf@&=rf$o:qMbK6regl9M26ueL\li*L&Qc*L&?W$L%g?%L&Qc(KDgK%L&Zl1 +KnP,3K)L6#JGausK)^B'J:E(IIenNoIf=coHiSToI/\KkI/SBhH2i3iH2W!eH2;gkH[:!`G^4T3 +GlE!fGR/S@H?jd_H[:#:Hi86jHiAEgHhi!fH2MsgHi83jH@,X;rd=`or-\Klrd4cqIXh9GrI=Nk +rdXs!rdalsr.=s$!ec2YrIt9+s+gW2re^u>NK0!YNK0!Yrf?rI!LoVXSIV6]ML^,$G'7qED/O*'DuNo<>5_\%>l@t,?M\%-@/jXC\$icS[^EKM +Yct=,rl"fUrl>&[!6Y2^!6t;ao?RK`bfp(0!6Y8^phThErb_OMs)7pVrG_mZF*%>&EclPKGB\:W +H$Xd`I!pElIt3*%K7ei2L51SAMMmFQO,oEdPE_>uR$jD4S=Z@HTqeE\Vl6VrXKA\1ZEppH\%0)_ +]Y;.s_Sa@4aN;TJc-FY_daQ^sf@\d1gYL]Ci8N\UjQ5Oekiq?tm-O--n*fc9rpg*]o`"Lbp@n=\ +q#C0iqYU0hr;HTdrdk*#s474#~> +JcC<$JcF!pnc&IbrVZNhrqcWir:p9cs7ZEas7H?_rUU!Ys7$$Vs6fpSrTjUOlK\B5s60LGroORL +jHu:!PEM#fNK!gnre^W0rItK0L5(J=LA-E#K`$K$JOdMj^V.:m]=GJ^[^NTMZa-j?YHG"/X/`.t +?WM5eBk(U[@:N>gJUMfhGBInECM%-g?sd;RB4bgiBPD0jBR+s%D/O?9GCBCoKE-`(L(/iZE,]`5CM@EnAn5C_r`T2'rEK,'rE]A.qHs2/s'bqe +$&je#MM[.DL4t$SPl6mGPQ7$>R/<S5NDuXeTE<:0%F8g9%F`qqP +GBeCYH?spcI=6QoJ:W<)K7nr5LPUeEMi +JcC<$JcF!pnc&IbrVZNhrqcWir:p9cs7ZEas7H?_rUU!Ys7$$Vs6fpSrTjUOlK\B5s60LGroORL +jB>\g=B8F$sAj;#aD`;#X8g;"dcc;#F2h;?9WknPB0[s%iVjrDh;ufkq<:3Zk;Gg:h:f1"`9M>=Vr`T2'rEK,'rE]A.qHs2/s'bn' +r_Wr!;c-Cg92e_dr_r_or`/kqrD`hsr_ir"<`N*urD`hsr_rbprDiksr_rT-rG;IMqelFPs)@pV +!ci@'rcE1'G'8(RG^4R\H@($fI=?ZrJV&N,KS>/9Ll%"IN/`mZOckomQ'Rf*R[]h=T:qsRUo(&g +WiN5'YHY==['mHS]"G\i^VRe)`Q$!@b0/&TcdC1ieCN7(g"P3:h;@/LioB+]k3(sml0I^&mI'H3 +nF?MK!V>s_o`Fj]p\ssfq>^ +JcC<$JcF!pnc&IbrVZNhrqcWir:p"-/G'OSt7?Nr=q;N;AM6N;e_;MM[1GreLB*re:?)s+UB(qh=d! +s+UH*re(-%rIt9+"GMM^K7a&Q!.b'"!J5n$K)^B'J:E(IIenQmIK"WoIK"WnHi8?jHMr-hHN&3g +GlE!aH3/G>HN&3eGlE!fGQ<$gH3AM>I!^2[:!IB+lH2riA5Mi@Ll!07&>!K`BAOSt7? +OSt=APPg[BPl[5=rg*SN#FLpIR$a;/RJ!$KS,JoXT)YDmNIZA&H$==LD/=$'Dcp6B>5_\%>l@t, +?MRt-@/XO5\,Wl<[C!=?YQgoA`5T^8`r=$Ya8jB\b6#o4c2#ZVcN;D9bl5faanKTLD#S;KDZ=YT +E;jkWErU4\FT6I`G5c]0G^4U]H[L6iIXcluJV/T.KnbA=M2I4MNK9-_P*;,qQC+)/S"6.CTqS6W +VPgAmX0&M-Yd1UC[^WfY]Y2(p_8=.0`lQ9FbK\>ZdF-Oof%8R.g>(N@hr*JRj5f@bkNM0qlg4!* +mdKW6nac8Bo^qhLp@e7TrqQNhs8)Zjrqu`noDX=@JcF=$J,~> +JcC<$JcF!pnc&IbrVZNhrqcWir:pC1q-f?sR.=B)cKPBPM6qHB35uD/XH=HMW*iJ,artIIhj]HN8Hk +Hi&3gHiJElHiJHuH[L3fH[:!`qfr-d!I/n]GlN'gGQ;seFo-7^F*)O%FnTqOFTQZ+ErC(OErU+a +E,T]7DfBW5q/H@Ps).aQqf)IOrbhaSrGMLNrGMRN"DhjhCi0,eqel4HrGMRN!,hdSn8A)@q/64L +r,24H")r0rDYe8OE;OSQE;jeTE;aeSE;";KDujs!qJcd]F)uGGG'8"MqK;g]rce9brH\?frd4Tk +rd=corI"Zpqg\Qp"+buRK)U?#K)^K'K)UDoK_gE6KmRfYE,KN.B4kge@qAeGr`]8)qHWu)rEf;, +ra>\5rf-r9!fDhjre:K%Q'D33rKI;JnX06B!1NbR!1NnTr0RMOQM51nD#S;KDZ=YTE;jkWErU4\ +FT6I`G5c]0G^4U]H[L6iIXcluJV/T.KnbA=M2I4MNK9-_P*;,qQC+)/S"6.CTqS6WVPgAmX0&M- +Yd1UC[^WfY]Y2(p_8=.0`lQ9FbK\>ZdF-Oof%8R.g>(N@hr*JRj5f@bkNM0qlg4!*mdKW6nac8B +o^qhLp@e7TrqQNhs8)Zjrqu`noDX=@JcF=$J,~> +JcC<$JcF!pnc&IbrVZNhrqcWir:pJ^2Dm6E0eY4;2)Rh;?0Sm;?9]qoi2#l;Z0Gs:esnb;,C*g;?'Jm +:B45j;?'Gk:]O;j;#X>k:]O;j;#4#h;#X>k;#aDe;#X5j;#F,g:&n)g:B"&h;#=)t:esk^:JX_\ +:JX_\r_EMhoM>H_rD3,`r_NGgs%iSiq,%2i:J^pc!)`;`r_NDfp/1fcrDEMk!Du\_:BF9e:]=2c +;?'Po;ZTirpf.2j!*&qt!*&qrs&/Ykr)E\pr`&;a&QDb1;G^1e:f1"_9M8#N7p0!o>5_\%>l@t, +?MRt-@/XO5;#X;m;H*Ql!D?Aj;ZB\n<;onr<;]_r<;oetS5NDuXeUEW:(ZF8p@^FT?UaGB\:WH?spcI=6QoJ:N3'K7nr5LPUeEMi +JcC<$JcF!pnc&Lcr;?HhrqcWir:pO8b1>O8P%;NrY:?O8b1:O8k4CNK0!XN;AM6N;eb8M?/QireLB*re1K.K7nr4rIk$$pP/^% +re19'r.P$&s+UZ1KS4u0rIFs!rdbE.JV&N+Jq8K'It.EGqgSTprI+Zms*alord4Wl!.4ZjrH\Eh +rd"Herd"?ds*Ocl!dK!9qfr*crceEgrd"]mH[L0drHnKh!.4]mpj;j`s*=Qhs*O]is*Ocl!.4]m +!.F`lrdFcn!e#QJrIFfqp430m"Fu&SJ:RNJr.=s$s+LE)r.Y0*s+pW2!fW+tr/L`:s,RPLO-#Ea +O,o<^O-#J&OT:R@Pl-gEQN!3PR$j<>QiNQIRK/lUSH,8[T+$j4I=-?aFE228D/=.h>5hb%>lJ%- +?MRt-@/XO5@fNn?[^WZO[/R96Y/J8t`Q#ps`ra?(b5BE_bl,f`cL]?`cHON3bQ#]aCA2NBD#S;L +DZ=YTE;aeVEWC1[F9-N-rc`""H$Xd`I!pElIt3'#JqJ`1L51SAMMmFQO,oEdPE_>uR$jD4SXuII +U8+N]Vl6VrXfen4ZEpsI\@K2`]t_A!_SjF6aN;WLcHaeadaZguf@em4gtgiFi8N_VjlY^gl07L! +m-O-=mfi4No()DErq6 +JcC<$JcF!pnc&Lcr;?HhrqcWir:pjNJrepMZ/J4M#W81L&d#.LB!#/LAQZ)K`6]'K`6W'K)C2sJhX^C[^EKKZE^X;Y-"e+ +Wi;qpVPU)`@UPVP'?2\+* +?iFI3@K'a9NW4n.9ZaI6O\[oGe^VI\&`5Td^ +JcC<$JcF!pnc&Lcr;?HhrqcWir:ph;?0Sm;?9]qoi2#l;Z0Gs:esnb;,C*g;?'Jm:B45j;?'Gk +:]O;j;#X>k:]O;j;#=,i;#X>k;#aDe;#X5j;#F,g:&n)g:B"&h;#F2j;#a;n:/=Y\r_NPhn5''\ +rD3&^!)NJgs%iSiq,.,e"&Vlk;=RK^:]+&_;>sDj;>jAn;,HXUrD<;es&/kq#?4W$;cH[p;uTbp +;ZKer<<-"t;u]bk;uBVp;u]h`;uK\r;uTW";Gg1a9M8#N8c;il>PVP'?2\+*?iFI3@K'a9;#X>l +;uTVp:fI?ks&0#!;cH`p\;ODuXeTEW:%Z +F8g7^Fa!b.B6\]JH@($fI=?ZrJ:W<)KS>/9Ll%"IN/`mZOckomQ'Rf*R[]k>T:r!SUo(&gWiN8) +YctF>[C3TU]"G_k^qmn+`Q-'AbKS8Wd*^:ke^i@*g=tE=hVd>Nj5]7`k3)!nlKdg'mJcPXnF?)? +oCW%Ts7QHerV6Egs8)Zjrqu`no_sFAJcF:#J,~> +JcC<$JcF$qnc&IbrVZNhrqcWir:p%H=h'Z*1:2Wi;qoV5:!dU\LS]U&:S`T*1aVS=H/LS-#1MSGJ`TS,f&XRQ.XZZ*:F7XfSS' +WMl_lV50l\TmqcNB-YK_gDsLAuu, +K`6W&K`$Q(L'33`KS+mPJc:6+K7\]+JUi6"rI4Wn!.Olprd4]ord=Zkrd4]mrHeEfs*FZirHS?f +q0E6lH?sj]H$T:3rd"Kfr-ABjI/J?iH2r\$`TMricI,`5MYorPnu\aiaP)!6k>brQb#\!mSs5rlY;`rbD1CrG;IMr,2OQs)@sWs)J*\ +rcE+%G'8(RG^4U]H[L6iIXcluJV&N-KnbA=M2I4MNK9-_P*;,qQC+)/S"6.CTq\?YVPgDnX0&P/ +Z*UdE[^`l[]Y2(q_Sa=2a2lEHbg+P]dF6Uqf@S^0gYL]Ci8EVTjQ5Oekiq?sm-O--n*fc9rpg*] +o`"Lbp@n=\q#C0iqY^6hr;HTdrdk*#s4.."~> +JcC<$JcF$qnc&IbrVZNhrqcWir:p#3(i0O,]*VregZ2!/UW0#_n+iL5(J=L5,V[s+LB*rIk0&rIXruqL\]t34#oqYck43XK/A# +W2HMhUnaZX?t\;ODuXeUEW:%ZF8g9#F`qqPGBeCZH@($fI=?Zr +J:W<)KS>/9Ll%"IN/`mZOckomQ'Rf*R[]k>T:r!TUo(&hWiN8)Yd(O@[C3TU]=bhl^r""-`Q-'B +bKS8Xd*^=le^rF+g=tH>hr*GPj5f=akNM0plKmm)mdKW6nc&([oCW%T!quB_rqQNhs8)ZjrVZWm +o_sFAJcF:#J,~> +JcC<$JcF$qnc&IbrVZNhrqcWir:p"6*Ea(91c73K2)R9O4Z?;6;,U7hrD`_o!)ibms&/kqs&&hqq,I,f!)i_l!)iSj +lVd^\!`DrqrDNYos&/\jr)3Pl!)ibm!)iVkqbdDkrDEYp<:s5l;ci;#*uf:BXKk:f1*\;#X8g;"dcc;#F2h;?0S]:]+&b;#jMg;uTbp;ZKer<<-"t;u]bj +;uTbp;ZKe`;ZKep<<,ts;$p6!:esbW84uNX>5_\%>lJ%-?MRt-@/XO3@fK:(;?'So;#sKlrDNYp +!`N&tr)N_qr`'#! +JcC<$JcF$qnc&IbrVZNhs8)`jr:ps5FIGZEUI4X/W"pV59u`rM0.^rLs7a#+qQ]T:VXFrgX._S=H(HiAEbHiJElH2W'gHi86iHiJBlHiABmIJ\EkIK"TqIXckG +JGaokJGt$!J:[]MqgnZs"bVJ]K7ejTK`d'bLPc"f!fN"qr/CZ8!06o:rf7#>s,d8C!KrZCPl6mE +QM[$IQiNQJRK8nJr1+RoT:_^HSXl@AL44PsG'7hBE,09.>5hb&>l@t-?MRt-@/XO1@Kp>O[^WZO +[/R92Xi/0W`VmgYaN;U&b5fc`c2Q#ZcN;A8bl5faCA2NBD#S;MDZ=YTE;abXEcZ=$FEDYKGB\:V +H$Xd`I!pEmJ:N3&K7nr5LPUeEMi1;['mEQ\\#Mg +^VI_(`Q#s>b0/&TcdC.heCE1'g"P3:h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCMVRo`Fj]p\ssf +q>^s+14#s*t~> +JcC<$JcF$qnc&IbrVZNhs8)`jr:ps5F7AOH,9XMi.Cg!/UN-!euJcreCB*re1<*rIk-%rIXruqL\`u!.t-"+0DWFWi;qpVPU)` +U7n6PSl^JjH[9pXEGfN(AR](S?2J7DC2$UkLj"5bDfU#HIt.$\;MD#eJPDt.`ADtIrEDuXeTDZarsDJo;h!-%gRrc%jT +rc%gUr,DCMqJZITEr9qVErU1aFEVhMFEID&rc\6aqKW$crd+NirHnTnrd=]n!.OcoqLJQrqL\a" +oS!6uqM+s&%u,jmFE);=DJNouB4GI_>5hb&>l@t-?MRt-@/XO1@Kp>%Mi3ILM#N,/L&.)6PQ@&9 +pm;&Jr0[AL!1NeSs-iqTrg&FEMbNGBe@XH?spcI=6TqJ:W<) +KS>/9Ll%"IN/`mZOckomQ'[l+S"#t?T:r!TUo(&hWiW>*Yd(OA[^N]V]=bkm^r"".`lH0CbK\>Y +dF$Fme^rI,g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8BoCW%T!quB_rqQNhs8)Zjrqu`noDX=@ +JcF:#J,~> +JcC<$JcF$qnc&IbrVZNhs8)`jr:ps5F(<=8c,'<)Z^qj>i;>jAn;,H[Vr)!/cp/CujrDN\qr`&qtr_rhp +pf%/ks&/ts;cN*^!*&hq%TZM);,^:g:eaYX84uNXr`f5(rE]D/q-X,/rF,P3!Fnt*;?'So;#jGj +;ZB_r;ZKepeAPDuXeTE<:0%F8g9'F`qtQ +G^+L[H@($fI=HctJV&N-KnbA=M2I4MNK9-_P*;,qQ^F21S"6.CTq\?YVPgDnXKAY0Z*UgG[^`l[ +]Y;.r_Sa@4a2lEHc-FY_dF6Uqf@\d1gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DDo`"Lbp@n=\ +q#C0iqY^6ir;HTcrdk*#s4.."~> +JcC<$JcF$qnc&LcrVZNhrqcWirV6Bds7ZEas7H?_rpp*Zs7$$Vs6fpSrp9[N!:'RJs6'IGroX7B +!9F.>s5F=Ci308aX/`(qrhTUjrM0.^rLs4`s.B=_s.0%W"e1sLS!ofAS+rHNR4P;7VPU)`U7n6P +St;IAV59`OQB[DcKS4o'H\R92MM[.IN,=okZZpkLLPq>pPQ$a>OoLU@Oo1C1OT:L=NrY4P_V(?2\++?i=C3@JOC4@g0?M\$`WN +ricR.`5KX6`r=$Ya8sE*r6#)aqp#,co$7H`bfn8Rr+btArbVRNr,2OQs)@sWs)J*\rcA0`G5c]- +G^4U]H[L6iIt3'#JqJ`1L51SAMMmFQO,oEdPE_?!R$jG5SXuLJU84W`Vl?\tXfnt6Za@0M\[f>b +^;%M$_o9X:ai_fOcHjndeC<($f\5'7h;7&IiT&tZk2tjjl0@U$m-X60n*ol^ +JcC<$JcF$qnc&LcrVZNhrqcWirV6Bds7ZEas7H?_rpp*Zs7$$Vs6fpSrp9[N!:'RJs6'IGroX7B +!9F.>s5F.>i/WfrMu/A2M"ui)LAlo*K`?`-KS+sVKDgDuJbjulJJtJbVPU)`U7n6PSt;IAH[9jW +E,TN(ARo1T?2eIHBP2!mBjPqP_V(?2\++?i=C3@JOC4@g.jMMi*CJre:N/Q'I[6Q2[!K +Q'_95s-N\Oqj@GQqO7JRrgEeRr+btArbVRNr,2OQs)@sWs)J*\rcA0`G5c]-G^4U]H[L6iIt3'# +JqJ`1L51SAMMmFQO,oEdPE_?!R$jG5SXuLJU84W`Vl?\tXfnt6Za@0M\[f>b^;%M$_o9X:ai_fO +cHjndeC<($f\5'7h;7&IiT&tZk2tjjl0@U$m-X60n*ol^ +JcC<$JcF$qnc&LcrVZNhrqcWirV6Bds7ZEas7H?_rpp*Zs7$$Vs6fpSrp9[N!:'RJs6'IGroX7B +!9F.>s5F(cr_ihq;uKVn;ZK_k;>jDm;#jMl;#jMj;u9Gm;>jAn;cNEi!E2np;$Kim:f1(d;#X>l +:]X?gr_W_n:J^g`r_`\l!)NSjqGI8hr_`\ls&&Jds%`Vkr(m;e!)NPgr_NPjr_X/';,L.d:JO\] +:/=\^:/:=Tr_WVjmnj$[!`2ZgrD<;er_NMis&&>`r_NGgp/1fcrDEMk!Du\]:]!ua;#jMf;ZKeq +;ZKer<lJ%-?M\%-@/aU1@fKpA +:f1(d;cEZm!)WVl"]JB";c?Zm +JcC<$JcF$qo)ARcrVZNhrqcZjr:ps5F@Di8C`=X/`(qVZ*FjU\UY^U&L_bTDtJ_SbeiVS,8ZNS+rHOR4NiQL4H+rUS=HUT:VXE +S"#h:S!K%nLkLJ4H[^['MMR1HN/_h9b0kN`KSkcePQ$a4Oo1C2OoCI=O8Ot;Nr"h8Nr4q')"bhV^Jq8ONJbam%JUi9#IsukE +J,WCD;ufkq8lT:VX5I=6BeG&qV?Chn$:qHX#*rEf>-ra>\5qI9D5s'u8@\$`WNricR.`5KX6`r=$Ya8sE*r +6#)aqp#,co?RNac-4E/CA2NCD#S;LDZ=YTE;jkWEWC1[F9-N-rc`7)H$Xd`I!pEmJ:N3&K7nr5L +PUeEMiOj5]7`k3)!nlKdg'mdKW6naZ2@oCW%T!quB_rqQNhrqcQirqu`no_sFAJcF7"J +,~> +JcC<$JcF$qo)ARcrVZNhrqcZjr:ps5F.>i8BUoMu/A1M#2u)LAuu+K`6Z*K`$K#K)1&rK(aa:?>a:]V50l\TqS*MSt):>R?Xs&/qr;uKSp<)`co +r)LO!lY +D/O0(B4b^c@qb^Dra#J/qHs50rF,P3rF>ko(2MQo`Fj]p\ssfq>U6gqu6NlrUg)?s+14"s*t~> +JcC<$JcF$qo)ARcrVZNhrqcZjr:ps5FIGi8@U7Tes&8kqr_jmc0J"]MUnaZX +Tq@pJS=?"94?>M^2Dm6E0J>+:2)[Dm2$l*+4[;t>;,:%frDNSmqbmAiqbdDmq,I,f!)i_l!)iMh +r)3MkoMY]fqGR>l!)iVir)3Ag!)iYlqbdDkrDEYp<;';n<)Z]n;$Kim:f1(d;#X;o:esk`r_W\m +:\did;?'Gm:]=2g;>rKQ2u5K62uY`82uY];4?GScpcS=7"ZoRZ;,L0g:]F2i;#a;[:]F8j:[_-[ +:]!ua;$'Qi:]4)i;=RK_:]+&_;>sDi;>jAm;!h'U;#X;l;#O8b;ZKeq;ZKer<k/9Ll%"IN/`mZOckonQ'[l+S"-%@TV8*UV5L8kWiW>+Yd1UB[^WfY]Y2%o +_8=.0`lQ9Fbg"G[dF-Opf%8R.gYCWAi8EVTj5oFckNV6rlg4!+n*fc9nac8Bo`"Lbp@n=\q#C0h +qY^6ir;HTdrdk*#s4%(!~> +JcC<$JcF'rnc&IbrVZQirqcWirV6Bds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'RJs6'IGroX7B +!9F.>&)uR,i8EMMX/`+rVP^2dV#I.bUALVaT`1S`T)YA]S,f&WS-,7LR@4&Cr1!JMrL"XSP_F[' +TU_aMTq@pJS=?"9R$a5#Lkg\8IX?BoreLu@M2R@6G,i>1L\uo+L&Q`*L&Qc$L%g?$L&Zi+KDgK#Ka3?dKnP)1 +JV*iO!J5n%JcLH%Jd-dVJ5fNJ<;fbq<;ohn;ufkqa, +q3CrF!13YMs-EeSR@3flJ%-?M\%.@/XO1 +@f9g8AH0.=[/dT5YQ_/I`5T^8rl>&[!6P,]!6kGe!mJp6rm(,]!m]$6qeGk@rG;IMrGMXRs)@sW +s)J*\rcE%#G'8(RG^4U]H[L6iIXls"JqJ`1L51SAMMmFQO,oEdPEhE"R$jG6St;UKUSO`aW2co" +Xfnt7ZaI6N\[oGe^VI_'`5Tds_o`Fj]p\ssfq>^s+14"s*t~> +JcC<$JcF'rnc&IbrVZQirqcWirV6Bds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'RJs6'IGroX7B +!9F.>$0'q&i8EMMMi3JiM>i>.L\c`*L&Qc)K`Hf(KD^>sJc:8oJK.s5@pi>\F/#A%T:VXES"#h5 +R$VT#AS#7W?!_.AB+&BeBk(_$T58FcG'a+:r-nQlq0r?lpO*!f!.+Hfrd=ZkpjD^\!IB%gGlN'f +GQ<$_GlN'hGQE#3rcS!XrH7gUpN6IXqfDCM!-/!W!-/!W!,qXOs).pUDuE<.9DqQ[9D2'Y9E%lf +;?9`qrDNPlrDE\o;H!BhrG;OPr,;IM!,_OLqeu+Eo5FYHqJZCQr,;RRrbqdTrGhaSpMp%Kqf2RT +#BP!/G'8"MFSg4ZG5ZXaGQ`58G^4T5HMr3dHie_FIenQiJGt,sJcgXYKS0#PrIt*&!/:E,s+gT0% +Z-!hEcH&9D/3cqA7T2:r*95,rEf>-ra>\5qI9D5rF?%iMi*CJre:N/Q'I[5Q2d'KQM6dGQih +r*GPj5f=akNM0plKmm)mdKW6nc&([oCW%T!quB_rqQNhs8)ZjrVZZnoDX=@JcF7"J,~> +JcC<$JcF'rnc&IbrVZQirqcWirV6Bds7ZEas7H?_rpp*Zs7$$V!q,ICrp9[N!:'RJs6'IGroX7B +!9F.>#iah%i8EMM +R@'A.2`3BI0eb761c7-LrA=jJ6oe(=;G^:jqGR>lqbmAiqbmGmqGdJn!)i\m!)i_l!)iMhr)3Mk +oMY]fqGR>l!)iVi!E)eo;ZBSo;Z0Jm;YsDi;?0Sm;?9]qp/M,m;uBJs:esnb;,C*g;$0Wj:Jh$f +!DlSf;#aDl:]NBM2Z>Z72Z>Z32uko:2ZG`82ZGo>3WM8:4S_,B4?GYfr&Y'F:Jah^:@V-Z;#a>[ +;#X8j;#X5j;#*uf:]=2j;=[Q`:]!u_;>j>i;>jAm;=.0V;#X;l;#O8];ZKer<-ra>\5qI9D5rFGq*!`2for_WYl +rDE\q<)iiqqGdMpr`&qtrDNbss_o`Fj] +p\ssfq>^s+14"s*t~> +JcC<$JcF'ro)ARcrVZNhrqcZjr:p&E;[-i8EMMhPmHOVP^2dUnn!bqP*n]s.K@`s.97]!1a"Ws-s+ZRf8`SRfAlRRK/cTRf/Wr +J!5S;BqCiVL7t62St):>R[BJ/Q'I)XJp_ljK8GMDreh)"F*E\?H\-p-OSk=?P3S20P5g[COSP"= +OSt=?OSk.>Nr=q;Nr"h7NrP.ANfT4mN<"q:MZJ]lreUQ/r.b3)re(?,KS9,SpP/[$s+LE)re1-% +#DRqdKS+l-K)L6$Jqq-O&-s'>h8 +?sm>IrEfJ/!aJr7r*0/GrH\NlI!kj=s*F]lrI"6as*=Kfrd4Wi!IB+lHMr3kIJ\ElIK"TqI=?\E +JGaojJH(*"J:[]MqgnZs#(qS^K7ei1r.PE2LPUeDMMd=LrJUZ6"c\P%NfK1tNW>.>O9:W.P*>d- +q3;&JQ'R^5Q3/VT)P>jOb%n,H?aILE,0^ +JcC<$JcF'ro)ARcrVZNhrqcZjr:p$0'q&i8EMMhM[9fM>i>.L\uo+L&Zi*K`Hf(KD^?$JHLFRJUm6@/7*.%?rhDkCh063St;IA +S!o_3Q^*hK@pr_L?=[_`BkM-o?=RSiJo,IKGC9=IWBFIDes0&An>I^J,W^O?2e1,?i=C3@JXI3A,Ts;AHRjJMMV7d",3#* +QMZpJPa;'2rg3VOqjI8L!LfGQCA2NCD#S;LDZ=VTE;ad)EcZ;DFEMbMGB\:WH?spcI=6QpJ:W<) +KS>/9Ll%"IN/`m[OckonQC!u-S"-(BTV8-VVPgAmX0&P/Yd1UC[^`l[]Y2(q_Sa@3a2lEHbg+P^ +dF6Uqf@\d1gYL]Ci8N\UjQ5OekiqBum-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$ +e,Op~> +JcC<$JcF'ro)ARcrVZNhrqcZjr:p#iah%i8EMMhGjJQ!*&epqGdJps&T,!!E<(s +R[BJ/Q'F3^0eb761c7-L1c7-W6q'R::/Fed;u'>k;u0Dl;?'Po;uKSo;u0Jn;uKVn;u]bo;#jMe +;Zfop;,[?ioMPZfqGR>l!)iPgr_ibn!)ibms&/_mqbdDkrDEYp<;';m<)`]l"].uk;,L0g;$0Wj +:Jh$f!DlSi:]i[92E:[orAFU5!]N"qr\sd6r\s^6!&sj7s#9s9s#gZ;#a>j;#X8d;$'Qi:]4)i;=RK_:]+&_;>sDj;>jAn;,H[VqG@2hs%r\l!)iAd +!*&qts&8tsr_i\n!*&bmrDEYp<:!N`<;]bqQ8P]7irE]D/qHs2/raGY4 +rF>e:rac1/:fC[C3TU]=bhl^r"".`Q-'BbKS8XdF$Fme^rI,g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8B +o^qhLp@e7Zq#C0iqY^6ir;HTdrdk*#s3q!u~> +JcC<$JcF*snc&IbrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6fpSrp0^PlK\B5!U/_Gk5XNC +jSn0Lio/kSi8V; +C7LcUM1^MR[BJ/Q'IStP'q_5LPCVAMi*F?G'][$IY*<4q31`>nr`m4rfR5DrfR/@qN:c= +s,m8AqiC]8s,Qu;r/Uf%oSij0regf7M>i>1L\li+L&Q`,KnP-SL%g?%L&Qc*KDpQ#KaEKf +KnP)1JV&H(qcWr$"BST'<*&lq!EE+t;u]hq;uBVo;u]hs< +!+#P0r`oV2>?kG2>6eD;>[2T%I!kj=s*=ZlrI"6a!IB%gHN&6kHN&3iHiJBlHiABmIJ\EkIK"Tp +IXh9GrI=Nks*k*#JV!fNqgn]ts+:H-K7ei1r.Y0*#D\+lMMd=LMYrA4N;eh:NW>.:Nr>%@Ockq* +Pl$^GPl?pKQBhB6s-EeSR@3i=rgWqXpRV2Qr1=IcJphrjGBIhDChmsT>[786rEfA.rF#V5q-s>5 +rFGh;"1P\G[/R91Xi14X!65#Ys2Y2_r6,,arltJe!6tMgo?RE^qeGh?rbVRNr,2OQ!-%mVGB.bG +FEDYKG'A.TH$Xd`I!pElJ:N3&K7nr5LPUeEN/WdXOHG]jQ'Rf)R[]h=T:qsRUo(&hWiN8)Yd(OA +[^N]V]=bkm_8=+/`lQ9EbK\>YdF-Oof%8R.g>(N@hr*JRj5f@bkNV6rlg4!*mdKW6nac8Bo`"O` +p&Ojcq#C0iqY^6ir;HTdrdk*#s3q!u~> +JcC<$JcF*snc&IbrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6fpSrp0^PlK\B5!U/_Gk5XNC +jSn0Gio/kSi8QqLAElr-eEjrdFQhrd4Tir-SHkr-S3doR$U`qfi*d +rHJkr_Wnu;,C+d;,_B3D>S5JDtS#GDZFbO +DuX_ODZFbRDuO_TDuXeSEW'kMEVsePEW'qXF8p=_G'3e+r,qp\r-/0cs*+Kfs*=TirHn?f!e#NH +r-n`rJ,Fg"It3'#Jbt'!K*$^YKD1&tL%g?$L]3,-M%5&VE,TZ2CM@BmA7U-o>lJ%-?Me+.@/aU1 +@fBm9AGg!@Mi*CJrItB=QBqE5!L/rFQi`S?Qi/9Ll%"JN/is\OckroQC+&.S"-(BTqS6WVPgDnX0&P/Z*UgG +[^`l[]Y;.s_Sa@4aN;TJc-FY_daZdtf@\g2gtgiEi8N_VjQ>Ufl07L!m-O--n*fc9o()DErq6 +JcC<$JcF*snc&IbrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6fpSrp0^PlK\B5!U/_Gk5XNC +jSn0Fio/kSi8U=Q<;BPj<<#qutqR[BJ/ +Q'IStOt\RH2)I0L1c7-E6q'X?:JanemSa$]!`Drqr)3Pnr)EYorDNVn!)ibm!)iJg!)iViohkcg +qGR>l!)iPgr_ibn!)ibms&/_mqbdDkrDEYp<;';m<)`]l!DlSk;#jGk;$0Wj:Jh$fs#10B2Dm?M +2`Z62Z>Z33;kc82ubf949@T*3rV5;4S_,?48qA@3se#55<_7o4?bqnr]^3T +r_NSjmSNmYs%r\j!)WJgr_NMi!)`8_s%iPhp/1fcr)*Gk!Du\]:\die;?'Jm;?'Pc;ZKer/9Ll%"JN/is\OckroQC+&.S"-(BTqS6WVPgDnX0&P/Z*UgG[^`l[]Y;.s +_Sa@4aN;TJc-FY_daZdtf@\g2gtgiEi8N_VjQ>Ufl07L!m-O--n*fc9o()DErq6 +JcC<$JcF*snc&LcrVZNhrqcZjr:p.#Nfs4%r0$W5r/gr@rf[;D +r/gf`81L\li+L&Qc*K`Hf%L%^9$L&Zi+KDpQ" +Ka!3bKnNT5qcO>2>?P'0=B&:$6S89>[1H9r`oGL!d]3?rI"6as*=NgrHnNh!.+Wk!.+Wls*afmrdFcn +!e#QJrIFfqpON6ms+10"qgn]ts+C?)!eZ/Zr.Y0*!f)Sgr/1B0!0$o:pl><7"-Jb0PPg[BPlR'G +Q2R$JQNEPBRJEI=$6`F`VGrbVRNr,2OQ!-%mVEcQ5BFEDYKG'A.TH$Xd`I!pEm +J:N3&K7nr5LP^kFN/WdXOHPckQ'Rf*R[]k>T:r!TUo(&hWiW>*Yd(OA[^WfY]Y(tn_8=.0`lQ9F +bg"G[dF-Opf%8U/gYCWAi8EVTj5oFckiq?slg4$,n*fc9rpg*]o`"Lbp@n=\q#C0iqY^6hr;HTd +rdk*#s3q!u~> +JcC<$JcF*snc&LcrVZNhrqcZjr:pW2.L\uo&Ka!-^JqAW-rdt*"s+(-!s+'`ms*u"nDdd$RFE),,@:NhZ +Jt&6uR$a5*Q'@JqOc]NS%VTKgBnKu5ODAZRFaALcqLAElr-eBis*aWhs*OZirHnQlr-S3do6UI_ +qfr-drceEgp3?U_s*4Qf!d8^/piQFVpiQ4Ps)e-Zol:+R:/Cd_rD!5a"\ME[8kVeT9DqK_9E%W` +9*.^Y9D;*_92&#P9E%lg;ZBSp<)``nr_r_ms&&bnr)!Glr)!bs;,C+g;c6Lj;>tJ0Dt\)HDuXeV +DZFbRDuX_PDuXeSDuO_TDuO_SEVseMEVsePEW'qXF8p@^G5cU\Fo?L]GQ2pfGQ2pfH2W'fHhr-i +IK+cpIfb(KJ,Om#It3'#Jbt&rKD:,uL%g?$L]*&-M>rA?J9#RIDes0%AnGR`Ac?!6?Me+.@/aU2 +@f9g8AGKg:M?&J2L'!X+QMQjHQhQjKQC!s;R/EBORf&ZOCA)HBD#S;LDZ=VTE;acsEcZ;DFEMbM +GB\:WH?spcI=6TqJ:W<)KS>/9M2@+KN/is\P*2&pQC+)/S"6.CTq\?YVPgDnXKAY0Z*UgG\%0)_ +]Y;.s_SjF5aN;WLc-F\`daZguf@em4gtgiFi8WeWjlY^hl07L!m-X60n*olHncA@Srq-?dp\4[^ +s7u]kr;6HjrVcBfJcC<$e,Op~> +JcC<$JcF*snc&LcrVZNhrqcZjr:p!A2)R3J6UXRA:JXkgpeq&fp/:ifr_i_or)E\pr)3Pn!)i_l!)iMh!)ien!)ibmohtfgqbmGm +s&/VhrDEYn;Z0Jm;Yj>i;?0Sn;ZBYq<;';m<)WWks%r\l!)WVk"].3=3B&tt2[))s2E!KRpbr+/ +r\jX4r\ja7qDeF3s#9s9s#^BF3]T8#48V/94o[VC4T7DK4?btn5!;"j5!T!0#!G.54]"sNm83gY +r_WVj!)WJg!`2Zgr_WVlnkf?^qb[#ar_WMirDEVlmSEXTs&&ems&&eoo2>Wgr`/tts&8qqrDW_q +q,@8jnl#Nfq,78mrDihtrE'#$rE0,!r_WPh"ADH\8PB%grEfA.rF#V5qI9D5rFG_8!`2for_WYl +rDEYp<;oer<;'>i;uTeq<<#qu<;oer<;LA'C]8/LD>\;ODZFbTEH6)@F*)MHG'8(RG^4U]H[L6i +It3'#JqJ`1L51VBMN!LSO-#NfPa.Q%R@9V9StD^NUnjlcWN*&%Y->1;['mHS]"G\i^VRe*`Q$!@ +bKS5Vd*^:ke^i@*g=tE=hVd>Oj5]7`k32'olKdg(mdKW6nc&([oCW%T!quB_rqQNhs8)ZjrVZWm +o_sFAJcF4!J,~> +JcC<$JcF*so)ARcrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6]mSrp9[N!:'RJ#O(@6k2tde +jSn0Kio/kSi8JV8f?rf[2CqNCE3r/gc;r/gc; +plPE7!07#;!06o:r/Lo@NfK0\oo/s1regi8M2D4fs+gK+s+UH*p4`3ps+UK+s+C<(qLo)T>$>'3 +>5MG/>$G*3=BJR&<`]3"!EN5"QJr#YTP*(lgqi:`=qi:o@NK0$[O7&&)NW4t9NW4t;NVeb2 +NW"h2NW+k;NK!jrs,?l8oo9$5qN1**q2kK7rK-u?pQ535qiClAP*5g,qN1N8rK@,Ar0%#@s-!AF +qi^uCr0%)Ds-*MIrKR8Gs-ESLr0I;JqO%8MrL!VQ!h,UJqj[YWqjdPSrgs%[rLiqZ!2B1^rhTCe +!2fanri#gqri6!t!35ps!3H1%qQBh$s02O.rj)L0!4Mj8s1&'=#J.R]]t_@u_>_:U_o0L4`l?'u +a90T.bg$.4rm1Vk(X^UWd*^:ie'umtf%8R,g"P39gtgfChYuI5iVqj:j8S->jWWBu[]#jgR$3\l +L4k)+HZs^YF`hkLMMR%AIWLO5Q'RGjgPseaqJZ7Ks)7mUrbhgTDu,RiOnb%;AHHCPA,Tj<@:3LA +?iFC3?2In+>PhUt=o;J&>Pqb+?2n71?P$UR@:E\UA7T7_AnPdjBkqMZs7MHHN_be#Pa.T&R[]k> +T:r!TV5L8lX0&P/Z*UgG\%0)_]t_A"_o9X:aND]NcHsteeCE.%g"P39h;@/LioB+]k3(smlKdg' +mI'H3nF?)?oCW%Ts7QHerV-BgrqcQirqu`no_sFAJcGcMJ,~> +JcC<$JcGTHo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nknrHn*f]2m-Es$l0%3kjQ#:Zi8q5Q'@GoO,f0WM26n?pe_#c +pe:EV!)EDcqc+8,;,C(b:JOVV6:O:/77B[;8knYJqG.#cs%rAaqb[)aq,$i^rD*,`r_sDl:\dfe:\mid:\di`;>sGn;u9Jh;u]_q;>O2f;Zouq;,U5h_+>5MP%>lJ"/>lJ%/?M\"3?t!JQ@f9j9B)cKGBPD0orb;@H"`%pkD/O4i +D?OlsE,p!uF8U.[FoHRaG7JkCH?spbI!pElIXcitJ,OosJJNNJ@p;i.9M%ZA6pX"$4ZPP`4$5Sb +7/fIU7RBI077-ZHpJpZ_%CisZ]">Yh^;.S%_Sa=j`M,r`f8'p0%;sr`f;*s'>Y2 +ra-4E@: +JcC<$JcGTHo`"gfrqu]ks8)ckrqQNf!;?Eb=S24Vo()>?n*f]3m-O$%l0.rj`iV:esh\:!/m?H\%!2OdMiF_SO%&^:h2X]DK2=\c'#<\+[91[J[K5 +[/m_DrjMC*q6^10r3ZF1rO2[4rO)^6o="S+s1&$:!4`$;s1&*>osjk/pppI9qmuU5qR?C4r42j= +o""b2qn)m@rk8foZmNarR(Yn +rR:errmq)#rn.2&q:bi&s4dV1rn[_6i8FUnr8RS5rT+1EkNM-orTaFK!:9^P"RbaJnF?MK"7u0X +p\jmeq>^9lr;O8,'^OGqa2Ps<_m?A@VkK`WTU_XDS!j8B$(-X]_90m!ZDb(s\bNc3]@?lTOnk1> +Onc`k^Au(@^].pFAcH<@A,]s;@K0a5?iOI3?2@h'>PVJ">Ph\*?2n70?P?gU@:E\UA7T7_AnPdj +BkhF!D/T1Lr4`3Es1SKJrP&3Crk)$iPE_?!R$sM8StMdPUnsufWiN8)Yd(OA[^WfY]Y2(q_Sa@4 +aN;TJc-F\`daZguf@em4h;-uHiSrnYjlYail0@U$m-X60n*ol^ +JcC<$JcGTHo`"gfrqu]ks8)ckrqQNf!;?Eb?n*f]3m-O$%l0.1N;\_9N;JS8NfEgos,[#Frg!MLr0R>IrKmAJrgE\O".>UIS,8`USc##TSc,/YTDbGXT`Ch\U].(cV#[Ck +VuEXpWVrjsW;rsqX8]7#XoP[)Y5PR(YQ1s,ZMq62[f*Z8\Gj#V]">Vg^;%J"_8=(,_o0L4`l?'? +aN;TKbg$.4s3L\k!7CemrmLeqs472%s4[J-!8[Y2s5l.b$>5MP$>lS+0?N"4E?t!JQ@UiqZAS#IdBP;*pCMRd)q>^ASqiCH2:Qgp+Q'[l, +S"6.DTqeE[Vl6VrXfen5Za@0M\[oGe^VI_(`Q$!@b0/&Td*^:ke^i@*g=tH>hr*JQj5f=akNM0q +lg4!*mdKW6nac8Bo`"O`p&Ojcq#C0iqY^6ir;HTdrdk*#s8W+L~> +JcC<$JcGTHo`"gfrqu]ks8)ckrqQNf!;?Eb?n*f]3m-O$%l0.dq,$f]r_E2`rD*;e +rD*>ds%`Phr_WGg"].uj:f'sd:B+,c:&n#f9_V9]:@h6^:/C[\nk\gQr_`Ge!)NSh!)WYln50!Z +s%r_kq+q&eqG.#cqG?ubpepod!E)en;?0Yp;Z'Gp;Gg$G37qciu'r`oM/ra#P1rEfP4ra5Y5s'kq;rFQ4GBP;*oB`;`GC'JHiD/F0-D>nGQE;jnW +F8U.[FoQXaGQ2sgHN/jDj;Z]j/B)ZBAAH-0=@fKm:@/OC3?N+7,>l.b$>5MP$>lS+0?N"4E?t!JQ +@UiqZAS#IdBP;*pCMRd)q>]tar_req:Qgp+Q'[l,S"6.DTqeE[Vl6VrXfen5Za@0M\[oGe^VI_( +`Q$!@b0/&Td*^:ke^i@*g=tH>hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo`"O`p&Ojcq#C0iqY^6i +r;HTdrdk*#s8W+L~> +JcC<$JcGTHo`"gfrqu]ks8)ckrV-Hgp@eLY=7l+To'u5g&B_& +g&.fKVtd4eWW&jp])T><])T;Q:!/m?H\$p0OdMiC]"l(p]tF<](rl7\,Wl:\,;%D_uI[R`W*sUa8O$Va8rpBaSs6p9`o()DDo_%tX +q#:'jqYU6'rtkOle]PnN_ofZtWMuegStV^DSXc1;Q^@];$^I%&\tkUoR$h2tFn3*;])'%frrA/R +Oo1CBOnZZi^\ttA^].pHB)Q<@A,p-<@fKm:@/OC2?N+7(>l7h#>lJ%/?N"72?iXX7@M30]A7]=a +B4tsmC27U$D/O92EVoe3^AG\F^AGTCPEhE"R$sM8StMdPUo(&hWiN8)Yd(OA[^WfY]Y2(q_Sa@4 +aN;TJc-F\`daZguf@em4gtglGiSrnYjlYail0@U$m-X60n*ol^ +JcC<$JcGTHo`"gfrqu]ks8)ckrV-Hgp@eLYr/^c9rf?K-!f`5#rf-r:rJgf8!0-l9pl562r/C]: +rf-o9!KE';NW4t8NW5"=NVJM6O84n*O8+h7O8P+5ZT_Y;]U@tA] +V#$nfVZ*LmW;`dqWrK$uWr&gsXT#@$XoP[)Y5YX)YlD!-Z2h61[/[T5[fEr;\HfaZ]tM.q^qp#e% +`?6'`Poj;a2l?DbKS5Urm(PiqU#5is3q,#f%0iQ#hn%ggtgfChV\=j!9*n9)rorfrqJZ(Fs)7Rls,m8CrK6r!+Yt:s'bq8r*TG0ra#5&r*/o#ra#P1rEoS4!+Gk9&n>H_AS#IdBP;*pCMRa'DJsK6qu?SUq +iCH2<0NT4Q^F52SXuLJUSOcbWN*#$Y->1;['mHS]"G_k^r"".`lQ9EbK\>ZdF-Opf%8U/gYCWBi +8N\UjQ5OekiqBum-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$s8RT~> +JcC<$JcGTHo`"gfrqu]ks8)ckrV-Hgp@eLY=7l+To'u5O)j;,C'f:&n)W +;#=,i;#a>h:]jKi:f$p_r_N>dqGHubqGRGn;,R0fr)$>-7>5MP%>lJ"1>[:Y7?MRt-@0'hIrabt>s(D@F!GQ6HC&ViIC]8/UDJa6. +DJsK6rc8!Z"*A[-FT-F_G5ldcH2i3jHiJKqIXQ\DIk#tuIrf7-<`)[c8Ol375<_7l3BK8a4?>J^ +3BB2]3''/f4Zb\a0eOFq.f33?PDD% +?2n70?iOL6@K'^K@q9+]AS,RgBPD3sCM[j*DfB^ns6s"c;cJsGQ'[l,S"6.DTqeE\Vl?\sXfen5 +Za@0M\[oGe^VI_(`Q$!@b0/&Td*^:ke^i@*g=tE=hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo^qhL +p@e7Zq#C0iqY^6ir;HTdrdk*#s8W+L~> +JcC<$JcGQGo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nl##In*f]3m-Es$l0.9ljl>C[i8EJJgtLK7 +f@JI#da?Cdc-+8Na2Q!6_SEq"]XkY_[^q6QBdYsOH5B[MM[,Ag&B_% +g%D<=WVi^p\b3NF\]pPZH[pm1OI2Z<\\Gkl]`#JB\cK@QrOMj9!4VF*!4Da5o!S8"!4Da3rO)U4 +rj;d8[JmW7[Igp*\,No9[fX(K\,No;\b3K/\bWi:\biu6\G`o:[K*f7\GWo;](*?2])0)@]XtfR +]E5d\^AYhA_#2%F_Y:qJ`;R[T`r*mT`r=$Ua9B].bKJ,RrQP>foZmNarmC_nrR1esec+/!fDXA$ +g%jA$g]-%/h>Z74hr*GliV_^3j8J'Ck3(sll0834s6K^Os6U3^n*fc9nac8Bo_%qVq#C0iq>pNn +^&JW;gsO?f_oBI$X/DnlT:__RRhhH\Q^=)*Q^*l#PE_5mR-AMY4OS])0+fs8J,POoCO: +_#1tF_"kbEBEDgYB)ZBAAH-0<@fKm9@/OC2?N"0u>lJ%.?Mn.3?t!LC@Kp=QA7]=aBDuQPBkhF" +D/O60E,fo>r;ZT-!kuFarkSQKs1\HF;jEZ8R$sM8StMdPUo(&hWiW>+Yd(OA[^WfY]Y2(q_Sa@4 +aN;TJc-F\`daZguf@em4gtglGiSrnYjlYail0@U$m-X60n*ol^ +JcC<$JcGQGo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nkelGn*f]3m-Es$l0.9ljl>C[i8EJJgtLK7 +f@JI#da?Cdc-+8Na2Q!6_SEq"]XkY_[^q6QBdYsOH5B[MM[,]SF2%+ +K)^o)OUdJVGD^'LE--;NJVB&EOSk.>OSt7%,NWP3#NrG%Ont.@Ockn,Ont18Oo:I@Oo:IAOoCOD +PP^OBPPp[EPQ$dHPPpaEQ2d0JQi36JQhm*LRJ`EPRJrWTS,8]USbnrSSc55YTDbGXT`Ch\U].(c +V#[ClVuEXoWW&psW;rsqX8T1#XoP[(Y5YX)YQ1s,ZMq33[C6%C!4`$=)7mGn]tV7s_84"*_o'F3 +`Q#pADfK`9DfBW5DKK)N9jC%i@qbe"qMas(df9/^oksejooT08r0%)BqiLej!bZ+W +ral+?s'u":s'bn7r*TG0rE\ksra#M0r*KM5@:B.E#%M1SAS#Idrb)[RC27X&DJjB3EH6-us87uU +O8+`8O,fKkQ^F52SXuLJUSOcbWN*&%YHY:<['mHS]"G_k^r"".`lQ9EbK\>ZdF-Opf%8U/gYCWB +i8N\UjQ5OekiqBum-O--n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$s8RT~> +JcC<$JcGQGo`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nl##In*f]3m-Es$l0.9ljl>C[i8EJJgtLK7 +f@JI#da?Cdc-+8Na2Q!6_SEq"]XkY_[^q6QBdYsOH5B[MM[*b;#!lf +;"[QS:@_Em>XCeF6:+127n?AH:]F/i:\[Zb:]=2a:]F8k;>sDg:\di]:]4&d:B45j:]=)i:JUmb +r(d8dr_EGgr_WGg!DlSk:]O;i:B+,d:B+&f9__?]:@h6^:/C[\nk\dPs&&Pf!)NSh!)MuYqbdAi +s%iPhs%`Yl:\dcc:\di`;>3ub;u]_q;>O2f;Z]io;>sJn;u]hm;ZKei% +=Tho4>?Y5.>Pqb*?2n.0?2e1+?NabF@:E^EAGp*DB4tsmBP@BZs(_RLr,)FN!cN$trc8$[r,hs] +rc\lJ%.?Mn.3?t!LC@Kp=QA7]=a +BDuQPBkhF"D/O60E,fo>r;ZRkpJh)i;jEZ8R$sM8StMdPUo(&hWiW>+Yd(OA[^WfY]Y2(q_Sa@4 +aN;TJc-F\`daZguf@em4gtglGiSrnYjlYail0@U$m-X60n*ol^ +JcC<$JcGQGo`"gfrqu]ks8)ckrV0Rjp@e1Po^qbGo'u5rODm:l*g/jo!JD(r3lU4r3lX5 +oX=\,rj_p9!k>_Krj`!=osjk/q7?U:qmuX6r3u^7!4Vm9r42j=n[\\2pq-I:!kl=^rP/-Cr5&6H +pVR!LrPefVr5\`Trl=oW"j+p0bKS3/blH&\cN)>kdJqYne,Rqsf)F;"f`'S"gA]k,g]610hZ)L5 +i;_d5iqqa9jSe0Ck3(sll2BlKlg4!;m0)kGnF5uIncSLUp@nR]s7u]k!W2f/rtt1Xbf@]@ahG'] +W2HD_T:VOBS=5n6QC+$TV8-VVPgDnXKA\1ZEpsI\@K2`]t_A"_o9X:ai_fOcHsteeCE.% +g"P39h;@/LioB+]k3(smlKdg'mI'H3nF?)?oCV\Jp%J+RrV6Egs8)Zjrqu`no_sFAJcGcMJ,~> +JcC<$JcGQGo`"gfrqu]ks8)ckrV0Rjp@e1Po^qbGo'u5plP<6qN(iBP*1riq2kE7rK@)@rK@,Arf[;FqNClB +rK@/Ds-*MIr072Gs-ESLrKdAJqO%;Nr0[MPs-`qWqjd\Wr1*YTrLWt[rLiqZ!huHapS7baq5"(g +rhoaori,ptri#mtql9^uriQ1&!3cC)rNH7*!3uO/"gbSC[C3OB\,EiD]"G_j^;.P#_8?2h%)g-( +`lH-@aiV]Lc-?75s3LYj#g^lEdF-IleCFQL"5);\g]$".h#ZBir89?hin)&QVOs9AP`h#]Jpi#n +G'A.RFE;MDEcH,>E,]f:E,]]4D/X<2DJrT]ASOb,A7bb"qi(9/!0$o:cis'u":s'bn7qd98-nm23#r*TG2!+Gh8(h7)eAS#IdB4tsmC27U$D/O92 +EH-#@FERQ^r/gf:pPr15QC+)/S"6.DTqeE\Vl?\tXfnt7ZaI6O\[oGe^VI_(`Q$!@b0/&Td*^:k +e^i@*g=tE=hr*JQj5f=akNM0qlg4!*mdKW6nac8Bo^qhLp@e7Zq#C0iqY^6ir;HTdrdk*#s8W+L~> +JcC<$JcGQGo`"gfrqu]ks8)ckrV0Rjp@e1Po^qbGo'u5fZ5stW<"[tpM8P)\N:\@H_:]=2b:]F8j;>sDh:\[c]:]*ud:]F8j:]=,e:]4&f:&[of +:]4,e;?'Gq:Jak`:]4&g:\mid:&[i]:&[o[:]F/i:\dcV:[q9];>3ua;Z]io;>O2g;Z]io;>sJn;uTbl;ZKeq<<-(s$Lu0r*0)(r`oP0?2\++?N=L5@0'hIrFGk=rb)@IBP@BZ");UeD#A/LD?4Zqrc8!Zs)\co +FEDYJG'8+SG^4R\H@(#;IK"[5Is,O6>#A-j8ju075<_4m3BT>a4#]2\3]R+!'K7p/3BK5\3B&rY +4?=uI2*!QO1cP20pJq8or`0Z:ZF%$I[^NZT\[f>b^:q@t_86,fs2,Ge`lQ9Db0%oOc-=P[d*L%b +dJhPseCE1(gAX;95QZdF-Opf%8U/gYCWBi8N\UjQ5OekiqBum-O--n*fc9o()DE +o_%nNp@nO\s7u]kr;6KkrVcBfJcC<$s8RT~> +JcC<$JcGQGo`"gfrqu]krqcZjrqHQhp@eLY;tT\Po'u5q6QBdYsOH5B[MY#L$W;ELh +W;NXpW;ERj\b`lM\[n*AI"@$1Od2H8Ye@]]]=PTL\c'&<\*:?m[ILX'[J[K5[JRB4[I^j)\,No6 +\,No;\b3K/\bWi:\biu7\GWi9[K*f6\G`u<](*?2](io8]E#YE^AbnB_#2%F_Y:tJ`;[aU`r*mT +`r=$Ta99W-bKS3/blH&\cN)>kdJhSmdf\+Mf%0iPr7M&&ptG`%s4dV1rn[e8i8ESQqr7J4rT+4F +kNM-ol2BlYlg4!*mI'H3nF5u=o(2JGpAOadq>U3kqu+A2)#NOJb/VH=`P/UVVP^)[St)7ra2,BT +Q^@];%@<s'tt9s'bn7pg<]#q-X/0raGe8s'l%>racjWB4kmkBkhF!Ci+'-DfB]:F*)MIGBa&d +pV?dCr4r?Is1V?tR@B_;StMdPUo(&hWiW>+Yd1UC[^`lZ]Y2(q_Sa@4aN;TJc-F\`daZguf@em4 +gtgiFi8WeXjlYail07O#m-X60n*ol^ +JcC<$JcGQGo`"gfrqu]krqcZjrqHQhp@eLY;tT\Po'u5q6QBdYsOH5B[MY!A-KDgE! +KDL]+OUR>/GDKjHDKBuJItN^ZO8b7?O8Y+:O6Vc)N<"q:NW"h9NW"n3NVnb6NW5%[j)hr*DMi8N"oYGIhWQ]dGhKn4Z"rH8EgS!B.sF)u@#DuaqX +E;segD/O60Ci=3.Ci"!.D.[U'F*3K?N;&>2N6_J"Dtn5MO8Y+:O84n:Oo:IBOoCFECMITurFl4D +!+u1@s().>r*o\7ra>M.oj7H$s'Yh7raPn;!+c(?(1q2lBP;*pCMRa'DJjB3EH6,BFEVkPrr;qY +qiCK3s,U$ER@B_;StMdPUo(&hWiW>+Yd1UC[^`lZ]Y2(q_Sa@4aN;TJc-F\`daZguf@em4gtgiF +i8WeXjlYail07O#m-X60n*ol^ +JcC<$JcGQGo`"gfrqu]krqcZjrqHQhp@eLY=7l+To'u5q6QBdYsOH5B[MGI#E;#!lf +;#O/e:%_9\:]=,[b!)WVkr_WJfq,$f]r(d2ds%r\js%`Ge +rD*>ds%`Phr_WGg##J)k:f'q`rD*AgqG%#brClu\r_E)]s%WPiq+gKVnPK6_peUrdr_aQqD/=', +DJsK6rc8!ZrH/$]!I&_dGlN'hH3&A?rI#Z7Ir]++=&D^d8Oc*55s7@m3BB/]:.n,I3]]8^r\t$@ +4#o;^r]('?3]f>#2[;<'3B9/_5XG9IpK%8n'="jJZEppF[C3QS\[oDd^:q@t_>M.Y_o9[EG'A00s7'%f<;f`mR$jG6SXuLJ +USOcbWN*&%YHY==[C3TU]"G_k^r"".`lQ9EbK\>ZdF-Opf%8U/gYCWAi8EVTjQ5Oekiq?tm-O-- +n*fc9o()DEo_%nNp@nO\s7u]kr;6KkrVcBfJcC<$s8RT~> +JcC<$JcGNFo`"gfrqu]ks8)ckrqQNf!;?Eb;tT\Qo()>?n*f]3m-O$%l0. +oXOb.q7?U:qmuX6r3u^7!4Vj8rOMs>n[\\2pq-I:!58BGrkJ6Dqn`0HpV[$Lrl+lVrQ"fTrl=oW +!m/U.rlkAds3C8_s3UenrmLbo!S#[!f)OA"f`'S"gA]k,g]610h>lI4huMa4iqqa9jSe0Ck3(pk +l2BoIlN$;Nm0)kGn*olHncSLUp%J@ZrqZZmr5/IWp#"3?b/D02\?;d/UnFD>_#1tHCBA6b +C&VfGBE)TBAcH<@A,Kg8@JsU$?i=C4@JjR9@q9-LAJf#lB4tsmC27U$D/O60E,fl^s+11Ms*t~> +JcC<$JcGNFo`"gfrqu]ks8)ckrqQNf!;?Eb;tT\Qo()>?n*f]3m-O$%l0.q%(r/^`:rfQu;q2tN8"Hek1OcfF#qN:`>r/pr@r/q#Bs-*;Bs-*ADs-*JI +s-*DGrg!JKrKmGJr0R8Is-`eP"IY^JR[a2E!1j%XqORVWr1Eq\pn7b`US@LXs.oLfs/,dnri#gq +!36!ss/Q!t!3H1%riQ7)riZ4's0)L.riu^6['[6K[f3c9\Gs,>\cf[Z^;%J__#V@O_u@U[`lH-@ +ai_cLrQP>frm*mWcd:"ad*U1gdaZgtf%8R-g=tB;gtgfChr!AMgrHn(Tq%O8OH#'LJ:;ijGBS/) +R$<\kM26n,DfBZ6E,TW3D>nGcD/Xr*oY6rF##"rF#Y6r*f_;A7Y[N(hRDnBP;*pCMRa'DJjB3 +EH-#?FEMbNG^98frfHl8qMn71R@B_+Yd1UC[^`lZ]Y2(q_Sa@4aN;TJc-F\` +daZguf@em4gtgiFi8WeXjlYail07O#m-X60n*ol +JcC<$JcGNFo`"gfrqu]ks8)ckrqQNf!;?Eb;tT\Qo()>?n*f]3m-O$%l0.c55nRWV4Q_o0R9rlP2_"j>-7c +-FW6cNqnFd*^=lf%8XS4o[_E5Q+Y +d1UC[^`lZ]Y2(q_Sa@4aN;TJc-F\`daZguf@em4gtgiFi8WeXjlYail07O#m-X60n*ol +JcC<$JcGNFo`"gfrqu]ks8)ckrV-Hgp@eLY;Y9SOo'u5q6QBdYsOH,9Xr7^ktor%ef +!3,srq5O%t&\>NaUm/NPFA;N]=YZL\c'&<\*:?n[ILX'[JRB4[JI<6[C3NQpU:"/rj_g6 +rj`!=osjh.q7?U:qmuX6r3u^7!4Vj8rOMs>s1&-@oXY"5pq-I:!58BGrkJ3Cr5&6Hpr!-Mrl+lV +r5\`Trl=oW"j+p1bKS3/blH&\cN)>kdJqYne,Rqsf)F;!f`0Y"gA]k,h#?11huDX7iVVX2j8J'C +k3(pkl0803$L@'FmHs?0n*oi:rpg0_o_/%Yp]1-hq>pNn`;_4Qg<[j\_o99qX/W"kT:MLAeAoA: +[Bd'$Lr-mVd^5*sOHP`fP`q@2Oq?]$(-OOSb1?OoUX>^\tt@ +^\knG^]/-LC]A/LC&VfGBE)TBAcH+Yd1UC[^WfY]Y2(q_Sa@4aN2NIc-F\` +daZdtf@\g3gtgiFi8WeXjlYail07O#m-X60n*ol +JcC<$JcGNFo`"gfrqu]ks8)ckrV-Hgp@eLY<:oeQo'u5q6QBdYsOH,9XSXoABo7Qsm +q1J@%%Zuj8HZb'SC2S$7H%(C%rfI/@r/UZ8lAkb$r/CZ8rf6]3r/CW7rf6u;!0$c6$&jk'NfB$Y +NfB%oNrP1:ORA2)OSb+9OT(C;OSP%8O91Q-P5^U>OSY+5[T_P2^U8+IVU]7.dV#[ClVuI'YPt^'Y6(r5Z2V$3Za@*I[f!W7\c98@]`5\K^VI\%_Z%FQ`;[^[`lH-@ai_g)bm2P? +cd:"bd*M^c@Xi7GiQVk0e>VD/O0+D/=(gD?OfmCi4(gDZalsE,bT3s,>/$qJZ4JrfI/@pl>95rK.&ArK@,A!g%57 +rbMOKs(VIGs(D@DrFQ">raYh7rF,P1rEoD/rF,V5s'u(>rad$\B4kmkBkhBuCM[j*DJsK6EcZ>E +Fa&%SH?sr;s8J,OO8Y)2S"-(BTV8-VVPgDnXKA\1ZEpsI\%0)_]t_A"_o9X:aND]NcHsteeC<($ +f\5*8h;7)JioB+]k3(sml0I^&mI'H3nF?)?oCMVRo`Fj]p\ssfq>^s+11Ms*t~> +JcC<$JcGNFo`"gfrqu]ks8)ckrV-Hgp@eLY;Y9SOo'u5q6QBdYsOH,9Xr_EMjpe_)h +:J^RVr(d&`s&\hns$6rY5sn%/7Rp$C:&IfY:B+,h;#*oe;#F2i;#F,b;"d]_:B"&g;#X5j:ARcb +:B+&f:B+,g;#4#m:esk`:f%$bs%iGc!)l;ZBVj;Z'Gp;GgBE;g\rFu7H"`/$lD/=%fD?4]r +rc8!Zr,hs]rc]*&G^4R\H@($eI#S-h8OZ'95lNn\3BB2\9hIlE6pj:/5t".47mAsn3;kiC +4$#D]2`WlX3rV,G3'0/`4[)"l4?rUAs&Bl=Yck:8Z*CU@['[9N\@K2_]Y2%n^VI\b_?Ror`Q-'A +aSs9bb0/#Qc-H=7rm1eqe(*%&r&k-G4[)(.56*nA;Z'Dj;?0Ye;ZCS4C]A/LC&VfGBE)TBAcHOj5f=akNM0plg4!* +mdKW6nac8BoCW%T!quB_rqQNhs8)Zjrqu`noDX=@Jc>`MJ,~> +JcC<$JcGNFoD\afrVZTjs8)ckrqQNf!;?Eb!VH!_nkJZDn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ8 +f@JI$da?Cdc-+8NaMu3:_SEq"]XkY_[^Um&?8J:WN:P*_oE](`c6\,a#%[e-uu[/RK0[K*`0[K*f2[f!W6\GE]6\Gs,4 +\GEc2])T><])&r7\,Wl:\,3]6\c982\c989]DT>A^&PhF^\GVB_>;%D_uI[R`W*sUa8EsVa8lI4huMa4iqqa9jSn9@k5XTG +kiq@2lMp2Mm/QGUmdKW6nG_t\oCV_LrV6Bg!W2f7s$?DBf#l%Q_o00jXJ_tkT:;=?dDil/['Hoq +K#>p\af1&kXH6qSPE_/lP*(ojOcYWaO,]0ZNfK6cPEhDrWg/j\rk&0@b5_@#qiLlAo=k:@oY:=> +s1eSO!c;airbMOK!,;CFs(D@Dr+5n=raYb5nmVB(raYt=ral+As(D@Fs(N?cCMRa'DJjB3EH-#? +FEMbNGBnL\I!pJDs6RNhS=Z@GTqeE\Vl?\tXfnt7ZaI6N\[oGe^VI_(`Q$!?b0/&TcdC1jeCN7( +g=tE=hVd>Oj5]7`k32'olKmm)mdKW6nc&([oCW%T!quB_rqQNhs8)ZjrVZWmo_sFAJc>`MJ,~> +JcC<$JcGNFoD\afrVZTjs8)ckrqQNf!;?Eb!VH!_nk\fFn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ8 +f@JI$da?Cdc-+8NaMu3:_SEq"]XkY_[^plP<6qN(c@P*5g,q2kH8rK@)@rK@)@s-!DGqNClBr0%)Ds-3PI +r072Grg*MLrKdAJqO%;Nr0[MPs-`qWqO@PVr1*YTrLWqZrLiqZ!huHapS7baqPF4hrhoaori#mt +rMfgsr2Th!rN6+&!3cC)rNH7*s0;R/s0Vg6!4Mj8$+ROV]"5Pf^;%G^_&^D1_o0L4`Q#s=aN;TI +bK\;Uc-=P[cd:"bd*L(crmD,%e^`7&f\,!5g]#tch;7#1\uqj!R[0/!N.le1If$>sd"DK'Q8E.DqJqi(T7b5VHZqJZ:Ls,m;Brf?f6 +r/^l>rfR5Dr/q"s!c;airbMOK!,;CFs(D@Dr+5n=raYb5nmVB(raYt=ral+As(D@Fs(N?cCMRa' +DJjB3EH-#?FEMbNGBnL\I!pJDs8J,KO$oM0T:hmQUo(&hWiW>+Yd1UC[^WfY]Y2(q_Sa@4aN2NI +c-FY_daZdtf@\g3gtgiFi8WeWjlY^hl07L"m-X60n*olHncA@Srq-?dp\4[^s7u]kr;6HjrVcBf +JcC<$!<7Q~> +JcC<$JcGNFoD\afrVZTjs8)ckrqQNf!;?Eb!VH!_nkJZDn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ8 +f@JI$da?Cdc-+8NaMu3:_SEq"]XkY_[^3ua;ZK_p;>X8h;u]bq;>sJn;u]hm;ZKen<<-(u%=o;J$>Pqb(?2\+0?iOI4?iFI5@K0g8A-6CTAnV!Srb2@IrbMFJ"`8-pDfB^qErL,CFE;PG +F`hkOG^4RZH$O^^I!]gB>ut!"9h7`@69dRq4?>M`3D2q66ps@+6U*t.7RB3t3&WH43'0/^2`L[p +rAbFG'A.UH?sseIfKH7;ad.IT:hmQUo(&hWiW>+ +Yd1UC[^WfY]Y2(q_Sa@4aN2NIc-FY_daZdtf@\g3gtgiFi8WeWjlY^hl07L"m-X60n*olHncA@S +rq-?dp\4[^s7u]kr;6HjrVcBfJcC<$!<7Q~> +JcC<$JcGKEo`"gfrqu]ks8)ckrV0Igp@e1Po^qbGo'u5q6QBdVqO,f1fgA[rJVY6qa +W;iji\c92>[g]Z_Y^1_JLlRUaTW#n[\\2pq-I:s1SHHrP/-Cr5&6Hpr!-MrPefV +r5\]Ss2Y#Xs2b;abPo`bblH&[cN;J@dJhSmdfItKrmq,$qq1r%ptGc&s4dV1rnd\4s53t;ioBsr +qW%P9s5jFHkih:0l3ckDm-X3.mdKW6nc&(]oCV_MrqHKhrqZZmrlG*pnD;O6aMu!.\$2j0VP0WO +R[_L9]\\[\H%_';P)k]cNfK1uNXq89PGkI[X-Am:Q^ODV]=Q)`qN1W; +pqQjCotLL@r4i0F!P`RPDZ=PRD#J,NC2%D\B`D`FB)H6>AGp$(@fBm:AGp*>AcQKCB`DcLC27U$ +D>nDdDfKc;F*)MHG'A1VH@($fIXltKm(bu[T:qsRUo(&hWiW>+Yd1UC[^WfY]Y2(q_Sa@4a2lEH +c-FY_daZdtf@\g2gtgiFi8WeWjlY^hl07L!m-X60n*olHncA@Srq-?dp\4[^s7uZjr;6KkrVcBf +JcC<$!<7Q~> +JcC<$JcGKEo`"gfrqu]ks8)ckrV0Oip@e1Po^qbGo'u5q6QBdVqO,f0iSb&BOSbRj1 +K)C8mOT1@ONF@ENBkqX1G^P*sNKB5"Nr"h7NW>.;NW>.8Nr+h8N!>3!N/`gWNqJD1N;eh9Nr=q; +N;/D4NW>(OSY+SGJfUT)5/ZT_P2^U8+IVUB%+cV#[Cl +VuYi^V@S#_8=(,_o0O5`l?'? +aNDZKbK\91c2Q#nd*L(ccd:&e^rF*g=k<9gt^`<_R6;6S!TG%NJW@?I=-6]G'.nmP)bKW +L4XB&LRXZ`H#S7?=[c(k6FG'EqFaSu6Xpi$1MrK7)@ +s,Zo7r/^i=s,m>ErK.(urbhaQ!,VUL!buF`rFl4Ds(;1?rabt;lXKj'rabt=s(27Drb2=G"DV^f +Ci0/h'5ql1EcZ>EF`qtRH$XgbI=?]ss8J,KO$fM2TqS6WVPgDnXKA\1ZEpsI\%0)_]t_A"_o9X9 +aND]NcHjndeC<($f\5'7h;7)JioB(\k2tmll0@U$mI'H3nF?MK!V>s_o`Fj]p\ssfq>U6gqu6Nl +rUg)?s+11Ms*t~> +JcC<$JcGKEo`"gfrqu]ks8)ckrV0Igp@e1Po^qbGo'u5q6QBdVqO,f1u:]F8e;#jGk +:[UsT:B+,c=8Z+u<=Dhj6pX+,6qBd<8P;eJ:&n)h;#F,h:]aEh;#F2h;#O2c;"[W]:&n)h;#O/i +:ARcb:&n#f:B"&g;#4&h:]sQj:esmc:B+,d:B+&f9_V9]:@h6^:/CUZo2"jP!)`Mf!)NShs%i#Y +qbdAis%iPh"A_ij:J^g^r_NAeq,-obq,78kr_`PjqbmPo;,RA^&PhF^\GVB_>;%D_u@UR`W*sUa8s1nBDrkA-A +s1\EGrP8GP!,qgR!c;airG)ILBkdNZrb)7Cqdo_:qd]G2qd]V9r+5n?s(D=E+DGS*CMRa&D/O60 +E,flY +dF-Lnf%8R.g>(N@hr*JRj5oFckNV6rlg4!+n*fc8nac8Bo`"O`p&Ojcq#C0iqY^6ir;HTcrdk*# +s*t~> +JcC<$JcGKEo`"gfrqu]krqZWjrV-Hgp@eLY;tT\Po'u5=n*fZ1m-Es$l0%3kjQ#:Zi8=6 +KCXWhKCt<mFlVuEXjWW0!r +WrT7"Xo#:"YQ(j,Z2V$3Za@*I[f*ZS\@K/]]"G_k^VI\%_SX4.`5KX6`lH-@ai_fMrlkAds3LPg +"jtcHe'uqIf)aOXrnC'#bdssPS=,b,OGnpGJ:2fhFEM_pP`C`[L5'hhOHu/nI;3nIECEi.6s3r2 +Ak,@%Anu:(F`r"S7nH3E>(;'RE,fo?Fa&%TH@*^4s).aQ!,hdSs-!>Cr/^o>pQ#04r/gl>s)7sV +rGD[RCi'&c!buF`rFl1Cs(;.>rFGe8q-s52rabqYdF-Lnf%8R. +g>(N@hr*JRj5oFckNV6rlg4!+n*fc8nac8Bo`"O`p&Ojcq#C0iqY^6ir;HTcrdk*#s*t~> +JcC<$JcGKEo`"gfrqu]krqZWjrV-Hgp@eLY;=sJNo'u5=n*fZ1m-Es$l0%3kjQ#:Zi88:/+>N6:3t#4$>Vc3&jT&7mo[25XRk+77BI'3B/iL*[rTl/2B+D2DR-K3]fMi5X[t! +2`Nob91hf?5sds<6jH.N7]WVlXfhW+'Vg^:q@t_>_:Q_o9Xp`sTo.aN;QH +bKS2TcMl,nd*^:ie(44Us&A_kku.P#!,qgR!c;airG)ILBkdNZrb)7Cqdo_:qd]G2qd]V9r+5n? +s(D=E+DGS*CMRa&D/O60E,flYdF-Lnf%8R.g>(N@hr*JRj5oFckNV6rlg4!+n*fc8nac8Bo`"O`p&Ojc +q#C0iqY^6ir;HTcrdk*#s*t~> +JcC<$JcGKEoD\^erqu]ks8)ckrqQNf!;?Eb;=sJOo()>?n*f]3m-O'&l0.fo?[H`s3^horR1brrmq)#qq1r%ptGc&s4d\3hVS7hs53n9qVqD4!9F+? +#3P+3kih9qrp'OMrTsaUn*fc8rpg0_o_%tWq#C0lqu$H;s%)\=dE9MK^r3[dX/;hjSsu4Vms)%dPrbMOKs(VCEs(D=CqITM6rF>Y6qdoe>s(D:D,ACn-CMRa& +D/O60E,fl^s+13#~> +JcC<$JcGKEoD\^erqu]ks8)ckrqQNf!;?Eb;tT\Qo()>?n*f]3m-O'&l0.5C +KCb3)Nsq"UH?s4>E,g&IItN^YNr+n9NrG+;NW>.8Nr+h8N;nh9N;nk;NrG"((7NrP1:OR\A3OT(=9OSk19OT1I;OSP%8O91Q-P5^U>OSY+;P5UO@P5UOCP5^[BP5^[D +P5^[FPlHsFPlI$IQN!6KQMd*GR/`TPQiNQRRK/iRS,f,XSGSlUT)>5[T_G,]U8+IVUB%+cV#[Ck +VuEXpW;rsrW;rsqWrT7"Xo#:"YQ(j,Z2_*5Za@*I[C6%C&@f9]]"5Sh^VIY$_8=(,`5MYo"NJL' +aNFM*rlkDe!m]-@_G687Q7GDK0fCG^2eN7nl["J:N2iE,p&DGBe@YHc?$aDZ+JSDK#E8s,m2? +s,Zu9r/^c;rK7,"!cW'rrbhaQs(q[Ms(_RJr+Q+Crau" +JcC<$JcGKEoD\^erqu]ks8)ckrqQNf!;?Eb;"XANo()>?n*f]3m-O'&l0.)"WpK.>p$WTAV6UF"*7Rp!?9(GaV;#F,f;#=,g;#X8e:]X?gr(d;hqG6u`!`)WhohYK\!_lEb +r_NJhqG@Dm:JXe`:]*rf:\dcc:&[i]:&[oZ:B=3dpJ1js&&horDNVn!*&_lqGdSts3^qsebD<)<;0>`;Z9Vp;Z9Ms;K6\qDf>Vms)%dPrbMOKs(VCEs(D=CqITM6 +rF>Y6qdoe>s(D:D,ACn-CMRa&D/O60E,fl^s+13#~> +JcC<$JcGHDo`"gfrqu]ks8)ckrV-Hgp@eLY:\=8Lo'u5A^&PhF^\>PB_>;%C_uI[S +`W!mTa8^\GV@^\bbE^\tnB^ArFG'A.TH$XgbI=?ZrJV&N-L5(M@n%_DeUSOcbWN*&%YHY==['mHS]"G_k +^r!t,`Q-'BbKS8XdF$Fme^rI,g>(N@hr*JQj5f@bkNM0qlg4!*mdKW6nac8Bo^r.U!quB_rqQNh +s8)Wirqu`noDX=@K)^?~> +JcC<$JcGHDo`"gfrqu]ks8)ckrV-Hgp@eLY:\=8Lo'u5(7NrP1: +OR\A3OT(=9OSk19OT1I;OSP%8O91Q-P5^U>OSY+;P5UO@P5UOCP5^[BP5^[DP5^[FPlHsFPlI$I +QN!6KQMd*GR/`TPR/`TSRK/iLSGSlUT)5/ZT_P2_U8+HWpS7baqPF4hrhoaori#mtrMfgsr2Th! +rN5t"r3$1+Z*F;6"LGJB[C,qA#.V4S]">YirkJWP_SX4i`;dgV`r='XbQ#fcc2Q&fciVP@dJhSo +e.pQdf@ej(]U=^l#184I0'D/aT? +G^2eM7nl^,J:W9%E,]f^s+:9$~> +JcC<$JcGHDo`"gfrqu]ks8)ckrV-Hgp@eLY:\=8Lo'u5crD6.u5r*9/*q-O&-s'Yk8!b,YLrF?%BB4kmlr+H7JC2.O!CAr#JC^"ZnDK'T8rc7sYrcJ-_s*.mi +AmSS;9h\/K6ps7)4?P\e3]K)i7n#d25WqG%6UX."4ZG;P*@WHj/M]4<2)@-M3]oVl6:3^k3'KN" +91_]I5sn"+6q'L377O2RWiN5&Xfee.Y-5%5Z*CXC[C3RD])TAd]Y2%n^VI\&_Sa:0`Q#p4TSM^q,I)epJUofr_WZ9rc.sWs)7mSs)%dPrbMOKrb;=Erb)1Al"0j+ +s(D:Ds(MIJrbMOM+)Pn5DfBZ8EH6,BF`qtQG^4U^I!pHnJ:W<)KSG5;M=4A4U8+N]Vl?\tXfnt7 +Za@0M\[oGe^VI_'`5Td^s+:9$~> +JcC<$JcGHDo`"gfrVZTjs8)ckrqQNf!;?Eb!VH!_nk/HAn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYcb+/Wi2hlUnXQTSt):;Q^*euOo*i(gAfk+f_;?9 +VuN^f\Gs#I[C48F]R#-\M34$kUTa[-r4)d9pU113[^EO;[f*W5[/IE4ZiIH,Zi[YB[/@?%[f3c4 +[edK4\GE]6\Gs,4\G<]2])B2<](rl6\,Wl:\,*W6\c982\c989]DT>A^&PhF^\>PB_>;%C_uI[R +`W*sUa8hr*JQj5f=akNM0qlg4!*mdKW6nac8BoCW%T!quB_rqQNhrqcQi +rqu`noDX=@K)^?~> +JcC<$JcGHDo`"gfrVZTjs8)ckrqQNf!;?Eb!VH!_nk/HAn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYcb+/Wi2hlUnXQTSt):;Q^*euOmnn@Sc,)AKCt<= +OcYZbO/R8XB527%Fa8@eLlRMmO8b1;O7\J/NW4t:MuSb7NW+n3NW4t8N<#"0NV\Y8NV\\7O8=t+ +O8"b6O8=t#.qO^^VIY$rkeWPs2=uXrl>)]rlb;brltJhqp>Ajs3^tteCFQM9#J'; +URRU8OH5shh-BgtU&A86"$F`r%%84QBKIXm!# +IrKCIF*)SMH$Xd`_uKXPrbq[rqi^r@s,d5@q2Y<4rf@8FFE;JCrc.sWs)7mSs)%dPrG2FJs(V@D +rb)+?ok"&5rb)1Cs(VLJrbMOM!,_^Q+)c+hr*JQj5f=akNM0qlg4!* +mdKW6nac8BoCW%T!quB_rqQNhrqcQirqu`noDX=@K)^?~> +JcC<$JcGHDo`"gfrVZTjs8)ckrqQNf!;?Eb!VH!_nk/HAn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYcb+/Wi2hlUnXQTSt):;Q^*euOo.uT;#X>i;#!iN +:B+,\=8l5-5X@_&6:41384cPS:&n#c:An#f:]4,e;>a8j:\mod:BXEg:Jama:]4#j9hnJ\ohY?X +s%iMgr)*Jjs%`\m:J^pas%iGc!)sDl:]+#k:Jak` +peLibqG?ubpJUids&/hnqbm>j!`DlmrDNVn!*&bmr)Ebub7s'u"<"_D:YB4u#XBE2cGC'&0cCAr#KD#\APD?4]rrc7pXs)\6`rcT&l@9ci3 +9M7lE6UF"#4$>_g3&jN$7n*DC9g_356UEsu3B/`B*@39h0JtjK1Gh'Q3^#_o6T6q`5!DY58P2Q@ +6:4./7R]^577O2RVlHbtXK8P+XKAY/Yd(I>['dhr*JQj5f=akNM0qlg4!*mdKW6 +nac8BoCW%T!quB_rqQNhrqcQirqu`noDX=@K)^?~> +JcC<$JcGHDoD\^erqu]ks8)ckrqQNfs7ZKcs7B%Wo()>?n*f]3m-O''l0.A^&PhF^\>PA_>;%D +_uI[R`W*sUa8c!7(2^s3UenrmLbo!7_#!rn%&"s4R2$s4dS/s4m\3rnmb6 +!9*b5rT!q=rT4"@s6'IIrosOMm/?>Omf2bUnG_t\oCV_MrqHWlqYU3hdJlf)hTj3``P9'nYH"Fq +URdpDS^#$_['?p>OG'dZb-IOsX`\8iCg1t2M/?'cK8>YRS"64E;c-OoN2ikVW0nDsDfB]9EcZ>EF`qtQG^4U]I!pEmJ:N6(K8#&8Ll%"JNK0(j^d"WlVl?\tXfen5Za@0M +\[oGe^V@V%`5Tds_p&F^c +p\jmeq>^ +JcC<$JcGHDoD\^erqu]ks8)ckrqQNfs7ZKcs7B%Wo()>?n*f]3m-O''l0.">OH9'pq2GB5rJU]7rf-l8pl5<4r/C]:nrErfQu;qiUf>rK7#@rK7)Bs-*;Bs-*ADs-*JIrfd;Frg!GJ +rg3SLr0R8Is-`bO!1EhT!1WYOqORSVqk*n]pS%P[pS._aq5"(grMTXnri#mtri,ptql9^urN5q! +rN?4*riuL/"gbSC[C*IA[g'@Q\\#Jf^AbqH_Z%LR`W*sWa8jB^bPo`cblZ2:chu/idJhSoe.L6Z +^9a`0R[B;#NJN7=I=6Barc:#cOcG9SLOsSaKp.[OGAqt8:/+SW=C>cB7n.$$DJsW?G]u_K9h]JU +JUr;iEH-&AG'A4UH?t"Us86d7DuPjrOo1CAOoCI@O8Ft4NrY:@FT6F^ErL(YDuahTDZ=SRD#J/K +CB&#EB_uH;B)H<=B`;`GCAr#KC]J>ODBWq;EH-#?FEDYKGB\:WH?sseI=HctJqJ]0L51SAMN!OT +nW,o1VPgDnXKAY0Z*UgG\%0)_]t_=u_SjF6aN;WLcHjkbe'uq"f@em4h;-uHiSrnYjlYail07L" +m-X60n*olHncA@Srq6 +JcC<$JcGHDoD\^erqu]ks8)ckrqQNfs7ZKcs7B%Wo()>?n*f]3m-O''l0.!=8u;36U4"+5XRk+84ZsDl +:]+#k:Jak`peLibqG?ubpJUfc!)ienqbm>js&&hor)3Pn!*&bm!*&nsrDir#l7n'?N+=3@/j[7A,Tp% +F`D&&>#S6m8Ol0:5X.Fs4?5G_3_;k37R9:(6iKCm5s.1d2D61!.4Zo(2Dm?J2E3i^4[2;&2`Eo` +7SE_Ps$@;b6q0U66psI48>`8^W2ZesX8]1WXfek2Yd(L>Za@-K\%&u[]">Vg^:q@s^qmn)_o0L4 +`lQ9Db0%oOc-FV\cd:%bd*U1ge,DQ04o87K<;]Yp;Z0Mo;Z'JmFT6F^ErL(YDuahTDZ=SRD#J/K +CB&#EB_uH;B)H<=B`;`GCAr#KC]J>ODBa"*Yd(OA[^WfY]Y2(p_8=.0a2lBGbg+P]dF6Uqf@S^0gYL]Ci8N\UjQ5Oekiq?s +m-O--n*fc9rpg*]o`"O`p&Ojcq#C0iqY^6hr;HTdrdk*$s*t~> +JcC<$JcGECo`"gfrqu]ks8)ckrV-Hgp@eLY:A"/Ko'u5=n*f]2m-Es$l0%3kjl>C[i8EJJgtUQ8 +f@JI$da?Fec-+8OaMu3:_SEq"]XkY_[^fo?[E_s3^kprR1esec+/"fDF5#g%X2#g]#t0h;7#fhZD`piVMR4j8\3=jT+HB +kPscGl2U&Klhp/Mmf2_VnF?MK"7u3Zp\spjq>:*grm^s5o]FcL`lPm3]s"H8UnaTQS=?(n`4E=] +[',XI\&un$T7a5!G%#07F*rk#:elXuOcu9)TUf"YD6^Ai?TFT6C^ErBtZE,T[nDZ=SRD#A)JCAqr1B`DfGCAhoLCi+%gD?4Zprc''$F*)MHG'A.T +H?spcI=?ZrJV&N-KnbA>M2R=PNfT!_jVl?\tXfen5Za@0M\[oGd^;%M$`5Tdo(2MQp&F^cp\jmeq>^s+C?%~> +JcC<$JcGECo`"gfrqu]ks8)ckrV-Hgp@eLY:A"/Ko'u5=n*f]2m-Es$l0%3kjl>C[i8EJJgtUQ8 +f@JI$da?Fec-+8OaMu3:_SEq"]XkY_[^e +&!)g4NH9hbBkqX/H$t0rN;S_:Nr"h1NqeS6N;\\7N;eh8N;/A4N9lQ"NW>(:NWG3$rf?o;nrEd4 +rf?f8r/^]9s,m)B8s,m>ErfQu;qiUf>rK7#@rK7)Bs-*;Bs-*ADs-*JIrfd;Frg!GJrg3PK +rKm>I!1E_O!1EhT!1WVNqjm\Wqk*k\pn@Y\pS._apn[tfrho^ns/?!uri,ptqlBaur2on"r3$1+ +Z*F;6!OK04[JdT7\-TXV]=bkm^qdec_YqCZ`Q#p3QLP'\dMNj9WG\;G9<_-"m='oQO7RUd!DK']@G]u\K9hg+fJ:W/g +EH?8FGBnFZH@:1Vs8-^6OT1C@OSt=?P5^UAOSk1=Nq\V7FoHL_Er^7ZE<:)tDuFSRD?"GMC]8)J +C$010C&VlGCBAnDRDfG\q+EDOFFEMbNGBeF[H[L6jIt3*%K7nr5LP^kGN/`jYOco*Yd(OA[^WfY]Y(tn_8=.0a2lBGbg+M\dF-Opf%8U/gYCWAi8EVTj5oFckiq?slg4$,n*fc9 +nac8Bo`"O`p&Ojcq#C0iqYU0hr;HTcrdk*%s*t~> +JcC<$JcGECo`"gfrqu]ks8)ckrV-Hgp@eLY:A"/Ko'u5=n*f]2m-Es$l0%3kjl>C[i8EJJgtUQ8 +f@JI$da?Fec-+8OaMu3:_SEq"]XkY_[^O)h:]+#i:Jh!cs%WVk:f-s`r_EJf!)EAd +s%`MgpeLfar)!8f"].uj:f'sc:B+,d:B+&f9_V9]:@h9]:&n)a:@h9D;#a>j:&n)V;#=,i;#a>h +:]sQj:esm_:B"&c;#4&`;Ya5k;Z0Jj;YsAo;GgZa@-K\@B)\]">Vg^:q@t^qmk(_Sa=3 +a2lBEb08)Sc-FSZcd:%bd*U1hq`b$\q,R,fs&Jtrr_rhrr_rhpr_ri>rcJ0]!-8$X!cW'rrGMXP +s(qUKrbDFHk@jm0rbDCI!c2^jrb_aTE;ji"EcZ>EF`qtQG^=[_I!pHnJ:W<)KS>/9M2@.LNK0'^ +P4MU>VPgDnXKAY0Z*UgG\%0)_]Y;.s_SjF6aN;WLcHaeadaZguf@em4gtgiFi8WeWjlY^hl07L! +m-X60n*ol;o()DErq6 +JcC<$JcGECoD\^erqu]ks8)ckrqQNf!;?Eb:A"/Lo()>?n*f]3m-O''l0.n[\\2pq-F9!kl=^rP/*Br5&6Hpr!*Lrl+lVrQ"cS +s2Y#X"j+p0bKS3/blH&[ci;AldJqYne,Rqsf)O@uf`0Y"g&Tn,h#H11hYuF4huMa3ir.m;jSe3? +k5OQDkl9lKlKdd6mJlVSn,MnUncSOWp\4[^"8_rorRLoYmGQ:3`PfO(\$)g0USFENrgGde_Rd+Z +ZEKLJ^r+=+Tnfq6Ip-B0:O7hU:Jlh#NK]m&TV#+Z^\5AEGBS.PFoHIaF)l="E<:)tDuFSRD>nALC]8)HC%5m8C&VlGC]A5ND>nDRDfG\q,][sJ +FEMbNGBeCZH@($fIXcm!JqJ`1L51VBMi +JcC<$JcGECoD\^erqu]ks8)ckrqQNf!;?Eb:A"/Lo()>?n*f]3m-O''l0. +plP64r/gr@s-!ADplPB8r0%#@r0%#@rf[;FqNClBr0%)DrfmGHr075HrKdGLr0I8IqNq8Nqj@DO +s-`qWoUPcKrLWnYs.K+[rM'%]!2TFe!2fanrM]^p!36$t!35pss/c+"r3$"%!3lI-s0D[2rO)U5 +$+ROV]"G_k^VIYa_>qLP`;dg^a2l?Db0%oNrlkAds3Chpcd0tbrmnGOOSt7>OT1I@P5g[@OSk1>Nqn_=GBS.PFoHIaF)l="E<:)tDuFSRD>nALC]8)HC%5m8 +C&VlGC]A5ND>nDRDfG\q,][sJFEMbNGBeCZH@($fIXcm!JqJ`1L51VBMi +JcC<$JcGECoD\^erqu]ks8)ckrqQNf!;?Eb;"XANo()>?n*f]3m-O''l0.hqbcu^r(m;es%rJds%`Pf!)EAds%`MgpeLibqb[2fs%r\j +!DlSi:&n)c:B+&f9_V9]:@h9]:&n)`:@q?E;#a>j:&n)V;#=,i;#a>h:]O;j:]O;d:B+,d;#4&` +;Ya5k;Z0Ji;Z'Gp;GgQ.h+>PMJ% +?2.b*?NjhG@:E_VrFGq?#\RgbBkV0oBPI?Yr+cRSD/F00E,fo=rcZaI3M\@B)\]">Vg^:h7q^qmk(_Sa@5aN4D'#Kt?8bKS5U +cMYuid*gA@55\IWnALC]8)HC%5m8 +C&VlGC]A5ND>nDRDfG\q,][sJFEMbNGBeCZH@($fIXcm!JqJ`1L51VBMi +JcC<$JcGBBo`"gfrqu]ks8)ckrV-Hgp@eLY9_@rIo'u5n[\\2pq-F9!58BGrkJ0BrPA?Ipr!*Lrl+lVr5\]Ss2Y#X +s2b;abPo`bc2Z)\ci;AldJhSmdf@nsf)O@uf`0Y!gATe.h;7#fhZD`piVMR3j8J*>k5OQDkl9lI +lMg,ImJlVSmfDqJrpp*]!VZ9ep]UEir;HWIrtb@kfZ_CU^VmdgX/MhgTpqO>S'&[^\GicgXcnRW +bJq2kLmO?k=\!d3G_:uJ;M'X\PF%i6T28E\Pks)%aOqeQ+EoP+5 +JcC<$JcGBBo`"gfrqu]ks8)ckrV-Hgp@eLY:%\&Jo'u5O:[J7NK0!,IqED1D0'lII=d:KO8"\0N<"q8MuS_9NV\UpNUi,-O8=t/NrY:@O8"b7O84n; +Onb%4Oo1=@OoLUDOnb%8Oo1C@Oo1C?OoLUEPPUIBPPgUDPQ$gGPPpaGQ2HsJQi*0IQhm*LRJW?S +R@9S6S+WmFmVu*Ob\9uEc,VX4^16U@VJ,!@qB=kF*2_R84c9F97VPDIW9=IFEMhRH?sse +J%bm\D>TFmO8k=AOo:IBOnk+3NrXG(GQ2gdFo?C`F)l="E<:)tDu=MQD>nAKC]%r>C&D`DC]A5N +D>e?'DfBZ8EH6,AFEDYKGB\:WH?sseI=?]sJV&N-L5(J?M2R=PO,oEdPEhH#R.cS-WN*#$Y->1; +['mHR\\#Mg^VRe)`Q$!@bKJ/Ud*^:keCN7(g=k?^ +JcC<$JcGBBo`"gfrqu]ks8)ckrV-Hgp@eLY9_@rIo'u53ub;u]bo;>a>i;u]_q;>a>l;u]hn;ZKeq#0=BSd1>$G37>$G50 +>QA(.>l7n,?3":0?N"47?t!MR@q5LK$>!g]BP;*oBPM6qqeH"DrbV^TE,bess)UqO@pE,59hS&H +6UF"#4[)%j3B/ui84Q'85=%J#6:4%)4?5>Y0e=:l/1iJ23%m*F2``ua5=7dr2`YHY:;ZF.*L\@B)\]">VfrOiWS^qmn)_o9X9aN;TI +rQ>8dc-?75rm(VmdeuB*UfkiqBum-O--n*fc9 +o()DDo`"Lbp@n=[q#C0iqY^6hr;HTdrdk*%s*t~> +JcC<$JcGBBo`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nji6>n*f]3m-O$%l0.Q'e2C[(-+ErO2L/pU:+0r3QO5[']h=ppBh(o!\G)rO2R3qmcR5rO;j< +oXOb.q7?L7rOVg7r3u^7q7-C6!4q^2s18!;qn)pBrkABHp;$XCqSN$Frl"cSs2OuWqSrQUr5eo[ +!QrUbbl,cdcL]B]d/VMndf%VueCE.$f@TiNs4R2$!8IM.s4m\3rnmb6!9*e6r8[_:s5s=Ds60LI +rp0LLrpBjVnF6GJ$hO#_p@n@Wq>1$frn7s(q[OrbhaS!-%pWs)KQ0FEDYKGB\:WH?spc +I=6TqJ:W?*KSG5;M2I4MNK9-_P*;/sQ^F52SG9l^WiN8)Yd(O@[C3TU]=bkm^r"".`lQ6DbK\>Y +dF-Lnf%8R.g>(N@hr*JQj5f=akNM0plg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Wirqu`noDX=@ +K`?Q~> +JcC<$JcGBBo`"gfrquZjs8)ckrqQNf!;?Eb!VH!_njrT,riZ1&riuL/!OK03 +[JdQ<\@K2^]Y42`b0/!-bl>ofcMZ#fcp5@RWM,iKPE1][K7JAuH?F:K +Ec[J+NJWCDJp23fK9MIPH>.J +JcC<$JcGBBo`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nk&B@n*f]3m-O$%l0.s55s@_(69[\$4?>DY0eF@n/M8Y22_[-K3&s&`5HaY->1;ZaI6O\\#Mg^VI_(`Q$!?b0/&TcdC1ieCN7(g=k?s_p&F^cp\jmeq>^s+LE&~> +JcC<$JcG?Ao`"gfrqu]ks8)ckrV07ap@e1Po^qbGo'u5H@:@#NKBHtVm3_?r3lC.pU:+0qR$4-q6]n(o!\G)rO2R3qmcR5rO;j +JcC<$JcG?Ao`"gfrqu]ks8)ckrV0:bp@e1Po^qbGo'u5H:URs:/+B4JUh`ZE,p&EH$=R\ +Hb'1VD>fUpOSY">OHG\(P5CC?OS4b8HN/6jGl;gfG'.s,FT6F^ErC"XE;skRDZ4MOD!u0.9ZaI6O\\#Mf^VI_(`Pom=b0/#ScdC.heCE1&g"P3:h;@/KioB+]k2tmll0@U$m-X60n*ol< +o(2MGrq-?dp\4[^rqZTjr;6HjrVc?eJcCH(J,~> +JcC<$JcG?Ao`"gfrqu]ks8)ckrV0=cp@e1Po^qbGo'u5j>g:]*rf:\mic:&do]:&[oZ:\.?R:ZYCQ:]=)h:[CpT;?'Jl:\dfe:\[]a:\moa;>3ua;ZK_o +;>X8h;u0Dk;ZKem;ZKeq#$G37>$Lo0!+#P.rETD.q-O&- +s'Q7D@U`hWA7T7_AnG^irb2@Irb2CJC&VlECHlWPD/O92E,K/k=]/$i8Ol094$>Yf4?5D]3(ZS/ +6UF+'4[MG$5!_=m6oI"X.3'Zc/hSn=A3BKDh5XbT1s#pcM8kDW?6UO7177R8F#"bM_U8+KZ +rM:I1Vl6PnWiE,$XKAV-YHP18ZEpsI[^WcV\[oBO],J>q^;%J"_Sa=2`lH0AaiMTGb0.rNbfn>V +cMl/ld69bato<;]bi<<%:EGlW*fG62r1FoHL_F8p:ZEW:"XDu4GOD>e;>C]/)LD>\;ODZFbU +EW:&1F*)MHF`qtQG^4U]H[L6jIt3'$K7el4L5:\DMi +JcC<$JcG?Ao`"gfrqu]krqcZjrqQNf!;?Eb!VH!_nji6>n*f]3m-Es$l0.9ljlGI]i8EJJgtUQ9 +f@JL%da?Fec-4AQaMu3;_SO"$]Xt_a[^EHIYck11Wi;nnUnXQTSt):aN(s1]!/35UnOBLR[BM`^UCGQYcb@ZOj5]7`k3)!nlKdg'mI'H3nF?)?oCMVRo`Fj]p\jmeq>^s+UK'~> +JcC<$JcG?Ao`"gfrqu]krqcZjrqQNf!;?Eb!VH!_nj`0=n*f]3m-Es$l0.9ljlGI]i8EJJgtUQ9 +f@JL%da?Fec-4AQaMu3;_SO"$]Xt_a[^EHIYck11Wi;nnUnXQTSt):.NqSG4N;eb8N;nn8N;ne9N9-&iNr4t5ORnM7OH5IsOSk17O8tF< +OSFt8O8tFBP5UOL$YPk^.ZEppF +rjbNf/aKKR\,_MiWs\J9GUUChc@7:L6@l@VJ/#7:]tHE--;MDb3Mp9hTtdJT5XJEHHAJG^=[_ +\,Z>fqN1W9s,[5Cr0$l +JcC<$JcG?Ao`"gfrqu]krqcZjrqQNf!;?Eb!VH!_njrh;#O/W +:]FMi$>-7r`T;+r`fG/qcs,+ +!F/q+?N4C4?iXX7@fKs.83fL.5t".2 +7RT[7TV/!QU8+KZV50rbVPgAkWMunuWiN5&Y-5%5Z*LaF[^WcV\c')L]=bhj^;%J#_o0L4`l?'s +a9]o1b0.uPc-=T5d-Xm4\;O +DuXeUEW:%ZF8g83F`qtQG^4U]H[L6iIXcm!JqJ`1L51SAMMmFQO,oEdPEhH#R$sM7StD[LqGKS\ +Y-5(8ZaI6O\[oGe^VI_(`5Td +JcC<$JcG?AoD\^erqu]ks8)ckrqQNf!;?Ebs7AqTo()>?n*f]3m-O''l0.f\#iLqV(u&q:G\Eqkrt_ +r4)I0s0`NIZa-mAOgBC]J:i`APae>G[/RN/[J%'/[JdH8[C!juRa2c$8^9OZ9Unj]RS!]Vb_Rm4] +YHOj^K!3/6[@rAHT8d;gBRNTsJr!&r;LsRYOd)B-ThnZcUfkiqBum-O--n*fc9rpg*]o`"O`pAamdq#C0hqY^6i +r;?Nbrdk*(s*t~> +JcC<$JcG?AoD\^erqu]ks8)ckrqQNf!;?Ebs7AkRo()>?n*f]3m-O''l0.n=09EqO7JRqLeKVJU`)oGBItJEg2ZE +Mhd"/9Ll%"JN/`m[OckonQC!u-S"-(ATV8-VV>H<6YHY==[C3QT +]"G_k^qmn+`Q-'AbKS8Wd*^:ke^i@)g=tE=hV[8Mj5]4_k3(smlKdg'mI'H3nF?MK!V>s_p&Fac +p\ssfq>U6gqu6NkrU^#>s+^Q(~> +JcC<$JcG?AoD\^erqu]ks8)ckrqQNf!;?Ebs7AkRo()>?n*f]3m-O''l0.r_N8bs%i,\qG-QVr)`Sm +qc+))5!hM#5X@b*7n6*D:B"&k:Jama;=m]_:]=)j:Jam_:]F2f9`Rrd:]4&g:\@K_:]4,i;>j>e +:\@K^:&do]:&du]:BF9e:\.?R:ZYCQ:]=)h:[:jT;>sDl:\[`d:\[]a:\moa;>3ua;ZK_o;>a>h +;u9Jk;ZKen;u]hq<<-(u=8Z(nQ7k,>PDD%?2n1*?N+:5?t!LC@K9p; +A-HOVB4kmkrb2LMBk_UfkiqBum-O--n*fc9rpg*]o`"O`pAamdq#C0hqY^6i +r;?Nbrdk*(s*t~> +JcC<$JcG<@o`"gfrqu]ks8)ckrV-Hgp@eLY9D%iHo'u5=n*f]2m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-+;PaMu3:_SO"$]Xt_a[^EHIYck11Wi2hlUnXQTSt);&f_*qngAfk*f`'S'f_q]E +VtI"Z\G`l:[f3ZFZ#ZM*H@UU)NK]a%WO'%Aq6fn(s0_g4"LYVDZa9G6pU0V$q6pF6\$l7Es0r'< +qRHL5n$r5)pq$C6rji*?q7-@3!OfK4\Gj#=](*?2])'#?]XtfR]`5\F^AYh?_#;+G_YM+J`;[aT +`r*mR`rF*WaT'?_b00e.rQP>fo[!K_s3^kprR1esec+.pf`0Y#gAfq-g]ZBeh;-rehuDU7iVMR4 +irJ0>jo+?@k6'r4l0A96!:9[OrpKgT%IioYo(2JFp@e7Uq>:*Is%M_8d`KPL]>_@bWMcPeSXZ%8 +R)ZqMZE^X4ObLTr`keULNN72C=^lbPG(>B@:f2arLQ@UdSY2WQ;c-Oq<2ustWKWO3Q'[r2StMaa +s6[Yt_"th?^A`Q\HiSNlH3/A:GlDpeG5l^`FT6F^Er9qVE;a_ADZ4SRE;aeVEWC1[FT6IdG'A.T +H2`+ZdF-Oof%8R.g>(N@hr*JQj5f=akNM0plKdg(mf)YZnF?)?oCV\So`Fj]p\jme +q>^s+^Q(~> +JcC<$JcG<@o`"gfrqu]ks8)ckrV-Hgp@eLY9D%iHo'u5=n*f]2m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-+;PaMu3:_SO"$]Xt_a[^EHIYck11Wi2hlUnXQTSt):=RdusESGSfTReMI-K^t6# +Nt71XH$a.[7kVuqLQ_uRgVa8X0[b5]ZabYQO/^9FQ.S=#P$OGedB +IsQHaF)l;@PE(QXL4aqrDN0sCMgTkhHX'N;93X_b?tM\o87H(@D/aQV&P5(1=OSk1=IK+ZpHi86lH$FT5GQ2jdFo?F^F8p:YEW0qUDsVB@ +DuO_SEW:%ZF8g:]FTcl3GBeE4H74,fI=?ZrJ:W<)KS>/9Ll%"JN/is\OckonQ'[l+S"-(ATV8-V +V5L9iO#4)HZa@0M\[oGe^;%M$`5Ta;aihlPcHsteeC<($f\5'7h;7&IiSrnYjlYail07L!m-X6? +mfr:Oo()DEo`"Lbp@n=[q#C0iqY^6hr;HTcrdk*(s*t~> +JcC<$JcG<@o`"gfrqu]ks8)ckrV-Hgp@eLY9D%iHo'u5=n*f]2m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-+;PaMu3:_SO"$]Xt_a[^EHIYck11Wi2hlUnXQTSt)9G:Z>4F:A%ER=8Gr2`r_NGg!)`\kq+pZYr_
    Y0!+#D,s'Gh8@:B.E +s'u%="D)1XBP@BZs(VXMC2.J^CAVcqCh6mS<)HC_7n#d04Ztnh4?5G^3(HG,6pX"$6U=(.5X%4l +2`366*[L_;.l0(62DR*I3'05e5=7dt2`Ei`4%i.:8jG^06UjL47RT\:T:_dLTq\9VU].(hV#dHk +r2:R6WiE/&Y-5%5Z*L^D[^NZT\@K/]]">Vg]tV;]_?[us`5T^8a2\,!$cpH3b0%oOc-FV\d-"I. +/9Ll%"JN/is\OckonQ'[l+S"-(ATV8-VV5L9i;)GM_Za@0M\[oGe^;%M$ +`5Ta;aihlPcHsteeC<($f\5'7h;7&IiSrnYjlYail07L!m-X6?mfr:Oo()DEo`"Lbp@n=[q#C0i +qY^6hr;HTcrdk*(s*t~> +JcC<$JcG<@o`"gfrVZTjs8)ckrqQNf!;?Eb9D%iIo()>?n*f]3m-O''l0.jo+?@kPj]G +lMg)Lm/?>Nmf2_bnF?)?oCV_Lp@nCZqu,OS:%R>rc,IZ9a1nm\W2HA`S=,e3R)?MBZEUF/LoS)( +`iYb_VMg%,8Td^IIYs%Z;1O=TOHZ''SY/eW;H?gsHN/9jGlDpeG5l^`FT6F]Er0kUE;FMLDYnAOE;X_UErU4[FT6I`G5c\>G^4U]H[L6i +IXcluJqJ]/L5(J?M2I7NNfT9aP*;/sQ^F21S=Z=FTqeE[Vl6SpXT$!pZ*UgG\%0)^]Y;.s_Sa@4 +aN;TJc-FY_daQ^rf@\d1gYL]Ci8EVTj5oFckNV6rlg4!*mdKW6nc&([oCW%Ts7QHerV6Egs8)Wi +rqu`no)=4?L];l~> +JcC<$JcG<@o`"gfrVZTjs8)ckrqQNf!;?Eb9D%iIo()>?n*f]3m-O''l0.RdusESGSfSRe27-K^b*% +Nt@;0NaR(GB5)4#Ed)k\K8GZ`NqSG9N/NXRNK*jprJLZ7oo/s1o8W=$r/^T6oT0$6s,Zo9r/^9- +plYH8!0R8DrfQr:r/po?r/pr@r/q#Brfd2As-*ADs-*JIr0.,Es-[7kVu_=N_uRdTa8a3]aiaV+s3)%n[]-!lR$<\pO+W"5I!KpYrc0<)Oc50Q +Kn+SiK8beNIs5ONBO="g=@6+sAS=S)@Uj%eE,p&CH2^>H:JFPVJUi;iDfBZ9F*;bNH?uptr/g]9 +plPN +JcC<$JcG<@o`"gfrVZTjs8)ckrqQNf!;?Eb9D%iIo()>?n*f]3m-O''l0.3oZ:A@WS=8c2" +<=Mtm5tF7)6:F:47nH9Hr_WDfp/(W^r_5hb+>5qh%>lS+/>QA(*?3FVC?t!LC@K9p;A--=SB)ZKC +Ba&6cBkhBsrbDCI%qf6Q#5sIFi2`qRs.BFeU8%X^s.gR0VP^8iVl-JmWiE/& +Xfek2Yd1UC[^NZT\@MUM#.qO]]tV:urke]Q'Z@u/`Q#p<`lH0Aai_cMc-=P[cdCfSr`/ttpf7>n +!e5ZJrd=iqH[Ga +JcC<$JcG9?o`"gfrqu]ks8)ckrV-Hgp@eLY"n_EWo'u5Kmm$4+m-Es$l0%3kjl>C\i8EJJgtUQ8 +f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYck10Wi2hlUnXQTSt,f4p=]2oqq:o"r20"^r3u4+ +s0iNI[EOf=I=$R$MNa?rTrYX![Igm-[JmQ4[K!T6Zh_!$[I^j&[fs4L\%&oVosk%2n$r2(qRQ^> +])9,<\cB;:\GWf:[^Z%AmCE8.qRZgA]=\!Rs1SHHrP/'ArPA?Ipr!*LrPefVr5\WQs2Y)Zs2k;` +!mAg3rQYAfo[!K_s3^kprR1o!e^i@(pt,T"rn7A*rS%8*"l.kegtgfbhuDU7iVMR5j8\3>jo+?@ +k6'r4l0A96!:9XNrpKgT%Is#[oCMVIp@n@Yqu$HTs%3.Ph9X-^_S*aqXJi(nU7RgAR?tq.[Bd$@ +WK)Y?_T03]LSCAn?#=CMDg7(r:JuXnLQ@UeS"H^s+gW)~> +JcC<$JcG9?o`"gfrqu]ks8)ckrV-Hgp@eLY"n_EWo'u5Kmm$4+m-Es$l0%3kjl>C\i8EJJgtUQ8 +f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYck10Wi2hlUnXQTSt,eKo:,THqj[PQ!1Wn[:kVuEXmWW0!uW;rstX8B!nXoGR%Y5kg+ +Z2_-0[/RK5\,Wu<\HKOW]Y2&Y^];4M_>qLQ_uRgVa8a3]aiaV+4NY1BVK7JDuH$47L +EcI;'MM[(?I;s+ZNK/^Oo(=;Oo1=@JH(*!If4ZrI!^5>HN/9jGlDpeG5l^_FT6F]Er'eOE;jePE;FSS +ErU4[FT6I`G5c[dG^9:7FF/C`I=?ZrJV&N,KSG5:M2@+KN/is\OckonQ'[l+S"-%@TV8*UV5L5j +WiW>*O,pWS[^WcW]=bkm^r"".`lH0CbKS8Xd*^=le^rF+g=tE=hVd>Nj5]4_k3(smlKdg'mI'H3 +nF?&>o(2MGp%A%Pp\4[^rqZTjr;6HjrVc?eJcCN*J,~> +JcC<$JcG9?o`"gfrqu]ks8)ckrV-Hgp@eLY"n_EWo'u5Kmm-:,m-Es$l0%3kjl>C\i8EJJgtUQ8 +f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYck10Wi2hlUnXQTSt&UH;#4&_;#F&X:Ae/]=8u;& +;E[>F5Q=(T77Tj>8l&:Z;>*i`:]F/i:]4,c:B4/d9`Rre:]*rf:\@K_:\R]\:\IQ^9`Rl\:&dug +:B45d:BF9e:\%9R:ZYCQ:]=,h:[CpT;?'Jl:]4)i:]=/j:\[]`:\mob;>*o`;ZK_o;>a>h;uKVk +;u]hp;u]hp<<-)!=8u>#J] +0e==m.4-Mu2)tRl(H+664[22!6T?t`4$Gbg8kDQ=5=.\(7/]Oh7%Bg=St;RHTV/!PU8"EWUnji` +VPa?js/7$=WiN5'Xfnq4ZEgjF[^NZT\@K/]]">Vh^;%J!_8=(g_\0i(`5KX7`lH0Aai_fNc-=P[ +d,A%)<<-"nUfkiqBum-O--n*fc9nac8Bo^qhL +p@e7TrqQKgs8)ZjrVZWmoDX=@L];l~> +JcC<$JcG9?o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_njDs:n*f]3m-O'&l0.m$WO2W3o="V)rjDI,p9jM#osY"4\$u%?s0qI,q76:3r42gA^&PhF^\5JA_>;%D_u@UQ`W*sUa8*aTa8F$YaT9Q-rlk>c!7(5_ +rQtSlrmLep"OtuQf@TiNrn7>*s4RD*qV)&+h>Q71i;)C4j8S-=jo+?@kPj]GlMg)Lm/?>Nmf2_b +nF?)@oCV\Jp\=U^r;GdX8FYQgbK.Z:`kARSVP^&[S=,b2R)6JBYct.+LTA/,`Mo;aWJP_"@sUgm +Jr<9$:P=F^P*qf4T28E_1H['d?P\\#Mf^VI_(`5Td +JcC<$JcG9?o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_njDs:n*f]3m-O'&l0.P5LI@P5LIBP5^[AP5gaDP5gaFPl6gFPlI$GQN*9PQC%T:r0R8I +!1E\N"IY^IS"',AqORPUqOde\!29@cr1X(`qP3k^!2]Xks/5jpql0Uq"KAE$X/l)urN-($rN-(& +qlft'!j]/>rj<*A\%&rY\\#Me]tOB["2Vjk_u@RT`Q%nts2Z>)b0.].WM,iKP`ClcK7JGuH$FFP +F)l8^N/<:BIsl3erf&(LF`)P=<'s>a6!7W15tFCRA8H1)FE`%%8OlNM97VSEJGsKjDfKlBGQ)jh +HN!gArj;_!OSFt:OT(C=P5:=?OT0n2JH(*!If=cqI/eQmHN/9jGlDpeG5cX_FT-@\Ep.NBErU4Z +FT6I`G5c^cG]J(UH@($fI=?ZrJ:W<)K8#&7LP^kGN/WdXOHG]iQ'I]'R@B_;StMdOUnsrdWN*&% +Y->0l['d?P\\#Mf^VI_(`5Td +JcC<$JcG9?o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_njW*ds%`Db!)EMhmnWjXpJCW\p.k-Ps%`5_!DZG\ +:A%EE:]O;j:B+,V;#=,i;#X8d:]O;d:Adob;#4&`;Ya5k;Z'Di;Z'Jl;YsDm<;]\p<;]brns&]8(rE')'>5hb*>5_\+>Pq_+?2\".?27h,@/aU5@f9g5XIh*6q'L4779S7SGo)ZT)YG_TF.BeU8+HXUnji`VZ!FmW"5l.XKAV-YHY== +Za@-K[^Z7G$G!aZ]=kqm^VI\%qn`r_`5KX7`lH0AaihiMbg"G[d,.mu0.['d?P\\#Mf^VI_(`5Td +JcC<$JcG9?oD\^erqu]ks8)ckrV0+]p@e1Po^qbGo'u5P*MZ8Xo>a*[K*f5[f3Z4[J.'$[I^j"\,Wr<\+R62\*gd%\bWi5 +\c95@\bWc5[fNqHpUKY%s18'=s1A?Dr4N'Cs1\HHp;$XCqSN$Frl"cSrl4lVq8NETr5eo["Nnp2 +bfp%1!7(2^rQtSls3gkps4.,#qUkf#s4[M+rn@5'!o2Vgrnm_5!9*e6s5X+>roO+@roXRNl07Ku +lg*p(rU'UPs6p!Xs7?9_#PIfcq>:*grosGHq;g>V`lGp1]X+Z:VP9]SR@0D/`4radYcascK"JtB +\=nSDP_E.JFA$\)LeCQ@It`lFR%9kA:f:.j<)TaqW=5#TQ'IT"R\$+CU7e6`rr^*S_SQ/eo>17< +qS2m@s+:9%rdY'"IX_9Es*Xinrd+Tis*4Kds*"Ebr,hmYrGqFJrGqpZr,hs]!-\?cs*+Nhrd&=+ +I!pElIt3'#JqJ`1L5(M@M2R=ONfT9aP*;/rQ^F21S"6.DTq\?YVPgDnX0&P/Z*L^D[^`lZ]Y2(q +_8=.0a2lBGbg"G[dF-Oof%8R-g=tH>hr*JQj5f=ak3)!nlKdg'mI'H3nF?MK!V>s_p&Facp\ssf +q>U6gqu-HkrU^#>s+p]*~> +JcC<$JcG9?oD\^erqu]ks8)ckrV0(\p@e1Po^qbGo'u53NrY4;O8"b/ +O7SJ2O6r&(Oo(4?OoCOCOnOn7Oo:I@Oo1C@OoCODPPUIBPPgUCPQ-mFPQ-mHQ2?jIQi*0IQhm'L +RJN9NRJrWTS+`BJSc55VTDtPaU&C__U&C__U\U_cV>d@kVuN^mWW0!uW;rstX8B!sXT5I#XT5O% +Y5kg*YlV2I;s([NfSm=BQJ$"5YP3F7eSI=6QoJ:N3&K7nr5L5:\CMi +JcC<$JcG9?oD\^erqu]ks8)ckrV0(\p@e1Po^qbGo'u5(<)lq!<`f,uq,[T!=o;A%>5_\*>5__+>PMJ'?2n42?2\(1?XWh@raH(AA7]:_AnV*Vqe?(F +s(Ou2>#nKs9hIrE6U!Xp4?Ybd3&rof770I/5!D:u5X@Xt3B/rP//ore/h8Y70/YRB3''/d5=7as +2`S=Q5MT)YG_TEq6cTq\9VUnspdV@TT'W2ZhuXKAV-Yd(L? +['fnAs0i0A\[oAa^&G_a^VI\%_SO+*_SX4/`5Ta:a2lBEb0.uQcd0tm7eSI=6QoJ:N3&K7nr5L5:\C +Mi +JcC<$JcG6>o`"gfrqu]krqZWjrV6Ee!;?Eb!VH!_njDs:n*f]3m-O$%l0.M:JlRnLlmmlR\*AR;,pRnWrAptPEPp1#a_$PStD^MUSP!k!5\ZOs24cOotgI> +qS2pAre(6&!.k*!!e5ZJrdFfos*O`ks*=WhrHJ9brcS*[r,_IMrH%jXs)n?brc`1'H$O^^H[L3h +I=?ZrJ:W?*KS>/8Ll$tHN/WdXOHG]iQ'I]'R@B\:StD^NUSOcbW2co#Y-5(8ZaI6N\[oGe^;%M$ +`5Ta;ai_fOcHjnce'uq"f@em4gtgiFi8N_VjQ>Ufkiq?tm-O--rpL'\nac8BoCW%Ts7QHerV6Eg +s8)Wirqu]moDX=@M>r)~> +JcC<$JcG6>o`"gfrqu]krqZWjrV6Ee!;?Eb!VH!_nj2g8n*f]3m-O$%l0.2N:i2*NWP9%Nq\V/ +OSOq>OH5Kao8rm2rf@,@nWYdF$Fme^rF+g=tE=hVd>Nj5]4_ +k3(sml0I^&mI'uB#4V0Ro(2JFrq6 +JcC<$JcG6>o`"gfrqu]krqZWjrV6Ee!;?Eb!VH!_nj2g8n*f]3m-O$%l0.hs%iDd!)NDcr(m/cqbd&bq,78krDEGir)3Yp;c5_Y+>$Lu2s',5&s'5\4?![D8!+5\5raPn;#A%FWAS5XhB_uNDC.Dc? +=&`$k8P)695X.Fn4?PY`3]8ia770F.5!2.t5mFmVuN\3WiN2%Xfen5ZEpmE +[C3KO\$rlX]">VgrkABHs1nWMs2"lU`5KXo`sKi/ai_iOcHjkbgK+2Ore(6&!.k*!!e5ZJrdFfo +s*O`ks*=WhrHJ9brcS*[r,_IMrH%jXs)n?brc`1'H$O^^H[L3hI=?ZrJ:W?*KS>/8Ll$tHN/WdX +OHG]iQ'I]'R@B\:StD^NUSOcbW2co#Y-5(8ZaI6N\[oGe^;%M$`5Ta;ai_fOcHjnce'uq"f@em4 +gtgiFi8N_VjQ>Ufkiq?tm-O--rpL'\nac8BoCW%Ts7QHerV6Egs8)Wirqu]moDX=@M>r)~> +JcC<$JcG6>o`"gfrVZTjs8)ckrqQNf!;?Eb8+cEEo()>?n*f]3m-O''l0.A^&PhF^\,DA_>1tD_u7OQ`W!mTa8!XSa8X0Z +aoBK`bPo`ablH&]ci)5jdJhSndfItKrn%#!rRh2)rn7;)rn@G,rn@M0h;8.grnme8qVhM8r8dn> +r9"%B#jCO;lK[^$m-O](N@hr*JQj5f=ak32'olKdg'mI'H3nF?MK +#kR]\p%A%Pp\4X]s7u]kqtpBjrVc +JcC<$JcG6>o`"gfrVZTjs8)ckrqQNf!;?Eb8G)NFo()>?n*f]3m-O''l0.0O8k=AO7JD,Oo(4?OoCOCOnOn7Oo:I@Oo1C@OoCODPPUIAPPp[DPQ-mFPQ-mH +Q2?jNQ^3r(QBqH8nsKEE!h,UJpmh,MrgrnWs.B@cr1a.`rM'.`rhKOhrM9Iis/,am!3#an!36$t +s/Q+"qlKe!s/c.#!3Z7'!3lI-!j]/>rj<0C\%&uZ]"5Pe]tM.qrP8QP_o)JlG'J4VH@(!gJ,9'Ar;QZprjDdpOS+b1P5ULEKnP-YK*$XUJc:3"J,ausIK+ZpHi89jH2i-f +GQ)dbFnp.NF8C"YFoQX`G63#7H2`,+H[L6iIXcluJV&N,KS>/9Ll$tHN/WdXOHG]iQ'I]'R@9V9 +StD^MUSOcbW2co"Xfnt7Za@0M\[f>b^;%J#_o9X9aND]McHjkbdaZguf@\g2gtgiEi8N\UjQ5Od +kiq?slg4!*mdKW6nc&(boCV\Jp%J+Rp\jmeq>^ +JcC<$JcG6>o`"gfrVZTjs8)ckrqQNf!;?Eb7eH?n*f]3m-O''l0.cn4ipXmT03d +rDj=i2aBJk5t".37n?3Hr_WYlr_`Mgq+h#f;>j>g:B4/b9`e'c:]!le:\IQ^:]=/l:Jajd;"mcY +:@_*Z:@q<_:/CCTohX[G!)NShs%huXqbd>hs%iDd!)NAbr(m2dqbd&bq,78kr)*AiqGRAlr)3bu +;cH^p<;oer<;T\q6.o3r`oG,pKRf+?(Y->19ZEpmErj<Vg^:q:p^VIV"rkScT_o'F3`r=!aaN;QI +c-=P\d+MIu<<@l-K`6T*Jq8LPJH(-!If=cqHiSNlHN/9jGl;jcG5cX[FRsSMFT6L`G5ZUdG^4T6 +H>IqUI=6QoJ:N3&K7ei2L51SAM2R=ONfT9aP*;/rQ^F20S"6.CTqS6WVPgAmX/rG,Yd1UB[^WfX +]=bkm^r"".`lH0CbKS8Xd*^:ke^i@)g=k? +JcC<$JcG3=o`"gfrqu]ks8)ckrV6Ee!;?Eb!VH!_nj2g8n*f]3m-Es$l0.9ljlGI]i8EMKh:pZ: +f@SR&e'ZOfcHOJRaN)9<_SO"$]Xt_a[^EHIYck11Wi;nnUnaXojV?"(! +\,Ni4[JmQ5Zi@9?Y@q`jIY!<3N00BqTrYR"[f)qRQ@3qml^;!4hp8qR?4/m^`>.qRcU:s1SHHrP/$@rPA?Iq8<0LrPefVr5\WQs2Y,[rlP2_ +!6bAcrQP>fo?[B^s3^kprmLque^j`Oqq1i"!8@G*rn@5'!SlQ2hu2L/ir%m:jo+?@k6L58l0@R" +lg4T;s6fpUs6pEdo(2JFo_/%Tqu$E[rt+GPe'#eN^rEg`W2QMaT:),HQmoqg\[J`GXK.20ZG+>^ +SUmPkG#i$t9Qu,I:JuXmLQIdkSY&_V:fUDarhp9iP*D5tR@TqATqS6XVPsOp_>_=J_tCkB_"b\C +^''1EKnP-YK*$XUJc:3"IfOrrIK+ZpHi89jH2i-eGQ)dbFm=)JFoQX`GQ2mfH2`,2H[L3hI=?Zr +J:W<)K7nr5LPUeDMihr*GPj5]7`k3(smlKdg'mI'H3nF5u=o(2JFrq6 +JcC<$JcG3=o`"gfrqu]ks8)ckrV6Ee!;?Eb!VH!_nj)a7n*f]3m-Es$l0.9ljlGI]i8EMKh:pZ: +f@SR&e'ZOfcHOJRaN)9<_SO"$]Xt_a[^EHIYck11Wi;nnUnaX^SFW0GSG\iVRf&ZTSH#)HJcLhu +O8P%OT(=4OS=n7O8tFBP5^U;OSk7>P5LI?P5UOBP5gaBP5^[CP5gaGPl$[EPlI$DQ3*D= +QMd*GQiNQMR/`TSRK/iPSG/TRT)##YTE(\_UAgkaUACYbU]@1fU]RBiVZ!CmW:m4jWrK-rXT,F% +XSo:$Y5GI,Yd(I=ZEsP+Yd(OA[^WcW]=bkm^r""-`Q-'AbKS5Vd*^:keCN7(g"P3:h;@/KioB(\k2tjjl0@U$m-X60 +n*oi:o()DDo`"O`p&Ojcq#C0iqYU0hr;?Nbrdk*,s*t~> +JcC<$JcG3=o`"gfrqu]ks8)ckrV6Ee!;?Eb!VH!_nj)a7n*f]3m-Es$l0.9ljlGI]i8EMKh:pZ: +f@SR&e'ZOfcHOJRaN)9<_SO"$]Xt_a[^EHIYck11Wi;nnUnaX\:]=,`:\mod:\IWQ9`S2Yr. +2`fpe:ca:\mfd:\d`e:JO[`:]=2h:]F8d:\@KQ +9`Rr\:[_'O:ZYCQ:]=,h:[:jS;?'Jm:\[`d:\[]_:]!ub;>3ua;u]bo;>a>g;ZK_n;u]es;uTbq +;ZKenYf2`EWQ2+Bu%6U7 +K`6T*Jq8LPJH(*!If4]pHiSNlHN/9jGl2dbG5cXLFT-F_G5ZXbGQ<$gH?4F\I!pElIt3'#JqJ]/ +KnbA=M2@.LN/is\OckomQ'[l+R[]k>T:qsRUnsufWiE/&YHY:<['mHR\\#Mg^VI_(`5Td +JcC<$JcG3=o`"gfrVZTjs8)ckrqQNf!;?Eb9D%iIo()>?n*f]3m-O''l0._ns4(]tCqe\$iZMZ*:C5X/`+rV52o#g"P05g&0Lcg&K\+f@JL@VZ+%# +\,Ni9\,Ni5[1osSZ*CO:B52=3J:r`:Mj'HuV6.3*\,Ec7[/dT2[0!_C[J[E)[J[H=\$i`S[^NZS +[emQ6\,a"l\GNi1])0&<])T>9\GNc0\F-p,])'&7]E#YE^Abn?_#;+G_YM+J`;R[T`r=!ZaN++r +rl>#Zs2k;`s3(GdrQP>fps/rcrQkGhs3^kprmUns!7q/$qq1i"!8@G*rn@5'!o2Vgrnm_5!9*e6 +!9="a5]WnH5W1fcP +R$jA/Qc$DCZ*:C1O+sL7^Vm:GJYIsuR$jD4S=Z@GTqeE[ +Vl6SpXKAY0Z*UdE[^`lZ]Y2(q_8=.0`lQ9EbK\>YdF$Fme^rF+g=tE=hV[8MioB+]k3(sml0@U$ +m-X60n*olHncA@Srq6 +JcC<$JcG3=o`"gfrVZTjs8)ckrqQNf!;?Eb7.g*Bo()>?n*f]3m-O''l0._ns4(]tCqe\$iZMZ*:C5X/`+rV54*\s.01[oUG]Ip7))PrgWA.r/U]9 +rf6]5s,R,`J4NW5%;NVe\4MuSb3NVeY@NK0!XNfB$YNfEgoqi:`; +qiCK5qN('+r/^i=rf?W3plYH8!0R8DrfQo9r/pr@r/po?r/q#Bs-*;Brfd8Cs-*JIqih&Es-rg*JKqj7AOq3_/L!LfMQSG/TRT)##YT`:_`UAgkaUACYbV#R4gV#R7kVYm@bWW0!uX8B!t +XoGL#XT5O%Y5kg+YnF@K['dgElr;Z`qrjDdoOS+b0P5gXEL]3&.K`Hf*KE$N'Jc1*#IsukFI0+eCHi89jH2`'dGQ)d` +FnBeSFoHR^GQ2mfH2`-iHN8HmI;+.[J:N3&K7ei2L51SAM2R=ONfT9aP*;,qQC+)/S"-(BTV8-V +V5L8kWiW>*Yd(O@[C3TU]"G_k^qmn+`Q$!@b0/&TcdC.heCE1&g"P39h;7&IiSrnYjlYail07L! +m-O--n*fc9rpg*]o`"O`pAamcq#C0iqYU0hr;HTbrdk*-s*t~> +JcC<$JcG3=o`"gfrVZTjs8)ckrqQNf!;?Eb7.g*Bo()>?n*f]3m-O''l0._ns4(]tCqe\$iZMZ*:C5X/`+rV53r`r(d&`qG@,dohbQ\ohGK]r`/u! +s&]2#r`/Ym!EE2!<=LlD1d4/i6UXC67n?3GrDEDfqbR5gs&&_k!DcPk:B4/a9`e'c:]*uf:\mid +:B4/f:BF?g;#O/i;"mcY:@V$Y:A%EN:A%EE:]O;i:&n)U;#=,i;#X8d:]O;e:A[ia;#4&`;YX2g +;>X8a;u]es;uK\p;u0Mm5VV)>lS"/>$Lr1!*fA+rE]>- +!+>b6s'l"!50/bXF3BB8e5X[Uj2Ej8f8OuH<62j7O7/o^T7gM[YQ'IZ$Q^=*=RK&`US,\ubSXuIHTV8'R +U8.[_s.p1%Vl-JlWN*&&YHY::ZMq0=['dVg^AY_I^;%J!rkS`S_o0O6rl5;cair#S +cHjh`f2hoO!/LQ.s+LH+re(6&!.k*!!e5ZJrI"`pH[G^;s*=Tgr-/-`r,qXRrH8*_r-/0c!."Qi +s*F`nrdAL0It3'#JqJ]/KnbA=M2@.LN/is\OckomQ'Rf*R[]h=T:hmQUnsufWN*&%Y->1;ZaI6O +\[oGe^VI\&`5Ta;ai_fOcHjnce'uq"f@em4gtgiEi8N\UjQ5Oekiq?slg4!*mdKW6nc&([oCW%T +s7ZKerV6Egs8)Wirqu`no)=4?MuS;~> +JcC<$JcG0n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-4AQaMu3;_SO"$]Xt_a[^EHIYck11Wi;nnUtsf)gAfk'f`0Xuf_*qtfE9aVe^X;j +qPO.us0qp7s0Vj8r3[BKZa-pBZ*:I9AnZ=6I"-m,N0KWuTWGN0rO2=*r3Z.)rO2a8s0`*?[^NZS +[f3`>\@8rW\@;1A!4h7%qmlC2r42j=s1.m6r3uF1m^`>.qRcR9!58BGrP/$@rk\HJq8<0LrPefV +rl5)]a2e(srQ"oYs2k;`s3(DcrltJgq9K&drQkGhs3^hormLquf%0iPr7Lbsrn@5'!SlQ2hu2L0 +iW/$:jSn9>k5OQCl2U&Kli6>NmJlVSn,MkWnc&.[oEFs`q>:*ho)DP`jkJ2)`PBC,Z`Bt#US"*E +R@0G/_S*C_Z*1.0L4ZbI`4r4;MkYpG/qSWWs+16%rI=s!IX_9Es*XinrHeHgs*4Ba +r-%aUrHA'^s*4Qhrd"cqI!g?jIXh?ICOq(iK7nu6LPUeEMiuR$a>3S=Z=FTq\?Z +Vl-MoX0&P/Z*L^D[^WfY]Y2%o_8=+/`lQ6DbKS8Xd*^=le^i@)g=k? +JcC<$JcG0n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-4AQaMu3;_SO"$]Xt_a[^EHIYck11Wi;nnV#6e`SGSfFSGAZSSGerNK)^E"K'SHr +NW4t:M[rce@V'7gD/aT?H@CL%N/mgqrf6r:qi(H2rf$]5qi(K5"ceS%NfK+oNr+k;Nr>">OH9-t +qiC-+r/^i=rf?T2q2tQ9!0R8DrfQl8r/puAr/po?r/q#Bs-*8As-*ADs-*GHr0./Fs-Ks-`\MrgF" +XT5O%Y84@IZ*L^B['d?N\$roZ]">Se]tV4r_>_=N_`GZEXJDGVQ][;fKn=f$G^4LSEcQ/6S +KnFi'D/4ocNer.)DK]5\77g]L=CGo07n$luD/XN>H2^A79c?WRJ:MNUDfKf?GBe@YH[C3lp\4IY +q>0sbqu6NnrVul)s6c!AOo(:AOo:FGObegKL]3#0KnP-YKE$N'Jc1*#IsukGIK+]pHi89iH2i-c +GPlXWFo?L\GQ2pfH2`*oH[L3hI=?\FJ89^fK7ei3L51SAMMmFPNfT9aP*;,qQC+&.S"-(ATV8*U +V5L5jWiN8)Yd(L?[C3QT]"G_j^VRe)`Q$!?b0/#Scd:(geCE.%f\5'7h;7&IiSrnXjlY^gkiqBu +m-O--n*fc8nac8BoCW%Ts7QHerV6EgrqcQirVZWmoDX=@MuS;~> +JcC<$JcG0n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-4AQaMu3;_SO"$]Xt_a[^EHIYck11Wi;nnV#!ma:@D!N;"%0R=8u=nhpJ:HWnkK-Z +ohY!NohX[G!)NPg!)MoWqbdAir_N>ds%iJdqG6ubqbd&bq,@/fr)32dr_rtu<)los;u'Gm?b97>Q.k->Pqb(?2\(1?XWh@"CbkNA7baP%qfQhB3nb@ +;G^(Z7RTR-5Q*]62E*NO2ag&$6U0/YF>3BB;f5X[Oi2EX2_ +91_Z=5X[t,6psI37S--B99b[+Q'Ra8QiEF+R@9S6S"-">T:_dLTqS3TUSO]^UnsobVl-JmX/rJ, +YHY::ZEpjC['dWs+16%rI=s!IX_9Es*XinrHeHgs*4Bar-%aUrHA'^s*4Qhrd"cqI!g?jIXh?ICOq(i +K7nu6LPUeEMiuR$a>3S=Z=FTq\?ZVl-MoX0&P/Z*L^D[^WfY]Y2%o_8=+/`lQ6D +bKS8Xd*^=le^i@)g=k? +JcC<$JcG0?n*f]3m-O''l0._#;+H_YM+J`;R[S`W4'Ya8j9Y`r*mVaSs<]aoKWa +bl,cgcHjh^r6PDgrQkGhs3^kprmUnt!7q/$r7Lo"!8@G*rn@5'!o2Vgrnm_5!9*h7s5X%rTs[Sn*g8F!:p-\#5%T_q>:*goD_YPh:0]h`kTU&Y,J.mSt;I>Q^+a]GCkcG<.0CSOHQ'&TMSQa<`N%rWMki@PE_?!S=cCHTVJB_V#U;- +rkeZPrPJ;Ll%"IN/WdXO-,ThPa.Q%R$sM7St;UKU84T^Vl?\sXfek3 +ZEppH\%0&]]Y;.r_Sa@3a2lBGbg"G[dF-Lnf%8R-g=tE=hVd>Nj5]4^k3(sml0@U$m-X60n*olH +ncJFTo`"Lbp@n=[q#C0iqYU0hr;?Nbrdk*.s*t~> +JcC<$JcG0?n*f]3m-O''l0.jNVeb6 +N=h,-MMY>]AS5dpDK0fFI"I$/r/L]9rf-c5rJUW5qi1H2rf-H.qi:`;rJpu@O8+h5O6r&,O8b7? +O788-Oo(4AOckn+OnFh6OoCOAOoLRGPEM+,OoLUEPPLCAPPgUDPQ$gEPQ-mHQ26gHQi<F%Z2_-9 +['dW=^u/3875n=CiFE;Gt:Ls9h\7[J.?F8E,fo?GC"IZH[LM2I4MN/is[OckomQ'Rf)R[]h=StMdOUnjlcWN*#$Y-5(8 +Za@0M\[f>b^;%J#_o9U8aN;WLc-F\`daQ^sf@\d1gYCWAi8ESSj5f=akNM0plKdg'mI'H3nF?MK +!qZ'Vrq-?dp\4X]s7u]kqtpBjr;H6dJcC]/J,~> +JcC<$JcG0?n*f]3m-O''l0.j:&n)U;#=,i;#X8c:]O;g:AI]_;#=,f;?0Sl;Ya8g;>a>h;u]hq;uT_u;cHar +r_rVmr`0#!rD`ess&K,$qH!Go$!:>5=BJX+=BSi*>6S89>?Y37r`oJ-r*92+rE]P4?srtB)e*;e +A7T7`AnPaa>#eNu9hRrE6pNt"4?Ybc3;tco7RTR05X7In5s[_$5Wq(d2`EE=+Wr'a/1rb=0fCgE +3BB;f5X[Li2a0Dd91_Z<5XRk)6psL4r^R#]8sB7=s-rA3L]3&.L&Zi*K*$XUJc:3"J,ausIK+]pHi/3iH2`'`GP64UGQ2pfH2W$jH[L5? +I;=:]J:N3&K7ei2L5(J>M2I4MN/is[OckomQ'Rf)R[]h=StMdOUnjlcWN*#$Y-5(8Za@0M\[f>b +^;%J#_o9U8aN;WLc-F\`daQ^sf@\d1gYCWAi8ESSj5f=akNM0plKdg'mI'H3nF?MK!qZ'Vrq-?d +p\4X]s7u]kqtpBjr;H6dJcC]/J,~> +JcC<$JcG0C\i8EJJgtUQ9 +f@JL%da?Fec-4AQaMu3:_SO"$]Xt_a[^EHIYck11Wi;nmhYu=5gtLH7r7M#%p=T&ks4IA&rm^G7 +pU9n*!OT94[/[HIZ*:C5YAKW=I!p['MN*deS"Zmj[^Pe8rj;=*r3lX7!4M[3s0r'_#;+H_YM+I`;[aT`W4'Y +a8j9Y`r!gVaSs<]b5]Zbbl,cgcHje]r6PDgrQkGhs3^hos3q"u!nPuTqq1f!!8@G*rS%,&!SuW3 +hu2L0iW/$9jT"?>joOZ/rosIJs6K^Orp9dTn*g8F!:g$Z#5.]bqY^D(L_u7II_>M+F^\khGMZ/G6LkgcbLAur-K`6W(K)^E$JH(-!If=cq +I/eQkHN&3hGjBSQGlN'fHN/
  • U6gqu-HkrU^#>s,?u.~> +JcC<$JcG0C\i8EJJgtUQ9 +f@JL%da?Fec-4AQaMu3:_SO"$]Xt_a[^EHIYck11Wi;nmT)>/ZSG\lGSGAZRSG\lGK'eQqNrP(R +N/NRMMI:[aAS>mtEclSQItNN8NK*msrf-c5rep]5qi1K3rJgB.qiCc;rJpu@O8+h5O6r&,O8k=? +O788-Oo(4AOckn+OnFh6OoCOAOo1C?OoLUDPPUIBPPgUDPQ$gDP5pjHQ26gGQN3?KQi3F"XT5O%YAg_NZ*L^B['dSe]tV7s_8=($Yc+:eR$E_oN.cb0H['[UF)Z,JH$OaaI=Hg!JqEarp]L?gqYU9is8Dus[K$,d +o8rO*rf[2As,-f4!f2VereCH,!/1?(s+:9%rdb#us*jrqs*Xinr-J?frcmaQrcnHgrHeKj!.=co +s*ep:J:N3&K7ei2L5(J>M2I4MN/is[OckomQ'Rf)R[]h(N@hr*JQj5f=ak3)!nlKdg'mI'H3nF5u=o(2JFrq6 +JcC<$JcG0C\i8EJJgtUQ9 +f@JL%da?Fec-4AQaMu3:_SO"$]Xt_a[^EHIYck11Wi;nmq+po`mSEFNqb?cZnlPfkpf75k"$f1? +6N04V6UaL984cKO:f%$drD3GirDEPj##S2n:JX_\pJ(KZs%iSgs%`VinkT6^pJ:T[s%iYinP'!Y +oM>hs%iAcr(d#_qb[,drDEVmr)3>h!)i_lqbm>js&Atr +rDX##<)lms;c?ZkQ.e/>?kE;>Pqb(?2e11?N=L4 +@K0j;A4U9DAn"tF;c$:a8jbs35X%@o3BB)W2)[<[6pa.)5!2.s6:!k#3]8rT0J+=i,qU]"0fCU@ +1,LpM3]oYm6oI"`4[(u#8OuJP63fqI6q9X97nEVPs%EEWrg!MLs-NbQs-X=bS"#q=StDXJTV8'R +UAgniUnsrcrhg($WN3,'Y-5(7Z2V$6Za@-J[^WcWrOW$@!5/_=O_Z[os`l?."b5TWb +blQ,9i)]kXr`8qss,-f4!f2VereCH,!/1?(s+:9%rdb#us*jrqs*Xinr-J?frcmaQrcnHgrHeKj +!.=cos*ep:J:N3&K7ei2L5(J>M2I4MN/is[OckomQ'Rf)R[]h(N@hr*JQj5f=ak3)!nlKdg'mI'H3nF5u=o(2JF +rq6 +JcC<$JcG-;o`"gfrqu]krqcZjrqQNf!;?Eb!VH!_nj`0=n*f]3m-O'&l0.]",BH\cKFSqmla.qRcd?rk8)[rPn]Ss2b2]s2tAbrlkAdrQbAfrm(Mhr6YJkrmLhq"OtuQf%9iPp"B>uqV)),h;8.g +!oVtoqVqP8r8dn>r8n(Dkii$1s69UMrp9XO!UfFTn,W%Yo*4j\p\F^brV?Itrq5.#ccF/F`5AdZ +VPU&ZS=>q3Q^,D#\$3'=X,MV3^pM"\SVEYuL0\1tH:r=.LPS`):4n7[OdMW0T28E_<`N%dW2HSW +PED)qR@Kk@Tq\;Ll%"IN/WdX +O-,TgPa.Q$R$jG5SXuIITqeE[Vl6VqXKAY0Z*UdE[^`lZ]Y2%o_8=+/`lH0CbKS8Wd*^:keCN7( +g"P3:h;7)JiT&tZjlYail07L!m-O--n*fc9rpg-^o^r.U!quB_rV6Egs8)Wirqu]moDX=@NW4M~> +JcC<$JcG-;o`"gfrqu]krqcZjrqQNf!;?Eb!VH!_niu[6n*f]3m-O'&l0.eLr1!bXn!s_.+r/D;HMMcG)AS>jrD/siGIY*61NW"n;NVSP4Mu8P3NV\V5NU`&+O8k7=O7n\3O6r&,O8k=? +O8P(>O7eV3Oo(4AOckn+OnFh6OoCOAOo1C?OoLUDPPUIBPPgUCPQ-mEP5pjHQ26gGQN3?KQigKoCJ'Ble*#77^'U +6!.K*B1>BY@qBFnEccMO84c0sbrqufp!<0D+ +qN:B2n;Ll%"IN/WdXO-,TgPa.Q$R$jG5SXuIITqeE[Vl6VqXKAY0Z*UdE +[^`lZ]Y2%o_8=+/`lH0CbKS8Wd*^:keCN7(g"P3:h;7)JiT&tZjlYail07L!m-O--n*fc9rpg-^ +o^r.U!quB_rV6Egs8)Wirqu]moDX=@NW4M~> +JcC<$JcG-;o`"gfrqu]krqcZjrqQNf!;?Eb!VH!_niZI3n*f]3m-O'&l0.sAr;,C(b:JO[Z:&7Tb:]*uf:B4/\:B45c:\dcc +:]=,[9`Rr\:\mid:\RWW:]=2i:[:jW:]=)h:]4/Z;#=,h;#a>c:]O;i:A@W^;#4&f;?0Sk;YsDm +;Z0Jh;Z'Jn<;ohm+s'5S.r*92+ +ra,V3s'Yh7&n5?]A7]4T=]83o:.RlC69m^tr]C-=-8m_=6q0O25Wq4s5=%S#4ZYP^2)$U'+XJ`m +/2B+E2)I!D3&j#br^$QD'K80=4A&198j>R,6:F:07RT^98P/nS*_f=$9hpt=QBml(R$a;1R[]h< +StDXJTV8'RU8+N[rh]Uk$)a`$X/rG+Y-5)/Z2_*6['d_:W_o0L4 +a2lBEb5TQdbg"DXhcB\U!*9%u",r.rMZ&A5LkgcbL'!'^K`6W(JcLB#J-(4LIf4]pI/eQjHN&3g +Gk6.XGlE!eHN/?lI/\NpIXh?IBRtbfK7nr5L51SAMMmFPNfT6`P*2&pQC!u,S"#t?T:qsRUnsuf +WiE/&Y->1;ZaI6O\[oGe^;%M$_o9X9aND]McHaeadaZdtf@\d1gYL]Bi8ESSj5f=akNM0plKdg' +mI'H3nF?MK!qZ'Vrq-?dp\4X]s7u]kqtpBjr;H6dJcC`0J,~> +JcC<$JcG-;oD\afrVZTjs8)ckrV/tYp@e1Po^qbGo'u5C[i8EJJgtUQ8 +f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYck10Wi4k5hYu@2g]H6agAT_)gAfh+f_sG"f`'S# +gAfh-f[n^ReH+1Kr201ar3cR5pU0h(rj2X0&[8OCX`'YQH[pd)MMmXdS"m%U[K!W*[JdQ2[fEr9 +\*pj+\`gR%\H0:PpUUC;])0&<\cB;4\,a#8\Gj&=\F-p,])'&=]`,VD]E#YE^\YbF_>D%H_>;%F +_u7OO`W*sXa8a3\a8O$Sa8a6[ao9H_bQ#fac2Q#fci)/hchl)hdJqYpdfe1Ne^i@Mf_*qsgA9P* +gtgidhZMfoi8FIk!9P[42ccO/G +_Sid_Vl-8\S=Gt3QBmcK\?iBBWNV&-Ydh][Sr/o'H!aicH>@SMLJ(B>IY*95Od2E*TMJH_;,gLm +W2Z_VP*;&oQC456T:r!SV5gW!Y-"n2Yl1i-s7F,-_Y(bC_#;%D^Aa)kMZAY6M>rA3L]3&.L&Zi* +K*$XUJc:3"J,aurIK+]oHi&-fH1H4ZH2N!gHiJKmIK+`rJ,Xt/JV&N,KS>/8LPUeEMi*YctF>[C3QT]">Vh^VI_(`Pom=aihoQcHjnde'uq"f@em4 +gtgiEi8N\UjQ5OdkNM0qlg4!*mf)YUnF?MK!V>s_p&Facp\jmeq>^ +JcC<$JcG-;oD\afrVZTjs8)ckrV/tYp@e1Po^qbGo'u5C[i8EJJgtUQ8 +f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYck10Wi2P]T)"rUSH#/LSGerTSGerWRfA!2Jb>&o +N>.D4NJrjSMI:[(6N;nh5N;S\4N;\b,Nr+n:NrG+4OT1@AOT(=.OSb+= +OSt7striQ4%r2ft%rNH7*s02p: +Za7$G[^N]U\[qdP?bF(d]sju9Ssbq0O,f!KIXQNeG'.hEE,KTRMhct>eO0AO/dU?X[P^DK9iBGt:Ir7SQQLJ:N2gDJsH5FEMeQH?spbI=Qj#JV/T.L&H`-q>1!fr;Z`q +rjDe&On4\#OoC=>MZAY6M>rA3L]3&.L&Zi*K*$XUJc:3"J,aurIK+]oHi&-fH1H4ZH2N!gHiJKm +IK+`rJ,Xt/JV&N,KS>/8LPUeEMi*YctF>[C3QT +]">Vh^VI_(`Pom=aihoQcHjnde'uq"f@em4gtgiEi8N\UjQ5OdkNM0qlg4!*mf)YUnF?MK!V>s_ +p&Facp\jmeq>^ +JcC<$JcG-;oD\afrVZTjs8)ckrV/kVp@e1Po^qbGo'u5C[i8EJJgtUQ8 +f@JL%da?Fec-+;PaMu3:_SEq#]Xt_a[^EHIYck10Wi5nnohYTaohXsOnP/p]oiCulr`9"uqc!Y_ +5sRU45R'SE84c?E9`7fe:]F8h;?'Jm;?'Jm:B4/a:&.Na:]4&W:]=2c:\dcc:]=,[9`Rr\:\mic +:\[]_:B4/e:]=2h:[CpX:]=)h:]4/Z;#=,h;#a>c:]O;j:A7Q_:]aKj;#=,h;Z9Pk;YsDm;Z0Jh +;Z'Jm<<#nn[(G1>l7n- +?N+=3@/jXG@UiqX?mTR$jD3S=H.@ +StDXJTV8'RU8+N[V5=0gs/-U2WiN8(Y-5(7Z*L^AZa@-J[^NZS\Gj#G]">Vg]tV4q^qmkd_?Iiq +`5]m>rlGAebKJ,Sbg#$Gpf7bK7nr5L51SAMMmFPNfT6_P*2&pQC!u,S"#t?T:hmQUnsueWN*&% +Y->.9ZaI6N\[oDc^;%J#_o9U8aN;WLc-FY_daQ^rf@S^0gYCWAhr*JQj5f=ak3(smlKdg'mI'uB +!V#XYncA@Srq6 +JcC<$JcG*:o`"gfrqu]krqZWjrV6Ee!;?Eb!VH!_niZI3n*f]3m-O'&l0.R^m[JmQ/ZN7A:riZp9CQc#OI=[-/Mj'NuTW,-&[e@*/[.Ld([emN6 +\GWi)\Gj&&\G`u3])K>=\c95@\a6j*\c92=\c922\c02:]DoPC^&GYH]tV7rqS<*HqS<*HqSN*H +rP\WQrl,)]aN2EBrPn`T!6G)[s2t>a!6kAcrm(MhrQbGhqp>AjrmCu!eC<%"f)++mg&Ke&gB$*c +rndV2!9!_5s5X%:Jt%e<)cbnW2HST +PEV/nQ^O>7T:qsRV5^PuriZ:*qQ[1&lbNS:rPAHJr4i*B!fi8"repo:MMhCi!f2Vere:K.KS9>W +s+:9%rdb#us*jops*XfmqKh[Wqg/6g!.=`nFaegiJ:N3%JqJ]/Knb>;Ll%"IN/WaWO-#NfPa.N# +R$jD4S=Z@GTq\?ZVPgDnX0&P.Yd1UB[^WcW]=bhl^qmn+`Q$!@b0/&Tcd:(geCE.%f\5'6h;-uH +i8N_VjQ5Oekiq?slg4!*mdKW6naZ2@oCV\Sp&F^cp\jmeq>U6gqu-HkrUTr=s,[21~> +JcC<$JcG*:o`"gfrqu]krqZWjrV6Ee!;?Eb!VH!_niZI3n*f]3m-O'&l0.M2I4MN/`mZOHPckQ'I]'R@9V8StD[LU84W_Vl?\sXfek3ZEppH\%&u\]Y2(q_8=.0 +`lQ9EbK\>Yd*^=le^i@)g=k<;h;@/KiT&tZjlYail07L!m-O--n*fc9nac8Bo^r.Us7QHerV6Eg +rqcQirVZWmo)=4?O8j_~> +JcC<$JcG*:o`"gfrqu]krqZWjrV6Ee!;?Eb!VH!_niQC2n*f]3m-O'&l0.qnohYTaohY?Z!)`Mf!)N8^r_35hp/V#k +r)`ku!*/qr!^T(=rBLZU779X:92&)W;#X5j;#4#o:f1(d:esk^pJ(?V!DQ>X:]=2d:\[]a:]F2\ +9`Rr\:]!oc:\[]_:B4/f:]4,f:[M!Y:]=)i:Jh$fmnijXs%i\kp.tfd:/:IXr_WVl!)WMhs&/hn +r)3Djr_i_mq,7/ir`&nrq,@>orD`Vnr`0#!r`&hrpK%2nr`K2's&f;&!a&T/rEB;+>Q%b*>Q7t. +>Pqb(?2n72?iOO5@1m$T>?=]t9M@uH6U.84l-46UO1.6UXF47S$$?9M.uO9MJ4[:AdofQP5aSR@9V8 +S=Q4BT:_dLTqS3TUSRmc%]6)"Vl6VrXf\b/YHY::riuU4[^H+C!k5\Lrj`'A]`,SJ^;%Fu_86,f +"iJ9t`lQ7#aTBW.bPo`BM2I4MN/`mZOHPckQ'I]'R@9V8StD[LU84W_Vl?\s +Xfek3ZEppH\%&u\]Y2(q_8=.0`lQ9EbK\>Yd*^=le^i@)g=k<;h;@/KiT&tZjlYail07L!m-O-- +n*fc9nac8Bo^r.Us7QHerV6EgrqcQirVZWmo)=4?O8j_~> +JcC<$JcG*:o`"gfrVZTjs8)ckrqQNf!;?Ebs7ASJo()>?n*f]3m-O''l0.j]^VBW\rk\HH +rPABJ!Q2kR_u7OP`VmdVa8X-[a8O$S`rO3ZaoBN_bQ#fac2Z)gci)/hchl)hdJhPte'umte^jWM +p"BB!q:bo)rSIP2!T;r5iW/$9jT"??joX`0kl0iHlMp2Mm/HAQmdL,D!:p-\AbGclq"jpfs8Vr] +gsjQf`P0:+XfJ:oU7[sEQBml%_7I(ZYHG$dJ@!)(]q^pYJTu0KB4u%"I>:Hk:k+%OO-6!%T:ShV +;-$[q;5gImW0!4,Ocu-"S"?7FTVA9]XKA_0Xfel&Z2V&4s6IN#^];4K_#;%E^Aj8oNW>(; +Ll%"IN/WaWO-#NfPEhE"R$jD4S=Z=FTq\?YVPgAmX/rG,Yd(OA[C3TU]"G_j^VRe)`Q#s>b0/#R +cHstee'uq"f@em4gtgiEi8N\UjQ5OdkNM0qlg4!*mdBQ4nF?MK!qZ'Vrq-?dp\4X]s7u]kqtp?i +rVc?eJcCf2J,~> +JcC<$JcG*:o`"gfrVZTjs8)ckrqQNf!;?Ebs7ASJo()>?n*f]3m-O''l0.%3OT1@COH5IhOSk1=OSt7O91Q-P5UO9OSk7?P5LI?P5LIBP5^[AP5^[CP5gaGPl6gEPlI$EQM6aFR/EBJR/WKSR[a)B +q47GTqOde\rh9@d!2K=`oV;D]!i;ckqkjFmor7tk!3>sts/l:%r2ft%rNH7*s0;U0#ICeF[^W`V +\c033[]ZI"S=#S'O,J[CI=6EdF`_S@Df(PnMM?b7IrT7YN/<=:F)#)d(< +N;ne9MZ/J4L]E50LAuu-K`6T*Jq8LOJH(-!If4]oI/eQdHN/9aHN/?kI/\QoIK4lsJ,t4Qre"g9 +Knb>;Ll%"IN/WaWO-#NfPEhE"R$jD4S=Z=FTq\?YVPgAmX/rG,Yd(OA[C3TU]"G_j^VRe)`Q#s> +b0/#RcHstee'uq"f@em4gtgiEi8N\UjQ5OdkNM0qlg4!*mdBQ4nF?MK!qZ'Vrq-?dp\4X]s7u]k +qtp?irVc?eJcCf2J,~> +JcC<$JcG*:o`"gfrVZTjs8)ckrqQNf!;?Ebs7ASJo()>?n*f]3m-O''l0.X8h +;uT\o;>F,g;uKYq;u'Ao5_Y+>$Lr/!*fG- +s',G,r*B;.s'Pe6&n,-NlQ2bQ_58jYd/6:+(,6q'L47n6/M9*@p_9M8(X:Adoe;#Zm_S,]#Y +SHtgZT:hjNTq\=]V#I2(VPgAmWiW>)Y-+t4Z*L^B['[6KrjE'@\@B)[]=Y`T]`c'a^VI\b_Z.LU +`Q#s>rlP2_rlb>chH'JQs,[2?!0-u:s,-l7re^Z2!/LQ.s+UK+rdt9(JV!cMs*t&trI+Zms*OEb +s*=M2I4MN/`mZOHPcjQ'I]'R@9V8St;UKU84T^Vl6Vr +XKA\1Z*UgF[^`lZ]Y2%o_8=+/`lH0CbKS5Vd*^:jeCE1&g"P39h;7&IiSrnYjlY^gkiqBum-O-- +mdKW6nc&(\oCV\So`Fj]p\jmeq>^s,[21~> +JcC<$JcG'9o`"gfrqu]ks8)ckrV6Ee!;?Eb!VH!_ni?70n*f]3m-O$%l0.6rj2@+osOh,r3HC.rics:X_j?2H@CL$M2[R_R@g@Yl*^N!qR?L7"1PeL +\,No;\b*E1\bqLQ`;IOP`;dgR`W4'Ya8j9Z`r!gVaSj6\b5TTabl#`bc2c2fc2c2fd/MGm +dK\1MeCE+#fDO:nf`9b%gB$*crn[e8hV[5KqVqP8qr@b=rT=.Cs60LIs6BUL!:9[O!:KgT!:p-\ +AG,Zkq"agcp[d7mbfRlA`kegWVPKuYS=Gt2Q'@NH\$E0?W31l*[B@EIS!8GMFDGH#95o968kr33 +JVT8KR[]t";Gp@l<)TWmVl5W=P*D/pR@9\:T:hmPV>lmKYHG"2YH[c+qm*O-s2"`Pp;$aEqn`'C +r4i*BrJq#?NK*pr!fMqnreU]4LPPk`!el;\re(6&s+10"s*t&tr-eQlrd4'Zrd4WlrI"`rIt.HJ +!J,k%K5?3pL5(J>M2I4MN/`mZOHG]iPa.Q%R$sM7SXuIIU8+N\Vl6SpXKAY0Z*L^D[^WfY]=bkm +^r""-`Q-'Ab0/&TcdC.heCE.%f\5'6h;-rGi8N_VjQ5Oekiq?slg4!*mdKW6nF?)?oCMVRp&Fac +p\sseq>^ +JcC<$JcG'9o`"gfrqu]ks8)ckrV6Ee!;?Eb!VH!_ni?70n*f]3m-O$%l0.r/go=oT9*8qN1`> +!0[;CooT*6rf[2Ar0$u?s-!AFqNCiAr0%)DrfdDHqiq,Gqj-oArg; +Ll%"IN/WaWO-#KePE_>uR$a>3S=Q7DTq\*Yd(L?[C3QT]">Vh^VI_(`5Td +JcC<$JcG'9o`"gfrqu]ks8)ckrV6Ee!;?Eb!VH!_ni?70n*f]3m-O$%l0.j:\RTW:B+&b:]F2b:]4,c:\dca:]=,\9`Rrd +:B4/e:\mff:Jaj]:Adlf:Adod;#=&U:]O;j:'"-er_`)[qbco\o1o?_rDfs&8hp!)r\m!``3"r`&bprDinur`&hrpf@;orE0&%#$=r.=BSg2qcj&'!*fG-s',D+r*B;.% +UWUM>$+^":J48K6pa.&r]Ek93&`ZP2)[fh69me"4$c+r5!Ctb1G1+(+s\Kf/29%82)6sI2`a)c5 +X[gq2E*f`3D2q783oL+6UO1,6pj@17S$'AKKh[o9he8QqbI&bqbST-S"#qkWiN5'Y-+t4Z*CU@Zi.<2[Kj:O\[f;`]=e-V"2;Rd_>V4S_o0R8a2n8%$-LB4bKJ.2< +``A]YdF$Fme^i@)g=k<;h;7)JiT&tZjlYail07L!m-O--n*fc8nac8BoCW%Ts +7ZKerqQKgs8)Wirqu`no)=4?OT0h~> +JcC<$JcG'9o`"gfrVZTjs8)ckrqQNf!;?Ebs7AGFo()>?n*f]3m-O''l0.\[]/Y +rj`!=oXOk1p:1(3ppg:5pppU=]"5Mcrjr'=!P5i<\,a)7\,a)<\G<]6\FmE3])'&=]`,VD]E>j] +^VBW\rk\HHrPAHLrkncSr58KOqSiNUrl>)[rPn]S!6G,\rlY8as31DcrltMiqp#2fqp>>is3gqr +s3q,#f%9fOp"9?!ptGf)qq_D3i8OOl!90gEfZhOW`ko[#X/D_fTU_O?QBmf"^ppbTYH"^^K!321[@_r6HZO%:B7"B:K8NE%I=I$5Od_c3 +BMhW'<)ZYlW2HSTPEV/nQC456StMaKUSOjgs-K,PQN3?EYkbQ1rrBn5_YCtG_#D1F_#1tE^Aj;q +OT(=@NW>(/8LPUeEMi +JcC<$JcG'9o`"gfrVZTjs8)ckrqQNf!;?Ebs7AGFo()>?n*f]3m-O''l0.O8Y1=O7\P6Ont19OnFh5 +OoCOBOo1C?OoCODPPUIAPPgUDPP:=Z"[6BgtU"@V9LqEclY.84Z3D91j\aJ:DHTDfBZ:FoHUk +H$XgbIXgJ@F8U.QL&$K'rVul+rrA2ZP4Xn9OR&#/OT(=@NW>(/8LPUeEMi +JcC<$JcG'9o`"gfrVZTjs8)ckrqQNf!;?Ebs7ASJo()>?n*f]3m-O''l0.fq,$rar_3)]qc3Vp +pJ_)kpJh8ok:B4/b:%qBc9hnDW:A[ie:A@W` +;#3u_:Amuf:@h0[:Amuf:Adob:B+)j:f$g\r(d;fr(m8fqbQTU!)NSh!DcPk;=79Z;#sKjoM>Qc +;"RQ`;"[Zc;Z'Di;Z0Pn;Z0Jf;Z9Vn;ufkl<<#tt<;T\qQ%b(>QJ#4rET8+ra$XQ>Zk'(:JFJP77':)4?Yeg3&ifS2)Ici6UF(&4%'!5.R#pQ +3&W99-6sll.5!G92)I-J3''2d5X[[m2EVf]tV7r_#D1L_@+<$ +`lH0AaiMQFaiaV,!*9#!j&Z%Ws,d;Crf@)>!0-u:s,-l7re^Z2!/LQ.s+LH+rIY0'JV!cMs*t&t +r-eQlr-S-`r-SEjrI+]ps*t'!s++s;K7ei1Knb>;Ll%"IN/WaVO-#KePE_>uQ^F21S"6.CTqS6W +V5L5jWiN8)YHY==['mHR\\#Mf^V@V%`5Ta;aND]McHaeadaQ^rf@S^0gYCWAhr*JQj5]7`k3(sm +l0@U$m-X60n*olHncJFTo`"Lbp@n=[q#C0hqY^6hr;HTcrdk*2s*t~> +JcC<$JcG'9oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_ni61/n*f]3m-O$%l0.TR])B/?]".[Is1.s8s1/-=q76I6ost(5qRcd?qRlsE^VBT[ +s2"QIrPAHLrkncSr58NP!6+fSs2Y/\s2Y,YqSrTWr5nu]rlb>cr6>8e!71Pfs3LVirmCbos3q"t +!nGlRqq1f!!8.2%rS%>-rS.A.r8.J2!9!_5s5X";!9O1As6'FG!pT"8rTjFLs6^lqnF5u=oCV\J +p\=LBf[%^Z`P'4#X/DegTU_L@rg#'tOhS?4YHOt.Mh.qI_6]Y]S">=:B51smG_\md:k!tNNg#p% +Skr<^FOHBI& +!fi8"repl9MZ/J4L]E50LAuu-K`6W(JcLB#JH(,uIf+WlI.VdaI/JEmIfFosJ8'RdJqJ]/KnY89 +LPUeEMiYdF$Fme^i@)g=k<;h;7)JiT&tZjlY^hl07L!m-O--rpKmWnc&([oCW%Ts7ZKerV6Egs8)Wi +rqu]moDX=@OoKq~> +JcC<$JcG'9oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_ni61/n*f]3m-O$%l0.Do +T9!5rf[5Brf[;Fs-!ADrf[;FqNCiAr/q&DpQPZCqNg`>s-W\OqO%8Ms-`qWpmh5PqO[_Z!1s1^r +h07as.TLgpnIDUrhTLir20OnoVqkj!3>doriQ1&rNH7*(9t0NZa7'J\$W03T:2+3NfT$KJ:2chr +cL;ADf0B.NJiUHJpr,eCOqP(JTk^HEFV=0:JOelA3`US@:NteE--5J7n?0F9MBtdIt2ETDfKc=G +'J92H3\eFIt3+2jQ?A]rH.ggp4iVH\GuSkq3'^!rfR>FOHBI&!fi8"repl9MZ/J4L]E50LAuu-K +`6W(JcLB#JH(,uIf+WlI.VdaI/JEmIfFosJ8'RdJqJ]/KnY89LPUeEMiYdF$Fme^i@)g=k<;h;7)Ji +T&tZjlY^hl07L!m-O--rpKmWnc&([oCW%Ts7ZKerV6Egs8)Wirqu]moDX=@OoKq~> +JcC<$JcG'9oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_ni61/n*f]3m-O$%l0.Qc +;"[Wa;#F/j;YErg:f7*fr_reor)*8fr_rDfr`/qsr)N\rs&K%ts&B)!5MP' +=o_e+>lIq0>[(HZb$(:/+>O779F,4Ztkg3B/rU2`*B\6UF+)4Zc"r5XIUq2`N]N/fc5d +/LiG20/YLA3&j#`5!qXs2`rA3L]3&.L&Zi*KE$N'Jc1-!J,XopIJeKbHi8?i +IK+crJ,Xt4JV&K+K7nr4L5(J>M2I4MN/`jYOHG]iPa.Q$R$jG5SXuIHTq\?ZVPgAmX/rG,Yd(OA +[C3TU]"G\i^VRe)`Pom=aihlPcHjnce'uq!f@\g2gYL]Bi8ESSj5f=ak32'olKdg'mI'uB!V#XY +ncA@Srq6 +JcC<$JcG$8o`"gfrquZjs8)ckrqQNf!;?Eb4nS@;o()>?n*f]3m-O''l0.cr6=u]!71PhrmCbo!7Uqs!nGlR +qq1l#s4I5%rS%>-rS%A.h>?%1hr*JjirA'9jT"??k5XTHkiqBtrTjFLs6a4^nF5u=oCV_Kp>t&X +bf7W9`4`4NV4sWRS"#_/P`q0B\@&WFYG\L[JZ?B!YaU$6S:t$[CIi5eLIt<=It +!0-u:!fMqnreU]4LPPk`!el;\re(6&s+1-!s*t&tqL/6gr-S; +Ll$tGN/WaVO-#KeP*D5sQ^F20S"-(ATV8*TUo(&gWiE/&Y->1:ZaI6N\[f>b]t_A!_SjF5aN2NI +bg+M\dF-Lne^rF+g=tE=hV[8MioB([k2tjjl07L!m-O--n*fc9nac8BoCW%Ts7QHerV6EgrqcNh +rqu`no)=4?P5g%~> +JcC<$JcG$8o`"gfrquZjs8)ckrqQNf!;?Eb4nS@;o()>?n*f]3m-O''l0.r/gl< +oT9'7qiLf>s-!DEoT9!5rf[5Brf[;Fs-!ADrf[;Fq3(cArK7/Ep6>TBqj-i?rgV%F8g:]F8L[`L&eHfs8S5TP2q`*PQ$aFOT:LB +O8k4?NW+kM2@+KN/`jYOHG]hPa.N#R$jD4S=Z=FTq\*Yd(L?[C3QT\\#Mf^VI\&`5Ta; +aND]McHaeadaQ^rf@S^0gYCWAhr*JQj5]4_k3(sml0@U$m-X60n*ol;o()DDo`"O`p&Ojcq#C0h +qYU0hr;HTbrdk*4s*t~> +JcC<$JcG$8o`"gfrquZjs8)ckrqQNf!;?Eb4nS@;o()>?n*f]3m-O''l0.h;#*le;"[QUhqbQTUr(d;hr__oV!)`Ab!Du\d:]=2i;?'Pg;?'Gm +;>X8k;uKVl;>=&g;tO&g5MP(=o_e+>Qe87>?kD3 +>l@q9=BAEt9h\,J6pX%$r]U9@!&sj71IXVt69dXs4$u;!69[Ii3&`QE*%!$].PN\32)@*L3BTGj +6:*Uh2Ej;`91_ZH5qt +PQ$aFOT:LBO8k4?NW+kM2@+KN/`jYOHG]hPa.N#R$jD4S=Z=FTq\*Yd(L?[C3QT\\#Mf +^VI\&`5Ta;aND]McHaeadaQ^rf@S^0gYCWAhr*JQj5]4_k3(sml0@U$m-X60n*ol;o()DDo`"O` +p&Ojcq#C0hqYU0hr;HTbrdk*4s*t~> +JcC<$JcG$8oD\^erqu]ks8)ckrV-Hgp@eLY47r.8o'u5=n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-4AQaMu3:_SO"$]Xt_a[^EHIYl!DYi;_[:hVHuApt>`$pt5W"rS%8(!SH$'eHFCM +dEp8;cN'a5V!bYa[K?]D]>?\H0:PqmcU8qmc7.rODO2rjqsH.0hZ;Zor8R_9r8dn>rT=.Cs60LJrTaIMrpB^Q>jq1Po(2MEl.a_3ai;0: +_69l9US+0JR?s8*PE3Ae['Hp(73S=Q7DTqS6WV5L5jWiN8)YHY==['mEQ\[oGe^;%M$_o9U8aN;WKc-FY_dF6Uq +f%8R-g=tH>hVd>NioB+]k2tjjl0@U$m-X6/n*fc9rpg-^o^r.U!quB_rV6EgrqcQirVZWmoDX=@ +P5g%~> +JcC<$JcG$8oD\^erqu]ks8)ckrV-Hgp@eLY47r.8o'u5=n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-4AQaMu3:_SO"$]Xt_a[^EHIYkt*mTD>)MSbnrSSc>5ZRfo1JR@'B>QN3EFJaSQl +Nrk?$NrG";M@bV^G@Y2sBl%[,Fa8@aJqf0WMu\k6N;8J+Nr+n:Nr>%2OT1IAO8t@:OT1COSt==OT(CBP5g[:OSb1?P5UOBP5gaGP5^UCP5gaAP5gaGP5^[=PlI$GQLgIB +R/EBLR/E?RR[]fASGf#OT)PA]T`1YbU&^t`UAL\cV#-qeU]@7jVYm@lW;EOoW;ERoWW9*mXT,F$ +Y5PR(YlD":Za-[.TU_C8OH5BTJpr&mGBJ"JDJjWs+:9%rIFotrdOZkpO)dbs*jut +rI=p"K)UB'KSBD[AVZ(uM2I7NNK0'\OckllQ'I]'R$sM7SXuIITqeE[Vl-MoX0&P.Yd1UB[^N]V +]"G_j^VRe)`Pom=aihlPcHjnce'uq!f@\d1gYL]Bi8ESRj5f=ak3(smlKdg'mI'E2n*olHncJFT +o`"Lbp@n=[q#C0hqY^6hr;HTcrdk*4s*t~> +JcC<$JcG$8oD\^erqu]ks8)ckrV-Hgp@eLY47r.8o'u5=n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-4AQaMu3:_SO"$]Xt_a[^EHIYkq8j:\R]`:\did;>X2a:B4)]:$P^Y<;]brd!)WPgm83^V!)WVkl;.IXoM>Td:f-m^r_WSkr_iJfs%r_m +r)3Pnr_iVjpeq)io2P]hs&AnrrDrntr_ru"<)clm5MP(>5qh,>lS".>5hb+ +>S:=I=B85ttPQ6pGOo^],rf@)>!0-u:!fMqnreU]4LPPk`!el;\re(6&s+1-!s*t#sq0i!bq0i9l +s*sut!J,k%K)pXZre>!>Ll$tGN/WaVO,oEdP*D5sQ^F//S"-%@T:qsRUnsueWN*#$Y-5(8Za@0L +\@K2`]tV7t_Sa@3a2lBGbK\>YdF$Fme^i@)g"P3:h;7)JiSrnYjlY^gkiqBum-O--mdKW6nc&(\ +oCV\So`Fj]p\jmeq>U6gqu-HkrU^#>s-!D4~> +JcC<$JcG!7o`"gfrquZjs8)ckrqQNf!;?Eb47r.9o()>?n*f]3m-O''l0.XhuqrohVHr]gAT_$fDsV&gAfh2f[n^)eC2jm +ps8c3rh]Xlj0fi4[C!H&IXd!*M2[O]S"?CU[/.05[^EQO[JdQ2\,Ei:\c'&:\bW`: +\[]0G\c9/>\bru6\c'&<\H'/=\bE]7\H9@S]DT8=\bio8\bio.\c'&2\c02:]DfJ?]`Pp_^\P\F +_>1nF_>_=N_uI[Q_u@RS`VIOOa8O$S`rO3[ao0B]bQ#fbc1fN`chl)hdJqYpe,Ro!e^i@Lf_sM& +f_sM'gA]k,h#H./h#H4-h?)TmiV_^7j8A!;jo+?Ak5sl3lM^#Km/?>Omf2bUnON*3gXF9d`l5p7 +ZDjasU7[pER?j&$O1`$1ZELF/X/DDba/QqVS!JhkLNHHbF@pJ!LIuc8ItEN=Q(4G;:Jt"h;c0Hk +ViLb=%$[0MS=Z@GTq\KdXfhL"s-N\Mr0R8GpTa\$ri`s6qSDsDrk\3DLl$tG +Mi^s-*J5~> +JcC<$JcG!7o`"gfrquZjs8)ckrqQNf!;?Eb47r.9o()>?n*f]3m-O''l0.Es,lr8oTB0:s-*JGrfR2Cs-*8AqNLT:!1!GIo9]HDr0dGL +r0dSR!1WbRrLNVQrh'1_rh9@d!2K:_s.][lUSO^_UB%+hV>mFjVuN^mW;rmnWW0!kXT,F$Y5GJ3 +Yd(I6UnF3FQB[GjL4Xl$G^+=QF)Pu6D2jI0L4k,,I[=$]hmAO9U,@:X%g +EH?;K7n?-D92'hcJ8K1AEH6,DGBeF[H[LFOHBI&!KN0=N;ne9MZ/G6LkgcbLAur-K`-N)Jq8LNJH(,uIdDL^IfForJH(0#K)UB' +KSBD[CPR_&M2I4MNK0'\OHPcjPa.Q%R$jG5SXuIHTq\?ZVPgAmX/rG,Yd(O@[C3QT]">Vh^VI_' +`5Ta;aND]McHaeadaQ^rf@S^0g>(N?hr*GPj5]4^k3(sml0@U$m-X60n*oi:o()DDo`"O`pAamc +q#C0iqYU0hr;?Nbrdk*5s*t~> +JcC<$JcG!7o`"gfrquZjs8)ckrqQNf!;?Eb47r.9o()>?n*f]3m-O''l0.O,e:\die;>O,`:]=&`:&duOk;Ys;m;Gg5MM/>$G39>[(E9 +r*'b8<`;gi91_WB6:!e!4Zkhe3W:p.2ap&$69[Op4#o5b6p3[p2a'&U2CBIl/1rJ-2D-[<1H7BW +4[DG%2`N]Z4ZQ/,83oI*5t""+6UXC684Q[/RK5[Ka4N\[oAa]_fDI^VI\&_o'Fl`W*p`a2uHGbK@uL +b5,06=7]Jm +JcC<$JcG!7oD\afrVZTjs8)ckrV/YPp@e1Po^qbGo'u5=n*f]2m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-+;PaMu3:_SEq"]XkY_[^\Gj&5])K5A]">TP])B2:\G`u8\F[90\GEc9])K8>])0,<]_fAD +^;%GY_#M7H_#;+K_Yq@P`;RUP_uRdO`r3sV`qm^WaN;R%b5TTabl#`[c2c2fd/MGmdf7c!eCE+$ +fDF5"g&BY&g&B_*g]#t0gYCT`h>H.0huD[5irA':jSn9>k5XWEkQ'oHli6>NmJcPRmmH6md`KVN +`PTL%WMZDbSt)7=QBIDnO1DR%YH=b'VO3U0O,^$)MM[sVHr+TjHq\U3F`hkQIt`iCQ^XP<:f:(i +;c3Ol%ul[5Od)3$S=Z@GTqeQdY4qtqQhm$HQhm$GYQ1s,YlCp+Y5bWuQ^F20S"-(ATV8*TUo(&gWN*&%Y->.9Za@0M\@K5a]t_=u +_Sa@3a2lBGbK\>YdF$Fme^i@)g"P39h;7&IiSrnYjlY^gkiq?slg4!*mdKW6nc&(\oCV\Sp&F^c +p\jmeq>U6gqu-HkrUTr=s-3P6~> +JcC<$JcG!7oD\afrVZTjs8)ckrV/YPp@e1Po^qbGo'u5=n*f]2m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-+;PaMu3:_SEq"]XkY_[^NI=d01nr3C(ooAs2rJpf:ooT39rfI,?qN1Z:qiL]9rK.&? +r/glDrf[;Fq3(Tgos/>gos/H("orJ.qr3#t$>,nBl +S!]M*O,f$IIX?EdF`VVCDJX-)Mhm(?JUVrkFDu)5BmXu*2mZ@L8 +rg!MJ!0dDFs,d;Crf7;ENK&mUMi3JlM#rKgL]3#0KnP-XK*$XUJc(&tJ,XodIK"]pJ,OotJH1<$ +K)pXZre>$?Ll$tGMi +JcC<$JcG!7oD\afrVZTjs8)ckrV/YPp@e1Po^qbGo'u5=n*f]2m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-+;PaMu3:_SEq"]XkY_[^5MM(>5h`7>[(E9>?b?6 +<`2gj8P;TC6:*n!4Zkkf3B&lT2`3rj69[Rr3]T/V2)@$L3&riP1+4"e-SI&(1b1:61G^pK4?l+u +69$t`5!;#$8Ou-35X@_'6pjC47n?0D9MBnbJ:[]O!eZ/ZrBL6Er]g?Hq`k!S!3uL,s0)F)s/d97 +U7nVgrk8]P^:qD!_SX71`;[aU`WsT, +aiMTFaiX9XqH*8hr)NbtrD`i`rg!MJ!0dDFs,d;Crf7;ENK&mUMi3JlM#rKgL]3#0KnP-XK*$XU +Jc(&tJ,XodIK"]pJ,OotJH1<$K)pXZre>$?Ll$tGMi +JcC<$JcFs6o`"gfrqu]krqcZjrqQNf!;?Eb!VH!_nhot,n*f]3m-O'&l0.2"lJ1nh;$c\gA'>%f\-2Vs4IJ+f@BlM"k(fF +d*L&9cMl&gU\gkbV=q@b[0F(HZa-j?Y5YO9Ngk9@ItEB2MN3piT;&\G\c0,1\c'&7\bWi6]D]DB +^&>YF^\>PD_>1nF_>V7M_uI[T_u.IQ`V@IOa8O$Ta8a3\ao'<\bQ#fac1fK`chl)gdJqYpdfe1N +f%/IMf`'S&f`'S'gAfq,g]cHfgtgiCqq_D3i8ORms5X(=rT4(Aroa=F!9sIJs6T^O7df[*gsXoGO,f-TLP:A-H[9gXEcZ>CEclMKGC>!sO-#g"TNP,i +:K:@krhg9cO-5ThQ'n/6TV/!QW2cuns8J;aQhQgGQhcsEYlCp,Y5>?9s7aA+_Yq=M_#M1I_#;%F +^&sahQBqN8#F(F9P*1riOT(:GNfB$WN/NUOreU]4LPPk`!el;\rIb-%s+1-!rI=cpp3ljfs*srs +!eGrTrdt6)L&Qg9LPUeDMMmFPNK0']OckomQ'Rc(R@9V8SXuIITqeE[Vl-MoX0&M-Yd(OA[C3QT +]">Vh^VI_'`5Ta;aND]McHaeadaQ^rf@S[/g>(N?hr*GOj5]4^k2tmll0@U$m-X6?mfDqJrpg-^ +o^r.U!quB_rV6Egs8)WirVZWmoDX=@PlH7~> +JcC<$JcFs6o`"gfrqu]krqcZjrqQNf!;?Eb!VH!_nhot,n*f]3m-O'&l0.0O8b1:O7eV7OoCIAO8=t:O8G%9O8Y1? +O8Y1=O8=tQi*6KRJiNLR0&hH +S+rNQSb/NQTDtS_U&UheU\CM_U]%"cUB%+hV>mFjVuN^nWW/poWW/suX7`OoXo,@%Y8".>UnO6D +QB[GiM1^8(H['[REH#gpC_hqaKnY),H[0^PD/3ftARf1T>?b33'1o8s6= +Occ#tQBqN8#F(F9P*1riOT(:GNfB$WN/NUOreU]4LPPk`!el;\rIb-%s+1-!rI=cpp3ljfs*srs +!eGrTrdt6)L&Qg9LPUeDMMmFPNK0']OckomQ'Rc(R@9V8SXuIITqeE[Vl-MoX0&M-Yd(OA[C3QT +]">Vh^VI_'`5Ta;aND]McHaeadaQ^rf@S[/g>(N?hr*GOj5]4^k2tmll0@U$m-X6?mfDqJrpg-^ +o^r.U!quB_rV6Egs8)WirVZWmoDX=@PlH7~> +JcC<$JcFs6o`"gfrqu]krqcZjrqQNf!;?Eb!VH!_ni$%-n*f]3m-O'&l0.j>_:]F8k;>j>d:]4,g;>O)h:\mib:\mc_:%hWT +<<-(t<<-"t;\;/W3B]Ph5=._,7n-*C92JD[rD*2`qG-l]!)EMhs%`Pfs%`>br)!>fr(d2bs%`Jf +r_E)[qG-ubqG%#dr_NSjpeL`_"&;Qb:Amug;#=&V;#F,h;#X>k;#O2Y:]OAb:]XEiq+pudrDEJj +r)!Mn;,R9gs&&Siq,-obr_rDfq,R>nrDi_o"BAK'?b99=&r6s +:eFAO7R9@*4Zbeh3B9&V2Dm +JcC<$JcFs6o`"gfrVZTjs8)ckrV/VOp@e1Po^qbGo'u5C[i8EJJgtUQ8 +f@JI$da?Fec-+8NaMu3:_SEq"]XkY_[^=ugiVqd8hZVflgtUTYg@a.ug'cTdf%&=#e'l^kd*MU7 +rQY>:rM9@fosOG!rj*WPZa7$FZa$d>Y-"b+XHK6'I=R$,M2RO`S=l^Z[/RK6\,*Q2\,Ei8\c92: +\bio.\HB@P\[_FFrj_m:p:C76!P5o>])B2>\Gs)>\G`u<\Gs,>\FR30\GEc3])0,<]`5\D^&YqB +_#D1H_#;+J_Z%IQ_uR^P`;dgO`r3sV`r!gVaSO'ZbPo`ac1fN`chl)gd0S1Le'upuf%8ONf`'S' +f`'S'gAfq,h#H+0gthe_s53n9qr7Y9rT*q=roX7Ds6'LJlMg,Km/QH)m,ZpLb/hTA_SNd^WM?2Z +R[KS0O-#H_\?W?BY,\LTJ#ABgMi!.?K6qohGBNn+s)KH.F\Y_[JVK/GQ^XM;:fC4n<)c\mW2GZ; +OcblmR@Kh?T:hpVX/u!on!3s?q3D)IYHRr.r2ot"!3*Yd(L?['mHR\\#Mf^V@V%_o9U8 +aN;WKc-FY^dF-Oof%8R-g=tE=hV[8MioB([k2tjjl07L!m-O--n*fc8nac8BoCW%Ts7ZKerV6Eg +s8)Wirqu]moDX=@Q2c@~> +JcC<$JcFs6o`"gfrVZTjs8)ckrV/VOp@e1Po^qbGo'u5C[i8EJJgtUQ8 +f@JI$da?Fec-+8NaMu3:_SEq"]XkY_[^;\&T_kART(&[q2P*.r/^f:r/^N4rfR2Arf?o;rK$f:qiC`s,m>E!0Ql7o8s$9rKI,Arfd2Aq31`@s-S +o:GuS!204_!huHbpnIb_rhTFds.o[ks/,^ls/>jpri#aos/Q+"r2]n!qlK[t/ZPV?R[9>)O,SpI +J:)]gG&q_DD/=$*Mhd">JUVr_BRsu8BkCmb@U3/@=BAQ&=!1OH=[khf@V0CoEHHGN7nH6G9MA$, +It2ESD/XB6Fa/01H4,+MJUlS5hr!ANioC%!!9O&sqf;COrGqqAriZ1$ri?+#_>j4ko9/^-rfI/I +s-E_Orfm_QPEV/mOcbb)Nrb9#rf$l8!/gc4!f2Vere:K.KS9>Ws+:6$r.+crnUCFdrIFp!s+:6& +!JH1+L2D^%M2@+JN/WaVO-#KeP*D5sQC+&.S"#t?T:hmPUnjlcW2cl!Xfen5ZEppH\%&u\]Y2(p +_8=+/`Q-'AbKJ/Ucd:(feC<($f\,!5gtgiEi8N\Uj5f@bkNM0plKdg'mI'H3nF5u=o(2JFrq6 +JcC<$JcFs6o`"gfrVZTjs8)ckrV/YPp@e1Po^qbGo'u5C[i8EJJgtUQ8 +f@JI$da?Fec-+8NaMu3:_SEq"]XkY_[^8n/rDbr_WPjqG7/fqG-rar_3)] +oi:W`r_req!*/qrrDNkt5!h@m5Q3qQ6q0U991_kU:AR]]:A[cc:B"&h:B!uf:A@W_;#F,f:Amoe +:Adoe:@h0\:/1[^rD3;cs%iYks%iDbr(dDi9heC]:]F8g:[V'W:]F8j;>sDj:[_*[;=mZc;,I*b +r_WMir)3Gi!E)em;#aDk;?0Sn;YX,a;ZBYr<)rTjq,R>n"'&B%)!aJr7r*02%'N.e)91h`D6:3t#4$5Sa3B/lS2DkD#s$%/[4$c.t2Dd-E0eb75/1W;&.P!(L +/M/V51c%!J3]oYn6UEam2Ea5e2bQ_569mb$5sn%-7R]d;7nHBHI!pHmIt3*%rdt?,59FLl$tGMi +JcC<$JcFs6oD\^erqu]ks8)ckrV6Ee!;?Eb!VH!_nhot,n*f]3m-O'&l0.cr6=u]!71PhrmCbo#1M)Pe^i@(qq1o$rn.5' +rS%;+rnIY2gtgiEqq_D3i8FIks5X+>r8mq?"R#"4l0835rp3eRjP/,)aMu39_7?PEUS=BNR[KS- +OH,@5Z*LO7WiDkFUoLi?YD%U\IF#WrT0:s7X;*_Z%CM_"YV@^&XT#R/`KQQN!-SP`q;oP*(lgrf7)? +NW+kStMdOUSO`aW2ZetXfek3Z*UgF[^`lZ]=bkm^r!t,`Q$!?b0/#RcHstde'uq! +f@\g2gYL]Bhr*JQj5f=ak3(sml0@U$m-X60n*ol;o()DDo`"O`p&Ojcq#:*hqYU0hr;HTbrdk*8 +s*t~> +JcC<$JcFs6oD\^erqu]ks8)ckrV6Ee!;?Eb!VH!_nhot,n*f]3m-O'&l0.uO8Y+: +N>me7Mi3IMM26tBLMqBHA8#^oDfBfBI"6g'LlM.fqMk3/r/^f:r/^T6!KiKCOoCI@O8P+:O8G%9 +O8b7@O8Y.BO-#HaqN1`qN1`>s,mAEo8rR+!0[;Eqi^rBqNCc?q3:oEs-3PKq3LcAqO%2K +rg)O,SpIIscNcG'%eGD/=!)Mhd%?Jpr&kBn(VeN.,;G?sQu?<`W6"c@7i8N\Uro=(@pMp%MpN-:Rr2ot"rMopu +_Z0=lqNCl@r0$Z6s,[5Krg<_P!1*VL#F(F9P*1riOT(:ANfF$s!fMqnreUZ3L])r/KnP-XKE$Q' +JbsurJ+nEiJ,FisJcC?$K)pXZre>Vh^VI_'`5Ta;aND]Mc-F\`dF6Uqf%8R.g=tH>hV[8MioB+]k2tjjl07L! +m-O--n*fc9nac8BoCW%Ts7QHerV6Bfs8)Wirqu`no)=4?QN)I~> +JcC<$JcFs6oD\^erqu]ks8)ckrV6Ee!;?Eb!VH!_nh]h*n*f]3m-O'&l0.d +r([2dr(m>fo1]6\:&Ric:]!oe:]F8k:\[]_:BO?d9htX_s%rSgmSNgWs%r\lr_WPhmna!]r_NSl +peV#h:f.$br_WMir)3Dh!E)em:]OAk;ZBVo;YX,a;Z9Vd<;KVmbm6UEam2EX)b4@Vn58O5U+6UF1.7/fXY84Q6FHiAEmIKP(MJV*lR!/0r.s$$EHq*=mC +r2ot"rMpU3U8"H[VPpJnWiE/&Xfeh1YctD2Z2h61[03qI\%'$K]DoPD^&G_H^r$&f"2_sn`;[dS +a8a3\anAd3=8Gtf<StMdOUSO`aW2Zet +Xfek3Z*UgF[^`lZ]=bkm^r!t,`Q$!?b0/#RcHstde'uq!f@\g2gYL]Bhr*JQj5f=ak3(sml0@U$ +m-X60n*ol;o()DDo`"O`p&Ojcq#:*hqYU0hr;HTbrdk*8s*t~> +JcC<$JcFp5o`"gfrVZTjs8)ckrqQNfs7ZKcs7A;Bo()>?n*f]3m-O''l07Bnk2bR_iS`VMh;$`< +f[n^(eC)ajcHXPTaN)9<_ns4(]tCqe\$k5Qq;M>2"lJ1nh;$f_g\ok!g&Kb-g"=mTe-=CMdF$=f +ci)/cc2=F8V#R:c[J[E1Zh:U/Z*Ud?YHFq-ri-NkSpPj9KntSEO-H*)USk6'qR6@3r4)^9!4_m9 +qmc=0!4qa3!4`$=!kPqQpU^=6!kQ"Uq7?R9!4_p:rj_=*!4_s;pU^76r4E$CrOr9HpV?dEqS<$F +rke]Qp;?sMpr<9QrPn]S!6P)[rlb>cr6=u]!71PhrmCbo#1M)Pe^i='qUkf#rn%5(r7_2*rnRP. +s5!_4r8%P5i8NYlirA'K;Y*s[-T6O^E@!P@aI"m>M;1!kIN/s6nS"1:ZaI6N\@K5a]t_=u_Sa@3a2lBFbK\>Yd*^:keCE1&g"P08 +h;-uHi8N_VjQ5Odkiq?slg4!*mf)YUnF?MK!qZ'Vrq-?dp\4X]s7u]kqtp?irVc?eJcD&9J,~> +JcC<$JcFp5o`"gfrVZTjs8)ckrqQNfs7ZKcs7A;Bo()>?n*f]3m-O''l07Bnk2bR_iS`VMh;$`< +f[n^(eC)ajcHXPTaN)9<_ns4(]tCqe\$hp$q4RSVoq(`Fs.'"Us-WqUQ^@Z:rKmMNoRZ+arf%/A +NK&gPLk^]aL(A9M@qB@iDf9W;H$t0nL5Pbbqi19/r/^f:r/^T6rK7)@r/^c;qiCW9qiCc=rf@#> +"-8P*O8G%OoLREOn4\+OT:RCPP^OBPPUI?PPLI?Q2-a@Qhd$GR/iWMRJrWTS+iHQ +Sb&HPTDYD^UAq"`U&^tdV#7"fV#R:jVYm@lW;NXoW;W^qWrB'sX8o=!XBVg.WMH2UQ^3eqN/<.; +I!BmZF`VP>CM[d%Lk^V7J:)TVI=m33IWT(AEa;1&8QnAZ?Y!_;7:'J8C2S!3Fa6JJ84Q?J9M0__ +JU_QSDJsK7FEVqTH?spdIt@USs5!_4"5r.tj8J'rA3L]3&.L&Zi*KE$Q&Jbsuf +J,FirJH1<#K)pXZre=s=Ll$tGMi^s-E\8~> +JcC<$JcFp5o`"gfrVZTjs8)ckrqQNfs7ZKcs7A5@o()>?n*f]3m-O''l07Bnk2bR_iS`VMh;$`< +f[n^(eC)ajcHXPTaN)9<_ns4(]tCqe\$l95rD3Jir(d#_qG?u`r)!>hr(m;gs%iSgr(m>hoM,'[ +r)EVnoMY]fqGIo&4[M7o5X.P#6q'O78P;WM:AIW]:Adid:B"&h:Adid:Adof:B+,f;#X8h:B!rj +9MJ5V:Adof:@V'W:Adoc:B+,i:]O;b:Amrj:/+GXrD3GiqbQWVr(m>hr_`YkrD2lY!Du\m;>X8h;#sQlr(mAjr_i_m!)iPgpeq)io2PTeqH!SqqGdAmqc6:!k"4ut_kr]Vhs3B/rV1+aRi,V:W!1H%6N2)@$G3BTGi +6:-84c-65=%U76O-"L7Rfp>8kf52s*Xiq"+PiPK)L<'4[)'u5P@AB5Q7b_X8An' +UnsufWN)u!XKDK)"0\r5Z2V$0ZaB_>&[o3[\@T;a]">Vg]tV7t_8=+g_?@cp`5T^p`r=$YaS&[1 +=8l8#rA3L]3&.L&Zi*KE$Q&Jbsuf +J,FirJH1<#K)pXZre=s=Ll$tGMi^s-E\8~> +JcC<$JcFp5oD\^erqu]ks8)ckrV6Ee!;?Eb!VH!_nhot,n*f]3m-O$%l0.Ycb./X/W(TQ'loGK8#/?N0'?oStr9er3lO4s0r*?\F[65 +\@K,Zrji'?qRQX;o!nb1rjh[4rOMp>q7?I6s186@rj_+$s1/3BqRZR9r4E$CrOr9HpV?dEqS<$F +rke]Qp;?sMpr<6PrPn`T!Q`C[b5TTabl#`[cMu5gd/MGmdf7c"eCE+#f@ToPrn7;'s4R>(s4dP. +"P__fhV\7fs53k8qVqP8s5a(=roX1C?0^b@jP//)ai236_RZ\FUS=BOR[B>)OcYT_Z`p[9XK/4K +I]KinXdFEtSUb'L@!G:aIYUQk:jRVGNK9KrT4Ukr:fgRp;KJb7ViHb"P*D2sQ_'_Vh^VI_'`5Ta:aND]Mc-FY_dF6Uqf%8R- +g=tE=hV[8MioB([k2tjjl07L!m-O--n*fc8nac8BoCW%Ts7ZKerV6Egs8)Wirqu]moDX=@QiDR~> +JcC<$JcFp5oD\^erqu]ks8)ckrV6Ee!;?Eb!VH!_nh]h*n*f]3m-O$%l0.!FE_5+CM[m-Ecl\UItNK6qMb<2p5]$2rf6o;p5o68rfI&= +r/gc9r/gf:s,d5@rK%#?plPK9qiLi?qN1`>s,mAEplGKSo:?#UTV27WrhBFfpn@b`qkX1crhKOjrMKLjs/>jps/>mqs/Q(!p8et- +US+'BQBI8fM1^>+H$FLTEc5o6rb=0EL4k/.I!TRAK7o23FCT91@7N[W>!Q.rAO/dT?XdYbDK9iE +<(KPL9MJ2R?\!]XDuOVaEH6&AGBeCZH@('iJUlMSg^)`mhV[8MioB(ujSa&uE;+AKErC(YErL.X +ErW39WrK'rfn([PEV/mOcYZcO,f6[N/W[QMZ/G6LkgcbLAur- +K`-Q'K)U>sJG4QiJH(3#K)L<&KSBD[!JcL1M/%p+N/WdXO-#KeP*D5sQ^F//S"#t?T:hmPUnjlc +W2ZeuXfek3Z*UgF[^`lZ]=bkm^r!t,`Q#s>b0/#RcHjnce'uq!f@\d1gYCWAhr*JQj5]4_k3(sm +l0@U$m-X60n*oi:o()DDo`"O`pAamcq#C0iqYU0hr;?Nbrdk*9s*t~> +JcC<$JcFp5oD\^erqu]ks8)ckrV6Ee!;?Eb!VH!_nhK\(n*f]3m-O$%l0.hr_`YkrD2lY +r)*5cs%rbmqbI2gq,.&fr)!Jm;>a8j;?'Pn;#jMg;>3uf;Z]os;tj8g:=BABr:eOGP7RBF,5!(eg3]K#W2Z>T567P2`3]fVn5X.Fn2`N]N0-;8^/M&D-2(g^C1Gq0R +4[)+t3]B#W4[)(l5lO:X69mh%5skQ<#t.9Q7S$'B9M0X1HO,"II=?ZrJV&LQKDn%654:`.5QX0N +X8/dqW?.q7WMunuXKAV-Y-5(6Z*CU?Za7$H[C3NR\[oAa])K;I]Y;+q_SO++_>_:O_u7LY`Q#p< +a2lBDp/_#krDr>ds-j(YR@4&A!LK,OPnB7EPEM)kOH>NaNfK*XN/NUOreU]4LPPk`s+LH+rIb-% +rdjlqpOE$is+13%rIY-(L&Qf-LPYqdC5Rq.N/is[OHG]hPa.N#R$a>3S"6.CTV8*UUo(&gWN*&% +Y-5(7Za@-K\@K2_]Y;.r_SX71`lH0CbKS5VcdC.heCE.%f\,!5gtgiEi8N\Uj5f@bkNM0plKdg' +mI'H3nF5u=o(2JFrq6 +JcC<$JcFm4o`"gfrVZTjs8)ckrqQNf!;?Ebs7A;Bo()>?n*f]3m-O''l0.H25hr!;Hh>,h*gA9M%gAT\/f[eU&eC)eDd/q\@ +cMYoeN;\b5NrP(?Ni&]QV=M%n[/RE*ZN%3/Y5k^(WtMA/N15*=J:rZ5Mi?\E:@%])K>>])0,;]E#YD^&YqB_#D1G +_#;+K_Z.OI_uRdN`r=$V`r!dWaN=;$rlb>cr6>5d!6tGes3LVirQto!e'lgse^i@(qUkf#rn%5( +r7_2*#i+1igYCWAhr"Chs53h7qr7V8!9F%=roX1C>O(;'f#l+Q`5'4"W2QJbT:MF=Q'IAkNJk0I +Y-"k0X+Po)`Oi:EItjV2DcB/N8oT-38ki-.ItirFR[TjE;G^1h<)Q\oW2HPQOHPflQ'n)3S=cCF +U84`fY4)DaQN!-LQM?a;QN!3NQN!o]W;rmLl$tGMi^ +JcC<$JcFm4o`"gfrVZTjs8)ckrqQNf!;?Ebs7A5@o()>?n*f]3m-O''l0.gos/>prs/Q(!qlE/cXK8CrTUM75P`Lc[ +K7J;oG^"7NE,]W/C1rKZKS+f)Hu*MLO,&1-AnlEg;*R-F5ZM-%5Xn4M@qKOpEccOq7n6&J9E7`b +J-pdED/XB5EccMLGlE!nI"$QrK%o)ZgBcTkhV[8MiT&ttjR.$cEr:"XErL.WErN*9W;rmLl$tGMi^ +JcC<$JcFm4o`"gfrVZTjs8)ckrqQNf!;?Ebs7A/>o()>?n*f]3m-O''l0.gr_NSjp.kT_s%`Sg!)EJgs%rSg!)WYlnkf6[s%r\lr_WPh +m83dZpe^uf!)WPg!)WJgr)3Dh!)i\j!)`_nohkE\r_ikt;cEBhr)NPnr`/eor)NVpr)`i!qH3f% +rEDuu<)ZUi9M7oF6UF%%4?>Pa3B&lT2)R3X6:!n%4?>_m6:!^p3&icO/gMGa/1rG.2(pgD1H.?U +4[),"2`EWR4$>\g84c?E5sR_$62j4Y6q0^:8Ole +JGt-"K)L=EKS>,7L51S@M2@+JN/WaVO-#KeP*;/rQC!u,R[]h=StMdNUSO`aVl?\sXKA\1Z*L^D +[^WcW]=bhk^VRe)`5TdhVd>NioB+]k2tjjl07L!m-O--n*fc9 +nac8BoCW%Ts7QHerV6Bfs8)Wirqu`no)=4?R/_[~> +JcC<$JcFm4oD\^erqu]ks8)ckrV-Hgp@eLY3qW%7o'u8>n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-+8OaMu3:_SEq"]XkZ1hr!AMpYc>7hr!;Hh;%k]s4[;%r7VD/f[n['e'lbDd07nC +cHXSWrepc7qi1N6s,@)?VPWdirj;[2pTjh()Qp3EY,nY'WMYcMH$t6sL5:_IPa7f2VQ-u2rO;g: +s1&->n[SY0rji$>qRQU:rOMs>pUTk+rj`$?r4Dg:r42gqn)d=!58BGs1eldci)5hd07tIe'upurn%#!rn7;' +!878'rnID,s5!b5rSIS3!oW%rqr7V8!9F"<:?La&kih'[e]GkM`5'4!WMcMaTUhOIY*N=QC4@A;,C(g<)QVmVl,N7rfRDLR$jM8rgj=f +USt/mY-.0ls-<>Ens/m6rg*VNri,dnaoD%MqSN9KrkS6Bqn<*%SGo#XRK/cTQiWP>rfmMKPQ$^G +Oc]R'!KN0=Mueiore^Z2!/LQ.s+UK+rIb-%rdjHerdk*$rI]'BKnY89LPL\BM2I4MN/`jYO-#Ke +PE_>uQ^F20S"-%@T:hmPUnjlcW2ZeuXfek3Z*UgF[^`lZ]=bkm^qmn*`Q#s>aihlPcHjkbdaZdt +f@S^0gYCW@hr*GOj5]4^k2tmll0@U$m-X6/n*fc9rpg-^o^r.U!quB_rV6EgrqcQirVZWmo)=4? +RK%d~> +JcC<$JcFm4oD\^erqu]ks8)ckrV-Hgp@eLY3:uh5o'u8>n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-+8OaMu3:_SEq"]XkYFStGSHs.B"Vq47GT"J)'QS!s8Cs-WhQrKdJ"")D^hD>nGN +D>S2OJqjps/>prri5suqlDr[US"!BQ'75eM1^;*H$=IT +E,fi5CMIQtB4upLIt)f^BRkbnHuih8Dd5\"9O0nb@;/"r7:9YADK'ZB7fGpW9ERqcqf;IQqJuS7ql%X:oo]*6o9&j1!M,b[ +S,\oWRJrQSQ^7W9!L/fIOo^],rf7)?NW+k;Mi.Ljs+gZ1reCH,s+L?'s+:6$m=>1es+:3%E.iq! +L5(J=Ll$tGMi*YHY:<['d?P\[oDc^;%J" +_Sa@4a2lBGbK\>Yd*^:keCN7'g"P39h;-uHi8N_VjQ5Odkiq?slg4!*mdBQ4nF?MK!qZ'Vrq-?d +p\4X]s7uZjr;6HjrVc +JcC<$JcFm4oD\^erqu]ks8)ckrV-Hgp@eLY2>$M2o'u8>n*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-+8OaMu3:_SEq"]XkZN;>sAl:]=,^:]!ub;#jGk;#sKjr_NSjr(d&`r]gBIr^$QL +r]g9F!DZAYm35<_1j3]T2Y2`CXm,Vq>55s7Fp3^>tr50JtXD +2`a&b5XPH/"?&A*4?NO5!C9'O5lX4O6jH.N7R]j=8kf4Vs*=Wj$$giCH[U_:[_ns=/`5T^8a2lrA3L]3&.L&Zi)KE$Q&JaJ!e +JcC?#K5cKtKnb>;LPUeDMMmFPNK0'\OHG]iPa.Q$R$jD4S=Q7DTV8*UUo(&gWN*&%Y-5(7Za@-K +\@K2_]Y;.r_8=+/`lH0BbKJ/Ucd:(feC<($f@em4gtgfDi8ESSj5f=ak32'olKdg'mI'E2n*olH +ncJFTo`"Lbp@n=[q#C0hqY^6hr;HTbrdk*;s*t~> +JcC<$JcFj3o`"gfrquZjs8)ckrqQNf!;?Eb3qW%8o()>?n*f]3m-O''l0.1nF_>_=O +_tM"K`V7CPa8rdaQ[pe^`7MfDF5!g&K_)g&0S&g]$". +hYuF4hZ)I7i8NYlir7s;LPUeDMMmFPNK0'\OHG]h +Pa.N"R$a;2S"-(ATV8*TUnsueWN*##Xfnt6ZEppH\%&u[]Y2%o^r""-`Q$!?b0/#RcHjnce'uq! +f@\d1gYCWAhr*JQj5]4_k3(sml0@U$m-X60n*oi:rpg*]o`"O`pAamcq#C0iqYU0gr;HTcrdk*; +s*t~> +JcC<$JcFj3o`"gfrquZjs8)ckrqQNf!;?Eb2"^D2o()>?n*f]3m-O''l0.O8Y18 +O8Y1Onk+P5pj>Q1^I@Qhd$@RJ`NRS,/ZQ +Sb/KRTDkM_U&C_cU\LP`U\gkeU\pnfV>d@hVuN^mWW/psWW&psX8T+6Vk]lQQ^*bqN/<1:I!BjZ +FDl,:D#J)LBPIEY-Y@"&H]!9+H#dA8B4X/#:d%][@q\>$?"%>]D/jZB7S$$<9h\2oJ,X +JcC<$JcFj3o`"gfrquZjs8)ckrqQNf!;?Eb2"^D2o()>?n*f]3m-O''l0.i:B!ud9`Ife:Adlf:@_-X:AI]c:B+,h:]O;d:'"-cr_NPhs%NJgrD*DiqG.)fr_`5_r(m,b +"A_cf:J^[\!)NGfrDEAes%rbmqbI;j;,L6h;>a>h;#sQlr)!Djs&/PfohtWbp/Lujq,[GoqGdAm +qcSa2*!QQ2)R3K1,UjDr\Zep5=7Rs3ArfR0J+1j.46Mt +1cR?M0f:pN4[),"2`WcS5!:tq83K7)585)]L9MJ3*rcnZnH$Xd`I/\QtIt3'$ +K)UE#4oRSD4TI\65Oh#StMdO +USO`aVl?\sXKA\1Z*L^C[^WcW]"G_j^VI_(`5Ta;aND]Mc-FY_dF6Uqf%8R-g=tE=hV[8MioB([ +k2tjjl07L!m-O--n*fc8nc&([oCW%Ts7ZKerV6Egs8)WirVZWmoDX=@RK%d~> +JcC<$JcFj3oD\^erqu]ks8)ckrV-Hgp@eLY1\C;0o'u5=n*f]2m-Es$l0.9ljl>C[i8EJJgtLK7 +f@JI$da?Cdc-+8Na2Q!6_8!^s]Dg[ehuDX/i?](``9]"@UGrOE!@]=e*SqRZX9rji0A\@DCGs17X/s17s:!5/,!SuW2hZhrphr*GOiV_^6j8.j_jP&,3a2l3:_nrsbVk]oXSXYt2Q&gudNJidS +Mhm4HMM[1GLAlrcL6[UTF`C5JED(.qL.b9>H@^j2PF@u4:Jt%k<)QVQNK0![Od)#qR@Tn@St;[Q +W2d#'Xf^mgr07&CrKd8Er072Gn"eVBXSXl;MRfStGrg3_QQN!-M +P`u*0#*G".O,f6[repl9MZ/G6LkgcbLAuu-K`-Q&K)U>lJGt-!K)L<'KS>-ZL&m'creYHKMi*YHY:<['d?O\[oDc]t_=u_Sa@3a2lBFbK\>Y +d*^:jeCE1&f\5'6h;-rGi8N\UjQ5OdkNM0plKdg'mI'H3nF?&>o(2JFrq6 +JcC<$JcFj3oD\^erqu]ks8)ckrV-Hgp@eLY1\C;0o'u5=n*f]2m-Es$l0.9ljl>C[i8EJJgtLK7 +f@JI$da?Cdc-+8Na2Q!6_8!^s]DeE%TCSZTTD>)WSbJ]\SXc4>R[TY4rg<\Os-E\%r+u@Lr+uCm +rbhUMqJPqcq2P?3*fGu8MMm@LLkphBL51G%G@=umC2@d+EH?DRIt<<0pl5-1q2YN9r/^Q5rK7)@ +qiCc=!KiKO8P(>Onk+=O8=tmFhVZ<[mWW/psWVrjrWu%e2TV%X>Q'.;i +M1^>+I!BdUEGoc3C23`^2eQf;B4baeAS,LaAn,@iCMR-S4?QY1<*a$#7S$ipB5DO,Fa-DI7nlZN +95A?\DJa92EH?8HH2`+/I"$KpK7\`.g=b36gY1E9g=tE=hV[5KiSieUrolJGt-!K)L<'KS>-ZL&m'creYHKMi* +YHY:<['d?O\[oDc]t_=u_Sa@3a2lBFbK\>Yd*^:jeCE1&f\5'6h;-rGi8N\UjQ5OdkNM0plKdg' +mI'H3nF?&>o(2JFrq6 +JcC<$JcFj3oD\^erqu]ks8)ckrV-Hgp@eLY2"^D1o'u5=n*f]2m-Es$l0.9ljl>C[i8EJJgtLK7 +f@JI$da?Cdc-+8Na2Q!6_8!^s]2JK&r_NSjr_E8br_drCm5c##7rj:JX_\nkK$WqG7,ds%iVj!)NAbr(m>fs%WDe!)WMf!)WYlnkf6[q+q2i:/4S\ +pe^rcqG@,fq,%)gs%rVh"&Mim;Z'Di;Ys;l;Gm?gs&&bnpJLT]qG[)er`/\nrDi\nr)NYqqcEc! +rE0h:<)c^k:/"8P77BI+5!D(k3B9&Zr\Xg71c-pDr\OO2q_K0L1c$d4)^d0h.kih62)I'H3&s,c +6UWjn2Ea5&4T@PS5sR_%6UX:07n?*@7n?>Q9)hQbGQ)jeGm/M>H$XgbrdG!"J:N3%rdsu0r&k!C +mm$;,qPOCrXf_T*!3cC+#dL\@Za@-K[^c=Gs0r0A]=koU^';Bf^qmk(_>_:U_o0L5`Q#staRrU1 +=8c1h<<]"dSt2FBrgNqWRJrQSQ^7W9!L/fIOp7&1O,o<]NW+k;Mi.Lj!f2VereCH,s+L?'rdt-# +npp^jrdt*$!ec8]re:H/M#N6IMMmFPNK0'\OcklkPa.Q$R$jD4S=Q7DTV8*UUo(&gWN*&%Y-5(7 +Za@-K\%0)^]Y2(p_8=+/`Q-'Ab0/&Tcd:(fe'uq"f@\g2gYL]Bi8ESRj5f=ak3(sml0@U$m-X60 +n*ol;o()DDo`"O`p&Ojcq#:*hqYU0hr;HTbrdk* +JcC<$JcFg2o`"gfrqu]krqcZjrqQNf!;?Eb1\C;1o()>?n*f]3m-O'&l0.H56hqm2Fgt_e]!8@G*qV(r%s4@J*e^W'rrmCbm +!71P$qi1N4s2OuHr/L]9!0?u:osO_)s0Ma2rimQLY-"h/X/rD&WMlbURs'+,KSYD?MN\bs&:\c',>\c',8\ad90\c9;A]`,P=])K8?])T>@\G`r@]",A_](NW6])B2=](`i3 +]E#YE^AbnA_#M7H_#2%J_Z.OL`;[aD`r3sXaT'BYb5TTabkTH^cMZ#ed/MGmdf7breGe&!fDF5! +f`9\'g&9Y&gBQHhh;7#Gi;MR5i;_d6ir.m;jSe0cin2`'a2Z'9_nrp_VPBcTSXYt2Q&Uf`N4c]Y +Mi!=HLkgeBLAlr2L4t87LAlu]LO;[6I>^`n:k!tPNg-!);,:%d]SGnuYR[O/B +&!rTIQ'@MsP*1rhOH5H_NW+kAMi*CKM26tCrItB-KS98Urdt*"p43*mrdt*$s+CB+re>6ELkpnE +MMmFPNK0'\OHG]iPa.N#R$a;2S"-(ATV8*TUnsueWN*##Xfen4ZEppH[^`lZ]Y(tn^r!t,`Q#s> +aihlPcHjkbdaZdtf@S^0g>(N?hr*GOj5]4^k2tjkl0@U$m-X3.n*fc9rpg-^o^r.U!quB_rV6Eg +rqcQirVZWmo)=4?S,\!~> +JcC<$JcFg2o`"gfrqu]krqcZjrqQNf!;?Eb3:uh6o()>?n*f]3m-O'&l0.O8P+>Ont1>O8Y.COcYZeOnk+9Ont1,OoCLDPPUIBPPLCA +PQ$gmFhVuN^mWW/ms +WVrh4X/D_cSXGe.PECi]Jq/5qGBItHDf9IkC'foYB4tmgAnGUdrae`5ARo:]AS#IbAn>75='oZ- +7RgcqBPh^1GXk:q7nm]2CM[m*Df'E3EH?>KH$Xd`I=?a!JqJ]/f\+s3g=t?7g=k<:h;7#Gi8NYo +irA*0E:IrIEqaYSEr;4#Vp58?OoCOAOnt74Ont1>TDtM_SH,2ZRfStGrg44_QBd`"P`q8nOcYZc +O,f5!N!G8uMM[1GLkkq`!el;\r.G!#rIOZmrIOs"rIb-'!/:E,Ckmh&M2@+JN/WaVO,oBbP*;,q +Q'[l*R@B\9St;UKU8+N\Vl-MoX/rG+YctF>['mEQ\[oGd^;%J#_SjF5a2lBGbK\>Yd*^:keCN7' +g"P08h;-uHi8N_VjQ5OdkNV6rlg4!*mI'H3nF?MK!qZ'Vrq-?dp\4X]s7uZjr;6HjrVc +J,~> +JcC<$JcFg2o`"gfrqu]krqcZjrqQNf!;?Eb1\C;1o()>?n*f]3m-O'&l0.j;n:JOY\r_WPhr_Wfqc!Jlr_ieprD=Cq5Wh+j5!D4t6UXC58P)TL:/4S[:/+GXrD3Dfr_<8b +s%iPfr_NMi!)NJes%WDb!DQ>f:B4/[:&Ic^:B4/h:BF?g:]!lg:JO[_:]=)h:%V3];#X>_;#F,b +:]sQh:/=[\;#O2e;#O8e;#X;l;#=#i;,UjDf;>a5j;>sJf;>!i_;tj8j%=X@-K;c$4`9M.fD6U3h!4Zbbd3B/uT2)I-Z6SgPT1,:^D1GUaAr\GKN1c.!G1c7-F/M8h= +0JtRB2`Wua5XRCf3&Wqu4;C%C5s@P!6:4+.7n,m;7nQHI9MA/SrceBes*4usH$O^_I!pHmIt3(K +JcC>s4o@GB4nV#>55RS:5l=RYVuNmuXokl3Yd+25!OK34[f3`<\@T;ark8['mEQ\[oGd^;%J#_SjF5a2lBGbK\>Yd*^:keCN7'g"P08h;-uHi8N_V +jQ5OdkNV6rlg4!*mI'H3nF?MK!qZ'Vrq-?dp\4X]s7uZjr;6HjrVcJ,~> +JcC<$JcFg2o`"gfrVZTjs8)ckrV/DIp@e1Po^qbGo'u5h>Z73hr+1d"5r(nh>Z12gY1B\gAot,g%jA%fa$0]f%&:!daJ-B +o8NU,rl+ZBs,@&>NW+q\bs#@\[oA_p:C:7!4r*=s1/3BqRZ^=rOW!="M24W]Y+3Tq7?U:s186@s1&$rjqj9pq-U?rkABHpV?gFq7upErke]Qq8E9Om`,4Gs2b5^qTAi]rlk>c!6kDds3CMf +rQtSlrmLhq!7_#!rn%)#pt>Z#qqM/+s4mb5hr+Ijro!h8ro3k9-fjCNhpp/ta2Z'9`ko-^V5'ZS +SXYt1P`Uo`Mn6@'Ycb(+WJ?4aLAlrEKnP29Lkgb?L4tD:KnbA;L51M1tJ_>_7E^\keITqJ%W +SdV*ZS=?":R@0G0Q^7W9&*ALkpnEMMmFPNK0'\OHG]hPEhE!Q^F20S"-%@T:qsQUnjlcW2ZetXfek3Z*UdE[^WfX +]=bhl^VRe)`5Ta;aND]McHab`dF6Uqf%8R-g=tE=hV[8MioB([jlYail07L!m-O--rpKmWnc&([ +oCW%Ts7ZKerV6Egs8)Wirqu]moDX=@S,\!~> +JcC<$JcFg2o`"gfrVZTjs8)ckrV/>Gp@e1Po^qbGo'u5 +rK-]5!0I)=p5o<:qN1`Dte5NEVXSGEW1"R +F82"#QMm`-s88#VOoUX?P4Oh5O92,KTDkDiSXc4>S!ob5R$a5+rfn%ZPEM)kOcYWbNfB$WN/NRN +reU]4LPPk`s+UK+rIb'#r.4`qr.4j!r.G$&!/:E,BSVD"M2@+JN/WaVO,oBbP*2#oQ'Rc(R@9V8 +SXuIITq\?YVPgAlWiN8)YHY:b]t_=u_Sa=2`lQ6DbKS8WcdC.heCE.%f\,!5gtgiE +i8N\Uj5f=akNM0plKdg'mI'uB!V#XYncA@Srq6J,~> +JcC<$JcFg2o`"gfrVZTjs8)ckrV/>Gp@e1Po^qbGo'u5dr(uu^s%i\kqbI/TpHSL>r_E5f!^T(: +rBL'BoMtihr)_;#F,a;#X2i:\[cb:]!ue;>F&f;#jGj:BOEj +;H!BhrDNDfrD1c@-I2)[*ALkpnEMMmFPNK0'\OHG]hPEhE!Q^F20S"-%@T:qsQUnjlcW2ZetXfek3Z*UdE +[^WfX]=bhl^VRe)`5Ta;aND]McHab`dF6Uqf%8R-g=tE=hV[8MioB([jlYail07L!m-O--rpKmW +nc&([oCW%Ts7ZKerV6Egs8)Wirqu]moDX=@S,\!~> +JcC<$JcFg2oD\^erqu]krqcZjrqQNf!;?Eb!VH!_nh0J%n*f]3m-O$%l0. +\c027]D0#=^&GbF^]2+J^\ttJ_>1nE_>_=O_t_1M`W*pXa771Ka8X0[anj0ZbQ#fbbm)D:c-4GW +cMPrcciDJmdf7breG[tufDX@rg&B_%gBQHhh;7#Gi;VX4huMa8iqqa=g!nHj`r3e-^TOQ4U7e-I +R$X)#O,]'U]!J]FY,nY%IsSZ>[(rVpKnbD=L5(A7L5(D9KSG3[L*VJ.LP:G:L4tA9KnbA@M2S6k +NffKgQ'n25SXuFHUo:;rY-"nis8%rUPk:78Pl?sHQM/Aua90P]Vl.oAr4r0Fq830Js1nBDqn<0+ +TV.qVScPCPrgNqWRJrQWQ^3o%P`u*0$^$O3O,f6[N/W[QMZ/G6LkgcbLAuu-K`$K%K(=KlK)C9$ +KE-`*LB!$KLl$tGMMmFPNK0'\OHPcjPa.Q$R$a>3S"6.BTV8*TUnsueWN*##Xfen4ZEppH[^`lZ +]=bkm^qmn*`Pom=aihlPcHaeadaQ^rf@S[/g=tH>hV[8MioB+]k2tjjl07L!m-O--n*fc9nac8B +oCW%Ts7ZKerqQKgs8)Wirqu`no)=4?SH"*~> +JcC<$JcFg2oD\^erqu]krqcZjrqQNf!;?Eb!VH!_nh9P&n*f]3m-O$%l0.qRn=TcRq4@PUq4@VWrgX"YRf8]TR/Lq!D>J)JC]0RkO7@,] +NVe\7M]Rb4M26qBL4t84Dfg>9@qTLmDfTlAH@:9qL5LqLNW"n:O8k:AO8b7;O7n\3OoLOAO8Y15 +NrY:>O7eV7Ont1>O8Y1?OTLW,Onk+7Oo1=.OoCLHPEM)mPPpXEPPLC@PQ-mR.fV#[CfVZ<[mWW&hOUnOEKR$ +D/O61E,p)FG^4U^H[^EpJqAW.f%/I)f_X8)g=tE=hVS7is5=(>j5]4uDtn;NEVaYHEW1"WF7YY! +QDURXd/O*/rK6Z6o9&p3"/2B\TDkD_SXf\K!LfGUQj&hBQ'IStrfRYOOH5H_NfB!VMi3JlM#rKg +L]3&.L&Zi(KDpJnJc:9!KE$T)L&Qi,LN/-,M2I1KN/WaVO,oBcP*;,qQC!u+R[]e;St;UKU8+N\ +Vl-MoX/rG+YctF>['mEQ\[oDc^;%J"_Sa@3a2lBGbK\>Xd*^:jeCE1&f\5'6h;-rFi8N\UjQ5Od +kNM0plKdg'mI'H3nF?&>o(2JFrq6 +JcC<$JcFg2oD\^erqu]krqcZjrqQNf!;?Eb!VH!_ngs>#n*f]3m-O$%l0.h:B+,h;"@Ha:f%$bq*+[?s$6TKr]pEWoMb9F +p/V#ir_rbnr)"2*4$Q(q4[)"o5i;>sJk +;>a>f;>j>j;>sJh;>!i];tj8kpY-5(6 +Z*CU@Za@*I[C3NQ\@K2_]=beir4W?L^q[\#_>V4R_o9U8a8O*WkuQ^F//S"#t?StMdOUSO`aVl?\sXKAY0Yd1UB[^N]V]">Vh^VI\&_o9U8 +aN;WKc-FV]dF-Lne^rF*g=k<;h;7&IiSrnYjlY^gkiq?slg4!*mdKW6naZ2@oCMVRp&Facp\sse +q>^~> +JcC<$JcFd1o`"gfrVZTjs8)ckrV/SNp@e1Po^qbGo'u5:rid +qmlmA]"5HL\cBA?\cTFR])K8?])K>>])B8?])K5C]"G_h]_oD7])T;D\@K2]\bs&3\bNc1]D0#> +]tXEZs1nTJrP8EKq7usFrke]Qpr*3O!li:$n](ULrlG)\qTAf\rlkDerlbPjbfn>WcMPrdd/VMm +dK7nIec+/"fDX@qg&Ke&g]-(/h#uTli8_FmTpKhaO,$q@Knb;8LAZc'L)5PuLP:J:L4tA9Ln^T?ViHb!P*2,uS=KSM +#,.llWiiM,jT"q;r06o?op#H@n]1[Nrhe*Cr4r-EqSN6Js1nBDr4W?/TqS-PTDkDqSXc1=R[TY3 +R$X,(Q'@MsP*1rhrf7)?NW+k;Mi.Lj!f2VereCH,s+L<&rIX]nrIXs"s+LE+re:H/M#N6EMMmFP +NK0'\OHG]hPEhE!Q^F20S"-%@T:hmPUnjlcW2ZetXf\e2Z*L^C[^WcW]"G\i^VI_'`5Ta:aN;WK +c-FY^dF-Ooe^rF+g=k?U6g +qu-HkrUTr=s.01?~> +JcC<$JcFd1o`"gfrVZTjs8)ckrV/MLp@e1Po^qbGo'u5q2kE7r/g9-r0%)DrK7/Eq3(`@s-3)>op5QCrgDJX$"Bo@h&K7\Z&HY6lHO,/I6EF*NsA4/aoA7]@cB4baeAS,NPAe/HcAnP^hB4u$p +I!g?kDJfAk&or)=G^4U]H[^HqJqAX)eCE+#rn%&##hn%gh;-rFi8FUns5O+?pi$%Kqf2OQoPskN +s-E2?rhe*Cm?7%&r/_)VTqS-PTDkDqSXc1=R[TY3R$X,(Q'@MsP*1rhrf7)?NW+k;Mi.Lj!f2Ve +reCH,s+L<&rIX]nrIXs"s+LE+re:H/M#N6EMMmFPNK0'\OHG]hPEhE!Q^F20S"-%@T:hmPUnjlc +W2ZetXf\e2Z*L^C[^WcW]"G\i^VI_'`5Ta:aN;WKc-FY^dF-Ooe^rF+g=k?U6gqu-HkrUTr=s.01?~> +JcC<$JcFd1o`"gfrVZTjs8)ckrV/;Fp@e1Po^qbGo'u5C\rD!>eqbI/erD*5c!)WVir(d5c +s%NGe!)EMhs%`Jds%N5_qbH`YrD!Di:/:U\rD)u\!)WYlnkf-Xs%rYir_tp<;T\naihlPcHjkbdaZdsf@S^0g>(N?hr*GOioB+]k2tjjl07O"m-O--n*fc9rpg-^o^r.U +s7QHerV6EgrqcQirVZWmo)=4?Sc=3~> +JcC<$JcFd1oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_nh9P&n*f]3m-Es$l0.9ljl>C\i8EJJgtLK7 +f@JI#da?Cdbfe/Ma2Q!6_:mZ!h;8.g!9!P/"Q81oh;&"arn@D,!nu>\rRqY4g=k65f\"g+eC2k> +NW4t;NVJJ2`W!mF\GhNdO84e9O86-jZa$dAYct:4XfAG$rhgNiQC2oAI=m92MMmO\R\-:QY-Y[M +]".gO!4i'>s1/$]D]>=]DfD@\HKLV]tM)V]D9#<]DfD?\c95@\bs&3 +\bNc1]D0#>]tXEZs1nTJrP8EKpqZjEs2+fRpr*3O!li:$nAbLK!6G/]q9&][rlkDeqof,dcHc=5 +r6PGkrmCkseCFQLrn%/%p=]H!qV)81h;-rFhr*Dii;_d9iaUs+e^;RZ`5BO3_R?D@US4' +OcYQ\N4Q%HqA:)Lk\Z"NIZ\>KnY89Knb7W:JOkg>G@gfVN-Xu +P*2#sR[p"ASt;aTW3!/)XlKHUP5pdEPQ$g@Q1pOCQ0lWiVUGM?_#;+F_Z.IO_"b\A^&Xo,Ta%0^ +T:VXFSGnukR[KP1Q^3r&Q'@JqP*(ifO,o<\repl9MZ/J4L]E5/L&cr,K`$K#K(soqK)C9$K`?c* +L'EEhLl$tGMuJZBNK0'\OcklkPa.N#R$a>3S"6.BTV8'SUnsrdW2cl!Xfek3Z*UgF[^WfX]=bhl +^VRe)`5Ta;aND]Mc-FY_dF6Uqf%8R-g=tE=hV[8LioB([jlYail07L!m-O--rpKmWnc&(\oCV\S +o`Fj]p\jmeq>U6gqu-HkrUTr=s.97@~> +JcC<$JcFd1oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_nhK\(n*f]3m-Es$l0.9ljl>C\i8EJJgtLK7 +f@JI#da?Cdbfe/Ma2Q!6_47'eSt;RHqOmk^q4I_[pn%JUrLO:cSt;LDS=H(mO8b4@O8Y1>Nrb?' +rf@,BqN1Q9rfI,?qiLN4!0I,>ooT39qiLfq2kE7r/g9-r0%)DrK7/Eq3(`@s-3)>op5QC +rgUeB4aV' +7SHKPI!gBlDJjB3E,g#DGBs16s*auuJc:9%e,Ii*e^i='f@\a/g">!3g]$%/hu;O:iSrnXjSEcq +E,YPk!c`7$r,M[Spi6=SqNgc=r2.pBm?7('qiCfPrh0OhT:_^HSXf\K':P>VR$X,)Q'IStP*1rh +OH5H_NW+k;Mi.Ljs+gZ1rIt<+re13%r.=]prIXs"s+LE+re:W4LkpnEMMqIm?]C),O-,TgPE_>t +Q^F//S"#t?StMdNUSO``Vl6VqXKAY/Yd(OA[C3QT\\#Mf^V@V%_o0O6aN2NIbg"GZdF$Fme^i@) +g"P39h;7&Ii8WeWjQ5Oekiq?slg4!*mf)YUnF?MK!qZ'Vrq-?dp\4X]s7uZjr;6HjrVcA +J,~> +JcC<$JcFd1oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_nga2!n*f]3m-Es$l0.9ljl>C\i8EJJgtLK7 +f@JI#da?Cdbfe/Ma2Q!6_>I12;>X5k;>a5k:Jh$fs%i\kr([5fr)!)as%r\joKE+9q`k*Vr(cc] +r_ik`5eqbI/erD*&^ +r(d8dr_3>d!)EMh!)EDcs%N5_r(cfYrD*Ag!)E;br_E)]!)WYlnkf-Xs%rYir_3S"6.BTV8'SUnsrdW2cl!Xfek3 +Z*UgF[^WfX]=bhl^VRe)`5Ta;aND]Mc-FY_dF6Uqf%8R-g=tE=hV[8LioB([jlYail07L!m-O-- +rpKmWnc&(\oCV\So`Fj]p\jmeq>U6gqu-HkrUTr=s.97@~> +JcC<$JcFa0o`"gfrquZjs8)ckrqQNf!;?Eb2>$M3o()>?n*f]3m-O''l0.Nr"h8Zm;raZ*1@6YH=q,XK/A"W2GTAF*;hXK85;BN0'])B8?\cTLV]`,PB])T;D]=bhj]_oD;])TDB])B28](NW/](`i3 +]E,^[r4i9IrP/&Za2d\h!QW:[ana*XbQ#fcc2>fcblH&dchu,i +dJhPqe'uqIf)F;#f_4"tgA9S(g]cNjhr!ALr8@S5"5MARb5T@V`5]^%W2?;]TUM:9Q&q)iMiEY* +Yd(:1Wi;b@SZ]K>XdOHjSni:AAoC1RFG,TE:47P@L5qC`R\$(:;,9qd<)]NbUSarJNKK?dPF7i0 +Sc52bTqeNcY-+kas7hfWP5CICPkgU>PQ8eka8Vq6VUYY@_#;+F_>qFO_"YVA^Ajr.UAgheTV)4T +"eD0QS!ocEQk#IKQ'IStP*1rhOH5H_NW+k;Mi.Ljs+gZ1rJ(?+s+L<&qh"`sqh"`us+LE+reCH. +!/UW2DMj@2N/`jYO-#KeP*D5sQC!u,R[]hAJ,~> +JcC<$JcFa0o`"gfrquZjs8)ckrqQNf!;?Eb2tZ_5o()>?n*f]3m-O''l0./ZSGo#XD>eAKD>nAGD>BLtNpr,. +NrEqrD>eALD#nNmrJ_5ENJi[OM2I+FL51M#nB5;@&EH?8JI"6d$Ll7=Tq2bZ=OH9=$ +s,m2?qN:c=rf?o;pQ,?9rK$W5!0R,>rf@#>r/pf:q2tT:m#h4/s-*DEs-*;Brfd>Go9K!7rKmMN +rKmMNopP`HrgWhUrgiVOrh'1_r1X+arM0Cer1j4ds/#XhrM9Lkq5=7k6`HrVT:2+3PE:odLOai# +HZs[TEH#c2CM.?mMhd"=J:MukB6o2cMg]_WC3*HV4AJj<;-@CB5t,9k@qKOpEHHGLF8eZ/9E7`b +Hkq3\DJa<1E,p&CGC"O\H@('hJV&H)df._qe,n1Of)F;$fFHTef\5*8h;-rFhr*GOir7s@jDSsU +DtS&ODfB]9rGqjVs)@gS!13GGp6GWRrMJ*Em#pt&r/grR!2BId!MH(aSct[TS"#k7rg41^QBd`" +PEM)kOH>NaNfF$s!K2j7M>rA3L])u-L&Zi(KDU8uJbt&sKE$W)L&Qi,LB*/0M/J3/N/WaVO,oBb +P*2&pQ'Rc(R@9V8SXuIHTq\?YVPg>kWiN5'Y->1:Za@0L\@K2`]Y;.r_8=+/`Q-'Ab0/#ScHste +e'uq!f@\d1gYCWAhr*JQj5]7`k3(sml0@U$m-X60n*oi:o()DDo`"O`pAamcq#C0iqYU0hr;?Nb +rdk*@s*t~> +JcC<$JcFa0o`"gfrquZjs8)ckrqQNf!;?Eb0D+l-o()>?n*f]3m-O''l0.jAm;>F&f;#sKhqb@8i:esnap/1fc!BiR=4oRSB4oISE5Q4IV +:B+;cjDf;#jGl;$'Wm;>sJk;=d][;u9Mog5X%4f2`3BE-Q4E`.4Qu.3A<ss#pTN5!D1p +55d\G<:Nob<;r`mVZ3k2Z*L[AZa@-K[^`iX\[oDcrOW'Br4NEN^V@S#_8=(,`;[aU`rF*Q +JcC<$JcFa0oD\^erqu]ks8)ckrV-Hgp@eLY2"^D1o'u5])B8?\cTLV]`,PB\d#^V]=bhj]_oD;])TD@])T>? +\cBA?](W]0](`i3]E,^[r4i9IrP/f$Vjd`5]^4`5SsYV4sQQR@0D, +NKB*XNJP*NYHP"-Whk/hXi%lSS9]pWD/rHCE(4SdKo8MsN.6J=O-?!"T:&GM:K1:lU7nE\Vi?[t +OckooR@Tq=T:VXLV5L>sY,nb_s7_]ZP*;)mqih&Eqj%,E!1!PJrQ+EIr2'@hec5E[r5&9Is2"`N +p:pR?s.gg5U8"?TTV%jJSt2C@S!ob5R$a5+Q'IStP*1riOH5H_NW+k;Mi.Ljs+gZ1rJ(?+s+L9% +nq-aks+CB+rIt?.M#N6LMMmFPNK0'\OHG]hPE_>uQ^F//S"#q>StMdNUSO``Vl6VqXKAY/Yd(O@ +[C3QS\[oGe^;%J#_SjF5a2lBGbK\>Yd*^:keCE1&g"P08h;-rGi8N\UjQ5OdkNM0plKdg'mI'H3 +nF?&>o(2JFrq6 +JcC<$JcFa0oD\^erqu]ks8)ckrV-Hgp@eLY2Y?V3o'u5LAli>K5u3E@qB7eD/O?6G'SLcJV8c8q2bT;rf@2D +OHBI(rK-u?s-!ADrfI,?qiLN4s,d2?pQ,H=OHKC$rf@#>r/pf:q2tQ9m?.=0s-*DEs-*;Brfd>G +o9K!7rKmMNrKmMNo9oTHrgWeTs.0%Y!2'%Xrh'4`qk=%as.][lUS=L\U]%"gV>I(fV#[CgVa[PX +St2=9Q'@AmNJ;t4H[0dXF)c)7CMRQrB8VM!K7SJuH=pc>Nei.-A8,p`%=N\SDJa90E,ouAG^+H3H3/MEIf=m$JqMP#df.\reCFQLs4@;'rn.h9gYCWA +hV[5Ki8N\Tj5]4uDtJ#KDZOfsqf;LPrKm5Dq3ClSrMJ-Fs,m#3S"-(ATV8'SUnsrdW2cl!Xfek3Z*UdE[^WcW]"G_j^VI_' +`5Ta:aN;WKc-FY^dF-Ooe^rF+g=k?^s.B=A~> +JcC<$JcFa0oD\^erqu]ks8)ckrV-Hgp@eLY0(ec+o'u5B[!)sJk;>a>b;$'Wm;>sJk +;=d][;uBVoPd]Xteg]`#PD^AkqN^qmn)_u7LV`Q#prA3L])u-L&Zi'KCXWkKE$T)L&H`,LPYqd +Di0I3N/`jYO-#KeP*;,qQC!u+R[]e:St;UKTqeE[VPgAmWiW>*YHY: +JcC<$JcF^/o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nhBV'n*f]3m-O$%l0.\rS%5'!SH!%N;nn;Mu\k: +N:r8.N;pip`VdaK\+@-.\bqHdNW>.9O9VqoZ*(41X8](7W2?GgOI^H:H@:?uMN!OXPa@u7Vld25 +pppO=]"7mQrjr-A!4r-@!kQ"Urjr-?rjr!=s1/3Brk/3Arji*Ark/:qK^VIYa_>_=O_th7N`W*pZa2ls6_8O!eV50iVSXGn4Q&UlbNJrb* +ZELF5X/i7NH_S-M\YGI4Q&gPu?tF^XEdWd::/64gLl@LdR\-!D:JOke +T:VXJUSb&nY-+n0h>d24s-!/@s-3GHr06utn]1X)rMBIif)PQ]pqcsHs2"`N!5JKHqnN*DrhKRi +UAghiTV%gISXf\K&t55UR$X,(Q'@JqP*(lgO,o<\repl9MZ/J4L]E5/LAuu-K_pDnK):3#K`?c* +LB!$GLl$tGMMmFPNK0'\OHG]hPEhE!Q^F20S"-%@T:hmPUSO`aVl?\rXKAY0Yd1UB[C3QT\\#Mf +^V@V%_o0O6aN2NIbg"GZdF$FmeCN7'g"P39h;-uHi8N_VjQ5OdkNV6rlg4!*mdBQ4nF?MK!qZ'V +rq-?dp\4X]s7uZjr;6HjrVc +JcC<$JcF^/o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_ngO%tn*f]3m-O$%l0.r/pf:q2tK7mudO2rfd>Es-*8As-*GHo9K!7rKmMNr0RGNopGiJ +RJrZSS,8]USa`6MTDtS]U&Uk\U]%"fV>R.fV#[CjVcT[eSXYt4PEV,iMM-J,H[0gXEcGu3CMIKp +ArDFuKS"`(Htm8AMg^>*EaNa!?pI7V>X2=sB0\pT?t*ecE-$,GF@Sbh9hS3.I!pH\D/O92EccGK +G^'.5"ab]IJUrFPKDspQ>HN!McCgT`q*]St;LCrgOOhR@'A.QBd`"PEM)kOcYWbNfF$s +!K2j7M>rA3L])u-L&Zi'KCa]lKE$W)L&Qi,LM_j(M2I1KN/WaVO,oBbP*2#oQ'Rc(R@9V8SXuIH +Tq\.9Za@-K\%0&]]Y2(p_8=+.`Q$!?b0/#RcHjnce'umuf@S^0gYCW@hr*GO +j5]4^k2tjkl0@U$m-X6/n*fc9rpg-^o^r.U!quB_rV6EgrqcQirVZWmo)=4?T`9N~> +JcC<$JcF^/o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nga2!n*f]3m-O$%l0.a>i;?'Mo;>F&f;#sKhr([;h:f.-e!)WMhs%rSVn3-Y2rD38bj&Q"@ +!'g0Br`&nrr_i_mr_O1j69ICq5!;+r5X@_*7nH3B9DM?]:]F2^:]*rh9h\7[:&Ica:&[i_:&%K_ +:B45e:]4&L:[_-U:]=/j:]*rf:\R]b:[V'Y;#jGk:BXKk;,UjDh;#jMm;>sGn;>sJl;=[WZ +;uBVono +5s7=j2E!EH/K>r]0J+k33%m*F1H.?V4[;5"76*=e4?Yc!9M7r@5X.G!6pX1.6q'X98Ou?D9M8#Q +9hTPKqfDj]FT-F_G5c^bGlN'rH[L6iIXZcrJ:IQKj#mK.5<_:+<:Wrf<;r]lV>[7pZ*L^C['fnB +!4`$>rk&3A"hVFZ]Y2#X^AkqL^r!te_uI[T`<+'"a7*./=8u>#*YctF>['d?O\[f>b]t_=u_Sa=2`lQ6D +bKS5VcdC.heC<($f@em4gtgfDi8ESSj5f=ak3)!nlKdg'mI'E2n*olHncJFTo`"Lbp@n=[q#C0h +qY^6hr;HTbrdk*Bs*t~> +JcC<$JcF^/oD\^erqu]ks8)ckrV/GJp@e1Po^qbGo'u5Z1-g&Tn(gAT\*Mi@Rnrf$f8!06Z1s,?rq +rl+cSn[J"t!4i&f"ceY(NfT8"OT1C@XrOODWiE"pVkp;RRr`atI"I-0NK96fQ_'hHX0K/5\cBAA +])TAB])K>@])TAB])'&<])T>?])0)@]">TR]_oAC]">WS]`>_C]D9&:]DK2<]DT8<\c98@\bNc1 +]D0#>]tXEZrkSNJrP8EKqS3*GrkSQMrkeZPq8<l*GLl?:o:e,IuCjUqo:/6h#KT;+\R\-*H:/Fkgd=lVqD%E_">JC_#M1H^AbnG^Ak&0U`cG,U7n9RT:VXF +S=H(Vg^VI\&_o9U8 +aN;TJbg+M\dF$Fme^i@)g"P39h;7&IiSrnXjQ5Oekiq?slg4!*mf)YUnF?MK!V>s_p&Facp\jme +q>^s.KCB~> +JcC<$JcF^/oD\^erqu]ks8)ckrV/5Dp@e1Po^qbGo'u5Es-*8As-*GHns/m6rKmMN +rKmMNp6buLR@4&Cs-rnUs./YNrgs1`qOmn`pS7Y^rh]LfrhW2`Vl-DbSXc(5P`q2iNei79H[C!\ +F)c)7C2%BoAS-dQKS"c)Isc!DA;6+uI\%M;7VlLDC2S'5G]u\K7fH-^I/eX% +D/O60EcQ;EH$K=7$[dAPJ:W<(K7ei1dJ_Mke,Rttf)F;$f`0Y)gAp%.h>c@:i8NYSioB(nDt.fD +EqG^lQN!0IV#@.hV?!OHs7qfTP4k%6OSY+>V>m>6US=KVTqJ$LSt2CAS"#k7R$a5+Q'IStP*1ri +OH5H_NW+k;Mi.Ljs+gZ1rJ(?+s+L9%oRcsms+LE+reCH.!/UW2AVuD)N/`gWO-#KeP*;,qQ'[l* +R@B\9St;RJTq\?YVPgAlWiN5'Y->1:Za@0L\@K2_]Y2(q_8=+/`Q-'Ab0/#ScHstde'uq!f@\d1 +gYCWAhr*JQj5]4^k3(sml0@U$m-X6?mfDqJrpg*]o`"O`pAamcq#C0iqYU0hr;?Nbrdk*Bs*t~> +JcC<$JcF^/oD\^erqu]ks8)ckrV/5Dp@e1Po^qbGo'u5EBO54^r;4T/(P:&n)Mbk4[21s5se"18OQ-C:/Lpbr(m>fo2#<[!_l?^r_<>dqb@&` +qG$c\oM>E\jA55@q+pudqb@,epJCfamnj!\!)WYjs%r_m!)iVir_iSi!)ibmqGR8hnP]0]qc*Pp +s&Aqsq,[Mq!*&epr_sk;;c-@d:/+DQ84,d25sIIp4?GS`2`*BK1bpdPr]re45!1kl5X.S$4ZYJ[ +2)?m6)^d-g.kih@2)RWT2)m]`5XIjs3B9/a4\JIA8O#L*5"%b)6UXC77S--A8kVcKrCd5dErL.W +F9?Z-F`m\,rceBes*>*#I!g?kIXcirIt*!!k<8i/rB9dPo2GR_rMBLj"fJZ4['mFB[fEu<\cBA@ +])K;C]Y2#X^&l'b_>V7N_uI[T`W*sCm>6US=KVTqJ$LSt2CAS"#k7R$a5+Q'ISt +P*1riOH5H_NW+k;Mi.Ljs+gZ1rJ(?+s+L9%oRcsms+LE+reCH.!/UW2AVuD)N/`gWO-#KeP*;,q +Q'[l*R@B\9St;RJTq\?YVPgAlWiN5'Y->1:Za@0L\@K2_]Y2(q_8=+/`Q-'Ab0/#ScHstde'uq! +f@\d1gYCWAhr*JQj5]4^k3(sml0@U$m-X6?mfDqJrpg*]o`"O`pAamcq#C0iqYU0hr;?Nbrdk*B +s*t~> +JcC<$JcF[.o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nh0J%n*f]3m-Es$l0.9ljl>C[i8s,[/@rf82&Wi;qpWhu_mOd^?7H$t7!Ll@FYQ'\)9V5pi.]">Pb +q7H[:qI^])%K_>_=N_th4O`Q%hro#:aOaN=;$s2k;`rQG5brltAb!6tMgqp58g +rmC_n!n>cNr7Cu$o[s5uptH&/h;7#@da#u6`!O;o`PS[RVPKoWrg=%VOc>?XMi3J!riJ,\WN;nF +H)%RJ]r[fjFH_Q6NaNfF$s!K2j7M>rA3L])u-L&Zi&KD'ooKDpQ(L&QgLLPUbCM2I1KN/WaV +O,oBbP*2#oQ'Rc(R@9V7SXuFGTq\aihlP +cHjkbdaQ^rf@S[/g=tH>hVd>NioB+]k2tjjl07L!m-O--n*fc9nac8BoCW%Ts7QHerV6Bfs8)Wi +rqu`no)=4?U&TW~> +JcC<$JcF[.o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nh0J%n*f]3m-Es$l0.9ljl>C[i8OD#J5HD#%rIDZ4MF +Q2m$=O7\J+NW!\oDZ"AODZ+MRLAuoHK8"o1K62BH@:WtbCMn*4Fa8@aJV/]6NKB9aOSP"=OSb.? +P5^UBOT1C=OS4b5O8t@>O9Lc.OHGZerfR#d=lVqD%COT:R?OoCFBOnOn8OTD>UrhK^mU7n9R +TDkDtSXc1=R[KP1Q^3o%P`q8nOcYZcO,f5!Mueiore^Z2!/LN-s+UK+qLeKnqh+m$s+UH,Fbbd/ +M2@+IMi^ +JcC<$JcF[.o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_ngEtsn*f]3m-Es$l0.9ljl>C[i8hs%i\krD!Di:f.-e!)WSjr]]s;rBBm;qG7)cr_EMo +pf-]^pJh/Ws#pEIq*=pD$rg/';Gg=h:f'>A4$d>$VmEb< +[^NZT\@K2^\[hXL$bO'a]tM.p^VIY$_>_:O_u@US`NaNfF$s!K2j7M>rA3L])u-L&Zi&KD'ooKDpQ(L&QgLLPUbC +M2I1KN/WaVO,oBbP*2#oQ'Rc(R@9V7SXuFGTq\aihlPcHjkbdaQ^rf@S[/g=tH>hVd>NioB+]k2tjjl07L!m-O--n*fc9nac8BoCW%Ts7QHe +rV6Bfs8)Wirqu`no)=4?U&TW~> +JcC<$JcF[.o`"gfrVZTjs8)ckrqQNf!;?Eb1\C;1o()>?n*f]3m-O'&l0.Q72i:c+7i8rn@D,r7_2(pl#94N/[Xn!0$f7qi:Z8 +rP\]Sq8WHDn@%hqr4)`d!0@&_A]DoJB])]G=]D]><]DK2>\bE]-]D0#>]tXEZrkSKIrP8HL +r4iBM^q]las2"]OrknTNs2G#XrQ"iU!6=lS!lrC(qTAi[s2t>arlkAdrQP;ds3CJerm:YlrmLhr +!7gtu!8-qss4[5%A(/ZEaMc$7^r4*tVkp2_T:D=9Q'@;hO,JmP[BHd:XK&D%J:)U@_m-G=Q$J%D +K8s&77X.RCI#!JQ:6'pWNK0BoT:SkS:fLCoO/&SLN/ip\PF7i/S"H:EUSXlhY-+n0Y5YWXs8S>W +PQ-g;PO-Bca8_q3V#I4iVZ3RJs8Kk/_"khH_#D+@^&k40V>d84US=HUTV.pKSt2C@S!ob4R$X,( +Q'@JqP*(ifO,o<\repl9MZ/G6LkgcbLAlo,K_g>qK)1-"K`?c*LB!#/M#N53MMqImAW;_2O-#Nf +PE_>tQC+&-R[]h['d?O\[f>b]tV7s_Sa=2`lQ6DbKS5Vcd:(f +eC<($f@em3gtgfDi8ESSj5f=ak3(smlKdg'mHs?1n*olHncJFTo`"Lbp@n=[q#C0hqY^6hr;HTb +rdk*Ds*t~> +JcC<$JcF[.o`"gfrVZTjs8)ckrqQNf!;?Eb2"^D2o()>?n*f]3m-O'&l0.tErbh\"p6PH6 +ooAI"rb_UOs(qaRqemF+KS+o.6?7?r@U`k^C2Im2Fa/7^J:iQ2MNOn=b5On=b7OnOn-Oo1CAPPpXEPPLCAPP^U;Q1^IAQi2\UA1M\V#I4eUgTgbSNaNfF$s!K2j7M#rKgL]3&- +L&Zi&KD0uoKE$W)L&Qi,LB*/0M#iKlretEJNfT6_P*2#nQ'IZ&R$jD4S=Q7DTV8*TUnsueWN*## +Xfen4ZEppG[^WfX]=bhk^VI_(`5Ta;aND]Mc-FY^dF-Oof%8O,g=k?U6gqu-HkrUTr=s.]OD~> +JcC<$JcF[.o`"gfrVZTjs8)ckrqQNf!;?Eb/+iH)o()>?n*f]3m-O'&l0.3!)NShr_EMhqbI8i +i\2)I0K1,D6_ +6:!du4?,Sk5!M:q4?5;Z1bp[:*??LZ/LrM53]8i\2)[HX5X7Y'2E08kD955=%\)6UX=5 +7nH6A8P2QJ9M>=Ys)J!Xs)\0]s)eBbF`mV*rce?es*FrtI=6QnIt%BH!e]\[o?N\dZ3`]Y2%n^V@S"_84"e_u7LR`V`d6j +<d84US=HUTV.pKSt2C@S!ob4R$X,(Q'@JqP*(ifO,o<\repl9MZ/G6LkgcbLAlo,K_g>q +K)1-"K`?c*LB!#/M#N53MMqImAW;_2O-#NfPE_>tQC+&-R[]h +['d?O\[f>b]tV7s_Sa=2`lQ6DbKS5Vcd:(feC<($f@em3gtgfDi8ESSj5f=ak3(smlKdg'mHs?1 +n*olHncJFTo`"Lbp@n=[q#C0hqY^6hr;HTbrdk*Ds*t~> +JcC<$JcFX-o`"gfrqu]ks8)ckrV-Hgp@eLY1\C;0o'u5VlR,3]=Y`S])]G<]DoPD]DK2>])]M@ +]D9,=]*,d[]tD#S]DoJ9]DfD;]CEK)]DfJA^&P_G]tXEZrkSKIrP8HLs1nTL!PlJL_#D1L_Z.ON +`;[aU`rF'[aN*nls2P/]ans6ZaoBK`bP]Tac2Prdc2Z)cci)2jdJhSodfS%Mf)4/"f_!hsgA9Q7 +eBZ7X`PKI/^;IadW268aT9tq2Q'72cNf&XIZELC4X/E"pIsIj'W4f*rHZ5^9EaVd9DL"ioI#!SO +:JZIkMN3piSXrSP:/=hf;PBq`VMpRrOd2E+SXc:CTqnNaY-4q/Y5YWVs8A2HPN^*b`rMk5U\gke +V>d@kVq_7L_>:tC_>_7M^[o/^Vl$;eUnjc[TqS-PT:VXFS=?":R@'A.QBd`"PEM)kOT(:FNfB!V +Mi3JlM#rKgL]3&.L&Qc%KD:&pKE$W)L&HaALPUbCM2I1KN/WaVO,oBbP*2#nQ'Rc(R$sM6S=Z=E +TqS3VUo(&gWN*##Xfen4ZEppH[^`lZ]=bhl^VRe)`5Ta;aND]Mc-FY_dF6Uqf%8R-g=tE=hV[8L +ioB([jlYail07L!m-O--rpKmWnc&(\oCV\So`Fj]p\jmeq>^ +JcC<$JcFX-o`"gfrqu]ks8)ckrV-Hgp@eLY0D+l,o'u58]Sb$[pD>A#ED#fh"Q2d-MQ2$[@ +O7nUsNVRJfD]46p6?7?r@:<\\C2Is3Fa&1\J:`H0MN*a\P4t(=P5^U:OT1@DNfT6]qiCH4p6#!/ +rfQ<(qN:c?r/po?rfd;D!0d8B!0d5Cop,39rKmMNrKmPOpR1uIs-`nUrgWeTs./_Prh'4`q4Re_ +rhBIhrM04brMBLhA>,Q`R$X##OH5E[K7JDuH['XQDf9H,B52*lAVl+nJU`)rH"^`;N.$M/F(AO! +Am._h4]5KL.9Za@0L\@K2_]Y2(p_8=+.`Q$!?b0/#RcHjnce'uq!f@\d1gYCWAhr*GPj5]4^k3(sm +l0@U$m-X6?mfDqJrpg-^o^r.U!quB_rV6Egs8)WirVZWmo)=4?U]5i~> +JcC<$JcFX-o`"gfrqu]ks8)ckrV-Hgp@eLY/+iH(o'u5i#2?#QF3^#Gq9M%c?5X.V'6pa<@7gMXW8kVcM9he=\:&f23 +EW1"XF8g:]FoQUbFoHR_GQ)meHiAHlIfFltJGh\,4oIS<4mZ/B;ZNQkU\gkeV>d@kVZ=.([fO"L +r4)d;rji0C]Y4_:W_ns=._o'F2`V`d0rK)1-"K`?c)L22R#Ll$tGMMmFP +NK0'\OHG]hPE_>uQ^F//S"#q>StD^MU84T^Vl6SpX/rG+YctF>['mEQ\[oDc]t_=u_Sa=2`lQ6D +bKS5VcdC.heCE.%f\,!5gtgiEi8EVTj5f=akNM0plKdg'mI'uB!V#XYncJFTo`"Lbp@n=[q#C0i +qYU0gr;HTbrdk*Es*t~> +JcC<$JcFX-o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_nhBV'n*f]3m-Es$l0.9ljl>C[i87]`,VE]`#GC]Y"0SoXb+7pq-10!P>r8]DfJ>]`>eE^])%I^Au(C_#_?drkSNLrke]Q +r5AQQs2P)Z!Q`=\`W4'S`r=!ZaN=>%rQ5)^!6b;arltGd!mT$9ps8rd!7Ceos3h&!e^jZMs4Hts +s4[J,9%hS6a2Z$8_7de)Xf&%kTq7gAQ'RMmN/EUQLki:=XKAM'WgJ-WW5Q0HS!8#YQ[\\XY +E.!G!8l&90ItW]>Pae/69iFhar_sh7U8FiINfK3aR$sP7SXuIJV5LAtXf\e2Yck7]rrA5[PkgLC +P4b%#aSj0YUAgqcV#R:jVZ*LKs7jG/_"khF_#M1B^Ak,2V?E`kUna[`Td6;'St;LCS"#k7R$a5+ +Q'IStP*1rhO,o<\NJrgSMMd7ILkpibLAuu,K_g>sK)('!K`?c*LB!#/M#N53MMqImCQ4@8O-#Ke +P*D5sQC!u,R[]h +JcC<$JcFX-o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_ng3hqn*f]3m-Es$l0.9ljl>C[i8&ZSY#dqn8/&?pMBkHs-3DGs-E\Mqj-c4if*qs +qelCO!cUFkrB_6>G^*V*AS5^oEH?5FH$XphK7nu;O8"b:P5^U:O9L]*NfT3\qN(B4rfI2DqN:?1 +!0R8B!0?B+qN:c?r/po?rfd;DplkNZ!7F:L-4c?"@Y87n-cn@qfe!F*2a,7i4]i9hn<.IXc0ODJsN:G'A1VH?ssfIY!(LKE$Z* +KE0^s.fUE~> +JcC<$JcFX-o`"gfrquZjs8)ckrqQNf!;?Eb!VH!_ngC[i8l;#=&f:]sQh9heC^:\dib:[V'Y;#jGl:\R`d;ZBSo;YsAk9)h?`6UX:-55mYW3]T5Y2`*?L1bg^P69mh!4#f8"59E6V3]K&V2DZj0)^6U^ +/hA\53&*6I1Gq'M4?Yqr6oY**+ZhhN4\JF<5X7V"6UX=06q9^;7n?3D8PDiP:/4MXDfB[oEW1"Y +F8g:\FoHObGBWt0s*4Qh!d]3?rd=frIK"ZsIt9`[557;;55[S/<;9DkUAgqcV#R:jVZ*Ip[^WaE +\Gs#>\@9!H\cTOX^&G_J^VI\%qSN9Ms2=h9rDi_ooi:cdr`/urs/#pqUnjc[rh1U1T:VXFS=?": +R@'A.QBd`"PEM)kOH5H_NK&mUMi*CKM26tCrJ(?+re1-#q1AEps+LE+reCH.!/UW2!K)g7N,+E5 +O,oBbP*2&pQ'Rc(R@9V8SXuFGTq\ +JcC<$JcFX-oD\^erqu]ks8)ckrV/JKp@e1Po^qbGo'u5" +_ScAkqSi7]`,SE]_oAB]Y"0Sl+?W"p:L@;s1A9CqRlmCr4i6HrP&?Jp;$jH^VIY`_>_=O_u.IO`W*sV +a8a0Za8![Q`rX9'r6"u[s2t5_rltJes3:Shps8rdrR1_p"4YlPf)4,"f_!ksg1oBjbK.]A_8="& +^pp>@UnXNRR['2%P)tW[N/E@DZ)t1/VlZhHHD7sL^8.'?LQI($='9!X95Jp/N(HfAH%:O*O-?!# +T:SeS:/Fni;c99bVN$UqNf]NoR[fkYd*^:keCE1&f\5'7 +h;-rGi8N\UjQ5OdkNM0plKdg'mI'H3nF?MK!qZ'Vrq6 +JcC<$JcFX-oD\^erqu]ks8)ckrV/8Ep@e1Po^qbGo'u5GBRA'@qTOnDK9f@G^=dgJqSr;N;8S9P5^U:O8t@>Nr"h2OT(@BP5:=/OT1C,OSY+=P5LI? +P5^[DP5(7:PkLC7Q33J@R$[c=rg*VPp6kiG!1EhTrgWeT!1itX!2'.[rLa+_pn7\^rhBIhrhK:b +9;S;OR[08'P)bT`MM$D-H?j^WFDl&6CM@BnBOtY,K7\T%I!TF:I>NB/H#dD/CLL%*6;(NJ<*WsJ +5t=CN@:X(gE,p&GGt(:n7fH+!8UGo8D/O3.E,p&DH$FU\H[U?mJ:W?*K`6Z*c2Q#fci2;kdJhSn +e,Iksec+/!fDjP(gCW/rh;7&Hi8ESQio9!9DJsImE;4ALE;jeQQhHa8QNEJHU&LedU\pqfV>d@j +VqqC5Oo(7>OoD6^VPU)aUS@a])5*UnSt2C@S!ob4R$X,(Q'@JqP*(ieO,f5!Mueiore^Z2!/LN- +s+UK+q1JNqq1J^#re:?+s+^T1reYBIMiYd*^:keCE1&f\5'7h;-rGi8N\UjQ5OdkNM0p +lKdg'mI'H3nF?MK!qZ'Vrq6 +JcC<$JcFX-oD\^erqu]ks8)ckrV/,Ap@e1Po^qbGo'u5h-4odkI6j?+P7nH?I9_qNb:Amuf:&n#f9`Iid:&n#d9EIp^9_hEX +:B+,h:B"#h:>AY9;#X>l;#=&f:]sQh9heC^:\dib:[V'Y;$0Wj:Jgd_r_i>b!)iboqGR8johtcf +r_s&$<)cjt84`_P##%`b +9hnH$rbqgUrc.pXrcA'\rcS6aqfi'bs*=`nI!km@rdG'$J:]mG4[&d.pc\F:k>_7Us.TFds.fLf +s/#^lrMTY(s0`*?[^NZT\c0/M]=bhj^:q@u^qmk(_8=%e_Z%INaihlPcHjkbdaZdsf@S[/g>(N?hVd>NioB+]k2tjjl07L!m-O--n*fc9rpg-^o^r.U +s7QHerV6EgrqcNhrqu]moDX=@V#Pr~> +JcC<$JcFU,o`"gfrquZjs8)ckrqQNf!;?Eb2>$M2o'u8>n*fZ1m-Es$ki_*jjQ#7Yi8MJOHGltT:r$WY-b_:])fRVrOi0BrOW$@ +rk/3Aot::;!5/9Brk/6Ake$Q"p:L16qRlmCr4i6HrP&?Jp;-^CrPAKMs24cQr5AZUrQ"rXrl=iS +rPnr[ao'<[aoBN\bl5lebQ?&7cM,ZaciDJmdf7bueCE.$r7Cu$p"=*/ccF/F_o'7&`58[RV5'`W +SX5V,OcYT]LP^nCYcb+/WMlbbI!2R+[&f^[F,uE3?WBU:7qm*tN(ZrBH%1I)Ng-!$T:JbR:/Fqi +;cA@DVPfE6NK0'bR[BS6SXuFIV5L>sY-"k0YcuOTrK?luQ^F//S"#q>StD^M +U84T^Vl6SpX/rG+YctF>['d?O\[f>b]t_=u_Sa=2`lQ6DbKS5VcdC.geC<($f@em4gtgfDi8ESS +j5f=ak32'olKdg'mI'uB!V#XYncJFTo`"Lbp@n=[q#C0iqYU0gr;HTbrdk*Gs*t~> +JcC<$JcFU,o`"gfrquZjs8)ckrqQNf!;?Eb0D+l,o'u8>n*fZ1m-Es$ki_*jjQ#7Yi8T)PAYT_P5\TECgZT:bqNrG)CLp1sM@!,_RKq/$+Jrfm2CqN_,Hr/Uf: +rJp]7rJp$"!K;s9M#`>062NtaE-PPo?t3h_Bl%d0F*;hUIXm')LPq5kOTL].OnFh9O8Y+6O8+h: +OoCO@Om\>1O6_o(OoCOAOo1CAPPp[>PPLI/O8u6YV^J@.9Za@-K\%0&]]Y2(p_8=+.`Q$!?b0/#RcHjncdaZdt +f@S^0gYCW@hr*GOj5]4^k2tmll0@U$m-X6?mfDqJrpg-^o^r.U!quB_rV6Egs8)WirVZWmo)=4? +V>l&~> +JcC<$JcFU,o`"gfrquZjs8)ckrqQNf!;?Eb..m-%o'u8>n*fZ1m-Es$ki_*jjQ#7Yi8en5!M:u6UO@384Q9F:&Ice:B"&g:B+&f9E7fd:B+&d9EIp^9_hEY:B"&f:B+,i +:>J_:;#X>l;#=&f:]sQh9heC^:\dib:[V'Y;>j>c;>sJb;#jMm;u0Dl;Z]os;tX&f;u]etbm6p`gl3&s,`4ZPu*91V<65X.P&r^-iX7n6*?8H)6]9`Iie:B,,1D>nJR +E;aeUErU4[FT-F^Focf1rceBe!dT*NaNfB!VMi3JlM#rKgL]3&-L&Zi%KDU8qKE$W) +L&HaALPUbCM2I4LN/WaVO,oBbP*2#nQ'Rc(R$sM6S=Z=ETqS3VUo(&gWN*##Xfen4ZEppG[^WfX +]=bhl^VRe)`5Ta;aND]Mc-FY_dF-Oof%8O,g=tE=h;@/KiT&tZjlY^hl07L!m-O--rpKmWnc&(\ +oCV\So`Fj]p\jmeq>^ +JcC<$JcFU,oD\^erqu]ks8)ckrqQNf!;?Eb2Y?V4o()>?n*f]3m-O$%l0.9ljl>C[i8j\Ef>iu=]f$V95Jp0MFgT=I=[05OdMW1Sk`'V +:fLFm;k]t`VN$UqNf]HjR[fn>SXuFIV5L>rYH4k/YHY7XrrA2ZP5(7=P5g^Gb506Aa8hn2U&Uke +U]%"gV>mFkVuN^Qs8Bh0_>M+K_>1nC^\tnHW;ib9VPU)aUS=HUTV%gISXc1=R[KP1Q^3o%P`q8n +Oc]R'#*+\%N/NRNreU]4LPPk`s+UH*q1JQrq1J["s+UH,s+^T1reYTOMi +JcC<$JcFU,oD\^erqu]ks8)ckrqQNf!;?Eb0_Fu.o()>?n*f]3m-O$%l0.9ljl>C[i8q*H$E=C>NGAS,UmDK0`>GC"^gJV/c9NKK?dP*(n"OT1C?Nqe\2OT(CAP5CC0OSk1,OSY+= +P5LI?P5^[DP5(7:Pk^O7Q2m9NQiNKPR/`NQR.ZmGR/`TRRf8fRSH#/WScGD[T)PA^T_P5\UAptg +V#@(gUhQHjR[9;(P`h)fNer@;IsZHbG&qS>ChdTqAS,RdLP1;2IscWeB4QONK77r]?>F.W6psUL +5u_-#BL,*W?XdV`DK0cDG=G(k7ncWL8UPo7IVit>DK'T:G'8+TH$ajbIXZiuJ:`E,re1?qrlbAe +rm(Mhrm:\mr6kSn!n>cNrmhD-f\"m2gY:N>h>Z=3i;_d9iW3t:rbhdSr,;OQr,;USpQtiEl^%UE +r1X.bs.fOgs/#amrMT[ohuEYsq*N#[/UnaZXTqJ$LSt2C@S!ob4R$X,(Q'@Jq +P*(k*Ns:W(N/W[PMZ/G6LkgcbLAuu,K_^8tK)(&uK`?c*LB!#/M#N6MMMmFPNK&sZO-#KePE_>t +QC!u,R[]h +JcC<$JcFU,oD\^erqu]ks8)ckrqQNf!;?Eb..m-&o()>?n*f]3m-O$%l0.9ljl>C[i8Pr9M7oA5X.J#6pj@06UjR984Q3C9M8%X9F"9e:2=W]D/T>ks)@sW +rc8!ZrcJ-^s)nHfG';ZNKgU&UkeU]%"g +V>mFkVuN^o[0j@O\%&rY]"5Md^AbkL^;%IurP8HLs2+fPs2+_9s&T,!rD`\nqc*Mos&Akqr`&or +s/-m7V50o^U7n9RT:VXFS=?":R@'A.QBd`"PEM)kOT(:FNfB!VMi*DkM#rKgL]3&.L&Qc$KDU8r +KDpQ(L&Qi,LB*/0M/\?1N/WaUNfT6_OckomQ'IZ%R$jD4S=Q7CTV8*TUnsrdW2ZetXf\e2Z*L^C +[^N]V]">Vg^VI\&_o9U8aN;TJbg+M\dF$Fme^i@)g"P39h;7&IiSrnXjQ>Ufkiq?slg4!*mdKW6 +nF?)?oCMVRp&Facp\jmeq>^ +JcC<$JcFR+o`"gfrqu]ks8)ckrV/JKp@e1Po^qbGo'u5%rQ,)_bPTN\c1TE_ciDJmdK@tJeCFQLr7Cu$rRhA, +d`]eP_u@OQ]`5cCXJhtkTq@d?Q]dGjNJWCDLP^bhXf\\&V5pJBGbW*RZ(@5(M3;FamFkVuN[qWSmgT_YM%D^];4I_#(nF^Ak/XW2HPjV50o^U7n9R +T:VXFS=?":R@'A.QBd`"PEM)kOH5H_NW+k;Mi.Lj!f2VerJ(?+s+L3#qL\Nqs+LE+rJ#KNLkpnE +MMd=NN/`jYO-#KeP*;,qQ'[l*R@9V8SXuIHTq\aihlPcHaeadaQ^rf%8R.g=tH>hV[8MioB+]k2tjjl07L!m-O--n*fc9nac8BoCW%Ts7QHe +rV6Bfs8)Wirqu]moDX=@VZ2/~> +JcC<$JcFR+o`"gfrqu]ks8)ckrV/;Fp@e1Po^qbGo'u5Nq\V2OT(CAP5CC0OSb+;O8tF7 +OSY+=P5LI?P5^[DP5(79PkgU8Q2m9NQiNKPQiNKOR.csHR/`TRRf8fRSGo)WScGD[T)P>^T_>&Z +UAgp&Una]VS=5b/Pa%>kO,f0QIt)ilG]\"HDf'6'An>LaB4Q[KK7JH"I[qJ67RgcqBP_X.Fa.4_7Rg*H8kFDXIXc3PDJa<2F*;_OGBnL\I"$QpJ:W=OKDpT'b6#o4 +c2Q#fci2;jdJVGle,Insf)OA8g"P07gt^cChr!AMiSieVDJsIjE;a_PE;skMQi!*9QimFkVuN[qWSmgTP5179OR\J5OT2:*W2HPjV50o^U7n9RT:VXFS=?":R@'A.QBd`"PEM)k +OH5H_NW+k;Mi.Lj!f2VerJ(?+s+L3#qL\Nqs+LE+rJ#KNLkpnEMMd=NN/`jYO-#KeP*;,qQ'[l* +R@9V8SXuIHTq\aihlPcHaeadaQ^rf%8R. +g=tH>hV[8MioB+]k2tjjl07L!m-O--n*fc9nac8BoCW%Ts7QHerV6Bfs8)Wirqu]moDX=@VZ2/~> +JcC<$JcFR+o`"gfrqu]ks8)ckrV.u=p@e1Po^qbGo'u5;uKVo;uT\l65i3K +1bq-T4Zu"n5!VD#6pjF47S$-C9h\;X:]=)h:&I]a:&n#`9_qK_:B"&g:B"&`:>\k<;#X>l;#=&f +:]sQh9heC^:]=2a:[V'Z;>a8b;?'Pd;>sJm;u'>j;ufki;Z9Vp<;fhr"4?PV`2Dd0@+rr$^/h/M23&*]&Y5!(kd92%uL5X7P!6UO1.6UX@57Rfs>8P;]J9MA/Sr_56!e*<;TVnT`(SaUAq"eV#R:kVZ!FmVuWgr[JmW@ +\@K2_]=bhk^](qJ^V9]^s1nZN!5e`O!Q)eR=8l5#Xd*^:jeCE.%f\5'6h;-rFi8N\UjQ5OdkNM0plKdg'mI'H3nF?&>o(2JFrq6 +JcC<$JcFR+o`"gfrVZTjs8)ckrqQNf!;?Eb2Y?V3o'u8>n*fZ1m-Es$ki_*ijQ#7Yi80!SuQ&M#<)3Ll$tGqMbE5s,?l8rJ^cl"2Vjl +`;.CG`qm1@[f!W7\Gs&9\GIP*20#SY2XQ +VlmA8rOi*@"M24W]Y+0Sp:U=:s1JBDrk/9C!4q:(q7?O:o=P(:qS)mBrkSKI!5S`T:;45PECl`MMV7c4c$;EX/`(rWMl85FelOJ];1a=K:Qgu5AP+-Bm,)e8l&?3JVT8L +R[]pH:ejhd<)HPeUo(#LNK0*bQ'n-?SHYUZV5C5mriQ4'!3cC+bl@^)rfR5DpQPT@rQ=iUlH'!t +rh04`!huHbrM9Iis/,dns/>ss!35&YrPJBHn\G"9rk9GRWMuhoVl$;dUnaZXTqJ$LSt2C@S!ob4 +R$X,(Q';31$B^F2O,f3YN/NUOreU]4LPPk`s+UH*q1JNqq1J^#s+UE+!JcL1M//!,MiY +d*^:keCE1&g"P08h;-uHi8N\UjQ5OdkNM0qlg4!*mI'H3nF?MK!qZ'Vrq-?dp\4X]s7uZjr;6Hj +rVc +JcC<$JcFR+o`"gfrVZTjs8)ckrqQNf!;?Eb0_Fu-o'u8>n*fZ1m-Es$ki_*ijQ#7Yi8`50K`Hf(6N9Ch<``C1@:Ee\Bl.d/F`r%VIt3'&KSbSIooK07r/UN4qN1]=rf[/@mZ@7*npltT>ns09Brg3\Pq3_,Ks-W_Pr0RJPrgNhUqjdYVr13n\qO[\Yp7_M\s.^L' +S=,Y,PEV,iNK&mOJ:;omH$=@ME,BB*B4h-R5A#V&Jq8E"InGKDuahRE:fLmQLL7@TDkM^T`Us` +U]%"gV>mFlVuN^qW;rsXs8A,VOnFh/OoLLaWi;trVl-DgUnjc[TqS-OSt;LCS"#k7R$a5+Q'IR4 +Op[>5O,o<\N/W[QMZ/G6LkgcbLAuu,K_^8sK)('!K`?c)L&m'creYEJMi3OQNK0'\OHG]hPE_>u +Q^F/.S"#q>StD^MU84T]Vl-MoX/rG+YctF>['d?O\[f>b]tV7s_SX71`lH0BbKJ/Ucd:(feC<%# +f@em3gtgfDi8ESRj5f=ak3(smlKdg'mHs?1n*olHncJFTo`"Lbp@n=[q#C0hqY^6hr;HTbrdk*I +s*t~> +JcC<$JcFR+o`"gfrVZTjs8)ckrqQNf!;?Eb..m-%o'u8>n*fZ1m-Es$ki_*ijQ#7Yi8eq= +;#X>l;#=&f:]sQh9heCP:[V'Y;>sDc;>sGp;,C*`;?'Pm;u0Dk<<#nj;Z9Vo<;onr#5TN0T4ZYM]2)6g4)_*5O,o<\N/W[QMZ/G6LkgcbLAuu,K_^8sK)('!K`?c)L&m'creYEJ +Mi3OQNK0'\OHG]hPE_>uQ^F/.S"#q>StD^MU84T]Vl-MoX/rG+YctF>['d?O\[f>b]tV7s_SX71 +`lH0BbKJ/Ucd:(feC<%#f@em3gtgfDi8ESRj5f=ak3(smlKdg'mHs?1n*olHncJFTo`"Lbp@n=[ +q#C0hqY^6hr;HTbrdk*Is*t~> +JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb0_Fu.o()>?n*f]3m-Es$l0%3kjQ#:Zi8W/3M27"Fq2"p)"c/"lMMmDjN;eh7N;nn; +^]_Kj_o0Lk`V7CO`rO-N\,Ni*\+R3.[K!Q4YQ:o1riH4%XSkKa6Q0ZVE,g#DH[UF!M2m^^PaRu2 +T:r0[Y-POL]_f>@]`#J9]_oJB]`5VD]]$Ku])B84]E#YA^APbF_#;"J_"PVD_#D1I_Z.OO`;[aS +`rF*Y`rF*S`r3pYaN=>%rlG2`bPTN]blH&^ci;AldJhSoe,\%tf)=34f[@pb_na%&^:_"l^oaT6 +U7n3KR$EhtNf8gML4t;9YHP",W2HPlRs]@PZ)kC5R?NYaQ[F6QDJE`sF+0$@:Jc@fLlROaR\-*F +:/=kh;H'9aVP]?6NK9?lR@Te;St;[QV5^NpXoGU%Yfm%HOSk7?P4t1>ao9HTamI1LT)YG_T`(Sa +U&^teV#R7kVZ!FmVuiruWoF'Y_>hCJ_=>>;^](r%Wi;trVl-DgUnjc[TqS-OSt;LCS"#h5R$X,( +Q'@JqP*(ieO,f6[N/W[PMM[1GLkkq`s+UK+q1JNqq1J["s+UH,s+^T1reUZ5MuJZDNK0'\OHG]h +Pa.N"Q^F20S"#t?StMdNUSO]_Vl6SpX/rG+YctF>['d?O\[f>b]t_=u_Sa=2`lQ6DbKS5VcdC.h +eC<($f\,!5gtgiEi8EVTj5f=akNM0plKdg'mI'uB!V#XYncA@SrUg6cp\4X]s7u]kqtp?irVc +JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb-1pg#o()>?n*f]3m-Es$l0%3kjQ#:Zi8J)KPQ$gAQ2$XJQ'R_rNqJJ#NqJD1 +N;ne8M$A`kL51M;L&F@:6Prg+?=72MA7oOkDfTrAGC+^eJ:W?,M2IAiOT1C?NqSP1OT(CBP5170 +OS4b+OSY+=P5LI?P5^[DP4t19PkgU8QN*s^o`Fj]p\jme +q>^sJ~> +JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb..m-&o()>?n*f]3m-Es$l0%3kjQ#:Zi8k +;Z/r\6Q%[>3]]Ac4Zu"n5!VD#6pj@26q9d?8k_oQrCm5c!_uHar(I/d9MG:WrD*;es%`SiohOF@ +nkf<_s%rSgr_N_n:/+GXn5&IKr_`Ykp/1fe!`;cjpJLrgrDWSk!)rkrs&8Vhr_reqrDihts&BM+ +;,L+`9MA)O7mfX15lO"J49IZ)2`^jq!AuY30gS,n5s[_"4?5De5.9Za@-K\%0&]]Y2(p_8=+. +`Q$!?b0/#RcHjnce'umuf@\d1gYCWAhr*GPj5]4^k3(sml0@U$m-X6?mfDqJrpg*]o_nFap@n=[ +q#C0iqYU0gr;HTbrdk*Js*t~> +JcC<$JcFO*o`"gfrqu]krqZWjrV/AHp@e1Po^qbGo'u5[dact'gYL`CrSRV4qVhA1rnmL-!f2\iregW1s+pH,s,-c5rJ^`8s,?rm!l;ak +rl"fTq8WiO-jp/Fa&.[K8PVLP*;,u +R[p(FVP^N%\,Er;]`,P;]_fD=]]$Ku])B87]`,V?^APbF_#;%J_"#8<_Z.OO`;[aS`rF*Y`r=$S +`r3pYaN=>%rQ,2bbKS2RrlkAdrm(5`rm1ksdaHUne^aWLs4;#5b/hH8^VIUr\\Pn[W2?5]T:VO< +OckidLkUM9KS+u]XK/=tV5^&6FeGS3Z`':TN.?/$J6,cC@:i,QIu6or:O.DDNK9EpTUekQ:/Fkg + +JcC<$JcFO*o`"gfrqu]krqZWjrV.l:p@e1Po^qbGo'u5Gq3CcAs-3\PQ'I[3 +NrP1=Nr"h$NrP+=N!kQ$M2@%ELPCS=Kn]Ilr'M>iF*Cqu?t!SZC2@g0F*)SOI=?a!K8,5@O8P+= +O8b16O84n;OoCO=On"P4O8k7:O7JD1Oo:I@Oo1CAPPp[=PPLI=Q26dHQhm$JQi8`SXuFFqk!h[s.K=as.KCc#G%?NQ'7AoOoC>IMhQY0I<^$]F`VP?Ch[Km +A7K+Y@tTDcJ:;ilG\CT6I=ZusFDbi&>@(Z&5s@n85uqB+6UsXQ@V':jEHHJN7n6$<9heB1I"$Q] +D/O94F*2\NH$XdbIXcp#JqJ]/qM"mirlY5`!6kGes3CVirQtJis3^nrrm^turn%2&#MIkdgtgfC +hYuF4hu_lsiqdNiDu=PSR.?U;QM-[FQMmETTDtS`U&UkeU].(hV#[CkVZNfrWW&pXs7VTJOSt=@ +P5LIBOT2?\W@4^CVl$;dUnaZXTqJ$LSXc1=R[KP1Q^3o%P`q8nOcYWbNfB!VMi3JlM#rKgL]3&. +L&Qc%KD:&pKDpQ(L&Qf.LPUccM/\?1N/WaVO,oBbP*2#nQ'IZ%R$jD4S=Q7DTV8*TUnsrdW2Zet +Xf\e2Z*L^C[^N]V]">Vh^VI\&_o9U8aN;TJbg+M\dF-Lne^i@)g"P39h;7&IiSrnXjlY^gkiq?s +lg4!*mdKW6naZ2@oCMVRp&Facp\sseq>^ +JcC<$JcFO*o`"gfrqu]krqZWjrV/#>p@e1Po^qbGo'u5E_:f-sbr)3JjqbdGl;#O8j;#3?Q54_#655RM@55n@T:AdoZ:t8P@;u0Al;>iiZ6Pi-S +5s%.j4?Ynl5<_=u6UX=0779[:8P8qTqb@#_s%NJeqb?u`q+pZYi(ruA!Du\m;?'Ji:]=/o:JOVY +:/:=TmSNm[r_W;cr_i_lpJLrgrDWVlr_req!)rShs&8kqrDiku%8p&":eaYX9M%`A6UF*<4r6=C +4#]2[3B8oR1bpd?1I4>m5Wq4j3C*O-5rjrEH]=Y_h]tV2Y +^&u-a^VBcas2"cRr`9&!!*9)!s&AMepJh0ms/@EFVl-DgUnjc[TqS-OSt2C@S!ob4R$X,(Q'@Jq +P*(ieO,f3YN/NUOreU]4LPPk`s+UH*qLeQpqLed#s+UH,!f)SfreYTOMio(2JFrq6 +JcC<$JcFO*oD\afrVZTjs8)ckrqQNf!;?Eb2tZ_4o'u8>n*]T0m-Es$ki_*ijQ#7Xi83;FgY1<3 +f$r0rdEfqWb08,VdaZk$g>1WChV[5Khu;R1iVh[7hscL#MYr>2M#)u+MZ&J4N;gTo_8=+h`;[aP +`qm^Y`l5p+\)Fdg[gKROZa@*DZELI7Xo>@$WW#6^6iTOmNg+I$FEVtXItro?O->clR@9\=Tr+cl +ZF@IE]`,P;]_]>=]]$Ku])B87]`,SE^AYhG^APbF_#;%J_"#8<_Z.ON`;[aT`W4'X`r=$S`r3pY +aN=>%rlP2_"3\p3bPo`bc2Q#_ci)5jd2^T`e(*""f%&0ja2>[,_7mOk^V$\HV4jQSSsYlDOAh0t +Lk^V9K7^5+X/W"lW1SK^S=ZgeVjW]iJ9Z!G?UeF5F\6\&Ll=r&:O.JFNK9EqTUntS:/Fnh;08M. +V2^IpOHl*!S"#t?St`'XX0&P,YHRf,`rH"!r/po?s-*&rqoJZVpW39Qs.0.\s.B=arh9@d!2KLg +!i;ckrhodp!3,psjT"nhn%ek9rkAE4.B08DVl$>fUnaZXTqJ$LSt2C@S!ob4Q^3o%P`q8nOcYWb +NfK*XN/NSmM>rA3L])u-L&Zi&KD0uoKE$W)L&HaFLPUbCM2I1KN/WaVO,oBbP*2#nQ'I]'R$jD4 +S=Q7DTV8*TUnsueW2cl!Xfek3Z*UdE[^WcW]"G\i^VI\&`5Ta:aN;WKc-FY^dF-Lne^rF*g=k<; +h;7)JiSrnYjlY^gkiq?slg4!*mdKW6nc&(\oCV\Sp&F^cp\jmeq>U6fqu6NlrUTr=s/H$K~> +JcC<$JcFO*oD\afrVZTjs8)ckrqQNf!;?Eb,kU^!o'u8>n*]T0m-Es$ki_*ijQ#7Xi83;FgY1<3 +f$r0rdEhcX#ah$KS"-%?StGbMqkP5LI?P5^[DP51=9PkgUAQN!6IQ2m9NQiNKLR/`TQR/<cs3:Pgrm1Sj#LUoFdF$Cje,IkseH4=RfDaD/g=tB;h;-rEhr"Fk +!TE&5D?"MODuH'pQh6UYd*^:jeCE1&f\5'6h;-rGi8N\UjQ5OdkNM0plKdg'mI'H3 +nF?MK!qZ'Vrq6 +JcC<$JcFO*oD\afrVZTjs8)ckrqQNf!;?Eb,kU^!o'u8>n*]T0m-Es$ki_*ijQ#7Xi83;FgY1<3 +f$r0rdEhefs%rMgr)3JjqbdSp:f("d;"QpL55.;A56!kA56!eG4T7MC:]!oa:\@Qa:]45D<;]Yq +;H*NlrDEP\r'UKP)*U8H3]fGe5!;"k5!VG$6q'L46q0[<8k_qV:&Rc\:&Ic^:\IQ@:\7K];?'Ji +:]=/o:JOVY:/:=ToM>N`r)!Air_W;cs&&hor_WAerDNSmrDNVnr`&nrp/1lhr)=&(;c-Ce:JFMW +91h_R6N]Y>5!Am-s#;nq3&roT1GppC1I=Am5<_4k3C#em5&*C&ViLCM[j*rGV^T +rc.mWs)\0]s)e<`rcS6arc\KjH?spard4Zm"FY`IIXglNgJn/Ns.0.\s.B=arh9@d!2KLg!i;ck +rhodp!3,pss1/0>!4i'>s1A9Cs1S9Cs1eWNrkeY8qc3VpnPf0]s/INIW2HPjVPU)`U7n9RT:VXF +S=?":R@'>,Q'IStP*1rhO,o<]NJrgSMZ/J4L]E5/LAuu-K_g>qK)1-"K`?c)L2_p(Ll$tGMMmFP +NK0'\OHG]hPE_>tQ^F/.R[]h*YHY: +JcC<$JcFL)o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nfI>jn*f]3m-Es$l0%3kjQ#7Yi8s24`Prl+]Qrl=fRrPnoZ +qo\o[s2kGebfe3/bl>rdcM,Zad/MGmdg"=Pd`onQ_#D+K]OSI`]re3.TqS*MR?s%uOH>r0$WmprNBTp;m9Ss.'+[rgs.^!20=bs.TLgrM0Lk +VPa?j!iW)tri6"!jo>%jm_Jb8s1U%bWiE%sVl-DgUnjc[TqS-OSt;LCS!ob4R$X,(Q'@JqP*(ie +O,f3YN/NUOreU]4LPPk`s+UK+qLeKnqLeg$s+UH,s+^T1reUZ5MuJZDNK0'\OHG]hPEhE!Q^F// +S"#q>StD^MU84T^Vl-MoX/rG+YctF>['d?O\[f>b]tV7s_SX71`lQ6DbKS5Vcd:(feC<($f@em3 +gtgfDi8ESSj5f=ak32'olKdg'mI'uB!V#XYncJFTo`"Lbp@n=[q#C0iqYU0gr;HTbrdk*Ls*t~> +JcC<$JcFL)o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nfI>jn*f]3m-Es$l0%3kjQ#7Yi89he2UI!gBYDJa92EHQJKG^=X_ +IsuluJV/T.q1SghrlG&[s2t;`!mJp6rm(Mhrm1_od*Vd>#L_)MeC<%!f)F;$fE9g]gYDeas5*e5 +rnmh9DYS)HDZ?(#R.Zg;QMHmISH#/ZT)YD_T`1YbU&^teU]RBiVZ*IpW2ZcqWrK-]s7VTIOT(C< +OtMlYX/`2!W2HPjV50o^U7n9RT:VXFS=>t8R$a5+Q'IStP*1rhO,o<\N/W[QMZ/G6LkgcbLAuu- +K_g>pK)1-"K`?c*LB!#/M#N53MMqIm@?$;.O-#KeP*;/rQC!u+R[]e:St;RJTq\?YVPg>kWiN5' +Y->.9Za@-K\%0&]]Y2%o^r!t,`Q$!?b0/#RcHjkbdaZdtf@S^0g>(N?hr*GOj5]4^k2tmll0@U$ +m-X6?mfDqJrpg-^o^r.U!quB_rV6Egs8)WirVZWmo)=4?WrIS~> +JcC<$JcFL)o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nf[Jln*f]3m-Es$l0%3kjQ#7Yi8X8i;>a;l;>sAl;=$IE55RSE4p!l24nq5@4o[YC:]!ob:\IWa:]F8Z +;tj8i;tEud;u9Jm;>ro[6iBCj4[D.l4$5Yj4$,Si5X@_)7RKX57S$-D9MGF[s%N/]rD*>f!)WSh +p.jL@oMGH_s%rPfs%ikp:/+GX:@V-Q;#a>g;#aDl:]aKl;YR,5XRn,6U=437nH9C8kM`M9h\@\;#a>kBE2]E +B`;`EC'/9hDJoGlrc%jVrc8!ZrcA0`FT-F^G5ladGl2meHN8HlI/nch4o[Xt<<#nsSH#/ZT)YD_ +T`1YbU&^teU]RBiVZ*IpW2ZcqWrK.!\,a):])TDB]E5d\^AbhG^]2(O_SO(*r`8ttrD`;cpJ`]E +WiE%sVl-DgUnjc[TqS-OSt;LCS!ob4R$X,(Q'@JqP*(ieO,f3YN/NUOreU]4LPPk`s+UK+qLeKn +qLeg$s+UH,s+^T1reUZ5MuJZDNK0'\OHG]hPEhE!Q^F//S"#q>StD^MU84T^Vl-MoX/rG+YctF> +['d?O\[f>b]tV7s_SX71`lQ6DbKS5Vcd:(feC<($f@em3gtgfDi8ESSj5f=ak32'olKdg'mI'uB +!V#XYncJFTo`"Lbp@n=[q#C0iqYU0gr;HTbrdk*Ls*t~> +JcC<$JcFL)o`"gfrqu]ks8)ckrV.f8p@e1Po^qbGo'u5s24lT!5nfS +rl+]Qrl=iSr5SiZans6[aoBN^bQ#fdc2>l^ci2;jd::PLaN)01^:h4m]XYPcXf/+iTq@gBQBI>k +O,JdIL4k,,Jul#QW2-2cQ[<_HZFQp(O*$,FDhh,!@X1[`G_D&N:esr:Jr#AIQ("58SPW'U:KCCn +;N.rA3L])u-L&Zi&KD'onKE$W)L&Qi,LB*/0M/\?1N/WaUNfT6_ +OckomQ'IZ%R$jD4S"6.BTV8'SUnjlcW2ZetXf\b1Yd1UB[C3TU]">Vg^V@V%_o0O6aN2NIbg"GZ +dF$Fme^i@)g"P39h;7&IiSrnXjQ>Ufkiq?slg4!*mdKW6nF?)?oCMVRp&Facp\jmeq>^ +JcC<$JcFL)o`"gfrqu]ks8)ckrV.f8p@e1Po^qbGo'u5s-*DEs-)u;q3CiCrg3JI!13\P!13;EqjIGNs-`hSrgNnXqOIVVrgj(\ +!2'+Z"e;!IQ'%4.O>i5ZN/<7?IscNdGB@nFDes0&B4b[a?smDpJUr&ZrlP/^rlY;crltGfrm1Mhrm:eqe'nc@3hZMfoi8FNNphfnpr0[2E +nWs*>s-j([SXobOs.9:arh9@d!2KOhs.o^mrhodp!3,sts/Q1%Xlo`TOnFe9Onk1?OWpj+Wi;qp +Vl$;dUnaZXTqJ$LSXc1=R[KP1Q^3o$PEM)kOT(:ENfB!VMi.Ljs+gZ1rJ(?+s+L6$p4E-ns+LE+ +reCH.!/UW2E/KR4N/`gWO,oBbP*;,qQ'Rc(R@9V7SXuFGTqS6WUo(&gWN*#$Xfen4ZEppG[^`lZ +]=bhl^VRe)`5Ta;aND]Mc-FY_dF6Uqf%8R-g=tE=hV[8MioB([k2tjjl07L!m-O--n*fc8nac8B +oCW%Ts7ZKerV6Egs8)WirVZWmo)=4?X8d\~> +JcC<$JcFL)o`"gfrqu]ks8)ckrV.f8p@e1Po^qbGo'u53r]^NL4ZtnirB:$ArD3;cqbR5g"&D`i;>sDi +:B=9hk>V7Wq,@#e!)ren"&Vro;>ro[6i9=k4?knh3]]Ad5M^2`g2]".dNs1ApK)1-"K`?c*LB!#/M#N6MMMmFPNK&sZO-#KePE_>tQC!u,R[]e;St;UKTqeEZVPgAlWiN8( +Y->.9Za@-K\@K2_]Y2(p_8=+.`Q$!?b0/#RcHjnce'uq!f@\d1gYCWAhr*JQj5]4_k3(sml0@U$ +m-X60n*oi:o()DDo`"O`pAamcq#C0iqYU0gr;HTbrdk*Ms*t~> +JcC<$JcFL)oD\afrVZTjs8)ckrqQNf!;?Eb+nYBso'u5iD.M>iD#M>rA3M>W53^;'Z_!l;akrl"iUqo8HP +s2G8^`5BI.\@DFH!4_s9r3lO2pU9b&&%&[KZ`pa>Y-+n.X/`3e6Ms4I6lVD/E,p#DH$t*nLl7:U +PE_B#S=lOMV5LB![(6%Gr4N*ErOr0BqRZa?n%8S3rk&$RV,9.D0JWnIYg`q:j.5aRuOc]="m`G.Cr5ncUrgWqXs.0.\#G7Z^TqS3T +U].(hV#[ClVZNfrWW&n"X/rD)kPt%foYCC>s1SK6ri.QLW2HPjV50l\TqS-OSt;LCS!ob4R$X,( +Q'@JqP*(ieO,f3YN/NUOM2@%EL])u-L&Zi'KCjclKE$W)L&Qi,LB*/0M/\?1N/WaVO,oBbP*2#n +Q'IZ&R$jD4S=Q7DTV8*TUnsrdW2ZetXf\e2Z*L^C[^N]V]">Vh^VI\&_o9U8aN;TJbg+M\dF-Ln +e^i@)g=k<;h;7&IiSrnYjlY^gkiq?slg4!*mdKW6naZ2@oCV\Sp&F^cp\jmdq>^ +s/Z0M~> +JcC<$JcFL)oD\afrVZTjs8)ckrqQNf!;?Eb+nYBso'u5StDYKT`(PcU24Z@C\qrGD>nGJD>7rEC]8/JPQ$g;Q2d*DQ2Qd[C`E@Uit^BkqX,F*2YMH[UBpJqSi5MN*YmO8"b/Oo(7=O8=t; +O8P%8O7\P3Oo:I@Oo(=APPp[EPOXn4Q2HsIQi!*JQiEEQQh-UARJrQRRJ`NQS,&TTSGo)VSctXP +Q^*_rrfA%YO,SmPK7SN"H$FRTEcGo2CM.3h@q&kT?\JE01k'k!H"^c9H[pWlF)5,tBRNW9;,gac +='oT,84Hik@VBRrEH?DN7n?->78-EM9QPT/IVf"$&T;Z0F`r"SH?jjdIXcp"JqAXNK`K*k`W4'X +aSs<\b5TQabl5iecMZ#gciDDkd/VJndf._qe,n1Of)F8'g"P07rnRP0s5*b4s5Vh^VI\&_o9U8aN;TJbg+M\dF-Lne^i@)g=k<;h;7&IiSrnYjlY^gkiq?slg4!*mdKW6naZ2@ +oCV\Sp&F^cp\jmdq>^s/Z0M~> +JcC<$JcFL)oD\afrVZTjs8)ckrqQNf!;?Eb,4tKto'u5sDi:]F8k;?'VX +;uBVb;Z]ir;uKVn;?&u\6i'1N55dME3BTGhr]L\2`NTN2)@$F1bqEb5X@Os3]K>f5X.Fp4#o/V1b_!:)_*/9M7W95=%V&6UX:08Oc5L8-V[[92&#R:ARcbBE)WFBDlNC +C&_oLCM[keDZ4SRE;jkWEWU6%F8L(YFoHOcG^4T4HN&6oI!pBkJ,MS+4oJ=5;ufkrS,]#YSc52c +T:hjNTq\9VrhTRj!2fan!iW)tri-7)XK8P5\%&uZrOW$@s1JBFr4`3Gs1nZOs&K%ts&JempJ^fc +!3?+!/ZG\HVl$;dUS=HUTV%gISXc1tQC+&-R[]h +JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nf72hn*fZ1m-Es$ki_*ijQ#7Xi83;Fg=k32 +f$r1HaoBKibg4\cf%Jg5hVe@k!93q8rSmX/qhb9/q2,!+mtq%$#JRsf^qmk(_u@UR`V[[Oa8a-_ +`Pf[2_8,uYqRQU8rO;X3!4DR0pU(.2[Bd$@riZL-XK8J(6Mj.G6le^aDK0]=GC"[cL5:bKOHbrq +R%0b?Tq\E`X0K.Frk/0Bs1\HFrOi$>!5.d4rOi0BqRZU:p:UCZaR>7r!:$ND">7H%1R*O-Q0)T3+l`9i"_e;I6&j +V5903O-#NhQ'n/4rLO:iV5L8mXf\b0poqR6s,[;EOHB=$s2k2]oZ?^Gr5niWs-iqV!h>gPrgj@e +TV/!PU8"F^U^*`nVPg>jW2]cr!irE(riPDamD8P4r4i9G/$#\MWMl_mVPU)aUS=HUTV%gHS=?": +R@'A.QBd\uP*1rhO,o<\NJrgSMZ/G6LkgcbLAuu-K_pDmK):3#K`?c*L2_p(Ll$tGMMmFPNK0'\ +OHG]hPE_>tQ^F/.R[]h*YHY: +JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nf72hn*fZ1m-Es$ki_*ijQ#7Xi83;Fg=k32 +f$r1EQNESDS,Sr]StDXJT`1Y_T`(S[D#8#FD#8)HDYJ#CD#\;LPPpa;Q2QsBQ26R7NqA>%NX^u. +Mi*CKMMd4FLPCLLqa:0I*CY-V?=.&KAS#LgCN"36F`r%VI=?]sK8#&:Mi5Y +SHYUTS!]P*rfI,?B8h\*L4Fc&I!9g[F)l59CMINpA7K(W?snVoicHjh^rm(Vlci2;jd07tIe'upurmh8)f\"p4g]$".h>Q41hZ2U5 +D?+VSDZ+GPQM-[BR.ls;QN*EQRf]+NSc52cT:hjNTq\9VrhKdqVP^8hW2Q]pWWK6&XT#?cs6YsF +OSb1?P5gXpX/`2!W2HPjV50o^U7n9RT:VUDS"#k7R$a5+Q'@JqP*(ieO,f3ZN/W[PreU]4LPPk` +s+UK+qh+Hkqh+p%s+UH,E/07*M2@+IMiYd*^:keCE1&g"P08h;-uHi8N_VjQ5OdkNV6r +lg4!*mdBQ4nF?MK!qZ'Vrq-?dp\4X]s7uZjr;6Hjr;H6dJcDhOJ,~> +JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nf@8in*fZ1m-Es$ki_*ijQ#7Xi83;Fg=k32 +f$r/Er(d8f!)`\mqbd;irDEMkofW19!'^0@r]]X2s#g3TqbHu`s%r\lr_WMg!)WYlr`/ttoi(li +oMbZeoMb`erDNer;,TaX6hs+N76pf4(-=ZB5!1tl5X@Y&770L46q9^;8P2TNrD!2b!`)Wgr_WPh +pJ0UAoMGH_s%rPfs%i_l:B!rf:@V-W;"RN`;#=,h;Ya2e;#!od;YO,h<;ohq;Z9N::ej\W9M7rJ +7n,j55X.Lu4$5Yf3BB)X3&EKK2)6pC1.2%+s#r"r3B9&_50JG4: +2E!TY5!MD&2`NiY3BfJe55n1l8j5I*5XIe)6pj:384H*?84cEG92&#R:AIZcB)-*=B`2WIC27X& +rbh[Qs)@sWs)J*Zrc/'^F*%>&rcJ?eGB\=Xrd+Tk!.+Wks*OirJ,MP/55dXo<<&EdRf]+NSc52c +T:hjNTq\9VrhKdqVP^8hW2Q]pWWK6&XT#=(\%&rYrOW$@s1JBFr4`3G"i.sj_GjP(<;KPf<%G#L +Wi;qpVl$;dUnaZXTqJ$LSXc1=R[KP1Q^3o$PEM)kOH5H_NK&mUMi.Lj!f2VereCH,s+L9%nq-ak +s+LE+re>BILkpnEMMd=NN/`jYO-#KeP*;,qQ'[l*R@9V8SXuIHTq\aihlPcHjkbdaZdsf@S^0g>(N?hr*GOj5]4^k2tjkl0@U$m-X6/n*fc9 +rpg-^o^r.U!quB_rV6EgrqcQirVZTloDX=@XT*e~> +JcC<$JcFI(o`"gfrqu]ks8)ckrV.f8p@e1Po^h\Fo'u5FF&@bKntYIOoCOQR$jP< +TqJ3ZX0&_;]`#PC^AYbD]_oAA]^NK2]`5V?])926]`,SE^@]2?_#1qI_!o2;_YqCP`;d^U`5VMk +rl=oUqo8`Yans6[ans9\bl>rdcMc(%cHOAL^q@:k]"GYb\%&cDVkTrZSt;=9QBRGlN/ECDK7JK% +I]99EVl->bUmmU2NJ`V$[@`\BDkMc.='J4A9l,*0EcZ;FH@^m2O-c?/Ski*U:/t4l;kft^V2p^t +OHl*!R@KeD%F^G +JcC<$JcFI(o`"gfrqu]ks8)ckrV.`6p@e1Po^h\Fo'u5[CcE@:Ee]C27^,F*)MKH$ashJq8T0LP^qKooSm0r/gf:r/go= +r/UZ8oT9!5rK@)@qi^uCr/q&Dn=)7nA6)c7>[LrRCN"99H$KF`r"TH?jgbIXZctJV/Q,pOrUdr5ScW +r5elZrlP5arlkDes3:YkcMPred/VJndf._qec+,%f@\a/rnIG-s4mn9h;7#GiSjNKr0I&Cr0[2E +o9KZLR@9S6S"-">rgj@eTV/!PU8"F^U]It8R$a5+Q'IStP*1rhO,o<\N/W[PMM[1GLkktas+UK+qh+Ejr.G!%!/:B+ +CPR_%M2@+JMi3S"-(AT:qsQUnjibVl?\sXKAY0Yd1UB[C3QT\\#Mf +^;%J#_o0O6aN2NIbg"GZdF$FmeCN7(g"P39h;7&Ii8WeWjQ5Oekiq?slg4!*mf)YUnF?MK!V>s_ +p&Facp\jmeq>^ +JcC<$JcFI(o`"gfrqu]ks8)ckrV.o;p@e1Po^h\Fo'u5k;#F,h;#O8k<;ont<:s2e +<:j)h<:j,h;ZBYt;H$FZqa:3JrC$cQ4$sJh;>sAn:Jam_;>jDe;uTbr;uTYn +:]F''9M.oJ7R][05_f3&iiU3&WYl1BB3sr]qqq5!(ec2E*NK1Hdc\3&NTN0.\+c-8$o% +0fCX:0ekOE3''/c5XRmur]'sBr]L0Q"A1jD5=5<:"%,OJ7K,d_84cEH92&#R:A@W`B)Q?DBP1uV +B`;]HC2Eldrbh^Rs)@gSs)S*[rcJ-^"*Sm4H2`*lH[:$brHeWoI=QkF4oIRnE\@K0K])TDB]`5\C^Al"K_t8R$a5+Q'IStP*1rhO,o<\N/W[PMM[1GLkktas+UK+qh+Ejr.G!% +!/:B+CPR_%M2@+JMi3S"-(AT:qsQUnjibVl?\sXKAY0Yd1UB[C3QT +\\#Mf^;%J#_o0O6aN2NIbg"GZdF$FmeCN7(g"P39h;7&Ii8WeWjQ5Oekiq?slg4!*mf)YUnF?MK +!V>s_p&Facp\jmeq>^ +JcC<$JcFF'o`"jgrVZTjs8)ckrqIf6p@e1Po^qbGo'u5\Gs)>])B2=\Fm?'[f3ZB['d_#;"J_"#8; +_YM(P`5T^8`V[[Sa8ijbK.fB^qBZXA\#=][CE98Tqe6PSXGn3 +Q]dMmN/E=CJUr8tI&a*AVPKoZU3Vr`N/NIEJq&2pG&qS8F&-I\I;T.p9;1/!g&P,rK.&A!li:$rlG,]qo\ZTnAtOL +"j!'uR@9TDRfT%Mrgj^oTV/!PU8+KZUnsrcVl-JlWW&muX/u<&s/l@*lMp(ar4r0D!3?+!,,qN= +VPU)aUS=HUTV%gHS=?":R@'A-Q'IStP*1rhO,o<\repl9MZ/G5Lkkq`!/:E*r.Fp!qLSQrr.G!% +!/:B+#)A"jM2@+JretWPNfT6_OcklkQ'IZ%R$jD4S"6.BTV8'SUnjlcW2ZetXf\b1Yd1UB[^N]V +]">Vg^V@V%_o9U8aN;TJbg+M\dF-Lne^i@)g"P39h;7&IiSrnXjlY^gkiq?slg4!*mdKW6naZ2@ +oCMVRp&Facp\jmeq>^ +JcC<$JcFF'o`"jgrVZTjs8)ckrqIl8p@e1Po^qbGo'u58#DD>\2MPP178Q2HmEPlR-LQ2[$@O7&&(NW5%< +O8b.ENK0$YN/NRMrJ1;[:]E@:<\ZBkhO)EcZ;GGC"XbIt<6*KntYHp5o'3rK-f8 +rfI,?r/UZ8oT9!5rK@)@qi^rBrK7/EnW`g6qj.5J!1*JJrg3\PqO%5JrgcNrmh/&g"HAZrnRP0#N":mhV[5LD>A&NPa.O3 +QM-[ER.H[Vg^V@V%_o9U8aN;TJbg+M\dF-Lne^i@)g"P39h;7&IiSrnXjlY^gkiq?slg4!* +mdKW6naZ2@oCMVRp&Facp\jmeq>^ +JcC<$JcFF'o`"jgrVZTjs8)ckrqIf6p@e1Po^qbGo'u5b5!1nh4[21t62j4X779L77Rp'C92>I^!`2`krDsJh;?'Jm:]=2d;>jDe;^#+=;,L.b:J=DR +91_]E770=)5sIRr4$5Ma3B8uV2`VF[pJ_-nri.0AW2HMhUnjc[TqS-OSt2C@S!ob4R$O#&P`q8nOcYWbNfF$s!K2j7M#iEfrIt<+ +re13%r.=crr.=j!re(9*rItN3LkpnEMMqImCQ4@8O-#KeP*;/rQC!u,R[]e;St;UKTqeEZVPgAl +WiN8(Y->.9Za@0L\@K2_]Y2(p_8=+/`Q-'Ab0/#ScHstee'uq!f@\d1gYCWAhr*JQj5]7`k3(sm +l0@U$m-X60n*ol;o()DDo`"O`pAamcq#C0iqYU0gr;HTbrdk*Ps*t~> +JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb+8#0qo'u5ZkQC4;9TqJ6ZVld22\%_gSr4N$@!5/->s1J0>rOi0BqRZU:ot:=P_>V1G^FQCdWiE%sVl-Dg +Unjc[TqJ$LSt2C@R[KP1Q^3o%P`q8nOcYWbNfB!VMi.Lj!f2VereCH,s+L<&r.=`qr.=j!s+LE+ +reCH.!/UW2!K)g7N+J!/O,oBbP*;,qQ'Rc(R@9V8SXuFGTq\hVd>NioB+]k2tjjl0@U$m-X3.n*fc9rpg-^ +o^r.U!quB_rV6EgrqcNhrqu]mo)=4?YQ'+~> +JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb+nYBso'u5Grg*PKrfll4 +pl><6rf6`4r/V/ENJrdRMM[1GM>Ta:7/]RS7Nb3BG["BZ@:Fa&(WI=?a!KS>2< +MN*\nOT1FCP5LI@OS=h9OT1C=Nr+n0OSk7>P5LI>P5^[DOoU^;PkLC>QM-[EQiNKMR/ERfAlWS7S1VR$Nu!OHGTaNK/sSLkgP2IX?BcG'%bDDf'<+Bk:jc@:9h]>MI",sKDJsT:rc\Yd*^:jeCE1& +f\5'6h;-rGi8N\UjQ5OdkNM0qlg4!*mI'H3nF?MK!qZ'Vrq-?dp\4X]s7uZjqtpBjr;H3cJcDqR +J,~> +JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb+8#0qo'u5a;l;>rZV4T7M74RbN/55dYD49/4T:]4#g:]=2h:B45i;>sDj:]=2j +;#jMn;>sSq<;ohr<:Wuf<;fhr<;0>f<;BJj6hs.K7K5g\7m91"4?EF(s#^?G3^*I,!^]7Br^HfV +#"VB\9MSA\rDsJi;?'Jl:]=2d;>jDi +;\`2-:f'q_:/";S8P)HC7R][/5sR\"r]C->#rXXu2`k>s(DCFrb2=G#\n-kD/F0.Df5Mls)A!Xs)A!V"`\R'F)uC#Es-W/GBeE3H38M?H[>[< +s*OisJGDA-;?0YG;ui9aQiWVDrgOIhSXl@DT:hjNTq\]DfJC^&PhG^]2+)<%G&NWiE%sVl-DgUnjc[TqJ$LSt2C@R[KP1Q^3o%P`q8nOcYWbNfB!V +Mi.Lj!f2VereCH,s+L<&r.=`qr.=j!s+LE+reCH.!/UW2!K)g7N+J!/O,oBbP*;,qQ'Rc(R@9V8 +SXuFGTq\ +hVd>NioB+]k2tjjl0@U$m-X3.n*fc9rpg-^o^r.U!quB_rV6EgrqcNhrqu]mo)=4?YQ'+~> +JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nf.,gn*]T0m-Es$ki_*ijQ#7Xi83;Fg=b-1 +aiXG$$HgQ8bg4_ee_&[6ro!h8"6/;!iqSB-MY)c!M?&M%MZ1Bj_#D.N_ScAkrl+lVprEES#04a& +`Pf^4r5&EFr4;d9rj_d7rO;j:q7-F5q6g:2rj)U1ricI*Y,qRhq*b3Nr^QlW+dJR8E-$,EH?ssi +K8#5CO-5TeQ'du2TVJ6XVPpPtZaI@A]`,MC]_T2=]_]8=]`5V?])923]E,^[otULArP&?Jo>14= +q8<3Mrl+cSs2Y)XqSrTWrlOrXqoa0'`l,[-]Xk\b[^WcU\$EEAWM?2[T:D:8Q'7AmOGo$PKn"T" +H[:":VPBr]Tq.ZrF.8l.[]#aZG*8PWQtes*A:/BBFao4,>Yn4WIY!<6OI)H0T2/9W9ib7m;0\e0 +VN$UsOd)0!R[fq>T:r-ZW2m&&Y-7K%\,ZAgs,d9#rPefVs2Y/\rlP&[qoS3G!m-aprg4(]R[T_8 +S=Q4BStD\TT`Lm_rhKpuVPg>jW2ZesX/i?$XTYf1YHY7ts6mf(_#(tE_#;#%XK/A$WMl_lV50o^ +U7n9RSt;LCS"#k7R$X,(Q'@JqP*(ieO,f3YN/NRNM2@%EL]3&.L&Zi(KDgDqJc12uKE$W)L&Qi, +LB*/0M.MR&N/WaVO,oBbP*2#nQ'IZ&R$jD4S=Q7DTV8*TUnsueW2cl!Xfek3Z*UdE[^WcW]"G_j +^VI_'`5Ta:aN;WKc-FY^dF-Oof%8O,g=tE=hV[8LioB([jlYail07L!m-O--rpKmWnc&([oCW"S +!quB_rV6EgrqcQirVZTloDX=@YQ'+~> +JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nepuen*]T0m-Es$ki_*ijQ#7Xi83;Fg=b-1 +rKd8G"IPXISXo\Ns.K=a!,V7DoPF2;mr%c^!1!AG!L8oHQ2R$JQ2[$JQ._2pNW5"ANJrjVMuJS8 +Ll$rd6hs.L7K,dU7j2qu>?tQB@:/9LPq+PrfHu=rK-`6!g&J( +qi:Q7oT8s4rf[2Aqi^rBrK7/Eo9As6qj-oAs-NeQr0[AJrgTOsPlI$HQKFP0Q2m9N +Qj]=NR[]e:SXl@DT:l1W!MZ@gU^O#rVl-JlWN)u!X/u<&"Knr3Yd!KoglX:lX/`2!W2HMhUnjc[ +TqS-NSt2C@S!ob4Q^3o%P`q8nOcYWbNfB!VMi*CKM26tCreCH,s+L<&rIX`orIXs"s+LE+reCH. +!/UW2AVuD)N/`jYO-#KeP*;,qQ'Rf)R@9V8SXuIHTq\aihlPcHjkbdaZdtf@S^0gYCWAhr*GPj5]4^k3(sml0@U$m-X6?mfDqJrpg*]o_nFa +p@n=[q#C0hqY^6hr;?Nbrdk*Qs*t~> +JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nf72hn*]T0m-Es$ki_*ijQ#7Xi83;Fg=b-1 +;,L0h:]F2h9`\!brDNYo!)i_lr_iPR!'L-AoK;J'pce^Sr(m>frD3Dh!)NSjr)*Gis%iSi!`;in +r)*Jpr`/ttlVdd_qGmMoqc!>jqc!G\q*b3Nr^QlW!^8k2r]19G4?Yeg5!(h)5Q=%Z6UaL67nH3@ +7S?BK9MPC[qbH!Dnkf9^!)WMfr_NSjr_3Afo2#6[q+pi^!DcPh;?'Pj;#jGk:]=2d;>jDm;]J\3 +:JOY\9hJ#N84uNF7R]a15sRUq4?GVb3&`hr2-2[n1c$mD1bpjQ5<_7o4ZYSg5<_:r4?GM[3&`]K +2^KCj-8%&1/i#@G1c@6V1c@*;ZB\J;ur;Org4(]R[T_8S=Q4BStD\TT`Lm_rhKpuVPg>jW2ZesX/i?$XTu#4YHY7@\[hXL +s1AaihlPcHjkbdaZdtf@S^0gYCWAhr*GP +j5]4^k3(sml0@U$m-X6?mfDqJrpg*]o_nFap@n=[q#C0hqY^6hr;?Nbrdk*Qs*t~> +JcC<$JcFF'o`"gfrqu]ks8)ckrV-Tkp@e1Po^i(Q)tEFdn*]Q/lg!`ukN:mej5T"ThVHu@g=Y$" +ans-laihoOc-Xqhf%]!;iSieTio9"rMY;o,MY)beMZ(9i_#;(M_ScAks2FuWouI*P"NAC!_nu;e +pq#h&oXOn0rjMj5#-kJ(1rBpBKrC-`Ur'r0$SSiCeFED_RI"6d$M2[OXP*;/tR%'_@TqeEZ +Vl-W%ZaRKY]=Y_gqRc^=rOW*C]D]AB]D9&9]CWZ;]tV7spV6^CrP&?Jo>14=q8<3Mrl+cSs2Y)X +qoA`XrlOrX$H^?/`594#]=GJ^rjFr!['I!>WMH>`SXc+7Pa7GoNfT'TLkC;/I=-EhVkp/^U7e$D +G&j4PWN;k_O)p&DI>Cs,96,>UEI3M%r_P+BI=[00Ng,s%TV#"V92&,^<)cbOTr"TFO-#QjQ^O;4 +SXuFHVP^;mY-"o!YdON-Onlur`rF*VaS3gCa:X]'QC!u+R@0M5S"-%?St;RIrh0[nUSO]^VP^8h +W2]cr!NW=$XTGZ/YPtcms7!l%_#M7G_#M.rXK/A$WMl_mVPU)aU7n9RT:VXFS"#k7R$a5+Q'@Jq +P*(ieO,f5!N!>2tM2@%EL]3&.L&Zi(KDgDoJc:9!KE$W)L&Qi,LB*/0M/S90N/WaVO,oBbP*2#n +Q'Rc(R$jG5S=Z=ETqS3VUnsueWN*##Xfen4ZEppG[^WfX]=bhl^VRe)`5Ta;aND]Mc-FY_dF6Uq +f%8R-g=tE=hV[8MioB(\k2tjjl07L!m-O--n*fc8nac8BoCW%Ts7ZKerV6Egs8)WirVZWmo)=4? +YlB4~> +JcC<$JcFF'o`"gfrqu]ks8)ckrV-Tkp@e1Po^i(Q)Y*=cn*]Q/lg!`ukN:mej5T"ThVHu@g=Y#D +rg*GJ#+1aDR@9Y:r1F"^s.KFerG2@Jqec@Ls)%CEokjA>s)%dRrKI;GplkcDqNh#DqNh,G!0mDH +duOEes,7/>Mi!7HM2;*tq*b0Ms$loV,'A09?!L`D@:E_ZBPD:#EcQ8FG'J=]IXcp#KS,#7Ll..N +qiUi=p5]9:O,s0uqiCB2qiUi?rK6u?rfd;D!0d#=p6GN@op>]Gs-NYNr0RDMpmEIrR@';)P*(ie +NK0!XN/EFJLkL>.I!U![F`hbEE,TN,BP:sf@UT1B86g[pI=-?dGB7;'H[^HnH#mh/BQ%3e5smk; +>XMOuASX_*7n@#tB52:%F*)\Q84Z3>7nlZN8o&g&IV`nuQ^F/.S"#q>StD^MU84T]Vl-MoX/rG+YctF> +['d?O\[f>b]t_=u_Sa=2`lQ6DbKS5VcdC.heCE.%f\,!5gtgiEi8N\Uj5oFckNM0plKdg'mI'H3 +nF5u=o(2JFrq6 +JcC<$JcFF'o`"gfrqu]ks8)ckrV-Tkp@e1Po^i(Q*:`Oen*]Q/lg!`ukN:mej5T"ThVHu@g=Y"T +;,I6fs%`Me"AVcj;H!Km!)i_l!)iJOrB1*CoK;;"s$$EYpeUW\r_`Ge!)`_nqbd;mr`/ttku7R\ +qGmMos&8hpr)j3:ejh^9M7rM8P2ND +8ju0:5X.Ru4ZYVd3]K)XrAO[4!];ekr\H2_5X.Lt5!1ka5X7P!5k%D4$?#*9M.K55uQ^F/.S"#q>StD^MU84T]Vl-MoX/rG+YctF> +['d?O\[f>b]t_=u_Sa=2`lQ6DbKS5VcdC.heCE.%f\,!5gtgiEi8N\Uj5oFckNM0plKdg'mI'H3 +nF5u=o(2JFrq6 +JcC<$JcFC&o`"jgrVZTjs7u`krV.W3p@e1Po^qbGo'u5]DK5@]D/u9]CWZ;]tV7spV6O>o>11Z[C?HLkpnEMMd=NN/`jYO-#KeP*;/rQC!u,R[]e;St;UK +TqeEZVPgAlWiN8(YHY:;Za@0L\@K2_]Y;.r_8=+/`Q-'Ab0/#ScHstee'uq"f@\g2gYL]Bi8ESR +j5f=ak3(sml0@U$m-X60n*olHncJFTo`"O`p&Ojcq#:*hqYU0hr;?Nardk*Ss*t~> +JcC<$JcFC&o`"jgrVZTjs7u`krV.]5p@e1Po^qbGo'u5 +JcC<$JcFC&o`"jgrVZTjs7u`krV.c7p@e1Po^qbGo'u5WKN4755o4TS>TpeU`_s%iVjr_`Mgs&&bnqb[>iqH!Sqr)DoZ +s&Anrqc*GkrBpBKr^HfUr($cX!Bi^H3WV6&r]M#Z4Zb_g5!M;"6:"".7R]m>84Q0A9MGC[nk]9^ +mSE@Lr_`\lqbR2f!)NPgo2#6[peUc^!DcP^;#jGk:]=2h;#jGk:/st\8kM`K8P2NC6q'F,5sROr +4Zkhf3B9#W3&NTM1c$sE0/5+85X7Ou5!;%i3Bo_n5!D%h3&W]Q1bUF%*@WKo/hJh93&!3J1Gq*O +3]oYn6UN^frAb*H4?GYd92%tW57p.J6UF1/7Rp!>7nH9F8kViPnkT3r!+btn?!+u4Cs(DIJ +C2Vh^VI\&_o9U8aN;TJbg+M\dF-Lne^rF*g=k<;h;7)JiSrnYjlY^g +kiq?slg4!*mdKW6nc&(\oCV\Sp&F^cp\jmdq>^ +JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb*;&jno'u51Zcir=u6Mu&>$M#`G2Mj]^VKTYq7uU'PE:i_M26q@Jpr/sH?aRPE,0,s +?='"DF-ro3YH4=[Men0'?tVlJCjo)uI#3hV;,MUgL5M"UR[g$K:ese[:K:=m;,W^RVP]?6Ocu#p +Q^F23SXuFGVPU2jXf\b0o!#D!rK6inrl"iUs2P)Zr5e`VmE#U6fqu6NkrUTr=s0DZT~> +JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb*;&jno'u5r1Nq&rbV=EoP=MEr+teN`rf%nVM2@%CK7JAuH?j^X +G'%bEE,9B+BP1pg@prbPra#P-:KUXs;c6G6ARTh4Kn+SpEGJ]kAkl)[9@mPQ-mIQ2Hs1 +QiEaihlPcHjkbdaZdtf@S^0g>(N?hr*GOj5]4^k2tmll0@U$m-X6? +mfDqJrpg-^o^r.U!quB_rV6EgrqcNhrqu]mo)=4?ZN#F~> +JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb-M6p#o'u5f;#aDm;Z'Dl;#a>k +Y:JUX[r_W&ZnPK3^s%rSgr_NSjrD)r[qb[&`qb@/f;"7B_;#O/i;Z9ED9i"PX +8kVcJ8kMWG7R]d869dh#5X.Co4$#D^2`N]T2Dd6H1c$pC1G^a@1,(Qa1++e;5&3&pmt%6-O54$5Jn9M@uA5=%R66OlOQ7Rop;7nH9E9M.uP +:%D'YAcH<;Ac-0>B)lQCBE)WIBkhF"rb_[Q!c;gmrbVXQr,2UTEr0hWEc_5&"*Sm4GlE!gGlN$j +H@(#:HiSTn4oJ=Q;ZB\Q<<&3_Pl[2;rg41`R[]e:SXl@DT:hmOU8.^`"f8)oVl6ToWWB0%riH4( +YPtd+Ym%GC\[f;_rk&0Bs1JKJ]tOEZh,H)0X/`2!W2HPjV50l\TqS-OSt2C@S!ob4R$O#&P`q8n +OcYWbNfB!VMi*CKM26qBreCH,s+L?'rdsutrdalsrIY!#s+LE+re>0CLkpnEMMmCON/`jYO-#Ke +PE_>tQC!u,R[]h*YHY: +JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb*q]'po'u5(nC +_u7LR`W!mW`V[XTa8X-h`l5m6_7mRm]=YVa[^Q1CDR?^QYH=e"US"-JSsbt6Q'@MrO,o<[LkUJ3 +J:)WfGH,_$CLq!^?!CK7=BS[OH[M-=G]&8)Ck#2mAUI6hHA7GU;,L5@KntbPR[g$H;,0h[=&i3t +<)TBbM2dUZP*D6!QC454SY2RJVPgAmriH1(nZ]4srK6rprPe]Qs2>&Za2e(ur5nBJ*0QMMQ'IZ$ +Q^F/.R[]e:SXl@DT:hmOU8+N[V5F6i&ZD\/WiN5&Xf\b0YHY79Z*L_(s7*qt_#D(K_#D)%X/`2! +W2HPjV50o^TqS-OSt;LBS!ob4R$X,(P`q8nOcYWbNfB!VMi3ILM26tCreCH,!/19&rdt*"pji9n +rdt*$s+LE+re:W4LkpnEMMqImAW;_2O-#NfPE_>tQC+&-R[]h*YHY:< +ZaI6N\[f>b]tV7s_Sa=2`lQ6DbKS5VcdC.heCE.%f\,!5gtgiEi8N\Uj5f@bkNM0plKdg'mI'H3 +nF5uIncA@Srq6 +JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb*;&jno'u5[:TA?t!MSAnPdmCi=<6FERS,&UAbQIY!*'KS>29LkghG +N/`tuO8b7@O8Y+7O8b4@Ont1:Oo:IBOnt7:POat4Q26g;Qi*47Q^3u(Pa%>mO-#?]NK&mVMMd7E +LP18/I!U'_GBJ%LEcQ)9CMRTrARf4Y@:*;G>_-$\<`Dsp:JOSW91qkU>o[m%@9[D`='Ia]9jC%b +?"Ie=84Z6[A8,muF*;g+8,c4&928*+I;E_:D/XH8FEM_MG^+O]H@10jJUrE)KCOZp_Z.OP`;dgR +`qd[Ta9'K+bP]Qac2Prdc2Q#fci2;kdJhSoe,Ro$e^i='f\$2V!SZ<,g]H +JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb,4tKto'u5Ve4$Z(r5smt*7RTX784WYM#>7Z_:/4MZ:Amuf;".9M;#X>l;#=&f:]O;i:@h9Y;#!i_:&n)[ +;$'He;#X5g8cVN`8h*A'7R]d86U3t(5X.Fr4$,J`3B&rW2`3KM1GUaC1,UjE6SUDS1GU^A1&`pa +0f(XC1H.0M2)I*A.2sQZ/h\\.2*d +7n-$@8k_fM9MP%Prac%?rabn;r+>tAs(;4B"DMUdCi')f"`A0oDJa4hD>nJQE;snXE;jhaEcZ>E +F`qqPG^+N4GR&M?H@(!dH[Ga>!'^BFmns-aiD^e[PE_>tQBml)R$jD4S"-%?St;RITqS3UUnjia +rhgL0WN)u!XK8P+Y-5%5Yd(I=ZadNV])92?]E#YE]`,SE^@>2%;t*a>X/`2!W2HPjV50o^TqS-O +St;LBS!ob4R$X,(P`q8nOcYWbNfB!VMi3ILM26tCreCH,!/19&rdt*"pji9nrdt*$s+LE+re:W4 +LkpnEMMqImAW;_2O-#NfPE_>tQC+&-R[]h*YHY:b]tV7s +_Sa=2`lQ6DbKS5VcdC.heCE.%f\,!5gtgiEi8N\Uj5f@bkNM0plKdg'mI'H3nF5uIncA@Srq6 +JcC<$JcF@%p&=pgrqu]ks8)ckrqQNf!;?Eb)t`amo'u5#ZqoA]U +!Q;nT_YM%J]DfDA]DfD>]CWW&\H04NrjE'=Za6m@YX:eR7/fXS7f5dU8H29[8g$cnO`#,ZF*DhS +I!pKmJ:rc:N006eQ'Rc(S=Q4CU7n=[V$EotWj/q<\%)CM!5/*_",>:_YM+J +`;ddV`rR$jA+rfRePNK/mPKnP#*H[0gY +Wi)fpU^='/UOrI"Ql3dZ=(8nWKB96PoG:Jt%eIY/[`Q#pVg^V@V%_o9U8aN;TJbg+M\dF-Lne^i@)g=k<;h;7&IiSrnYjlY^gkiq?slg4!*mdKW6 +naZ2@oCMVRp&Facp\jmeq>^ +JcC<$JcF@%p&=pgrqu]ks8)ckrqQNf!;?Eb*;&jno'u5\;BD>KIkPl$aFQN!6GQM-UDQM6I?OSk16NrP13Nr+eCN/NXP +M2@"CL-n?(7/fXS7f5dU8H29[8hE\ZF'DjT?=72N@V'.aBkqR%Df^#DG'A1VH[U,8 +LkpnHN/`p\rK$u=q2bN:rfR,?qiUi?rfR&?q31B6q3C`@ns;G(Q'IPrOcYWbNK&sWNJi[NMMHq@ +KRnW#I!L!]F`_\GE,]]2CMINrARo:Y?=$oB>_.HUIXQTiG]mWs9`Ia-?!^fB?=.)I?X7&H4A]9I +6<[i577g$@?tqLP +`;[aR`r=!Y`r3sXa8sE*rlbJfbfn90bl5ldcMl/hd/MGmdK%bqeGe%uf`0V)gA]k*g]cHfgYCQ; +rbhForK[>Gs-*JIs-jWW&n% +X/rG*Y-+u-YQV5:ZEpn,s4rejXK/A$WMl_lV50o^U7n9QSt;LCS"#h5R$X,(Q'@JqOcYWbNfB$W +N/NRMM26tCreCH,s+L?'rdt*"p43*mrdt*$s+LE+re:H/M#N6LMMmFPNK0'\OHG]hPE_>tQ^F/. +S"#q>StD^MU84T^Vl-MoX/rG+YctF>['d?P\[oDc]t_=u_Sa@3a2lBFbKS8Wd*^:jeCE.%f\5'6 +h;-rFi8N\UjQ5OdkNM0plKdg'mI'H3nF?&>o(2JFrq6 +JcC<$JcF@%p&=pgrqu]ks8)ckrqQNf!;?Eb)t`amo'u5n>rFGb9rFQ%BrFZ%A!GH6HD#.uKD#S;ODZaruE,bbqs)J*\rcJ-_rHJr]TsQq,@;ks&7uXs,mDHPl?pSQC!u+R@9V7S=TYN%A0;eTq\kWiN5'Y->.9Za@-K\@K2_]Y2(p_8=+/`Q-'Ab0/#S +cHstee'uq!f@\g2gYL]Bhr*JQj5f=ak3(sml0@U$m-X60n*ol;o()DDo`"O`pAamcq#C0iqYU0g +r;HTbrdk*Us*t~> +JcC<$JcF@%o`"jgrqu]ks8)ckrV-Tkp@e1Po^i(Q(@gn_n*TK.lg!`ukN:mej5T"ShVHu@r5eo[ +qoB/eb0/#Rd*pOugkq$cN:Mo+MY)c&MYN,.MYrD._#;(L_u@UR`W!mVa8X0Wa8X'[`Pf[n_YCt: +]CNQ(\HKFO\$`[DZi@<16hs.L7K,dS8,c'Z8c;9]9E.[=S8E1_EcZDLH$k!gIt<'&M2R@VPa%Gu +QBmu1StDUITq\B[VPg>lX0T+?[(!TUqmua(nC_u7MM`Q#d3_8=%& +]tV%d\\#G_[^WWMZE^["MrdQSMIt3*#J:iZ;OI;T2;G^2@JqAQ,L4tJBMkc>oOHPinQC454 +SY)LJVl$DmYH>"oYc[s*On6Kk`V[UR`W*sWa8tQC!u+R@9V7S=Q7CT:hmO +U8"EYUnsrdVl6SpWiN5&Xf\b0ricI/ZEjJ9nGi$prP8?Gr4r9Gs1Tq_WiE%sVl-DgUnaZXTqJ$L +SXc1=R[KP0QBd`"PEM)kOH5H_NJrgSMZ/G5Lkktas+UK+rIb*$rdjZkrdk'#rIb-'s+UH,!JcL1 +M.qj*N/WaVO,oBbP*2#nQ'Rc(R$sM6SXuFGTqS6WV5C/hWN*#$Xfnt6ZEppH[^`lZ]Y(tn^qmn+ +`Q#s>aihlPcHjkbdaZdsf@S^0g>(N?hr*GOj5]4^k2tmll0@U$m-X6/n*fc9rpg-^o^r.Us7QHe +rV6Bfs8)Wirqu]mo)=4?[/YX~> +JcC<$JcF@%o`"jgrqu]ks8)ckrV-Tkp@e1Po^i(Q(@gn_n*TK.lg!`ukN:mej5T"ShVHu@rg<;D +"dk^HS=Z>CCB&)CD#A)ED#/#EDYS)EPPLI?Q2[*KQhZm@Q2Hs@O8P+$G<=?=./O@q91bBPVF$Dfg/HG'A.TH[UBlIt<0&K7s5Ys+gl: +N/`dUOHKC#rfI#>s,d,?rK@/BqNCW;o9B'9pm1iE8sYa.P`q8mP)tcdO,f3[NK&mSM26tCKnb53 +J:2imH$OXYG&q\CE,KK.CM@HoA7]4[@U35C>ChtQC!u+R@9V7S=Q7CT:hmOU8"EYUnsrdVl6SpWiN5&Xf\b0 +ricI/ZEjJ9nGh=,.BBJKWMl_mVPU)`U7n9RT:VUDS"#k7R$X,(Q'@JqP*(ieO,f3YN/NSmM#iEf +reCH,s+L?'rdt-#o76gkrdt*$s+LE+re:H/M#N6FMMmFPNK0'\OHG]hPE_>uQ^F//S"#t?StMdN +USO``Vl6SpX0&M-Yd(L?['mEQ\[oGd^;%J"_SjF5a2lBGbK\>Yd*^:keCE1&g"P08h;-uHi8N_V +jQ5Odkiq?slg4!*mdBQ4nF?MK!qZ'Vrq6 +JcC<$JcF@%o`"jgrqu]ks8)ckrV-Tkp@e1Po^i(Q(@gn_n*TK.lg!`ukN:mej5T"ShVHu@rDW_o +!Du\m:]F2g9a=Eh:f1+h4?W0tq*+Rl;#=&e;#F,e;#*ob;"m`e:/=[a:'FEj:/F\]r_=/( +9hS,Q91hiL8k;ND7Ros<6:4(+r]q2^4Zkef3B0&[3]B#X1GpsF1bgfb1_N/A5tQC!u+R@9V7S=Q7CT:hmOU8"EYUnsrdVl6SpWiN5& +Xf\b0ricI/ZEjJ9s1/0@rO`*@rk&0B!57o%pf$lc.BBJKWMl_mVPU)`U7n9RT:VUDS"#k7R$X,( +Q'@JqP*(ieO,f3YN/NSmM#iEfreCH,s+L?'rdt-#o76gkrdt*$s+LE+re:H/M#N6FMMmFPNK0'\ +OHG]hPE_>uQ^F//S"#t?StMdNUSO``Vl6SpX0&M-Yd(L?['mEQ\[oGd^;%J"_SjF5a2lBGbK\>Y +d*^:keCE1&g"P08h;-uHi8N_VjQ5Odkiq?slg4!*mdBQ4nF?MK!qZ'Vrq6 +JcC<$JcF@%o`"jgrVZTjs7u`krV.N0p@e1Po^h\Fo'u53MYi51M#E2-MXcT+^qmkb_#D1M_>qLQ`;[aT`r=$XaSX$W +`WX9!_o'@b_="r(](ifD\@8rU['d(nG_[OK#^Vdn']t:nd\%'!J\Gip.[Bd*BZ*1=1XfJ=pU7e0OSsu4:Q^=#'PEV,lO,f0TLkUJ3 +IsQEbG'%]%VPL#\TV%a@F)7>A\$WH3PDj=6S:#Qd7<<0kIt@TK"b(rOJUr@NJH^XVJqAW+rIQ&@ +K7el3KV>3:UQ:P"PEhE!S"6(@StW'ZW2d#&YNE'lrrA2G`;dgV`rF*EaT%>TOcklkPa.N"Q^F/. +R[]e:SXuFFTV8'RUSO]^VPg>jWMuntX/rG*Y-+t4Yd(I=rj2X3o)J6rrP83C!5SNIs1\N5-E3rA +Vl$;dUnaWWTV%gISXZ+;R@'A.Q'IStP*1rhO,o<\N/W[PreUo:LPLV=KnY25rIb-%rIONirIP!# +rIb-'s+UK-s+^T1reY0CMiU6fqu-HkrUTr=s0_lW~> +JcC<$JcF@%o`"jgrVZTjs7u`krV.K/p@e1Po^h\Fo'u5J/LD$#ocPl-aBPk^OCQN!6GQ3*>;QMd$DQLKt8OSt7)NrP(= +N;\Y:M26pSq*b3Nr^QfUr^d&\rC[)_s%NGe"*]W+>5hb=?!^uK@q94aBk_@#Df9]=Fa!b.)L6^X +I=?]tJV8`0L5(J;LkpnDMiNaOH,<\ +NrG#9N/NOJM2-h?KS+i*I=6HhG^+CTF`VPCDf'B.C2%FI!][HDfKf>FEi"SH$Xgc +IXcp"K7ej?L&Ssf_Z7XQ`Vd^Ua8X*Xa8a3aaihlObKKb+rltGfrm1Vkrm:eqe'nU6fqu-HkrUTr= +s0_lW~> +JcC<$JcF@%o`"jgrVZTjs7u`krV.N0p@e1Po^h\Fo'u5O,e;?'Ji:B=9fr_W#_qc*Sq +!*9)!qc*2d!`DrqrDEV_q*b3Nr^QfUr^d&\rC[)_s%NGe*^;hJ3B0#Y3]]>_2`a#^4?Yhi4$>_k +5X@Y#6:4%*r^6fW7nl;#=&e;#F,e;#*oc;"mcc:`W;,:JO\] +:/=MV8P)QJ8k_iM8kDNC77]p<6:4%+r]plV5!;"i3]f;^3B$jrs#'m71]B3I1GgmE1c%Ha5<_7n +4$#8a4[2+p4?GP^r\Y!b9qdoP7s(;LKBkqO$C]/&LD>\2PD/O92rc.sW"`\R'F*)O' +Fo?IdGBS1TGl2jfH2`-iHiABm4oJ=O;YF&Q<<&%5OcklkPa.N"Q^F/.R[]e:SXuFFTV8'RUSO]^ +VPg>jWMuntX/rG*Y-+t4Yd(I=rj2X3!4i*?!5&0?rk&3CnPo-Zq,IBo-E3rAVl$;dUnaWWTV%gI +SXZ+;R@'A.Q'IStP*1rhO,o<\N/W[PreUo:LPLV=KnY25rIb-%rIONirIP!#rIb-'s+UK-s+^T1 +reY0CMiU6fqu-HkrUTr=s0_lW~> +JcC<$JcF@%o`"gfrqu]ks7u`krV.Q1p@e1Po^h\Fo'u5 +GBeC[I"$QqJqSf3LPh(Rrfd_TQ^=)0StVjNU&LbkTqnT`VlH\pri6"$&$`LL[C2IK"KkF%(#FVkg)]TV.mGRs/jfS=ZdjU7.0eOI(c3DG+V^H$4RUIu9;@;MpB] +JVT,CP*qf2K7JN*KM5*><10>NTqnEXO,oHfrfmq]S"6.CSu/B`WiW>*YN)jjs8U"#`;[aU`rF*H +aT%;IOHG]hPE_>tQC!u+R@9V7S=Q7CT:hmOU8+N[V5C/gW2ZesX/u<&!NrX*YQ;#7rj2X3!4DCt +o"k:?o"Y4=/uu"PWMcYkV50o^U7n6PSt;LCS!ob4R$X,(P`q8nOcYWbNfB!VMi*CKM26qBre:K. +KS9;Vs+:6$mstCgs+:3%s+CB+reCH.EeoR/MMmCON/`jYO-#KePE_>tQC+&-R[]h['d?P\[oDc]t_=u_Sa@3a2lBFbKS8Wd*^:jeCE.%f\5'6h;-rGi8N\UjQ5Od +kNM0plKdg'mI'H3nF?&>o(2JFrq6 +JcC<$JcF@%o`"gfrqu]ks7u`krV.K/p@e1Po^h\Fo'u5@(WD@:FP*>m-s,d2? +r/CrANK&mTN/[(E8It2urI!g9c +G'7D+>^:[HKR%ZV?uBsr:/X)I='Ag9=CGfXAk?fU?t*_`D/OE:G\(DsAn4G$9MB\YH[L6hHu!P; +EH6,CG'A4WH@($gIt3+LKB%[c_Yq@P`;IUP`rF*Z`r3sXaTBW.bl5fbbQ?&5bl5ldcMl/iciDJm +df.]$eCE.$f@S[.g&9V)g&B_&g&KdmPl6mDPlI$JQLL7@O!TmMP*2#nQ'IZ%R$a;1S"#q=St;RI +TqS3UUnjiaVl-JmWiE,$riH4(YPta,Z*OA8s0Md6o)IO./uu"PWMcYkV50o^U7n6PSt;LCS!ob4 +R$X,(P`q8nOcYWbNfB!VMi*CKM26qBre:K.KS9;Vs+:6$mstCgs+:3%s+CB+reCH.EeoR/MMmCO +N/`jYO-#KePE_>tQC+&-R[]h['d?P\[oDc]t_=u_Sa@3a2lBF +bKS8Wd*^:jeCE.%f\5'6h;-rGi8N\UjQ5OdkNM0plKdg'mI'H3nF?&>o(2JFrq6 +JcC<$JcF@%o`"gfrqu]ks7u`krV.N0p@e1Po^h\Fo'u5rB1*C!'L6Vs%WPipeLW\r_WSkq,%#es%rJd +"&Mch;"7Qc<;oku<)rcor`/eop/Cle!(6QMr^HfUqa^ZWs%3/]s%EAcr_e2k:/+JZ:]=)j:eFF\8d%d\91qkU8,l*]6q0ZF6kD[Q5XRk(4?bni4?GVc3&itt +3!;,u1c.)h1BB?hr\P9E5X7Ou5!;%k3B9>h4[)(q4?5D"2EiiJ-Q=?`/MT+81c@BU2aBSa2)mZY +4?l(t3B0#[1cdW]4\JIC9MA)P5X.M"6psI56q9a:77g'C9M8&R:#f"KA,9a6AbTdGB5)*rCM[d$ +CM[g(Chs#d"E&-sE,khq!HN8ZFT6L\Fp<2:H$Xd^HN&3iHN&9kI/d+B;tEo\;sRE_O!TmMP*2#n +Q'IZ%R$a;1S"#q=St;RITqS3UUnjiaVl-JmWiE,$riH4(YPta,Z*OA8s0Ms;\[f;^\bir?]=beg +nl5*WrDYDMWiE%rVl$;dUnaZXTV%gISXc1hVd>NioB+]k2tjj +l07L!m-O--n*fc9nac8BoCW%Ts7ZKerV6Egs8)WirVZTlo)=4?[f:j~> +JcC<$JcF@%o`"gfrqu]ks8)ckrqI`4p@e1Po^qbGo'u5V"H^&>VD +]`>_E]`>_A]D];@]CEK0\HTIP['?m?q*b3Nr^QcTs%*/]rC[)_s%NDds%WPir_Ol,Zu9f"EcH2F +G'\L`I=?ZsK7nr5L5M%TPa.Q#R[KS6S=lIGrh'apUSFQZVP^8iW2ZetWiQ-#s/l:(s0)X2Za-mD +os=V)!joAErjMg5!42[1s0Dd6[C#q@s0Mj4Za9V9s0+#YYc=V!Wi2kkTqJ-QT:VL>Q^!c#P`q;n +OH>K^Mi*CHL4t/.IXH?`E,fdpV*^lKT:VU@RWrdfS#*Hf]!@rpNcKl8JT"pdF)-8"DgR1tMG$j) +H[gd.Nff]uTV.d?:/4MW2tM2@%E +L]3#0KnP-XKE$Q&JaS'fJcC?#KE$T)L&Qi,LBNEiM2I5jN+@p.O-#KeP*;,qQC!u+R@B\9St;RJ +TqeEZVPgAlWiN8(YHY:;Za@0L\@K2`]Y;.r_8=.0`lH0BbKJ/Ucd:(feC<%#f@em3gtgfDi8ESS +j5f=ak3)!nlKdg'mHs?1n*olHncJFTo`"O`pAamcq#C0iqYU0gr;HTbrdk*Xs*t~> +JcC<$JcF@%o`"gfrqu]ks8)ckrqI`4p@e1Po^qbGo'u5\5BPlI$JQMd$HQN!6DQN*6AQKF5.OSk1/NrP(@MM[1F +q*b3Nr^QcTs%*/]rC[)_s%NDds%WPir_NuGMHX.f>[C`E@:E^FA,g0@B`DiYD/O<5FEMbNH$FU] +I!pHmrI5'&K7SZ/L4tB[L]*#7M26tFM2I.IN;\b4Nr+h4NW>((=atmJI!^3cG]e.> +?sJ#+Km\Z*G&hG(Bkq0[8NBgJ?UIgu@VTRD7r2RCASZ.$F*)\QF`U&D7n-3IDL?eXI=-EXDJa?4 +EccGJG'S=YH[L9lJ:N6(KAM=]_uI[Q`VdaT`rO-X`rO3Zb5TT`bl5lec2c,gcMl,kd*^8?df.\s +eCE+Kf)s[Yg"QDXqq1o$s4Z@prg!MLns;+lO,oBbP*2#nQ'IZ%R$a;1S"#q=St;RITqS3VUnsrd +Vl6PnWiE,$Xf\b0YHY79ZEjJ9!joACo)IO.s/I6AW2HPiUnjc[TqS-NSt2C@S!fY2Q^3o%P`q8m +OH5H_NW+k@Mi*@JLkpicL'!'^K`-Q'K)U>hJGt-"K)L?%KE-`*LB!#3Ll$tGMuJZGNK0']Ocklk +Pa.Q$R$a;2S"-(AT:qsRUnjlcW2ZetXf\e2Z*L^C[^N]V]"G\i^VI\&`5Ta:aN;WKc-FY^dF-Oo +e^rF+g=k?^ +JcC<$JcF@%o`"gfrqu]ks8)ckrqI`4p@e1Po^qbGo'u58c)-Y9DV?^:&n#d:AI]^:*`V09MJ2U:/+DS91qfK +8kDWJ9M8#N8Ol6A84c\3''#X2`nm5J]2)[NfT6_OcklkPa.N"Q^F/.R[]e:SXuFF +TV8'RUnjiaVl-JlWN)u!XKAV-YHP17Z*L\7ZN@MA[Jm]@]",A_]=PTP])]D4<:s/i<;fbo<<&sA +WMl_mV50o^U7n9RSt;LCS"#h5R$X,(Q'@JqOcYWbNfF$s#)e@qM26tCre:K.KS9;Vs+:6$mXY:f +s+:3%s+CB+reCH."GhnkMMqImA;uV1OHG]hPE_>uQ^F/.S"#q>StD^MUSO]_Vl6SpX0&M-Yd(L? +['mEQ\[oGd^;%J"_SjF5a2lBGbK\>Yd*^:keCE1&g"P08h;-uHi8N_VjQ5OdkNV6rlg4!*mI'H3 +nF?MK!qZ'Vrq6 +JcC<$JcF@%o`"gfrqu]ks8)ckrqI]3p@e1Po^qbGo'u5h:N +^\tkJ]tV5Y^&5VE^&PbB]D]>=\H0:Pr4;g:"h2"M[^EL<7/fXS7f5dU8H29[9)hQa9`@cd:&n)h +;#aBP;H)tID/O?6FEMeNGC+U\I=?`uJqSi4L5:kMO->lsQ^XA4S=H1AStVjNTqS6UUSFW^V5L8j +VuEOsVlQkuWiZ0$s/u7&s0)L.r3-1)ricU3ZEpjAZ*4/2s0!HGYdCgFXf&+oVPpAfU7n6QStMO< +Q^F&'QBm`!P5^PZO,f0TLl$q?KS+o,IslWcF`MA8VPU#\St2=:QZd=`R\@?mZD3kPN,k#>Q[Na[ +1es+:3%s+CB+re>-BLkpnEMMmFP +NK0'\OHG]hPE_>uQ^F20S"#t?StMdOUSO``Vl6VqXKAY/Yd(O@[C3QT\\#Mf^;%J#_o0O6aN2NI +bg"GZdF$Fme^i@)g"P39h;7&IiSrnXjQ5Oekiq?slg4!*mf)YUnF?MK!qZ'Vrq-?dp\4X]s7uZj +qtp?irVc +JcC<$JcF@%o`"gfrqu]ks8)ckrqIQ/p@e1Po^qbGo'u5,5re:T1LPL\AL\Zc$M>W82M$AcnMM[.FL]3*FLPCS? +Lkgb?K7ec,JV&B"I=$$+jUI=6KgGBS(L +A7&SeI#*3%H$!t??#==o?r]ca4&K'b>?>3ECh?7>D.7!gCi+06G'\@Sr^R\m9MAc?H[L6hHu!S: +EH-)CF`qtSH2`*mI"-WrJc:;eL&\OYFS:Ci_o0Lk`V[XVa2Z-ua8a6Zb5TT`bl,fdcMu2jcMl/h +dJhSne,Ro(e^i='f\+s1f[p&R!8%5&rn.;*gm%i(s-E;D.#j7JO-#KeP*;,qQ'Rc(R$jD4S"-%@ +T:hmOU8+N[V5C/gW2ZesX/u<&#-P/6Yd(I=rj2X3s0Vj8o`*a0s/ITKW2HPjV50l\TqS-OSt2C@ +S!ob4Q^3o%P`q8nOcYWbNfB!VMi*@JLkpicL'!'^K`-Q'K)U>gJGt-"K)L?%KE-`*L1uF!Ll$tG +MiU6fqu-HkrUTr=s0r#Y~> +JcC<$JcF@%o`"gfrqu]ks8)ckrqI]3p@e1Po^qbGo'u5h:]OAi;"[W_;#=;i +M4$#Ga4$>\j5sX8-):Qr^d)\r^m2a9);3X9E@d[ +r(@Sn91qfF84Z5^\Z:AeZ"Abfp>B4u&Y +C]A/KC]8,MD>nGQE;a_TE<:0&FT-@\F9$I_G5ZXdH$K12s*FZk!IRi0;ZBVj;ZB\b<%*`dO,oBb +P*2#nQ'IZ%R$a;1S"#q=StD[LTq\ +JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb*VAsoo'u5h=H^\Y\E^\PSF]tD#T]DfD@\c98@]DfDA\H'/=\,Wf8Zhd)h7K,dR8,l-[8c;9]9E.]b:&dug +:]=0C;,U:j;cK$(QY^PZEHH;GGBeIZH[:-jJUrE)KS>/8LkpqKOHG`kQ'n)/R[p&KT*h6`T:qpN +T:qsSV>[:iVuEXnWVrh0WN)qtX/rJ0YcOk(W2HSmVl$aN4A$q8b+GNK0'\OHG]iPa.N"Q^F/.R[]e;St;RITqS3UUnjia +Vl-JmWiE,$Xf\b0ricI/ZEjJ9"LPSE[^Pi.o>1C@n\>+.9Za@-K\@K2_]Y2(p_8=+/`Q-'Ab0/#S +cHstee'uq!f@\g2gYL]Bhr*JQj5f=ak3(sml0@U$m-X60n*oi:o()DDo`"O`pAamcq#C0hqYU0h +r;?Nardk*Zs*t~> +JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb)"dFjo'u5B +rf@,@rfI/Br/^u@OHAmkr/U`8!fMqnqF($5-8>[(N@?X[DQA7K.]AnYmnC27[(DZ4VTEs6]0G'J7WrHeKk!e#NHrdP*%JUrE)Jc:8tKDL6* +KnP/5Knb?]LBE9aJqO#Q!.t)urd=ipH$K:3(NaeAF)l;@E,TZ4DJX0+C1qL`@fBau?X6r@ +>$5!0IXQZmH?a[VF(AT^H$kEqJU)&f[naSf_a>)g6@heQ/7c*Q1U@nN/`jYO-#KePE_>t +QC!u+R@9V7SXuFFTV8'RUSO]^VPg>jWN)u!XKAV-YPta-Z*L\7ZNRYC[C3O9s4regWi;qpVl$;d +UnXQVTV%gHS=?":R@'>,Q'IStP*1rhO,o<\N/W[PM2@%EL]3#0KnP-XKE$Q'Ja.dcJcC?#KE$T) +L&Qf-LPYqdDMj@2N/`jYO-#KePE_>tQC+&-R[]h['d?P\[oDc +]t_=u_Sa@3a2lBFbKS8Wd*^:jeCE.%f\5'6h;-rFi8N\UjQ5OdkNM0plKdg'mI'H3nF5u=o(2JF +rq6 +JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb-hR$$o'u5!`f;,C%b +pJ:]`r)Nbts&Jtr!)rkrlVdmb;c?Zk;uT\k7/fXS7f,^U8H29[9)hQa9`@cd:B+,h:`iP4;H$Ln +5;,)W2)dKS2`NcW3]T5]3]fDc4Zkeg4$!:%!BiOD56=):5lFrCHlWs%*,Z% +7W`R779O4779O26pa3=6iTOX6UF+)5=594*BcMI3BB,[4#o>`3B9,[2DmBN1c.'I2`!9H1c7/i1 +f6%n5X.Lu4ZYYc5X%=q4[)"k3]T,U2)I0E/Lqq`,qUW$0K(R>2)mZP2EsGb2`j/c5X@b)76!:g3 +BoYj7SHEJ92%W95X@e+77B^87Rom;r^[2b9M8&R:$>@N=o^b_5P\(PAGg$:Ad`6`AnPdlCMR[#C +23``rbMROrbhaS!,hdSs)A-]F)uC$F8g:[G5HLcH$FT4H2i3iHN8Hk;sI9X;>sJn;ttQC!u+R@9V7SXuFFTV8'RUSO]^VPg>jWN)u!XKAV-YPta-Z*L\7ZN[_D[C3NQrji$>" +hV@U[^ER1<;TVh<%P&KW2HPjV50o]TqS-OSt2C@S!ob4Q^3o%P`q8nOcYWbNfB!VMi*@JLkpicL +'!'^K`-Q'K)^DeJH(3#K)L?%KE-`*L&m'creYNMMihV[8MioB+]k +2tjjl07L!m-O--n*fc8nac8BoCW%Ts7ZKerV6EgrqcNhrqu]mo)=4?\Gq'~> +JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb(\I=io'u5V@ +^&bp[qn)d;r4<0E\[T#T['TWtr^HfUqa^ZWs%3/]s%EAcrCm>g:J^sd!`;inr_kdUSXuFGrLj4cr1O"^s.]Xk +USIg_!i)H^rgsLgT:VUES!f\2Qi<:sP`qAsPEM#gP*(c`NfB!WMi!CMM26q?L4b&-IXQTjG'.eC +E,TWiUnscXSt)=?QBuW0B:>?qYH41WNHV1ZQ?RI]8o/V1=^F6grWMl_mVPU)aUS=HTT:VXFS"#k7R$a5*Q'@JqP*(ieO,f3YN/NSm +M#iEfre:K.KS9;Vs+:9%q1/9jq1/Krs+:3%!ec8]re>9FLl$tGMMmFPNK0'\OcklkPa.N#R$a;2 +S"-(AT:qsRUnjlcW2ZetXf\e2Z*L^C[^WcW]"G\i^VI_'`5Ta:aN;WKc-FY^dF-Oof%8O,g=k?< +h;@/KiT&tZjlY^gl07L!m-O-,mdKW6nc&(\oCV\Sp&Facp\jmeq>^ +JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb(\I=io'u5eAID>'4eQ2?mBQNWV@Q^4!-QMm'KP4k%:OT1I8ORS;3NfF$rs,-\Ar^HfU +qa^ZWs%3/]s%EAcrCm>g:J^sd!`;inr_j,&=BJ^0>5h_1>[C]C?t*RDA,g'AAS5Ufrb2^T +D/O60DfB]9F*.D)s*"HgrceTlH[:!bI/SKnHiSTjI/A?hI/eKmH2`'gH2i'iG'.s+F96K&ErKtZ +DJa9.rbMOJs(D@CBOk[b@prbR?=$lB>$+j,=FP^HI!^0aG^":O@U3/_HA$cqF`D5*Hu!S(=\CeR +<*3Eo='T3JChH1088VdGAnc("EclVPG"G4p7n-0G94rU"I=-E[DK'T9F`qqPGBnI]H@13mJV*lR +k(WiArj2[3rc8!ZqfMdj!iMp6r5JHNs2Y/\!6P5_rQG2arltJg!6tMgrm1Vk!7CeormLr!f%0fO +!S5g#f)=5#f`Km[f`'P(g=VYhQ1pUEN$aOEO,oBbP*;,qQ'Rc(R$jD4S=Q7CT:hmOU84T]VPg>j +WN)u!XT#=+Y-5(6Z*CV6Zi@B4[JmW,s5&kcWi;qpVl$;dUnaZXTV%gISXZ+;R@'A.Q'IStP*1rh +O,o<\N/W[PreUZ3L]3#0KnP-XKE$Q'JbailJ,+WpJcC?#K*$^[L&QgDLPUeDMMd=NN/`jYO-,Tg +PE_>tQ^F/.S"#q>StD^MUSO]_Vl6SpX0&M-Yd(L?['mHR\[oGd^;%J#_SjF5a2lBGbK\>Yd*^:k +eCN7'g"P08h;-uHi8N_VjQ5OdkNV6rlg4!*mI'H3nF?MK!qZ'Vrq6 +JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb(\I=io'u5sAl:[pRC4o7A83rhDA4nh,A4[)(,4TI\C4TJ=W:Adob:ARc`;#X>d;#aDl:]O;j;#3ub +:]aZtg:J^sd!`;inr_jD.J]1c@EP +1+b""*%!6g0eY(11c@BU1,h0W1c@3P4Zu"q6:=:&3]K,[5<_4u9h\5R9Kka.6psI47n#m;7S$$@ +7nZNK9MJ7D:A\5o56*nC5Q+=XVl'H(qdfe@B)H9EBPD0rC]%rIC]8/MD>\;ODZFbUEW1"XF8p=^ +FoHOdGBe@VrcnBeqg/9h!.=T@p/:feqbmDjr_N_p;GpFloMkjL-B4%HO-#KePE_>tQC!u+R@9V8 +SXuFFTV8'RUnjiaVl-JmWiE,$riHC-YHY79Z*OA8s0Md6rjMj:rOE-D\@&]O\%([%s&8kq!*/ts +-`X/EVl-DgUnjc[TqJ$LSt2@?R[KP1Q^*i#PEM)kOH5H_NJrgSMZ/G5Lkkta!el;\rIb-%s+0ur +q1&3js+13%rIY0)Kn]M\D23q(M2I1KN/WaVO,oEdP*;,qQ'[l*R@B\9St;RJTqeEZVPgAlWiN8( +YHY:;Za@0M\@K2`]Y;.r_SX71`lH0BbKJ/Ucd:(feC<($f@em3gtgfDi8ESSj5f=ak3)!nlKdg' +mHs?1n*olHncJFTo`"O`pAamcq#C0iqYU0gr;HTbrdk*Zs*t~> +JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb)>*Oko'u5#s2k8]m>L(`k_fG[ou-XE!64rWp;dEX`lH*;_u@OF_$7]i^V7Cs^uiE/^AknH]`#JB])B8@ +\H9:L[eiJl7K,dR8,l-[8c;9]9E.]a9`e'c:]=/l;,U4LI=HctJV/Q.LPUbCr/1W8NK!js!K`HCP5UUAPQ6p?PR3\\=U@jWN)u!XKAV-YPta3Z*L[AZa@*I[JdQ-s8Be4_#2%I_"5>=^+64_ +Vl-DgUnjc[TqJ$LSt2C@R[KP1Q^3o%PEM)kOH5H_NJrgSMMd7ILkktas+LH+rIb-%s+1#sp4)ph +s+13%rI]!@KnY89LPL\BM2I4MN/`jYO-#KeP*;,qQC!u,R[]h*YHY:< +['d?O\[f>b]tV7t_Sa=2`lQ6DbKS5VcdC.heCE.%f\,!5gtgiEi8N\Uj5f=akNM0plKdg'mI'uB +!V#XYncJFTo`"O`p&Ojcq#:*hqYU0gr;HTbrdk*[s*t~> +JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb)>*Oko'u5nGND>ogqPkLC?QL^C2QMm'KPk:+$OS=h9N<5&sMu,pA7K,dR8,l-[8c;9] +9E.]a9`e'c:]=/l;,U,=BToJ='/R->5hb+>manD?t*MO@:E\UAH$-EAnPaiBkqJ^ +C]A2UD/O91E,]i;r,MgZFSp7]FS'VVFE;JBqf)RQ!,qjS#]+?oCMRa%BkmTZ"D)+T@q5LI#@V"I +?5hVI-jL4=;`CM$shA5?Do4&Z&B(1CEUBP_ +Er:"VF9AA8Undk,q8WHTrlG&\rlb;brltGf!mf0;rm1Vk!7CeormUks"4l)Tf)F5!f)OA%f_aA% +g=;GfQ2HsIPq@oQN/`jYO-#KePE_>tQC!u+R[]e:SXuFFTqS3UUnjiaVl-JmWiE,$Xf\b0ric[5 +ZEggC['[6KrO2G"rK7&?lB2(-/Wl-pWMcYkV50o^U7n6PSt;LCS!ob4R$X,(Q'7AoOcYWbNfB!V +Mi*CKM26rdLAur-K`-Q'K)^DuJG+KhJH(3#K)L=>KS>,7L51P?M2@+JN/WaVO,oBbP*2#nQ'Rc( +R@9V8SXuIHTq\ +JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf!;?Eb*q]'po'u5s%iSgr(m>fpJ:]`r_`Acs&&Vh!`;cjr(m2d!`)it +r`/ttku7RZmo06aqaCEPr^QcTs%*/]rC[)_s%NAc!_uNer_NYn;H!Km!E<(us2DmBO +2E<]U2`WiX3B0(u3<2,>497N+r]('A3BB1u3WV?)r&jsAs$-?Ds#ps#p?D%Qum83]fDa +3]fAa3]]>_r\sp92Z>WA2)[9I1GpsF1Go%f>r4>n1,M6[5!M1m4?>M_3']Vi5o=opfL54^uBV50o^A7YXM!bQ(Yqe#qCC&2TDC]8/KD>nGPDZXltEW1"YEr^=] +FT?U^GQ)jcH2`-hHiJKf;ta,e;u0Dl;>j;o;,U:j;tj6CMi3S"-%@ +StD^MU8+N[V5C/gW2ZesX/rG*Y-7i/#dL\@Za7$G[C,tAs1&3@\[VRF!k#JHrD`_oj]!b1WMcYk +V50o^U7n6PSt;LCS!ob4R$X,(Q'7AoOcYWbNfB!VMi*CKM26rdLAur-K`-Q'K)^DuJG+KhJH(3# +K)L=>KS>,7L51P?M2@+JN/WaVO,oBbP*2#nQ'Rc(R@9V8SXuIHTq\ +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb+nYBso'u5$GNGCM[g&Df0K2 +F)uJGF`qqQGBeCZH@(!dIXZcqJGt*#KnKAXs+LZ4L51S?M2D4hrep`6rf%/ANK&mTMi*GlMZ8P4 +L]`EgM2D4e#Dn1hKS4u2Jc:00IXHKiH?XOQFE)8;Df0CjU0aLbS=H(;P`g'+BpG0aVOaolS +r4X\]WMcYkV50o^U7n6PSt;LCS!ob4R$X,(Q'7AoOcYWbNfB!VMi*CKM26rdLAur-K`-N'K)U>u +JFe9fJH(3#K)L=CKS>,7L51P?M2@+JN/WaVO,oBbP*2&pQ'Rc(R@9V8SXuIHTq\?YV5L5jWiN5' +Y->.9Za@0L\@K2_]Y2(q_8=+/`Q-'Ab0/#ScHstee'uq!f@\g2gYL]Bhr*JQj5f=ak3(sml0@U$ +m-X60n*oi:rpg*]o_nFap@n=[q#C0hqYU0hr;?Nardk*\s*t~> +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb(A.4ho'u5 +rg*ML!1)\^lYH*.qJ?7ND>BIrPk:7@QLC1/QMm'KPkgI)OReG4NrG%$F]t>ZY$0>$G37>?b?:>[:Y7?OU=N@prhVA7]@a +AnPcUB)cKIBkV3oBPR>5_PcIXQTkH?j^YG&qY4?<_VuI=?KlI!0OJCKjhQ>?=]t8OPm05X/CI?=[ec6qU'g@Us(e +DK'Z>G'S@O8H)-Z7fQ.&93Q[hI!pBiD/XB5F*2VLG^+L[I!U3jJ:`B*K7r<>rNZC.rNlKDqf2UU +r,_gY!29A1r5JiZ`l?'uaT'?^b5BH^bl,fcc2l8:rm(YmdF%sArmUks!S#]uec"(ufE0aYf`'S( +g=__fP6-u6Q2[*LPpqTKN/WaVO,oBbP*;,qQ'Rc(R@9V7S=Q7DTV8'RUSO]^Vl-JmWiE,$riHC- +YHY79Z*OA8s0Md6r3l>!rfR#;LPUeDMMmFPNK0'\OHG]hPa.N" +Q^F20S"-%@T:hmPUnjibVl?\sXKAY0Yd1UB[^N]V]">Vg^VI\&_o9U8aN;TJbg+M\dF-Lne^i@) +g=k<;h;7&IiSrnYjlY^gkiq?slg4!*mdKW6nF?MK!V>s^o`Fj]p\jmeq>U6fqu6NkrUTr=s185\~> +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb(\I=io'u54T%A>55m_?4T@PE:\miV:]F8g;>O,h:\[cc;?'Jk:]F5k;>j;k:]4>n +J`3]T/Y3]T8^3&rrZ48V&33r_5>3X.T*3BB2]3W1o> +3]AuUr\jg8r\YHJ1GgsE2)I*I2`EQO2`3EK1,LaB5X5638if's4#f2a4Zu"n5!M1m3]T/Y2)[jrD;LPUeDMMmFPNK0'\OHG]hPa.N"Q^F20S"-%@T:hmPUnjib +Vl?\sXKAY0Yd1UB[^N]V]">Vg^VI\&_o9U8aN;TJbg+M\dF-Lne^i@)g=k<;h;7&IiSrnYjlY^g +kiq?slg4!*mdKW6nF?MK!V>s^o`Fj]p\jmeq>U6fqu6NkrUTr=s185\~> +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb(A.4ho'u5?b?;?!^lpBonNpD/K8is)7mVs)\lpGBe@VG'8(SH$O^_I!^6gI=M*Es+1<'J:RWMrIXlu +rdc/?J:N3'J:N)tI=-HjI=6HeG]n7NEH#l8EGfW1CM]^DTO+.\SXc1?PEL!+C6k?\]Ul+'Q][/K +CPdb5I[Y[f9PJB]I=#g[:k+@bM,$uHN.?S=NffWsS=uUD;,0e[9h\Pd:lqNaYl=(fn,DhSQ2d'MQ'@O4Q1pUFQFd+k`;[[G`9tPC`;dgS`rClHMijWN)u!XKAV-YPta3Z*L[AZa@*I[JdN6\+]k% +_>(hG^])%@^\b`!WMl_lV50o^U7n9QSt;LCS"#h5R$X,(Q'@JqOcYWbNfB!VMi3ILM26qBL5(D9 +K`-Q'K)^E!JF\3eJH(3#K)UE&KE-`*L&m'creY!>MiaihlPcHjkbdaZdtf@S^0g>(N?hr*GOj5]4^ +k2tjkl0@U6ljN4Kn*fc9nac8BoCW%Ts7ZKerV6Egs8)WirVZWmo)=4?])R9~> +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb(\I=io'u5?b98r`fb9?XR2J?sd8L@K'a9@0'hIqIKS:!b>eNrac%?s'uLKA7]=_AS#C`A7K-I@UEPQ +?sd;L@:?b64=]eg0=&s]rH[L0cG^":RFE1kt>Bb@=LO"5nFDkr&=__Se@")e#LC]@cd0tc +dJ_Mme,Iksec4.uec42#fDaD(f@\aSf`9b'PQ7!)Pl$[DPlI$KM(FRDN/`jYO-#KePE_>tQC+&- +R[]e;St;RITqS6WUnsrdVl6SpWiN5'Xfel,YR%M>ZEpmE['d=?[K*f1s8S5TOR\J1O>*Z4Vl$;d +UnaZXTq@pJSXc1=R@'A.QBd`"PEM&iO,o<\N/W[QMM[1GLPLV=KnY3YKE$Q'JbsugJ,=crJcC?$ +KE$T)L&Qf-LPYqd?]'c#N/`jYO-#NfPE_>tQ^F//S"#q>StMdNUSO``Vl6SpX0&M-Yd(O@[C3QS +\[oGe^;%J#_SjF5a2lBGbK\>Yd*^:keCN7'g"P08h;-uHi8N_VjQ5OdkNV6rli-5YmI'H3nF?&> +o(2JFrq6 +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb(A.4ho'u53&pmr!B<+= +2\J#*2DdFC-5!;"j4$,D]5Wq7p5!;7q4#o>\ +2`di_KMWqcWl$s#pEGrB1*C!'^!=s(24Bs(;=Fqe#qCC&VlICB/,KC]/)K +D>nGPDuObUEWC1[FS^.ZGQ)jcH2`-hHN8Hmj>k;?'Pn;u]hsM(FRDN/`jY +O-#KePE_>tQC+&-R[]e;St;RITqS6WUnsrdVl6SpWiN5'Xfel,YR%M>ZEpmE['d=?[f3S"-(A +TV8'SUnsrdW2ZetXf\e2Z*UdE[^WcW]"G_j^VI_'`5Ta:aN;WKc-FY^dF-Oof%8O,g=k?^ +JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb(%h+go'u54=^#!5>[1Q@ra-:GLgFq_ +P%ff7P%ncLDf'B1DK,Sp$?1!*F`VYHF`qtPr-/9gG^045r-/NnG^+LZG^=UZGQ)h+GBS1RGBe:S +F`_VDE,KT5D/F')Cn@5jSXZ.?rgH$AP`h/lO,]*VL4b)LT<#/^OGS*pK85Y4DIud>G"[(/;LhP@ +KoM0k:K17iKR\T/NKB?lSY)RICJdi%9MPLc&;HdKTVJ]jQ'IZ%R\'ML#bRcaUo:5mY,qW+ +iNN=LrU0UPrU9fOr0@2Er078JqNh2J])Us3m)/kAs2G#X08PIAMMmFQNfT6_OckomQ'IZ&R$jD4 +S=Q7CT:hmPUSO]^VPg>jWN)u!XKAV-YPta,Z*OA8s0Vg6rO2a8q#CB1pqZ=4qn=2OVl$;dUnaZX +TqJ!KSXc1=R[BJ/QBd`"PEM)jO,o<\req5CMM[1GLPLV=KnY3ZKE$Q'JbsuqJ,4WlJ,=crJcC?$ +KE$T)L&Qg?LPUeDMMmFPNK0'\OHG]hPEhE!Q^F20S"-%@T:hmPUSO`aVl?\sXKAY0Yd1UB[C3QT +\\#Mf^V@V%_o0O6aN;TJbg+M[dF$Fme^i@)g"P39h;7&IiSrnXjQ5Oekiq?slg4!*mf)YUnF?MK +!qZ'Vrq6 +JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb(%h+go'u5$G6:?!dM;&7B6I=`edkDK9i#=BJ^.>$Ci. +!a8f4r*0G3>[1TA?XNe="'o5>@/OC3@/XI4?jC%F?[@;5s',M,r`T)"#(1cEH$Xa\rcV.] +F)c2dgeYH[o/rj)O0!H<&WEr9qWErL(X +Er0qX`;IXR`rO3[ao0E_b5TQabl5lacMu2pd*^:ie'c\De,%Snec45#f)jUVfDaG%g&KdVPkpUD +PV7iLM2I4MNK0'\OHG]iPa.N"R$a;1S"-%@StD[LU8+N[V5C/gW2ZesX/rG*Y-7i/!O8s0Zi@E4 +[JdQ6\+p"'On+V+Oo(4_W2HMhUnjc[TqS-NSt2C@S!o_3Q^3o%P`q8nOH5H_NW+kEMi*@JLkgb? +L4t>7re(6&s+1&tr."Qlr."Tos+13%re(6(!/:E,BSVD#M2I4MN/`jYO-#KeP*;/rQC!u,R[]h< +StD[LU8+N\Vl-MoX/rG+YctF>['d?O\[f>b]t_=u_Sa=2`lQ9EbKS8WcdC.heCE.%f\,!5gtgiE +i8N\Uj5f=akNM0plKdg'mI'uB!V#XYncJFTo`"O`p&Ojcq#:*hqYU0gr;HTbrdk*]s*t~> +JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb(A.4ho'u54=^#!5 +>[1Q@ra-7F4"rNS5!M+l4?#,U2Dd9N2Z5W82@)0!2E<]S2`Q.h'=oMS)>P^M`4oRPE4[/O'!G,mBB*2g[AnM$T#\[pdC2.O"C23``rbVOMs).gSrc.pX +!-A-]s)n?`rcJ9cGBa"1rd"Hgs*Ocn!*9)!pf.5koMYWdqGR)cs&/kq08PIAMMmFQNfT6_Ockom +Q'IZ&R$jD4S=Q7CT:hmPUSO]^VPg>jWN)u!XKAV-YPta,Z*OA8s0Vg6rO2a8s02j8['d.9Za@-K\%0&]]Y2(p_8=+.`Q$!@b0/#ScHjnce'uq!f@\d1gYCWAhr*JQj5]4^ +k3(sml0@U$m-X6?mfDqJrpg-^o^r.Us7QHerV6Bfs8)WirVZWmo)=4?]DmB~> +JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb)>*Oko'u5`>'MrT]hMuLcs`qm[O`r*dU`r=$YaSa0Zb5KH^aSs6[`<=)q_ns:`_=rohNqeV2 +^Z<-.]`c![]=GKO7/fXS7f,^U8H)3Z9)hQa9`@cd:B+,h:^9iq;H$Ln<)rou!EWD&=TM]1r`gON +?=.&I@:E\UHWjR1NejgBQ\:StD^NVQ$Pq +XKA\0Yd",1iirIMr9jOPr:'WKs-3\NQ'@O/Q2d0IQb<@\`9Y>?`&>SiLl$tGMi[f,Q'IStP*1rhO,o<\N/W[PM2@%DLPCP;KnTDW!ePuSqgeWppO<$i +r.+fus+:6&F+f7$L5(J=Ll$tGMiaihlPcHjkbdaQ^rf@S[/g=tH>hVd>NioB+]k2tjjl07L!m-O-- +n*fc8nc&(\oCV\So`Fj]p\jmeq>U6fqu-HkrUTr=s1JA^~> +JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb(%h+go'u5 +Q'LrVj)"!rpMBMgrg3YNqj%,GrKmPO!13SMqNq#Dr0@2GrGD(@hN7_trf7#;r^?`Sr^QcTs%*,\ +rC[)_s%NDds%`Sir_Nhs;GpFl<)clsQ.kO?!^lF?t!MR@q/2'Anu(-Jp1pIEH?5F +GBd.j=BSd1=]nr-=U826=^#$7>?Y2+>5qe6>[(E8=^"s1=BSc('G7;H@gTqJp^j.=]ng-EcH*qEWC+Y +Er:"Y`W!mU`rO3[ao9K^b5TQcbg"E0cMu2kd*_d>rR:er!7UqsrRLo!!nc,Vrn.5's4Yncqi`mm +Ll$tGMi +[f!Q1Vkp2bUS=HUTV%gHS=?":R@'>,Q'IStP*1rhO,o<\N/W[PM2@%DLPCP; +KnTDW!ePuSqgeWppO<$ir.+fus+:6&F+f7$L5(J=Ll$tGMiaihlPcHjkbdaQ^rf@S[/g=tH>hVd>N +ioB+]k2tjjl07L!m-O--n*fc8nc&(\oCV\So`Fj]p\jmeq>U6fqu-HkrUTr=s1JA^~> +JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb(\I=io'u57rIY0'JV!]KrI=Qjr."Wps+13%re#9FKnY89 +LPL\BM2I4MN/`jYO-#KePE_>tQC+&-R[]hYd*^:jeCE1&f\5'6h;-rGi8N\UjQ5OdkNM0plKdg'mI'H3nF5uIncJFTo`"Lb +p@n=[q#C0hqYU0gr;HTbrdk*^s*t~> +JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb)"dFjo'u5E,)Mr]cjM[.AFaN)?b?;?!^lF?smDP@Uiq[AWNX7>CT^^BRtAKI%-:^SnMeOMi<[WOcu"*Q2R!KQi=?^VPL#_ +U7n9RT:VUDS"#k7R$X,(Q'@JqP*(ieO,f3YN/NRMM26tCL5(D9K`-N)Jq8LMJGt&jIf4coJH(3# +K)UC:KS>,7L51S@M2@+JN/WaVO,oEdP*;,qQC!u+R[]e;St;UKU8+N\VPgAmWiW>*YHY:b]tV7s_Sa=2`lQ6DbKS5VcdC.geC<($f@em4gtgfDi8ESSj5f=ak3(smlKeH9$gmBNn*ol; +o()DDo`"O`pAamcq#C0hqYU0hr;?Nardk*_s*t~> +JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb(A.4ho'u5?kE=?=.&I?t!MR@q9.^E-u4i +@7NphAQ`5FG]\(T>?tHNDK'T:rcS'\q02a]20jCiG^"@TG'$__<)Zap;cH\#>$G3TG'/%WGDCHl +I!BaOCM@!TCM.L%@8L'*7m0C57R]fG70,kHr^7MhAm]7iDI[9lCi434FEMnTH$*"T7n3JJ*DK1$ +?@.'GH[L6gD/aE7F*2VLGBnI[I!^0hIt3.LKA)%ZXoP[)YkkX(ZN%92Du4MQEV"5MF8j/Y`r=!c +aN;QHb0.rLai_d*b6H28c-FY\c2Q#gciVVCdJ_Joe'e6E!7Lhqs4%,#qUbc"rRh2)c]nHn0p79H +Ll$tGMi7rIY0' +JV!]KrdXQhrI=`qs+13%re"puQ^F//S"#t?StMdOUSO`` +Vl6VqXKAY/Yd(O@[C3QT\\#Mf^;%J#_o0O6aN2NIbg"GZdF$CleCN7'g"P39h;-uHi8N_VjQ5Od +kNM0qli-5YmI'H3nF?&>o(2JFrq6 +JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb(\I=io'u5EBR4RP<+4PMsn:A@Zb:\mic:\R]`:\moc;>a5j;>WTU4p!lB:B";m4T7GB49.P";uT\p7/]RR +7f5dU8H29[9)hQa9`7Ze:/=[b;#aAm;Z9TB<)lq!<``C*=]np4>?kE=?=.&I?t!MR@q9.^6q0Bn +1FFA!2(UL?r]U]T5!;(h3]]>a4Zu"+4TI\E5Q*eG5Q3nJ5Q3eT5!;(l4>erP2)R0G1c5.os$%Pg +5WhgFs$$BG +r]U?I55@GCB)uUWral.Crb2.CrbMOMs)%dR!,_^Q!cN$src.sZs)\uQ^F//S"#q>StD[LTqeEZV5C/gW2Zes +X/rG*Y-7i/!O8s0Zi@E4[J[K5\,Wi8[KO"H[^Wa;;uK\jKnY3YK*$XUJbsusJ+S3gJ,FisJcC?$K5$!mKnb>;LkpnE +MMmFPNK0'\OcklkPa.Q$R$a>3S"6.BTV8*TUnsrdW2cl!Xfek3Z*UdE[^WfX]=bhk^VI_(`5Ta; +aND]Mc-FY_dF-Oof%8O,g=tE=h;@/KiT&tZjlY^gkiqBurp1$[mdKW6naZ2@oCMVRp&Facp\jme +q>U6fqu6NkrUTr=s1SG_~> +JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb,4tKto'u5'1aiMNn`W4!V`rF*Za8j?Uap#o.a2l<@rl+oUs2+iRqnWJo +Mi3OQNK*gqrOr?C^VBc^p5S(Gs1AHG\O8ja7K,dS8,c'Z8c;9]9E.]a:&drg:]=2j;#jMn;u]es +[:ZB?XI2L@U`hXrad*^B5!p-<*G9$QMI^U^Oe/_OVRi+iRJN3J +Pk^LSPa7]+Un*m^XIZGDJRDhlrE_^?DJX#tObAaTKkPgX?rB`pE)()"G]/+/;M9sgP)b +N)>%]NKKEnS"6:IT:8YQ91qrP<)ZeXSt2JPT`:epUPt>!Q'@T$Q_'cISd:s^Uo12kXKAVpYNN.h +m/QJKmf2bQnG\UNPQ$dHQ2?gDQ2R$KQ2d0MQbWR^`9>)sKnbA=M2@+JN/`jYO-,TgPEhE!Q^F20 +S"-%@StD^MU8+N[V5L5iWN)u!XKAV-Y-5(6Z*CV6Zi@E4[J[K5\,$(!_!&Nd^8Im+Unjc[TqS-O +St2C@S!ob4R$O#&P`q8nOcYWbNfB!VMi*@JLkph@L4t>7re(6&s+1)urdXKfrI=`qs+(0%rIY-( +L&Qg?LPUeDMMmFPNK0'\OHG]hPEhE!Q^F20S"-%@T:hmPUnjlcVl?\sXKAY0Yd1UB[^N]V]">Vg +^VI\&_o9U8aN;TJbg+M\dF-Lne^i@)g"P39h;7&IiSrnXjQ5Oekiq?slg4!*mf)YUnF?MK!qZ'V +rq6 +JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb(A.4ho'u5$G6:?!^iE?XR;O@UisJAKPMs +BRG+u9Q+6V8RPXn:1\!O<*O'RFF8@[Lj",iG'3A!s*+Kd$?p`CH$>!nH$s%/rD`#W>$"X= +B52-j<*`X!5@KrfA7oXpCM7G'\IZG">+m7RomB9MKJQH[L-d +H[UKnY3ZKE$Q' +Jc(&tJ+A'eJ,FisJH1<#K)pXZre>*ALl$tGMi^ +JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb)"dFjo'u5h!)`\Xr]^3DrD!>lr)Ne[r]C-@s#^3B +hbsSS6q$uBr^QfUr^d&\rC[)_s%NAcs%WPir_WVl!)ieps&8tur`0&$=T2G5>$G6:?!^iE?XR;O +@UisJAJJfiBM(rT1dF#]/2Jq./i,=B1c@6Or]10E5s7Fsr]^r]^?Fs$$HF4Y\TH1c$jA +1G^jG2Dm7n?9F8P;`M9MFtNk=u"\qHNi#$X$Y:>?Y694Ztnj4S_/? +55RPE55@DGAnPagB)ZHDC&2QNCM[d&Ci+$,DJfAj!cN$src%pZr,hmYs)e9`!d8d3rHS['mEQ\[oDc]t_A!_Sa@3a2lBF +bKS8Wd*^:jeCE.%f\,!5gtgiEi8N\Uj5f=akNM0plKdg'mI'uB!V#XYncJFTo`"O`pAamcq#C0i +qYU0gr;?Nardk*`s*t~> +JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb+nYBso'u5fmcHjh`da?Fg +cd'c*MXu\cM?&M#M@#3bbfe/NaN2EBn](OJ!Q`C\b5TQrb0.uNb/q`Fa2Z*;`l5m6_SZ8fs,-c5 +s,?f6r4W32[Jmu@^]2%CN<#""^AkkI^-qogr^QfUr^d&\r(?u^!)3>cs%WPirD3_r;GpFl<)cls +Q.k_?!^lF?t!JQ@Uiq[AS,RgBPD3s$4p-<-;2A@=NoUML^;4 +Lj=:EH/8Ll$tGMi7re(6&s+1)urdXfor-eHkrdXls +s+13%re(6(EJ9.%LPL\BM2I4MN/`jYO-#NfPE_>tQ^F//S"#t?StMdNUSO``Vl6VqXKAY/Yd(O@ +[C3QS\[oGe^;%J#_SjF5a2lBGbK\>Yd*^:keCE1&g"P08h;-rGi8N\UjQ5OdkNM0plKdg'mI'H3 +nF5uIncA@SrUg6cp\4X]rqZTjqtp?irVc +JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb'D1neo'u5Er0R>Iqj%1sqeZ+Gr/q)5N;f">OoLO5OT1@BO@9%9 +r^QfUr^d&\r(?u^!)3>cs%WPirD3_r;GpFl<)clsQ.kE?!^lF?t!JQ@Uiq[AS,Rg +BPD3s9hKbPD>m0CDdIHV8k;QD7Ti)G93c"5B4PUfBjLXCs(`ZrM33gQMfrrT;NY[*BPqTu?s-3- +@:3MP@q/;0:."qI%V&jN?:77P77M01Bi.N7re(6&s+1)urdXfor-eHkrdXlss+13%re(6(EJ9.%LPL\BM2I4MN/`jYO-#NfPE_>tQ^F//S +"#t?StMdNUSO``Vl6VqXKAY/Yd(O@[C3QS\[oGe^;%J#_SjF5a2lBGbK\>Yd*^:keCE1&g"P08h +;-rGi8N\UjQ5OdkNM0plKdg'mI'H3nF5uIncA@SrUg6cp\4X]rqZTjqtp?irVc +JcC<$JcF=$o`"jgrqu]ks8)ckrqQNf!;?Eb)>*Oko'u54T7DB4RbH-4Qnm+:]!le:]=2f:]=,f:]=,h:]+&g;$'Qk;>EBO55n=W:B=9j +q,[>Qs#U3CiDT_ErC-]Tr($`Ws%3,\s%<>crD!;e!)NPi#>nAs;c?XpVKGi +?XI2L@:E\UA7]=aB4tsmC25pn912*)1c.EU3\2m:0.82!+sA0\0eP4:2)I2i1&`jB2Dm?Y7n#X2 +3]K,U7l<+Y1bpa;/M&IP0c)Mu0f1dH,pjre0JPFB.kE8(0020V2)kIu#r"(i1,:pS5<_@35nZUR +7RT3s3]K/[5XJ"78kViO:&[id56""M7/fXT7LVgX7n?0C8P2WL91qtF:$GFQ>52>%=q4b?>$G07 +>?kB;5!D1q55m\I5!;%mrB:0EoKN=frb)4Ds(VLJ!,;FI!,MRMrG;p[D/F0.DfBZ8EH6."FT6C^ +ErL+[FT$@]GQ)jcH2i0nH$Xd`Hhg_B/8Ll$tGMiKnY3ZKE$Q'Jc(&tJ,=]mIJ\KmJ,Oot +JcC?$KE$UEKnb>;LPUeDMMmFPNK0'\OHPcjPa.N#R$a>3S"6.BTV8'SUnsrdW2cl!Xfek3Z*UdE +[^WcW]"G_j^VI_'`5Ta:aN;WKc-FY^dF-Ooe^rF+g=k?s^o`Fj]p\jmdq>^ +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb)YEXlo'u5imc-O__rmLhn +!mc^[mu$UkeVaCN"O506b/sY(r5\NNrl5)]aiXG's31Mds2tA`!m&F&rPeoX`5DPjr/1H2s,?l8 +qnE*D"/`E?_>D%J^\a#iNrP1&^&YhE7K,dR8,l-[8c23\9E.]b:&dug:]=/l;,U$G39>[:\8?T);#@U`hXAS#IcB4tsmC27U$D,XG6S:6HXO.96N=H\_rHZN.d,7L51TaM-l-uN/WaWO-#KeP*;/rQC!u,R[]h['d?O +\[oDc]t_=u_Sa=2`lQ6DbKS5VcdC.heCE.%f\,!5gtgiEi8ESSj5f=ak3(smlKeH9$gmBNn*ol; +o()DDo`"O`pAamcq#C0hqYU0hr;?Nardk*as*t~> +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'D1neo'u5reY!>Mi.9Za@-K\%0)^]Y2(p_8=+.`Q$!?b0/#RcHjnce'uq!f@\d1gYCWA +hr*GOj5]4^k2tjjl0@U6ljN4Kn*fc9nac8BoCW%Ts7ZKerV6EgrqcNhrqu]mo)=4?^]/f~> +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb(%h+go'u5F&_;>*0N56"CS:BFEo?kE=?N+:_?t!MR@q9.^ +AnG[hBPD3sCM[iO4?H7r6UF101c.!R5sILn0JY76/M/M32>K$-.0V1M-o*S5r\=U20JP=rA+d;2)dW[3\rcU3]m7#.6'RX5sIk391qrQ9MA)E5sn%. +77BU67Rp!>7n?6D8kM`M91qrQ9hnIK:$bUT>Q.h)>6%q)>6%k+>6.u5rET:a!'^BHpce^@s$$*? +rau4Erb;=GrbMIKrbW*^D/F0.DfBZ8EH6,BFT-=]ErL.[FT6L`G5HL`GQW5;H?oL9!.=NAs&K(u +oMbQ`p/1]b14t76L5(M@M2I7NNK0']OckomQ'I]'R$sM6S=Z=ETV8*TUnjiaVl-JnWiN2%Xf\b0 +ricI/ZEjJ9s0Vg6qR-C5rO)X5oi(fgpJq/krDP;FV50o^U7n9RT:VUDS"#k7R$a2)Q'@JqP*(ie +O,f3YN/NRMM26tCL5(D9K`6W(K)^E"JGt&sIe\?hIf=iqJH(3#K)UB,KS>,7L51TaM-l-uN/WaW +O-#KeP*;/rQC!u,R[]h['d?O\[oDc]t_=u_Sa=2`lQ6DbKS5V +cdC.heCE.%f\,!5gtgiEi8ESSj5f=ak3(smlKeH9$gmBNn*ol;o()DDo`"O`pAamcq#C0hqYU0h +r;?Nardk*as*t~> +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'_M"fo'u5N2. +MuSb8NVpNg]`XOoYe9nMqnN9JNK*gq!KW?-^AknG7K,dR8,l-Z8c;9]9E.]b:&dug:]=/l;,UT)PAkU84KFP*D5sQC+#/Sc52cTV%pPVPpJpri?1)Y--cfm]c`V!:0LJ +s6]gR!:TpTrpTmVrp^!XrK?r>r0.8JPa(j+!1(M%ou-L?rP\NLotp^Gs+<4_KnbA=M2@+KN/`mZ +OHG]iPa.Q$R$jD4S=Q7CT:qsQUSO``Vl-JmWiE,$Xf\b/YHY79Z*O>7s0Vg6q6p2#qS;7./\\'W +UnaZXTqJ$LSXc1=R[KP1Q^*i#PEM)kOH5H_NJrgSMM[1GLkg_>KnY3ZKE$Q'Jc1,uJ,OihIJnWo +J,OotJH1<$KE$T)L&Qg?LPUeDMMmFPNK0'\OHG]iPa.N#R$a>3S"-(ATV8'SUnsrdW2ZetXf\e2 +Z*UdE[^WcW]"G\i^VI\&`5Ta:aN;WKc-FY^dF-Lne^i@)g=k<:h;7&IiSrnXjQ>Ufkiq?slg4!* +mf)YUnF?MK!qZ'Vrq6 +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'D1neo'u5;ERJ`NJD#8)J +D"2<>D"MTDD#A/ID";BAR0&bBR/NBLQMHmFQMm0@R/<6JQN*6AD#S8RPEM,nr/q2HGCPC0r0./D +rK./CCi&oalB)%,r^HfUqa^ZWr^m&\s%EAcr_:>[1Q? +?=.&I@K'^e@q9.^AnPdjBkhF!Ci!s+DJr3B9h\3+@nM&cDK9rHHsTB:91hiM8kVcKE;XVPD>nAM +C]8&XBl%a-Df8-:8P2QHU9i5YPH[>[ +s+<4_KnbA=M2@+KN/`mZOHG]iPa.Q$R$jD4S=Q7CT:qsQUSO``Vl-JmWiE,$Xf\b/YHY79Z*O>7 +s0Vg6q6p2#nW<1$/>]/*ALl$tGMiaihlPcHjkbdaQ^rf%8R.g=tE=hV[8M +ioB([k2tjjl07L!m-O--rpKmWnc&(\oCV\Sp&Facp\jmeq>^ +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb(A.4ho'u5:>[1Q??=.&I@K'^a@q9.^AnPdjBkhF!Ci!s+DJq^&4?Ybu3''Z"6:=:46T[._1G^jE1B''4 +5X.M!5Q!eH5PIDs5?Y5/>Q7t->6%q->6.u5qHWhZ!^8h5 +oKN"6s(D@Fs(VFH!,MIJqeZCPDf>Vo"`e[*FEDU&ErU4\F9$I_Foll2G5c[lG^4R\H$O^^H[PKe +s&K(uoMbQ`ohk]ds+<4_KnbA=M2@+KN/`mZOHG]iPa.Q$R$jD4S=Q7CT:qsQUSO``Vl-JmWiE,$ +Xf\b/YHY79Z*O>7s0Vg6q6g@3[C-"Boi(fgpJq/kr)5/CUnjc[TqS-OSt2C@S!ob4R$X)'P`q8n +OcYWbNfB!VMi*@JLkph@L4t>7re(6&s+1-!rdXlqomQdfrdXlss+(0%re(6(!/:E,BSVD#M2I4M +N/`jYO-#KePE_>tQ^F//S"#q>StMdNUSO``Vl6SpX0&M-Yd(O@[C3QS\[oGd^;%J"_SjF5a2lBG +bK\>Yd*^:jeCE.%f\5'6gtgiEi8N\Uj5f@bkNM0plKdg'mI'uB!V#XYncJFTo`"O`pAamcq#C0i +qYU0gr;HTardk*bs*t~> +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'(kedo'u5`8.M=uhuM<'QkM>W5=da6=cc-=JVbK7iHr5\TPrPo,`ai_fMbfp%1s3(Pfb0'_*s2Y2\rl4uW +!6"knqMP<2r/:W8r4`$@"GN&4XLeAIr5&$Lu2!F9%2?NjhG@U`hXracXQB4tsmC27U$D/O60E,flZ[RJrW]N/`m[OH,HgR@EfBq4mta%\]MbS=#V-P`UlbNK0!Xr/:l=R@0M5S"-,KSc>8^ +TTK/;'9e]JR$aA5SXuFFSt;UKU8=ffWrB(%Xfek1bch34kiqC3lhp,Jm/ZSRmf;eSn,DeWnaQO? +!KrTEP5(7=Pl?pJQM6Z^s7=2$_u@UK_tLtI_uG?IKS>/9Ll$tHN/WdXO-#NfPEhE!R$a;1S"-%@ +T:hmOU84T]VPg>jWN)u!XKAV-YHP17Z*CV5Zi@E3[J@9/s80Un^EUCfUnaZXTqJ$LSXc1=R[KP1 +Q^*i#PEM)kOH5H_NJrgSMZ/G:Lkg_>KnY3ZKE$Q'Jc1,uJ,OigIJnWpJ,FfuJV&LQK*I!_Knb>; +M#N6FMMmFPNK0']OcklkQ'IZ%R$jD4S=Q7DTV8*TUnsueWN*##Xfen4ZEppG[^WfX]=bhl^VRe) +`5Ta;aND]Mc-FY_dF-Oof%8O,g=k? +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'_M"fo'u5R/`NQR/`NNQMt_$DZ+GIC]\I;Pl?mG +P5URID0:5[Nr"t>P5LFBDYJ#9OT1CA7K,dR8,l-Z8c;9]9E.]a9`e'c:]=2j;#jMn;u]esL'YPtd)Z21d+Zi4h>DYJ)JE;aeVE;jkTEWX>&a83mVap-&5 +bg"GYc2>lecN)>hd/_PmdJ_Jne,7_peH"2"fDjJ+f@\a/g$t=#POt+5PQ-mIK/SC:L51SAM2R=O +NfT6_P*2#oQ'Rf)R@9V8SXuIHTqS3VUnsrdVl6SpWiN5'Xfek2YctC;ZMh-0[/RK/[f$0rOR821 +U`ZA+TqS-OSt2C@S!ob4R$X)'P`q8nOcYWbNfB!VMi.Lj#)J%hL4t>7re(6&s+1-!rdXlqoR6[e +s*srs!eGrTrdtE.KnY89LPYqdBo7h-N/`jYOHG]hPEhE!Q^F20S"-%@T:hmPUSO`aVl?\sXKAY0 +Yd1UB[C3QT\\#Mf^V@V%_o0O6aN2NIbg"GZdF$CleCN7'g"P08h;-uHi8N\UjQ5OdkNM0plKdg' +mI'H3nF5uIncJFTo`"O`p&Ojcq#:*hqYU0gr;HTardk*cs*t~> +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'(kedo'u5Q.k.?!dM;"^kbJ@UisJAIrHdBP;*p +CMRa'DJjB3EH-$u4TIVD3s7Z-3(lpC9)hVo!-8!Y!-8$ZrcA-_ +qf_s_qKW-hI!kNds&K(upeq/lr_rSip/1ifs+<4_KnbA=M2@.LN/is[OHPcjQ'IZ&R$jD4S=Q7D +TV8'RUnjiaVl-JmWiE,$Xf\b0YHY79Z*O>7s0Vd5q6p:1!OfE0;uK\ireY?HMi.9Za@-K\%0&] +]Y2(p_8=+.`Q$!?b0/#RcHjncdaZdtf@S^0g>(N?hr*GOioB+]k2tjjl07L!m-O--n*fc8nc&(\ +oCV\Sp&F^cp\jmdq>^ +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'(kedo'u5c"jYH@d>3VS +M=uc(M><%tM>c3DP;bf\&KaSa*X`r!gUaT'?_b00Y+!mJj2rlY8_s2Y;_`lH*r +M?&M4MZ/M6MZ/P4N;gQc]a&_6OI`D]_o)AgqnW?L_85l,o"G4>^:Zo67f,^T8H29[9)hQa9`7]c +:&n)g:]aKl;Z9Sq<)rous&T\4=]np3>?kE=?!^lF?t'%D"_2(SAS,TSBFeflCMRa'DJjB3EH-#? +FEI@Y!EN+s;Zp'"T:__SSHG@MS"&W0!1NnV"eD9XSt;MPSd:sZSt;RGStM2EPQmD>R$a>4SGo)c +T:VXITqS9[WW&psX8o=#Y5k`GYQa.NkNM0qrp0LKrU'CKr:'`Lr/q#B!L&]APPgXFQ2HsEQ,N\& +_t1h=_uI[K_tLr'JV/T.KnbA=M2I4MNK0']OckllQ'I]'R$sM6S=Z=ETV8*TUnjiaVl6SpWiN5& +Xf\b0rilF-!4)R0s0Vd5q6p5$r4qC.s.ga3U7n9RSt;LCS"#k7R$a5*Q'@JqP*(ieO,f3YN/NSm +M#iEfre:H-K`6W(K)^E#JGt&tIe%pdIf=iqJH(3#K)UB'KSBD[A;>ttM2I4MN/`jYO-#NfPE_>t +Q^F//S"#t?StMdNUSO``Vl6VqX0&M-Yd(L?[C3QS\[oGd^;%J"_Sa@3a2lBFbKS8Wd*^:jeCE.% +f\,!5gtgiEi8EVTj5f=ak32'olKeH9$gmBNn*ol;o()DDo`"O`pAamcq#C0hqYU0gr;HTbrdk*c +s*t~> +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'_M"fo'u5"IY^ICi&rb +qJ>8/qJ>YQggCAQN3?JD>nGMD>\5MPl?jHP5:@I@r$.4K8YnUqigo? +rfR1tqeZ=LnrNs7OH2j07f,^T8H29[9)hQa9`7]c:&n)g:]aKl;Z9Sq<)rous&T\4=]np3>?kE= +?!^lF?t'%D"_2(SAS,TSBFeflCMRa'DJjB3EH-#?FEI@Q!DQ2b9E@d\r-JEkrH\Hhl[&SVrH\]q +I!g9eH@(#;cHXY[c2Q#gchu2j +d/DAkdK%bneGn)!f)O>'f[naSf`0V)POk%2POt+5P;@cBK7nr5LPUeEMiStD[LU8+N[V5C/hWN)u!XK8P+Y-7i/s02R0rNlO2rjDR1r;ZAMm?.FE+/>R(TqJ!KSXc1= +R[KP1Q^*i#PEM)kOH5H_NJrgSMZ/G5Lkkta!JQ4+KE$Q'Jc1,uJ,XofIK"]pJ,OotJcC?$K)pXZ +re=s=Ll$tGMiU6fqu-HkrUTr=s2"_c~> +JcC<$JcF=$p&=pgrqu]ks8)ckrqQNf!;?Eb'(kedo'u5?kE=?!^lF?t'%D"_2(SAS,TS +BFeflCMRa'DJjB3EH-#?FEICC!BrXE3s%H)3VuGL9)_KI9)M<`9M8"S9E%Wb9ajZ^6psI377B[7 +6UXBB8H20\8P8tR"%l3Z9`@]_9ug$.=8uA(=^##)>P_V)>Pqb+>Q6k_497T-qE=[=!^Ak4pcemF +B4kmkrb;FKqeZ.HrGM^UEW1"]EcZ8ArH%s[!-S0^s*+Kf"aP?;H$O`7HiR1<R(TqJ!KSXc1=R[KP1Q^*i#PEM)kOH5H_NJrgSMZ/G5 +Lkkta!JQ4+KE$Q'Jc1,uJ,XofIK"]pJ,OotJcC?$K)pXZre=s=Ll$tGMiU6fqu-HkrUTr=s2"_c~> +JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf(&%=no^qbGo'u5h.?PdJhJlc3;J:bK@rJouI!Os2b;abkfQcbfe3/b5]Q`aSs3^Mi*CMpko$. +rf$l8rP%s<"`f0SS>`mq_u%=F_>]JnO8b4@OnZTi^&PbD7f5dU8H29Z9)hQa9`@cd:B+,h;#aAm +;Z9Sr<)lrtQ.k.?!dM;"^kbJ@UisJAI2s]BP;*pCMRa'rb`']E,flqLK_CpFjK7ei2L51SAMMmFQNfT9aP*;,qQC!u,R[]h7re(6&s+1-!s*surnU:CcrdXlss+(0%re(6("GMSbLPYqdA;Z;(N/`mZOHG]hPEhE! +Q^F20S"-%@T:hmPUnjibVl?\sXKAY0Yd1UB[C3QT\\#Mf^V@V%_o0O6aN2NIbg"GZd*^:keCE1& +g"P07h;-rGi8N\Uj5oFckNM0plKdg'mI'uB!V#XYncJFTo`"O`pAamcq#C0iqYU0gr;?Nardk*d +s*t~> +JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf(A@Foo^qbGo'u5>b%:QqjIMQrKuo;pm;&Lqj@ALrbhFH!,h[N!,VUuoofSgC3"WOM37_!qih#B +rK6nmrbV7hs,[+Jr($`Ws%3,\s%EAcr_RM$"dg`BPD3sCM[keD@1<$EH-#?FEDYKGP+Z/9)qZ`9*e6b9M.rN9M8"W9DqK^8bu$f +8P;ZJ8P)QJ9j;:SH2)^bHiJBlIJnWpJc13#KE$T)K><3=WWK6&XST%!Y5PR$Z1tWtDZ=YTE;=GF +E!(*DP/dF@!6P5_#Kt?8c-=PYcMl)gcMu2nd*^7fdJhMldJqYpe,Rnte,Ihsebn"sfDjM'g&@3- +Pk1+8Pl-^FPk^FqJ:W?*KS>/9Ll%"IN/`jYOHG]iPa.Q$R$jD4S=Q7CTV8'RUSO``Vl-JmWiE,$ +riH4(YPtd+YlM*.Zi7?1[JRE2s7;?=OW^HpU7n9QSt;LCS"#k7R$a5*Q'@JqP*(ieO,f3YN/NSm +M$AckL5(D9K`6W(K)^E#JH(,tIdqjcIf=iqJH(0#K)UE&KER!`L51TaM.DL%N/WaWO-#KeP*;/r +QC!u,R[]h['d?O\[f>b]t_=u_Sa=2`lQ6DbKS5Vcd:(feC<%# +f@em3gYL]Bi8ESRj5]7`k3(sml0@U$m-X6?mfDqJrpg-^o^r.Us7ZKerV6Egs8)WirVZTlo)=4? +_Z,,~> +JcC<$JcF@%o`"gfrqu]ks8)ckrqQNf(&%=no^qbGo'u5RM +$"dg`BPD3sCM[keD@1<$EH-#?FEDYKGP=6(5*q-3Z"!*fD,r`f1]rB1*Cs$$9Br''m? +s%WN+"DDLaC2T. +rilF-!4)R0rj;X3qmQI1q,7;n;uK\i['d?O\[f>b]t_=u_Sa=2`lQ6DbKS5Vcd:(f +eC<%#f@em3gYL]Bi8ESRj5]7`k3(sml0@U$m-X6?mfDqJrpg-^o^r.Us7ZKerV6Egs8)WirVZTl +o)=4?_Z,,~> +JcC<$JcF@%o`"gfrqu]ks8)ckrqI<(p@e1Po^qbGo'u5]AUTK(V6e#:`;[XK_>M+JNW>.>OT(C<^&l!\]`(Cu8,c'Z8c23\9E.]a9`e'c:]=2j +;#jMn;u]es[1Q@?=.&I@K'^>@q9.^AnV*V(27N!CM[j*DJsK5EH-#?FEDYK +GB\:Wn5L*%<)lms;,L7i;H$Ik;c?[s<`N*srDESm#@;+fLR=m6VuEXpWW0"!Wr/suWrfB)Y5PQ5 +Yl<_`jo4BGkNV6rlKeH9qs=COq="7NqNCl@"-Se0P5UUDPkpUBPQI,9Qi5#*`rO3$s89e2`9+u0 +_Z,-BJV/T.L5(J>M2I4MNK0']OckonQ'Rc(R@9V8SXuIHTqS6WUnsrdVl6SpWiN5'Xfeh1rilF- +!4)O/rj;U2rO2\)ot]t0s1TVOUS=HTT:VXFS=?":R@'A-Q'IStP*1rhO,o<\N/W[PreUZ3L]3#/ +KnTGXs+:9%rIFotrdO^ +JcC<$JcF@%o`"gfrqu]ks8)ckrqIB*p@e1Po^qbGo'u5J)6 +C[l6:D>%cK?nGED#eJQD>]XkP6dCS=D2YuIts*]P5(7@ +P5^U@D>e;GOT1C@7f5dU8H29Z9)hQa9`7Ze:/=[b;#aAm;Z9Vp;ufqt7=BSd1>$G6:?!^iE +?XR=A@Kg7PAS#Idrb*']C27U$D/O60E,]f:EcZ>EF`qtQG^8dP"AMQa9M>@Ys%E8`rCm;d9)D0a +;-.+?G^b,@J,artJGt,rK)L?$KXZ[3WWB0%q5jY"ric@+r3?%&oPXVGrc%^PqJcCsrfR?(aiOJ' +s2tAbrlkSkc-FSXrlkPjd*U2;d/D>ldehMne,\%rf)F;$f`0Y&PPUOM2I4MNK0']OckonQ'Rc(R@9V8SXuIHTqS6WUnsrdVl6SpWiN5'Xfeh1rilF-!4)O/rj;U2 +rO2\)q2kQ;!0HW2s,\A!US=HTT:VXFS=?":R@'A-Q'IStP*1rhO,o<\N/W[PreUZ3L]3#/KnTGX +s+:9%rIFotrdO^ +JcC<$JcF@%o`"gfrqu]ks8)ckrqI<(p@e1Po^qbGo'u5Yn8n;>j>W:]F8d;>F&g4oRY84o[_7:]Eie8P;cQ;H36fqH!SYqEF^Ts&8tsr^QfU +r^d&\r(?u^s%NAc!_uNer_WVl!)ieps&8tur`0S3=BJ^/>$>-8>[:ZB?XI2LraH%@A7]=aBDuQ[ +BkhF!Ci+'-DfBZ8EH6,BFEMbNGBeE&4T[l355[MB3rD&B4[2.p4o.5E4[;>%7nH;M8cVN`9`%H_ +9_D,m:AIrk=T2G'>52=p>lIss4oRYA4oISD5Pn+[9k\6UC27X$C]/)HD>nGUE,ou?qf;XV!-J*\ +s)nBdrcnEfrHeKj!.=]Do2YchpJV&kr_rPhqbdBD1P(12KSG5:Ll%"IN/`jYOHG]iQ'IZ%R$jD4 +S=Q7DTV8'SUnjiaVl-JmWiE,$Xf\b/YPtd+YlM*-Zi7?0[JdN6Zi7?.;uTbr<<-"m +JcC<$JcF@%o`"gfrqu]ks8)ckrqI9'p@e1Po^qbGo'u5amYUIk +(1:KU?!Pt2e^W$pd*U+acHXSVbK@rJpW*-P!QrX_c2YufbPoZ`ao..tMY;u.N;S\4^@o5?^AbnH +@g$t9U9D9.`;[[R_YCtH^]9DoO8G(:^&YhF7f,^U8H)3Z9)hQa9`7]c:&n)g:]aKl;Z9T"<)lq! +<``@)r`K8*>Q.k.?!dM;-X^@l@UiqZAS#IdBP;*pC27U$D/O60E,fl;M2@+KN/is[OckllQ'I]'R$sM6S=Z=ETV8*TUnjiaVl6To +WWoN*Xf\b/YPtd+Z2_-.Zi.9,[Jg-u_!\u:^)s)CTqJ$LSt2C@S!ob4Q^3o%P`q8nOcYWbNfB!V +Mi.Lj!JlO1L&m!]re(6&s+1-!s*t#smX>(`s*suts+(0%re#KLKnY89LPUeDMMmFPNK0'\OHG]h +Pa.N"R$a;1S"-%@T:hmPUnjlcVl?\sXKAY0Yd1UB[C3QT\\#Mf^;%J#_SjF5a2lBGbK\>Yd*^:j +eCE1&f\5'6gtgiEi8N\Uj5f=akNM0plKdg'mHs?1n*ol;o()DDo`"O`pAamcq#C0hqYU0hr;?Na +rdk*es*t~> +JcC<$JcF@%o`"gfrqu]ks8)ckrqI9'p@e1Po^qbGo'u5s).^upQPQ?!0dC_"ClJ$L5l"loooB$Lu2!F9%2?RK5i@U`hX +A7]=aB4tsmC2.O"Ci+'-DfB]9EcZ;DFEMbNGBeCZH@,9Xnk0Hd:K(:t?=IM\D/j]DI=_3 +S"-(AT:hmPUSO]^VPgAlri-1'XKAV-Y-7i/s0;U0rNlI0q6g2$qN0s(rfA4rTqS-OSt;LCS"#k7 +R$X,(Q'@JqP*(ieO,f3YN/NSmM#iEfre:H-K`6W(K)^E#JH(,uIdVX`IfForJH(0#K)UCJKS>,7 +L51SAM2I4MN/`jYO-#KeP*D5sQC+&-R[]h['d?O\[f>b]tV7s +_SX71`lH0BbKJ/Ucd:(fe'uq"f@\g2gYCWAhr*JQj5]4^k3(sml0@U$m-X3.n*fc9nac8BoCW%T +s7ZKerV6EgrqcNhrqu]mo)=4?_uG5~> +JcC<$JcF@%o`"gfrqu]ks8)ckrqI?)p@e1Po^qbGo'u5$Lu2!F9%2?RK5i@U`hX +A7]=aB4tsmC2.O"Ci+'-DfB]9EcZ;DFEMbNGBeCZH@,9IniRCF5!M:u6:4./77Kg>8ke5=^J=c/ +q,dMts'#5&pfmf)r`oJ-lokA4q)n^ApItU$rbDFJrbMaTCi!s*DZ4PSE;OYRErL+^FEM_JrcJ9c +GB`n.rd"Nj!.=WBo2YchpJV&kr_rPhrD>+qJ:N6(K8#&7LP^kFN/WdXO-,TgPa.N#R$a>3S"-(A +T:hmPUSO]^VPgAlri-1'XKAV-Y-7i/s0;U0rNlI0q6g1-qc!JnoMtfgrDW\n+/5I&TV%gISXc1= +R[KP0QBd`"PEM)kOH5H_NJrgSMZ/G5Lkkta!JQ4+KE$Q'Jc1-!J,XobIK"]qJ,OotJH1<$K6`-( +Knb>;Ll$tGMio(2JF +rq6 +JcC<$JcF@%o`"gfrqu]ks7u`krV.3'p@e1Po^h\Fo'u5!rlFrX!R&^`bm)D8bKA#NanUem +MYW21Muo!!^\bbE^&PhF^&G_J^V7Itrac%=")j!f\Ga>D`;RUQ_YCtI_#KJpO8tFBO9L]Z]tHm) +qa^ZWr^m&\s%EAcrD!;es%iVjs%rbor_rhr!*0#!.p#hT=]np4>?kE=?=$uG?t!JQ@Uiq[AS,Oe +BP;*pCMRa&D/O60E,fljWN)u!X/rG*Y-+u-YlD!.ZMV!%[/^1!_!\u9 +^AjlHTV%gISXc1=R[KP0QBd`"PEM)kOH5H_NJrgSMZ/G5Lkkta!JQ4+KE$Q'Jc1-!J,XobIK"]p +J,XuuJcC?%KE$UAKnb>;LPUeDMMmFPNK0']OcklkPa.Q$R$jD4S=Q7DTV8*TUnsrdW2cl!Xfek3 +Z*UdE[^WcW]"G\i^VI\&_o9U8aN;TJbg+M[dF$FmeCN7'g"P08h;-uHi8N\UjQ5OdkNM0plKdg' +mI'uB!V#XYncJFTo`"O`pAamcq#C0hqYU0hr;?Nardk*fs*t~> +JcC<$JcF@%o`"gfrqu]ks7u`krV.3'p@e1Po^h\Fo'u5S,\rVRJLacD>\5= +C\_fFD>e;BD$49T?X@%6SGSfURK/cOR/`N>QiNQQR/Uq&DZ4MMD"_]GDYfUsPQ-mHPPLFL=B8F% +?kE=?=$uG?t!JQ@Uiq[AS,OeBP;*pCMRa&D/O60E,fl$W;`dmWrK+"XSJsuY5YX(Yl1j&ZMSS4DYJ)IPl?mDOoWZ(aTK]/ +bKTn/rlkAdqTo,es3Uqse'lbDe,.\pf)=2&f\+s3q31Z>q31]=qigl@pldXcIt3'$K7el4L5:\C +MiuQ^F20S"-%@StMdNU8+N\VPg>jWN)u!X/rG*Y-+u-YlD!.ZMV!%[/^1&OQho+ +OT2!oTV%gISXc1=R[KP0QBd`"PEM)kOH5H_NJrgSMZ/G5Lkkta!JQ4+KE$Q'Jc1-!J,XobIK"]p +J,XuuJcC?%KE$UAKnb>;LPUeDMMmFPNK0']OcklkPa.Q$R$jD4S=Q7DTV8*TUnsrdW2cl!Xfek3 +Z*UdE[^WcW]"G\i^VI\&_o9U8aN;TJbg+M[dF$FmeCN7'g"P08h;-uHi8N\UjQ5OdkNM0plKdg' +mI'uB!V#XYncJFTo`"O`pAamcq#C0hqYU0hr;?Nardk*fs*t~> +JcC<$JcF@%o`"gfrqu]ks7u`krV.0&p@e1Po^h\Fo'u5V@Xs&/nsr_ql@pcS44 +r]L$=rB1$?o/m.a?sd5Gr)!)as%rPfr_WAcs%i_n;#*ue;"m'N4S:l;:@h9[;#X5j7K#UV77g3N +rDW\pp/Uujs&JeWr`/tfqa^ZWr^m&\s%EAcrD!;es%iVjs%rbor_rhr!*0#!.p#hT=]np4>?kE= +?=$uG?t!JQ@Uiq[AS,OeBP;*pCMRa&D/O60E,flPMJ'?2n10>Q6hJ4oA%L9`Jf0C2%EuC]8,RD/=$*D/T>k +qJlISs)\3^!d/U,rcJ3arceBe!-eEercnKjrd=N@s&B%up/V)kpJV&kqc!8f2h$7,J:`E+Knb>< +M2@.LNK0']OckomQ'Rc(R@9V8SXuFGTqS3UUnsrdVl6SpWiN2%Xf\b/YPtd+Z2_-,ZhCd+ZM[Z" +<:j2g<;fbo;ZEF1TV%gISXc1=R[KP0QBd`"PEM)kOH5H_NJrgSMZ/G5Lkkta!JQ4+KE$Q'Jc1-! +J,XobIK"]pJ,XuuJcC?%KE$UAKnb>;LPUeDMMmFPNK0']OcklkPa.Q$R$jD4S=Q7DTV8*TUnsrd +W2cl!Xfek3Z*UdE[^WcW]"G\i^VI\&_o9U8aN;TJbg+M[dF$FmeCN7'g"P08h;-uHi8N\UjQ5Od +kNM0plKdg'mI'uB!V#XYncJFTo`"O`pAamcq#C0hqYU0hr;?Nardk*fs*t~> +JcC<$JcF@%o`"jgrqu]ks8)ckrV-EfpAX^co^i(Q&+T/Xmd9B-lg!`ukKhGuc2Poec1QtjM#`G/ +M><&/MscJuM=6<*@UWYO?]MpOSt4?7f,^T8H29Z9)hQa9`@cd:B+,h +;#aAm;Z0Mp<)rous&T2&r`K8*>Q.k.?!dM;$=I:O@UinYAS#Idrb)ILC27U$D>nDkDfB]9EcZ>E +F`hkOGBeCZH@($eI=6QoJ:LVh;[uo:ASZ:1I=mE=QCXbKYGnc+WrCrViVqg:j8S->jo=KBk61#5 +lK[^5m/QGRmd:#AqsXLQmudR3r0-uts2auUb5_4RqS_g>!5eTMqSG4?IXcm!JqJ`1L51SAMMmFQ +NfT9bP*;/rQC+&-S"#q=StD[LTqeEZV5C/gW2ZesX/rD)Xfek2rilF-rj)C,q6U40s8Vf.m_A_7 +s.LF*T:VXFS=?"9R$a5+Q'IStP*1rhO,o<\N/W[PreUi8LPCP;KnTGXs+16%rIFlsrdO6_rdOls +rI=s#JqEuS!JH1+L2Vj'M2@+JN/WaVO,oBbP*;,qQ'[l*R@B\9St;RJTqeEZVPgAlWiN5'Y->.9 +Za@-K\%0&]]Y2%o^r!t,`Q#s>aihlPcHjkbdaQ^rf%8R-g=tE=hV[8LioB([jlY^gkiq?slg4!* +mdKW6nF?MK!qZ'Vrq6 +JcC<$JcF@%o`"jgrqu]ks8)ckrV-EfpAX^co^i(Q&Fo8Ymd9B-lg!`ukF7s0R[a;Fs)%aOr+uFO +q/$+Lmqr#>rbMOMoP=A@mqi5;@:3GK>kjfhS,SrXS,\oWRH0b7RK&ZJDZ+GMD#/#FPQ6pGPQ6pA +PlI$K=T;J&<Q.k.?!dM;$=I:O@UinYAS#Idrb)ILC27U$D>nDkDfB]9EcZ>EF`hkOGBeCZH@($e +I=6QoJ:L>`9+F]p?>cHcC7rQkVndaJ-DrmV"ueC=KJrRUu#rn7A,pQPH.9Za@-K\%0&]]Y2%o^r!t,`Q#s>aihlPcHjkbdaQ^rf%8R- +g=tE=hV[8LioB([jlY^gkiq?slg4!*mdKW6nF?MK!qZ'Vrq6 +JcC<$JcF@%o`"jgrqu]ks8)ckrV-EfpAX^co^i(Q%IrrVmd9B-lg!`uk>YCY;?9]qmQCP6of_q0 +p-%P#"_(nJ?X@"7;#O5k;Ys>k;#=#j:f1(dpJ:fcpeh&f!'Kg6rB0p>r_E,^rDs[ +qG[Amoi:ojpHARHqa^WVs%3,\s%EAcr_V.r]U3Bm61DCr([2ds%WDb"DVXbC23``rbMmX +DJjB2E,fl:E;abVErL.ZFT-F]FoZabGQ;seGQrG>H[L3hIJ6\><;'>k<;0;k<;TVj;E0)RIt3*% +K7nr5LPUeEMijWN)u!XK8P+Y-5&.YlD!-ZMLp' +Zi[S=Z2IW#<:a,g<;]\n;ZEF1TV%gISXc1=R@'A.QBd`"PEM)kOH5H_NJrgSMZ/G:Lkg_>KnY3Z +KE$N'Jc1,uJ,XoaIK"]qJ,Om!JV&LQK)pXZre>?HLl$tGMi +JcC<$JcF@%p&=pgrqu]ks8)ckrqQNf!;?Eb(\I=io'u5E,0 +M>2u)Mti/0Mu&>.M=ZT=A7K(W?XI,Ef\"g-f%&@$e'cXjd/MAkc2u54ans-WaSO!ab0/#RcHa\[ +cMl&gbjLDgMYi;8^q[Uu^;'NY!58!fPr7K,dR8,c'Z8c23\9E.]a +:&drg:]4)k;,U[1Q??=.&I@:RM.qWF-BPD3rCMRa'DJjB2 +E,flM2I7NNK9-_P*2&pQ'[l*R[]e;St;RITq\reYBIMi +JcC<$JcF@%p&=pgrqu]ks8)ckrqQNf!;?Eb&+oJao'u5$G39>[:WA?XI2L +@:E\UAH$-jAnPdjBkhBuCM[j*DJsH4EH-#?FEDYKG'A.TH$Xd`I!g?jIXcluJUrE*p.Glj;H?t- +@:j4jEHQPTJV:4\s/H!rrMKUmri#dpql0^uXK;3!s/u@)rNH:,q6L!;r,;:Hs)%^Prg!)>rK@9* +b5TTac25`bc2Z&jcd'i7ci)5idf%VteC2mreG[qtecXOVf\-5Wooo9;qigfM2I7NNK9-_P*2&pQ'[l*R[]e;St;RITq\reYBIMi +JcC<$JcF@%p&=pgrqu]ks8)ckrqQNf!;?Eb'D1neo'u5?b?;?!UcD?XR;N@U`hXradTlB4tsmC2.O"Ci+'-Df9T7EH6,BFEMbMGB\:WH?spcI!pEl +It3'#JV&OJ4:XM<552=s>Qe>;>[(G04o7A6 +4oS7R:&n#c:B+&g9`Jc,BkmW_rbMmXDJjB2E,]f9E;abVErC(YFT-F^FoZacGlN!eGQE)9rd=`o +s&A_kr`&Skr`&Acr)3QC0n+V&JV&N-KnbA>M2I7NNK9-_P*2&pQ'[l*R[]e;St;RITq\7re(6&!.k*!rdXrsm!\k^s*suts+(0%re(6("GMSbLPYqdC5Rq.NK0'\ +OHG]hPa.N"Q^F20S"-%@T:hmPUSO`aVl6VqXKAY/Yd(O@[C3QS\[oGd^;%J"_Sa@3a2lBFbKS5V +cdC.heC<($f@em3gtgfCi8ESRj5]7`k3(sml0@U$m-X6/n*fc9rpp*\!;-9`s7ZKerV6EgrqcNh +rqu]mo)=4?`W(G~> +JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb(A.4ho'u5@KUS)TXaF-s2+TJr^QcTs%*,\rC[)_s%NAcs%`Si +r_WVl!)ieps&8tur`9&#!*K5'!Er_,>QJ,:ra,\6@K'^C@q9.^AnG[hBPD5\CB\NkDJjB3rc&*^ +F*)MHG5c[mG^4U]H[L3hI=?\FJ-LRVK7ei1L&=jZ=C5WTEHlnaMNF-pU8Y9'YkY-nhuDX6iW%p; +j8S->jo4EAkl9lKlKdd7m/?>MmeuVQnElA3>2I=6QpJ:W?*KSG5;M2@.L +NK0']OckomQ'Rc(R@9V8SXuFGTqS3UUnjibVl6PnWiE,$riQ4'!3c@*riuI.o<\JspqZ=4qn=&B +St;LCS"#k7R$a5+Q'IStP*1rhO,o<\N/W[PreUi8LPCP;KnTGXs+16%rIFotrdO0]rdOlsrI=s# +JqEuSDhNh!L51P?M2@+JN/WaVO-#KeP*;,qQC!u,R[]e;St;UKTqeE[VPgAlWiN8(YHY:;Za@0L +\@K2_]Y2(p_8=(-`Q#s>aihlPcHjkbdaQ^rf%8R-g=tE=hV[8LiT&tZjlY^gkiq?slg4!*mf)YU +nF?MK!qZ'Vrq6 +JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb&+oJao'u5XARo:[@:*AJ>kX`eSH#&[R[KT.R/<%l?D#fjfPkgUC=8uD&b1Mrfd>GlBD3: +qa^ZWr^m&\s%EAcrD!;es%iVjs%rbor_rhr!*0#!s&T2&r`K8*>Q.k.?!dM;!FT@8@L?UUAS#Ic +B4tsmCAquPCi+'-DfG\q"`e[+FEMd+G7&S?H?spcI!pElJ,Xs&JV&N,KS5'W9+F]pKnY3ZKE$N'Jc1-!J,Xo_ +IK"]qJ,Om!JV&LQK5ZEsL5(J=Ll$tGMi +JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb&+oJao'u5l7Ft;>a>i;?'Ji:BOEj;,I3es%rVh"&Mil;#F/j4oIM548qA?4oA(N +:]+&b:]4&g6i04M6N]_J9i(ac!)iSjr`&Sks&T+gqa^ZWr^m&\s%EAcrD!;es%iVjs%rbor_rhr +!*0#!s&T2&r`K8*>Q.k.?!dM;!FT@8@L?UUAS#IcB4tsmCAquPCi+'-DfG\q"`e[+FEMd+G7&S? +H?spcI!pElJ,Xs&JV&N,KS5'W4:XM<55MM) +>[.,2!*fA+r`f1]q)nU=s#pHH:AI]W:'OF+BPD3sC]8,PD/O60qf)LR!-8$ZrcJ-^s*"Ed!-nEc +"*f*;HiAElI0*DJ<;0>f<;KVo<:*U@H[U/8 +LPL\BM2I4MN/`jYOHG]hPE_>uQ^F20S"#t?StMdNUSO``Vl6SpX0&M-Yd(L?['mEQ\[oDc]t_=u +_SX71`lH0BbKJ/Ucd:(fe'uq!f@\d1gYCWAhr*GOj5]4^k2tjjl07L!m-O--rpKmWnc&(\oCV\S +p&Facp\jmeq>^ +JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb(%h+go'u5rMZA_6Mt;f+M>W80MuS_EAn>L_@UWVN?_Y1nD_Yh7J +8,l-Z8c;9]9E%Wa:&dug:]=2j;?'Pn;Z]ou[1Q??=.&I?t!MR@q0%\AS,TS +BF8HgCMRa&D/O60E;jhoEcZ>EF`qqPGBeCZH@(!dI=6QoIt3'#K)UB'KSBD[%YojsM/dcgK8PbV +SYE'd^T[^7o;2SchVS.erS[\6s5O"kWiN5'Y->.8Za7'J\%&u[]Y(tn^qmn*`Pom=ai_fNc-FY_dF-Oof%8O, +g=k<;h;7&IiSrnXjQ5Oekiq?sli-5YmI'H3nF?&>o(2JFrUg6cp\4X]rqZTjqtp?irVc +JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb&+oJao'u5S5FD?#n#PQ7!>PkgUCQMsq`=8uD&$G39>[:WA?XI2K@:E\U +@q9.^AnV*V$>F6jCM[g(DJjB3rc&cqF*)MHG'8(RG^4U]H[C-gI=?ZqJ:N3&rdt6)L&Qf:LPUeD +?=@G[D/j]DI=['dK`It@V?!IlV?!IkVZ!FlW;ijoWWB0%rN-(&qlTn$qlg%(!3uC+rbqIIrbqdR +q3:cAo9B3trQG5b!6tMg!6tMgrQbPldF%sArR:bo!n5ZKrm_,%f@S[Sg&Kb,g"PnZqig]9nrl._ +I=6TqJ:`E+KnbA=M2I4MNK0']P*2#oQ'Rf)R@B\9SXuIHTqS3UUnsrdVl6SoWiE,$XKAV-Y-5&- +Yl:p*ZMLp+Z3(&fOT(CtQ^F/.S"#q> +StD^MU84T^Vl-MoX/rG+YctC=ZaI6N\@K2`]Y;.r_8=+/`Q-'Ab0/#RcHjncdaZdtf@S^0g=tH> +hV[8MioB([jlYail07L!rp1$[mdKW6naZ2@oCMVQo`Fj]p\jmdq>^ +JcC<$JcFC&o`"gfrqu]ks8)ckrqQNf!;?Eb&+oJao'u5l7Cu;>F,f;?'Ji:BF?i;>X2e:]4,i;#jGh4oRS63rhDB4oA(O:\mob:\dca +6iKFP62s7S6UsgG;Z0Jm;YX2i<;'>i8,l-Z8c;9]9E%Wa:&dug:]=2j;?'Pn;Z]ou[1Q??=.&I?t!MR@q0%\AS,TSBF8HgCMRa&D/O60E;jhoEcZ>EF`qqPGBeCZH@(!dI=6Qo +It3'#K)UB'KSBD[%YojsM*XKs6q'R98P2WLj%\?)!2]:a!2]WnrDiVnrDs)'='/T&=oV\&>Ph\) +>Q.n+>P:5T49.P?:ARcY:&o#-CB&,MD?"JRDuO\UDuO_UEW:(XF8g:\FoQX`G5ugcG6<)9H[GX; +"BJN&<)iTjqGd;kr`&;a4+)I)It3'$K7el4LPUeEMijWMuntX/rD)Xfeh1YPk^)Z2Cp(Zi.03Y>\D"r`/eqr)NYor)7re(6&!.k*!s*t#sl[Ab]s*suts+(0%rdt6)L&Qg=LPUeD +MMmFPNK0'\OHG]iPa.N#R$a;2S"-(AT:qsQUnjlcVl?\sXKAY0Yd(O@[C3QS\[oGd^;%J"_Sa@3 +a2lBFbKS5VcdC.geC<($f@em3gYL]Bhr*JQj5]4^k3(sml0@U6ljN4Kn*fc9nac8BoCW"S!quB_ +rV6Bfs8)WirVZWmo)=4?`rCP~> +JcC<$JcFC&o`"gfrqu]ks8)ckrqIE+p@e1Po^qbGo'u5h[obg&BY(f*9gVeC;sqdJhJrcd'bW +aN=8!s2k5^s3(Dc"3o-:ch!+bMuUWp_8-&drP/]T^qd_#^q[Y"rkJHH!l)OdrPANL!P`+CA,Ts< +AcH9DAUKZ@_Z%IM_YV1K_>qFL_>qFO8,c'Z8c23\9E.]a:&drg:]4)k;,UOn,;_UOo:C>Oo:I?On?ZoaRR3S"-(AT:hmPUSO]^VPg>jWW&n!X/rE%XTGZ/YPbX'Z1bL%Z1l'4^]2%A^\Y\ESg0er +S"#k7R$a5+Q'IStP*1rhO,o<\N/W[PM2@%ELPCP;KnTGXs+16%rIFotrdO-\s*jutrIFp!!.t3& +E.iq!L5(J>M2@+JN/WaVO,oBbP*2&pQ'Rc(R@9V8SXuIHTq\ +JcC<$JcFC&o`"gfrqu]ks8)ckrqI9'p@e1Po^qbGo'u5>s,phfhEphfY> +s(DdPARo7Z@:*AI>b7P\Sc5/ZS,\rVRI$=>RJh$mD>J/LD>oe#Pl?sHPQ7!GPkLC=QMOY^=8c5' +B6Aiinrrj3rf[>Fr^ZrYs%3,\s%EAcrD!;e!)NPi!`;inr_rhr!*0#!s&T2&r`K8*>Q.k8?!^iE +?XR;N@U`hXrac+BBDuQOBkhF!Ci+$,DJsLnE=-`-FEDYKG'A.TH2`+)H[L6iIXZcsJ:W9'K7ei2 +Knb>;LPYqd!K)g7MueH]aFsMem\KlZs/,gmrhfUkrhogrqPjRsXSo:$Y5GF$Y5>C(Yd(J2Z2q:L +r,;7Gs)7Oo!1!)=!mJj3rQG5b"O56;c-?75rQbJjrmC_n!n5TFrmLhq!S#[!f)F;#f_sLkPl$[; +P4OkkH[L6jIt3*%K7nr5LPUeEN/WaWO-,TgPa.N#R$a>3S"-(AT:hmPUSO]^VPg>jWW&n!X/rE% +XTGZ/YPbX'Z1bL%Z2Kg\P4Fb3OT1msSXc1=R[KP1Q^3o%P`q8nOcYWbNfB!VMi*@JLkph@L4t>7 +re(6&!.k*!s*t#sl@&\]s*suts+(0%re#0CKnY89LPUeDMMmFPNK0'\OHG]hPa.N"Q^F20S"-%@ +T:hmPUSO``Vl6VqXKAV.Yd(L?['mEQ\[oDc]t_=u_Sa=2`lH0BbKJ/UcHstee'uq!f@\d1gYCW@ +hr*GOioB+]k2tjjl07L!m-O--rpKmWnc&+Zo)SF^p&Facp\jmeq>U6fqu6NkrUTr=s2Y.i~> +JcC<$JcFC&o`"gfrqu]ks8)ckrqI9'p@e1Po^qbGo'u5Z"As:]OAf;Z0Jl;#F)j:f1*e;#*lh:f1%Or]C'@q`Xm?oK3"Hq+pf_r(m&^ +!DPoX6iTLP5mBYE8ki2^;Z9Pl;YX2i<;KVo8,c'Z8c23\9E.]a:&drg:]4)k;,UPqb)>Q.n, +>Ot#T4S2DF:]F2f:]=,gCB&,MD?"JRDuFYTE<'tVE<(%YF8g:[FTQc1FoHR`G5upfHN&9jI/[1H +tq<;]\k;ZE=5SXc1=R[KP1Q^3o%P`q8nOcYWb +NfB!VMi*@JLkph@L4t>7re(6&!.k*!s*t#sl@&\]s*suts+(0%re#0CKnY89LPUeDMMmFPNK0'\ +OHG]hPa.N"Q^F20S"-%@T:hmPUSO``Vl6VqXKAV.Yd(L?['mEQ\[oDc]t_=u_Sa=2`lH0BbKJ/U +cHstee'uq!f@\d1gYCW@hr*GOioB+]k2tjjl07L!m-O--rpKmWnc&+Zo)SF^p&Facp\jmeq>U6f +qu6NkrUTr=s2Y.i~> +JcC<$JcFC&o`"gfrqu]ks7u`krV.9)p@e1Po^qbGo'u51MZ8SHC1q6lARo7Z?sd8H>hdudg"HAWs47J+e^W*tdaA'@"jbH;b/qd%aT'B\b5]Za +bl>ofcKgG_MZL`4qnW9Jrk\WMs2"WKr4`6Ir5&BJ$,=9k@:3JP@q0'GAHR.9Uq6NBpqm$JrkeQK +!l@Gtr^d&\r(?u^s%NAcs%`Sir_WVls&/hp!`W0"r`08*=BJ^/>$>/0>QJ,:ra,\6@K'^:@q>RM% +q]HfBPD0qCMRa'D/O60E;jhaEcZ>EF`qqPGBeE4H3&A?rd=frJ,Xs!JV*lR!JH1+L'NKiLl$tGM +MqIm!f`5#rf7,BOcfX+s-!GIlE:2Yr1uQ^F20S"-%@StMdNU8+N[V5C/gW2]cr!irE(riQ4's0)=(oWeA!pqZmDqS)g@qS"8IS +Xc1=R[KP1Q^3o%P`q8nOcYWbNfK*XN/NRMM26tCL5(D9K`6W(JcLB#JH(,uId2@]If=irJH(0#K +)UE&KER!`L51TaM/8'-N/WdXO-#KeP*;/rQC!u,R[]e;St;UKTqeE[VPgAlWiN8(Y->.9Za@-K\% +0&]]Y2%o^qmn*`Pom=ai_fNc-FY_dF-Ooe^rF*g=k<;h;7&IiSrnXjQ5OdkNV6rlKdg'mI'H3nF +5uIncJFTo`"O`p&Ojbq#C0iqYU0gr;?Nardk*js*t~> +JcC<$JcFC&o`"gfrqu]ks7u`krV.9)p@e1Po^qbGo'u5bKqjd\Us-a"WR[X5Dqj7AOpmD#JphoM:r,2=q!0mJJr06r@qN_;O +QC!q?=8Gts=8uA)A9*6^nWWa2!g?,Er^d&\r(?u^s%NAcs%`Sir_WVls&/hp!`W0"r`08*=BJ^/ +>$>/0>QJ,:ra,\6@K'^:@q>RM%q]HfBPD0qCMRa'D/O60E;jhaEcZ>EF`qqPGBeE4H3&A?rd=fr +J,Xs!JV*lR!JH1+L'NKiLl$tGMMqIm!f`5#rf7,BOcfX+s-!GIl@]/.r1L$XoGR$Y5kg+Z2V'/ZN=u]DYe;IDW$cZb5f]abQ#fdblZ28 +c2Q#eci)5fdJhPre'upurRV##rn.2&mZdU4o9/d10m\1oI=?ZrJV/T.L5(M@M2R=PNfT9aP*;,q +QC!u,R[]h7re(6&!.k*!s*t#sl@&\]rdXots+(0%re(6("GMSb +LPYqdCl4.0N/is[OHG]hPEhE!Q^F20S"#t?StMdNUSO``Vl6SpX0&M,YctF>['d?O\[f>b]tV7s +_8=+/`Q-'Ab0/#RcHjncdaZdsf@S[/g=tH>hV[8MioB([jlY^gl07Kulg4!*mdKW6nF?MK!qZ'V +rq6 +JcC<$JcFC&o`"gfrqu]ks7u`krV.9)p@e1Po^qbGo'u5B4b^c@U`_P?X6o5qbd)cs&&\jr_NPjr_`SirD3>d!`(p@pH/@:qE=g?q)eRNrD*Di +rD38dqbQr]"&2Nc62j4I6OlFK5sn1::f:4j;Gg:h;Y*idAIiBcBP;*oC27U$D/F0.DfG\q$?C30 +FEMbMGB\:Wrd"TlI/\NpIXh?I!J,k%K)pXZre:Z5LkpnEMMd>kMuo!!NrG(@OHG\)P5g^GPj1sC +Sc#)XTDkMXU%>#P<<#to5DJ&>QA(->Q7t,>Q-bV4TIV4:@qKnY3ZKE$N'Jc1-!J,Xo^ +IK+cqJ,XuuJH1<$KE$T-Knb>;M#N6IMMmFPNfT6_OcklkQ'IZ%R$jD4S"6.BTV8'SUnsrdW2Zet +Xf\b1Yd1UB[C3QT\\#Mf^;%J"_Sa@3a2lBFbKS5VcdC.geC<%#f@\g2gYL]Bhr*JQj5]4^k2tjk +l0@R"m-O--n*fc8nc&(\oCV\Sp&F^cp\agdq>^ +JcC<$JcFC&o`"jgrqu]ks8)ckrV.6(p@e1Po^h\Fo'u5XqMX^!qMX*eqMPiB +CM@HpAn>L^@UNPL?!R?^s4RD(s47h5e^W*tda?Fgcd0k[bK@uLqoJfZrlP5arQP;dqi0m"r/:Ql +s2+TJ!5STM!PlPN_#M1K_#(tD_#%OC@Uiq[Ac?9FATETu[)2dZoYULAs%!)[r^m&\r_*8brCm>g +:J^pc!`;inr_rhr!*0#!s&T2&r`L=H>?b?;?!UcD?XR8M@U`hWA7]=aAnPdjBkhBuCM[keD?4Zp +rc'$#F*)MHF`qtQG^4R\H@($eI=6QoIt3'#JqAW-KS5'YL&m'cre^Z4!/pi8!f`5#rf@)@!0R8D +s-*JIrg!MLs-N\Os-`kTrLr9aCLs6p!W!:fuLpQ,B;rQ+WOq8W-Kci +S"#k7R$a5+Q'IStP*1rhO,o<\NJrgSMM[1GLPLV=KnY3ZKE$N'Jc1-!J,Xo^IK+cqJ,XuuJH1<$ +KE$UNKnb>;LkpnEMMmFPNK0']OcklkPa.Q$R$a>3S"-(AT:qsQUnjlcVl?\sXKAY/Yd(O@[C3QS +\[oDc]t_=u_Sa=2`lQ6CbKJ/UcHstee'uq!f@\d1gYCW@hr*GOioB+]k2tjjl07L!m-O-,mdKW6 +naZ2@oCMVQo`Fj]p\jmdq>^ +JcC<$JcFC&o`"jgrqu]ks8)ckrV.'#p@e1Po^h\Fo'u5J/FD%18p +BP1pgA7B"U?X@#CrLWhUqjd\Ur0mVQs-WhQs-WbQrL!POrb_:Fmqq]^s-3;Ds-[1Q??=.&I?t!MR@q0%\AS,OeBP;*pC27U$D>nDRDfG\q+*)FEFEM_LGB\:WH$Xd`I!g?jIXcit +J:W<(K7ei1L&Qf-LPYqds,$f7repoj-nr`^/,b:Hp +S!ob4R$X,(Q'@JqP*(ieO,f3ZN/W[PM2@%DLPCP;KnTGXs+16%rIFotrdO-\s*jrsrdb$"!.t3& +s+G]PL5(J>Ll$tGMiVg^V@V%_o0O6aN2KHbK\>Xd*^:jeCE.%f\,!5gtgfDi8ESRj5f=ak3(sml0@U$m-X3.n*fc9 +nac8BoCW"S!quB_rV6Bfs8)WirVZWmo)=4?aT$b~> +JcC<$JcFC&o`"jgrqu]ks8)ckrV.'#p@e1Po^h\Fo'u5?kE=?!^lF?smDP@UinYAS#IcB4tsmC2.O"Ci0/h!H2rVE?B4BFEDYJG'A.TH$O^^ +H[L3hI=?ZqJ:N3&JqJ]/KSBD[!JcL1M>rG5MuJY:NK0%uO8k:AOoCODPQ-mHQ2d0MQi3Ph\'>6%q,>PpVW4TJ:B:A@Wb:]YLl$tGMiVg^V@V%_o0O6aN2KHbK\>Xd*^:jeCE.%f\,!5gtgfDi8ESRj5f=ak3(sm +l0@U$m-X3.n*fc9nac8BoCW"S!quB_rV6Bfs8)WirVZWmo)=4?aT$b~> +JcC<$JcFC&p&=pgrqu]ks8)ckrqQNf!;?Eb%J98_o'u5u`!lDdirkJTM^qfla!5e`OrkSKKs2+eFs'bq8s'bq:!Fo[=Ad!%)RBOI) +_Z.OJ_Yh7L8H29Z9)hQa9`7]c:B+,h;#aDm;Z9Sr<)lrt$Lu2!F9%2?P$UR@:E\U +A7T7_AnPaiBPD5\CB86grb_aTE;jhlEcZ>EF`hkOGBe@XH?spbI!pElIXh?I!J,k%K*R'`Knb>; +LPYqd!fDnorepolI0 +i;_d6irnH)jlY_(kPscFl2KrKlg4N9r9jRQ!q>aMrfI2BqiUf3S"-(AT:hmOU8+N[V5C/gW2Zbr +WiN2%rN6(%ribjrrNH7(rN-(8rkIa4'V(Y^R[KP1Q^3o%P`q8nOcYWbNfF$s$]Bn!M26qBL5(D9 +K`6W(JcLB#JH(,uId2@\IfFosJH(3#K)^K'KQ)X"L51P?M2@+JN/WaVO,oBcP*;,qQ'[l*R@B\9 +SXuIHTq\ +JcC<$JcFC&p&=pgrqu]ks8)ckrqQNf!;?Eb%J98_o'u5C_1H"CM@Hp +AS#@\@:3GK?([_]SbnrVS,JfTR/iWRQiEHQRJWBORJ1RjDY7iKQC!o'm?RI4pQklGr`8quqc<_u +"'o\gM#EV5PPC=?8H29Z9)hQa9`7]c:B+,h;#aDm;Z9Sr<)lrt$Lu2!F9%2?P$UR +@:E\UA7T7_AnPaiBPD5\CB86grb_aTE;jhlEcZ>EF`hkOGBe@XH?spbI!pElIXh?I!J,k%K*R'` +Knb>;LPYqd!fDnorepo3S"-(AT:hmOU8+N[V5C/gW2ZbrWiN2%rN6(%ribjrrNH7(rN6*_nr`[.'V(Y^R[KP1 +Q^3o%P`q8nOcYWbNfF$s$]Bn!M26qBL5(D9K`6W(JcLB#JH(,uId2@\IfFosJH(3#K)^K'KQ)X" +L51P?M2@+JN/WaVO,oBcP*;,qQ'[l*R@B\9SXuIHTq\ +JcC<$JcFC&p&=pgrqu]ks8)ckrqQNf!;?Eb%eTA`o'u53ug;=76\:]4&\4S1`74Sq;A:Adoe:Amuc;#3ud:'"-crD*DgqbI2Y +r^$QL!($TNqa1ZX7nZTS:f1(f;Y!cd<;oGg8c23\9E.]a:&dug:]=2j;?'Pn;Z]ou,7L51P?reU]6Mi7Rn!f`5#rf@)@s,m;Ds-*JIrg!MLrg3SNs-`kTqj[ST +rLN\Sr1l7h*>lIt'4Sh2@;>sDl:[V!Q:]+&gD#eJQ +DuXeVDuO_SEW'qWF8g=\G5c[eG^4T5HN&6mI!^8:uQ^F//S"#q>StD[LTq\tq +<;]\h;A>XjS!ob4R$X,(Q'@JqP*(ieO,f5!N!kQ$M2@%DLPCP;KnTGXs+16%rIFotrdO-\rdOls +rdb$"s+:9's+G?FL5(J=Ll$tGMiU6fqu6NkrUTr=s2k:k~> +JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb%J98_o'u52NW+n6NW+n6 +NW+n-N=p,GCMRWtB4YXa@UWYO?d(*8c;9]9E.]a:&dug:]4)k;,U?kE=?!dM; +!FT@8@KBtLrac+BBDuQFBkmW_!GlWPD?4Zprc%sZF8g7^Fa!b.!I/nhH3&A?rd=frJ,Xs"JV&LQ +K)pXZreCH.!/UW2s,$f7rf$l:!07#=s,[5CrK@2Es-3JIs-EYNr0[MPrgN\Qr1*YTp=fN#!o2Vf +rn[Y4qr%M5!94"L$YPGF#YPt^&XoGL&WrTp"^*B/;S!ob4R$X,(Q'@JqP*(ieO,f3YN/NUOM2@%DLPCP; +KS9>W!ePuSrIFotrdOQhs*XQhrdOlsrI=s#JqEuS!JH1+L1l?uM2@+JN/WaVO,oBbP*;,qQ'Rf) +R@9V8SXuIHTq\Yd*^:jeCE.% +f\,!5gtgfCi8ESRj5]7`k3(sml0@U6liukFn*fc9nc&([oCW"S!quB_rV6Bfs8)WirVZWmo)=4? +ao?k~> +JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb%J98_o'u5ZDr`B"ur`B&!s&T>+BQf)nrKRAIp65H9>[1Q??N+:4?t'%D!Fo[>AH?CUrb)=HCAquLCi0/h!H2rVE<1*$rcA0`G5c[dG^9:7 +!IK4nI0"eHrdY'$JqEuS!JH1+LB!#/M#N82M?&S6N;nk;Nr>%=O8tFAP5gaGPl6mIQN!6KR/`TR +ReiNOSGSlNU\pqaV>d@kVZ<[pWW0!qX8T."XoGR&XoGR$YPta+Z2V'/ZN.B-D#eJQDu,a\PlI$H +PlAo*blZ28c2Q#echl)fdJq\qeGn)!f)O;#ec=>$fE9gZf\-7go990['d?O\@K2`]Y;.r_8=+.`Q$!?aihlPcHjkbdaQ^rf%8R-g=tE=h;7)J +iSrnXjlY^gkiq?sli-5TmI'H3nF?&JncA@SrUg6cp\4X]rqZTjqtp?irVc +JcC<$JcFF'o`"gfrqu]ks8)ckrqQNf!;?Eb&bP\co'u5b!`)Qdp,r48r]Kg7r]C6V:/:dar(d2drD3Pm:f.$b +s%`Mgs%rDb"[YRC6:!p:5QF+J6N9CV6qBsG;,[Bjs&/Ges%*,\rC[)_s%NAcs%`SirD3Pm;H!Km +s&8tur`9&#!*K5'#?k>9>[1Q??N+:4?t'%D!Fo[>AH?CUrb)=HCAquLCi0/h!H2rVE<1*$rcA0` +G5c[dG^9:7!IK4nI0"eHrdY'$JqEuS!JH1+LB!#/M#N82M?&S6N;nk;Nr>%=O8tFAP5gaGPl6mI +QN!6KR/`TRReiNOSGSlU;ufko;ufqm<;onr5qb'>5hb)>kqV&>QJ&6pH8FVorGhdVs)\3^rcS3`rce?ds*=Tir-S0=r`/GeqGm/e20aCmH[L6j +It3*&K7nu6Ll%"IN/`jYOHG]iPa.Q$R$jD4S=Q7CT:hmPUSO]^V5C/gW2ZcqWWK6&XSo:#Y5GL! +Yl(^(Y5GF%XT,@"['d?O\@K2`]Y;.r_8=+.`Q$!?aihlPcHjkbdaQ^rf%8R-g=tE= +h;7)JiSrnXjlY^gkiq?sli-5TmI'H3nF?&JncA@SrUg6cp\4X]rqZTjqtp?irVc +JcC<$JcFF'o`"gfrqu]ks8)ckrqI0$p@e1Po^qbGo'u5V7L_>h@P_=teJ@UNUC +@JjL5@K'^@A7]>!Oeo\,rPAKM!5\HI!(d)\r(?u^s%NAcs%`Sir_WVls&/hp!`W0"r`0)%=BPQ* +#?k>9>[1Q??N+:4?t'%D!Fo[>AH?CUrb)=HCAquLCi0/h!H2rVE<1*$rcA0`G5c[oG^4R\H@($e +I=6QnJ,Xs'JV&K+K7no3reCH.!/UW2s,$f7rJUf;NfO+"s,d8CrK@2Es-3GHs-EYNqj@ANrL3SP +rRpu"rS%D/h;/(es53e5s5Et:!9="g@? +e,SjSm)/_;rPLO;G^=[_I=6TqJ:`E,KnbA=M2I7NNK9-_P*2&pQ'[l*R@B\9SXuIHTqS3UUnjia +VPg>jWN#lss/Z1$r2oq#pTOLtr2p"#s/Z*u!NE$g^AY_d^:g#)R@'A.QBd`"P`q8nOcYWbNfB!V +Mi*CKM26rdL'!'^K`6T*Jq8LOJH(,uId2@\IfForJ-(:RK)UB'KSBD[D23q(M2I4MN/`jYO-#Ke +P*D5sQC!u,R[]hkWiN5'Y-5(7Za7$I[^`lZ]=bhk^VI_'`5Ta:aN;TJbg+M[ +dF$CleCE1&f\5'6gtgiEi8EVTj5f=ak3(sml0@U$m-X6?mfDqJrpg-^o^r.Us7ZKerV6EgrqcNh +rqu]mo)=4?b5Zt~> +JcC<$JcFF'o`"gfrqu]ks8)ckrqI0$p@e1Po^qbGo'u5$G39>[:WAra,\6@K'^:@q>RM!G6!DBE;g^rbDOND>nDRDfG\q!HN8\F9-N-rc\cqH$O^^ +H[L3hI=?WprdY6)JqAW-KS5'YLB!#/M#N82M?&S5Muo!!NrG+>OT1IAP5gaGPl-gHQN!6JR/WNP +ReiNPUA1M]V"gedVZ*LnVuWgrWr/prXT#=%Y5GF$Y5PR&YQD)8ZMq03ZtsRQD$#ugQM6[0Pl$aG +PlJu+c2Z&hc2Grechl)gd/_Voe,@eqeH4=RfDaD)f@\a/r06f:s-3DEnWNm8rKK3aG^=[_I=6Tq +J:`E,KnbA=M2I7NNK9-_P*2&pQ'[l*R@B\9SXuIHTqS3UUnjiaVPg>jWN#lss/Z1$r2oq#pTOLt +r2p"#s/Z*u!NE$lOo1=>NujCDS!ob4R$X,(Q'@MsP*1rhO,o<\N/W[PMM[1GL]3#0KnP-YK*$XU +Jc1-!J,Xo^IK"]qJ,Om!JV&LQK)pXZre>9FLl$tGMi +JcC<$JcFF'o`"gfrqu]ks8)ckrqI-#p@e1Po^qbGo'u5c;#a>h4o%564oRS<49&%T:&n)d:Amub;#=#g:Amuf;"[Wa +:B*WZ63'=L5QF+I63B_M9i1ge!)`_np/:r^r^m#[s%EAcrD!;es%iVjs&&eor_ikt?b?;?!Ue9?NFPCraGnPVJ%>Q%e->?^r/r`fP2>[1S-4S2MN;#a>c:A@W\;#bD3 +DZ"GPE;jkUEWC1[FT-F^G5c^aGl;pkH[:!bHhCG=/9Ll%"J +N/`mZOckllQ'I]'R$jG5S=Q7DTV8'RUSO]^VP^8hW2ZcqWrK."XSf4!Y4o-tY5GF%XT,@"WWB)t +r)ESmr)3Jj*`>k)R[KP1Q^3o%Pa%ApP*(ieO,f3YN/NRNM2@%Dre:K.KS9>W!ePuSrIFotrdO-\ +rdOlsrI=s#JqEuS!JH1+L2D^%M2@+JN/WaVO,oBbP*2&pQ'Rc(R@9V8SXuFGTqS6WUo(&fWN*## +Xfek3Z*UdD[^N]V]">Vg^;%J#_SjF5a2lBFbKS8WcdC.geC<%#f@\g2gYCWAhr*GPj5]4^k2tjj +l07L!m-O--rpKmWnc&(\oCV\Sp&Facp\jmeq>U6fqu6NkrUTr=s2t@l~> +JcC<$JcFF'o`"jgrVZWkrqZWjrV.-%p@e1Po^h\Fo'u5g=k65r7M&$&D#C]daHOjd*L%_bfe/PbK9\'s2b>b +bKTmF!0I/?oT&s4qi:W7rJ^`p"ieO#`5BIk_uIUQ_Z7RQ_Z[im_8*n^_>qFC_?.Qj^&DL@@/j[5 +@/jX?@UinYGDr9)rPJQM!5e`Os2+cO!_>mSr(?u^s%NAcs%`SirD3Pm;H!Kms&8turDir#=T2J' +=o_e+>R+P@?=.&I?t'%D!Fo[>AH?CUrb)=HCAquLCi0/h!H2rVE<1*$rcAQkG'8(RG^+L[H@(!d +rd>$#It*!!JUrFPKE$T)L&Qi,LB*/0M>rJ5MuJ\8NW5%F%X8T%"WMlcpVZW!ePuSrIFotrdO-\rdOlsrI=s#JqEuS!JH1+L1uF!M2@+JN/WaV +O,oBbP*2#oQ'Rc(R@9V7SXuFFTqS3VUnsueWN)u"Xf\e2Z*L^C[C3QT\\#Mf^;%J"_Sa@3`lQ6D +bKS5Vcd:(fe'uq!f@\d1gYCW@hVd>NioB([jlYail07L!rp0jVmdKW6nF?MK!qZ'Vrq6 +JcC<$JcFF'o`"jgrVZWkrqZWjrV.-%p@e1Po^h\Fo'u5.rBD>S/JD>.rB +D&./3Df0E-C2%?oARo:[@:3GK?(dj_T(JTOSGerVRf8]VR$X0=R/`TRR.tLqD>8#KDtn5KD#eJP +QiEBDQ2R$KQi36FQiEBKQi*0LPlQjCRM!G6!DBE;g^rbDOND>nDR +DfG\q!HN8\F:<;8G'A.TG^4U]H[C/>I0Y4NIt3'#JV*lRs+CB+reCH.!/UW2s,-i7rf$l:s,R)> +s,d8CrK@/Ds-3GHrg*PMq3_2Ms.T=aqP3q`pndqds/5mq!3,strN#mup9"@t!3c:(s0;U0rj2Q? +!,VLKr0Hu?l]h:3!6kDd!m]'8rQbAf!mo9>rm:\m!7Lhprm^qtrRV,'f@U#S!86Lun<3d7rffjW2]`qs/Z1$ +qQ9IoqQ9aus/Z*u!i`,srhfanqiUi=q2Z;[R@'A.QBd`"PEM)kOcYWbNfB!VMi.Lj!JlO1L'!'^ +K`6T*Jq8LOJH(,uId2@\IfForJ-(:RK)UB'KSBD[BnqM$M2I4MN/`jYO-#KeP*;/rQC!u,R[]e; +St;RJTq\?YV5L5jWiE/&Xfnt6ZEppG[^WfX]=bhk^VI\&_o9U7aN2NIbg"GZd*^:jeCE.%f\,!5 +gtgfCi8ESRj5]4^k3(sml0@U6liukFn*fc8nc&(\oCV\Sp&Facp\jmeq>^s2t@l~> +JcC<$JcFF'o`"jgrVZWkrqZWjrV.$"p@e1Po^h\Fo'u5%r_WAeq+q&gp/(cbs#p9Dr&t'Bpc\X@q`Xm?rB($RpJ1W^"&Mci;"d]_ +;"d]^:AmKX63]_@5X.Iu62a+P7S-9Mpepre!_>mSr(?u^s%NAcs%`SirD3Pm;H!Kms&8turDir# +=T2J'=o_e+>R+P@?=.&I?t'%D!Fo[>AH?CUrb)=HCAquLCi0/h!H2rVE<1*$rcAQkG'8(RG^+L[ +H@(!drd>$#It*!!JUrFPKE$T)L&Qi,LB*/0M>rJ5MuJ\8NW5%?gu.r`f>+r*0,)s'5k74?Pbi4?Yk*4RZ/I;#X5m +:/=V[peUW\!,_[PrGV[SrGhgW!-A-]rcS3`rHJ9d!."Ee!dfjW2]`qs/Z1$qQ9IoqQ9au +s/Z*u!i`,srhfdo<;]\n;Ya0*R[KP1Q^3o%P`q8nOcb`dO,f3YN/NSmM#iEfre:K.KS9>W!ePuS +rIFotrdO-\rdOlsrI=s#JqEuS!JH1+L1uF!M2@+JN/WaVO,oBbP*2#oQ'Rc(R@9V7SXuFFTqS3V +UnsueWN)u"Xf\e2Z*L^C[C3QT\\#Mf^;%J"_Sa@3`lQ6DbKS5Vcd:(fe'uq!f@\d1gYCW@hVd>N +ioB([jlYail07L!rp0jVmdKW6nF?MK!qZ'Vrq6 +JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nd"^Sn*fZ1m-FYoj,EPgn;d=*r/MSSNfK0A +EcH#8D/3m#BP(gd@q&kR?X@":h>c7/gAfk(f`0P6f%&9uda?Ihcd'h\bfe2Pr5f&^aiV^#O8b7? +O8+b2O8=kCNQ/rV`l?!:`5M;cs2"cPiPGT.r*o\6s'bn7rF,_8"*'*eZMVN8_>hCP8c;9\9E.]a +:&dug:]=2j;?'Pn;u]esQ.k.?!dM;#@LtK@U`hWAH$-@AnV*V!GQOmK)_CqsORTnb81=an3S"-(AT:qsQUSO``Vl6VqX0&M- +YctF>['d?O\@K2`]Y2(p_8=+.`Q#s>aihlOcHab`dF-Ooe^rF*g=k<:h;7&Ii8WeWjQ5OdkNM0p +lKdg'mI'uB!V#XYo)J:]o`"O`pAamcq#C0hqYU0gr;HTbrdk*ms*t~> +JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nd"^Sn*fZ1m-FY>q/5M8pMT_BokaPCqel:J +'6A26Df0E-C2%?nARo:[@:*AJ>lLAsT:Y\Gr1*bUrL3_Rqj7GQR$d_eph]qHr,2=KqelFNr0RGL +!L8uGQ2R$IQiEBGQi<$G51>QJ,:ra,n<@:Gqj%/Hrg*VXrLs(^qkO%aq5+%erMT[pri5sur2fUos/l@*r361*rj)R1pMK_lnWiF) +rg!?)rQb8crm1YmrmLeprm^tus47)!"PD>YfTbQ_mZRR51R**.H$XgbI=?]sJqJ]0L51SAMMmFQ +O,oBcP*;/rQC!u,R[]e;St;RITqS3UUnji`VZ*IpW2ZcqWrB(!XR*(gXT,@"WrK'uW;`\!VPU,b +Ulgf;OSOq;RJrQdQ^3o%P`q8nOcYWbNfK*XN/NSmM#iEfre:K.KS9>W!ePuSrIFotrdO-\s*jrs +rI=s#JqEuS!JH1+L2Md&M2@+JN/WaVO,oBbP*2#oQ'Rc(R$sM6S=Z=ETqS3UUnsrdW2ckuXf\e2 +Yd1UB[C3QS\[oGd]t_=u_Sa=2`lH0BbKJ,TcHjncdaZdsf@S[/g=tE=hV[8LioB([jlY^gkiq?s +lg4!*mf)YUnF?MKs766_rq6 +JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nd=pVn*fZ1m-@VL<:)jL4nq5.4nUr-4VU)$ +EcH#8D/3m#BP(gd@q&kR?X@"8:]4#g:]=2j;?h)3!F9%2?O'tI@:E\U@q>RM!G6!DBE;g^rbDOND>nD]DfBZ8EH6,AFEDYJG5c[dG^9:7 +#CCiGI=6QnJ,XuuJH1<$K*$^[L&Qi,LB*//M#rQmMuAV7N<#";O8k=@Oo:IBPQ$gDQ2[*KQiC"b +;ttt>5VV&>5hb)>l@n)>lJ%.4T7MB53YrC;#!iZ;#P;1DuO_SEW0tYF8g:[ +FoHR`G63#7H2`*iH2`-iHN8HaW!ePuSrIFotrdO-\s*jrsrI=s#JqEuS +!JH1+L2Md&M2@+JN/WaVO,oBbP*2#oQ'Rc(R$sM6S=Z=ETqS3UUnsrdW2ckuXf\e2Yd1UB[C3QS +\[oGd]t_=u_Sa=2`lH0BbKJ,TcHjncdaZdsf@S[/g=tE=hV[8LioB([jlY^gkiq?slg4!*mf)YU +nF?MKs766_rq6 +JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb%eTA`o'u595rK-r< +'m+M:EGo`2CMINrAn>L_@UWVN?c7/g&Th'f`0P6f%&9uda?Ihd*L"^bfn8QqT8,cqi:<0 +s,I*"r5S`T!6"NIrke]Qrk\ZQrke]Qm_\q?!PZ5G@K9j9@f9a6@/aR:DM+=Zq8*-Jrk\]P8c23\ +9E.]a:&dug:]4)k;,U?kE=?!dM;#@LtK@U`hWAH$-@AnV*V!GQrJ5 +MuAV7NW5%;O8k=@Oo1CAPQ$gEQ2fG7fDaG"g&'M$g]$".h#cHjhu;R4iVhg9j9+N+kNDg-rosIJ +rp'RNrU'ROq/9M2@.LN/is[OckllQ'I]'R$jD4S=Q7CT:hmOU8+N[V5:'gVuN[qWVrjrX8T-lXo5@#X8K!t +WW/prVZN`lV>d7mUS=HUrkA0@s-NhRQN!-UP`q8nOcYWbNfF$s!K2j7M#iEfre:K.KS9>W!ePuS +rIFotrdO0]rdOlsrIFp!s+:9's+CB+re>?HLl$tGMi3S"-(AT:hmP +USO``Vl6SpX/rG+YctC=ZaI6M\@K2_]Y2%o^r!t,`Pom=ai_fNc-FY^dF-Lne^i@)g"P39h;-rG +i8N\Uj5f=akNM0plKdd&m-X6?mfDqJrpg-^o^r.Us7ZKerV6EgrqcQirVZTlo)=4?bl<1~> +JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb&+oJao'u5.r1D>8#DD=_TBD>e>e +D00i=EGo`2CMINrAn>L_@UWVN?tUSc##WS,SlTRJNeAOD>J)ID#eJHDuOYOQi36H +Q2?mHQN3?GQiE?OQ2[*IQi<pQbcC!L$+Q9)hQa9`7]c +:B+,g:]aKl;Z9Vp<<#tt$G39>[:WAra,n<@:F8g7^Fa!b.!dK!9rd"TlI/\QoIK4lsJ-(:RK)UE&KE-`*LB!&/M#N82MZ8V5N;nn; +Nr>%=OT(C?P5^[EPl-dIT:l+UqP*k^r1s@h!2TUjr20Fj!N/9M2@.LN/is[OckllQ'I]'R$jD4S=Q7CT:hmOU8+N[V5:'gVuN[qWVrjrX8T-l +Xo5@#X8K!tWW/prVZN`lV>d7mUS=HUrfHo9s-NhRQN!-UP`q8nOcYWbNfF$s!K2j7M#iEfre:K. +KS9>W!ePuSrIFotrdO0]rdOlsrIFp!s+:9's+CB+re>?HLl$tGMi3 +S"-(AT:hmPUSO``Vl6SpX/rG+YctC=ZaI6M\@K2_]Y2%o^r!t,`Pom=ai_fNc-FY^dF-Lne^i@) +g"P39h;-rGi8N\Uj5f=akNM0plKdd&m-X6?mfDqJrpg-^o^r.Us7ZKerV6EgrqcQirVZTlo)=4? +bl<1~> +JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb$hX&]o'u59>[1Q??N+::?t!JQ@UinYrac+BBDuQFBkmW_$uBctDJjB3E,flGm8Wm]r`&hr +s&T,#q,dW"r`]8)qca#(qcj,*q-gH@1-hIt3*%K7nr5LP^kGN/WdXO-,TgPa.N#R$a;1 +S"-%@StD[LTq\sss/H$srhfgpV5=0e"/DTaU&Isb;?*!a +Q^7W9$'^X:P*(ieO,f5!MueioreUZ3L]3#0KnP-YK*$XUJc1-!J,Xo_IK"]qJ,OotJcC?%KE$T) +L&QgFLPUeDMMmFPNK0'\OHG]hPE_>uQ^F//S"#q>StD[LU8+N\VPgAlWiN5'Y->.8Za7'J[^`lZ +]=bhk^VI_'`5T^9aN;TJbg"GZd*^:jeCE.%f\,!5gtgfCi8ESRj5]4^k3(sml0@U#m-O--rpKmW +nc&(\oCV\Sp&Facp\jmeq>U6gqu-HjrUTr=s31Ln~> +JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb%J98_o'u5.:ObrD!;es%iVjs&&eor_rhr!*0#!s&T2&r`T8)!*fG-s'5V2ra,\6@K'^@@q9+] +AS,Oerb)=HCAquRCi+$,DJsH4rc%sZF8g7_F`qs-G6)r6rd+Tk!.=co!e,WKrdY'$JqEuSs+CB+ +rJ(?-!/UT1s,-i7rJ^c9s,R#uQ^F//S"#q=St;RITqS3UrhKRkVZ*LnW;ijp +Wr9!iXSo3tWrK'uW;WUqVPU-gU]I6brh0FeT:VYL]`sjjQBd`"PQ$^KOcYWbNfF$s#)e@qM26tC +re:K.KS9>W!ePuSrIFlss*j9^rdOlsrIFp!s+:9's+CB+re>`SLl$tGMic2W:~> +JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb&+oJao'u5t\Sb8NPS,8WSRJ`HPDY7lGD?=`oDYe5HDY\5IQi36J +Q2$[T9E%W`:&dug:]=2j;?'Pn;u]es +Q.n->l\41?NFPCraH+BA7T7_AnG]TBE;g^rbDaTD/F0.Df9UoE<1*$rcA3a +G'P5UUE +PlIESU&1S\U\^ecV>d@iVZNfrWVrgsX7r^mXo5C&YPYR'Z2M!,D#J5DQKsh8PQ7!=PQB"QrlkDe +"4#6=cMc)gd/MGkdf%YoeH4=Pec+,&f@JO)fDUs#PPC=>Ont7>P:q*'G^4U^I!pHoJ:W?*KnbA= +M2I4MNK0']OckomQ'Rc(R$sM6S=Q7CT:hmOU8.^`!Mu[mVuN^qWVidpX7NFkX8K!tWW/pqVZN`l +V>d7kUS@a]"/)9XT(n?NR$X,(Q'@L3Op-u0O,o<\req&>MM[1GLkkta!el;\rdt9(JV!cMrdXrs +l[Ab]s*suts+13%s+C?)!/:E,HA@<5M2I4MN/`jYO-#KeP*;,qQC!u+R@B\9SXuIHTq\o(2JFrUg6cp\4X]rqZTjqtp?irVc9cJcF!pJ,~> +JcC<$JcFI(o`"gfrqu]ks8)ckrqQNf!;?Eb&+oJao'u5L^@UNPM?!L3&r(m8d!)NDer(m5e!)NAdpceL:q`a^:q`b$CpeL`]s%`#Y +!)WVir(d/cnkK0Zqa(brD!;es%iVjs&&eor_rhr!*0#! +s&T2&r`T8)!*fG-s'5V2ra,\6@K'^@@q9+]AS,Oerb)=HCAquRCi+$,DJsH4rc%sZF8g7_F`qs- +G6)r6rd+Tk!.=co!e,WKrdY'$JqEuSs+CB+rJ(?-!/UT1s,-i7rJ^c9s,R#F_m8<^VqGI5g!)`8_!,_[Ps).mVrG_gX +rH%s[!d/U,rcJEgGB\:WG^045rHeKj!.=69qGm/ep/NbhGBeCZH[L6jJ:N3'K8#&8Ll%"IN/`jY +OHG]iPa.Q$R$a>3S"-%@StD[LTq\=]U]I^S#+1aCQ'IStrfRGIOH5H_NW+k@Mi*@JLkpicL'!'^K`6T*Jq8LOJGt&uId;F]IfFor +JH(3#K)^K'KE-`*L3eW2M2@+JN/WaVO,oBbP*2#nQ'Rc(R$jG5S=Q7DTV8*TUnsrdW2ZetXKAY/ +Yd(L?['mEP\[f>b]Y;.r_8=+.`Q$!?aihlPcHaeadF6Upf%8O+g=k<:h;7&Ii8N_VjQ5OdkNM0p +lKdg'mI'E2n*ol;o()DDo_nFap@n=[q#:*hqYU0gr;HTardk*os*t~> +JcC<$JcFI(o`"jgrqu]ks8)ckrV.$"p@e1Po^h\Fo'u5L^@UNPM?!Q:DhVJ1d"l%bag"=sTfDa>%e^OKF#gq#FcHa\Yb0'_*q2PN9NfNss +plPH8qi:W9s,d9'!QiCZ`W=&skJR)3rPSKKrPSTNs1o7V@:3GM?t!JO?t!PT@U`bSrEo_FMPn,] +_Z!1-9E.]a:&dug:]4,i;#jMm;Z]ouQ.k/?!^k:?NFPCraGq=A7Y[N!G6!D +BEr6dC27U$Ci0/h!H2rVE<:0%F8g7^Fa!b.s*+Nhrd"WmI!kpA!e,WKrdb$"!.t0%!ec8]rItB/ +Lku"ds,-i7r/CZ8s,R#n]1[LfDkWarPeWQs2G#VrknBF!5n]Ns2-O5GB\:X +H@('gIt3*%K7nr5LP^kFN/WaWO-#NfPEhE!Q^F20S"#q=St;RITqS3UrhKUlVPa?js/>ssql94f +qPsRpri#gos/,gmrhKRiUAghmTV%jJSt2CA]Y+3V$C@'EQ'IStP*1rhrf7GINJrgSMi*@JLkpic +L&m!]rIY0'JV!cMrdXorm!\k^s*suts+(0%re(6(FG5I(LPL\BM2I4MN/`jYO-#KeP*;,qQC!u+ +R@B\9SXuIHTq\ +JcC<$JcFI(o`"jgrqu]ks8)ckrV.*$p@e1Po^h\Fo'u5L^@UNPM?!O+tU&L\cT:YqNopl#Nr0mYRrg&!HiSbGQ2mfH2`*kH[L5?I0+kIJ,XuuJH1<#K*$^[L&H`-LPUcbM>rJ5Mu8P6NW5%:O8b[M +DZ4SNP5CsOUA:S\V#I4jVYm@lVuWgpWrK-qX8o=!Xo5F%YPYR(Z2M!*C]\I>Qh?[/Q1't9bQ,ob +cMl/hd/DAjdf7bueCE'urmgnss4@.4m$%:/qiU`ssql94fqPsRpri#gos/,gmrhKRiUAghm +TV%jJSt2CANfO(!$C@'EQ'IStP*1rhrf7GINJrgSMi*@JLkpicL&m!]rIY0'JV!cMrdXorm!\k^ +s*suts+(0%re(6(FG5I(LPL\BM2I4MN/`jYO-#KeP*;,qQC!u+R@B\9SXuIHTq\ +JcC<$JcFI(o`"jgrqu]ks8)ckrV.0&p@e1Po^h\Fo'u5b>4?W=#qEFg?n3$M0!'K^5 +!'L*@(3anCF)c/:DJX*'BP1pgA7B"U?XI)Dr_WMgrD!>gq,$c\qG?uOr]U0Cs#p!Q.k/?!^k:?NFPCraGq=A7Y[N!G6!DBEr6d +C27U$Ci0/h!H2rVE<:0%F8g7^Fa!b.s*+Nhrd"WmI!kpA!e,WKrdb$"!.t0%!ec8]rItB/Lku"d +s,-i7r/CZ8s,R#d7kUS@a]#G@]]St;LCSGQ.jQ^3r&Q'@JqP*(k*Nsgu-N/W[QMM[1GLkkta!JQ4*K*$XUJc1,u +J,Xo`IK"]qJ,OotJH1<$KE$UHKnb>;LPUeDMMmFPNK0'\OHG]hPE_>uQ^F/.S"#q=StD[LU8+N[ +VPg>kWiE/&Xfnt6ZEppG[^WcW]"G\h^V@V%_SjF5a2lBFbKS5Vcd:(fe'uq!f@\d1gYCW@hVd>N +ioB([jlYail07Kulg4!*mf)YUnF?MK!qZ'Vrq6 +JcC<$JcFI(p&=pgrqu]ks8)ckrqQNf!;?Eb!VH!_nd"^Sn*f]2m)]0b!0,ThrJg`8lAla-G^":P +F)c/:D/=!%BP1pgA7B"U?X@%;huDO5h>Z12gY1?[f_jA#ec=8!dgFONcd0n_c-+8Pao.;!Nqn\7 +Nr4t4OS=e@ONbnjaiMQDrPelW`9>,7_Y_7H_>qLM_Yq:QAn#4Xra5S2!+Pq;#\%4N?smDkR'lb, +s%<;ar_38bs%`Sir_WVls&/hps&B"ur`0)%=BPQ*!a8f4r`f\6?=$uG?smFB@L$CRA7]=aAnV*V +#AIpfCMRa&D>nDXDfBZ8EH6)@rcA3aG'Ll$tGMiYd*^:jeC<($f@em3 +gYL]Bhr*GPj5]4^k2tjjl07L!m-O--mdKW6naZ2@s766_rUp3a!;HEds7u]kqtp?ir;H3cJcF$q +J,~> +JcC<$JcFI(p&=pgrqu]ks8)ckrqQNf!;?Eb!VH!_nd=pVn*f]2m$Va.D=MN.D=)63D&7MCGBJ"K +EH#f4Chm`uB4b^c@U`_P?=!Q)s.TFb!M>t\Sb8NQS,Si\S!oe6R@%jaDYJ#GDXhZFRK&ZOQiE?O +Q1gO:QiEBKQ2[*KQiEBNQ2HmCPlR-KPlk)g=',2uq,dSs!bZe:r0.,Es%<;ar_38bs%`Sir_WVl +s&/hps&B"ur`0)%=BPQ*!a8f4r`f\6?=$uG?smFB@L$CRA7]=aAnV*V#AIpfCMRa&D>nDXDfBZ8 +EH6)@rcA3aG'ldJ_Mje,Ro!e^i=Mec44rPjFV2P5:=;Oth*&GBeCZH[L6jIt3*&K8#&7Ll%"I +N/`jYOHG]iPa.N#R$a;1S"#q=St;RITqS3UrhTRj!2f^ms/>prl`0r`ri#dns/#dmrhTRh!2BId +,+tR#St;LDS=?":R@'"pO-Z&rP`q;oP*(ieO,f3ZN/W[PreUl9LPLV=KnY3ZKE$Q'Jc1,uJ,Xoa +IK"]pJ,Om!JV&LQK78K-Knb>;LkpnEMMmFPNK0'\OHG]hPE_>uQ^F/.R[]hj +WiE,%Xfnt5ZEpmF[^WcW]">Vg^;%J#_Sa@3a2l?EbKJ/Ucd:(fe'umuf@S^0g=tH>hV[8LioB([ +jlY^gkiq?slg4!*mdBQ4nF?&>o)J:]o_nI_p&Ojbq#C0iqYU0gr;?Nardk*ps*t~> +JcC<$JcFI(p&=pgrqu]ks8)ckrqQNf!;?Eb!VH!_nd"^Sn*f]2lr3mFq)n@6!'^L^@UNPL>u1Dqr(m8d!)NDep.tT_q*+O9kbpJ(]a +r(d)alV7IE62WtJ62j1[6UF()6:4(*5sIM"8l>Rd!E<"s;ZBAh9E%W`:&dug:]=2j;?'Pn;u]hs +Q.k4?!^iE?XR8MraH+BA7T7_AnG]TBEr6dC27U$Ci0/h#B+R#EH-#>F8g7_ +F`qs-G63#7H2`*kH[L5?I0+kIJ,XuuJH1<#KE$T)L&Hc+L]<2/M>rJ4MuAV2;ZJrZ49%GA4oUT> +<;]\m<;BPk5qe.>$5#->5qh,>l@t&>QJ,:q`FjUqGQu`pe^lar_NSlm83h#!H2rV +EW'qVF8Bt^F`qqPG^'+2rd"Khs*FcoGBeCZH[L6jIt3*&K8#&7Ll%"IN/`jY +OHG]iPa.N#R$a;1S"#q=St;RITqS3UrhTRj!2f^ms/>prl`0r`ri#dns/#dmrhTRh!2BId%%s5b +St;LDS=?":R@*tN&sefJP`q;oP*(ieO,f3ZN/W[PreUl9LPLV=KnY3ZKE$Q'Jc1,uJ,XoaIK"]p +J,Om!JV&LQK78K-Knb>;LkpnEMMmFPNK0'\OHG]hPE_>uQ^F/.R[]hjWiE,% +Xfnt5ZEpmF[^WcW]">Vg^;%J#_Sa@3a2l?EbKJ/Ucd:(fe'umuf@S^0g=tH>hV[8LioB([jlY^g +kiq?slg4!*mdBQ4nF?&>o)J:]o_nI_p&Ojbq#C0iqYU0gr;?Nardk*ps*t~> +JcC<$JcFL)o`"gfrqu]ks8)ckrqQNf!;?Eb$hX&]o'u5qFOQ2R$J@/s^7?i=@@@:NeX +@q/tV?uV%$_>D(P8kVfN9`7]c:B+,g;#aDm;Z9Vp;ufqt$G51>QJ,:ra5\5!+Gk9 +!b5bOrac+BBDuQGBkhD^CB86grbhaS!-%pW!ci@'rcABfG'8(RG^+N4H3/G@I/\NqIXckHJH(3# +K)L<'KS>-YLB!&/M#E2'cMWh%OT(FCfDX@qgAK\/gtgfChV\7h!TE&9j8\0CjlY^gkl'cGlMp2K +li?GPmf)SSmd9u@s7$'Yr/^p#oud$No#U:?rl+qFg&L]_rPeWQs2G#Vrkn0@.!9]WG^=[_I=6Tq +JV&N-KnbA=M2I7NNK9-^P*2#nQ'Rc(R$jD4S=TYN#+qQ^Tq\ +JcC<$JcFL)o`"gfrqu]ks8)ckrqQNf!;?Eb$hX&]o'u5\;MDu4GDD&IYFG^":P +EcH&9D/3p$BP1mf@q&kS?X@$3rhBFds.KCa!1s(Ypmh>S!1a"WrgEhTq/,nEqJH.JpMU%LqeuM& +s-W\MoTo3;rg*DGrg*SNs-EYLqNUoCrg!PLqJlO9s&]/"oiD3&E.[qM"A2<[9MGCZs%`SirDnGQDZFbU +E<:0%F8g7dF`qqPGBe@XrH\NlI!kpA!e,WKrdb$"s+:3%!ec8]rJ(?-s+pW1!1j%Xqjd_'rGDFL +"E/0qTqVFZp7qM\rh]Xls/5jn"/i)sWViarX8B!tWrfB)Xo5F!Y6(r3YPtd)ZM\M=QM-[BQL0t( +PQkL=c-FVZc2,`bcN;J@dJ_Mndfe+JdaHVBeG[ntf(YErPP^O=Oo(:iF`qtRH?spdI=HcuJqJ`1 +L51SAMN!LRO,oBcP*;,qQC!u+R@9V8Sc52bT:hmOU8+L_U]RBiVZ!FlW;W^dWrB!sW;NRnVZ3Ll +V#R1iUAgkdTE(V`ScPCPrgORiR@'A.QBmf$P`q8nOcb`dO,f5!MueioreUZ3L]3&.K`Hf*KE$Q' +Jc1,uJ,XoaIK"]qJ,OotJcC?$K)pXZre:H/M#N6JMMmFPNK0'\OHG]hPE_>uQ^F/.R[]h +JcC<$JcFL)o`"gfrqu]ks8)ckrqQNf!;?Eb$hX&]o'u5r&sC1s%iSgq+^la +peUBSqG6]Xs%WDdr]^9F!CB*M5QF+L63'CP5lsA?6N07O7nrhY"A2<[9MGCZs%`SirDnGQDZFbUE<:0% +F8g7dF`qqPGBe@XrH\NlI!kpA!e,WKrdb$"s+:3%!ec8]rJ(?-s+pW1oi(cO"$AY,4T%A><;TVl +<;KVp5h\)>5_\(?2.\(>l\4/49/7O;Yj8c;"RQQ:]k'CE,bbqrc7sY!d&L) +rH/'_qKDpard"Hgs*XfGlrNs_oMk]f.!9]WG^=[_I=6TqJV&N-KnbA=M2I7NNK9-^P*2#nQ'Rc( +R$jD4S=TYN#+qQ^Tq\ +JcC<$JcFL)o`"gfrqu]ks8)ckrqI*"p@e1Po^qbGo'u5ohs +Pm*Jj_82G'ra>k9?XN_=$=[LTA7K+YAUp8Yr4rA+r_38bs%`SirD3Pm;H!Hl!`W0"r`9&#!*K5' +s&oD,r`oJ/!+,Y3s'Ph8raGq=A7Y[N!G6!DB`DcHCAquMCi+%gD?4Zprc.sY!-A-]s)e(`rdXlss+(0%re(6(!/:E,!JcL1M0Oo9N/WaVO,oBbP*2#n +Q'Rc(R$jD4S=Q7CTV8'RUnjiaVl6SpX/rG+YHY:;Za@0L\%0&\]Y(tn^VRe(`5Ta:aN;TJbg"GZ +d*^:jeCE.%f\,!4gYL]Bhr*GPj5]4^k2tjjl07L!m-O--mdKW6naZ2@oCMVQp&F^cp\agdq>^ +JcC<$JcFL)o`"gfrqu]ks8)ckrqI*"p@e1Po^qbGo'u5nGLDuX_JD&[kKH$=IT +FE2A?DJa0)BkV-jARf1X?sd5GTqVI[s.TIcs.9:_r13YRr1*hXrLQ.n->l\41?iOL6@K'^;@q9-LAH?CUrb2=G!,DLK!c2^jrb_aT +E;jkWEWC1[FT6I`G5c^cGQ<$gHN/?lI/\QoIK4lrJH(0#K)L?%K`?c)LB!eCSc##TScmCmVufdo +Qi!*9Q0jh9?3AErbfoq.rQbDhrQt\pdF%sA!7Ukq!7h(us4-1oqi^]9rK8UOG'A1VH@($fIXcm! +K7ei3L5:\CMi(`rdXlss+(0%re(6(!/:E,!JcL1M0Oo9N/WaVO,oBbP*2#nQ'Rc(R$jD4S=Q7C +TV8'RUnjiaVl6SpX/rG+YHY:;Za@0L\%0&\]Y(tn^VRe(`5Ta:aN;TJbg"GZd*^:jeCE.%f\,!4 +gYL]Bhr*GPj5]4^k2tjjl07L!m-O--mdKW6naZ2@oCMVQp&F^cp\agdq>^ +JcC<$JcFL)o`"gfrqu]ks8)ckrqI*"p@e1Po^qbGo'u54T@M04Sh5444o7A@4nh/?4o@MC +:]4&a:%__:Amod:&mKS57'SO:JX5@6:!k&r]gHLrBgKL#!t[D6:OREr)3Sgr_38b +s%`SirD3Pm;H!Hl!`W0"r`9&#!*K5's&oD,r`oJ/!+,Y3s'Ph8raGq=A7Y[N!G6!DB`DcHCAquM +Ci+%gD?4Zprc.sY!-A-]s)e5h\)>5_Y*>lJ%(>l@q.?N*(c;=[W];>j>Z:\@Qa +?Mnd@E<(%XF8p:\ErpH+G5ZXbG5ladGl;peHN&9iai_fNc-FY^dF-Lne^i@)g"P07h;-rF +i8EVTj5f=ak3(sml0@U$m-X6/n*fc9nac8BoCW"Ss7QHer:p +JcC<$JcFL)p&=pgrqu]ks8)ckrV-rup@e1Po^h\Fo'u5bK@rKaSj0Z`rF![`l5m7qnrBN!5ncRr58NNpVZR=qj%)F +qSE;sQBq8Q!b#PIrF5nPO/i2q!_Z3\rD!;es%iSis&&eor_rhrs&K&!s&T2&r`T8)!*fG-s'5V2 +ra5\5!+Gk9s'l%>rac.CB4q3W!GQnDSDfB[pE<:0%F8g7_F`qs-GQ2mfH2W$jH[L5? +IK+crJ,XuuJcC?$KDj'hcMu/ecM`juOTLWsf`'S$gA0M'g]610hZ)L4i;_d9ir8!Y0g].;mn&5(Arl"cQo"lkuFa&%SH?spd +I=HcuJqJ`1L51SAMMmFQNfT9aP*;,qQ'Rc(R@9V7S=TYN!M?%aT`Us`U].(hV>mFhVt-e_VuNXn +V>d:jU]7(fU&UbcTDkDnSXc4>S!ob5R$a5+QBd`"PQ$^VOcYWbNfK*XN/NUOM2@%EL]3#0KnP-Y +KE$Q'Jc(&uJ,OicIJnWpJ,OotJcC?$KE$T)L&QgALPUeDMMmCON/`jYO-#KeP*D5sQC!u+R@9V8 +SXuFGTqS3VUnsrdW2ZetXKAY/Yd(L?['d?O\@K2_]Y2(p^r!t+`Pom=aND]Lc-FV]dF$FmeCE1& +f\,!5gtgfDi8ESRj5]4^k3(t-klpA^ +JcC<$JcFL)p&=pgrqu]ks8)ckrV-rup@e1Po^h\Fo'u5DJa0(BkV-jA7K(W?sd5GTV8(YUA^bdTV)+Pq4.AR!1a"Ws).[Omr&,Ar,2CMqJQ>%s-`nS +r0Qu?pm:oErg!>Grg!>ErK[>Ip2U+tr0@G&EH,%LQ.n->l\41?iOL6@K'a9@fU'=AHHIVBDuQFBkmW_s(h[Prb_dUE,ber!ci@' +rcA3aG'ofbl,fc +c2c2hd/25hdf7ereGn"se,e+Nj-0A'p6#B<.WffWGBeF[H[U/9Ll%"IN/`jYOHG]i +Pa.N"Q^F20S"#q=rgj._T`1VdU8+L_V#R:kVY[4]W;Vg^V@S$_Sa@3a2l?EbKJ/UcHstde'umtf@S[.g=tE=h;@/KiSrnXjQ5Oekl0fM +lKdg'mI'uB!V#XYo)J:]o`"O`pAamcq#:*hqYU0gr;HTbrdk*qs*t~> +JcC<$JcFL)p&=pgrqu]ks8)ckrV-rup@e1Po^h\Fo'u5DJa0(BkV-jA7K(W?sd5Gr_EGgs%r_kqG%#do2,B]r]^!O +D?=`qE;jhYEcZ=$F96T.G5c^cGQ<$fH3/G@I/\QoIfFosJH(3#K)UE$;#X>k;YF&]4o[\G4nhkT +<;BPos(7E;>*o];>j>Z:\die?2n1/E;abXEcZ=# +EWpN+F`hnPr-&'`rceEgrd+Tk!.=ZDlrNs_oMkij.WffWGBeF[H[U/9Ll%"IN/`jY +OHG]iPa.N"Q^F20S"#q=rgj._T`1VdU8+L_V#R:kVY[4]W;Vg^V@S$_Sa@3a2l?EbKJ/UcHstde'umtf@S[.g=tE=h;@/KiSrnXjQ5Oe +kl0fMlKdg'mI'uB!V#XYo)J:]o`"O`pAamcq#:*hqYU0gr;HTbrdk*qs*t~> +JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nceRQn*fY`r/C]:q2GB5oSr^+m>_+*qN(B4 +s,e=NI=$9cGBS(LEH,o7Chmd!BP(gd@q&kR?X@!ohYc:2hZ)C8gtUQ9f\$&Prmq,"rmV"uda7HE +p5f66pQ,-3s3Ctrc-+;QaiMNDrl=uWs2=uVr586Ho#("7s-0 +T"2\R9`7]c:B+,g;#aDm;Z9Vp<<#ttlS(0?N+=3?iXX7@fKp&!d/[0rceBe!."Nh!dfOSP%=OT3u4g&'M#g]-(.h>c@2hZi#tiSrkWj8S->jo=KBk61#5l0@U5m.B]Emf)\VnrWIb +qo\ZTlcB"Eqo8V?s'+:Yo#:IDqSiHPrPSd@WVuERnV>R.hU]7(fT`UmZTDkDsSXc4>S!oe6 +R$a5,QBd`"PEV/mOc]R'!KN0=MueioreU]4LPPk`!el;\re(6&s+1)urdXornU:@bs*srss+13% +rdt`7KnY89LPUbCM2I4MN/`ksO)0o@P*;,qQ'Rc(R$jG5S=Q7CTV8'RUnjiaVl6SpX/rG+YHY:; +Za@-K\%&u[]=bhk^VI\&_o0O6aN2KHbKS8WcdC.ge'uq!f@\d1g>(N?hV[8MioB([jlY^gkiq?s +lg4!*mI'H3nF?&JncJFTo`"O`pAamcq#C0hqYU0hr;?Nardk*rs*t~> +JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nceRQn*fY3r,(\9kABO&++AWbH?j^XFE;GA +Df0B,C1q9mARo:[@:*AJ>bIa`U&LebT`LgYr13VQr1*nZS"'1jqJY;0rL*eUR$dl>nWrm8r0@>J +pm1c@rK[;Hp2U+tr0I;Hs-3P'r`8eqs&T/$#$l(oNg#Z#rD!;es%iSis&&eor_rhrs&K&!!`rK+ +r`T8)!*fG-s'5V2ra5\5!+Gk9s'l%>rac.CB4q3W!blCarbDROD/K8i!H2rUE<:0%F8g7_F`qs- +GQ2mfH2W$jH[L5>I0+kIJ+]?0Sc>5USc3L+DYn;KD#\>PUA(G^V#7"eV#R:gVZ3RoW;`grX8]4! +X8f:#XT5O&YPt^$YQ(j+YlV.Io9T<@qj-B0p6>P]s',EFrQY>erQkJirR(VmqpYPos4-+mqi^`: +rfSdRF`qtRH$XgbI=?ZrJV/T.L5(M@M2R=ONfT6_P*2#nQ'Rc(R$jD4S"-&KScPIVrh9@d!2KLg +s/#^llDOWYs/#Xhs.fUgrh0CdT:c+S'qLkbS"#k8R@'A.Q^3o%P`q;oP*(k*Nrb9#repl9MZ/G6 +LkgcbL'!'^K`6W(K)^E"JGt&tIdqjbIfFoqJH(3#K)UB5KS>,7L51S@M2@+JN/WaVrf:lWP*2#n +Q'IZ%R$a;2S"-%@StMdNU84T]VPgAlWiN5'Y-5(7ZEppG[^WcW]">Vg^;%J"_Sa=2`lQ6CbKJ,T +cHjncdaQ^rf%8R-g=k? +JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nceRQn*fXCr&`q$niQ5$r&ap@)h*3^H?j^X +FE;GADf0B,C1q9mARo:[@:*AJ>l@Fs:]F8k:]!oe:\dib;$'Qi:\m9/4oRPE:JUmbrD*;cr_E2` +!`2ZgoM5E^r_WMgpJ(``:Amoe5PRM@;#3uf5llS(0?N+=3?iXX7@fKp&!d/[0rceBe!."Nh!dfQ8[AEW'nXEW0t[F*)O%FoHR_G63#7H2W$iH[PWhlrNs_ +oMd>_F`qtRH$XgbI=?ZrJV/T.L5(M@M2R=ONfT6_P*2#nQ'Rc(R$jD4S"-&KScPIVrh9@d!2KLg +s/#^llDOWYs/#Xhs.fUgrh0CdT:c+S'qLkbS"#k8R@'A.Q^3o%P`q;oP*(k*Nrb9#repl9MZ/G6 +LkgcbL'!'^K`6W(K)^E"JGt&tIdqjbIfFoqJH(3#K)UB5KS>,7L51S@M2@+JN/WaVrf:lWP*2#n +Q'IZ%R$a;2S"-%@StMdNU84T]VPgAlWiN5'Y-5(7ZEppG[^WcW]">Vg^;%J"_Sa=2`lQ6CbKJ,T +cHjncdaQ^rf%8R-g=k? +JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb%eTA`o'u5L_@UWVN?!RBdro!h6s5*e3"l.kdg"=sRfDaA"eH47Le*E+` +O84n:cNMPral+A!,):Es(MIJ +rbMOM!,_^Qs).mVrc.sY!-A*\!d/[0rceBes*=Ti!.4Xe!6Y;arQP2arQb8arQb>%!0I2@rfI&? +s,d95s4R;'rS.>,rS@M1rnmb7s5O(=s5a.?!9X:Ds6'XNlKdd&m/?>Om.fuJmf2_WnF?,KaR[FQ +b4Wm?aSNm[>[(E9>$9Y\!64TKo>L:=r5/JU.WorZG^=[`I=6TqJV&N-KnbA=M2I4MNK0']Ocklk +Q'IZ%R$a;1S"#q=rgj1`TV2:X!huHbr1s=grMK4br20Iir1s@fs.]Lds.KCargj@cS=H(rfmMKPQ$^LOcYWbNfK+uMueioreU]4LPPk`!el;\re(6&s+1)urdXlqo6pRdrdXlss+13% +re(6(!/:E,!JcL1M/\?1N/WaVO,oBbP*2#nQ'IZ%R$a;2S"-%@StMdNU84T]VPgAlWiN5'Y-5(6 +ZEpmF[^N]V]">Vg^;%J"_Sa=2`lH0Bb0/#RcHjkbdaQ^rf%8O,g=k<:h;7&Ii8N\UjQ5OdkNM0p +lKdd&m-X6?mfDqJrpp*\!;-9`s7ZKerV6EgrqcNhrVZWmo)=4?d/SU~> +JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb%eTA`o'u5lLGpUA^bdTV).QpmhATr1*V$no*Z.r0dYSR/NBCQLpO8QN*6J +Pl6mGQLo.sQ26gHQ26^HD/jRkQ.n->l\41?iOL6@K'a9@fU'=AcH?BBDuTEB`MoIC]A2ND>nGQDZFbUEW:%ZF8^1^F`qs-GQ2pf +H2`*iHi'<*SFW6KD"VZFD"j_)V#-qdV#I4hVZ3OrW2Zbrr2]gu!3?+#rN-(&ric4%qQKq's02R1 +mZmj>qNg0,qNM1h>?b97=j-fgrQY>erQkGhrmCVkrmUboj-/qps)]`5GB\:XH@1-hIt3*%K7nr5 +LPUeEMiWs+:9%r.+cr +rI4?drI4`qrIFp!s+:6&s+CB+re:H/M#N6MMMmFPNK0'\OHG]hPE_>tQC!u+R@B\9SXuFGTqS3V +UnsrdW2ZetXKAY/YctF>ZaI6M\@K2_]Y2%o^qmn*`5Ta:aN;TJbg"GZd*^:jeCE.%f@em3gYCWA +hr*GOioB+]k2tjjl07L!lg4!*mf)YUnF?MKs766_rq6 +JcC<$JcFO*o`"gfrqu]ks8)ckrqQNf!;?Eb%eTA`o'u5i:B+,a;#F2j;"d*04oRPH:JOY\:]!le:&[oa +:]F/i:]=2i:\@K^:B45h:\7E^:%U^J;"dZf4?u.u62j1[5sR\$6:4()5X@n5:fIjs&&Vhr_`Ympf%,Qr&j^:q,@;mrDihtoN1unqcWr$ +s&oA*rEK5*s',>)"']#7>Q%e,?1(Pi;X73Y;"%0g>[(E9>$5f`EH6)>ErL%_EcZ;DF`hg*Fo?L_ +GPugdHN&9e +JcC<$JcFO*o`"jgrqu]krqZWjrV.?+p@e1Po^qbGo'u5%=O8t@9O<9++J:;onH?aXVFE;G@DJj9+C1q6lARo7Z?sd8HhV\=js5=+=hr!;IrnR_3 +g=b-2qUbYrs4%,!muRO3qN1**rK.!(s3:Sf"3\j0ao0<[a8a-Z`UCbA_u@UO_u%:N_u@OEQMA>m +_>;"LQBhASrEoS4$=RCbNM]EE:/4S\rDlI4i;_g9irJ0=jo4EBk6C/7lK[^$m/?>N +m.fuImK;qInauXukfN,2r5\iWs',M,rE7tVrl4NJo>L=>rPC@3FEMbNG^4U^I!pHoJ:W?*KSG5: +M2@+KN/`mZOHG]iPa.N"Q^F/.R[]e:SXl@DT:_eUU&UkeU\gkcV=^Y`V>I(fU]7(eU&UbcTDb>d +SXc4>S!oe6rg3_QQN!-MP`u*0%$?X5O,o<\NJrgSMMhCi!JlO1LAuu-K`6W(K)^E"JGt&rIeA-f +If=ipJH(3#K)UCPKS>,7L51P?M2@+IMib]Y;.q_8=(-`Pom=aND]Lc-FV]dF$FmeCE1&f\,!5gtgfCi8ESR +j5]4^k2tjjl07L!m-O--mdKW6s7-*Z!qZ'Vrq6 +JcC<$JcFO*o`"jgrqu]krqZWjrV.?+p@e1Po^qbGo'u5lS(0?N+=3?iXX7@fKp,s',M,rE9-D!mSs5rQY;drQkJirmC_nrR1o!e'ujqifikp1NRY\ +G'A1VH@($fIXls"K7ei3L51VBMN!LRO,oBbP*;,qQ'Rc(R$jD4S"-%?St;RHT`1YbUAq"cV#@.^ +VZ!@gV#I.hUA^ecTE(V_Sd1gVS=?":R[O/B!LK,OPl[,5rfR\POH>NaNfB$WN/NRNreUZ3L]3&. +L&Zi*KE$Q'Jc(&tJ,FcgIJnWoJ,FisJcC?$K7AQ.Knb>;LPUeDMMd=NN/`jYO-#KeP*;,qQ'Rc( +R@9V7S=Q7DTV8'RUnjiaVl6SpX/rG*YHY7:Za7'J[^`lY]=bej^V@V%_SjF4a2l?EbKJ/UcHstd +e'umtf@S[.g=tE=h;7)JiSrnXjQ5OdkNM0plKdg'mI'E2n*pAIrpg-^o^r.Us7ZKerV6Egs8)Th +rqu]mo)=4?dJn^~> +JcC<$JcFO*o`"jgrqu]krqZWjrV.?+p@e1Po^qbGo'u5 +9heAX:J^pcs&&eorDNbsral+A!,)7D!blCa +rbDROD/K8i!cN$src.sY!-A*\"Eem2GBa$a!Du\i;>jDm;>X2h;>sJg;u/TO4T%A=;uTbr"=oDG&=oDP(>Q%h+>Pqb&>6A,7>[>fUrD<,^s',M,rE08BEH6&rfmMK +PQ$^ROcYZcO,f3ZN/W[PMZ/G5Lkktas+UK+re(6&s+1)urdXipomQdfrdXirs+13%re#]RKnY89 +LPL\BM2I1KN/WaVO,oBbP*2#nQ'IZ%R$jD4S"-%@T:hmOU84T]VPgAlWiN5'Xfnt5ZEpmF[^N]V +\\#Me^;%G!_SX71`Q-'@b0.uQcHaeadF6Upe^rF*g"P39h;-rGi8N\Uj5f=ak3(sml0@U$m-X6/ +n*fcGnc&(\oCV\Sp&Facp\jmeq>^ +JcC<$JcFR+o`"gfrqu]ks8)ckrV-EfpAX^co^i(Q)=d4bn*]T0lg!a!kN:pfj5T%Uhqd,Cg=_J[ +NpVi(Nr+n0OL^@UNPM?/OPtro*n:%,p.&hqm2FgtUQ9 +g"?/Qqpt_,rfI#3::J^pcs&&eor_rhrs&K&!s&]5&r`T8)!*fG-s'5V2rEfV6@:B.E +!b5bOrac.CB4q3Ws(MIJrbMOM!,_[P!cN$src.hWrQG/`!6b2\s3(AbrQP>drltAbrltJgqiUf< +q2YW>YcudZg&0P*gYCT\h>c=7hr*GOir.p:jo4EAk5sl3l2KuJlh]uCmJlVSmfN"Lo^p5kam@+E +a8]?A=oVS(=5NuF`r3mM`:q1K_Z.ORF=_TZGBnL\I!pHnJ:W<)KS>/9Ll%"IN/`jYO-#NfPE_>t +QC!u+R@9V7S=H/LScYOWT`1YbUAgqaV"CMZV#I.hUA^ecT`:Y`T)Y>]SGo#XRK/cTQk>[NQBd`" +PEV/mOcb`dO,f6[repl9MZ/J4L]E50LAur-K`-Q'K)^E"JGjuqIeeEhIf=ipJH(3#K)UE&KE-`* +L'EEhLl$tGMuJZPNK0'\OHG]hPE_>tQC+&-R[]e:SXuIHTqS3VUnsrdW2ZetXKAV.YctF>Za@0L +\%0&\]Y(qm^VI_'_o9U7aN2KHbKS8WcdC.ge'uq!f@\d1g=tH>hV[8LiSrnYjlY^gkiq?slg*p( +mI'uB!V#XYo)J:]o`"O`pAamcq#:*hqYU0gr;HTbrdk*ss*t~> +JcC<$JcFR+o`"gfrqu]ks8)ckrV-EfpAX^co^i(Q)"I+an*]T0lg!a!kN:pfj5T%Uhqd,Cg=c"6 +m;;9/+bPAsIsufmH?aXVFE;G@DJj9+C1q6lARo7Z?sd8HTV/"XUAUbeU7qRZ!1s+Zpmh>SrGV[Q +iG\@+rL3bSqj.;KrKmDIn<`j7q3:rGrKm%oqNh/HqNUrDrg*MJrKR:]q,R]*CJ@Q!:J^pcs&&eo +r_rhrs&K&!s&]5&r`T8)!*fG-s'5V2rEfV6@:B.E!b5bOrac.CB4q3Ws(MIJrbMOM!,_[P!cN$s +rc.\$p7)&O!1WbRoUYkrr+u@JrG;LNs+U?FrM'1arhTRjrMKRms/Gjqs/Z4&n#lVmr3-7-ZEsIq +l'C4ls'#A(s&]>(bKKk.rQY>erQkJir6bPm!7Ukos3okhoTK6rgj1`TV2:Xs.]LfqP +JcC<$JcFR+o`"gfrqu]ks8)ckrV-EfpAX^co^i(Q)"I+an*]T0lg!a!kN:pfj5T%Uhqd,Cg=c?c +s#^$=m5sl$rAu0TJq/?"I=$9bGBJ"KEH#f5Chmd!B4b^c@U`_P?X6B#:AI]c;#X8i:B+,b:]OAl +;Wg744o%5=:%V3[:]=,h:]+&e:\RW]:\[]`:\R*S5Q!eE;"@EV:]aEY62j1N62j.K6Np"T:/4S\ +rD* +r`T8)qHNo's',M,qca)+?-cCH;#!id>5_V(=92KCrc%jV!ci@'piHR[G'/9Ll%"IN/`jYO-#NfPE_>tQC!u+R@9V7S=H/LScYOWT`1Yb +UAgqaV"CMZV#I.hUA^ecT`:Y`T)Y>]SGo#XRK/cTQk>[NQBd`"PEV/mOcb`dO,f6[repl9MZ/J4 +L]E50LAur-K`-Q'K)^E"JGjuqIeeEhIf=ipJH(3#K)UE&KE-`*L'EEhLl$tGMuJZPNK0'\OHG]h +PE_>tQC+&-R[]e:SXuIHTqS3VUnsrdW2ZetXKAV.YctF>Za@0L\%0&\]Y(qm^VI_'_o9U7aN2KH +bKS8WcdC.ge'uq!f@\d1g=tH>hV[8LiSrnYjlY^gkiq?slg*p(mI'uB!V#XYo)J:]o`"O`pAamc +q#:*hqYU0gr;HTbrdk*ss*t~> +JcC<$JcFR+o`"gfrqu]ks8)ckrqQNf!;?Eb,kU^!o'u5inb/qcHaiMQD +a2Z-u`ULhG_t_1I_Z7RQ_siuj_u@OK_=b\;_>dgA?2e.5A55lq:]4,i;?'Pn;u]hsQ.n-?2n71?NOVD@K'a9@fU'=AcH?BBDlKFBkhD^CB/2HaSX*Zb5TT`bQ,ibb5]T^aoKW` +bl>rebQ,o`bl>rfcMN_%Oo(7:Yl38TgA]k%h>c=9hr*GOioB(uj8e<@k5OQCkQ'lGlMp2Im.fuJ +mf2_WnF?/?aR@7=aSai_fNc-FY^dF-Lne^i@(f\5'6gtgiEi8ESRj5]4^ +k2tjjl07L!m-O--rpL*]naZ2@oCMVQp&F^cp\agdq>^ +JcC<$JcFR+o`"gfrqu]ks8)ckrqQNf!;?Eb,kU^!o'u5Q.n-?2n71?NOVD@K'a9@fU'=AcH?BBDlKFBkhD^CB/2H +RJ**?S+rNGSbm7%D>S/GL&IeEUAL_cV#R:iVZ3RoVuiruWr&h(XKAV-Y-5%3Y-"i#Y5GL%YlCs0 +Z^-pRQgC$rQ2Okc=T2A'lci2;kdJ_MmdJ_MMPOt"fF*)PJGBeCZH[Uai_fNc-FY^dF-Lne^i@(f\5'6gtgiE +i8ESRj5]4^k2tjjl07L!m-O--rpL*]naZ2@oCMVQp&F^cp\agdq>^ +JcC<$JcFR+o`"gfrqu]ks8)ckrqQNf!;?Eb,kU^!o'u5u"*g:AI]c;#*o^ +:]XEkl9522ofi::s$$fp.kK\qG.#cr]g?HpHSRPnk]*Ys%`VkpJ:fU +#XCU=5XS:A:J^pcs&&eor_rhrs&K&!s&]5&r`T8)!*fG-s'>Y2ra,_7@:B.Es'l%>ral+A!,)7D +!blCarbDLMr)!Gjqbd,dnko6[!)`YlqGZuIs#g-K!*&nqs&B"us&T,#qc5MP(>lIt,>5DG'?-?+D;#F,f=oVV'-ZL&m'creUf9Miu +Q^F/.R[]e:SXuIHTqS3VUnsrdW2ZesXKAV.YctC=Za@0L\%0&\]=bhk^VI\&_o0O6a2lBFbKS5V +cd:(fe'uq!f@S[/g=tE=hV[8LiSrnXjQ5OdkNM0plKdg'mI'uB#Oq9Ro()DDo_nI_p&Ojbq#C0i +qYU0gr;?Nardk*ts*t~> +JcC<$JcFR+o`"jgrVZTjs8)ckrqJ5Bp@e1Po^qbGo'u5qLQ;#aDm;Z0Po<<#ttlS+0?N+:5?t!LC +@fKp=A7bbZr5S]Up;m0Rs2t2]!6Y5]qo\r^!R/adbl>l^bl5iecM3M"OnQ!Zg&B_)g]-()h>c=8 +hr*JPioC%!#3G"0kNM-orojCHrTaCJr9X1Fs6fpU!qGp)mE"k?nAt@Es&oA(s&],!huE#^rPeNL +pr!*J.s#fTG'A1VH@($fIXcm!JqJ`1L51SAMMmFPNK9-^OcklkPa.N"Q^F/.Rf8cXS=Q5MScYOW +T_tM^UAUe]V#-qcUAU_bT`1S_T)YA]SGo#XRK/cTQi`V?QN!-MP`u*0#Eb+0O,o<]NW+kAMi*CK +M26tCrItB-KS9;Vs+:9%qgeWpnp^Oeqge]ts+:6&s+CB+re>NMLkpnEMMmCON/`jYO-#KeP*;,q +Q'Rc(R$jD4S"6.BT:hmOUSO]^VPgAlWiE/&Xfen4Z*UdD[C3QS\[oDc]tV7s_8=+.`Q#s>ai_fN +c-FV]dF$FmeCE1&f\,!5gtgfChr*JQj5]4^k2tjjl07L!rp0[Qmf)YUnF?MK!qZ'Vrq6 +JcC<$JcFR+o`"jgrVZTjs8)ckrqJ5Bp@e1Po^qbGo'u5Q.n-?2n71?NOVD@K'a9@f^+OrgEPKp6kWCnsfWK!1WnV +pRV>Uph]nGr.b*&!2K@ar1j:f!2]XkrhfjsWN)uqX8f7%XfhW+!3Z='pTFCsrNH=-Zhp'bQg^7! +Q2b"e=T;J#dbU,[Ot1TqF`qtRH$XgbI=?ZrJV&N- +KnbA=M2I4MN/`mZOHG]hPE_>tQC!u+R@=,E!h>gPrgj1`TV24VrM'4bpn[e^rM'4`s.K@`rgs.\ +s.'(Xs-`qUrg3bRQBqN8!L/fIOp@,2OH5H_NfF$s#E+IsM2@%EL])r/KnP-XKE$Q'JbsurJ+A'e +J,=crJcC?$KE$T)L&QgKLPUbCM2I4LN/WaVO,oBbP*2#nQ'IZ%R$a;1S"#t?StD[LTqeEZV5C/h +WN)u"Xf\b1Yd(O@['d?O\@K2_]Y2%o^qmn*`5Ta:aN;TJbg"GYd*^7ieC<%#f@\d1gYCW@hV[8M +ioB([jlY^gkiq?sli-5OmI'uB!V#XYncJFTo`"O`pAamcq#C0hqYU0gr;HTbrdk*ts*t~> +JcC<$JcFR+o`"jgrVZTjs8)ckrqJ5Bp@e1Po^qbGo'u5u1Dor_NJf +!`)Whr(lu^cT_=k!Ba-T:%D$Z:]4&g:]+&h:\.?Y:]4&e:]ETX4odhH55meC55e=P:\IWK:]+&h +;?'Pm;u]hsQ.n-?2n71?NOVD@K'a9@f^+Oohb?Zp/:BWr)!Djs&/Vj!*&SP +rC?]Ts&B"ss&8tur`9&#qH!Jps&]8(pK7;qr`]5(rET>+!*]5'!*mQAr)!Drs&f;&r)Wf9s)S-\ +"a"g,FE;O&F9$I^G5c^aGQN2tQC!u+R@9V7SXuFFTV8'SUnjiaVl6SpWiW>)Y->.8Za7$H +[^WcW]">Vg^;%J"_Sa=2`lH0Bb0/#RcHaeadF6Upe^rF*g"P39h;-rFi8N\Uj5f=ak3(sml0@U6 +liHMArpKmWnc&(\oCV\Sp&Facp\jmeq>U6fqu-HkrUTr=s3gpt~> +JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nh'D$n*f]3m-Es$l0%3kjQ#:Zi8OT(C@P5:=7bK@rKr5eoY"NJL%`PprWr58N!rKdJMpQk]orkeTLrPJQOrPIp;r5/3Gn&56t!*fD,!+#N@ +rl+fRrl+fTrQ"cU!6P5]r5nu]s3(Gbs3(Gbr5niY"O"s2bKTq.prrc_rK$f:!3u."rn7A,r7q5+ +rS@Y6i8NYoj8\3Ek3(pkl0A01s6BXMq<[nDs6^$YnF5u?r5n?IouZgHouI)7s&](us&J"Ws2FtQC!u+R@9V8SXuFFTV8*TUnjiaVl6SpWiW>)Y->.8ZEppG[^WcW]">Vg^;%J"_Sa=2`Q-'@ +b0.uQcHab`dF-Lne^i@)g"P07gtgiEi8ESRj5]4_k3(sll07L!m-O--rpL-^naZ2@oCMVHrq6 +JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nh9P&n*f]3m-Es$l0%3kjQ#:Zi8Q%e,?2U)`RJ<0GR/i]TRJ**? +RfJuXS,AfNSH,8TC]K7cLAZc#UA^hiUnsobVZ!CoW2ZcmX8]1%Xfel,Y5PKsY55@$YQ;#8p6P`F +mZujts&f;&qc<_s!mJj2rQP8d!6tMgrQkMjs3^bkrmC_ngQVAp,B@mJFa&%SH?spdI=HctJqJ]/ +L5(J?M2I4MNK0'\OHG]iPl?pOQC!u+R@=,Es-s([rLX%]s.K7_qkEq^qP*h[s.K@`rLX%[!1a"W +!h,OFrg3bRQBqN8#F(F9P*1riOT(:ANfF$ss,-l7re^Z2!/LQ.s+UK+rIb-%s+1&trI=EfrI=]p +s+13%re(6(s+UK-s+^T1reY`SMitQC!u+R@9V8SXuFFTV8*TUnjiaVl6Sp +WiW>)Y->.8ZEppG[^WcW]">Vg^;%J"_Sa=2`Q-'@b0.uQcHab`dF-Lne^i@)g"P07gtgiEi8ESR +j5]4_k3(sll07L!m-O--rpL-^naZ2@oCMVHrq6 +JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nh'D$n*f]3m-Es$l0%3kjQ#:Zi8u+8o:B+,g:'+3f;#=&`:ujh=5O1K6:JUj_o1o6[!)EMhqG?]WqbR5er_NJVr'(6H5.q,-WXqG@5jr_`GgmSWs[rDE8erAsd:njiXXs&J_mqcESqs&o>' +rE9/(r*'5+>?h#1s'#J,qHEr)_GU>8s&](us&B,>EH:hqs)e6_rc\6as*+QiHN&9kI,7oro(2JFo`"O`pAamcq#C0hqYU0h +r;?Nardk*us*t~> +JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb47r.8o'u5=n*]T0m-Es$ki_*ijQ#7Yi8L4k21J:;onH?aXWFE;GADf0B,C2%?n +ARo:[@:3GK?012/j8@m8iWA)shu;I9h;$c=g=cATooT39r/gr>!K`BAOT(C:P5LIBOSY+=OT*W, +ci22pcd'h\c-4ARrlP)ZrPnuZ`PqbnrPe3Cs24`"q3UuEqnr[76Grl+fRrl+fTrQ"WQr5eu^ana*WanNsTbP03\OSb+=OS5sUYlEDWg\oq)h>Z7>hr*JQioB([ +jlYail29iGl2U#KlhBc@m/ZSRmfW(Lou[3Sr5n?IprW3MoZ-u5r)Wesr`%hU!lW'slc/nBpVcsH +s2$C/F*)PJGBeCZH[L6jIt3*%K7nr5LPUeDMigPrLX%] +rh/GJrh07_r1-ZL(B&qLl$tGMi3OQNK0'\OHKO*A!<.BQ'Rf)R@9V7 +S=Q7CT:hmPUSO]^Vl-JmWiN5'Xfen4Z*L^C[C3QS\[oDc]tV7r_8=(-`PojNioB([jlY^gkiq?sli-5TmI'H3nF5uIncJFTo`"O`pAamcq#:*hqYU0g +r;HTardk+!s*t~> +JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb3V;q6o'u5=n*]T0m-Es$ki_*ijQ#7Yi8lC&fR/i]RRJ<0CRJ**;S,8`N +SH,8VD#/qaLAZc%UAUbgUnsobrhoaori5jrri?.&Y5,3oY5GL$YQ;#8i0NDgs&],!r`/qsrlb>c +s31Vjc-?75rQk8crm:_ormBG`q3!@NF*)PJGBeCZH[L6jIt3*%K7nr5LPUeDMigPrLX%]rh/GJrh07_r1-ZL(B&qLl$tGMi3OQ +NK0'\OHKO*A!<.BQ'Rf)R@9V7S=Q7CT:hmPUSO]^Vl-JmWiN5'Xfen4Z*L^C[C3QS\[oDc]tV7r +_8=(-`PojNioB([jlY^gkiq?sli-5TmI'H3nF5uI +ncJFTo`"O`pAamcq#:*hqYU0gr;HTardk+!s*t~> +JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb3V;q6o'u5=n*]T0m-Es$ki_*ijQ#7Yi8u4An:]*uc:\R]H55%524p4\X:/+IY:&n)c:A[ia;#X8\:AI]b55meC5lO"H55nCQ +:\@QJ:\IWR;#ir[62t3d;=IEU;>X8W;?'Jm;>jDe;u/QT47>]><;onk5VV(>5qh*>lS%.=o_e*>5haC;?'_qFG'A1VH@($fIXcm!JqJ`1L51SAM2R=ONK0'\OcklkPa.N"QC!u+R@9TDRf]+NSc,/[ +TDkMHU&L_aTDY;\Sc>5ZS,\rWRJrQTQ^3s:PmeGk%~> +JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb5kO[=o'u5!7Cems3C\j +rQbVlc-=JUrQ>/^s2b)X#0+X$`5KX6rl4uWr58TSou-cps-EAFrKdE"oYUUFrPIsrj(ss"5;Mah"]_*hZ;Zoro3t< +#j(43kih9rlKeB5s6KCFq!A@Tn*fc9o(C,HqoJZVo#URIpW3!I!*B)!r`/qsr_qeUs2=oUqSr!C +p;HgF,]e'LG'A.UH?sseI=HctJqJ]/L5(J>M2I4MN/`mZOHG]hPEc'3!LB)OQiWVDrgWqXs.0(Z +rh'.^nY,oSrLa"Zs.0.ZrgWqVs-`kRs-NbOrfm_QPEV/mOcbb)O8k4?NW+n:MZAY6M>rA3L])r/ +KnP-XKDpK&JbjomJ,aunJ,4]qJcC?#KE$T)L&Qi,LO+c5M2I1KN/WaVNfT6_OcklkPa.N"Q^F/. +R[]e:SXuFGTqS3UUnjlcVl6SpX/rG*Y->.8ZEppG[^WcW]">Vf^;%G!_SX40`Q$!?ai_fNc-FY^ +dF$FmeCE1&f\,!5gtgfChr*GPj5]4^k2tjjl07Kulg4!*mf)Y[nF?&>o(2JFrUp3a!;HEds7uZj +qtpBjr;H3cJcF7"J,~> +JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb5kO[=o'u5M2I4MN/`mZOHG]h +PEc'3!LB)OQiWVDrgWqXs.0(Zrh'.^nY,oSrLa"Zs.0.ZrgWqVs-`kRs-NbOrfm_QPEV/mOcbb) +O8k4?NW+n:MZAY6M>rA3L])r/KnP-XKDpK&JbjomJ,aunJ,4]qJcC?#KE$T)L&Qi,LO+c5M2I1K +N/WaVNfT6_OcklkPa.N"Q^F/.R[]e:SXuFGTqS3UUnjlcVl6SpX/rG*Y->.8ZEppG[^WcW]">Vf +^;%G!_SX40`Q$!?ai_fNc-FY^dF$FmeCE1&f\,!5gtgfChr*GPj5]4^k2tjjl07Kulg4!*mf)Y[ +nF?&>o(2JFrUp3a!;HEds7uZjqtpBjr;H3cJcF7"J,~> +JcC<$JcFU,o`"gfrqu]ks8)ckrqQNf!;?Eb5kO[=o'u5k;#aAm;"@Ha:f7-g +pJ^rMr^luXoLJj[r`0##r)Wbtr`9&#r)ir$!*]>(!*];)s'#D)!*]A+!aJr6p0%H$_bgD8r)Wes +r`&kq"EJR(Ec_5#s)\3^#'G$0F`hkNrceHcoi38YFED\MGBnL\I!pEmJ:N6( +K7nu6LPUeEMi(jWN*## +Xf\b1Yd(L?['d?O\@K2_]Y(tn^VRe(_o9U7aN2KGbKS5Vcd:(ee'umtf@S[.g=tE=h;7&Ii8WeW +jQ5OdkNM0plK[^%m-X6?mg&@Pnac8BoCW"Ss7QHer:p +JcC<$JcFU,o`"jgrqu]ks8)ckrV0+]p@e1Po^h\Fo'u5jWN*##Xf\e2Yd(L?['d?O\@K/^]Y(tn^VI_'_o9U7a2lBFbKS5VcHstddaZdsf%8R- +g=k<;h;7&Ii8N\Uj5f=ak3(sml0@U$m-X6/n*fc8nc&(\oCV\Sp&Facp\jmeq>U6fqu-HkrUTr= +s4%(!~> +JcC<$JcFU,o`"jgrqu]ks8)ckrV0+]p@e1Po^h\Fo'u5\SFUXmE<'tNEVj_JDuQ7( +RerNPR/`TKR/!$JR/`NPR/EAicHc11o98a.rKHf8-$"*LFa&%SH?spdI=?ZrJV&N-KnbA=M2@+J +N/`jYO-#KeP*;.0Pl[2;rg3bTR[X5Fs.'+[qk!bYnY#iQqO[_Xrg`qVs-itUrg<_P!1*SK!gJn4 +rfRMKOH>NaNfK+uN;ne9MZ/J4M#W80LAuu-K`-Q'K)U>tJFJ'bJH(3#K)L?%KE-`*LB!#/M#N53 +MMqImG`@`EO-#KdP*2#nQ'IZ%R$a;1S"#t?StD[LTq\ +JcC<$JcFU,o`"jgrqu]ks8)ckrV0+]p@e1Po^h\Fo'u5Y2J:\diN:\[cS;>!5q_,>$G51>5_V">5qb%>5qe->Z:W"!`;in +b#/+Neoi3;YFEDYLGBeF[H[UrD3L]3&.L&Zi)KE$Q&JbjodJ,4]qJcC?#KE$T)L&Qi, +LB*/0M#iKlreu)]NfT6_OcbfiPE_>tQC!u+R@9V7SXuFFTV8'RUSO``Vl-JmWiN5'Xfnt5Z*L^C +[C3QS\[f>b]Y;.q^r!t+`Poj;aN;TJbg"GYd*^7heC<%"f@\d1g=tH>hV[8LiSrnXjQ5OdkNM0p +lKdg'mI'E2n*oi:rpg-^o^r.Us7ZKerV6EgrqcNhrVZWmo)=4?eGk%~> +JcC<$JcFX-o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no=3hn*fZ1m-Es$ki_*ijQ#7Yi8f[n`;Ockn$Om8+u +OoCFDda?J>d/2,gc2Z#dbQ#]daiMR$a8X*Va8a0T`VROQQg9t:_tCnD_Z7R?_>M1H_uI[L`VIIE +T)Q\-`W*mS`V[[Oa83mFan3aRbPB?`NK0(s[/@9.ZLtI(gYCT]h>c=4hr+Im"QSS*kNMp0s6BCF +p?_VB#O_'Lnac;Ep?Tj!aR[ICaSa*YtQC!u+R@9V7S=Q7CT:hmOU84T]VPg>j +WiE,$Xf\e2Yd(O@['d?O\@K/^]Y(qm^VI_'_o0O6a2lBFbKJ/UcHjncdaQ^rf%8O,g=k<:h;-uH +i8N\Uj5f=ak3(sml0@U6liHMArpKmWnc&+Zo)SF]o`Fj]p\agdq>^ +JcC<$JcFX-o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no=3hn*fZ1m-Es$ki_*ijQ#7Yi8cH8q/?8% +qjR2G!goCDqj@8IpmCrFqNh&"p2TqL!-.b!rg!8EkEYn0n>hP4Fh.P5UU9OsY3jFEMbNG^4U^I!pHnJ:N6(K7nu6LPUeE +MitQC!u+R@9V7S=Q7CT:hmOU84T]VPg>jWiE,$Xf\e2Yd(O@['d?O\@K/^ +]Y(qm^VI_'_o0O6a2lBFbKJ/UcHjncdaQ^rf%8O,g=k<:h;-uHi8N\Uj5f=ak3(sml0@U6liHMA +rpKmWnc&+Zo)SF]o`Fj]p\agdq>^ +JcC<$JcFX-o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no=3hn*fZ1m-Es$ki_*ijQ#7Yi8coM5sJFn?eJGt-"K)L?%K`?c*L3\Q1Ll$tG +MMmFPNK0$[O-#KeP*;,qQ'Rc(R$jD4S"-%@StD[LTq\?YV5C/gW2ckuXKAV.YctC=Za@-K\%&uZ +]=bei^V@S$_Sa=2`lH0Bb0.uQcHab`dF-Lne^i@(g"P07gtgfDi8ESRj5]4^k2tjjl07L!rp0[Q +mf)YUnF?MKs766_rUg6cp\4U\s7u]kqtp?ir;H3cJcF:#J,~> +JcC<$JcFX-o`"gfrqu]ks8)ckrqQNf!;?EbFS,1qo'u5ro+:Di8j5f=bkl0iGlM0]=m/$)VmdKW7 +o(2PJpWCY3amR4Ma8T*=<;KPl;Z9PSs8Tt@`5BL2`5T^k`pC\?`$iNDF*)PJGB\=YH@1-hIXls" +JqJ`1L5(M@M2I4MN/`jYO-#KeP*;.0Pld8rD3L])r/KnP-WKDpK%JbXcjJ,"QnJcC?#KE$W)L&Qf3 +LPUbCM2I1Kreq#?NfT6_OoCMZPE_>tQC!u+R@9V7S=Q7CT:hmPUSO]^VPg>kWiE,$Xfek3Yd(O@ +['d?O\@K/^]Y(qm^VI\&_o0O6a2lBFbKJ/UcHjkbdaQ^rf%8O+g"P39h;-rFi8N\Uj5f=ak3(sm +l0@R"m-O--rpL-^naZ2@oCMVHrq6 +JcC<$JcFX-o`"gfrqu]ks8)ckrqQNf!;?EbFS,1qo'u5q3h2Mk*u:=qOIYYD!-TOLAI\FV#R7rVPgAk +WMuntrN#gsqlTe!p94@ts02X2ZaKb!qj6H2nWip9!1!O`s&AhnrDNVls3(Dcrlkbnc-=JWbfn>V +bl5lecMc#fcMs'uPOjt:POt"cEcZ>FG'A.UH?sseI=?]sJV&N-Knb>o(2JFo`"O` +pAamcq#C0hqYU0hr;?Nardk+"s*t~> +JcC<$JcFX-o`"gfrqu]ks8)ckrqQNf!;?EbFS,1qo'u5bpe^-LqG@,fr)35co0`OUr_`Jhs&&Meqbco\mnj5;=s>5h\%>5qh-?2[^q;WCXM:]OAl;#F2irg3bTR[X/Ds.'%Yl^n'Grg`kTs-itUrL!VOs-EYLs-*MI +rK75EOHBI&!fi8"rf$l8!/gc4s+p]1rItB-KS98Urdt-#pji-hpji?ps+:3%s+LE+re:Z5LkpnE +MMd>kN!53$O,oBbrfV&\Pa.N"Q^F/.R[]e:SXuFFTV8*TUnjiaVl-MoWiN5'Y-5(6Z*UdD[C3QS +\[f>b]Y2(p^qmn*`5Ta:aN;TJbK\>Xcd:(fe'uq!f@S[.g=tE=h;7&IiSrnXjQ5OdkNM0plK[^% +m-X6?mg/FQnac8BoCV\Sp&Facp\jmeq>U6fqu6NkrUTr=s4.."~> +JcC<$JcFX-o`"jgrqu]ks8)ckrV1^5p@e1Po^qbGo'u5ro+1Ai8EMLh;$caOnY%3OnFn%OTO(^ +e,7YodJ_Glchu)gc2PojbK@uLaN4%ps2OiQ!6"Jqrg*>Er58BJs24iSqnrZ:2hu;Rjr)!Gjjo>4qrl"iUq8VjApr"e)F*)MHGB\:XH@($fIXcm! +JqJ]/L5(J>M2@+JN/WdWO,oBbP*2#nPa.N"QC%Q;s-`nUr1!\UqORGRqORSTqj[VSrgE_Ps-NbO +rg!MJs-*GFs,m>Crf7,@NK*prs,-l7rJ:T3LPPh_s+UK+r.G$$rdj3^s+10$rIb-'s+UH,s+^T1 +reUZ5MuJY9NK4"!G*%iLP*;,qQ'Rc(R$jD4S"-%@StD[LTq\aND]Lbg"GZd*^:jeC<%#f@\d1g>(N?hV[8LiSrnXjQ5OdkNM0p +lKdg'mHs?1n*oi:rpg-^o^r.Us7ZKerV6Bfs8)WirVZWmo)=4?ec1.~> +JcC<$JcFX-o`"jgrqu]ks8)ckrV1^5p@e1Po^qbGo'u5r1s@is/,mr +WW&prX8B!rXo#9pYPk[2Z*L^B['[6-Qi!0LQhZmEQ1L=5Q2$XHt +QC!u+R@9V7S=Q7CT:hmOU8+N[V5C/hWN)u!XKAY/YctC=Za@-K\%&uZ]=bei^V@S#_Sa=2`lH0A +b0.uPc-FY^dF-LneCE1&f\,!4gtgfChr*GOioB([jlY^gkiq?slg4!*mI'H3nF5uIncJFTo`"O` +pAamcq#:*hqYU0gr;HTbrdk+"s*t~> +JcC<$JcFX-o`"jgrqu]ks8)ckrV1a6p@e1Po^qbGo'u5i;#a>j;#a>` +:AI]^:@g[L4TI\@4oA.P:\mo`:B45Z:\mod;>a>d;#j&U7.jIX;>3oa;=[QQ;?'Pj<;]Yp8`<;? +4u+r>5VP&>5h_->[:Y2;tX&R;=@<`;,pRpqG[>jr)!Gjrc8'[rc8']rcS3` +!-eEe!."Hd!d]3?rD`Vnq,[)erDrYm/obrSFEMeOG^=[_I!pHnJ:W<)K7nu6LPUeDMMmFPNfK0] +OHG]hPE_;sQ'R`&rL!VQs-ikTrg`hUq4@GRrLEbSs-iqTrL!VOs-EYLs-3PIrf[;Ds,d5@!fi8" +rf$l8!/g`3!f2VerJ(?+s+L<&s+:6$k(*J_rdt*$s+LE+reCH.!/UW2!K)g7Mueourf;5aOcklk +Pa.N"Q^F/.R[]e:SXuFFTV8'RUSO]^VPgAlWiE,$Xfek3Yd(O@['d?O\@K/^]Y(qm^VI\&_o0O6 +a2l?EbKJ,ScHjkbdaQ^qe^rF*g"P08h;-rFi8ESRj5]4^k2tjjl07L!m-O-,mdKW6nF?MK!qZ'V +rq6 +JcC<$JcF[.o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no+'fn*f]2m-Es$ki_*jjQ#7Yi8rd[J7--[JR?-Zi.30h>Q41i;_a>ioB+] +kNMp0r9F"A!:'RLr9X@K$L[BPnalDGp@n@XrQ/8LP^kFMirD3L]3&.L&Qc(KDpK$Ja%^aJc:9" +KE$W)L&Qi,LB*/0M$o3!Mi +JcC<$JcF[.o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no+'fn*f]2m-Es$ki_*jjQ#7Yi8"qNgoC!1*DHrHIpXopPH>qO.>OjI?(;qjd_YrJ:6(rJ:K/!/U6%s.fOg +s/#ams/,stWN)uqX8K'uXnf-nY6D/8Z*L^Brj;^5qj7/Hs-N_Nop,9;o9K0;M2@+JN/WaVO,oBa +OcklkPa)04!g]1>rL!VQs-ieRqOIGRqOIANrgNkTr0[MNs-EVKs-3PIrf[;D!0I/?!fi8"rf$l8 +s,-f4s+p]1reCH,re16&rdt*"l%&bardt*$s+LE+reCH.!/UW2$]9k#N/WaVNfT6_OoCMWPE_>t +QC!u+R@9V7S=Q7CT:hmOU8+N\VPg>jWN)u!Xf\b0YctF>Za@-K\%&uZ]=bei^V@S#_Sa=2`Q-'@ +aihlOc-FY^dF$FmeCE.%f\,!4gYCWAhr*GOioB([jlY^gkiq?sli-5OmI'uB!V#XYo)J:]o_nI_ +p&Ojbq#C0hqYU0hr;?Nardk+#s*t~> +JcC<$JcF[.o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noF9in*f]2m-Es$ki_*jjQ#7Yi8a:A@W_ +:A@$H5PdSB;#3u`;#3ub;"@EY;#O8h;YO&Y7J0RY;>*ic;=IEQ;?'Po;u0Jk;tN]\9DV9X9DqK^ +4bts>5;>$>5qh)>kCtg;XdQM;#aMl;uKVl;>j;qF)l;BF*)O&FTQ`1 +GQ)ggGBe?1GlE$d<;KVk;M2@+JN/WaVO,oBa +OcklkPa)04!g]1>rL!VQs-ieRqOIGRqOIANrgNkTr0[MNs-EVKs-3PIrf[;D!0I/?!fi8"rf$l8 +s,-f4s+p]1reCH,re16&rdt*"l%&bardt*$s+LE+reCH.!/UW2$]9k#N/WaVNfT6_OoCMWPE_>t +QC!u+R@9V7S=Q7CT:hmOU8+N\VPg>jWN)u!Xf\b0YctF>Za@-K\%&uZ]=bei^V@S#_Sa=2`Q-'@ +aihlOc-FY^dF$FmeCE.%f\,!4gYCWAhr*GOioB([jlY^gkiq?sli-5OmI'uB!V#XYo)J:]o_nI_ +p&Ojbq#C0hqYU0hr;?Nardk+#s*t~> +JcC<$JcF[.o`"gfrqu]ks8)ckrqQNf!;?EbFS,1qo'u5M1K +_uI[S_uI[R`W!mP`VH2&TDtM^`;[aM`rF*OaR@7Ab5KN_bl>ogcF3DRrj;F-qm?=.s5!_3s53k8 +s5F.@jQGb+l20c@li$,Ili-8LmJlYTnH\XWp%S7Wq>1$3pW<6Pn]C[L!6OfQ!*&horDNPjqG?>S +pr!-Mrl+`RkJ\okF*)PJGB\=YH@('gIXcm!JqJ]/KnbA=M2@+JN/WaVO,oBaOcklkPEc'3s-E\O +rL!VQrgNJK!1`YMrL3_Rr0[MNs-EVKs-3PIrK75EOHBF%!fi8"rf$l8s,-f4s+p]1rJ(?+s+L<& +rdt*"l[\qbrdt*$s+LE+reCH.!/UW2(lF60N/WaUNfT6_OcbfiPE_>tQC!u+R@=,E=IbqRT:hmO +U8+N[V5C/gW2ZetXKAV-YHY:;Za7$H[^WcW\\#Me]t_=t_8=+.`Pom=aN;TJbg"GZd*^7heC<%" +f@S^0g=tE=h;7&IiSrnXjQ5OdkNMp0$gR'Em-X6/n*fc9nc&(\oCV\Sp&Facp\jmeq>U6fqu-Hk +rUTr=s474#~> +JcC<$JcF[.o`"gfrqu]ks8)ckrqQNf!;?EbFS,1qo'u5Er'bUQfaV'Q2d0KQi<<>Qi21-GP?:SRIlmCRJrZ8S,JlSSc"??M#N2+M"HK&U]%"g +VZ3RoVu`ltq5aIqs/l(!pTOV$!jT&;rj;[4!4Mlmq3V&Is-NVKp6GK?n!LHd_;uKVl;>O,h +b5TTab5]Qbb/qd)b5]Wkb0.uNb0.uPbKKdGnrr7".WTTPF`qtQH$Xd`I=6QoJ:W<)K7nr5LPUeD +MMmFPNK0'\OH>TfP*;)org!MLs-N\Os-`kToU>iNo:,]IrgE\Os-NbOrK[DIs-*DE!g/S+rJq#? +NK*prs,6o7re^Z2s+gQ-s+UK+r.G!#rIO9brIOs"rIb-'s+UH,s+^T1reVJLMi3OQNK&sZO-#Kd +P*2#nQ'IZ%R$a;1rgR#[SXuIHTqS3UUnjiaVl-JmWiN5'Xfek3Z*L^B['d?O\@K/^]Y(qm^VI\& +_o0O5a2l?Db0/#RcHjkbdF-Ooe^i@(g"P07gtgfChr*JQj5]4^k2tjjrojgUlg4!*mdBQ4nF?&J +ncJFTo`"O`pAamcq#C0hqYU0gr;HTbrdk+#s*t~> +JcC<$JcF[.o`"gfrqu]ks8)ckrqQNf!;?EbGkCUuo'u5K`rDEPjrDEJjpegKKp/:ofpe^ibnPJmUrDNSmrD`YmpIbEX +r^uQNqc<;is&f8'!a&T-rE05+=^##.=TDY"=oV\*>Pqb*;YO,h +Er^=YFoHUbGlMsdGQ2pfGli;;H2CS:jWN*##Xf\b0Yd(L?Za@-K\%&uZ]=bei^V@S# +_Sa=2`Q-'@ai_fNc-FY^dF$CleCE.%f@em3gYCW@hV[8MioB([jlY^gkl0fSlKdg'mI'E2n*ol; +rpg-^o^r.Us7ZKerV6EgrqcNhrVZWmo)=4?f)L7~> +JcC<$JcF[.o`"jgrqu]ks8)ckrV1^5p@e1Po^qbGo'u5'd*L"_c-=JUb/qcHoZ-mLqO%8MqO%#Drg*N$qSVjA!5nfQqSE'GrPSQOqo/QSpr2Zo +rl"iUpW!6Ro>p=@oud3UrQP>fqmPUos0Vd]s53k7s5F.@jQ5V)l2']AlhTiElN$;Nm0rFOnF?,B +p%S7WqYU3fb4s*OaS*a@aS]!8;Z0Jd;!7lP_uI[S`VRU=`?oVHFED\MGBeF[H[L6jIt3'#JqJ`1 +L5(J>M2@+JN/WaVO,oBaOoCLFPE_=2Q2d0MQi*6MRJiTCS,JfSRJWBNQiEBMQ2d*KPPp[EOoLOB +O8k7?NW+n:MuS\5M#rKgL])u,L&Zi(KDpK$Ja@pdJc:9!KE$W)L&Qi,LB*/0M>rG5MuJY9NK4"! +"d"k0P*;.0Q"H>KR$a;1S"#q=St;RITqS3UUnjiaVl-MoWiN5'Xfek3Z*L^B['mEP\@K/^]Y(qm +^VI\&_o0O5`lQ6Cb0/#RcHaeadF-Lne^i@(f\,!5gtgfChr*GOioB([jlY^gkiq?sli-5OmI'uB +!V#XYo)J:]o_nFap@n=Zq#C0iqYL*gr;?Nardk+$s*t~> +JcC<$JcF[.o`"jgrqu]ks8)ckrV1^5p@e1Po^qbGo'u5R.gU]7(eEr'eME92*2DuuZ'T)G5[SG&HG +RK/cAR/1k&F7OALEW)1'Q0Xb0Q2-a0Qi;7"GP@NtR/36MRdusIRe<0JSG\rTMZ8P'M"QQ&U]7.i +V>dCmVu`ltq5aIq!3Q.$!3Q7'!3c@(r3$L4Z*L^B['[6L[^WaBQLgI?QM-UAQLU7?QMa\[;Z0Jd +:]nk`b0'V'!6G/]rlP5aqo\r^q3(<4l&mB6F*)MIGB\:XH@($fIXcluJV&N-Knb>;Ll$tGMiCrf@)>s,I#:s,6o7 +rJ:T3LPPh_re:B*r.G!#rIOkWiE,$Xf\b0Yd(L?Za@0L\%&uZ]=bei^V@S#_Sa=2`Q$!? +ai_fNc-FV]dF$CkeCE.%f@\d1gYCW@hV[8LiSrnXjQ5OdkNM0plKeH9!U]=SmfDqJrpp*\!;-6_ +!quB_r:p +JcC<$JcF[.o`"jgrqu]ks8)ckrV1m:p@e1Po^qbGo'u5*rET1sq,?`[p/1fcq+pud +r_NGjrDNSkp.u':FEM_JFEM_LGPcR_G5umdGl`/6q,I/iqGui\-?=0LFEVkPG^=[_I!pHnJ:N3& +K7nr5L51SAM2I4MN/`jYO-#HcrfR>HPa)04s-E\Or0[JOrL32ErL3\Qqj@ALs-EVKs-3PIrK@2C +s,d5@s,R,=rf$l8s,-c3!f2VerJ(<*s+L<&rdt*"m"#(drdt'#s+LE+reCH.!/UW2s,$f7repl; +NrG(COHG]hPEc'3AsSdNR$jD4S"-%@StD[LTq\b +]Y2(p^qmn*`5T^8aN2KGbKS5VcHstddaQ^rf%8O+g"P39h;-rFi8ESRj5]4^k2tjjl07L!rp0[Q +mf)YUnF?MKs766_rUg6cp\4U\s7u]kqYU9ir;H3cJcF@%J,~> +JcC<$JcF^/o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no4-gn*f]2m-Es$l0%3kjQ#7Yi8EFa&%S +H$XgbI=6QoJ:W<)K7nr5L51SAM2I4MN/`ksNrb?)rf[;F!0mGIs-E\Oqj@;LnXBBDqO%8Krg*MJ +s-3MHrK75EOHBF%s,R,=rf$l8s,-c3s+p]1rJ(?+s+L9%rdt'!n::Ffrdt'#s+LE+reCH.!/UW2 +s,$f7repl;NrG)YOHG]hPEV5rQ'Rc(R$jD4S"-">St;RITqS6WUnsrdVl6SpWiN5'Xfnt5Z*L^B +[C3NQ\@K2_]Y(qm^VI\&_o0O5`lQ6Cb0/#RcHab`dF-LneCN7'f\,!4gtgfChr*GOioB([jlY^g +kiq?sli-5OmI'uB#k7BSo()DDo^r.Us7ZKerV6EgrqcNhrVZWmo)=4?fDg@~> +JcC<$JcF^/o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no4-gn*f]2m-Es$l0%3kjQ#7Yi8=qEWC1WEWC+XQMm*:QM-U>QMHjIR.?U>GkH:TR/iWQRJE6HRK&`IS,A`IS,JlTSb\0= +M>)i"LBjTMUnsobVl0Nm!NE*sWr]<&r2]n#r3$%$q6'\"s02R1rj;^5"1G\K\G) +Q2X_\;Z0Ja;#AB7a8j9ZaSX*Yao]]-bP.1jPO"AUEcZ>EFa&%SH$XgbI=6QoJ:W<)K7nr5L51SA +M2I4MN/`ksNrb?)rf[;F!0mGIs-E\Oqj@;LnXBBDqO%8Krg*MJs-3MHrK75EOHBF%s,R,=rf$l8 +s,-c3s+p]1rJ(?+s+L9%rdt'!n::Ffrdt'#s+LE+reCH.!/UW2s,$f7repl;NrG)YOHG]hPEV5r +Q'Rc(R$jD4S"-">St;RITqS6WUnsrdVl6SpWiN5'Xfnt5Z*L^B[C3NQ\@K2_]Y(qm^VI\&_o0O5 +`lQ6Cb0/#RcHab`dF-LneCN7'f\,!4gtgfChr*GOioB([jlY^gkiq?sli-5OmI'uB#k7BSo()DD +o^r.Us7ZKerV6EgrqcNhrVZWmo)=4?fDg@~> +JcC<$JcF^/o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no4-gn*f]2m-Es$l0%3kjQ#7Yi8F&T4oIS:5Nb61;>!cY;>a8j:\[]X +:\$gK5QF+H5QF%I;#O2b;#*oa;#3u`;#*ri;Gg +M2@+JN/WaVrf7)AOoCODP5pjGQ2d0MQi!0JRIQaDRJNrD3L])u-L&Zi'KDpK#Jae3fJc:9!KE$W)L&Qi,LB*/0M>rG5MuJY9NK4"!E0-3FP*;)o +Q'IZ%R$a;1S"#q(N?hV[8LiSrnXjQ5OdkNM0plKeH9!U]=Smg/FQnac8B +oCV\Sp&Facp\jmeq>U6fqu-HkrUTr=s4@:$~> +JcC<$JcF^/o`"gfrqu]ks8)ckrqQNf!;?EbG4bCso'u5YgR/Ou"_t(bE_uIUN_>M1K_u%CD`W!mDT`2q*`rF*VaSX$VaT'B^aSEsX +aSX*Qb5]Zabl>rdc2b?L[d1?u[LBS#hr*JPioB+^kih:+lMTrKlKS'.s6C9`mI'E2nac;Ep\=R\ +qu$EkbO`mPan3[Janj*Wa8X-[;uKVl;=RKHs7jM3_Z.OQ`;dgP`pCYbEccDGG'A1VH?spdI=?Zr +J:W<)KS>/8LPUeDMMqIm!KE-=Nrb?)rf[;Fs-3JIs-EYNpmC]ApR(oGrg*JIs-3MHrK@2Cs,d2? +!fi8"rJ^c7s,-c3s+p]1rJ(?+re13%rIXrunppXhrdt'#s+LE+rJ(?-!/UW2s,$f7repl;NrG(? +OHKO*"d>19Q'Rd9Qu8=\S"#q=St;RITqS3UUnjiaVl-JmWiE/&Xfek3Yd(L?['d?N\%&u[]=bei +^V@S#_Sa=2`Q$!?ai_fNc-FV\dF$CkeC<%#f@\d1g=tE=hV[8LiSrnXjQ5OdkNM0plK[^%m-X6/ +n*fc9nc&(\oCV\Sp&Facp\jmdq>^ +JcC<$JcF^/o`"gfrqu]ks8)ckrqQNf!;?EbFnG:ro'u5d=qVl6PnWN,ls!N`F%XT,F%Y5>@"Y5bX(Y5b[7Yd(I>['dM2@+Jrepl;NrG(?OHKO*s-*JIrK[DKrg3DIoU5H@rKmMLr0@;Hrfd;Ds,m>CrJq#?NK*mq +s,6o7rJCQ1s+gQ-s+UH*r.Fs"r.4Ehr.4j!r.G$&s+UE+s+^T1re^Z4!/pi8!KE-=Nrb?)rfRGK +Pa.N"Qi<@iR@9V7S=Q7CT:hmOU8+N[V5C/gW2ZesXKAV-YHY79ZEppG[^NZT\[oDc]Y2(p^qmn* +`5T^8aN2KGbKS5VcHjncdaQ^qe^rF*g"P07gtgiEi8ESRj5]4^k2tjjl07Kulg4!*mdBQ4nF?&J +ncJFTo`"O`pAamcq#:*hqYU0gr;?Nardk+%s*t~> +JcC<$JcF^/o`"gfrqu]ks8)ckrqQNf!;?EbFnG:ro'u54o.>B;=RKV;?'Jk +:\dcZ:]EZX5kmY=5lX(J5lFOY:\R]^:]!u`:\mo];=mcQ7/0[R;>j>g:\@Q[;?'Pj;ts8h;uK;g +9DqKY8cD?Z9D)!X6J,4=]ei*=Su;&>$Ll/s'>Funl,B_l;@RXqbI2j +rDNPjnPK1+rH/0bF`mY+!-eBd!-\?c!-n3:qGm>llr>'HFEDYKGBeCZH@('gIXcluJV&N-Knb>; +Ll$tGMuJY9NK4"!!K`HCP5gaGPl6mIQN!6GR.Qg@R/NBNQMd$JPl?mFP5g[EOSt4ANfB%sN;nh9 +MZ&D3M#W8/LAuu,K`$K$K)C2jJGautK)C9$K`?c)LB!#/M#N82M?&S6Mueourf7)AOoCLIPE_>t +QC%T)Y-5(6Z*L^C[C3NQ\@K2_]Y(qm^VI\&_o0O5 +`lQ6Cb0/#RcHab`dF-LneCE1&f\,!4gYCWAhr*GOioB([jlY^gkiq?slKdg'mI'E2n*ol;rpg-^ +o^r.Us7ZKerV6Bfs8)WirVZTlo)=4?f`-I~> +JcC<$JcF^/o`"jgrqu]ks8)ckrV1a6p@e1Po^qbGo'u5:ciW\B'jlYdkpZh_Cs69UKq!.kE&FAfPn*ol= +p%A(Tq>:*frVl`/8LPUeDMMqIm!KE-=NrkE*OoCODPQ-mFQ2d0KQg'n9Qi36JQ2[$JPPgUDOoLOA +O8k7?NW"h9MuS\5M>rD3L])u,L&Zi'KDgE!Jb=QkJc12uKE$W)L&Hc+LB*/0M>rG5MuJYCNK0$[ +O-#KdP*2#nrfqAeQ^F/.R[]e:SXuFFT:hmOU8+N[V5L5iWN)u!XKAV-YHY7:Za7$H[^NZU\[oDc +]Y;.q^qmn*`5T^8aN2KGbKJ/UcHjkbdaQ^qe^i@)g"P07gtgfCi8ESRj5]4^k2tjikiq?slg4!* +mI'uB!V#XYo)J:]o_nI_p&Ojbq#C0hqYU0hr;?Nardk+%s*t~> +JcC<$JcF^/o`"jgrqu]ks8)ckrV1^5p@e1Po^qbGo'u5oni3ps/#am!2ogp +s/?!urMoq"riQ4%riQ4'qQ9b"rN6+&$*US;ZEppG[^N[E\,a);QN3?5Qi!*8Q2X\Z;=79\a8;Ll$tGMuJY9NK4"! +!g&P,rf[;Fs-3GHs-EVMl'VF9rKdAHrfmGHr0%)Bs,d2?s,R,=rJ^c7s,-c3s+p]1rJ(<*s+L9% +rIXotomlskrIXs"s+LE+rJ(?-!/UW2s,$f7req5ENfK0]OHGZgP*;.0Q#;nSR$a;1S"#q=St;RH +TV8'RUSO]^Vl-JmWiE,$Xf\b0YctF>Za@-K[^WfX]">Vf^;%Fu_8=+.`PojXcd:(f +e'umtf%8R-g=k<:h;-rGi8N\Uj5f=ak3(pkl07L!m-O-,mf)YUnF?MKs766_rUp3a!;HEds7uZj +qtpBjr;H3cJcFC&J,~> +JcC<$JcF^/o`"jgrqu]ks8)ckrV1^5p@e1Po^qbGo'u55_Y,>$5#,=T;J&=T)A(>$G51>Q\8/8LPUeDMMqIm!KE-= +NrkE*OoCODPQ-mFQ2d0KQg'n9Qi36JQ2[$JPPgUDOoLOAO8k7?NW"h9MuS\5M>rD3L])u,L&Zi' +KDgE!Jb=QkJc12uKE$W)L&Hc+LB*/0M>rG5MuJYCNK0$[O-#KdP*2#nrfqAeQ^F/.R[]e:SXuFF +T:hmOU8+N[V5L5iWN)u!XKAV-YHY7:Za7$H[^NZU\[oDc]Y;.q^qmn*`5T^8aN2KGbKJ/UcHjkb +daQ^qe^i@)g"P07gtgfCi8ESRj5]4^k2tjikiq?slg4!*mI'uB!V#XYo)J:]o_nI_p&Ojbq#C0h +qYU0hr;?Nardk+%s*t~> +JcC<$JcFa0o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no4-gn*f]3m-Es$l0%3kjQ#:Zi8/8LPUeDMMqIm!KE-=O8k:AOo:ICPQ-mEQ2R$FQhm*FQi*0HQ2[$IPPgUD +OoLOAO8b1>NW"h9MuS\5M>rD3L\uo,L&Qc&KDgDtJbsuoJc12tKE$W)L&Hc+LB*/0M>rG5MuJZ\ +NK0$[O-#KdP*2#nPa.N"Q^F/.R[T_8S=Q7CT:hmOU8+N[V5C/gW2ZesX/rG*Y->.8ZEpmE[C3QS +\[f;`]Y2%o^VI\&_o0O5`lQ6Cb0.uQcHab_dF-LneCE.%f\,!4gYCW@hV[8LiSrnXjQ5OdkNM0p +lKeH9!U]=Smg/FQnac8BoCV\Sp&Facp\jmeq>U6fqu-HkrUTr=s4I@%~> +JcC<$JcFa0o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no4-gn*f]3m-Es$l0%3kjQ#:Zi8E8P[4T`1S^T)G5USGScURf&TFR/V-c +Erq\oQMZsGQMZs?QM6[DQL1%;R/D3tGOV$uR/EBLReWBJRfAlWReiNNSGo)ZMtW&#M=QK&V$Elq +Vl6PnWN,ru!3H!us/u$s!3H1%s/u^4Z*L^C[C3QRrjVs=g6_`'n&Z +s2P;aaihoRd-HkcPP^OAOWSUbFEMbNGBeCZH[L6iIXcluJV&N,KS>/8LPUeDMMqIm!KE-=O8k:A +Oo:ICPQ-mEQ2R$FQhm*FQi*0HQ2[$IPPgUDOoLOAO8b1>NW"h9MuS\5M>rD3L\uo,L&Qc&KDgDt +JbsuoJc12tKE$W)L&Hc+LB*/0M>rG5MuJZ\NK0$[O-#KdP*2#nPa.N"Q^F/.R[T_8S=Q7CT:hmO +U8+N[V5C/gW2ZesX/rG*Y->.8ZEpmE[C3QS\[f;`]Y2%o^VI\&_o0O5`lQ6Cb0.uQcHab_dF-Ln +eCE.%f\,!4gYCW@hV[8LiSrnXjQ5OdkNM0plKeH9!U]=Smg/FQnac8BoCV\Sp&Facp\jmeq>U6f +qu-HkrUTr=s4I@%~> +JcC<$JcFa0o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noF9in*f]3m-Es$l0%3kjQ#:Zi8<;onr;#jGj:]=,_:Z"A: +;#O2V;#X>l;"mcb;"[]Y;ZB2_7.`kH7/9^\;>j>i;?'Gm:]*ub:\[cb;>O/j;uBPn;>*oa9DM9[ +9DhE\8cD?\9D_E_Q7k0=]ed-=Su8"=T;P(>5qh+?2e.1;tW;?'Pm +;/8LPUeDMMqIm +!KE-=O8k:AOo:ICPQ-mEQ2R$FQhm*FQi*0HQ2[$IPPgUDOoLOAO8b1>NW"h9MuS\5M>rD3L\uo, +L&Qc&KDgDtJbsuoJc12tKE$W)L&Hc+LB*/0M>rG5MuJZ\NK0$[O-#KdP*2#nPa.N"Q^F/.R[T_8 +S=Q7CT:hmOU8+N[V5C/gW2ZesX/rG*Y->.8ZEpmE[C3QS\[f;`]Y2%o^VI\&_o0O5`lQ6Cb0.uQ +cHab_dF-LneCE.%f\,!4gYCW@hV[8LiSrnXjQ5OdkNM0plKeH9!U]=Smg/FQnac8BoCV\Sp&Fac +p\jmeq>U6fqu-HkrUTr=s4I@%~> +JcC<$JcFa0o`"gfrqu]ks8)ckrqQNf!;?EbFnG:ro'u5)^!6k2^!7(SRp:'h*q6g./qmQdhjQ5Oekiqg+!:0LHrTjFIrp(-_mdKZ9o(;YM +q"adarVlisrlk>am)o1Ho>pjOrQ+uYrDDcTlMpb"!5nKJrl+KKr5JTP)fg"AFEMeOG^4U]H[L6j +It3'#JqJ]/Knb>;M#N53MMqIm!f`5#rf7,BOcfU*s-*GHqN^E5pm(iCrfd8CrfR5Br/^lVg^;%Fu_SX4/ +`Pom=aN;TJbK\>Xcd:(fe'umtf%8O,g=k<:h;-rFi8ESRj5]4^k2tjjl07L!lg4!*mdBQ4nF?&J +ncJFTo`"O`pAamcq#:*hqYU0gr;?Nardk+&s*t~> +JcC<$JcFa0o`"gfrqu]ks8)ckrqQNf!;?EbG4bCso'u5TDrg3VOpj)CSnjWMuntX/rDtXT5NuXo,7-Xfeh1Z*CXA[C*IB[fX(M\^m,EQM$OA;s,R,=rJ^c7s,-c3reUT0rJ(<*re10$r.=?f +r.=j!re1<*rJ(?-!/UW2s,$f7reqDJNfK0]OH>TfP*;,pQ'IZ%rg7\nR[]e:SXuFFTV8'RUSO]^ +V5C/hWN)u!XKAV-YHY79ZEpmE[^NZT\[f;`]Y2%o^VI_'_o0O5a2l?Db0.uQcHab_dF-LneCE.% +f@em3gYCW@hV[8LiSrnXjQ5OdkNM0plKdd&m-X6/n*fc9nc&(\oCV\Sp&Facp\jmdq>^ +JcC<$JcFa0o`"gfrqu]ks8)ckrqQNf!;?EbGkCUuo'u5;cN`rrD`eq!)iPggHFR\l;7:R!)WShs%`8`hEV!8 +lVRRXrD<;cr_W8bp/:ZSr^?BGq,.)er)!Jk:]!ob:\moe;#sQlp/:fcp/:WXoM#9Xp.G3U!`iB( +qc<\tpK.c*>$>-6>$4s0=',?$r`B)$s&oA*s'5S0ra#S'mSa$_r)3Aiq,6NUkYV;$rH/0bGBWq/ +!HrVaFour6H[Y3[nQ,Hc)fg"AFEMeOG^4U]H[L6jIt3'#JqJ]/Knb>;M#N53MMqIm!f`5#rf7,B +OcfU*s-*GHqN^E5pm(iCrfd8CrfR5Br/^lVg^;%Fu_SX4/`Pom=aN;TJbK\>Xcd:(fe'umtf%8O,g=k<: +h;-rFi8ESRj5]4^k2tjjl07L!lg4!*mdBQ4nF?&JncJFTo`"O`pAamcq#:*hqYU0gr;?Nardk+& +s*t~> +JcC<$JcFa0o`"jgrqu]ks8)ckrV1a6p@e1Po^qbGo'u5K7\W' +I=-?eG^":PF)c/;DJX*'BkV-jARf1X?sd7:klBrCkPOEAP5CCAO8tF*P5CI,P4mQ*fDF.ueHF@L +da?D?c3MV%8k"u'Vrr2utrVllsp](*.s24QKrPeEKrPe]Q*--+BFEMbNGBnL\ +H[L6iIXcluJV&N,KS>/8LPYqd!K)g7Muo!!NrG+>OT1IAP5^[EPiJ&-Pl?mDP5g[DOSk1>NrP+; +N;eb8MZ&D3M#N2.LAlo+K_g?!K(+?hK):3#K`6])LB!&/M#N82M?&S6N"Cu/NfT6_OHG]hPEV5r +Q'Rd9Qj&nHS"#q=rgm;cTV8'RUSO]^VPg>jWN)u!XKAV-YHY79Za7$H[^NZT\[f>b]Y2%o^VI_' +_o0O5a2l?Db0.uQcHab_dF$FmeCE.%f@\d1gYCW@hV[8LiSrnXjQ5OdkNMp0$gR'Em-X3.n*fc8 +nc&+Zo)SF]o`Fj]p\agdq>U6fqu6NkrUTr=s4RF&~> +JcC<$JcFa0o`"jgrqu]ks8)ckrV1g8p@e1Po^qbGo'u5K7\W' +I=-?eG^":PF)c/;DJX*'BkV-jARf1X?sd6'Xfek3Z*L^C[C*IB[fX(M]@<2FQM6[C +;EF`qtQH$Xd`I!pElIt3'#JqJ]/Knb>; +M#N53MMqIm!f`5#rf@)@s,m8Crfd>Gj-BS-rfd5Bs,m;Br/^ltQC%T<"dtgKS"-&KSm%bZ +TqS3UUnjiaVl-JmWiE,$Xf\b0YctC=Za@-K[^WcW\\#Me]tV7r^r!t+`5T^9aN2KGbKJ/UcHjkb +dF6Upe^i@(f\,!5gtgfChr*GOioB([jlY^gkl0fSlKdg'mHs?1n*oi:rpp*\!;-6_!quB_r:p +JcC<$JcFa0o`"jgrqu]ks8)ckrV1a6p@e1Po^qbGo'u5K7\W' +I=-?eG^":PF)c/;DJX*'BkV-jARf1X?sd7>;ZKeri;?0Ym +;X[9R9`7W\9)M?^=8Q%u=8#_t=^##.=TMW+r`9&!r`9#"s&f;(#[1G:>[1Q@?=2YhqG[2fn58=E +!-J0^rH8TfP*;)oQ'IZ%rg3kWR[]e:Sc53aT:hmOU8+N[ +V5C/gW2ZesX/rG*Y-5(6Z*UdD[C3NQ\@K/^]Y(ql^V@S$_Sa=2`Q-'@ai_fMc-FV\d*^7ieC<%" +f@S[.g=tE=h;7&Ii8N\Uj5f=ak3(t-kmQeBm-O-,mdKW6nF?MKs766_rUg6cp\4U\s7uZjqtpBj +r;H3cJcFF'J,~> +JcC<$JcFd1o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noF9in*f]3m-Es$l0%3kjQ#:Zi8q6QBdYsOH5B[MM[+CKS+i+ +Isl]jH$=ITFE2A?DJj9+C2%?nAS#@\@:3GKkkaNDkkO??joCSq8E6Lr5ANPn=fTLou?gJn]:RK +rlY2_q9/i`rm(GdqRH7.k-bKVkNM0plKe92rp0IHs6K^Ms69RKs6C0^mdTc;oCV_Lq"ad`rVlcq +rltGdrlaKIqT86Js&%fQ"T85srr)iq"9&5trqHHi`;RUI`;R[J`r3mS`#!K:FEMbNGBeCZH[L6i +IXcluJV&N,KSBD[!JcL1M#iKlrf$l:!07#=s,d8Cr0%&Cr06W7r07/DqNCi?s,d,=s,R,=r/CZ6 +s,-`2s+p]1r.b3)re1-#qh"Bir.=fure1<*rJ(?-s+pZ2s,$f7reu8bNfK0]OH>TfP*;)oQ'IZ% +Q^F/.R[]e:S=Q7CT:hmOU8+N[V5C/gW2ZesX/rG*Y-5(6Z*L^B['d?N\%&u[]=bei^;%J"_SX4/ +`Q#s>aN;TJbg"GYcd:(ee'umtf%8O+g"P39h;-rFi8ESRj5]4^k2tjjkiq?sli-5OmI'uB!V#XY +o)J:]o_nI_pAamcq#C0hqYU0gr;HTbrdk+&s*t~> +JcC<$JcFd1o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noXEkn*f]3m-Es$l0%3kjQ#:Zi8q6QBdYsOH5B[MM[+CKS+i+ +Isl]jH$=ITFE2A?DJj9+C2%?nAS#@\@:3GKVPg?bVYd4%EV?(*TDY8\SbelQRfJoRRJrQUR@'A0 +rH.jVqK2XXpN6CUqj72Gp6GE=qN^ZoUGlLrgW\OrL3eWrgj%Ys./b> +qMP$(o8*FF!3,sts/Q.$or\(lqlBb!s/uU1ZEpmE[JmT8\@MRLerD3L\uo+L&Qc%KDU8kJc(,sKDpQ( +L&Hc+L]<20M>rG5MuJZ`NK0$[O-#HcP*2#mPa.N"Q^=),R@9V7S=H.AStD[LTq\Vf]tV7s_8=(,`5Ta:aN2KGbKS5VcHjkbdF6Upe^i@(f\,!5 +gtgfChr*GOioB([jlY^gkih9qlKeH9!U]=SmfDqJrpp*\!;-6_s7ZKerV6EgrqcNhrVZWmo)=4? +g&HR~> +JcC<$JcFd1o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no=3hn*f]3m-Es$l0%3kjQ#:Zi8q6QBdYsOH5B[MM[+CKS+i+ +Isl]jH$=ITFE2A?DJj9+C2%?nAS#@\@:3GKrDW_qs&Jtr!E2nn;#icP53b;g55S.K:]OAg;#=)i +;"RNa:dFJ6nj*1=s%hcRs%rbml;@:Ro1&^Js$ZZM!)`GdrD![1Q??=.&Gr_qcRqG[2fp/0jH!-J3_ +s*+Hc!HiM`FoQUgG^=^aI=:%=OT1I@P5^[CPjXh7Pl6gBP5^UDOSb+=NrP+:N;nh9MYr>2M#W8.LAlo+K_g>uK(=Kj +K):3"K`?c)LB!&/M#N82M?&S6N.$\GNfT6_OHG]hPEV5rQ'Rc'R$a;1S"#qjWN)u!XKAV-YHY79ZEpmE[C3NQ\@K2_]Y(ql^VI\&_Sa=2`lH0Aai_fNc-FV\d*^7ieC<%" +f@S[.g=tE=h;7&Ii8N\Uj5f=ak3(sll07L!rp0[Qmf)YUnF?MKs766_rUp3as7cKes7uZjqtp?i +rVc +JcC<$JcFd1o`"gfrqu]ks8)ckrqQNf!;?EbGkCUuo'u5q6QBdYsOH5B[MM[+CKS+i+ +IXQTiH$=FSFE2A?DJj9+C1q9mARo:[@:3I)kNDd,s60OIpu_Y>nWEg4r/pK3p64p-s4RJ+p"9/n +r72J1eC;sqdEp4ccHXVXbKJ&Mao0<\SGJ`QRfAlURdZ[>`;mjP_tCn>_th7L_tV+2U%ZM'a7%+G +ao9H^bPKH_c2Grcc2"m@\*:='kNV6rrp0FGrp0IH!pf.:rTOjYm-X3/nFH2Cp@e7UqYU6gs8("> +bl5fGb5KH^a8j?WaP]kpqu-EqrVZWlrV$9g_Z[oq_o0L``V7CM`Vm^lEccDGG'A.TH$Xd`I!pEl +It3'#JqJ]/L&Qf-LPYqd!K)g7N;nn;Nr>%=OT1I>P5LO6Pl$[?P5UOCOSb+=NrG%9N;nh9MYr>2 +M#N2-LAlo+K_g>uK(FQkK)1-"K`6](LB!#/M#E/3MMmDlN"q>4NfT6_OHG]hPEV5rQ'Rc'R$a;1 +rgR/_SXuFFTV8'RUSFW\V5C/gW2ZesX/rG*Y-5(6Z*L^B['d?O\@K/]]=bei^;%J"_SX4/`Q#s> +aN;TJbg"GYcd:(ee'umtf%8O+g"P07h;-rFi8ESRj5]4^roOCIkiq?sli-5OmI'uB!q>aMrpg-^ +o^r.Us7ZKerV6Bfs8)WirVZWmo)=4?g&HR~> +JcC<$JcFd1o`"gfrqu]ks8)ckrqQNf!;?EbG4bCso'u5q6QBdYsOH5B[MM[+CKS+i+ +IXQTiH$=FSFE2A?DJj9+C1q9mARo:[@:3H=rMKRlpnn"dqf'>jpRqGVrgs+[r1*SP!1NbP!1<\P +s)n0[r,_jZqK;COpm:lDqN^*,s-NJIpj2X\q0MV"rL3bSr0m)DpmV5Ps.'%Ys.'(Zq2561p5Ad) +qhb*(rJ:TSWiH'!s/c$u!j&N+r2fmuri,t!ri?7*YHY:;rj2g9[^WcWr4:UK!1%=OT1I>P5LO6Pl$[?P5UOCOSb+=NrG%9N;nh9MYr>2M#N2-LAlo+K_g>uK(FQk +K)1-"K`6](LB!#/M#E/3MMmDlN"q>4NfT6_OHG]hPEV5rQ'Rc'R$a;1rgR/_SXuFFTV8'RUSFW\ +V5C/gW2ZesX/rG*Y-5(6Z*L^B['d?O\@K/]]=bei^;%J"_SX4/`Q#s>aN;TJbg"GYcd:(ee'umt +f%8O+g"P07h;-rFi8ESRj5]4^roOCIkiq?sli-5OmI'uB!q>aMrpg-^o^r.Us7ZKerV6Bfs8)Wi +rVZWmo)=4?g&HR~> +JcC<$JcFd1o`"gfrqu]ks8)ckrqQNf!;?EbGP(Lto'u5q6QBdYsOH5B[MM[+CKS+i+ +IXQTiH$=FSFE2A?DJj9+C1q9mARo:[@:3G@;uTYt;cH^rCtOn4*@FqF($RrDEMiq+plas&&bns&&Si!`MuprDESm +rDWVlh+RK7qc<_unQ5rr<`N.!<;ff"<``C+=oMS,>?kH>ra#Y5?=*J,iDTJMqGR5gi(sDrqfWEk +F*)MHF`r"UH[C-gIJ-Y1]auFEMbNGBeCZH@($fI=?ZrJ:W<)K7nsXL&m'creUZ5MuJ\8 +NW5%;O8k=AOnt7=POXn7PPLC?OoLO?O8k7>NVnb8MuS\4M>rD2L\uo+L&Qc%KDU8lJc(,rKE$W( +L&Hc+LB*//M#rQmMuJYMNK0$[O-#HcP*2#mPa.N"Q^=),R@=,E>b%@VStD[LTq\hV[8LiSrnXjQ6C'"m>+6l0@U6liHMArpKpXnaZVL!qZ'Vrq6 +JcC<$JcFd1o`"jgrqu]ks8)ckrV1m:p@e1Po^qbGo'u5&]rQP/`rQbAdpUKV"n?rD_lK\?6qs+.GqWe(Es6:*[mI'H4o(2MHpA"I[r;HKlp4NfT6_OHG]hPEV5rQ'R`&R$a;1rgO(]SXuFFT`1WuU8+N[ +V5C/gW2ZesX/rG*Y-5(6Z*L^B['d?N\%&uZ]">Vg^;%Fu_8=(,`Poj;aN2KGbKS5VcHjkbdF6Up +e^i@(f\,!4gYCWAhr*GOioB([jQ5OdkNM0plKdd&m-X6/n*fc8nc&(\oCV\Sp&Facp\agdq>^ +JcC<$JcFd1o`"jgrqu]ks8)ckrV1g8p@e1Po^qbGo'u5[:jVu!:gV=nlIEV?(&TDkG^Sc##RRfJoNRJM's +FSU(SFT.[%Qi*0JQ/e21QhZsCHMr3dI/&'_RJ!$7S,/QRS,AfTSH,2ZSc4NDMtr8.Mtr8,M#`A, +M#aRTX8]4#XoGL%XoGI&Xo,7%X/`6!WXc)2Xfek4Z*L^C[C*HP\GWo=\[p(QqN_,HhbapQPH:'p3NXFED\MGBeCZH@($fI=?ZrJ:W=OK*I!_L5(J=M#N54MMmDl +N;nk;Nr4t4NfT6_OHG]hPEV5rQ'R`&R$a;1rgO(]SXuFFT`1WuU8+N[V5C/gW2Zes +X/rG*Y-5(6Z*L^B['d?N\%&uZ]">Vg^;%Fu_8=(,`Poj;aN2KGbKS5VcHjkbdF6Upe^i@(f\,!4 +gYCWAhr*GOioB([jQ5OdkNM0plKdd&m-X6/n*fc8nc&(\oCV\Sp&Facp\agdq>^ +JcC<$JcFd1o`"jgrqu]ks8)ckrV1j9p@e1Po^qbGo'u5`QU4oRYB5Q3k14m,$( +:\dib;>F#g;>jAm;>j>f:\d9P5NtGp;"@K^;Yj8c;Y3HS8,c!T7JBXW;>j>i:\IW\;>X5n;c6Lj +qbmAkrDM3>rC[#hs&\_m!EN4t<;ol)<`iL->$>-7>[:Y6?34J??1q4U;Ya8e;Vt=NFoul1F`dV( +rcJHiG^=^aI!pD7<:X&]r3EcZ>EG'A.TH$Xd`I!pElIt3'#K)UB,KS>/8LPL]bM#rQmMuJ\8 +N<#":O8k=@Onb+0PP:7=OoCI>O8b1=NVnb8MuJV4M>i>2L\li*L&Qc$KDU8oJbjupKE$W(L&Hc+ +LB*//M#rQmMuJYMNK0$[O-#HcP*2#mPa.N"QC!u+R@=,E"e;-TStD\TTkL0qUnjiaVl-JmWiE,$ +Xf\b0YctC +JcC<$JcFg2o`"gfrqu]ks8)ckrV-EfpAX`1o^h\Fo'u5Orl+oWrPefTqSW9Ks24`Np;?[DoY]mdr1Nf( +qoA9K!6P,\q9/`\qT\uas3:Shp:07oqR6F5!pT"8r9O=Hqs4:I!pT"8rok!Zlg4!*n+#u?o_/%S +qYU3iq>^-4s31DahTGc<+It3'# +JqJ]/KS>/8LPL]bM#rQmMuJ\8NW5%:O8b7>Olqo*Oo:C=O8b1=NVe\7MuJV3M>rD2L\uo+L&H]# +KDC,pJbjupKDpQ(L&Hc+L]<20M>rJ5MuJY9NK4"!IuoeTP*2#mPa.N"QC!u+R@9S6S"-%@StDXJ +TqS3UUnjiaVPg>jWN)u!XKAV-YHY79ZEpmE[C3NQ\@K/^]Y(ql^V@S#_SX71`Q#s>aN;TJbg"GY +cd:(edaZdsf%8O+g"P07gtgfChr*GOioB([jlY^gkiq?slKdg'mJlVSn,MkWnc&+Zo)SF]p&Fac +p\jmeq>U6fqu-HkrUTr=s4[L'~> +JcC<$JcFg2o`"gfrqu]ks8)ckrV-EfpAX`1o^h\Fo'u5RerTQSGeuY +SGo)WMYi=oMY`20MZ0[UXT,F%XT,F!XT,@!WrB%,XKJb2Z*L^C[C3NRrODp>rOL%:rg)G2M#N2-LAlo*K_^8rK)'uoK)1-!K`?c)LB!&/ +M#N82MZ8V6Mueourf;PjOcbfiPEV5rQ'R`&R$a;1R[]e:SXuFFT:hmOU8+N[V5C,fVl6SpWiN5' +Xfek3Yd(L?Za@-K[^WcW\\#Me]tV7r^qmn)`5T^8a2l?Db0/#RcHab_dF$CleCE.%f@\d1g=tE= +h;7&Ii8N\Uj5f=ak3(sml0@R"m-O->mf2bUn,W"Xo)J:]o_nI_pAamcq#C0hqYU0gr;HTbrdk+' +s*t~> +JcC<$JcFg2o`"gfrqu]ks8)ckrV-EfpAX`2o^h\Fo'u51=BSg3>?kE=?N+=2?N4=&;rCRH;r:FMFo?C]F9Hc2 +G^4W4Hh15-;LPYqd!fDnorf$l:s,R#< +rfI)@kE>b*rK-o;rf6u;qi(Q5regW1s+pZ0r.b3)rIk!!q1AEnqL\Qrre1<*rJ(?-s+pZ2s,-i7 +repl;NrG)hOHGZgP*;)oQ'IZ$Q^F/.R[T_8S=Q7CT:_dMTq\b]Y2%o^VI\&_SjF4`lH0Aai_fNc-FV\d*^7heC<%"f@S[.g=k<:h;-rFi8ESR +j5]4^k2tjjl07Kulg4!*s6fpUs6p$Yrpp*\!;-6_s7ZKerV6EgrqcNhrVZWmo)=4?gAc[~> +JcC<$JcFg2o`"gfrqu]ks8)ckrqQNf!;?EbHM$h"o'u5q6QBdYsOH5B[MM[+CKnFu- +Isl`lH?aXWFE;JBDf0E-CM@HpAn>L_@UWYOjQ5Lcr9*t@rTEL0r/pT6o99-;o99.+n_!ckrRV#!% +b/tVda?Fgcd0n]c-4ARpRCuKpm_/Lq3qB'rl4oUs2=ZLrl"?EpVcaBjIuRG!6+cRrQ"NN"3J^.b +Po`^bPKHXc2>iechb3K\DF^olN-Ap%J.UqYU6jrqcWprq=V5bl5f?b +2H1r;?-Fpq"agbrq-6__u@UF`VRUM`?0/CFEMbNGBeCZH@($fI=?ZrJ:W9'K7ei2Knb>;LPYqds +,-i7rf$l:rf6l:rK-l'p+Q?P*2#mPa.N"QC!u+R@9S6S"-&KSctaZTqS3UrhNSkVPg>jW +N)u!XKAV-YHY79ZEpmE[C3NQ\@K/]]=bei^;%Fu_8=+.`Poj;aN2KHbKS5VcHjkbdF-Ooe^i@(f +\,!4gYCW@hV[8LiSrnXjQ5OdkNMp0!UB"MliHMArpKpXnaZVL!qZ'Vrq6 +JcC<$JcFg2o`"gfrqu]ks8)ckrqQNf!;?EbHM$h"o'u5q6QBdYsOH5B[MM[+CKnFu- +Isl`lH?aXWFE;JBDf0E-CM@HpAn>L_@UWYOUSFW]r20Cir20%(kAg<"MZ8P(MXRYHWr]6"r2L1,Xfek4Z*L^C[C3QSrOMs<"1PeM\'UKAQN*;%(7W_SX4/ +`lH3Ebg$(3!n#HEifa,$qN;qAFEDYKGB\:WH?spcI=6QoJ:N3%JqJ]/KnY89LPL]bM>rJ5MuJ\8 +NW+t8O8Y1:Onb+8Oo1=:O8b1=NVe\6MuS\3M>rD2L\li*L&Qc#KDC,rJbaonKE$W(L&Hc+L]<20 +M>rG5MuJ\8N<#"tQBml)R$jD3S"#q=rgj:cTV8'RU].&iV5C/gW2ZesX/rG* +Y-5(6Z*L^B['d?N\%&uZ]">Vf]tV7r^qmn*`5T^8a2l?DbKJ,ScHab_dF$CleCE.%f@\d1g=tE= +h;7&Ii8N\Uj5f=ak3(t-klL)8rp0[Qmf)YVnF?&JncJFTo`"O`pAamcq#:*hqYU0gr;HTbrdk+' +s*t~> +JcC<$JcFg2o`"gfrqu]ks8)ckrqQNf!;?EbHh?q#o'u5q6QBdYsOH5B[MM[+CKnFu- +Isl`lH?aXWFE;JBDf0E-CM@HpAn>L_@UWYO;c6Ll;uKSp;cN`rr)E5Lk<8E#o0<1;q+pZ[r)*;e +s%rbor_j&";,C(d:esm_5lX(G5kdM>5l!_6;#O8i;"IQO;XHsK8,c!R;#4&Z;#!oc;?0Yh;Z9Vo +;Z9A=9Dqrm=85nt=8uA*=&r=#<;fbq$P<[6_ri)9ALiDBMN%;LPYqd +s,-i7rf$l:rf6l:rK-l'p+Q?P*2#mPa.N"QC!u+R@9S6S"-&KSctaZTqS3UrhNSkVPg>j +WN)u!XKAV-YHY79ZEpmE[C3NQ\@K/]]=bei^;%Fu_8=+.`Poj;aN2KHbKS5VcHjkbdF-Ooe^i@( +f\,!4gYCW@hV[8LiSrnXjQ5OdkNMp0!UB"MliHMArpKpXnaZVL!qZ'Vrq6 +JcC<$JcFg2o`"jgrqu]krqZWjrV1j9p@e1Po^qbGo'u5q6QBdYsOH5B[MM[+CKS+l, +Isl]jH?aXVFE;GADf0E-CM@HpAn>L_@UW['j5g7%!9X4Bqrn(CrKHi9rfcf6o98p5p65F-nCRcn +f`'M$edp<\eC2jndEp7dcd'eZS"&`6qO@GPqO@H'rl+fRq8;mDqSW'Gou$U"l(J*Mq8WBRprNEU +s2tAbnBCXO!7(Mgs18!9rODR1rj_=(s6B^PlhfuElN$5Jkn*.Glg4$.nac;Dp@nCZqu-Nks8W)u +rV4Y3bl5f@b2Q7q;$?XgqYL0^s74)-`::hD`qmX_F*)MHG'A.TH$Xd`I/\NtIXcluJV*lR#D@eb +L5(J=M#E/3MMmDkN;eh:Nqnb2OSk78OSFn8NrG%8N;eb7MYi81M#N2,LAlo*K_U2dK)(&uK`?c( +LB!&/M#N82M?&S6N;nk;NrG(SOHGZgP*;,pQ'IZ%Q^F/.R[T_8S=TYN%\KDfTq\ +JcC<$JcFg2o`"jgrqu]krqZWjrV1m:p@e1Po^qbGo'u5q6QBdYsOH5B[MM[+CKS+l, +Isl]jH?aXVFE;GADf0E-CM@HpAn>L_@UWZ=U8+IaUo"!dr29OkrGhFJluD--qJcM-oUu#Ps.94\ +opc&PRf8cVRd"t`FT.[.R.Zg?QN!6MQiNKKQN!0GQN*i0*u$qN;8.FEDYKGB\:WH?spcrd=s!It3'#K)UB-KS>,7L51P?rJ:T5Mi7Om +rf-rai_fMbg"GYcd:(ee'umtf%8O+g"P07gtgfChr*GO +ioB([jlY^gkih9qlKeH9!U]=SmfN"Knc&(\oCV\Sp&Facp\jmdq>^ +JcC<$JcFg2o`"jgrqu]krqZWjrV1j9p@e1Po^qbGo'u5q6QBdYsOH5B[MM[+CKS+l, +Isl]jH?aXVFE;GADf0E-CM@HpAn>L_@UWYE<)`fps&8ko!E2tsO)i;,[Bl!)ibm!)WPXr^$6Cp-8L@qEaRHl;?qHq+'sEq*tESqG7/hrDNYmp/(H[m8Em]s&/\f +rCm2`!)26Br`B/%q,mVt"^"i,<)Z]m;[ZQ*<``C+>$>-8?!dM;!+,Y1s'5S.r`&;ahbsGPi_]PM +rGqmZ"Eo!6H$T=6s*O67nQ#?brDa8IFEDYKGB\:WH?spcrd=s!It3'#K)UB-KS>,7L51P?rJ:T5 +Mi7Omrf-rai_fMbg"GYcd:(ee'umtf%8O+g"P07gtgfC +hr*GOioB([jlY^gkih9qlKeH9!U]=SmfN"Knc&(\oCV\Sp&Facp\jmdq>^ +JcC<$JcFj3o`"gfrqu]ks8)ckrV-EfpAX`5o^h\Fo'u5L_@UW[&iT'"\jlZL(r9+1EPk^I?P4Xt5P5:CAPl6g9PkgO@ +g$IAifDjD+e^W*tdaHPAciDDfS*QUBS,\rRS,C8+`VmaI_t_1J_tM%B_Z6IoUALVa`VRUQ`rO3V +ao0B\bPfWbc25`Wc2Greci;Aj](ro1\G`o2\F[3.lhp&Hli-2Jkn!(Flg4'.nFH5Ep\=U^r;HWo +#ljo(rr2lpr;HK:qTSu_!6k5]il_;Cj\YkPrDE^mqu-'bs2=WK!5e]Pq8E-Kqo8NP&T`&9F`qtQ +G^4R\H@($fI=?\FJ,t4Qrdt6)L&Qi,LB*//M>rJ5Mu8P6NW"mrO8P%;NV\V5MuJV2M>i>1L\li* +L&Qc#KDC,pJbaooKDpQ(L&?Z,LPUcbM#rQmMuJY:NK0%uNrb?)rfRYQPa%GuQC!r*R$jEBRfT%M +rgm_oTV8'RUSFW\V5C/gW2Q\qWiN5'Xfek3Yd(L?Za@-K[^WcW\[oDc]Y2%o^VI\&_Sa=2`Q-'@ +ai_fMbg"GYcd:(fe'umtf%8O+g"P07gtgfChr*GOioB([jlY^gkNM0plKeH9!U]=Sn,MkWnc&+Z +o)SF]o`Fj]p\agdq>U6fqu6NkrUTr=s4dR(~> +JcC<$JcFj3o`"gfrqu]ks8)ckrV-EfpAX`5o^h\Fo'u5L_@UWZQ'IZ%Q^F/.Rf8cWS=TYNAtP`i +Tq\ +JcC<$JcFj3o`"gfrqu]ks8)ckrV-EfpAX`7o^h\Fo'u5L_@UWYFr^$9TrD3>flr!1Kj[]2;qb[;irDNPj +rDQ'IZ%Q^F/.Rf8cWS=TYNAtP`iTq\ +JcC<$JcFj3o`"gfrqu]ks8)ckrqQNf!;?EbJ+W@'o'u8>n*]T0m-Es$ki_*ijQ#7Yi8Gp\F^arVcTls8Drp +!<)i?qTSfZ!6Y&ZjN?X^qbd;is&/srrpg$e`;%7L_YqCK`;.CN`r!^aF*)MHG'8(RG^4U]H[Pg@ +#(D&PJ:W9'rdt6)L&Qi,L]<2/M>rJ5Mu8P4NW"n'O8Ft9NVSP4MuJV1M>i>1L\li*L&H]"KD0ur +JbXinKDpQ'L&Hc+L]<20M>rJ5MuJY?NK0$[O-#HcrfR;GPl?pKQC%TaN;TJbKS5V +cHjncdaQ^qe^i@(f\,!4gYCW@hV[8LiSrnXjQ6C'&Ei9Al0@U#m-O--mdKW6nF?MKs766_rUp3a +s7cKes7uZjqtp?irVc +JcC<$JcFj3o`"gfrqu]ks8)ckrqQNf!;?EbGP(Lto'u8>n*]T0m-Es$ki_*ijQ#7Yi8[:hVt"d+E;OYDEqaYMEqFANTD5)O +TDY;\SbJZSS,RQpFSU(SFT.^)R/NBDQM$RFQBh62s-NSLid:WMqO.;Nn!j?Im[O6HrLEq[rLND7 +pP\g(nqm@Hq5jUsri5pr$EC/.Xfnt6ZEpsHrjDj:\Giu;[K*`5[ca"UR-p=9Q2m35;#=,g;ZBZ' +_o9[V(Oo^c2rfmMMQiU6fqu-Hk +rUTr=s4dR(~> +JcC<$JcFj3o`"gfrqu]ks8)ckrqQNf!;?EbHM$h"o'u8>n*]T0m-Es$ki_*ijQ#7Yi8?kJ3?4'tC>?kB:>$>-7$jq-_>l07L!lg4!*mdBQ4nF5uIo)J:]o_nI_pAamcq#C0h +qYU0gr;HTbrdk+(s*t~> +JcC<$JcFj3o`"jgrqu]krqZWjrV1F-p@e1Po^qbGo'u5PQ7!EPlKG7gAfjlf`0P*f%&="rmLho!7:>,qjdPSopklJr5SZR!6"9BnAP%rp0LI$L@'Hn+#u@pA"I\rVc]orr)cm +!;lc?!R/gdbkfNZb4s0Db32\!;>jDj;t0h]`:_%E`;.CO`r!aSF;/k@GB\:WH?spbI!pElIt*!! +JV&LQK*$^[L&Qi,LB*//M>iD4Mu&D1NU2]&NVSP3MuJV1M>i>1L\cc)L&H]"KDC,pJbaooKDpQ' +L&Hc+L]<20M>rJ5MuJY?NK0$[O-#HcrfR;GPl?pKQC%T$jpUA9l07Kulg4!*mI'uB!V#XYo)J=]o`"O`pAamcq#:*h +qYU0gr;HTbrdk+(s*t~> +JcC<$JcFj3o`"jgrqu]krqZWjrV1m:p@e1Po^qbGo'u5Vg^;%Fu_8=(,`5T^8a2l?Db0.uPc-FY^dF$CkeC<%"f@S[.g=k<:h;-rF +i8ESRj5]4^roOUOkiq?slKdg'mHs?@mfDqJrpp*\s7H<`s7ZKerV6Bfs8)WirVZWmo)=4?g])d~> +JcC<$JcFj3o`"jgrqu]krqZWjrV1m:p@e1Po^qbGo'u5Vg^;%Fu_8=(,`5T^8a2l?Db0.uPc-FY^dF$CkeC<%"f@S[.g=k<: +h;-rFi8ESRj5]4^roOUOkiq?slKdg'mHs?@mfDqJrpp*\s7H<`s7ZKerV6Bfs8)WirVZWmo)=4? +g])d~> +JcC<$JcFm4o`"gfrqu]ks8)ckrV-EfpAX`7o^h\Fo'u5q6QBdYsOH5B[Mi!7EKnFu. +J:;onH?j^XF`_YDE,TW2CMIQsB4b^c@q&lsf%Ss:i8N_V!p&J*r9*g?rg!MLp6F[&mZmg:ptGc$ +lIZ6kf%&:!rmCeorLEGJqjdPSpRM/Ns2P)Zs2P)Xs2=a +rQONNq9B&fd*VR"rOVp;o=4e1m^W;_s6KaQqs4m[m-Es&m-O-.nF?,Bp\=R]rqu`orVc`nrqc]l +p<^gurJUW3qMG3-rJ19)rIt6(pOi9npjr6mqLed#s+UB*s+gW1 +re^Z4!/pi8s,@#=rf7,BOcfX+!L&cIPl[2;rg3_SRf8cWS=TYNDkE\rTq\9VUnjiaVPg>jWN)u! +X/rG*Y-5(6Z*L[AZa@-K[^WcW\[oDc]Y2%o^VI\&_Sa=2`Q#s>aN;TJbg"GYcd:(edaQ^qe^i@( +f\,!4gYCW@hV[8LiSrnXjQ5Lck3(sml0@R"m-O-,mf)YVnF?&JncJFTo`"O`pAamcq#:*hqYU0g +r;?Nardk+)s*t~> +JcC<$JcFm4o`"gfrqu]ks8)ckrV-EfpAX`3o^h\Fo'u5q6QBdYsOH5B[Mi!7EKnFu. +J:;onH?j^XF`_YDE,TW2CMIQsB4b^c@q&l8S=ZCIr1X4eV#7+EEVskUEVjePF7XGPEVQ3pTDP2[ +Sc5,^SXc7ASG%*fFSU%ZR/WNNR.cmAQMm0JQiNKKQN!6JR/MEjHh*W^S,]#TS`,J*Mu/D(M>sXR +XT,=$XT#:#WrK+*XKAY/YctF>[/IB4[f3c9[f<`8[/78nQhQm:Qi369;#=,f;Yj;l<;joDb0/#Q +c-FV\r6bD*rK?i9q3(K9r/q>,FEDYKGB\:Wrd"TlI/\NpIXh?I#_@SZK7ei1Kn]M\s+gW1rJCN2 +repQ1m>^gurJUW3qMG3-rJ19)rIt6(pOi9npjr6mqLed#s+UB*s+gW1re^Z4!/pi8s,@#=rf7,B +OcfX+!L&cIPl[2;rg3_SRf8cWS=TYNDkE\rTq\9VUnjiaVPg>jWN)u!X/rG*Y-5(6Z*L[AZa@-K +[^WcW\[oDc]Y2%o^VI\&_Sa=2`Q#s>aN;TJbg"GYcd:(edaQ^qe^i@(f\,!4gYCW@hV[8LiSrnX +jQ5Lck3(sml0@R"m-O-,mf)YVnF?&JncJFTo`"O`pAamcq#:*hqYU0gr;?Nardk+)s*t~> +JcC<$JcFm4o`"gfrqu]ks8)ckrV-EfpAX`5o^h\Fo'u5q6QBdYsOH5B[Mi!7EKnFu. +J:;onH?j^XF`_YDE,TW2CMIQsB4b^c@q&kE;H-[tsGn;tWHQ5kRGB5kRA9;#F,h;".?I;VXbB;=dWS;=%3Y;u]bP9^YOR +=8l>#=8l5%?kE=?N+44>[(B9r*',)oi1K\pJh&hnP\[Lqbd8hqGRGp +F`m\,s*"QiH$OZ6H2`-el<=!YfFEMbNGBeE4H3&A?rd=frJ,Xs(JV&K+K7no3L&Qi, +L]<2/M>iD3Mti7uNV8>0MuAP0M>i>0L\li)L&Qc"KDC,oJbaooKDpQ(L&?]*L]<20M>rG5MuJ\8 +N<#"Vf]tV7r^qmn)_o0O5`lH0Aai_fNc-FV\d*^7he'umtf%8O+g"P07gtgfC +hr*GOioB([jlPXekNM0plK[^%m-X3.rpKpXnaZVL!qZ'Vrq6 +JcC<$JcFm4o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_npU&tn*f]2m-Es$l0%3kjQ#7Yi8 +UA:MXUAU_^a8*jWb5TT^bj3OKcMl2h])0,9])B24\G*Q,\-20cmd9E>li?GOlj<(InF?)@p%S7W +rqc]nr;?ZorVcWuqtg0bq9-tVbl#ZTb4j*Kb3i+';>a>f;uT_r-ZLB!&.M#<,/MZ/OmN;SV4MYW,.M#E,+LAci)K_U2r +K(OWjK)1-!K`?c)LB!&/M#E/3MMmDlN;nk;NrG(JOHGZgP*;)oQ'IZ$QiU6fqu-HkrUTr=s4mX)~> +JcC<$JcFm4o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_np0cpn*f]2m-Es$l0%3kjQ#7Yi8hr_s5)aiMTHbK\8T +cHlI9s3^Y+rK?i9qNCT:rK7;)FEDYKrc\`pH$Xd`I!g?jIXZeGJ,t4QrIY0)Kn]M\s+gT0r/(E1 +reo`or/:N2q2,*,rJ19)rIt3'pk/EpoRZjjqLed#s+UE+s+gW1rJ:T5Mi7Rns,@#=rf7JLOcbfi +PEV5rQ'R`&rg3_SRf8cjS=Q7CT:_dMTq\9VUnjiaVPg>jWW&n$X/rG*Y-7i/$*geBZa@-K[^WdG +\NRO9]Y(ql^V@S#_SX4/`Q#s>aN;TJbKS5VcHjkbdF-LneCE.%f@\d1g=tE=h;7&Ii8N\Uj5f:_ +k2tjjrojIKli-5OmI'uB!q>aMrpg-^o^r+T!quB_r:p +JcC<$JcFm4o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_nosWnn*f]2m-Es$l0%3kjQ#7Yi8l@t.>PhV&>P1t`;tj8h;tX&V;#=,f;Ya8jjWW&n$X/rG*Y-7i/$*geBZa@-K[^WdG\NRO9 +]Y(ql^V@S#_SX4/`Q#s>aN;TJbKS5VcHjkbdF-LneCE.%f@\d1g=tE=h;7&Ii8N\Uj5f:_k2tjj +rojIKli-5OmI'uB!q>aMrpg-^o^r+T!quB_r:p +JcC<$JcFm4o`"jgrVZTjs8)ckrqLs:p@e1Po^qbGo'u53s4R/!qq1u%rn.J-f@JL%e+B1.S,/Z@RfSttrl=uWrPeQMqnr3IqSiEOpquNo!28nVs.T>2 +qoSl\s3(;`rltJg!71SgoZd?[r6PAhpU^C:pU^@7ppfh(r4)dprpBaPs6TjTmJcMYn*ol=o_%qQ +rVH6c#5e8mqYBp]qoel\r6+QOpWN3OnPK'Zr)3>hr`&ks!*8[j!5nQLkemG=qS`SYFEDYKrc\Bf +H2`*jH[Pg@#C_/PJ:N3%K)L<'KS>-YLB!&.M#<,.MYrD"N;AJ1MYW,-M#N2+LAci)K_U2rK(4Eh +K)1-!K`?c)LB!&/M#E/3MMmDlMuo!!NrG(?OHKO*,a4IWQ'IZ$Q^F/.R@9V7S=H.AStDXJTqS3U +USO]^VP^8hW2]cr<3*+&Xfek2YctC +JcC<$JcFm4o`"jgrVZTjs8)ckrqLm8p@e1Po^qbGo'u5hr`&ks +"'3Lbb5TQdbg+P\rm:\m!0[/ArK?u=rK?]7rK7;)FEDYKrc\BfH2`*jH[Pg@#C_/PJ:N3%K)L<' +KS>-YLB!&.M#<,.MYrD"N;AJ1MYW,-M#N2+LAci)K_U2rK(4EhK)1-!K`?c)LB!&/M#E/3MMmDl +Muo!!NrG(?OHKO*,a4IWQ'IZ$Q^F/.R@9V7S=H.AStDXJTqS3UUSO]^VP^8hW2]cr<3*+&Xfek2 +YctC +JcC<$JcFm4o`"jgrVZTjs8)ckrqLm8p@e1Po^qbGo'u5!6I6MNk=5QF%?;"%9G;Z&u\7d!;A7K??kH=>[(E9=oDM)>?q/3nPnpTpJh)ipepWYqGI/gq,@8lr`';+FEVkQ +GB\=XG^045!d]2mq,QranQ#Qh"]]VcFEMd+G6)r6rd"TlI/\O!IXcitJ:W9'rIY0)Kn]J[s+gT0 +r/(B0r/9s$qMY9/q2,'+reL?)rIt3'pk/EpnU^RhqLed#s+UE+s+gW1rJ:T5Mi7Rn!f`5#rf7)A +OoCLhPE_;sQ'R`&R$a;0R[]e:S=Q7CT:_dMTq\jWW&nsX/rG*Y-5%5Yd(L?Za@-J +[^NZT\[f;`]Y(ql^V@S#_SX4/`Poj;aN2KGbKJ,ScHab_dF$CkeC<%"f@S[.g=k<:h;-rFi8ESR +j5]4]jlY^gkl0fIlKeH9!U]=SmfN"Knc&+Zo)SF]p&Facp\jmeq>U6fqu-HkrUTr=s4mX)~> +JcC<$JcFp5o`"gfrqu]ks8)ckrV1d7p@e1Po^h\Fo'u5Z[Bm0CYH=n+WMcVhUS4?PSXZ(8Q^*euOcPN^N/EIIL4k22 +J:DuqH[9p\G'%hHEH#f5Chmd"BP1pgA7K(WrmM8)e^iF.h;7)Lj5f>#QL^CX8e;uTbpSt;RITV8'RUSFW\V5C,fVl6To +WWB0%riH@,YHY79ZMq0:['d?N\%&uZ]"@sS3k`8B^VI\&_Sa=2`Q#s>aN;TJbKS5VcHjkbdF-Ln +eCE.%f@\d1g=tE=h;7&Ii8N\Uj5f:_k2tjjrojIKli-5OmI'uBs6p$Yrpp*\!;-6_s7ZKerV6Eg +rqcNhrVZWmo)=4?h#Dm~> +JcC<$JcFp5o`"gfrqu]ks8)ckrV1d7p@e1Po^h\Fo'u5Z[Bm0CYH=n+WMcVhUS4?PSXZ(8Q^*euOcPN^N/EIIL4k22 +J:DuqH[9p\G'%hHEH#f5Chmd"BP1pgA7K(WrgNtXS"9MN!29@crGhXRlZ)lBol9hKqJl.Jr^$1L +l_"0Js./V%ol]\Es-`ADqNq5L!1EDFqj75Jr-eEhp3Z:Ts-rbOqj[MPqO@MT!hGjOqO@DQpRU/u +rJU-%s/c.!"g"i.Y-+u-Xobf2ZMh-,[/dZ5[0!_C[J[K-R/30LR-p=8R/**KQM")M;>X8e;uTbp + +JcC<$JcFp5o`"gfrqu]ks8)ckrV1d7p@e1Po^h\Fo'u5Z[Bm0CYH=n+WMcVhUS4?PSXZ(8Q^*euOcPN^N/EIIL4k22 +J:DuqH[9p\G'%hHEH#f5Chmd"BP1pgA7K(Wr`&nr!*&qus&K"srB':,p-%h-mlg\7r^$?Uqb[)c +q,%#es&/em!(-2Aqbd>hs&&2^r)*G'8(RG^4R\H@($eI=6QnJ,XuuJH1<#KE$W)L&Hc+L]3,+ +M>W7uMu/D+M>`8/L\cc(L&H]"KDU8fJc(,rKDpQ(L&Hc+L]<20M>rJ5MuJY:NK0%uNrb?)rfSOj +Pa%GuQC!r*R$jA2S"#qU6fqu-HkrUTr=s4mX)~> +JcC<$JcFp5o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noO?jn*f]2m-Es$l0%3kjQ#:Zi8R$X)&P*(fcN/NRMLPCJ7 +Jq/?!I!^0aGBS(MEcH&9DJX*'BkV-kARo:[daJ*C#h7DVg"Y?>ioBQqq3LiAl]g\"rB^/2kLfmg +fC>EjSH#)Ya8*aQ`VmaP_u@UC`;mjQ_sa?"U[b)WUBRC5aN;QHrlG2`bP06\blH&gci;;bchG`] +ci;Ab])K>:]&1'umeuS`nF,l9nac8Bo_/"Qq>(!crVQQk!rMiiqY9^+!6kDbn&k1Dqo\b3pJLfc +pf%/krDibr!*Adl!5e`QqS_O6rl"cSs)e9`"a5*6G^+N5H3&A?rdFfq!.Xuus+(0%rIb-'s+UB* +s+gQ/pkeBqp5/^'rJ13'rIt3'pk/Hql@JncqLed#s+UE+s+gW1re^Z4s,6l8#E=b(O,oBaOoCLE +PEc'3)O?_VR$a;1R[]e:SXl@DT:hjNTq\Za7$H[^NZT +\@K/]]=bei^;%Fu_8=(,`5T^8a2l?Db0.uPc-FV\d*^7he'umtf%8O+f\,!4gYCW@hV[8LiSrnX +jQ,Fbk3(t-klL)8rp0[Qmf)\Tn,W"Xo)J:]o_nI_pAamcq#C0hqYU0gr;HTbrdk+)s*t~> +JcC<$JcFp5o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no=3hn*f]2m-Es$l0%3kjQ#:Zi8R$X)&P*(fcN/NRMLPCJ7 +Jq/?!I!^0aGBS(MEcH&9DJX*'BkV-kARo:[qjRYWSY#hQ!hc9^nT+/>oPjSFl>lhhp7UT@s.8M! +k]QoIs-`ADqj7;Lr0d/Drg3SNpjN$eom?:Vs-rhQr1!MNqj[PSr13VQqOI_YSXk\qMYrD%MYsRT +XoGR&Y6D/8Z*L^BrNuO2s0hd3r3l6bs-NPKoU#-9qj.;KqG?o`qbm2fr`&hrr)O#'b0/#Qc-H75 +s3LbnrK?u?rK@#>rK?`8rf[;'s)eKgGB\:VH2`*jH[Pg@s*artrdb$"!.t0%s+LE+r.b6,rJ:6* +m>CUor.t<,q1ej%rIjruqh"*arIXlure1<*rJ(?-s+pZ2s,-i7req)ANfK0]OH>V(Oo^c2rfnCf +Q^=),R@9S6S"-%?St;RITV8'RUSFW\V5F6i!NaN;TJbKS5VcHjkbdF-LneCE.%f@\a/g=k<:h;-rFi8ESRj5]4]jlY^g +kl0fIlKeH9!U]=Sn,MkWnc&+Zo)SF]p&Facp\jmeq>U6fqu-HkrUTr=s4mX)~> +JcC<$JcFp5o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_no=3hn*f]2m-Es$l0%3kjQ#:Zi8R$X)&P*(fcN/NRMLPCJ7 +Jq/?!I!^0aGBS(MEcH&9DJX*'BkV-kARo:[q,@Gr<`W6"<9ZOA4TI\<4nLr+4oI\C:\[c^;>a8f +;#jMn;>`cO62j4I6i04C62s4G;!h-C;Y3EU7dKbqG[Mp<)i`e +qb-BOn4iUMr`Attr)Eo$='&L,=oDM(>Q.n+>Q7n'>6%pn<:j,Z<;]Yp;Yj5a;>X8d;uTbpZa7$H[^NZT\@K/] +]=bei^;%Fu_8=(,`5T^8a2l?Db0.uPc-FV\d*^7he'umtf%8O+f\,!4gYCW@hV[8LiSrnXjQ,Fb +k3(t-klL)8rp0[Qmf)\Tn,W"Xo)J:]o_nI_pAamcq#C0hqYU0gr;HTbrdk+)s*t~> +JcC<$JcFp5o`"jgrVZTjs8)ckrqQNf!;?EbG4bCso'u51WDm?[g=pQb33!0d5Cn!3f:pY+`^ +!8-t7qOQW9s2XfPrl+fRl,EY?r58$!rLs:en=ooWrlP,]!6b)[s3:DcrQkDgnBV*]qRcU8rk%p9 +iOT!W!q>aMrU:6co()DEp@n=Vq>'m`rVQQk!rMiirV-BerqHKfm`Y1Dlc]=Nr_W;cqbm2frD`br +qc<\t!*Jmnrke]QqS_L5s2=oUs)e9`!-\?c!I/nhH3/G@I/\NqIXckHJH(0#K)L?%K`6]'LAlu, +LuF3fM#E,)LAci(K_U2tK)'ukJGFcpK):3"K`?c)LB!&/M#N82MZ8V6Mueourf@)@!0R8D!L&cI +Pl[2;rg3_SRf8cWS=TYN!M?%aT`Lm_rhKRkVZ*IoW2]cr!NW=$XU;57YctC;ZEpmE[JmTe\%&uZ +]">Vf]tV4q^VI\&_Sa=2`Q#s>aN;TJbKS5VcHjkbdF-LneCE.%f@\dUg'QNhh;-rFi8ESRro4RN +jlY^gkih9qlKdd&m-X6/rpKmWnbr"[oCV\Sp&Facp\agdq>U6fqu6NkrUTr=s5!^*~> +JcC<$JcFp5o`"jgrVZTjs8)ckrqQNf!;?EbG4bCso'u5Vf]tV4q^VI\& +_Sa=2`Q#s>aN;TJbKS5VcHjkbdF-LneCE.%f@\dUg'QNhh;-rFi8ESRro4RNjlY^gkih9qlKdd& +m-X6/rpKmWnbr"[oCV\Sp&Facp\agdq>U6fqu6NkrUTr=s5!^*~> +JcC<$JcFp5o`"jgrVZTjs8)ckrqQNf!;?EbG4bCso'u5EQM62O"F6iKFF62FFJ;>jAm;g<;]Yp<;9)` +9Bo4C:&%E[=8l7u<`!~> +JcC<$JcFs6o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5g +r6bGh!mf6?r6P>Rqn2m>s183Apq#Fp!V,a[nc/+YnI"m[p@n=Vq"aa^qY9phqYBp]p]&D)bOis@ +bP+m1;YX2h<;fhoaMrpg-^o^r.Us7ZKer:p`!~> +JcC<$JcFs6o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5:[qr.k'%rIt0&pk/KrqLS*cr.4fuqh+m$s+UE+s+gW1re^Z4!/pi8s,@#=rf7;G +OcbfiPEV71Pl[2;rg3_SRf8cWS=TYN!M?%aT`Lm_rhKRkVZ*IoW2]cr!NW=$XWXdMYctC;ZEpmE +[C*HO\%&uZ]">Se]Y2%o^VI\&_Sa=k`?rUFaN2KGbKJ,ScHab_dF$CkeC<%"f@S[.g=k<9gtgfC +hr*GOir7sLjQ5OdkNM-ol0@U#m-O--mf)YVnF?&JncJFTo`"O`pAambq#C0hqYU0gr;HTbrdk+* +s*t~> +JcC<$JcFs6o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u55hb)>l@k,>5DJ'>lRa`<<#n\<;08d;YX2h<;fho^3 +!HiSbG63#7H2`*jH[Pg@s*jutrdb$"s+:3%s+LB*r.b0*qhXWrqM>')pkJa$r.Oitr.=crmst=e +rIXp!re1<*rJ(?-s+pZ2s,$f7rf$l:!07&>#EY(1P*2#mPl?pKQC%Th;7&Ii8N\pit1;5k2tjjkiq?slg*p(mI'EAmfN"K +nc&(\oCV\Sp&Facp\agdq>U6fqu-HkrUTr=s5!^*~> +JcC<$JcFs6o`"gfrqu]ks8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-Es$l0.9ljl>C[i8EJJgtLK7 +f@JI$da?Cdc-+8NaMu3:_SEq"]Xt_a[^EHIYck11Wi;nnUnaWVSt2C@R@';*PEM#gNJrdPLk^V: +K7SQ&I=-?eG^"=QFE2A?DJj9+CM@HpAn>L_@fFdWe'c\BdfJ"Mqj6i=m$7=0lBM?9qa'i-q:YMr +r7U>)rgi5Bs2b8^r5nu[pW*-Orl>#XrPe]Srl+lTrke`Srh\qVm\Bg(!6Y8`qTSuapWi``qU#/f +p!EKGq7Q[Oqs76-Y#4qK[p\4IXrV6HiqtpEis7u]ip\4R-o#p[Jl-&s$qGR#crD`brqH!Ss +r`K/&o`+s-rke]Qr5@U4s2=qZ#Bb35GB\:VH2`*kH[L5?IK+`rJ,OotJcC?#KDpQ'L&-Q%L[9in +L\HQ$L&H]"KD^>uJa%^`Jc12tKE$W)L&Hc+L]<20M>rG5MuJ\8N<#"Vf +]tV7r^qde'_Sa=2`Q#s>aN;TJbKS61c4SCLdF$CkeC<%"f@S[.g=k<:rnSIKhr*GOioB([jQ5Od +kNM-ol0@U#m-O--mf)YVnF?&JncJFTo_nFap@n=Zq#C0hqYU0gr;HTbrdk+*s*t~> +JcC<$JcFs6o`"gfrqu]ks8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-Es$l0.9ljl>C[i8EJJgtLK7 +f@JI$da?Cdc-+8NaMu3:_SEq"]Xt_a[^EHIYck11Wi;nnUnaWVSt2C@R@';*PEM#gNJrdPLk^V: +K7SQ&I=-?eG^"=QFE2A?DJj9+CM@HpAn>L_@fDhsSGScWS=Q5BEr:"SEq+/DE9_HD6Mj(JTD"rR +TD>/VTAOh[FoRlkR.ZmAR/VU3Ie\?gI-u@XRL,IPR[]e8R[]e:rL<_Ts.01]oq2/RqOR,7l&,Cs +nr!INr2p4,Yd(L>Zi.9%[/dT1[J6-dRG4,,QhsYV;YF&f<;ono6BI=lP*2#nPa.N"QC!u+R@0M5S"-"> +St;RHTV8'RU8+N[V5:&eVl6PnWiE,#XKAV-Y-5(6Z*CU@Za@-J[^NZTrj`rY]=bei^;%Fu^qmn) +_o0O5`lH0Aai_fMbg$.4&^ShOdF-LneCE.%f@\d1g=tE^h&5),i8ESRj5]4]jlY^gkih9qlKdd& +m-X6/rpKpXnaZVL!qZ'VrUg6cp\4U\s7uZjqtp?irVc +JcC<$JcFs6o`"gfrqu]ks8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-Es$l0.9ljl>C[i8EJJgtLK7 +f@JI$da?Cdc-+8NaMu3:_SEq"]Xt_a[^EHIYck11Wi;nnUnaWVSt2C@R@';*PEM#gNJrdPLk^V: +K7SQ&I=-?eG^"=QFE2A?DJj9+CM@HpAn>L_@fB=,F&Z;:7i26N0:L;!V!A;Z9/Z7H6i<;Gm*`r)!Gjqbd&bn5JgLrCZr[mS*@Lr(I2o<`N3"<uJa%^`Jc12t +KE$W)L&Hc+L]<20M>rG5MuJ\8N<#"Vf]tV7r^qde'_Sa=2`Q#s>aN;TJ +bKS61c4SCLdF$CkeC<%"f@S[.g=k<:rnSIKhr*GOioB([jQ5OdkNM-ol0@U#m-O--mf)YVnF?&J +ncJFTo_nFap@n=Zq#C0hqYU0gr;HTbrdk+*s*t~> +JcC<$JcFs6o`"jgrVZTjs8)ckrqQNf!;?EbGP(Lto'u5R$X,(PEM#gNJrdPLk^V: +K7SQ&I=-?eG^"=QFE2A?DJj9+CM@HpAn>L_e,7Yje,Pd)QJ@c'Pjt%<6Ms.>gAT^pg&Th)S`u[E +SbnrHS,15,b5KH^aRmURaSs6R`rm@fV=CA]aTBW.bPKH_c1oT_chGf]dJhMk +dIFjK]_oD<]&C1+o(2GDo_%qPq"Xg`rqcQi!W)Wkq#C*gpA+IXb4NmIb3dCO;>F,a;uK\o"=TDXts8Kk7_Z%IO`8SW6F96T.G5c[dG^9:7s*OcnrdFfq!.Xrts+13%r.G!%re:-%lA,%e +rIt0&pk/Krr.3pZrIOp!r.G$&re:?+s+gW1re^Z4!/pi8s,@#=rf7)AOoCM,PE_;sQ'Rc'R$a;1 +R[]e:SXl@DT:hjNTq\jWMuntX/i>(Xfeh1YctC;ZEpmE['d?N\%)FJ%_B9b]Y2"m +^V@S#_SX4/rl$t=a2l?Db0.uPc-FV\d*^7he'lgre^i@(f\,!4gYCW@hVR/Ji8N\Uj5f:_k2tjj +kiq?slg*p(mI'EAmfN"Knc&(\oCV\Ro`Fj]p\agdq>U6fqu-HkrUTr=s5!^*~> +JcC<$JcFs6o`"jgrVZTjs8)ckrqQNf!;?EbG4bCso'u5R$X,(PEM#gNJrdPLk^V: +K7SQ&I=-?eG^"=QFE2A?DJj9+CM@HpAn>L_qj[GP!-.%>jDj^1r^-NKr1E_Vpn.5P!2&(jqK;OS +q3gH6p6k`Dqg\HknU9qTr0mYTs-ikTrgWtXr1*eXs.8tWr1O"\qO[/7qhsp#qht''riZ[3YHY79 +ZEggC[']D3rj;O0pmCfDhO+8.r_`JhpJ_#irDi\pr`B)$r)j&(bPfZdcHlI9s3^Y*q31c?oo\p1 +s)\ +JcC<$JcFs6o`"jgrVZTjs8)ckrqQNf!;?EbG4bCso'u5R$X,(PEM#gNJrdPLk^V: +K7SQ&I=-?eG^"=QFE2A?DJj9+CM@HpAn>L_qc*Mor`&h[r]U6Cr]S[nr'1$ArB:-Hr'C6Vp/1W^ +oMOF3n3R1Q;,R6hmSW1Ge40I8r)!Dhr_WMi!)WPioMY3Xmn<@Hqb-?Nr_<;a$!(&,5DG'>lIt+=o__&>5hb$;p\MC;>F,a;uK\o"=ThoPG^+N5GQ<$fHN8Hl;uK\k!K`HCP!,"nPa.N"Q^=),R@9S6S"-%?St;RITV8'RUSFW\ +V5C,fVl6SoWiE,#XKAV-Y-5(6Z*CU@Za@*I[^NZTrj`NM]=bei]tV7r^qmn)_o2Pn43#=^aN;TJ +bKS5VcHjkbdF-LmeC<%"f@S[.g=k<:h;-rEhr*GOioB([jQ5OdkNM-ol0@U#m-O--mf)YVnF?&J +ncJFTo_nFap@n=Zq#C0hqYU0gr;HTbrdk+*s*t~> +JcC<$JcG!7o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5R$X)&P*1ofNJraOLk^V9 +K7SQ%I=-?eG^"=QFE2A?DJj<,CM@HqAn>O`rmUhoqpPP4r0R/Df9Q?"o9K5?rBUG.s2jQKrQ,&\rQ"WOr5JZ6q5=%cqPF"b!2]Cbs2k;aq98f_"4,9=cMZ#]d.bofd/;;T]DB,! +\Hqj#p%J+Rp\=O]q>C'jqtg-fq#C*epA"CTb4s0Ib43[O;YF&e<;ono5qh"s8Be5 +_Z%IQ`8SW6FT6I`G5c[eG^4T6HN/
  • Q'IZ%Q^F/.Rf8cWS=TYN!M?%aT`Lm_ +rhKRkVZ*J8W2ZbrWiN5&Xf\b/YHY79Z*L^B['[6L[^WcV\[f;`rk&EJ^;%Fu_>_:X_o0O5`lH0A +aiaV+%F!)BcHjkbdF-LneCE.Lf-8l#g=k<:h;-rFhr*GOioB([jQ5OdkNM-ol0@U#m-O-,mf)YV +nF?&JncJFTo_nI_pAamcq#C0hqYU0gr;HTbrdk+*s*t~> +JcC<$JcG!7o`"gfrqu]ks8)ckrV1g8p@e1Po^qbGo'u5R$X)&P*1ofNJraOLk^V9 +K7SQ%I=-?eG^"=QFE2A?DJj<,CM@HqAn>O`SGSfQS,dX/EWC1VErU4MEoh<4Er89&62mMNT_P/N +T_Wd*Fm=/IFnp.VRf&T=R.csGR.,UrIKFqHIJ/'fRf/`URf/`RS-,=PSXobOoq2/Tr1EkXlAYOs +onrX)oSWXOs02O.s0D[2rj;^5rj2a7[']b=r3Z:-opGKAiL'V2qGR#cr)EYqqH!Ssr`K&#s'#G, +"O#'7cHc@7!R]?iP51=?P4k%3P5fY(FT?UaG63#7H2`-iHN8HlIK+`rJ,OosJcC?"KDpQ&L#%L] +L&?W!KD^?!J`)(WJc:8uKE$W)L&H`-LPUccM>rG5MuJ\8N<#"U6fqu-HkrUTr=s5!^*~> +JcC<$JcG!7o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5R$X)&P*1ofNJraOLk^V9 +K7SQ%I=-?eG^"=QFE2A?DJj<,CM@HqAn>O`qGdDns&8t_pceX>b!,\cr'L?Jr(m>hp/1cbo25*Wl:^bAqFgHSr_Q.h*=o;J'>Q.n#;q+eC;YF&e<;ono5qh,GQ`58G^4W5HhUM8 +Q'IZ%Q^F/.Rf8cWS=TYN!M?%aT`Lm_rhKRk +VZ*J8W2ZbrWiN5&Xf\b/YHY79Z*L^B['[6L[^WcV\[f;`rk&EJ^;%Fu_>_:X_o0O5`lH0AaiaV+% +F!)BcHjkbdF-LneCE.Lf-8l#g=k<:h;-rFhr*GOioB([jQ5OdkNM-ol0@U#m-O-,mf)YVnF?&Jn +cJFTo_nI_pAamcq#C0hqYU0gr;HTbrdk+*s*t~> +JcC<$JcG!7o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noO?jn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ8 +f@JI$da?Fec-+;PaMu3:_SO"$]Xt_a[^EHJZ*:C5X/`+rV50iZT:VUCR[BG,P`h/jO,]*UM26n? +K7\Z)IXQTiH?aXWFEDPCE,TW2CMRWtBP(geACUV-rR1Yns-WMHpm0-hq*P*I!o;Ydo@j2u!SZ<) +gA9RbSGA`MSGAZLb43[Tb5TN_aSa*N`W3%:WV`XmVt?k^Vtm4iV#e]]qTSuas3CSh!RT0jd/VMk +d-]6B]Cic"\c;C'p]($`q>^^6gp\aa[p[QE'bNd7CbPb?4;uBVn!=oV\)>Q7t% +s8'V2_uI[8_uIXWFEM_LrceBe!."Nh!dfSe]Y2&Y^F[1:_SX4/ +`Poj:a2l?Db0.uPc-FV\cd:(edaQ^qe^i@(f\+s3g=tE=h;7&gi!SH&j5]4^jlY^gkl0fOlKdd& +m-X3.rpKpXnaZVLs766_rUp3as7cKerqZTjqtp?ir;H3cJcFU,J,~> +JcC<$JcG!7o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noXEkn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ8 +f@JI$da?Fec-+;PaMu3:_SO"$]Xt_a[^EHJZ*:C5X/`+rV50iZT:VUCR[BG,P`h/jO,]*UM26n? +K7\Z)IXQTiH?aXWFEDPCE,TW2CMRWtBP(geA=T1eS,JlOF8g:VF7OAq3^fBs-Wb8nUL+YomQk/rL3eUrL<_Trgj%[pn%PZm[rKtreofos02O.s0DU0 +p9ae+qm?1,nX0-?j-]h4rDN>fr)EVpqH!Ssr`K&#s'#D+s',ZNcHji7ciMPBp6,68q3(91s,mJ+ +F`hm,GQ2mfH2W$jH[L5>IK+`rJ,FisJc:9!KDgK$L$49fL&?VuKD^?!Jb"?bJ+\?kJc:9!KE$W) +L&Hc+LB*//M$JorMi^ +JcC<$JcG!7o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noF9in*f]3m-Es$l0.9ljl>C\i8EJJgtUQ8 +f@JI$da?Fec-+;PaMu3:_SO"$]Xt_a[^EHJZ*:C5X/`+rV50iZT:VUCR[BG,P`h/jO,]*UM26n? +K7\Z)IXQTiH?aXWFEDPCE,TW2CMRWtBP(geAGK4';"557;:6N9=O;#=#g;"[Zc;#!of;#aDm +;!LC36hs%K;W:RC;?0Y\7d3GC;#jGj:B45e;#jMm;>=&V;rUIG9)D9L9`J,q='/R-o3),urEB2' +rEB5*r*8bjfMqfIp/ClgrDi\pr`B)$qcWr&r`fD-s*+Kgrd+NiqGd,fk>VP*F`hm,GQ2mfH2W$j +H[L5>IK+`rJ,FisJc:9!KDgK$L$49fL&?VuKD^?!Jb"?bJ+\?kJc:9!KE$W)L&Hc+LB*//M$Jor +Mi^ +JcC<$JcG$8oD\afrVZTjs8)ckrqQNf!;?EbH1^_!o'u8>n*f]2m-Es$l0%3kjQ#:Zi8QMQmDQLg@A6hitJ62o[@ +gtVSWr7h8,s4[P-pY5\:ka_:9p72)N!6k;_s31&Wr6#&]!6G#W!QN1V`rE%;Wr/joW:-YZW;ELl +bPo``c2Gued,EC5]C3?"\H;O#q"+:]q#0s`pA4Lap@msss3(;^!6OiTo?6f*r)EVpqH!Ssr`K&# +r`];*r*8sqq83*J!6!m7"*A[.G5ZUdG^4T6HN/?lI/\QoIf=iqJGt-"K)1,tK_L2tLA$>uK_L,s +K)C2lJF.j\JGt-!K)C9$K`?c*LB!#/M#E/8MMmCON/`gWrf7)AOoCLEPEc'3!LB)OQiWVDrgOIh +SXuFFT:hmOU8"EYUnsobrhfdqWW&muX/u<&)Qp9IYctClg4!*mI'uB!q>aMrpp*\!;-6_s7ZKerV6Bfs8)WirVZTlo)=4?hZ&*~> +JcC<$JcG$8oD\afrVZTjs8)ckrqQNf!;?EbGP(Lto'u8>n*f]2m-Es$l0%3kjQ#:Zi8;]T)bJ]TDG5LTAGP*Ms#s!Z*L\4ZhCd+ +[J@00[JmW5[I'@]RGaJ4Qh=;T<;fhn5hb(>lE"Kd/MDndaRlPq31W;nWuKD^DsL&6VuL&6PtKD^?!Jb4K[J+nKmJc:9!KE$W)L&Qi, +LB*//M$JorMi +JcC<$JcG$8oD\afrVZTjs8)ckrqQNf!;?EbGP(Lto'u8>n*f]2m-Es$l0%3kjQ#:Zi8sGq;,U:hqGQWX!)2-?s%<2^mS!ab +=BJ^/n65`mr`T;+ra#J-m8Me>oi(cfrDi\pr`B)$qcWo%r`f;*!I/ngHN&9kI/R%7Za7$G[C3NQ\%&uZ]">Se]Y2&Y^CJ&q_SX4/`5T^8a2l?Db5TQsbg"GY +cd:(edaQ[peCE.%f@\dUg'-6dh;-rFrnn.BioB([jlPXekNMp0#O:X@m-O-,mf)YVnF?&Jo)J:] +o_nI_pAamcq#:*hqYU0gr;?Nardk++s*t~> +JcC<$JcG$8o`"gfrqu]ks8)ckrV1m:p@e1Po^qbGo'u5 +K7\Z)IXQTiH?aXWFEDPCE,TW2CMRZuBP1mfeCE(LeG@YmR.?U6Q2m33QM-UC6hj"Gh#Z!=oMV( +>Pqb+>l\4*s89am_tq=OF96T.G5c^cGQ<$fHN/?lI/SKnIfFoqJGt-!K)(&oK_U8qK_9uqK)C2m +JG4QhIe\EgJGt-!K)L?%K`?c)L'!-dM#N59MMmCON/`gWrf7)AOoCLEPEc'3!LB)OQlh`bS"#q< +SXuFFTV/!PU8+KZUnsrcVl-JmWN)u!X/u<&!NrX*YQ;#7rj*?H[C*HO\$rlX\[oAa]Y(ql^;%Fu +_>_:]_o0O5`lH-@aN;TJbKS61c6^f`dF$CkeC<%!f%8O+g"P07gt^`AhV[8LiSieVj5f=`k2tjj +roj[Qlg*p(mHs?@mfN"Knc&+Zo)SF]p&Facp\jmdq>^ +JcC<$JcG$8o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5 +K7\Z)IXQTiH?aXWFEDPCE,TW2CMRZuBP1mfp72,'nT=;B!HN89ErJH$6MR5ATDP;>FmaGNFn(pi +RK&ZHR/iWKJE24ZIenKmRKAtIRf/`USGo)ZT)##ST^SN/N;JOtMYXUP[/RK1[/[N6[emK#R/E!=oMV(>Pqb+>l\41cN)>kdJhSdP4=b7P4k%_:]_o0O5`lH-@aN;TJbKS61c6^f` +dF$CkeC<%!f%8O+g"P07gt^`AhV[8LiSieVj5f=`k2tjjroj[Qlg*p(mHs?@mfN"Knc&+Zo)SF] +p&Facp\jmdq>^ +JcC<$JcG$8o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5 +K7\Z)IXQTiH?aXWFEDPCE,TW2CMRZuBP1mfr)EPnmQU>-q`aO7q*+@4r^6HIr)!;es%r8`qG@,X +j?i)uiDKDKr_r_m!)q]CoLAs[:f%$drDE8drDN\ol;I[XrD!5ag.Um.rE8SmrE08,>?kH>qcrAa +n5KBdnl5B_r)EVpq,[Jrr`K&#r`];*r*98-!FC'LH38MAI!bcjkuI:Rs)\jWMuntX/i?$XT>T. +ricF.ZMq0F['d +JcC<$JcG$8o`"gfrqu]ks8)ckrqQNf!;?EbI.[%%o()>?n*f]3m-O'&l0.q"FLhqYBp]p\+=Tp\X[`p\XXapZ0KmanX$QbPG08<;fhm5qh( +>lS+/?3"@-s8'Uk_u%@SFEMbMrceBes*=Qh!df+g"P07h#?+:hV[8LiSrkWj5f>$joOZ/roj[Q +lg*p(mHs?@mfN"Knc&+Zo)SF]p&Facp\jmdq>U6fqu6NkrUTr=s5*d+~> +JcC<$JcG$8o`"gfrqu]ks8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-O'&l0.5qh(>lS+/?3"@2d/D>ld.3@iPPp[=OTT]JG' +JcC<$JcG$8o`"gfrqu]ks8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-O'&l0.5P[M34o@\C6MaOV:]F8a;>F&c +6gmA!6iL!C;>a>i;uTYp;q=G78,Z9_;>3ub;ZK_\;ZTWhqG-u`r_2HIs%NAan4Wgar`T#"s&o5& +rE08,>?kE=qHW,\p/LlepJgufr)EVpq,[JrrE/r"r`]>+qcs/,ra#S3rHeEh!.+K@kuI=S"*A[/ +G5c^cGlN'fH3/G@I/JEmIfFopJGt-!K(XcfK^scnK)C2nJGF]]If+]lJGt-"K)C9$KE-`)L'!-d +M#N54MMmDlMueourf7)AOoCLEPEc'3$C7$GR$jA2S"#q=rgj._T`1VcU8.^`!Mu[mVZE`qri-4( +XK8P+Y-+u-YQ;#7rj*NM[C*HO\%&rY\[oAa]Y(ql^;%Fu_84"*_o2Pn"ieU(aN;U(b6?,7cHab_ +rm:nte'umtf)F8)f\,!4gYDea$Js[ui8N\Tj5]4^roO7Ekl0fOlKdd&m-X3.rpKpXnaZVLs766_ +rUp3as7cKerqZQiqtpBjr;H3cJcFU,J,~> +JcC<$JcG$8o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_np']on*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-4AQaMu3;_SO"$]Y(hd\$iZMZ*:C5XK&7tVPKu\TV%gGS!fY0Q'@GoO,f0XMM[+C +KnFu.J:;ooH?sg[G'.nJEH,o7D/=!&BkV-kA^o2Ye^`1Je+]7"Qdh?#Q23lE6MT@:h##k$h"f_" +SGAZPSE$1:SGph7cMl)ebQ,o]bkoTZb5]T`aSs6ZaRuLuWUHecbl>recMl/hd/VMldf._qde_Dn +eC4tQBml)R$jD3S"#q= +rgj[nTV8'RU8+N[V5:&eVl6Pnri-""XT#=,Y-5%5Yd(I=rj)X4[JmTQ\%&rY\[oAa]Y(qk^;%Fu +^qmn)_o0L4`Q#sta9B].bKJ,Srlt\nd*^7he,Ii#e^i@(f\-8X$JX@lh;7#Gi8ESRro4%?jo4BC +kNMp0#O:X@m-O-,mf)YVnF?&Jo)J=]o`"O`pAambq#C0hqYU0gr;HTbrdk++s*t~> +JcC<$JcG$8o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noO?jn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-4AQaMu3;_SO"$]Y(hd\$iZMZ*:C5XK&7tVPKu\TV%gGS!fY0Q'@GoO,f0XMM[+C +KnFu.J:;ooH?sg[G'.nJEH,o7D/=!&BkV-kAY/[ekB-06j)Xu`qEjtMm@X?MlZM!+r0d>Ki0j+c +k(!2UrgNeT!h>gQr1EqZj.G%aoS`@!s,$WZosF_+s0VR/!4;a5nOTT]JFa!_-s*+NhrHeKjs*X`ms*jrsr.+`srIWs[ +qh"`sp43$ipjVmaq0r9lqgeZss+:3%s+LE+reCH.!/UW2s,$f7repl;NrG(?OHKO*&!N6CQ'R`& +R$a;1R[]e:Sc52lT:hmOU8"EYUnsobVl-JlWW&muX/u<&#Hk86YctC;ZMq02['fnA)Rm5d\[f;_ +]=bei]tV7r^qde'_Sa=1`Poj;rl>8bb0.uPc2Pulcd:(edaS3F"kD2Uf@\dUg'ZTih;-rEhr*GO +ir7s=jQ6C'!U&\Gkm-M>lg4!*mI'uB!q>aMrpp*\s7H<`s7ZKer:p +JcC<$JcG$8o`"gfrqu]ks8)ckrqQNf!;?Eb!VH!_noO?jn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%da?Fec-4AQaMu3;_SO"$]Y(hd\$iZMZ*:C5XK&7tVPKu\TV%gGS!fY0Q'@GoO,f0XMM[+C +KnFu.J:;ooH?sg[G'.nJEH,o7D/=!&BkV-kAQAS+s&J5GnNHV1lTP)3qEjsRs%iPhoMPQ`pI"U? +gdD'=i_fMLr);$5rC?larDEMk!)rhonP]Eep/Cifs%`AcqbI)ar_2WNr(R,bnkB'dp0%H!qH$LZ)k>V(RoMbWdr_r\nrDiYor`B&#qcWo%r`f;*ra#M0ra,YNrH\TlH?sdZqGc]ZoMbp7F`hm+ +GQ2mfH2W'hHiJKkIK+cqJ,FiqJc12YKDU8uJbFWkJ,"KcIJJ?jJ,=cqJcC?#KE$W)L&Qi,LB*/0 +M>rG5MuJY9NK4"!!K`HCOq3b@Q'IZ$Q^F/.R[T_8S=TYN&>,VhTq\9VUnji`VPg>jW2]cr!NW=$ +XTu#4YHY79Z*OA8!OT96[MlWb\@K/]]">Vf]tM.p^VIY$_SX4/`5T^8a8X-`ai_fMbg$.4"jbQC +dF-MCe-4CRf@S[.rn7_6gtgfChV[8LiSsjs!T`AAjoOZ/roj[Qlg*p(mHs?@mfN"Knc&+ZoDeI^ +p&Facp\agdq>U6fqu-HkrUTr=s5*d+~> +JcC<$JcG'9o`"gfrquZjs8)ckrqQNf!;?EbGP(Lto'u5=n*]T0m-Es$l0%3kjQ#:Zi8#f*gY;JX +rn@G.r7gq8pRD)Njdl=>s3Uel!m]'9n]gsSp<*EWr5e]5or%kirM\kXrltJgs3L_lrmC_nqpPPp +rmU_no$m`kl+R#-q7HX;s1A$:qRcR7!*&gjrV6Bdrq?9as7QHcrV$-]oZI0Vo#gRGpr`W[!)rep +rDiYorE&u#qHkMueourf7)AOoCLNPE_>t +QBml)R$jEBRi7ffSt;RHTV8'RUSFW\V5C,fVl6SoWiE,#XT#=&Y-7i/#I1S?Za7$G[JmT8\%)FJ +)S3Pm]Y(qk^;%Fu^qmn)_o'F3`Q#s=aN2KGrlYJhc-FV\d/ME+daQ^qe^i='f@\d1g=tB;h;-rF +rnmh9ir7s=jQ6C'!U&\GklL)8rp9[P!:KjT!q>aMrpp*\s7H<`s7ZKer:p +JcC<$JcG'9o`"gfrquZjs8)ckrqQNf!;?EbH1^_!o'u5=n*]T0m-Es$l0%3kjQ#:Zi8gQrL`tYj.G"`s,Hu9oS`O&!*&m&osFS's0Vd5rNlU3[.KabRJ`H1 +QiEEQ;uBVnPqb*?2e1.?N=L3cihY?cHqdFP4=b7P5::DFEM_LG5c^cGlN'f +HN/?lI/JElIfFooJGk&rK'S'cK):,nJGXimId;FZIf=ioJGt-"K)L?%KE-`)L'NKiLl$tGMMqIm +!KE-=Nrb?)rfRVPPa.N"QC!u+R@=,E)P!@iStDXJTqS3UUSO]^VP^8hW2ZbrWiN2%riH4(YPta2 +Z*L[AZa@*IrjDj:\Gj#W]">Se]Y2"m^V@S"_8=(,_o0O5`lH-@aN;U(b6?,7cHab_rm;D-e'umt +f%/I)f\,!4gY:N>h;7&ghuVfrro4%?jo4BCkNMp0!UB"Mm/QGQmf)YVnF?&Jo)J=]o`"O`pAamb +q#C0hqYU0gr;HTbrdk++s*t~> +JcC<$JcG'9o`"gfrquZjs8)ckrqQNf!;?EbH1^_!o'u5=n*]T0m-Es$l0%3kjQ#:Zi8`rDN8bpeq,jq+'%+s%!&crDNVns&/;a!*&Vir)EShpJ:QZrD!8bpe1W\rCd#] +qG$cZ!E<4i=o_e+>lS%)>lS%#;uTbl;t3iY;u]es;uBVnPqb*?2e1.?N=L5 +HN/6mG^"=Tn5SpXp/D0:F`hkNrceBes*=Qhs*Ocnr-eQns*slqrIOitl\#%cqgnKlqg\Hkl[AYZ +rdXfqrdk*$rIb-'!/:B+#D\+kM2@+IMuJY9NK4"!!K`HCOp[D;Q'IZ$Q^F/.Rf8cpS=Q7CT:_dM +Tq\jWMuntX/i?$XT>T.ricX4ZEggC['[7?[K3kIrj`rY]=Y_g]tM.p^VIY$_SX4. +`5T^8a2c9BaiaV+"jG6:cHjl:d1asWeC<%"f%8O+g"P07gYCW@hV\=j!TE&;irS6&roO7Ekl0fI +lKeH9s6TgSrpKpXnaZVLs7?9_rq6 +JcC<$JcG'9o`"gfrqu]ks8)ckrV1j9p@e1Po^qbGo'u5IpQk`DrC$KLr'LG>rndJ, +ptPl(rS7>*!1i_OqO@8Mk+2LAs3^kn!71GcrltJgrltGdrlaoUs2b8^ql'7goVhefpSdba#L1Q> +cd0tbdJ_Mle,Ikse,.Yaec+.h^&G\<^&5PA]DoJ<]D]>6])]GA<;uXqq=saZq"a[`q#C'hp@\CX +rq-9`rq6$.pWN6PrQ5&[prW?Ss&Anrq,[Gqr`K#"r`];*qcs/,ra,M0ra>b7q#C-+iPYZ5s)n?b +rHJ9ds*=Qhs*Ocnr-eQnrdXcpqgms_qLS?jr."Tmj*giSrdXirrdk*$re(6(s+UH,s+^T1reV2D +Mi3OQNK0$[O-#KdP*2#nrfmYQQ^F/.Rf8c`S=Q7CT:_dMTq\=]U]I +JcC<$JcG'9o`"gfrqu]ks8)ckrV1j9p@e1Po^qbGo'u51MZ-TRZh_!-[0V1r*TG2s'Z5[cHje\c-OhfPOXh+ +PPgU@OoKS(G5ZXbGlN'fHN/?lI/JElIf=inJGXo]K)1&lJGaooIcGkSIf=ipJGt-"K)UE&K`?c* +LB!#/M#N5BMMmCON/`jXO,oBbOcklkPl?pOQC!u+R@=,E$CmZYStDXJTqS3UrhKRkVZ*IoW2]cr +#HOr-Xf\b/YPta,Z*OA8!joACrjDj:\Gj#\]">Se]Y2"m^V@S"_8=(,_o0O5`l?'?aN;TIbKJ,S +rlu2'd*^7he'lgre^i@(f\"m2g=tE^h#ZBirnn1CioB([jQ5OdkND(.klL)8rp0^RmdC)C!q>aM +rpp*\s7H<`s7ZKer:p +JcC<$JcG'9o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5qEt0Is%r\lq,$i`qG@/gp-S[E +nj;A(n59*]o25?^s&82Q!(QfTlULbLjAYqRs&8kqo1o9\nP9'Xr_3;an4`XPr`&Jm"'\r5>Q.n+ +>Pqb)>PD(j;ufk^<:s2i<;]bl5hb'>lS+/?Mn10@/jX8H2`'gFoll5Hgk#) +JcC<$JcG'9o`"gfrqu]ks8)ckrqQNf!;?EbGkCV!o()>?n*f]3m-O'&l0.DJj<,CMINrB@?e.rR:htm$Q%ar'^?JrBgA;q;(c"qqM%>qj[YW +lC@(/"J!rhdEqU5!RAsfcMl)bbOis9W:Qq`W!Bk.CUks7l9]rV6Ee"SVN]p@eLYrq-3_q9&6Nqo\cWqoJQSrQ>(=q,[Gqr`K#"r`];* +qcs,+ra,M0ra>b7raP^'f#%X/F`hkNrHJ9ds*=Ngs*OcnqgJKnrI=Tmq186kpjr'fr."TmhL5?O +rdXirs+13%rIb-'!/:E,s+^T1re^Z4%Z?:)NK&sZO-#KdP*2#nrfmYQQ^F/.Rf8c[S=Q7CT:l1W +!MZ@gU]IaMrpp*\s7H<`s7ZKer:p +JcC<$JcG'9o`"gfrqu]ks8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-O'&l0.DJj<,CMINrBDnD$T)P;/FQ[`C7/94K6MdDOT^n`TT\ahSG5[p( +RcBh9JFJ-eJE24[SH#,[T)G;XT&ZIANRWpbNVe\3MZAY6;uX-"[/IE2[f5hb'>lJ%.?Mn10@/j[7@f=ORd*gIrrfcl8nWWp7r/q#%s*"?bs*4Qh +r-JBis*X]ls*jorpji0kp4E'joRQjhqgRCMrI4`qr.+fus+:3%s+CB+reCH.!/UW2s,%;EN/WaU +NfT6_OcbfiPEc'3"dYLBR$jEBRg#=QSt;RIrh0@eU].%iV5F6i!NGgb0.uPbg"GYcd;[=&(8qVeCE+# +f@S[.g"P07h#?+@hV[8LiSieVj5f:_k2tjikl0fIlKeH9s6TgSrpKpXnaZVLs7?9_rq6 +JcC<$JcG'9o`"gfrqu]ks8)ckrqQNf!;?EbGkCV!o()>?n*f]3m-O'&l0.DJj<,CMINrB2ne/r`$Zsq*"XDq*Y*IqGI2fpJLibr_NPj!)`JV +r'LBMn3Z;*n59*]o25B_r_rhdkXYA)q,>sGq,@5lq,[Gqr`K#"r`];*qcs,+ra,M0ra>b7raGkOrcSBgH$au-<:Nu` +<<%+@G5ZXbGlN'eHN/?lI/A?lIf4ckJGFciK(sohJGaooIboMOIf=ipJH(3#K)L?%KE-`*LB!#/ +M#N82M@PQ'N/`gWO,oBbOcklkPl?pOQC!u+R@=,E"e;-TStD\TT`Lm_rhKRkVZ*IoW2]cr!NW=$ +XTu#4YHY79Z*OA8#ILnH[^NZS\Gj#I]">Se]Y2"m^V@S"_>_:P_o2Pn!QN1Za9p&3bKJ,Rc-FV\ +d/ME'daQ^qe^`7&f@\d0g=k<:rnS.Bhr*GOiSrnXjQ,Fbk3(pkrojIKli-8Nm/ZSRmfN"Knc&+Z +oDeI^p&Facp\agdq>U6fqu-HkrUTr=s5*d+~> +JcC<$JcG*:oD\afrVZTjs8)ckrqQNf!;?Eb!VH!_nosWnn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%e'ZOfcHOJRaN)9<_SX+']tCqe\@/fOZEUO8XfJJ#Vkp2aTqJ!JS!ob4QBdYsOcPN]N/EIJ +L4t84JUi5uI=$9cGB\1OF)l8>Df0E.CMIQsB@>8We'n5hb'>lJ%.?Me+0@/aU4@K9p7s6[_l +_Z%IQ`;au[G5ZXaGlN'fHN&9kI/A?kIf4chJFS3]JGaooIe/!WI.r'fIf=iqJH(3#K)L<'KS>-Z +L'!-dM#N53MMqIm$B:(,O-#HcP*2#nrfmYQQ^F/.Rf8c[S=Q7CT:l1W'r%J!UnsobVl-JmWN)u! +X/rG*Y-+u-YQqG=ZEpmE['fnA#Ih4Q\[f;_]DfGJ]tV4q^VIY$rk\]R`;[^V`lJ)"&';u;bKS2T +cHab^d*^7he,Ihte^j`O+5#9#g=tB;h;-rFhr*GOio9"YjQ5Lck3(sll07Kuli-5PmI'EAmfN"K +nc&+ZoDeI^p&Facp\agdq>U6fqu-HkrUTr=s5*d+~> +JcC<$JcG*:oD\afrVZTjs8)ckrqQNf!;?Eb!VH!_noO?jn*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%e'ZOfcHOJRaN)9<_SX+']tCqe\@/fOZEUO8XfJJ#Vkp2aTqJ!JS!ob4QBdYsOcPN]N/EIJ +L4t84JUi5uI=$9cGB\1OF)l8>Df0E.CMIQsB:Spks.04]c?/AnqF(0IrBg.MrLihUs.K=6kB5a, +rLPh\)?2e1-?iOO5@JjR>A'NTfP*;.0Pm*J?R$a;1rgO(]SXuFFT`1W"U8+N[V5:&eVl6So +WiE,#XKAV-Y-7i/#I1S?Za7$G[JmT>\%&rY\[oAark&KL^:q@s^qdec_?%Qmrl"oXa8X-jai_fM +bfn>WcHjh`dF$CkrmUu!f)F8Cf\,!4gY:N>h;7&Hi8ESRioB([jlPXekNM-ol0@R"rp0^RmdC)C +!q>aMrpp*\s7H<`s7ZKer:p +JcC<$JcG*:oD\afrVZTjs8)ckrqQNf!;?Eb!VH!_noaKln*f]3m-Es$l0.9ljl>C\i8EJJgtUQ9 +f@JL%e'ZOfcHOJRaN)9<_SX+']tCqe\@/fOZEUO8XfJJ#Vkp2aTqJ!JS!ob4QBdYsOcPN]N/EIJ +L4t84JUi5uI=$9cGB\1OF)l8>Df0E.CMIQsB2hl1rD`hs`'3u[rB0pEqEt3Js%r/]rD<>dnj31? +!(6NJiBuEur)3JlqaT[;n4br_iMiqGR5ir`%9?rCuiVrDWDns'#J.ra#P/r`fA,!+#G* +r);*EqbmJpq,[Gqr`K#"r`];*qcs,+ra,J/s'Yh7r*fn@F`qtSH[U>0<;9Ja<<%+@G5ZXaGlN'f +HN&9kI/A?kIf4chJFS3]JGaooIe/!WI.r'fIf=iqJH(3#K)L<'KS>-ZL'!-dM#N53MMqIm$B:(, +O-#HcP*2#nrfmYQQ^F/.Rf8c[S=Q7CT:l1W'r%J!UnsobVl-JmWN)u!X/rG*Y-+u-YQqG=ZEpmE +['fnA#Ih4Q\[f;_]DfGJ]tV4q^VIY$rk\]R`;[^V`lJ)"&';u;bKS2TcHab^d*^7he,Ihte^j`O ++5#9#g=tB;h;-rFhr*GOio9"YjQ5Lck3(sll07Kuli-5PmI'EAmfN"Knc&+ZoDeI^p&Facp\agd +q>U6fqu-HkrUTr=s5*d+~> +JcC<$JcG*:o`"gfrqu]ks8)ckrV-Hgp@eLYHh?q#o'u55hb'>lJ%/?Me+/@/aU4@fBj; +AGZ>n_sP>@_Z7XSFoQX`GQ2peH2W'gHiAEiIJnWnJ)5_QJ,FcfIHQ"RIK"]pJ,OotJcC?$KE$W) +L&Qf-LPYqd#)\=sN/WaVrf75EOcklkPl?pOQC!u+R@=,E':bVbStD[LTq\9VUnjiaVPg>jWW&mu +X/u<&#Hk86YctC;ZMq03['d=@[K3kIrji'?!5&6C#JIjc^V@S"_>_:P_o2Pn!QN1Za8sE*rlY>d +c2Puhcd;[=&(8qVeCE+#f@S[.g"P07h#?+1hV\=j!TE&;irS6&roOIKkih9qlK[^7liQSBmf)YV +nF?&Jo)J=]o`"O`pAambq#C0hqYU0gr;HTbrdk++s*t~> +JcC<$JcG*:o`"gfrqu]ks8)ckrV-Hgp@eLYHh?q#o'u51raG_6raQ1D +d*gLtf\,$?POjt:FoQX`GQ2peH2W'gHiAEiIJnWnJ)5_QJ,FcfIHQ"RIK"]pJ,OotJcC?$KE$W) +L&Qf-LPYqd#)\=sN/WaVrf75EOcklkPl?pOQC!u+R@=,E':bVbStD[LTq\9VUnjiaVPg>jWW&mu +X/u<&#Hk86YctC;ZMq03['d=@[K3kIrji'?!5&6C#JIjc^V@S"_>_:P_o2Pn!QN1Za8sE*rlY>d +c2Puhcd;[=&(8qVeCE+#f@S[.g"P07h#?+1hV\=j!TE&;irS6&roOIKkih9qlK[^7liQSBmf)YV +nF?&Jo)J=]o`"O`pAambq#C0hqYU0gr;HTbrdk++s*t~> +JcC<$JcG*:o`"gfrqu]ks8)ckrV-Hgp@eLYH1^_!o'u5j>f:[ULK +6IeH[;>jDk;tic88,>dJ;u0De;u]bk;uBVk:AIW;:Amo`9`%ce>5MP'>QA(&>l.b);sI?Z;t3i_ +;u9Vo=8c7u=oDP'>Ph\)?2n7.?iFI4@JjU6@g?OhH$apdIXUQ^q,R#crcS6arHJ9drd"Hgrd4Wl +qgJElrI<[Sqg\NmoR5nMq0i6krdXlss+13%re(6(s+UH,!JcL1M$AiqMi,^b5TQbbg$.4!RK-ld1=[SeC<%!f%8O+g"G*5gYDea +!T)`5huVfrro4%?jo4BIkNM-ol0@R"rp0^RmdC)C!q>aMrpp*\s7H<`s7ZKer:p +JcC<$JcG*:o`"gfrqu]ks8)ckrV1j9p@e1Po^qbGo'u5WT^;WWVEFd +VZ>0Ee+M5gebI_nfDjM&g&B_*g\S\]^@],0]`#J4]`#J>;Z6@ep]1'fp&OdboEb'\o^h\Ho^h\P +o_Q`#bOs$Uan*URao5?>=8c7u=oDP'>Ph\)?2e1.?iFI4@JaO6A,^!=AbuGo_sG8>_uFlZG5QRa +GlN'eHN&9jI/89iIf"WYJGOcmIeA-cI-l:XI/89kIf=iqJH(3#K)UE&KE-`*L)l&*Ll$tGMMmFP +NK0$[O-#KeP*;)oQ'IZ%R$a;1rgOCfSXuFFTV8'RU8+N[V5F6i!N +JcC<$JcG*:o`"gfrqu]ks8)ckrV1j9p@e1Po^qbGo'u5r3H@/rNcF/!1DT/rg3;Ds-N^crE&r"qcWl$r`f8)ra#M0r*TG2raG\5s'u%= +"D-*6f\-8Yo9/U,oTK5ss*" +JcC<$JcG*:o`"gfrqu]ks8)ckrV1j9p@e1Po^qbGo'u5Q7t. +?1qM'>Q.n(>P_:g<:s2`<;0>j5hb'>lJ%.?Mn10@/aU3@fKs;A--=hI/\NpIXUfe +n5]9`r) +JcC<$JcG*:o`"gfrqu]ks8)ckrqQNf!;?EbIe<7'o()>?n*f]3m-O'&l0.fNq47#Hm%+1+s3q"rr6Y,_rlt>ar6+u[r2At]q5F4jp8Ihc!7USi +s4-enrR_)%rn.;*qqLt]!5J?DotBq/rO_^7r4Vo(s7cHd!Vc5hb'>lJ%.?Me+/@/aU4@fBm:AGp*9s6[_i_?@c!F`qs+GQ2peH2N!fHiAEgIJeQj +J+A-bJ,=]gIJS?dHhMd]Hi8?hIK"]qJ,OotJcC?$K*$^[L&Qf-LPYqd!K)g7N"V,1O,oBbOcklk +Pa.N"Q^F/.Rf8csS=Q7CT:hmOU8+KZUnsrdVl6PnWiE,#XKAV-Y-7i/!O8s0Zi@B4[JmT9\%&sI +\H0:Rrk/9E!5AHI!l2Xgrk\]R`;[_4`lH-@aN;TIbKJ,Rc-FV\cd:(edaHUoeCE+#f@S[-g"P07 +gYCW@hVR/Ji8NYSj5]4]jo4BCkNMp0!p]+;rp0^RmdC)C!q>aMrpp*\!;-6_s7ZKer:p +JcC<$JcG*:o`"gfrqu]ks8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-O'&l0.\Ar,_^V!(HTLqEk6Lm@jKO +!M?%aTDNj!G49_BG5n*0S+<$IRJiTSRJ`NNRJ_TuJaS'bJ+fK2TD"rQT`ChaU\]uNO84h)NV&1u +Mtp9M[/dZ7[fNqFrj2[3pp0q)rNcF/!1DK,s-NGF!13XcrE/o!r`];*qcs,+ra,J/ra>_6r*oY8 +rabt="4u5\g]#q#P3nJ+P5f\)G5QRaGlE!dHN&9jI//3gIenQbJG=WkIeJ3dI/&'^HMMpdI/A?k +IfForJH(3#K)UB(KS>-ZL&m'creUZ5MuJYJNK0'\OHGZgP*;,qQ'Rc(R$jEBRiS#iSt;RITqS3U +USO]^VPg>jW2ZesX/i>(Xfeh1ricF.ZMq31ZiIN5[K]"@sSs1JEHrkANM_86,f!Q2kT +`AGTTa2l?Db0%oNbfn>WcHjh`dF$Cje'umte^i@(f\"m2g=tB;h;-rEhr*GOiSrnXjQ,G%joOZ/ +rojLLlg+Q:!q#FDrpKpXnaZVLs766_rUp3as7cHds7uZjqtp?ir;H6dJcFU,J,~> +JcC<$JcG*:o`"gfrqu]ks8)ckrqQNf!;?EbGP(Luo()>?n*f]3m-O'&l0.q`Xj@pHS:6krf#8p-eaE!(-KX +nPT<_r_N5SnO)e6oL&F@jAG\Mr)6Wkt_(Lq,72r +s'5P/!aJr6qHX#("'f&7>l@n,>kV+j<:Ph\)?2e1-?iFI4@JjU6A,^$; +Ac@)[I!^6gnl5-Zq,I;ks)n?br-/0crd"Efrd4Wlq0i0iqLA'dpj`0ip3ldbpj;^\q0W'fqgJHm +s*suts+13%rdt9*Kn]M\!JcL1M#iKlreqJLNfT6_OcbfiPE_>tQC!u+R@=,E*Lr[lStD[LTq\eG^B23e_>_:P_o2Pn +1rdSVaN2KGb0.uPbg"GYcd0tcdF-IleC<%!f%8O+f\,!4gY:N>h;7#Gi8ESQioB([jQ6C'!U&\G +klU/9li-5PmI'EAmfN"Knc&+Zo)SF]p&Facp\agdq>U6fqu-HjrU^#>s5*d+~> +JcC<$JcG-;o`"gfrqu]krqZWjrV6Ee!;?EbIe<7&o'u8>n*f]3m-Es$l0.9ljl>C\i8EJJh:pZ: +f@SR&e'ZRhcHOJSaN)<>_ns7)^:_(g\[T#SZa$acrm(PgrQP)\s2t5< +ri"_Ror.kfo[Nokpt#Dqrn.8(rS%2(!8R@`qS2g>qn;p?!580?pq-C8rOr&)s&&jkrqHNfp&=Rb +oCDJMoD8%XoD\C^oD?](b5fcabOisSan3XS=8c7t=oMV(>Ph\)?2e1-?iFI4@JaO5A,g*:AcHB> +s8'V(_s>2>FoQX_GQ)jdH2N!eHiAEgIJSE[J,+QdIJ\EgHg?"UHi8?hIK+crJ,OotJcC?$K+N]i +Knb>;LPUeDMMd=NN/`ksNuF+BP*2#nQ'IZ%R$a;1R[]e:SXuFFTV8'RU].%rV5C/gW2ZbrWiN6# +XTu#4YHY79Z*OA8#ILnH[^NZS\Gj&=\cBAA]E5d\^AbkP^qmk(_Sa:0rl#,^a2c9BaiV^)b5oi3 +rltPjd/MDndaS3F!S,d#f)aOWrn7D-h#?+1hV\=j!TE&;is4Z,jlY^gkNMp0#O:X@m-O-,mf)\T +nGi%Xo)J:]o_nI_pAambq#C0hqYU0gr;?Nardk+,s*t~> +JcC<$JcG-;o`"gfrqu]krqZWjrV6Ee!;?EbGkCUuo'u8>n*f]3m-Es$l0.9ljl>C\i8EJJh:pZ: +f@SR&e'ZRhcHOJSaN)<>_ns7)^:_(g\[T#SZa$aPh\)?2e1-?iFI4@JaO5A,g*: +AcH?Cg=cGYqN:]=m$%1,s)n?br-/-brd"EfrHnNkq0i*gm=4q\omQ^bqKqOSr-SBiqgJKns*sut +s+13%rdtc8KnY89LPL\BM2I1KN/WaVrf7tZOcklkPa.N"Q^F/.R[T_8S=Q7CT:hmOU8.^`$DjVt +Vl6SoWiE,$riHF.YHP17Z*CV6ZNmkF[C3NQ\%)FJs1/3Brk&dc2Puhcd;[=!RfHre,e+Nrmq2'g&B\+gYDea!T)`5huVfrro47EjlPXekND(.km-M> +lg4!*mI'uBs7$'Yrpp*\!;-6_s7ZKer:p +JcC<$JcG-;o`"gfrqu]krqZWjrV6Ee!;?EbG4bCso'u8>n*f]3m-Es$l0.9ljl>C\i8EJJh:pZ: +f@SR&e'ZRhcHOJSaN)<>_ns7)^:_(g\[T#SZa$am">9>?_#1r`oJ-s'#8'rEK>.o2GTegf"2SrE/o!r`];*qcs,+ra,J/ra>_6 +qdTP7s()";LPUeDMMd=NN/`ksNuF+BP*2#nQ'IZ%R$a;1R[]e:SXuFF +TV8'RU].%rV5C/gW2ZbrWiN6#XTu#4YHY79Z*OA8#ILnH[^NZS\Gj&=\cBAA]E5d\^AbkP^qmk( +_Sa:0rl#,^a2c9BaiV^)b5oi3rltPjd/MDndaS3F!S,d#f)aOWrn7D-h#?+1hV\=j!TE&;is4Z, +jlY^gkNMp0#O:X@m-O-,mf)\TnGi%Xo)J:]o_nI_pAambq#C0hqYU0gr;?Nardk+,s*t~> +JcC<$JcG-;o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5C\i8EJJgtUQ9 +f@SR&e'ZOgcHOJSaN)<>_ns4(^:_(g\@8oRZa$adM7/B7Pio/ko +i:Z"'hWUR,SaE$?Sc71=eGn"rdK%\md/MAicMPidbkTB]XSJpsWW9*nWp?YWVuWaheGe"qf)F;# +f_sJ'gAK_&h"\VS^\PVB^&PhE^&>V6]DfJ;;$-Lcp&=O_o)A1Znc84Snc8:ZoE=d/bKA!$bQ#f\ +bP00SanWsW=Sc2">5hb'>lJ%.?Me+/@/aU3@fBm:AG]s;B)cNAs7aD(_s5)=FoHR^GQ)jdH2Dpe +Hi8?dIHQ(OIJeKhHfTMNHiAEjIK+crJ,OotJH1<$KE$T)L&Qf-LPYqd!K)g7N!YK(O,oBbP*2#n +rfn(]Q^F/.R[]e:SXuFFTV8'RU].%mV5C/gW2]cr!NW=$XT>T.ricX4ZEggC['[7?[KTR]E,^[rkJKK!5\ZOs2+iTrl#,^a2c9BaiV^)b5oi3rltPjd/ME.daQ[peCE.$f@S[.g"P07 +gYCW@hVR/hhuVfrro4%?jo4BDkNM./klL)8rp9[P!:KjTs7$'Yrpp*\!;-6_s7ZKer:p +JcC<$JcG-;o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5C\i8EJJgtUQ9 +f@SR&e'ZOgcHOJSaN)<>_ns4(^:_(g\@8oRZa$ao61#$rgWGHqj[>Ks+9*Ym!o(cpn%AToq;;X!2B1^iK!DeqMb0,pJD1'[^EKL +Za-n8Yl_/7YkbR'ZMh-0RGF8"QiC1a=oMV(>Ph\)?2e1-?iFI4@JaO5A,^$9Ac? +JcC<$JcG-;o`"gfrqu]ks8)ckrV1d7p@e1Po^qbGo'u5C\i8EJJgtUQ9 +f@SR&e'ZOgcHOJSaN)<>_ns4(^:_(g\@8oRZa$adpeLWZrCm&^qbHWTpJD&u?!LT1 +raG\5raYqjWW&muX/u<&!NrX*YQqG=ZEpmE['fnA!k5\Lrj`*A]=\'T!PQ5H^]2(L_>_=O_Z7XS`fbbNc2+X8]-gWV3:aeGn(tec=>$f_aA$g&Tn& +h#H4)^?WK0^AGV@]^rc0;$?L]nac5Kn,i.LnG_tTo)A7XoDm,.bPBB[bOs$Nao'6W=oMV(>P_V( +?2e1-?iOO5@JaO5A,^$9Ac?<@BDuTBs7aD(_s>2>FoQX^GQ)jdH2DpdHi8?aII_jXIJ\EhHes)J +HiAEjIK+crJ,OotJH1<$K+rumKnb>;LPUeDMMd=NN/`jYO-#M'OtDl^Q'IZ%R$a;1S"#q=St;RI +TqS3UUnji`VPg>jWN)u!X/rG*Y-+t4Yd(I=rj)X4[JmW7[fEr;\c95@]DfJC]`>eG^B23e_>_:Q +_o0Lm`<"!!rlG,]!6Y;a!R/gfc4&%Gd*^7hdaQ^qe^`7Mf)aOWrn7D-h#?+7hV[5Ki8NYSro4%? +jo4BIkNM-ol0@R"rp9[P!:KjTs7$'Yrpp*\!;-6_s7ZKer:p +JcC<$JcG0?n*f]3m-O''l0.5XS,/TNRfJuVS+iBFK&hLMJGl)2TD>/[U&Uk[UYLn%NV\V/Mt^'K[/RB8ZE^[= +Yd+,1qm$()rNcQmR@3!#m[*fRr`];*qHX#*ra,J/s'Yh7qdTP7rabn;rau.Brb);brS%".rK@,C +pltT +JcC<$JcG0?n*f]3m-O''l0.g7r^-NMqaCBMpHnRNo2>TcoMY]Xm7-k@rCHiVr(-BKr_iPhqGR,fpf./is&/hkqG7)e +pJ:NYoM,3Xo1esV!aJr6rEB,'qc`u'q-3o*oMbQbk>V@Zr)i)K`!s*"9`rcnEfqg/3frI"6cnp^.XqgA9fhKo0Jrd=Wls*jutrIFp! +!.t3&'SM0oL5(J=Ll$tGMMmFPNK0'\OHKO*/X)EaQ'Rc(R$jD4S"-%@StD[LTq\ +JcC<$JcG0Df0E.c-H:6o:,]Ko:,61raG_6raYqjWN)u!XK8P+Y-7i/#I1S?Za7$G[JmT9\%&sI\H9@S]DfGE]tV5[^B23e +_>_:V_o0L4`Q#p!9O4B!U&\Gl2U#Kli-8Nm/ZSRn,MkWnbr%Yo)SF]p&Facp\agdq>U6fqu-HjrUTr=s53j,~> +JcC<$JcG0Df0E.R@4#Bj`LKEfQ@']rC-HKqa:1Q!2B=`p7hG.rHS!Z +m<85JnTOo's./eO!1`\Nq3pu-!.sThrdsutmst8,s.9%YqOmk^rM'"\fT,T`qi(H2pe^re!OB!* +YQ1m)YlD!*ZMh,eR-^1==oMV(>P_V(?2e1-?iFI4@JjU6A,^$8Ac?<@BDcECg&9XtOnk11PPUIB +FoHR^GQ)jcH2DpdHi/9HIJ\EhHh2RRH1uXaHiAEjIK+`rJ,Om!JV&LQK0FsBKnb>;LkpnEMMmFP +NK&sZO-#KeP*;,qQ'Rc(R$jD4S"-%@StD[LTq\ +JcC<$JcG0Df0E.r`'#!;cETXg-,?tp-8I=qE=dHrC-HKqa9OC!)NJY +!(6_6r*oY8rabk:rau.Br+Q"TiD]GL +s)njWN)u!XK8P+Y-7i/#I1S?Za7$G +[JmT9\%&sI\H9@S]DfGE]tV5[^B23e_>_:V_o0L4`Q#p!9O4B!U&\Gl2U#Kli-8Nm/ZSRn,MkWnbr%Yo)SF] +p&Facp\agdq>U6fqu-HjrUTr=s53j,~> +JcC<$JcG0+P`h2kO,f0W +MM[+CKnP)1J:E#rI!U*`GB\1OF)l8>Df0H/bfn>Wcd2EVnsoECpR:HSs4RP-f[p,Rr71_prmLenq9]/fs3CYhs312c=3htFeH^\tn6^&G\;:]OAkmf;eSn,2\Tnc&+YoDA1Abl5f\ +b4NgUaSoBA>Ph\)?2e1-?iFI4@JaO5A,^$9Ac?<@BDQn`XG5HL_Gl;paHMi-f +I,o_PI/A9`HK]YMHN&9kI/JEmIfFosJ-(:RK)UB'KSBD[!JcL1M(X[DN/WaVO,oBbP*2#nQ'IZ% +R$a;1S"#q=St;RITqS3UUnjiaVPg>jWN)u!XT#=&Y-7i/!O8s0ZNmkF[C3NQ\%)FJs1/3Brk/9E +!5AHIs1eWNrke]Q!6"lUs2G&Zrl>/_b0'_,!R/gfcMu2jd/MDndaS3F#M%DVf@S[-g&B\+gYDea +#N"@qi8ESQir7sCjQ5Lck3(pkrojLLlg+Q:!q#FDrpTmV!:g$Y!qZ'VrUp3as7cHds7uZjqtp?i +r;H3cJcFX-J,~> +JcC<$JcG0+P`h2kO,f0W +MM[+CKnP)1J:E#rI!U*`GB\1OF)l8>Df0H/r0[PR\odsBrC6`SpI+pHqP!n_pn@MXom$(Pm<85J +olg>+s./tUrLTXqLS0erLa%[pn.DUs.T@bpS6)qoSrj/ohYZdYPta+YPtd*YPbX( +Z2M!-Zi@>cR.?UDQMt(d>Ph\)?2e1-?iFI4@JaO5A,^$9Ac?<@BDQtQC!u+R@9V7S=Q7CT:hmOU8+N[V5C,fVl6SpWiN6#XT>T.ricF.ZMq08['d)[!m/U-rlY>dc2Q#gcN)>kd/h\ErmV2' +f%/I)f\"mVg&]s`rnRh9hr!AMiSieqis4Z,jlY^gkNMp0!p]+;rp0^RmdC)Cs6p$YrUL$]o^r+T +s7ZKer:p +JcC<$JcG0+P`h2kO,f0W +MM[+CKnP)1J:E#rI!U*`GB\1OF)l8>Df0H/<)cjt<)h4-q`amArBC*As%!#WrC-HKr'LN^:J^4O +p-\C=qEs^jr)1raG\5raYqh!-S9aqfi$arH\6cr-S?hjF-lPqg8!^k]uuMrd4Zmr-eTos*t#u!eGrTrdt6)L&Qf-LPYqd +/rGRGN/`jYO-#KeP*;,qQ'Rc(R$jD4S"-%@StD[LTq\U6fqu-HjrUTr=s53j,~> +JcC<$JcG3=oD\^erqu]ks8)ckrV-Hgp@eLYHh?q#o'u5=n*f]2m-Es$l0.9ljlGI]iS`VLh:pZ: +f[n^(e'cXicHXPUaiMNA`59C,^V.:l\[])V['R$AYH=n+WMl_kUnaWVSt;IAR@'>+P`q8lO,f0X +MM[.DL4k22J:N)sI!^0bG^"=QFE;GAE,KQ1bKS2TcMjdM7/]LQj7qX3 +i<&#tiVVO5htE]*T(\`IT(ni_gY1?6f\"g-f%0`Ks3q%trmLbms3U_lrm1_mcHb1HqQ0LnpT"&> +!nPuTrn.5'rn@A+rS7>,#N"@qi8ESQir6^g^?*--^?iQ*;#g"^melPRnG_tXo)J:^o_&.Ss3:Md +!6slSrQG#Zp_6qdTP7rabn;rau.BqIokBrbDE3kJI26oYLTNrHA'^ +rcnBeq0MscqL%[Yq0`'dom6FZnTaqVq0N'frd=Zms*artrI?_UJqAW-KS5&6L51P?M2@+JN/WaV +NfT6_OcklkPa.N"Q^F20S"#q=St;RITqS3UUnjiarhfpuWN)u!XT#=+Y-5(6Z*CV6ZN7G@rjDm; +\@DOK!kQ"Urk&/_b0'_,#L(H;cHab^d/MDtdaQ[peCE+# +rmq2'g&B_*gAp%.h#ZBirnn%?io9"YjQ,G%joX`0kl0fJlKdd8liQSBmf)\Tn,W"WncJFTo_nI_ +pAambq#C0hqYU0gr;?Nardk+,s*t~> +JcC<$JcG3=oD\^erqu]ks8)ckrV-Hgp@eLYG4bCso'u5=n*f]2m-Es$l0.9ljlGI]iS`VLh:pZ: +f[n^(e'cXicHXPUaiMNA`59C,^V.:l\[])V['R$AYH=n+WMl_kUnaWVSt;IAR@'>+P`q8lO,f0X +MM[.DL4k22J:N)sI!^0bG^"=QFE;GAE,KQ1r0dP,]QF-CrC6`SpI+sIs.]@`rhB1]r1X18np'_L +n94GJpicV-s./\Mp7(uKd=Lk=rLa(\qOd_Zr1Wt]qkO+crf>EdoSrK>!O&a+Y5ka(YPtd(Z2_-/ +Zi.3'QiNK5R.lsHQ2k+f>Ph\)?2e1-?iFI4@JaO5A,^$9Ac?<@BDQ<@C&VlGg@UO&P4=b6OoTY' +G5HL_Gl;p`HMi-dI-l@XI/A9`HMMjVGl)d^HN/?kI/SKnIK4lrJ2Dh/JqJ]/KS>/8LPL\BM2I4M +N/`jXO,oBbP*2#nQ'IZ%R$jD4S"-%@StD[LTq\TR]E5d\^AbkK^qmkd_?.Wn`;[^W`lH.!a9'K+b5TQhbg"DXcHjh`rm:u!e'lgr +e^`7Mf)aOWrn@D,!8RS0!T)`5i!86#ioB([jQ6C'!pAe2rojLLlg+Q:!q#FDrpTmV!:g$Y!qZ'V +rUp3as7cHds7uZjqtp?ir;H3cJcFX-J,~> +JcC<$JcG3=oD\^erqu]ks8)ckrV-Hgp@eLYHh?q#o'u5=n*f]2m-Es$l0.9ljlGI]iS`VLh:pZ: +f[n^(e'cXicHXPUaiMNA`59C,^V.:l\[])V['R$AYH=n+WMl_kUnaWVSt;IAR@'>+P`q8lO,f0X +MM[.DL4k22J:N)sI!^0bG^"=QFE;GAE,KQ1;cH^rX8g;uTbi;u9Jc:@1jR:@1dQ:@q?_>Q.h*>P_P'>Pqb+ +?2e(0?!d2&nPndPrDWc#r`f8)ra#M0qd9>1raG\5raYqG5HL_Gl;p`HMi-dI-l@XI/A9`HMMjVGl)d^HN/?kI/SKnIK4lrJ2Dh/JqJ]/KS>/8LPL\B +M2I4MN/`jXO,oBbP*2#nQ'IZ%R$jD4S"-%@StD[LTq\TR]E5d\^AbkK^qmkd_?.Wn`;[^W`lH.!a9'K+b5TQhbg"DXcHjh`rm:u! +e'lgre^`7Mf)aOWrn@D,!8RS0!T)`5i!86#ioB([jQ6C'!pAe2rojLLlg+Q:!q#FDrpTmV!:g$Y +!qZ'VrUp3as7cHds7uZjqtp?ir;H3cJcFX-J,~> +JcC<$JcG3=oD\afrVZTjs8)ckrqQNfs7ZKcs7CU.o()>?n*f]3m-O''l07Bnk2kX`io&bOh;-i> +g"4j+eC2jncd'eYbK7iF`PfX0^q[Rq]=GG[[C!9FYck11Wi;qpV50l[TUqaFS!fY1Q'IPrOcPN^ +N/EIJLPCJ7Jq8H%I=6HgH$FOVF`_\FEH#i6D9L,Hbh\fFS,>eT7f>dN7/]LOj7hO5j8J!;iV_X& +TBr0HSaE$HSc@IJgY1B6f`'M%f)F5"eGn"tde(reciDDFXno-hX8UWLeH4=RfDXD$g&Tn)h#?+8 +hV[5Ki8NYSir7s_6qdTP7rabn;rau+Aqe5qBrbDFJrr;,trPA0Ds)n;M#N5VMMmFPNK0'\OHG]hPE_>tQC!u+R@9V7 +S=Q7CTV8'RUSO]^VZ*J2W2ZesX/rG*Y-+t4Yd(L>Za7$H[C3NQ\%)FJs1/3Brk/9E!5AHIs1eWN +rke]Qs2=oU!li:$rl>/_b0'_,#L(H;cHab^d/MDodaQ\Ee,e+Nrmq5(g"HAY!ScE/h#cHjhu;O7 +iSsjs!p&J)roOIKkih9qlK[^7m/QJQmf)YVnF?&Jo)J=]o_nI_pAambq#C0hqYU0gr;?Nardk+, +s*t~> +JcC<$JcG3=oD\afrVZTjs8)ckrqQNfs7ZKcs7CI*o()>?n*f]3m-O''l07Bnk2kX`io&bOh;-i> +g"4j+eC2jncd'eYbK7iF`PfX0^q[Rq]=GG[[C!9FYck11Wi;qpV50l[TUqaFS!fY1Q'IPrOcPN^ +N/EIJLPCJ7Jq8H%I=6HgH$FOVF`_\FEH#i6D>fn"Fh`%r8,YpU7JK:L6iEbWU&1S[U&UheU&9-, +Gg^g6G5e*0Sa`0FS,Sl&Jb4KkTDtM\TDYA]U%Y2\U\pqdV=ou3Nqe\5NqSJ';#[ZqXoP[(YlD!. +ZMq01ZMq31ZLsU`QfFJ.QN17e>lJ%.?Me+/@/aU3@fBm:AG]s;B)QB>B`2ZECAr#Jg@UO%P4Xt7 +P5f\(G5?F^Gl;p_HM`'OI/83_HMVpNGl;pbHN&9kI/SKnIfFosJ.$p[JqJ]/KnY89LPYqd,`7M= +N/`jYO-#KeP*;,qQ'Rc(R$jD4S"-%@StMdNU8+N[V5F6i)5sO7WiN5'Xfeh1YctCeG^]2(L_>_=O_uI[S`<+'"a8X-]ai_d*b6Q89c-FV\cd;[=!n,QHrmUu! +f)F8&f\+sWg&]s`rnRY4hr"Fk!TE&;ir\<'jo4BIkNM-ol0@R"rp9[Ps6fmT!q>aMrpp*\s7H9_ +s7ZKer:p +JcC<$JcG3=oD\afrVZTjs8)ckrqQNfs7ZKcs7CU.o()>?n*f]3m-O''l07Bnk2kX`io&bOh;-i> +g"4j+eC2jncd'eYbK7iF`PfX0^q[Rq]=GG[[C!9FYck11Wi;qpV50l[TUqaFS!fY1Q'IPrOcPN^ +N/EIJLPCJ7Jq8H%I=6HgH$FOVF`_\FEH#i6D,XA4<5h#s55[SA8,YpU7JK:L6h=+H:sMH'6MEk= +;<_!E7f5dM8GbpL7f,^S;Z9Pl;X.3\;Z0P]:Adod:B"&Z:A.E[:@_6\>5MP(>5_\)>l7n+?L^tg +<9R9Z;ug/">lJ%.?Me+/@/aU3@fBm:AG]s;B)QB>B`2ZECAr#KH2r<\;tNu_;uTbrFoHR\GQ)jc +H2)^_Hff_PHhD^]H0BMOH2DpeHiJKlIK+crJ,Xs+JV&K+K7nr4L5(J>reVnXMijQ5M&jp1)5kiq?slKeH9s6]jSrpKpXnaZVLs7?9_rUp3as7cHds7uZj +qtp?ir;H3cJcFX-J,~> +JcC<$JcG3=o`"gfrquZjs8)ckrqQNf!;?EbHh?q$o()>?n*f]3m-O''l0.jk%9?^@o81;#BYYmKE"Jnac;Mo`"O^oDm/2cMYrXbl#Z\b5BBWaSfBC?2e1- +?iFI4@JaO5A,^$9Ac66?BDQ<@C&MfDC]=@r_Yh7D_>n`XG5?F]Gl;p^HMMpVI//-]HM`!aGjoqS +Gl;pbHN/?lI/SKnIK4lsJH(0#K)UB'KSBD[22@!EM2I4MN/`gWO,oBbP*;,qQ'Rc(R$jD4S"-%@ +StD[LTq\U6fqu-HjrUTr=s53j,~> +JcC<$JcG3=o`"gfrquZjs8)ckrqQNf!;?EbHh?q$o()>?n*f]3m-O''l0.[:YO7\J0NrY43O8b18NU]j@Y5b[. +Yd(I=ZMq30Z2h60ZLjO\QfOP2Qi11g?2e1-?iFI4@JaO5A,^$9Ac66?BDQ<@C&MfDC]<&[OnY%2 +PPUFBFoHR\GPudbH1uX\Hgc@XHh;X]H2;dTGPcX`H2DpfHiJKlIK+`rJ,XuuJH1<$K)pXZre<:c +Ll$tGMijWN)u!XKAV-YPta,Z*OA8 +!OT96[K]"@sSs1JEHrP&EL_86,f!lMsprl+oW!6>)[s2b8`rlb>c!6tMgs3C\lrmCbo +!7Uqs#M%DVf@S[-g&B\1gYCT?h;7#Grnmk:io9st!T`AAk5XTEkl0iHl2^/Lm/QGQmf)\TnGi%X +o)J=]o_nI_pAambq#C0hqYU0gr;?Nardk+,s*t~> +JcC<$JcG3=o`"gfrquZjs8)ckrqQNf!;?EbG4bCto()>?n*f]3m-O''l0.1 +raG\5raYqB_r_rl?rc\-^rHS9dpNlX^msOqXoQpC[qKVLR +qfr'bqg/9hs*Xcns*artrdb$"!.t3&!JH1+L,FaBM2@+JN/WaUNfT6_OckomQ'IZ%R$a;1S"#q= +St;RITqS3UUnjiaVl-JmWiE,$Xf\b0ricF.ZMq02['fnA!k5\Lrj`'@]DfJC]`>eF^B23e_>_:Q +_o0Lm`W*pXa8X0[aT0K_bQ#cdc2Q#gcN)>kdJqVpe,Ii%e^i='f@\a/rn7V3gt^`AhVR/hhu_ls +ir7s=jQ6C's5sCGrosIJ!:0XNs6TgSrpTmVs7-*Zs7?9_rUp3as7cHds7uZjqtp?ir;H3cJcFX- +J,~> +JcC<$JcG6>oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_no=3hn*f]3m-O'&l0.Z[C!9FYck11WiE"qV50l[TV%gGS!o_3QBd\tOcYW` +N/NRMLPCM9K7\W(IXQTjH?jaZG'%hIEcH&:rQsuordtim]?H?s4I>(rn7A,r7q>. +s5!n9i8ESQro3k9roF+@d_GUlpV$)ns6TgQr9XXTn*ol1s'be6raYq;LPUeDMMmFPNK0'\OHG]hPE_>tQC!u,R[]e: +SXuFFTV8'RUSO]^VPg>jWN)u!XKAV-YPta1Z*L^B['[7?[K3kIrj`*A]=\'T!kl=^rkJKK!5\ZO +s24lTrl"rYa2e2#s2b8`rlb>c!6tMgs3C\lrmCbo!7Uqs!nGlQrmq2'g&B_*gAp%.h$;fohr*GO +iSsjss5X1AroO:Fkii$1!p]+;rp0^RmdC)Cs7$'Yrpp*\s7H9_s7ZKerV6BfrqcNhrVZTlo)=4? +huA3~> +JcC<$JcG6>oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_noF9in*f]3m-O'&l0.Z[C!9FYck11WiE"qV50l[TV%gGS!o_3QBd\tOcYW` +N/NRMLPCM9K7\W(IXQTjH?jaZG'%hIEcH&:R/WHEFmF/GFmjGGFoP#/8,c!V7JB4M6h[8QU]7(b +U$-aLGQ4<3T)5)QSG/NQR`^3UJH)8>T_P5YUA^kdV#."gVZ3RTO8P%7O8G%7O8Ft9NU]jFY5PL& +Xotr4Yd(J3ZhUj*RJ*$CQfFJ5QiC=i?2e1-?iFI5@JaO5A,^$8Ac?<@BDQ<@C&MfCC]A5Mg&R_=O_uI[S`<+'"a8X0[aT0K_bQ#cdc2Q#gcN)>kdJqVp +e,Ihue^i=Nf)aOWrn@D,!8RS0#N"@qi8ESQir8! +JcC<$JcG6>oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_noaKln*f]3m-O'&l0.Z[C!9FYck11WiE"qV50l[TV%gGS!o_3QBd\tOcYW` +N/NRMLPCM9K7\W(IXQTjH?jaZG'%hIEcH&:<)cdphEC^!mlgA.s%)uVr^QiTpI,$K"Aqul:J^sd +p.tT_fgGmnWCLs'#,#s'5P/q-O&"bu=XIra#M0 +qd9>1s'be6raYqmo/dTpeq2mFo?L[GPudbH1cLGHh;X]H2;dM +GPudbH2N!gHiJKlIK+`rJ,XuuJH1<$K/nU=L5(J=Ll$tGMi_=O +_uI[S`<+'"a8X0[aT0K_bQ#cdc2Q#gcN)>kdJqVpe,Ihue^i=Nf)aOWrn@D,!8RS0#N"@qi8ESQ +ir8! +JcC<$JcG6>oD\^erqu]ks8)ckrV-Hgp@eLYG4bCso'u8>n*f]3m-O$%l0.Cn=06D!(m/\qFCNSrC-HK!(658qr62! +j.6V:i8EMLh;$c>g"HAW#1qGWe^W'rqpG5f!7CYFriZ:'ordqjpoaLro;qrFrnID,s5!_3rnm_5 +s5B`;`ECADZDC]J>Os4>-fFoHR[GPl^aH1Q@MHh2R\H2DjIGPudcH2N!f +HiJKmIK+`rJ,XuuJI-p\K7no3L5(J>reWgrMiU6fqu-HjrUTr=s53j,~> +JcC<$JcG6>oD\^erqu]ks8)ckrV-Hgp@eLYG4bCso'u8>n*f]3m-O$%l0.B`;`ECADZDC]J>O +g@UO%P4Fh8P5f\(G56@[Gl;pZHL?.OHM`!bGiX)IGlE!dHN&9kI/\QoIK4lsJH(0,JqJ]/KS>/8 +LPYqd5)P8WN/`jYO-#KePE_>tQC!u+R@9V7SXuFFTV8'RUSO]^VPg>jWN)u!XKAV-YHY79Z*L^B +['deG^]2+L_>_:Q_o0Lm`W*pXa8O'\ai_d*b6#o4c2Q#gcN)>kdJqVp +e,Ihue^i=Nf*Bs]g"P07gYDeas5!b5rnmk:io9st#NY".k2tjikl0iHl2^/KliQSBmf)\Tn,W"W +o)J=]o`"O_pAamcq#:*gqYU0gr;?Nardk+,s*t~> +JcC<$JcG6>oD\^erqu]ks8)ckrV-Hgp@eLYG4bCso'u8>n*f]3m-O$%l0.Ls$#!sq*"dMr^clUr^QiTpI#!Kr_`Ph!`;cj +pJ:fcj?rN*p-JUC!(6BFr_i>bpJUfc!)hoJkst>7pJUleqGd&bfM;9=nP8OLs',A(s',G,!+#M/ +rE]G0qc(sAs'>V1qd9>1raG_6raYqreWgrMiU6f +qu-HjrUTr=s53j,~> +JcC<$JcG6>o`"gfrVZTjs8)ckrqQNfs7ZKcs7?Hco()>?rpO^lm-O''l07Epk2k[aio/hQhVHu@ +g=Y$.e^W$pd*L"]bK@oI`l5m5_8!au]Xt_a[^NQLZ*:F6XK/A"Vl$8bU7n3NSXZ+:R$X)&PEM#g +NfB!TM26qAKnG#/J:E#rI!U*aGB\4PFE;GAao9H]SGA`UT(\`>SG/NHSGl+Z8GbpU7f>dN6ioa8 +ipYq,iqoA;T'DsFT)YAKT)[gMi&!;?#nemI'H4o()DDqt'm]rq-0^pWrc_r6=iW +r6,&]qT8]Ws'GS0ra>_6qdTP7rabn;rau.BqIokBrG).DrG;FL!cJ& +qfq"BrcnEfr-JBis*Xfos*artrd[IhJqAW-KS>,7L51SAM2I4MN/`jYO-#KeP*;,qQ'[l*R@9V7 +S=Q7DTV8'RUSO]^VPg>jWN)u!XKAV-YHY79ZEggC['fnA!OoT<\c95@]DfGE]tV5[^B23e_>_=O +_Z7XR`<+'"a8X0[aT0K^b6#o4c2Puicd:&aMrUL$]o^r+Ts7ZHdrV6BfrqcNhrVZTlo)=4? +huA3~> +JcC<$JcG6>o`"gfrVZTjs8)ckrqQNfs7ZKcs7?Hco()>?rpO[km-O''l07Epk2k[aio/hQhVHu@ +g=Y$.e^W$pd*L"]bK@oI`l5m5_8!au]Xt_a[^NQLZ*:F6XK/A"Vl$8bU7n3NSXZ+:R$X)&PEM#g +NfB!TM26qAKnG#/J:E#rI!U*aGB\4PFE;GArKuekhfSR7r^m)[qa^TSrC-KL!^iZTo:l5Z!2BId +ics@)piue3#G@]]TV%jJT(nlUSG/NPSEGIcK)1&qJGl2@UA^kdV#."fVYR.fVuWgHO8"b4O8k71 +;#X>lXTkr3YHY79Z1YF$Zh^$cR.?U.R/^Li?iFI4@JaO5A,^$9Ac?<@BDQ<@C&MfBC]/)JD$+\0 +g62,kpQG97!0mDFrK7/'rHA!\r-8-bf6[=>qfq"BrcnEfr-JBis*Xfos*artrd[IhJqAW-KS>,7 +L51SAM2I4MN/`jYO-#KeP*;,qQ'[l*R@9V7S=Q7DTV8'RUSO]^VPg>jWN)u!XKAV-YHY79ZEggC +['fnA!OoT<\c95@]DfGE]tV5[^B23e_>_=O_Z7XR`<+'"a8X0[aT0K^b6#o4c2Puicd:&aM +rUL$]o^r+Ts7ZHdrV6BfrqcNhrVZTlo)=4?huA3~> +JcC<$JcG6>o`"gfrVZTjs8)ckrqQNfs7ZKcs7?Hco()>?rpO[km-O''l07Epk2k[aio/hQhVHu@ +g=Y$.e^W$pd*L"]bK@oI`l5m5_8!au]Xt_a[^NQLZ*:F6XK/A"Vl$8bU7n3NSXZ+:R$X)&PEM#g +NfB!TM26qAKnG#/J:E#rI!U*aGB\4PFE;GArD`GQoKM.qp-/IIr^coVrC6`Spd>0N:f.-gs%rVj +s%rJdr^,U3r'Kd:nj<1NpJL]`!`MupqGZQHiCE]5peq#gq,Ho`e5#s/pJf[As'GS0ra>_6qdTP7rabn;rau.BqIokBrG).DrG;FL!cE=0mo/dTpJV'7rHA!\r-8-b +f6[=>qfq"BrcnEfr-JBis*Xfos*artrd[IhJqAW-KS>,7L51SAM2I4MN/`jYO-#KeP*;,qQ'[l* +R@9V7S=Q7DTV8'RUSO]^VPg>jWN)u!XKAV-YHY79ZEggC['fnA!OoT<\c95@]DfGE]tV5[^B23e +_>_=O_Z7XR`<+'"a8X0[aT0K^b6#o4c2Puicd:&aMrUL$]o^r+Ts7ZHdrV6BfrqcNhrVZTl +o)=4?huA3~> +JcC<$JcG6>o`"gfrquZjs8)ckrqQNf!;?EbH1^_"o()>?n*f]3m-O''l07Eok2k[aio/hQh;-l? +g=Y$.e^W$pd*L"]bK@oI`l5m5_8*h!]Xt_a[^NQLZEUO7XfJJ$Vl$8cU7n6OSXc1;R$X)'PEM&h +O,]*VM2@"BKnP)1J:N)sI=$9cG^"=RFE;JBaiV^'SG\rPT)5)ASH#)RSGA]U9)_E]8GbpU7fGjN +7/c-5irG_7T(elHT)G5ST)>,Z62omBiW%d=hVHuBg=lPZs4IA'"kM5ReC2nCdf$BLY3N4eYjnpp +Y5>@!XT.,UhZ)L4i;_d8iW/$;jSn9?k5XWEkQ'lHlMp1u^\bbE^\PV6;#X;tm-X60nF?)@oD/%S +p%6Q1cM5ZWbl#Z_b4s'YaS]EE@/aU3@fBm:AG]s;B)ZH>B`;`ECADZDD#J5KD?0_(_YqC?_>n`W +G5-:ZGl)dBHMVpbGk-(NG4p.ZGlE!eHN/?lI/\QoIK4lsJ-LRVJqJ]/L&QfgLPUeDMMmFPNK0'\ +OHG]iPa.N"Q^F/.S"#q=St;RITqS6WUnsrdVl6SpWiN5'Xfek3Yd(L>Za7$HrjDj:\Gj#>]"@sS +s1JEHrkJKK!5\WN!lMsprl+oW!6>&Z!m/U-rlb>c!6tJf!mf6?rm:eqe'n +JcC<$JcG6>o`"gfrquZjs8)ckrqQNf!;?EbG4bCto()>?n*f]3m-O''l07Eok2k[aio/hQh;-l? +g=Y$.e^W$pd*L"]bK@oI`l5m5_8*h!]Xt_a[^NQLZEUO7XfJJ$Vl$8cU7n6OSXc1;R$X)'PEM&h +O,]*VM2@"BKnP)1J:N)sI=$9cG^"=RFE;JBrg_6qdTP7rabn;rau.BqIokBrG).DrG;FL +r,)PhP4Xn2P4Fh8OoTY'G5-:ZGl)dBHMVpbGk-(NG4p.ZGlE!eHN/?lI/\QoIK4lsJ-LRVJqJ]/ +L&QfgLPUeDMMmFPNK0'\OHG]iPa.N"Q^F/.S"#q=St;RITqS6WUnsrdVl6SpWiN5'Xfek3Yd(L> +Za7$HrjDj:\Gj#>]"@sSs1JEHrkJKK!5\WN!lMsprl+oW!6>&Z!m/U-rlb>c!6tJf!mf6?rm:eq +e'n +JcC<$JcG6>o`"gfrquZjs8)ckrqQNf!;?EbG4bCto()>?n*f]3m-O''l07Eok2k[aio/hQh;-l? +g=Y$.e^W$pd*L"]bK@oI`l5m5_8*h!]Xt_a[^NQLZEUO7XfJJ$Vl$8cU7n6OSXc1;R$X)'PEM&h +O,]*VM2@"BKnP)1J:N)sI=$9cG^"=RFE;JBr`&VTlosr&r'(-DpceLPh\(?2n7->le8=oMjIAr*TG2raG\5raYq[K3kIrj`'@ +]DfJC]`>eG^]2(L_>V4P_o0Lm`W*pXa8O'\ai_d*bQ#cdc2Gohcd:&^ +JcC<$JcG6>o`"gfrqu]krqcZjrqQNf!;?EbGkCV!o()>?n*f]3m-O''l07Bnk2kX`io&bPh;-i> +g=Y$.eC;pod*L"]bK@oI`l5m5_8*h!]Xt_a\$iZMZEUO8XfJJ$Vl$;dU7n6OSt):=R$X,(P`h/j +O,f0WMM[.DL4k22JUi6!I=-?eH$=IUFEDSEaiX=JoUc#PoUPTDr1*eVoUYtRr^m,\qFCNSrC-KL +qr7/+rL`2CpRguInt#eHr8RkF%hu)C8iSrkWj8A!!^[]&0;#=)nmdKZ8o(2VJqXjj\pWr]]r6=iW +r6+u[qT8_Ds'Yh7qdTP7rabn;rau.BqIokBrG).DrG;FLq/664n\Y.?mD8jGrH@s[qfr!`id1HH +qfqaWmWSALrcnEfrHeKjs*Xfos*artrdY$#K)UB`KS>/8LPUeDMMmFPNK0'\OHG]hPE_>tQ^F/. +R[]e:St;RITqS3UUnjlcVl6SpWiN5'Xfek3Yd(M5ZO=.J[^NZS\@K/]]"@sS!kl=^rkANM_86,f +s2+iTrl+oWs2Y,[s2b8`rQ>8dc-?75s3L_lrm:eqe'n!9O4Bs5sCGrosIJ!:0UM!q#FDrpTmVs7-*Zs7?9_rUp3as7cHdrqZTjqYU6hrVc9c +JcFX-J,~> +JcC<$JcG6>o`"gfrqu]krqcZjrqQNf!;?EbGkCV!o()>?n*f]3m-O''l07Bnk2kX`io&bPh;-i> +g=Y$.eC;pod*L"]bK@oI`l5m5_8*h!]Xt_a\$iZMZEUO8XfJJ$Vl$;dU7n6OSt):=R$X,(P`h/j +O,f0WMM[.DL4k22JUi6!I=-?eH$=IUFEDSER$dYkqKDUUoQ9MDoQL4+r^m,\qFCNSrC-KLqkm$RcZs'Yh7qdTP7rabn;rau.BqIokBrG).DrG;FLq/65d!0[#;pQG97 +!0mDFrK7/'rH@s[qfr!`id1HHqfqaWmWSALrcnEfrHeKjs*Xfos*artrdY$#K)UB`KS>/8LPUeD +MMmFPNK0'\OHG]hPE_>tQ^F/.R[]e:St;RITqS3UUnjlcVl6SpWiN5'Xfek3Yd(M5ZO=.J[^NZS +\@K/]]"@sS!kl=^rkANM_86,fs2+iTrl+oWs2Y,[s2b8`rQ>8dc-?75s3L_lrm:eqe'n!9O4Bs5sCGrosIJ!:0UM!q#FDrpTmVs7-*Zs7?9_ +rUp3as7cHdrqZTjqYU6hrVc9cJcFX-J,~> +JcC<$JcG6>o`"gfrqu]krqcZjrqQNf!;?EbGkCV!o()>?n*f]3m-O''l07Bnk2kX`io&bPh;-i> +g=Y$.eC;pod*L"]bK@oI`l5m5_8*h!]Xt_a\$iZMZEUO8XfJJ$Vl$;dU7n6OSt):=R$X,(P`h/j +O,f0WMM[.DL4k22JUi6!I=-?eH$=IUFEDSE<)iWUjZ`2tr''a;r_!/]s%)uVr^QiTpdG*Wr_W;c +s%r_k!Dl&Z62O">6g[5<61@8?6N9@.;TM?'8,c!P;u]hs;u0Ja;o)6#;#=,d>l@q.>k_P(?M@FL +;uU/(@/aU3@fBm:AG]s;B)ZH>B`;`ECADZDD#J5HDZ>"N;t;Ll$tGMi +StD[LTq\_=O_Z7XS +`W*sXa8X0[aT0K^b6#o4c2Q#gci;Akd/qbFe,IkseH"2"fDjJ'g&B_*gAp%.h>c=3hu;R6i;hm: +j8\0?jo4EBk5a`Fl2U#Kli$/OmI'EAn,MnWnc&+ZoDeI]p&Facp\agcq>^ +JcC<$JcG9?oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l0. +g"=p-eC;pod*Bq\bK@oI`l5m5_8*h!]Xt_a\$iZMZEUO8XfJJ$Vl-AeUS4?QSt):=R$a2)P`h2k +O,f0XMM[.EL4t84JUi9"I=-BfH$FOVF`_^(anhP*Sb\lRSar_6r*oY8rabn;rau.BqIokBrG)1Er+u=KpMU"L!<;Z-pVZF9!-S3_pNQO[q0D4N +q0Dj^oQU"PrH7jXqKMp`s*=Qhs*OcnrdFfq!.Xuu!J,k%K/nU=L5(J>M2@+JN/WaVO,oBbP*2&p +Q'Rc(R$jG5S=Q7CT:qsQUSO]^VPgAlWiE,$Xf\b0YctCSe]Y2"mrkJKK +!5\ZOs24lTrl"rYa2e2#s2k;`rlb>cs3:Pgs3C\lrQt\pe'n +JcC<$JcG9?oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l0. +g"=p-eC;pod*Bq\bK@oI`l5m5_8*h!]Xt_a\$iZMZEUO8XfJJ$Vl-AeUS4?QSt):=R$a2)P`h2k +O,f0XMM[.EL4t84JUi9"I=-BfH$FOVF`_^(R/1t"G5$.MFR4/HG5Ou38cD9X8,c!V7JT@IU&:Yb +U&(MSGjp"YGkH@FGl9r+U\gb`TE(V[T)"rWSA0XTJG,i;V?!OiW;[Wo +ZMV!.Z2h0*RIlm@Qg0t;@/aU4@fBm:AG]s;B)ZH>B`;`ECAM`DD#J5FDZ=VUg62)jpQG*2rK7/' +r-%gYr-8$_l$E/NqfqaWp3-CWpNHCWrcnHgrHeKjs*Xfos*artrdY$#K)UB_KS>/8LPUeDMMmFP +NK0'\OHG]hPa.N"Q^F/.S"#q=St;RJTq\as31Mfrm(Pi!7:\l!n,QHrmV#"f%0iPs4@>) +rn@D,!8RS0s5!b5ro!h8!93t;!p&J)roO:Fkii$1!p]+;rp9[Ps6fmTs6p$YrUU![s7H9_s7ZKe +r:phuA3~> +JcC<$JcG9?oD\^erqu]ks8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l0. +g"=p-eC;pod*Bq\bK@oI`l5m5_8*h!]Xt_a\$iZMZEUO8XfJJ$Vl-AeUS4?QSt):=R$a2)P`h2k +O,f0XMM[.EL4t84JUi9"I=-BfH$FOVF`_^(<;Jc754Lf655IMA9)_E]8GbpV7f>dO7/9[Q;>sDd +62X(>6g-l,6iB=.;Y3H07J0+M;u9Ji;uK\`;o2<#;#4#h?2.[u?2n7,<7=eF@/aU4@fBm:AG]s; +B)ZH>B`;`ECAM`DD#J5FDZ=VTH1"W%;YX/jFo6FWGPl^]H0KYNH2DjYGP64YFn^(UGQ)jeH2W'h +HiJKmIK+`rJ,Xs!JV*lR3J<*@L51SAM2I4MN/`jYO-#KeP*D5sQC!u+R@B\9SXuFFTqS3UUnjia +Vl6SpWiN5'Xfek3Yd(M5ZOjLO[^NZT\@K/]]=Y_g]tM/Z^]2(L_>_=O_uI[S`<+'"a8X0[aoBN_ +bQ#fdc2Q#gcN)>jd/qbFe,Ihue^i=NfDjJ'g&B_*gAp%.h>c=3hu;R6i;hm9ir\<'jo4BDkNM./ +klU/9li-8NmJlVRn,MkWnbr%YoDeI]p&Facp\agdq>U6equ-HkrUKl +JcC<$JcG9?o`"gfrVZTjs8)ckrV-Hgp@eLYGP(Lto'u8>n*f]3m-O'&l0. +g"=p-eC;pod*Bq\bK@oI`l5m5_8*h!]Xt_b\$iZMZEUR9XfSP%W2HJfUS4BRSt2@?R@'>+P`q8m +O,o9ZMi*@HL5(A6Jq8H%I=6KhH?j^YG'%iJanqV&Sc55WSa2gDS+)sJ9DhE]8cM?X8,c!V7J]CR +hr*GliVhd9j87j8j7f2@T&H=/T)YA[62TaBj8\-C%i;V^8ir.s7k5OQDkl9oHlhp,Km/Y$$_>(h&^\#84;#4&h;ZH7go(2JJo_nI_o`"I[ +chPccchu&gc1&sRbPTH]ao5`G@fBm;AG]s;B)ZH>B`;`ECAM`ED#A/EDZ"DRE<#RIpVZgDrknQK +!-S3_p36@XpNc@VpNcX\olp4TnoaePqfi$as*=Qhs*Ocnrd>0'It*!!JUrE*K7nsXL,=[AM2@+J +N/WaWO-#KeP*;,qQ'[l*R@9V8SXuFFTV8*TUnjiaVl-JmWiN5'Xfek3Yd(M5ZN[_D[^NZTrj`'@ +]DfGE]tV5[^B23e_>_:Q_o0Lm`W*pXa8O*ZaT0K^b6#o4c2Q#gci;AkdJqVpe,@bte^i=NfDjJ' +g&B_*gAp%-h#cHjhu;O8iSrkrir\<'jo4EBk5a`Fl2U&Kli-5PmI'EAn,MnWnbr"[oCV\Rp&=[b +p\agdq>U6equ-HkrUTr=s5*d+~> +JcC<$JcG9?o`"gfrVZTjs8)ckrV-Hgp@eLYGP(Lto'u8>n*f]3m-O'&l0. +g"=p-eC;pod*Bq\bK@oI`l5m5_8*h!]Xt_b\$iZMZEUR9XfSP%W2HJfUS4BRSt2@?R@'>+P`q8m +O,o9ZMi*@HL5(A6Jq8H%I=6KhH?j^YG'%hnR/;$uG5$.KFQmrJ9DhE]8cM?X8,c!V7J]FHU&Uka +U&Le]GkZLYHKoeCGlN!d5ldb[U]@1fUA^ecT_Y5UT"KUSJG5o:Vu!@fWW&mtOSFn/NnKKc;#4&h +;Z!a!ZMq01ZMq05ZEpmCZMq-,RI-C@Qfjb8@JaO5A,g*:Ac?<@BDQ<@C&MfCC]/)ID>.rGDZXn3 +P4at3P51=@Pl-aEOoTY&G4p.VGkZLTHM;^^GkH:VG4KePG5HL_GlN'fHN/?lI/\O%IXcitJ:W9' +K7ei2re<7bLl$tGMijWN*##Xf\b0YctC< +rj)d8[C3NQ\Gj#>]"@sS!kl=^rkANM_86,f!lMsprl+oW!6>&Zs2b8`rQ>8dc-?75s3L_lrmCbo +!7Unr!nGlQrn%2&!87A*s4[P/rS7P3hr"Fk!o`.uro4(@jlQL(s5sCGrosIJs6K[N!q#FDrpTmV +s7-'Y!qZ'VrUp0`s7cHds7uZjqYU6hrVc +JcC<$JcG9?o`"gfrVZTjs8)ckrV-Hgp@eLYGP(Lto'u8>n*f]3m-O'&l0. +g"=p-eC;pod*Bq\bK@oI`l5m5_8*h!]Xt_b\$iZMZEUR9XfSP%W2HJfUS4BRSt2@?R@'>+P`q8m +O,o9ZMi*@HL5(A6Jq8H%I=6KhH?j^YG'%h*<;Si155@A556":R9)_E^8GYjU7f>dP6i^*Z;"dcW +62a+M6hWqG6g-l26iTLO62a^_<)`!Ys&8qdo1%h1njN1?qbm;i!*&8_!)LL-oMGB]s&/Srp0I]) +r)EGi!*%ZNraG\5raYt=qdob=rb)(@rb;=GqJ6%Gr,)1Gr,2UTHLFf);YF#hFo6FVGPZRYH1Q@V +H2DjZGPQFQFo$:YGQ)jeH2W'hHiJKmI1(LRIt3'#JV&N,KSBD[1l$mDM2I4MN/`mZOHG]hPE_>t +Q^F/.R[]h)rn@D,!8RP/!oDhl +rnmk:io9st!p&J)roX7D!9jFHs6BXMrp0^RmdC)Cs7$'YrUL$]o^r+Trq?Bdr:p +JcC<$JcG9?o`"gfrquZjs8)ckrqQNfs7ZKcs7CI*o()>?nF,i6mHj3)l07Epk2k[aj5JqShVHuA +g=b-1f$r3tdEp1abfe/MaMu3;_SO%&]tCtf\[T#TZa-j?Y-"e*Wi2hmUnaZXT:VUDS!fY1QBdYs +OcYWaN/WXNLkg_=K7e`*IsufnH[9s^GBS,Nao%\#SH,2XS`H=8SbnrW9`Ic`9)_E^8GYjU7f>dQ +6ic-AhuMa/iW/$3T)bJ1TD"lS63$!?jT"9?iWA)si;VU6hYu@2h#H./gAfh(Yhu__Yl(]pY5PI& +XT%8YjT"?>k5FKCkQL/8lKdd5m/HDP_Xt\>^u`?(^@b>";>a;lo)A7Zo_nF_o`"Leo^h\FoCDn, +m`tgVo?@!Q!6Y5]qdTP7rabn;rau.Bqe5tCrG)1ErG;CKphotIr,D8EpVZsHqnr3G!-S3_p36=W +jE^THolp7Ului5Lqfi'brd"Hg!dfrecMu2jd/DAldK%bpe,n1Of)F;$fDsV'g&g$ah#?+2hV[5i +i;_a9ir8! +JcC<$JcG9?o`"gfrquZjs8)ckrqQNfs7ZKcs7CI*o()>?nF,i6mHj3)l07Epk2k[aj5JqShVHuA +g=b-1f$r3tdEp1abfe/MaMu3;_SO%&]tCtf\[T#TZa-j?Y-"e*Wi2hmUnaZXT:VUDS!fY1QBdYs +OcYWaN/WXNLkg_=K7e`*IsufnH[9s^GBS+rR/D*uG4]qLFRjSQG5HF^9`Ic`9)_E^8GYjU7f>dQ +7.$ZLU3LqVH16.?H1cF[62[SXV#R1iUALY\T`:Y]T(moUJc;MCVYm@eW;3CqWiN1^OS=h&NoH,m +;#=,f;Z*d$ZEpn9Zim_@ZEpk7Z2U0:R/:@lA,^$9Ac?<@BDZBAC&MfCC]/)ID>8#GDu=PSP4Xn2 +P5UUAPl-aDOoTY&G4p.UGiX/HGkH:WG3jALG5HL`GlE!eH3/G@I/\OeIXcitJ:W9'K7ei2L5(J> +M2@+JN/WaVO,oBbP*2&pQ'Rc(R@9V7S=Q7DTV8'RUSO``Vl-JmWiE,%Xfek3Yd(L?Za@*I[^NZT +rj`'@]DfGD]tXK\s1eWNrke]Q!6"lUs2P)ZrlG,]s2t>as31Mfrm(Pi!7:\ls3^nrrR:o!f%0iP +s4@>)rRq>-gt_nb!oDhlro!h8!94" +JcC<$JcG9?o`"gfrquZjs8)ckrqQNfs7ZKcs7CI*o()>?nF,i6mHj3)l07Epk2k[aj5JqShVHuA +g=b-1f$r3tdEp1abfe/MaMu3;_SO%&]tCtf\[T#TZa-j?Y-"e*Wi2hmUnaZXT:VUDS!fY1QBdYs +OcYWaN/WXNLkg_=K7e`*IsufnH[9s^GBS+.<;\oA55[Y155d_C56"=V9DhE]8cM?X8,c!V7JfLP +;>a>f>lS+0 +?MRk-?=3\2c;XULraYq;Ll$tGMijWN)u!Xf\b0YctC]"@sS!PQ5H^]2(L_>_=O_Z7XS +`W*sXa8X0[aoBN_bQ#fdc2Q#gcN)>jdJqVpe,@bte^i=NfDjJ'g&9V+gYCT`h#cHjhu;R6i;hm: +j8\0?jo+U6fqu-HjrUTr=s5*d+~> +JcC<$JcG<@oD\^erqu]krqcZjrqQNf!;?Ebs7?Hco()>?rpO^lmHj0(l07Epk2k[aj5JqShVHuA +g=b-1f$r3tdEp1abfe/MaMu3;_SO%&^:_(h\[T#TZa6p@YH=n,Wi2hmUnj`YTUqaFS!o_3QBd\t +P)t`bNJrdPM2-h>KS+l-J:DuqI!U*aGB\5PanqV%S_BV+SH>dR7/l*> +i;_d4ipr`@T')aDT^n`PT)YG[62BR?jSe-Z40g\J)4Z2:d'YOSdqXoCcjjQ5M% +k54??kl'fGlN$;ImHVO`_!Ac0^@kD";>a>l;ucIgo_nI^oDnR`o`"C^naPbfrQY)\qTJcYs2k7L +raYq;Ll$tGMi)rRq>-gt_nbs5!b5ro!h8s5O%< +!p&J)roX7D!9jCG!p]+;rp9[P!:KgSs6p$YrUU![s7H9_s7ZHdrV6BfrqcNhrVZTlo)=4?hZ&*~> +JcC<$JcG<@oD\^erqu]krqcZjrqQNf!;?Ebs7?Hco()>?rpO^lmHj0(l07Epk2k[aj5JqShVHuA +g=b-1f$r3tdEp1abfe/MaMu3;_SO%&^:_(h\[T#TZa6p@YH=n,Wi2hmUnj`YTUqaFS!o_3QBd\t +P)t`bNJrdPM2-h>KS+l-J:DuqI!U*aGB\4tR/;%"G4B_LFRsYJFole[9`@]_9)hK^8GYjU7f>dR +7.HuLU@3BuHK0;GGl'f#V>d7gU&gs^qkM2@+JN/WaVO,oEdP*;,qQ'[l*R@9V8SXuFFTV8*TUnjibVl6SpWiN5'Xfen4Z*OA8 +&%&aQ[^WcW\[oAa]Y(qk^AbkK^qmkd_?.Wn`;[^W`lH-ua9'K+b5KKbbg"E2c2u>=d/D>ndaQ\E +eGn)!f)F;$fDsV'g&g$ah#?.0h>lI4i;_d9ir7s>jQ5M&k5XTEkl'`IlKdd8m/QGQmeuVSn,W"W +o)J=]o_nI_pAXgbq#:*gqYU0gr;?Nardk++s*t~> +JcC<$JcG<@oD\^erqu]krqcZjrqQNf!;?Ebs7?Hco()>?rpO^lmHj0(l07Epk2k[aj5JqShVHuA +g=b-1f$r3tdEp1abfe/MaMu3;_SO%&^:_(h\[T#TZa6p@YH=n,Wi2hmUnj`YTUqaFS!o_3QBd\t +P)t`bNJrdPM2-h>KS+l-J:DuqI!U*aGB\41<;SiC557A@55[Y?54q,A5"nZL9DhE^8cD9W8,c!V +7JoRO;>roQ62X(L6iKFB6fgZ362":I;uT\p;sm-:7I`eC7K5dT<;KPm<:*WD:A7KK:A.N\ +;>a>l;uBnm?2n43?W>6JraPk:rabn;rau.Bqe5tCrbD7ErG;FLpMTnIqJcIS!.+*4qbll]!-S0^ +olp1UlZr;Nolp7Up3$:TpiZOYqfi$as*=Qh!dftQ^F/.R[]h.8ZMq0@['d?N\%&uZ]"5Md]Y2"m +rkANM_86,f!lMsprl"rYa2e/"!m/U-rQ>8dc-?44!mf6?rQt\pe'n)!o)Mc +rn[V2!8me6s5F";ro4(@jlQL(s5sCGrTOCKlg+Q:s6TgSrU9dU!:g$Ys7?9_rUp3arqHBdrqZQi +qtp?ir;H3cJcFU,J,~> +JcC<$JcG<@oD\^erqu]ks8)ckrV6Ee!;?EbGP(Luo()>?n*f]3m-O''l07Epk2k[aio/hQhVHuA +g=b*0f$r0sdEp1abfe/MaMu3;_SX+'^:_(h\[T#TZa6p@YH=q-Wi;nnV50l[TV%gHS!ob4Q^*i" +P*(fdNJrdQM26n@KnG#/J:N)sI!^0bG^"ARSbS`PS`cLCSb/HDSc;Fa9`@]_9)hK^8GbpU7f>dS +7/YpCi8=IjrSd_7q4@Y[pn.PWl_!pEo:PuQq*FW4qVqP6ro!e5"5_k3sYj/LkYj\doY5^oh +k5"3>kl0iFli$2LmJZAQmD6X;_!&T7_!8]1^@tJ$;>a>j;uZFfp%n:boCDG@n*]W-c2c2icMl)a +bkoTZb5PoMAG]s;B)ZH?B`;`FCAM`ED#J5FDYnALE;+AG_X58:_Z+cUG4^"PGk?:TGkH:WG56:P +FSg4ZG5HL`GlN'fH3/G@I/\NuIXcitJ:W=OK2.)RL5(J>M2@+JN/WaVO-#KeP*;,qQC!u+R[]e: +SXuIHTqS3VUnsrdVl6VqX/rG*Y-5(6Z*L^B['d?N\%&uZ]"5Md]Y2%n^V@S"_>_=O_Z7XS`W*sX +a8X0[aT0K^bQ#cdc2Grfci;AkdJqYpe,Iksec45"fDjJ'g&9V+gYCT`h>c=3hu2I7iSrkrj8\0? +jo4EBkPscFl2U#Kli$/OmI'E@mfN"Knbr%YoDeI]p&Facp\agcq>U6fqu-HjrUTr=s5*d+~> +JcC<$JcG<@oD\^erqu]ks8)ckrV6Ee!;?EbG4bCto()>?n*f]3m-O''l07Epk2k[aio/hQhVHuA +g=b*0f$r0sdEp1abfe/MaMu3;_SX+'^:_(h\[T#TZa6p@YH=q-Wi;nnV50l[TV%gHS!ob4Q^*i" +P*(fdNJrdQM26n@KnG#/J:N)sI!^0bG^"A!pN?@VmWJAJo6'YJs%WMer_*/]s%32\qa^TSrC-ZQ +pS%>Uq0D(Jja$]Iq*FYLrhK+[!MQ1XKBRpWJb4QoJcA.;Vtm:_WVNRiOSb*uNpi&';#=,f;Z0Po +ZNRS?Za@+rf[;(qf_UUp3?4Tp3?7SqKD[Wo5skPrHA'^s*4QhrH\NlI!kpA#(D&OJ:N3&re!t!Knb>; +Ll$tGMi)!o)Mcrn[V2!8mb5!o`.uro=%>!9O4Bs6'FGrosIJ!:0UM!q#FDrU0gWnaZSKs7?9_rUp3a +s7cHdrqZQiqtp?ir;H3cJcFU,J,~> +JcC<$JcG<@oD\^erqu]ks8)ckrV6Ee!;?EbG4bCto()>?n*f]3m-O''l07Epk2k[aio/hQhVHuA +g=b*0f$r0sdEp1abfe/MaMu3;_SX+'^:_(h\[T#TZa6p@YH=q-Wi;nnV50l[TV%gHS!ob4Q^*i" +P*(fdNJrdQM26n@KnG#/J:N)sI!^0bG^"@3pH@q.oKN=@pcn^@o0<7Ls%NDbr(?u\r^coVrC6`S +rC$N[qb[/es&/h`rB^KMhEps(mm?h9oMk9XlUKu)nO3=Es$ZW\s&A;_qb?9LqG$u`peC?TpJC`a +r)3Jls'5V0p0IZ("'o5=?2R[h;ZKeY;uU;+AG]s;B)ZH?B`;`FCAM`ED#J5FDYnALE;+AB;u]b^ +;u_";G4^"PGk?:TGkH:WG56:PFSg4ZG5HL`GlN'fH3/G@I/\NuIXcitJ:W=OK2.)RL5(J>M2@+J +N/WaVO-#KeP*;,qQC!u+R[]e:SXuIHTqS3VUnsrdVl6VqX/rG*Y-5(6Z*L^B['d?N\%&uZ]"5Md +]Y2%n^V@S"_>_=O_Z7XS`W*sXa8X0[aT0K^bQ#cdc2Grfci;AkdJqYpe,Iksec45"fDjJ'g&9V+ +gYCT`h>c=3hu2I7iSrkrj8\0?jo4EBkPscFl2U#Kli$/OmI'E@mfN"Knbr%YoDeI]p&Facp\agc +q>U6fqu-HjrUTr=s5*d+~> +JcC<$JcG<@o`"gfrVZTjs8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l07Eok2k[aio/hQhVHuA +g=b*0e^W'rdEp1abfe/MaMu3;_SX+'^:_+i\[])U['R$AYHG".Wi;noV50l[Tq@pIS"#h5Q^3o$ +P*1ofNfB!UM2@"BKnP)1JUi6!I=-BfH$II0SbJWSS`ZI?Sb\fHSc):_9`@]`9)_E]8GbpU7f>dT +7/5[>i;)@1T)bP\TC\ZETCJTITDtMY60mP2ir%d8huM[5Yj\dgYkG@"YjS^n7/l?Gk5a`Fl2U&K +lhg&Klhg#Kli+`s_"tnE_YM%E_!f&7^A1V&;>a>g;ucLip&4LkoCV\Ho'u2f] +bP]N^AG]s;B)ZH?B`;`FCAM`ED#J5GDYnALE:IrHErcs3:Pgs3L_lrQt\pe'n9Fs4%,#rR_)%!87>)!o)Mcrn[V2s53h6!o`.uro=%>s5j7Bs5sCG +rosIJs6K[Ns6]jSrpTmVs7-'Ys766_r:U*`s7cHdrqZQiqtp?ir;H3cJcFU,J,~> +JcC<$JcG<@o`"gfrVZTjs8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l07Eok2k[aio/hQhVHuA +g=b*0e^W'rdEp1abfe/MaMu3;_SX+'^:_+i\[])U['R$AYHG".Wi;noV50l[Tq@pIS"#h5Q^3o$ +P*1ofNfB!UM2@"BKnP)1JUi6!I=-BfH$G_JFT?UNFo6@RFn0_S:&dod9DqK^8cD9X8,YpU7K,^C +UA]B!HLlC^GjBYSGkjYtV>d:fU\LSWK]n'HK)J+:Vu!@_WW0!rWW/+WORnP!Npi&);#=,f;Yj>f +ZN.8#GDu4MDEW'qUOo1C?PP17=PQ$^F +Fo-@QGN=#?GPcR[FmX;KFo?L]GQ2pfH2W$jH[L5?I0"eHrd[[nJqJ]/KnY89LPUeDMN!LRNfT6_ +OckomQ'IZ&R$jD4S=Q7CT:qsQUSO]_Vl-JmWiN5'Xfek3Yd(L?Za@-K[^WcW\[oDb]Y(qlrkANM +_86,f!lMsprl"rYa2e2#s2k;`rlb>cs3:Pgs3L_lrQt\pe'n9Fs4%,#rR_)%!87>)!o)Mcrn[V2 +s53h6!o`.uro=%>s5j7Bs5sCGrosIJs6K[Ns6]jSrpTmVs7-'Ys766_r:U*`s7cHdrqZQiqtp?i +r;H3cJcFU,J,~> +JcC<$JcG<@o`"gfrVZTjs8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l07Eok2k[aio/hQhVHuA +g=b*0e^W'rdEp1abfe/MaMu3;_SX+'^:_+i\[])U['R$AYHG".Wi;noV50l[Tq@pIS"#h5Q^3o$ +P*1ofNfB!UM2@"BKnP)1JUi6!I=-BfH$E<[4nCkh5Q+=V9`@]`9)_E]8GbpU7f>dT7/9^[;#=,h +;Z/o^6e=Zu6h`:%1pS:%h9U:&Ic^;#=,f;Yj>j +?2n1+>l\4-?2@OL;uU>)Ac?<@BDZBAC&VlDC]/)JD>8#GDu4MDEW'q8;ZLt;G4KkM2@+KN/`jYO-#KePE_>tQC+&-R[]h< +St;RJTq\as31Mfrm(Pis3U_l!n,QHrRCkt!7q,#s4@>)rRq>-gt_nbs5*e5rnmk:io9sts5a4A +roX7D!9jFHs6BXMrp9[Ps6fmTs7$'YrUU![!;-3^s7ZKer:p9erqcNhrVZTlo)=4?hZ&*~> +JcC<$JcG<@o`"gfrVZTjs8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l07Eok2k[aio/hQhVHuA +g=b*0f$r3tdEp1abfe/NaMu3;_ns4(^:_+i\[])V['R'BYcb+0Wi;qpVPKu]TqJ!KS=>t7R$O#% +PEM&hO,]*VMM[.DL4t84JUi9"I=6HgH?dR0Sb\fSSa)a>Sc5/LSc;I`:&doe9DhE]8cM?X8,c!V +7K,^JhuDU7iVqa8iUic4T(&BBT_P/S63$!EjS@j9j8e6:j8e6h=I_=PMD_>:t9^\bbA;#F2f;Ya8ko`"O`o`"Feo'l,:mdBK/rp'R1 +im.MIr64lX!QnsNAc?<@BDZBAC&VlDC]/)JD>8#HDu4MDEV=GPF7$m@_Z+cTG4BeAGk-(UG5?@H +FT$@\G5QRaGlN'fH3/G@I/\NpIXh?I7Y-/DK7nr5L51SAM2I4MN/`jYO-,TgPE_>uQ^F/.S"#q= +StD[LTqeEZV5C/hWN)u!XKAY/YctC)[ +s2k;`rlb>cs3:Mf!mf6?rR(Yns3ptss4./#rn%2&s4RD*s4dS/rn[V2!8mb5!o`.uro=%>s5j7B +s5sCGrTOCKlg+N9!q#FDrU0gWnaZSKs7?9_rUp3arqH?cs7uZjqYU6hr;H3cJcFU,J,~> +JcC<$JcG<@o`"gfrVZTjs8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l07Eok2k[aio/hQhVHuA +g=b*0f$r3tdEp1abfe/NaMu3;_ns4(^:_+i\[])V['R'BYcb+0Wi;qpVPKu]TqJ!KS=>t7R$O#% +PEM&hO,]*VMM[.DL4t84JUi9"I=6HgH?bkMFo?LMFoQR\Fo?L_Fn'YT:Amoe9`Ic`9)_E^8GYjU +7f>dT7.-fFH0]eEH2i-gH16(R63!e\VY?neV#7(hV"peXK[,5JK)J+:Vu3LfWW&grWW&jmWW&%V +OR/&!Npr,+;#F2f;Ya8iZO!qEZa$d>Z*:J1Y62#4Y*n[Ep6Y-5!+c"=rau.Bqe5tCrbD:FrG;FL +php"Jqf)(Fp2^.Rr0$uApQYT>rf[;(qKDCQl?MlDqf_gYl?)uIrHA*_s*4QhrH\NlI!kpA!IfOt +J4>*AK7ei2L5(J>M2@+JN/WaVO,oEdP*;,qQC!u+R@B\9SXuIHTqS6WUnsrdW2ZesX/rG+YHY79 +ZEpmE[C3NQ\@K/]]DfGD]tXK\!PlPN_Z.LR`;[aU`W4'YaT'B^b5TTabl>rdc2u>=d/DAldf7eq +eGn)!f)F;$f`0Y(gAfq-h#?.0h>lI3hu_lsir8! +JcC<$JcG<@o`"gfrVZTjs8)ckrV-Hgp@eLY!VH!_no4-gn*f]3m-O''l07Eok2k[aio/hQhVHuA +g=b*0f$r3tdEp1abfe/NaMu3;_ns4(^:_+i\[])V['R'BYcb+0Wi;qpVPKu]TqJ!KS=>t7R$O#% +PEM&hO,]*VMM[.DL4t84JUi9"I=6HgH?`H^4nLqh5Q=LW:&doe9DhE]8cM?X8,c!V7K,^H;>a;l +6-hms6h!G;62XaZ<;fbd<4k^!7/Bj]<;BJh;Yj>X:%qEZ:%(dQ:&7]a;>X8e;tOAp>l7n$<7b%K +AGg$uQ^F/.S"#q=StD[LTqeEZV5C/h +WN)u!XKAY/YctC)[s2k;`rlb>cs3:Mf +!mf6?rR(Yns3ptss4./#rn%2&s4RD*s4dS/rn[V2!8mb5!o`.uro=%>s5j7Bs5sCGrTOCKlg+N9 +!q#FDrU0gWnaZSKs7?9_rUp3arqH?cs7uZjqYU6hr;H3cJcFU,J,~> +JcC<$JcG<@o`"gfrquZjs8)ckrV-Hgp@eLY!VH!_no+'fn*f]3m-O''l07Bnk2k[aio/hQhVHuA +g=b*0f$r3tdEp4bbfe/NaN)9<_ns7)^:h1k\[],W['R'CYcb+0X/`+rVPU)`TqJ$LSXZ+:R$X)' +PEM&iO,f3YMi!:GL4t;5Jq8H%IXQTjH?o@Xr1*PQn!rF/!`)Qdr([2bs%E8^r^m,\qa^TSrC-`S +s5*A)s5UnXfHHm%F9KpH\f>qW.Y9qrI\:rT*trpC!Xm-Es&lg!ER +rQY8ap<3DGs(;7Cqe5tCrbD:FrG;IMphp"Jqf)+Gp2]hIs)dhLqSN8Tq0)1Mnp'YJqf_gYkB-ZF +rc\3`s*4QhrH_:eI!g?jIXZcsJ:W9'K7ei2L5(J>M2@+JN/WaWO-#KeP*;/rQC!u,R[]e;St;RJ +Tq\8dc-?44s3L_lrmCbos3pqrs4./#rn%2&s4RD*s4dS/rn[V2s53h6s5 +JcC<$JcG<@o`"gfrquZjs8)ckrV-Hgp@eLY!VH!_no+'fn*f]3m-O''l07Bnk2k[aio/hQhVHuA +g=b*0f$r3tdEp4bbfe/NaN)9<_ns7)^:h1k\[],W['R'CYcb+0X/`+rVPU)`TqJ$LSXZ+:R$X)' +PEM&iO,f3YMi!:GL4t;5Jq8H%IXQTjH?o1+pibnEqKDm_nob(1:/:^]s%NGcr(?r[s%*#WrC6`S +s$Zm\nY4oems4>GpH\eUqPO+cqPO4frM/n9c\)4Kqa:L`W2TKjoVhbgri#gZs,m2?hN.\uo8icF +r)*AipJ_)krNlO0!3uO-q6'h%Xo4[VR.Qa6R/LUrB)ZH?B`;`FCAM`ED#S;HDZ"GME:S#BEqOMR +FT%EsPl-aFP5f\#G4'SFGjoqSG5?@EFT$@]G5QRaGlN'fH;Js9I!pElIXcluJUrE*K7nr5L51SA +M2I4MN/`mZOHG]hPEhE!Q^F20S"#t?StD^MU8+N\VPg>jWiE,$Xf\b1Yd(L?Za@-K[^WcW\[oEP +]E,^[rkAKL_>_:Q_o0Lm`<+'"a8X0[aT0K^b6#o4c2Grfci;AkdJqYpe,@erec45"fDjM'g&B_* +g]-(.h>c@3hu;R6i;hm9j8\0?jo+U6equ-HjrUTr=s5*d+~> +JcC<$JcG<@o`"gfrquZjs8)ckrV-Hgp@eLY!VH!_no+'fn*f]3m-O''l07Bnk2k[aio/hQhVHuA +g=b*0f$r3tdEp4bbfe/NaN)9<_ns7)^:h1k\[],W['R'CYcb+0X/`+rVPU)`TqJ$LSXZ+:R$X)' +PEM&iO,f3YMi!:GL4t;5Jq8H%IXQTjH?o0HqEFpDrBAar!`)Qdr([2bs%E8^r^m,\qa^TSrC-`S +nPTB[qb[2fr)38fs&A_u +r*05-ra#S1o2OFBrFQ"@rb)+Arb;@HqJ6%Grb_FJr,;IOno=ADolL.TlVmh+q0)1Mnp'YJqf_gY +kB-ZFrc\3`s*4QhrH_:eI!g?jIXZcsJ:W9'K7ei2L5(J>M2@+JN/WaWO-#KeP*;/rQC!u,R[]e; +St;RJTq\8dc-?44s3L_lrmCbos3pqrs4./#rn%2&s4RD*s4dS/rn[V2s53h6s5 +JcC<$JcG?AoD\^erqu]krqcZjrqQNfs7ZKcs7CC(o()>@nF,i6mHj3*lKRNqk2tddj5T%Uhqm2E +gY1?4f@JI$da?FfcHOJSaiMNA`P]R/^V@Ip]=GJ][^EHJZ*:F6XfJJ$Vl-AeUS4BRSt2C@R[BJ. +Q'@JqOcPQ_N/NRMLkg_=K7ec+J:DuqI!U,7Sc>5OSbnrWSc##:Sc;Lc:Adid9`Ic`9)hK^8GbpU +7f>aU7/c!6hts&?T_kAOT(elBT_C_QjQ6:"!9_#1qK^;%G\;#F2g;YX2h;ufqtoE=aTnaGrFm/ZMNl2p4p +c/R%Hc25`[b5c,QB)ZH@B`;`ECAVfFD#S;IDZ"GME:\)BEq=AHFSNcL_Z+cSG0tO2G5?@CFT$@] +G5QRaGlN'gHN/
  • M2@+KN/`jYO-#KePE_>tQ^F/.R[]h_:P_o2Pns2G&ZrlG,]s2t>a +s31Mfrm(Pis3U_ls3^nrrRCkts47/#s4@>)rS%;+s4mV0s5*e5ro!h8s5O%hZ&*~> +JcC<$JcG?AoD\^erqu]krqcZjrqQNfs7ZKcs7CC(o()>@nF,i6mHj3*lKRNqk2tddj5T%Uhqm2E +gY1?4f@JI$da?FfcHOJSaiMNA`P]R/^V@Ip]=GJ][^EHJZ*:F6XfJJ$Vl-AeUS4BRSt2C@R[BJ. +Q'@JqOcPQ_N/NRMLkg_=K7ec+J:DuqI!U,5Fn9eRFT?UWFo-@YGP-.Z:]F2f:&doe9DhE^8cD9X +8,YpU70#aSU%>#5HLZ:MGkXN#V#[CdV>R4iV>m=kU\f_^K)gN#7/j.bWV3:fVuN[qVuEXpVZa>e;uKYq;Ll$tGN/WaVO,oBbP*;,qQ'[l*R@9V8SXuIHTqS6WUnsrdW2ZesXKAV-YHY79 +Za7$H[^NZT\[f;`rk&HK^;%Fu^qp#e!Q2kT`W*pXa8X0[aoBN_bQ#fdc2Q#gci;AjdJqVpe,@er +ec45!fDjJ'g&9Y)g]-(.h>c@3hu;R6iW%p:j8\0?jo+?Ak5a`EklU/9li$/OmI'E@n,MnWnc&+Z +oDeI\p&Facp\agcq>U6fqu$BjrUKl +JcC<$JcG?AoD\^erqu]krqcZjrqQNfs7ZKcs7CC(o()>@nF,i6mHj3*lKRNqk2tddj5T%Uhqm2E +gY1?4f@JI$da?FfcHOJSaiMNA`P]R/^V@Ip]=GJ][^EHJZ*:F6XfJJ$Vl-AeUS4BRSt2C@R[BJ. +Q'@JqOcPQ_N/NRMLkg_=K7ec+J:DuqI!U,54o.A>56*tG5Q="(5Q=OZ:Adid9`Ic`9)hK^8GbpU +7f>aV6rNMOqa&"apH\dYqGmPppf$oe!*$U#qaC?\r)EVnpJUidiD&l!"It*!!JV*lR5_OiGL51SAM2I7NNK0'\OHG]iPa.N#R$a;1 +S"-%@T:hmOUSO]^VPgAlWiE/&Xfek3Yd(O@['d?N\%&uZ]"@sS#/.ac^VIY$rk\]R`;[aU`W4'Y +aT'B^b5TTabl>recMu5jd/DAldK%bpeGn)!f)=5#fDsV'gAfq-h#?.0hZ)L4i;_d9ir8! +JcC<$JcG?AoD\^erqu]krqcZjrqQNf!;?Ebs7C^1o()>@nF,i6mHj3*lKRNqk2tddj5T%Uhqm2E +gY1?4f@JI$da?FfcHXPUaiMNA`P]R/^V@Ip]=PP^[^EKKZ*:F7XfSP%W2HMgUnXQUSt;IAR[KP0 +Q'IPrOcYWaNJrdPM2-h?KS+l-J:E#rI=$9dG^"@TF`_\Fn!sHKfq&.>s%iYirD!8bs%E8^s%32\ +qa^TSrC-V?p>>e>pRh>Urh'4`qk*VSp7LfHog/W?r8m_7r8me;!9NmXs0)=(p9F:ppTa:nq*b5F +s60FG!pJn5rTF:Fkl0`Fkl'ZHk3(mhrPe9DnA=h6r4r3Er_WMir)3;grD`br$MA)IDu=SGEV=GCF7+/K_tq7LFnp41 +GPcR[FlINAFoQX_GQ2pfH2`-iHN8HmI0P.MIt3'#K)UBtKS>/8LPUeEMic@3hu;R6iW%p:j8\3? +jo4EBkPscFl2U&Kli-8NmJlVRn,MnWnbr%YoDeI]p&=[bp\agcq>U6fqu-HjrUKl +JcC<$JcG?AoD\^erqu]krqcZjrqQNf!;?Ebs7C^1o()>@nF,i6mHj3*lKRNqk2tddj5T%Uhqm2E +gY1?4f@JI$da?FfcHXPUaiMNA`P]R/^V@Ip]=PP^[^EKKZ*:F7XfSP%W2HMgUnXQUSt;IAR[KP0 +Q'IPrOcYWaNJrdPM2-h?KS+l-J:E#rI=$9dG^"@TF`_\Fmre\Rr-%jXqf_XVq0)d7s%iYirD!8b +s%E8^s%32\qa^TSrC-UWp7hS5oQfSFnTjbOog.uArhfUi!2K@C`ImtSqksFlrho[k!2odm!2ogn +rMBIUplYB6p5f*4!0?u?7r_WMir)3;grD`br!jf/9pTFV#YPt[)XSS@TR-p=7QiLatBDZBA +C&VlEC]/)KD>A)IDu=SGEV=GCF7+/KPl-aFP5]V"G1:a5G5?@@FT$@^G5QRaGlN'gHN/
  • M2I4MN/`jYO-,TgPE_>uQ^F//S"#q>StD[LU8+N\VPg>jWiE,$Xfek3 +Yd(L?Za@-K\%&uZ]">Se]Y2%o^VIY$_SX4.`;[^W`lH.!a9'K+b5TTabl>recMu5jd/DAldf7ep +eGn&!f)=5#f`0Y'gAfn-h#6(/hZ)L4i;_d9ir8! +JcC<$JcG?AoD\^erqu]krqcZjrqQNf!;?Ebs7C^1o()>@nF,i6mHj3*lKRNqk2tddj5T%Uhqm2E +gY1?4f@JI$da?FfcHXPUaiMNA`P]R/^V@Ip]=PP^[^EKKZ*:F7XfSP%W2HMgUnXQUSt;IAR[KP0 +Q'IPrOcYWaNJrdPM2-h?KS+l-J:E#rI=$9dG^"@TF`_\Fq`amAq`k-GqEWt's%r_ks%`Mer_3>b +r(?u\r^coVrC6`Sr_i>bnj1Aaog/FSs&A\jr_rktr)CF#s$ulQr_r\n!)rShpf%,dj\=u7qb@&d +r)*Aipf%,jr`&r(r`oG.rET;,ra#S1qGdDlp/L$M!+u4Cqe5tCrbD=GrG;IMq/6+Kr,D7Ip2]\E +mWA/$rcS$[e9Ce5qK:e>rH8-`r-/0cs*=Tis*F`nrd>!"It*!!JV*lR:5"=UL51SAMMmFPNK0'\ +OcklkPa.Q$R$a>3S"-(AT:hmPUSO``Vl-JnWiN5'Y-5(6Z*L^B['d?O\@K/]]=Y_g]tV7r^qde' +_Sa:0rl"rYa2e2#!m/U-rlb>cs3:Pgs3L_lrR(Yns3pqrs4%,#rR_)%s4RA)s4[P/rS@M1s53h6 +s5F";ro=%>s5j7Bs6'FGrosIJs6K[Ns6]jSrpTmVs7-'Ys7?9_rUp0`s7cHdrqZQiqtp?ir;H0b +JcFU,J,~> +JcC<$JcG?Ao`"gfrVZTjs8)ckrV6Ee!;?Eb#5%NYo()>?rpP:'mHj3*lKRNqk2tdcj5T%Uhqm2E +gY1?5f@JI$da?FfcHXPUaiMNB`P]R/^q[Ur]=PP_[^NQLZEUR9XfSP&W2HMhUnaWWT:VUCS!fY1 +QBd\uP*(fdNJrdQM26qAKnP)1JUi6!I=-BfH$FOWG'%hIEcH)sDl:]F2g:&[id +9DhE^8cD9X8,YpV70)0?hY?"(T(\fHT^/6BT_(PGk5OHBjS@p5k4>hVYPYQ_Z1G3q7/lBIkksWA +k5FKBk5XQCjS[!m`:1\5_Yh7E^]74/;>jDf;uBVnA)JDu=SIEVFMEF5h;Ll$tGMi= +d/DAldf7epeGn)!f)=5#f`0Y(gAfq-h#6(/h>lI3i;_d9ir8! +JcC<$JcG?Ao`"gfrVZTjs8)ckrV6Ee!;?Eb#5%NYo()>?rpP:'mHj3*lKRNqk2tdcj5T%Uhqm2E +gY1?5f@JI$da?FfcHXPUaiMNB`P]R/^q[Ur]=PP_[^NQLZEUR9XfSP&W2HMhUnaWWT:VUCS!fY1 +QBd\uP*(fdNJrdQM26qAKnP)1JUi6!I=-BfH$FOWG'%hIEcH)sDl +:]F2g:&[id9DhE^8cD9X8,YpV70'"WU%kA]HLZ:WHMDj\HLlFXGlN![60>!DV"TJ^KD@q8Vu!:d +V>R4eV=]rGOnk+jDf;uBVnA)JDu=SIEVFMEF5hVf]tV7r^qmk(_Sa=1`Poj:a8X0[aT0K^b6#o4c2Gohcd:&;dJqYpe,@erec45! +fDjM'g&B_*g]-(-h>c=3hu2L5iW%p:j8\3?jo4EBkPscFl2U&Kli-8NmJlVQn,MnWnbr%YoDeI] +p&Fabp\agdq>U6equ-HjrUKl +JcC<$JcG?Ao`"gfrVZTjs8)ckrV6Ee!;?Eb#5%NYo()>?rpP:'mHj3*lKRNqk2tdcj5T%Uhqm2E +gY1?5f@JI$da?FfcHXPUaiMNB`P]R/^q[Ur]=PP_[^NQLZEUR9XfSP&W2HMhUnaWWT:VUCS!fY1 +QBd\uP*(fdNJrdQM26qAKnP)1JUi6!I=-BfH$FOWG'%hIEcH)sDl:]F2g +:&[id9DhE^8cD9X8,YpV7Jp'V;=6aH6MNq)6M*S@F,d;uBDP:#etK +;#F2h;YX2g<;fhsVf]tV7r^qmk(_Sa=1 +`Poj:a8X0[aT0K^b6#o4c2Gohcd:&;dJqYpe,@erec45!fDjM'g&B_*g]-(-h>c=3hu2L5iW%p: +j8\3?jo4EBkPscFl2U&Kli-8NmJlVQn,MnWnbr%YoDeI]p&Fabp\agdq>U6equ-HjrUKl +JcC<$JcGBBoD\^erVZTjs8)ckrV6Ee!;?Eb#5%NYo()>?rpP=(mHj3*l07Epk2tdcj5T%Uhqm2E +gY1?5f@JI$da?FfcHXPUaiMNB`PfX1^q[Ur]XkY`\$iZMZE^X;Xf\Y(WMcYjUnaZXTUqaFS!ob4 +Q^*i"P*(ieNfB!UM2@%CL4t84JUi9#I=6KhH?jaZG'.nKF)l8?E,TW3D/B5f"_qabBP1r2SH2Vc +rDQ4.htiuFT(8NDT^8-u +YP#-_Z1bEs7/c9IkPXKAjo=HDjlZO's5a.=rPeiVn\jn6pqlpEq7uo*r)3;grD`_qrDipfrpTmS +s6TdO!:'RJ"mG+1jiu'Bbl5l`cLoHXbk]H[B`;`FCAVfGD#S;IDZ+MOE;";IEq=A,FS^+[_Z"]Q +G2%6:G5HF=FT-F^G5QRaGlN'gH3/G@I/\OjIXcluJUrE*K7nr5L51SAM2I4MNK0'\OHG]iPa.Q$ +R$a;2S"-(AT:hmPUSO``Vl-MoWiN5'Y-5(6ZEpmE[C3NQ\@K/]]=bei^;%Fu_>_:P_o2Pn!li:$ +rl>/_b0'_,s3(JfrQbGhs3U_l!n,QHrRCkts47/#s4IA)rS%;+s4mS/s5!b5rS[_7s5O%`!~> +JcC<$JcGBBoD\^erVZTjs8)ckrV6Ee!;?Eb#5%NYo()>?rpP=(mHj3*l07Epk2tdcj5T%Uhqm2E +gY1?5f@JI$da?FfcHXPUaiMNB`PfX1^q[Ur]XkY`\$iZMZE^X;Xf\Y(WMcYjUnaZXTUqaFS!ob4 +Q^*i"P*(ieNfB!UM2@%CL4t84JUi9#I=6KhH?jaZG'.nKF)l8?E,TW3D/B5f"_qabBP1rGG3jDR +;GmBhs%iYirD!;cr_*2^r^m)[qa^TSs$cdWrLs.`qKhXVr-J'`pNlIWq0;NtjeVs2on:J?pdG+X +!2TUjrM0FirhT:brM8eCplYN:r/q#@m#h3Cr)3;grD`_qrDrs&qlg%&s/c@*Xf_T'q3g`>lBhF9 +r+Q(DrbD=GrbVRNq/6.Lr,D@Lq/Z(JgN<:7!0[>(pibD9q0)XXhK8a>rc\3`s*4Qhrd"WmI!kpA +:k!nEJ:W9'K7ei2L5(J>M2@+JN/`jYO-#KePE_>uQ^F/.S"#q>StD[LU8+N\VPg>kWiE,$Xfek3 +Yd1UA['d?N\%&uZ]">Vf]tV7r^qp#e!Q2kT`<+'"a8X-]ai_d*bQ#cdc2Grfci;Ajd/qbFe,@er +ec45!fDjM'g&9Y)g]-(-h>c=3hu2L5iW%p:j8\3?jo+U6equ-HjrUTr=s5!^*~> +JcC<$JcGBBoD\^erVZTjs8)ckrV6Ee!;?Eb#5%NYo()>?rpP=(mHj3*l07Epk2tdcj5T%Uhqm2E +gY1?5f@JI$da?FfcHXPUaiMNB`PfX1^q[Ur]XkY`\$iZMZE^X;Xf\Y(WMcYjUnaZXTUqaFS!ob4 +Q^*i"P*(ieNfB!UM2@%CL4t84JUi9#I=6KhH?jaZG'.nKF)l8?E,TW3D/B5f"_qabBP1rN5l*_D +54Cc;;GmBhs%iYirD!;cr_*2^r^m)[qa^TSs$cc^peg9Ar'L*Ej$E`5oKiFTs&K"smo'3V_++Do +pdFsWrDNSkr_iGgr(cY(nPf-\mSj$_r+Q(DrbD=GrbVRN +q/6.Lr,D@Lq/Z(JgN<:7!)rl>pibD9q0)XXhK8a>rc\3`s*4Qhrd"WmI!kpA:k!nEJ:W9'K7ei2 +L5(J>M2@+JN/`jYO-#KePE_>uQ^F/.S"#q>StD[LU8+N\VPg>kWiE,$Xfek3Yd1UA['d?N\%&uZ +]">Vf]tV7r^qp#e!Q2kT`<+'"a8X-]ai_d*bQ#cdc2Grfci;Ajd/qbFe,@erec45!fDjM'g&9Y) +g]-(-h>c=3hu2L5iW%p:j8\3?jo+U6equ-HjrUTr=s5!^*~> +JcC<$JcGBBoD\^erquZjs8)ckrV-Hgp@eLYJ+W@(o()>?n*f]4mHj3)l07Epk2tdcj5T%Uhqm2E +gY1?5f@JI$da?FfcHXSVb/hWC`PfX1^q[Us]Xt_a\$i]NZa$aj>k:]F2g:&doe9DhE]8cD9X8,YmW7K)!@h#?..hYuF+TE(VDT^/6JT^tJLjm;.0 +k5sf/kPhaWYl:iWYl1d#6i][Rk5=?9jSe-;iW.s8`qdUC`:h+F_YV+F_#@4/;Ya8i<;fhmM2@.LN/`jYO-,TgPE_>uQ^F20 +S"#t?StD^MU84T]VPgAlWiN5'Xfen4Z*L^B[C3NQ\@K/]]=bei^;%Fu_84"*_o2Pn#KFg)aN2KF +b5KKbbg"E3cMu5jd/DAldf7epeGn)!f)=5#f`0Y'gAfn-h#6(/hZ)L3i;_d9ir8! +JcC<$JcGBBoD\^erquZjs8)ckrV-Hgp@eLYJ+W@(o()>?n*f]4mHj3)l07Epk2tdcj5T%Uhqm2E +gY1?5f@JI$da?FfcHXSVb/hWC`PfX1^q[Us]Xt_a\$i]NZa$ak:Amoe9`Ic`9)_E]8GbpU7K>mPT`(S`U@rm5H/a/9H2MpY604sBL#n!C +KD7h77Jrt]U\^eaV>-kbPNS+fOoA5U;Ya8i<;fhmG5HF.8ZEpmF[^NZT\[f;` +]Y(ql^V@S#_8=(,`;[^\`lH-@aN;QHrQ>8dc-?75s3L_lrR(Yns3pqrs4./#rR_)%s4RA)s4[P/ +rS@M1s53e5s5F";ro=%>s5j4A!pAe2rTX@Is6K[Ns6]jSrU9dUs7-'Ys7?9_rUp3arqH?crqZQi +qYU6hr;H3cJcFR+J,~> +JcC<$JcGBBoD\^erquZjs8)ckrV-Hgp@eLYJ+W@(o()>?n*f]4mHj3)l07Epk2tdcj5T%Uhqm2E +gY1?5f@JI$da?FfcHXSVb/hWC`PfX1^q[Us]Xt_a\$i]NZa$aj>k:]F2g:&doe9DhE]8cD9X8,YmW7J'LW;>!6B6MjDe;tNiK:$GFP;>a>f;uK\ol7k2?ZCGrqbm>jpJg`_qGdK. +rb;@HqeQ1Irb_LLrGVUQpMp"Lp2eW'p3$+Qhfnm>qfU_:rcS3`r-/0c!."Nh>'kXEI=6QnIt3'# +JqAW-KS>/8LPUeDMic@3hu2L5iW%p:j8\3?jo+U6equ-HjrUTr=s5!^*~> +JcC<$JcGBBoD\^erqu]krqcZjrV-Hgp@eLY!VH!_np^,un*f]3m-O''l07Epk2tabj5T%Uhqm2E +gY1?5f@JI$e'ZRhcHXSVb/hZD`Pf[2_8!au]Xt_b\$i]OZa-g>Y-"e+Wi;noV50l\TqJ!KS=>t8 +R$X)'PEM)jO,f3YMi*@ILPCM9K7\Z)IsufnH[:!_GB\4QFEDSDE=Qr+DJj<-CMR["BkV0mB)Z?B +A7PUJ!F]C8?iOF5?!Qfgs&8qq!)`\ks%iYirD!;cs%E8^r^m)[qa^TSqqM/+rS@M1!8[1hrD`_qq,[Jr!q#@?rTX^Rkih0kjlGL^iVq+!bk]HYbkfTTbkoT`C&VlEC]/)KD>J/KDuFYL +EVa_NF3A\!FnU"M2@+J +N/WaVO-#KeP*D5sQC+&-R[]hjWiE,$Xfek3Z*L^B['d?O\@K/]]=bei^;%Fu +_84"*_o2Pn!QN1Za9'K+b5TTabQ,odc2u>=d/DAldf7epeGn)!f)=5#f`0Y'gAfq-h#6(/hZ)L3 +i;_d9ir8! +JcC<$JcGBBoD\^erqu]krqcZjrV-Hgp@eLY!VH!_np^,un*f]3m-O''l07Epk2tabj5T%Uhqm2E +gY1?5f@JI$e'ZRhcHXSVb/hZD`Pf[2_8!au]Xt_b\$i]OZa-g>Y-"e+Wi;noV50l\TqJ!KS=>t8 +R$X)'PEM)jO,f3YMi*@ILPCM9K7\Z)IsufnH[:!_GB\4QFEDSDE=Qr+DJj<-CMR["BkV0mB)Z?B +A7PUJ!F]C8?iOF5?!QfAs&8qq!)`\ks%iYirD!;cs%E8^r^m)[qa^TSoq;>Y!20:9eU$S-!-n'# +qkj4dr207ciJ$WOnq6[)!(Hj^s.enUrKI;Gi0*hsqNC];!)`Ylq,@5krDiYor`B-&#Ht;5Xf\\+ +Xo5="WrAIaRIHU6QhQmIC&VlEC]/)KD>J/KDuFYLEVa_NF3A\!FnU"M2@+JN/WaVO-#KeP*D5sQC+&-R[]hjWiE,$Xfek3Z*L^B['d?O\@K/]]=bei^;%Fu_84"*_o2Pn!QN1Za9'K+b5TTabQ,odc2u>= +d/DAldf7epeGn)!f)=5#f`0Y'gAfq-h#6(/hZ)L3i;_d9ir8! +JcC<$JcGBBoD\^erqu]krqcZjrV-Hgp@eLY!VH!_np^,un*f]3m-O''l07Epk2tabj5T%Uhqm2E +gY1?5f@JI$e'ZRhcHXSVb/hZD`Pf[2_8!au]Xt_b\$i]OZa-g>Y-"e+Wi;noV50l\TqJ!KS=>t8 +R$X)'PEM)jO,f3YMi*@ILPCM9K7\Z)IsufnH[:!_GB\4QFEDSDE=Qr+DJj<-CMR["BkV0mB)Z?B +A7PUJ!F]C8?iOF5?!R.gpHS[Vs&&horDhq,@5k!)rhln4r1AnP0']r)3>hrD`_qq,[JrqHWr(r*95# +qc!5er)<;gqG[,fs(VIIqeQ.Hrb_LLrGVXRpMp%MpiFW#p3$(Pick3AqK;:Lq/c4NrH8-`r-/0c +!."Nh!IK4nI8kZFIt3'#JqJ]/Knb>;Ll$tGMiVf]tV7r^qmk(_Sa=k`<"!!rl>/_b0'_,s3(JfrQYJjd*Va= +s3gqrrRCkts47/#s4IA)rS%;+s4mS/s5*e5rS[_7s5O%h>`!~> +JcC<$JcGBBoD\^erqu]krqcZjrqQNfs7ZHb!VH!_npg3!n*f]3m-O''l07Epk2tabj5T%Uhqm2E +gY1?5f@JL%e'ZRhcHXSVb/hZD`Pf[2_8!au]Xtbc\@/iQZa-j?YH=q-Wi;qpVPL#^TqJ$LSXZ+; +R$a2)P`q8mOH5E\N/NOLLk^Y@KBnFra5\3!+#S/!aAi3r`T#erDNbq;,R9gs%iYirD!;cs%E8^s%32\qFCNSq:kr)s5!_1 +!8ZP+rLibUn"B2:!9i\1!9ipWgT^=RpdG*MroF%lg!`uroXLJjlGI]i8FIVr64lXlHK.KrbD=GrbVRNqJQ7MrG_OOqf;LR`H:`p +olfPCpicLVn9"AFp2p:Vrc\6as*4Qhrd+Tk!.=co!IfOtJ51ZIK7ei2L5(J>M2@+JN/WdXO-#Ke +PE_>tQ^F//S"#q>StD^MU8+N\VPgAlWiN5'Xfnt5Z*L^C[C3NQ\@K2_]Y(ql^V@S#_8=(,`;[^V +`lJ)"#g(63bKJ,Rc-?75s3C\lrR(Yns3pqrs4./#rR_)%s4RA)s4dS/rS@J0s53h6s5F";rT!q= +s5j4As6'FGrosIJs6KXMs6]jSrU9dUs7-'Ys7?9_rUp0`s7cHdrqZQiqYU6hr;H0bJcFR+J,~> +JcC<$JcGBBoD\^erqu]krqcZjrqQNfs7ZHb!VH!_npg3!n*f]3m-O''l07Epk2tabj5T%Uhqm2E +gY1?5f@JL%e'ZRhcHXSVb/hZD`Pf[2_8!au]Xtbc\@/iQZa-j?YH=q-Wi;qpVPL#^TqJ$LSXZ+; +R$a2)P`q8mOH5E\N/NOLLk^Y@KBnFra5\3!+#S/!aAi3r`T#?rDNbq;,R9gs%iYirD!;cs%E8^s%32\qFCNSoq;>W!2016 +e9^S/nNl?8b(]MA!/(&7r^Hg^s.eqV!2]UXqNKg"rfQi9rDNGirD`_qq,[Jrs&f3%s/l4#"KSQ& +WN#`_r0d/DoU#3;rbD=GrbVRNqJQ7MrG_OOqf;LR`H:`polfPCpicLVn9"AFp2p:Vrc\6as*4Qh +rd+Tk!.=co!IfOtJ51ZIK7ei2L5(J>M2@+JN/WdXO-#KePE_>tQ^F//S"#q>StD^MU8+N\VPgAl +WiN5'Xfnt5Z*L^C[C3NQ\@K2_]Y(ql^V@S#_8=(,`;[^V`lJ)"#g(63bKJ,Rc-?75s3C\lrR(Yn +s3pqrs4./#rR_)%s4RA)s4dS/rS@J0s53h6s5F";rT!q=s5j4As6'FGrosIJs6KXMs6]jSrU9dU +s7-'Ys7?9_rUp0`s7cHdrqZQiqYU6hr;H0bJcFR+J,~> +JcC<$JcGBBoD\^erqu]krqcZjrqQNfs7ZHb!VH!_npg3!n*f]3m-O''l07Epk2tabj5T%Uhqm2E +gY1?5f@JL%e'ZRhcHXSVb/hZD`Pf[2_8!au]Xtbc\@/iQZa-j?YH=q-Wi;qpVPL#^TqJ$LSXZ+; +R$a2)P`q8mOH5E\N/NOLLk^Y@KBnFra5\3!+#S/!aAi3r`T4aq`k$X!`DlmrD/8LPUeDMMmFPNfT6_OckomQ'I]'R$sM6 +S=Z=ETqS3UUnsrdW2ZetXKAV.YctCVf]tV7r^qmk(_Sa=k`<"!!rl>Aeb0%oN +bfn>Vrm(Pi!7:\ls3gqrrRCkts47/#s4IA)rS%;+s4mS/rnd\4ro!h8s5O";s5a4ArT=.Cs60IH +s6BXMrTsROs6fjSs7$'YrUU![s7H9_rq?Bdr:p9erqcKgrVZTlnc"+>h>`!~> +JcC<$JcGBBo`"gfrVZTjs8)`jrqQNfs7ZKcs7?<_rpkO.nF,i6mHj3*lKRQskN:pfj5].Xi8\2r`fM/>$Co.!a&N*r`9&!!*&nq!`DlmrDbr(?u\r^coV +r^QqAq:c&+gY:Ns6/^Oq60"dpTO/8 +LPUeDMN!LRNfT6`P*2#nQ'Rc(R@9V8SXuFGTqS6WUo(&fW2ckuXKAY/Yd(L?Za@0L\%&uZ]">Vf +]tV7r^qmn)_o0O5`l?'ua8sE*rlb>c!6tMgs3L_lrmCbos3pqrs4./#rR_)%s4R>(s4dS/rS@M1 +s53e5s5F";rT!q=s5j4As6'FGrTOCKlg+N9s6]jSrU9dUs7-'Ys7?9_r:U*`rqH?crqZQiqYU6h +r;H0bJcFR+J,~> +JcC<$JcGBBo`"gfrVZTjs8)`jrqQNfs7ZKcs7?<_rpkO.nF,i6mHj3*lKRQskN:pfj5].Xi8\2r`fM/>$Co.!a&N*r`9&!!*&nq!`DlmrDbr(?u\r^coV +r^Qp[q4RYXpNb87r-89gq0DHqrMKRlm\\'ZpOr9/r^H(Irh]XYrfm5Bd?=K,q,@5krDi\prE&r" +"^/%4Y-"i)XT#:"WW9$lRf8`IR.?U,^b5TTabQ,oe +cMu5jd/MGmdf7epeGn)!f)=5#f`0Y&gAfq-h#6(/hZ)L3i;_d9ir.p;jT"??k5XWEkl'`IlKdd7 +m/QJQmeuVSnGi%Wo)J=]o_eC^pAXgaq#:*gqYL*fr;?N`rdk+*s*t~> +JcC<$JcGBBo`"gfrVZTjs8)`jrqQNfs7ZKcs7?<_rpkO.nF,i6mHj3*lKRQskN:pfj5].Xi8\2r`fM/>$Co.!a&N*r`9&!!*&nq!`DlmrDbr(?u\r^coV +r^Qibqbm>hs$HNKogI_,o0i(6qGcu`r`&DXmmcS4pI=mFr^?fbr_rMgrDWMks%`PhiD/W3r_iPj +rD`_qqH!PrrE',(>[786p0@;jr)hqeQ1Irb_LLrbqaSpi64PqK'DnoQBbKm/8LPUeDMN!LRNfT6`P*2#nQ'Rc( +R@9V8SXuFGTqS6WUo(&fW2ckuXKAY/Yd(L?Za@0L\%&uZ]">Vf]tV7r^qmn)_o0O5`l?'ua8sE* +rlb>c!6tMgs3L_lrmCbos3pqrs4./#rR_)%s4R>(s4dS/rS@M1s53e5s5F";rT!q=s5j4As6'FG +rTOCKlg+N9s6]jSrU9dUs7-'Ys7?9_r:U*`rqH?crqZQiqYU6hr;H0bJcFR+J,~> +JcC<$JcGBBo`"gfrVZTjs8)`jrqQNf!;?Ebs7?<_rpkR/nF,i6mHj3*lKRQskN:pfj5].Xi8?Y50=TV],=8l8#<<-"s;Z]io;>j;m:JO[`:&dod9DqK^8cD9W +7fZ$WgATb+gAK^rU$eZ3U$k;@kl0i?kQ'l1YkP?dYkbKt7/TLFiq_R3i:b.Z`q77J`:CeG;Ya8i +<;fhnFrQG1UrbVOMqel@Nrc%XPr,V[U]QE^e +nTOJIolg.RnT=DEp2p:Vs*")YHY79ZEppG[^NZU\[oDc]Y2%o^VI\&_Sa=2`Q#p< +aN2KFb5TQcbg"E3cMu2jd/DAldK%bpeGn)!f)=5"f`0Y'gAfq-h#-".hZ)L3i;_d9ir.p;jT"?? +k5XWEkl'cGlMp2Km/QGQmeuVSnG_tVo)J=]o_eC^pAamaq#:*gqYL*fr;?N`rdk+*s*t~> +JcC<$JcGBBo`"gfrVZTjs8)`jrqQNf!;?Ebs7?<_rpkR/nF,i6mHj3*lKRQskN:pfj5].Xi8?Y50=TV],=8l8#<<-"s;Z]io;>j;m:JO[`:&dod9DqK^8cD9W +7fZ$WTDbG[TCR9bHL6"H62mbWVt6bcVoFGdK_Rt57IR&NV>[:hPP^OCPL5Nn;Ya8i<;fhnVf]tV7r^qmn)_o0O5`l?'?aN;QHrlYAec-?75 +s3C\lrR(Yn!7Unrs4./#rR_&$s4RA)s4dS/r8%D0s53e5s5F";rT!q=s5j4As6'FGrTX@Is6KXM +s6TgSrU9dUrpfsXs7?9_r:U*`s7cEcrqZQiqYU6hr;H0bJcFR+J,~> +JcC<$JcGBBo`"gfrVZTjs8)`jrqQNf!;?Ebs7?<_rpkR/nF,i6mHj3*lKRQskN:pfj5].Xi8?Y50=TV],=8l8#<<-"s;Z]io;>j;m:JO[`:&dod9DqK^8cD9W +7fZ$U;uBPm;>W`U7+Og#7.3G<<:Wud<:EEG7d7efCL7K-6Y;Z0Pj<7F\59`S)e;uK\o#=oM_,>lS%'>lI\&S5LDuO_NEVskSF1cVcFn'YGGP-.TFn'SG +F7s_TFoQX_GQ2pfH2`*tH[L3hI=?WpJ:N3&re"+%Knb>;M2@+JN/WaVO-#KeP*D5sQC+&-R[]h< +StD[LU8+N\VPgAlWiE/&Xfnt5Z*L^C[C3NQ\[f;`]Y(ql^V@S#_SX4/`Poj:a2l?DaiaV+!mJp6 +rm(Pi!7:\ls3^nrrRCkts47/#rn.8(rS%;+s4mP.s5*e5rS[_7s5O";s5a4ArT=.Cs60FGs6BXM +rTsRO!:KgSs7$$XrUU![s7H6^s7ZKeqtU0drqcKgrVZTlnc"+>h>`!~> +JcC<$JcGECoD\^erVZTjs8)ckrV6Ee!;?Ebs7?<_rpkO.nF,i6mHj3*lKRQskN:pgj5].Xi8Z[^@L$=L?sd8I?=!P8!aAi3r`K;)=',B%!``3!r_rhps&&bls%iYirD!;cr_*2^r^m)[ +qFC55s4Zq8n"TKKrM&kVs.\sJroj7D!9j%=!9iOKp93bcr3,i_r'^VEqVq;/rS[_5ro!4`n](FE +qS`'EqG[>lrDi\prE&u#qHiSa[ZrlbAepWVO/8LPUeDMMmFPNfT6_ +OckomQ'I]'R$sM6S=Z=ETqS3VUnsrdW2ZetXKAY/Yd(L?Za@0L\%&uZ]=bei^;%Fu_8=(,`;[^[ +`lH0AaiV^)b5oi3rQYJjd*Vd>s3gqrrm^tus47,"s4IA)rS%;+rnRJ.s5*e5rS[\6s5O";s5a4A +rT=.Cs60FGs6BXMrTsROs6fjSs7$'YrUU![rq-0^rq?Bdr:p9erqcKgr;?Kknc"+>h>`!~> +JcC<$JcGECoD\^erVZTjs8)ckrV6Ee!;?Ebs7?<_rpkO.nF,i6mHj3*lKRQskN:pgj5].Xi8Z[^@L$=L?sd8I?=!P8!aAi3r`K;)=',B%!``3!r_rhps&&bls%iYirD!;cr_*2^r^m)[ +qFCFTrLj+]s*F3\hg4d;mm6`G!2oCb!/AFGr.Of4r'gX\p8%Y`pnmtQaccL!rD`_qqH!Prr`K#" +riQ1$"Kec,X/l6"!3,g_!1NYMp6b66rg3\$rbVRNqJQ:NrG_RPr,V^VmW@T6k&g*8g3376n9">E +p2p:Vrc\6as*4Qhrd+Tk!.=co;1="EJ:N3&K7ei2L5(J>M2@+JN/WdXO-#KePE_>tQ^F//S"#q> +StD^MU84T]VPgAlWiN5'Y-5(7ZEpmE[^NZT\[f>b]Y2%o^VI\&_Sa=k` +JcC<$JcGECoD\^erVZTjs8)ckrV6Ee!;?Ebs7?<_rpkO.nF,i6mHj3*lKRQskN:pgj5].Xi8Z[^@L$=L?sd8I?=!P8!aAi3r`K;)=',B%!``3!r_rhps&&bls%iYirD!;cr_*2^r^m)[ +qFC?[qbllNf1#I&mm6eLo2GTehadT6l::bApI+pJ!)rJes&8\lcqa7.qG[>lrDi\prE&u#qH/8LPUeDMMmFPNfT6_OckomQ'I]'R$sM6S=Z=ETqS3VUnsrdW2Zet +XKAY/Yd(L?Za@0L\%&uZ]=bei^;%Fu_8=(,`;[^[`lH0AaiV^)b5oi3rQYJjd*Vd>s3gqrrm^tu +s47,"s4IA)rS%;+rnRJ.s5*e5rS[\6s5O";s5a4ArT=.Cs60FGs6BXMrTsROs6fjSs7$'YrUU![ +rq-0^rq?Bdr:p9erqcKgr;?Kknc"+>h>`!~> +JcC<$JcGECoD\^erVZTjs8)ckrV6Ee!;?Ebs7C^1o()>@nF,i6mHj3*lKRQskN:pgj5].Xi8[[^EKKZEUR9XfSS'WMl_lUnj`YTq@pI +S=>t8R$X)'P`h2kO,o9ZN/EIKLPCP:K7ec+J:E#rI!^0c)0pING'.nKF)l8?E,TW3D/=!'C2.Hr +BP1rVAH?=OraH+@?sm>K?=$q:>QS,5>5hY+=BAT'k:Amoe9`Ic`9)_E] +8Gl!Vg]-"*g]#q"U#r*HU$8<>60RS5Z/r4`YNN.b7/KFOiq_R3i;2@1i9eMS`qdUN`:_%G;uK\o +S5MDuFYNEW'qUF7FA,Fm*r: +Fl%<:FmsMEF7s_TFoHR_GQ2pfH2`*kH[L5?I8GBBJ:N3%JqJ]/Knb>;Ll$tGN/WaVO,oBcP*;,q +QC!u,R[]hkWiE/&Xfen4Z*L^C[C3NR\[f;`]Y(qm^VI\&_Sa=k`=']+aN2KF +b0.uPbg$.4s3C\lrmCbos3pqrs4./#rR_)%s4RA)rnIJ.rS@M1rnm\4s5F";r8[h +JcC<$JcGECoD\^erVZTjs8)ckrV6Ee!;?Ebs7C^1o()>@nF,i6mHj3*lKRQskN:pgj5].Xi8[[^EKKZEUR9XfSS'WMl_lUnj`YTq@pI +S=>t8R$X)'P`h2kO,o9ZN/EIKLPCP:K7ec+J:E#rI!^0c)0pING'.nKF)l8?E,TW3D/=!'C2.Hr +BP1rVAH?=OraH+@?sm>K?=$q:>QS,5>5hY+=BAT'k:Amoe9`Ic`9)_E] +8Gl!TTD>/XHMVp?HLQ4J62meJVZ)=dL%n(570'+VV":J]PKB!c;uK\o/8LPUeDMN!LRNfT6_P*2#nQ'Rc(R@9V8SXuIHTqS6WUo(&fWN)u"Xf\b1 +Yd(L?['d?N\@K/]]=bei^V@S#_SX4/rl#8ba2l?Dai_fMbfn?2cMu2jd/MGmdf7epeGn)!f)=5# +f`0Y'gA]k,h#6(/hYuF2i;_d9ir%j:jT"??k5XWEkl'cGlMp2Km/QJQmeuVSnGi%Wo)A7\o_nI^ +pAamaq#:*gqYL*fr;?N`rdk+)s*t~> +JcC<$JcGECoD\^erVZTjs8)ckrV6Ee!;?Ebs7C^1o()>@nF,i6mHj3*lKRQskN:pgj5].Xi8[[^EKKZEUR9XfSS'WMl_lUnj`YTq@pI +S=>t8R$X)'P`h2kO,o9ZN/EIKLPCP:K7ec+J:E#rI!^0c)0pING'.nKF)l8?E,TW3D/=!'C2.Hr +BP1rVAH?=OraH+@?sm>K?=$q:>QS,5>5hY+=BAT'k:Amoe9`Ic`9)_E] +8Gl!N;u]bg7*\6u7.*A?lIso<;BJl<:*WaD#S;KDZ4SQE;=MPEr:"KFPCs%FRXG0G5-4LFRsSIFT-F^G5ZXbGlN'gH3/G@ +I/\OjIXcluJUrE*K7nr5L51SAM2I7NNK0'\OHPcjPa.Q$R$jD4S=Q7DTV8'SUnjlcVl?\rXKAV- +YctCVf]t_=t_8=(,`;[^``lH0AaiV]KbKS2Trm(Pi!7:_ms3gqrrRCkts47/# +s4IA)rS%8*s4mS/s5*b4rS[_7s5Nt:s5a4ArT=.Cs60FGs6BXMrTsROs6fjSs7$'YrUTsZs7H9_ +rq?BdqtU0drqcKgrVZTlnc"+>h#Dm~> +JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7Cd3o()>@nF,i6mHj3*lKRQskN:pgj5].Xi8$Co.!a&N*r`0)#<)iiqs&/kor_WVjs%`Mes%NGcr(?r[ +r^cuXq:Yi'r7]bsqkqHoQ0_JrH8-`r-/0c!."Nh$[[8KI=6QnIt3'#K)UC&KS>/8LPUeEMi +JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7Cd3o()>@nF,i6mHj3*lKRQskN:pgj5].Xi8$Co.!a&N*r`0)#<)iiqs&/kor_WVjs%`Mes%NGcr(?r[ +r^cuXq4IPWgj7t*lp:ZLl_aN5`eF.TqF14Urh]=crh]LUerouqqNCeUrD`_qqH!SsrE/r"rEB5* +s/l:%rN#jrl'_74nWsqHoQ0_JrH8-`r-/0c +!."Nh$[[8KI=6QnIt3'#K)UC&KS>/8LPUeEMi +JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7Cd3o()>@nF,i6mHj3*lKRQskN:pgj5].Xi8$Co.!a&N*r`0)#<)iiqs&/kor_WVjs%`Mes%NGcr(?r[ +r^cuXo2EFnr^?*=!*/tsoi(`e!)r_b`^fbkqF1-VrDWDhbYJ"/rDWYorDi\pr`B&#qcWl$s',G, +!*f5'kYqO\pf-`]s)%XNrGV[Sq/Q@Rr,_LPo6'_Lk]Q?9mWIN4pN>qHoQ0_JrH8-`r-/0c!."Nh +$[[8KI=6QnIt3'#K)UC&KS>/8LPUeEMi +JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7Cg4o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EJJ +h;$``59C-^V@Ip]=PP_\$i]NZa-g>Y-"e+Wi;qpVPU)`TqS*M +St):=R@'>,Q'@JqOcYWaNJrdQM26qAKnP)1JUi9#I=6KiH?si9G7A_?Y50=TV],=8l5%j>k:]F2g:&doe9DhE] +8cD9[8+bNbUA:MQU?k22l1hOHYi2e\7/B=P7fM?Hi:,Y'i9\GR`qICC`;W^7<;fhn5_\*>lNjmjlGL^ioB%WiS`Ygbj`gLbk]H[b56)UDuFYOEW'qUF7s_MFlml7FmaA=Fm!rAFmaAD +F7s_TFoHR_GQ2pfH2`-iHN8HmI9qAPIt3'#JqJ]/Knb>;Ll$tGMiaN;QHbKJ,Rc2Pui +cd:&c@3hu)F4iW%p8j8\3?jo"9@kPscEl2U&Kli$2L +mJlVQn,MnWnbr%XoDeI\p&Fabp\agcq>U6equ$BirUKl +JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7Cg4o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EJJ +h;$``59C-^V@Ip]=PP_\$i]NZa-g>Y-"e+Wi;qpVPU)`TqS*M +St):=R@'>,Q'@JqOcYWaNJrdQM26qAKnP)1JUi9#I=6KiH?si9G7A_?Y50=TV],=8l5%j>k:]F2g:&doe9DhE] +8cD9[7f]4VTDtS`HeWl.H0dimVt-_[L<##C7/B=P7erkYV>R4eV>leWPLkukPQ"M[<;fhn5_\*>l1T-X/`2!WiE%tl'_.1oU#GmrbqaSqJlISr,_RRpN>VAm<.i=m<.T8p3#eFoQ0_J +rcS3`rHJ9ds*=Tis*F`nrdA+%It*!!JV&N,KS>/8LPUeDMMmFPNK9-^OckomQ'I]'R$jG5S=Z=E +TqS3VUnsueW2ckuXf\b0Yd(L?['d?N\@K/]]=bhk^V@S#_SX4/`Poj;aN2KFb0.uPbg$.4!mf6? +rm:eqe'n(s4dS/r8%D0s53b4s5F";r8[h +JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7Cg4o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EJJ +h;$``59C-^V@Ip]=PP_\$i]NZa-g>Y-"e+Wi;qpVPU)`TqS*M +St):=R@'>,Q'@JqOcYWaNJrdQM26qAKnP)1JUi9#I=6KiH?si9G7A_?Y50=TV],=8l5%j>k:]F2g:&doe9DhE] +8cD9[7fZN];nYU"7-m2>5_\* +>lIt$>h`6M;u:J3DuFYOEW'qUF7s_MFlml7FmaA=Fm!rAFmaADF7s_TFoHR_GQ2pfH2`-iHN8Hm +I9qAPIt3'#JqJ]/Knb>;Ll$tGMiaN;QHbKJ,Rc2Puicd:&c@3hu)F4iW%p8j8\3?jo"9@kPscEl2U&Kli$2LmJlVQn,MnWnbr%XoDeI\p&Fab +p\agcq>U6equ$BirUKl +JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7C[0o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EJJ +h;$`j;m:JO[`:&[id9DhE] +8cD9\8+bN`UA1GTU?b,1l1V@KZ21]cYPCT_7K,dTi;2=2i;2@1huMa&`U_%A`Uq+I<;fhn5hb(>lWpojlGL_j5T+ZiSi_Qrlt;`mE>4Irlb/\rGMUQrc%^RrGqgWpN61QhKJ@1m<%`< +l?;lDm<&#Bp2p7Us*"M2@+JN/`jYO-#NfPE_>u +Q^F20S"#t?StMdNUSO]_Vl-MoWiW>)YHY79Za7$I[^WcW]">Vf]tV7s_8=(,`5T^8a8X-fai_fM +bfn>WcHjh`rmCbo!7Unrs4%,#rR_)%s4R>(s4dS/r8%D0s53b4s5Et:rT!n +JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7C[0o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EJJ +h;$`j;m:JO[`:&[id9DhE] +8cD9\8,f1VT)bP^He`r1H0[cdVu!:dLAlnhL?+'a7/B@O7fB.ZV#[CdV>c_VPLYilPPnJZPqb(XT,@!WrK'^RIQ[=Qi1h$DuO_PEW'qUF8'eOFl%<1FmX;;Ll$tGMikWiE/&Xfnt5Z*UdD[^NZT\[oDc]Y2%o^qmn)_o0O5`lJ)"$d$Q7bKS2TcHab^d/MGm +dK%bpeGn&!f)=5#f`0Y&gAfq-h#-".hZ)L2i;_d8ir.p:jT"??k5XWEkks]FlMp2Km/QJPmeuVS +nGi%Vo)J=]o_eC^pAXgaq#:*fqYL*fr;?N_rdk+)s*t~> +JcC<$JcGECoD\^erquZjs8)ckrV6Ee!;?Ebs7C[0o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EJJ +h;$`j;m:JO[`:&[id9DhE] +8cD9\8,cK^;nYWc62adV;u'Dd8*3A'8,5RL7K,dA<5_Q1<;fhn5hb(>lIt$>hE$M +;uLV5DuO_PEW'qUF8'eOFl%<1FmX;;Ll$tGMikWiE/&Xfnt5Z*UdD[^NZT +\[oDc]Y2%o^qmn)_o0O5`lJ)"$d$Q7bKS2TcHab^d/MGmdK%bpeGn&!f)=5#f`0Y&gAfq-h#-". +hZ)L2i;_d8ir.p:jT"??k5XWEkks]FlMp2Km/QJPmeuVSnGi%Vo)J=]o_eC^pAXgaq#:*fqYL*f +r;?N_rdk+)s*t~> +JcC<$JcGECoD\^erquZjs8)ckrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EMK +h;$c=g"=p-e^W'rdEp4bc-4ARaN2E@`P]R0^q[Us]Xtbc\@8oSZa6sAYcb+1X/`.tVl$;dUS=HT +T:VUCS!o_3Q^*i"P*1ofO,]*WMM[1GL5(D8K7\Z)Isufo'RY7RH$FOWG'.nKF)l8?E,TW3D/B2e +'l%GrBP1phAS#C^@q&nU?sm>K?=$q:>QS,5>5hY*=BGK&s&K(ur_ikr;,R9gs%`VirD!8bs%E8^ +r^m)[!(Z_9c_C0-r1a.blTt++r94.EoW[_fnZ_Mdq*b'JrC-eGp>Gu.qV_D4!64EFlc/h@ou-l0 +rDi\pr`B&#qcWo%r`f8)s'5Zfjo4??irnB#i8ESjc2GlObPKH]bPTE^DZ4SQE;FSREr:"QFS^.R +G4BeGG4B_BFR"#?G4TkDFS0_JFT-F^G5ZXbGlN'fH4,(II!pElIXcluJV*lR=G2B_L51SAM2R=O +NK0'\OcklkQ'IZ%R$jD4S=Q7DTV8*TUnsrdW2ZetXKAY/Yd(L?['d?N\@K/]]=bhk^V@S#_SX40 +`Q#s=aN2KGbKJ,Sc-FV\cd;[=!n,QHrm^tus472$s4IA)r7_2*s4mP.s5*e5r8@S5s5Nt:s5a4A +r9"%Bs60CFs6BXMrTsONs6fjSs7$'Yr:9mZrq-0^rq?BdqtU0drqcKgr;?Kknc"+>g])d~> +JcC<$JcGECoD\^erquZjs8)ckrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EMK +h;$c=g"=p-e^W'rdEp4bc-4ARaN2E@`P]R0^q[Us]Xtbc\@8oSZa6sAYcb+1X/`.tVl$;dUS=HT +T:VUCS!o_3Q^*i"P*1ofO,]*WMM[1GL5(D8K7\Z)Isufo'RY7RH$FOWG'.nKF)l8?E,TW3D/B2e +'l%GrBP1phAS#C^@q&nU?sm>K?=$q:>QS,5>5hY*=BGK&s&K(ur_ikr;,R9gs%`VirD!8bs%E8^ +r^m)[!(Zs[r1F"^q0V@Pi-G9IlTt*>q53n@re90_n:g[+qF1?PrM9CgrMK:brKR/Bc]\<-rDi\p +r`B&#qcWo%r`f8)s'>Z+r2]gsri,@S!1NeQm?md;!,hdSrG_UQrc7pXpN67Sp3,tMn94>Em<%W9 +o60_Jm<&#BolU1Urc\6as*4QhrH\iuI!g?jIXZcsJ:W=OK33e\L5(J>M2@.LN/`jYO-,TgPEhE! +Q^F20S"-%@T:hmPUSO``Vl6SpX/rG+YHY:;Za@-K[^`lY]">Vg^;%Fu_8=(,`Poj;a2l?Db0.uP +c-=PZcd0u;d/qbFe,Iksec45"fDjM'g&0S(g]-(,h>c@3hu)F3iW%p8j8\3?jo"9@kPscDl2U&K +li$2LmJlVQn,MnWnbhtXoD\C\p&=[bp\Xabq>U6equ$BirUKl +JcC<$JcGECoD\^erquZjs8)ckrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EMK +h;$c=g"=p-e^W'rdEp4bc-4ARaN2E@`P]R0^q[Us]Xtbc\@8oSZa6sAYcb+1X/`.tVl$;dUS=HT +T:VUCS!o_3Q^*i"P*1ofO,]*WMM[1GL5(D8K7\Z)Isufo'RY7RH$FOWG'.nKF)l8?E,TW3D/B2e +'l%GrBP1phAS#C^@q&nU?sm>K?=$q:>QS,5>5hY*=BGK&s&K(ur_ikr;,R9gs%`VirD!8bs%E8^ +r^m)[!_63hpJ\^nlTtJKpf$od!(ccQh+7$*q*b'JrC6'O`(p>3rDi\pr`B&#qcWo%r`f8)s'5Y1 +>PVP(>6%pX<;TSoDZ4SQE;FSREr:"QFS^.RG4BeGG4B_BFR"#?G4TkDFS0_JFT-F^G5ZXbGlN'f +H4,(II!pElIXcluJV*lR=G2B_L51SAM2R=ONK0'\OcklkQ'IZ%R$jD4S=Q7DTV8*TUnsrdW2Zet +XKAY/Yd(L?['d?N\@K/]]=bhk^V@S#_SX40`Q#s=aN2KGbKJ,Sc-FV\cd;[=!n,QHrm^tus472$ +s4IA)r7_2*s4mP.s5*e5r8@S5s5Nt:s5a4Ar9"%Bs60CFs6BXMrTsONs6fjSs7$'Yr:9mZrq-0^ +rq?BdqtU0drqcKgr;?Kknc"+>g])d~> +JcC<$JcGECo`"derqu]krqcZjrV-Hgp@eLYJ+W@(o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EMK +h;$c=g"=p-e^W'rdEp4bc-4ARaiMNB`Pf[2_8!b!]Y(hd\[T#U['R'CYck43XK/A#W2HMgUnaWW +T:VXES"#h5R$O#%PEM&iO,f3YMi*@JLPCP;K7ec,J:E#rI2%'UH?jaZGBS+NFE;JBEH#i6DJa4h +CDCSuBP;$kAn>Oa@q/tW@:3JM?X@&Er`f\4>$>'3=BJZ(k:Amoe9`@]_ +9)_E]8-.N#pY*HXrM/XDo'-/;rTWjVm]l8cnuqjWqaLEPq;D20rS[S3s2P#Vq8W9Ml,NV>pr!/3 +rDi\pr`B&#qcWo%r`f8)ra#P1rT++Aj5L!q!T2i2c2GlMb5fc\bPoZaDuO_PEW'qVF80kRFnp4@ +GP$(KFmjG8Fo-@OFm=)EF7aSRFoHR^GQ2pfH2`-iHN8HmI0"eHrd\7)JqJ]/Knb>;Ll$tGMiWcHjh`rm:eqe'n +JcC<$JcGECo`"derqu]krqcZjrV-Hgp@eLYJ+W@(o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EMK +h;$c=g"=p-e^W'rdEp4bc-4ARaiMNB`Pf[2_8!b!]Y(hd\[T#U['R'CYck43XK/A#W2HMgUnaWW +T:VXES"#h5R$O#%PEM&iO,f3YMi*@JLPCP;K7ec,J:E#rI2%'UH?jaZGBS+NFE;JBEH#i6DJa4h +CDCSuBP;$kAn>Oa@q/tW@:3JM?X@&Er`f\4>$>'3=BJZ(k:Amoe9`@]_ +9)_E]8-#@\TE(V_T_EfsHK9AMHKmfeVu!:`LAch^L@U&o7/KFN7f9(]V>R4hV>R1jV>QSQPLGZp +<;fhn5hb'>lJ%/?N$r+X/c&rnX9?EqO-];rg3Y'rc%^RrGqjXpiQ@Tq0(eBoQKbI +mr[`8qf_IOl?)iCoQ:(Trc\3`s*4Qhrd+Tk!.=co!IfOtJ6[YWK7ei2L5(J>M2@+JN/WaWO-#Ke +P*D5sQC+&-S"#q>StD^MU84T]Vl-JnWiN8(Y->.8ZEppG[^WcW]">Vf]tV7s_8=(,`5T^8a2l?D +b0.uPbg"GYcd0u;d/qbFe,IkseH"2!fDjM'g&9Y)g]-(,h>c@2hu2L4iW%p8j8\3>jo+?@kPscE +l2KuJli$2LmJlVQn,MnVnbr%XoDeI\p&Fabp\agcq>L0dqu-HirUKl +JcC<$JcGECo`"derqu]krqcZjrV-Hgp@eLYJ+W@(o()>@nF,i6mHj3*lKRQskN:pgjQ#7Yi8EMK +h;$c=g"=p-e^W'rdEp4bc-4ARaiMNB`Pf[2_8!b!]Y(hd\[T#U['R'CYck43XK/A#W2HMgUnaWW +T:VXES"#h5R$O#%PEM&iO,f3YMi*@JLPCP;K7ec,J:E#rI2%'UH?jaZGBS+NFE;JBEH#i6DJa4h +CDCSuBP;$kAn>Oa@q/tW@:3JM?X@&Er`f\4>$>'3=BJZ(k:Amoe9`@]_ +9)_E]8H2Z`;sd$:7fPpU7e&q462adY;tj8i8G,L/8Ff:H7/KFN7ep$]Ph\)?2n42>Ph\(>6%pU<;ohrDuO_PEW'qVF80kRFnp4@GP$(KFmjG8Fo-@OFm=)E +F7aSRFoHR^GQ2pfH2`-iHN8HmI0"eHrd\7)JqJ]/Knb>;Ll$tGMiWcHjh` +rm:eqe'n +JcC<$JcGECo`"gfrVZTjrqcZjrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lKRQskN:pgjQ#:Zi8EML +h;$c=g"=p.e^W*sdF$:ccHOJTaiMQC`Pf[2_8*h"]tCtg\[],W[Bm3FYct=5XfSP&W2HPiUnj`Y +TV%gHS=>t8R$X,(P`q8mOH5E]N/NRMLkg_>KS+o/JUi6!s*YT/H?sj]GB\4QFEDSEEH,r9DJj<- +rbE6`BkV0mB4b^dA7K+Y@UWYP?XI,G?2e(0>?_#/s&]8&r`9&!!*&qrs&/kor_WVjs%`Mes%NDb +r(?u\r^d%Ds4dG)j.bq9n"T&4rTNq=!9j@Fj0AWir3>=eq*b'JqaUMAnDX>cs2FQK!6=]Nr5\`T +oYggKr`/eqr`B&#qcWo%r`f8)ra#M0"CL;Ll$tGMikWiE/&Xfnt5ZEpmE[^NZU\[oDc]tV7r^qmn*`5T^8a2l?Db5TQg +bg"GYcd0u;d/qbFe,Ihue^i=NfDjM'g&9Y)g]$",h>Z:2hu)F4iVqj7j8\3?jo"9?kPscEl2KuJ +li$2LmJlVQn,DhVnbhtXoDeI\p&=[bp\Xabq>U6dqu-HjrUBf;s4dR(~> +JcC<$JcGECo`"gfrVZTjrqcZjrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lKRQskN:pgjQ#:Zi8EML +h;$c=g"=p.e^W*sdF$:ccHOJTaiMQC`Pf[2_8*h"]tCtg\[],W[Bm3FYct=5XfSP&W2HPiUnj`Y +TV%gHS=>t8R$X,(P`q8mOH5E]N/NRMLkg_>KS+o/JUi6!s*YT/H?sj]GB\4QFEDSEEH,r9DJj<- +rbE6`BkV0mB4b^dA7K+Y@UWYP?XI,G?2e(0>?_#/s&]8&r`9&!!*&qrs&/kor_WVjs%`Mes%NDb +r(?u\r^d$^q4RA,n9Y%[qg.@Lks>9For%\ao7m6ugkPKUq*b'JqaUL[n>?)InWWR-r0-Q3r`/eq +r`B&#qcWo%r`f8)ra#M0#[a[6X/`2!WiH#sm[=*DpmLH8s)@jTrGqjXpiQFVq0(M:p3,tKmrZs" +eo^n6rc\3`s*4Qhrd+Tk!.=cos*dstJ:N3&JqJ]/Knb>;Ll$tGMikWiE/&Xfnt5ZEpmE[^NZU\[oDc]tV7r^qmn*`5T^8a2l?Db5TQgbg"GYcd0u; +d/qbFe,Ihue^i=NfDjM'g&9Y)g]$",h>Z:2hu)F4iVqj7j8\3?jo"9?kPscEl2KuJli$2LmJlVQ +n,DhVnbhtXoDeI\p&=[bp\Xabq>U6dqu-HjrUBf;s4dR(~> +JcC<$JcGECo`"gfrVZTjrqcZjrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lKRQskN:pgjQ#:Zi8EML +h;$c=g"=p.e^W*sdF$:ccHOJTaiMQC`Pf[2_8*h"]tCtg\[],W[Bm3FYct=5XfSP&W2HPiUnj`Y +TV%gHS=>t8R$X,(P`q8mOH5E]N/NRMLkg_>KS+o/JUi6!s*YT/H?sj]GB\4QFEDSEEH,r9DJj<- +rbE6`BkV0mB4b^dA7K+Y@UWYP?XI,G?2e(0>?_#/s&]8&r`9&!!*&qrs&/kor_WVjs%`Mes%NDb +r(?u\r^crdqc!5XqF:KTp.#!Nl:1J9ks>;Jq,?udqagENgdq*.q*b'JqaUK_n5[G&r`/eqr`B&# +qcWo%r`f8)ra#M0!FK(0>l._*?-Q@KE;OYRErC(SFSp:WG2%67G4B_DFO>6^FT-F^G5QRaGlN'g +HN/
  • M2@+JN/`jYO-#KePE_>uQ^F//S"#t?StMdNUSO]_Vl-Mo +WiW>)YHY7:Za7$I[^WfX]">Vg^;%Fu_8=+.`Poj;aN2KGrlYMic-FV\cd;[=!n,QHrmV#"f%0iP +s4IA)rS%;+rnRJ.rnd\4r8@V6ro3k9s5a4Ar9""As60FGrp'OLrTsONs6fjSrp]sXr:9mZs7H6^ +rq?BdqtU0drqcHfrVZTlnG\"=g])d~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYJ+W@(o()>@nF,i6mHj3*lKRQskN:pgjQ#:[i8EML +h;$c=g=Y$/f$r3udF$=dcHXPUb/hZE`Pod4_SO"%^:_+j\[f2X[^,Q'@JqOcYWaNJrdQM26qAL4k23Jq/B$IfFg1I!U*aG^"@TF`__HEcH)sDl:]F2g:&doe +9D_?\8H;5hb'>lJ%.?N"43jlHF$s5Et8!9*^tr63p=qJlLTrH%aUr,qjZf6?q3noa;@ +eTKGbrH8*_r-/0c!."Nh!df,7L51SAMMmFPNK0'\OcklkPa.Q$R$jD4 +S=Q7DTV8*TUnsrdW2ZetXKAY/Yd(L?['d?O\@K/^]Y(ql^VI\&_Sa=2`Q#s>aN;TJbKS5VcHjh` +rm:bpe,IkseH"2!fDjJ'g&9Y)g]$",h>c@2hu)F4iVqj7j8\3>jo"9@kPscDl2U&Jli$2LmJlVQ +n,DhVnbhtXoD\C[p&Fabp\agbq>U6equ$BirUKl +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYJ+W@(o()>@nF,i6mHj3*lKRQskN:pgjQ#:[i8EML +h;$c=g=Y$/f$r3udF$=dcHXPUb/hZE`Pod4_SO"%^:_+j\[f2X[^,Q'@JqOcYWaNJrdQM26qAL4k23Jq/B$IfFg1I!U*aG^"@TF`__HEcH)sDl:]F2g:&doe +9D_?\8H;sVV=:AZPj">/P4Xt3OoSMY5hb'>lJ%.?N"72X8f3rW;r=ERI6I=EW1"WF80kTFo$:5GP64NFmO5#Fk1[5FoHR^GQ2mf +H2W$jH[L5?I0"eHrd\4(JqJ]/KnY89LPUeEMib]Y2%o^qmn)_o0O5`lH0Aai_fMbg"GYcd0u;d/h\Erm^tu!7q,# +s4@>)rS%;+rnRJ.s5*b4r8@V6ro3k9s5a1@r9"%Bs60CFs6BULrTsONs6fjSrp]sXr:9mZrq--] +s7ZHdr:p6drqcKgr;?Kknc"+>gAc[~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYJ+W@(o()>@nF,i6mHj3*lKRQskN:pgjQ#:[i8EML +h;$c=g=Y$/f$r3udF$=dcHXPUb/hZE`Pod4_SO"%^:_+j\[f2X[^,Q'@JqOcYWaNJrdQM26qAL4k23Jq/B$IfFg1I!U*aG^"@TF`__HEcH)sDl:]F2g:&doe +9D_?\8H;7Hd&;<;KPd<52!#7/B@L7K>sW<:Elf<5hT4Ph\)?2e1/?i"%->68&8;pJA=EW1"WF80kTFo$:5GP64NFmO5#Fk1[5FoHR^GQ2mfH2W$jH[L5? +I0"eHrd\4(JqJ]/KnY89LPUeEMib]Y2%o^qmn)_o0O5`lH0Aai_fMbg"GYcd0u;d/h\Erm^tu!7q,#s4@>)rS%;+ +rnRJ.s5*b4r8@V6ro3k9s5a1@r9"%Bs60CFs6BULrTsONs6fjSrp]sXr:9mZrq--]s7ZHdr:p6d +rqcKgr;?Kknc"+>gAc[~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lK[WtkN:pgjQ#:[iS`VM +h;-i>g=b*0f%&:!da?FfcHXSVb/q`F`l5m6_SO%&^:h1k]",>[[^EKKZE^X;Y-"e+Wi;qpVPL#_ +TqS-NSt2@?R[BJ/Q'ISsP*(fdNf8pTMM[.EL4t;5K7\W(0n4Y#I=-?eH$FOWG'.nKF)l8?E,TW3 +D/=$(CMIQsBP1siAS#C^@q&nU?sm>K?=$q:>QJ&4r`K;)=',B%!``3!r_rhp!)`\ks%iYirD!;c +r_*/]r^lqAs4mOIoV1-9oV1M7qrdk?q!#T"qF(0KqaUTUlf%larPmU4oZ$mLqc<\trE/r"r`];* +qcs,+ra,J/"Qe_)ioC!rs5rGhgWrH%dVr,qm[cZf,,oQBD?fQGefrH8*_r-/0cs*=Ti +s*F`nrdFfq=atsPJUrE*K7nr5L51SAM2I4MN/`jYOHG]hPa.N"R$a;1S"-%@T:hmPUSO``Vl6Sp +X0&M,YctC=Za@-K\%&u[]=bej^V@S#_Sa=2`Q#s>aN;TJbKS61c2l8Z:2hu)F4iVqj7j8\3>jo"9@kPj]Cl2U&Klhp,LmJcPPn,DhVnbhtXoD\C[p&Fab +p\Xabq>U6dqu-HjrUBf;s4[L'~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lK[WtkN:pgjQ#:[iS`VM +h;-i>g=b*0f%&:!da?FfcHXSVb/q`F`l5m6_SO%&^:h1k]",>[[^EKKZE^X;Y-"e+Wi;qpVPL#_ +TqS-NSt2@?R[BJ/Q'ISsP*(fdNf8pTMM[.EL4t;5K7\W(0n4Y#I=-?eH$FOWG'.nKF)l8?E,TW3 +D/=$(CMIQsBP1siAS#C^@q&nU?sm>K?=$q:>QJ&4r`K;)=',B%!``3!r_rhp!)`\ks%iYirD!;c +r_*/]r^m'_rLs7agjAsFkBZ5Vqkiq^pP8$giJ77tqF19Ns$us_s/,[iq54%RplkTaN;TJbKS61c2l8Z:2hu)F4iVqj7j8\3>jo"9@kPj]Cl2U&Klhp,LmJcPPn,DhVnbhtXoD\C[ +p&Fabp\Xabq>U6dqu-HjrUBf;s4[L'~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYIe<7'o()>@nF,i6mHj3*lK[WtkN:pgjQ#:[iS`VM +h;-i>g=b*0f%&:!da?FfcHXSVb/q`F`l5m6_SO%&^:h1k]",>[[^EKKZE^X;Y-"e+Wi;qpVPL#_ +TqS-NSt2@?R[BJ/Q'ISsP*(fdNf8pTMM[.EL4t;5K7\W(0n4Y#I=-?eH$FOWG'.nKF)l8?E,TW3 +D/=$(CMIQsBP1siAS#C^@q&nU?sm>K?=$q:>QJ&4r`K;)=',B%!``3!r_rhp!)`\ks%iYirD!;c +r_*/]r^lobs&8eai^`K-o0qh.lr;"rqFUNOqF19Ns$uTZqc(O0qc<\trE/r"r`];*qcs,+ra,J/ +!aK#:qHO#+rDV*CrGhgWrH%dVr,qm[cZf,,oQBD?fQGefrH8*_r-/0cs*=Tis*F`nrdFfq=atsP +JUrE*K7nr5L51SAM2I4MN/`jYOHG]hPa.N"R$a;1S"-%@T:hmPUSO``Vl6SpX0&M,YctC=Za@-K +\%&u[]=bej^V@S#_Sa=2`Q#s>aN;TJbKS61c2l8Z:2 +hu)F4iVqj7j8\3>jo"9@kPj]Cl2U&Klhp,LmJcPPn,DhVnbhtXoD\C[p&Fabp\Xabq>U6dqu-Hj +rUBf;s4[L'~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLY$hX&^o()>@nF,i6mJcI%lg!a!kiV$hjQ#:[iS`VM +h;-l?g=b-1f%&:!da?IgcHaYWbK7iH`l5p7_SX+'^V.:m]",A\[^NQLZa$a=Y-"h,WiE"qVkp2b +U7n9QSt;IAS!fY2QBd`!P*1ofO,f0XMi!:HLPCM9K7e`*J:E#rI=-?eH$FOWG'.nK-ZaOa@q/tW@:3JM?X@#D>[1K;>5hY+=BAT'k:Amoe +9`Ic_9)hH_h>?(.h>3o;U=U?4c=kP=?=l2@sVZMLojZM1^&7/B@L7f>jWir7m:iqhX4iW.s: +imc$>`r&m:=8l>!=oMV(>Ph\)?2e1-?iFF5j8S';i;hg8iV1Umbi$\EEW1"WF89qVFo-@KGPQLI +GPH@RFm!l#FkLm8Fo?L]GQ2pfH2W$jH[L5?I0"eHrd\1'JqJ]/KS>/8LPUeDMMmFQNfT6_Ockom +Q'I]'R$sM6S=Z=ETqS3VUnsueW2cl!Xf\e2Yd1UA[C3NQ\[f;`]Y2%o^qmn)_o0O5a2l?Db0.uP +bg"GYcd;[=!RfHreGn&!f)F;$f`0Y(gAfq-h#-".hZ)L2i;_d8ir%j9jT"?>k5OQDkks]ElMp2J +m/QJPmeuVRnGi%Vo)J=\o_eC]pAamaq#:*fqYL*er;?N_rdk+'s*t~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLY$hX&^o()>@nF,i6mJcI%lg!a!kiV$hjQ#:[iS`VM +h;-l?g=b-1f%&:!da?IgcHaYWbK7iH`l5p7_SX+'^V.:m]",A\[^NQLZa$a=Y-"h,WiE"qVkp2b +U7n9QSt;IAS!fY2QBd`!P*1ofO,f0XMi!:HLPCM9K7e`*J:E#rI=-?eH$FOWG'.nK-ZaOa@q/tW@:3JM?X@#D>[1K;>5hY+=BAT'k:Amoe +9`Ic_9)hKZUAgkcI.2LMHKKM861^uNVt>c=LAH]&L?"'d7/B@L7f>jKV>@(dPkUC7P2VW&5hb'>lJ%.?Me+/?im=+W;3FlR,+2(Qi`[qEW1"WF89qVFo-@KGPQLIGPH@RFm!l#FkLm8 +Fo?L]GQ2pfH2W$jH[L5?I0"eHrd\1'JqJ]/KS>/8LPUeDMMmFQNfT6_OckomQ'I]'R$sM6S=Z=E +TqS3VUnsueW2cl!Xf\e2Yd1UA[C3NQ\[f;`]Y2%o^qmn)_o0O5a2l?Db0.uPbg"GYcd;[=!RfHr +eGn&!f)F;$f`0Y(gAfq-h#-".hZ)L2i;_d8ir%j9jT"?>k5OQDkks]ElMp2Jm/QJPmeuVRnGi%V +o)J=\o_eC]pAamaq#:*fqYL*er;?N_rdk+'s*t~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLY$hX&^o()>@nF,i6mJcI%lg!a!kiV$hjQ#:[iS`VM +h;-l?g=b-1f%&:!da?IgcHaYWbK7iH`l5p7_SX+'^V.:m]",A\[^NQLZa$a=Y-"h,WiE"qVkp2b +U7n9QSt;IAS!fY2QBd`!P*1ofO,f0XMi!:HLPCM9K7e`*J:E#rI=-?eH$FOWG'.nK-ZaOa@q/tW@:3JM?X@#D>[1K;>5hY+=BAT'k:Amoe +9`Ic_9)hKZ<;ohk7drq97dEM*61%Xj8Gc!U7/B@L7f>jN!=oMV(>Ph\)?2e1- +?iFI.>lS++;q4kIEW1"WF89qVFo-@KGPQLIGPH@RFm!l#FkLm8Fo?L]GQ2pfH2W$jH[L5?I0"eH +rd\1'JqJ]/KS>/8LPUeDMMmFQNfT6_OckomQ'I]'R$sM6S=Z=ETqS3VUnsueW2cl!Xf\e2Yd1UA +[C3NQ\[f;`]Y2%o^qmn)_o0O5a2l?Db0.uPbg"GYcd;[=!RfHreGn&!f)F;$f`0Y(gAfq-h#-". +hZ)L2i;_d8ir%j9jT"?>k5OQDkks]ElMp2Jm/QJPmeuVRnGi%Vo)J=\o_eC]pAamaq#:*fqYL*e +r;?N_rdk+'s*t~> +JcC<$JcGHDoD\^erVZTjrqcZjrqQNfs7ZHb$hX&^o()>@nF,i6mJcI$lg!a!ki_*ijQ#:[iS`YN +h;-l@g=b-1f@AC#e'ZRicHa\YbK@rJa2Z*:_ns7*^V7Co]=PP_\$i]OZa-j?YHG"/X/`.tVl$;d +US=HTT:VUDS!ob4Q^3o$PEM&iO,o9ZN/NOLLkg_=KS+o.J:N,uI=6HgH?jaZGBS-/F=2-MEH,r9 +DJj<-Chmg$BkV0mB4b^dA7K+Y@UWYP?XI,F?!LW=>?_#/!a&N*r`0)#<)iiqs&&horD!=oMV'>Pqb*?2e1-?iFI5@0GWMj5T(ti;V^0c1]BA +bPlP\F8C"VFo6FQGO'M@GPH@SFlRT$FkLm8Fo?L]GQ2pfH2W'hHN8HmIK+b%It3'#JV&N,KS>/8 +LPUeDMMmFPNK0'\OcklkPa.Q$R$jD4S"6.BTV8'SUnjlcW2ZetXKAY/Yd(L?['d?O\@K2_]Y(tn +^VI\&_o0O5`lH0Aai_fMbg"GYcd;[=!RfHre,n1Of)F8&f\+sVgAfq-h#6(/hZ)L2i;_d8ir%j9 +jT"?=k5XWDkks]ElMp2Jm/QJPmelPRnGi%Vo)A7\o_eC]pAXg`q#:*gqYC$er;6H_rdk+&s*t~> +JcC<$JcGHDoD\^erVZTjrqcZjrqQNfs7ZHb$hX&^o()>@nF,i6mJcI$lg!a!ki_*ijQ#:[iS`YN +h;-l@g=b-1f@AC#e'ZRicHa\YbK@rJa2Z*:_ns7*^V7Co]=PP_\$i]OZa-j?YHG"/X/`.tVl$;d +US=HTT:VUDS!ob4Q^3o$PEM&iO,o9ZN/NOLLkg_=KS+o.J:N,uI=6HgH?jaZGBS-/F=2-MEH,r9 +DJj<-Chmg$BkV0mB4b^dA7K+Y@UWYP?XI,F?!LW=>?_#/!a&N*r`0)#<)iiqs&&horDb7rM]dsql/YErg;Ll$tGMiXs4dS/rS@M1s53b4s5Et:r8[e;s5j.?s6'CFr9=4Gs6KULs6]gRr9s[T +s7-$Xrq$0^r:U'_rqH:-gqu-'aJcFF'J,~> +JcC<$JcGHDoD\^erVZTjrqcZjrqQNfs7ZHb$hX&^o()>@nF,i6mJcI$lg!a!ki_*ijQ#:[iS`YN +h;-l@g=b-1f@AC#e'ZRicHa\YbK@rJa2Z*:_ns7*^V7Co]=PP_\$i]OZa-j?YHG"/X/`.tVl$;d +US=HTT:VUDS!ob4Q^3o$PEM&iO,o9ZN/NOLLkg_=KS+o.J:N,uI=6HgH?jaZGBS-/F=2-MEH,r9 +DJj<-Chmg$BkV0mB4b^dA7K+Y@UWYP?XI,F?!LW=>?_#/!a&N*r`0)#<)iiqs&&horD1s'b\-s'>@tfMqijrH%gWr,qp\nTX;DmKol];:hf[UorH8'^r-/0cs*=Qhs*F`nrdFfq +?%7BTJUrE*K7nr5L51SAM2I4MN/`jYO-,TgPE_>uQ^F20S"#t?StMdNUSO]_Vl6SpX/rG+YHY:; +Za@-K\%&u[]=bej^V@S#_Sa=2`Q#s>aN;TJbKS5VcHjl:d/h\ErmV#"f%0iP!nc2ZrS%;+s4mS/ +s5*e5r8@V6ro3k9roF+@qr[qAroj:Erp'OLr9XINrpK^Qs7$'Yr:9jYs7H6^rq??cqtU0drqcHf +rVZQknc"+>g&HR~> +JcC<$JcGHDoD\^erVZTjs8)`jrqQNfs7ZHbJ+W@(o()>@nF,i6mHs9,lg!a!ki_*jjlGI]iS`YO +hVHuAg=k32f@JI$e'cXjcd'eZbK@rJaMu3<_ns:,^V@Lq]Xt_b\@/iR['R'CYck43XK/A#W2HMh +UnaZXTV%gHS=>t8R$X,(P`q8mOH5E]N/WXNM26n@KnP)1JcC6@IsufoH[:!`G^"@TF`__HEcH)< +Df0H0D/=!'C2*Z\'k_,iARo:\@U`bR?sd8I?!U]?>?b;1=TV],=8l5%j>k:]F2g +:&dod9DhEWhY!Z6U>MaDU?+]>jne-8k5a`0[H=jgZhm/f7JfRN7f_TIj8e6:j9=T)jQ#:]qoA]W +rQ"`TqoJiZr5nrZs2k5\r5\KMs&T,#r`K#"r`];*qcs,+s'GS0ra>_6s'bufq;D>5pms"SNp3#87icWssrH8'^r-/0crd"Khs*Ocnrd=frJ,Xs!JV*lR=bMK` +L51SAM2I4MN/`mZOHG]hPa.N"Q^F20S"-%@T:hmPUSO``Vl6SpX/rG+YHY:;Za@-K\%&u[]=bhk +^V@V%_Sa=2`Q-'@ai_fMbg"GYcd0tcdF-MCe,n1Of)F8&f\+sWgAfq-h#6(/hZ)L2i;_d8ir%j9 +jT"?=k5XWDkks]ElMp2Jm/HDPmelPQnGi%Vo)A7\o_\=]pAXg`q#:*fqYL*er;?N_rdk+&s*t~> +JcC<$JcGHDoD\^erVZTjs8)`jrqQNfs7ZHbJ+W@(o()>@nF,i6mHs9,lg!a!ki_*jjlGI]iS`YO +hVHuAg=k32f@JI$e'cXjcd'eZbK@rJaMu3<_ns:,^V@Lq]Xt_b\@/iR['R'CYck43XK/A#W2HMh +UnaZXTV%gHS=>t8R$X,(P`q8mOH5E]N/WXNM26n@KnP)1JcC6@IsufoH[:!`G^"@TF`__HEcH)< +Df0H0D/=!'C2*Z\'k_,iARo:\@U`bR?sd8I?!U]?>?b;1=TV],=8l5%j>k:]F2g +:&dod9DhE\U\pk[I.M^UHKKM762dY\Vt-_TL\?JWL\jL:7JfRN7f]C`V?!IgVZ!CmW;)VPPP:79 +PPCC6PQ+\_=8l=u=oMV(>Ph\)?2n7.?iFI4@K0dM2@+JN/WaW +O-#KeP*D5sQC!u,R[]hVg^;%G!_SX4/`Pom= +aN;TJbKS5VcHjh`dF$CkrmV#"f%0iP!nc2Zrn@D,s4mS/s5*e5r8@V6ro3k9roF+@qr[qAroj:E +rp'OLr9XFMs6fgRrp]sXr:9jYs7H3]s7ZHdqtU0drVHBfr;?KknG\"=g&HR~> +JcC<$JcGHDoD\^erVZTjs8)`jrqQNfs7ZHbJ+W@(o()>@nF,i6mHs9,lg!a!ki_*jjlGI]iS`YO +hVHuAg=k32f@JI$e'cXjcd'eZbK@rJaMu3<_ns:,^V@Lq]Xt_b\@/iR['R'CYck43XK/A#W2HMh +UnaZXTV%gHS=>t8R$X,(P`q8mOH5E]N/WXNM26n@KnP)1JcC6@IsufoH[:!`G^"@TF`__HEcH)< +Df0H0D/=!'C2*Z\'k_,iARo:\@U`bR?sd8I?!U]?>?b;1=TV],=8l5%j>k:]F2g +:&dod9DhE\5hb'>lJ%/ +?Me+/@/aU7@ej70?!d/%iD]eUr)ms"SNp3#87icWssrH8'^r-/0crd"Kh +s*Ocnrd=frJ,Xs!JV*lR=bMK`L51SAM2I4MN/`mZOHG]hPa.N"Q^F20S"-%@T:hmPUSO``Vl6Sp +X/rG+YHY:;Za@-K\%&u[]=bhk^V@V%_Sa=2`Q-'@ai_fMbg"GYcd0tcdF-MCe,n1Of)F8&f\+sW +gAfq-h#6(/hZ)L2i;_d8ir%j9jT"?=k5XWDkks]ElMp2Jm/HDPmelPQnGi%Vo)A7\o_\=]pAXg` +q#:*fqYL*er;?N_rdk+&s*t~> +JcC<$JcGHDoD\^erVZTjs8)`jrV-Hgp@eLY!qc*UrpkO.nF,i6md9B-lg!a!ki_*jjlGI^iS`YO +hVI#Bg=k64f@JL%e'cXkcd'h\bKJ&LaN)<>`5BI.^q[Us]Xtbc\[T#U['R*EYct=5XfSP&WMcYk +UnjcZTqJ$LSXc1,Q'@JqOcYWaNJrgRM2@%CL4t;5Jq8H&It%EG,("W^H$FOWG'.nKF)l8? +E,TW3D/F*)CMIQsBP1siAS#C^raGn:@/aL6?=!P8#?tA8=]nj/=8l8#<<-"t;u]bq;>sDl:]F2f +:&doe9DqK[hYl?WU\U_]UZ=]BjQ5Lrk5OQ*[HFpoZhq'+7/KFM7eoRNjo4?>jT+HAjT4MbrQ"`T +rQ5#ZqT8WWqT8WUqT&NRrE&u#qcWo%r`f8)ra#M0r*TG2raGb7s5Nn6!93[rn]^UJq8rc^F*%/! +rH8$]olp"PqK_XVn9=\OpN>85j`TC$qfVm]qfi'brd"Khs*OcnrdAL0It*!!JUrE*K7nr5L51S@ +M2I4MN/`jYO-#KePE_>tQ^F/.S"#q>StD[LU84T]Vl-JnWiN8(Y->.9Za7'J[^WfX]"G\h^;%J" +_SX71`Q#s>aN;TJbfn>WcHjkbdF-LmeC<%"f)F8&f\+sWgAfn-h#6(/hZ)L2i;_d8ir%j9jT"?= +k5OQDkkjWElMg,Im/HDPmelPQnGi%Vo)A7[o_eC]pAamaq#1$fqYC$er;6H^rdk+&s*t~> +JcC<$JcGHDoD\^erVZTjs8)`jrV-Hgp@eLY!qc*UrpkO.nF,i6md9B-lg!a!ki_*jjlGI^iS`YO +hVI#Bg=k64f@JL%e'cXkcd'h\bKJ&LaN)<>`5BI.^q[Us]Xtbc\[T#U['R*EYct=5XfSP&WMcYk +UnjcZTqJ$LSXc1,Q'@JqOcYWaNJrgRM2@%CL4t;5Jq8H&It%EG,("W^H$FOWG'.nKF)l8? +E,TW3D/F*)CMIQsBP1siAS#C^raGn:@/aL6?=!P8#?tA8=]nj/=8l8#<<-"t;u]bq;>sDl:]F2f +:&doe9DqKWU[EO&HhD^\H1?4A5m!m[VYR.eV?!O_LXCkS7/KFM7eoRKVZNfpVu3LnWVht\Q26aB +PPC=:POFb6PPnS^=Sl8#>5hb'>lJ%.?Mn10@/aU5@fEA'WpZ;MR/WNLR/WNLQi`[sF89qVFo6FU +GOp(UH1H4LGPQFVFkh*#Fkq0:FoHR]GQ2peH2`-iHiJKmI;+.[It3'#JV&N,KS>/8LPUbCMMmFP +NK0'\OHG]iPa.N#R$a;2S"-(AT:hmPUnjibVl6VqX0&M,YctF>ZaI6M\%0&\]Y(ql^VI\&_SjF4 +`lH0Aai_fNbg"GYcd:(edaQ[peCE.$rmq5(g"HAYs4[P/rS@M1s53b4s5Et:r8[e;s5j.?roa=F +qs".Grp0LKrpBaRr9sXSs7-$Xrq$-]r:U'_s7cEcrV?Hhq>:-gqu-$`JcFF'J,~> +JcC<$JcGHDoD\^erVZTjs8)`jrV-Hgp@eLY!qc*UrpkO.nF,i6md9B-lg!a!ki_*jjlGI^iS`YO +hVI#Bg=k64f@JL%e'cXkcd'h\bKJ&LaN)<>`5BI.^q[Us]Xtbc\[T#U['R*EYct=5XfSP&WMcYk +UnjcZTqJ$LSXc1,Q'@JqOcYWaNJrgRM2@%CL4t;5Jq8H&It%EG,("W^H$FOWG'.nKF)l8? +E,TW3D/F*)CMIQsBP1siAS#C^raGn:@/aL6?=!P8#?tA8=]nj/=8l8#<<-"t;u]bq;>sDl:]F2f +:&doe9DqKWj<7eoLG7f>d:5lt%c<;onk;ufq58GkmQ7JfRM8+0FW!=oMV(>Ph\)?2e1.?iFI4@Js[4>lJ"/?LUnW<;BGo<-*-VFT$@[G4g(NGku^VGjoqQ +G5$.7FQIZ$FSg4[G5HL`GlE!fHN/?lI/\P.IXcitJ:W9'K7ei2L5(J>Ll%"IN/WaVO,oBbP*;,q +Q'[l*R@B\9St;RITq\?YV5L5iWiE,%Xfen4ZEpmF[^NZU\[oGd]tV7s_8=(-`Poj;aN2KGbKS2T +cHab_dF$Cke'umtf%0iP!nc2Zrn@D,!8RP/s5*e5r8@V6ro3k9roF+@qr[n@s60@Es6BULr9XFM +s6fgRrp]sXr:9jYrq--]rq?BdqtU-crqcHfrVZQknG\"=g&HR~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpkR/nF,i6md9B-lg!a!ki_*jjlGI^io&bP +hVI#Cg=k64f@JL%eC2gmd*L"^bfe/NaN2B?`P]R0_8!b!]tCtg\[],W[C!9GZ*:I8Xf\Y(Wi2hn +VPL#_TqS-NSt2@?R[BJ/Q'IStP*(ieNfB!UMM[1GL5(D8K7\Z)J:E%JI1UaOH?jaZGBS+NFE;JB +EH#jqDA-l'CMR[!BP;$kAn>Oa@q/tW@:9(A!FB(2>R+J:>$5!1=BGK&s&B%ur_rhps&&bls%iYi +r([2br_*8`ptte@h4sP:r1i:roO"=roa0elF#c]qm6:-r'^BMqaUBOrT3q=s5sXLkND'l +kNM.-a8j?YaSO$Vb5TNZb4<[OaSs6[=8l>!=oMV(>Ph\)?2e1.?iFI4@JjU7@fYNciW%p0c0rmO +bP'*TFSp:[G4p.TGj9SKGk-(SG5$.3FR"#*FSg4ZG5HL`GlE!eH3/G@I/\QoIK4lsJ,t4Qre"O1 +Knb>;Ll$tGMib +]Y;.q^r!t+`5T^9aN2KGbKJ,ScHab_dF$Cje'umtf%0iP!SH*(g&g$ah#6(/hZ)L3i;_d8ir%j9 +jT"?=k5OQDkkjWDlMp2Im/QJPmelPQnGi%Vo)A7[o_eC]pAXg`q#:*gqYC$dr;?N_rdk+%s*t~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpkR/nF,i6md9B-lg!a!ki_*jjlGI^io&bP +hVI#Cg=k64f@JL%eC2gmd*L"^bfe/NaN2B?`P]R0_8!b!]tCtg\[],W[C!9GZ*:I8Xf\Y(Wi2hn +VPL#_TqS-NSt2@?R[BJ/Q'IStP*(ieNfB!UMM[1GL5(D8K7\Z)J:E%JI1UaOH?jaZGBS+NFE;JB +EH#jqDA-l'CMR[!BP;$kAn>Oa@q/tW@:9(A!FB(2>R+J:>$5!1=BGK&s&B%ur_rhps&&bls%iYi +r([2br_*8`pnR/&o6]JCj$E[@r20Ikr20LlqhXj!e;!lhqF19Nq+(C]r2BRnqPsCWpltQ;rfZi9 +nWa&Tr`K&#r`];*qcs,+ra,M0ra>_6r*o\9!3,donX8s8!1E8BqK2XXrH@mYpiu(LpNZ7Qq0)LT +fQ?D$hK8X;rHA'^s*4NgrH\NlI!kpAs*artrdY$#K)UC/KS>/8LPUeDMMmFPNK0']OcklkPa.Q$ +R$a>3S"6.BTV8'SUnjlcVl?\rXKAV.Yd(L?['d?O\@K/^]Y(tn^VI_'_o0O5a2l?Db0.uPc-FV\ +d*^7hdaQ^qe^i=Nf)aOWrRq>-gt_kas5*e5rS[_7ro3k9roF+@qr[n@s60@Erp'OLqs=@MrpK^Q +rp]sXr:9jYrq--]rq??cqtU0drqcHfr;?KknG\"=f`-I~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpkR/nF,i6md9B-lg!a!ki_*jjlGI^io&bP +hVI#Cg=k64f@JL%eC2gmd*L"^bfe/NaN2B?`P]R0_8!b!]tCtg\[],W[C!9GZ*:I8Xf\Y(Wi2hn +VPL#_TqS-NSt2@?R[BJ/Q'IStP*(ieNfB!UMM[1GL5(D8K7\Z)J:E%JI1UaOH?jaZGBS+NFE;JB +EH#jqDA-l'CMR[!BP;$kAn>Oa@q/tW@:9(A!FB(2>R+J:>$5!1=BGK&s&B%ur_rhps&&bls%iYi +r([2br_*8`pf75_oLI:u!(Gp6r`/ksqGdSr,1l?1s* +qfVj\qfi'brd"Hg!dfM2@+JN/WaVO-#KeP*;,qQC!u+R[]e; +St;UKTqeEZVPg>kWiE/&Xfnt6ZEppG[^WcW\\#Me^;%Fu_SX4/`Pom=aN;TJbKS5VcHjkbdF-Il +eC<%"f)F8%f\-5W!o)McrS@M1s53e5s5Et:r8[e;s5j.?roa=Fqs"+Fs6KRKs6]gRr9sXSs7-$X +rq$-]r:U'_rqH:*fr;H-aJcFC&J,~> +JcC<$JcGHDoD\^erquZjs8)`jrV-Hgp@eLYs7?<_rpg*[nG_m*md9B-lg!a!ki_*jjlGI^io/hQ +hVI#CgY1?5f@SU'eC2jnd*L"_bfe2PaN2EA`Pf[2_8*h#]tD"i\[f5Y[^EKKZE^X;Y-"e+Wi;qp +Vkp2bU7n9QSt;IAS!o_3Q^*i#P*1rhO,f3YMi*@JLPCP;KS+l-J:N,uI=6MCH4>.EGB\4QFEDSE +EH,r9rb`3_Chmg$BkV0mB4b^dA7PUJ!F]C8?NFJ=r`f\4>$>'3=BJZ(k +:Adid9`@Zd9&AG$ht3`.UZ\HQU]3[A62]^Bj8J';jo+?;[d(9t[-Y-qZM[,f7JfRK8,VQJkQgA9 +l07Kul08)dq8iWZqoSBNo?%$TqoJiZr`K#"r`]>+qcs,+ra,J/s'Yh7qdTS8s((rao?HXGr6+fV +qfMdZrH@mYq0:tGpiuCSq0)OUf6$8"j)k-?rHA$]s*4NgrH\NlI!kpAs*artrd\.&JqAW-KS>/8 +LPL\BM2I4MNK0'\OHG]hPa.N"Q^F20S"-%@T:hmPUSO``Vl6SpX/rG+YHY:;Za@-K\%&u[]=bhk +^VI\&_Sa@3`lH0Aai_fNc-FV\d/MDsdaQ^qe^`7Mf)aOWrn@D,s4mV0s5*e5rS[\6s5Nt:roF+@ +qr[n@roj:Erp'LKr9XFMrpK^Qrp]sXqssdYrq--]rq??cqtU0drVHBfr;?HjnG\"=f`-I~> +JcC<$JcGHDoD\^erquZjs8)`jrV-Hgp@eLYs7?<_rpg*[nG_m*md9B-lg!a!ki_*jjlGI^io/hQ +hVI#CgY1?5f@SU'eC2jnd*L"_bfe2PaN2EA`Pf[2_8*h#]tD"i\[f5Y[^EKKZE^X;Y-"e+Wi;qp +Vkp2bU7n9QSt;IAS!o_3Q^*i#P*1rhO,f3YMi*@JLPCP;KS+l-J:N,uI=6MCH4>.EGB\4QFEDSE +EH,r9rb`3_Chmg$BkV0mB4b^dA7PUJ!F]C8?NFJ=r`f\4>$>'3=BJZ(k +:Adid9`@Zd8tr'VU[W[%HN8BhHgZ4UHiHFn62[SOVYQ&>LXq4X7/KFM7e]FOW;W^mWr9!hQ2?g2 +PPUODQ26aE=Sc2">5qh(>lJ%.?Me+0@/aU3@fKs;LPUeDMMmFQNfT6_OckllQ'IZ% +R$jD4S=Q7DTV8*TUnsrdW2ZetXKAY/Yd(L?['d?O\@K2_]Y2%o^qmn)_o9U7a2l?Db0/#RcHab_ +rm:que'umte^j`O!SH*)gAfq-h#?.0hZ)L3i;V^8ir%j9jT"?=k5OQCkks]ElMg,Im/HDOmelPQ +nGi%Uo)J=\o_eC]pAXg`q#:*fqYL*er;6H^rdk+%s*t~> +JcC<$JcGHDoD\^erquZjs8)`jrV-Hgp@eLYs7?<_rpg*[nG_m*md9B-lg!a!ki_*jjlGI^io/hQ +hVI#CgY1?5f@SU'eC2jnd*L"_bfe2PaN2EA`Pf[2_8*h#]tD"i\[f5Y[^EKKZE^X;Y-"e+Wi;qp +Vkp2bU7n9QSt;IAS!o_3Q^*i#P*1rhO,f3YMi*@JLPCP;KS+l-J:N,uI=6MCH4>.EGB\4QFEDSE +EH,r9rb`3_Chmg$BkV0mB4b^dA7PUJ!F]C8?NFJ=r`f\4>$>'3=BJZ(k +:Adid9`@Zd8lSddf8^Bs)7fZ$V7/KFM7e]FE<;fh`:Amo^:B+,W:Amuf +=Sc2">5qh(>lJ%.?Me+0@/aU3@fKsVg^;%J"_SX40`Q#s>aN;TJbg"GYcd;[=#1CuM +eCE+#rmq2'g&B_*g]-(.h>c@3hu2L4iW%p8j8S->jnn3>kPj]Cl2KuIlhp,KmJcPOn,DhVnb_nW +oD\C[p&=[ap\Xabq>L0dqu$BhrUBf;s4I@%~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_m+md9B-lg!a!ki_*jjlGI^io/hR +hqm2EgY1B7f@SU(eC2jndEp1ac-4ARaiMQC`Pod4_SO%&^:h1k]",A\[^NTMZa-g>YHG"/X/`.t +Vl$;dUS=HTT:VXES"#h5R$O#&P`h2lO,o<\N/NRMM2-h?KnP)1JUi9#IXQWks*>-"G^"@TF`__H +EcH)?_#/s&]8&r`0)#<)iiqs&/kor_WVj +s%`Jds%NDbq;:_3SrTO1D +qW\+IlM\j)aSEsBb4NgOb5PN?=oMV(>Ph\*?2e1-?iFI5@JaO5A,g'?A`E^J!T;u:iUkCZbl#Z[ +b5HG\Fo?LXGPZR@H22^WGPQFWFjtO!Fm!lBFo6FZGQ2peH2W'hHN8HlI:I_UIt3'#JV&N,KS5&6 +L51SAM2I4MN/`jYO-#KePE_>tQ^F/.S"#q=StD[LU8+N\VPgAlWiN5'Y->.8Za7$I[^WfX]"G\h +^;%J"_Sa=2`Q$!?ai_fMbg"GYcd:(edaS3F!S,d#f)aOWrn@D,!8RP/s5*e5rS[_7s5Nt:roF+@ +qr[n@roj:Erp'LKqs==Ls6fdQs7$$Xr:9jYrq--]rq??cqtU-crqcHfr;?KknG\"=fDg@~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_m+md9B-lg!a!ki_*jjlGI^io/hR +hqm2EgY1B7f@SU(eC2jndEp1ac-4ARaiMQC`Pod4_SO%&^:h1k]",A\[^NTMZa-g>YHG"/X/`.t +Vl$;dUS=HTT:VXES"#h5R$O#&P`h2lO,o<\N/NRMM2-h?KnP)1JUi9#IXQWks*>-"G^"@TF`__H +EcH)?_#/s&]8&r`0)#<)iiqs&/kor_WVj +s%`Jds%NDbq4mM.mrhTIgr20"?q1mXXr'^ENqaU +PjFV1PkgUD=Sl8#>5hb'>lS+/?Me+/@/j[4@fBm;A-$8Ar2Tn!X/kfZhO+7`rH8'^pNQIYhKepA +oQU+SpiY).lZMB4q/uUYqKMsard"Hgs*F`nrI&1)It*!!JUrE*K7no3L5(J>M2@+JN/WaVO,oBb +P*;,qQ'[l*R@B\9SXuIHTq\c@3hu2L5iW%p8j8S->jnn3>kPj]Cl2KuIlhg&J +mJlVOn,MnVnbhtWoD\C[p&=[ap\Xaaq>U6dqu$BirUBf;s4@:$~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_m+md9B-lg!a!ki_*jjlGI^io/hR +hqm2EgY1B7f@SU(eC2jndEp1ac-4ARaiMQC`Pod4_SO%&^:h1k]",A\[^NTMZa-g>YHG"/X/`.t +Vl$;dUS=HTT:VXES"#h5R$O#&P`h2lO,o<\N/NRMM2-h?KnP)1JUi9#IXQWks*>-"G^"@TF`__H +EcH)?_#/s&]8&r`0)#<)iiqs&/kor_WVj +s%`Jds%NDbq,QiQd74+%j[&oHr)EYqq,Z`OhFRQ7r'^ENqaUb7qdTP7s'u+@rETG/?2e*l;ta2_;uLh:Fo?LXGPZR@H22^W +GPQFWFjtO!Fm!lBFo6FZGQ2peH2W'hHN8HlI:I_UIt3'#JV&N,KS5&6L51SAM2I4MN/`jYO-#Ke +PE_>tQ^F/.S"#q=StD[LU8+N\VPgAlWiN5'Y->.8Za7$I[^WfX]"G\h^;%J"_Sa=2`Q$!?ai_fM +bg"GYcd:(edaS3F!S,d#f)aOWrn@D,!8RP/s5*e5rS[_7s5Nt:roF+@qr[n@roj:Erp'LKqs==L +s6fdQs7$$Xr:9jYrq--]rq??cqtU-crqcHfr;?KknG\"=fDg@~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_k[md9B-lg"K6J*?(Xk2kX`io/hR +hqm2FgY1B7f[n^)eC;sqdEp4bcHOJTb/hZE`l5m6_SX+'^V7@n]=PP_\$i]OZa6p@Yck12XK/A# +W2HMhUnaZXTV%gHS=?"9R$a2)Q'7AoOcPQ`NJrdQM2@"BL4t;5Jq8H&IsufoH[:!`G^"@TFoQP" +F)l8?E,TW3D/F*)CMIQsBP1phAS#C^raGn:@/aL6?=!P8!F&b,=TV],=8l5%j>k +:]F2f:&doe9DRK6V#-qWV!=fUV#3RA62f[?hu;R5iVha9j5[TE[JdK1ZgP-t7/KFM7eT=R8EoC5 +lMKoEb506Cb4WmPaoGQ@=oMV(>Ph\)?2e1.?iFI4@JjU6A,g*aN;TJbg"GYcd:(edaHUoeCE.Lf)aOWrn@D,!8RP/!oDhlrS[_7s5Nt: +roF+@qr[n@roj:Erp'LKqs==LrpK^Qrp]pWr:9jYrq--]rq??cqY:'crqcHfr;?HjnG\"=fDg@~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_k[md9B-lg"K6J*?(Xk2kX`io/hR +hqm2FgY1B7f[n^)eC;sqdEp4bcHOJTb/hZE`l5m6_SX+'^V7@n]=PP_\$i]OZa6p@Yck12XK/A# +W2HMhUnaZXTV%gHS=?"9R$a2)Q'7AoOcPQ`NJrdQM2@"BL4t;5Jq8H&IsufoH[:!`G^"@TFoQP" +F)l8?E,TW3D/F*)CMIQsBP1phAS#C^raGn:@/aL6?=!P8!F&b,=TV],=8l5%j>k +:]F2f:&doe9DP@OI-u@\HKTYQ6KUT6UApqbUAUedU]@7ZLt.:\LAaO;7JfRJ7fl5]Wr&jsWr9!s +XSeCSQ1gI8PPUO>PlOq`=oMV(>Ph\)?2e1.?iFI4@JjU6A,g*;LkpnE +MMmFPNK9-^OcklkPa.Q$R$a>3S"-(AT:qsQUnjibVl6VqX0&M,YctF>ZaI6M\@K/^]Y(tn^VI_' +_o0O6a2l?Db0/#RcHab_dF$Cje'umtf)F8%f\-8Xs4[P/rS7P3hr"Cjs5F";r8[e;s5j.?roa:E +r9=4Grp0IJrpB^Qr9sXSrpfpWrq$-]r:U'_rqH9arqZQiq>:*fqu-$`JcF@%J,~> +JcC<$JcGHDoD\^erVZTjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_k[md9B-lg"K6J*?(Xk2kX`io/hR +hqm2FgY1B7f[n^)eC;sqdEp4bcHOJTb/hZE`l5m6_SX+'^V7@n]=PP_\$i]OZa6p@Yck12XK/A# +W2HMhUnaZXTV%gHS=?"9R$a2)Q'7AoOcPQ`NJrdQM2@"BL4t;5Jq8H&IsufoH[:!`G^"@TFoQP" +F)l8?E,TW3D/F*)CMIQsBP1phAS#C^raGn:@/aL6?=!P8!F&b,=TV],=8l5%j>k +:]F2f:&doe9)qrg<<-(i8*NMB8*WSA6KUT65hb'>lJ%.?Mn10@/aU4@fBm;AGp'@?!LV4>QA'j;ta2b;u^t=Fo6FXGPZRY +H1$"PH2;dXGPZLXFjkHpFn9_KFo-@YGQ)jeH2N!gHN8HlI0+kIJ,Xs!JV*lR?%dodL51S@M2@+J +N/WaWO-#KeP*;,qQC!u+R[]e:St;RJTq\?YV5L5iWiE,%Xfen4ZEpmF[^N]V\\#Me^;%Fu_SX4/ +`Q#s>aN;TJbg"GYcd:(edaHUoeCE.Lf)aOWrn@D,!8RP/!oDhlrS[_7s5Nt:roF+@qr[n@roj:E +rp'LKqs==LrpK^Qrp]pWr:9jYrq--]rq??cqY:'crqcHfr;?HjnG\"=fDg@~> +JcC<$JcGHDoD\^erquZjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_m*md9B-lg*j#l0.OaA,]pA@:3GL?=$q:>QJ&4r`K;)=',B%!``3!r_rhp!)`\k +s%iYir([/aqVV1GpSHuIr2'%]rM9LiqEjC3rnIG-s5!V0!8me6iO8TjppBn(pp0idqF1; +Ll$tGMic@3hu2L5iW%p9j8S->jnn3> +kPj]Bl2KuIlhg&JmJlVOn,DhUnbhtWoD\CZp&=[ap\Xabq>L0cqu$BirU9`:s4@:$~> +JcC<$JcGHDoD\^erquZjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_m*md9B-lg*j#l0.OaA,]pA@:3GL?=$q:>QJ&4r`K;)=',B%!``3!r_rhp!)`\k +s%iYir([/aqP3q8q0i'dmsG"Zl?i@okX#*=q4[h_!2Jq;eVF)kqF1;Ll$tGMic@3hu2L5iW%p9j8S->jnn3>kPj]Bl2KuIlhg&JmJlVO +n,DhUnbhtWoD\CZp&=[ap\Xabq>L0cqu$BirU9`:s4@:$~> +JcC<$JcGHDoD\^erquZjrqcZjrV-Hgp@eLYs7?<_rpg*[nG_m*md9B-lg*j#l0.OaA,]pA@:3GL?=$q:>QJ&4r`K;)=',B%!``3!r_rhp!)`\k +s%iYir([/ar`&hrm76D1s$uEFqEjC3o2P]hg.CL!rC$KNr'pBMr^cugrE&bpoM,-Vj%]>EqcWr& +r`f8)ra#M0qd9A2raG\5s'u%=r+5k3s',V2?=)Pgp/LofrH8'^pilU[q0D+Kpj)^\oQU1Uq/su) +drkP2q02g_s*=Ngs*F`nrI"`rIt.HJ@Y',_K7ei2Knb>;Ll$tGMic@3hu2L5iW%p9j8S->jnn3>kPj]Bl2KuIlhg&JmJlVOn,DhUnbhtW +oD\CZp&=[ap\Xabq>L0cqu$BirU9`:s4@:$~> +JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?Ebs7?<_rpg9`nF5o8md:#?J*ZCal0..EGB\4Q +FEDSEEH,r9rb``nChmg$BkV0mAnGUcA7K(X@:[1K;>5hY+=BAT'k:Adid9`!Z8V:).>V>*CA62oR:gA'G&gu,X.[JdK3Zi.3.7/KFM7e]FO8GqiIlhJ]ubQ#`] +bO`mOana*X=oMV(>Ph\)?2e1.?iFI4@JjU6A,g*:AcHBBhuMa7ipk:abkBifb&qk*G5-:Z +GklXDHMMj_GkH:XG56:*FOt[3G56@]GlE!dHN/?lI/\QoIK4lsJH(0,JqJ]/KS>/8LPYqd:Pt'h +N/`jYOHG]hPE_>tQ^F/.R[]hVg^;%J"_Sa=2 +`Q-'@ai_fMc-FV\d*^7he,Ii)e^i@(f\+s3g=tB;rn[V2s53h6s5F";r8[h:*fqu-$`JcF=$J,~> +JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?Ebs7?<_rpg9`nF5o8md:#?J*ZCal0..EGB\4Q +FEDSEEH,r9rb``nChmg$BkV0mAnGUcA7K(X@:[1K;>5hY+=BAT'k:Adid9_tORIJJ9gHi8?OHN8Hg6Kpf*T^.EcL]'X<7JfRK8,Z!TXSo3sXSA+LQ0OV0Q2Okb +>5hb'>lJ%.?Mn10@/aU4@fBm;AG]s/8LPYqd:Pt'hN/`jYOHG]hPE_>tQ^F/. +R[]hVg^;%J"_Sa=2`Q-'@ai_fMc-FV\d*^7h +e,Ii)e^i@(f\+s3g=tB;rn[V2s53h6s5F";r8[h:*fqu-$`JcF=$J,~> +JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?Ebs7?<_rpg9`nF5o8md:#?J*ZCal0..EGB\4Q +FEDSEEH,r9rb``nChmg$BkV0mAnGUcA7K(X@:[1K;>5hY+=BAT'k:Adid9`%chnh:%D'E +:&.Q_=oMV(>Ph\)?2e1.?iFI4@JjU6A,g*:AcHBB>6J2:?=.(=<8^^K<;ohrFo?LYGPl^]H/X)F +H2;dYGPcRZFj5$[Fo$:WGQ)jdH2N!gHiJKmIK+`rJ,XuuJI-p\K7no3L5(J>reXF.Mi +JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?BaJ+W@(o()>@nF,i6mHs9,lg!a!ki_*jjlGI^io/hR +hqm2FgtLK8f[na+eC;sqdF$:ccHXSVb/q`Ga2Z*:_ns:+^V@Lr]Xtbc\[T#U[Bm3FZ*:F7XfSS' +Wi2hnV50o^TqS-NSt2C@R[KP0QBd\uP*1ofO,f0XMi*@IL]<)WKnP)1JUi9#IXQWkH?sj]GB\4Q +FEDSEEH,r9DJj<.Chmg$BkV0mB)Z?QA7K(X@:[1K;>5hY*=BGK&s&B%urDW_o!)`\k +s%iYir(R/bqqq%Bs/,[ie"l_)ks>7"rRq&$hR;j[r3ZC.r^?WPqaUr`]>+qcs,+ra,J/s'Yh7r*oY8rabqStD[LU8+N\VPgAlWiN5'Y->.8Za7$I[^WfX]"G\h^V@S$_Sa=2`lH0AaihlO +c-FV\d*^7he'umtf%8O+f\-8X!ScE/h>c=3hu2L5iW%p9j8\3>jo"9?kPscCl2BoHlhg&JmJcPN +n,DhUnb_nVoD\CZp&=[ap\Xaaq>U6cqu-HirU9`:s474#~> +JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?BaJ+W@(o()>@nF,i6mHs9,lg!a!ki_*jjlGI^io/hR +hqm2FgtLK8f[na+eC;sqdF$:ccHXSVb/q`Ga2Z*:_ns:+^V@Lr]Xtbc\[T#U[Bm3FZ*:F7XfSS' +Wi2hnV50o^TqS-NSt2C@R[KP0QBd\uP*1ofO,f0XMi*@IL]<)WKnP)1JUi9#IXQWkH?sj]GB\4Q +FEDSEEH,r9DJj<.Chmg$BkV0mB)Z?QA7K(X@:[1K;>5hY*=BGK&s&B%urDW_o!)`\k +s%iYir(R/bqkNe3s*jinnU0ePomHL#ks=j4lA4)Jr^?WPqaU+qcs,+ra,J/s'Yh7r*oY8rabqlI3i;_d9ir.p;jSn9=k5OQDkkjWClMg,Hm/HDOmecJPnG_tTo)A7[ +o_\=\pAXg`q#1$fqY9sdr;6H]rdk+#s*t~> +JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?BaJ+W@(o()>@nF,i6mHs9,lg!a!ki_*jjlGI^io/hR +hqm2FgtLK8f[na+eC;sqdF$:ccHXSVb/q`Ga2Z*:_ns:+^V@Lr]Xtbc\[T#U[Bm3FZ*:F7XfSS' +Wi2hnV50o^TqS-NSt2C@R[KP0QBd\uP*1ofO,f0XMi*@IL]<)WKnP)1JUi9#IXQWkH?sj]GB\4Q +FEDSEEH,r9DJj<.Chmg$BkV0mB)Z?QA7K(X@:[1K;>5hY*=BGK&s&B%urDW_o!)`\k +s%iYir(R5d+qcs,+ra,J/s'Yh7r*oY8rabq[:WA?=.+:<8^^P<;]\oG5-:ZGku^AHMMj`GkH:X +G5?@)FPM$7G5-:[GlN'eHN/?lI/SKnIK4lsJH(0#K)UB'KSBD[?&+5mM2I4MN/`jYO-#KeP*;/r +QC!u+R[]e:St;RITq\aN;WKbg"GY +cd:(edaQ^qe^i@(f\"mVg&]s`rn[V2!8mb5s5F";rT!q=roO(?roa=Fqs"(Erp0IJrpB^QqsXOR +rpfmVrq$-]qt9s^rqH +JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?BaHh?q$o()>@nF,i6md9B-lg!a!ki_*jjlGI^io/hR +hqm2FgtUQ:f[na+e^W*sdF$=ecHaYWbK@rJa2Z*;`5BI.^q[Xt]Y(kf\[],W[^$Co.!E`G&j:Amoei;MR&VYd4@V"@">5lfL6fDXA$g&Kd][edE([K*`4[/NJj7JfRK8,PpX8HA/Vm.TcC +bQ,oUbk'$Tb595hb'>lJ%.?Mn10@/aU4@fBm;AG]sZaI6M\@K/^]Y(tn +^VRe(_o9U7a2lBFbKJ,ScHjkbdF-LneCE.$f@S[.rn7D-h#?.0h>lI3i;_a9ir.p:jT"?>k5OQD +kkjWDlM^&Gm/HDOmeZDOnG_tTo)A7[o_\=\pAXg_q#:*fqYC$dr;6H^rdk+"s*t~> +JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?BaHh?q$o()>@nF,i6md9B-lg!a!ki_*jjlGI^io/hR +hqm2FgtUQ:f[na+e^W*sdF$=ecHaYWbK@rJa2Z*;`5BI.^q[Xt]Y(kf\[],W[^$Co.!E`G&j:AmoeV#@(WIe8'FI.Tbk62RANT]_."L\$?!L]0^=7JfRK8,PpX8boF_XT+XPQL0t7Pkp[F +=oMV(>Ph\)?2e1.?iFI4@JjU6A,g*:AcHBAB)lWEX8]3ZRJ3*DQN24(GPl^^H.dN@H2DjZGPcR[ +FingcFn^(RGPudcH2N!gHiJKlIK+`rJ,XuuJH1<$K)pXZre:T3Ll$tGMuJZ7NK0']OcklkPa.N" +R$a;1S"-%@StMdNU84T]Vl-JnWiN8(YHY7:Za7'J[^`lY]=bej^V@V%_Sa@3`lH0Bb0.uPc-FY^ +dF$CkeC<%"f%8O+g&B\+gYDeas5!b5rS[_7!93t;roF+@r9""As60@Erp'IJqs==LrpKXOrp]pW +qssaXrq-*\rq??cqY:'crVH?er;?HjnG\"=ec1.~> +JcC<$JcGHDoD\^erVZTjrqcZjrV6Ee!;?BaHh?q$o()>@nF,i6md9B-lg!a!ki_*jjlGI^io/hR +hqm2FgtUQ:f[na+e^W*sdF$=ecHaYWbK@rJa2Z*;`5BI.^q[Xt]Y(kf\[],W[^$Co.!E`G&j:Amoe)r`f8)ra#M0r*TG2raG_6raYt=qdoe>rau4Era,V3!+>P#fM_cn +pilX\qK^b?qg&'`olp:VqK9r&icY!=pNQR\rd"Efs*OcnrI+]p!.Xuus+(0%rdt6)L&Qf1LPUeD +MMqImtQC+&-R[]hai_fMbg"GZd*^7he'umtf%/I)f\-8X!ScE/h>c=3hu2L5i;hm9j8S->jo"9?kPscC +l2KuHlhg&JmJcPMn,DhUnb_nVoD\CZp&=[ap\O[aq>L0cqu$BhrUBf;s4.."~> +JcC<$JcGHDoD\^erVZTjrqcZjrV6Ees7ZHb#P@WZo()>@nG_m+md9B-lg!d"l0.`P]R0_8*h"]tD"i\[f5Z[^EKKZa-g>YHG"/ +X/`.tVl-AeUnXQVTUqaGS=>t8R$X,(P`q8nOH5H_N/W[PM26qAL4t;5Jq8H&+b+rhI=-BfH$FOW +G'.nKF)l8?E,TW3D/F*)CMIQsBP1rVAI;sX@U`bR?sd8I?2e(6>?Y35=]ed-r`9&!!*&nqs&&ho +rD%[f*Vk[edE([f!Q57/B@M7eT@N8H)0\ +mJQ>Flho!%c0`aPbOPqb*?2e1-?iOO5@JjU6A,^$:Ac?G4p.YGlE!cHN/?lI/SKnIK4lsJH(0#K)UC>KS>,7L51S@M2@+J +N/WaVO,oBbP*2#nQ'Rc(R$jD4S=Q7DTV8'SUnjlcVl?\rXKAV.Yd(L?['d?O\@K2_]Y2%o^qmn* +`5T^9aN2KGbKS5VcHjkbdF-LneCE.%f@\d0g=k<:gtgfChV\:i!o`.urT!q=s5j1@roa=Fqs"+F +rp0FIrpB^QqX=FQrpfmVrq$-]qXsj]rqH9arqZNhq>:*fqu-!_JcF:#J,~> +JcC<$JcGHDoD\^erVZTjrqcZjrV6Ees7ZHb#P@WZo()>@nG_m+md9B-lg!d"l0.`P]R0_8*h"]tD"i\[f5Z[^EKKZa-g>YHG"/ +X/`.tVl-AeUnXQVTUqaGS=>t8R$X,(P`q8nOH5H_N/W[PM26qAL4t;5Jq8H&+b+rhI=-BfH$FOW +G'.nKF)l8?E,TW3D/F*)CMIQsBP1rVAI;sX@U`bR?sd8I?2e(6>?Y35=]ed-r`9&!!*&nqs&&ho +rD7JoXK8,Z!X8c#L_ +X8nODQKaY7=oMV(>Pqb*?2e1-?iOO5@JjU6A,^$:Ac?G4p.YGlE!cHN/?lI/SKnIK4lsJH(0#K)UC>KS>,7L51S@M2@+JN/WaVO,oBb +P*2#nQ'Rc(R$jD4S=Q7DTV8'SUnjlcVl?\rXKAV.Yd(L?['d?O\@K2_]Y2%o^qmn*`5T^9aN2KG +bKS5VcHjkbdF-LneCE.%f@\d0g=k<:gtgfChV\:i!o`.urT!q=s5j1@roa=Fqs"+Frp0FIrpB^Q +qX=FQrpfmVrq$-]qXsj]rqH9arqZNhq>:*fqu-!_JcF:#J,~> +JcC<$JcGHDoD\^erVZTjrqcZjrV6Ees7ZHb#P@WZo()>@nG_m+md9B-lg!d"l0.`P]R0_8*h"]tD"i\[f5Z[^EKKZa-g>YHG"/ +X/`.tVl-AeUnXQVTUqaGS=>t8R$X,(P`q8nOH5H_N/W[PM26qAL4t;5Jq8H&+b+rhI=-BfH$FOW +G'.nKF)l8?E,TW3D/F*)CMIQsBP1rVAI;sX@U`bR?sd8I?2e(6>?Y35=]ed-r`9&!!*&nqs&&ho +rDPqb*?2e1-?iOO5@JjU6A,^$:Ac?;LkpnE +MMmFPNK0'\OHG]hPE_>uQ^F/.R[]hkWiE/&Xfnt6ZEppG[^WcW]">Vg^;%J" +_Sa=2`Q-'@ai_fNc-FV\d*^7he'umtf%8O+g"G*5gYCT?h;7#GrSRb9io9pss5a4Ar9""As60@E +rp'LKqX"4KrpKXOrp]pWqssaXrq-'[rq??cqY:'crVH?er;?Hjn,@n +JcC<$JcGKEoD\[drquZjrqcZjrV6Ee!;?Ba#P@WZo()>@nG_m*md9B-lg!d"l0.,Q'@JqOcYWbNf8pTMM[.EL5(D8K7\[SJ/EcbI=6KhH?jaZ +GBS+NFE;JBEH#i6DJa4hCCY)nBP;$jAS#C_@q&nU@/aL6?=!P8!F&b,=oVS(=8l8#<<-"s;Z]io +;>j>j:]F/o:"n@Wh;7&dV=CGXV;A$H6hNe562&n.fDi;1[K!W6[J%'.[JiSk7JfRK8,Z!V8HA,R +li68Jli#&rc1B0VbONaS>5qh(>lJ%.?Mn10@/aU4@fBm;AG]s:*fqu-!_JcF7"J,~> +JcC<$JcGKEoD\[drquZjrqcZjrV6Ee!;?Ba#P@WZo()>@nG_m*md9B-lg!d"l0.,Q'@JqOcYWbNf8pTMM[.EL5(D8K7\[SJ/EcbI=6KhH?jaZ +GBS+NFE;JBEH#i6DJa4hCCY)nBP;$jAS#C_@q&nU@/aL6?=!P8!F&b,=oVS(=8l8#<<-"s;Z]io +;>j>j:]F/o9qS)OTq\=ZIHl:XIH>kVIJlP+6L@)4T`(SFM!p,hM#Kg>7JfRK8,Z!V8c5XgXT,@! +XSnF\Q2m31QLU7>>5qh(>lJ%.?Mn10@/aU4@fBm;AG]s;LPUeDMMmFPNK0$[ +OHG]hPE_>tQC!u,R[]e:St;RITq\ +aN;WKbg"GYcdC.ge'umtf)F8*f\,!4gY:N_h#ZBirSRb9io9pss5a4ArT=+Bs60@Erp'LKqX"4K +rpKXOrp]mVqssaXrq-*\rV$6bqY:'crVH?er;?Hjn,@n +JcC<$JcGKEoD\[drquZjrqcZjrV6Ee!;?Ba#P@WZo()>@nG_m*md9B-lg!d"l0.,Q'@JqOcYWbNf8pTMM[.EL5(D8K7\[SJ/EcbI=6KhH?jaZ +GBS+NFE;JBEH#i6DJa4hCCY)nBP;$jAS#C_@q&nU@/aL6?=!P8!F&b,=oVS(=8l8#<<-"s;Z]io +;>j>j:]F/i:&\#n;cHad7f>jL8GbpS7dieC7fGpR7f>^I6L@)=<;onp<;fbm8``M18c)'X8,bpR +7JfRK8,Z!V8buQg=8Z2!9_hEY:@_3V:@_-Y>5qh(>lJ%.?Mn10@/aU4@fBm;AG]s:*fqu-!_JcF7"J,~> +JcC<$JcGKEo)AUdrquZjrqcZjrV6Ees7ZHb!qc*Urpg*[nG_kWmd:#?Id?:`l0.Oa@q/tW@:9(A!FB(2>QJ&4r`T8'!*B/#s&B%urDW_o +!)`Yjs%iYi"k_M]g=tE^V5hb'>lJ%/?Me+/@/j[4@fKs;AGg$ +k5XWDkks]ElMg,Gm/HDNmecJOnG_tSo)A7[o_\=[pAXg_q#1$fqY9scr;6H]rdk+!s*t~> +JcC<$JcGKEo)AUdrquZjrqcZjrV6Ees7ZHb!qc*Urpg*[nG_kWmd:#?Id?:`l0.Oa@q/tW@:9(A!FB(2>QJ&4r`T8'!*B/#s&B%urDW_o +!)`Yjs%iYirgj1`TV2:4k'm,Sm1s'be6s'u%=r+5k>rb).B!,;A4!3Q'c!L]D=RJN +k5XWDkks]ElMg,Gm/HDNmecJOnG_tSo)A7[o_\=[pAXg_q#1$fqY9scr;6H]rdk+!s*t~> +JcC<$JcGKEo)AUdrquZjrqcZjrV6Ees7ZHb!qc*Urpg*[nG_kWmd:#?Id?:`l0.Oa@q/tW@:9(A!FB(2>QJ&4r`T8'!*B/#s&B%urDW_o +!)`Yjs%iYiqbdJa7Rm8FoLSsOpdY0MoLAXHr'pQNoKr"4o2Pciq+9[=mRd4Fs$Z`QqaUPh\)?2n7.?iFI5@JaO6A,^$:Ac?<@BDcECC&VK>?iXX0 +<7t4JGPl^`H0KVTHg,kRH2Mp\GPlX]FiSUnFnBkLGPl^bH2DpeHiJKlIK+crJ,XuuJH1<$KE$T) +L&Qg4LPUeDMMd=NN/`jYO-#KeP*;,qQ'[l*R@9V8SXuFFTqS3VUnsrdW2ZetXKAY/Yd(L?['mEP +\[f;a]Y2(p^r!t+`5Ta:aN;TJbKS5Vcd:(edaQ^qe^i@(f\-8X!ScE/h#cHjhu;O8iSrkrj8\3? +jo"9@kPj]Cl2KuIlh]uImJZJMn,;bTnbVhUoD\CZp&4U`p\O[`q>U6cqu$BhrU9`:s4%(!~> +JcC<$JcGKEo)AUdrquZjrqcZjrV6Ees7ZHbs7?<_rpkO.nF5o8md9E.m-Es$l0.?ok2tddj5].X +i8EMLh;-l?g=b-1f@JL%eC2jnd*L"_c-4ASb/hZE`l5p8_ns7*^V@Lr]Xtbc\[])V[C!9GZ*:I9 +Xf\\*Wi;qpVPU)`U7n9QSt;LBS!ob4Q^3o$PEM&iO,o<[N/NRMLkl"b+,,B#Jq8H&IsufoI!^0b +G^"@TF`__HEcH)5h\)=9)G%eb@Yl[dLQWZiEMj7JoXL8,PpV8cMEYlMp2M +m/HG2c2>fQbPk`D>lJ%.?Mn10@/aU4@fBm:AGg$=B)ZH@B`;]HC?,9RqTe`Xj37LHr-8-bn9XPM +n9Y"Xr-7pZr-%s[`cUfpolfqNr-83dqKi0grd=Zms*jutrdb$"!.t3&s+CB+re:H/M#N61MMmFP +NK0'\OHG]hPE_>tQC!u+R[]e:SXuIHTqS6WUo(&fW2ckuXf\b1Yd(O@[C3NR\[f>b]Y;.q_8=(- +`Poj +JcC<$JcGKEo)AUdrquZjrqcZjrV6Ees7ZHbs7?<_rpkO.nF5o8md9E.m-Es$l0.?ok2tddj5].X +i8EMLh;-l?g=b-1f@JL%eC2jnd*L"_c-4ASb/hZE`l5p8_ns7*^V@Lr]Xtbc\[])V[C!9GZ*:I9 +Xf\\*Wi;qpVPU)`U7n9QSt;LBS!ob4Q^3o$PEM&iO,o<[N/NRMLkl"b+,,B#Jq8H&IsufoI!^0b +G^"@TF`__HEcH)5h\)=9)G%Pqb*?2e1.?iFI4@JjU6A,^$:AcHBABDcHBB`VtMrN5pbigKY1 +r0RD,r-8-bn9XPMn9Y"Xr-7pZr-%s[`cUfpolfqNr-83dqKi0grd=Zms*jutrdb$"!.t3&s+CB+ +re:H/M#N61MMmFPNK0'\OHG]hPE_>tQC!u+R[]e:SXuIHTqS6WUo(&fW2ckuXf\b1Yd(O@[C3NR +\[f>b]Y;.q_8=(-`Poj +JcC<$JcGKEo)AUdrquZjrqcZjrV6Ees7ZHbs7?<_rpkO.nF5o8md9E.m-Es$l0.?ok2tddj5].X +i8EMLh;-l?g=b-1f@JL%eC2jnd*L"_c-4ASb/hZE`l5p8_ns7*^V@Lr]Xtbc\[])V[C!9GZ*:I9 +Xf\\*Wi;qpVPU)`U7n9QSt;LBS!ob4Q^3o$PEM&iO,o<[N/NRMLkl"b+,,B#Jq8H&IsufoI!^0b +G^"@TF`__HEcH)5h\)=9)G%UF6L[;4Pqb*?2e1.?iFI4@JjU6A,^$:AcHBABDcHBBa/jWiE,%Xfen4Z*UdE[^N]V\\#Me^;%G! +_SX71`Q$!?ai_fNc-FV\d*^7ieC<%"rmq>+g"P07h#?+2hV[5ihu_lsir8! +JcC<$JcGKEo)AUdrVZTjrqcZjrV6Ees7ZHbs7?<_rpgHenF5o8mdBK/m-Es9l$_dYk2tddj5].X +i8EMLh;-l@g=k64f@SR&eC2jndEp4bcHXPUb/q`Ga2Z*;_ns:,^q[Xu]Y(kf\[f2X[^EKKZE^X< +Y-"h-WiE%sVl$;dUS=HUT:VXFS"#k6R$X,(P`q8mOH5H_N/W[PM26qAL4t;5Jq8H&Isufo+aeW_ +H$FOWG'.nKF)l8?E,TW3D/=!'C2.HrBP1pgARo?_#/s&]8&r`9&!!*&nq +s&/korDPqb*?2e1.?iFI4@JjU6A,g*:AcHBABDcHBC&_rJjSn3bl;nc +Gl)dWHKokJHM`!cGkZF[G5HFIFT-@?FS0eMG4KkTGl;paHN/?kI/SKnIfForJH(0#K)UE&KE-`* +L&m'creXd8MitQ^F/.R[]e;St;RITq\NnGVnSo)81Zo_S7[pAOa^q#1$eqYC$dr;6H\rdk*us*t~> +JcC<$JcGKEo)AUdrVZTjrqcZjrV6Ees7ZHbs7?<_rpgHenF5o8mdBK/m-Es9l$_dYk2tddj5].X +i8EMLh;-l@g=k64f@SR&eC2jndEp4bcHXPUb/q`Ga2Z*;_ns:,^q[Xu]Y(kf\[f2X[^EKKZE^X< +Y-"h-WiE%sVl$;dUS=HUT:VXFS"#k6R$X,(P`q8mOH5H_N/W[PM26qAL4t;5Jq8H&Isufo+aeW_ +H$FOWG'.nKF)l8?E,TW3D/=!'C2.HrBP1pgARo?_#/s&]8&r`9&!!*&nq +s&/korDt_TDa63J*qdGI/l\26hE_862mJPTDbGSM>N2,MPqb*?2e1.?iFI4@JjU6A,g*:AcHBABDcHBC&_rGXo4^FRJ<0LQiD:. +Gl)dWHKokJHM`!cGkZF[G5HFIFT-@?FS0eMG4KkTGl;paHN/?kI/SKnIfForJH(0#K)UE&KE-`* +L&m'creXd8MitQ^F/.R[]e;St;RITq\NnGVnSo)81Zo_S7[pAOa^q#1$eqYC$dr;6H\rdk*us*t~> +JcC<$JcGKEo)AUdrVZTjrqcZjrV6Ees7ZHbs7?<_rpgHenF5o8mdBK/m-Es9l$_dYk2tddj5].X +i8EMLh;-l@g=k64f@SR&eC2jndEp4bcHXPUb/q`Ga2Z*;_ns:,^q[Xu]Y(kf\[f2X[^EKKZE^X< +Y-"h-WiE%sVl$;dUS=HUT:VXFS"#k6R$X,(P`q8mOH5H_N/W[PM26qAL4t;5Jq8H&Isufo+aeW_ +H$FOWG'.nKF)l8?E,TW3D/=!'C2.HrBP1pgARo?_#/s&]8&r`9&!!*&nq +s&/korDrb).Brb;CIs'Yk8!+Pn,r)DVg +^;%J"_Sa=2`Q-'@aihlOc-FV]dF$CkeC<%"f@S[.rn7S2gtgfChV\=j!o`.uro=%>s5j4As6'FG +qs".Grp0FIrpB^Qq="=PrUKdUrU^$\qXsj]rV-0`rV?Egq>:*fqu,s^JcF4!J,~> +JcC<$JcGKEo)AUdrVZTjrqcZjrV6Ees7ZHbs7?<_rpp*Z!:^!VI.$Cgm-F!&l07Epk2tddj5].Y +iS`YOh;-l@g=k64f@SU(eC;sqdF$=dcHXSVbK@rJaN)<>`5BI/_8*h#]tD"i]",>[[^NTNZa-j? +Ycb+1XK&;"W2HMhUnaZXTq@pJS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5$q,KS+l-J:N,uI=6Ki +H?jaZGBS+NFE;JBEH#i6DJa3*CMIS_BE`$\AS#C^raH(??sd8I?=!P8!F&b,=TV],=8l8#<<-"s +;u]bq;>j;k:]8uBVY-k[VWalOU]lJ%.?Mn10@/j[4@fKs;AGg$tQC!u+R@9V8SXuFGTqS3UUnsrdW2ZetXKAY/Yd(L?['d?O\@K2_ +]Y2%o^qmn*`5Ta:aN2NIbKS5Vcd:(edaQ^qe^i@(f\,!4gYDea!T)`5hu_lsir8!NmeZDNnGVnRo)A7Zo_S7[pAOa^q#1$eqY9scr;6H]rdk*ts*t~> +JcC<$JcGKEo)AUdrVZTjrqcZjrV6Ees7ZHbs7?<_rpp*Z!:^!VI.$Cgm-F!&l07Epk2tddj5].Y +iS`YOh;-l@g=k64f@SU(eC;sqdF$=dcHXSVbK@rJaN)<>`5BI/_8*h#]tD"i]",>[[^NTNZa-j? +Ycb+1XK&;"W2HMhUnaZXTq@pJS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5$q,KS+l-J:N,uI=6Ki +H?jaZGBS+NFE;JBEH#i6DJa3*CMIS_BE`$\AS#C^raH(??sd8I?=!P8!F&b,=TV],=8l8#<<-"s +;u]bq;>j;k:]6p]IeA3ZIcYtX7/0.B6L[;9TDbGRM>N2%M=-2pM#]s@7JfRL8,PpV8c23ZWr8t% +XKAV-Y-7VeqNgN6m$@ZUr*95,ra,M0ra>b7qdTS8rabq;pN?4RnTXnUrH\6crd4Zmr-eTos*suts+(0%re(6(!/:E, +@u#krM2@+JMiaND]Lbg"GZd*^7he'umtf%8O+g"P07h#?+1hV\=j!o`.uro=%>s5j7B +roa=Fr9=7Hrp0IJrU'UPqX=CPrUKaTrq$*\qXsj]rV-0`rV?Egq"t!equ-!_JcF0uJ,~> +JcC<$JcGKEo)AUdrVZTjrqcZjrV6Ees7ZHbs7?<_rpp*Z!:^!VI.$Cgm-F!&l07Epk2tddj5].Y +iS`YOh;-l@g=k64f@SU(eC;sqdF$=dcHXSVbK@rJaN)<>`5BI/_8*h#]tD"i]",>[[^NTNZa-j? +Ycb+1XK&;"W2HMhUnaZXTq@pJS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5$q,KS+l-J:N,uI=6Ki +H?jaZGBS+NFE;JBEH#i6DJa3*CMIS_BE`$\AS#C^raH(??sd8I?=!P8!F&b,=TV],=8l8#<<-"s +;u]bq;>j;k:]45f7eK:?7cd,?7/0.B6L[;5\b8``M18cM<]7/KFM7efLO8Gu-X9)2Ng=Su7j +:@1dO:@q9\>Pqb*?2e1.?iFI5@JaO6A,^$:Ac?<@BDcHCC&VlIC]7`C@TE)#h,=;Qr-8-bo6TPG +np:4Zr-7s[r-&!\m<&&Cj`L6>pNH(Nr-80cqKi-fs*X`ms*jutrIFp!!.t3&s+CB+re=p +JcC<$JcGKEo)AUdrVZQis8)ckr:g?fp@eIX!qc*Urpg*[nG_kWmd:#?J*ZCal0.[[^NTMZa-j? +YHG"0XK&;"W2HMhUnaZXTV%gIS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5(D8K7\Z)J/j&fI=6Kh +H?jaZGBS+NFE;JBEH#i6DJa3*CMIS_BE`$\AS#C^raH7D?sd8I??b;1=TV],=8l8#j>jfDsY!VY-k\VWXfRV#<^W6hE_962f=.ea^-2[e@-(ZiEMk7JoXL8,PpV8c23\m/HDP +mf2bUn,i.No'aj#cLfBSbk]E^>Pqb*?2e1.?iFI5@JaO6A,^$:Ac?<@BDcHCC&VlHC]*5fblH&_ +c/m1JGl2jYHK9GEHMi'dGkcL\G5HFOFRO;9FSBqQG4KkTGl2j`HN&9jI/JEmIfForJ-(:RK)UE& +KE-`*L'rcmLl$tGMMmFPNK4"!?]^D5P*;,qQ'Rf)R@9V7S=Q7DTV8'SUnjibVl6VqX0&M,YctC= +Za@0L\%0&\]Y(qm^VI_'_o0O6a2lBFbKJ/UcHjkbdaQ^qe^i@(f\,!4gYCT?h;7&Hi8ESQir8!< +j8e +JcC<$JcGKEo)AUdrVZQis8)ckr:g?fp@eIX!qc*Urpg*[nG_kWmd:#?J*ZCal0.[[^NTMZa-j? +YHG"0XK&;"W2HMhUnaZXTV%gIS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5(D8K7\Z)J/j&fI=6Kh +H?jaZGBS+NFE;JBEH#i6DJa3*CMIS_BE`$\AS#C^raH7D?sd8I??b;1=TV],=8l8#j>jT)bPXIeA3ZId):Z7/94B6LmG;TDbGPM>N1`M#]s@7JoXL8,PpV8c23\X8]4#Xo5F& +Y5kg+R/30@QLL10Q2k.e>lJ%.?Mn10@/j[4@fKs;AGg$ai_fMc-FV\d*^:jeC<%"f@S[.g=k<:gtgfChr!AMiSieqj8\0?jo+?A +kPscDl2U&Jlhg&JmJZJLn,;bTnbMbToDS=Xp&4U`p\FU_q>L0bqu$BhrU9`:s3^js~> +JcC<$JcGKEo)AUdrVZQis8)ckr:g?fp@eIX!qc*Urpg*[nG_kWmd:#?J*ZCal0.[[^NTMZa-j? +YHG"0XK&;"W2HMhUnaZXTV%gIS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5(D8K7\Z)J/j&fI=6Kh +H?jaZGBS+NFE;JBEH#i6DJa3*CMIS_BE`$\AS#C^raH7D?sd8I??b;1=TV],=8l8#j>j;ZKej7eK:B7cm5>7/94B6LmG7lJ%.?Mn10@/j[4@fKs;AGg$H1Q@CHh2R] +H2Mp^GPlX]FmsMAF6[lAFng.NGPl^`H2;jdHiAEjIK+crJ,Om!JV&LQKE$T)L&Qf7LPUbCM2I1K +N/WaVrf:EJOcklkPa.N"R$a;1S"#q=StD[LTqeEZV5L5iWiE,%Xfen4Z*UdD[^NZU\[oGd]t_=t +_SX4/`Q#s>ai_fMc-FV\d*^:jeC<%"f@S[.g=k<:gtgfChr!AMiSieqj8\0?jo+?AkPscDl2U&J +lhg&JmJZJLn,;bTnbMbToDS=Xp&4U`p\FU_q>L0bqu$BhrU9`:s3^js~> +JcC<$JcGKEo)AUdrVZQis8)ckr:g?fp@eIX!qc*Urpg*[nG_k\md9E.m-Es9l$qp[k2tddj5].X +i8EMLh;-l@g=k64f@SU(eC;sqdF$=ecHa\YbK@rJaN)<>`Pf[2_SO"%^:h1l]=PP_\$i`QZa6sB +Yck43XfJJ%WMcYkV50l\TqJ$LSt):>R[BJ/QBd\uP*(ieO,]*WMi*@ILPCP;KS+l-J:N,uI=3er +H?sj]GB\4QFEDSEEH,r9DJj<-CMR[!BP;$jAn>Oa@q&nU@:3GL?[(E9r`K;)=',B%s&K(u +r_rhps&&bls4IA)oVV8YpSR)Ls.oQ\q*Xd@o0NE,s4$kpqmYk#n[JD(qR-7.!(?ZPr'pENrCHiX +qapkWrp]sXs7-1s'be6s'u%=r+5k>s(D7Crb;@Hr+l8k +lcnS9s*4EdoQoJCoQpF\r-8!\r-&!\noX,;m<&,Gq0)@Rr-8-bq0N$erd=Wls*jutrIFp!s+:6& +s+CB+re=s=LkpnEMMd=NN/`gWO,oBbP*2#nQ'IZ%R$a;1S"-%@StD[LU8+N[VPg>kWiE,%Xfen4 +Z*UdD[^NZU\[oGd]t_=t_SX40`Q$!?ai_fNc-FV\dF$CkeC<%"f@S[.g=k<:rnRV3hu;O7iSsjs +s5a4AroX7Ds60CFs6BULr9XCLrpKXOrUBdUqXXUVrUfsZrq? +JcC<$JcGKEo)AUdrVZQis8)ckr:g?fp@eIX!qc*Urpg*[nG_k\md9E.m-Es9l$qp[k2tddj5].X +i8EMLh;-l@g=k64f@SU(eC;sqdF$=ecHa\YbK@rJaN)<>`Pf[2_SO"%^:h1l]=PP_\$i`QZa6sB +Yck43XfJJ%WMcYkV50l\TqJ$LSt):>R[BJ/QBd\uP*(ieO,]*WMi*@ILPCP;KS+l-J:N,uI=3er +H?sj]GB\4QFEDSEEH,r9DJj<-CMR[!BP;$jAn>Oa@q&nU@:3GL?[(E9r`K;)=',B%s&K(u +r_rhps&&bls.B=aoR?.VpO;IWr'^?JoKr.8qOd\YqhaTqhh_>$qF11s'be6s'u%=r+5k>s(D7Crb;@Hr+l85fU;Q&s*4Ed +oQoJCoQpF\r-8!\r-&!\noX,;m<&,Gq0)@Rr-8-bq0N$erd=Wls*jutrIFp!s+:6&s+CB+re=s= +LkpnEMMd=NN/`gWO,oBbP*2#nQ'IZ%R$a;1S"-%@StD[LU8+N[VPg>kWiE,%Xfen4Z*UdD[^NZU +\[oGd]t_=t_SX40`Q$!?ai_fNc-FV\dF$CkeC<%"f@S[.g=k<:rnRV3hu;O7iSsjss5a4AroX7D +s60CFs6BULr9XCLrpKXOrUBdUqXXUVrUfsZrq? +JcC<$JcGKEo)AUdrVZQis8)ckr:g?fp@eIX!qc*Urpg*[nG_k\md9E.m-Es9l$qp[k2tddj5].X +i8EMLh;-l@g=k64f@SU(eC;sqdF$=ecHa\YbK@rJaN)<>`Pf[2_SO"%^:h1l]=PP_\$i`QZa6sB +Yck43XfJJ%WMcYkV50l\TqJ$LSt):>R[BJ/QBd\uP*(ieO,]*WMi*@ILPCP;KS+l-J:N,uI=3er +H?sj]GB\4QFEDSEEH,r9DJj<-CMR[!BP;$jAn>Oa@q&nU@:3GL?[(E9r`K;)=',B%s&K(u +r_rhps&&bls&8qsoL@(qr'^?JoKr.8oi:WVnO`IGqap6I!(?ZPr'pENrCHiXqb$K_k>(;:r_EAc +r*95,s'GS0ra>b7qdTS8rabqqg%g[iHt3Cr-A3bpilXZ +r,qRPl#Z66piZCUo6:+Wr-A*ard4Wlr-eTos*suts+13%re(6(!/:E,A;>tsM2@+IMitQC!u+R@9V8SXuFFTV8*TUnjlcVl?\rX0&M,YctC=Za@0L\%0&\]Y(qm^VI_'_o9U7 +aN2KGbKS5VcHjncdaQ^qe^i@(f\,!4gYDea!T)`5huVfrro=%>s5j7Bs6'FGr9=7Hrp0LKrU'UP +qX=CPrUKaTrU^![qXsj]rV--_rV?Egq"t!equ,s^JcF-tJ,~> +JcC<$JcGKEo)AUdrVZQis8)`jrV6Ee!;?Ba!qc*UrpkL-nF5o8mdBK/m-Es%l07Epk2tddjQ#:[ +iS`YOhVI#CgY1B7f[na+e^W*tda?Ihcd'eZbKJ&MaN2EA`Pod5_SX+'^V7Co]Xt_b\@8oT['R*E +Z*:F7Xf\Y(Wi;noVPU)`U7n6PSt;IAS!o_3Q^3o$PEM&iO,o9ZN%U$GM26qAL4t;5Jq8H&Isufo +H[:!`G^"@TF`__HEcH)[1K;>5hY+=BAT'tQC!u+R@9V7S=Q7DTV8'RUnjiaVl6SpX/rG*YHY7:Za7'J +[^`lY]=bej^V@V%_SjF4a2l?DbKJ,ScHjkbdF-LneCE1&f\-8X"l%hgh;7&ghu_lsir7s>jQ5M& +k5XWEkl'cFlMp2Im/HDOmeZDNnG_tRo)81Yo_S7ZpAOa]q#:*eqY9scr;6H\rdk*rs*t~> +JcC<$JcGKEo)AUdrVZQis8)`jrV6Ee!;?Ba!qc*UrpkL-nF5o8mdBK/m-Es%l07Epk2tddjQ#:[ +iS`YOhVI#CgY1B7f[na+e^W*tda?Ihcd'eZbKJ&MaN2EA`Pod5_SX+'^V7Co]Xt_b\@8oT['R*E +Z*:F7Xf\Y(Wi;noVPU)`U7n6PSt;IAS!o_3Q^3o$PEM&iO,o9ZN%U$GM26qAL4t;5Jq8H&Isufo +H[:!`G^"@TF`__HEcH)[1K;>5hY+=BAT'``pP8f;qaLBOpdb6QrCQiXril@+s0D[2 +s0VfnpQtK;ns0$:q3V%bs'>V1qd9A2raG_6raYqs(D4Bs(VIIr+c:KrN4_?pmCu)oQp+U +qL%p^oQpF\r-8!\rHA*]o5s)8mr\AJqKDISr-8-bq0N$erd=Wls*jrsrIFp!!.t0%!ec8]re=g9 +LkpnEMMd=NN/`gWO,oBbP*2#nQ'IZ%R$a;1S"#q=StD[LTq\?YV5C/hWN*##Xf\e2Yd1UA[C3NR +\[f>b]Y;.q_8=(-`Pom=aN;WKbg"GZd*^7he'umtf@S[.rn7P1gtgfChu;O8iSrkrir\<'jo4EB +kPscEl2KuJlhg&JmJcPMn,;bTnbMbSoDS=Xp&4U_p\FU`q>C*aqu$BhrU0Z9s3Udr~> +JcC<$JcGKEo)AUdrVZQis8)`jrV6Ee!;?Ba!qc*UrpkL-nF5o8mdBK/m-Es%l07Epk2tddjQ#:[ +iS`YOhVI#CgY1B7f[na+e^W*tda?Ihcd'eZbKJ&MaN2EA`Pod5_SX+'^V7Co]Xt_b\@8oT['R*E +Z*:F7Xf\Y(Wi;noVPU)`U7n6PSt;IAS!o_3Q^3o$PEM&iO,o9ZN%U$GM26qAL4t;5Jq8H&Isufo +H[:!`G^"@TF`__HEcH)[1K;>5hY+=BAT'3OqaLBOpdb6QrCQiXqH3`"r`J>Yl:q(L +rETA.ra,J/s'Yh7r*oY8rabqtQC!u+R@9V7S=Q7DTV8'RUnjiaVl6SpX/rG*YHY7:Za7'J[^`lY]=bej^V@V% +_SjF4a2l?DbKJ,ScHjkbdF-LneCE1&f\-8X"l%hgh;7&ghu_lsir7s>jQ5M&k5XWEkl'cFlMp2I +m/HDOmeZDNnG_tRo)81Yo_S7ZpAOa]q#:*eqY9scr;6H\rdk*rs*t~> +JcC<$JcGKEo)AUdrVZQis8)`jrV6Ees7ZHbs7?<_rpp*Z!:^!V!Uf@Slk\pPl07EpkN:pgjQ#:[ +iS`YOhVI#Cg]#oUg"=p.f$r3uda?Ihcd'h\bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(ke\[],W[^EHJ +ZE^X;Y-"h,WiE%rVl$;dUS=HTT:VXES"#k6R$X,(P`q8mOH5H^N/W[PM26qAL4t;5Jq8H&Isufo +H[:!`G^"@TF`__HEcH)?_#/!a&N*r`9&! +s&Aqqs&&tsf%/I)qPN\YnttZJq*b!FoKr7;qpbMne[YOdr3lF/!(?]QqaU?Nr(-cXq+:\[p&=Xh +p\=R[qYL*Xc1TBUc1&sV>lJ%/?Me+0@/aU4@fBm:AGg$aND]Lbg+M[d*^7ieC<%"f@S[.g=k<:h;-rEhr*GOiSsjs!p&J) +roX7Ds60FGs6BXMqs=@MrU0ONrp]mVq==LUrUfpYrV$3aq=sparVH +JcC<$JcGKEo)AUdrVZQis8)`jrV6Ees7ZHbs7?<_rpp*Z!:^!V!Uf@Slk\pPl07EpkN:pgjQ#:[ +iS`YOhVI#Cg]#oUg"=p.f$r3uda?Ihcd'h\bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(ke\[],W[^EHJ +ZE^X;Y-"h,WiE%rVl$;dUS=HTT:VXES"#k6R$X,(P`q8mOH5H^N/W[PM26qAL4t;5Jq8H&Isufo +H[:!`G^"@TF`__HEcH)?_#/!a&N*r`9&! +s&Aqqs&&horLW8'q1/*eqgS-bq*b!FoKr7;qk*bYd>IgXq1o#=qaLBOpdb6QrCQfWrNcI0rj;^5 +!4Mlop6Y<8op,B>pm:tbra#P1qd9A2raG_6raYqs(D7Crb;@Hr+l:Js/c=)R+Ri&R/M=& +HM)XXI._jZHMi'eGkcL\G5QLTFQ7H3FS^.VG4g(WGl2j_HMr3iI/JEmIf=iqJH(3#K)UE&K`?c* +L'NKiLl$tGMMqImA;uV1O-#KdP*2#nQ'IZ%R$a;1S"-%@StD[LU8+N[V5L5iWN*##Xfek3Z*L^C +[C3QS\[oDc]tV7s_8=+.`Q#s>aND]Lbg+M[d*^7ieC<%"f@S[.g=k<:h;-rEhr*GOiSsjs!p&J) +roX7Ds60FGs6BXMqs=@MrU0ONrp]mVq==LUrUfpYrV$3aq=sparVH +JcC<$JcGKEo)AUdrVZQis8)`jrV6Ees7ZHbs7?<_rpp*Z!:^!V!Uf@Slk\pPl07EpkN:pgjQ#:[ +iS`YOhVI#Cg]#oUg"=p.f$r3uda?Ihcd'h\bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(ke\[],W[^EHJ +ZE^X;Y-"h,WiE%rVl$;dUS=HTT:VXES"#k6R$X,(P`q8mOH5H^N/W[PM26qAL4t;5Jq8H&Isufo +H[:!`G^"@TF`__HEcH)?_#/!a&N*r`9&! +s&Aqqs&&horDNJ]a%,qnpd=[?p-J@Ope'73qagNQ!(?]QqaU?Nr(-cXq+C<_s%h`OmS3IOr`oG. +s'GS0s'Yh7r*oY8rabqkN+@p.O,oBb +OcklkPa.N"Q^F/.R[]hL0bqtp +JcC<$JcGKEo)AUdrVZQirqcZjrV6Ees7ZHbs7H?_s763[!:^!V#4CmGm-O''rojUMkN:pgjSn1h +io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI.^q[Xu]tD"i\[f5Z[^NQL +Za-j?YHG"0X/`2!Vl-DgUnaZXTV%gIS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5(D8K7\Z)J:E#r +I=$9dH$FOW'm=_AFE;JBEH#i6DJa3*CMIQsBP1rVAIrB^@U`bR?sd8I?!U]?>?b;1=oVS(=8l8# +[:b7/94@6MWq?eC;#*\,<]3[JNDi7e]FO8Gu-U9)hNcpA"F^q>U6l +r;H*/n]psTn]_#kMueourf:6EOcklkPa.N"Q^F/.R[]e:SXuFGTqS3UUnsrdVl?\rX0&M,YctCC*aqtp +JcC<$JcGKEo)AUdrVZQirqcZjrV6Ees7ZHbs7H?_s763[!:^!V#4CmGm-O''rojUMkN:pgjSn1h +io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI.^q[Xu]tD"i\[f5Z[^NQL +Za-j?YHG"0X/`2!Vl-DgUnaZXTV%gIS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5(D8K7\Z)J:E#r +I=$9dH$FOW'm=_AFE;JBEH#i6DJa3*CMIQsBP1rVAIrB^@U`bR?sd8I?!U]?>?b;1=oVS(=8l8# +61pl+MY)btM#0X<7e]FO8Gu-U9)hNaZM_*/[flJ%/?Me+0@/aU4@fBm:AGg$=B)ZH@B`;`FCA_lHC]J>OY5XgARJNtQC!u+R@9V7S=Q7CTV8'RUSO``Vl-MoWiN8(Y->.8ZEppG[^WcW +]">Vg^;%J"_Sa=2`lH0Bb0.uQcHab_dF-LneCE.%f@\d1g=tE=h;7&ghuVfrro=%>!9O4Bs6'FG +rTX@Is6KULrpB^QqX=FQrUK^SrU^![q=X^[rV--_rV?Bfq"ssdqu,s^JcF'rJ,~> +JcC<$JcGKEo)AUdrVZQirqcZjrV6Ees7ZHbs7H?_s763[!:^!V#4CmGm-O''rojUMkN:pgjSn1h +io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI.^q[Xu]tD"i\[f5Z[^NQL +Za-j?YHG"0X/`2!Vl-DgUnaZXTV%gIS=?":R$a5+Q'@JqOcYWbNf8pTMM[.EL5(D8K7\Z)J:E#r +I=$9dH$FOW'm=_AFE;JBEH#i6DJa3*CMIQsBP1rVAIrB^@U`bR?sd8I?!U]?>?b;1=oVS(=8l8# +mu4<:NoW<;q18HM2^UI.r!\HMi'eGkcL\ +G5ZRUFQ.B3FS^.WG4g(WGl2j_HN&9jI/A?kIfForJH(3#K)L?%KE-`)L'NKiLl$tGMMqIm!KE-= +O'7X-P*2#nQ'IZ%R$a;1S"#q=St;UKTq\Xcd:(fe'umtf%8O+g"P07gtgfChu;O7iSsjss5X1AroX7Ds60FGs6BXMr9XFM +rpKXOrp]mVq==LUrUfpYrV$3aq=spar;-3cqu$?imf%e;ci8L~> +JcC<$JcGKEo)AUdrVZQirqcZjrV6Ees7ZEa!qc*UrpgWjnF5o8mdBK/m-F!&l07EproS[kjQ#:[ +iS`YOhVR)EgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xu]tD"h\[f5Z[^NQL +Za-j?YHG"0X/`2!Vl-DgUnaZXTV%gHS=?"9R$a5*Q'@JqOcYWbNJrgSMM[.EL5(D8K7\Z)J:E#r +I!bm>/U;SbGBS+NFE;JBEH#i6DJa3*CMIQsBP1pgARo=]@U`bR?sd8I?!U]?>?b;1=oVS(=8c/$ +rG5MuJY9NK4"!"d"k0P*;.0PtdR2R$a;1S"-%@StD[LTqeEZV5C/hWN)u"Xf\e2Yd(O@ +['mEP\[f;a]Y2(p^r!t+`Poj;aN;TJbg"GYcdC.ge'umtf@S[.g=k<:rnRt=hr*GOio9"YjQ,G% +k5XWEkl'cGlMp2Jm/QJPmecJOnGVnQo)81Yo_J1YpAF[\q#1$eqY0mbr;-B[rdk*ps*t~> +JcC<$JcGKEo)AUdrVZQirqcZjrV6Ees7ZEa!qc*UrpgWjnF5o8mdBK/m-F!&l07EproS[kjQ#:[ +iS`YOhVR)EgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xu]tD"h\[f5Z[^NQL +Za-j?YHG"0X/`2!Vl-DgUnaZXTV%gHS=?"9R$a5*Q'@JqOcYWbNJrgSMM[.EL5(D8K7\Z)J:E#r +I!bm>/U;SbGBS+NFE;JBEH#i6DJa3*CMIQsBP1pgARo=]@U`bR?sd8I?!U]?>?b;1=oVS(=8c/$ +rG5MuJY9NK4"!"d"k0P*;.0PtdR2R$a;1S"-%@StD[LTqeEZV5C/hWN)u"Xf\e2Yd(O@ +['mEP\[f;a]Y2(p^r!t+`Poj;aN;TJbg"GYcdC.ge'umtf@S[.g=k<:rnRt=hr*GOio9"YjQ,G% +k5XWEkl'cGlMp2Jm/QJPmecJOnGVnQo)81Yo_J1YpAF[\q#1$eqY0mbr;-B[rdk*ps*t~> +JcC<$JcGKEo)AUdrVZQirqcZjrV6Ees7ZEa!qc*UrpgWjnF5o8mdBK/m-F!&l07EproS[kjQ#:[ +iS`YOhVR)EgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xu]tD"h\[f5Z[^NQL +Za-j?YHG"0X/`2!Vl-DgUnaZXTV%gHS=?"9R$a5*Q'@JqOcYWbNJrgSMM[.EL5(D8K7\Z)J:E#r +I!bm>/U;SbGBS+NFE;JBEH#i6DJa3*CMIQsBP1pgARo=]@U`bR?sd8I?!U]?>?b;1=oVS(=8c/$ +5qJ!;"mcF +:B!u`:B+Su?2n7.?iOO5@JjU6A,^$:AcHBABDcHBC&_rFC]A5MD#eJQ@I@+e;t*cdH1cLXHgH.T +HhMd`H2Mp_GPu^_FnKkLF89kJF7XMNFo-@UGPl^aH22dbHiAEiIK"]qJ,FisJcC?$KE$W)L&Qi, +LB*/0M>rG5MuJY9NK4"!"d"k0P*;.0PtdR2R$a;1S"-%@StD[LTqeEZV5C/hWN)u"Xf\e2Yd(O@ +['mEP\[f;a]Y2(p^r!t+`Poj;aN;TJbg"GYcdC.ge'umtf@S[.g=k<:rnRt=hr*GOio9"YjQ,G% +k5XWEkl'cGlMp2Jm/QJPmecJOnGVnQo)81Yo_J1YpAF[\q#1$eqY0mbr;-B[rdk*ps*t~> +JcC<$JcGKEo)ARcrquZjrqcZjrV6Ees7ZEa!qc*Urpg-\nF6GG!Uf@SliHG;rojUMkN:pgjSn1g +io/hRhqm2FgtUQ:g"=s/f@JL%eC2jndEp4bcHXSVbK@rJaN)<>`P]R0_8*h#^:h1l]=GJ^\$i`P +Za6sBYck43XfJJ%WMcYkV50l\TqJ$LSXc1=R@'A.Q'IStP*(ieO,]*WMi*@ILPCP;K7ec,J:N,u +I=-BfH?jc8G91pMFEDSEEH,r9DJj<-CMR[!BP;$jAS#C^@q&nU@/aL6?=!P8s'#J,r`T8'!*B," +!``3!rDWaIoqq#Po;;A\pnn'[oL/IAmR$Wsk.'igrj_[2s0henqaUb7qdTS8rabq!."6` +pNu1Qpj;^\rH\L0aqtp +JcC<$JcGKEo)ARcrquZjrqcZjrV6Ees7ZEa!qc*Urpg-\nF6GG!Uf@SliHG;rojUMkN:pgjSn1g +io/hRhqm2FgtUQ:g"=s/f@JL%eC2jndEp4bcHXSVbK@rJaN)<>`P]R0_8*h#^:h1l]=GJ^\$i`P +Za6sBYck43XfJJ%WMcYkV50l\TqJ$LSXc1=R@'A.Q'IStP*(ieO,]*WMi*@ILPCP;K7ec,J:N,u +I=-BfH?jc8G91pMFEDSEEH,r9DJj<-CMR[!BP;$jAS#C^@q&nU@/aL6?=!P8s'#J,r`T8'!*B," +!``3!rDN`hT&tP%JFJ'WIfDk/7/0.;6M@&7Mu&=uM>2o(7JfRK8,Z!W8bl!X9)u?t[0O.J[C3KN +R@3ls(D7Crb;@Hr+l:Js)%dRriZ0dgR7r+!."6` +pNu1Qpj;^\rH\L0aqtp +JcC<$JcGKEo)ARcrquZjrqcZjrV6Ees7ZEa!qc*Urpg-\nF6GG!Uf@SliHG;rojUMkN:pgjSn1g +io/hRhqm2FgtUQ:g"=s/f@JL%eC2jndEp4bcHXSVbK@rJaN)<>`P]R0_8*h#^:h1l]=GJ^\$i`P +Za6sBYck43XfJJ%WMcYkV50l\TqJ$LSXc1=R@'A.Q'IStP*(ieO,]*WMi*@ILPCP;K7ec,J:N,u +I=-BfH?jc8G91pMFEDSEEH,r9DJj<-CMR[!BP;$jAS#C^@q&nU@/aL6?=!P8s'#J,r`T8'!*B," +!``3!r)3Snr'gHOmmm%?l::kCoL/IAmR$VHk"4K%s$urTqaUb7qdTS8rabqL0aqtp +JcC<$JcGKEo)ARcrquWis8)ckr:pKnG#0JUi9# +IXQTjH?sj]GB\4QFEDSEEH#jqDA$f&CMR[!BP;$jAS#C^@q&nU@/aL[(E9r`T8's&]2# +s&K(us&/sLfCPm*VrafS7J'"B6h!G>ebmqY\F$d)\G!E/7JoXL8,PpV8bl!X9DSDdq>0p4e]md2 +ra#M0r*TG2s'be6s'u%=r+5k>s(D4Bs(VIIr+l:Jrb_XPs5X"#n'1(?!."6`pj;4Pq0Vg]rH\Vg^;%J"_SX71`Q-'@aihlOc-FY^dF$FmeCE.%f@\d1g=tE=h;7&Ii8N\Tj5]4]jo4BDkNM./ +l2U&Klhp,LmJcPNn,DhUnbMbSoDJ7Up&4U_p\=O^q>C*`qu$BgrU0Z9s31Ln~> +JcC<$JcGKEo)ARcrquWis8)ckr:pKnG#0JUi9# +IXQTjH?sj]GB\4QFEDSEEH#jqDA$f&CMR[!BP;$jAS#C^@q&nU@/aL[(E9r`T8's&]2# +s&K(us&8rik'mA]m=4YTrC-?HpI"F:qk3kZ!/frtq24Tsq2"o:r'pENr(-cXq+CWZq6^1.!OA-f +R.ls8QN*nGQY5=U@RJ`EPH1cLY +Hg#kQHhMdaH2Mp_GPu^`FnTqQF6mrBF7jYQFo6FWGPudbH22dcHi8?hIK+cqJ,FisJcC?#KE$W) +L&Qi,L]<20M#rQmMuJY9NK4"!!K`HCP$sQ=Q'IZ%R$a;1S"#q=St;RITqS3UUnsrdVl?\rX0&M, +YHY:;Za@-K\%&u[]=bhk^VI\&_SjF4a2l?DbKJ,ScHjkbdF6Upe^i@(f\,!4gYCW@hV[8LiSrkW +j5f:_roO:Fkii$1s6BXMr9XINrpK[Prp]pWq==LUr:KdWrV$3aq"Xg`r;-0br;?Eimf%e;bl<1~> +JcC<$JcGKEo)ARcrquWis8)ckr:pKnG#0JUi9# +IXQTjH?sj]GB\4QFEDSEEH#jqDA$f&CMR[!BP;$jAS#C^@q&nU@/aL[(E9r`T8's&]2# +s&K(urDWS^q*ssGnj_t9rC-?HpI"F:s&8\lj[n?#qaLEPpIG-PrCQfWr_*2ms&f2#!)`,[p.smI +ra#M0r*TG2s'be6s'u%=r+5k>s(D4Bs(VIIr+l:Jrb_XPs'k=opf$T[!."6`pj;4Pq0Vg]rH\Vg^;%J"_SX71`Q-'@aihlOc-FY^dF$FmeCE.%f@\d1g=tE=h;7&Ii8N\Tj5]4]jo4BDkNM./ +l2U&Klhp,LmJcPNn,DhUnbMbSoDJ7Up&4U_p\=O^q>C*`qu$BgrU0Z9s31Ln~> +JcC<$JcGHDoD\[drVZQis8)`jrV6Ees7ZHbs7H?_rpg_%PbKJ&MaN2E@`Pf[2_SO%&^V7Co]XkYa\@8oT +['R*EZ*:F7Xf\Y(Wi;noVPU)`U7n6PSt2C@S!fY2Q^*i#PEM&iO,o9ZN/NRMLkg_>KnG#0JUi9# +IXQTjH?sj]GB\4QFE;JBEH#i6DJa4hCCY)nBP;$jAS#C^@q&nU@/aL[(E9r`T8's&]2# +s&K(u!`Rb(oqprNk,/&Fo0i=?nO!6+qUP,HoXO:trj_s:!4_p8r'gKPpIG0QrCQfWrC[,aqYC0d +!;H96gs,Q:s'>V1r*TG2s'be6s'u%=r+5k>s(D4Bs(VIIr+l:Jrb_UOs5a""n]g:Ap3QL\k'ZuO +p3Q[_rHS-^r-&$]pN67Ql#QT@olU+SrH@s[rHS9dq0N$erd=TkrdOirr.+fus+:3%s+LE+rJ(?- +!/UW2s,$f7rf$l:!07&>!K`HCOp.&6Q'IZ%rg6WPR[]e:SXuIHTqS3UUnjibVl6SpX/rG*YHY79 +Za7$H[^WcW]">Vg^;%J"_Sa=2`lH0Bb0.uQcHab_dF-LneCE.%f\,!4gYCW@hV[5Ki8N\pirS6& +roX7D!9jCGs69UMr9XINrpK^Qrp]mVq==LUrUfmXr:^*`q"Xd_rVH9cqu$?imJ_\:bl<1~> +JcC<$JcGHDoD\[drVZQis8)`jrV6Ees7ZHbs7H?_rpg_%PbKJ&MaN2E@`Pf[2_SO%&^V7Co]XkYa\@8oT +['R*EZ*:F7Xf\Y(Wi;noVPU)`U7n6PSt2C@S!fY2Q^*i#PEM&iO,o9ZN/NRMLkg_>KnG#0JUi9# +IXQTjH?sj]GB\4QFE;JBEH#i6DJa4hCCY)nBP;$jAS#C^@q&nU@/aL[(E9r`T8's&]2# +s&K(u!`P_`l@8Y\mXOeVr'g3FpI"I;pRqPDo8E!nm>:^rr'gKPpIG0QrCQfWrC[,arj2X1s02[1 +Z*9YiR.-I9QLL7@?2e1.?iFI5@JaO6A,^$:Ac?eAPY5+I@RJ`HGHMDjL +I//-_HMr-fGklR]G5ZRXFS^(CEqseLFSp:[G5-:[Gl;p`HN&9jI/A?kIf=ipJH(3#K)L?%K`?c) +LB!#/M#N82M?&S6N;nk;NrG(?OHKO*"d>19Q'Rd9QrBEAS"#q=StD[LTq\ +JcC<$JcGHDoD\[drVZQis8)`jrV6Ees7ZHbs7H?_rpg_%PbKJ&MaN2E@`Pf[2_SO%&^V7Co]XkYa\@8oT +['R*EZ*:F7Xf\Y(Wi;noVPU)`U7n6PSt2C@S!fY2Q^*i#PEM&iO,o9ZN/NRMLkg_>KnG#0JUi9# +IXQTjH?sj]GB\4QFE;JBEH#i6DJa4hCCY)nBP;$jAS#C^@q&nU@/aL[(E9r`T8's&]2# +s&K(ur_rY^r'p-Fo1&+;r'g3FpI"I;peq/lj@SN*!(m&Yr'gKPpIG0QrCQfWrC[,aqcNi!!*8kl +m83LPn4s!hra,M0ra>b7qdTS8rabqtQC%T<;jj)DS"-%@T:hmOU8+N[V5L5iWN*##Xf\e2Yd(O@ +['d?O\@K2_]Y2%o^qmn*`5Ta:aN;TJbK\>Xcd:(fe'umtf%8R-g=k<:h;-rFhr*GOir7s=jQ6C' +s5sCGrTX@I!:0RLs6]gRr9sXSrUK^SrU^![q"=RYrV-*^r;$ +JcC<$JcGHDo)AUdrVZQirqcZjrV6Ees7ZEa!qc*Urpg-\nF6GG!Uf@SliHG;rojIIkPjTIjlGI^ +io0mpIG`o;h;$c=g=b03f@SU(eC;sqdF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(hd\[],W +[^?_#/s&f;& +r`9&!!`[h)pnm)LrhfXln#$(Rr'g6Gp-\Ff`bPtlJ?Me+0@/aU4@fBm;AG]s +JcC<$JcGHDo)AUdrVZQirqcZjrV6Ees7ZEa!qc*Urpg-\nF6GG!Uf@SliHG;rojIIkPjTIjlGI^ +io0mpIG`o;h;$c=g=b03f@SU(eC;sqdF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(hd\[],W +[^?_#/s&f;& +r`9&!!`YeapjW9opODjdmsjqXr^QfSoL/C?o0W5Fg5>0Pr'gKPpIG0Qr(6`WrCd/a$F-h>YHY46 +Y-"goopFs0s-E/@s'>Y2qd9A2raG_6raYt=qdoe>rb).Brb;CIqeQ4Jrb_RN!NrR"R,+2/R.bk% +HfTSNHhMdaH2W!`GPu^`Fn^"SF6@T>F8'eSFo6FYGPudbH2;jdHiAEiIK"]pJ,FisJcC?"KE$W) +L&Qi,L]<20M>rG5MuJ\8N<#"jWiE,$ +Xfek3Yd1UA[C3NQ\[f;a]Y2(p^qmn*`5Ta:aN;TJbg"GYcdC.ge'umuf@S[.g=k<:h;-rFi8ESR +ioB([jlQL(!pAe2rosIJ!:0UMrpBaRr9sXSrUKaTrU]sZq"=UZr:g!]r;$ +JcC<$JcGHDo)AUdrVZQirqcZjrV6Ees7ZEa!qc*Urpg-\nF6GG!Uf@SliHG;rojIIkPjTIjlGI^ +io0mpIG`o;h;$c=g=b03f@SU(eC;sqdF$=ecHa\YbKJ&MaN2EA`Pod5_SX.)^V@Lr]Y(hd\[],W +[^?_#/s&f;& +r`9&!!`W)sqaLHQlppS8n43IIr'g6Gp-\FY2qd9A2raG_6raYt=qdoe>rb).Brb;CIqeQ4Jrb_RN!FfL%<;fb^<;(Y6 +HfTSNHhMdaH2W!`GPu^`Fn^"SF6@T>F8'eSFo6FYGPudbH2;jdHiAEiIK"]pJ,FisJcC?"KE$W) +L&Qi,L]<20M>rG5MuJ\8N<#"jWiE,$ +Xfek3Yd1UA[C3NQ\[f;a]Y2(p^qmn*`5Ta:aN;TJbg"GYcdC.ge'umuf@S[.g=k<:h;-rFi8ESR +ioB([jlQL(!pAe2rosIJ!:0UMrpBaRr9sXSrUKaTrU]sZq"=UZr:g!]r;$ +JcC<$JcGHDo)AUdrVZQirqcZjrV6Ees7ZEas7?<_rpp*Z!:^!V,4=jcm-O'(lKRQski_*jjlGL_ +j5T%Ui8(rjh+"!4hC)rjVm:r'gKPpIG0QrCQfWrCd/a$2*r^ +oCDJBnaQ#Fc0imLc1oK_c25``b5tsU?Me+0@/aU4@fBm;AG]sb]Y2(p^r!t+`Poj;aN;TJbg"GYd*^7he'uq!f@S[. +g=k<:h;-rFi8ESRro4%?jo4BDkNM./l2U&Kli-8MmJlVPn,DhUnbVhToDS=Up&4U^p\4I]q>C*_ +qu$BgrU'T8s2t@l~> +JcC<$JcGHDo)AUdrVZQirqcZjrV6Ees7ZEas7?<_rpp*Z!:^!V,4=jcm-O'(lKRQski_*jjlGL_ +j5T%Ui8S2ODlrc$hO4;/pNlX^ +ja?lNpNla_rHS-^rHA-^piQ@Rj`:3=pN6=UrHA!\rcnBeqKi-frd=TkrdOirr.+fus+:0$s+LE+ +rItB/Lku"d!fDnorepob]Y2(p^r!t+`Poj;aN;TJbg"GYd*^7he'uq!f@S[.g=k<:h;-rFi8ESR +ro4%?jo4BDkNM./l2U&Kli-8MmJlVPn,DhUnbVhToDS=Up&4U^p\4I]q>C*_qu$BgrU'T8s2t@l~> +JcC<$JcGHDo)AUdrVZQirqcZjrV6Ees7ZEas7?<_rpp*Z!:^!V,4=jcm-O'(lKRQski_*jjlGL_ +j5T%Ui8VF[l;[M( +q0V4Nq0Vj^r-A6cq02d\rH7mWqK(b=qK)CQr,qs]q02g_rH\6crd4WlqgJHmrdXirs+13%r.G$& +s+UE+!f)SfrJ:T5Mi7Rn!f`5#rf7)AOoCLEPEc'3=I,;@R$jD4S"-%@StD[LTq\ +JcC<$JcGHDo)AUdrVZQirqcZjr:p?2e(1>?Y50=oVV( +=8l5#f`%btVt$Ya8,YpS7J'"@6h`nIh>H(-g\eVC\F7!&\GSen7e]FN8Gu-V9)VE^9F=M_nF,f5 +mHs9,cMGfVcM>`bbl5labl>lcbkK<[?Mn10@/j[5@fBm:AGg$=B)ZH@B`;`FCA_lHD#\ALDZ=YT +j8R6tbk'*DbkQMZHf]YNHhVjbH2W!`GPu^`Fng(UF8'_KEVFMMF80kUFo?LZGQ)jcH2DpeHiAEi +IK"]pJ,FisJcC?"KE$W)L&Hc+L]<20M>rG5MuJ\8N<#"Vg^;%G!_SX71`Q-'@aihlOc-FY^dF$Fm +eCE.%f@\g2gYCW@hV\=j$fU+*j5f=`k2tjikl0iHlMp2Lm/HDPmelPRnG_tSo)81Yo_A+WpAF[Z +q#'scqY0mar;-BZrdk*ks*t~> +JcC<$JcGHDo)AUdrVZQirqcZjr:p?2e(1>?Y50=oVV( +=8l5#TDj?7J,k)cJFA!]IfDq:7f,XH7.iqA6MR8RMW0KhMX62t7JoXL8,PpV8bu'X9E%Tc9rn8n +ri#psWUcG.Qi:=h?iFI5@JjU6A,^$:AcHBABDcHBC&VlFC]8/MD>S5NDZQrAp6ad+r0[8*pj;+M +q0Vj^rH\?dq02d\rH7mWqfDLPp2ThIqK)FRrH8'^q02g_rH\9drd4WlqgJHmrdXirs+13%r.G$& +s+UE+s+gW1re^Z4!/pi8s,@#=rf@)@!0R8D!L&cIPuO'9R$a;1R[]e:SXuFFTV8'RUnjiaVl-Jm +WiN5'Xfnt5Z*UdD[C3QS\[oDc]tV7r_8=(-`Pom=aN;WKbg"GZd*^7ieC<%"f@S[/g=tE=h;7&g +i!\N'j5]4^jlY^gkNMp0s6BXMrp9XOs6fgRs7$$XqXXUVrUfmXr:^'_p\=[^r;-0bqu$ +JcC<$JcGHDo)AUdrVZQirqcZjr:p?2e(1>?Y50=oVV( +=8l5#;uT5a7dik27f#XO7fQ!W7f,XH7.iqA6MOR[9&iJC8EEG@7JoXL8,PpV8bu'X9E%Tc9i_!g +oMGQbg/.cEra,M0ra>b7r*oY8rabqs,[5CrfR;GPl?qIQC!u+R@9S6S"-%@StD[LTq\?YV5C/gW2ZetXKAV. +YctC=Za@-K\%&u[]=bhk^V@V%_SjF4a2l?DbKJ,ScHjkbdF6Upe^i@(f\5'6gtgfChu;OAiSrnX +jQ5Lck3(pkrosIJs6K[NrpBaRr9s[TrpfjUrU^![q"=RYr:fs\r;$9ep\XjcqYfg\JcEjlJ,~> +JcC<$JcGHDo)ARcrquWis8)`jrV6Ees7ZEa!qc*Urpp*Z!:^!V(%1JVm-O'(lKRQski_*jjlGL_ +j5T%si.'Y@h;-l@gY1B7f[na+e^`1!e'cXkd*L"_c-4ASb0%iIaN)<>`P]R0_8*h#^:h1l]=GJ^ +\$i`PZa6sBYck43XK/A$W2HPjUnjc[TqJ$LSXc1=R@'A.Q'IStP*(ieNfB!VMi!:HLPCM9K7ec, +J:E#rI=-BfH?jaZG'3h,%QS,5>5h\) +=T;J&R4i8,PjS7Irq@6hj"Ch#P%a\`C9h\bWc57JfRK8,Z!W8bl!X9DqNa:&XDX +lMg&JcMYrWcM>`\bjWaT?Mn10@/aU4@fKs;AGg$qTSTV +l-/pKpj;+Mq0Vj^rH\?dq02g]rH7mWqfDRRn8\8EqfDOSrH8'^qKMp`rd"BerHnQlqgJHmrdXir +s+13%r.G$&s+UE+s+gW1re^Z4s,6l8s,@#=rf@)@!0R8D!L&cIQ!'E>R$a;0R[]e:SXuFFTV8'R +USO]^VPgAlWiE,$Xfek3Yd1UA['mEP\@K2_]Y2%o^qmn*`5T^9aN2NIbKS8Wcd:(fe'umtf%8R- +g=k<:h;-rFi8ESRro4%?jo4BDkNM./klU/9li$/MmJcPPn,DhUnb_nUoDS=Vp&+O]p\4I\q>C*_ +qtp +JcC<$JcGHDo)ARcrquWis8)`jrV6Ees7ZEa!qc*Urpp*Z!:^!V(%1JVm-O'(lKRQski_*jjlGL_ +j5T%si.'Y@h;-l@gY1B7f[na+e^`1!e'cXkd*L"_c-4ASb0%iIaN)<>`P]R0_8*h#^:h1l]=GJ^ +\$i`PZa6sBYck43XK/A$W2HPjUnjc[TqJ$LSXc1=R@'A.Q'IStP*(ieNfB!VMi!:HLPCM9K7ec, +J:E#rI=-BfH?jaZG'3h,%QS,5>5h\) +=T;J&s,[5CrfR;GPl?qNQC!u+R@0M5S"-%@StD[LTq\Vg^;%J"_Sa=2`Q-'@b0.uPcHab_dF-LneCE.%f\,!4gYCW@hV[8LiSsjs +!T`AAjoX`0kl0fJlKdd7li?GPmeuVRnG_tTo)81Yo_A+WpAF[Zq#'scqY'g`r;-BYrdk*ks*t~> +JcC<$JcGHDo)ARcrquWis8)`jrV6Ees7ZEa!qc*Urpp*Z!:^!V(%1JVm-O'(lKRQski_*jjlGL_ +j5T%si.'Y@h;-l@gY1B7f[na+e^`1!e'cXkd*L"_c-4ASb0%iIaN)<>`P]R0_8*h#^:h1l]=GJ^ +\$i`PZa6sBYck43XK/A$W2HPjUnjc[TqJ$LSXc1=R@'A.Q'IStP*(ieNfB!VMi!:HLPCM9K7ec, +J:E#rI=-BfH?jaZG'3h,%QS,5>5h\) +=T;J&s,[5CrfR;GPl?qNQC!u+R@0M5S"-%@StD[LTq\Vg^;%J"_Sa=2`Q-'@b0.uPcHab_dF-LneCE.%f\,!4gYCW@hV[8LiSsjs!T`AAjoX`0 +kl0fJlKdd7li?GPmeuVRnG_tTo)81Yo_A+WpAF[Zq#'scqY'g`r;-BYrdk*ks*t~> +JcC<$JcGHDo)ARcrquWis8)`jrV6Ees7ZEas7?<_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA +isOf)i8EMMhVI#Cg]#n1g"=p.f%'cLJ()indEp4bcHXSVbK@rKaN2EA`Pf[2_SO%&^V7Co]Xt_b +\@8oT['R*EZ*:F7XfSS'Wi2hnVPL#_U7n6PSt2C@S!fY2QBd`"PEM&iO,f3YN/NOLLkg_=KS+o/ +JUi6!I=6KiH?sg[GBS+NFE;JBEH#i6DJa3*CMIQsB`D]JAn>OaA,]p<@:9(A!a]/$Co. +s&f;&!ERdtVu*@iV>d@i8,PjS7Irq?6i'+MhVJ(crOV^5laZAnqmcPmr'pENr(-cXqF^]Zr_3>d +r941Fs60I-rQY2a!71Meq9A`Zq9/`Zqof"Gqd9A2raG_6raYt=qdoe>rb).Brb;CIqeQ4Jrb_OM +rbhgVj87$qbk96GbkQMZHff_OHhVjaH2W!aGPu^`Fnp.WF8BqCEVa_RF80kVFo?L[GQ)jdH2Dpe +HiAEjIK"]pJ,FisJcC?"KE$W)L&Hc+L]<2/M#rQmMuJ\8NW5%X +cd:(fe'umuf@S[.g=k<:h;-rFi8ESRj5]4]jlY^gkNMp0s69UMrTsROs6fjSrp]sXqss^WrUfmX +r:^'_pA"R]r;--aqY^3gmJ_\:aT$b~> +JcC<$JcGHDo)ARcrquWis8)`jrV6Ees7ZEas7?<_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA +isOf)i8EMMhVI#Cg]#n1g"=p.f%'cLJ()indEp4bcHXSVbK@rKaN2EA`Pf[2_SO%&^V7Co]Xt_b +\@8oT['R*EZ*:F7XfSS'Wi2hnVPL#_U7n6PSt2C@S!fY2QBd`"PEM&iO,f3YN/NOLLkg_=KS+o/ +JUi6!I=6KiH?sg[GBS+NFE;JBEH#i6DJa3*CMIQsB`D]JAn>OaA,]p<@:9(A!a]/$Co. +s&f;&!EPiIJFS-aIf)_67f5^H7.iqD63*hZU]7%gMt;hlM><%uM>Tg?7e]FN8Gu-V9)VE^9`Iid +Vu*F^R,jV4QM[$K?Me+0@/aU4@fBm;AG]s#EY(1P*2#mPl?pKQC%Tai_fMc-FV\d*^:jeC<($f@\d1g=tE= +h;7&Ii8N\Uj5f:_k2tjikl0iHl2^/Km/QJQmeuVRnGi%Uo)81Yo_A+WpAF[Yq#'scqY'g_r;-BZ +rdk*js*t~> +JcC<$JcGHDo)ARcrquWis8)`jrV6Ees7ZEas7?<_rpp*Z!:^!Vs6]mSrp0[OlMg#Kki_s-!TiDA +isOf)i8EMMhVI#Cg]#n1g"=p.f%'cLJ()indEp4bcHXSVbK@rKaN2EA`Pf[2_SO%&^V7Co]Xt_b +\@8oT['R*EZ*:F7XfSS'Wi2hnVPL#_U7n6PSt2C@S!fY2QBd`"PEM&iO,f3YN/NOLLkg_=KS+o/ +JUi6!I=6KiH?sg[GBS+NFE;JBEH#i6DJa3*CMIQsB`D]JAn>OaA,]p<@:9(A!a]/$Co. +s&f;&!EN.p7efL&7f5dS7f5^H7.iqD6MX[W9&S5MDZOfacrBddpj;.Nq0Vj^ +r-A6cqKMm]rH7pXr,_^TlZ)cAr,_XTrcS0_qKMp`rd"Berd4Wlr-eQnrdXirs+13%r.G$&s+UE+ +s+gW1rJ:T5Mi7Rns,I&=rf7;GOcbfiPEV71Pl[2;rg7&\R[]e:SXuFFTV8'RUSO]^VPg>jWN*## +Xf\b0Yd(L?['d?N\@K/]]Y(ql^VI\&_o0O6a2lBFbKJ/UcHjkbdaQ^qf%8O+g"P07gtgfChr*GO +ioB([jQ5OdkND(.l2U#Kli$2MmJlVQn,DhVnb_nUoDS=Vp&+O]p\+C[q>C*_qtg6erU'T8s2b4j~> +JcC<$JcGHDo)ARcrVZQirqcZjrV6Bd!;?Bas7H?_rpg-\nF6GG!Uf@Sm/QAblKRQski_*jjlPR` +j5T(Wi8EMLrnRq:gY1B7g"=p.f%'cLJ()indEp4bcHXSVbK@uLaN2EA`Poa3_SO%&^V7Co]Xt_b +\@8oT['R*EZ*:F7XfSS'Wi2hnVPL#_U7n6PSt2C@R[KP1QBd`"P*1rhO,f3YN/EIKLkg_=KS+o/ +JUi6!I=6KiH?jaZGBS+NFE;JBEH#i6DJa3*CMIQsB`D]JAn>OaA,]pB@:3JM?X@&Er`oJ-!*]>( +s&]8&d\lf9rMBOkqa^QRr'g0EnjEFDq;1kWo""D&m^`;+r'gKPpIG0Qr(6`WrCd,`r_s,[5Crf[;F!0mJJ!LB)OQr09?S"#q= +SXuFFTV8'RUSO]^VPgAlWiE,$Xfek3Yd(O@['d?O\@K2_]Y(tn^VI_'_o9U7a2lBFbKS5VcHstd +daQ^rf%8O+g"P07h;-rFrnmt=ioB([jo4BJkNM-ol0@R"li-8NmJlVQn,MnVnb_nVoDS=Vp&+O] +p\4I[q>C*^qtp +JcC<$JcGHDo)ARcrVZQirqcZjrV6Bd!;?Bas7H?_rpg-\nF6GG!Uf@Sm/QAblKRQski_*jjlPR` +j5T(Wi8EMLrnRq:gY1B7g"=p.f%'cLJ()indEp4bcHXSVbK@uLaN2EA`Poa3_SO%&^V7Co]Xt_b +\@8oT['R*EZ*:F7XfSS'Wi2hnVPL#_U7n6PSt2C@R[KP1QBd`"P*1rhO,f3YN/EIKLkg_=KS+o/ +JUi6!I=6KiH?jaZGBS+NFE;JBEH#i6DJa3*CMIQsB`D]JAn>OaA,]pB@:3JM?X@&Er`oJ-!*]>( +s&]8&fmrUBq0r32r'pTQnjN%9s$HOWpP\-j!/p0#r'gKPpIG0Qr(6`WrCd,`r_3BjqPa"Qrg*VP +jd5_-s'GV1ra>b7r*oY8rabqs,[5Crf[;F!0mJJ!LB)OQr09?S"#q=SXuFFTV8'RUSO]^VPgAlWiE,$ +Xfek3Yd(O@['d?O\@K2_]Y(tn^VI_'_o9U7a2lBFbKS5VcHstddaQ^rf%8O+g"P07h;-rFrnmt= +ioB([jo4BJkNM-ol0@R"li-8NmJlVQn,MnVnb_nVoDS=Vp&+O]p\4I[q>C*^qtp +JcC<$JcGHDo)ARcrVZQirqcZjrV6Bd!;?Bas7H?_rpg-\nF6GG!Uf@Sm/QAblKRQski_*jjlPR` +j5T(Wi8EMLrnRq:gY1B7g"=p.f%'cLJ()indEp4bcHXSVbK@uLaN2EA`Poa3_SO%&^V7Co]Xt_b +\@8oT['R*EZ*:F7XfSS'Wi2hnVPL#_U7n6PSt2C@R[KP1QBd`"P*1rhO,f3YN/EIKLkg_=KS+o/ +JUi6!I=6KiH?jaZGBS+NFE;JBEH#i6DJa3*CMIQsB`D]JAn>OaA,]pB@:3JM?X@&Er`oJ-!*]>( +s&]8&pI>'Ncpmn&r'pTQnjN%9s$HN^pIa:6nOWRHqaUVf^;%Fu_SX40`Q#s>ai_fNc-FV]dF$CkeCE.%f@\d1g=tH>hV\=j"l\J$j5f>$ +jp:/6kiq?slKdd8m/QJQmeuVSnG_tTo)A7Zo_A+WpAF[Zq"smbqXsa_r;-BYrdk*is*t~> +JcC<$JcGHDo)ARcrVZQirqcZjr:pQ7n+ +=oVUTVt-__V#[Cg8,YpS7Iik;6i#R=]BHia\c92<7JfRK8,PpV8bl!X9DqQ`:&jAUjo=KCjo!C( +c2#ZUc2#TZbP''Y?Me+0@/aU4@fBm;AGg$ErC(TFT$@]G5HL_GlE!dHN&9kI/A?lIf=iq +JGt-"K)C9$K`?c)LB!&/M#E21MZ8V6N;nn;NrG(@OHG\)Op@28Pa.N"QC%T<St;RI +TqS3UUnjiaVl-JmWiE/&Xfek3Z*L^B['mEP\@K2_]Y2%o^VRe(_o9U7aN2KGbKS5VcHstddaQ^r +f%8O+g"P39h;-rFi8ESRro4%?jo4BCkNMp0!p]+;rp9[Ps6fjSs7$$Xr:9gXrq-!YrV$-_p\=X] +qtg$`qY^3gm/DS9`rCP~> +JcC<$JcGHDo)ARcrVZQirqcZjr:pQ7n+ +=oVUVJFS-cIecM47f,XF7.N_@UrSDmMZ$!@7e]FN8Gu-U9)_K^9`@c`W;ideR,XJ+Q2k7g?iOO5 +@JjU6A,g*;Ac?<@BDcHBC&_rFC]A5MD>S5MDuO\UQgpI(RJrTKHM;dMI//-_HMr-fGkuX_G5ZRZ +FSp4WEp%H>ErC(TFT$@]G5HL_GlE!dHN&9kI/A?lIf=iqJGt-"K)C9$K`?c)LB!&/M#E21MZ8V6 +N;nn;NrG(@OHG\)Op@28Pa.N"QC%T<St;RITqS3UUnjiaVl-JmWiE/&Xfek3Z*L^B +['mEP\@K2_]Y2%o^VRe(_o9U7aN2KGbKS5VcHstddaQ^rf%8O+g"P39h;-rFi8ESRro4%?jo4BC +kNMp0!p]+;rp9[Ps6fjSs7$$Xr:9gXrq-!YrV$-_p\=X]qtg$`qY^3gm/DS9`rCP~> +JcC<$JcGHDo)ARcrVZQirqcZjr:pQ7n+ +=oVU?7eoRQ7f,XF7.N_@S5MDuO\UErC(TFT$@]G5HL_GlE!dHN&9kI/A?lIf=iqJGt-"K)C9$K`?c)LB!&/M#E21 +MZ8V6N;nn;NrG(@OHG\)Op@28Pa.N"QC%T<St;RITqS3UUnjiaVl-JmWiE/&Xfek3 +Z*L^B['mEP\@K2_]Y2%o^VRe(_o9U7aN2KGbKS5VcHstddaQ^rf%8O+g"P39h;-rFi8ESRro4%? +jo4BCkNMp0!p]+;rp9[Ps6fjSs7$$Xr:9gXrq-!YrV$-_p\=X]qtg$`qY^3gm/DS9`rCP~> +JcC<$JcGHDnc&LcrVZNhs8)`jrV6Ees7ZEas7?<_rUL$[nF6GG#O_!Hm-O'(lMg#Kki_s-!TiDA +irS/urnmh7hYu=*j\A7K+Y@UWYPra,_5?![G7!aAi3 +rE9/&s&T2$go'Y=rMBNbq+(?Pr'g-DoL&N4s53gfl+5f`!4_trqaUs(D7Crb;@Hr+l:Jrb_RNrbqdTqf)UVrQG#\ +ps&ESqTAl_pNlU]k^<2Qp3Q[_rHS0_rHA0_q/lOUqf:h=qf;UUqK2^Zrc\0_rcnEfr-J?hs*X`m +rdOlsr.+fus+:0$s+LE+rJ(?-s+pW1s,-i7rf$l:s,R)>s,[5Crf[;F!0mJJs- +JcC<$JcGHDnc&LcrVZNhs8)`jrV6Ees7ZEas7?<_rUL$[nF6GG#O_!Hm-O'(lMg#Kki_s-!TiDA +irS/urnmh7hYu=*j\A7K+Y@UWYPra,_5?![G7!aAi3 +rE9/&s&T2$gjnpErdOlss%)rUr'pTQnO3":rM0=e`/FR_qaUs(D7Crb;@Hr+l:Jrb_RNrbqdTqf)UVopFg.s-WP,pj;4P +q0Vg]rH\?dqKMm]rcS$Yr,_aUk&L9=r,_^VrcS3`qfi$ard"Efrd4Zmr-eQns*srss+13%r.G$& +s+UE+s+gW1rJCQ3s,6l8s,I&=rf@)@!0R8Ds-!GIrg!ML!13\PAso*WS"-">St;RITqS3UUnjia +Vl-JmWiE,$Xf\e2Yd(L?['d?N\%0&\]=bhk^VI\&_o0O5a2l?DbKJ,ScHjkbdF6Upe^i@)g"P07 +gtgfChr*GOioB([jlPXekNM-ol0@R"rTjUQmdC&Bs7$$Xr:9jYrUfpYrV$0`p%\I\qtg!_qY^3g +m/DS9`W(G~> +JcC<$JcGHDnc&LcrVZNhs8)`jrV6Ees7ZEas7?<_rUL$[nF6GG#O_!Hm-O'(lMg#Kki_s-!TiDA +irS/urnmh7hYu=*j\A7K+Y@UWYPra,_5?![G7!aAi3 +rE9/&s&T2$a%$)"q+(?Pr'g-DoL&IU!*B"gqapi[oLeLBo18gKqaUb7qdTS8rabqs,[5Crf[;F!0mJJs- +JcC<$JcGECo)ARcrquWirqcZjr:p[[^NTMZa-j?YHG"/X/`1uVl-DfUnaWWTV%gHS=>t8R$a2)Q'@GpOcYWaNJrdQM2@%DL4t;5 +K7\W(IsufoI!^0bG^"@TF`__HEcH)lS". +>5_V(=T;J#a$\8,YpS7I`e>6i,[;]@a^c\c"to7eT@N8Gu-U9)_K^9`.W^ +ir\;fch>ZTc2#TZbOs$T?iOO5@JjU6A,g*;Ac?<@BDcHCC&VlFC]8/LD>S5MDuXeQEW1"XF8^4Z +bkTHUbkK"?OHG\)P5g^GPl?pZQC!r*R$jA2S"#q< +SXuFFT`1W[U8+N[V5C/gW2ZetXKAV-YHY7:Za7$H[^WcW\\#Me]t_=t_8=+.`Q#s>aND]Lbg+M[ +d*^:jeC<%"f@\d1g=tE=h;7&Ii8N\Uj5f>$joOZ/rojLLlg+Q:s6]jSrpTmVrpfpWrq$-]q=X^[ +r:fp[qt^-co_\O`q>K[ZJcE[gJ,~> +JcC<$JcGECo)ARcrquWirqcZjr:p[[^NTMZa-j?YHG"/X/`1uVl-DfUnaWWTV%gHS=>t8R$a2)Q'@GpOcYWaNJrdQM2@%DL4t;5 +K7\W(IsufoI!^0bG^"@TF`__HEcH)lS". +>5_V(=T;J#"?OHG\)P5g^GPl?pZQC!r*R$jA2S"#qaND]Lbg+M[d*^:jeC<%" +f@\d1g=tE=h;7&Ii8N\Uj5f>$joOZ/rojLLlg+Q:s6]jSrpTmVrpfpWrq$-]q=X^[r:fp[qt^-c +o_\O`q>K[ZJcE[gJ,~> +JcC<$JcGECo)ARcrquWirqcZjr:p[[^NTMZa-j?YHG"/X/`1uVl-DfUnaWWTV%gHS=>t8R$a2)Q'@GpOcYWaNJrdQM2@%DL4t;5 +K7\W(IsufoI!^0bG^"@TF`__HEcH)lS". +>5_V(=T;J#6i'jY8c)-@8cM?[8bP^R7JfRJ8,Z!W8bl!X9DqQ^ +:&e5ke;YEu[;"[W]?iOO5@JjU6A,g*;Ac?<@BDcHCC&VlFC]8/LD>S5MDuXeQEW1"XF8^4; +<;:e6Hg6"RHhVjaH2`'aGQ)daFnp.XF8U(=EVjeTF8C"XFoHR]GQ2peH2N!gHiAEjIK+crJ,Fis +JcC?"KE$W)L&Hc+L]<2/M>rJ5MuAS9NK0%tNrkE*OoCODP5pjHPn97JQ^F/.R@9V7S=H.AStD\T +Th_>WUnjiaVl-JmWiN5'Xfek3Yd1UA['d?O\@K/^]Y(qm^VI\&_o0O6a2l?EbKJ,TcHjkbdaQ^q +e^i@)g"P07gtgfChr*GOioB([jo4BCkNMp0!p]+;rp9[Ps6fmTs7$$Xr:9jYrq-$ZrV$0`pA"O\ +qtfs^qu$9gm/DS9`;b>~> +JcC<$JcGECo)ARcrVZQirqcZjr:p[[^NQLZa-j?YHG"/X/`1uVl-DfUnaWWTV%gHS=>t8R$X,(Q'7AoOcYWaNJrdQM2@%CL4t;5 +K7SQ'IsufoI!U*aG^"@TF`__HEcH)s(D7Crb;@Hr+l:Jrb_RNrbqdT +qf2RTrc@pXrH8*_rlt/\p<35WpNu1Qq0Vg]rH\?dqKMm]rH7sYrH%jVic4m:rH%jXrH8-`qfi'b +rd"Efs*O`mrI+]prdXlss+10$rIb-'s+UE+s+gW1rJCQ3s,6i7s,@#=rK$u?!0R8Ds-*JIrfmMM +QiSt;RITV8'RUSO]^VPg>jWN)u!XKAV-YctCVf^;%Fu_SX4/ +`Q#s>ai_fMc-FV\d*^:jeC<($f@\d1g=tE=hV[8LiSrkWj5f=ak3(pkrojIKli-8NmJlVRn,MnV +nbhtXoD\CXp&4U^p\+CZq>:$\qtg6drTjH6s2=qf~> +JcC<$JcGECo)ARcrVZQirqcZjr:p[[^NQLZa-j?YHG"/X/`1uVl-DfUnaWWTV%gHS=>t8R$X,(Q'7AoOcYWaNJrdQM2@%CL4t;5 +K7SQ'IsufoI!U*aG^"@TF`__HEcH)b7qdTS8rabq +St;RITV8'RUSO]^VPg>jWN)u!XKAV-YctCVf^;%Fu_SX4/`Q#s>ai_fMc-FV\ +d*^:jeC<($f@\d1g=tE=hV[8LiSrkWj5f=ak3(pkrojIKli-8NmJlVRn,MnVnbhtXoD\CXp&4U^ +p\+CZq>:$\qtg6drTjH6s2=qf~> +JcC<$JcGECo)ARcrVZQirqcZjr:p[[^NQLZa-j?YHG"/X/`1uVl-DfUnaWWTV%gHS=>t8R$X,(Q'7AoOcYWaNJrdQM2@%CL4t;5 +K7SQ'IsufoI!U*aG^"@TF`__HEcH)b7qdTS8rabq +JcC<$JcGECo)ARcrVZQirqcWirV6Ees7ZEas7H?_rpp*Z!:^!Vs6]mSrp0^PlK\B5!U/_Gjr3@B +jQ#:[iSi_Qhqm5Gh;$c>g=k64f[na+ec+&%e'cXkd*M^:FNr%QbK@rJaN)<>`Pf[2_SO"%^:h1l +]=PP_\$i`PZa6sBYck43XK/A$W2HPiUnjcZTqJ!KSXc1,Q'IPrP*(fdNfB!UMM[1GL5(D8 +K7e`*J:E#rI=$9dH$FOWG'.nKF)l8?E,TW3D/=!'C2*Z\#%qOZARo=]raGn:@/aO5?3":0>lS". +>5_V(=T2D#rb).Brb;CIqeQ4Jrb_OM +rbqdTqf2UUrH%gWrH8'^q02e]oum)Uom?.Tpj;^\r-A6cqKMp^rH7sYr,_gWi,S[8rH%jXrcS3` +r-/-bs*=Ngs*Ocnr-eTos*sutrdk*$rIb-'s+UE+s+gW1rJCQ3s,6i7s,I&=rf@)@s,m;D!gAk5 +rg!ML!13\PA!rdSS"#q +JcC<$JcGECo)ARcrVZQirqcWirV6Ees7ZEas7H?_rpp*Z!:^!Vs6]mSrp0^PlK\B5!U/_Gjr3@B +jQ#:[iSi_Qhqm5Gh;$c>g=k64f[na+ec+&%e'cXkd*M^:FNr%QbK@rJaN)<>`Pf[2_SO"%^:h1l +]=PP_\$i`PZa6sBYck43XK/A$W2HPiUnjcZTqJ!KSXc1,Q'IPrP*(fdNfB!UMM[1GL5(D8 +K7e`*J:E#rI=$9dH$FOWG'.nKF)l8?E,TW3D/=!'C2*Z\#%qOZARo=]raGn:@/aO5?3":0>lS". +>5_V(=T2D#rb).Brb;CIqeQ4J +rb_OMrbqdTqf2UUrH%gWrH8'^q02Fus-WP,om?.Tpj;^\r-A6cqKMp^rH7sYr,_gWi,S[8rH%jX +rcS3`r-/-bs*=Ngs*Ocnr-eTos*sutrdk*$rIb-'s+UE+s+gW1rJCQ3s,6i7s,I&=rf@)@s,m;D +!gAk5rg!ML!13\PA!rdSS"#q +JcC<$JcGECo)ARcrVZQirqcWirV6Ees7ZEas7H?_rpp*Z!:^!Vs6]mSrp0^PlK\B5!U/_Gjr3@B +jQ#:[iSi_Qhqm5Gh;$c>g=k64f[na+ec+&%e'cXkd*M^:FNr%QbK@rJaN)<>`Pf[2_SO"%^:h1l +]=PP_\$i`PZa6sBYck43XK/A$W2HPiUnjcZTqJ!KSXc1,Q'IPrP*(fdNfB!UMM[1GL5(D8 +K7e`*J:E#rI=$9dH$FOWG'.nKF)l8?E,TW3D/=!'C2*Z\#%qOZARo=]raGn:@/aO5?3":0>lS". +>5_V(=T2D#X2e:]+T"@/aU4@fBm;AG]srJ5MuAV7NW5%St;RITV8'RUSO]^VPg>jWN)u!XKAV-YHY79Za7$H[^N]V\[oDc]tV7s_8=(,`Poj; +aN;TJbg"GYd*^7he'uq!f@S[.g=tE=h;7&Ii8N\Uj5f:_k2tjjrojLLlg+Q:s6TgSrU9dUs7-$X +s7?6^qXsg\r:fp[qt^-coDAC^qYfaZJcEUeJ,~> +JcC<$JcGECnc&LcrVZNhrqcZjr:pg=k64f[na+ec+'He'cXkd*L%`cHXSVbK@rJaN)<>`Pf[2_SO%&^:h1l +]=PP_\$i`PZa6sBYck43XK/A$W2HPiUnjcZTqJ!KSXc1,Q'IPrP*(fdNfB!UMM[1FL5(D8 +K7\Z)J:E#rI=$9dH$FOWG'.nKF)l8?E,TW3D/=!'C2*Z\!G?$DAH?=OraGq;?srt@!a]/br_*;bqPO9brCQuZq+(?PqaKm?rBpJ=i4J-_rC-TQ +pIG-PrCQfWr_*2`qb@%Jro3q#qTJrarlbAeprr`^q98TVpWED@ra>b7qdTS8rabqf#~> +JcC<$JcGECnc&LcrVZNhrqcZjr:pg=k64f[na+ec+'He'cXkd*L%`cHXSVbK@rJaN)<>`Pf[2_SO%&^:h1l +]=PP_\$i`PZa6sBYck43XK/A$W2HPiUnjcZTqJ!KSXc1,Q'IPrP*(fdNfB!UMM[1FL5(D8 +K7\Z)J:E#rI=$9dH$FOWG'.nKF)l8?E,TW3D/=!'C2*Z\!G?$DAH?=OraGq;?srt@!a]/br_*;bqLAN;rCQuZq+(?PqaKm?rBgRZr1j1Jjc&_f +p58f;qaUs(D4Bs(VIIr+l:J +rb_OMrbqdTqf2UUrH%gWrH8'^pNQO[s*=L0!1f#~> +JcC<$JcGECnc&LcrVZNhrqcZjr:pg=k64f[na+ec+'He'cXkd*L%`cHXSVbK@rJaN)<>`Pf[2_SO%&^:h1l +]=PP_\$i`PZa6sBYck43XK/A$W2HPiUnjcZTqJ!KSXc1,Q'IPrP*(fdNfB!UMM[1FL5(D8 +K7\Z)J:E#rI=$9dH$FOWG'.nKF)l8?E,TW3D/=!'C2*Z\!G?$DAH?=OraGq;?srt@!a]/br_*;bqF:KWrCQuZq+(?PqaKm?rBpQ`r`/kfnk/"8 +ogo$MqaUb7qdTS8rabqf#~> +JcC<$JcGBBo)ARcrVZQirqcZjr:ph;-l@gY1B7f\"g-f%&=#eC2jndEp7dcHa\YbKJ&MaN2EA`Pod5_SX.)^V7Co +]Xtbc\@8oT['R*EZ*:F7XfSS'WMl_mV50o^TqS-NSt2C@R[KP0QBd\uP*1ofO,f3YMi*@JLPCP; +KS+l-J:N,uI=-BfH?jaZG7f"@FEDSEEH,r9DJj<-CMR[!rb)=FB)Z?BA7PUJ!b#JEra5\3!+#P. +s'#J,r)s&%s&],!r`/ttqc!Jlr_`Phr_NMgqb@&`r_*)[r^m&Zq+(?PqaKg=qqh7`jLaTdr^H]R +p.,'Pr(6`WrCd,`qFq#diSjdq!9 +s,d8Crf[;Fs-3MJs- +JcC<$JcGBBo)ARcrVZQirqcZjr:ph;-l@gY1B7f\"g-f%&=#eC2jndEp7dcHa\YbKJ&MaN2EA`Pod5_SX.)^V7Co +]Xtbc\@8oT['R*EZ*:F7XfSS'WMl_mV50o^TqS-NSt2C@R[KP0QBd\uP*1ofO,f3YMi*@JLPCP; +KS+l-J:N,uI=-BfH?jaZG7f"@FEDSEEH,r9DJj<-CMR[!rb)=FB)Z?BA7PUJ!b#JEra5\3!+#P. +s'#J,r)s&%s&],!r`/ttqc!Jlr_`Phr_NMgqb@&`r_*)[r^m&Zq+(?PqaKg=!2BCdhi.)`pPSr= +qaU9LrCHiXqF^]Zr_3/_!)EHh!2og`jHoV,p6YfFr*TJ3raG_6raYt=qdoe>rb).Brb;@Hr+l:J +rb_RNrbqdTqJlLTrH%gWrH8'^pNQO[qg%aYoR$7Yom?CYrH\?dqKMm]rcS'ZrH%mWhJrL7rH%jX +s)nVf^;%Fu_SX4/`Q#s>aND]Lbg"GZd*^7ieC<%"f@\d1g=tE=h;7&Ii8N\Uj5f=ak3(pkl07Ku +li-5PmI'E@mfN"KnbhtXoD\CZp&4U_p\+CZq>0sZqtg6drTjH6s1nYb~> +JcC<$JcGBBo)ARcrVZQirqcZjr:ph;-l@gY1B7f\"g-f%&=#eC2jndEp7dcHa\YbKJ&MaN2EA`Pod5_SX.)^V7Co +]Xtbc\@8oT['R*EZ*:F7XfSS'WMl_mV50o^TqS-NSt2C@R[KP0QBd\uP*1ofO,f3YMi*@JLPCP; +KS+l-J:N,uI=-BfH?jaZG7f"@FEDSEEH,r9DJj<-CMR[!rb)=FB)Z?BA7PUJ!b#JEra5\3!+#P. +s'#J,r)s&%s&],!r`/ttqc!Jlr_`Phr_NMgqb@&`r_*)[r^m&Zq+(?PqaKg=rD`eslq6>1pIP9P +qaU9LrCHiXqF^]Zr_3/_!)EJns&T1spJKR@r_`T#s'Yh7r*oY8s()"s,d8Crf[;F +s-3MJs- +JcC<$JcGBBo)ARcrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6]mSrp0^PlK\B5!U/_Gk5XNC +jSn0?io0mp(#Rm)h;-l@gY1B7f\"g-f%&=#eC2kFd='BfcHa\YbKJ&MaN2EA`Pod5_SX.)^V7Co +]Xtbc\@8oT['R*EYct=6XfSS'WMl_mV50o]TqS-NSt2@?R[KP0QBd\uP*1ofO,f0XMi*@ILPCP; +KS+l-J:N,uI=-BfH?jaZGBS+NFE;JBEH#i6DJa3*CMIQtBP;$jrac=F@q/tW@:Q7n*=oMP'=8Z+uX2i:]=,d:&[ic9DV9[8c;3U8,PjR7I3G?hYFhG]BHj+7J]LJ +8,PpV8bl!X9DqQ]:&ducipP"hbi$\C?iFI4@JjU6A,g*;Ac?<@BDcHBC&_rFC]A5MD>S5MDuO_P +EW1"XF89qVFo?LXGPcX^H1H:=HhD^`H2W!`GQ)dbFnp.YF8U(MEVOMFEW'qVF8U.ZFoHR_GQ2pe +H2W'hHiJKlIK+crJ,OotJcC?#KE$W)L&Qi,L]<2/M>rJ5MuAV7NW5%dTV/!PU8+KZUnsrdVl6SpWiN5'Xfek3Yd(L?Za@-K\%&uZ]"G\h^;%G! +_SX40`Q#s>ai_fMc-FV\d*^:jeC<%#f@\d1g=tE=h;7)JiSrkWj5f=ak3(t-klU/9li-5PmI'EA +n,MnWnbr%YoD\CZp&4U_p\4I[q>:$Zqtg6crTjH6s1eSa~> +JcC<$JcGBBo)ARcrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6]mSrp0^PlK\B5!U/_Gk5XNC +jSn0?io0mp(#Rm)h;-l@gY1B7f\"g-f%&=#eC2kFd='BfcHa\YbKJ&MaN2EA`Pod5_SX.)^V7Co +]Xtbc\@8oT['R*EYct=6XfSS'WMl_mV50o]TqS-NSt2@?R[KP0QBd\uP*1ofO,f0XMi*@ILPCP; +KS+l-J:N,uI=-BfH?jaZGBS+NFE;JBEH#i6DJa3*CMIQtBP;$jrac=F@q/tW@:Q7n*=oMP'=8Z+uX2i:]=,d:&[ic9DV9[8c;3U8,PjR7I3G?UYUmuMtr817J]LJ +8,PpV8bl!X9DqQ]:&ducVuN.DQhZm=Qi1:j@/aU4@fBm;AGg$OT1IAOogi3Pl?sJ +QN*G%R]TqS3UUSO]^VPg>jWN)u!XKAV-YHY79ZEpmE[C3QS\[f;a]Y2%o +^VRe(_o9U7a2lBFbKJ/UcHjkbdaQ^qe^rF*g"P07gtgfCi8ESRioB([jlY^gkl0fJlKdd8liQSB +mf)\TnGi%Wo)J=\o_\=[pAOa[q"smaqXXO[r:p6Vrdk*as*t~> +JcC<$JcGBBo)ARcrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6]mSrp0^PlK\B5!U/_Gk5XNC +jSn0?io0mp(#Rm)h;-l@gY1B7f\"g-f%&=#eC2kFd='BfcHa\YbKJ&MaN2EA`Pod5_SX.)^V7Co +]Xtbc\@8oT['R*EYct=6XfSS'WMl_mV50o]TqS-NSt2@?R[KP0QBd\uP*1ofO,f0XMi*@ILPCP; +KS+l-J:N,uI=-BfH?jaZGBS+NFE;JBEH#i6DJa3*CMIQtBP;$jrac=F@q/tW@:Q7n*=oMP'=8Z+uX2i:]=,d:&[ic9DV9[8c;3U8,PjR7I3G?<9d*:8bbjV7J]LJ +8,PpV8bl!X9DqQ]:&dugS5M +DuO_PEW1"XF89qVFo?LXGPcX^H1H:=HhD^`H2W!`GQ)dbFnp.YF8U(MEVOMFEW'qVF8U.ZFoHR_ +GQ2peH2W'hHiJKlIK+crJ,OotJcC?#KE$W)L&Qi,L]<2/M>rJ5MuAV7NW5%dTV/!PU8+KZUnsrdVl6SpWiN5'Xfek3Yd(L?Za@-K\%&uZ]"G\h +^;%G!_SX40`Q#s>ai_fMc-FV\d*^:jeC<%#f@\d1g=tE=h;7)JiSrkWj5f=ak3(t-klU/9li-5P +mI'EAn,MnWnbr%YoD\CZp&4U_p\4I[q>:$Zqtg6crTjH6s1eSa~> +JcC<$JcGBBo)ARcrVZNhrqcZjr:plS%.>5_V(=T2D"S5MDuO_Q +EW'qWF89qVFo6FWGPl^_H16.>HhD^_H2W!aGQ)daFo$4YF8^.OEV+5CEW1"XF8L(YFoQX_GQ2pf +H2W'hHiJKlIK+crJ,Om!JV&LPKE$W)L&Hc+LB*//M>rJ5MuAV7NW5%KUXJcEIaJ,~> +JcC<$JcGBBo)ARcrVZNhrqcZjr:plS%.>5_V(=T2D"S5MDuO_QEW'qWF89qVFo6FWGPl^_H16.>HhD^_H2W!aGQ)daFo$4YF8^.OEV+5CEW1"XF8L(Y +FoQX_GQ2pfH2W'hHiJKlIK+crJ,Om!JV&LPKE$W)L&Hc+LB*//M>rJ5MuAV7NW5%KUXJcEIaJ,~> +JcC<$JcGBBo)ARcrVZNhrqcZjr:plS%.>5_V(=T2D"S5MDuO_QEW'qWF89qVFo6FWGPl^_H16.>HhD^_H2W!aGQ)daFo$4YF8^.OEV+5CEW1"XF8L(Y +FoQX_GQ2pfH2W'hHiJKlIK+crJ,Om!JV&LPKE$W)L&Hc+LB*//M>rJ5MuAV7NW5%KUXJcEIaJ,~> +JcC<$JcGBBnc&IbrVZQirqcWirV6Bds7ZEas7?<_rUL$[nF6GGs6]mSrp9[N!:'RJs6'IGroO:D +jQ-=#!TN);i.'Y@hVI#CgtUQ:g"G$0f@JO'eC;sqda?Ihcd'h\bfe2PaiVWE`l5p8_ns:,^q[Xt +]Y(kf\[],W[^ +KnG#0JUi9#IXQTjH?sj]GBXL>F`__HEcH)b7r*oY8rabqrg<_Rs-iqV!h>gPrgj._T`1VcU8.^`!Mu[mVb*hdWiE,$Xf\b0YctCKRWJcEF`J,~> +JcC<$JcGBBnc&IbrVZQirqcWirV6Bds7ZEas7?<_rUL$[nF6GGs6]mSrp9[N!:'RJs6'IGroO:D +jQ-=#!TN);i.'Y@hVI#CgtUQ:g"G$0f@JO'eC;sqda?Ihcd'h\bfe2PaiVWE`l5p8_ns:,^q[Xt +]Y(kf\[],W[^ +KnG#0JUi9#IXQTjH?sj]GBXL>F`__HEcH)[gXs,-hF +qF:0KrCHiXqF^]Zr_3/_s%`QjrhTU^l'MC:q3V#Fo9]D_ra>b7r*oY8rabqrg<_Rs-iqV!h>gPrgj._T`1VcU8.^`!Mu[mVb*hdWiE,$Xf\b0YctCKRWJcEF`J,~> +JcC<$JcGBBnc&IbrVZQirqcWirV6Bds7ZEas7?<_rUL$[nF6GGs6]mSrp9[N!:'RJs6'IGroO:D +jQ-=#!TN);i.'Y@hVI#CgtUQ:g"G$0f@JO'eC;sqda?Ihcd'h\bfe2PaiVWE`l5p8_ns:,^q[Xt +]Y(kf\[],W[^ +KnG#0JUi9#IXQTjH?sj]GBXL>F`__HEcH)C'el2H86^&NT~> +JcC<$JcGBBnc&IbrVZQirqcWir:p +KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-rbD^QBkV0mB4h-S!G#^>@fKm:@/aO5?3":0 +>lS%.>5VP'=T2D"j:A[cb9`Ic^9)_E\8GG^Q7f#RE7/Ys8][=@k7J]LI +8,Z!W8bl!W9E%W]:&[ocir@6gb5fcHbPbfJ@/aU4@fBm;AG]s%=OT1IBP5gaGPl6jK +QC!s:Qi`\ERf8fVS,f,ZT)YD_T`1VcU8.^`!Mu[mVcfstWiE,$Xf\b0YctCb +]Y2%o^qmn)_o0O6a2l?EbKJ,ScHjkbdF-Ooe^i@(f\5'6gtgfChr*GOioB([jlY^gkih9qlKdd& +m-X3.rpTmVs7-'Ys7?9_r:U'_rV--_qt^-co)&4[q#0IVJcEC_J,~> +JcC<$JcGBBnc&IbrVZQirqcWir:p +KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-rbD^QBkV0mB4h-S!G#^>@fKm:@/aO5?3":0 +>lS%.>5VP'=T2D"j:A[cb9`Ic^9)_E\8GG^Q7f#RE7/`n]V9k1pMuQ6B +7eT@N8Gu-U9)VE^9_qK_:AgsgR-U+:R-0h7?iOO5@JjU6A,g*:AcHBABDcHBC&VlFC]8/LD>\;M +DuO_QEW'qWF89qUFo?LWGPcX^H1$"CHh2R]H2W!aGQ)daFo$4ZF8^.QEUIf?EW1"XF8L(ZFoQX_ +GQ2pfH2`-iHiJKlIK+`rJ,OotJH1<#KE$W)L&Qi,L]<20M>rJ5MuAV7N<#";O8k=AOoCODPQ-mG +Pld8aND]Lbg"GZd*^7heC<%"f@S[/g=tE=h;7&Ii8N\Uj5f=ak3(sll07L! +lg4!*mI'uBs7$'YrUU![s7H6^rq? +JcC<$JcGBBnc&IbrVZQirqcWir:p +KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-rbD^QBkV0mB4h-S!G#^>@fKm:@/aO5?3":0 +>lS%.>5VP'=T2D"j:A[cb9`Ic^9)_E\8GG^Q7f#RE7/U'K9(P^P9(PXS +7J]LI8,Z!W8bl!W9E%W]:&[oc\;M +DuO_QEW'qWF89qUFo?LWGPcX^H1$"CHh2R]H2W!aGQ)daFo$4ZF8^.QEUIf?EW1"XF8L(ZFoQX_ +GQ2pfH2`-iHiJKlIK+`rJ,OotJH1<#KE$W)L&Qi,L]<20M>rJ5MuAV7N<#";O8k=AOoCODPQ-mG +Pld8aND]Lbg"GZd*^7heC<%"f@S[/g=tE=h;7&Ii8N\Uj5f=ak3(sll07L! +lg4!*mI'uBs7$'YrUU![s7H6^rq? +JcC<$JcGBBnc&IbrVZNhrqcZjr:p9cs7ZEas7?<_rUU!Y!:]sU!q,ICrp0^PlK\B5!pJh1roOII +jQ,@]io8qri!8/rhVI#CgtVh^!SQ-)f)aIQrmV,#da?Ihci243c-4ASb/q`Ga2Z*:_ns:,^q[Xt +]Y(kf\[],W[^ +KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-Chmg$C&VcHB4h-S!b>eNraGq;?srt@s'G_2 +rETA,s'#>'s&f8%r)Whtr`&eor_i_mr)!Ags%`Gcr_3;aqb$iZrCH]RqaUBMogJc9pq?Urc8!Z +r,hp\s*"?bs*4QhrHeKj!.=`ns*artrIFp!!.t0%!ec8]rItB/Lku"d!fDnorJ^c9!07#=s,d8C +rf[;Fs-3JIs-ai_fMc-FV\d*^:jeC<%"f@\d1g=tE=h;7&Ii8N\Uj5f=a +k3(t-klL)8rp0^RmdC)Cs6p$YrUU![rq--]rq??cq=sm`qYKd[q>C!cl2H86]DmB~> +JcC<$JcGBBnc&IbrVZNhrqcZjr:p9cs7ZEas7?<_rUU!Y!:]sU!q,ICrp0^PlK\B5!pJh1roOII +jQ,@]io8qri!8/rhVI#CgtVh^!SQ-)f)aIQrmV,#da?Ihci243c-4ASb/q`Ga2Z*:_ns:,^q[Xt +]Y(kf\[],W[^ +KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-Chmg$C&VcHB4h-S!b>eNraGq;?srt@s'G_2 +rETA,s'#>'s&f8%r)Whtr`&eor_i_mr)!Ags%`Gcr_3;aqb$iZrCH]RqaUBMogAeUrh[kupko,@ +qF:0Kr(-cXq+CWZrCm)_r_rc8!Zr,hp\ +s*"?bs*4QhrHeKj!.=`ns*artrIFp!!.t0%!ec8]rItB/Lku"d!fDnorJ^c9!07#=s,d8Crf[;F +s-3JIs-ai_fMc-FV\d*^:jeC<%"f@\d1g=tE=h;7&Ii8N\Uj5f=ak3(t- +klL)8rp0^RmdC)Cs6p$YrUU![rq--]rq??cq=sm`qYKd[q>C!cl2H86]DmB~> +JcC<$JcGBBnc&IbrVZNhrqcZjr:p9cs7ZEas7?<_rUU!Y!:]sU!q,ICrp0^PlK\B5!pJh1roOII +jQ,@]io8qri!8/rhVI#CgtVh^!SQ-)f)aIQrmV,#da?Ihci243c-4ASb/q`Ga2Z*:_ns:,^q[Xt +]Y(kf\[],W[^ +KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-Chmg$C&VcHB4h-S!b>eNraGq;?srt@s'G_2 +rETA,s'#>'s&f8%r)Whtr`&eor_i_mr)!Ags%`Gcr_3;aqb$iZrCH]RqaUBMogJaXk">5rc8!Zr,hp\ +s*"?bs*4QhrHeKj!.=`ns*artrIFp!!.t0%!ec8]rItB/Lku"d!fDnorJ^c9!07#=s,d8Crf[;F +s-3JIs-ai_fMc-FV\d*^:jeC<%"f@\d1g=tE=h;7&Ii8N\Uj5f=ak3(t- +klL)8rp0^RmdC)Cs6p$YrUU![rq--]rq??cq=sm`qYKd[q>C!cl2H86]DmB~> +JcC<$JcG?Ao)ARcrVZNhrqcWir:p +KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-Chmg$C&VcHB4h-Ss'u+>raPn9!+>b4s'G_2 +rETA,s'#>'s&f;&qc<_sr`&eor_ibnr)!Agr_EAcr_3;aqb$fYrCH]RqaUBMpI,#=!T1Th^A#>' +]^NH47J]LH8,Z!V8bu'X9E%W]:&[lf:]05?bl,``biR%I?iFI4@JjU7A,^$:Ac?<@BDcHCC&VlE +C]A5MD>S5MDuFYPEW'qVF89qVFo6FVGPZR\H0]eKHgc:ZH2Mp`GQ)daFo$4ZF8^.REU.T=EW1"X +F8U.[FoHR_GQ2mfH2W'hHiJKmIK+crJ,XuuJH1<#K*$^[L&Qi,L]<20M>rJ5MuJ\8NW5%b]Y2%o^VI_'_o0O5a2l?Db0/#RcHab_dF-LneCE1&f\,!4gYCW@hV[8Mir7sA +jQ5OdkNMp0!UB"MliQSBmf)YVnF?&Io)J=]o_eC]pAXg^q#'scqXXOYr:g0Rrdk*\s*t~> +JcC<$JcG?Ao)ARcrVZNhrqcWir:p +KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-Chmg$C&VcHB4h-Ss'u+>raPn9!+>b4s'G_2 +rETA,s'#>'s&f;&qc<_sr`&eor_ibnr)!Agr_EAcr_3;aqb$fYrCH]RqaUBMpI+tVnr;C_qMP>B +qF:-JrCHiXqF^]Zr_3/_r_Il'MBVra>_6r*o\9rabqs,d8CrK75G +Pa)-3s-gPrgs.^!20=bs.TLgrhKRkVZ*J`W2ZesX/i>(Xfek3Yd(L?Za@-K +[^WcW\\#Me]tV7r^r!t+`5T^9aN2KGbKS5VcHjkbdaQ^qe^rF*g"P07gtgfChr*JQro41CjlY^g +kl0fIlKeH9!q#FDrpKpXnaZSKs7?9_r:U'_rqH6`r;$9eo)&4[p\j=TJcE=]J,~> +JcC<$JcG?Ao)ARcrVZNhrqcWir:p +KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9DJj<-Chmg$C&VcHB4h-Ss'u+>raPn9!+>b4s'G_2 +rETA,s'#>'s&f;&qc<_sr`&eor_ibnr)!Agr_EAcr_3;aqb$fYrCH]RqaUBMpI+sZr_(d6oLT$O +qF:-JrCHiXqF^]Zr_3/_r_E;4GPErL.XFT6L_ +G5ZXbGQ<$fHN/?lI/\QoIfFosJH(0#K)L<'KS>-ZLB!&/M#N82MZ8V6N;nn;NrG+>OT1IAOogi3 +Pl6mIQ2m9MR/`QSRf/]WS=Q5MT)YD_T`1YbU&^tfU]IC*[qtU*`rTO63s185\~> +JcC<$JcG?Anc&IbrVZNhrqcZjr:p +KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9s).jR$>aKnC2%BqBP1phrac.A@q5LI!b#JErEfV4 +?![D6r`fD+rE9,%s&],!r`/ttqc!Mmr_`Sis%iVhqb@)ar_*)[r^m&ZpIG*MpI4sI!9*q8qS):/ +o=XS)q*t'Jr(-cXq+CWZrCm)_rD*Ags5F"9qp"HNk0*a2ra>b7qdTS8rabqs,d8C +rf[;Fs-3JI!g]1>rL!VQ!1NkUs-s([rgs.^s.K@b!MZ@gV#R7kVZ*JeW2ZesX/i>(Xfek3Yd(L? +Za@-K[^WcW\[oDc]Y2(p^qmn)_o0O6a2l?DbKJ,ScHaeadF-Lne^i@(f\,!4gYL]Bhr*GOioB([ +jo4BMkNM0plK[^%m-X3.rpTmVs7-*Zs7?9_r:U'_rqH9ar;$9eo)&4[p\j=TJcE7[J,~> +JcC<$JcG?Anc&IbrVZNhrqcZjr:p +KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9s).jR$>aKnC2%BqBP1phrac.A@q5LI!b#JErEfV4 +?![D6r`fD+rE9,%s&],!r`/ttqc!Mmr_`Sis%iVhqb@)ar_*)[r^m&ZpIG*MpI4sIrMAS7kD]=s +q*t'Jr(-cXq+CWZrCm)_rD*AgrM9=YkEtP$ra5Y4s'be6s'u%=r+5k>s(D4Bs(VIIqeQ4Jrb_OM +rbqaSqf2RTrH%dVr,qp\p36@Xq0C>5r-A3bqKMm]rcS'ZrcA$YpMotIqeu7Kq/QCSrcA!Zs)n?b +rHJ9ds*=Tis*OcnrdFfq!.Xrt!eGrTre(6(!/:B+!f)Sfre^Z4s,6l8s,I&=rf@)@s,m;Ds-*JI +rKRGMQ^@ZaN;WKbg"GYd*^7he'uq!f@S[.g=k<;h;7&Ii8N\Uj5f>$jpUA9 +l07Kulg4!*mI'uBs7$'Yrpp*\s7H6^rq??cqY:!ar;-!]q#'mbkl-/5\Gq'~> +JcC<$JcG?Anc&IbrVZNhrqcZjr:p +KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEEH,r9s).jR$>aKnC2%BqBP1phrac.A@q5LI!b#JErEfV4 +?![D6r`fD+rE9,%s&],!r`/ttqc!Mmr_`Sis%iVhqb@)ar_*)[r^m&ZpIG*MpI4sI!*0"trCc3D +k"5Ara5Y4s'be6s'u%=r+5k>s(D4Bs(VIIqeQ4Jrb_OM +rbqaSqf2RTrH%dVr,qp\p36@Xq0C>5r-A3bqKMm]rcS'ZrcA$YpMotIqeu7Kq/QCSrcA!Zs)n?b +rHJ9ds*=Tis*OcnrdFfq!.Xrt!eGrTre(6(!/:B+!f)Sfre^Z4s,6l8s,I&=rf@)@s,m;Ds-*JI +rKRGMQ^@ZaN;WKbg"GYd*^7he'uq!f@S[.g=k<;h;7&Ii8N\Uj5f>$jpUA9 +l07Kulg4!*mI'uBs7$'Yrpp*\s7H6^rq??cqY:!ar;-!]q#'mbkl-/5\Gq'~> +JcC<$JcG?Anc&IbrVZNhrqcWir:pQ7n)=oVV(=8Z+uX2i:]=,e:&[ic9D_?[8c;3T8,>^J7K5dSiVC4R^%8o, +]D>"i8,Z!V8bu'X9E%W]:&[oe:]92Bc19*AbPklJ@/j[5@fBm:AGg$OT1IBP5gaG +Pl?sJQN*jW2ZesX/i>(Xfek3Yd(L>Za7$H +[^NZT\[oDc]Y2%o^VI\&_o0O5`lH0Bb0.uPcHab_dF$CleCE.%f@\d1gYCW@hV[8LiSrnXjQ5Od +kNM-ol0@U6liQSBmf)YVnF?&Inc8:\o_nI^pAXg_q#1$cqXaUZr:g0Rrdk*Xs*t~> +JcC<$JcG?Anc&IbrVZNhrqcWir:pQ7n)=oVV(=8Z+uX2i:]=,e:&[ic9D_?[8c;3T8,>^J7K5dSV;mQuN;\\2 +7eK:M8Gl'U9)VE^9_qK_:B"&fV":#BR-U+S5M +DuFYPEW'qVF80kTFo6FUGPcX\H.%$:H2Mp_GQ)dbFo$4YF8g4TEVXSHDu+GLEW1"XF8U.[FoQX` +G63#7H2W$jH[L5?IK+crJ,Xs"JV&LQKE$T)L&Qi,L]<20M#rQmMuJ\8NW5%:$[qtU*`rTO63s0hrX~> +JcC<$JcG?Anc&IbrVZNhrqcWir:pQ7n)=oVV(=8Z+uX2i:]=,e:&[ic9D_?[8c;3T8,>^J7K5dSOT1IBP5gaGPl?sJ +QN*jW2ZesX/i>(Xfek3Yd(L>Za7$H[^NZT +\[oDc]Y2%o^VI\&_o0O5`lH0Bb0.uPcHab_dF$CleCE.%f@\d1gYCW@hV[8LiSrnXjQ5OdkNM-o +l0@U6liQSBmf)YVnF?&Inc8:\o_nI^pAXg_q#1$cqXaUZr:g0Rrdk*Xs*t~> +JcC<$JcG?AnG`Cbr;?EgrqcZjr:p9cs7ZEas7H?_rUL$[nF6DF!q,ICrp9[N!:'RJs60LGroO:D +jQ-=##NF_$i8EMMhYu>\gtUT;g=b03f@SU)e^W*tdaHOjd*L"_c-4ASb/q`Ga2Z*;_ns:,^q[Xt +]Y(kf\[],W[C!9HZ*:I8Xf\\)Wi;noVPU)`U7n6PSt2C@R[KP1QBd`"P*1rhO,f3YN/EIKLkg_= +KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEs)A6^Df9N2D/B2e!GZ?JBF&6_An>OaA7K-K@fKj:@/XI4 +?N4=0>lS%->5_V'=T;J#j:Adic9`@]^9)V?[8G>XM7eT:LiVC4Q^%8o. +]D>"i8,PpV8bl!X9DqQ\:&[oe:]9/9c2#TJbPbfJ@/aU4@fBm:AGg$=B)ZH@B`;`FCA_lHD#S;K +DZ4SQE;FSRErC(SFSp:YG4g(UGkcR8HM`!dGklR^G5cX\FT-@[EqjYOE:\#EE;FSRErL.YFT6L` +G5ZXbGlN'gHN/
  • -ZLB!#/M#N82M?&S5Muo!!NrG+>OT1IBP5gaG +Pl?sJQN*(Xfel,YXGb%Za7$H +[^NZT\[f;`]Y(ql^VI\&_Sa=2`lH0Aai_fNc-FV\d*^:jeC<%"f@S^0g=tE=h;7&Ii8N\Uj5f=a +k3(t-klL)8rp0[Qmf)\TnGi%Xo)J=]o_nI^pAXg_q#1$dqXaUZr:g0Qrdk*Ws*t~> +JcC<$JcG?AnG`Cbr;?EgrqcZjr:p9cs7ZEas7H?_rUL$[nF6DF!q,ICrp9[N!:'RJs60LGroO:D +jQ-=##NF_$i8EMMhYu>\gtUT;g=b03f@SU)e^W*tdaHOjd*L"_c-4ASb/q`Ga2Z*;_ns:,^q[Xt +]Y(kf\[],W[C!9HZ*:I8Xf\\)Wi;noVPU)`U7n6PSt2C@R[KP1QBd`"P*1rhO,f3YN/EIKLkg_= +KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEs)A6^Df9N2D/B2e!GZ?JBF&6_An>OaA7K-K@fKj:@/XI4 +?N4=0>lS%->5_V'=T;J#j:Adic9`@]^9)V?[8G>XM7eT:LV;dKtN;nh4 +7eK:L8Gu-U9)_K^9_qK_:B"&fV!FHAR-g7=?iOO5@JjU6A,^$:AcHBABDcHBC&VlFC]8/LD>S5M +DuFYOEW1"WF80kTFo-@TGPZRZH.I<=H2W!`GPu^aFo$4ZF8^.SEVj_HDu+GLEW1"XF8^4\FoQX` +GQ2pfH2`-iHN8HlI0+kIJ,Xs"JV&LQK*$^[L&Qi,LB*/0M>rG5MuAS9NK0%uO8k=AOoCODPQ-mH +Q2d0MQi39QR@9TCS,\uYSc,/[T)bP`U&UkeU].%iV5F6i$`L&(WiE,#XKAV-YPtaoZ*L^B['d?N +\%&uZ]">Vf]tV7s_8=(,`5Ta:aN2KGbKS5VcHjkbdaQ^qe^i@(g"P07gtgfChr*GOioB([jlY^g +kl0fIlKeH9!U]=Sn,MnWnc&+ZoDeI]p&=[ap\O[`q>C*\qtU*`rTF02s0_lW~> +JcC<$JcG?AnG`Cbr;?EgrqcZjr:p9cs7ZEas7H?_rUL$[nF6DF!q,ICrp9[N!:'RJs60LGroO:D +jQ-=##NF_$i8EMMhYu>\gtUT;g=b03f@SU)e^W*tdaHOjd*L"_c-4ASb/q`Ga2Z*;_ns:,^q[Xt +]Y(kf\[],W[C!9HZ*:I8Xf\\)Wi;noVPU)`U7n6PSt2C@R[KP1QBd`"P*1rhO,f3YN/EIKLkg_= +KS+o/JUi9#I=6KiH?sj]GB\4QFEDSEs)A6^Df9N2D/B2e!GZ?JBF&6_An>OaA7K-K@fKj:@/XI4 +?N4=0>lS%->5_V'=T;J#j:Adic9`@]^9)V?[8G>XM7eT:L-ZLB!#/M#N82M?&S5Muo!!NrG+>OT1IBP5gaGPl?sJ +QN*(Xfel,YXGb%Za7$H[^NZT +\[f;`]Y(ql^VI\&_Sa=2`lH0Aai_fNc-FV\d*^:jeC<%"f@S^0g=tE=h;7&Ii8N\Uj5f=ak3(t- +klL)8rp0[Qmf)\TnGi%Xo)J=]o_nI^pAXg_q#1$dqXaUZr:g0Qrdk*Ws*t~> +JcC<$JcG<@nc&IbrVZNhrqcWir:pS.s',J+rE9,%s&],!s&K%trDW\ns&&\jr_NPhqb@)ar_*)[rCQrYpIG!Jq*k;ApV,FroXt&j +oLJjNr(6]Vr_*2`qb@#ar_NRNs4un`qon?KrEoS4raG_6raYqqg&*aqKMm]rcS'ZrH%sYpi61MnSe;DqJlLTs)\*[s)n?b +rHAaND]Lbg"GYcdC.ge'umtf@S[.g=k<:h;-rFi8ESRj5]4^ +k2tjjrojIKli-5OmI'uBs6p$YrUU![s7H9_s7ZHdqY:$brVH0`q#'jak5Kr3[/YX~> +JcC<$JcG<@nc&IbrVZNhrqcWir:pS.s',J+rE9,%s&],!s&K%trDW\ns&&\jr_NPhqb@)ar_*)[rCQrYpIG!Jq*k:Zb`2IXqaU3J +rCHiXq+CWZrCm)_rD*>frM8PCqO$];rEoS4raG_6raYqqg&*aqKMm]rcS'ZrH%sYpi61MnSe;DqJlLTs)\*[s)n?brHAaND]Lbg"GYcdC.ge'umtf@S[.g=k<:h;-rFi8ESRj5]4^k2tjj +rojIKli-5OmI'uBs6p$YrUU![s7H9_s7ZHdqY:$brVH0`q#'jak5Kr3[/YX~> +JcC<$JcG<@nc&IbrVZNhrqcWir:pS.s',J+rE9,%s&],!s&K%trDW\ns&&\jr_NPhqb@)ar_*)[rCQrYpIG!Jq*k9_qFf%)qaU3J +rCHiXq+CWZrCm)_rD*>frE//[k>M7cs'Yh7r*oY8rabqVf]tV7r^qmn*`5T^8a2l?EbKJ,ScHab`dF-LneCE1&f\,!4gYCW@hV[8LiSrnXjQ5OdkNMp0 +!UB"MliHMArpTmV!:g$Ys7?9_rUp3arqH9arV?Ego_\F]pAO.QJcE+WJ,~> +JcC<$JcG<@nc&FarVZNhrqcZjqtU3cs7ZEas7H?_rUU!Ys7$$Vs6fpSrp9[N!:'OI!pJh1roO:D +jQ-=#!oi1trnn%=hVR)Egt^Z`g&]mZrmq2%ec+'Ie'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xt +]Y(kf\[],W[C!9GZ*:I8Xf\Y(Wi;noVPL#_TqS-OSt2C@R[KP0QBd`!P*1rhO,f3YN/EIKLkg_= +KS+o/JUi9#IXQTjH?sj]GB\4QFEDSEEcH)+\@K/]]=bej^V@S#_SX4/`PojL0^qt^0`rT4$0s0M`U~> +JcC<$JcG<@nc&FarVZNhrqcZjqtU3cs7ZEas7H?_rUU!Ys7$$Vs6fpSrp9[N!:'OI!pJh1roO:D +jQ-=#!oi1trnn%=hVR)Egt^Z`g&]mZrmq2%ec+'Ie'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xt +]Y(kf\[],W[C!9GZ*:I8Xf\Y(Wi;noVPL#_TqS-OSt2C@R[KP0QBd`!P*1rhO,f3YN/EIKLkg_= +KS+o/JUi9#IXQTjH?sj]GB\4QFEDSEEcH)jMuo!!NrG(@OHG\)P5gaGPl?sJ +QN* +JcC<$JcG<@nc&FarVZNhrqcZjqtU3cs7ZEas7H?_rUU!Ys7$$Vs6fpSrp9[N!:'OI!pJh1roO:D +jQ-=#!oi1trnn%=hVR)Egt^Z`g&]mZrmq2%ec+'Ie'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xt +]Y(kf\[],W[C!9GZ*:I8Xf\Y(Wi;noVPL#_TqS-OSt2C@R[KP0QBd`!P*1rhO,f3YN/EIKLkg_= +KS+o/JUi9#IXQTjH?sj]GB\4QFEDSEEcH)jMuo!!NrG(@OHG\)P5gaGPl?sJ +QN* +JcC<$JcG<@nG`@arVZNhrqcWir:ps5F%;ro!h6!8d_2!SlH/g'66_f[na+ec+'6e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Us +]Y(ke\[],W[C!9GZ*:F7Xf\Y(Wi2hnV50o^TqS-NSt2C@R[KP0QBd`!P*1rgO,f3YN/EIKLkg_= +KS+o/JUi9#IXQTjH?sj]GB\4QrcAlS%.>5VP'=T;J#j:Adic9`@]]9)_E[8G,LG7fMB?^>-Eq]_b1j +8,PpV8bl!W9E%W]:&[oe:]F8kguclSbjimT?iOO5@JjU6A,^$:AcHBABDcHBC&VlFC]8/LD>S5L +DuO_PEW'qUF80kSFo-@RGPHFWH/a/HH2Mp^GQ)daFo-:ZF8g4TEVj_DDu=SNEW:(YF8^4\FoQX` +G63#7H2`-iHN8HmIK+`rJ,XuuJH1<$K*R'`Knb>;LPYqds,$f7rf$l:!07&>s,[5CrK75GPa)04 +s-E\Org<_Rs-inU!h>gPrLX%]!20:as.TLgrM0LkVPa?j!iW)tri-""XT#=&Y-7i/9aN;TJbg"GYcd:(ee'umtf%8O+g"P39h;-rFi8ESRj5]4^ +k2tjikiq?sli-5VmI'E2n*oi:nc&+ZoDeI]p&Fabp\Xabq>C*^qt^0`rT4$0s0;TS~> +JcC<$JcG<@nG`@arVZNhrqcWir:ps5F%;ro!h6!8d_2!SlH/g'66_f[na+ec+'6e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Us +]Y(ke\[],W[C!9GZ*:F7Xf\Y(Wi2hnV50o^TqS-NSt2C@R[KP0QBd`!P*1rgO,f3YN/EIKLkg_= +KS+o/JUi9#IXQTjH?sj]GB\4QrcAlS%.>5VP'=T;J#j:Adic9`@]]9)_E[8G,LG7fK7,NW"h57eB4K +8Gu-U9)VE^9_qK_:B"&h;#d?ORJ<0>Qi1:k@/aU4@fBm:AGg$=B)ZH@B`;`FCA_lHD#S;KDZ+MQ +E;FSQEr:"RFSg4XG4TqQGkZLCHMVpbGkcL^G5ZR\FT$:[EqjYOE:7`CE;FSSErL.YFT6L`G5ZUd +G^4T6HN/
  • ,7L51P?re^Z4!/pi8s,@#=rf@)@!0R5C!gAk5rg!ML +s-N_Ps-`nUrL3kYSXo_Ns.9:arLs7c!2KLg!i;ckrhfgrWN#ls!NW=$XT>T.rif&#ZEpmE['d?N +\%&uZ]">Vf]tV7r^qmn)`5T^8a2l?Db0/#RcHab_dF$FmeCE.%f@\d1gYCW@hV[8LiSrnXjQ5Od +kND'nl0@U6lj3"HmdKW6nF?&Jo)J=]o_nI_pAXg`q#:*eqXsa]r:^*Nrdk*Ss*t~> +JcC<$JcG<@nG`@arVZNhrqcWir:ps5F%;ro!h6!8d_2!SlH/g'66_f[na+ec+'6e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Us +]Y(ke\[],W[C!9GZ*:F7Xf\Y(Wi2hnV50o^TqS-NSt2C@R[KP0QBd`!P*1rgO,f3YN/EIKLkg_= +KS+o/JUi9#IXQTjH?sj]GB\4QrcAlS%.>5VP'=T;J#j:Adic9`@]]9)_E[8G,LG7fHE`9@$319D_3N +8,PpV8bl!W9E%W]:&[oe:]F8k=PHdD;Z0u&@/aU4@fBm:AGg$=B)ZH@B`;`FCA_lHD#S;KDZ+MQ +E;FSQEr:"RFSg4XG4TqQGkZLCHMVpbGkcL^G5ZR\FT$:[EqjYOE:7`CE;FSSErL.YFT6L`G5ZUd +G^4T6HN/
  • ,7L51P?re^Z4!/pi8s,@#=rf@)@!0R5C!gAk5rg!ML +s-N_Ps-`nUrL3kYSXo_Ns.9:arLs7c!2KLg!i;ckrhfgrWN#ls!NW=$XT>T.rif&#ZEpmE['d?N +\%&uZ]">Vf]tV7r^qmn)`5T^8a2l?Db0/#RcHab_dF$FmeCE.%f@\d1gYCW@hV[8LiSrnXjQ5Od +kND'nl0@U6lj3"HmdKW6nF?&Jo)J=]o_nI_pAXg`q#:*eqXsa]r:^*Nrdk*Ss*t~> +JcC<$JcG9?nc&IbrVZNhrVHQiqtU3cs7ZB`s7H?_rUL$[nF6DFs6]mSrTsRM!:'OI!pJh1roX7B +!9F.>s5F%;ro!h6!8d_2G21j,g=k65f[na+f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xt +]Y(ke\[],W[C!9GZ*:F7XfSS'Wi2hnV50o^TqS-NSt2C@R[KP0QBd`!P*1rgO,f3YN/EIKLkg_= +KS+o/JUi9#IXQWlH?sj]rc\ZlF`__HEcH)lS%.>5VP'=T;J#-Er]_t=k +8,PpU8bl!X9DqQ\:&[oe:]F8kgZ?]MbkB6Y?iOO5@JjU6A,^$:AcHBABDcHBC&VlEC]A5MD>J/L +DuO_OEW'qVF8'eRFo$:PGPHFVH0KYMH2Mp^GPu^aFo$4ZF8^.TEVj_CDu=SOEW1"YF8U.[FoQXa +GQ2mfH2W$oH[L3hI=?Wprdb$"!.t3&!JH1+LB!#/M#N54MMmDlMueourf@)@s,m;D!gAk5rg!ML +s-N_Ps-`nUrgWqXs.0+[!hZ-YrLs7c!2KLgs.o^mrhodp!3,sts/Q.$riH4(YPta,Z*OA88$o\4 +[^WcW\[oDc]Y2%o^VI\&_Sa=2`Q#s>aND]Lbg"GYcd:(fe'umtf%8O+g=k<:h;-rFi8ESRj5]4^ +k2tjjkiq?sli-5OmI'uBs6p$YrUL$]o^r+Trq?BdqtU0dr;--aq>BsbjSj`1YlB4~> +JcC<$JcG9?nc&IbrVZNhrVHQiqtU3cs7ZB`s7H?_rUL$[nF6DFs6]mSrTsRM!:'OI!pJh1roX7B +!9F.>s5F%;ro!h6!8d_2G21j,g=k65f[na+f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xt +]Y(ke\[],W[C!9GZ*:F7XfSS'Wi2hnV50o^TqS-NSt2C@R[KP0QBd`!P*1rgO,f3YN/EIKLkg_= +KS+o/JUi9#IXQWlH?sj]rc\ZlF`__HEcH)lS%.>5VP'=T;J#HPa)04s-E\O +rg<_Rs-iqVs.'+[rLO(_TV27Ws.TLgrM9Ii!2fans/5psri6"!!3H1%!NrX*YQ;#7rj,,%[C3NQ +\@K/]]=bei^;%Fu_8=(,`5T^8a2l?EbKJ,ScHab_dF-LneCE.%f@\g2gYCW@hV[8LiSrnXjQ5Od +kNM-ol0@U6liHMArpTmV!:g$Y!qZ'VrUp0`s7cEcrqZKgpA=[`pAO(OJcDtSJ,~> +JcC<$JcG9?nc&IbrVZNhrVHQiqtU3cs7ZB`s7H?_rUL$[nF6DFs6]mSrTsRM!:'OI!pJh1roX7B +!9F.>s5F%;ro!h6!8d_2G21j,g=k65f[na+f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`59C-^q[Xt +]Y(ke\[],W[C!9GZ*:F7XfSS'Wi2hnV50o^TqS-NSt2C@R[KP0QBd`!P*1rgO,f3YN/EIKLkg_= +KS+o/JUi9#IXQWlH?sj]rc\ZlF`__HEcH)lS%.>5VP'=T;J#HPa)04s-E\O +rg<_Rs-iqVs.'+[rLO(_TV27Ws.TLgrM9Ii!2fans/5psri6"!!3H1%!NrX*YQ;#7rj,,%[C3NQ +\@K/]]=bei^;%Fu_8=(,`5T^8a2l?EbKJ,ScHab_dF-LneCE.%f@\g2gYCW@hV[8LiSrnXjQ5Od +kNM-ol0@U6liHMArpTmV!:g$Y!qZ'VrUp0`s7cEcrqZKgpA=[`pAO(OJcDtSJ,~> +JcC<$JcG9?nG`@arVZNhrqcWir:p9cs7ZEas7H?_rUU!Ys7$!Us6]mSrTsRM!:'OI!pJh1roX7B +!9F+=!oi1trnmh7hYu@2g]6+.g&]mZrmuVMe^W*tda?Ihd*L"_c-4ARaiMQD`l5p8_SX.)^V@Ip +]Xt_b\@8oS['R'CYck43XK/A$W2HPiUnj`YTqJ!KSXZ+;R@'>,Q'@JqP*(fdNfB!VMM[1GLPCP: +K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r:Df0H0D/B5fs(VOJrb2=E!+u4As().>raPn9s'Ye4 +s'G_2rET>+s'#A(r`K2%rDrnts&Aqqr_ibnr)!Dhr_EAcr_3;aqF^]Xr(-ELqaUVDoY0+opUpJp +njiUKr(6]Vr_*2`qb@#ar_NPjs4ZSZm*,@MrEoS4raG_6raYq$#It*!!JUrFPK*R'`Knb>;LPYqd!K)g7N;nk;NrG(@OHG\)P5g^GPl?sJ +QN* +JcC<$JcG9?nG`@arVZNhrqcWir:p9cs7ZEas7H?_rUU!Ys7$!Us6]mSrTsRM!:'OI!pJh1roX7B +!9F+=!oi1trnmh7hYu@2g]6+.g&]mZrmuVMe^W*tda?Ihd*L"_c-4ARaiMQD`l5p8_SX.)^V@Ip +]Xt_b\@8oS['R'CYck43XK/A$W2HPiUnj`YTqJ!KSXZ+;R@'>,Q'@JqP*(fdNfB!VMM[1GLPCP: +K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r:Df0H0D/B5fs(VOJrb2=E!+u4As().>raPn9s'Ye4 +s'G_2rET>+s'#A(r`K2%rDrnts&Aqqr_ibnr)!Dhr_EAcr_3;aqF^]Xr(-ELqaUU]c].[Xr^QHK +r(-`Wq+CWZrCm)_rD*>fs%r`kigK8&qj77gs'Yh7r*oY8rabq,7L51P?reUZ5MuJ\8N<#"aMrpp*\s7H9_s7ZKeqtU-crqc?cq>Bsbj8OW0YQ'+~> +JcC<$JcG9?nG`@arVZNhrqcWir:p9cs7ZEas7H?_rUU!Ys7$!Us6]mSrTsRM!:'OI!pJh1roX7B +!9F+=!oi1trnmh7hYu@2g]6+.g&]mZrmuVMe^W*tda?Ihd*L"_c-4ARaiMQD`l5p8_SX.)^V@Ip +]Xt_b\@8oS['R'CYck43XK/A$W2HPiUnj`YTqJ!KSXZ+;R@'>,Q'@JqP*(fdNfB!VMM[1GLPCP: +K7ec,J:N,uI=6KiH?sj]GB\4QFEDSEEH,r:Df0H0D/B5fs(VOJrb2=E!+u4As().>raPn9s'Ye4 +s'G_2rET>+s'#A(r`K2%rDrnts&Aqqr_ibnr)!Dhr_EAcr_3;aqF^]Xr(-ELqaUTcp.Nb)r^QHK +r(-`Wq+CWZrCm)_rD*>fs%r_tgJdT>rEoS4raG_6raYq$#It*!!JUrFPK*R'`Knb>;LPYqd!K)g7N;nk;NrG(@OHG\)P5g^GPl?sJQN* +JcC<$JcG6>nc&Ibr;?EgrqcWir:p)e^W*tdf.X0d*L"_c-4ARaiMQD`l5p8_SX.)^V7Co +]XkYa\@/iR['R'CYck43XK/A#W2HMhUnj`YTq@pJSXZ+;R@'>,Q'@JqP*(fdNfB!UMM[1GLPCP: +K7ec,J:N,uI=6KiH?sj]GB\4QFEDSErc%sXDuOVTD/B2e!buF`rb)@GAnM$Rs'u+>rF5e8s'Ye4 +s'G_2rET>+s'#A(s&f8%rDrqus&Anps&/kor)!Dhr_EAcr_3;aqF^ZWr(-S5M +DuFYNEW'qUF7s_QFo$:NGP?@>H2;d\GPu^`Fo$4ZF8^.TEVseBDuFYOEW:(YF8^4\FoQXaGQ2mf +H2`-iHN8HmIK+`rJ,Xs!JV*lR#D@ebL5(J=M#N53MMqIm!f`5#rf7)AOoCODP5pjGPld8mFlVuN[qWW&ptWrT7#XoGO(YPta,Z*OA8::.F;[^WcV +\[f;`]Y(ql^V@S#_SX4/`Poj;aN2KGbKS5VcHjkbdF-Lne^i@(f\,!4gYCW@hV[8LiSrnXjQ5Od +kNM0plK[^%m-X3.rpKpXnaZVLs766_rUp0`s7cHdrV?Egp\Xgbp\j+NJcDkPJ,~> +JcC<$JcG6>nc&Ibr;?EgrqcWir:p)e^W*tdf.X0d*L"_c-4ARaiMQD`l5p8_SX.)^V7Co +]XkYa\@/iR['R'CYck43XK/A#W2HMhUnj`YTq@pJSXZ+;R@'>,Q'@JqP*(fdNfB!UMM[1GLPCP: +K7ec,J:N,uI=6KiH?sj]GB\4QFEDSErc%sXDuOVTD/B2e!buF`rb)@GAnM$Rs'u+>rF5e8s'Ye4 +s'G_2rET>+s'#A(s&f8%rDrqus&Anps&/kor)!Dhr_EAcr_3;aqF^ZWr(-s(D4Bs(VIIqeQ1Irb_OMrbqaS +q/Q@Rr,_RRqfVaYn9=VOhg,'Cpil[[rH7sYrcA$Yq/Q=Olu2iAqJlOUrcA$[s)n?brceBe!."Qi +s*F`nrdFfq!.Xuu!J,k%K*R'`Knb>;LPYqd!K)g7Muo!!NrG(?OHKO*s-!GIrKRGMQ^@]=s-`nU +rgWqXs.0.\s.B=arLs7c!2KLgs/#amrhodp!3,sts/Q.$riQ4'!3cC+!O8s0ZVIm8[^NZT\@K/] +]=bei^;%Fu_8=(,`5T^8a2l?Db0/#RcHab_dF$CkeCE.%f@\d1g=tE=h;7&Ii8N\Uj5f=ak3(sm +l0@R"m-O-,mf)YVnF?&Jo)J:]o_nI^pAambq#1$eqY0m`r:g0Lrdk*Os*t~> +JcC<$JcG6>nc&Ibr;?EgrqcWir:p)e^W*tdf.X0d*L"_c-4ARaiMQD`l5p8_SX.)^V7Co +]XkYa\@/iR['R'CYck43XK/A#W2HMhUnj`YTq@pJSXZ+;R@'>,Q'@JqP*(fdNfB!UMM[1GLPCP: +K7ec,J:N,uI=6KiH?sj]GB\4QFEDSErc%sXDuOVTD/B2e!buF`rb)@GAnM$Rs'u+>rF5e8s'Ye4 +s'G_2rET>+s'#A(s&f8%rDrqus&Anps&/kor)!Dhr_EAcr_3;aqF^ZWr(-rEoS4raG_6raYqs(D4Bs(VIIqeQ1Irb_OMrbqaS +q/Q@Rr,_RRqfVaYn9=VOhg,'Cpil[[rH7sYrcA$Yq/Q=Olu2iAqJlOUrcA$[s)n?brceBe!."Qi +s*F`nrdFfq!.Xuu!J,k%K*R'`Knb>;LPYqd!K)g7Muo!!NrG(?OHKO*s-!GIrKRGMQ^@]=s-`nU +rgWqXs.0.\s.B=arLs7c!2KLgs/#amrhodp!3,sts/Q.$riQ4'!3cC+!O8s0ZVIm8[^NZT\@K/] +]=bei^;%Fu_8=(,`5T^8a2l?Db0/#RcHab_dF$CkeCE.%f@\d1g=tE=h;7&Ii8N\Uj5f=ak3(sm +l0@R"m-O-,mf)YVnF?&Jo)J:]o_nI^pAambq#1$eqY0m`r:g0Lrdk*Os*t~> +JcC<$JcG6>nc&FarVZNhrqcWir:p9cs7ZB`s7H?_rUU!Ys7$!Us6]mSrTsRM!:'OIs6'IGrT41C +jQ-=#s5F%;ro!h6!8d_2!SlH/g&]mZrmuYNe^W*tdaHOjd*L"_c-4ARaiMQD`l5p7_SX.)^V7Co +]XkYa\@/iRZa6sBYck43XK/A#W2HMhUnaZXTq@pJS=?":R$a5+Q'@JqP*(fdNfB!UMM[1GLPCP: +K7ec,J:N,uI=6KiH?sj]GB\4QFEDSFEcH)Q7n)=oVV(=8c2!j>j:]F2e:&[ic9DV9Y8c2-L8,qN=^>-Et]DtFk +8,GjU8bbpW9DqQ\:&[oe:]4)ifAt3>bl1uK@/aU4@fBm:AGg$;LkpnEMMd>kMueourf7,BOcfX+!gAk5rfmPNQ^@]=s-WkU +rL3kYSXo_Ns.B=arh9@ds.fOgs.o^mrMT[o!3,ps!irE(riHF.YHP17Z*CV6ZVRs9[^NZS\@K/] +]=bei^;%Fu_8=(,`5T^8a2l?Db0.uPc-FV\dF$CkeC<%"f@S[.g=k<;h;7&Ii8N\Uj5f=`k2tjj +l07L!lg4!*mdC)C!V#XXncJFTo_nI_pAXgaq#:*fqY0m`r:g0Lrdk*Ns*t~> +JcC<$JcG6>nc&FarVZNhrqcWir:p9cs7ZB`s7H?_rUU!Ys7$!Us6]mSrTsRM!:'OIs6'IGrT41C +jQ-=#s5F%;ro!h6!8d_2!SlH/g&]mZrmuYNe^W*tdaHOjd*L"_c-4ARaiMQD`l5p7_SX.)^V7Co +]XkYa\@/iRZa6sBYck43XK/A#W2HMhUnaZXTq@pJS=?":R$a5+Q'@JqP*(fdNfB!UMM[1GLPCP: +K7ec,J:N,uI=6KiH?sj]GB\4QFEDSFEcH)Q7n)=oVV(=8c2!j>j:]F2e:&[ic9DV9Y8c2-L8,oC1NV\S7Mam5, +qagZWpe(NYrCm&^r_EGgrD3KhiL/tura5Y4raG_6raYqs(D4Bs(VIIqeQ1Irb_OMrGV[S +q/Q=Qr,_RRqK;UWn9=VOjE^THpNQRZrH7sYrcA$Yq/Q=OlYl]?qf2XVrcA$[s)eLl$tGMMqIm!KE-=NrkE*OoCLFPE_=2Pld8hV[8LiSrnXjQ5Lck3(sm +l0@U#m-O--mf)YUnF?JJ!qZ'VrUp3arqH?crqZNhp\Xgbp\j+NJcDhOJ,~> +JcC<$JcG6>nc&FarVZNhrqcWir:p9cs7ZB`s7H?_rUU!Ys7$!Us6]mSrTsRM!:'OIs6'IGrT41C +jQ-=#s5F%;ro!h6!8d_2!SlH/g&]mZrmuYNe^W*tdaHOjd*L"_c-4ARaiMQD`l5p7_SX.)^V7Co +]XkYa\@/iRZa6sBYck43XK/A#W2HMhUnaZXTq@pJS=?":R$a5+Q'@JqP*(fdNfB!UMM[1GLPCP: +K7ec,J:N,uI=6KiH?sj]GB\4QFEDSFEcH)Q7n)=oVV(=8c2!j>j:]F2e:&[ic9DV9Y8c2-L8,lT^9@?E47e'"G +8Gu-T9)_K^9_qK_:B"&f:]OSN;t3cb?iFI4@JjU6A,^$:Ac?S5LDuO_O +EVskTF7s_PFnp4MGP?@CH2;d[GPu^`Fo$4ZF8^.TEVseADu=SOEW:(YF8^4\FT?U`G63#7H2`*p +H[L3hI=?WprdY$#K)UB2KS>,7L51S@M2@+IMuJY9NK4"!!g&P,rfR>HPa)04!g]1>rg<_R!1NkU +!h>gPrLX%]s.K@bs.]OgrM9Ii!2f^ms/5psrMfq"XK;E'#Hk86YctC;ZMq1+['d?N\$rlX\[oDc +]Y2%o^VI\&_Sa=2`Q#s>aN;TJbKS5VcHjncdaQ^qe^i@(f\,!4gYL]Bhr*GOioB([jlPXekNM0p +lKdd&m-X6/rpKmWnbr"[oCV\Rp&Fabp\agcq>L0aqtg6brSmg-s/c6N~> +JcC<$JcG6>nG`@arVZKgrqcWir:p9cs7ZEarq-6^rUU!Ys7$!Us6]mSrTsRMs6BUJs60LGroX7B +!9F.>s5O(;rnmh7hYu==gtUT;g=b03f@SU(rmY`4da?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1l +]",A\[^NTMZa-g>YHG"/X/`.tVl$;dUS=HTT:VXES"#k6R$X,(P`q8nOcPQ`NJrgRM2@%DL5(D7 +K7\Z)J:E#rI=-BfH?jaZGBS-.F:3/1EH,r:Df0H0D/B2e!buF`rb)@GAnM$Rs().>rF5e8s'Ye4 +s'G_2rETA,s'#A(r`K2%rDrqus&Anps&/kor)!Dhr_EAcr_3;aq+CTWqag9J!9!F^h7`WsnONII +r(6]VrCd,`qG$rarD3Ag!7g,Skfj!4s'Yh7r*oY8rabq/8LPL\BM2I1Krepl;NrG(EOHGZgP*;)org!ML!13\Ps-WkU +rLVf]tM.p^VI\&_Sa=2`Q#s>aN;TJbg"GYcd:(edaQ^qe^i@(g"P07gtgfChr*GOioB([jo4BG +kNM0plKeH9!U]=Sn,MkWnc&+ZoDeI]p&Facp\agcq>L0bqtg6crT!m.s/>sJ~> +JcC<$JcG6>nG`@arVZKgrqcWir:p9cs7ZEarq-6^rUU!Ys7$!Us6]mSrTsRMs6BUJs60LGroX7B +!9F.>s5O(;rnmh7hYu==gtUT;g=b03f@SU(rmY`4da?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1l +]",A\[^NTMZa-g>YHG"/X/`.tVl$;dUS=HTT:VXES"#k6R$X,(P`q8nOcPQ`NJrgRM2@%DL5(D7 +K7\Z)J:E#rI=-BfH?jaZGBS-.F:3/1EH,r:Df0H0D/B2e!buF`rb)@GAnM$Rs().>rF5e8s'Ye4 +s'G_2rETA,s'#A(r`K2%rDrqus&Anps&/kor)!Dhr_EAcr_3;aq+CTWqag9J!2Ro"qMYE4nONII +r(6]VrCd,`qG$rarD3Ag!2JJ?l^7WXs'Yh7r*oY8rabq/8LPL\BM2I1Krepl;NrG(EOHGZgP*;)org!ML!13\Ps-WkU +rLVf]tM.p^VI\&_Sa=2`Q#s>aN;TJbg"GYcd:(edaQ^qe^i@(g"P07gtgfChr*GOioB([jo4BG +kNM0plKeH9!U]=Sn,MkWnc&+ZoDeI]p&Facp\agcq>L0bqtg6crT!m.s/>sJ~> +JcC<$JcG6>nG`@arVZKgrqcWir:p9cs7ZEarq-6^rUU!Ys7$!Us6]mSrTsRMs6BUJs60LGroX7B +!9F.>s5O(;rnmh7hYu==gtUT;g=b03f@SU(rmY`4da?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1l +]",A\[^NTMZa-g>YHG"/X/`.tVl$;dUS=HTT:VXES"#k6R$X,(P`q8nOcPQ`NJrgRM2@%DL5(D7 +K7\Z)J:E#rI=-BfH?jaZGBS-.F:3/1EH,r:Df0H0D/B2e!buF`rb)@GAnM$Rs().>rF5e8s'Ye4 +s'G_2rETA,s'#A(r`K2%rDrqus&Anps&/kor)!Dhr_EAcr_3;aq+CTWqag9J!*/\bdRs%"qagWV +q+CTYr_3/_r_EDfrD3Jqfi.H>rEoS4raG_6raYqs(D4Bs(VIIqeQ1Irb_LLrbqaSq/Q@R +qfDFPqK;UWms"GLlZr;Np36IYrH7sYrcA$Yq/Q=Op29qKpM^"Lqf2UUs)\-\s)n?brceBe!."Qi +s*F`nrd>Q2It*!!JV&K+K7no3L5(J=Ll$tGMMqIm!KE-=NsCc/OcklkPEc'3s-ssri6"!!3H1%s/l@*rientZEggC['[6L[^W`U\[f;` +]Y(qk^;%Fu_8=(,`5T^8a2l?Db0/#RcHab_dF$CkeC<%"f@S^0g=tE=h;7&Ii8N\Uj5f>$josr3 +l07L!rp0[Qmf)\Tn,W"Xo)J=]o_nI_pAambq#:*fqY9sar:p6Nrdk*Js*t~> +JcC<$JcG6>nG`=`rVZNhrVHNhr:p!oi1trnn%=hVR)Egt^Z`g2P`tf@SU(e^W*tda?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1k +]",A\[^NTMZa-g>YH=q.X/`.tVl$;dUS=HTT:VXES"#k6R$X,(P`q8nOcPQ`NJrgRM2@%DL5(D8 +K7\Z)J:E#rI=-BfH?jc7G6N/4FEDSErc%sXDuOVTD/B2es(VOJrb2=Es(;7As().>raPn9s'Ye4 +s'G_2r*98+s'#A(s&f;&rDrqus&Anps&/kor)!Dhr_EAcrCm2`q+CQVqFLrG_XRrc8$[rH/'^!-\;LPUeDMMd=NN/`gWrf7)AOoCLKPE_;sQ'R`&rg<_Rs-iqV!h>gP +rLO(_TV27Ws.]OgrhTRjs/,ams/>ssri6"!!3H.$!j8`1ricF.ZMq0<['daMrpp*\s7H<`s7ZHdr:p9erqcEequ$6fiVnE.W;hA~> +JcC<$JcG6>nG`=`rVZNhrVHNhr:p!oi1trnn%=hVR)Egt^Z`g2P`tf@SU(e^W*tda?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1k +]",A\[^NTMZa-g>YH=q.X/`.tVl$;dUS=HTT:VXES"#k6R$X,(P`q8nOcPQ`NJrgRM2@%DL5(D8 +K7\Z)J:E#rI=-BfH?jc7G6N/4FEDSErc%sXDuOVTD/B2es(VOJrb2=Es(;7As().>raPn9s'Ye4 +s'G_2r*98+s'#A(s&f;&rDrqus&Anps&/kor)!Dhr_EAcrCm2`q+CQVqFLs(D4Brb;CIqeQ1Irb_LLrbqaSpi67Q +qfDCOqK;RVmW\2Gq0DUWp36IYrH7sYrH%sYq/Q:NlYl`@qf2UUs)\-\s)eaN;TJbKS5VcHjkbdF-Lne^i@(f\,!4gYCW@hV[8LiSrnXjQ5OdkNM-ol0@U6 +liHMArpKpXnaZVLs7?9_rq6 +JcC<$JcG6>nG`=`rVZNhrVHNhr:p!oi1trnn%=hVR)Egt^Z`g2P`tf@SU(e^W*tda?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1k +]",A\[^NTMZa-g>YH=q.X/`.tVl$;dUS=HTT:VXES"#k6R$X,(P`q8nOcPQ`NJrgRM2@%DL5(D8 +K7\Z)J:E#rI=-BfH?jc7G6N/4FEDSErc%sXDuOVTD/B2es(VOJrb2=Es(;7As().>raPn9s'Ye4 +s'G_2r*98+s'#A(s&f;&rDrqus&Anps&/kor)!Dhr_EAcrCm2`q+CQVqFLrEoS4raG_6raYqs(D4Brb;CIqeQ1Irb_LLrbqaSpi67Q +qfDCOqK;RVmW\2Gq0DUWp36IYrH7sYrH%sYq/Q:NlYl`@qf2UUs)\-\s)eaN;TJbKS5VcHjkbdF-Lne^i@(f\,!4gYCW@hV[8LiSrnXjQ5OdkNM-ol0@U6 +liHMArpKpXnaZVLs7?9_rq6 +JcC<$JcG3=nG`@ar;?EgrqcWiqtU3crq?<`rq-6^rUU!Ys7$!Us6fpSrp9[Ns6BRIs6'IGrT41C +jQ-=#s5F%;ro!h6!8d_2!SlH/g4.f.f@SU)e^W*tda?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1k +]",A\[^NQLZa$a=YH=q.WiE%sVl$;dUS=HTT:VUDS"#k6R$X,(P`q8nOH5H_NJrgRM2@%DL5(D8 +K7e`*J:E#rI=-BfH?jd\GB\4QFEDSFEcH)Yns(qaPrbDRMBkdQ[s(;=DrFQ">!+Yt:s'bq8 +rEoS2s'>S.s',M,r)s&%s&]/"s&K(urDW_or_`Vjr_NPhqb@&`rCcrYr(6]Tq+'qgh7`ZtnjiRJ +r(6]VrCd)_qG$rar_NGg!7TuQkfj!4s'Yh7r*oY8rabq;LPUeDMMd=NN/`jXO,oBbOcklkPEc'3!g]1>rg3bTR[X5F!h>gPrgs.^ +s.K=a!huHbrM9Iis/,ams/5psrMomus/c4%!j8`1rilF-!4)U1'XY9U[^NZT\@K/]]=Y_g]tV7r +^qp#e0Z1iJ`Q#s>aN;TJbKS5Vcd:(edaQ^qe^i@(f\,!4gYCW@hV[8LiSrnXjQ5OdkNMp0#3tO@ +m-X3.rpKpXnaZVL!qZ'VrUp3as7cHdrqZQiq"ssdq>K=PJcDSHJ,~> +JcC<$JcG3=nG`@ar;?EgrqcWiqtU3crq?<`rq-6^rUU!Ys7$!Us6fpSrp9[Ns6BRIs6'IGrT41C +jQ-=#s5F%;ro!h6!8d_2!SlH/g4.f.f@SU)e^W*tda?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1k +]",A\[^NQLZa$a=YH=q.WiE%sVl$;dUS=HTT:VUDS"#k6R$X,(P`q8nOH5H_NJrgRM2@%DL5(D8 +K7e`*J:E#rI=-BfH?jd\GB\4QFEDSFEcH)Yns(qaPrbDRMBkdQ[s(;=DrFQ">!+Yt:s'bq8 +rEoS2s'>S.s',M,r)s&%s&]/"s&K(urDW_or_`Vjr_NPhqb@&`rCcrYr(6]Tq+&YgqMau8qagWV +q+CTYrCm&^r_EGgr(mBehjNhurEoS4raG_6raYqrb).Brb;@Hr+l:JrGDFLrGVXRq/Q:P +r,_IOq/uIUm<@Q7olp@XrH7pXrcA$Yq/Q:Nlu2iAqJlOUs)\-\s)n?brceBe!."Qi!dfaMrpg-^o^r+Ts7ZKer:p9erqcEequ$9gir4N/V>l&~> +JcC<$JcG3=nG`@ar;?EgrqcWiqtU3crq?<`rq-6^rUU!Ys7$!Us6fpSrp9[Ns6BRIs6'IGrT41C +jQ-=#s5F%;ro!h6!8d_2!SlH/g4.f.f@SU)e^W*tda?Ihcd'h\bfe2OaN2EA`Poa3_SO%&^:h1k +]",A\[^NQLZa$a=YH=q.WiE%sVl$;dUS=HTT:VUDS"#k6R$X,(P`q8nOH5H_NJrgRM2@%DL5(D8 +K7e`*J:E#rI=-BfH?jd\GB\4QFEDSFEcH)Yns(qaPrbDRMBkdQ[s(;=DrFQ">!+Yt:s'bq8 +rEoS2s'>S.s',M,r)s&%s&]/"s&K(urDW_or_`Vjr_NPhqb@&`rCcrYr(6]Tq+($Ldn91$qagWV +q+CTYrCm&^r_EGgr(mApfMhB>rEoS4raG_6raYqrb).Brb;@Hr+l:JrGDFLrGVXRq/Q:P +r,_IOq/uIUm<@Q7olp@XrH7pXrcA$Yq/Q:Nlu2iAqJlOUs)\-\s)n?brceBe!."Qi!dfaMrpg-^o^r+Ts7ZKer:p9erqcEequ$9gir4N/V>l&~> +JcC<$JcG3=nG`=`rVZKgrqcWir:p9cs7ZB`s7H<^rUU!Ys7$!Us6fpSrTsRM!:'OIs60LGroX7B +!9F.>s5F%;ro!h6!8d_2!SlH/g&]mZrmu,?e^W*tda?Ihcd'h\bfe2OaN2EA`Pf[2_SO"%^:h1k +]",>[[^NQLZa$a=Y-"h-WiE%rVl$8cUS=HTT:VUDS"#h5R$X,(P`q8nOH5H_NJrgRM2@%DL5(D8 +K7ec,J:E#rI=-EhH?sj]GB\4QrcA0^ErL%ZE,Y_n#]4BoCMR["BkdQ[!bZ+WrFH%@@q5IHs'bq8 +rEoS2s'>S.s',M,rE9/&s&]/"s&K(ur)rb).Brb;@HqeQ1Irb_LLrbqaSpi61O +r,_FNpiZ@TlZ_Z>not%Ur,qjXrH%pXq/Q=OlYl`@qf2UUs)\-\s)eaN;TJbKS5VcHjkbdF-LneCE.%f@\g2gYCW@hV[8LiSsjs&*2j7k3(sml0@R"m-O-, +mf)YUnF?JJ!qZ'VrUp3as7cHdrqZQiq>:'eq>K@QJcDMFJ,~> +JcC<$JcG3=nG`=`rVZKgrqcWir:p9cs7ZB`s7H<^rUU!Ys7$!Us6fpSrTsRM!:'OIs60LGroX7B +!9F.>s5F%;ro!h6!8d_2!SlH/g&]mZrmu,?e^W*tda?Ihcd'h\bfe2OaN2EA`Pf[2_SO"%^:h1k +]",>[[^NQLZa$a=Y-"h-WiE%rVl$8cUS=HTT:VUDS"#h5R$X,(P`q8nOH5H_NJrgRM2@%DL5(D8 +K7ec,J:E#rI=-EhH?sj]GB\4QrcA0^ErL%ZE,Y_n#]4BoCMR["BkdQ[!bZ+WrFH%@@q5IHs'bq8 +rEoS2s'>S.s',M,rE9/&s&]/"s&K(ur)(kqi()9qagWV +pe(KXr_3/_r_EDfqb[<[iL0&"rEoP3s'be6raYt=qdoe>rb).Brb;@HqeQ1Irb_LLrbqaSpi61O +r,_FNpiZ@TlZ_Z>not%Ur,qjXrH%pXq/Q=OlYl`@qf2UUs)\-\s)eaN;TJbKS5VcHjkbdF-LneCE.%f@\g2gYCW@hV[8LiSsjs&*2j7k3(sml0@R"m-O-, +mf)YUnF?JJ!qZ'VrUp3as7cHdrqZQiq>:'eq>K@QJcDMFJ,~> +JcC<$JcG3=nG`=`rVZKgrqcWir:p9cs7ZB`s7H<^rUU!Ys7$!Us6fpSrTsRM!:'OIs60LGroX7B +!9F.>s5F%;ro!h6!8d_2!SlH/g&]mZrmu,?e^W*tda?Ihcd'h\bfe2OaN2EA`Pf[2_SO"%^:h1k +]",>[[^NQLZa$a=Y-"h-WiE%rVl$8cUS=HTT:VUDS"#h5R$X,(P`q8nOH5H_NJrgRM2@%DL5(D8 +K7ec,J:E#rI=-EhH?sj]GB\4QrcA0^ErL%ZE,Y_n#]4BoCMR["BkdQ[!bZ+WrFH%@@q5IHs'bq8 +rEoS2s'>S.s',M,rE9/&s&]/"s&K(ur)Nora>b7qdTP7s()"HLl$tGMMmFPNK0$[O-#KdP*2#nPa.N"QC%T +JcC<$JcG3=n,E7`r;?EgrqcWiqtU0bs7ZB`s7H?_r:9mXs7$!Us6fpSrTsRMs6BUJs60LGroX7B +s5a1>!oi1trnmh7hYu=8gtUT;g=b-Xf6,ZpeC;sqdF$=ecHa\YbKJ#KaN)<>`5BI/_8!b!]tCtg +\[],W[C!9HZ*:I8Xf\Y(Wi;noVPL#_U7n6PSt2C@S!fY2Q^3o$PEM)kO,o<\N/W[PM26qAL4t;5 +K7\Z)J:E#rI=-BfH?jaZGBS.PFEDSErc&0^Df9N2D/F+gC]A,LC&M]HB4bcTAcH<@A,Tm:@K0a6 +?iOI4?2\%.>Q7n*=oVV(=8c2"a8i:]F2e:&[ib9DD-U8bYdE^A#>?]^*9.]^nYi +8Gl'S9)_K^9_qK_:B"&c:u]aabl(oJ@/aU4@fBm:AGg$ssrMomus/c4%s/uC*rilF-!4)U1s0Md6rjE3D\@B)[]">Se]Y2&Y^Bq]l +_SX4/`Poj;rl?A,b0.uPc-FV\d*^:jeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^roOdTkiq?slg*p( +mI'E2n*oi:rpp*\s7H<`s7ZKer:p9erqcHfqu$9gj8OW0UAo`~> +JcC<$JcG3=n,E7`r;?EgrqcWiqtU0bs7ZB`s7H?_r:9mXs7$!Us6fpSrTsRMs6BUJs60LGroX7B +s5a1>!oi1trnmh7hYu=8gtUT;g=b-Xf6,ZpeC;sqdF$=ecHa\YbKJ#KaN)<>`5BI/_8!b!]tCtg +\[],W[C!9HZ*:I8Xf\Y(Wi;noVPL#_U7n6PSt2C@S!fY2Q^3o$PEM)kO,o<\N/W[PM26qAL4t;5 +K7\Z)J:E#rI=-BfH?jaZGBS.PFEDSErc&0^Df9N2D/F+gC]A,LC&M]HB4bcTAcH<@A,Tm:@K0a6 +?iOI4?2\%.>Q7n*=oVV(=8c2"a8i:]F2e:&[ib9DD-U8bYd"NVe\+8,>dS8bbpW +9DqQ\:&[oe:\moaR-'h'R/LCk@/aU4@fBm:AGg$ssrMomus/c4%s/uC*rilF-!4)U1s0Md6rjE3D\@B)[]">Se]Y2&Y^Bq]l_SX4/ +`Poj;rl?A,b0.uPc-FV\d*^:jeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^roOdTkiq?slg*p(mI'E2 +n*oi:rpp*\s7H<`s7ZKer:p9erqcHfqu$9gj8OW0UAo`~> +JcC<$JcG3=n,E7`r;?EgrqcWiqtU0bs7ZB`s7H?_r:9mXs7$!Us6fpSrTsRMs6BUJs60LGroX7B +s5a1>!oi1trnmh7hYu=8gtUT;g=b-Xf6,ZpeC;sqdF$=ecHa\YbKJ#KaN)<>`5BI/_8!b!]tCtg +\[],W[C!9HZ*:I8Xf\Y(Wi;noVPL#_U7n6PSt2C@S!fY2Q^3o$PEM)kO,o<\N/W[PM26qAL4t;5 +K7\Z)J:E#rI=-BfH?jaZGBS.PFEDSErc&0^Df9N2D/F+gC]A,LC&M]HB4bcTAcH<@A,Tm:@K0a6 +?iOI4?2\%.>Q7n*=oVV(=8c2"a8i:]F2e:&[ib9DD-U8bYdH9@ZZ+8,>dS8bbpW +9DqQ\:&[oe:\mo>;tNud?iFI4@JjU6A,^$:Ac?J/KDuFYMEVjeRF7OGJ +Fn^(DGOp(KGPlX_Fnp.YF8^.SEVseBDu=SOEW:(YF8g:]FoQXaGQ2mfH2`+$H[L3hI=?WpJ:N3% +JqJ]/L&Qf;LPUeDMMd=NN/`jXO,oBbrfR;GPl?pQQC!r*R$jA2rgWqX!1j+\s.B=arh9@ds.fRh +s/#amrMT[os/Gsss/Z1$riQ4's0)F+s02R0rj2X3!4Dg7$b*XU\[f;`]=bei^AbkR^qmn)_o0O5 +`lJ)",g"3PbKS5VcHjkbdaQ^qe^i@(f\,!4gYCW@hV[8LiSrnXjQ6C'&Ei9Al0@U#m-O--mdKW6 +nF?MKs7?9_rq6:'eq>K@QJcDJEJ,~> +JcC<$JcG0`5BI/^q[Xu]tCtg +\[],W[C!9GZ*:I8Xf\Y(Wi2hnVPL#_U7n6PSt2C@S!fY2Q^3o$PEM)kO,o<\N/W[PM26qAL4t;5 +K7\Z)J:E#rI=-BfH?ja[GBX(2FoHI`F)q8"!H;uVD?=ZkD#S2OC2%D]B`D`FB)ZBAAH-0<@fKm: +@/XF6?lS%.>5_V(=T;J$j:A[cb9`7WY9)2'U8FaFi^%o>,^&5P8 +8,>dS8bbpV9DqQ\:&[oe:]!rg;;odbbl(oJ@/aU4@fBm:AGg$aN;TJbKS5VcHjkbdF-LneCE.%f@\d1g=tE=h;7&Ii8N\Uj5f=ak3(pkl07L!rp0[Q +mf)YVnF?&Jo)J:]o_nI_pAambq#C0hqYC$dr;-BOrdk*Bs*t~> +JcC<$JcG0`5BI/^q[Xu]tCtg +\[],W[C!9GZ*:I8Xf\Y(Wi2hnVPL#_U7n6PSt2C@S!fY2Q^3o$PEM)kO,o<\N/W[PM26qAL4t;5 +K7\Z)J:E#rI=-BfH?ja[GBX(2FoHI`F)q8"!H;uVD?=ZkD#S2OC2%D]B`D`FB)ZBAAH-0<@fKm: +@/XF6?lS%.>5_V(=T;J$j:A[cb9`7WY9)2'U8B["jN:]X:8Gl'S +9)VE]9_qK_:B"&d:]OAcR-L+,R/LCk@/aU4@fBm:AGg$aN;TJbKS5VcHjkbdF-LneCE.%f@\d1g=tE=h;7&Ii8N\Uj5f=ak3(pkl07L!rp0[Qmf)YV +nF?&Jo)J:]o_nI_pAambq#C0hqYC$dr;-BOrdk*Bs*t~> +JcC<$JcG0`5BI/^q[Xu]tCtg +\[],W[C!9GZ*:I8Xf\Y(Wi2hnVPL#_U7n6PSt2C@S!fY2Q^3o$PEM)kO,o<\N/W[PM26qAL4t;5 +K7\Z)J:E#rI=-BfH?ja[GBX(2FoHI`F)q8"!H;uVD?=ZkD#S2OC2%D]B`D`FB)ZBAAH-0<@fKm: +@/XF6?lS%.>5_V(=T;J$j:A[cb9`7WY9)2'U8F]@(9(YXM8Gl'S +9)VE]9_qK_:B"&d:]OAE;tNud?iFI4@JjU6A,^$:Ac?J/KDuFYMEVjeQ +F7=;GFn^(,GPcR^Fnp.XF8^.TEVj_ADuFYPEW1"YF8^4\FT?U`G6`A;M#N57MMmFPNK4"!!K`HCOo^c2rfmMMQirgs.^s.K@bs.]OgrhTRj +s/,ams/>ssrMomu!3H.$s/uC*rilF-s0DX1!joACrjDj:\Gj#C]">Se]Y2&Y^H96I_SX4/`5T^8 +a2l?Db0.uPc-FV\d*^7he'umtf%8O+g"P07gtgfChr*GOioB([jlY^gkNM0plKeH9!U]=SmfN"K +nc&+Zo)SF]p&Facp\agdq>U6dqu$BgrSmg-s.KCB~> +JcC<$JcG-;nG`@ar;?BfrqcWiqtU0bs7ZB`s7H<^rUU!Ys7#sTs6fpSrTjUOlK\?4s60LGroX7B +!9F.>s5F%;ro!h6!8d_2EST=&g=b03f@SU(eC;sqdF$=ecHa\YbK@rJaN)<>`5BI/^q[Xu]Y(kf +\[],W[C!9GZ*:F7XfSS'Wi2hnVPL#_TqS-OSt2C@S!fY2Q^3o$PEM)kOH5E]N/W[PM2@"BL4t;5 +K7\Z)J:E#rI=-D@H3JS=GB\4QrcA0^ErL%`E,TZ4DJa6,rbMOKs(VIGs(;=DrFQ">s'u%;s'bq8 +rEoS2s'>S.s',M,r`T8's&]/"s&K(ur)_6r*oY8rabqreUf9Mi]"@sS!PQ5H^B)-drk^G. +`5T^8a2l?Db0.uPc-=PZcd:(edaQ^qe^i@(f\,!4gYCW@hV[8LiSrnXjQ5OdkNMp0!UB"MliHMA +rpKpXnaZVL!qZ'VrUp3as7cKerqZQiqYU0fqu,RSJcD>AJ,~> +JcC<$JcG-;nG`@ar;?BfrqcWiqtU0bs7ZB`s7H<^rUU!Ys7#sTs6fpSrTjUOlK\?4s60LGroX7B +!9F.>s5F%;ro!h6!8d_2EST=&g=b03f@SU(eC;sqdF$=ecHa\YbK@rJaN)<>`5BI/^q[Xu]Y(kf +\[],W[C!9GZ*:F7XfSS'Wi2hnVPL#_TqS-OSt2C@S!fY2Q^3o$PEM)kOH5E]N/W[PM2@"BL4t;5 +K7\Z)J:E#rI=-D@H3JS=GB\4QrcA0^ErL%`E,TZ4DJa6,rbMOKs(VIGs(;=DrFQ">s'u%;s'bq8 +rEoS2s'>S.s',M,r`T8's&]/"s&K(ur)rb).Brb;@HqeQ1Irb_LLrGVUQpMp(N +qK)+IpN?4ReT^n6rH7mWrcA$Ypi64Nlu2f@qf2XVrcA'\s)n?brceBe!."Qi$[[8KI=6QoIt3'# +K)UB+KS>/8LPYqd"cA4sN/`ksNt@D8P*2#mPa.N"QC!u+R@0NCRf]+NSc52^T:hkVU&UheU]%"g +V>mFkVZNfrWVrjsX8f:"XoGR(YPtd+Z2_-/Zi@B4[JmW7[fEr;\H0:Rrk&9F^AbkJ^qp#e1;h&L +`Q#s>aN;TJbKS5UcHab_dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^k2tjjrojIKli-5OmI'uB +!q>aMrpg-^o^r+Ts7ZKerV6BfrqcKgqu$?ij8OW0T)X<~> +JcC<$JcG-;nG`@ar;?BfrqcWiqtU0bs7ZB`s7H<^rUU!Ys7#sTs6fpSrTjUOlK\?4s60LGroX7B +!9F.>s5F%;ro!h6!8d_2EST=&g=b03f@SU(eC;sqdF$=ecHa\YbK@rJaN)<>`5BI/^q[Xu]Y(kf +\[],W[C!9GZ*:F7XfSS'Wi2hnVPL#_TqS-OSt2C@S!fY2Q^3o$PEM)kOH5E]N/W[PM2@"BL4t;5 +K7\Z)J:E#rI=-D@H3JS=GB\4QrcA0^ErL%`E,TZ4DJa6,rbMOKs(VIGs(;=DrFQ">s'u%;s'bq8 +rEoS2s'>S.s',M,r`T8's&]/"s&K(ur)rb).Brb;@HqeQ1Irb_LLrGVUQpMp(NqK)+I +pN?4ReT^n6rH7mWrcA$Ypi64Nlu2f@qf2XVrcA'\s)n?brceBe!."Qi$[[8KI=6QoIt3'#K)UB+ +KS>/8LPYqd"cA4sN/`ksNt@D8P*2#mPa.N"QC!u+R@0NCRf]+NSc52^T:hkVU&UheU]%"gV>mFk +VZNfrWVrjsX8f:"XoGR(YPtd+Z2_-/Zi@B4[JmW7[fEr;\H0:Rrk&9F^AbkJ^qp#e1;h&L`Q#s> +aN;TJbKS5UcHab_dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^k2tjjrojIKli-5OmI'uB!q>aM +rpg-^o^r+Ts7ZKerV6BfrqcKgqu$?ij8OW0T)X<~> +JcC<$JcG-;n,E7`r;?EgrVHNhqtU3crq?9_s7H<^rUU!Ys7#sTs6fpSrTsRMs6BUJs60LGroX7B +s5a1>#NF_$i8EMMhYu=3gtVh^B\D%if@JL%eC2jndEp4bcHXSVb/q`Ga2Z*:_ns7*^V@Ip]Xt_b +\@8oS['R'CYck43XK/A#W2HPiUnjcZTqJ$LSXc1=R@'A.QBd\uP*1rhO,f3YN/NRMM26qAKnP)2 +Jq8H&It%BF"akZCH?jc7G6W55FEDSFErL%ZE,Y_ns(qaPrbMOKs(VIGs(;=DrFQ">s'u%;s'bq8 +rEoS2s'>V/s',M,rE9/&s&]/"s&K(urDW_or_`Vjr_NMgqb@#_rCccToh"UCs1S9Alb380p.+pL +qapQTrCd)_qG$rarD3;er_`Ymqc!Jns&JR5m*,B7ra>_6qdTS8rabqtQC!r*R$jD3S"#qU6equ$BgrT4$0s.'+>~> +JcC<$JcG-;n,E7`r;?EgrVHNhqtU3crq?9_s7H<^rUU!Ys7#sTs6fpSrTsRMs6BUJs60LGroX7B +s5a1>#NF_$i8EMMhYu=3gtVh^B\D%if@JL%eC2jndEp4bcHXSVb/q`Ga2Z*:_ns7*^V@Ip]Xt_b +\@8oS['R'CYck43XK/A#W2HPiUnjcZTqJ$LSXc1=R@'A.QBd\uP*1rhO,f3YN/NRMM26qAKnP)2 +Jq8H&It%BF"akZCH?jc7G6W55FEDSFErL%ZE,Y_ns(qaPrbMOKs(VIGs(;=DrFQ">s'u%;s'bq8 +rEoS2s'>V/s',M,rE9/&s&]/"s&K(urDW_or_`Vjr_NMgqb@#_rCccToh"UCif3nqp.+pLqapQT +rCd)_qG$rarD3;er_`Ymqc!Jns&Jr`o9o'7r*TG2raG\5s'u%=r+5k>rb).Brb;@HqeQ1IrGDCK +rGVXRp2TqLq/btGpN?1QgirU;LPUeDMMmFPNK0$[O-#KeP*;)oQ'IZ%Q^F/.R[T_8S=H/LScYOWT`1Yb +U&^teV#R7kVZ!FmW;ijqWrK."XSo:$Y5b^)YlD!.ZMq31[/[Q5[K]"@sS#/.ab^V@S# +rk^J/`5T^8a2c9Bai_fMbg"GYcd:(edaQ^qe^i@(f\,!4gYCW@hV[8LiSrkWj5f=ak3(t-km$G= +m-O-,mf)YVnF?&JncJFTo`"O`pAambq#:*gqYL*er;-BRrdk*>s*t~> +JcC<$JcG-;n,E7`r;?EgrVHNhqtU3crq?9_s7H<^rUU!Ys7#sTs6fpSrTsRMs6BUJs60LGroX7B +s5a1>#NF_$i8EMMhYu=3gtVh^B\D%if@JL%eC2jndEp4bcHXSVb/q`Ga2Z*:_ns7*^V@Ip]Xt_b +\@8oS['R'CYck43XK/A#W2HPiUnjcZTqJ$LSXc1=R@'A.QBd\uP*1rhO,f3YN/NRMM26qAKnP)2 +Jq8H&It%BF"akZCH?jc7G6W55FEDSFErL%ZE,Y_ns(qaPrbMOKs(VIGs(;=DrFQ">s'u%;s'bq8 +rEoS2s'>V/s',M,rE9/&s&]/"s&K(urDW_or_`Vjr_NMgqb@#_rCccToh"UChFdK3q+1BSpe(KX +rCm&^r_EDfqb[8hr_iVlr`&nts&8kolr3UUr*TG2raG\5s'u%=r+5k>rb).Brb;@HqeQ1IrGDCK +rGVXRp2TqLq/btGpN?1QgirU;LPUeDMMmFPNK0$[O-#KeP*;)oQ'IZ%Q^F/.R[T_8S=H/LScYOWT`1Yb +U&^teV#R7kVZ!FmW;ijqWrK."XSo:$Y5b^)YlD!.ZMq31[/[Q5[K]"@sS#/.ab^V@S# +rk^J/`5T^8a2c9Bai_fMbg"GYcd:(edaQ^qe^i@(f\,!4gYCW@hV[8LiSrkWj5f=ak3(t-km$G= +m-O-,mf)YVnF?&JncJFTo`"O`pAambq#:*gqYL*er;-BRrdk*>s*t~> +JcC<$JcG*:nG`=`rVZKgrVHNhqtU3crq?9_s7H<^rUTsXs7$!Us6fpSrTsRMs6BRIs6'IGrT41C +jQ-=#s5F%;rnmh7hYu=3gtVh^G1kO"f@JL%eC2jndEp4bcHXSVb/q`Ga2Q$9_ns7*^V@Ip]XkYa +\@/iRZa6sBYck43XK/A#W2HPiUnjcZTqJ$LSXc1=R@'A.QBd\uP*1rhO,f3YN/NRMM26qAL4t;5 +K7\Z)J:E#rI=-BfH?ja[GB\4QrcA0^ErL(YDuahUD?=ZkD#S5MC&huHBEDgYB)Q9BA7K-J@fKm: +@/aO5?N4=0>lS%.>5h\)=T;J$j:AR]`9`.QT9(GR>8H)-K]`>_E^%b+m +8Gc!Q9)VE]9_qK_:B"&d;#O8j;YsDl<;onp_;8_o0O5`l?'?aN;TJbKS5VcHjh`dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^ +jlY^gkiq?slKdg'mHs?@mfDqJrpp*\s7H<`s7ZKer:p9es8)Qgr;?Hjk5Kr3Rf@m~> +JcC<$JcG*:nG`=`rVZKgrVHNhqtU3crq?9_s7H<^rUTsXs7$!Us6fpSrTsRMs6BRIs6'IGrT41C +jQ-=#s5F%;rnmh7hYu=3gtVh^G1kO"f@JL%eC2jndEp4bcHXSVb/q`Ga2Q$9_ns7*^V@Ip]XkYa +\@/iRZa6sBYck43XK/A#W2HPiUnjcZTqJ$LSXc1=R@'A.QBd\uP*1rhO,f3YN/NRMM26qAL4t;5 +K7\Z)J:E#rI=-BfH?ja[GB\4QrcA0^ErL(YDuahUD?=ZkD#S5MC&huHBEDgYB)Q9BA7K-J@fKm: +@/aO5?N4=0>lS%.>5h\)=T;J$j:AR]`9`.QT9(GR>8H)-KN<"q:NVH$= +8Gc!Q9)VE]9_qK_:B"&d;#O8j;YsDl<;onp_;8_o0O5`l?'?aN;TJbKS5VcHjh`dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^ +jlY^gkiq?slKdg'mHs?@mfDqJrpp*\s7H<`s7ZKer:p9es8)Qgr;?Hjk5Kr3Rf@m~> +JcC<$JcG*:nG`=`rVZKgrVHNhqtU3crq?9_s7H<^rUTsXs7$!Us6fpSrTsRMs6BRIs6'IGrT41C +jQ-=#s5F%;rnmh7hYu=3gtVh^G1kO"f@JL%eC2jndEp4bcHXSVb/q`Ga2Q$9_ns7*^V@Ip]XkYa +\@/iRZa6sBYck43XK/A#W2HPiUnjcZTqJ$LSXc1=R@'A.QBd\uP*1rhO,f3YN/NRMM26qAL4t;5 +K7\Z)J:E#rI=-BfH?ja[GB\4QrcA0^ErL(YDuahUD?=ZkD#S5MC&huHBEDgYB)Q9BA7K-J@fKm: +@/aO5?N4=0>lS%.>5h\)=T;J$j:AR]`9`.QT9(GR>8H)-G9)(pO8Gc!Q +9)VE]9_qK_:B"&d;#O8j;YsDl<;onp_;8_o0O5`l?'?aN;TJbKS5VcHjh`dF$CkeC<%"f@S[.g=k<:h;-rFi8ESRj5]4^jlY^g +kiq?slKdg'mHs?@mfDqJrpp*\s7H<`s7ZKer:p9es8)Qgr;?Hjk5Kr3Rf@m~> +JcC<$JcG'9nG`=`rVZKgrqcThqtU3crq?9_s7H<^rUTsXs7$!Us6fpSr9OLNlK\?4s60LGroX7B +!9F.>s5F%;rnn"rF5e8 +!+>b4s'G_2r`oJ-s'#A(s&f;&rDrqus&Aqqs&/kor)!Agr_E;arCm)]n4N1Am7?n?rkABFqFC9N +qapNSrCd)_qG$rar_NAer_`Ymqc!Jnr`/eqr`B)$qcWl$r`f'>qd9>1raG_6raYqrb).B +rb;@HqeQ1IrGDCKrGVUQol9eJpN,YBpN?1Ql$)oGr,qdVr,_gWpi61Mmr/,Cqf2UUs)\-\s)e;Ll$tGMuJYFNK0'\OHG]hPE_;sQ'Rd9Qj/tIS"#q< +Sc52cT:hjNTq\9VrM0LkVPa +JcC<$JcG'9nG`=`rVZKgrqcThqtU3crq?9_s7H<^rUTsXs7$!Us6fpSr9OLNlK\?4s60LGroX7B +!9F.>s5F%;rnn"rF5e8 +!+>b4s'G_2r`oJ-s'#A(s&f;&rDrqus&Aqqs&/kor)!Agr_E;arCm)]n4N1Am7?n?rf6u;qFC9N +qapNSrCd)_qG$rar_NAer_`Ymqc!Jnr`/eqr`B)$qcWl$r`f&_qd9>1raG_6raYqrb).B +rb;@HqeQ1IrGDCKrGVUQol9eJpN,YBpN?1Ql$)oGr,qdVr,_gWpi61Mmr/,Cqf2UUs)\-\s)e;Ll$tGMuJYFNK0'\OHG]hPE_;sQ'Rd9Qj/tIS"#q< +Sc52cT:hjNTq\9VrM0LkVPa +JcC<$JcG'9nG`=`rVZKgrqcThqtU3crq?9_s7H<^rUTsXs7$!Us6fpSr9OLNlK\?4s60LGroX7B +!9F.>s5F%;rnn"rF5e8 +!+>b4s'G_2r`oJ-s'#A(s&f;&rDrqus&Aqqs&/kor)!Agr_E;arCm)]n4N1Am7?n?r_*5_qFC9N +qapNSrCd)_qG$rar_NAer_`Ymqc!Jnr`/eqr`B)$qcWl$r`fD$pJUlqra>_6r*oY8rabq +JcC<$JcG'9nG`=`r;?BfrqcWiqtU0brq?9_s7H<^r:9mXs7#sTs6fpSrTsRMs6BRI!pJh1roX7B +s5a1>!TN);i,df4hVI#CgY:H9g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pod4_SO%&^:h1k]",A\ +[^NQLZa-g>YH=q.X/`.tVl$;dUnXQVTV%gHS=?"9R$a5+Q'@JqP*(ieO,f3YMi*@JLkg_>KnP)2 +Jq8H&It%BF"akZCH?jc7G6)l0rcABdEcQ/>E,]apDZ=PRD#S5MCB&#IB`D`FB)ZBAAH-0=@fKm: +@/aO5?N4=0>lS".>5_V(=T;J$5_\&>lJ%.?Me+/@/aU4@fBm:AGg$l;It3'#JqAW-KS>/8LPUeDMMd=NN/`jYO-#KeP*;.0Pn97JR$a;1R[]e:SXl@D +T:hkVT`Us`U].%jV5C-hVuN^qWVrguX/rE$XoGR(YPbX)Z2_-/Zi@E4[JdN8\%&sI\c95@]DfJC +]`>eG^B)-drk\]R`;[^c`lH0AaiV]KbKS5VcHjl:d2p`beC<%"f@S[.g=k<:h;-rFi8ESRioB([ +jlY^gkl0fIlKeH9!U]=SmfN"Knc&(\oCV\Ro`4^bp\jmdq>^ +JcC<$JcG'9nG`=`r;?BfrqcWiqtU0brq?9_s7H<^r:9mXs7#sTs6fpSrTsRMs6BRI!pJh1roX7B +s5a1>!TN);i,df4hVI#CgY:H9g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pod4_SO%&^:h1k]",A\ +[^NQLZa-g>YH=q.X/`.tVl$;dUnXQVTV%gHS=?"9R$a5+Q'@JqP*(ieO,f3YMi*@JLkg_>KnP)2 +Jq8H&It%BF"akZCH?jc7G6)l0rcABdEcQ/>E,]apDZ=PRD#S5MCB&#IB`D`FB)ZBAAH-0=@fKm: +@/aO5?N4=0>lS".>5_V(=T;J$5_\&>lJ%.?Me+/@/aU4@fBm:AGg$l;It3'#JqAW-KS>/8LPUeDMMd=NN/`jYO-#KeP*;.0Pn97JR$a;1R[]e:SXl@D +T:hkVT`Us`U].%jV5C-hVuN^qWVrguX/rE$XoGR(YPbX)Z2_-/Zi@E4[JdN8\%&sI\c95@]DfJC +]`>eG^B)-drk\]R`;[^c`lH0AaiV]KbKS5VcHjl:d2p`beC<%"f@S[.g=k<:h;-rFi8ESRioB([ +jlY^gkl0fIlKeH9!U]=SmfN"Knc&(\oCV\Ro`4^bp\jmdq>^ +JcC<$JcG'9nG`=`r;?BfrqcWiqtU0brq?9_s7H<^r:9mXs7#sTs6fpSrTsRMs6BRI!pJh1roX7B +s5a1>!TN);i,df4hVI#CgY:H9g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pod4_SO%&^:h1k]",A\ +[^NQLZa-g>YH=q.X/`.tVl$;dUnXQVTV%gHS=?"9R$a5+Q'@JqP*(ieO,f3YMi*@JLkg_>KnP)2 +Jq8H&It%BF"akZCH?jc7G6)l0rcABdEcQ/>E,]apDZ=PRD#S5MCB&#IB`D`FB)ZBAAH-0=@fKm: +@/aO5?N4=0>lS".>5_V(=T;J$5_\&>lJ%.?Me+/@/aU4@fBm:AGg$l;It3'#JqAW-KS>/8LPUeDMMd=NN/`jYO-#KeP*;.0Pn97JR$a;1R[]e:SXl@D +T:hkVT`Us`U].%jV5C-hVuN^qWVrguX/rE$XoGR(YPbX)Z2_-/Zi@E4[JdN8\%&sI\c95@]DfJC +]`>eG^B)-drk\]R`;[^c`lH0AaiV]KbKS5VcHjl:d2p`beC<%"f@S[.g=k<:h;-rFi8ESRioB([ +jlY^gkl0fIlKeH9!U]=SmfN"Knc&(\oCV\Ro`4^bp\jmdq>^ +JcC<$JcG$8nG`=`r;?BfrqcThqtU3crq?9_rq-6^r:9mXrp]mTs6fpSr9XIL!:'OIs60LGroO:D +jQ-=#IH'5Ei8EMMhVI#CgtUQ:g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pod4_SO%&^:h1k]",>[ +[^NQLZa$a=YH=q.WiE%sVl$;dUnXQVTV%gHS=?"9R$a5+Q'IPrP*(ieO,f3YN/NRMLkg_>KnP)2 +Jq8K'J:E#rI=-D@H3SY>GB\4RFoHI`F)q8"s)7sVrbhaQ!,VXMs(_RJrb2=E!+u1@s'u+>rF5e8 +s'Yh5s'G_2r`oJ-s'#A(!a&N*rDrqus&Anps&/koqb[8fr_E;aqb6l[k=Y58gdq95p.G9VrCm&^ +r_EDfqb[8hr_iSkr`&ksqc_6qdTP7s()"bKS5UcHab_dF$CkeC<%"rmqV3g"P07gtgfChr*GOir7sAjQ5OdkNMp0 +!UB"MliHMArpKpXnaZVL!qZ'Vrq6 +JcC<$JcG$8nG`=`r;?BfrqcThqtU3crq?9_rq-6^r:9mXrp]mTs6fpSr9XIL!:'OIs60LGroO:D +jQ-=#IH'5Ei8EMMhVI#CgtUQ:g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pod4_SO%&^:h1k]",>[ +[^NQLZa$a=YH=q.WiE%sVl$;dUnXQVTV%gHS=?"9R$a5+Q'IPrP*(ieO,f3YN/NRMLkg_>KnP)2 +Jq8K'J:E#rI=-D@H3SY>GB\4RFoHI`F)q8"s)7sVrbhaQ!,VXMs(_RJrb2=E!+u1@s'u+>rF5e8 +s'Yh5s'G_2r`oJ-s'#A(!a&N*rDrqus&Anps&/koqb[8fr_E;aqb6l[k=Y58gdq95p.G9VrCm&^ +r_EDfqb[8hr_iSkr`&ksqc_6qdTP7s()"bKS5UcHab_dF$CkeC<%"rmqV3g"P07gtgfChr*GOir7sAjQ5OdkNMp0 +!UB"MliHMArpKpXnaZVL!qZ'Vrq6 +JcC<$JcG$8nG`=`r;?BfrqcThqtU3crq?9_rq-6^r:9mXrp]mTs6fpSr9XIL!:'OIs60LGroO:D +jQ-=#IH'5Ei8EMMhVI#CgtUQ:g"=p.f%&:"e'cXkd*L"_bfe2PaiMNB`Pod4_SO%&^:h1k]",>[ +[^NQLZa$a=YH=q.WiE%sVl$;dUnXQVTV%gHS=?"9R$a5+Q'IPrP*(ieO,f3YN/NRMLkg_>KnP)2 +Jq8K'J:E#rI=-D@H3SY>GB\4RFoHI`F)q8"s)7sVrbhaQ!,VXMs(_RJrb2=E!+u1@s'u+>rF5e8 +s'Yh5s'G_2r`oJ-s'#A(!a&N*rDrqus&Anps&/koqb[8fr_E;aqb6l[k=Y58gdq95p.G9VrCm&^ +r_EDfqb[8hr_iSkr`&ksqc_6qdTP7s()"bKS5UcHab_dF$CkeC<%"rmqV3g"P07gtgfChr*GOir7sAjQ5OdkNMp0 +!UB"MliHMArpKpXnaZVL!qZ'Vrq6 +JcC<$JcG$8n,E7`r;?BfrVHNhqtU0brq?9_rq-6^r:9jWs7$!UrpKgRrTsRMs6BUJs60LGroX7B +!9F.>s5F%;rnr:`hVI#CgtUQ:g"=p.f%&:"e'cXkd*L"^bfe2PaiMNB`Poa3_SO"%^:h1k]",>[ +[^EKKZa$a=YH=q.WiE%sVl$;dUnXQVTV%gHS=?":R$a5+Q'IStP*(ieO,f3YN/NRMM26qAL4t;5 +K7\Z)J:E#rI=-EhH?sj]G^"?:G'.qLFE;MDrc&!YDf>Vm!c;airbMOK!,;CF!bZ+WrFH%@@q5IH +!b#JErEfV4?![D6s'#J,rE9/&s&]/"s&K(urDW\ns&&\jr_NJfq+^`[q+Kd@nO_k6pdt0OrCd)_ +q+^i`r_NAer_`YmqG[Amr`/hrrE&u#qcWl$r`f8)ra#M0qHs81raG\5raYqrb).Brb;@H +qJ6(HrGD@Jr,;LPnT"5BolKMBol]MBq/uCQr,_gWp2TnIpM]nIqJlLTs)\-\s)n?brc\ouH$O^^ +H[C-gI=?WpJ:N3&rdu8FKnb>;Ll$tGMieG^]2(L +_>_:P_o2Pn!QN1Za8sE*rlZ)$c-FV\d*^7hdaQ^qe^i@(f\,!4gYDea(uF0.i8N\Uj5f=`k2tjj +l07Kulg4!*mI'uB!V#XYo)J=]o`"O`pAamcq#:*gqYU0gr;6HZrdk*2s*t~> +JcC<$JcG$8n,E7`r;?BfrVHNhqtU0brq?9_rq-6^r:9jWs7$!UrpKgRrTsRMs6BUJs60LGroX7B +!9F.>s5F%;rnr:`hVI#CgtUQ:g"=p.f%&:"e'cXkd*L"^bfe2PaiMNB`Poa3_SO"%^:h1k]",>[ +[^EKKZa$a=YH=q.WiE%sVl$;dUnXQVTV%gHS=?":R$a5+Q'IStP*(ieO,f3YN/NRMM26qAL4t;5 +K7\Z)J:E#rI=-EhH?sj]G^"?:G'.qLFE;MDrc&!YDf>Vm!c;airbMOK!,;CF!bZ+WrFH%@@q5IH +!b#JErEfV4?![D6s'#J,rE9/&s&]/"s&K(urDW\ns&&\jr_NJfq+^`[q+Kd@nO_k6pdt0OrCd)_ +q+^i`r_NAer_`YmqG[Amr`/hrrE&u#qcWl$r`f8)ra#M0qHs81raG\5raYqrb).Brb;@H +qJ6(HrGD@Jr,;LPnT"5BolKMBol]MBq/uCQr,_gWp2TnIpM]nIqJlLTs)\-\s)n?brc\ouH$O^^ +H[C-gI=?WpJ:N3&rdu8FKnb>;Ll$tGMieG^]2(L +_>_:P_o2Pn!QN1Za8sE*rlZ)$c-FV\d*^7hdaQ^qe^i@(f\,!4gYDea(uF0.i8N\Uj5f=`k2tjj +l07Kulg4!*mI'uB!V#XYo)J=]o`"O`pAamcq#:*gqYU0gr;6HZrdk*2s*t~> +JcC<$JcG$8n,E7`r;?BfrVHNhqtU0brq?9_rq-6^r:9jWs7$!UrpKgRrTsRMs6BUJs60LGroX7B +!9F.>s5F%;rnr:`hVI#CgtUQ:g"=p.f%&:"e'cXkd*L"^bfe2PaiMNB`Poa3_SO"%^:h1k]",>[ +[^EKKZa$a=YH=q.WiE%sVl$;dUnXQVTV%gHS=?":R$a5+Q'IStP*(ieO,f3YN/NRMM26qAL4t;5 +K7\Z)J:E#rI=-EhH?sj]G^"?:G'.qLFE;MDrc&!YDf>Vm!c;airbMOK!,;CF!bZ+WrFH%@@q5IH +!b#JErEfV4?![D6s'#J,rE9/&s&]/"s&K(urDW\ns&&\jr_NJfq+^`[q+Kd@nO_k6pdt0OrCd)_ +q+^i`r_NAer_`YmqG[Amr`/hrrE&u#qcWl$r`f8)ra#M0qHs81raG\5raYqrb).Brb;@H +qJ6(HrGD@Jr,;LPnT"5BolKMBol]MBq/uCQr,_gWp2TnIpM]nIqJlLTs)\-\s)n?brc\ouH$O^^ +H[C-gI=?WpJ:N3&rdu8FKnb>;Ll$tGMieG^]2(L +_>_:P_o2Pn!QN1Za8sE*rlZ)$c-FV\d*^7hdaQ^qe^i@(f\,!4gYDea(uF0.i8N\Uj5f=`k2tjj +l07Kulg4!*mI'uB!V#XYo)J=]o`"O`pAamcq#:*gqYU0gr;6HZrdk*2s*t~> +JcC<$JcG!7n,E7`r;?BfrVHNhqY:*brq?6^s7H<^r:9mXs7#sTs6fpSrTsRMs6BRIs6'IGrT4@H +jQ,@]io8qrhuV`lrnVYNgY1B7f[na+e^W*tda?Ihcd'eZbKJ&LaN)<>`5BI/^q[Xu]Y(kf\[],W +[C!9GZ*:I8Xf\\)Wi;qpVPU)aU7n9RT:VUDS"#k6R$X,(Q'@JqOcYWbNfB!VMi*@JLkg_>KnP)2 +Jq8H&IsuipI=-D@H3SY>GB\4RFoHIfF)l;@EH#l8rbhaQs(q[M!buF`rb2=Es(;7As().>raPn9 +s'Yh5s'>\2rETA,s'#D)s&f;&rDrqus&Aqqr_ibnqb[8frD*,^qb6cXj@\r6lq$kBoh,0UrCm&^ +rD*>fqG@/gr_iVlrD`brqc<\trE/r"rEB2)qcs)*ra,J/ra>_6r*oY8rabn;s(;7Cqe5tCrbD=G +rG;IMphp"Jqf(tColB_Hm<%uCo60hMolU.Rr,VLNp2L"LpMftKrc8$[rH/'^s*"Bcs*+Nhrd"Tl +I/\NpIXh?I'nLshK7nr5L51SAM2I4MN/`jYO-#M'OqNtCQ'IZ%R$a;1S"#q!5&3B!kl=^rkANM_86,f +!Q2kT`<"!!rl>,^b5TQobg"GYcd:%ddF-LneCE.Lf-]/'g=k<:h;-rFi8ESQioB([jlY^gkNM0p +lKdd&m-X6/n*fc8nc&+Zo)SF]p&Facp\jmdq>^ +JcC<$JcG!7n,E7`r;?BfrVHNhqY:*brq?6^s7H<^r:9mXs7#sTs6fpSrTsRMs6BRIs6'IGrT4@H +jQ,@]io8qrhuV`lrnVYNgY1B7f[na+e^W*tda?Ihcd'eZbKJ&LaN)<>`5BI/^q[Xu]Y(kf\[],W +[C!9GZ*:I8Xf\\)Wi;qpVPU)aU7n9RT:VUDS"#k6R$X,(Q'@JqOcYWbNfB!VMi*@JLkg_>KnP)2 +Jq8H&IsuipI=-D@H3SY>GB\4RFoHIfF)l;@EH#l8rbhaQs(q[M!buF`rb2=Es(;7As().>raPn9 +s'Yh5s'>\2rETA,s'#D)s&f;&rDrqus&Aqqr_ibnqb[8frD*,^qb6cXj@\r6lq$kBoh,0UrCm&^ +rD*>fqG@/gr_iVlrD`brqc<\trE/r"rEB2)qcs)*ra,J/ra>_6r*oY8rabn;s(;7Cqe5tCrbD=G +rG;IMphp"Jqf(tColB_Hm<%uCo60hMolU.Rr,VLNp2L"LpMftKrc8$[rH/'^s*"Bcs*+Nhrd"Tl +I/\NpIXh?I'nLshK7nr5L51SAM2I4MN/`jYO-#M'OqNtCQ'IZ%R$a;1S"#q!5&3B!kl=^rkANM_86,f +!Q2kT`<"!!rl>,^b5TQobg"GYcd:%ddF-LneCE.Lf-]/'g=k<:h;-rFi8ESQioB([jlY^gkNM0p +lKdd&m-X6/n*fc8nc&+Zo)SF]p&Facp\jmdq>^ +JcC<$JcG!7n,E7`r;?BfrVHNhqY:*brq?6^s7H<^r:9mXs7#sTs6fpSrTsRMs6BRIs6'IGrT4@H +jQ,@]io8qrhuV`lrnVYNgY1B7f[na+e^W*tda?Ihcd'eZbKJ&LaN)<>`5BI/^q[Xu]Y(kf\[],W +[C!9GZ*:I8Xf\\)Wi;qpVPU)aU7n9RT:VUDS"#k6R$X,(Q'@JqOcYWbNfB!VMi*@JLkg_>KnP)2 +Jq8H&IsuipI=-D@H3SY>GB\4RFoHIfF)l;@EH#l8rbhaQs(q[M!buF`rb2=Es(;7As().>raPn9 +s'Yh5s'>\2rETA,s'#D)s&f;&rDrqus&Aqqr_ibnqb[8frD*,^qb6cXj@\r6lq$kBoh,0UrCm&^ +rD*>fqG@/gr_iVlrD`brqc<\trE/r"rEB2)qcs)*ra,J/ra>_6r*oY8rabn;s(;7Cqe5tCrbD=G +rG;IMphp"Jqf(tColB_Hm<%uCo60hMolU.Rr,VLNp2L"LpMftKrc8$[rH/'^s*"Bcs*+Nhrd"Tl +I/\NpIXh?I'nLshK7nr5L51SAM2I4MN/`jYO-#M'OqNtCQ'IZ%R$a;1S"#q!5&3B!kl=^rkANM_86,f +!Q2kT`<"!!rl>,^b5TQobg"GYcd:%ddF-LneCE.Lf-]/'g=k<:h;-rFi8ESQioB([jlY^gkNM0p +lKdd&m-X6/n*fc8nc&+Zo)SF]p&Facp\jmdq>^ +JcC<$JcG!7n,E4_r;?BfrVHNhqtU0brq?6^s7H<^r:9mXrp]mTrpKgRrTsRMs6BUJs60LGroO:D +jQ-=#!TN);huV`lrnW%YgY1B7f[na+e^W*tda?IhcHa\YbKJ&LaN)<>`5BI/^q[Xu]Y(ke\[],W +[C!9GZ*:F7Xf\Y(Wi;qpVPU)`U7n9RT:VUDS"#k7R$X,(Q'@JqP*(ieNfB!VMi*@JLkg_>KnP)2 +JqAQ(J:E#rI=-BgH?sj]G^"@TF`m_+s)S0\rc.sW!,qjSs(qaPrG)ILBkdQ[s(D@Dral+?!+Yt: +!b#JEra5\3s'>V/s',M,rE9/&!*B,"s&K%trDW\ns&&Yir_NJfpJ(HWoh4C=mRd=Ink&LHrCd)_ +q+^i`rD3;er_`YmqG[Amr`/eqr`B&#qcWl$r`f5(ra#M0qd9>1raG\5raYt=qdob=s(D4Brb;@H +qJ6(HrGD=Ir,;IOluDZj +W2ZcqWWK6&XSo:$Y5b^(YlD!.ZMh-0[/[Q4[f +JcC<$JcG!7n,E4_r;?BfrVHNhqtU0brq?6^s7H<^r:9mXrp]mTrpKgRrTsRMs6BUJs60LGroO:D +jQ-=#!TN);huV`lrnW%YgY1B7f[na+e^W*tda?IhcHa\YbKJ&LaN)<>`5BI/^q[Xu]Y(ke\[],W +[C!9GZ*:F7Xf\Y(Wi;qpVPU)`U7n9RT:VUDS"#k7R$X,(Q'@JqP*(ieNfB!VMi*@JLkg_>KnP)2 +JqAQ(J:E#rI=-BgH?sj]G^"@TF`m_+s)S0\rc.sW!,qjSs(qaPrG)ILBkdQ[s(D@Dral+?!+Yt: +!b#JEra5\3s'>V/s',M,rE9/&!*B,"s&K%trDW\ns&&Yir_NJfpJ(HWoh4C=mRd=Ink&LHrCd)_ +q+^i`rD3;er_`YmqG[Amr`/eqr`B&#qcWl$r`f5(ra#M0qd9>1raG\5raYt=qdob=s(D4Brb;@H +qJ6(HrGD=Ir,;IOluDZj +W2ZcqWWK6&XSo:$Y5b^(YlD!.ZMh-0[/[Q4[f +JcC<$JcG!7n,E4_r;?BfrVHNhqtU0brq?6^s7H<^r:9mXrp]mTrpKgRrTsRMs6BUJs60LGroO:D +jQ-=#!TN);huV`lrnW%YgY1B7f[na+e^W*tda?IhcHa\YbKJ&LaN)<>`5BI/^q[Xu]Y(ke\[],W +[C!9GZ*:F7Xf\Y(Wi;qpVPU)`U7n9RT:VUDS"#k7R$X,(Q'@JqP*(ieNfB!VMi*@JLkg_>KnP)2 +JqAQ(J:E#rI=-BgH?sj]G^"@TF`m_+s)S0\rc.sW!,qjSs(qaPrG)ILBkdQ[s(D@Dral+?!+Yt: +!b#JEra5\3s'>V/s',M,rE9/&!*B,"s&K%trDW\ns&&Yir_NJfpJ(HWoh4C=mRd=Ink&LHrCd)_ +q+^i`rD3;er_`YmqG[Amr`/eqr`B&#qcWl$r`f5(ra#M0qd9>1raG\5raYt=qdob=s(D4Brb;@H +qJ6(HrGD=Ir,;IOluDZj +W2ZcqWWK6&XSo:$Y5b^(YlD!.ZMh-0[/[Q4[f +JcC<$JcG!7mf*+^r;?BfrVHNhqY:'as7Z?_rq-6^r:9jWs7#sTs6fpSrTsRMs6BRI!pJh1roX7B +!9F.>!TN);huV`lrnVMJgY1B7f[na+e^W*tda?IgcHa\YbKJ#KaN)<>`5BI.^q[Xt]Y(ke\[])V +[C!9GZ*:F7Xf\Y(Wi;qpVPU)aU7n9RT:VUDS"#k7R$X,(Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5 +K7\Z)J:E%II0"_Brd"TjGlDmfG'3e+s)S0\rc&!YDf>Vm!c;airbMOKs(VIG!bZ+Wral+?s'u%; +s'bq8ra5\3!+#P.s'#J,rE9/&s&]/"s&K(ur)1raG\5raYqrb).Brb;@HqJ6%G +rb_CIr,;CMl#H?9p2fVCkB6BI0G(LJ:N3& +rduAIKnb>;Ll$tGMis1A9Cs1SHHrkJKK!5\ZOs2+iTrl"oXa8X-a +ai_cLbKS61c2l8aMrpg-^o^r+T!quB_r:p +JcC<$JcG!7mf*+^r;?BfrVHNhqY:'as7Z?_rq-6^r:9jWs7#sTs6fpSrTsRMs6BRI!pJh1roX7B +!9F.>!TN);huV`lrnVMJgY1B7f[na+e^W*tda?IgcHa\YbKJ#KaN)<>`5BI.^q[Xt]Y(ke\[])V +[C!9GZ*:F7Xf\Y(Wi;qpVPU)aU7n9RT:VUDS"#k7R$X,(Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5 +K7\Z)J:E%II0"_Brd"TjGlDmfG'3e+s)S0\rc&!YDf>Vm!c;airbMOKs(VIG!bZ+Wral+?s'u%; +s'bq8ra5\3!+#P.s'#J,rE9/&s&]/"s&K(ur)1raG\5raYqrb).Brb;@HqJ6%G +rb_CIr,;CMl#H?9p2fVCkB6BI0G(LJ:N3& +rduAIKnb>;Ll$tGMis1A9Cs1SHHrkJKK!5\ZOs2+iTrl"oXa8X-a +ai_cLbKS61c2l8aMrpg-^o^r+T!quB_r:p +JcC<$JcG!7mf*+^r;?BfrVHNhqY:'as7Z?_rq-6^r:9jWs7#sTs6fpSrTsRMs6BRI!pJh1roX7B +!9F.>!TN);huV`lrnVMJgY1B7f[na+e^W*tda?IgcHa\YbKJ#KaN)<>`5BI.^q[Xt]Y(ke\[])V +[C!9GZ*:F7Xf\Y(Wi;qpVPU)aU7n9RT:VUDS"#k7R$X,(Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5 +K7\Z)J:E%II0"_Brd"TjGlDmfG'3e+s)S0\rc&!YDf>Vm!c;airbMOKs(VIG!bZ+Wral+?s'u%; +s'bq8ra5\3!+#P.s'#J,rE9/&s&]/"s&K(ur)1raG\5raYqrb).Brb;@HqJ6%G +rb_CIr,;CMl#H?9p2fVCkB6BI0G(LJ:N3& +rduAIKnb>;Ll$tGMis1A9Cs1SHHrkJKK!5\ZOs2+iTrl"oXa8X-a +ai_cLbKS61c2l8aMrpg-^o^r+T!quB_r:p +JcC<$JcFs6mf*+^r;?BfrVHNhqY:'arq?9_rq-3]r:9mXrp]mTrpKgRrTsRM!:'OIs6'IGroX7B +!9F.>#3+V#i8EMLrnVAFgY1B7f[na+e^W*tda?IgcHa\YbK@rJaN)9=`5BI.^q[Us]Y(hd\[])V +[C!9GZ*:F7Xf\Y(Wi;qpVPU)aU7n9RT:VUDS"#k7R$a5*Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5 +K7\[RJ.R3ZI=6KjH[:!`G^+FVG'8$-F96N(ErL%[E,T[oD?=ZkD#S5MC&huHBEDgYB)ZBAA,p-< +@KKtG@/aO5?N4=1>lS%.>5h\)=T;J$j;YsDl<;fho5hb&>lJ%-?Me+/@/aU4@fBm:AG]s/8LPUeDMMmFPNK0'\OHG]hPE_>tQC!u+R@9V7S=Q7CT:_dMTq\=]U]Ih;7&Ii8NYSj5]4^roOUOkiq?slKdg'mHs?@ +mfN"Knc&(\oCV\Sp&Facp\agdq>U6fqu-HjrU0Z9s,?u.~> +JcC<$JcFs6mf*+^r;?BfrVHNhqY:'arq?9_rq-3]r:9mXrp]mTrpKgRrTsRM!:'OIs6'IGroX7B +!9F.>#3+V#i8EMLrnVAFgY1B7f[na+e^W*tda?IgcHa\YbK@rJaN)9=`5BI.^q[Us]Y(hd\[])V +[C!9GZ*:F7Xf\Y(Wi;qpVPU)aU7n9RT:VUDS"#k7R$a5*Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5 +K7\[RJ.R3ZI=6KjH[:!`G^+FVG'8$-F96N(ErL%[E,T[oD?=ZkD#S5MC&huHBEDgYB)ZBAA,p-< +@KKtG@/aO5?N4=1>lS%.>5h\)=T;J$j;YsDl<;fho5hb&>lJ%-?Me+/@/aU4@fBm:AG]s/8LPUeDMMmFPNK0'\OHG]hPE_>tQC!u+R@9V7S=Q7CT:_dMTq\=]U]Ih;7&Ii8NYSj5]4^roOUOkiq?slKdg'mHs?@ +mfN"Knc&(\oCV\Sp&Facp\agdq>U6fqu-HjrU0Z9s,?u.~> +JcC<$JcFs6mf*+^r;?BfrVHNhqY:'arq?9_rq-3]r:9mXrp]mTrpKgRrTsRM!:'OIs6'IGroX7B +!9F.>#3+V#i8EMLrnVAFgY1B7f[na+e^W*tda?IgcHa\YbK@rJaN)9=`5BI.^q[Us]Y(hd\[])V +[C!9GZ*:F7Xf\Y(Wi;qpVPU)aU7n9RT:VUDS"#k7R$a5*Q'@JqP*(ieO,f3YN/NRMM26qAL4t;5 +K7\[RJ.R3ZI=6KjH[:!`G^+FVG'8$-F96N(ErL%[E,T[oD?=ZkD#S5MC&huHBEDgYB)ZBAA,p-< +@KKtG@/aO5?N4=1>lS%.>5h\)=T;J$j;YsDl<;fho5hb&>lJ%-?Me+/@/aU4@fBm:AG]s/8LPUeDMMmFPNK0'\OHG]hPE_>tQC!u+R@9V7S=Q7CT:_dMTq\=]U]Ih;7&Ii8NYSj5]4^roOUOkiq?slKdg'mHs?@ +mfN"Knc&(\oCV\Sp&Facp\agdq>U6fqu-HjrU0Z9s,?u.~> +JcC<$JcFp5n,E4_r;??erVHNhqY:'arq?6^s7H<^r:9jWs7#sTs6fpSrTsRMs6BUJs60LGroO7C +jSn0Dio/kSi8KnTGX +"bM;UJ:E%II0"_Brd"TjGlDmgG'.s,F9-H'rc.sW!,qjSs)%dPrbDRMBkdQ[s(;=DrFH%@@q5LI +s'Yn8rEfV4?![D6!aAi3rE9/&s&]/"s&K(ur)dnkJdNoh4L@mn*%Ar(Hu^q+^i` +rD38dr_`YmqG[Amr`/eqrE&u#qH1raG\5raYqrb)+Arb;@HqeQ.H +rGD:HqJZ+Ij)Od5piF`&qfDXTno=ABp2U(PrcA$[s)n?brceBe!."Qis*G3&I=6QnIt3'#JqJ]/ +L&QfVLPUeDMN!LRNfT6_OcklkPa.N"Q^F/.R[]e:SXuFFTV/!PU8+N[V5:'gVZE`qri6"!!3H1% +s/uC*rilF-s0DU0s0Vg6r3lX7s1&$Ymb0%oN +bfn>WcHjh`dF$CkrmVV3f%8O+f\,!4gYCW@hVR/Ji8N\pit1;5k2tjjkiq?slg*p(mI'EAmfDqJ +rpp*\s7H<`s7ZKerV6Bfs8)ThrVZTln,@n +JcC<$JcFp5n,E4_r;??erVHNhqY:'arq?6^s7H<^r:9jWs7#sTs6fpSrTsRMs6BUJs60LGroO7C +jSn0Dio/kSi8KnTGX +"bM;UJ:E%II0"_Brd"TjGlDmgG'.s,F9-H'rc.sW!,qjSs)%dPrbDRMBkdQ[s(;=DrFH%@@q5LI +s'Yn8rEfV4?![D6!aAi3rE9/&s&]/"s&K(ur)dnkJdNoh4L@mn*%Ar(Hu^q+^i` +rD38dr_`YmqG[Amr`/eqrE&u#qH1raG\5raYqrb)+Arb;@HqeQ.H +rGD:HqJZ+Ij)Od5piF`&qfDXTno=ABp2U(PrcA$[s)n?brceBe!."Qis*G3&I=6QnIt3'#JqJ]/ +L&QfVLPUeDMN!LRNfT6_OcklkPa.N"Q^F/.R[]e:SXuFFTV/!PU8+N[V5:'gVZE`qri6"!!3H1% +s/uC*rilF-s0DU0s0Vg6r3lX7s1&$Ymb0%oN +bfn>WcHjh`dF$CkrmVV3f%8O+f\,!4gYCW@hVR/Ji8N\pit1;5k2tjjkiq?slg*p(mI'EAmfDqJ +rpp*\s7H<`s7ZKerV6Bfs8)ThrVZTln,@n +JcC<$JcFp5n,E4_r;??erVHNhqY:'arq?6^s7H<^r:9jWs7#sTs6fpSrTsRMs6BUJs60LGroO7C +jSn0Dio/kSi8KnTGX +"bM;UJ:E%II0"_Brd"TjGlDmgG'.s,F9-H'rc.sW!,qjSs)%dPrbDRMBkdQ[s(;=DrFH%@@q5LI +s'Yn8rEfV4?![D6!aAi3rE9/&s&]/"s&K(ur)dnkJdNoh4L@mn*%Ar(Hu^q+^i` +rD38dr_`YmqG[Amr`/eqrE&u#qH1raG\5raYqrb)+Arb;@HqeQ.H +rGD:HqJZ+Ij)Od5piF`&qfDXTno=ABp2U(PrcA$[s)n?brceBe!."Qis*G3&I=6QnIt3'#JqJ]/ +L&QfVLPUeDMN!LRNfT6_OcklkPa.N"Q^F/.R[]e:SXuFFTV/!PU8+N[V5:'gVZE`qri6"!!3H1% +s/uC*rilF-s0DU0s0Vg6r3lX7s1&$Ymb0%oN +bfn>WcHjh`dF$CkrmVV3f%8O+f\,!4gYCW@hVR/Ji8N\pit1;5k2tjjkiq?slg*p(mI'EAmfDqJ +rpp*\s7H<`s7ZKerV6Bfs8)ThrVZTln,@n +JcC<$JcFp5mf*+^r;??erVHNhqY:'arq?6^rq-3]r:9mXrp]mTrpKgRrTjUOlK\?4!pJh1roOUM +jQ,@]io8qTi8lS%.>5h\)=T;J$5hb&>l@t-?Me+.@/aU4@fBm:AG]s/8LPUeD +MMmFPNK0'\OHG]iPa.N"Q^F/.R[]e:SXuFFTV/!PU8+N[V5C,fVl6Sori-""XT#@%Y5b^)YlD!. +ZMh-0[/[Q4[f +JcC<$JcFp5mf*+^r;??erVHNhqY:'arq?6^rq-3]r:9mXrp]mTrpKgRrTjUOlK\?4!pJh1roOUM +jQ,@]io8qTi8lS%.>5h\)=T;J$5hb&>l@t-?Me+.@/aU4@fBm:AG]s/8LPUeD +MMmFPNK0'\OHG]iPa.N"Q^F/.R[]e:SXuFFTV/!PU8+N[V5C,fVl6Sori-""XT#@%Y5b^)YlD!. +ZMh-0[/[Q4[f +JcC<$JcFp5mf*+^r;??erVHNhqY:'arq?6^rq-3]r:9mXrp]mTrpKgRrTjUOlK\?4!pJh1roOUM +jQ,@]io8qTi8lS%.>5h\)=T;J$5hb&>l@t-?Me+.@/aU4@fBm:AG]s/8LPUeD +MMmFPNK0'\OHG]iPa.N"Q^F/.R[]e:SXuFFTV/!PU8+N[V5C,fVl6Sori-""XT#@%Y5b^)YlD!. +ZMh-0[/[Q4[f +JcC<$JcFm4mf*+^r;??erVHNhqY:'arq?6^rq-3]r:9jWs7#sTs6fpSrTsRMs6BUJs6'IGroOUM +jQ,@]io8qTi8eN +raPn9!+>b4!a]/f +qG@/grDNMkrD`brqH!SsrE/o!rEB/(qHX#*rEfA.ra>_6qdTP7rabq>db0%oNbfn?2c2l8< +rm:bpe,Ii(e^i@(f\+s3g=tE^h$W#ri8ESRioB([jo4BHkNM0plK[^7liHMArpKpXnaZVL!qZ'V +rUg6cp\4U\s7uZjqtp?irVc9cJcCN*J,~> +JcC<$JcFm4mf*+^r;??erVHNhqY:'arq?6^rq-3]r:9jWs7#sTs6fpSrTsRMs6BUJs6'IGroOUM +jQ,@]io8qTi8eN +raPn9!+>b4!a]/f +qG@/grDNMkrD`brqH!SsrE/o!rEB/(qHX#*rEfA.ra>_6qdTP7rabq>db0%oNbfn?2c2l8< +rm:bpe,Ii(e^i@(f\+s3g=tE^h$W#ri8ESRioB([jo4BHkNM0plK[^7liHMArpKpXnaZVL!qZ'V +rUg6cp\4U\s7uZjqtp?irVc9cJcCN*J,~> +JcC<$JcFm4mf*+^r;??erVHNhqY:'arq?6^rq-3]r:9jWs7#sTs6fpSrTsRMs6BUJs6'IGroOUM +jQ,@]io8qTi8eN +raPn9!+>b4!a]/f +qG@/grDNMkrD`brqH!SsrE/o!rEB/(qHX#*rEfA.ra>_6qdTP7rabq>db0%oNbfn?2c2l8< +rm:bpe,Ii(e^i@(f\+s3g=tE^h$W#ri8ESRioB([jo4BHkNM0plK[^7liHMArpKpXnaZVL!qZ'V +rUg6cp\4U\s7uZjqtp?irVc9cJcCN*J,~> +JcC<$JcFj3mf*+^r;??erVHKgqY:'arq?6^rq-3]r:9mXrp]mTs6fmRrp9[Ns6BUJs6'IGroX7B +$0:.,io8qTi86%k*=oVV(=8c2!sJi;uTbqP_V(?2\+,?iFI4@JaO5A,^$9AcHBABDZBAC&MfCC]/)J +D=h`>Ds_N.EVXYMF4k[3F89k;EW'qWF8U.ZFT?U`GQ2mfH2`+FH[L3hI=?WpJ:N3&K7ei1Knb>; +Ll$tGMiaMrpg-^ +o^r.Us7ZKerV6Bfs8)WirVZWmo)=4?L&ZZ~> +JcC<$JcFj3mf*+^r;??erVHKgqY:'arq?6^rq-3]r:9mXrp]mTs6fmRrp9[Ns6BUJs6'IGroX7B +$0:.,io8qTi86%k*=oVV(=8c2!sJi;uTbqP_V(?2\+,?iFI4@JaO5A,^$9AcHBABDZBAC&MfCC]/)J +D=h`>Ds_N.EVXYMF4k[3F89k;EW'qWF8U.ZFT?U`GQ2mfH2`+FH[L3hI=?WpJ:N3&K7ei1Knb>; +Ll$tGMiaMrpg-^ +o^r.Us7ZKerV6Bfs8)WirVZWmo)=4?L&ZZ~> +JcC<$JcFj3mf*+^r;??erVHKgqY:'arq?6^rq-3]r:9mXrp]mTs6fmRrp9[Ns6BUJs6'IGroX7B +$0:.,io8qTi86%k*=oVV(=8c2!sJi;uTbqP_V(?2\+,?iFI4@JaO5A,^$9AcHBABDZBAC&MfCC]/)J +D=h`>Ds_N.EVXYMF4k[3F89k;EW'qWF8U.ZFT?U`GQ2mfH2`+FH[L3hI=?WpJ:N3&K7ei1Knb>; +Ll$tGMiaMrpg-^ +o^r.Us7ZKerV6Bfs8)WirVZWmo)=4?L&ZZ~> +JcC<$JcFj3mJd"]r;??erVHKgqY:'arq?6^rq-3]r:9jWs7#sTs6fpSrTjUOlK\B5s6'IGroX7B +$0:.,io8qTi8Q7n*=oVV(=8c2"sJi;uTbpP_V'?2e1,?iFI4@JaO5A,g*:Ac?<@BDZBAC&VlCC]/)I +D=_Z9DsVH1EVXYMF5:s6F89k>EVskVF8U.ZFoQXaGQ2mfH2`-iHN8HmI7/O6J:N3%JqJ]/Knb>; +Ll$tGMiStD[LTq\9VUnjiaVl-JmWN)u!XK8P+Y-+u-YlCs. +ZMh-0ZiIN4[f +JcC<$JcFj3mJd"]r;??erVHKgqY:'arq?6^rq-3]r:9jWs7#sTs6fpSrTjUOlK\B5s6'IGroX7B +$0:.,io8qTi8Q7n*=oVV(=8c2"sJi;uTbpP_V'?2e1,?iFI4@JaO5A,g*:Ac?<@BDZBAC&VlCC]/)I +D=_Z9DsVH1EVXYMF5:s6F89k>EVskVF8U.ZFoQXaGQ2mfH2`-iHN8HmI7/O6J:N3%JqJ]/Knb>; +Ll$tGMiStD[LTq\9VUnjiaVl-JmWN)u!XK8P+Y-+u-YlCs. +ZMh-0ZiIN4[f +JcC<$JcFj3mJd"]r;??erVHKgqY:'arq?6^rq-3]r:9jWs7#sTs6fpSrTjUOlK\B5s6'IGroX7B +$0:.,io8qTi8Q7n*=oVV(=8c2"sJi;uTbpP_V'?2e1,?iFI4@JaO5A,g*:Ac?<@BDZBAC&VlCC]/)I +D=_Z9DsVH1EVXYMF5:s6F89k>EVskVF8U.ZFoQXaGQ2mfH2`-iHN8HmI7/O6J:N3%JqJ]/Knb>; +Ll$tGMiStD[LTq\9VUnjiaVl-JmWN)u!XK8P+Y-+u-YlCs. +ZMh-0ZiIN4[f +JcC<$JcFg2mf*(]r;??erVHKgqY:'arV$-]rq-6^qssdWrp]mTs6fpSrTsRM!:'OIH0FGSk2tde +jQ#:[io/hRhqm2FgtUT;g=Y$/f%&:"e'cXkcd'h\bfe/NaN2E@`Pf[2_8*h"]tD"i\[f5Z[^EKK +Za$a=YHG"/X/`2!W2HMhUnjc[TqS*MSt2C@S!ob4R$X,(Q'@JqP*(ieO,f3YN/NRMM26rdL'iWf +K7ec,JUi9#If=`rI!bj=#C1Q=GB\4RFoHL_Er^7[E<:)tDuOVUD/=%fCBA6bC&VcIB4bcTAcH9@ +A,]s;@K0a7?NOP>?2\"0>?Y5/=oVV(=8Z,!*i^:\RWP:&.KW9B8_A9DhKY:&[od +:\moe;>jDh;uTbpP_V'?2e1,?iFI4@JaO5A,^$:Ac?<@BDZB@C&VlDC]&#H +D=DH/Dt.f8EVa_NF5V08F89kAEVskUF8U.[FoHR`GQ2pfH2`*jH[Pg@!IfOtJ2Dh/K7ei2L5(J> +M2@+JN/WaVO,oBbP*2&pQ'Rc(R$jD4S"-%@StD[LTq\A^&GbE^]2+L_>V7N_uI[R`W*pXa8O'\ai_d*b6#o4c2Puhcd;[= +("1R[eC<%!f%8O+f\,!4gYCT?h;7&ghuVfrro4%?jo4BCkNMp0!UB"MliHMArpTmV!:g'Zs766_ +rUp3as7cKes7uZjqtpBjr;H6dJcCE'J,~> +JcC<$JcFg2mf*(]r;??erVHKgqY:'arV$-]rq-6^qssdWrp]mTs6fpSrTsRM!:'OIH0FGSk2tde +jQ#:[io/hRhqm2FgtUT;g=Y$/f%&:"e'cXkcd'h\bfe/NaN2E@`Pf[2_8*h"]tD"i\[f5Z[^EKK +Za$a=YHG"/X/`2!W2HMhUnjc[TqS*MSt2C@S!ob4R$X,(Q'@JqP*(ieO,f3YN/NRMM26rdL'iWf +K7ec,JUi9#If=`rI!bj=#C1Q=GB\4RFoHL_Er^7[E<:)tDuOVUD/=%fCBA6bC&VcIB4bcTAcH9@ +A,]s;@K0a7?NOP>?2\"0>?Y5/=oVV(=8Z,!*i^:\RWP:&.KW9B8_A9DhKY:&[od +:\moe;>jDh;uTbpP_V'?2e1,?iFI4@JaO5A,^$:Ac?<@BDZB@C&VlDC]&#H +D=DH/Dt.f8EVa_NF5V08F89kAEVskUF8U.[FoHR`GQ2pfH2`*jH[Pg@!IfOtJ2Dh/K7ei2L5(J> +M2@+JN/WaVO,oBbP*2&pQ'Rc(R$jD4S"-%@StD[LTq\A^&GbE^]2+L_>V7N_uI[R`W*pXa8O'\ai_d*b6#o4c2Puhcd;[= +("1R[eC<%!f%8O+f\,!4gYCT?h;7&ghuVfrro4%?jo4BCkNMp0!UB"MliHMArpTmV!:g'Zs766_ +rUp3as7cKes7uZjqtpBjr;H6dJcCE'J,~> +JcC<$JcFg2mf*(]r;??erVHKgqY:'arV$-]rq-6^qssdWrp]mTs6fpSrTsRM!:'OIH0FGSk2tde +jQ#:[io/hRhqm2FgtUT;g=Y$/f%&:"e'cXkcd'h\bfe/NaN2E@`Pf[2_8*h"]tD"i\[f5Z[^EKK +Za$a=YHG"/X/`2!W2HMhUnjc[TqS*MSt2C@S!ob4R$X,(Q'@JqP*(ieO,f3YN/NRMM26rdL'iWf +K7ec,JUi9#If=`rI!bj=#C1Q=GB\4RFoHL_Er^7[E<:)tDuOVUD/=%fCBA6bC&VcIB4bcTAcH9@ +A,]s;@K0a7?NOP>?2\"0>?Y5/=oVV(=8Z,!*i^:\RWP:&.KW9B8_A9DhKY:&[od +:\moe;>jDh;uTbpP_V'?2e1,?iFI4@JaO5A,^$:Ac?<@BDZB@C&VlDC]&#H +D=DH/Dt.f8EVa_NF5V08F89kAEVskUF8U.[FoHR`GQ2pfH2`*jH[Pg@!IfOtJ2Dh/K7ei2L5(J> +M2@+JN/WaVO,oBbP*2&pQ'Rc(R$jD4S"-%@StD[LTq\A^&GbE^]2+L_>V7N_uI[R`W*pXa8O'\ai_d*b6#o4c2Puhcd;[= +("1R[eC<%!f%8O+f\,!4gYCT?h;7&ghuVfrro4%?jo4BCkNMp0!UB"MliHMArpTmV!:g'Zs766_ +rUp3as7cKes7uZjqtpBjr;H6dJcCE'J,~> +JcC<$JcFd1mJd"]r;??erVHKgqY:$`rq?6^rq-3]r:9jWs7#sTs6fpSrp9[Ns6BUJId#tXk2tde +jQ#:[io/hRhqm2FgtUQ:g"=p.f%&:"e'cXjcd'h\bfe/NaN2B?`PfX1_8*h"]tD"h\[f5Z[^EKK +Za$a=YHG"/X/`2!W2HMhUnjc[TqS-OSt2C@S!ob4R$X,(Q'@JqP*(ieO,f3YN/NRNM2@%DL5(D8 +rdt6'Jc:0#It%BF!IT7nH3&;9rceBc!-S9_!crC&rc&!YDf>Vm!GuZPC]A,LC&M]HB4bcTAHHCP +A,]p=@:3LB?iOI4?2e+/>Q7n*=oVV(=8Z,!!c\:\[]R:&.KW9Bo.F9DhKY:&Rid +:\did;>sJi;uK\pPVP'?2\++?iFI4@JaO5A,g*:Ac?<@BDZBAC&MfCC]&#H +D=)6(DtJ#=EVa_NF5qB:F8'_FEVa_SF8L(ZFoQX`GQ2pfH2`*jH[Pg@6[jN7J:N3&K7ei2Knb>; +Ll$tGN/WaVO,oBbP*2#nQ'Rc(R$jD4S"-%@StD[LTq\V7N_uI[R`W*sXa8X0[aT0K^b6Q89c-FV\cd;[= +0@J=ueC<%!f%8O+f\,!4gY:N>h;7#Gi8ESRioB([jlPXekNM-ol0@U#m-O-,mf)YVnF?&JncJFT +o_nFap@n=Zq#C0iqYU0gr;HTbrdk*&s*t~> +JcC<$JcFd1mJd"]r;??erVHKgqY:$`rq?6^rq-3]r:9jWs7#sTs6fpSrp9[Ns6BUJId#tXk2tde +jQ#:[io/hRhqm2FgtUQ:g"=p.f%&:"e'cXjcd'h\bfe/NaN2B?`PfX1_8*h"]tD"h\[f5Z[^EKK +Za$a=YHG"/X/`2!W2HMhUnjc[TqS-OSt2C@S!ob4R$X,(Q'@JqP*(ieO,f3YN/NRNM2@%DL5(D8 +rdt6'Jc:0#It%BF!IT7nH3&;9rceBc!-S9_!crC&rc&!YDf>Vm!GuZPC]A,LC&M]HB4bcTAHHCP +A,]p=@:3LB?iOI4?2e+/>Q7n*=oVV(=8Z,!!c\:\[]R:&.KW9Bo.F9DhKY:&Rid +:\did;>sJi;uK\pPVP'?2\++?iFI4@JaO5A,g*:Ac?<@BDZBAC&MfCC]&#H +D=)6(DtJ#=EVa_NF5qB:F8'_FEVa_SF8L(ZFoQX`GQ2pfH2`*jH[Pg@6[jN7J:N3&K7ei2Knb>; +Ll$tGN/WaVO,oBbP*2#nQ'Rc(R$jD4S"-%@StD[LTq\V7N_uI[R`W*sXa8X0[aT0K^b6Q89c-FV\cd;[= +0@J=ueC<%!f%8O+f\,!4gY:N>h;7#Gi8ESRioB([jlPXekNM-ol0@U#m-O-,mf)YVnF?&JncJFT +o_nFap@n=Zq#C0iqYU0gr;HTbrdk*&s*t~> +JcC<$JcFd1mJd"]r;??erVHKgqY:$`rq?6^rq-3]r:9jWs7#sTs6fpSrp9[Ns6BUJId#tXk2tde +jQ#:[io/hRhqm2FgtUQ:g"=p.f%&:"e'cXjcd'h\bfe/NaN2B?`PfX1_8*h"]tD"h\[f5Z[^EKK +Za$a=YHG"/X/`2!W2HMhUnjc[TqS-OSt2C@S!ob4R$X,(Q'@JqP*(ieO,f3YN/NRNM2@%DL5(D8 +rdt6'Jc:0#It%BF!IT7nH3&;9rceBc!-S9_!crC&rc&!YDf>Vm!GuZPC]A,LC&M]HB4bcTAHHCP +A,]p=@:3LB?iOI4?2e+/>Q7n*=oVV(=8Z,!!c\:\[]R:&.KW9Bo.F9DhKY:&Rid +:\did;>sJi;uK\pPVP'?2\++?iFI4@JaO5A,g*:Ac?<@BDZBAC&MfCC]&#H +D=)6(DtJ#=EVa_NF5qB:F8'_FEVa_SF8L(ZFoQX`GQ2pfH2`*jH[Pg@6[jN7J:N3&K7ei2Knb>; +Ll$tGN/WaVO,oBbP*2#nQ'Rc(R$jD4S"-%@StD[LTq\V7N_uI[R`W*sXa8X0[aT0K^b6Q89c-FV\cd;[= +0@J=ueC<%!f%8O+f\,!4gY:N>h;7#Gi8ESRioB([jlPXekNM-ol0@U#m-O-,mf)YVnF?&JncJFT +o_nFap@n=Zq#C0iqYU0gr;HTbrdk*&s*t~> +JcC<$JcFa0mf*(]r;?`P]R0_8*h"]tCtg\[f5Y[^EKK +Za$a=YHG"/X/`2!W2HPiUnjc[TqS-OSt;LCS"#k7R$X,(Q'@JqP*(lgO,o<\N/W[PM2@%Dre;/A +KS+o/JUr?%IsuipI=-BgH?sj^GlDmlG'.qLFE;MDrc.sW!,qjS!c;airbDRMBkdQ[!bZ+Wrac.A +@q5LIs'Yn8rEfV4?![G7s',M,rE9/&s&],!r`/qsqG[>jr)*&^pJ:QZnP/gQoh4pLpIkBWpeC]^ +rD38dr_`VlqG[AmrDi\prE&r"q-!Z"rEK)&rE]D/qHs50raG\5raYqp2f87rH%gWs)n?brHJ9ds*=Ti7sfW2I=6QnIt3'#JV&N,KS>/8LPUeD +MMmFPNK0'\OcklkPa.N"Q^F20S"#q=St;RITqS3UUnjiaVl-JmWiE,$XKAV-YPtd+YlM*/ZN@MA +[JmW7\,Wu:\c98@]DT>A^&PhE^]2+L_>M1M_uI[R`W*sXa8O'\ai_d*bQ#cdc2Q#gcN)>kdJqVp +e,Ihte^j`O!SH*)g&]s`rnRV3hu;O7iSsjs!T`AAjoOZ/rojIKli-5PmI'EAmfN"Knc&(\oCV\S +p&Facp\jmdq>^ +JcC<$JcFa0mf*(]r;?`P]R0_8*h"]tCtg\[f5Y[^EKK +Za$a=YHG"/X/`2!W2HPiUnjc[TqS-OSt;LCS"#k7R$X,(Q'@JqP*(lgO,o<\N/W[PM2@%Dre;/A +KS+o/JUr?%IsuipI=-BgH?sj^GlDmlG'.qLFE;MDrc.sW!,qjS!c;airbDRMBkdQ[!bZ+Wrac.A +@q5LIs'Yn8rEfV4?![G7s',M,rE9/&s&],!r`/qsqG[>jr)*&^pJ:QZnP/gQoh4pLpIkBWpeC]^ +rD38dr_`VlqG[AmrDi\prE&r"q-!Z"rEK)&rE]D/qHs50raG\5raYqp2f87rH%gWs)n?brHJ9ds*=Ti7sfW2I=6QnIt3'#JV&N,KS>/8LPUeD +MMmFPNK0'\OcklkPa.N"Q^F20S"#q=St;RITqS3UUnjiaVl-JmWiE,$XKAV-YPtd+YlM*/ZN@MA +[JmW7\,Wu:\c98@]DT>A^&PhE^]2+L_>M1M_uI[R`W*sXa8O'\ai_d*bQ#cdc2Q#gcN)>kdJqVp +e,Ihte^j`O!SH*)g&]s`rnRV3hu;O7iSsjs!T`AAjoOZ/rojIKli-5PmI'EAmfN"Knc&(\oCV\S +p&Facp\jmdq>^ +JcC<$JcFa0mf*(]r;?`P]R0_8*h"]tCtg\[f5Y[^EKK +Za$a=YHG"/X/`2!W2HPiUnjc[TqS-OSt;LCS"#k7R$X,(Q'@JqP*(lgO,o<\N/W[PM2@%Dre;/A +KS+o/JUr?%IsuipI=-BgH?sj^GlDmlG'.qLFE;MDrc.sW!,qjS!c;airbDRMBkdQ[!bZ+Wrac.A +@q5LIs'Yn8rEfV4?![G7s',M,rE9/&s&],!r`/qsqG[>jr)*&^pJ:QZnP/gQoh4pLpIkBWpeC]^ +rD38dr_`VlqG[AmrDi\prE&r"q-!Z"rEK)&rE]D/qHs50raG\5raYqp2f87rH%gWs)n?brHJ9ds*=Ti7sfW2I=6QnIt3'#JV&N,KS>/8LPUeD +MMmFPNK0'\OcklkPa.N"Q^F20S"#q=St;RITqS3UUnjiaVl-JmWiE,$XKAV-YPtd+YlM*/ZN@MA +[JmW7\,Wu:\c98@]DT>A^&PhE^]2+L_>M1M_uI[R`W*sXa8O'\ai_d*bQ#cdc2Q#gcN)>kdJqVp +e,Ihte^j`O!SH*)g&]s`rnRV3hu;O7iSsjs!T`AAjoOZ/rojIKli-5PmI'EAmfN"Knc&(\oCV\S +p&Facp\jmdq>^ +JcC<$JcFa0mJct\r;?`P]R0_8!b!]tCtg\[f5Y[^EKK +Za$a=YHG"0X/`2!W2HPjV50l\TqS-OSt;LCS"#k7R$a5+Q'IStP*1rhO,o<\N/W[PMM[1GLPCP; +KS4u1Jqlr`/bprE&r"q-!Z"rEK)&rE]A.qd9;0raG\5raYqrb)+ArFu7GphTeDqJFo' +oPaPEo5XSHpiGV?olKD=qfDUUrcS6arHJ9ds*=Ti!df/8LPUeDMMmFP +NK0'\OHG]iPa.N"Q^F/.R[]h +JcC<$JcFa0mJct\r;?`P]R0_8!b!]tCtg\[f5Y[^EKK +Za$a=YHG"0X/`2!W2HPjV50l\TqS-OSt;LCS"#k7R$a5+Q'IStP*1rhO,o<\N/W[PMM[1GLPCP; +KS4u1Jqlr`/bprE&r"q-!Z"rEK)&rE]A.qd9;0raG\5raYqrb)+ArFu7GphTeDqJFo' +oPaPEo5XSHpiGV?olKD=qfDUUrcS6arHJ9ds*=Ti!df/8LPUeDMMmFP +NK0'\OHG]iPa.N"Q^F/.R[]h +JcC<$JcFa0mJct\r;?`P]R0_8!b!]tCtg\[f5Y[^EKK +Za$a=YHG"0X/`2!W2HPjV50l\TqS-OSt;LCS"#k7R$a5+Q'IStP*1rhO,o<\N/W[PMM[1GLPCP; +KS4u1Jqlr`/bprE&r"q-!Z"rEK)&rE]A.qd9;0raG\5raYqrb)+ArFu7GphTeDqJFo' +oPaPEo5XSHpiGV?olKD=qfDUUrcS6arHJ9ds*=Ti!df/8LPUeDMMmFP +NK0'\OHG]iPa.N"Q^F/.R[]h +JcC<$JcF[.mf*(]r;?`5BI/^q[Xu]tCtg\[f5Y[^EKK +Za$a=YHG"0X/`2!W2HPjV50o^TqS-OSt;LCS"#k7R$a5+Q'IStP*1rhrf7PLNJrgSMM[1GLPLV= +KnTGX$\Eq[J:E&tI=6KjHiAlS%.>5_V'=T;J#j;Yj>k<;fhn5VV#>lJ%-?M\%.@/aU3@fBm:AG]s;B)ZH?B`;`ECA;TBD#%qu +DYA#FE:\)GEqaY=FRjMEEqsePFT6L_G5ZXbGlN'gHN/
  • M2@+J +N/`jYO-#KeP*;,qQC!u+R@9V7SXuFFTV8'RUSO]^VPg>jWN)u!XKAV-YHP17Z*L[AZa@*IrjMj9 +s1&'=s186BrOi0Ds1\EGs1nWMr5/KOs2=iSs2P)ZrQ,#\s2t>as31MfrltSkd*Vd>!n,QHrmV2' +f%/I)f\"mVg&]s`rnRV3hu;O7iSsjs!T`AAjoOZ/roj[Qlg*p(mHs?@n,MkWnc&+Zo)SF]p&Fac +p\jmeq>U6fqu-HkrUTr=s+LE&~> +JcC<$JcF[.mf*(]r;?`5BI/^q[Xu]tCtg\[f5Y[^EKK +Za$a=YHG"0X/`2!W2HPjV50o^TqS-OSt;LCS"#k7R$a5+Q'IStP*1rhrf7PLNJrgSMM[1GLPLV= +KnTGX$\Eq[J:E&tI=6KjHiAlS%.>5_V'=T;J#j;Yj>k<;fhn5VV#>lJ%-?M\%.@/aU3@fBm:AG]s;B)ZH?B`;`ECA;TBD#%qu +DYA#FE:\)GEqaY=FRjMEEqsePFT6L_G5ZXbGlN'gHN/
  • M2@+J +N/`jYO-#KeP*;,qQC!u+R@9V7SXuFFTV8'RUSO]^VPg>jWN)u!XKAV-YHP17Z*L[AZa@*IrjMj9 +s1&'=s186BrOi0Ds1\EGs1nWMr5/KOs2=iSs2P)ZrQ,#\s2t>as31MfrltSkd*Vd>!n,QHrmV2' +f%/I)f\"mVg&]s`rnRV3hu;O7iSsjs!T`AAjoOZ/roj[Qlg*p(mHs?@n,MkWnc&+Zo)SF]p&Fac +p\jmeq>U6fqu-HkrUTr=s+LE&~> +JcC<$JcF[.mf*(]r;?`5BI/^q[Xu]tCtg\[f5Y[^EKK +Za$a=YHG"0X/`2!W2HPjV50o^TqS-OSt;LCS"#k7R$a5+Q'IStP*1rhrf7PLNJrgSMM[1GLPLV= +KnTGX$\Eq[J:E&tI=6KjHiAlS%.>5_V'=T;J#j;Yj>k<;fhn5VV#>lJ%-?M\%.@/aU3@fBm:AG]s;B)ZH?B`;`ECA;TBD#%qu +DYA#FE:\)GEqaY=FRjMEEqsePFT6L_G5ZXbGlN'gHN/
  • M2@+J +N/`jYO-#KeP*;,qQC!u+R@9V7SXuFFTV8'RUSO]^VPg>jWN)u!XKAV-YHP17Z*L[AZa@*IrjMj9 +s1&'=s186BrOi0Ds1\EGs1nWMr5/KOs2=iSs2P)ZrQ,#\s2t>as31MfrltSkd*Vd>!n,QHrmV2' +f%/I)f\"mVg&]s`rnRV3hu;O7iSsjs!T`AAjoOZ/roj[Qlg*p(mHs?@n,MkWnc&+Zo)SF]p&Fac +p\jmeq>U6fqu-HkrUTr=s+LE&~> +JcC<$JcFX-mf*(]qu$6dr;-Bfq=ss`rV$-]rq-6^r:9jWs7$!Us6fpSrp9[N!:'RJs6'dPk2tde +jQ#:[iVqbbhqm2FgtUQ:g"=p-e^W*tda?IgcHa\YbK@rJaN)9=`5BI.^q[Xu]Y(kf\[f2X[^EKK +ZE^X +KnY24K7\Z*J:N,uIXQWls*Ocls*4Thrc\TjF`heJF)uC$E<:)tDuOVTD/B2es(VOJrb2=E!+u4A +s'u+>raPn9s'Yh5s'>\2rETA,s'#A(s&f8%r)Wbrr`&Ykqbm5enPK$WqG-WVp.Y'Npe:BUrD*;e +q,%&frDNJjrD`brq,[GqrE/htrEB,'q-\5qdTP7s()";Ll$tGMiM1M_u@UQ`W!mWa8O*ZaoBN^b6#o4c2Q#gci;Akd/qbFe,Ii%e^i=' +f@\a/rn7D-h#?+AhV[5Ki8N\Tj5]4]jlY^gkNMp0!UB"MliQSBmf)YVnF?&JncJFTo_nI_pAamc +q#C0hqYU0hr;?Nbrdk*%s*t~> +JcC<$JcFX-mf*(]qu$6dr;-Bfq=ss`rV$-]rq-6^r:9jWs7$!Us6fpSrp9[N!:'RJs6'dPk2tde +jQ#:[iVqbbhqm2FgtUQ:g"=p-e^W*tda?IgcHa\YbK@rJaN)9=`5BI.^q[Xu]Y(kf\[f2X[^EKK +ZE^X +KnY24K7\Z*J:N,uIXQWls*Ocls*4Thrc\TjF`heJF)uC$E<:)tDuOVTD/B2es(VOJrb2=E!+u4A +s'u+>raPn9s'Yh5s'>\2rETA,s'#A(s&f8%r)Wbrr`&Ykqbm5enPK$WqG-WVp.Y'Npe:BUrD*;e +q,%&frDNJjrD`brq,[GqrE/htrEB,'q-\5qdTP7s()";Ll$tGMiM1M_u@UQ`W!mWa8O*ZaoBN^b6#o4c2Q#gci;Akd/qbFe,Ii%e^i=' +f@\a/rn7D-h#?+AhV[5Ki8N\Tj5]4]jlY^gkNMp0!UB"MliQSBmf)YVnF?&JncJFTo_nI_pAamc +q#C0hqYU0hr;?Nbrdk*%s*t~> +JcC<$JcFX-mf*(]qu$6dr;-Bfq=ss`rV$-]rq-6^r:9jWs7$!Us6fpSrp9[N!:'RJs6'dPk2tde +jQ#:[iVqbbhqm2FgtUQ:g"=p-e^W*tda?IgcHa\YbK@rJaN)9=`5BI.^q[Xu]Y(kf\[f2X[^EKK +ZE^X +KnY24K7\Z*J:N,uIXQWls*Ocls*4Thrc\TjF`heJF)uC$E<:)tDuOVTD/B2es(VOJrb2=E!+u4A +s'u+>raPn9s'Yh5s'>\2rETA,s'#A(s&f8%r)Wbrr`&Ykqbm5enPK$WqG-WVp.Y'Npe:BUrD*;e +q,%&frDNJjrD`brq,[GqrE/htrEB,'q-\5qdTP7s()";Ll$tGMiM1M_u@UQ`W!mWa8O*ZaoBN^b6#o4c2Q#gci;Akd/qbFe,Ii%e^i=' +f@\a/rn7D-h#?+AhV[5Ki8N\Tj5]4]jlY^gkNMp0!UB"MliQSBmf)YVnF?&JncJFTo_nI_pAamc +q#C0hqYU0hr;?Nbrdk*%s*t~> +JcC<$JcFU,mJd"]qu$3crVHKgq=sp_rq?6^rq-3]r:9mXs7$!Us6fpSrp9[N!:'RJs6'dPk2tde +jQ#:[iVqbChqm2FgtUQ:g"4j,e^W*tda?FfcHa\YbK@rJaMu3<`5BI.^q[Xu]Y(kf\[f2X[^EKK +Za$a=YHG"0XK/A#W2HPjV50o^U7n9RT:VXFS=?":R@'A.QBd`"PEM)kOT(:NNfB!VMi*@JLkph@ +L4t<[K)pRTrdY$!If=`rI!bj=!dT$8rc\BdFoHIaF)l=#E<1#srbhaQ!,VXM!buF`rb)@GAnM$R +!b>eNraGq;?srt@s'G_2rETA,s'#A(s&f8%qc<\rrD`JhqGR,dnkf0YqbH]Vj@o8Ar(d2dqG@,f +r_iSkrD`_qq,[GqrE/htrEB,'q--ra>_6qdTP7rabn;rau.Bqe5qBrG)+CqJ>kBdr+u" +qf)1IqJu@Pj)j[0olU.Trc\6arcnHgrd+Tk!.=co5^n34J:N3&JqJ]/Knb>;Ll$tGMi3S"-%@StD^MU8+N[V5C/gW2ZesX/rG*Y-7i/#-kJ?Za@*IrjDm;\@DOKs186B +rk/9Es1\EGs1nWMrPJQOs2=iSs2P&YrQ,#\s2t;`s31Mfrm(Pi!7:\l!n,QHrmV2'f%/I)f\"mV +g'?BfgtgfChV\=j!TE&;irS6&roOIKkih9qlK[^7liHMArpTmV!:g$Y!qZ'Vrq6 +JcC<$JcFU,mJd"]qu$3crVHKgq=sp_rq?6^rq-3]r:9mXs7$!Us6fpSrp9[N!:'RJs6'dPk2tde +jQ#:[iVqbChqm2FgtUQ:g"4j,e^W*tda?FfcHa\YbK@rJaMu3<`5BI.^q[Xu]Y(kf\[f2X[^EKK +Za$a=YHG"0XK/A#W2HPjV50o^U7n9RT:VXFS=?":R@'A.QBd`"PEM)kOT(:NNfB!VMi*@JLkph@ +L4t<[K)pRTrdY$!If=`rI!bj=!dT$8rc\BdFoHIaF)l=#E<1#srbhaQ!,VXM!buF`rb)@GAnM$R +!b>eNraGq;?srt@s'G_2rETA,s'#A(s&f8%qc<\rrD`JhqGR,dnkf0YqbH]Vj@o8Ar(d2dqG@,f +r_iSkrD`_qq,[GqrE/htrEB,'q--ra>_6qdTP7rabn;rau.Bqe5qBrG)+CqJ>kBdr+u" +qf)1IqJu@Pj)j[0olU.Trc\6arcnHgrd+Tk!.=co5^n34J:N3&JqJ]/Knb>;Ll$tGMi3S"-%@StD^MU8+N[V5C/gW2ZesX/rG*Y-7i/#-kJ?Za@*IrjDm;\@DOKs186B +rk/9Es1\EGs1nWMrPJQOs2=iSs2P&YrQ,#\s2t;`s31Mfrm(Pi!7:\l!n,QHrmV2'f%/I)f\"mV +g'?BfgtgfChV\=j!TE&;irS6&roOIKkih9qlK[^7liHMArpTmV!:g$Y!qZ'Vrq6 +JcC<$JcFU,mJd"]qu$3crVHKgq=sp_rq?6^rq-3]r:9mXs7$!Us6fpSrp9[N!:'RJs6'dPk2tde +jQ#:[iVqbChqm2FgtUQ:g"4j,e^W*tda?FfcHa\YbK@rJaMu3<`5BI.^q[Xu]Y(kf\[f2X[^EKK +Za$a=YHG"0XK/A#W2HPjV50o^U7n9RT:VXFS=?":R@'A.QBd`"PEM)kOT(:NNfB!VMi*@JLkph@ +L4t<[K)pRTrdY$!If=`rI!bj=!dT$8rc\BdFoHIaF)l=#E<1#srbhaQ!,VXM!buF`rb)@GAnM$R +!b>eNraGq;?srt@s'G_2rETA,s'#A(s&f8%qc<\rrD`JhqGR,dnkf0YqbH]Vj@o8Ar(d2dqG@,f +r_iSkrD`_qq,[GqrE/htrEB,'q--ra>_6qdTP7rabn;rau.Bqe5qBrG)+CqJ>kBdr+u" +qf)1IqJu@Pj)j[0olU.Trc\6arcnHgrd+Tk!.=co5^n34J:N3&JqJ]/Knb>;Ll$tGMi3S"-%@StD^MU8+N[V5C/gW2ZesX/rG*Y-7i/#-kJ?Za@*IrjDm;\@DOKs186B +rk/9Es1\EGs1nWMrPJQOs2=iSs2P&YrQ,#\s2t;`s31Mfrm(Pi!7:\l!n,QHrmV2'f%/I)f\"mV +g'?BfgtgfChV\=j!TE&;irS6&roOIKkih9qlK[^7liHMArpTmV!:g$Y!qZ'Vrq6 +JcC<$JcFR+mJct\r;?raPn9!+>b4s'>\2rETA,s'#>'s&f8%qc-ra>_6qdTP7rabn;rau.Bqe5qBrG)(BqJ>P9g2?b* +qf)4Jqf;FPa)q9&rc\3`s*4QhrHeKj!.=cos*b9(J:N3%JqJ]/L&QflLPUeDMMmFQNfT6_Ocklk +Pa.Q$R$a;1S"-%@StD[LTqeEZV5C/gW2ZesX/rG*Y-5(6Z*CU@Za@-J[^NZS\Gj&=])TDA]`5\F +^AYhH_#M7K_Z%IQ`;IUS`r=$WaSs<]b5KN`bl>recMu5jd/MGmdK%bpe-FOTf%8O+f\-8X!o)Mc +rnRV3hu;OBiSrkWj5f=`k2tjikl0fOlKdd&m-X3.rpTmV!:g'Zs7?9_rq6 +JcC<$JcFR+mJct\r;?raPn9!+>b4s'>\2rETA,s'#>'s&f8%qc-ra>_6qdTP7rabn;rau.Bqe5qBrG)(BqJ>P9g2?b* +qf)4Jqf;FPa)q9&rc\3`s*4QhrHeKj!.=cos*b9(J:N3%JqJ]/L&QflLPUeDMMmFQNfT6_Ocklk +Pa.Q$R$a;1S"-%@StD[LTqeEZV5C/gW2ZesX/rG*Y-5(6Z*CU@Za@-J[^NZS\Gj&=])TDA]`5\F +^AYhH_#M7K_Z%IQ`;IUS`r=$WaSs<]b5KN`bl>recMu5jd/MGmdK%bpe-FOTf%8O+f\-8X!o)Mc +rnRV3hu;OBiSrkWj5f=`k2tjikl0fOlKdd&m-X3.rpTmV!:g'Zs7?9_rq6 +JcC<$JcFR+mJct\r;?raPn9!+>b4s'>\2rETA,s'#>'s&f8%qc-ra>_6qdTP7rabn;rau.Bqe5qBrG)(BqJ>P9g2?b* +qf)4Jqf;FPa)q9&rc\3`s*4QhrHeKj!.=cos*b9(J:N3%JqJ]/L&QflLPUeDMMmFQNfT6_Ocklk +Pa.Q$R$a;1S"-%@StD[LTqeEZV5C/gW2ZesX/rG*Y-5(6Z*CU@Za@-J[^NZS\Gj&=])TDA]`5\F +^AYhH_#M7K_Z%IQ`;IUS`r=$WaSs<]b5KN`bl>recMu5jd/MGmdK%bpe-FOTf%8O+f\-8X!o)Mc +rnRV3hu;OBiSrkWj5f=`k2tjikl0fOlKdd&m-X3.rpTmV!:g'Zs7?9_rq6 +JcC<$JcFR+m/Hn\qu$3cr;-Bfq=sp_rq?6^rq-3]r:9mXs7$!U!q,ICrp9[N!:'RJE9QKJk2tdd +jQ#:[iS`YOhVI#CgY1B7f[na+e^W*sdF$=ecHXSVbK@rJa2Z*;`59C-^q[Us]Y(kf\[],W[^EKK +Za$a=YHG"0XK/A$WMl_mVPU)aUS=HUTV%gISXc1=R[KP1Q^3o%P`q8nOc]R'"ceS$N/NSmM&M2* +L5(D8KS+o/JUr?%IsuipI=-BgH?sj^GlDmfG'3e+!crC&rc%sXDuOVUD/=%fCBnTgBkV0mB4h-S +s'u+>rF,h:?srt@s'G_2rETA,s'#>'r`K2%qH!Ppr)E;eq,7&doMGE\qG-NSo1\^LrD*8dqG@,f +rDNJjr`&hrq,[Gqr)i_sr*'#&pg!c'rEf>-ra>_6qdTP7rabn;rau.BqIohArG)(Bph\]%m;Dc= +r,D=Kqf;LRa`RH'rc\0_s*4QhrHeKj!.=cos*artrd[1`JqJ]/KnY89LPUeDMMmFPNK0']Ocklk +Pa.N"R$a;1S"#q>StD[LTq\?YV5C/gW2ZesX/rG*Y-5(6Z*OA8!OT96[Ks@P\@K/]]">TR]`5\F +^AbnH_#M7L_Z%IQ`;IUR`rF*WaT'B]b5KN`bl>rdcMu2jd/DAldK%bqeGn&!f)F;$fDsV(gAfn- +h#?+7hV[5Ki8NYSro4%?jo4BIkNM-ol0@R"rp0^RmdC)C!q>aMrpp*\!;-6_s7ZKerV6Bfs8)Wi +rVZWmo)=4?KE$H~> +JcC<$JcFR+m/Hn\qu$3cr;-Bfq=sp_rq?6^rq-3]r:9mXs7$!U!q,ICrp9[N!:'RJE9QKJk2tdd +jQ#:[iS`YOhVI#CgY1B7f[na+e^W*sdF$=ecHXSVbK@rJa2Z*;`59C-^q[Us]Y(kf\[],W[^EKK +Za$a=YHG"0XK/A$WMl_mVPU)aUS=HUTV%gISXc1=R[KP1Q^3o%P`q8nOc]R'"ceS$N/NSmM&M2* +L5(D8KS+o/JUr?%IsuipI=-BgH?sj^GlDmfG'3e+!crC&rc%sXDuOVUD/=%fCBnTgBkV0mB4h-S +s'u+>rF,h:?srt@s'G_2rETA,s'#>'r`K2%qH!Ppr)E;eq,7&doMGE\qG-NSo1\^LrD*8dqG@,f +rDNJjr`&hrq,[Gqr)i_sr*'#&pg!c'rEf>-ra>_6qdTP7rabn;rau.BqIohArG)(Bph\]%m;Dc= +r,D=Kqf;LRa`RH'rc\0_s*4QhrHeKj!.=cos*artrd[1`JqJ]/KnY89LPUeDMMmFPNK0']Ocklk +Pa.N"R$a;1S"#q>StD[LTq\?YV5C/gW2ZesX/rG*Y-5(6Z*OA8!OT96[Ks@P\@K/]]">TR]`5\F +^AbnH_#M7L_Z%IQ`;IUR`rF*WaT'B]b5KN`bl>rdcMu2jd/DAldK%bqeGn&!f)F;$fDsV(gAfn- +h#?+7hV[5Ki8NYSro4%?jo4BIkNM-ol0@R"rp0^RmdC)C!q>aMrpp*\!;-6_s7ZKerV6Bfs8)Wi +rVZWmo)=4?KE$H~> +JcC<$JcFR+m/Hn\qu$3cr;-Bfq=sp_rq?6^rq-3]r:9mXs7$!U!q,ICrp9[N!:'RJE9QKJk2tdd +jQ#:[iS`YOhVI#CgY1B7f[na+e^W*sdF$=ecHXSVbK@rJa2Z*;`59C-^q[Us]Y(kf\[],W[^EKK +Za$a=YHG"0XK/A$WMl_mVPU)aUS=HUTV%gISXc1=R[KP1Q^3o%P`q8nOc]R'"ceS$N/NSmM&M2* +L5(D8KS+o/JUr?%IsuipI=-BgH?sj^GlDmfG'3e+!crC&rc%sXDuOVUD/=%fCBnTgBkV0mB4h-S +s'u+>rF,h:?srt@s'G_2rETA,s'#>'r`K2%qH!Ppr)E;eq,7&doMGE\qG-NSo1\^LrD*8dqG@,f +rDNJjr`&hrq,[Gqr)i_sr*'#&pg!c'rEf>-ra>_6qdTP7rabn;rau.BqIohArG)(Bph\]%m;Dc= +r,D=Kqf;LRa`RH'rc\0_s*4QhrHeKj!.=cos*artrd[1`JqJ]/KnY89LPUeDMMmFPNK0']Ocklk +Pa.N"R$a;1S"#q>StD[LTq\?YV5C/gW2ZesX/rG*Y-5(6Z*OA8!OT96[Ks@P\@K/]]">TR]`5\F +^AbnH_#M7L_Z%IQ`;IUR`rF*WaT'B]b5KN`bl>rdcMu2jd/DAldK%bqeGn&!f)F;$fDsV(gAfn- +h#?+7hV[5Ki8NYSro4%?jo4BIkNM-ol0@R"rp0^RmdC)C!q>aMrpp*\!;-6_s7ZKerV6Bfs8)Wi +rVZWmo)=4?KE$H~> +JcC<$JcFO*m/Hn\qu$0br;-Bfq=sp_rq?6^rq-6^r:9mXs7$!Us6]mSrp9[N!:'RJ#3b75k2tdd +ro7eRiS`YOhVI#CgY1B7f[na+eC;sqdF$=dcHXSVbK7iHa2Z*:_ns:,^q[Us]Y(kf\[],W[^EKK +Za-g>YHG"0XK/A$WMl_mVPU)aUS=HUTV%gISXc1=R[KP1Q^3o%P`q;oP*(ieO,f5!N!5,sM2@%D +re:H-K`6T)JqVm!GuZPC]A,LC&VcIB4bcT +AHHCPA,]s;@/s^6?iOI4?2\%.>Q7n)=oMP&=8>nq!c_:]!o>:&Ica:\did;>jDh +;uK\oPMJ%?2\++?i=C3@JaO5A,^$9Ac?<@BDQTR]`5YF^AYhH +_#M7K_Z.OR`;IUR`rF*WaSs<]b5BH_bl>rdcMu5jd/MGmdf7eqeGn&!f)F;$fDsV(gAfn-h#?+2 +hV[5ihuVfrro47EjlPXekND(.klU/9li-5OmI'uBs6p$YrUL$]o^r+Ts7ZKerV6EgrqcNhrVZWm +o)=4?KE$H~> +JcC<$JcFO*m/Hn\qu$0br;-Bfq=sp_rq?6^rq-6^r:9mXs7$!Us6]mSrp9[N!:'RJ#3b75k2tdd +ro7eRiS`YOhVI#CgY1B7f[na+eC;sqdF$=dcHXSVbK7iHa2Z*:_ns:,^q[Us]Y(kf\[],W[^EKK +Za-g>YHG"0XK/A$WMl_mVPU)aUS=HUTV%gISXc1=R[KP1Q^3o%P`q;oP*(ieO,f5!N!5,sM2@%D +re:H-K`6T)JqVm!GuZPC]A,LC&VcIB4bcT +AHHCPA,]s;@/s^6?iOI4?2\%.>Q7n)=oMP&=8>nq!c_:]!o>:&Ica:\did;>jDh +;uK\oPMJ%?2\++?i=C3@JaO5A,^$9Ac?<@BDQTR]`5YF^AYhH +_#M7K_Z.OR`;IUR`rF*WaSs<]b5BH_bl>rdcMu5jd/MGmdf7eqeGn&!f)F;$fDsV(gAfn-h#?+2 +hV[5ihuVfrro47EjlPXekND(.klU/9li-5OmI'uBs6p$YrUL$]o^r+Ts7ZKerV6EgrqcNhrVZWm +o)=4?KE$H~> +JcC<$JcFO*m/Hn\qu$0br;-Bfq=sp_rq?6^rq-6^r:9mXs7$!Us6]mSrp9[N!:'RJ#3b75k2tdd +ro7eRiS`YOhVI#CgY1B7f[na+eC;sqdF$=dcHXSVbK7iHa2Z*:_ns:,^q[Us]Y(kf\[],W[^EKK +Za-g>YHG"0XK/A$WMl_mVPU)aUS=HUTV%gISXc1=R[KP1Q^3o%P`q;oP*(ieO,f5!N!5,sM2@%D +re:H-K`6T)JqVm!GuZPC]A,LC&VcIB4bcT +AHHCPA,]s;@/s^6?iOI4?2\%.>Q7n)=oMP&=8>nq!c_:]!o>:&Ica:\did;>jDh +;uK\oPMJ%?2\++?i=C3@JaO5A,^$9Ac?<@BDQTR]`5YF^AYhH +_#M7K_Z.OR`;IUR`rF*WaSs<]b5BH_bl>rdcMu5jd/MGmdf7eqeGn&!f)F;$fDsV(gAfn-h#?+2 +hV[5ihuVfrro47EjlPXekND(.klU/9li-5OmI'uBs6p$YrUL$]o^r+Ts7ZKerV6EgrqcNhrVZWm +o)=4?KE$H~> +JcC<$JcFL)m/Hk[qu$0brVHHfq=ss`rV$-]s7H<^rUU!Ys7$!Us6]mSrTjRNlMg#Pki_-kk2k\' +j&Y0ui8EMLh;-l@g=k64f@JL%eC2jndEg+`c-4ARaiMQD`l5m6_SX.)^V7Co]Xtbc\@8oT[C!9H +ZE^XrF,h:?srq?!a]/'r`K,#q,[Dnqc*,bqbm;gohbN]qbGp@r(d/cq,%#er_iPj +r`&hrq,[DprE/esr*'#&pK[Z&rEf>-ra>_6qdTP7rabn;rau+AqIohArG(t?g2-=soPXPEr,DCM +qf;LRe9(M/rHA$]rcnHgrHeKjs*Xfos*artrdY$#K)UBnKS>/8LPUeDMMmFPNK0'\OHG]hPE_>u +Q^F/.R[]heF^]2+L +_>V7N_u@UQ`W!mWa8c=3 +hu;O=iSrkWj5f:_roOIKkih9qlK[^7m/QGQmf)\Tn,W"Xo)J=]o`"O`pAambq#C0hqYU0gr;HTb +rdk*%s*t~> +JcC<$JcFL)m/Hk[qu$0brVHHfq=ss`rV$-]s7H<^rUU!Ys7$!Us6]mSrTjRNlMg#Pki_-kk2k\' +j&Y0ui8EMLh;-l@g=k64f@JL%eC2jndEg+`c-4ARaiMQD`l5m6_SX.)^V7Co]Xtbc\@8oT[C!9H +ZE^XrF,h:?srq?!a]/'r`K,#q,[Dnqc*,bqbm;gohbN]qbGp@r(d/cq,%#er_iPj +r`&hrq,[DprE/esr*'#&pK[Z&rEf>-ra>_6qdTP7rabn;rau+AqIohArG(t?g2-=soPXPEr,DCM +qf;LRe9(M/rHA$]rcnHgrHeKjs*Xfos*artrdY$#K)UBnKS>/8LPUeDMMmFPNK0'\OHG]hPE_>u +Q^F/.R[]heF^]2+L +_>V7N_u@UQ`W!mWa8c=3 +hu;O=iSrkWj5f:_roOIKkih9qlK[^7m/QGQmf)\Tn,W"Xo)J=]o`"O`pAambq#C0hqYU0gr;HTb +rdk*%s*t~> +JcC<$JcFL)m/Hk[qu$0brVHHfq=ss`rV$-]s7H<^rUU!Ys7$!Us6]mSrTjRNlMg#Pki_-kk2k\' +j&Y0ui8EMLh;-l@g=k64f@JL%eC2jndEg+`c-4ARaiMQD`l5m6_SX.)^V7Co]Xtbc\@8oT[C!9H +ZE^XrF,h:?srq?!a]/'r`K,#q,[Dnqc*,bqbm;gohbN]qbGp@r(d/cq,%#er_iPj +r`&hrq,[DprE/esr*'#&pK[Z&rEf>-ra>_6qdTP7rabn;rau+AqIohArG(t?g2-=soPXPEr,DCM +qf;LRe9(M/rHA$]rcnHgrHeKjs*Xfos*artrdY$#K)UBnKS>/8LPUeDMMmFPNK0'\OHG]hPE_>u +Q^F/.R[]heF^]2+L +_>V7N_u@UQ`W!mWa8c=3 +hu;O=iSrkWj5f:_roOIKkih9qlK[^7m/QGQmf)\Tn,W"Xo)J=]o`"O`pAambq#C0hqYU0gr;HTb +rdk*%s*t~> +JcC<$JcFI(m/Hk[qu$0br;-Bfq=sp_rq?6^s7H<^rUU!Ys7$!Us6]mSrp9[N!:'RJ!U/_Gk'lFQ +j5].XiS`YOhVI#CgY1?5f@SU(eC;sqdEp4bcHXSVb/q`Ga2Z*:_ns:,^q[Us]Y(kf\[],W[^EKK +Za-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ$LSt2C@S!ob4R$X,(Q'@MsP*1rhO,o<\NJrgSMM[1G +Lkg_>L&Zi+K)pRTrdY$!If=a(I!^3dH?ja[GB\4RFoHI`F)q8"#B4U"DJj<.D#S2OC2%D]BEDgY +B)Z?CA7K-K@fKm:@/aO5?N4=0>lIt->5MJ%=T)=rb;#=&b:?,(G:Ado_;#X>j +;Ya8j<;fhl5MP!>l@t,?M\%-@/aU3@fBm:AG]s;B)ZH>B`2ZCC@c5jD"hf>DZ"GN +E;+AMEr'k6FRsYPG56@]GlN'eHN/?lI/\QoIK4lsJ,t4Qrdt6)L&QfiLPUeDMMmFPNK0'\Ocklk +Pa.N"Q^F20S"#q>StD[LTqeEZV5C/gW2ckuXKAV-YHY79ZEpmE[C*HO\%)FJ#J.OZ]Y(qk^AYhH +^];4L_Z%IQ`;R[S`rF*VaT'B]b5BH_bl5lccMu5jd/DAldf7epe,n1Of)F;$fDsV(gAfn-h#?.0 +h>lI4i;_a9ir7sCjQ5Lck3(pkrojLLlg+Q:!q#FDrpKpXnaZVLs766_rUp3as7cHds7uZjqtpBj +r;H3cJcCB&J,~> +JcC<$JcFI(m/Hk[qu$0br;-Bfq=sp_rq?6^s7H<^rUU!Ys7$!Us6]mSrp9[N!:'RJ!U/_Gk'lFQ +j5].XiS`YOhVI#CgY1?5f@SU(eC;sqdEp4bcHXSVb/q`Ga2Z*:_ns:,^q[Us]Y(kf\[],W[^EKK +Za-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ$LSt2C@S!ob4R$X,(Q'@MsP*1rhO,o<\NJrgSMM[1G +Lkg_>L&Zi+K)pRTrdY$!If=a(I!^3dH?ja[GB\4RFoHI`F)q8"#B4U"DJj<.D#S2OC2%D]BEDgY +B)Z?CA7K-K@fKm:@/aO5?N4=0>lIt->5MJ%=T)=rb;#=&b:?,(G:Ado_;#X>j +;Ya8j<;fhl5MP!>l@t,?M\%-@/aU3@fBm:AG]s;B)ZH>B`2ZCC@c5jD"hf>DZ"GN +E;+AMEr'k6FRsYPG56@]GlN'eHN/?lI/\QoIK4lsJ,t4Qrdt6)L&QfiLPUeDMMmFPNK0'\Ocklk +Pa.N"Q^F20S"#q>StD[LTqeEZV5C/gW2ckuXKAV-YHY79ZEpmE[C*HO\%)FJ#J.OZ]Y(qk^AYhH +^];4L_Z%IQ`;R[S`rF*VaT'B]b5BH_bl5lccMu5jd/DAldf7epe,n1Of)F;$fDsV(gAfn-h#?.0 +h>lI4i;_a9ir7sCjQ5Lck3(pkrojLLlg+Q:!q#FDrpKpXnaZVLs766_rUp3as7cHds7uZjqtpBj +r;H3cJcCB&J,~> +JcC<$JcFI(m/Hk[qu$0br;-Bfq=sp_rq?6^s7H<^rUU!Ys7$!Us6]mSrp9[N!:'RJ!U/_Gk'lFQ +j5].XiS`YOhVI#CgY1?5f@SU(eC;sqdEp4bcHXSVb/q`Ga2Z*:_ns:,^q[Us]Y(kf\[],W[^EKK +Za-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ$LSt2C@S!ob4R$X,(Q'@MsP*1rhO,o<\NJrgSMM[1G +Lkg_>L&Zi+K)pRTrdY$!If=a(I!^3dH?ja[GB\4RFoHI`F)q8"#B4U"DJj<.D#S2OC2%D]BEDgY +B)Z?CA7K-K@fKm:@/aO5?N4=0>lIt->5MJ%=T)=rb;#=&b:?,(G:Ado_;#X>j +;Ya8j<;fhl5MP!>l@t,?M\%-@/aU3@fBm:AG]s;B)ZH>B`2ZCC@c5jD"hf>DZ"GN +E;+AMEr'k6FRsYPG56@]GlN'eHN/?lI/\QoIK4lsJ,t4Qrdt6)L&QfiLPUeDMMmFPNK0'\Ocklk +Pa.N"Q^F20S"#q>StD[LTqeEZV5C/gW2ckuXKAV-YHY79ZEpmE[C*HO\%)FJ#J.OZ]Y(qk^AYhH +^];4L_Z%IQ`;R[S`rF*VaT'B]b5BH_bl5lccMu5jd/DAldf7epe,n1Of)F;$fDsV(gAfn-h#?.0 +h>lI4i;_a9ir7sCjQ5Lck3(pkrojLLlg+Q:!q#FDrpKpXnaZVLs766_rUp3as7cHds7uZjqtpBj +r;H3cJcCB&J,~> +JcC<$JcFF'm/Hk[qY^'arVHHfq=ss`rV$0^rq-6^r:9mXs7$$Vs6]mSrp9[N!:'RJ!U/_Gk'Q4N +j5].Xi8EMLh;-l@g=k64f@SU(eC;spdEp4bcHXPUb/q`Ga2Q$9_ns:,^V@Lr]Y(kf\[f2X[^EKK +Za-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ$LSt2C@S!ob5R$a5+Q'IStP*1rhOH5H_NJrgSMi*@J +Lkkta!JQ4+K)pRTrdY$!If=`rI!bj=!I8qhG78Y;F`__HF)l8?E,]apD?k#pChmg$C2*Z\s(;=D +ral+?!+Yt:!b#JErEoS2s'>S.r`fD+qcWl"rE&_oqGmAkoi(`cr)*/aqbR&`kY:nKr(m)ar_`Vl +q,@5kr`/_orE&o!p0%;sqcii#r*B8-qHs50rF,S4raYq3S"-%@T:hmOU8+N\VPg>jWN*##Xf\b0YctC^ +JcC<$JcFF'm/Hk[qY^'arVHHfq=ss`rV$0^rq-6^r:9mXs7$$Vs6]mSrp9[N!:'RJ!U/_Gk'Q4N +j5].Xi8EMLh;-l@g=k64f@SU(eC;spdEp4bcHXPUb/q`Ga2Q$9_ns:,^V@Lr]Y(kf\[f2X[^EKK +Za-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ$LSt2C@S!ob5R$a5+Q'IStP*1rhOH5H_NJrgSMi*@J +Lkkta!JQ4+K)pRTrdY$!If=`rI!bj=!I8qhG78Y;F`__HF)l8?E,]apD?k#pChmg$C2*Z\s(;=D +ral+?!+Yt:!b#JErEoS2s'>S.r`fD+qcWl"rE&_oqGmAkoi(`cr)*/aqbR&`kY:nKr(m)ar_`Vl +q,@5kr`/_orE&o!p0%;sqcii#r*B8-qHs50rF,S4raYq3S"-%@T:hmOU8+N\VPg>jWN*##Xf\b0YctC^ +JcC<$JcFF'm/Hk[qY^'arVHHfq=ss`rV$0^rq-6^r:9mXs7$$Vs6]mSrp9[N!:'RJ!U/_Gk'Q4N +j5].Xi8EMLh;-l@g=k64f@SU(eC;spdEp4bcHXPUb/q`Ga2Q$9_ns:,^V@Lr]Y(kf\[f2X[^EKK +Za-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ$LSt2C@S!ob5R$a5+Q'IStP*1rhOH5H_NJrgSMi*@J +Lkkta!JQ4+K)pRTrdY$!If=`rI!bj=!I8qhG78Y;F`__HF)l8?E,]apD?k#pChmg$C2*Z\s(;=D +ral+?!+Yt:!b#JErEoS2s'>S.r`fD+qcWl"rE&_oqGmAkoi(`cr)*/aqbR&`kY:nKr(m)ar_`Vl +q,@5kr`/_orE&o!p0%;sqcii#r*B8-qHs50rF,S4raYq3S"-%@T:hmOU8+N\VPg>jWN*##Xf\b0YctC^ +JcC<$JcFC&m/HhZqu$0br;-?eq=ss`rq?6^s7H<^rUU!Ys7$$Vs6]mSrp9[N!:'RJ!U/_Gk#CI' +j5].Xi8EMLh;-l@g=k64f@SU(eC2jndEp4bcHOJTb/q`G`l5p8_ns:,^V@Lr]Y(kf\[f5Y[^EKK +Za-j?Yck43XfSS'Wi;qpVl$;dUna[`TadZeSt;LCS"#k7R$a5+rfmtXPEM)kOH5H_NfB!VMi.Lj ++,G],L4t>7K7ec,JUi9#IXZ]nI!^3dH?jd\GB\4RFoHI`F)q8"#B4U"DJj<.D#S2OC2%D]BEDgY +B)Z?CA7K-K@fKm:@/XI4?N4=/>lS%->5MJ$=Su7onq>5MOu>l@t,?MRt-@/aU3@fBm:AG]s;B)QB=B`2ZCC?o[1D!Ys1D#/#B +DZ+MOE;4GNEr0qJFRF;EG4p.YGlE!dHN/?lI/SHpIXckHJ3ng=JqJ]/KnY89LPUeDMMmFPNK0'\ +OHG]hPE_>tQ^F/.R[]hSe]Y2"m +rkJKK!5\WNs24lTrPefVrl=rXs2k8_r6,)`rltDerm1Vkr6bPms3pqr!nGlQrRV,'g"HAYs4[P/ +rS7P3hr"Fk!TE&;j8\0?jo4EBk5a`FklU/9li-5PmI'EAmfN"Knc&+ZoDeI]o`4^bp\jmeq>U6f +qu-HjrU^#>s+:9$~> +JcC<$JcFC&m/HhZqu$0br;-?eq=ss`rq?6^s7H<^rUU!Ys7$$Vs6]mSrp9[N!:'RJ!U/_Gk#CI' +j5].Xi8EMLh;-l@g=k64f@SU(eC2jndEp4bcHOJTb/q`G`l5p8_ns:,^V@Lr]Y(kf\[f5Y[^EKK +Za-j?Yck43XfSS'Wi;qpVl$;dUna[`TadZeSt;LCS"#k7R$a5+rfmtXPEM)kOH5H_NfB!VMi.Lj ++,G],L4t>7K7ec,JUi9#IXZ]nI!^3dH?jd\GB\4RFoHI`F)q8"#B4U"DJj<.D#S2OC2%D]BEDgY +B)Z?CA7K-K@fKm:@/XI4?N4=/>lS%->5MJ$=Su7onq>5MOu>l@t,?MRt-@/aU3@fBm:AG]s;B)QB=B`2ZCC?o[1D!Ys1D#/#B +DZ+MOE;4GNEr0qJFRF;EG4p.YGlE!dHN/?lI/SHpIXckHJ3ng=JqJ]/KnY89LPUeDMMmFPNK0'\ +OHG]hPE_>tQ^F/.R[]hSe]Y2"m +rkJKK!5\WNs24lTrPefVrl=rXs2k8_r6,)`rltDerm1Vkr6bPms3pqr!nGlQrRV,'g"HAYs4[P/ +rS7P3hr"Fk!TE&;j8\0?jo4EBk5a`FklU/9li-5PmI'EAmfN"Knc&+ZoDeI]o`4^bp\jmeq>U6f +qu-HjrU^#>s+:9$~> +JcC<$JcFC&m/HhZqu$0br;-?eq=ss`rq?6^s7H<^rUU!Ys7$$Vs6]mSrp9[N!:'RJ!U/_Gk#CI' +j5].Xi8EMLh;-l@g=k64f@SU(eC2jndEp4bcHOJTb/q`G`l5p8_ns:,^V@Lr]Y(kf\[f5Y[^EKK +Za-j?Yck43XfSS'Wi;qpVl$;dUna[`TadZeSt;LCS"#k7R$a5+rfmtXPEM)kOH5H_NfB!VMi.Lj ++,G],L4t>7K7ec,JUi9#IXZ]nI!^3dH?jd\GB\4RFoHI`F)q8"#B4U"DJj<.D#S2OC2%D]BEDgY +B)Z?CA7K-K@fKm:@/XI4?N4=/>lS%->5MJ$=Su7onq>5MOu>l@t,?MRt-@/aU3@fBm:AG]s;B)QB=B`2ZCC?o[1D!Ys1D#/#B +DZ+MOE;4GNEr0qJFRF;EG4p.YGlE!dHN/?lI/SHpIXckHJ3ng=JqJ]/KnY89LPUeDMMmFPNK0'\ +OHG]hPE_>tQ^F/.R[]hSe]Y2"m +rkJKK!5\WNs24lTrPefVrl=rXs2k8_r6,)`rltDerm1Vkr6bPms3pqr!nGlQrRV,'g"HAYs4[P/ +rS7P3hr"Fk!TE&;j8\0?jo4EBk5a`FklU/9li-5PmI'EAmfN"Knc&+ZoDeI]o`4^bp\jmeq>U6f +qu-HjrU^#>s+:9$~> +JcC<$JcF@%li-bZqY^'ar;-Bfq=sp_rq?9_rq-6^rUU!Ys7$$Vs6]mSrp9[NlIt,>5DD#=Su7nh;Z'Dc;#3uL:A[i^;#O8i;Ya8i +<;fhmnp>5MOu>l7n+?M\%.@/XO2@fBm:AG]s;B)QB=B`2ZBC<:8dD#8)DDZ+MOE;=MO +Er:"MFS0eHG4TqVGlE!cHN/?lI/SKnIfFosJ4kHFJqJ]/KnY89LPUeDMMd=NN/`jYOHG]hPE_>t +QC!u,R[]e:St;RITqS6WUnsrdW2ZesX/rG*YHY79ZEpmE[C3NQ\%&uZ]"@sS#edsd^V@S"_86,f +s24lTrPefVs2Y&Ys2k8_r6,)`rltAds3L\krR(Vms3pqrs4./#rn%2&s4RD*s4[P/rn[V2s53h6 +!o`.uro4%?jo4EBk5a`Fl2U#Kli-8Nm/ZSRn,MnWnc&+Zo)SF]p&Facp\agdq>U6fqu-HkrUTr= +s+:9$~> +JcC<$JcF@%li-bZqY^'ar;-Bfq=sp_rq?9_rq-6^rUU!Ys7$$Vs6]mSrp9[NlIt,>5DD#=Su7nh;Z'Dc;#3uL:A[i^;#O8i;Ya8i +<;fhmnp>5MOu>l7n+?M\%.@/XO2@fBm:AG]s;B)QB=B`2ZBC<:8dD#8)DDZ+MOE;=MO +Er:"MFS0eHG4TqVGlE!cHN/?lI/SKnIfFosJ4kHFJqJ]/KnY89LPUeDMMd=NN/`jYOHG]hPE_>t +QC!u,R[]e:St;RITqS6WUnsrdW2ZesX/rG*YHY79ZEpmE[C3NQ\%&uZ]"@sS#edsd^V@S"_86,f +s24lTrPefVs2Y&Ys2k8_r6,)`rltAds3L\krR(Vms3pqrs4./#rn%2&s4RD*s4[P/rn[V2s53h6 +!o`.uro4%?jo4EBk5a`Fl2U#Kli-8Nm/ZSRn,MnWnc&+Zo)SF]p&Facp\agdq>U6fqu-HkrUTr= +s+:9$~> +JcC<$JcF@%li-bZqY^'ar;-Bfq=sp_rq?9_rq-6^rUU!Ys7$$Vs6]mSrp9[NlIt,>5DD#=Su7nh;Z'Dc;#3uL:A[i^;#O8i;Ya8i +<;fhmnp>5MOu>l7n+?M\%.@/XO2@fBm:AG]s;B)QB=B`2ZBC<:8dD#8)DDZ+MOE;=MO +Er:"MFS0eHG4TqVGlE!cHN/?lI/SKnIfFosJ4kHFJqJ]/KnY89LPUeDMMd=NN/`jYOHG]hPE_>t +QC!u,R[]e:St;RITqS6WUnsrdW2ZesX/rG*YHY79ZEpmE[C3NQ\%&uZ]"@sS#edsd^V@S"_86,f +s24lTrPefVs2Y&Ys2k8_r6,)`rltAds3L\krR(Vms3pqrs4./#rn%2&s4RD*s4[P/rn[V2s53h6 +!o`.uro4%?jo4EBk5a`Fl2U#Kli-8Nm/ZSRn,MnWnc&+Zo)SF]p&Facp\agdq>U6fqu-HkrUTr= +s+:9$~> +JcC<$JcF=$li-_Yqu$0br;-?eq=ss`rq?9_rq-6^rUU!Ys7$$Vs6]mSrp1$YlK[Wukih3lk2k\' +j'q$,i8EMLh;-l@g=k63f@JL%eC2jndEg+`c-4ASb/hZE`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN +Za6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OT:VXFS=?":R@'A.QN!-QP`q8nOc]R'$BC+)N/NRN +M2@%Dre;>FKS+o/Jq8H&It)oqI=-EhH?sj^G^"@TG'3e+!HW;\E<1#srbhaQ!,VXM!buF`rb)@G +AnM$R!b>eNrF,h:?srq?ra,V1r*95*r`],#r)ihtoiCriqc*;gr)3GipJCZ]lq[CQpJCfcrDNGi +rD`_qq,[Dpr)iVpqc`l$p0@Q%rEf;,ra>_6qdTP7rabk:rau.Bq.T\?r+a5eq/#tGpMTqJrG_RP +rGqgWolTtOoQK\Ir-80cqg/9hrd=Zms*artrI=p"K)UE&KLCNKL51S@M2@+JN/WaVO,oBbP*2&p +Q'Rc(R$jG5S=Q7DTV8'RUSO``Vl-JnWiN5'Xfek3Z*L^B['d?N\%&rY\[oEP]E,^[rkANM_86,f +s2+iTrPefVs2Y&Ys2k8_r6,)`rltAdrm1Vkr6bPmrmUhqs4./#rR_)%!87>)s4[P/rS7P3hr"Fk +!o`.uro4(@jlQL(!pAe2rojLLlg+Q:!q#FDrpTmV!:g$Y!qZ'VrUp3as7cKerqZQiqtp?irVc +JcC<$JcF=$li-_Yqu$0br;-?eq=ss`rq?9_rq-6^rUU!Ys7$$Vs6]mSrp1$YlK[Wukih3lk2k\' +j'q$,i8EMLh;-l@g=k63f@JL%eC2jndEg+`c-4ASb/hZE`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN +Za6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OT:VXFS=?":R@'A.QN!-QP`q8nOc]R'$BC+)N/NRN +M2@%Dre;>FKS+o/Jq8H&It)oqI=-EhH?sj^G^"@TG'3e+!HW;\E<1#srbhaQ!,VXM!buF`rb)@G +AnM$R!b>eNrF,h:?srq?ra,V1r*95*r`],#r)ihtoiCriqc*;gr)3GipJCZ]lq[CQpJCfcrDNGi +rD`_qq,[Dpr)iVpqc`l$p0@Q%rEf;,ra>_6qdTP7rabk:rau.Bq.T\?r+a5eq/#tGpMTqJrG_RP +rGqgWolTtOoQK\Ir-80cqg/9hrd=Zms*artrI=p"K)UE&KLCNKL51S@M2@+JN/WaVO,oBbP*2&p +Q'Rc(R$jG5S=Q7DTV8'RUSO``Vl-JnWiN5'Xfek3Z*L^B['d?N\%&rY\[oEP]E,^[rkANM_86,f +s2+iTrPefVs2Y&Ys2k8_r6,)`rltAdrm1Vkr6bPmrmUhqs4./#rR_)%!87>)s4[P/rS7P3hr"Fk +!o`.uro4(@jlQL(!pAe2rojLLlg+Q:!q#FDrpTmV!:g$Y!qZ'VrUp3as7cKerqZQiqtp?irVc +JcC<$JcF=$li-_Yqu$0br;-?eq=ss`rq?9_rq-6^rUU!Ys7$$Vs6]mSrp1$YlK[Wukih3lk2k\' +j'q$,i8EMLh;-l@g=k63f@JL%eC2jndEg+`c-4ASb/hZE`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN +Za6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OT:VXFS=?":R@'A.QN!-QP`q8nOc]R'$BC+)N/NRN +M2@%Dre;>FKS+o/Jq8H&It)oqI=-EhH?sj^G^"@TG'3e+!HW;\E<1#srbhaQ!,VXM!buF`rb)@G +AnM$R!b>eNrF,h:?srq?ra,V1r*95*r`],#r)ihtoiCriqc*;gr)3GipJCZ]lq[CQpJCfcrDNGi +rD`_qq,[Dpr)iVpqc`l$p0@Q%rEf;,ra>_6qdTP7rabk:rau.Bq.T\?r+a5eq/#tGpMTqJrG_RP +rGqgWolTtOoQK\Ir-80cqg/9hrd=Zms*artrI=p"K)UE&KLCNKL51S@M2@+JN/WaVO,oBbP*2&p +Q'Rc(R$jG5S=Q7DTV8'RUSO``Vl-JnWiN5'Xfek3Z*L^B['d?N\%&rY\[oEP]E,^[rkANM_86,f +s2+iTrPefVs2Y&Ys2k8_r6,)`rltAdrm1Vkr6bPmrmUhqs4./#rR_)%!87>)s4[P/rS7P3hr"Fk +!o`.uro4(@jlQL(!pAe2rojLLlg+Q:!q#FDrpTmV!:g$Y!qZ'VrUp3as7cKerqZQiqtp?irVc +JcC<$JcF:#li-_YqY^'ar;-?eqY:'arq?6^s7H?_rUU!Ys7$$Vs6]mSrp10]lK[Wuki_-kk2k[a +j5T%si(;h_h;$c=g=b-1f@JL%eC2jnd*L"_c-4ASaiMQD`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN +Za6sBYct=6Xf\\*WiE%sVl-DgrhL=)U7n9RT:VXFS=?":R[KP1Q^3o%P`u*0"d+n-O,f5!N":i( +M2@%ELPCP;KS4u1JqraPn9s'Yb3s'G_2qcs,)rEB#"qcN_soiCujr)EDhrDNPjp/(KZp.k?Xp/(]brDNGi +rD`_qq,[Dpr)iVpqHEc#p0@N$rEf>-rF#V5qdTP7rabn;rFZ%Aq.T\?qeF)cqeZ1Iphp%KrG_RP +rGqgWp2p.RpNGtKqfr$aqKi0grd=Zms*jutrdb$"!.t3&s+F.$L5(J>Ll$tGMijWN*##Xf\b0YctC!9O4Bs5sCGrosIJ!:0XNs6TgSrpTmVs7-*Zs7?9_rq6 +JcC<$JcF:#li-_YqY^'ar;-?eqY:'arq?6^s7H?_rUU!Ys7$$Vs6]mSrp10]lK[Wuki_-kk2k[a +j5T%si(;h_h;$c=g=b-1f@JL%eC2jnd*L"_c-4ASaiMQD`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN +Za6sBYct=6Xf\\*WiE%sVl-DgrhL=)U7n9RT:VXFS=?":R[KP1Q^3o%P`u*0"d+n-O,f5!N":i( +M2@%ELPCP;KS4u1JqraPn9s'Yb3s'G_2qcs,)rEB#"qcN_soiCujr)EDhrDNPjp/(KZp.k?Xp/(]brDNGi +rD`_qq,[Dpr)iVpqHEc#p0@N$rEf>-rF#V5qdTP7rabn;rFZ%Aq.T\?qeF)cqeZ1Iphp%KrG_RP +rGqgWp2p.RpNGtKqfr$aqKi0grd=Zms*jutrdb$"!.t3&s+F.$L5(J>Ll$tGMijWN*##Xf\b0YctC!9O4Bs5sCGrosIJ!:0XNs6TgSrpTmVs7-*Zs7?9_rq6 +JcC<$JcF:#li-_YqY^'ar;-?eqY:'arq?6^s7H?_rUU!Ys7$$Vs6]mSrp10]lK[Wuki_-kk2k[a +j5T%si(;h_h;$c=g=b-1f@JL%eC2jnd*L"_c-4ASaiMQD`l5p8_ns7*^V@Lr]Y(kf\[f5Z[^NTN +Za6sBYct=6Xf\\*WiE%sVl-DgrhL=)U7n9RT:VXFS=?":R[KP1Q^3o%P`u*0"d+n-O,f5!N":i( +M2@%ELPCP;KS4u1JqraPn9s'Yb3s'G_2qcs,)rEB#"qcN_soiCujr)EDhrDNPjp/(KZp.k?Xp/(]brDNGi +rD`_qq,[Dpr)iVpqHEc#p0@N$rEf>-rF#V5qdTP7rabn;rFZ%Aq.T\?qeF)cqeZ1Iphp%KrG_RP +rGqgWp2p.RpNGtKqfr$aqKi0grd=Zms*jutrdb$"!.t3&s+F.$L5(J>Ll$tGMijWN*##Xf\b0YctC!9O4Bs5sCGrosIJ!:0XNs6TgSrpTmVs7-*Zs7?9_rq6 +JcC<$JcF7"lMgYYqY^$`r;-Bfq=ss`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#Kki_s-J*#bO +j5T%Ui8Q%b"=o;D!=7oVl!cM:\@Q^;>jDg;uK\o +P;>"?2\+*?iFI4@JaO4A,^$9Ac?8#JDuFYNEW'qV +F80kSFnp4KGPQL]H22dcHiAEkIK"ZqJ,OotJH1<$K2@5TKnb>;LPUeDMMmFPNK0'\OHG]hPE_>t +QC!u,R[]e:SXuIHTqS6WUnsrdW2ZesX0&M,YHY79ZEpmE[^NZT\@K/]]=bei^:q@s^qmkd_?.Wn +`;[aU`rF*XaT'B^b5BH^bl5lbcMl/hd/;;jdf7eoeGn)!f)4/"f`0Y(gAfq-h#?.0hZ)L4i;_a9 +ir8! +JcC<$JcF7"lMgYYqY^$`r;-Bfq=ss`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#Kki_s-J*#bO +j5T%Ui8Q%b"=o;D!=7oVl!cM:\@Q^;>jDg;uK\o +P;>"?2\+*?iFI4@JaO4A,^$9Ac?8#JDuFYNEW'qV +F80kSFnp4KGPQL]H22dcHiAEkIK"ZqJ,OotJH1<$K2@5TKnb>;LPUeDMMmFPNK0'\OHG]hPE_>t +QC!u,R[]e:SXuIHTqS6WUnsrdW2ZesX0&M,YHY79ZEpmE[^NZT\@K/]]=bei^:q@s^qmkd_?.Wn +`;[aU`rF*XaT'B^b5BH^bl5lbcMl/hd/;;jdf7eoeGn)!f)4/"f`0Y(gAfq-h#?.0hZ)L4i;_a9 +ir8! +JcC<$JcF7"lMgYYqY^$`r;-Bfq=ss`rq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg#Kki_s-J*#bO +j5T%Ui8Q%b"=o;D!=7oVl!cM:\@Q^;>jDg;uK\o +P;>"?2\+*?iFI4@JaO4A,^$9Ac?8#JDuFYNEW'qV +F80kSFnp4KGPQL]H22dcHiAEkIK"ZqJ,OotJH1<$K2@5TKnb>;LPUeDMMmFPNK0'\OHG]hPE_>t +QC!u,R[]e:SXuIHTqS6WUnsrdW2ZesX0&M,YHY79ZEpmE[^NZT\@K/]]=bei^:q@s^qmkd_?.Wn +`;[aU`rF*XaT'B^b5BH^bl5lbcMl/hd/;;jdf7eoeGn)!f)4/"f`0Y(gAfq-h#?.0hZ)L4i;_a9 +ir8! +JcC<$JcF4!lMgVXqY^$`r;-BfqY:'arq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg$KnY24K7\Z*J:N,urd=fpHiAVm!GuZPC]A,LC&VfG +B)lQBAcH9@A,Tm:@K0a5?iFC3?2@h)>Q%b!=o2>!=8#\na>f;uK\o +P;>"?2\+*?iFI3@JaO5A,^$9Ac66?BD?0A)JDuFYOEW1"W +F80kTFo-@OGPQL[H2)^aHiAEjIK+crJ,Om!JV&LQK+!?dKnb>;LPUeDMMqIm16%t +QC!u+R@B\9SXuFGTqS3UUnsrdVl?\rX/rG+YHY79ZEpmE[C3QSrj`3D]=bei^AbkJ^qp#e!lMsp +rl+oWs2Y,[s2k8_rQG2as3:Gdrm1Sjr6bMlrmUeps4./#r7Cu$s4RA)s4[P/rS@M1!8mb5!o`.u +ro=%>!9O1A!pAe2rojLLlg+Q:s6TgSrpTmVs7-*Zs7?9_rUp3as7cKerqZQiqtp?irVc +JcC<$JcF4!lMgVXqY^$`r;-BfqY:'arq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg$KnY24K7\Z*J:N,urd=fpHiAVm!GuZPC]A,LC&VfG +B)lQBAcH9@A,Tm:@K0a5?iFC3?2@h)>Q%b!=o2>!=8#\na>f;uK\o +P;>"?2\+*?iFI3@JaO5A,^$9Ac66?BD?0A)JDuFYOEW1"W +F80kTFo-@OGPQL[H2)^aHiAEjIK+crJ,Om!JV&LQK+!?dKnb>;LPUeDMMqIm16%t +QC!u+R@B\9SXuFGTqS3UUnsrdVl?\rX/rG+YHY79ZEpmE[C3QSrj`3D]=bei^AbkJ^qp#e!lMsp +rl+oWs2Y,[s2k8_rQG2as3:Gdrm1Sjr6bMlrmUeps4./#r7Cu$s4RA)s4[P/rS@M1!8mb5!o`.u +ro=%>!9O1A!pAe2rojLLlg+Q:s6TgSrpTmVs7-*Zs7?9_rUp3as7cKerqZQiqtp?irVc +JcC<$JcF4!lMgVXqY^$`r;-BfqY:'arq?9_s7H?_rUU!Ys7$$V!q,ICrp0[OlMg$KnY24K7\Z*J:N,urd=fpHiAVm!GuZPC]A,LC&VfG +B)lQBAcH9@A,Tm:@K0a5?iFC3?2@h)>Q%b!=o2>!=8#\na>f;uK\o +P;>"?2\+*?iFI3@JaO5A,^$9Ac66?BD?0A)JDuFYOEW1"W +F80kTFo-@OGPQL[H2)^aHiAEjIK+crJ,Om!JV&LQK+!?dKnb>;LPUeDMMqIm16%t +QC!u+R@B\9SXuFGTqS3UUnsrdVl?\rX/rG+YHY79ZEpmE[C3QSrj`3D]=bei^AbkJ^qp#e!lMsp +rl+oWs2Y,[s2k8_rQG2as3:Gdrm1Sjr6bMlrmUeps4./#r7Cu$s4RA)s4[P/rS@M1!8mb5!o`.u +ro=%>!9O1A!pAe2rojLLlg+Q:s6TgSrpTmVs7-*Zs7?9_rUp3as7cKerqZQiqtp?irVc +JcC<$JcF-tlMgVXqY^'ar;-BfqY:'arq?9_s7H?_rUU!Ys7$$V&FSrQm-O'(lKRQski_*jjlHF$ +@H-8(i8mJ:N-!IXQWlH[C'bH$FRXGBS+OFEDSFErL%ZE,Y_n!c;airbDRMBkdQ[ +!bZ+Wral+?s'u":s'bq8r*TG0ra#A*r*0,'p0%8pr)`VnrDieqpf%)gr))0Er)*Djq,@2jrDiYo +r)`btoi_)oqHNVtr*B8-qHs2/raG\5raYn;qdob=rFbq>qe>h?j(nF)m;)W9rGD@JrbqaSqJlLT +rH%dVr,qp\o6:"TqK_d\rHnNkr-eQns*suts+(0%rI[^qKnY89LPL\BM2I4LN/WaVO,oBbP*2#n +Q'I]'R$jD4S"6.BT:hmPUSO]^Vl-JmWiN5'Xfek3Z*L^B['d?N\%&uZ]">Vf]tXK\!PlPN_?%Qm +rl+oWs2Y,[s2k;`r6,,arltAdrm1Sjr6bMlrmUeprmh&"r7Cu$s4RA)s4dS/rS@M1!8mb5s5s5j7B!pAe2rosIJ!:0XNs6]jSrpTmV!:g$Ys766_rUp3as7cHdrqZTjqYU6hrVc +JcC<$JcF-tlMgVXqY^'ar;-BfqY:'arq?9_s7H?_rUU!Ys7$$V&FSrQm-O'(lKRQski_*jjlHF$ +@H-8(i8mJ:N-!IXQWlH[C'bH$FRXGBS+OFEDSFErL%ZE,Y_n!c;airbDRMBkdQ[ +!bZ+Wral+?s'u":s'bq8r*TG0ra#A*r*0,'p0%8pr)`VnrDieqpf%)gr))0Er)*Djq,@2jrDiYo +r)`btoi_)oqHNVtr*B8-qHs2/raG\5raYn;qdob=rFbq>qe>h?j(nF)m;)W9rGD@JrbqaSqJlLT +rH%dVr,qp\o6:"TqK_d\rHnNkr-eQns*suts+(0%rI[^qKnY89LPL\BM2I4LN/WaVO,oBbP*2#n +Q'I]'R$jD4S"6.BT:hmPUSO]^Vl-JmWiN5'Xfek3Z*L^B['d?N\%&uZ]">Vf]tXK\!PlPN_?%Qm +rl+oWs2Y,[s2k;`r6,,arltAdrm1Sjr6bMlrmUeprmh&"r7Cu$s4RA)s4dS/rS@M1!8mb5s5s5j7B!pAe2rosIJ!:0XNs6]jSrpTmV!:g$Ys766_rUp3as7cHdrqZTjqYU6hrVc +JcC<$JcF-tlMgVXqY^'ar;-BfqY:'arq?9_s7H?_rUU!Ys7$$V&FSrQm-O'(lKRQski_*jjlHF$ +@H-8(i8mJ:N-!IXQWlH[C'bH$FRXGBS+OFEDSFErL%ZE,Y_n!c;airbDRMBkdQ[ +!bZ+Wral+?s'u":s'bq8r*TG0ra#A*r*0,'p0%8pr)`VnrDieqpf%)gr))0Er)*Djq,@2jrDiYo +r)`btoi_)oqHNVtr*B8-qHs2/raG\5raYn;qdob=rFbq>qe>h?j(nF)m;)W9rGD@JrbqaSqJlLT +rH%dVr,qp\o6:"TqK_d\rHnNkr-eQns*suts+(0%rI[^qKnY89LPL\BM2I4LN/WaVO,oBbP*2#n +Q'I]'R$jD4S"6.BT:hmPUSO]^Vl-JmWiN5'Xfek3Z*L^B['d?N\%&uZ]">Vf]tXK\!PlPN_?%Qm +rl+oWs2Y,[s2k;`r6,,arltAdrm1Sjr6bMlrmUeprmh&"r7Cu$s4RA)s4dS/rS@M1!8mb5s5s5j7B!pAe2rosIJ!:0XNs6]jSrpTmV!:g$Ys766_rUp3as7cHdrqZTjqYU6hrVc +JcC<$JcF*slMgVXq>Bs`r;-BfqY:'as7ZB`s7H?_rUU!Y!:]sU!Uf@Slr*07lKRQskND!ijlGI^ +io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkcd'h\bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(kg]",A]\$i`Q +['R*EZ*:I9Y5YOFXK/A$WMl_mVPU,bUnaZXTqJ$LSt2FBS"#k7R$a5+rfmYOPEM)kOT(:JNfB!V +Mi*CKM26rdL'iWfK7ec,JUi9#If=`rI!bj=!I8qhG6)l0rcA0^ErL%`E,TZ4DJa6,rbMOK!,;FG +s(D@Dral+?s'u":s'bn7r*TG0ra#>)r*0)&p0%;qr)`YorDieqpf%)gr))BKqbd8hq,@5krDiVn +r)`euoNCunq-3Msr*B8-q-X,/rF,S4raYqe>mq_0&nn\/>rGDCKrGV[Sqf2RT +rc@mWrH8'^olp7WqK_a[r-SBiqgJHms*suts+13%re(6(!/:E,:PXa^M2@+JMiZa@-K[^WcW\[oDc]Y2%o^VI\%_SX4. +`;[^W`lH.!aT'B^b5KN`bl5lbcMu5id/25idf._meGn(uf)4/"f`0Y&gAfq-h#6%1hV[5hhu_ls +ir.m=jQ5M&k5XTEkl0iHlMp2Lm/QGQmf)\TnGi%Xo)J=]o_nI_pAambq#C0hqYL*gr;?Nardk*# +s*t~> +JcC<$JcF*slMgVXq>Bs`r;-BfqY:'as7ZB`s7H?_rUU!Y!:]sU!Uf@Slr*07lKRQskND!ijlGI^ +io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkcd'h\bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(kg]",A]\$i`Q +['R*EZ*:I9Y5YOFXK/A$WMl_mVPU,bUnaZXTqJ$LSt2FBS"#k7R$a5+rfmYOPEM)kOT(:JNfB!V +Mi*CKM26rdL'iWfK7ec,JUi9#If=`rI!bj=!I8qhG6)l0rcA0^ErL%`E,TZ4DJa6,rbMOK!,;FG +s(D@Dral+?s'u":s'bn7r*TG0ra#>)r*0)&p0%;qr)`YorDieqpf%)gr))BKqbd8hq,@5krDiVn +r)`euoNCunq-3Msr*B8-q-X,/rF,S4raYqe>mq_0&nn\/>rGDCKrGV[Sqf2RT +rc@mWrH8'^olp7WqK_a[r-SBiqgJHms*suts+13%re(6(!/:E,:PXa^M2@+JMiZa@-K[^WcW\[oDc]Y2%o^VI\%_SX4. +`;[^W`lH.!aT'B^b5KN`bl5lbcMu5id/25idf._meGn(uf)4/"f`0Y&gAfq-h#6%1hV[5hhu_ls +ir.m=jQ5M&k5XTEkl0iHlMp2Lm/QGQmf)\TnGi%Xo)J=]o_nI_pAambq#C0hqYL*gr;?Nardk*# +s*t~> +JcC<$JcF*slMgVXq>Bs`r;-BfqY:'as7ZB`s7H?_rUU!Y!:]sU!Uf@Slr*07lKRQskND!ijlGI^ +io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkcd'h\bfe2PaiMQD`l5p8_ns7*^V@Lr]Y(kg]",A]\$i`Q +['R*EZ*:I9Y5YOFXK/A$WMl_mVPU,bUnaZXTqJ$LSt2FBS"#k7R$a5+rfmYOPEM)kOT(:JNfB!V +Mi*CKM26rdL'iWfK7ec,JUi9#If=`rI!bj=!I8qhG6)l0rcA0^ErL%`E,TZ4DJa6,rbMOK!,;FG +s(D@Dral+?s'u":s'bn7r*TG0ra#>)r*0)&p0%;qr)`YorDieqpf%)gr))BKqbd8hq,@5krDiVn +r)`euoNCunq-3Msr*B8-q-X,/rF,S4raYqe>mq_0&nn\/>rGDCKrGV[Sqf2RT +rc@mWrH8'^olp7WqK_a[r-SBiqgJHms*suts+13%re(6(!/:E,:PXa^M2@+JMiZa@-K[^WcW\[oDc]Y2%o^VI\%_SX4. +`;[^W`lH.!aT'B^b5KN`bl5lbcMu5id/25idf._meGn(uf)4/"f`0Y&gAfq-h#6%1hV[5hhu_ls +ir.m=jQ5M&k5XTEkl0iHlMp2Lm/QGQmf)\TnGi%Xo)J=]o_nI_pAambq#C0hqYL*gr;?Nardk*# +s*t~> +JcC<$JcF'rl2LMWqY^$`rVHKgqY:'arq?<`s7H?_rUU!Y!:^!Vs6]mSrp0jTlK[Wuki_s-:$(Hr +j5T%Ui8rF5b7s'Y_2ra,P/q-nrD`Pjr)3Dhk"tqPr)3;grD`_q +pf@;or)iSoq-*PtoN_<"rEf;,ra>_6qI9G6rabn;rFZ"@ph9P=bA-ZbrG;FLqJQ7Mrc%aSrc7sY +qK2[YrH@pZqfr!`oQpF^r-\?hs*jrsr.+fu!.t0%s+CB+re=C-LkpnEMMd=NN/`jYO-#KeP*;,q +Q'Rc(R$jD4S=Q7CT:qsQUSO``Vl-JnWiN5'Y-5(6Z*L^C[C3NQ\@K/]]=bei^;%Fu_84"*_o0L4 +`Q#pgrm:PirmLepqpbVqs47)!s4IA)r7_2*s4mS/s5*e5rSRb9io9ps +!p&J)roX7D!9jCG!p]+;rp9[Ps6fmTs6p$YrUU![s7H9_s7ZKerV6BfrqcNhrVZTlo)=4?JcC6~> +JcC<$JcF'rl2LMWqY^$`rVHKgqY:'arq?<`s7H?_rUU!Y!:^!Vs6]mSrp0jTlK[Wuki_s-:$(Hr +j5T%Ui8rF5b7s'Y_2ra,P/q-nrD`Pjr)3Dhk"tqPr)3;grD`_q +pf@;or)iSoq-*PtoN_<"rEf;,ra>_6qI9G6rabn;rFZ"@ph9P=bA-ZbrG;FLqJQ7Mrc%aSrc7sY +qK2[YrH@pZqfr!`oQpF^r-\?hs*jrsr.+fu!.t0%s+CB+re=C-LkpnEMMd=NN/`jYO-#KeP*;,q +Q'Rc(R$jD4S=Q7CT:qsQUSO``Vl-JnWiN5'Y-5(6Z*L^C[C3NQ\@K/]]=bei^;%Fu_84"*_o0L4 +`Q#pgrm:PirmLepqpbVqs47)!s4IA)r7_2*s4mS/s5*e5rSRb9io9ps +!p&J)roX7D!9jCG!p]+;rp9[Ps6fmTs6p$YrUU![s7H9_s7ZKerV6BfrqcNhrVZTlo)=4?JcC6~> +JcC<$JcF'rl2LMWqY^$`rVHKgqY:'arq?<`s7H?_rUU!Y!:^!Vs6]mSrp0jTlK[Wuki_s-:$(Hr +j5T%Ui8rF5b7s'Y_2ra,P/q-nrD`Pjr)3Dhk"tqPr)3;grD`_q +pf@;or)iSoq-*PtoN_<"rEf;,ra>_6qI9G6rabn;rFZ"@ph9P=bA-ZbrG;FLqJQ7Mrc%aSrc7sY +qK2[YrH@pZqfr!`oQpF^r-\?hs*jrsr.+fu!.t0%s+CB+re=C-LkpnEMMd=NN/`jYO-#KeP*;,q +Q'Rc(R$jD4S=Q7CT:qsQUSO``Vl-JnWiN5'Y-5(6Z*L^C[C3NQ\@K/]]=bei^;%Fu_84"*_o0L4 +`Q#pgrm:PirmLepqpbVqs47)!s4IA)r7_2*s4mS/s5*e5rSRb9io9ps +!p&J)roX7D!9jCG!p]+;rp9[Ps6fmTs6p$YrUU![s7H9_s7ZKerV6BfrqcNhrVZTlo)=4?JcC6~> +JcC<$JcF$ql2LJVqY^'ar;-BfqtU0brq?<`s7H?_rUL$[nF6GGs6]mSrp0[OlMg#Oki_*jjlHF$ +7H3:ai8r*o\7ra>V1rEfG.pg!`$r*&htr)io!q,[GorD`Pjr)3>fmnigWr)3;gr)EVp +pf@>pqcNJnpfdJto3D3!rEf;,ra>\5qdTP7rabk:rFZ%ApLsD;bA-]crG;FLqJQ:Nrc%aSrc8!Z +qK2^ZrH@s[r-8*aom6L^r-\_:P_o2Pn +!li:$rl>/_b0'\+s31MfrQbDgs3UYjrmLepqpbVqrmq#!rn.8(r7_2*rnRJ.s5*e5ro!h8s5O%< +s5a4AroX7Ds60IHs69UMrTjUQmdC)Cs7$'Yrpp*\s7H9_s7ZKer:p9es8)ThrVZWmnc"+>JcC6~> +JcC<$JcF$ql2LJVqY^'ar;-BfqtU0brq?<`s7H?_rUL$[nF6GGs6]mSrp0[OlMg#Oki_*jjlHF$ +7H3:ai8r*o\7ra>V1rEfG.pg!`$r*&htr)io!q,[GorD`Pjr)3>fmnigWr)3;gr)EVp +pf@>pqcNJnpfdJto3D3!rEf;,ra>\5qdTP7rabk:rFZ%ApLsD;bA-]crG;FLqJQ:Nrc%aSrc8!Z +qK2^ZrH@s[r-8*aom6L^r-\_:P_o2Pn +!li:$rl>/_b0'\+s31MfrQbDgs3UYjrmLepqpbVqrmq#!rn.8(r7_2*rnRJ.s5*e5ro!h8s5O%< +s5a4AroX7Ds60IHs69UMrTjUQmdC)Cs7$'Yrpp*\s7H9_s7ZKer:p9es8)ThrVZWmnc"+>JcC6~> +JcC<$JcF$ql2LJVqY^'ar;-BfqtU0brq?<`s7H?_rUL$[nF6GGs6]mSrp0[OlMg#Oki_*jjlHF$ +7H3:ai8r*o\7ra>V1rEfG.pg!`$r*&htr)io!q,[GorD`Pjr)3>fmnigWr)3;gr)EVp +pf@>pqcNJnpfdJto3D3!rEf;,ra>\5qdTP7rabk:rFZ%ApLsD;bA-]crG;FLqJQ:Nrc%aSrc8!Z +qK2^ZrH@s[r-8*aom6L^r-\_:P_o2Pn +!li:$rl>/_b0'\+s31MfrQbDgs3UYjrmLepqpbVqrmq#!rn.8(r7_2*rnRJ.s5*e5ro!h8s5O%< +s5a4AroX7Ds60IHs69UMrTjUQmdC)Cs7$'Yrpp*\s7H9_s7ZKer:p9es8)ThrVZWmnc"+>JcC6~> +JcC<$JcEsol2LJVqY^'arVHKgqtU0brq?<`s7H?_rUL$[nF6GG8FGm4m-O'(lKRQski_*jjlGI^ +io/kSi8KnTGX++f&oJ:E&tI=6KiH[:!`G^+FVG'.qLFE;JCEH,r:DuOYSD#eDOC]A,L +C&M]HB4bcSAcH<@A,Kg8@K'[2?iFC0?2%V%>Pq\"=oDJ$=8>nrj>a;>X8c;uK\o +Ou+t?2S%*?i=C3@JaO4A,^$9Ac66>BD?09C!(2bC]&#JD>J/LDuO_QEW1"X +F8L(YFo?L[GPl^`H1lR]Hi&3dIJnWoJ,FirJcC?#KE$T)L&Qi,LB*/0M$AiqMitQC+&-R[]e:SXuIHTqS3VUnsrdW2ZesX0&M,YHY:;Za7$H[^WcW\[oDc]Y2%o^VI\b_?%Qm +rl"oXa8X0[aT0K^b6#o4c2>leci;AhdJqYoe,%Snec+.sfDjM&g&0S(g]$",h>c@3hu2L5iW%p: +j8\3?jo4EBkPscFl2U#Kli$2Mm/ZSQmfN"Knbr%YoDeI]p&Facp\agdq>U6equ6NkrUTr=s+11M +s*t~> +JcC<$JcEsol2LJVqY^'arVHKgqtU0brq?<`s7H?_rUL$[nF6GG8FGm4m-O'(lKRQski_*jjlGI^ +io/kSi8KnTGX++f&oJ:E&tI=6KiH[:!`G^+FVG'.qLFE;JCEH,r:DuOYSD#eDOC]A,L +C&M]HB4bcSAcH<@A,Kg8@K'[2?iFC0?2%V%>Pq\"=oDJ$=8>nrj>a;>X8c;uK\o +Ou+t?2S%*?i=C3@JaO4A,^$9Ac66>BD?09C!(2bC]&#JD>J/LDuO_QEW1"X +F8L(YFo?L[GPl^`H1lR]Hi&3dIJnWoJ,FirJcC?#KE$T)L&Qi,LB*/0M$AiqMitQC+&-R[]e:SXuIHTqS3VUnsrdW2ZesX0&M,YHY:;Za7$H[^WcW\[oDc]Y2%o^VI\b_?%Qm +rl"oXa8X0[aT0K^b6#o4c2>leci;AhdJqYoe,%Snec+.sfDjM&g&0S(g]$",h>c@3hu2L5iW%p: +j8\3?jo4EBkPscFl2U#Kli$2Mm/ZSQmfN"Knbr%YoDeI]p&Facp\agdq>U6equ6NkrUTr=s+11M +s*t~> +JcC<$JcEsol2LJVqY^'arVHKgqtU0brq?<`s7H?_rUL$[nF6GG8FGm4m-O'(lKRQski_*jjlGI^ +io/kSi8KnTGX++f&oJ:E&tI=6KiH[:!`G^+FVG'.qLFE;JCEH,r:DuOYSD#eDOC]A,L +C&M]HB4bcSAcH<@A,Kg8@K'[2?iFC0?2%V%>Pq\"=oDJ$=8>nrj>a;>X8c;uK\o +Ou+t?2S%*?i=C3@JaO4A,^$9Ac66>BD?09C!(2bC]&#JD>J/LDuO_QEW1"X +F8L(YFo?L[GPl^`H1lR]Hi&3dIJnWoJ,FirJcC?#KE$T)L&Qi,LB*/0M$AiqMitQC+&-R[]e:SXuIHTqS3VUnsrdW2ZesX0&M,YHY:;Za7$H[^WcW\[oDc]Y2%o^VI\b_?%Qm +rl"oXa8X0[aT0K^b6#o4c2>leci;AhdJqYoe,%Snec+.sfDjM&g&0S(g]$",h>c@3hu2L5iW%p: +j8\3?jo4EBkPscFl2U#Kli$2Mm/ZSQmfN"Knbr%YoDeI]p&Facp\agdq>U6equ6NkrUTr=s+11M +s*t~> +JcC<$JcEpnkl1AUqY^*br;-EgqtU0brq?<`s7H?_rpp*Zs7$$V!Uf@Sliue@lKRQskPjU1jlGI^ +io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=YYb\[],W +[^ELAZN[Y>Yct=6riH@*X/`2!W;`\-VPU)aUS=HUTV.pKSt2C@S!ocEQj&hBQ'IStrfRbROH5H_ +NJrgSMi*@JLkkta$AF.cK7\Z*J:N,urd=fpHiAVm!c;airbDRM +BkdNZ!bZ+WrFQ">raYk8raGe6qHs2-r*B&%r*0,'pf[PtrE&hrrDieqpJ^lcmnrpZp/Cohr)NMm +rE&kuoNColpKR5oqd'/,q-X,/rF,S4raYqc!6tJfs3L\kr6bPmrmUbormgtuqq(i"s4R;'s4dP.rS@M1rnm\4s5F"; +ro=%>s5j7Bs6'FGrosIJs6K[Ns6]jSrpTmVs7-*Zs7?9_rUp3as7cHdrqZQiqtp?ir;H3cJcC<$ +!<7Q~> +JcC<$JcEpnkl1AUqY^*br;-EgqtU0brq?<`s7H?_rpp*Zs7$$V!Uf@Sliue@lKRQskPjU1jlGI^ +io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=YYb\[],W +[^ELAZN[Y>Yct=6riH@*X/`2!W;`\-VPU)aUS=HUTV.pKSt2C@S!ocEQj&hBQ'IStrfRbROH5H_ +NJrgSMi*@JLkkta$AF.cK7\Z*J:N,urd=fpHiAVm!c;airbDRM +BkdNZ!bZ+WrFQ">raYk8raGe6qHs2-r*B&%r*0,'pf[PtrE&hrrDieqpJ^lcmnrpZp/Cohr)NMm +rE&kuoNColpKR5oqd'/,q-X,/rF,S4raYqc!6tJfs3L\kr6bPmrmUbormgtuqq(i"s4R;'s4dP.rS@M1rnm\4s5F"; +ro=%>s5j7Bs6'FGrosIJs6K[Ns6]jSrpTmVs7-*Zs7?9_rUp3as7cHdrqZQiqtp?ir;H3cJcC<$ +!<7Q~> +JcC<$JcEpnkl1AUqY^*br;-EgqtU0brq?<`s7H?_rpp*Zs7$$V!Uf@Sliue@lKRQskPjU1jlGI^ +io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*L"_c-4ASb/q`Ga2Z*;`5BI/_8*h#^:h1l]=YYb\[],W +[^ELAZN[Y>Yct=6riH@*X/`2!W;`\-VPU)aUS=HUTV.pKSt2C@S!ocEQj&hBQ'IStrfRbROH5H_ +NJrgSMi*@JLkkta$AF.cK7\Z*J:N,urd=fpHiAVm!c;airbDRM +BkdNZ!bZ+WrFQ">raYk8raGe6qHs2-r*B&%r*0,'pf[PtrE&hrrDieqpJ^lcmnrpZp/Cohr)NMm +rE&kuoNColpKR5oqd'/,q-X,/rF,S4raYqc!6tJfs3L\kr6bPmrmUbormgtuqq(i"s4R;'s4dP.rS@M1rnm\4s5F"; +ro=%>s5j7Bs6'FGrosIJs6K[Ns6]jSrpTmVs7-*Zs7?9_rUp3as7cHdrqZQiqtp?ir;H3cJcC<$ +!<7Q~> +JcC<$JcEjlkl1AUqu$0brVHKgqtU3crq?<`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg$8ki_*jjlGL_ +j5T%Ui8`Pf[2_SO%&^V7Cp]Y(kf\[f5Z +rjEWN['R*EZ*CO;YHG"0XK/D%Wi;qpVl$l@n)>5;>#=T)=s`;ZBVd;YF&e<;fhl +4u1k>l.h*?MRt,@/aU3@f9g9AGTm:B)QB9B_Z<.C?fO.CA;TCD#J5JDZ4SSE;OYS +ErU4XFT-F^G5?F^Gl;p_HMi-fI.r'eIf4cnJGt-"K)C9$K`?c*LB!&/M#N53MMqIm!KE-=O#iAb +P*2#nQ'IZ%R$a;1S"#t?StD[LU8+N[V5C/hWN*##Xf\b1Yd(L?ZaI6M\%&uZ]"G\h^;%Fu_>_:Z +_o0O5`lH-@aN;QHrlb>cs3:Pgs3L_lr6bMls3pkprmh#!qUb`!rn75'rnIG-rS@J0s53e5s5F"; +rT!q=s5j7Bs6'FGrosIJs6K[Ns6]jSrpTmVs7-'Ys7?9_rUp3as7cHds7uZjqYU6hrVc9cJcC<$ +!<7Q~> +JcC<$JcEjlkl1AUqu$0brVHKgqtU3crq?<`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg$8ki_*jjlGL_ +j5T%Ui8`Pf[2_SO%&^V7Cp]Y(kf\[f5Z +rjEWN['R*EZ*CO;YHG"0XK/D%Wi;qpVl$l@n)>5;>#=T)=s`;ZBVd;YF&e<;fhl +4u1k>l.h*?MRt,@/aU3@f9g9AGTm:B)QB9B_Z<.C?fO.CA;TCD#J5JDZ4SSE;OYS +ErU4XFT-F^G5?F^Gl;p_HMi-fI.r'eIf4cnJGt-"K)C9$K`?c*LB!&/M#N53MMqIm!KE-=O#iAb +P*2#nQ'IZ%R$a;1S"#t?StD[LU8+N[V5C/hWN*##Xf\b1Yd(L?ZaI6M\%&uZ]"G\h^;%Fu_>_:Z +_o0O5`lH-@aN;QHrlb>cs3:Pgs3L_lr6bMls3pkprmh#!qUb`!rn75'rnIG-rS@J0s53e5s5F"; +rT!q=s5j7Bs6'FGrosIJs6K[Ns6]jSrpTmVs7-'Ys7?9_rUp3as7cHds7uZjqYU6hrVc9cJcC<$ +!<7Q~> +JcC<$JcEjlkl1AUqu$0brVHKgqtU3crq?<`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg$8ki_*jjlGL_ +j5T%Ui8`Pf[2_SO%&^V7Cp]Y(kf\[f5Z +rjEWN['R*EZ*CO;YHG"0XK/D%Wi;qpVl$l@n)>5;>#=T)=s`;ZBVd;YF&e<;fhl +4u1k>l.h*?MRt,@/aU3@f9g9AGTm:B)QB9B_Z<.C?fO.CA;TCD#J5JDZ4SSE;OYS +ErU4XFT-F^G5?F^Gl;p_HMi-fI.r'eIf4cnJGt-"K)C9$K`?c*LB!&/M#N53MMqIm!KE-=O#iAb +P*2#nQ'IZ%R$a;1S"#t?StD[LU8+N[V5C/hWN*##Xf\b1Yd(L?ZaI6M\%&uZ]"G\h^;%Fu_>_:Z +_o0O5`lH-@aN;QHrlb>cs3:Pgs3L_lr6bMls3pkprmh#!qUb`!rn75'rnIG-rS@J0s53e5s5F"; +rT!q=s5j7Bs6'FGrosIJs6K[Ns6]jSrpTmVs7-'Ys7?9_rUp3as7cHds7uZjqYU6hrVc9cJcC<$ +!<7Q~> +JcC<$JcEjlkPk8TqY^*brVHKgqtU3cs7ZB`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Oki_*jjlHF$ +2WE]Ri8`Pf[2_SO%'^V@Lr]Y(kfrj`3B +\$i`Q[/RBJZE^XfmS`[Ur)ESopf@;o +r)iSopKI8pnQbrsr*K5,rF#V5qI9G6rabk:rau(@pLs;8n7q*"q.fY>rbVOMqelFPrc%dTrc8!Z +r,hp\rc\0_rcnBeq0N!dr-\6erI4ZoqLJQrrdt'#s+LE+rItB/Lku%es,$f7repl;NrG)#OHG]h +PE_>tQC!u+R@9V7S=Q7DTV8'RUnjiaVl-MoWiN8(Y-5(7ZEpmE[C3QS\[f;`]Y(tn^VI\b_?Iiq +`Poj;rl>/_b0'_,!mJp6rm(Pis3U_lrmLhqqpbVqrmpturRh,&qqD&(s4mM-s5*e5r8@V6s5O"; +s5a4AroX7Ds60FG!p]+;rTjUQmdC&Bs6p$YrUU![s7H9_s7ZHdrV6BfrqcNhrVZTlo)=4?JcGcM +J,~> +JcC<$JcEjlkPk8TqY^*brVHKgqtU3cs7ZB`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Oki_*jjlHF$ +2WE]Ri8`Pf[2_SO%'^V@Lr]Y(kfrj`3B +\$i`Q[/RBJZE^XfmS`[Ur)ESopf@;o +r)iSopKI8pnQbrsr*K5,rF#V5qI9G6rabk:rau(@pLs;8n7q*"q.fY>rbVOMqelFPrc%dTrc8!Z +r,hp\rc\0_rcnBeq0N!dr-\6erI4ZoqLJQrrdt'#s+LE+rItB/Lku%es,$f7repl;NrG)#OHG]h +PE_>tQC!u+R@9V7S=Q7DTV8'RUnjiaVl-MoWiN8(Y-5(7ZEpmE[C3QS\[f;`]Y(tn^VI\b_?Iiq +`Poj;rl>/_b0'_,!mJp6rm(Pis3U_lrmLhqqpbVqrmpturRh,&qqD&(s4mM-s5*e5r8@V6s5O"; +s5a4AroX7Ds60FG!p]+;rTjUQmdC&Bs6p$YrUU![s7H9_s7ZHdrV6BfrqcNhrVZTlo)=4?JcGcM +J,~> +JcC<$JcEjlkPk8TqY^*brVHKgqtU3cs7ZB`s7H?_rpp*Z!:^!Vs6]mSrp0[OlMg#Oki_*jjlHF$ +2WE]Ri8`Pf[2_SO%'^V@Lr]Y(kfrj`3B +\$i`Q[/RBJZE^XfmS`[Ur)ESopf@;o +r)iSopKI8pnQbrsr*K5,rF#V5qI9G6rabk:rau(@pLs;8n7q*"q.fY>rbVOMqelFPrc%dTrc8!Z +r,hp\rc\0_rcnBeq0N!dr-\6erI4ZoqLJQrrdt'#s+LE+rItB/Lku%es,$f7repl;NrG)#OHG]h +PE_>tQC!u+R@9V7S=Q7DTV8'RUnjiaVl-MoWiN8(Y-5(7ZEpmE[C3QS\[f;`]Y(tn^VI\b_?Iiq +`Poj;rl>/_b0'_,!mJp6rm(Pis3U_lrmLhqqpbVqrmpturRh,&qqD&(s4mM-s5*e5r8@V6s5O"; +s5a4AroX7Ds60FG!p]+;rTjUQmdC&Bs6p$YrUU![s7H9_s7ZHdrV6BfrqcNhrVZTlo)=4?JcGcM +J,~> +JcC<$JcEdjkPk8Tqu$3crVHKgqtU3cs7ZB`!qc*UrUL$[nF6GG$h!ELm-O''lKRQskPjTQjlGI^ +io/hRhqm2FgtVh^*SK)sf@JL%eC2jndEp4bcHXSVbK@rJaN)<>`Pf[n_@FDt^V@Lr]Y(kg]",A] +\,NfY[C!9HZE^[=Yck43XfSS(WiE%sVl-DgV50o^U7n9RTDkDpSXc1=R[KP1Q^3r&Q'@JqP*(k* +Nt.20N/W[PM2@%ELPCP;K`6T2Jq8H&IsuipI=-D@H3&;9rc\BdFoHL_Er^7[E<:)tDuOVUD/=%f +C]A/LC&M`FBE)TAAcHQ.h%=oMP%=8GtqOYnp?2S%)?iFI4@JXI4A,^$8Ac66>BD-$2C&)N$C&2T>C]8/KD>S5NDuO_REW1"YF8U.Z +FoHR^GQ)jcH2;jcHi8?eIJeQlJ,+WoJc:8uKE$W)L&Hc+L]<20M#rQmMuJY9NK4"!6]dFnP*;,q +Q'Rc(R$jD4S"-%@StD^MU8+N[VPg>jWN*##Xf\e2Yd(L?['d?N\@K/]]=bei^;%Fu_8=(,`5T^8 +a8X-\aiaV+s3(Jfrm(Pis3U_ls3gnqr7(_rrmpturn.2&qqD&(rnRG-rnd\4r8@V6s5O";s5a4A +rT=.Cs60FG!p]+;rTsRO!:KgSs7$'YrUL$]o^r(Ss7ZKer:p9es8)ThrVZTlo)=4?JcGcMJ,~> +JcC<$JcEdjkPk8Tqu$3crVHKgqtU3cs7ZB`!qc*UrUL$[nF6GG$h!ELm-O''lKRQskPjTQjlGI^ +io/hRhqm2FgtVh^*SK)sf@JL%eC2jndEp4bcHXSVbK@rJaN)<>`Pf[n_@FDt^V@Lr]Y(kg]",A] +\,NfY[C!9HZE^[=Yck43XfSS(WiE%sVl-DgV50o^U7n9RTDkDpSXc1=R[KP1Q^3r&Q'@JqP*(k* +Nt.20N/W[PM2@%ELPCP;K`6T2Jq8H&IsuipI=-D@H3&;9rc\BdFoHL_Er^7[E<:)tDuOVUD/=%f +C]A/LC&M`FBE)TAAcHQ.h%=oMP%=8GtqOYnp?2S%)?iFI4@JXI4A,^$8Ac66>BD-$2C&)N$C&2T>C]8/KD>S5NDuO_REW1"YF8U.Z +FoHR^GQ)jcH2;jcHi8?eIJeQlJ,+WoJc:8uKE$W)L&Hc+L]<20M#rQmMuJY9NK4"!6]dFnP*;,q +Q'Rc(R$jD4S"-%@StD^MU8+N[VPg>jWN*##Xf\e2Yd(L?['d?N\@K/]]=bei^;%Fu_8=(,`5T^8 +a8X-\aiaV+s3(Jfrm(Pis3U_ls3gnqr7(_rrmpturn.2&qqD&(rnRG-rnd\4r8@V6s5O";s5a4A +rT=.Cs60FG!p]+;rTsRO!:KgSs7$'YrUL$]o^r(Ss7ZKer:p9es8)ThrVZTlo)=4?JcGcMJ,~> +JcC<$JcEdjkPk8Tqu$3crVHKgqtU3cs7ZB`!qc*UrUL$[nF6GG$h!ELm-O''lKRQskPjTQjlGI^ +io/hRhqm2FgtVh^*SK)sf@JL%eC2jndEp4bcHXSVbK@rJaN)<>`Pf[n_@FDt^V@Lr]Y(kg]",A] +\,NfY[C!9HZE^[=Yck43XfSS(WiE%sVl-DgV50o^U7n9RTDkDpSXc1=R[KP1Q^3r&Q'@JqP*(k* +Nt.20N/W[PM2@%ELPCP;K`6T2Jq8H&IsuipI=-D@H3&;9rc\BdFoHL_Er^7[E<:)tDuOVUD/=%f +C]A/LC&M`FBE)TAAcHQ.h%=oMP%=8GtqOYnp?2S%)?iFI4@JXI4A,^$8Ac66>BD-$2C&)N$C&2T>C]8/KD>S5NDuO_REW1"YF8U.Z +FoHR^GQ)jcH2;jcHi8?eIJeQlJ,+WoJc:8uKE$W)L&Hc+L]<20M#rQmMuJY9NK4"!6]dFnP*;,q +Q'Rc(R$jD4S"-%@StD^MU8+N[VPg>jWN*##Xf\e2Yd(L?['d?N\@K/]]=bei^;%Fu_8=(,`5T^8 +a8X-\aiaV+s3(Jfrm(Pis3U_ls3gnqr7(_rrmpturn.2&qqD&(rnRG-rnd\4r8@V6s5O";s5a4A +rT=.Cs60FG!p]+;rTsRO!:KgSs7$'YrUL$]o^r(Ss7ZKer:p9es8)ThrVZTlo)=4?JcGcMJ,~> +JcC<$JcE^hkPk8Tqu$3crVHNhqtU3cs7ZB`!qc*UrUL$[nF6GG!Uf@SliHG;rol`4kN:pgjlGI^ +io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*U+acHXSVbK@rJaN)<>`Pf[3_SX.)^V@Lr]tD"i])K5R +\@8oT[C!FMM[1GLPCP;KnP)2JqA,9[5@JsU/?i47/?27b(>Q.h&=oDJ%=8>nqOGbn?2S%)?i=C3@JaO4A,^$8Ac?<>BD-#^C&2T>C]8/LD>S5MDuXeSEW1"YF8U.ZFoQX^ +GQ2peH2;jdHi8?eIJnWmJ,"QnJc12tKE$W(L&Hc+L]<20M>rG5MuJ\8N<#"Vf]tV7r^qmn)_o0O5`lJ)" +!QiL`b6#o4c2Puicd:&;dJqYpe,7_pec+.sfDaG%g%sG%g]$"*h>Z:2hu)F3iW%p9j8\3?jo+?A +kPscEklU/9li$2MmJlVRn,MnWnbr%YoDeI]p&Fabp\jmdq>U6equ-HkrUKl +JcC<$JcE^hkPk8Tqu$3crVHNhqtU3cs7ZB`!qc*UrUL$[nF6GG!Uf@SliHG;rol`4kN:pgjlGI^ +io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*U+acHXSVbK@rJaN)<>`Pf[3_SX.)^V@Lr]tD"i])K5R +\@8oT[C!FMM[1GLPCP;KnP)2JqA,9[5@JsU/?i47/?27b(>Q.h&=oDJ%=8>nqOGbn?2S%)?i=C3@JaO4A,^$8Ac?<>BD-#^C&2T>C]8/LD>S5MDuXeSEW1"YF8U.ZFoQX^ +GQ2peH2;jdHi8?eIJnWmJ,"QnJc12tKE$W(L&Hc+L]<20M>rG5MuJ\8N<#"Vf]tV7r^qmn)_o0O5`lJ)" +!QiL`b6#o4c2Puicd:&;dJqYpe,7_pec+.sfDaG%g%sG%g]$"*h>Z:2hu)F3iW%p9j8\3?jo+?A +kPscEklU/9li$2MmJlVRn,MnWnbr%YoDeI]p&Fabp\jmdq>U6equ-HkrUKl +JcC<$JcE^hkPk8Tqu$3crVHNhqtU3cs7ZB`!qc*UrUL$[nF6GG!Uf@SliHG;rol`4kN:pgjlGI^ +io/hRhqm2FgtUQ:g"=p.f%&:"e'cXkd*U+acHXSVbK@rJaN)<>`Pf[3_SX.)^V@Lr]tD"i])K5R +\@8oT[C!FMM[1GLPCP;KnP)2JqA,9[5@JsU/?i47/?27b(>Q.h&=oDJ%=8>nqOGbn?2S%)?i=C3@JaO4A,^$8Ac?<>BD-#^C&2T>C]8/LD>S5MDuXeSEW1"YF8U.ZFoQX^ +GQ2peH2;jdHi8?eIJnWmJ,"QnJc12tKE$W(L&Hc+L]<20M>rG5MuJ\8N<#"Vf]tV7r^qmn)_o0O5`lJ)" +!QiL`b6#o4c2Puicd:&;dJqYpe,7_pec+.sfDaG%g%sG%g]$"*h>Z:2hu)F3iW%p9j8\3?jo+?A +kPscEklU/9li$2MmJlVRn,MnWnbr%YoDeI]p&Fabp\jmdq>U6equ-HkrUKl +JcC<$JcE[gk5P2Tqu$3crqcThr:p9cs7ZEas7H?_rpp*Z!:^!V&FSrQm-O'(lKRQski_*jjlHF$ +)<0W5i8bKJ&MaN2EArl#&Z_ns:,_#D(U^:h1l]=YYb +\[]-J[L0FLZa6sCZ*:I9Y5YO,XK/A$WMofo&uMM$UnaZXTqJ'NSt;LCS"#k7rg4"YQBd`"PEM)k +OT(:NNfB!VMi*@JLkph@L4t<[K*m3]J:N,uIXQWlHiAAGp$7@f9a6@/++-?N"1*>lIt+>5DD$=T)=ttp<9R9W<;]bj4Ytb>l.h)?MRt,@/aU2@fBm:AGTm9B)QB9BZb&dCA;TDD#S;KDZ=YSE;X_UErL.YFT-F_ +G5QR`GlE!cHN&9jI//3hIf+]jJGk&uK)1-!K`?c(LB!&/M#E/3MMmDlN!kW*NfT6_OHG]hPEc'3 +7$a1,R$jD4S"-(AT:hmOU8+N\VPg>kWiE,$Xfek3Yd1UA['d?O\@K/]]Y(ql^V@S#_SX4/`Poj; +aN2KFb0.uPbg$.4s3C\lrR(Yns3pqrrmh&"qq(f!rn7/%rnIG-qVD2.rnmY3ro*n:r8[h +JcC<$JcE[gk5P2Tqu$3crqcThr:p9cs7ZEas7H?_rpp*Z!:^!V&FSrQm-O'(lKRQski_*jjlHF$ +)<0W5i8bKJ&MaN2EArl#&Z_ns:,_#D(U^:h1l]=YYb +\[]-J[L0FLZa6sCZ*:I9Y5YO,XK/A$WMofo&uMM$UnaZXTqJ'NSt;LCS"#k7rg4"YQBd`"PEM)k +OT(:NNfB!VMi*@JLkph@L4t<[K*m3]J:N,uIXQWlHiAAGp$7@f9a6@/++-?N"1*>lIt+>5DD$=T)=ttp<9R9W<;]bj4Ytb>l.h)?MRt,@/aU2@fBm:AGTm9B)QB9BZb&dCA;TDD#S;KDZ=YSE;X_UErL.YFT-F_ +G5QR`GlE!cHN&9jI//3hIf+]jJGk&uK)1-!K`?c(LB!&/M#E/3MMmDlN!kW*NfT6_OHG]hPEc'3 +7$a1,R$jD4S"-(AT:hmOU8+N\VPg>kWiE,$Xfek3Yd1UA['d?O\@K/]]Y(ql^V@S#_SX4/`Poj; +aN2KFb0.uPbg$.4s3C\lrR(Yns3pqrrmh&"qq(f!rn7/%rnIG-qVD2.rnmY3ro*n:r8[h +JcC<$JcE[gk5P2Tqu$3crqcThr:p9cs7ZEas7H?_rpp*Z!:^!V&FSrQm-O'(lKRQski_*jjlHF$ +)<0W5i8bKJ&MaN2EArl#&Z_ns:,_#D(U^:h1l]=YYb +\[]-J[L0FLZa6sCZ*:I9Y5YO,XK/A$WMofo&uMM$UnaZXTqJ'NSt;LCS"#k7rg4"YQBd`"PEM)k +OT(:NNfB!VMi*@JLkph@L4t<[K*m3]J:N,uIXQWlHiAAGp$7@f9a6@/++-?N"1*>lIt+>5DD$=T)=ttp<9R9W<;]bj4Ytb>l.h)?MRt,@/aU2@fBm:AGTm9B)QB9BZb&dCA;TDD#S;KDZ=YSE;X_UErL.YFT-F_ +G5QR`GlE!cHN&9jI//3hIf+]jJGk&uK)1-!K`?c(LB!&/M#E/3MMmDlN!kW*NfT6_OHG]hPEc'3 +7$a1,R$jD4S"-(AT:hmOU8+N\VPg>kWiE,$Xfek3Yd1UA['d?O\@K/]]Y(ql^V@S#_SX4/`Poj; +aN2KFb0.uPbg$.4s3C\lrR(Yns3pqrrmh&"qq(f!rn7/%rnIG-qVD2.rnmY3ro*n:r8[h +JcC<$JcEXfk5P2TqY^-crVHNhr:p9cs7ZEas7H?_rpg-\nF6GG'^kAUm-O'(lKRQskND!ijlGI^ +io0mp(#Rm(h;$c=g=b-1f@JL%eC2jndEp5=c5b*QbKJ&MaN2EA`l5p8_ns:,_8*h#^:h4m]XtcS +\I,jU[^NTO['R*EZ2Us;YHG"0XK/D%Wi;qpVl$7K7ec,rdYQ0IXQWlI!^0cH$OXYGBS.PrcA3_EcV/!!cW'rrbhaQ +s(q[Ms(_RJr+Q+Crau(>rFGn;q-s;2r*]>-rEfG.qHX#(rEB)$rE0&#pf@;mqGcu`pf./kpK%2n +r)iVpq-*Aol!4*kr*K2+rF#V5qI9G6rabk:rFZ"@ok;N_qeGnArbVRNr,2LPs)@mUrc8$[r,hs] +s*"OA(e"P*;,p +Q'IZ%R$a;1S"#q=St;UKTq\Vf^;%Fu_8=(,`5T^8 +a2l?Dai_fMbfn?2c2u>=d/MGmdf7epeGn(uf)4/!f`'S#gATe*h"ok+hYuF1i;V^8ir%j:jT"?> +k5XWEkl'cGl2^/Km/QJQmeuVSnGi%Wo)J=]o_nI_pAXgaq#C0hqYL*fr;?Nardk*#s8N%K~> +JcC<$JcEXfk5P2TqY^-crVHNhr:p9cs7ZEas7H?_rpg-\nF6GG'^kAUm-O'(lKRQskND!ijlGI^ +io0mp(#Rm(h;$c=g=b-1f@JL%eC2jndEp5=c5b*QbKJ&MaN2EA`l5p8_ns:,_8*h#^:h4m]XtcS +\I,jU[^NTO['R*EZ2Us;YHG"0XK/D%Wi;qpVl$7K7ec,rdYQ0IXQWlI!^0cH$OXYGBS.PrcA3_EcV/!!cW'rrbhaQ +s(q[Ms(_RJr+Q+Crau(>rFGn;q-s;2r*]>-rEfG.qHX#(rEB)$rE0&#pf@;mqGcu`pf./kpK%2n +r)iVpq-*Aol!4*kr*K2+rF#V5qI9G6rabk:rFZ"@ok;N_qeGnArbVRNr,2LPs)@mUrc8$[r,hs] +s*"OA(e"P*;,p +Q'IZ%R$a;1S"#q=St;UKTq\Vf^;%Fu_8=(,`5T^8 +a2l?Dai_fMbfn?2c2u>=d/MGmdf7epeGn(uf)4/!f`'S#gATe*h"ok+hYuF1i;V^8ir%j:jT"?> +k5XWEkl'cGl2^/Km/QJQmeuVSnGi%Wo)J=]o_nI_pAXgaq#C0hqYL*fr;?Nardk*#s8N%K~> +JcC<$JcEXfk5P2TqY^-crVHNhr:p9cs7ZEas7H?_rpg-\nF6GG'^kAUm-O'(lKRQskND!ijlGI^ +io0mp(#Rm(h;$c=g=b-1f@JL%eC2jndEp5=c5b*QbKJ&MaN2EA`l5p8_ns:,_8*h#^:h4m]XtcS +\I,jU[^NTO['R*EZ2Us;YHG"0XK/D%Wi;qpVl$7K7ec,rdYQ0IXQWlI!^0cH$OXYGBS.PrcA3_EcV/!!cW'rrbhaQ +s(q[Ms(_RJr+Q+Crau(>rFGn;q-s;2r*]>-rEfG.qHX#(rEB)$rE0&#pf@;mqGcu`pf./kpK%2n +r)iVpq-*Aol!4*kr*K2+rF#V5qI9G6rabk:rFZ"@ok;N_qeGnArbVRNr,2LPs)@mUrc8$[r,hs] +s*"OA(e"P*;,p +Q'IZ%R$a;1S"#q=St;UKTq\Vf^;%Fu_8=(,`5T^8 +a2l?Dai_fMbfn?2c2u>=d/MGmdf7epeGn(uf)4/!f`'S#gATe*h"ok+hYuF1i;V^8ir%j:jT"?> +k5XWEkl'cGl2^/Km/QJQmeuVSnGi%Wo)J=]o_nI_pAXgaq#C0hqYL*fr;?Nardk*#s8N%K~> +JcC<$JcERdk5P2Tqu$6drVHNhr:p9cs7ZEas7?<_rUL$[nF6GG!Uf@SliHG;rojIIkPjTMjlGI^ +io/hRhqn@g)Vj*$g=b-1f@JL%eC2jndEp4ccHa\YbKJ&Mrl>8``l5p8_u@LR_8-&b&&,`i]Xtee +\[f5Z\$i`Q[/RBJZE^X#*=t0P*2#nrfp'@ +Q^F/.R[]e:SXuFFTV8*TUnjiaVl6SpWiN8(Y-5(7ZEpmF[^NZT\[oDc]Y2%o^qmn)_o0O5`lH0A +aiV]KbKS5UcHab^d/MGmdf7epeGn)!f)4/!f`'S#gA]k*h"ok+hYuF0i;V^7ir.p:jT"??k5XWD +kl'cGlMp2Lm/QJQmeuVSnGi%Wo)J=]o_nI^pAambq#:*gqYL*fr;?Nardk*#s8N%K~> +JcC<$JcERdk5P2Tqu$6drVHNhr:p9cs7ZEas7?<_rUL$[nF6GG!Uf@SliHG;rojIIkPjTMjlGI^ +io/hRhqn@g)Vj*$g=b-1f@JL%eC2jndEp4ccHa\YbKJ&Mrl>8``l5p8_u@LR_8-&b&&,`i]Xtee +\[f5Z\$i`Q[/RBJZE^X#*=t0P*2#nrfp'@ +Q^F/.R[]e:SXuFFTV8*TUnjiaVl6SpWiN8(Y-5(7ZEpmF[^NZT\[oDc]Y2%o^qmn)_o0O5`lH0A +aiV]KbKS5UcHab^d/MGmdf7epeGn)!f)4/!f`'S#gA]k*h"ok+hYuF0i;V^7ir.p:jT"??k5XWD +kl'cGlMp2Lm/QJQmeuVSnGi%Wo)J=]o_nI^pAambq#:*gqYL*fr;?Nardk*#s8N%K~> +JcC<$JcERdk5P2Tqu$6drVHNhr:p9cs7ZEas7?<_rUL$[nF6GG!Uf@SliHG;rojIIkPjTMjlGI^ +io/hRhqn@g)Vj*$g=b-1f@JL%eC2jndEp4ccHa\YbKJ&Mrl>8``l5p8_u@LR_8-&b&&,`i]Xtee +\[f5Z\$i`Q[/RBJZE^X#*=t0P*2#nrfp'@ +Q^F/.R[]e:SXuFFTV8*TUnjiaVl6SpWiN8(Y-5(7ZEpmF[^NZT\[oDc]Y2%o^qmn)_o0O5`lH0A +aiV]KbKS5UcHab^d/MGmdf7epeGn)!f)4/!f`'S#gA]k*h"ok+hYuF0i;V^7ir.p:jT"??k5XWD +kl'cGlMp2Lm/QJQmeuVSnGi%Wo)J=]o_nI^pAambq#:*gqYL*fr;?Nardk*#s8N%K~> +JcC<$JcELbk5P2Tr;??erVHNhr:p)qcWl"rE&bppf6udpf6ufr)`eu +p0%2poipE\qd',+pg=#.rF,S4rF>h;qITV;rFbe:b\?rhq.otGrb_OMs)7mUrGhjXrcA$[s)n?b +r-/0cs*=Ngrd4Wlr-eNmrdXcprIOp!q1JX!re:6(reLN0r/(H2s,6l8s,I&=rf7)AOoCLEPEc'3 +3gQ,"R$jD4S"-%@StD[LTq\?YV5C/gW2ckuXKAY/YctC=Za@-K\%&uZ]"G\h^;%Fu_8=+.`Poj; +rl>Jhb0.uPc-=PZcd:&Z:0htu@2iW%p7j8\3?jo"9@ +kPscEl2U&Kli$2MmJlVQn,MnWnbr%YoDeI\p&Fabp\agdq>U6equ-HjrUKl +JcC<$JcELbk5P2Tr;??erVHNhr:p)qcWl"rE&bppf6udpf6ufr)`eu +p0%2poipE\qd',+pg=#.rF,S4rF>h;qITV;rFbe:b\?rhq.otGrb_OMs)7mUrGhjXrcA$[s)n?b +r-/0cs*=Ngrd4Wlr-eNmrdXcprIOp!q1JX!re:6(reLN0r/(H2s,6l8s,I&=rf7)AOoCLEPEc'3 +3gQ,"R$jD4S"-%@StD[LTq\?YV5C/gW2ckuXKAY/YctC=Za@-K\%&uZ]"G\h^;%Fu_8=+.`Poj; +rl>Jhb0.uPc-=PZcd:&Z:0htu@2iW%p7j8\3?jo"9@ +kPscEl2U&Kli$2MmJlVQn,MnWnbr%YoDeI\p&Fabp\agdq>U6equ-HjrUKl +JcC<$JcELbk5P2Tr;??erVHNhr:p)qcWl"rE&bppf6udpf6ufr)`eu +p0%2poipE\qd',+pg=#.rF,S4rF>h;qITV;rFbe:b\?rhq.otGrb_OMs)7mUrGhjXrcA$[s)n?b +r-/0cs*=Ngrd4Wlr-eNmrdXcprIOp!q1JX!re:6(reLN0r/(H2s,6l8s,I&=rf7)AOoCLEPEc'3 +3gQ,"R$jD4S"-%@StD[LTq\?YV5C/gW2ckuXKAY/YctC=Za@-K\%&uZ]"G\h^;%Fu_8=+.`Poj; +rl>Jhb0.uPc-=PZcd:&Z:0htu@2iW%p7j8\3?jo"9@ +kPscEl2U&Kli$2MmJlVQn,MnWnbr%YoDeI\p&Fabp\agdq>U6equ-HjrUKl +JcC<$JcEIak5P2Tqu$9erVHNhr:plIt+>5MJ$=T)=ono +>4u1X>l%b(?MIn,@/XO2@f9g9AGTm9B)QB8B[(8gCA;TDD#S;LDZ=YSE;aeVErL.YFT6L`G5ZXa +GlN'fHN&9kI/A?kIf=ioJGk&tK)(&uK`-W$LAlu-M#E20MZ8V5Muo!!NrG+>O8tFBOo^c2rfoj: +Q^F/.R[]e:SXuFFTV8'RUSO]_Vl-JmWiN5'Xfen4Z*L^C[C3NQ\[f;`]Y(tn^VI\&_Sa=2`Q#s> +aN;TJbKS61c2u>=d/MDodaQ\EeGn)!f)=5"f`0Y%gATe*h"ok*hYl@/i;V^7iqqd9jSn9=k5XWE +kl'cGlMp2Km/QJQmeuVSnGi%Vo)J=]o_nI^pAambq#:*gqYL*fr;?N`rdk*#s8N%K~> +JcC<$JcEIak5P2Tqu$9erVHNhr:plIt+>5MJ$=T)=ono +>4u1X>l%b(?MIn,@/XO2@f9g9AGTm9B)QB8B[(8gCA;TDD#S;LDZ=YSE;aeVErL.YFT6L`G5ZXa +GlN'fHN&9kI/A?kIf=ioJGk&tK)(&uK`-W$LAlu-M#E20MZ8V5Muo!!NrG+>O8tFBOo^c2rfoj: +Q^F/.R[]e:SXuFFTV8'RUSO]_Vl-JmWiN5'Xfen4Z*L^C[C3NQ\[f;`]Y(tn^VI\&_Sa=2`Q#s> +aN;TJbKS61c2u>=d/MDodaQ\EeGn)!f)=5"f`0Y%gATe*h"ok*hYl@/i;V^7iqqd9jSn9=k5XWE +kl'cGlMp2Km/QJQmeuVSnGi%Vo)J=]o_nI^pAambq#:*gqYL*fr;?N`rdk*#s8N%K~> +JcC<$JcEIak5P2Tqu$9erVHNhr:plIt+>5MJ$=T)=ono +>4u1X>l%b(?MIn,@/XO2@f9g9AGTm9B)QB8B[(8gCA;TDD#S;LDZ=YSE;aeVErL.YFT6L`G5ZXa +GlN'fHN&9kI/A?kIf=ioJGk&tK)(&uK`-W$LAlu-M#E20MZ8V5Muo!!NrG+>O8tFBOo^c2rfoj: +Q^F/.R[]e:SXuFFTV8'RUSO]_Vl-JmWiN5'Xfen4Z*L^C[C3NQ\[f;`]Y(tn^VI\&_Sa=2`Q#s> +aN;TJbKS61c2u>=d/MDodaQ\EeGn)!f)=5"f`0Y%gATe*h"ok*hYl@/i;V^7iqqd9jSn9=k5XWE +kl'cGlMp2Km/QJQmeuVSnGi%Vo)J=]o_nI^pAambq#:*gqYL*fr;?N`rdk*#s8N%K~> +JcC<$JcEC_k5P5Uqu$9erqcWir:p9cs7ZEas7?<_rUL3`nF5o8mdBKAliHG;rojIIkPjTIjlGI^ +io0mp$/aUqh;$c=g=b-Xf+-B^eC;sqdF$=fcd'h\bl5d,b/q`Ga2c3=`Pf[3_SX.)^q[Xu]tM(k +]=PSa\[]-J[K3eCrj+VjZ*:I9Y-+n/XK/A$WMlbnVl$;dUnaZXTqJ$MSt;LCS"#k7R$a5+Q'ISt +PEM)kOH5H_NJrgSMZ/G9Lkg_>KnTGX!J5n%J-LLPI=6KjHiAS0ra,S0qHX#(r`]/$rE0#"g/e)Pr)iYqqHEYu +gKaP[r*K/*ra>\5qdTM6rabk:rFZ"@ok;TaqeGqBrbVRNqelFPs)@mUs)S-\rH/'^s*"?bs*4Ng +rHeKjrd=Wls*jrsqgeZsrIXlurIk-'qM,!)rJ:B.s,-i7r/:]:NfO(!#EY(1P*2#mPl?q8QC!u+ +R@9V7S=Q7CT:hmOU8+N[V5C/hWN)u!Xf\b0Yd(L?Za@0L\%&u[]=bei^;%J"_SX4/`Poj;aN2KG +bKJ,SrltPjd/MGmdK%bqeGn)!f)=5#f`'S%gA]k*h"ok+hYl@.i;MX6iqqd9jSn9=k5XWDkl'cG +lMp2Km/QJQmelPRnGi%Wo)J=]o_eC^pAambq#:*gqYL*fr;?N`rdk*#s8DtJ~> +JcC<$JcEC_k5P5Uqu$9erqcWir:p9cs7ZEas7?<_rUL3`nF5o8mdBKAliHG;rojIIkPjTIjlGI^ +io0mp$/aUqh;$c=g=b-Xf+-B^eC;sqdF$=fcd'h\bl5d,b/q`Ga2c3=`Pf[3_SX.)^q[Xu]tM(k +]=PSa\[]-J[K3eCrj+VjZ*:I9Y-+n/XK/A$WMlbnVl$;dUnaZXTqJ$MSt;LCS"#k7R$a5+Q'ISt +PEM)kOH5H_NJrgSMZ/G9Lkg_>KnTGX!J5n%J-LLPI=6KjHiAS0ra,S0qHX#(r`]/$rE0#"g/e)Pr)iYqqHEYu +gKaP[r*K/*ra>\5qdTM6rabk:rFZ"@ok;TaqeGqBrbVRNqelFPs)@mUs)S-\rH/'^s*"?bs*4Ng +rHeKjrd=Wls*jrsqgeZsrIXlurIk-'qM,!)rJ:B.s,-i7r/:]:NfO(!#EY(1P*2#mPl?q8QC!u+ +R@9V7S=Q7CT:hmOU8+N[V5C/hWN)u!Xf\b0Yd(L?Za@0L\%&u[]=bei^;%J"_SX4/`Poj;aN2KG +bKJ,SrltPjd/MGmdK%bqeGn)!f)=5#f`'S%gA]k*h"ok+hYl@.i;MX6iqqd9jSn9=k5XWDkl'cG +lMp2Km/QJQmelPRnGi%Wo)J=]o_eC^pAambq#:*gqYL*fr;?N`rdk*#s8DtJ~> +JcC<$JcEC_k5P5Uqu$9erqcWir:p9cs7ZEas7?<_rUL3`nF5o8mdBKAliHG;rojIIkPjTIjlGI^ +io0mp$/aUqh;$c=g=b-Xf+-B^eC;sqdF$=fcd'h\bl5d,b/q`Ga2c3=`Pf[3_SX.)^q[Xu]tM(k +]=PSa\[]-J[K3eCrj+VjZ*:I9Y-+n/XK/A$WMlbnVl$;dUnaZXTqJ$MSt;LCS"#k7R$a5+Q'ISt +PEM)kOH5H_NJrgSMZ/G9Lkg_>KnTGX!J5n%J-LLPI=6KjHiAS0ra,S0qHX#(r`]/$rE0#"g/e)Pr)iYqqHEYu +gKaP[r*K/*ra>\5qdTM6rabk:rFZ"@ok;TaqeGqBrbVRNqelFPs)@mUs)S-\rH/'^s*"?bs*4Ng +rHeKjrd=Wls*jrsqgeZsrIXlurIk-'qM,!)rJ:B.s,-i7r/:]:NfO(!#EY(1P*2#mPl?q8QC!u+ +R@9V7S=Q7CT:hmOU8+N[V5C/hWN)u!Xf\b0Yd(L?Za@0L\%&u[]=bei^;%J"_SX4/`Poj;aN2KG +bKJ,SrltPjd/MGmdK%bqeGn)!f)=5#f`'S%gA]k*h"ok+hYl@.i;MX6iqqd9jSn9=k5XWDkl'cG +lMp2Km/QJQmelPRnGi%Wo)J=]o_eC^pAambq#:*gqYL*fr;?N`rdk*#s8DtJ~> +JcC<$JcE=]k5P5Ur;?BfrqcWir:p)e^W*tdf.W$d*L"_c-4DTbK@s+a8s?$rl"oV_u@LR_8-&b!PZ8H +]E,XUrj`'>\,NfC[C!9HZE^[=Yck5/XVS"=WiE%sVl-DgV50o^U7n9RT:VXFSGnurR[KP1Q^3o% +P`q8nOcYWbNfK*XN/NRMM26rdL'iWfK7ec,JUi9#If=a#I!^3dH?jd\rc\EeF`m\*!crC&rc.sW +s)7jRs)%dPr+l=Irb;7CrFc+Aq.9M8raYb5raGe6qHs5.ra#D+r`fA*q-!Yur)_iXqcEYsp0%8r +q-2KVq-El(pg=#.rF,S4rF>h;qITV;rFbh;c>!,iphTkFrb_RNs)7mUrGhjXs)\-\s)n?brHJ9d +s*=Qhrd4Zmr-eTordXirrdk'#qLea"rIt*&rJ1B.qhb?1rep`6s,I&=rJq#AOcfX+$^6g>Q'IZ$ +Q^F/.Rf8d;S=Q7CT:hmPUSO]^VPg>jWiE,$Xf\e2Yd(L?['d?O\@K/]]=bhk^V@S$_Sa=2`Q#s> +aN;TJbKS61c2l8(rnIG-qVD,,rnmP0rSdb8qr@\:roO(?roa=F +r9=7Hs6KXMs6]jSr9s[Ts7-'Ys7?9_r:U*`rqH?crqZQiqYU6hr;H0bJcC<$rVqB~> +JcC<$JcE=]k5P5Ur;?BfrqcWir:p)e^W*tdf.W$d*L"_c-4DTbK@s+a8s?$rl"oV_u@LR_8-&b!PZ8H +]E,XUrj`'>\,NfC[C!9HZE^[=Yck5/XVS"=WiE%sVl-DgV50o^U7n9RT:VXFSGnurR[KP1Q^3o% +P`q8nOcYWbNfK*XN/NRMM26rdL'iWfK7ec,JUi9#If=a#I!^3dH?jd\rc\EeF`m\*!crC&rc.sW +s)7jRs)%dPr+l=Irb;7CrFc+Aq.9M8raYb5raGe6qHs5.ra#D+r`fA*q-!Yur)_iXqcEYsp0%8r +q-2KVq-El(pg=#.rF,S4rF>h;qITV;rFbh;c>!,iphTkFrb_RNs)7mUrGhjXs)\-\s)n?brHJ9d +s*=Qhrd4Zmr-eTordXirrdk'#qLea"rIt*&rJ1B.qhb?1rep`6s,I&=rJq#AOcfX+$^6g>Q'IZ$ +Q^F/.Rf8d;S=Q7CT:hmPUSO]^VPg>jWiE,$Xf\e2Yd(L?['d?O\@K/]]=bhk^V@S$_Sa=2`Q#s> +aN;TJbKS61c2l8(rnIG-qVD,,rnmP0rSdb8qr@\:roO(?roa=F +r9=7Hs6KXMs6]jSr9s[Ts7-'Ys7?9_r:U*`rqH?crqZQiqYU6hr;H0bJcC<$rVqB~> +JcC<$JcE=]k5P5Ur;?BfrqcWir:p)e^W*tdf.W$d*L"_c-4DTbK@s+a8s?$rl"oV_u@LR_8-&b!PZ8H +]E,XUrj`'>\,NfC[C!9HZE^[=Yck5/XVS"=WiE%sVl-DgV50o^U7n9RT:VXFSGnurR[KP1Q^3o% +P`q8nOcYWbNfK*XN/NRMM26rdL'iWfK7ec,JUi9#If=a#I!^3dH?jd\rc\EeF`m\*!crC&rc.sW +s)7jRs)%dPr+l=Irb;7CrFc+Aq.9M8raYb5raGe6qHs5.ra#D+r`fA*q-!Yur)_iXqcEYsp0%8r +q-2KVq-El(pg=#.rF,S4rF>h;qITV;rFbh;c>!,iphTkFrb_RNs)7mUrGhjXs)\-\s)n?brHJ9d +s*=Qhrd4Zmr-eTordXirrdk'#qLea"rIt*&rJ1B.qhb?1rep`6s,I&=rJq#AOcfX+$^6g>Q'IZ$ +Q^F/.Rf8d;S=Q7CT:hmPUSO]^VPg>jWiE,$Xf\e2Yd(L?['d?O\@K/]]=bhk^V@S$_Sa=2`Q#s> +aN;TJbKS61c2l8(rnIG-qVD,,rnmP0rSdb8qr@\:roO(?roa=F +r9=7Hs6KXMs6]jSr9s[Ts7-'Ys7?9_r:U*`rqH?crqZQiqYU6hr;H0bJcC<$rVqB~> +JcC<$JcE7[kPk>Vr;?BfrqcWir:plIt,>5;>"=Sl1bno +>5DIT>k_P$?MIn+@/XO2@f9g9AGTm9B)QB9B[:DhCA;TDD#S;LDZ4SSE;aeVErU4ZFT6L`G5ZXb +GlN'fHN/?lI/JEmIfFopJH(3"K)1-!K`-W$LAco,M#)u-MZ8V4N;nn;Nr>%=O8tFAOo^c2rfm\R +Q^=),R@=,E5Fe:9StD[LTq\Vf^;%Fu_8=(,`Poj; +aN2KGbKJ,Sc-FV\d/MDndaS3Fs4./#rn%2&s4R>(s4dP.qVD/-rSRG/ro*h8qW%S9roO(?roa=F +r9=7Hrp0OLs6]jSr9s[Ts7-'Ys7?6^rUp0`s7cHdrqZQiqYU6hr;H0bJcC<$r;V9~> +JcC<$JcE7[kPk>Vr;?BfrqcWir:plIt,>5;>"=Sl1bno +>5DIT>k_P$?MIn+@/XO2@f9g9AGTm9B)QB9B[:DhCA;TDD#S;LDZ4SSE;aeVErU4ZFT6L`G5ZXb +GlN'fHN/?lI/JEmIfFopJH(3"K)1-!K`-W$LAco,M#)u-MZ8V4N;nn;Nr>%=O8tFAOo^c2rfm\R +Q^=),R@=,E5Fe:9StD[LTq\Vf^;%Fu_8=(,`Poj; +aN2KGbKJ,Sc-FV\d/MDndaS3Fs4./#rn%2&s4R>(s4dP.qVD/-rSRG/ro*h8qW%S9roO(?roa=F +r9=7Hrp0OLs6]jSr9s[Ts7-'Ys7?6^rUp0`s7cHdrqZQiqYU6hr;H0bJcC<$r;V9~> +JcC<$JcE7[kPk>Vr;?BfrqcWir:plIt,>5;>"=Sl1bno +>5DIT>k_P$?MIn+@/XO2@f9g9AGTm9B)QB9B[:DhCA;TDD#S;LDZ4SSE;aeVErU4ZFT6L`G5ZXb +GlN'fHN/?lI/JEmIfFopJH(3"K)1-!K`-W$LAco,M#)u-MZ8V4N;nn;Nr>%=O8tFAOo^c2rfm\R +Q^=),R@=,E5Fe:9StD[LTq\Vf^;%Fu_8=(,`Poj; +aN2KGbKJ,Sc-FV\d/MDndaS3Fs4./#rn%2&s4R>(s4dP.qVD/-rSRG/ro*h8qW%S9roO(?roa=F +r9=7Hrp0OLs6]jSr9s[Ts7-'Ys7?6^rUp0`s7cHdrqZQiqYU6hr;H0bJcC<$r;V9~> +JcC<$JcE1Ykl1GWr;?BfrqcWir:pbao9?^a2\+t!Q;nT_?%KgrkB#Y +]tM(k]=PSa\[],X[^NTNrj**?Z*:I9Y-+n/XK/A$WMofo,,V34UnaZXTqJ$LSt2C@S!ob5R$a5+ +Q'IStP*1rhO,o<\req#=MM[1GL]3#>KnP)2Jq8K'J:E#sI=6KjHiAV1ra,S0qcs,)rEB#"r)i_qpK%#iqH3Go +qc`i#f3IuSqHir(rF#V5qI9G6rFGb9rau+Ap1X)4phJo)qJ,e@rbVRNqelFPs)@pVrc8$[rcJ0_ +s*"?bs*4QhrHeKjs*Xcns*jutr.+cts+:-#re16(qM,!)rJ:<,reg]5r/CW7s,R&=s,d8CrfR>H +Pa)04!LB)OQiWVDrgQ-BSXuFFTV8'RUSO]^Vl-JmWiE,$Xfek3Yd1UA['d?O\@K/^]Y(ql^VI\& +_Sa=2`Q-'@ai_fMbg"DXcHjl:d/h\Erm^tu!7q/$s4IA)rS%8*s4mM-rSIP2q;D51rSm\6roF(? +qr[n@roj:Es6BXMr9XINs6fgRs7$'YrUTsZs7H6^s7ZKeqtU0drqcKgrVZTlnc"+>JcGZJJ,~> +JcC<$JcE1Ykl1GWr;?BfrqcWir:pbao9?^a2\+t!Q;nT_?%KgrkB#Y +]tM(k]=PSa\[],X[^NTNrj**?Z*:I9Y-+n/XK/A$WMofo,,V34UnaZXTqJ$LSt2C@S!ob5R$a5+ +Q'IStP*1rhO,o<\req#=MM[1GL]3#>KnP)2Jq8K'J:E#sI=6KjHiAV1ra,S0qcs,)rEB#"r)i_qpK%#iqH3Go +qc`i#f3IuSqHir(rF#V5qI9G6rFGb9rau+Ap1X)4phJo)qJ,e@rbVRNqelFPs)@pVrc8$[rcJ0_ +s*"?bs*4QhrHeKjs*Xcns*jutr.+cts+:-#re16(qM,!)rJ:<,reg]5r/CW7s,R&=s,d8CrfR>H +Pa)04!LB)OQiWVDrgQ-BSXuFFTV8'RUSO]^Vl-JmWiE,$Xfek3Yd1UA['d?O\@K/^]Y(ql^VI\& +_Sa=2`Q-'@ai_fMbg"DXcHjl:d/h\Erm^tu!7q/$s4IA)rS%8*s4mM-rSIP2q;D51rSm\6roF(? +qr[n@roj:Es6BXMr9XINs6fgRs7$'YrUTsZs7H6^s7ZKeqtU0drqcKgrVZTlnc"+>JcGZJJ,~> +JcC<$JcE1Ykl1GWr;?BfrqcWir:pbao9?^a2\+t!Q;nT_?%KgrkB#Y +]tM(k]=PSa\[],X[^NTNrj**?Z*:I9Y-+n/XK/A$WMofo,,V34UnaZXTqJ$LSt2C@S!ob5R$a5+ +Q'IStP*1rhO,o<\req#=MM[1GL]3#>KnP)2Jq8K'J:E#sI=6KjHiAV1ra,S0qcs,)rEB#"r)i_qpK%#iqH3Go +qc`i#f3IuSqHir(rF#V5qI9G6rFGb9rau+Ap1X)4phJo)qJ,e@rbVRNqelFPs)@pVrc8$[rcJ0_ +s*"?bs*4QhrHeKjs*Xcns*jutr.+cts+:-#re16(qM,!)rJ:<,reg]5r/CW7s,R&=s,d8CrfR>H +Pa)04!LB)OQiWVDrgQ-BSXuFFTV8'RUSO]^Vl-JmWiE,$Xfek3Yd1UA['d?O\@K/^]Y(ql^VI\& +_Sa=2`Q-'@ai_fMbg"DXcHjl:d/h\Erm^tu!7q/$s4IA)rS%8*s4mM-rSIP2q;D51rSm\6roF(? +qr[n@roj:Es6BXMr9XINs6fgRs7$'YrUTsZs7H6^s7ZKeqtU0drqcKgrVZTlnc"+>JcGZJJ,~> +JcC<$JcE.Xkl1GWr;?BfrqcZjr:pbao9?ia2Z-<`Pf^4_SX.*_#D(L +^:jNY!P>rB\H04LrjEcR['R*EZ*CO;YHG"0XK/D%Wi;qpVl$;dUna[`Tb3riSt;LCS"#k7R$a5+ +Q'IStrfRSMOH5H_NJrgSMZ/G9Lkg_>KnTGX!J5n%J,t.Krd=iqH[GanAKC]8)JC&2NABDuN>Ac60=A,Ba7@K'[3?iFC2?2In+>Q%b#=o)7h=8>tk=o2D" +>MEEN?2@n%?i=C3@JXI4A,Ts8Ac66>BD-$6C$]U)C%lB;C]8/LD>S5NDuXeTEW0tYF8^4\FoQX` +GQ2pfH2`-iHiJKlIK+crJ,FisJc:9!KDpQ'L&-Q'L]*&*M>iD2Mu8P5NW5%:O8k=AOoCODP5pjH +Q2d-MQi.rnmS1rSd_7q;_J8rT3q= +roa:Er9=7Hrp0LKs6]jSr9s[Ts7-'Yrq$0^r:U*`rqH?crqZQiqYU6hr;H-aJcC<$r;V9~> +JcC<$JcE.Xkl1GWr;?BfrqcZjr:pbao9?ia2Z-<`Pf^4_SX.*_#D(L +^:jNY!P>rB\H04LrjEcR['R*EZ*CO;YHG"0XK/D%Wi;qpVl$;dUna[`Tb3riSt;LCS"#k7R$a5+ +Q'IStrfRSMOH5H_NJrgSMZ/G9Lkg_>KnTGX!J5n%J,t.Krd=iqH[GanAKC]8)JC&2NABDuN>Ac60=A,Ba7@K'[3?iFC2?2In+>Q%b#=o)7h=8>tk=o2D" +>MEEN?2@n%?i=C3@JXI4A,Ts8Ac66>BD-$6C$]U)C%lB;C]8/LD>S5NDuXeTEW0tYF8^4\FoQX` +GQ2pfH2`-iHiJKlIK+crJ,FisJc:9!KDpQ'L&-Q'L]*&*M>iD2Mu8P5NW5%:O8k=AOoCODP5pjH +Q2d-MQi.rnmS1rSd_7q;_J8rT3q= +roa:Er9=7Hrp0LKs6]jSr9s[Ts7-'Yrq$0^r:U*`rqH?crqZQiqYU6hr;H-aJcC<$r;V9~> +JcC<$JcE.Xkl1GWr;?BfrqcZjr:pbao9?ia2Z-<`Pf^4_SX.*_#D(L +^:jNY!P>rB\H04LrjEcR['R*EZ*CO;YHG"0XK/D%Wi;qpVl$;dUna[`Tb3riSt;LCS"#k7R$a5+ +Q'IStrfRSMOH5H_NJrgSMZ/G9Lkg_>KnTGX!J5n%J,t.Krd=iqH[GanAKC]8)JC&2NABDuN>Ac60=A,Ba7@K'[3?iFC2?2In+>Q%b#=o)7h=8>tk=o2D" +>MEEN?2@n%?i=C3@JXI4A,Ts8Ac66>BD-$6C$]U)C%lB;C]8/LD>S5NDuXeTEW0tYF8^4\FoQX` +GQ2pfH2`-iHiJKlIK+crJ,FisJc:9!KDpQ'L&-Q'L]*&*M>iD2Mu8P5NW5%:O8k=AOoCODP5pjH +Q2d-MQi.rnmS1rSd_7q;_J8rT3q= +roa:Er9=7Hrp0LKs6]jSr9s[Ts7-'Yrq$0^r:U*`rqH?crqZQiqYU6hr;H-aJcC<$r;V9~> +JcC<$JcE%Ul2LSYr;?EgrqcWir:pKnY24K7\Z*J:N-!If=`rI!bj=s*4ThrceBc!-S6^s)\3\ +rGhjVs)7gQs)%aOqeQ.Frb;4BrFc+AqITY:raYh7raGe6r*TG0ra#A*r`f>)p0$Z_o3(roqciGm +gKjV]pL!l,rF,P3raYqSt;RITqS3UUnjiaVl-JmWiN5'Xfek3Z*L^B['mEP\@K2_]Y(qm^VI\&_Sa@3 +`lH0Aai_fMbg"GYcd;[=!RfHre,e+NrRV,'g"H>Xs4dS/r8%A/rnmS1rSd_7q;_G7roO"=roa:E +r9=4Gs6KULrpBaRr9s[Ts7-$Xs7?9_r:U*`rqH?crqZQiq>:-gr;H0bJcC<$qu;0~> +JcC<$JcE%Ul2LSYr;?EgrqcWir:pKnY24K7\Z*J:N-!If=`rI!bj=s*4ThrceBc!-S6^s)\3\ +rGhjVs)7gQs)%aOqeQ.Frb;4BrFc+AqITY:raYh7raGe6r*TG0ra#A*r`f>)p0$Z_o3(roqciGm +gKjV]pL!l,rF,P3raYqSt;RITqS3UUnjiaVl-JmWiN5'Xfek3Z*L^B['mEP\@K2_]Y(qm^VI\&_Sa@3 +`lH0Aai_fMbg"GYcd;[=!RfHre,e+NrRV,'g"H>Xs4dS/r8%A/rnmS1rSd_7q;_G7roO"=roa:E +r9=4Gs6KULrpBaRr9s[Ts7-$Xs7?9_r:U*`rqH?crqZQiq>:-gr;H0bJcC<$qu;0~> +JcC<$JcE%Ul2LSYr;?EgrqcWir:pKnY24K7\Z*J:N-!If=`rI!bj=s*4ThrceBc!-S6^s)\3\ +rGhjVs)7gQs)%aOqeQ.Frb;4BrFc+AqITY:raYh7raGe6r*TG0ra#A*r`f>)p0$Z_o3(roqciGm +gKjV]pL!l,rF,P3raYqSt;RITqS3UUnjiaVl-JmWiN5'Xfek3Z*L^B['mEP\@K2_]Y(qm^VI\&_Sa@3 +`lH0Aai_fMbg"GYcd;[=!RfHre,e+NrRV,'g"H>Xs4dS/r8%A/rnmS1rSd_7q;_G7roO"=roa:E +r9=4Gs6KULrpBaRr9s[Ts7-$Xs7?9_r:U*`rqH?crqZQiq>:-gr;H0bJcC<$qu;0~> +JcC<$JcE"Tl2LSYr;?EgrqcWir:pSeC2mprm:bnci22jc-611#Kk01aN2EB`rYct=6riINKX/`2!W2HPjV50o^U8"?TTV%gISXc1=R[KP1 +Q^3o%P`q8nOc]R''98'2N/NRMM26tCL5(D8KS+o/Jc:0)IsuipI=-Ehrd+Ti!-nKes*"EbrcJ0] +s)S'Xrc%mUr,2LNrbVIIrbDCGqIok@rFYqV1ra,S0qcs)(rEAbppfR#gqc`l$ +nQaUMpg3Z$rF#S4qI9G6rabk:rau+ApLsA:dVAMlrG;IMr,2OQrc%gUs)S-\rH/'^!-\Z:1htu@1iVhd3j8J';jn\'U6equ-HirUKl +JcC<$JcE"Tl2LSYr;?EgrqcWir:pSeC2mprm:bnci22jc-611#Kk01aN2EB`rYct=6riINKX/`2!W2HPjV50o^U8"?TTV%gISXc1=R[KP1 +Q^3o%P`q8nOc]R''98'2N/NRMM26tCL5(D8KS+o/Jc:0)IsuipI=-Ehrd+Ti!-nKes*"EbrcJ0] +s)S'Xrc%mUr,2LNrbVIIrbDCGqIok@rFYqV1ra,S0qcs)(rEAbppfR#gqc`l$ +nQaUMpg3Z$rF#S4qI9G6rabk:rau+ApLsA:dVAMlrG;IMr,2OQrc%gUs)S-\rH/'^!-\Z:1htu@1iVhd3j8J';jn\'U6equ-HirUKl +JcC<$JcE"Tl2LSYr;?EgrqcWir:pSeC2mprm:bnci22jc-611#Kk01aN2EB`rYct=6riINKX/`2!W2HPjV50o^U8"?TTV%gISXc1=R[KP1 +Q^3o%P`q8nOc]R''98'2N/NRMM26tCL5(D8KS+o/Jc:0)IsuipI=-Ehrd+Ti!-nKes*"EbrcJ0] +s)S'Xrc%mUr,2LNrbVIIrbDCGqIok@rFYqV1ra,S0qcs)(rEAbppfR#gqc`l$ +nQaUMpg3Z$rF#S4qI9G6rabk:rau+ApLsA:dVAMlrG;IMr,2OQrc%gUs)S-\rH/'^!-\Z:1htu@1iVhd3j8J';jn\'U6equ-HirUKl +JcC<$JcDqRlMg\Zr;?EgrqcWirV6Eerq??as7H?_rpp*Z!:^!V#O_!Hm-O'(lMg#Kki_s-&*;m4 +j5T(Wi8EMLhVI#Cg]#n-g"?;U!S5g#e,e%Hrm:bnci22pc-4DTbK@uLrl>,\`re;JC]8)IC&2NBBDuN?Ac?6>A,Kg8@K'[4?iFC2?2@h)>Pq[_=o)>!>Ol%J +?2%\!?i4=2@JXI4A,Ts8Ac66>BD?0:C"$hiC]/)KD>\;NDuXeTEW:(ZF8^4\FT?U`GQ2mfH2W'h +HN8HlIK+crJ,XuuJc:9"KE$W)L&6W)L]3,+M>iD2Mu/J3NW+t8O8k=@Oo:ICPQ-mHQ2d0MQi +aND]Lbg"GYcd:%ddF-LneCE+#rmq5(g"HAYs4dS/rS@M1rnmV2ro*h8q;_D6rT3n:-gr;H0bJcC<$qYu'~> +JcC<$JcDqRlMg\Zr;?EgrqcWirV6Eerq??as7H?_rpp*Z!:^!V#O_!Hm-O'(lMg#Kki_s-&*;m4 +j5T(Wi8EMLhVI#Cg]#n-g"?;U!S5g#e,e%Hrm:bnci22pc-4DTbK@uLrl>,\`re;JC]8)IC&2NBBDuN?Ac?6>A,Kg8@K'[4?iFC2?2@h)>Pq[_=o)>!>Ol%J +?2%\!?i4=2@JXI4A,Ts8Ac66>BD?0:C"$hiC]/)KD>\;NDuXeTEW:(ZF8^4\FT?U`GQ2mfH2W'h +HN8HlIK+crJ,XuuJc:9"KE$W)L&6W)L]3,+M>iD2Mu/J3NW+t8O8k=@Oo:ICPQ-mHQ2d0MQi +aND]Lbg"GYcd:%ddF-LneCE+#rmq5(g"HAYs4dS/rS@M1rnmV2ro*h8q;_D6rT3n:-gr;H0bJcC<$qYu'~> +JcC<$JcDqRlMg\Zr;?EgrqcWirV6Eerq??as7H?_rpp*Z!:^!V#O_!Hm-O'(lMg#Kki_s-&*;m4 +j5T(Wi8EMLhVI#Cg]#n-g"?;U!S5g#e,e%Hrm:bnci22pc-4DTbK@uLrl>,\`re;JC]8)IC&2NBBDuN?Ac?6>A,Kg8@K'[4?iFC2?2@h)>Pq[_=o)>!>Ol%J +?2%\!?i4=2@JXI4A,Ts8Ac66>BD?0:C"$hiC]/)KD>\;NDuXeTEW:(ZF8^4\FT?U`GQ2mfH2W'h +HN8HlIK+crJ,XuuJc:9"KE$W)L&6W)L]3,+M>iD2Mu/J3NW+t8O8k=@Oo:ICPQ-mHQ2d0MQi +aND]Lbg"GYcd:%ddF-LneCE+#rmq5(g"HAYs4dS/rS@M1rnmV2ro*h8q;_D6rT3n:-gr;H0bJcC<$qYu'~> +JcC<$JcDkPli-e[rVZNhrqcWir:pKnP,3K7\Z*J:N-!If=`sI!^5>HN/6jGl;gfG'.s+ +FT6F^Er9qVE;skRDZ4MPD#.rHCAhlDB`;ZDB)?0=AH-0:@fKm9@/F=1?N+7,>l7h'>3]8d>5MOq +>k_OM?M7b(@/XO1@fBm:AGTm:B)QB;B_uN;C@c60C@Z0=D#J5KDZ4SSE;aeVErU4ZFT6I`G5ZUd +G^4T5H3/G@I/\QoIfForJH(3#K)L?%K`?c(LB!&.M#3&.MZ/P1N;\b8Nr+n:OT(C@P5^[FPl?sJ +QN*c@2hu)F3iVhd4j8A!:jn\'; +kPaWAl2KuIlhg&KmJcPOn,MnVnbhtXoDeI\p&=[ap\agcq>L0dqu-HjrUBf;s+14Hs*t~> +JcC<$JcDkPli-e[rVZNhrqcWir:pKnP,3K7\Z*J:N-!If=`sI!^5>HN/6jGl;gfG'.s+ +FT6F^Er9qVE;skRDZ4MPD#.rHCAhlDB`;ZDB)?0=AH-0:@fKm9@/F=1?N+7,>l7h'>3]8d>5MOq +>k_OM?M7b(@/XO1@fBm:AGTm:B)QB;B_uN;C@c60C@Z0=D#J5KDZ4SSE;aeVErU4ZFT6I`G5ZUd +G^4T5H3/G@I/\QoIfForJH(3#K)L?%K`?c(LB!&.M#3&.MZ/P1N;\b8Nr+n:OT(C@P5^[FPl?sJ +QN*c@2hu)F3iVhd4j8A!:jn\'; +kPaWAl2KuIlhg&KmJcPOn,MnVnbhtXoDeI\p&=[ap\agcq>L0dqu-HjrUBf;s+14Hs*t~> +JcC<$JcDkPli-e[rVZNhrqcWir:pKnP,3K7\Z*J:N-!If=`sI!^5>HN/6jGl;gfG'.s+ +FT6F^Er9qVE;skRDZ4MPD#.rHCAhlDB`;ZDB)?0=AH-0:@fKm9@/F=1?N+7,>l7h'>3]8d>5MOq +>k_OM?M7b(@/XO1@fBm:AGTm:B)QB;B_uN;C@c60C@Z0=D#J5KDZ4SSE;aeVErU4ZFT6I`G5ZUd +G^4T5H3/G@I/\QoIfForJH(3#K)L?%K`?c(LB!&.M#3&.MZ/P1N;\b8Nr+n:OT(C@P5^[FPl?sJ +QN*c@2hu)F3iVhd4j8A!:jn\'; +kPaWAl2KuIlhg&KmJcPOn,MnVnbhtXoDeI\p&=[ap\agcq>L0dqu-HjrUBf;s+14Hs*t~> +JcC<$JcDeNm/Hn\rVZNhrqcWir:p$*ph?Yck43XfST&W\:?MVl-DgUnjc[TqS-OSt;LCS"#k7 +R$a5+Q'IStPEM)kOH5H_NJrgSMi*@JLkkta!JQ4+K*R!ZJUi9#It%BF!do?Ard+Tis*4Nes*"Eb +rH/'\s)S$Wrc%jTqelCMrbVFHrbDFHqe5tArau%=s()+=r*oY6ra>V1ra,S0q- +JcC<$JcDeNm/Hn\rVZNhrqcWir:p$*ph?Yck43XfST&W\:?MVl-DgUnjc[TqS-OSt;LCS"#k7 +R$a5+Q'IStPEM)kOH5H_NJrgSMi*@JLkkta!JQ4+K*R!ZJUi9#It%BF!do?Ard+Tis*4Nes*"Eb +rH/'\s)S$Wrc%jTqelCMrbVFHrbDFHqe5tArau%=s()+=r*oY6ra>V1ra,S0q- +JcC<$JcDeNm/Hn\rVZNhrqcWir:p$*ph?Yck43XfST&W\:?MVl-DgUnjc[TqS-OSt;LCS"#k7 +R$a5+Q'IStPEM)kOH5H_NJrgSMi*@JLkkta!JQ4+K*R!ZJUi9#It%BF!do?Ard+Tis*4Nes*"Eb +rH/'\s)S$Wrc%jTqelCMrbVFHrbDFHqe5tArau%=s()+=r*oY6ra>V1ra,S0q- +JcC<$JcD_LmJd%^r;?EgrqcZjr:prltPhbl5fcaoKQ_a9Tc*`l5p8`5DSk +&Ac/t^V@Lr]tD"i]"5G_\@;IG"gt_DZa-k8YVWJcXf\\*WiE%sVl-DgUnjc[TqS-OSt;LCS=?": +R@'A.QBd`"PEM)kOH5H_NfB!VMi.Lj#)J%hL4t>7rdt6'Jc:0$IsukGI0+eCHiA?kH2i-fG5ugc +Fo?F^F8g4XEW:"WDu+AND>nAKC]8)JC&;TCBDuN@Ac?6?A,Ba8@K'[3?iFC1?2.\#>Ou%m>P)1r +?1qUi?gV1i?i4=1@JXI3A,^$8Ac?S5NDuO_SEW:(ZF8^4\FT?U`G63#7 +H2`-iHiJKmIK+`rJ,Om!JV&LPKE$W)L&Hc+L]<2.M>iD3Mu/J4NW"n7O8Y1>Oo1CAPQ$gFQ2d0M +Qi39QR@9TDRgYaWSXuFFT:hmOU8.^`2l3CLVl6SpWiN5'Y-5(6Z*L^C[C3NQ\@K2_]Y(qm^VI\& +_SjF4`lH0Ab0.uPc-FV\d*^7he,Ihte^j`O!SH*)gAfn-h#6(/hZ)L3i;V^7iqqd7jSe38k5=E@ +kkXKBlMg,Hm/HDOmelPQnGi%Uo)J=\o_eC^pAXg`q#:*gqYC$er;?N_rdk*#s7u\F~> +JcC<$JcD_LmJd%^r;?EgrqcZjr:prltPhbl5fcaoKQ_a9Tc*`l5p8`5DSk +&Ac/t^V@Lr]tD"i]"5G_\@;IG"gt_DZa-k8YVWJcXf\\*WiE%sVl-DgUnjc[TqS-OSt;LCS=?": +R@'A.QBd`"PEM)kOH5H_NfB!VMi.Lj#)J%hL4t>7rdt6'Jc:0$IsukGI0+eCHiA?kH2i-fG5ugc +Fo?F^F8g4XEW:"WDu+AND>nAKC]8)JC&;TCBDuN@Ac?6?A,Ba8@K'[3?iFC1?2.\#>Ou%m>P)1r +?1qUi?gV1i?i4=1@JXI3A,^$8Ac?S5NDuO_SEW:(ZF8^4\FT?U`G63#7 +H2`-iHiJKmIK+`rJ,Om!JV&LPKE$W)L&Hc+L]<2.M>iD3Mu/J4NW"n7O8Y1>Oo1CAPQ$gFQ2d0M +Qi39QR@9TDRgYaWSXuFFT:hmOU8.^`2l3CLVl6SpWiN5'Y-5(6Z*L^C[C3NQ\@K2_]Y(qm^VI\& +_SjF4`lH0Ab0.uPc-FV\d*^7he,Ihte^j`O!SH*)gAfn-h#6(/hZ)L3i;V^7iqqd7jSe38k5=E@ +kkXKBlMg,Hm/HDOmelPQnGi%Uo)J=\o_eC^pAXg`q#:*gqYC$er;?N_rdk*#s7u\F~> +JcC<$JcD_LmJd%^r;?EgrqcZjr:prltPhbl5fcaoKQ_a9Tc*`l5p8`5DSk +&Ac/t^V@Lr]tD"i]"5G_\@;IG"gt_DZa-k8YVWJcXf\\*WiE%sVl-DgUnjc[TqS-OSt;LCS=?": +R@'A.QBd`"PEM)kOH5H_NfB!VMi.Lj#)J%hL4t>7rdt6'Jc:0$IsukGI0+eCHiA?kH2i-fG5ugc +Fo?F^F8g4XEW:"WDu+AND>nAKC]8)JC&;TCBDuN@Ac?6?A,Ba8@K'[3?iFC1?2.\#>Ou%m>P)1r +?1qUi?gV1i?i4=1@JXI3A,^$8Ac?S5NDuO_SEW:(ZF8^4\FT?U`G63#7 +H2`-iHiJKmIK+`rJ,Om!JV&LPKE$W)L&Hc+L]<2.M>iD3Mu/J4NW"n7O8Y1>Oo1CAPQ$gFQ2d0M +Qi39QR@9TDRgYaWSXuFFT:hmOU8.^`2l3CLVl6SpWiN5'Y-5(6Z*L^C[C3NQ\@K2_]Y(qm^VI\& +_SjF4`lH0Ab0.uPc-FV\d*^7he,Ihte^j`O!SH*)gAfn-h#6(/hZ)L3i;V^7iqqd7jSe38k5=E@ +kkXKBlMg,Hm/HDOmelPQnGi%Uo)J=\o_eC^pAXg`q#:*gqYC$er;?N_rdk*#s7u\F~> +JcC<$JcDYJmf*._r;?HhrqcWir:p>b`l?!:`5KRm +_?%KgrkAKJ^&GYF]=S!P1Usp&[^ENMZa6sBYct=6Xf\\+X/`2!W2HPjV50o^U7n9RT:VXFS=?": +R@'A.QBd`"PQ$^_OcYWbNfB!VMi3ILM26qBL5(D8KS+o/Jq/rE])$mT]3dqH`o' +^L-nHrF,M2raYqrFu+CcYNGprGDCKs)7mUrGhjXs)\-\!d/[0rHAjWN)u!XKAV-YctCc@3hu2L4iW%p7j8J';jnS!:kPXQ>l2BoH +lh]uImJlVOn,DhVnbhtWoD\C[p&Fabp\Xabq>U6dqu-HirUKl +JcC<$JcDYJmf*._r;?HhrqcWir:p>b`l?!:`5KRm +_?%KgrkAKJ^&GYF]=S!P1Usp&[^ENMZa6sBYct=6Xf\\+X/`2!W2HPjV50o^U7n9RT:VXFS=?": +R@'A.QBd`"PQ$^_OcYWbNfB!VMi3ILM26qBL5(D8KS+o/Jq/rE])$mT]3dqH`o' +^L-nHrF,M2raYqrFu+CcYNGprGDCKs)7mUrGhjXs)\-\!d/[0rHAjWN)u!XKAV-YctCc@3hu2L4iW%p7j8J';jnS!:kPXQ>l2BoH +lh]uImJlVOn,DhVnbhtWoD\C[p&Fabp\Xabq>U6dqu-HirUKl +JcC<$JcDYJmf*._r;?HhrqcWir:p>b`l?!:`5KRm +_?%KgrkAKJ^&GYF]=S!P1Usp&[^ENMZa6sBYct=6Xf\\+X/`2!W2HPjV50o^U7n9RT:VXFS=?": +R@'A.QBd`"PQ$^_OcYWbNfB!VMi3ILM26qBL5(D8KS+o/Jq/rE])$mT]3dqH`o' +^L-nHrF,M2raYqrFu+CcYNGprGDCKs)7mUrGhjXs)\-\!d/[0rHAjWN)u!XKAV-YctCc@3hu2L4iW%p7j8J';jnS!:kPXQ>l2BoH +lh]uImJlVOn,DhVnbhtWoD\C[p&Fabp\Xabq>U6dqu-HirUKl +JcC<$JcDYJmJd%^rVZNhrqcWirV6Ees7ZEas7H?_rpp*Z!:^!Vs6]mSrp1'ZlK[Wukih3lk2k^c +ro4%=iVqa9hqn@g#Me(gg=k65f`'J'f%'cLs3gtrrm:eocd2U9!mSs5rlYPhaiVWFa2c4!`rac%=qdTS6ra>S0rEfG.gKaS\q-L[? +r*]J3q-s>5rFGe:rau+AqIoe@qeFJnqeZ1IqelCOrc%gUs)S-\rH/'^!-\Za@-K[^WfX]">Vg^;%Fu_8=+.`Poj; +aN;TJbKS5VcHjkbdF-LneCE.Lf)aOWrn7G.gt_nbs5!b5rS[\6s5Nt:rT*t>q<%V +JcC<$JcDYJmJd%^rVZNhrqcWirV6Ees7ZEas7H?_rpp*Z!:^!Vs6]mSrp1'ZlK[Wukih3lk2k^c +ro4%=iVqa9hqn@g#Me(gg=k65f`'J'f%'cLs3gtrrm:eocd2U9!mSs5rlYPhaiVWFa2c4!`rac%=qdTS6ra>S0rEfG.gKaS\q-L[? +r*]J3q-s>5rFGe:rau+AqIoe@qeFJnqeZ1IqelCOrc%gUs)S-\rH/'^!-\Za@-K[^WfX]">Vg^;%Fu_8=+.`Poj; +aN;TJbKS5VcHjkbdF-LneCE.Lf)aOWrn7G.gt_nbs5!b5rS[\6s5Nt:rT*t>q<%V +JcC<$JcDYJmJd%^rVZNhrqcWirV6Ees7ZEas7H?_rpp*Z!:^!Vs6]mSrp1'ZlK[Wukih3lk2k^c +ro4%=iVqa9hqn@g#Me(gg=k65f`'J'f%'cLs3gtrrm:eocd2U9!mSs5rlYPhaiVWFa2c4!`rac%=qdTS6ra>S0rEfG.gKaS\q-L[? +r*]J3q-s>5rFGe:rau+AqIoe@qeFJnqeZ1IqelCOrc%gUs)S-\rH/'^!-\Za@-K[^WfX]">Vg^;%Fu_8=+.`Poj; +aN;TJbKS5VcHjkbdF-LneCE.Lf)aOWrn7G.gt_nbs5!b5rS[\6s5Nt:rT*t>q<%V +JcC<$JcDVImf*+^rVZNhrqcZjr:pMM[1GLkkta!JQ4+K*$XUJc:0$IsukGIK+]pHiA?kH2i-e +GQ2jdFo6@\F8g4XEW0qVDu4GOD>nAKC]8)KC&DZDBE)T@AcHf?27g: +?i4=0@JOC3A,Ts8Ac66?BDQ<>C&D_oC\_fED>J/MDuO_REW:(ZF8g:]FoQXaGQ2pfH2`*kH[L5? +IK+`rJ,XuuJH1<#K*$^[L&Hc+LB*//M>iD4Mu8P6NW+t8O8b7?Ont7?PQ$gDQ2[*LQi*6NRK&`S +Rf]+NSc53NT:hjNTq\9VUnji`VPg>jWN)u!XKAV-YHY79ZEppG[^NZT\[oDc]Y2%o^qmn)_o9U7 +a2l?DbKJ,ScHab_dF$CkeC<%"rmq2'g&B\,gYCT`h#cHjhu2L5iW%p8j8S-=jn\';kPXQ=l29iF +lh]uHmJcPNn,DhVnb_nVoDeI[p&=[bp\Xabq>L0cqu-HjrUBf;s+14Es*t~> +JcC<$JcDVImf*+^rVZNhrqcZjr:pMM[1GLkkta!JQ4+K*$XUJc:0$IsukGIK+]pHiA?kH2i-e +GQ2jdFo6@\F8g4XEW0qVDu4GOD>nAKC]8)KC&DZDBE)T@AcHf?27g: +?i4=0@JOC3A,Ts8Ac66?BDQ<>C&D_oC\_fED>J/MDuO_REW:(ZF8g:]FoQXaGQ2pfH2`*kH[L5? +IK+`rJ,XuuJH1<#K*$^[L&Hc+LB*//M>iD4Mu8P6NW+t8O8b7?Ont7?PQ$gDQ2[*LQi*6NRK&`S +Rf]+NSc53NT:hjNTq\9VUnji`VPg>jWN)u!XKAV-YHY79ZEppG[^NZT\[oDc]Y2%o^qmn)_o9U7 +a2l?DbKJ,ScHab_dF$CkeC<%"rmq2'g&B\,gYCT`h#cHjhu2L5iW%p8j8S-=jn\';kPXQ=l29iF +lh]uHmJcPNn,DhVnb_nVoDeI[p&=[bp\Xabq>L0cqu-HjrUBf;s+14Es*t~> +JcC<$JcDVImf*+^rVZNhrqcZjr:pMM[1GLkkta!JQ4+K*$XUJc:0$IsukGIK+]pHiA?kH2i-e +GQ2jdFo6@\F8g4XEW0qVDu4GOD>nAKC]8)KC&DZDBE)T@AcHf?27g: +?i4=0@JOC3A,Ts8Ac66?BDQ<>C&D_oC\_fED>J/MDuO_REW:(ZF8g:]FoQXaGQ2pfH2`*kH[L5? +IK+`rJ,XuuJH1<#K*$^[L&Hc+LB*//M>iD4Mu8P6NW+t8O8b7?Ont7?PQ$gDQ2[*LQi*6NRK&`S +Rf]+NSc53NT:hjNTq\9VUnji`VPg>jWN)u!XKAV-YHY79ZEppG[^NZT\[oDc]Y2%o^qmn)_o9U7 +a2l?DbKJ,ScHab_dF$CkeC<%"rmq2'g&B\,gYCT`h#cHjhu2L5iW%p8j8S-=jn\';kPXQ=l29iF +lh]uHmJcPNn,DhVnb_nVoDeI[p&=[bp\Xabq>L0cqu-HjrUBf;s+14Es*t~> +JcC<$JcDPGn,E7`rVZNhrqcWirV6Bds7ZHbs7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJ!U/_Gk5XNH +jQ#:[io0mp#N+Cph;-lAg]#n3g"=s/f@JO'rm^ts!7Lkos3Lblrm(Pg!6kGcs2k>`rlG,[!65#W +!Q;nT_@+2q^q[Xu]tM(k]=S!P"h;%M[^ELAZR)o^Yct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC +S"#k7R$a5+rfmYOPEM)kOT(:PNfB!VMi*CKM26qBL5(D9K`6W(JcLB$JH(*!If4]pHiSNlHN/9j +Gl2dcG5cX^FT-@]Er0kUE;jeQDZ4MPD#A)JCB&#GB`;ZEB)H6>AH-0:@fBg8@/41-?M@b">kVJ! +?LM7e@,52e@/OI/@f9g9AG]s:B)ZH>B`2ZCC@>rpD#8)FDZ4SRE;aeUErU4[FT6L`G5c^cGlN'g +H3/G@I/\NqIXckHJH(0#K)UE&K`?c*LB!&/M#N82MZ8V4N;nn:Nr4t;OT(C=P5^[EPkp[EQN* +JcC<$JcDPGn,E7`rVZNhrqcWirV6Bds7ZHbs7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJ!U/_Gk5XNH +jQ#:[io0mp#N+Cph;-lAg]#n3g"=s/f@JO'rm^ts!7Lkos3Lblrm(Pg!6kGcs2k>`rlG,[!65#W +!Q;nT_@+2q^q[Xu]tM(k]=S!P"h;%M[^ELAZR)o^Yct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC +S"#k7R$a5+rfmYOPEM)kOT(:PNfB!VMi*CKM26qBL5(D9K`6W(JcLB$JH(*!If4]pHiSNlHN/9j +Gl2dcG5cX^FT-@]Er0kUE;jeQDZ4MPD#A)JCB&#GB`;ZEB)H6>AH-0:@fBg8@/41-?M@b">kVJ! +?LM7e@,52e@/OI/@f9g9AG]s:B)ZH>B`2ZCC@>rpD#8)FDZ4SRE;aeUErU4[FT6L`G5c^cGlN'g +H3/G@I/\NqIXckHJH(0#K)UE&K`?c*LB!&/M#N82MZ8V4N;nn:Nr4t;OT(C=P5^[EPkp[EQN* +JcC<$JcDPGn,E7`rVZNhrqcWirV6Bds7ZHbs7H?_rpp*Z!:^!Vs6]mSrp9[N!:'RJ!U/_Gk5XNH +jQ#:[io0mp#N+Cph;-lAg]#n3g"=s/f@JO'rm^ts!7Lkos3Lblrm(Pg!6kGcs2k>`rlG,[!65#W +!Q;nT_@+2q^q[Xu]tM(k]=S!P"h;%M[^ELAZR)o^Yct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC +S"#k7R$a5+rfmYOPEM)kOT(:PNfB!VMi*CKM26qBL5(D9K`6W(JcLB$JH(*!If4]pHiSNlHN/9j +Gl2dcG5cX^FT-@]Er0kUE;jeQDZ4MPD#A)JCB&#GB`;ZEB)H6>AH-0:@fBg8@/41-?M@b">kVJ! +?LM7e@,52e@/OI/@f9g9AG]s:B)ZH>B`2ZCC@>rpD#8)FDZ4SRE;aeUErU4[FT6L`G5c^cGlN'g +H3/G@I/\NqIXckHJH(0#K)UE&K`?c*LB!&/M#N82MZ8V4N;nn:Nr4t;OT(C=P5^[EPkp[EQN* +JcC<$JcDJEnG`@arVZNhrqcZjr:ps()+=qdTP5ra>M.q-NSspKmAs +g0j2Qq-a).q-s>5rFGe:rau+AqIokBr+bk>ghce'php(Lrc%dTs)S-\rH/'^s*"Bcs*+Nhrd+Tk +s*Xfo!e,WKrdY'$JqEuS!ec8]reCH.!/UT1s,-i7rJ^c9s,R# +JcC<$JcDJEnG`@arVZNhrqcZjr:ps()+=qdTP5ra>M.q-NSspKmAs +g0j2Qq-a).q-s>5rFGe:rau+AqIokBr+bk>ghce'php(Lrc%dTs)S-\rH/'^s*"Bcs*+Nhrd+Tk +s*Xfo!e,WKrdY'$JqEuS!ec8]reCH.!/UT1s,-i7rJ^c9s,R# +JcC<$JcDJEnG`@arVZNhrqcZjr:ps()+=qdTP5ra>M.q-NSspKmAs +g0j2Qq-a).q-s>5rFGe:rau+AqIokBr+bk>ghce'php(Lrc%dTs)S-\rH/'^s*"Bcs*+Nhrd+Tk +s*Xfo!e,WKrdY'$JqEuS!ec8]reCH.!/UT1s,-i7rJ^c9s,R# +JcC<$JcDJEnG`@arVZNhrqcWirV6Bds7ZHbs7H?_rpp*Zs7$$V!q,ICrp0mUlK[Wukih4/jp1#/ +jQ#:[io0mp!oMkkrnRV1g]#q,f`9\(fDjD%ec+(ue,Rkqd/q\@ci22kc-4E2b6#i.ao9?da2Z-< +`Pf^4rk\]P_#D(Y^:h1l]=PSa\[],W[^ELAZR)o^Yct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC +S"#k7R$a5+rfmYOPEM)kOT(:ANfF$s!K2j7M#iEfreCH,!/1?(s+16%rI=s!IX_6Ds*XinrHeKh +s*4Hcrc\aN;TJbg"GYcd:(edaQ^qe^i@(f\+s3g=tE^h>c=3hu;R6iW%p9j8\3?jnn3>kPaW>l29iE +lhBcEmJZJLn,;bTnb_nVoD\CZp&Fabp\O[aq>L0dqu$BirU9`:s+14Ds*t~> +JcC<$JcDJEnG`@arVZNhrqcWirV6Bds7ZHbs7H?_rpp*Zs7$$V!q,ICrp0mUlK[Wukih4/jp1#/ +jQ#:[io0mp!oMkkrnRV1g]#q,f`9\(fDjD%ec+(ue,Rkqd/q\@ci22kc-4E2b6#i.ao9?da2Z-< +`Pf^4rk\]P_#D(Y^:h1l]=PSa\[],W[^ELAZR)o^Yct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC +S"#k7R$a5+rfmYOPEM)kOT(:ANfF$s!K2j7M#iEfreCH,!/1?(s+16%rI=s!IX_6Ds*XinrHeKh +s*4Hcrc\aN;TJbg"GYcd:(edaQ^qe^i@(f\+s3g=tE^h>c=3hu;R6iW%p9j8\3?jnn3>kPaW>l29iE +lhBcEmJZJLn,;bTnb_nVoD\CZp&Fabp\O[aq>L0dqu$BirU9`:s+14Ds*t~> +JcC<$JcDJEnG`@arVZNhrqcWirV6Bds7ZHbs7H?_rpp*Zs7$$V!q,ICrp0mUlK[Wukih4/jp1#/ +jQ#:[io0mp!oMkkrnRV1g]#q,f`9\(fDjD%ec+(ue,Rkqd/q\@ci22kc-4E2b6#i.ao9?da2Z-< +`Pf^4rk\]P_#D(Y^:h1l]=PSa\[],W[^ELAZR)o^Yct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC +S"#k7R$a5+rfmYOPEM)kOT(:ANfF$s!K2j7M#iEfreCH,!/1?(s+16%rI=s!IX_6Ds*XinrHeKh +s*4Hcrc\aN;TJbg"GYcd:(edaQ^qe^i@(f\+s3g=tE^h>c=3hu;R6iW%p9j8\3?jnn3>kPaW>l29iE +lhBcEmJZJLn,;bTnb_nVoD\CZp&Fabp\O[aq>L0dqu$BirU9`:s+14Ds*t~> +JcC<$JcDABnc&Lcr;?HhrqcWirV6Ees7ZEas7H?_rpp*Zs7$$V!q,ICrp0[OlMg&JkQ'fFjoXZ* +jSn0?io0mps5*h5rnRY2gY;_]!nl5Yrn%2$!7h(us3gtrrQt\ncd2U9!mSs5rlYAcaiXP'(!">6 +`Pod6_ns:,_8*h#^:q:n]XtcS\L"bp[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC +rgO4_R@'A.QBd`"PQ$^QOcYWbNfK*XN/NUOreUZ3L]3&.K`Hf*KE$Q'Jc:3"J,ausIK+]oHi89j +H2`'dGQ2jcFo-:\F8g4WEW:"WDu=MPD?"GMC]8)KC&DZEBDuN@Ac?6>A,Ba6@JjNf?hn+%@Imsu +@H_+p@JF=1A,^$8Ac?<@BDQrJ5MuJ\8NW5%:O8k=AOo1CAPQ$gCQ2[*KQhm*KRJrZQ +S,]#YSc,/[TDtS`U&UheU].(hV*1]RVl6PnWiE,$Xf\b0YHY79ZEppG[^NZT\[f;`]Y2%o^VI\& +_o0O5`lH0Bb0.uPc-FV]dF$CkeC<%"rmqP1g"P07gt^`AhVR/hi;_d9ir8! +JcC<$JcDABnc&Lcr;?HhrqcWirV6Ees7ZEas7H?_rpp*Zs7$$V!q,ICrp0[OlMg&JkQ'fFjoXZ* +jSn0?io0mps5*h5rnRY2gY;_]!nl5Yrn%2$!7h(us3gtrrQt\ncd2U9!mSs5rlYAcaiXP'(!">6 +`Pod6_ns:,_8*h#^:q:n]XtcS\L"bp[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC +rgO4_R@'A.QBd`"PQ$^QOcYWbNfK*XN/NUOreUZ3L]3&.K`Hf*KE$Q'Jc:3"J,ausIK+]oHi89j +H2`'dGQ2jcFo-:\F8g4WEW:"WDu=MPD?"GMC]8)KC&DZEBDuN@Ac?6>A,Ba6@JjNf?hn+%@Imsu +@H_+p@JF=1A,^$8Ac?<@BDQrJ5MuJ\8NW5%:O8k=AOo1CAPQ$gCQ2[*KQhm*KRJrZQ +S,]#YSc,/[TDtS`U&UheU].(hV*1]RVl6PnWiE,$Xf\b0YHY79ZEppG[^NZT\[f;`]Y2%o^VI\& +_o0O5`lH0Bb0.uPc-FV]dF$CkeC<%"rmqP1g"P07gt^`AhVR/hi;_d9ir8! +JcC<$JcDABnc&Lcr;?HhrqcWirV6Ees7ZEas7H?_rpp*Zs7$$V!q,ICrp0[OlMg&JkQ'fFjoXZ* +jSn0?io0mps5*h5rnRY2gY;_]!nl5Yrn%2$!7h(us3gtrrQt\ncd2U9!mSs5rlYAcaiXP'(!">6 +`Pod6_ns:,_8*h#^:q:n]XtcS\L"bp[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC +rgO4_R@'A.QBd`"PQ$^QOcYWbNfK*XN/NUOreUZ3L]3&.K`Hf*KE$Q'Jc:3"J,ausIK+]oHi89j +H2`'dGQ2jcFo-:\F8g4WEW:"WDu=MPD?"GMC]8)KC&DZEBDuN@Ac?6>A,Ba6@JjNf?hn+%@Imsu +@H_+p@JF=1A,^$8Ac?<@BDQrJ5MuJ\8NW5%:O8k=AOo1CAPQ$gCQ2[*KQhm*KRJrZQ +S,]#YSc,/[TDtS`U&UheU].(hV*1]RVl6PnWiE,$Xf\b0YHY79ZEppG[^NZT\[f;`]Y2%o^VI\& +_o0O5`lH0Bb0.uPc-FV]dF$CkeC<%"rmqP1g"P07gt^`AhVR/hi;_d9ir8! +JcC<$JcD>Ao)ARcrVZNhrqcZjr:ph;qITYk5XWDkkXK@ +lMTuBm/68KmeQ>MnG_tSo)A7[o_\=\pAXg_q#:*fqYC$dr;?N_rdk*#s7H>A~> +JcC<$JcD>Ao)ARcrVZNhrqcZjr:ph;qITYk5XWDkkXK@ +lMTuBm/68KmeQ>MnG_tSo)A7[o_\=\pAXg_q#:*fqYC$dr;?N_rdk*#s7H>A~> +JcC<$JcD>Ao)ARcrVZNhrqcZjr:ph;qITYk5XWDkkXK@ +lMTuBm/68KmeQ>MnG_tSo)A7[o_\=\pAXg_q#:*fqYC$dr;?N_rdk*#s7H>A~> +JcC<$JcD>Anc&IbrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6]mSrp9[N!:'RJ!pJh1roO:D +jQ-=##NF_$i8EMMhYl73gtUT_g&fs[f`'M&ec=8!e,n+Idf.YociDDjc2u87bl5cjb/qcHaN)?@ +rl"oV_u@LR_8-&b"hq[_]XtcS\Mq%-[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC +S"#k8R@'A.QBd`"PEV/mOc]R'!KN0=MunopMZ/G5Lkktas+UK+re(6&!.k*!s*t&trI+]nrd4Ti +rd"Ngqfi'`rcS*[s)\0[r,M^Ts)7gQs)%aOrG2CIs(VCEs(D=Cr+5kY4r*eYopgMQZk@+$m +rF>e:qITYrG5MuJ\8NW5%;O8k=AOo:IBPQ-mEQ2[*KQhm*KRJrZPS,SrWSc,/Z +TDtS`U&UkeU].(hV#[ClVZE`qri/#[XKAV-Y-5(6Z*L^B['d?N\%&u[]=bei^;%G!_SX4/`Pom= +aN;TJbKS5Vcd:(edaQ^qe^i@(f\-8X#2@qhh;7#Grnmk:io9sts5a4Ar9"%Broj4CrTa=Hp[%eE +r9jCLrUBdUqXXXWrUg![rq??cqY:'crVH?er;?HjnG\"=JcGBBJ,~> +JcC<$JcD>Anc&IbrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6]mSrp9[N!:'RJ!pJh1roO:D +jQ-=##NF_$i8EMMhYl73gtUT_g&fs[f`'M&ec=8!e,n+Idf.YociDDjc2u87bl5cjb/qcHaN)?@ +rl"oV_u@LR_8-&b"hq[_]XtcS\Mq%-[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC +S"#k8R@'A.QBd`"PEV/mOc]R'!KN0=MunopMZ/G5Lkktas+UK+re(6&!.k*!s*t&trI+]nrd4Ti +rd"Ngqfi'`rcS*[s)\0[r,M^Ts)7gQs)%aOrG2CIs(VCEs(D=Cr+5kY4r*eYopgMQZk@+$m +rF>e:qITYrG5MuJ\8NW5%;O8k=AOo:IBPQ-mEQ2[*KQhm*KRJrZPS,SrWSc,/Z +TDtS`U&UkeU].(hV#[ClVZE`qri/#[XKAV-Y-5(6Z*L^B['d?N\%&u[]=bei^;%G!_SX4/`Pom= +aN;TJbKS5Vcd:(edaQ^qe^i@(f\-8X#2@qhh;7#Grnmk:io9sts5a4Ar9"%Broj4CrTa=Hp[%eE +r9jCLrUBdUqXXXWrUg![rq??cqY:'crVH?er;?HjnG\"=JcGBBJ,~> +JcC<$JcD>Anc&IbrVZQirqcWirV6Bds7ZEa!qc*UrUL$[nF6GGs6]mSrp9[N!:'RJ!pJh1roO:D +jQ-=##NF_$i8EMMhYl73gtUT_g&fs[f`'M&ec=8!e,n+Idf.YociDDjc2u87bl5cjb/qcHaN)?@ +rl"oV_u@LR_8-&b"hq[_]XtcS\Mq%-[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OSt;LC +S"#k8R@'A.QBd`"PEV/mOc]R'!KN0=MunopMZ/G5Lkktas+UK+re(6&!.k*!s*t&trI+]nrd4Ti +rd"Ngqfi'`rcS*[s)\0[r,M^Ts)7gQs)%aOrG2CIs(VCEs(D=Cr+5kY4r*eYopgMQZk@+$m +rF>e:qITYrG5MuJ\8NW5%;O8k=AOo:IBPQ-mEQ2[*KQhm*KRJrZPS,SrWSc,/Z +TDtS`U&UkeU].(hV#[ClVZE`qri/#[XKAV-Y-5(6Z*L^B['d?N\%&u[]=bei^;%G!_SX4/`Pom= +aN;TJbKS5Vcd:(edaQ^qe^i@(f\-8X#2@qhh;7#Grnmk:io9sts5a4Ar9"%Broj4CrTa=Hp[%eE +r9jCLrUBdUqXXXWrUg![rq??cqY:'crVH?er;?HjnG\"=JcGBBJ,~> +JcC<$JcD;@nc&IbrVZQirqcZjr:p&s4.2#rR:ntdaJ-Bs3Lblrm(Pgs31Mds2k>`rl>Yk +`l?!:`5KR1_SO((^V@Lrrk("u]",A]\$i`Q['R*EZ*:I9Y-"h-X/`2!W2HPjV50o^U7n9RTV%gI +SXc1=R[KP1Q^7W9!L/fIOo^],rf7)?NW+kOT1IAP5gaFPl-gGQN*ai_fMbg"GYcd:(fe'umtf%8O+g"G*5gYDea!T)`5hu_lsir8! +JcC<$JcD;@nc&IbrVZQirqcZjr:p&s4.2#rR:ntdaJ-Bs3Lblrm(Pgs31Mds2k>`rl>Yk +`l?!:`5KR1_SO((^V@Lrrk("u]",A]\$i`Q['R*EZ*:I9Y-"h-X/`2!W2HPjV50o^U7n9RTV%gI +SXc1=R[KP1Q^7W9!L/fIOo^],rf7)?NW+kOT1IAP5gaFPl-gGQN*ai_fMbg"GYcd:(fe'umtf%8O+g"G*5gYDea!T)`5hu_lsir8! +JcC<$JcD;@nc&IbrVZQirqcZjr:p&s4.2#rR:ntdaJ-Bs3Lblrm(Pgs31Mds2k>`rl>Yk +`l?!:`5KR1_SO((^V@Lrrk("u]",A]\$i`Q['R*EZ*:I9Y-"h-X/`2!W2HPjV50o^U7n9RTV%gI +SXc1=R[KP1Q^7W9!L/fIOo^],rf7)?NW+kOT1IAP5gaFPl-gGQN*ai_fMbg"GYcd:(fe'umtf%8O+g"G*5gYDea!T)`5hu_lsir8! +JcC<$JcD8?o)ARcrVZNhs8)`jr:pOT1IAP5gaGPl-gHQN!6JR/WNQReiNQSGo)VT)PA^ +T_tM`UAq"fV#R:kVZ*J$W2ZbrWiN5&Xf\b0rie;cZEpmE[C3NQ\@K/]]=bei^V@S#_SX4/`Q#s> +aN;TJbK\>Xcd:(edaQ^qe^i@(f\,!4gYDea!T)`5hu_lsir8! +JcC<$JcD8?o)ARcrVZNhs8)`jr:pOT1IAP5gaGPl-gHQN!6JR/WNQReiNQSGo)VT)PA^ +T_tM`UAq"fV#R:kVZ*J$W2ZbrWiN5&Xf\b0rie;cZEpmE[C3NQ\@K/]]=bei^V@S#_SX4/`Q#s> +aN;TJbK\>Xcd:(edaQ^qe^i@(f\,!4gYDea!T)`5hu_lsir8! +JcC<$JcD8?o)ARcrVZNhs8)`jr:pOT1IAP5gaGPl-gHQN!6JR/WNQReiNQSGo)VT)PA^ +T_tM`UAq"fV#R:kVZ*J$W2ZbrWiN5&Xf\b0rie;cZEpmE[C3NQ\@K/]]=bei^V@S#_SX4/`Q#s> +aN;TJbK\>Xcd:(edaQ^qe^i@(f\,!4gYDea!T)`5hu_lsir8! +JcC<$JcD8?nc&LcrVZNhrqcZjr:p+f\$/S!nPoPrm^tss3gnos3Lblrm(Pg!6kGcs2k>`rl>,\ +`rSEY^V7Fq]Y(kf\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OT:VXF +S=?":R@'A.Q^3o%P`q;oP*(ifO,o<]NW+kAc60;A)CbhA)q1oA)Uno +A,Ts6Ac?OT1IBP5gaGPl6mHQN*Vf]tV7r_8=(,`5T^8 +a2lBFbKJ,ScHaeadF-LneCE.%f@\d1g=tE +JcC<$JcD8?nc&LcrVZNhrqcZjr:p+f\$/S!nPoPrm^tss3gnos3Lblrm(Pg!6kGcs2k>`rl>,\ +`rSEY^V7Fq]Y(kf\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OT:VXF +S=?":R@'A.Q^3o%P`q;oP*(ifO,o<]NW+kAc60;A)CbhA)q1oA)Uno +A,Ts6Ac?OT1IBP5gaGPl6mHQN*Vf]tV7r_8=(,`5T^8 +a2lBFbKJ,ScHaeadF-LneCE.%f@\d1g=tE +JcC<$JcD8?nc&LcrVZNhrqcZjr:p+f\$/S!nPoPrm^tss3gnos3Lblrm(Pg!6kGcs2k>`rl>,\ +`rSEY^V7Fq]Y(kf\[f5Z[^NTNZa6sBYct=6Xf\\*WiE%sVl-DgUnjc[TqS-OT:VXF +S=?":R@'A.Q^3o%P`q;oP*(ifO,o<]NW+kAc60;A)CbhA)q1oA)Uno +A,Ts6Ac?OT1IBP5gaGPl6mHQN*Vf]tV7r_8=(,`5T^8 +a2lBFbKJ,ScHaeadF-LneCE.%f@\d1g=tE +JcC<$JcD8?nc&IbrVZQirqcWir:ps5O(;rnmk8hVS7fs4mY/rn@D*s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGcs2k>`rl>,\ +`rrA3L])u-L&Zi*KE$Q'Jc(&uJ,auqIK"Wo +Hi/3hH2i-eGQ)dcFo6@]F8g4YEW:"WDuFSRD>nAMC]8)KC&DZDBDuN=Ac-*7A+3t$A+jI!AbK[. +A*[V#A,Km5Ac66?BDZBAC&VlDC]/)JD>.rCDrbm0EW'qWF8L(ZFoQX`GQ2pfH2`*kH[L5?I0+kI +J,Xs!JV*lR#D@ebL5(J=M#N54MMmDlMueourJq#AOcfX+s-*JIrK[DKs-NYNrgEbSqj[STrLNhW +rh'1_qk=%arhKFfs/#amrhodp!3,sts/Q.$riH4(YPtaYZ*L^B['d?N\%&uZ]">Vf]tV7r^qmn) +`5T^8a2l?Db0/#RcHab_dF$CkeC<%Jf+6Neg=k<:h;-rFhr*GOiSsjs!p&J)rT=.Cs60FGrp'LK +q<\(IqsO.Gr:'XSq""CTrUfsZrV$6bqY:$brVH +JcC<$JcD8?nc&IbrVZQirqcWir:ps5O(;rnmk8hVS7fs4mY/rn@D*s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGcs2k>`rl>,\ +`rrA3L])u-L&Zi*KE$Q'Jc(&uJ,auqIK"Wo +Hi/3hH2i-eGQ)dcFo6@]F8g4YEW:"WDuFSRD>nAMC]8)KC&DZDBDuN=Ac-*7A+3t$A+jI!AbK[. +A*[V#A,Km5Ac66?BDZBAC&VlDC]/)JD>.rCDrbm0EW'qWF8L(ZFoQX`GQ2pfH2`*kH[L5?I0+kI +J,Xs!JV*lR#D@ebL5(J=M#N54MMmDlMueourJq#AOcfX+s-*JIrK[DKs-NYNrgEbSqj[STrLNhW +rh'1_qk=%arhKFfs/#amrhodp!3,sts/Q.$riH4(YPtaYZ*L^B['d?N\%&uZ]">Vf]tV7r^qmn) +`5T^8a2l?Db0/#RcHab_dF$CkeC<%Jf+6Neg=k<:h;-rFhr*GOiSsjs!p&J)rT=.Cs60FGrp'LK +q<\(IqsO.Gr:'XSq""CTrUfsZrV$6bqY:$brVH +JcC<$JcD8?nc&IbrVZQirqcWir:ps5O(;rnmk8hVS7fs4mY/rn@D*s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGcs2k>`rl>,\ +`rrA3L])u-L&Zi*KE$Q'Jc(&uJ,auqIK"Wo +Hi/3hH2i-eGQ)dcFo6@]F8g4YEW:"WDuFSRD>nAMC]8)KC&DZDBDuN=Ac-*7A+3t$A+jI!AbK[. +A*[V#A,Km5Ac66?BDZBAC&VlDC]/)JD>.rCDrbm0EW'qWF8L(ZFoQX`GQ2pfH2`*kH[L5?I0+kI +J,Xs!JV*lR#D@ebL5(J=M#N54MMmDlMueourJq#AOcfX+s-*JIrK[DKs-NYNrgEbSqj[STrLNhW +rh'1_qk=%arhKFfs/#amrhodp!3,sts/Q.$riH4(YPtaYZ*L^B['d?N\%&uZ]">Vf]tV7r^qmn) +`5T^8a2l?Db0/#RcHab_dF$CkeC<%Jf+6Neg=k<:h;-rFhr*GOiSsjs!p&J)rT=.Cs60FGrp'LK +q<\(IqsO.Gr:'XSq""CTrUfsZrV$6bqY:$brVH +JcC<$JcD5>nc&LcrVZNhrqcWirV6Bds7ZEas7H?_rpp*Zs7$$Vs6]mSrp9[Ns6BUJ!pJh1roX7B +!9F+=!oi1tro!h6s5*b2s4mY/rn@D*s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGc4j(mgaN2EB +`l5p8_o'@._8*h#^:q:n]Xtbc\[],W[^EKKZa-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ%WSct[T +S"#k7rg3_QQN!-MP`u*0!KiKCO8k4?NW+n:MZAY5M#rKgL])r/KnP-XKE$Q&Jc1-!J,XopIK+]o +Hi/3iH2`'eGQ)dcFo6@]F8p:YEW:"XDuFSQD?"GMC]A/KC&DZDBDlH;Abos*A+aBdAbT`qA,Bg4 +Ac66?BDQ<@C&VlEC]8/KD>8#GDtS)-EVskUF8L(ZFoQX`GQ2pfH2`-iHiJKmI0Y4NIt3'#JV*lR +!JH1+L'NKiLl$tGMMqIm!f`5#rf7,BOcfX+s-*JIrg!MLs-NYNs-`kTr1!YTrginWrh'1_qk="` +rhKFfs/#amrMT[os/H!t6E@2hXf\b/YHY79Z*L^B['d?N\%&rY\[oDc]tV7r^qmn)_o0O5a2l?D +b0.uPc-FY^dF$CkeC<%"f@S[.g=k<:rnRe8hr*GOiSsjs!p&J)roX7Ds60CFs6BULqX"1Jr9j7H +qsaORp[\:SrUfpYrV$6bq=ssbrVH +JcC<$JcD5>nc&LcrVZNhrqcWirV6Bds7ZEas7H?_rpp*Zs7$$Vs6]mSrp9[Ns6BUJ!pJh1roX7B +!9F+=!oi1tro!h6s5*b2s4mY/rn@D*s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGc4j(mgaN2EB +`l5p8_o'@._8*h#^:q:n]Xtbc\[],W[^EKKZa-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ%WSct[T +S"#k7rg3_QQN!-MP`u*0!KiKCO8k4?NW+n:MZAY5M#rKgL])r/KnP-XKE$Q&Jc1-!J,XopIK+]o +Hi/3iH2`'eGQ)dcFo6@]F8p:YEW:"XDuFSQD?"GMC]A/KC&DZDBDlH;Abos*A+aBdAbT`qA,Bg4 +Ac66?BDQ<@C&VlEC]8/KD>8#GDtS)-EVskUF8L(ZFoQX`GQ2pfH2`-iHiJKmI0Y4NIt3'#JV*lR +!JH1+L'NKiLl$tGMMqIm!f`5#rf7,BOcfX+s-*JIrg!MLs-NYNs-`kTr1!YTrginWrh'1_qk="` +rhKFfs/#amrMT[os/H!t6E@2hXf\b/YHY79Z*L^B['d?N\%&rY\[oDc]tV7r^qmn)_o0O5a2l?D +b0.uPc-FY^dF$CkeC<%"f@S[.g=k<:rnRe8hr*GOiSsjs!p&J)roX7Ds60CFs6BULqX"1Jr9j7H +qsaORp[\:SrUfpYrV$6bq=ssbrVH +JcC<$JcD5>nc&LcrVZNhrqcWirV6Bds7ZEas7H?_rpp*Zs7$$Vs6]mSrp9[Ns6BUJ!pJh1roX7B +!9F+=!oi1tro!h6s5*b2s4mY/rn@D*s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGc4j(mgaN2EB +`l5p8_o'@._8*h#^:q:n]Xtbc\[],W[^EKKZa-j?Yck43XfSS'Wi;qpVl$;dUnaZXTqJ%WSct[T +S"#k7rg3_QQN!-MP`u*0!KiKCO8k4?NW+n:MZAY5M#rKgL])r/KnP-XKE$Q&Jc1-!J,XopIK+]o +Hi/3iH2`'eGQ)dcFo6@]F8p:YEW:"XDuFSQD?"GMC]A/KC&DZDBDlH;Abos*A+aBdAbT`qA,Bg4 +Ac66?BDQ<@C&VlEC]8/KD>8#GDtS)-EVskUF8L(ZFoQX`GQ2pfH2`-iHiJKmI0Y4NIt3'#JV*lR +!JH1+L'NKiLl$tGMMqIm!f`5#rf7,BOcfX+s-*JIrg!MLs-NYNs-`kTr1!YTrginWrh'1_qk="` +rhKFfs/#amrMT[os/H!t6E@2hXf\b/YHY79Z*L^B['d?N\%&rY\[oDc]tV7r^qmn)_o0O5a2l?D +b0.uPc-FY^dF$CkeC<%"f@S[.g=k<:rnRe8hr*GOiSsjs!p&J)roX7Ds60CFs6BULqX"1Jr9j7H +qsaORp[\:SrUfpYrV$6bq=ssbrVH +JcC<$JcD5>nc&IbrVZNhrqcZjr:ps5F%;rS[_5!8d\1s4dV/rS%;)s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGc!QrO`a8s?$ +rl"oV_u@M!_8*h#^:h1l]=PP`\@8oT[C*BJZa$a=YHG"0XK/A$WMl_mVPX9f$)=5gTqJ$LSt2DN +RgY[QR$a5,QBd`"P`u*0!KiKCO8k4?NW+n:MuS\6M>rD3L]3&.L&Zi)KE$Q&Jc1,uJ,auqIK+]o +Hi/3iH2`'eGQ)dcFo?F]F8p:ZEW:"WDuFSRD>nAMC]8)JC&;TCBDlH7Aaa0iAcHB*AbK[)A,'U0 +Ac66?BDQ<@C&VlEC]8/KD>A)IDu+G.EVjeSF8L(YFoQX_GQ2mfH2W'hHN8HmIK+`rJ,Xs'JV&K+ +K7no3re:H/M#N59MMmCON/`gWrf@)@!0R8Ds-!GIrK[DKs-N\Os-`nUqj[VUrginWrh'.^qk="` +rhKCerh]XlrMT[os/H!ts/Q.$riJ>dYHP17Z*L[AZa@-K[^W`U\[f;`]Y(ql^VI\&_Sa=2`Q#s> +aND]Lbg"GYcd:(fe'umtf%8O+g"P07h#?+6hV[8LiSieqir\<'jo4EBkPscEl2U&Jlhg&ImJZJH +n,)VOnb2POoDS=Wp&4U_p\O[`q>L0bqu$BhrU9`:s+14>s*t~> +JcC<$JcD5>nc&IbrVZNhrqcZjr:ps5F%;rS[_5!8d\1s4dV/rS%;)s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGc!QrO`a8s?$ +rl"oV_u@M!_8*h#^:h1l]=PP`\@8oT[C*BJZa$a=YHG"0XK/A$WMl_mVPX9f$)=5gTqJ$LSt2DN +RgY[QR$a5,QBd`"P`u*0!KiKCO8k4?NW+n:MuS\6M>rD3L]3&.L&Zi)KE$Q&Jc1,uJ,auqIK+]o +Hi/3iH2`'eGQ)dcFo?F]F8p:ZEW:"WDuFSRD>nAMC]8)JC&;TCBDlH7Aaa0iAcHB*AbK[)A,'U0 +Ac66?BDQ<@C&VlEC]8/KD>A)IDu+G.EVjeSF8L(YFoQX_GQ2mfH2W'hHN8HmIK+`rJ,Xs'JV&K+ +K7no3re:H/M#N59MMmCON/`gWrf@)@!0R8Ds-!GIrK[DKs-N\Os-`nUqj[VUrginWrh'.^qk="` +rhKCerh]XlrMT[os/H!ts/Q.$riJ>dYHP17Z*L[AZa@-K[^W`U\[f;`]Y(ql^VI\&_Sa=2`Q#s> +aND]Lbg"GYcd:(fe'umtf%8O+g"P07h#?+6hV[8LiSieqir\<'jo4EBkPscEl2U&Jlhg&ImJZJH +n,)VOnb2POoDS=Wp&4U_p\O[`q>L0bqu$BhrU9`:s+14>s*t~> +JcC<$JcD5>nc&IbrVZNhrqcZjr:ps5F%;rS[_5!8d\1s4dV/rS%;)s4I>&s475#rm^tss3gnos3Lblrm(Pg!6kGc!QrO`a8s?$ +rl"oV_u@M!_8*h#^:h1l]=PP`\@8oT[C*BJZa$a=YHG"0XK/A$WMl_mVPX9f$)=5gTqJ$LSt2DN +RgY[QR$a5,QBd`"P`u*0!KiKCO8k4?NW+n:MuS\6M>rD3L]3&.L&Zi)KE$Q&Jc1,uJ,auqIK+]o +Hi/3iH2`'eGQ)dcFo?F]F8p:ZEW:"WDuFSRD>nAMC]8)JC&;TCBDlH7Aaa0iAcHB*AbK[)A,'U0 +Ac66?BDQ<@C&VlEC]8/KD>A)IDu+G.EVjeSF8L(YFoQX_GQ2mfH2W'hHN8HmIK+`rJ,Xs'JV&K+ +K7no3re:H/M#N59MMmCON/`gWrf@)@!0R8Ds-!GIrK[DKs-N\Os-`nUqj[VUrginWrh'.^qk="` +rhKCerh]XlrMT[os/H!ts/Q.$riJ>dYHP17Z*L[AZa@-K[^W`U\[f;`]Y(ql^VI\&_Sa=2`Q#s> +aND]Lbg"GYcd:(fe'umtf%8O+g"P07h#?+6hV[8LiSieqir\<'jo4EBkPscEl2U&Jlhg&ImJZJH +n,)VOnb2POoDS=Wp&4U_p\O[`q>L0bqu$BhrU9`:s+14>s*t~> +JcC<$JcD2=o)ARcrVZNhrqcWir:p&s475#rm^tss3gnos3LblrltSibfp(0!QrO`a8s?$ +rl#&Z_ns:,_#D(t^:h1l]=PP`\@8oT[C!9HZE^X\ +S!ob5R$a5+QBd`"P`u*0#a(41O,o<]NK*pr!fMqnrJCQ1!/LN-s+UK+r.G$$s+1)us*t#srI+Zm +s*OZis*=TgrHJ9brcS0]s)\3\r,MaUs)7jRrb_[Or+l:Hrb;7CrFc%?g1B/Rmq(`ook")6rb)(@ +rb;@HqeQ1IrGDCKrGVRPic4X3qfDRTrcS6ar-/0cs*=Qh!df"[^NZS\@K/]]=bei^;%Fu_8=+.`Poj;aN2KGbKJ/U +cHjkbdF-LneCE.%f@\d1g=tE=h;7&ghuVfrro4(@jlQL(s6'FGrTX@Is6KRKrpB[Pp[A"Kqsj@M +r:BjYq=X^[rV--_rV?Egq"t!equ,s^JcC<$nGe"~> +JcC<$JcD2=o)ARcrVZNhrqcWir:p&s475#rm^tss3gnos3LblrltSibfp(0!QrO`a8s?$ +rl#&Z_ns:,_#D(t^:h1l]=PP`\@8oT[C!9HZE^X\ +S!ob5R$a5+QBd`"P`u*0#a(41O,o<]NK*pr!fMqnrJCQ1!/LN-s+UK+r.G$$s+1)us*t#srI+Zm +s*OZis*=TgrHJ9brcS0]s)\3\r,MaUs)7jRrb_[Or+l:Hrb;7CrFc%?g1B/Rmq(`ook")6rb)(@ +rb;@HqeQ1IrGDCKrGVRPic4X3qfDRTrcS6ar-/0cs*=Qh!df"[^NZS\@K/]]=bei^;%Fu_8=+.`Poj;aN2KGbKJ/U +cHjkbdF-LneCE.%f@\d1g=tE=h;7&ghuVfrro4(@jlQL(s6'FGrTX@Is6KRKrpB[Pp[A"Kqsj@M +r:BjYq=X^[rV--_rV?Egq"t!equ,s^JcC<$nGe"~> +JcC<$JcD2=o)ARcrVZNhrqcWir:p&s475#rm^tss3gnos3LblrltSibfp(0!QrO`a8s?$ +rl#&Z_ns:,_#D(t^:h1l]=PP`\@8oT[C!9HZE^X\ +S!ob5R$a5+QBd`"P`u*0#a(41O,o<]NK*pr!fMqnrJCQ1!/LN-s+UK+r.G$$s+1)us*t#srI+Zm +s*OZis*=TgrHJ9brcS0]s)\3\r,MaUs)7jRrb_[Or+l:Hrb;7CrFc%?g1B/Rmq(`ook")6rb)(@ +rb;@HqeQ1IrGDCKrGVRPic4X3qfDRTrcS6ar-/0cs*=Qh!df"[^NZS\@K/]]=bei^;%Fu_8=+.`Poj;aN2KGbKJ/U +cHjkbdF-LneCE.%f@\d1g=tE=h;7&ghuVfrro4(@jlQL(s6'FGrTX@Is6KRKrpB[Pp[A"Kqsj@M +r:BjYq=X^[rV--_rV?Egq"t!equ,s^JcC<$nGe"~> +JcC<$JcD2=nc&IbrVZNhrqcZjr:p9cs7ZEas7H?_rUL$[nF6DF!q,ICrp9[Ns6BUJs60LGroX7B +!9F+=s5F%;rS[_5s5*_1!o2PbrS%;)s4I>&s475#rm^tss3gno!mo9>rlu)"bfn8Rb/qcHaN) +S!ocEQiWP>rfmPLPEZ!/!g/S+rf7,@NK*prs,6o7re^Z2s+gQ-s+UK+r.G$$s+1)us*t#sr-eTm +s*OZis*=TgrHJ9bs)n6]s)\3\rGhjVrbqaQs)%aOr+l:Hrb;4Br+Gh;m:Gs&j(J*ueRe\krFbt? +rb;@HqeQ1Irb_LLrGVUQo5X#8pN-(NrcS3`r-/0cs*=Qhs*F`nrI"p"It*!!JUrFPK+*EeKnb>; +LkpnEMMd>kMueourf7;GOcbfiPEV70Pld8d@i +VuN^qWVrjsWrT7"XTu#4YHY79Z*OA86aX80[^WcV\[f;`]Y(ql^V@S#_SX4/`Pom=aN;TJbKS5V +cHjncdaQ^qe^i@(f\,!4gYCW@hV[5Ki8N\Tj5]4]jo4EBk5a`El2U&Klhg&JmJcPKn,)VOnauDM +oDJ7Up&4U^p\FU_q>L0bqu$BhrU0Z9s+14=s*t~> +JcC<$JcD2=nc&IbrVZNhrqcZjr:p9cs7ZEas7H?_rUL$[nF6DF!q,ICrp9[Ns6BUJs60LGroX7B +!9F+=s5F%;rS[_5s5*_1!o2PbrS%;)s4I>&s475#rm^tss3gno!mo9>rlu)"bfn8Rb/qcHaN) +S!ocEQiWP>rfmPLPEZ!/!g/S+rf7,@NK*prs,6o7re^Z2s+gQ-s+UK+r.G$$s+1)us*t#sr-eTm +s*OZis*=TgrHJ9bs)n6]s)\3\rGhjVrbqaQs)%aOr+l:Hrb;4Br+Gh;m:Gs&j(J*ueRe\krFbt? +rb;@HqeQ1Irb_LLrGVUQo5X#8pN-(NrcS3`r-/0cs*=Qhs*F`nrI"p"It*!!JUrFPK+*EeKnb>; +LkpnEMMd>kMueourf7;GOcbfiPEV70Pld8d@i +VuN^qWVrjsWrT7"XTu#4YHY79Z*OA86aX80[^WcV\[f;`]Y(ql^V@S#_SX4/`Pom=aN;TJbKS5V +cHjncdaQ^qe^i@(f\,!4gYCW@hV[5Ki8N\Tj5]4]jo4EBk5a`El2U&Klhg&JmJcPKn,)VOnauDM +oDJ7Up&4U^p\FU_q>L0bqu$BhrU0Z9s+14=s*t~> +JcC<$JcD2=nc&IbrVZNhrqcZjr:p9cs7ZEas7H?_rUL$[nF6DF!q,ICrp9[Ns6BUJs60LGroX7B +!9F+=s5F%;rS[_5s5*_1!o2PbrS%;)s4I>&s475#rm^tss3gno!mo9>rlu)"bfn8Rb/qcHaN) +S!ocEQiWP>rfmPLPEZ!/!g/S+rf7,@NK*prs,6o7re^Z2s+gQ-s+UK+r.G$$s+1)us*t#sr-eTm +s*OZis*=TgrHJ9bs)n6]s)\3\rGhjVrbqaQs)%aOr+l:Hrb;4Br+Gh;m:Gs&j(J*ueRe\krFbt? +rb;@HqeQ1Irb_LLrGVUQo5X#8pN-(NrcS3`r-/0cs*=Qhs*F`nrI"p"It*!!JUrFPK+*EeKnb>; +LkpnEMMd>kMueourf7;GOcbfiPEV70Pld8d@i +VuN^qWVrjsWrT7"XTu#4YHY79Z*OA86aX80[^WcV\[f;`]Y(ql^V@S#_SX4/`Pom=aN;TJbKS5V +cHjncdaQ^qe^i@(f\,!4gYCW@hV[5Ki8N\Tj5]4]jo4EBk5a`El2U&Klhg&JmJcPKn,)VOnauDM +oDJ7Up&4U^p\FU_q>L0bqu$BhrU0Z9s+14=s*t~> +JcC<$JcD2=nc&IbrVZNhrqcWir:ps5O(;rS[_5s5*_1!o2PbrS%;)s4I;%!nPoPrm^tss3gno!mo9>rltPhbl5cib/qcHaN)=" +`Ab`Q_SX.)^V@Lr]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-X/`2!W2HPjV50o^U7n9RT:_^HSXf\K +!LfGUQiWP>rg!MJ!0dDF!g/S+rf@)>!0-r9s,-l7rJCQ1s+gQ-s+UH*rIb-%rdjuts*t&tr-eTm +rd4Tis*=TgrHJ9bs)n9^s)\3\r,MaUs)7gQs)%aOr+l:HrFu%?q.K,-oOm<"ph0A6hdu[srFbt? +rb;@HqeQ1Irb_LLrbqaSp2ThIl>uQ=rH8'^r-/0crd"Khs*OcnrdFfq!.Xuus+(0%rdt6)L&Qf= +LPUbCM2I4LN/WaVNfT6_OHKO*!gAk5rfmPNQ^@]=s-`nUrLVf]tV7r^qmn)_o0O5`lH0AaihlO +c-FV\d*^7he'umtf@S[.rn7n;gtgfChr*GOiSrnXjQ,G%k5XTEkl'cGlMp2Jm/HDOmeQ>LnGDbJ +o)&%Vo_8%VpAOa]q#1$dqY9scr;6H\rdk*#s6fo;~> +JcC<$JcD2=nc&IbrVZNhrqcWir:ps5O(;rS[_5s5*_1!o2PbrS%;)s4I;%!nPoPrm^tss3gno!mo9>rltPhbl5cib/qcHaN)=" +`Ab`Q_SX.)^V@Lr]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-X/`2!W2HPjV50o^U7n9RT:_^HSXf\K +!LfGUQiWP>rg!MJ!0dDF!g/S+rf@)>!0-r9s,-l7rJCQ1s+gQ-s+UH*rIb-%rdjuts*t&tr-eTm +rd4Tis*=TgrHJ9bs)n9^s)\3\r,MaUs)7gQs)%aOr+l:HrFu%?q.K,-oOm<"ph0A6hdu[srFbt? +rb;@HqeQ1Irb_LLrbqaSp2ThIl>uQ=rH8'^r-/0crd"Khs*OcnrdFfq!.Xuus+(0%rdt6)L&Qf= +LPUbCM2I4LN/WaVNfT6_OHKO*!gAk5rfmPNQ^@]=s-`nUrLVf]tV7r^qmn)_o0O5`lH0AaihlO +c-FV\d*^7he'umtf@S[.rn7n;gtgfChr*GOiSrnXjQ,G%k5XTEkl'cGlMp2Jm/HDOmeQ>LnGDbJ +o)&%Vo_8%VpAOa]q#1$dqY9scr;6H\rdk*#s6fo;~> +JcC<$JcD2=nc&IbrVZNhrqcWir:ps5O(;rS[_5s5*_1!o2PbrS%;)s4I;%!nPoPrm^tss3gno!mo9>rltPhbl5cib/qcHaN)=" +`Ab`Q_SX.)^V@Lr]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-X/`2!W2HPjV50o^U7n9RT:_^HSXf\K +!LfGUQiWP>rg!MJ!0dDF!g/S+rf@)>!0-r9s,-l7rJCQ1s+gQ-s+UH*rIb-%rdjuts*t&tr-eTm +rd4Tis*=TgrHJ9bs)n9^s)\3\r,MaUs)7gQs)%aOr+l:HrFu%?q.K,-oOm<"ph0A6hdu[srFbt? +rb;@HqeQ1Irb_LLrbqaSp2ThIl>uQ=rH8'^r-/0crd"Khs*OcnrdFfq!.Xuus+(0%rdt6)L&Qf= +LPUbCM2I4LN/WaVNfT6_OHKO*!gAk5rfmPNQ^@]=s-`nUrLVf]tV7r^qmn)_o0O5`lH0AaihlO +c-FV\d*^7he'umtf@S[.rn7n;gtgfChr*GOiSrnXjQ,G%k5XTEkl'cGlMp2Jm/HDOmeQ>LnGDbJ +o)&%Vo_8%VpAOa]q#1$dqY9scr;6H\rdk*#s6fo;~> +JcC<$JcD/rg!MJ!0dDFs,d;CrJq#?NK*prs,6o7rJCQ1s+gN,s+UK+r.G$$s+1)us*t#srI+]n +rd4Tis*=WhrHJ6as)n9^s)\3\rGhgUs)7gQs)%aOqeQ1GrFtn;mUsp\q.KJ7l=Kj)r+Gh=rb;@H +qeQ1Irb_OMrGV[Spi61OpN,;8r,qs]qfi'brd"Hgs*F`nrI"`rIt.HJ#D%JYK7ei1L&Qf-LPYqd +!K)g7Mueourf7;GOcbfiPEV71Q2d-MQid@hVuEXo +WVrjsX8f:"XoGO(YPtd+YlM*/ZNdeE[C3NQ\Gj#m]">Vf]tV7r^qmn)_o0O5`lH0Aai_fMbg+M[ +d*^7he'umtf%8O+g"P07gtgfChu;O +JcC<$JcD/rg!MJ!0dDFs,d;CrJq#?NK*prs,6o7rJCQ1s+gN,s+UK+r.G$$s+1)us*t#srI+]n +rd4Tis*=WhrHJ6as)n9^s)\3\rGhgUs)7gQs)%aOqeQ1GrFtn;mUsp\q.KJ7l=Kj)r+Gh=rb;@H +qeQ1Irb_OMrGV[Spi61OpN,;8r,qs]qfi'brd"Hgs*F`nrI"`rIt.HJ#D%JYK7ei1L&Qf-LPYqd +!K)g7Mueourf7;GOcbfiPEV71Q2d-MQid@hVuEXo +WVrjsX8f:"XoGO(YPtd+YlM*/ZNdeE[C3NQ\Gj#m]">Vf]tV7r^qmn)_o0O5`lH0Aai_fMbg+M[ +d*^7he'umtf%8O+g"P07gtgfChu;O +JcC<$JcD/rg!MJ!0dDFs,d;CrJq#?NK*prs,6o7rJCQ1s+gN,s+UK+r.G$$s+1)us*t#srI+]n +rd4Tis*=WhrHJ6as)n9^s)\3\rGhgUs)7gQs)%aOqeQ1GrFtn;mUsp\q.KJ7l=Kj)r+Gh=rb;@H +qeQ1Irb_OMrGV[Spi61OpN,;8r,qs]qfi'brd"Hgs*F`nrI"`rIt.HJ#D%JYK7ei1L&Qf-LPYqd +!K)g7Mueourf7;GOcbfiPEV71Q2d-MQid@hVuEXo +WVrjsX8f:"XoGO(YPtd+YlM*/ZNdeE[C3NQ\Gj#m]">Vf]tV7r^qmn)_o0O5`lH0Aai_fMbg+M[ +d*^7he'umtf%8O+g"P07gtgfChu;O +JcC<$JcD/rg!MJ!0dDFs,m>Crf@)>s,I#:s,6o7rJCQ1s+gN,s+UK+r.G$$s+1)us*t#srI+]n +s*OZis*=WhrHJ9bs)n9^s)\3\r,MaUs)7gQrb_XNqeQ.Fqe=_sl=oa$ph/`$qe,_[:gVuEXoWVidq +X8f:"XoGO(YPk[,Z*L\7ZN7G@rjDj:\Gj#i]">Vf]tV7r^qmk(_Sa@3`lH0Aai_fMbg"GYcd:(e +daZdsf%8O+g"P07h#?+5hV[8LiSsjs!T`AAk5XTEkl'`IlKdd6m/QJPmecJOnGMhKo(qtTo_.tU +pAF[[q#1$dqY0mbr;6H\rdk*#s6Tc9~> +JcC<$JcD/rg!MJ!0dDFs,m>Crf@)>s,I#:s,6o7rJCQ1s+gN,s+UK+r.G$$s+1)us*t#srI+]n +s*OZis*=WhrHJ9bs)n9^s)\3\r,MaUs)7gQrb_XNqeQ.Fqe=_sl=oa$ph/`$qe,_[:gVuEXoWVidq +X8f:"XoGO(YPk[,Z*L\7ZN7G@rjDj:\Gj#i]">Vf]tV7r^qmk(_Sa@3`lH0Aai_fMbg"GYcd:(e +daZdsf%8O+g"P07h#?+5hV[8LiSsjs!T`AAk5XTEkl'`IlKdd6m/QJPmecJOnGMhKo(qtTo_.tU +pAF[[q#1$dqY0mbr;6H\rdk*#s6Tc9~> +JcC<$JcD/rg!MJ!0dDFs,m>Crf@)>s,I#:s,6o7rJCQ1s+gN,s+UK+r.G$$s+1)us*t#srI+]n +s*OZis*=WhrHJ9bs)n9^s)\3\r,MaUs)7gQrb_XNqeQ.Fqe=_sl=oa$ph/`$qe,_[:gVuEXoWVidq +X8f:"XoGO(YPk[,Z*L\7ZN7G@rjDj:\Gj#i]">Vf]tV7r^qmk(_Sa@3`lH0Aai_fMbg"GYcd:(e +daZdsf%8O+g"P07h#?+5hV[8LiSsjs!T`AAk5XTEkl'`IlKdd6m/QJPmecJOnGMhKo(qtTo_.tU +pAF[[q#1$dqY0mbr;6H\rdk*#s6Tc9~> +JcC<$JcD,;nc&IbrVZNhrqcWir:p +S!ob5rg3_QQN!0LPlHsHOogc-OSt7?NW>(;N;nh9MZ&D2M#W8/LAuu,K`-Q&K)^E#JH(,uIf4]p +I/eQlHN/9jGl;jdG5l^_FT6F^ErC"WE;skSDZ4MPD#%lECADT5B_#m(CA2H4B_H*5B(os4B`;`E +CAVfGD#S;KDZ4SRE;FSQEr:"HFR=5IG5-:\GlE!dHN/?lI/SHpIXckHJ-(:RK)UB'KSBD[(5I^% +M2@+JMid@gVuEXn +WVidqX8f:"XoGR(YPk[,Z*L\7Zi@B4[JmT8\%)FJ"hM=Y]Y2&Y^GisE_SX4/`Poj;aN2KHbKS5V +cHjkbdF-LneCE.%f@\d1g=tE=h;7&Ii8N\Tj5]4^jlY^gkNMm/!p]+;rTsONs6fdQrUBdUp@A(O +qXjFQr:^'_q"Xd_r;-3cqu$?imf%e;JcG'9J,~> +JcC<$JcD,;nc&IbrVZNhrqcWir:p +S!ob5rg3_QQN!0LPlHsHOogc-OSt7?NW>(;N;nh9MZ&D2M#W8/LAuu,K`-Q&K)^E#JH(,uIf4]p +I/eQlHN/9jGl;jdG5l^_FT6F^ErC"WE;skSDZ4MPD#%lECADT5B_#m(CA2H4B_H*5B(os4B`;`E +CAVfGD#S;KDZ4SRE;FSQEr:"HFR=5IG5-:\GlE!dHN/?lI/SHpIXckHJ-(:RK)UB'KSBD[(5I^% +M2@+JMid@gVuEXn +WVidqX8f:"XoGR(YPk[,Z*L\7Zi@B4[JmT8\%)FJ"hM=Y]Y2&Y^GisE_SX4/`Poj;aN2KHbKS5V +cHjkbdF-LneCE.%f@\d1g=tE=h;7&Ii8N\Tj5]4^jlY^gkNMm/!p]+;rTsONs6fdQrUBdUp@A(O +qXjFQr:^'_q"Xd_r;-3cqu$?imf%e;JcG'9J,~> +JcC<$JcD,;nc&IbrVZNhrqcWir:p +S!ob5rg3_QQN!0LPlHsHOogc-OSt7?NW>(;N;nh9MZ&D2M#W8/LAuu,K`-Q&K)^E#JH(,uIf4]p +I/eQlHN/9jGl;jdG5l^_FT6F^ErC"WE;skSDZ4MPD#%lECADT5B_#m(CA2H4B_H*5B(os4B`;`E +CAVfGD#S;KDZ4SRE;FSQEr:"HFR=5IG5-:\GlE!dHN/?lI/SHpIXckHJ-(:RK)UB'KSBD[(5I^% +M2@+JMid@gVuEXn +WVidqX8f:"XoGR(YPk[,Z*L\7Zi@B4[JmT8\%)FJ"hM=Y]Y2&Y^GisE_SX4/`Poj;aN2KHbKS5V +cHjkbdF-LneCE.%f@\d1g=tE=h;7&Ii8N\Tj5]4^jlY^gkNMm/!p]+;rTsONs6fdQrUBdUp@A(O +qXjFQr:^'_q"Xd_r;-3cqu$?imf%e;JcG'9J,~> +JcC<$JcD,;nc&Ibr;?EgrqcWir:p+f\$/S!nPoPrm^ts!7Lko&CAbLcHa\Zbfe2Pb/q`Ga2\+t +-,d^<_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Yck43XfSS'Wi;rrVZiroUnjc[rh0@cTDkD_SXf\K +!h,OFrg3bRQBqN8!gJn4rf[;Ds,d5@s,R,=rJ^c7s,-c3reUT0rJ(<*s+L?'rdt0$rIFots*jlo +s*XinrHeKhs*4Kds*"EbrH/'\s)S$Wrc%mUqelCMrbV=EpM0D9n7q<*pM0M-(JqAW-KS5'YL&m'creUZ5 +MuJY9NK4"!!K`HCOo^c2rfmPNQ^@]=!L]DTRf]+NSc55\TDtS^U&UkdU\pqdV>d@gVuioB([jQ6C'!pAe2rojLLlg+N9s6]jSqsXORrUKXQqXaRU +oC`"Sr:fs\rV?Bfp\Xjcqu,s^JcC<$lMlA~> +JcC<$JcD,;nc&Ibr;?EgrqcWir:p+f\$/S!nPoPrm^ts!7Lko&CAbLcHa\Zbfe2Pb/q`Ga2\+t +-,d^<_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Yck43XfSS'Wi;rrVZiroUnjc[rh0@cTDkD_SXf\K +!h,OFrg3bRQBqN8!gJn4rf[;Ds,d5@s,R,=rJ^c7s,-c3reUT0rJ(<*s+L?'rdt0$rIFots*jlo +s*XinrHeKhs*4Kds*"EbrH/'\s)S$Wrc%mUqelCMrbV=EpM0D9n7q<*pM0M-(JqAW-KS5'YL&m'creUZ5 +MuJY9NK4"!!K`HCOo^c2rfmPNQ^@]=!L]DTRf]+NSc55\TDtS^U&UkdU\pqdV>d@gVuioB([jQ6C'!pAe2rojLLlg+N9s6]jSqsXORrUKXQqXaRU +oC`"Sr:fs\rV?Bfp\Xjcqu,s^JcC<$lMlA~> +JcC<$JcD,;nc&Ibr;?EgrqcWir:p+f\$/S!nPoPrm^ts!7Lko&CAbLcHa\Zbfe2Pb/q`Ga2\+t +-,d^<_SO%&^V7Co]Xtbc\[],W[^EKKZa-j?Yck43XfSS'Wi;rrVZiroUnjc[rh0@cTDkD_SXf\K +!h,OFrg3bRQBqN8!gJn4rf[;Ds,d5@s,R,=rJ^c7s,-c3reUT0rJ(<*s+L?'rdt0$rIFots*jlo +s*XinrHeKhs*4Kds*"EbrH/'\s)S$Wrc%mUqelCMrbV=EpM0D9n7q<*pM0M-(JqAW-KS5'YL&m'creUZ5 +MuJY9NK4"!!K`HCOo^c2rfmPNQ^@]=!L]DTRf]+NSc55\TDtS^U&UkdU\pqdV>d@gVuioB([jQ6C'!pAe2rojLLlg+N9s6]jSqsXORrUKXQqXaRU +oC`"Sr:fs\rV?Bfp\Xjcqu,s^JcC<$lMlA~> +JcC<$JcD,;nG`@arVZNhrqcWir:p9cs7ZEarq-6^rUU!Ys7$$Vs6fpSrTsRMs6BRIs60LGrT=.A +s5a.=s5O(;r8@V4s5*_1s4mY/rS%;)!8.8%s4.2#rm^ts!7Lko$dd5GcHa\Ybfe2Pao9@)a2Z*; +`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^XAr-83dqg/6gs*Xcns*jutrdb$"!.t3&#D@ebL5(J=M#N53MMqIm&<2^2 +O-#HcP*2#mPa.N"QC%T +JcC<$JcD,;nG`@arVZNhrqcWir:p9cs7ZEarq-6^rUU!Ys7$$Vs6fpSrTsRMs6BRIs60LGrT=.A +s5a.=s5O(;r8@V4s5*_1s4mY/rS%;)!8.8%s4.2#rm^ts!7Lko$dd5GcHa\Ybfe2Pao9@)a2Z*; +`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^XAr-83dqg/6gs*Xcns*jutrdb$"!.t3&#D@ebL5(J=M#N53MMqIm&<2^2 +O-#HcP*2#mPa.N"QC%T +JcC<$JcD,;nG`@arVZNhrqcWir:p9cs7ZEarq-6^rUU!Ys7$$Vs6fpSrTsRMs6BRIs60LGrT=.A +s5a.=s5O(;r8@V4s5*_1s4mY/rS%;)!8.8%s4.2#rm^ts!7Lko$dd5GcHa\Ybfe2Pao9@)a2Z*; +`5BI/_8*h#^:h1l]=PP`\@8oT[C!9HZE^XAr-83dqg/6gs*Xcns*jutrdb$"!.t3&#D@ebL5(J=M#N53MMqIm&<2^2 +O-#HcP*2#mPa.N"QC%T +JcC<$JcD):nc&Ibr;?EgrqcWir:p9cs7ZEas7H<^rUU!Ys7$!Us6fpSrp9[Ns6BRIs60LGr9"%@ +s5a.=s5O%:rS[_5s5*_1s4mY/rS%;)!8.8%!nPoPrmV"udaJ-B!RT0lc2l26rl[IIaiMQD`l5p8 +_o'@._8*h#^:h1l]=PP`\@8oT[C!9HZE^Xd@hVuL& +YPk^*Z2_-.ZN@MA[JmW7[fEr;\H]XW]=bei^Abl,^qmn)_o0O5`lH0Aai_fMbg"GYcd:(edaQ^q +e^i@(f\,!4gYCW@hV[8LiSieVj5f=`k2tjikl0fJlKdd7m/QJQmelPRnGVnQo)/+Uo^_\OpA=UX +q#'scqY'g`r;6H[rdk*#s69Q6~> +JcC<$JcD):nc&Ibr;?EgrqcWir:p9cs7ZEas7H<^rUU!Ys7$!Us6fpSrp9[Ns6BRIs60LGr9"%@ +s5a.=s5O%:rS[_5s5*_1s4mY/rS%;)!8.8%!nPoPrmV"udaJ-B!RT0lc2l26rl[IIaiMQD`l5p8 +_o'@._8*h#^:h1l]=PP`\@8oT[C!9HZE^Xd@hVuL& +YPk^*Z2_-.ZN@MA[JmW7[fEr;\H]XW]=bei^Abl,^qmn)_o0O5`lH0Aai_fMbg"GYcd:(edaQ^q +e^i@(f\,!4gYCW@hV[8LiSieVj5f=`k2tjikl0fJlKdd7m/QJQmelPRnGVnQo)/+Uo^_\OpA=UX +q#'scqY'g`r;6H[rdk*#s69Q6~> +JcC<$JcD):nc&Ibr;?EgrqcWir:p9cs7ZEas7H<^rUU!Ys7$!Us6fpSrp9[Ns6BRIs60LGr9"%@ +s5a.=s5O%:rS[_5s5*_1s4mY/rS%;)!8.8%!nPoPrmV"udaJ-B!RT0lc2l26rl[IIaiMQD`l5p8 +_o'@._8*h#^:h1l]=PP`\@8oT[C!9HZE^Xd@hVuL& +YPk^*Z2_-.ZN@MA[JmW7[fEr;\H]XW]=bei^Abl,^qmn)_o0O5`lH0Aai_fMbg"GYcd:(edaQ^q +e^i@(f\,!4gYCW@hV[8LiSieVj5f=`k2tjikl0fJlKdd7m/QJQmelPRnGVnQo)/+Uo^_\OpA=UX +q#'scqY'g`r;6H[rdk*#s69Q6~> +JcC<$JcD):nG`@arVZNhrVHNhr:p&!nPoPrmVM.daHOjd*U+acHXVXbKJ&Mrl@:D`l5p8 +_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-XK/A$WMl_mVPU,bUnaZYTqS-OT:VXFSXf\K +s-`qUrg<_Ps-EYLs-3PIrf[;Ds,d2?s,R,=r/CZ6s,-c3reUT0rJ(?+s+L<&s+:9%rIFots*jop +s*Xinrd+Tis*4Hcs*"EbrH/$[s)S$Wrc%gSq/6(Hhe_[spMBG:qJ,)*r+c%CrG;IMqelFPrc%aS +rc8!ZqK2[Yr-%LPms+\Spj2pdrd=Wls*jutrI=s#JqEuSs+CB+re:H/M#N53MMqIm!KE-=Nrb?) +rfR;GPl?pKQC%Td@iVuEXnWVWXoX8T-rXo>L'YPbX( +Z2_-.Zi@B4[JdN8\%&sI\H0:Rrk&9F^AbkN^qmn)_o2Pn*6-%?aN;TJbKS5VcHjkbdF-Lne^i@( +f\,!4gYDea&)Q4%i8N\Uj5f:_k2tjikl0iHl2^/Km/QJQmeuVRnG_tSo)/+Vo^_\OpA4OVq#'sb +qY'g`r;6H[rdk*#s60K5~> +JcC<$JcD):nG`@arVZNhrVHNhr:p&!nPoPrmVM.daHOjd*U+acHXVXbKJ&Mrl@:D`l5p8 +_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-XK/A$WMl_mVPU,bUnaZYTqS-OT:VXFSXf\K +s-`qUrg<_Ps-EYLs-3PIrf[;Ds,d2?s,R,=r/CZ6s,-c3reUT0rJ(?+s+L<&s+:9%rIFots*jop +s*Xinrd+Tis*4Hcs*"EbrH/$[s)S$Wrc%gSq/6(Hhe_[spMBG:qJ,)*r+c%CrG;IMqelFPrc%aS +rc8!ZqK2[Yr-%LPms+\Spj2pdrd=Wls*jutrI=s#JqEuSs+CB+re:H/M#N53MMqIm!KE-=Nrb?) +rfR;GPl?pKQC%Td@iVuEXnWVWXoX8T-rXo>L'YPbX( +Z2_-.Zi@B4[JdN8\%&sI\H0:Rrk&9F^AbkN^qmn)_o2Pn*6-%?aN;TJbKS5VcHjkbdF-Lne^i@( +f\,!4gYDea&)Q4%i8N\Uj5f:_k2tjikl0iHl2^/Km/QJQmeuVRnG_tSo)/+Vo^_\OpA4OVq#'sb +qY'g`r;6H[rdk*#s60K5~> +JcC<$JcD):nG`@arVZNhrVHNhr:p&!nPoPrmVM.daHOjd*U+acHXVXbKJ&Mrl@:D`l5p8 +_ns:,^q[Xu]tD"i]",A]\$i`Q['R*EZ*:I9Y-"h-XK/A$WMl_mVPU,bUnaZYTqS-OT:VXFSXf\K +s-`qUrg<_Ps-EYLs-3PIrf[;Ds,d2?s,R,=r/CZ6s,-c3reUT0rJ(?+s+L<&s+:9%rIFots*jop +s*Xinrd+Tis*4Hcs*"EbrH/$[s)S$Wrc%gSq/6(Hhe_[spMBG:qJ,)*r+c%CrG;IMqelFPrc%aS +rc8!ZqK2[Yr-%LPms+\Spj2pdrd=Wls*jutrI=s#JqEuSs+CB+re:H/M#N53MMqIm!KE-=Nrb?) +rfR;GPl?pKQC%Td@iVuEXnWVWXoX8T-rXo>L'YPbX( +Z2_-.Zi@B4[JdN8\%&sI\H0:Rrk&9F^AbkN^qmn)_o2Pn*6-%?aN;TJbKS5VcHjkbdF-Lne^i@( +f\,!4gYDea&)Q4%i8N\Uj5f:_k2tjikl0iHl2^/Km/QJQmeuVRnG_tSo)/+Vo^_\OpA4OVq#'sb +qY'g`r;6H[rdk*#s60K5~> +JcC<$JcD&9nc&FarVZNhrqcWiqtU3crq?<`s7H<^rUU!Ys7$!Us6fpSrTsRMs6BOHs60LGrT=+@ +s5a.=ro3t:rS[_5rndV0s4dV/rS%;)!8.8%!nPoPrmUttdf.Vpd*M^:!R8jfb;7;_aN2EA`Pod5 +_SX.)^V@Lr]Y(kf\[f5Z[^NTN['R*EZ*:I9Y-"h-X/`2!WMl_mVPX9f#G\#fTqS-PTDkD`SXc5L +Rf]%HRJrTRQN3?MQ2d*KPPp[EOT:L@O8k7?NW"h9MuS\4M>rD3L])u-L&Zi(KE$Q'Jc:3"J,aur +IK+]pHi89jH2i-fGQ2jdFo6@]F8g4WEW0qUDt\)-DJ)?C\DNS5MDuO_R +EW1"XF8L(XFo?LVGP6:MH1ZF]HiAEiIK+crJ,OotJH1<#K)pXZreCH.!/UW2!K)g7N#I\9O,oBa +OcklkPa%GuQC!r*R$jD3S"#qmFjVuEXoWV`^oX8T-rXo>L%YPbX( +Z2_-.Zi@E4[JdN8\%&sI\H9@S]DfGD]tXK\1VgiD_Sa=1`Poj;aN2KGbKJ,ScHab_dF$CkeC<%" +f@S[.g=k<:h;-rFi8ESRioB([jo4BCkNMp0s69UMrTsROs6fjSs7$$XqXXUVr:KRQq=a[Zo_A@[ +qtg$`qu$ +JcC<$JcD&9nc&FarVZNhrqcWiqtU3crq?<`s7H<^rUU!Ys7$!Us6fpSrTsRMs6BOHs60LGrT=+@ +s5a.=ro3t:rS[_5rndV0s4dV/rS%;)!8.8%!nPoPrmUttdf.Vpd*M^:!R8jfb;7;_aN2EA`Pod5 +_SX.)^V@Lr]Y(kf\[f5Z[^NTN['R*EZ*:I9Y-"h-X/`2!WMl_mVPX9f#G\#fTqS-PTDkD`SXc5L +Rf]%HRJrTRQN3?MQ2d*KPPp[EOT:L@O8k7?NW"h9MuS\4M>rD3L])u-L&Zi(KE$Q'Jc:3"J,aur +IK+]pHi89jH2i-fGQ2jdFo6@]F8g4WEW0qUDt\)-DJ)?C\DNS5MDuO_R +EW1"XF8L(XFo?LVGP6:MH1ZF]HiAEiIK+crJ,OotJH1<#K)pXZreCH.!/UW2!K)g7N#I\9O,oBa +OcklkPa%GuQC!r*R$jD3S"#qmFjVuEXoWV`^oX8T-rXo>L%YPbX( +Z2_-.Zi@E4[JdN8\%&sI\H9@S]DfGD]tXK\1VgiD_Sa=1`Poj;aN2KGbKJ,ScHab_dF$CkeC<%" +f@S[.g=k<:h;-rFi8ESRioB([jo4BCkNMp0s69UMrTsROs6fjSs7$$XqXXUVr:KRQq=a[Zo_A@[ +qtg$`qu$ +JcC<$JcD&9nc&FarVZNhrqcWiqtU3crq?<`s7H<^rUU!Ys7$!Us6fpSrTsRMs6BOHs60LGrT=+@ +s5a.=ro3t:rS[_5rndV0s4dV/rS%;)!8.8%!nPoPrmUttdf.Vpd*M^:!R8jfb;7;_aN2EA`Pod5 +_SX.)^V@Lr]Y(kf\[f5Z[^NTN['R*EZ*:I9Y-"h-X/`2!WMl_mVPX9f#G\#fTqS-PTDkD`SXc5L +Rf]%HRJrTRQN3?MQ2d*KPPp[EOT:L@O8k7?NW"h9MuS\4M>rD3L])u-L&Zi(KE$Q'Jc:3"J,aur +IK+]pHi89jH2i-fGQ2jdFo6@]F8g4WEW0qUDt\)-DJ)?C\DNS5MDuO_R +EW1"XF8L(XFo?LVGP6:MH1ZF]HiAEiIK+crJ,OotJH1<#K)pXZreCH.!/UW2!K)g7N#I\9O,oBa +OcklkPa%GuQC!r*R$jD3S"#qmFjVuEXoWV`^oX8T-rXo>L%YPbX( +Z2_-.Zi@E4[JdN8\%&sI\H9@S]DfGD]tXK\1VgiD_Sa=1`Poj;aN2KGbKJ,ScHab_dF$CkeC<%" +f@S[.g=k<:h;-rFi8ESRioB([jo4BCkNMp0s69UMrTsROs6fjSs7$$XqXXUVr:KRQq=a[Zo_A@[ +qtg$`qu$ +JcC<$JcD&9nG`@arVZKgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!Us6fpSr9XILs6BRIs60IFrT=+@ +s5a+CrK$u=s,Hu9s,6l6rJCQ1s+gQ-s+UK+rIb-%s+1-!s*t&t +rI+]n!.4Zjs*=Whr-/0as)n6]s)\0[qJlIQr,98dqJH+Gn8%]3o5";@rGDFLrbqdTqf2UUs)\'Z +rH8*_pilU[om,_Hr-SBiqgJHms*suts+13%rdt9*Kn]M\'o.U$M2@+IMi +JcC<$JcD&9nG`@arVZKgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!Us6fpSr9XILs6BRIs60IFrT=+@ +s5a+CrK$u=s,Hu9s,6l6rJCQ1s+gQ-s+UK+rIb-%s+1-!s*t&t +rI+]n!.4Zjs*=Whr-/0as)n6]s)\0[qJlIQr,98dqJH+Gn8%]3o5";@rGDFLrbqdTqf2UUs)\'Z +rH8*_pilU[om,_Hr-SBiqgJHms*suts+13%rdt9*Kn]M\'o.U$M2@+IMi +JcC<$JcD&9nG`@arVZKgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!Us6fpSr9XILs6BRIs60IFrT=+@ +s5a+CrK$u=s,Hu9s,6l6rJCQ1s+gQ-s+UK+rIb-%s+1-!s*t&t +rI+]n!.4Zjs*=Whr-/0as)n6]s)\0[qJlIQr,98dqJH+Gn8%]3o5";@rGDFLrbqdTqf2UUs)\'Z +rH8*_pilU[om,_Hr-SBiqgJHms*suts+13%rdt9*Kn]M\'o.U$M2@+IMi +JcC<$JcD#8nc&FarVZKgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!UrpKgRrTsRMrp'IHs60IFrT=+@ +s5a+CrK$u=s,Hu9repf6rJCQ1s+gQ-s+UK+rIb-%s+1-!!e5ZJ +rI+]ns*O]js*=WhrHJ6as)n6]rcA'Zq/Q=Oq/>S:j_s[,qec1GiG8@-rGDCKrbqdTr,M^Vrc@sY +rcS3`qKMj^qg%7Kq0W!dqL/?ls*srss+13%re(6(!/:E,s+^T1reUZ5MuJY9NK4"!!K`HCOqj1F +Q'IZ$Q^F/.R[T_8S=Q4BStDXJrh9@d!2KLgs.o^mr29Rns/Gmqri?%"qQ9_!rNH(%riuI.r3QF1 +rjD^5s0i! +JcC<$JcD#8nc&FarVZKgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!UrpKgRrTsRMrp'IHs60IFrT=+@ +s5a+CrK$u=s,Hu9repf6rJCQ1s+gQ-s+UK+rIb-%s+1-!!e5ZJ +rI+]ns*O]js*=WhrHJ6as)n6]rcA'Zq/Q=Oq/>S:j_s[,qec1GiG8@-rGDCKrbqdTr,M^Vrc@sY +rcS3`qKMj^qg%7Kq0W!dqL/?ls*srss+13%re(6(!/:E,s+^T1reUZ5MuJY9NK4"!!K`HCOqj1F +Q'IZ$Q^F/.R[T_8S=Q4BStDXJrh9@d!2KLgs.o^mr29Rns/Gmqri?%"qQ9_!rNH(%riuI.r3QF1 +rjD^5s0i! +JcC<$JcD#8nc&FarVZKgrqcWir:p9cs7ZB`s7H?_r:9mXs7$!UrpKgRrTsRMrp'IHs60IFrT=+@ +s5a+CrK$u=s,Hu9repf6rJCQ1s+gQ-s+UK+rIb-%s+1-!!e5ZJ +rI+]ns*O]js*=WhrHJ6as)n6]rcA'Zq/Q=Oq/>S:j_s[,qec1GiG8@-rGDCKrbqdTr,M^Vrc@sY +rcS3`qKMj^qg%7Kq0W!dqL/?ls*srss+13%re(6(!/:E,s+^T1reUZ5MuJY9NK4"!!K`HCOqj1F +Q'IZ$Q^F/.R[T_8S=Q4BStDXJrh9@d!2KLgs.o^mr29Rns/Gmqri?%"qQ9_!rNH(%riuI.r3QF1 +rjD^5s0i! +JcC<$JcD#8nG`@ar;?EgrVHNhr:p9cs7ZB`s7H<^rUU!Yrp]mTs6fpSr9XILs6BOHs60IFr9"%@ +roF%`Pf[2 +_SO%&^V7Co]Xtbc\[]-J[L'@KZa6sBYct=6riHR0X/`2!W2QVlVP^3hU]I6brh9@b!2'7^s.01[ +rgWqVs-`kRs-NbOrK[DIs-*DEs,m>CrK$u=rf-l8s,6o7rJCQ1s+gQ-s+UK+rIY0'JV!cMs*t&t +rI+]n!.4Zjrd"NgrHJ6as)n3\rcA'ZpMotIn8I9)q/>nCqJH%En8%l:r,)7IrbqdTqf2UUs)\'Z +rcS3`qfi!`r-@jZmsFhWpO3!hrdXlsrdk*$re(6(s+UH,#D\+kM2@+IMuJY9NK4"!$BUC5P*;,p +Q'IZ%rg3_SRf8cWS=TYN#G7Z^TqS3TU]$tiV5C-gVuN^qWVidqX8f9tXo5F%YPGF%Z2M!*Zi@E3 +[JdQ6\,Wu:\c95@]DfJC]`>eG^F[1:_8=(,`5KX6`lH0Aai_cLbKS5VcHjkbdF-LneCE.%f@\d1 +g=tE=h;7&gi!&*!j5]4^roO7Ekl0iHl2^/Lm/QJQmf)\SnGi%Vo)A7Zo_8%SpA+IPq"jg`qXj[^ +r;-BYrdk*#s5a31~> +JcC<$JcD#8nG`@ar;?EgrVHNhr:p9cs7ZB`s7H<^rUU!Yrp]mTs6fpSr9XILs6BOHs60IFr9"%@ +roF%`Pf[2 +_SO%&^V7Co]Xtbc\[]-J[L'@KZa6sBYct=6riHR0X/`2!W2QVlVP^3hU]I6brh9@b!2'7^s.01[ +rgWqVs-`kRs-NbOrK[DIs-*DEs,m>CrK$u=rf-l8s,6o7rJCQ1s+gQ-s+UK+rIY0'JV!cMs*t&t +rI+]n!.4Zjrd"NgrHJ6as)n3\rcA'ZpMotIn8I9)q/>nCqJH%En8%l:r,)7IrbqdTqf2UUs)\'Z +rcS3`qfi!`r-@jZmsFhWpO3!hrdXlsrdk*$re(6(s+UH,#D\+kM2@+IMuJY9NK4"!$BUC5P*;,p +Q'IZ%rg3_SRf8cWS=TYN#G7Z^TqS3TU]$tiV5C-gVuN^qWVidqX8f9tXo5F%YPGF%Z2M!*Zi@E3 +[JdQ6\,Wu:\c95@]DfJC]`>eG^F[1:_8=(,`5KX6`lH0Aai_cLbKS5VcHjkbdF-LneCE.%f@\d1 +g=tE=h;7&gi!&*!j5]4^roO7Ekl0iHl2^/Lm/QJQmf)\SnGi%Vo)A7Zo_8%SpA+IPq"jg`qXj[^ +r;-BYrdk*#s5a31~> +JcC<$JcD#8nG`@ar;?EgrVHNhr:p9cs7ZB`s7H<^rUU!Yrp]mTs6fpSr9XILs6BOHs60IFr9"%@ +roF%`Pf[2 +_SO%&^V7Co]Xtbc\[]-J[L'@KZa6sBYct=6riHR0X/`2!W2QVlVP^3hU]I6brh9@b!2'7^s.01[ +rgWqVs-`kRs-NbOrK[DIs-*DEs,m>CrK$u=rf-l8s,6o7rJCQ1s+gQ-s+UK+rIY0'JV!cMs*t&t +rI+]n!.4Zjrd"NgrHJ6as)n3\rcA'ZpMotIn8I9)q/>nCqJH%En8%l:r,)7IrbqdTqf2UUs)\'Z +rcS3`qfi!`r-@jZmsFhWpO3!hrdXlsrdk*$re(6(s+UH,#D\+kM2@+IMuJY9NK4"!$BUC5P*;,p +Q'IZ%rg3_SRf8cWS=TYN#G7Z^TqS3TU]$tiV5C-gVuN^qWVidqX8f9tXo5F%YPGF%Z2M!*Zi@E3 +[JdQ6\,Wu:\c95@]DfJC]`>eG^F[1:_8=(,`5KX6`lH0Aai_cLbKS5VcHjkbdF-LneCE.%f@\d1 +g=tE=h;7&gi!&*!j5]4^roO7Ekl0iHl2^/Lm/QJQmf)\SnGi%Vo)A7Zo_8%SpA+IPq"jg`qXj[^ +r;-BYrdk*#s5a31~> +JcC<$JcCu7nG`@ar;?EgrqcWiqtU0bs7ZB`s7H<^rUU!Yrp]mTs6fmRrTsOLs6BOHs60IFr9"%@ +roF%+f\$2T!S5g#e-=CMda?Ihci23:c-4ASb/q`Ga2Z*;`5KR1 +_SO%&^V7Co]Xtbc\[],W[^EKKZa-k8YR7S:Xf\\*X/`2!W;`[rVPU-gU]I6brh9@bs.B:^!hGjO +rL3kWR@4#@s-NbOrK[DIs-*DEs,m>Cr/^l +JcC<$JcCu7nG`@ar;?EgrqcWiqtU0bs7ZB`s7H<^rUU!Yrp]mTs6fmRrTsOLs6BOHs60IFr9"%@ +roF%+f\$2T!S5g#e-=CMda?Ihci23:c-4ASb/q`Ga2Z*;`5KR1 +_SO%&^V7Co]Xtbc\[],W[^EKKZa-k8YR7S:Xf\\*X/`2!W;`[rVPU-gU]I6brh9@bs.B:^!hGjO +rL3kWR@4#@s-NbOrK[DIs-*DEs,m>Cr/^l +JcC<$JcCu7nG`@ar;?EgrqcWiqtU0bs7ZB`s7H<^rUU!Yrp]mTs6fmRrTsOLs6BOHs60IFr9"%@ +roF%+f\$2T!S5g#e-=CMda?Ihci23:c-4ASb/q`Ga2Z*;`5KR1 +_SO%&^V7Co]Xtbc\[],W[^EKKZa-k8YR7S:Xf\\*X/`2!W;`[rVPU-gU]I6brh9@bs.B:^!hGjO +rL3kWR@4#@s-NbOrK[DIs-*DEs,m>Cr/^l +JcC<$JcCu7nG`=`rVZKgrqcWiqtU3crq?9_s7H<^rUTsXs7#sTs6fpSr9XILrp'FGs60IFr9""? +s5a+cd'h\bfe2Pb/q`Ga2Z*;`5BI/ +_8*h#^:h1l]=PP`\@8oT[C#q>"gYD;Yck5/XT>N(ri-!uW;`[rVPU-gU]RNrP+;N;nh9MZ&D3L]E5/LAuu-K`-N)Jq8LOJH(-! +If4]pI/eQlHN/9jGl)^bG5cX[FT$:WEl)hnE;OSEDXVH8DZ+MQE;OYSErL.XFT-F^G5HL_GlE!a +HM`'bI-#eRIf4cmJGt-"K)L?%K`?c*LB!&/M#W>3M?&S6Mueourf7)AOoCLNPE_>tQBml)R$jEB +RfT%Mrgj._T`1VdU8+L_U]RBiVZ*LnW;ijrWrB(!XSf4"Y5YX$Yl1j*ZMCj+[/RK1[f +JcC<$JcCu7nG`=`rVZKgrqcWiqtU3crq?9_s7H<^rUTsXs7#sTs6fpSr9XILrp'FGs60IFr9""? +s5a+cd'h\bfe2Pb/q`Ga2Z*;`5BI/ +_8*h#^:h1l]=PP`\@8oT[C#q>"gYD;Yck5/XT>N(ri-!uW;`[rVPU-gU]RNrP+;N;nh9MZ&D3L]E5/LAuu-K`-N)Jq8LOJH(-! +If4]pI/eQlHN/9jGl)^bG5cX[FT$:WEl)hnE;OSEDXVH8DZ+MQE;OYSErL.XFT-F^G5HL_GlE!a +HM`'bI-#eRIf4cmJGt-"K)L?%K`?c*LB!&/M#W>3M?&S6Mueourf7)AOoCLNPE_>tQBml)R$jEB +RfT%Mrgj._T`1VdU8+L_U]RBiVZ*LnW;ijrWrB(!XSf4"Y5YX$Yl1j*ZMCj+[/RK1[f +JcC<$JcCu7nG`=`rVZKgrqcWiqtU3crq?9_s7H<^rUTsXs7#sTs6fpSr9XILrp'FGs60IFr9""? +s5a+cd'h\bfe2Pb/q`Ga2Z*;`5BI/ +_8*h#^:h1l]=PP`\@8oT[C#q>"gYD;Yck5/XT>N(ri-!uW;`[rVPU-gU]RNrP+;N;nh9MZ&D3L]E5/LAuu-K`-N)Jq8LOJH(-! +If4]pI/eQlHN/9jGl)^bG5cX[FT$:WEl)hnE;OSEDXVH8DZ+MQE;OYSErL.XFT-F^G5HL_GlE!a +HM`'bI-#eRIf4cmJGt-"K)L?%K`?c*LB!&/M#W>3M?&S6Mueourf7)AOoCLNPE_>tQBml)R$jEB +RfT%Mrgj._T`1VdU8+L_U]RBiVZ*LnW;ijrWrB(!XSf4"Y5YX$Yl1j*ZMCj+[/RK1[f +JcC<$JcCr6nG`@ar;?EgrVHNhqtU3crq?9_rq-6^r:9mXs7#sTrpKgRr9XILrp'FGrojCFr9""? +s5a+ +JcC<$JcCr6nG`@ar;?EgrVHNhqtU3crq?9_rq-6^r:9mXs7#sTrpKgRr9XILrp'FGrojCFr9""? +s5a+ +JcC<$JcCr6nG`@ar;?EgrVHNhqtU3crq?9_rq-6^r:9mXs7#sTrpKgRr9XILrp'FGrojCFr9""? +s5a+ +JcC<$JcCr6nG`=`rVZKgrqcThr:p9crq?9_rq-6^r:9mXrp]jSs6fmRr9XILrp'FGroj@Er9"%@ +roF%&@/RFYck44Xf\\*X/`2!WMofo!iDfjrhTRh!2BFc!hc0XrLX%[ +!1a"Ws-itUrL!VOs-ESJs-3PIrK@2Cs,d2?s,R,=rJ^c7!/g`3s+p]1reCH,s+L?'!ePuSrIFot +s*jops*Xinr-JBgrcnmWA/DqJu:LqJc:Lm;Dc=rG_RPrc8!Zr,hp\s*"9`s*4Ng +qKi-frI"9domZF\omm!lrdt$"s+LE+rItB/Lku%es,$f7req5ENfK0]OHGZgP*;.0PmWhDR$a;0 +R[]e:Sc52]T:l1W!MZ@gU]RBiVZ*IpW2ZcqWrK."XSo:$Y5YX%Yl:p,ZMCj*[/IE/[f3c8\GWo: +])TD@]`5\F^AbnI^];4M_?.Wn`;[^V`lJ)"'$8;>bKS5UcHab_dF$CkeC<%"rmqV3g"P07gtgfC +hr*GOir7sBjQ5OdkND(.klL)8rp9[P!:KgSs7$'YrUTsZs7H0\r:^$^nG)eSq"jRYq>C'eli)J8 +JcF[.J,~> +JcC<$JcCr6nG`=`rVZKgrqcThr:p9crq?9_rq-6^r:9mXrp]jSs6fmRr9XILrp'FGroj@Er9"%@ +roF%&@/RFYck44Xf\\*X/`2!WMofo!iDfjrhTRh!2BFc!hc0XrLX%[ +!1a"Ws-itUrL!VOs-ESJs-3PIrK@2Cs,d2?s,R,=rJ^c7!/g`3s+p]1reCH,s+L?'!ePuSrIFot +s*jops*Xinr-JBgrcnmWA/DqJu:LqJc:Lm;Dc=rG_RPrc8!Zr,hp\s*"9`s*4Ng +qKi-frI"9domZF\omm!lrdt$"s+LE+rItB/Lku%es,$f7req5ENfK0]OHGZgP*;.0PmWhDR$a;0 +R[]e:Sc52]T:l1W!MZ@gU]RBiVZ*IpW2ZcqWrK."XSo:$Y5YX%Yl:p,ZMCj*[/IE/[f3c8\GWo: +])TD@]`5\F^AbnI^];4M_?.Wn`;[^V`lJ)"'$8;>bKS5UcHab_dF$CkeC<%"rmqV3g"P07gtgfC +hr*GOir7sBjQ5OdkND(.klL)8rp9[P!:KgSs7$'YrUTsZs7H0\r:^$^nG)eSq"jRYq>C'eli)J8 +JcF[.J,~> +JcC<$JcCr6nG`=`rVZKgrqcThr:p9crq?9_rq-6^r:9mXrp]jSs6fmRr9XILrp'FGroj@Er9"%@ +roF%&@/RFYck44Xf\\*X/`2!WMofo!iDfjrhTRh!2BFc!hc0XrLX%[ +!1a"Ws-itUrL!VOs-ESJs-3PIrK@2Cs,d2?s,R,=rJ^c7!/g`3s+p]1reCH,s+L?'!ePuSrIFot +s*jops*Xinr-JBgrcnmWA/DqJu:LqJc:Lm;Dc=rG_RPrc8!Zr,hp\s*"9`s*4Ng +qKi-frI"9domZF\omm!lrdt$"s+LE+rItB/Lku%es,$f7req5ENfK0]OHGZgP*;.0PmWhDR$a;0 +R[]e:Sc52]T:l1W!MZ@gU]RBiVZ*IpW2ZcqWrK."XSo:$Y5YX%Yl:p,ZMCj*[/IE/[f3c8\GWo: +])TD@]`5\F^AbnI^];4M_?.Wn`;[^V`lJ)"'$8;>bKS5UcHab_dF$CkeC<%"rmqV3g"P07gtgfC +hr*GOir7sBjQ5OdkND(.klL)8rp9[P!:KgSs7$'YrUTsZs7H0\r:^$^nG)eSq"jRYq>C'eli)J8 +JcF[.J,~> +JcC<$JcCo5nG`=`rVZKgrVHNhqtU3crq?9_rq-6^r:9jWs7#sTrpKdQr9XFKs6BLGs60IFr9""? +s5a+hp`l5p8_ns:, +^q[Xu]tD"i]",A]\,NfC[C!9HZE^[=Yck5/XTtr.X/`2!WMofos/#dmrM0LiU8%X\s.KCarLX%[ +s.'%Ws-itUrL!VOs-EVKs-3PIrK@2Cs,d2?s,R,=rf$l8s,-c3s+gZ1rJ(?+!/1<'s+:9%rIFot +s*jops*Xinr-J?frcn9`rHA'\`H:rtqf;CMq/Gb?qJc7MrGqmYr,hp\rc\3`rcnHgqg/6grI"Eh +qL80gk^`S^rIXlus+LE+r.Y9.Lku"d#E"FtN/WaUNrG(?OHKO*$Bp^>Q'R`&R$a;1rgOIhSXuFF +T:hmOU8+KZUnsobrhfgrWN#lss/Q.$rN6+&ric7(riuI.qQp1.r3cC0rO;d9qml^;s1A3As1SHH +rkJKK!5\WN#K+Ku`Poj:a8X.3ai_fMbfn>WcHjkbdF-LmeC<%"f@S[.g=k<:h;-rFhr*GOioB([ +jlPXekNMp0!p]+;rp0^RmdC)Cs7$'YrUU![rq-'[rV$0`nbDkSp\OFWq>C'eli)J8JcFX-J,~> +JcC<$JcCo5nG`=`rVZKgrVHNhqtU3crq?9_rq-6^r:9jWs7#sTrpKdQr9XFKs6BLGs60IFr9""? +s5a+hp`l5p8_ns:, +^q[Xu]tD"i]",A]\,NfC[C!9HZE^[=Yck5/XTtr.X/`2!WMofos/#dmrM0LiU8%X\s.KCarLX%[ +s.'%Ws-itUrL!VOs-EVKs-3PIrK@2Cs,d2?s,R,=rf$l8s,-c3s+gZ1rJ(?+!/1<'s+:9%rIFot +s*jops*Xinr-J?frcn9`rHA'\`H:rtqf;CMq/Gb?qJc7MrGqmYr,hp\rc\3`rcnHgqg/6grI"Eh +qL80gk^`S^rIXlus+LE+r.Y9.Lku"d#E"FtN/WaUNrG(?OHKO*$Bp^>Q'R`&R$a;1rgOIhSXuFF +T:hmOU8+KZUnsobrhfgrWN#lss/Q.$rN6+&ric7(riuI.qQp1.r3cC0rO;d9qml^;s1A3As1SHH +rkJKK!5\WN#K+Ku`Poj:a8X.3ai_fMbfn>WcHjkbdF-LmeC<%"f@S[.g=k<:h;-rFhr*GOioB([ +jlPXekNMp0!p]+;rp0^RmdC)Cs7$'YrUU![rq-'[rV$0`nbDkSp\OFWq>C'eli)J8JcFX-J,~> +JcC<$JcCo5nG`=`rVZKgrVHNhqtU3crq?9_rq-6^r:9jWs7#sTrpKdQr9XFKs6BLGs60IFr9""? +s5a+hp`l5p8_ns:, +^q[Xu]tD"i]",A]\,NfC[C!9HZE^[=Yck5/XTtr.X/`2!WMofos/#dmrM0LiU8%X\s.KCarLX%[ +s.'%Ws-itUrL!VOs-EVKs-3PIrK@2Cs,d2?s,R,=rf$l8s,-c3s+gZ1rJ(?+!/1<'s+:9%rIFot +s*jops*Xinr-J?frcn9`rHA'\`H:rtqf;CMq/Gb?qJc7MrGqmYr,hp\rc\3`rcnHgqg/6grI"Eh +qL80gk^`S^rIXlus+LE+r.Y9.Lku"d#E"FtN/WaUNrG(?OHKO*$Bp^>Q'R`&R$a;1rgOIhSXuFF +T:hmOU8+KZUnsobrhfgrWN#lss/Q.$rN6+&ric7(riuI.qQp1.r3cC0rO;d9qml^;s1A3As1SHH +rkJKK!5\WN#K+Ku`Poj:a8X.3ai_fMbfn>WcHjkbdF-LmeC<%"f@S[.g=k<:h;-rFhr*GOioB([ +jlPXekNMp0!p]+;rp0^RmdC)Cs7$'YrUU![rq-'[rV$0`nbDkSp\OFWq>C'eli)J8JcFX-J,~> +JcC<$JcCo5n,E4_rVZKgrVHNhqtU0bs7Z?_s7H<^r:9mXrp]jSrpKdQr9XFKrp'FGroj@Er9"%@ +roF%!OB!0YQ:r1riHF,X/i8#WMuiqVuNXoV>d:jUB%%eU&UecTDbA] +Sc>5YS,\rWRJiNQQiEBMQ2d*KPPp[EOoLOAO8k4?NW"h9MuS\6M>rD3L]3&.L&Zi*KE$Q'Jc1-! +J,aurIK"WoHi&-gH2`'`GPZL/Fn9_PF8L"MEUIf>EW'qVF8L(ZFoHR^GQ)jdH2N!fHiAEhIJeQk +J*2@WJbt&qKDpQ'L&Hc+L]<2/M#rQmMuJYHNK0$[O-#HcP*2#mPa.N"Qi>]`5\F^AYhH +_#M7M_Z.LR`;[^e`lH-@aN;QHbKJ,Rc-FV\d/ME!daQ^qe^i@(f\-8X$/=7kh;7&Ii8N\pisXr0 +k2tjikiq?slKeH9!q#FDrpTmVs7-'Ys7?6^qt9p]rV,pYpA+IZn,)qYq>KUXJcC<$hZ&*~> +JcC<$JcCo5n,E4_rVZKgrVHNhqtU0bs7Z?_s7H<^r:9mXrp]jSrpKdQr9XFKrp'FGroj@Er9"%@ +roF%!OB!0YQ:r1riHF,X/i8#WMuiqVuNXoV>d:jUB%%eU&UecTDbA] +Sc>5YS,\rWRJiNQQiEBMQ2d*KPPp[EOoLOAO8k4?NW"h9MuS\6M>rD3L]3&.L&Zi*KE$Q'Jc1-! +J,aurIK"WoHi&-gH2`'`GPZL/Fn9_PF8L"MEUIf>EW'qVF8L(ZFoHR^GQ)jdH2N!fHiAEhIJeQk +J*2@WJbt&qKDpQ'L&Hc+L]<2/M#rQmMuJYHNK0$[O-#HcP*2#mPa.N"Qi>]`5\F^AYhH +_#M7M_Z.LR`;[^e`lH-@aN;QHbKJ,Rc-FV\d/ME!daQ^qe^i@(f\-8X$/=7kh;7&Ii8N\pisXr0 +k2tjikiq?slKeH9!q#FDrpTmVs7-'Ys7?6^qt9p]rV,pYpA+IZn,)qYq>KUXJcC<$hZ&*~> +JcC<$JcCo5n,E4_rVZKgrVHNhqtU0bs7Z?_s7H<^r:9mXrp]jSrpKdQr9XFKrp'FGroj@Er9"%@ +roF%!OB!0YQ:r1riHF,X/i8#WMuiqVuNXoV>d:jUB%%eU&UecTDbA] +Sc>5YS,\rWRJiNQQiEBMQ2d*KPPp[EOoLOAO8k4?NW"h9MuS\6M>rD3L]3&.L&Zi*KE$Q'Jc1-! +J,aurIK"WoHi&-gH2`'`GPZL/Fn9_PF8L"MEUIf>EW'qVF8L(ZFoHR^GQ)jdH2N!fHiAEhIJeQk +J*2@WJbt&qKDpQ'L&Hc+L]<2/M#rQmMuJYHNK0$[O-#HcP*2#mPa.N"Qi>]`5\F^AYhH +_#M7M_Z.LR`;[^e`lH-@aN;QHbKJ,Rc-FV\d/ME!daQ^qe^i@(f\-8X$/=7kh;7&Ii8N\pisXr0 +k2tjikiq?slKeH9!q#FDrpTmVs7-'Ys7?6^qt9p]rV,pYpA+IZn,)qYq>KUXJcC<$hZ&*~> +JcC<$JcCl4n,E7`r;?BfrqcThqtU0bs7Z?_s7H<^r:9jWrp]jSrpKdQr9XFKrp'CFrojCFr9""? +s5a.=s5O(;rSRb7hVS7f!o2Pbrn7D+f`'J'f%'cL"k1oIdEp5=c5t6SbKJ&MaN2EA`Pod5_SX.) +^V@Ls]tD"i]",A]\,NfD[C!9HZEga>Yck75riH7'X/l6"!i`,srhfgpV5=-d!i)KarLs7as.B7] +s.01[rLCrf@)>s,Hu9!fMqnrJCQ1!/LN-s+LH+rIb-%s+1-! +s*t&tr-eTmrd4Ngrd"EdoQS]+q/uCQqfDXTiGnd9rH%jXrcS3`r-/-bs*=Kfrd4ZmqL/?lr."?h +nq$Icp4N +JcC<$JcCl4n,E7`r;?BfrqcThqtU0bs7Z?_s7H<^r:9jWrp]jSrpKdQr9XFKrp'CFrojCFr9""? +s5a.=s5O(;rSRb7hVS7f!o2Pbrn7D+f`'J'f%'cL"k1oIdEp5=c5t6SbKJ&MaN2EA`Pod5_SX.) +^V@Ls]tD"i]",A]\,NfD[C!9HZEga>Yck75riH7'X/l6"!i`,srhfgpV5=-d!i)KarLs7as.B7] +s.01[rLCrf@)>s,Hu9!fMqnrJCQ1!/LN-s+LH+rIb-%s+1-! +s*t&tr-eTmrd4Ngrd"EdoQS]+q/uCQqfDXTiGnd9rH%jXrcS3`r-/-bs*=Kfrd4ZmqL/?lr."?h +nq$Icp4N +JcC<$JcCl4n,E7`r;?BfrqcThqtU0bs7Z?_s7H<^r:9jWrp]jSrpKdQr9XFKrp'CFrojCFr9""? +s5a.=s5O(;rSRb7hVS7f!o2Pbrn7D+f`'J'f%'cL"k1oIdEp5=c5t6SbKJ&MaN2EA`Pod5_SX.) +^V@Ls]tD"i]",A]\,NfD[C!9HZEga>Yck75riH7'X/l6"!i`,srhfgpV5=-d!i)KarLs7as.B7] +s.01[rLCrf@)>s,Hu9!fMqnrJCQ1!/LN-s+LH+rIb-%s+1-! +s*t&tr-eTmrd4Ngrd"EdoQS]+q/uCQqfDXTiGnd9rH%jXrcS3`r-/-bs*=Kfrd4ZmqL/?lr."?h +nq$Icp4N +JcC<$JcCl4n,E4_r;?BfrqcThqtU0bs7Z?_rq-6^qssaVs7#pSrpKdQqs==Js6BLGroj@ErT=+@ +s5a.=s5O(;ro!h6s5*b2&DZ$pg=k65f[na+f%&:"e'e6C%FEGHcHXSVbK@rJaN)="`=9c'_SX.) +^V@Lr]Y(kfrj`TM\$i`Q['[0GZE^[=Yck75riH7'X/l6"!i`,srhodns/#^js.fUgrLs7as.B7] +s.01[rLCrf@)>s,I#:s,6o7re^Z2s+gT.s+UK+rIY0'JV!`L +s*t&tr-eTmrd4Kfr-A0aa`mT)qfVUSqfDRRno=JGr,_^VrcS3`r-/-brd"Efs*O`mqgJHmrI=Tm +qLS9jl\#.hrIt-'s+gT0rJCQ3!/pf7#E=b(O,oBaOoCLNPE_>tQBml)R$jEBRgP[VSt;RITV8'R +U].%iV5F6i!NaMrUU![rq--]rq? +JcC<$JcCl4n,E4_r;?BfrqcThqtU0bs7Z?_rq-6^qssaVs7#pSrpKdQqs==Js6BLGroj@ErT=+@ +s5a.=s5O(;ro!h6s5*b2&DZ$pg=k65f[na+f%&:"e'e6C%FEGHcHXSVbK@rJaN)="`=9c'_SX.) +^V@Lr]Y(kfrj`TM\$i`Q['[0GZE^[=Yck75riH7'X/l6"!i`,srhodns/#^js.fUgrLs7as.B7] +s.01[rLCrf@)>s,I#:s,6o7re^Z2s+gT.s+UK+rIY0'JV!`L +s*t&tr-eTmrd4Kfr-A0aa`mT)qfVUSqfDRRno=JGr,_^VrcS3`r-/-brd"Efs*O`mqgJHmrI=Tm +qLS9jl\#.hrIt-'s+gT0rJCQ3!/pf7#E=b(O,oBaOoCLNPE_>tQBml)R$jEBRgP[VSt;RITV8'R +U].%iV5F6i!NaMrUU![rq--]rq? +JcC<$JcCl4n,E4_r;?BfrqcThqtU0bs7Z?_rq-6^qssaVs7#pSrpKdQqs==Js6BLGroj@ErT=+@ +s5a.=s5O(;ro!h6s5*b2&DZ$pg=k65f[na+f%&:"e'e6C%FEGHcHXSVbK@rJaN)="`=9c'_SX.) +^V@Lr]Y(kfrj`TM\$i`Q['[0GZE^[=Yck75riH7'X/l6"!i`,srhodns/#^js.fUgrLs7as.B7] +s.01[rLCrf@)>s,I#:s,6o7re^Z2s+gT.s+UK+rIY0'JV!`L +s*t&tr-eTmrd4Kfr-A0aa`mT)qfVUSqfDRRno=JGr,_^VrcS3`r-/-brd"Efs*O`mqgJHmrI=Tm +qLS9jl\#.hrIt-'s+gT0rJCQ3!/pf7#E=b(O,oBaOoCLNPE_>tQBml)R$jEBRgP[VSt;RITV8'R +U].%iV5F6i!NaMrUU![rq--]rq? +JcC<$JcCi3n,E4_rVZHfrqcWiqY:'arq?9_rq-3]r:9jWrp]gRrpKdQqs==Jrp'CFs60IFr9"%@ +s5a.=s5O(;ro!h6!8d_2s4dV/rn7D+f`'JIf%&:"e'lamdEp4bcHXSVbK@rKaN2EA`Pod5_SX.) +^V@Lrrk&EH]",A]\,Nf:[C#q>!OB!0YlCm,Y5YO)XK/E$WrK$uW;WXoVZ3LlV#R4iUA^ecT`:Y_ +T)YA]SGerVRfAfSR/`KQQMm*KPlHsGP5gXEOSt7?NW>(;MunopMZ&A5LkgcaLAur-K`-Q'K)^E# +JGt&uIf+WnI/SEeHM`!9Gk-(UG5QLVFSKqKEqsePFT$@]G5QR`GlE!dHN/?kI/JElIf=imJGauq +K'%^]K`$Q"LB!&.M#E21MZ8V5Muo!!NrG(?OHKO*#*Y:9Q'IZ%rg4apR[]e:S=Q7CT:hmOU8"EY +UnsrcVl-JmWN)u!X/u<&s/l@*rNQ=,s0DU0s0Vd5qmQL5rOD[6r4;j=qRlg@rkA,^b5TQlbg"DXcHjh`dF$CkrmV,%f%8O+g&B\8gYCW@hV[8LiSrkWj5f>$joOZ/ +rojIKli-5PmI'EAn,MkWnbr%YoD\C[p&=[`p\=OZq=a[NqtU*`rTX<4s+14(s*t~> +JcC<$JcCi3n,E4_rVZHfrqcWiqY:'arq?9_rq-3]r:9jWrp]gRrpKdQqs==Jrp'CFs60IFr9"%@ +s5a.=s5O(;ro!h6!8d_2s4dV/rn7D+f`'JIf%&:"e'lamdEp4bcHXSVbK@rKaN2EA`Pod5_SX.) +^V@Lrrk&EH]",A]\,Nf:[C#q>!OB!0YlCm,Y5YO)XK/E$WrK$uW;WXoVZ3LlV#R4iUA^ecT`:Y_ +T)YA]SGerVRfAfSR/`KQQMm*KPlHsGP5gXEOSt7?NW>(;MunopMZ&A5LkgcaLAur-K`-Q'K)^E# +JGt&uIf+WnI/SEeHM`!9Gk-(UG5QLVFSKqKEqsePFT$@]G5QR`GlE!dHN/?kI/JElIf=imJGauq +K'%^]K`$Q"LB!&.M#E21MZ8V5Muo!!NrG(?OHKO*#*Y:9Q'IZ%rg4apR[]e:S=Q7CT:hmOU8"EY +UnsrcVl-JmWN)u!X/u<&s/l@*rNQ=,s0DU0s0Vd5qmQL5rOD[6r4;j=qRlg@rkA,^b5TQlbg"DXcHjh`dF$CkrmV,%f%8O+g&B\8gYCW@hV[8LiSrkWj5f>$joOZ/ +rojIKli-5PmI'EAn,MkWnbr%YoD\C[p&=[`p\=OZq=a[NqtU*`rTX<4s+14(s*t~> +JcC<$JcCi3n,E4_rVZHfrqcWiqY:'arq?9_rq-3]r:9jWrp]gRrpKdQqs==Jrp'CFs60IFr9"%@ +s5a.=s5O(;ro!h6!8d_2s4dV/rn7D+f`'JIf%&:"e'lamdEp4bcHXSVbK@rKaN2EA`Pod5_SX.) +^V@Lrrk&EH]",A]\,Nf:[C#q>!OB!0YlCm,Y5YO)XK/E$WrK$uW;WXoVZ3LlV#R4iUA^ecT`:Y_ +T)YA]SGerVRfAfSR/`KQQMm*KPlHsGP5gXEOSt7?NW>(;MunopMZ&A5LkgcaLAur-K`-Q'K)^E# +JGt&uIf+WnI/SEeHM`!9Gk-(UG5QLVFSKqKEqsePFT$@]G5QR`GlE!dHN/?kI/JElIf=imJGauq +K'%^]K`$Q"LB!&.M#E21MZ8V5Muo!!NrG(?OHKO*#*Y:9Q'IZ%rg4apR[]e:S=Q7CT:hmOU8"EY +UnsrcVl-JmWN)u!X/u<&s/l@*rNQ=,s0DU0s0Vd5qmQL5rOD[6r4;j=qRlg@rkA,^b5TQlbg"DXcHjh`dF$CkrmV,%f%8O+g&B\8gYCW@hV[8LiSrkWj5f>$joOZ/ +rojIKli-5PmI'EAn,MkWnbr%YoD\C[p&=[`p\=OZq=a[NqtU*`rTX<4s+14(s*t~> +JcC<$JcCf2n,E7`r;?BfrVHNhqY:'arq?6^s7H<^qssaVrp]gRrpKdQqX"4Irp'FGrojCFr9"%@ +s5a.=s5O(;rnmk8hVS7f!SlH/g'66_f[na+ec+&:e'cXkd*L"_c-=JUbK@rJaN)<>`Pf[2_SO%e +^BM?b]Y(kfrj`6C\$i`Q[C#q>!OB!0YlCm,Y5YR'X8o="WWK/uW;WUqVPU-fV#R4iUA^ecT`:Y_ +T)P;\SGerWRfAfSR/`KQQMm*KPlHsHP5g[EOT(=@NrP+ +JcC<$JcCf2n,E7`r;?BfrVHNhqY:'arq?6^s7H<^qssaVrp]gRrpKdQqX"4Irp'FGrojCFr9"%@ +s5a.=s5O(;rnmk8hVS7f!SlH/g'66_f[na+ec+&:e'cXkd*L"_c-=JUbK@rJaN)<>`Pf[2_SO%e +^BM?b]Y(kfrj`6C\$i`Q[C#q>!OB!0YlCm,Y5YR'X8o="WWK/uW;WUqVPU-fV#R4iUA^ecT`:Y_ +T)P;\SGerWRfAfSR/`KQQMm*KPlHsHP5g[EOT(=@NrP+ +JcC<$JcCf2n,E7`r;?BfrVHNhqY:'arq?6^s7H<^qssaVrp]gRrpKdQqX"4Irp'FGrojCFr9"%@ +s5a.=s5O(;rnmk8hVS7f!SlH/g'66_f[na+ec+&:e'cXkd*L"_c-=JUbK@rJaN)<>`Pf[2_SO%e +^BM?b]Y(kfrj`6C\$i`Q[C#q>!OB!0YlCm,Y5YR'X8o="WWK/uW;WUqVPU-fV#R4iUA^ecT`:Y_ +T)P;\SGerWRfAfSR/`KQQMm*KPlHsHP5g[EOT(=@NrP+ +JcC<$JcCc1n,E4_rVZHfrqcThqtU0brq?6^rq-3]qssaVrp]dQrpKdQqs==Jrp'CFs60IFrT=.A +s5a.=s5F%;rSRq(;MunopMZ&A5LkgcaLAuu-K`-Q'K)^E" +JGt&tIenKkI/A96HMVpbGkQ@ZG5?@EFSp:[G5?F^GlE!dHN&9kI/JElIfFopJGk&uK(jonK^sic +LAZi+M#3&/MZ/P4Muo!!NrG+>O8tFBOtDl^Pa.N"QC!u+R@9S6S"-%@StD[KTqS3UUnji`VPg>j +WMuntX/rD)Xfeh1rilF-s0DX1s0Vg6r3lU6rj_j9rOVs>pq6R=rP&-CrkSQMr5/KOs2=lTs2P)Z +rl>/_b0'_,&BrDDcHab^d*^7hdaQ^qe^j`O"k_M^g=tE^h$)Zmi8ESRro4CIjlY^gkNM0plK[^7 +liQSBmf)YVnF?&Io)J=]o_eC]pAXg^q"sm_qW[nMr:g0Qrdk*#s4I@%~> +JcC<$JcCc1n,E4_rVZHfrqcThqtU0brq?6^rq-3]qssaVrp]dQrpKdQqs==Jrp'CFs60IFrT=.A +s5a.=s5F%;rSRq(;MunopMZ&A5LkgcaLAuu-K`-Q'K)^E" +JGt&tIenKkI/A96HMVpbGkQ@ZG5?@EFSp:[G5?F^GlE!dHN&9kI/JElIfFopJGk&uK(jonK^sic +LAZi+M#3&/MZ/P4Muo!!NrG+>O8tFBOtDl^Pa.N"QC!u+R@9S6S"-%@StD[KTqS3UUnji`VPg>j +WMuntX/rD)Xfeh1rilF-s0DX1s0Vg6r3lU6rj_j9rOVs>pq6R=rP&-CrkSQMr5/KOs2=lTs2P)Z +rl>/_b0'_,&BrDDcHab^d*^7hdaQ^qe^j`O"k_M^g=tE^h$)Zmi8ESRro4CIjlY^gkNM0plK[^7 +liQSBmf)YVnF?&Io)J=]o_eC]pAXg^q"sm_qW[nMr:g0Qrdk*#s4I@%~> +JcC<$JcCc1n,E4_rVZHfrqcThqtU0brq?6^rq-3]qssaVrp]dQrpKdQqs==Jrp'CFs60IFrT=.A +s5a.=s5F%;rSRq(;MunopMZ&A5LkgcaLAuu-K`-Q'K)^E" +JGt&tIenKkI/A96HMVpbGkQ@ZG5?@EFSp:[G5?F^GlE!dHN&9kI/JElIfFopJGk&uK(jonK^sic +LAZi+M#3&/MZ/P4Muo!!NrG+>O8tFBOtDl^Pa.N"QC!u+R@9S6S"-%@StD[KTqS3UUnji`VPg>j +WMuntX/rD)Xfeh1rilF-s0DX1s0Vg6r3lU6rj_j9rOVs>pq6R=rP&-CrkSQMr5/KOs2=lTs2P)Z +rl>/_b0'_,&BrDDcHab^d*^7hdaQ^qe^j`O"k_M^g=tE^h$)Zmi8ESRro4CIjlY^gkNM0plK[^7 +liQSBmf)YVnF?&Io)J=]o_eC]pAXg^q"sm_qW[nMr:g0Qrdk*#s4I@%~> +JcC<$JcCc1n,E4_r;??erqcThqtU0brV$-]rq-3]qssaVrp]dQrpKdQqX"4Irp'FGs60IFrT=.A +s5a.=!oi1tro!h6!8d_2!SlH/g&]mZrmq>)e^W*tdf.W9d*L"_c-4ASb/q`Ga2Z-<`Pf[2_SO%& +^V7Fq]Y(kfrj`'>\,Nf@[C!mos/,gmrM9Igs.]Ics.KCa +rLX%[s.'%Ws-itUrL!VO!1*SKs-*MIrK75EOHBI&s,R,=rf$l8s,-f4s+p]1reCH,s+L<&s+:9% +qgeZqrdOWjqL$nAn9Y"XqfqjZqKD+Gqf_g[rHSs,d8Cs-!DG!0mJJ!LB)OQjT7MS"#q\@^])%J_>M1L_uI[R`W*sXa8X0[ +aT0K_bQ#cdc2Q!"cd:%ddF-IleC<%"f%8O+g&B\/gYCW@hV\=j$K:")j5f=`k2tjjroj[Qlg*p( +mHs?@n,MkWnbr%YoDeI\p&=[ap\FU^q>'mOqt9m\rTF02s+14%s*t~> +JcC<$JcCc1n,E4_r;??erqcThqtU0brV$-]rq-3]qssaVrp]dQrpKdQqX"4Irp'FGs60IFrT=.A +s5a.=!oi1tro!h6!8d_2!SlH/g&]mZrmq>)e^W*tdf.W9d*L"_c-4ASb/q`Ga2Z-<`Pf[2_SO%& +^V7Fq]Y(kfrj`'>\,Nf@[C!mos/,gmrM9Igs.]Ics.KCa +rLX%[s.'%Ws-itUrL!VO!1*SKs-*MIrK75EOHBI&s,R,=rf$l8s,-f4s+p]1reCH,s+L<&s+:9% +qgeZqrdOWjqL$nAn9Y"XqfqjZqKD+Gqf_g[rHSs,d8Cs-!DG!0mJJ!LB)OQjT7MS"#q\@^])%J_>M1L_uI[R`W*sXa8X0[ +aT0K_bQ#cdc2Q!"cd:%ddF-IleC<%"f%8O+g&B\/gYCW@hV\=j$K:")j5f=`k2tjjroj[Qlg*p( +mHs?@n,MkWnbr%YoDeI\p&=[ap\FU^q>'mOqt9m\rTF02s+14%s*t~> +JcC<$JcCc1n,E4_r;??erqcThqtU0brV$-]rq-3]qssaVrp]dQrpKdQqX"4Irp'FGs60IFrT=.A +s5a.=!oi1tro!h6!8d_2!SlH/g&]mZrmq>)e^W*tdf.W9d*L"_c-4ASb/q`Ga2Z-<`Pf[2_SO%& +^V7Fq]Y(kfrj`'>\,Nf@[C!mos/,gmrM9Igs.]Ics.KCa +rLX%[s.'%Ws-itUrL!VO!1*SKs-*MIrK75EOHBI&s,R,=rf$l8s,-f4s+p]1reCH,s+L<&s+:9% +qgeZqrdOWjqL$nAn9Y"XqfqjZqKD+Gqf_g[rHSs,d8Cs-!DG!0mJJ!LB)OQjT7MS"#q\@^])%J_>M1L_uI[R`W*sXa8X0[ +aT0K_bQ#cdc2Q!"cd:%ddF-IleC<%"f%8O+g&B\/gYCW@hV\=j$K:")j5f=`k2tjjroj[Qlg*p( +mHs?@n,MkWnbr%YoDeI\p&=[ap\FU^q>'mOqt9m\rTF02s+14%s*t~> +JcC<$JcC`0n,E4_r;??erqcThqY:'arq?6^rq-0\qssaVrUB^QrU0[Pqs==Jrp'FGrojCFrT=.A +s5a1>s5O(;rnmh7hYu=NgtUT;g=b-2f@SU(eC;srda?Ihcd'h\bfe2Pao9?fa2Z*;`5BI/_8-&b +$bjs0;X0rilF+s/u@'s/c7$rMfpuW2TZms/,dlrM9Igs.]Ics.KCa +rLX%[s.'%Ws-itUrg<_Ps-EYLs-3PIrf[;Ds,d5@s,I)=rJUf9MMh@hs+gZ1rJ(?+re16&rdt0$ +qgeWprI49bfR3LAp3QX^r-7jXlur,IrHSs,d8CrfRhVPa%GuQBml)R$jA2S"#q=rgj:cTV8'RU].%rV5C/gW2ZbrWiN6# +XTGZ/YPta,Z*O>7!joACrO2a8s1&!;rjr'?qRla>rP&'ArP8EKqni?Ms2=iSs2P)ZrlG,]s2t>a +s3(Jfrlu)$d*U1fdaHUoeCE+#f@S[.rn7_6gtgfChV[8LiSsjs$fpF3k3(pkl07Kuli-5OmI'rA +!q>aMrpp*\s7H6^s7ZHdq=sm`qtfUToDJ:[k5Kr3JcF=$J,~> +JcC<$JcC`0n,E4_r;??erqcThqY:'arq?6^rq-0\qssaVrUB^QrU0[Pqs==Jrp'FGrojCFrT=.A +s5a1>s5O(;rnmh7hYu=NgtUT;g=b-2f@SU(eC;srda?Ihcd'h\bfe2Pao9?fa2Z*;`5BI/_8-&b +$bjs0;X0rilF+s/u@'s/c7$rMfpuW2TZms/,dlrM9Igs.]Ics.KCa +rLX%[s.'%Ws-itUrg<_Ps-EYLs-3PIrf[;Ds,d5@s,I)=rJUf9MMh@hs+gZ1rJ(?+re16&rdt0$ +qgeWprI49bfR3LAp3QX^r-7jXlur,IrHSs,d8CrfRhVPa%GuQBml)R$jA2S"#q=rgj:cTV8'RU].%rV5C/gW2ZbrWiN6# +XTGZ/YPta,Z*O>7!joACrO2a8s1&!;rjr'?qRla>rP&'ArP8EKqni?Ms2=iSs2P)ZrlG,]s2t>a +s3(Jfrlu)$d*U1fdaHUoeCE+#f@S[.rn7_6gtgfChV[8LiSsjs$fpF3k3(pkl07Kuli-5OmI'rA +!q>aMrpp*\s7H6^s7ZHdq=sm`qtfUToDJ:[k5Kr3JcF=$J,~> +JcC<$JcC`0n,E4_r;??erqcThqY:'arq?6^rq-0\qssaVrUB^QrU0[Pqs==Jrp'FGrojCFrT=.A +s5a1>s5O(;rnmh7hYu=NgtUT;g=b-2f@SU(eC;srda?Ihcd'h\bfe2Pao9?fa2Z*;`5BI/_8-&b +$bjs0;X0rilF+s/u@'s/c7$rMfpuW2TZms/,dlrM9Igs.]Ics.KCa +rLX%[s.'%Ws-itUrg<_Ps-EYLs-3PIrf[;Ds,d5@s,I)=rJUf9MMh@hs+gZ1rJ(?+re16&rdt0$ +qgeWprI49bfR3LAp3QX^r-7jXlur,IrHSs,d8CrfRhVPa%GuQBml)R$jA2S"#q=rgj:cTV8'RU].%rV5C/gW2ZbrWiN6# +XTGZ/YPta,Z*O>7!joACrO2a8s1&!;rjr'?qRla>rP&'ArP8EKqni?Ms2=iSs2P)ZrlG,]s2t>a +s3(Jfrlu)$d*U1fdaHUoeCE+#f@S[.rn7_6gtgfChV[8LiSsjs$fpF3k3(pkl07Kuli-5OmI'rA +!q>aMrpp*\s7H6^s7ZHdq=sm`qtfUToDJ:[k5Kr3JcF=$J,~> +JcC<$JcC`0mf*+^r;?BfrVHKgqY:'arq?3]rq-3]qXXUTrp]dQrpKaPqs==Jrp'FGs60LGrT=.A +s5a1>s5F%;rnn@FhVR)Egt^Z[4iU]7(eU&Uec +TDbA]Sc>5YS,\rWRJrTRQiEBNQ2d'KPPpXGOcY\(O8k7?NW+n:MuS\6M>rD3L])u-L&Zi(KDpK% +JbjopJ,=]?IJS?gHhVjaH2DjFGPudbH2DpeHiAEjIK+cqJ,FirJcC?!KDpQ&L%pDuL[g2hM>W81 +Mu/J5NW5%;O8k=AOoCODP5pjHPl[2;rg3_SRf8ciS=Q7CT:_dMTq\8d +c-?75!RK-ldJqW)e'umte^i@(f\+s3g=tE^h$W#ri8ESRioB([jo4BCkNMp0!UB"MliQSBmf)YV +nF?&IncJFTo_eC^pAXg_q#'sbqX"+Nr:KsLrdk*#s4%(!~> +JcC<$JcC`0mf*+^r;?BfrVHKgqY:'arq?3]rq-3]qXXUTrp]dQrpKaPqs==Jrp'FGs60LGrT=.A +s5a1>s5F%;rnn@FhVR)Egt^Z[4iU]7(eU&Uec +TDbA]Sc>5YS,\rWRJrTRQiEBNQ2d'KPPpXGOcY\(O8k7?NW+n:MuS\6M>rD3L])u-L&Zi(KDpK% +JbjopJ,=]?IJS?gHhVjaH2DjFGPudbH2DpeHiAEjIK+cqJ,FirJcC?!KDpQ&L%pDuL[g2hM>W81 +Mu/J5NW5%;O8k=AOoCODP5pjHPl[2;rg3_SRf8ciS=Q7CT:_dMTq\8d +c-?75!RK-ldJqW)e'umte^i@(f\+s3g=tE^h$W#ri8ESRioB([jo4BCkNMp0!UB"MliQSBmf)YV +nF?&IncJFTo_eC^pAXg_q#'sbqX"+Nr:KsLrdk*#s4%(!~> +JcC<$JcC`0mf*+^r;?BfrVHKgqY:'arq?3]rq-3]qXXUTrp]dQrpKaPqs==Jrp'FGs60LGrT=.A +s5a1>s5F%;rnn@FhVR)Egt^Z[4iU]7(eU&Uec +TDbA]Sc>5YS,\rWRJrTRQiEBNQ2d'KPPpXGOcY\(O8k7?NW+n:MuS\6M>rD3L])u-L&Zi(KDpK% +JbjopJ,=]?IJS?gHhVjaH2DjFGPudbH2DpeHiAEjIK+cqJ,FirJcC?!KDpQ&L%pDuL[g2hM>W81 +Mu/J5NW5%;O8k=AOoCODP5pjHPl[2;rg3_SRf8ciS=Q7CT:_dMTq\8d +c-?75!RK-ldJqW)e'umte^i@(f\+s3g=tE^h$W#ri8ESRioB([jo4BCkNMp0!UB"MliQSBmf)YV +nF?&IncJFTo_eC^pAXg_q#'sbqX"+Nr:KsLrdk*#s4%(!~> +JcC<$JcC]/mf*+^r;??erqcThqY:$`rq?3]rq-3]qXXUTrp]aPrpKdQqs==Jrp'FGs60LGrT41C +jQ-=#s5O(;s5%=OT1IBP5g^GPl?sJQ2m9NQjT7MS"#qa +s3(Jfrm(Pi!7:_ms3_S0eC<%!f%8O+f\,!4gY:N>h;7&gi"4l,j5]4]jlY^gkih9qlK[^7liHMA +rpTmVs7-*Zs7?9_rUp0`rqH +JcC<$JcC]/mf*+^r;??erqcThqY:$`rq?3]rq-3]qXXUTrp]aPrpKdQqs==Jrp'FGs60LGrT41C +jQ-=#s5O(;s5%=OT1IBP5g^GPl?sJQ2m9NQjT7MS"#qa +s3(Jfrm(Pi!7:_ms3_S0eC<%!f%8O+f\,!4gY:N>h;7&gi"4l,j5]4]jlY^gkih9qlK[^7liHMA +rpTmVs7-*Zs7?9_rUp0`rqH +JcC<$JcC]/mf*+^r;??erqcThqY:$`rq?3]rq-3]qXXUTrp]aPrpKdQqs==Jrp'FGs60LGrT41C +jQ-=#s5O(;s5%=OT1IBP5g^GPl?sJQ2m9NQjT7MS"#qa +s3(Jfrm(Pi!7:_ms3_S0eC<%!f%8O+f\,!4gY:N>h;7&gi"4l,j5]4]jlY^gkih9qlK[^7liHMA +rpTmVs7-*Zs7?9_rUp0`rqH +JcC<$JcCZ.mf*+^r;??erVHNhq=ss`rV$-]rUg*\q==OTrUB[PrU0[Pqs=@Krp'FGs60LGroX7B +s5a1>s5F%;rnmh7hYu=8gtUT;g=b-Xf.,A%eC;sqdF$=fcd'h\bfe2PaiMQDa2Z*;`5BI/_83q% +^V7Cp]Y(kg])K5A\@8sH[KYMIeJ3gI/J?bHMDdZGklX[HN&9iI/JElIfFoqJGt-"K)C9#K`6]&LAco+M"->lMYN,( +N;eh9Nr4tas31Mf +rm(Pi!7:_m#L_)MeC<%!f)F83f\,!4gY:N>h;7&Hi8ESRro4%?jo4BCkNMp0!UB"MliQSBmf)YV +nF?&Jo)J=]o_nI^pAam`q#1$dqXFCQr:9gHrdk*#s3^js~> +JcC<$JcCZ.mf*+^r;??erVHNhq=ss`rV$-]rUg*\q==OTrUB[PrU0[Pqs=@Krp'FGs60LGroX7B +s5a1>s5F%;rnmh7hYu=8gtUT;g=b-Xf.,A%eC;sqdF$=fcd'h\bfe2PaiMQDa2Z*;`5BI/_83q% +^V7Cp]Y(kg])K5A\@8sH[KYMIeJ3gI/J?bHMDdZGklX[HN&9iI/JElIfFoqJGt-"K)C9#K`6]&LAco+M"->lMYN,( +N;eh9Nr4tas31Mf +rm(Pi!7:_m#L_)MeC<%!f)F83f\,!4gY:N>h;7&Hi8ESRro4%?jo4BCkNMp0!UB"MliQSBmf)YV +nF?&Jo)J=]o_nI^pAam`q#1$dqXFCQr:9gHrdk*#s3^js~> +JcC<$JcCZ.mf*+^r;??erVHNhq=ss`rV$-]rUg*\q==OTrUB[PrU0[Pqs=@Krp'FGs60LGroX7B +s5a1>s5F%;rnmh7hYu=8gtUT;g=b-Xf.,A%eC;sqdF$=fcd'h\bfe2PaiMQDa2Z*;`5BI/_83q% +^V7Cp]Y(kg])K5A\@8sH[KYMIeJ3gI/J?bHMDdZGklX[HN&9iI/JElIfFoqJGt-"K)C9#K`6]&LAco+M"->lMYN,( +N;eh9Nr4tas31Mf +rm(Pi!7:_m#L_)MeC<%!f)F83f\,!4gY:N>h;7&Hi8ESRro4%?jo4BCkNMp0!UB"MliQSBmf)YV +nF?&Jo)J=]o_nI^pAam`q#1$dqXFCQr:9gHrdk*#s3^js~> +JcC<$JcCW-mf*+^r;??erVHKgqY:$`rq?3]rUg'[qXXUTrUB[PrpKdQqs==Js6BRIroa@FrT=.A +!9F.>s5F%;ro!h6'&MI#gt^Z_KrjDm9[']h=s0D[0rNQ=*s/u=&s/c7$rMomss/>jns/,gmrM9Igs.]Ic +s.KCargs.\s.'(Xs-itUrg<_P!1*VLs-3PIrf[;D!0I/?!fi8"rJ^c7!/g]2s+p]1r.b3)re1-# +r.=`qd=D(Cr-nBgr-\Ehh0T$HrI"Kjs*jrsr.+furdt'#s+LB*qhG**reU?+q24g&m#:k%rf6l: +rfI/BrK@2E!0mGI#F:^CR$a;0Rf8c`S=Q7CT:_dMTq\=]U^j5uVl-JmWiE,#XKAV-YPta,Z*OA8 +s0Md6rjDm;\@DLJ!kQ"Ur4N'CrkA6DrP8BJpqlsHr5AHNrl4rXr5eo[s2t8_!mJp6rQYJjd*Vd> +#L_)MeC<%!f)F8%f\-8X!ScE/h&>/-i8ESQioB([jlPXekNM-ol0@U#m-O-,mf)\Tn,W"WncJFT +o_eC^pAam`q#:*eqXXOTr:0aFrdk*#s3CXp~> +JcC<$JcCW-mf*+^r;??erVHKgqY:$`rq?3]rUg'[qXXUTrUB[PrpKdQqs==Js6BRIroa@FrT=.A +!9F.>s5F%;ro!h6'&MI#gt^Z_KrjDm9[']h=s0D[0rNQ=*s/u=&s/c7$rMomss/>jns/,gmrM9Igs.]Ic +s.KCargs.\s.'(Xs-itUrg<_P!1*VLs-3PIrf[;D!0I/?!fi8"rJ^c7!/g]2s+p]1r.b3)re1-# +r.=`qd=D(Cr-nBgr-\Ehh0T$HrI"Kjs*jrsr.+furdt'#s+LB*qhG**reU?+q24g&m#:k%rf6l: +rfI/BrK@2E!0mGI#F:^CR$a;0Rf8c`S=Q7CT:_dMTq\=]U^j5uVl-JmWiE,#XKAV-YPta,Z*OA8 +s0Md6rjDm;\@DLJ!kQ"Ur4N'CrkA6DrP8BJpqlsHr5AHNrl4rXr5eo[s2t8_!mJp6rQYJjd*Vd> +#L_)MeC<%!f)F8%f\-8X!ScE/h&>/-i8ESQioB([jlPXekNM-ol0@U#m-O-,mf)\Tn,W"WncJFT +o_eC^pAam`q#:*eqXXOTr:0aFrdk*#s3CXp~> +JcC<$JcCW-mf*+^r;??erVHKgqY:$`rq?3]rUg'[qXXUTrUB[PrpKdQqs==Js6BRIroa@FrT=.A +!9F.>s5F%;ro!h6'&MI#gt^Z_KrjDm9[']h=s0D[0rNQ=*s/u=&s/c7$rMomss/>jns/,gmrM9Igs.]Ic +s.KCargs.\s.'(Xs-itUrg<_P!1*VLs-3PIrf[;D!0I/?!fi8"rJ^c7!/g]2s+p]1r.b3)re1-# +r.=`qd=D(Cr-nBgr-\Ehh0T$HrI"Kjs*jrsr.+furdt'#s+LB*qhG**reU?+q24g&m#:k%rf6l: +rfI/BrK@2E!0mGI#F:^CR$a;0Rf8c`S=Q7CT:_dMTq\=]U^j5uVl-JmWiE,#XKAV-YPta,Z*OA8 +s0Md6rjDm;\@DLJ!kQ"Ur4N'CrkA6DrP8BJpqlsHr5AHNrl4rXr5eo[s2t8_!mJp6rQYJjd*Vd> +#L_)MeC<%!f)F8%f\-8X!ScE/h&>/-i8ESQioB([jlPXekNM-ol0@U#m-O-,mf)\Tn,W"WncJFT +o_eC^pAam`q#:*eqXXOTr:0aFrdk*#s3CXp~> +JcC<$JcCW-mf*+^qu$6drVHKgqY:$`rV$*\rUg'[q==LSrp]aPrpKdQr9XFKs6BRIs60LGrT41C +jQ-=#!oi1trnmh7hYu=_KrjMj7!4;^2s0D[0rNQ=*s/u=&s/c7$r2Tdrs/>mos/,gmrM9Igs.]Ic +s.B@arLX%[!1a"W!h,OFrg<_Ps-EYL!gJn4rf[;Ds,d5@s,R,=rf$l8s,-`2s+p]1qhG*(rIjot +pO_1OnppXfr-nEhr-\?fm!APUrI"HirdOirr.+furdt*$re1<*qhG**reUE-r/1B0k)B+qqi:N6 +rfI/BrK@2Es-3JI!g]1>rg3_SRf8c\S=Q4BStD\TT`q0cUnjiarhfpuWN)u!XT#=0Y-5(6Z*CU@ +Za@*IrjDm;\@DOKs186BrOi0DrkAC*\qt0gVrS[[+s+13ps*t~> +JcC<$JcCW-mf*+^qu$6drVHKgqY:$`rV$*\rUg'[q==LSrp]aPrpKdQr9XFKs6BRIs60LGrT41C +jQ-=#!oi1trnmh7hYu=_KrjMj7!4;^2s0D[0rNQ=*s/u=&s/c7$r2Tdrs/>mos/,gmrM9Igs.]Ic +s.B@arLX%[!1a"W!h,OFrg<_Ps-EYL!gJn4rf[;Ds,d5@s,R,=rf$l8s,-`2s+p]1qhG*(rIjot +pO_1OnppXfr-nEhr-\?fm!APUrI"HirdOirr.+furdt*$re1<*qhG**reUE-r/1B0k)B+qqi:N6 +rfI/BrK@2Es-3JI!g]1>rg3_SRf8c\S=Q4BStD\TT`q0cUnjiarhfpuWN)u!XT#=0Y-5(6Z*CU@ +Za@*IrjDm;\@DOKs186BrOi0DrkAC*\qt0gVrS[[+s+13ps*t~> +JcC<$JcCW-mf*+^qu$6drVHKgqY:$`rV$*\rUg'[q==LSrp]aPrpKdQr9XFKs6BRIs60LGrT41C +jQ-=#!oi1trnmh7hYu=_KrjMj7!4;^2s0D[0rNQ=*s/u=&s/c7$r2Tdrs/>mos/,gmrM9Igs.]Ic +s.B@arLX%[!1a"W!h,OFrg<_Ps-EYL!gJn4rf[;Ds,d5@s,R,=rf$l8s,-`2s+p]1qhG*(rIjot +pO_1OnppXfr-nEhr-\?fm!APUrI"HirdOirr.+furdt*$re1<*qhG**reUE-r/1B0k)B+qqi:N6 +rfI/BrK@2Es-3JI!g]1>rg3_SRf8c\S=Q4BStD\TT`q0cUnjiarhfpuWN)u!XT#=0Y-5(6Z*CU@ +Za@*IrjDm;\@DOKs186BrOi0DrkAC*\qt0gVrS[[+s+13ps*t~> +JcC<$JcCT,mf*+^qu$6drVHKgq=sp_rV$*\rUg'[q""FSrUB[PrpKdQr9XFKs6BRIs60LGroX7B +!9F.>s5F%;rnmh7hYu=3gtVh^"khP[f@JLOe0[4iU]7(e +T`UmZTDb>_SXc5LS,\rWRJrQTQ^3s:Q2d'KPPpXGOcY\'Nrk?$NW"h9MuS\4M>i>2L\cc(L&?VX +KCXWjJbO]mJ,FciIJJ9\Hhr-cIK"]pJ,=crJc:9"KDpQ(L&?])L]3,,M>`>1MtDtuNV8D+O8Y1> +Oo1CBPQ-mGPld81tG_u.IJ`VdaSa8 +JcC<$JcCT,mf*+^qu$6drVHKgq=sp_rV$*\rUg'[q""FSrUB[PrpKdQr9XFKs6BRIs60LGroX7B +!9F.>s5F%;rnmh7hYu=3gtVh^"khP[f@JLOe0[4iU]7(e +T`UmZTDb>_SXc5LS,\rWRJrQTQ^3s:Q2d'KPPpXGOcY\'Nrk?$NW"h9MuS\4M>i>2L\cc(L&?VX +KCXWjJbO]mJ,FciIJJ9\Hhr-cIK"]pJ,=crJc:9"KDpQ(L&?])L]3,,M>`>1MtDtuNV8D+O8Y1> +Oo1CBPQ-mGPld81tG_u.IJ`VdaSa8 +JcC<$JcCT,mf*+^qu$6drVHKgq=sp_rV$*\rUg'[q""FSrUB[PrpKdQr9XFKs6BRIs60LGroX7B +!9F.>s5F%;rnmh7hYu=3gtVh^"khP[f@JLOe0[4iU]7(e +T`UmZTDb>_SXc5LS,\rWRJrQTQ^3s:Q2d'KPPpXGOcY\'Nrk?$NW"h9MuS\4M>i>2L\cc(L&?VX +KCXWjJbO]mJ,FciIJJ9\Hhr-cIK"]pJ,=crJc:9"KDpQ(L&?])L]3,,M>`>1MtDtuNV8D+O8Y1> +Oo1CBPQ-mGPld81tG_u.IJ`VdaSa8 +JcC<$JcCQ+mJd"]r;?,\`r\,Ec8[K!W4Zi@?2Z2Lp,YQ(d'XoGL&X8K!tWW/pqVuNXoV>d:jU]7(e +T`UmZTDkG^Sc>5ZS,\oWRJrTRQiEBNPld26PQ$aFOoLOBO8k7?NW"h9MuJV3M>i>1L\Z]&L%g8M +KDU8uJbXcnJ,FcdIJ8-]IJnWoJ,=cqJcC?"KDpQ(L&?]*L]3,,M>iD3Mti8-NV&7sO8P+D+J_u.II`VdaSa8*gTao9H\bQ#fdc2Grfci;Ajd/qbFe,Ihu +e^i=Nf)aOWrn8=Ggt^`AhV[5Ki8N\Tj5]4^jlY^gkih9qlK[^7liHMArpTmV!:g$Ys766_rUp0` +s7cEcrqZNhp&"L]nGV,@JcC<$bQ!(~> +JcC<$JcCQ+mJd"]r;?,\`r\,Ec8[K!W4Zi@?2Z2Lp,YQ(d'XoGL&X8K!tWW/pqVuNXoV>d:jU]7(e +T`UmZTDkG^Sc>5ZS,\oWRJrTRQiEBNPld26PQ$aFOoLOBO8k7?NW"h9MuJV3M>i>1L\Z]&L%g8M +KDU8uJbXcnJ,FcdIJ8-]IJnWoJ,=cqJcC?"KDpQ(L&?]*L]3,,M>iD3Mti8-NV&7sO8P+D+J_u.II`VdaSa8*gTao9H\bQ#fdc2Grfci;Ajd/qbFe,Ihu +e^i=Nf)aOWrn8=Ggt^`AhV[5Ki8N\Tj5]4^jlY^gkih9qlK[^7liHMArpTmV!:g$Ys766_rUp0` +s7cEcrqZNhp&"L]nGV,@JcC<$bQ!(~> +JcC<$JcCQ+mJd"]r;?,\`r\,Ec8[K!W4Zi@?2Z2Lp,YQ(d'XoGL&X8K!tWW/pqVuNXoV>d:jU]7(e +T`UmZTDkG^Sc>5ZS,\oWRJrTRQiEBNPld26PQ$aFOoLOBO8k7?NW"h9MuJV3M>i>1L\Z]&L%g8M +KDU8uJbXcnJ,FcdIJ8-]IJnWoJ,=cqJcC?"KDpQ(L&?]*L]3,,M>iD3Mti8-NV&7sO8P+D+J_u.II`VdaSa8*gTao9H\bQ#fdc2Grfci;Ajd/qbFe,Ihu +e^i=Nf)aOWrn8=Ggt^`AhV[5Ki8N\Tj5]4^jlY^gkih9qlK[^7liHMArpTmV!:g$Ys766_rUp0` +s7cEcrqZNhp&"L]nGV,@JcC<$bQ!(~> +JcC<$JcCN*mf*(]r;?&E;[-i8EMMhVI#CgY:H9g"?;U"kM5ReC2kFd07nCcHa\YrlYkqaiMQD`l?!:`5BL0_SO(( +rkANK]tOEX!kZ%Trji'=s0qs8s0_m6rNlO0s0;O,ric@)rN6+$s/Z'ts/H$srMT[ms/#^js.fUg +rh9@bs.B:^!hGjOrgWqV!1EeQ!gf4=rg!MJ!0dAEs,d;CrK$u=s,Hu9repf6qhb<.rJ1'#kCr;V +oRm'nrIO]nr."Tml$`JYrI=Zos+10$r.G!%s+UB*s+gT0r/(E1repW3rJg]7kE#A!r/pfG +rK[DKs-N_Ps-WkUrgWqX!1j+\!M?%aTamflUnjiaVPg>jWN)u!XT#=/Y-5(6Z*L[AZa@.>[Kj:O +\@K/]]"@pR!kl=^rP/BJrk\NLrkn]Qpr30NqoAKQrQ5&]qoeu_s3:Jes3C\lrR(Yn!7Unr!nGlQ +rmq2'g&B\;gYCT?h;7#Gi8ESQioB([jQ6C'!U&\GklL)8rp0^RmdC)C!q>aMrpp*\s7H9_s7ZKe +qtU0drVH6bq#'[\gAZ['JcEgkJ,~> +JcC<$JcCN*mf*(]r;?&E;[-i8EMMhVI#CgY:H9g"?;U"kM5ReC2kFd07nCcHa\YrlYkqaiMQD`l?!:`5BL0_SO(( +rkANK]tOEX!kZ%Trji'=s0qs8s0_m6rNlO0s0;O,ric@)rN6+$s/Z'ts/H$srMT[ms/#^js.fUg +rh9@bs.B:^!hGjOrgWqV!1EeQ!gf4=rg!MJ!0dAEs,d;CrK$u=s,Hu9repf6qhb<.rJ1'#kCr;V +oRm'nrIO]nr."Tml$`JYrI=Zos+10$r.G!%s+UB*s+gT0r/(E1repW3rJg]7kE#A!r/pfG +rK[DKs-N_Ps-WkUrgWqX!1j+\!M?%aTamflUnjiaVPg>jWN)u!XT#=/Y-5(6Z*L[AZa@.>[Kj:O +\@K/]]"@pR!kl=^rP/BJrk\NLrkn]Qpr30NqoAKQrQ5&]qoeu_s3:Jes3C\lrR(Yn!7Unr!nGlQ +rmq2'g&B\;gYCT?h;7#Gi8ESQioB([jQ6C'!U&\GklL)8rp0^RmdC)C!q>aMrpp*\s7H9_s7ZKe +qtU0drVH6bq#'[\gAZ['JcEgkJ,~> +JcC<$JcCN*mf*(]r;?&E;[-i8EMMhVI#CgY:H9g"?;U"kM5ReC2kFd07nCcHa\YrlYkqaiMQD`l?!:`5BL0_SO(( +rkANK]tOEX!kZ%Trji'=s0qs8s0_m6rNlO0s0;O,ric@)rN6+$s/Z'ts/H$srMT[ms/#^js.fUg +rh9@bs.B:^!hGjOrgWqV!1EeQ!gf4=rg!MJ!0dAEs,d;CrK$u=s,Hu9repf6qhb<.rJ1'#kCr;V +oRm'nrIO]nr."Tml$`JYrI=Zos+10$r.G!%s+UB*s+gT0r/(E1repW3rJg]7kE#A!r/pfG +rK[DKs-N_Ps-WkUrgWqX!1j+\!M?%aTamflUnjiaVPg>jWN)u!XT#=/Y-5(6Z*L[AZa@.>[Kj:O +\@K/]]"@pR!kl=^rP/BJrk\NLrkn]Qpr30NqoAKQrQ5&]qoeu_s3:Jes3C\lrR(Yn!7Unr!nGlQ +rmq2'g&B\;gYCT?h;7#Gi8ESQioB([jQ6C'!U&\GklL)8rp0^RmdC)C!q>aMrpp*\s7H9_s7ZKe +qtU0drVH6bq#'[\gAZ['JcEgkJ,~> +JcC<$JcCN*mJd"]qu$3crVHHfq=sm^rV$$ZrUg$Zq==LSrp]gRrpKdQrTsRMs6BRIs6'IGroX7B +!9F.>s5F%;rnn.@hVI#CgtUQ:g"?;U"kM5ReC2kFd0e7HcHa\Ybfe2Pao9?^a2\+t!Q;nT_?.Qh +_#D(M^:h5Z]E5^V])B2>\,a#:[fTR]E5d\^AYhH_#M7K_Z.OQ`;.CM`r*mOaSa0Yb50<\bl>rccMu5id/MGmdf7eqeGn&!f)F;$ +fDsV(gAfn-h#?+1hV\=j!TE&;irS6&roO7Ekl0fOlKdd&m-X3.rpTmV!:g$Y!qZ'VrUp3arqH?c +rqZNhp\Xdao)72>JcC<$a8^Y~> +JcC<$JcCN*mJd"]qu$3crVHHfq=sm^rV$$ZrUg$Zq==LSrp]gRrpKdQrTsRMs6BRIs6'IGroX7B +!9F.>s5F%;rnn.@hVI#CgtUQ:g"?;U"kM5ReC2kFd0e7HcHa\Ybfe2Pao9?^a2\+t!Q;nT_?.Qh +_#D(M^:h5Z]E5^V])B2>\,a#:[fTR]E5d\^AYhH_#M7K_Z.OQ`;.CM`r*mOaSa0Yb50<\bl>rccMu5id/MGmdf7eqeGn&!f)F;$ +fDsV(gAfn-h#?+1hV\=j!TE&;irS6&roO7Ekl0fOlKdd&m-X3.rpTmV!:g$Y!qZ'VrUp3arqH?c +rqZNhp\Xdao)72>JcC<$a8^Y~> +JcC<$JcCN*mJd"]qu$3crVHHfq=sm^rV$$ZrUg$Zq==LSrp]gRrpKdQrTsRMs6BRIs6'IGroX7B +!9F.>s5F%;rnn.@hVI#CgtUQ:g"?;U"kM5ReC2kFd0e7HcHa\Ybfe2Pao9?^a2\+t!Q;nT_?.Qh +_#D(M^:h5Z]E5^V])B2>\,a#:[fTR]E5d\^AYhH_#M7K_Z.OQ`;.CM`r*mOaSa0Yb50<\bl>rccMu5id/MGmdf7eqeGn&!f)F;$ +fDsV(gAfn-h#?+1hV\=j!TE&;irS6&roO7Ekl0fOlKdd&m-X3.rpTmV!:g$Y!qZ'VrUp3arqH?c +rqZNhp\Xdao)72>JcC<$a8^Y~> +JcC<$JcCK)mJct\r;?TR +]E5d\^AbnI_#M7L_Z%IQ`;7IO`r3sOaSa0Xb5'6[bl5lacMu5jd/;8mdaQ\DeGn&!f)F;$fDsV( +gAfn-h#?+1hV\=j!TE&;isb#1jlY^gkNM0plK[^7liQSBmf)YVnF?&Jo)J=]o_nI_pAambq#:*f +qY0m`r:Ks=rdk*#s2=qf~> +JcC<$JcCK)mJct\r;?TR +]E5d\^AbnI_#M7L_Z%IQ`;7IO`r3sOaSa0Xb5'6[bl5lacMu5jd/;8mdaQ\DeGn&!f)F;$fDsV( +gAfn-h#?+1hV\=j!TE&;isb#1jlY^gkNM0plK[^7liQSBmf)YVnF?&Jo)J=]o_nI_pAambq#:*f +qY0m`r:Ks=rdk*#s2=qf~> +JcC<$JcCK)mJct\r;?TR +]E5d\^AbnI_#M7L_Z%IQ`;7IO`r3sOaSa0Xb5'6[bl5lacMu5jd/;8mdaQ\DeGn&!f)F;$fDsV( +gAfn-h#?+1hV\=j!TE&;isb#1jlY^gkNM0plK[^7liQSBmf)YVnF?&Jo)J=]o_nI_pAambq#:*f +qY0m`r:Ks=rdk*#s2=qf~> +JcC<$JcCH(mJct\qu$3cr;-Bfq"Xd]r:]pYr:KsZq==LSrp]gRs6fpSr9XIL!:'OI!pJh1roX7B +!9F.>!TN);huV`lrnRq:gY1B7g"=p.f%'cL"k1oIdEp5=c2l26rlY>bao9?^a2\+t!lW!ork\`Q +^qfra!ku@]rO`3D]"7jNs1&*mo!iDfjrhTRh +s.]Lds.B@args.\!1a"W!h,OFrg<_P!1*SK!gJn4rK@2Cs,d2?rf7#gPrgk.&TV/!PU8+KZUnsrcVl-JmWiE,$XKAV-YHY79ZMq0<['d?N\$rlX\[oAark&)rn7G. +gt_nb!T)`5i!86#ioB([jQ6C'!U&\Gkm-M>lg4!*mI'uBs6p$YrUL$]o^r+Ts7ZKeqtU0drqcEe +qY^$beGb%!JcEXfJ,~> +JcC<$JcCH(mJct\qu$3cr;-Bfq"Xd]r:]pYr:KsZq==LSrp]gRs6fpSr9XIL!:'OI!pJh1roX7B +!9F.>!TN);huV`lrnRq:gY1B7g"=p.f%'cL"k1oIdEp5=c2l26rlY>bao9?^a2\+t!lW!ork\`Q +^qfra!ku@]rO`3D]"7jNs1&*mo!iDfjrhTRh +s.]Lds.B@args.\!1a"W!h,OFrg<_P!1*SK!gJn4rK@2Cs,d2?rf7#gPrgk.&TV/!PU8+KZUnsrcVl-JmWiE,$XKAV-YHY79ZMq0<['d?N\$rlX\[oAark&)rn7G. +gt_nb!T)`5i!86#ioB([jQ6C'!U&\Gkm-M>lg4!*mI'uBs6p$YrUL$]o^r+Ts7ZKeqtU0drqcEe +qY^$beGb%!JcEXfJ,~> +JcC<$JcCH(mJct\qu$3cr;-Bfq"Xd]r:]pYr:KsZq==LSrp]gRs6fpSr9XIL!:'OI!pJh1roX7B +!9F.>!TN);huV`lrnRq:gY1B7g"=p.f%'cL"k1oIdEp5=c2l26rlY>bao9?^a2\+t!lW!ork\`Q +^qfra!ku@]rO`3D]"7jNs1&*mo!iDfjrhTRh +s.]Lds.B@args.\!1a"W!h,OFrg<_P!1*SK!gJn4rK@2Cs,d2?rf7#gPrgk.&TV/!PU8+KZUnsrcVl-JmWiE,$XKAV-YHY79ZMq0<['d?N\$rlX\[oAark&)rn7G. +gt_nb!T)`5i!86#ioB([jQ6C'!U&\Gkm-M>lg4!*mI'uBs6p$YrUL$]o^r+Ts7ZKeqtU0drqcEe +qY^$beGb%!JcEXfJ,~> +JcC<$JcCE'm/Hn\qu$3cr;-?ep\=^]r:]mXr:KsZq==OTrp]jSrpKgRrTsRMs6BUJs6'IGroX7B +!9F.>!TN);huV`lrnRV1g]#n1g"=p.f%'cL$IdGNdEp7dcHa\YrlY>bao9?da2Z-<`Pf^4rke]O +s1nWKs1SKHrOi0Bs180>s1&*pps/,gmrhTRh +!2BIds.B@arLO(]S=KSJ!h,OFrg<_Ps-EYLs-3PIrK@2Cs,d/>rf6u;qMb?1qMNj\q2"p'pkJa$ +r.OitqL\*cqh"Wrre19)r.b6,reUN0reg`6r/CZ8rf6l:rfI)@p6,-5n!*I0rKdGLr0[JOs-inU +!h>gPrgj1`TV2:X!MZ@gU^ErqVl-JlWN)u!XT#=3Y-5(6Z*L^B['[6L[^WdG\Hf^X]=bei]tXK\ +s1eWNrPJTPs2=iSrl4rXqT/TVr6"]Ur65,aqTf)ds3U\krmLhqrR:o!f%0fO!nc2Zrn7G.gt_nb +!T)`5i;_a9ir7s=jQ6C'#Nt=7l07Kuli-5PmI'EAmfN"Knc&+Zo)SF]p&Fabp\agcq>U6cqtp +JcC<$JcCE'm/Hn\qu$3cr;-?ep\=^]r:]mXr:KsZq==OTrp]jSrpKgRrTsRMs6BUJs6'IGroX7B +!9F.>!TN);huV`lrnRV1g]#n1g"=p.f%'cL$IdGNdEp7dcHa\YrlY>bao9?da2Z-<`Pf^4rke]O +s1nWKs1SKHrOi0Bs180>s1&*pps/,gmrhTRh +!2BIds.B@arLO(]S=KSJ!h,OFrg<_Ps-EYLs-3PIrK@2Cs,d/>rf6u;qMb?1qMNj\q2"p'pkJa$ +r.OitqL\*cqh"Wrre19)r.b6,reUN0reg`6r/CZ8rf6l:rfI)@p6,-5n!*I0rKdGLr0[JOs-inU +!h>gPrgj1`TV2:X!MZ@gU^ErqVl-JlWN)u!XT#=3Y-5(6Z*L^B['[6L[^WdG\Hf^X]=bei]tXK\ +s1eWNrPJTPs2=iSrl4rXqT/TVr6"]Ur65,aqTf)ds3U\krmLhqrR:o!f%0fO!nc2Zrn7G.gt_nb +!T)`5i;_a9ir7s=jQ6C'#Nt=7l07Kuli-5PmI'EAmfN"Knc&+Zo)SF]p&Fabp\agcq>U6cqtp +JcC<$JcCE'm/Hn\qu$3cr;-?ep\=^]r:]mXr:KsZq==OTrp]jSrpKgRrTsRMs6BUJs6'IGroX7B +!9F.>!TN);huV`lrnRV1g]#n1g"=p.f%'cL$IdGNdEp7dcHa\YrlY>bao9?da2Z-<`Pf^4rke]O +s1nWKs1SKHrOi0Bs180>s1&*pps/,gmrhTRh +!2BIds.B@arLO(]S=KSJ!h,OFrg<_Ps-EYLs-3PIrK@2Cs,d/>rf6u;qMb?1qMNj\q2"p'pkJa$ +r.OitqL\*cqh"Wrre19)r.b6,reUN0reg`6r/CZ8rf6l:rfI)@p6,-5n!*I0rKdGLr0[JOs-inU +!h>gPrgj1`TV2:X!MZ@gU^ErqVl-JlWN)u!XT#=3Y-5(6Z*L^B['[6L[^WdG\Hf^X]=bei]tXK\ +s1eWNrPJTPs2=iSrl4rXqT/TVr6"]Ur65,aqTf)ds3U\krmLhqrR:o!f%0fO!nc2Zrn7G.gt_nb +!T)`5i;_a9ir7s=jQ6C'#Nt=7l07Kuli-5PmI'EAmfN"Knc&+Zo)SF]p&Fabp\agcq>U6cqtp +JcC<$JcCB&m/Hn\qu$0br;-?ep\=[\r:]mXr:KsZqXXXUrp]jSrpKgRrTjUOlK\?4!pJh1roO7C +jSn0Iio/kSi8rj`!;r3lX5s0V^1s0D[0r364)s/u=&s/c7$ri6!ts/>pps/#dmrM0Li +U8%X\!hc0Xrgs.\!1a%Xs-itUrg<_P!1*SKs-3PIrK@2CrfI&=rf6r:pPem*iem5^r.t9+pkJa$ +r.O]pnq-RfrIk0(qhG-+reUN0reg`6r/CZ8rf6o;rfI,Aq3(W=q39s*qj.2Iqj@ANs-inUs.'+[ +rgs.^!20=b$_jDkUnjiaVPg>jWW&n$X/rG*Y-7i/"gPA>Za@.>[Ka4N\[f;_]DfGD]tXK\s1eWN +rPAWR`5MSms2P&YqoJ`Xr6"`Vqonu_q9Jrbrm:Sjs3gnqrRCkts472$s4IA)rn7G.gt_nb#N"@q +i8ESQir7sCjQ5Lck3(pkrojIKli-8Nm/ZSRn,MkWnc&+ZoDeI]p&Facp\agcq>U6cqtp +JcC<$JcCB&m/Hn\qu$0br;-?ep\=[\r:]mXr:KsZqXXXUrp]jSrpKgRrTjUOlK\?4!pJh1roO7C +jSn0Iio/kSi8rj`!;r3lX5s0V^1s0D[0r364)s/u=&s/c7$ri6!ts/>pps/#dmrM0Li +U8%X\!hc0Xrgs.\!1a%Xs-itUrg<_P!1*SKs-3PIrK@2CrfI&=rf6r:pPem*iem5^r.t9+pkJa$ +r.O]pnq-RfrIk0(qhG-+reUN0reg`6r/CZ8rf6o;rfI,Aq3(W=q39s*qj.2Iqj@ANs-inUs.'+[ +rgs.^!20=b$_jDkUnjiaVPg>jWW&n$X/rG*Y-7i/"gPA>Za@.>[Ka4N\[f;_]DfGD]tXK\s1eWN +rPAWR`5MSms2P&YqoJ`Xr6"`Vqonu_q9Jrbrm:Sjs3gnqrRCkts472$s4IA)rn7G.gt_nb#N"@q +i8ESQir7sCjQ5Lck3(pkrojIKli-8Nm/ZSRn,MkWnc&+ZoDeI]p&Facp\agcq>U6cqtp +JcC<$JcCB&m/Hn\qu$0br;-?ep\=[\r:]mXr:KsZqXXXUrp]jSrpKgRrTjUOlK\?4!pJh1roO7C +jSn0Iio/kSi8rj`!;r3lX5s0V^1s0D[0r364)s/u=&s/c7$ri6!ts/>pps/#dmrM0Li +U8%X\!hc0Xrgs.\!1a%Xs-itUrg<_P!1*SKs-3PIrK@2CrfI&=rf6r:pPem*iem5^r.t9+pkJa$ +r.O]pnq-RfrIk0(qhG-+reUN0reg`6r/CZ8rf6o;rfI,Aq3(W=q39s*qj.2Iqj@ANs-inUs.'+[ +rgs.^!20=b$_jDkUnjiaVPg>jWW&n$X/rG*Y-7i/"gPA>Za@.>[Ka4N\[f;_]DfGD]tXK\s1eWN +rPAWR`5MSms2P&YqoJ`Xr6"`Vqonu_q9Jrbrm:Sjs3gnqrRCkts472$s4IA)rn7G.gt_nb#N"@q +i8ESQir7sCjQ5Lck3(pkrojIKli-8Nm/ZSRn,MkWnc&+ZoDeI]p&Facp\agcq>U6cqtp +JcC<$JcC?%m/Hk[qu$0br;-?epA"R[r:]mXr:KsZqssaVrp]jSs6fpSrTsRMs6BUJ!pJh1roOdR +jQ,@]io/kSi8VD]DoJ?\c92>\,<]7[JmQ3Zi791Z2Lp,YQ(d(XoGI&X8T'uW;rmqVZN`lV>d7l +US=L^U&UbcTDkG^SH,2YRf]%HRJrTRQiEBMQ2d*KPPp[DOoCI>O8Y+:NT5ubMu&>)M>`8.L\Z]& +L&6PeKD^E$L&6W(L]<2.M>iD4MuAV6NW5%:O8b7?Oo(=?PPg[5Q11+9QhZsIRJrZQS,]#YSc55\ +T)bP`U&UheU].%iV5F6i-`F#EWiN2%Xf\b0YctC;ZEpmE[C3NQ\%&uZ]">Se]Y2%n^V@S"_>V4P +_o0Ll`W*sXa8 +JcC<$JcC?%m/Hk[qu$0br;-?epA"R[r:]mXr:KsZqssaVrp]jSs6fpSrTsRMs6BUJ!pJh1roOdR +jQ,@]io/kSi8VD]DoJ?\c92>\,<]7[JmQ3Zi791Z2Lp,YQ(d(XoGI&X8T'uW;rmqVZN`lV>d7l +US=L^U&UbcTDkG^SH,2YRf]%HRJrTRQiEBMQ2d*KPPp[DOoCI>O8Y+:NT5ubMu&>)M>`8.L\Z]& +L&6PeKD^E$L&6W(L]<2.M>iD4MuAV6NW5%:O8b7?Oo(=?PPg[5Q11+9QhZsIRJrZQS,]#YSc55\ +T)bP`U&UheU].%iV5F6i-`F#EWiN2%Xf\b0YctC;ZEpmE[C3NQ\%&uZ]">Se]Y2%n^V@S"_>V4P +_o0Ll`W*sXa8 +JcC<$JcC?%m/Hk[qu$0br;-?epA"R[r:]mXr:KsZqssaVrp]jSs6fpSrTsRMs6BUJ!pJh1roOdR +jQ,@]io/kSi8VD]DoJ?\c92>\,<]7[JmQ3Zi791Z2Lp,YQ(d(XoGI&X8T'uW;rmqVZN`lV>d7l +US=L^U&UbcTDkG^SH,2YRf]%HRJrTRQiEBMQ2d*KPPp[DOoCI>O8Y+:NT5ubMu&>)M>`8.L\Z]& +L&6PeKD^E$L&6W(L]<2.M>iD4MuAV6NW5%:O8b7?Oo(=?PPg[5Q11+9QhZsIRJrZQS,]#YSc55\ +T)bP`U&UheU].%iV5F6i-`F#EWiN2%Xf\b0YctC;ZEpmE[C3NQ\%&uZ]">Se]Y2%n^V@S"_>V4P +_o0Ll`W*sXa8 +JcC<$JcC<$m/Hk[qu$0bqtg6dpA"R[qtBdWrUg'[qssaVrp]jSs6fpSrp9[Ns6BUJs6'IGroOsW +jQ,@]io8qTi8rfR,Arfd;FpQbN>n!EO2rL*YRqj[VUs.0+[s.9:a +rh9@d!2KOh$`0_tVl-JmWN)u!XT#=*Y-5(6Z*OA8"gk\G[^WdG\H0:Rrk&9F^AbkK^qmkd_?.Wn +`;[aU`rF*WaSs<\b5'6Ybl#`XcMZ#ed/)/hdf._neGn)!f)=5#f`0Y(gAfn-h#6%6hV[5Ki8NYS +ro=%>!9O4B!U&\Gl2U#Kli-5PmI'EAmfN"Knc&+ZoDeI]p&Facp\agcq>U6dqu$BfrRUt!s+13Z +s*t~> +JcC<$JcC<$m/Hk[qu$0bqtg6dpA"R[qtBdWrUg'[qssaVrp]jSs6fpSrp9[Ns6BUJs6'IGroOsW +jQ,@]io8qTi8rfR,Arfd;FpQbN>n!EO2rL*YRqj[VUs.0+[s.9:a +rh9@d!2KOh$`0_tVl-JmWN)u!XT#=*Y-5(6Z*OA8"gk\G[^WdG\H0:Rrk&9F^AbkK^qmkd_?.Wn +`;[aU`rF*WaSs<\b5'6Ybl#`XcMZ#ed/)/hdf._neGn)!f)=5#f`0Y(gAfn-h#6%6hV[5Ki8NYS +ro=%>!9O4B!U&\Gl2U#Kli-5PmI'EAmfN"Knc&+ZoDeI]p&Facp\agcq>U6dqu$BfrRUt!s+13Z +s*t~> +JcC<$JcC<$m/Hk[qu$0bqtg6dpA"R[qtBdWrUg'[qssaVrp]jSs6fpSrp9[Ns6BUJs6'IGroOsW +jQ,@]io8qTi8rfR,Arfd;FpQbN>n!EO2rL*YRqj[VUs.0+[s.9:a +rh9@d!2KOh$`0_tVl-JmWN)u!XT#=*Y-5(6Z*OA8"gk\G[^WdG\H0:Rrk&9F^AbkK^qmkd_?.Wn +`;[aU`rF*WaSs<\b5'6Ybl#`XcMZ#ed/)/hdf._neGn)!f)=5#f`0Y(gAfn-h#6%6hV[5Ki8NYS +ro=%>!9O4B!U&\Gl2U#Kli-5PmI'EAmfN"Knc&+ZoDeI]p&Facp\agcq>U6dqu$BfrRUt!s+13Z +s*t~> +JcC<$JcC<$!<;EbqYgh=L^]2%J^&5PC]DfD>\c92=\,Ec7[K!W4Zi@?2Z2Lp,YQ(d)XoGL&X8].!W;rmqVZN`l +V>d7lUS=L^T`UmZTDkG^SH,2YRf]%HRJiNQQiEBMQ2d*JPPgUBOo:C6O6DVnNV&2.Mu8J.M>`8. +L\$8nL%U3!L]3,-M>iD4Mu8P6NW+t:O8b7@Oo1CAPQ$gBQ2R$FQf=D/RJiTNS,SrXSc,/[TDtS_ +Ta.Se]Y2%n^V@S"_>_:Q_o0Lm +`W*sXa8O*YaoBN[bPo``c1TBZchl)adJhSne,.Ypec45!fDjM'g&9Y)gAp%-h#cHjhu;O=iSrkW +j5f:_roO:Fkii$1!UB"Mm/QGQmf)\Tn,W"Wo)J:]o_nI_pAambq#:*gqYC$dr;$ +JcC<$JcC<$!<;EbqYgh=L^]2%J^&5PC]DfD>\c92=\,Ec7[K!W4Zi@?2Z2Lp,YQ(d)XoGL&X8].!W;rmqVZN`l +V>d7lUS=L^T`UmZTDkG^SH,2YRf]%HRJiNQQiEBMQ2d*JPPgUBOo:C6O6DVnNV&2.Mu8J.M>`8. +L\$8nL%U3!L]3,-M>iD4Mu8P6NW+t:O8b7@Oo1CAPQ$gBQ2R$FQf=D/RJiTNS,SrXSc,/[TDtS_ +Ta.Se]Y2%n^V@S"_>_:Q_o0Lm +`W*sXa8O*YaoBN[bPo``c1TBZchl)adJhSne,.Ypec45!fDjM'g&9Y)gAp%-h#cHjhu;O=iSrkW +j5f:_roO:Fkii$1!UB"Mm/QGQmf)\Tn,W"Wo)J:]o_nI_pAambq#:*gqYC$dr;$ +JcC<$JcC<$!<;EbqYgh=L^]2%J^&5PC]DfD>\c92=\,Ec7[K!W4Zi@?2Z2Lp,YQ(d)XoGL&X8].!W;rmqVZN`l +V>d7lUS=L^T`UmZTDkG^SH,2YRf]%HRJiNQQiEBMQ2d*JPPgUBOo:C6O6DVnNV&2.Mu8J.M>`8. +L\$8nL%U3!L]3,-M>iD4Mu8P6NW+t:O8b7@Oo1CAPQ$gBQ2R$FQf=D/RJiTNS,SrXSc,/[TDtS_ +Ta.Se]Y2%n^V@S"_>_:Q_o0Lm +`W*sXa8O*YaoBN[bPo``c1TBZchl)adJhSne,.Ypec45!fDjM'g&9Y)gAp%-h#cHjhu;O=iSrkW +j5f:_roO:Fkii$1!UB"Mm/QGQmf)\Tn,W"Wo)J:]o_nI_pAambq#:*gqYC$dr;$ +JcC<$JcC<$s8VHbqYg9gp&"X_qt]p[r:g*^q"=UXrq$$Xrpg$Xr9s[Rs6]gPs6B[MrosIH!9a@D +s5aFFj5].YiVqaGhqm2Fgt^ZGqj%,GrKm,Cm@!^;pRD/PrgitYs.B=arLj:e +USIga&>c8$Vl-JlWN)u!X/rG*Y-7i/"gPA>Za@.>[KX.M\[f;`rk&9F^AbkJ^qp#es2+iTrl+oW +s2Y)Zs2k;`r6,&_rQY)^qp5/dp +!9O4B!pAe2roj[Qlg*p(mHs?@n,MnWnc&+ZoDeI^p&Fabp\jmdq>U6dqu$BgrRq1$s+13Ts*t~> +JcC<$JcC<$s8VHbqYg9gp&"X_qt]p[r:g*^q"=UXrq$$Xrpg$Xr9s[Rs6]gPs6B[MrosIH!9a@D +s5aFFj5].YiVqaGhqm2Fgt^ZGqj%,GrKm,Cm@!^;pRD/PrgitYs.B=arLj:e +USIga&>c8$Vl-JlWN)u!X/rG*Y-7i/"gPA>Za@.>[KX.M\[f;`rk&9F^AbkJ^qp#es2+iTrl+oW +s2Y)Zs2k;`r6,&_rQY)^qp5/dp +!9O4B!pAe2roj[Qlg*p(mHs?@n,MnWnc&+ZoDeI^p&Fabp\jmdq>U6dqu$BgrRq1$s+13Ts*t~> +JcC<$JcC<$s8VHbqYg9gp&"X_qt]p[r:g*^q"=UXrq$$Xrpg$Xr9s[Rs6]gPs6B[MrosIH!9a@D +s5aFFj5].YiVqaGhqm2Fgt^ZGqj%,GrKm,Cm@!^;pRD/PrgitYs.B=arLj:e +USIga&>c8$Vl-JlWN)u!X/rG*Y-7i/"gPA>Za@.>[KX.M\[f;`rk&9F^AbkJ^qp#es2+iTrl+oW +s2Y)Zs2k;`r6,&_rQY)^qp5/dp +!9O4B!pAe2roj[Qlg*p(mHs?@n,MnWnc&+ZoDeI^p&Fabp\jmdq>U6dqu$BgrRq1$s+13Ts*t~> +JcC<$JcC<$rr;?aq>L3go_\O^qt]p[qtL!]q=X^Yrq$$Xs7-*XrU9dSs6]gPs6K^Mroj[OkND!i +jlPS&irS/urnmh7hYu=GgtUQ:g"G$0f@JL&eC;sqda?Ihd*M^:!R8jfbQ#]bao09^a2Z-t`<*uq +_u7IO_>h=K^]2%J^&,JB]DfD?\c0,=\,<]7[K!W4Zi@?2Z2V!-YQ(d)XTGT)X8].!W;rmrVuNUo +V>d:jUB%%eT`UmZTDkG^SH,2YS,\rWRJiNQQiEBKQ2[$IPPC=:OlqhkO8P%9NVSP3MuAP-M>E%s +L\lo(M>`>3Mu8P5NW5%:O8k=AOo1CBPQ$gEQ2R$JQhZsERIQa3S,AfUSbo#YTDtS_U&UkeU].%j +V5C-hVZE`qri-""XT#=BY-5(6Z*L[AZa@-K[^WcV\[f;`]Y(qk^;%Fu^qp#e!Q2kT`W*sXa8X0[ +aoBN]bPo`bc2#Z_chl)]dJMAje,%Snec+.tfDjM'g&9Y)g]-(.h>c=3hu;R6iW%p;j8\0?jo4EB +k5a`Fl2U#Kli-5PmI'EAn,MkWnc&+ZoDeI]p&Facp\agcq>U6equ$BhrS@I(s+13Ns*t~> +JcC<$JcC<$rr;?aq>L3go_\O^qt]p[qtL!]q=X^Yrq$$Xs7-*XrU9dSs6]gPs6K^Mroj[OkND!i +jlPS&irS/urnmh7hYu=GgtUQ:g"G$0f@JL&eC;sqda?Ihd*M^:!R8jfbQ#]bao09^a2Z-t`<*uq +_u7IO_>h=K^]2%J^&,JB]DfD?\c0,=\,<]7[K!W4Zi@?2Z2V!-YQ(d)XTGT)X8].!W;rmrVuNUo +V>d:jUB%%eT`UmZTDkG^SH,2YS,\rWRJiNQQiEBKQ2[$IPPC=:OlqhkO8P%9NVSP3MuAP-M>E%s +L\lo(M>`>3Mu8P5NW5%:O8k=AOo1CBPQ$gEQ2R$JQhZsERIQa3S,AfUSbo#YTDtS_U&UkeU].%j +V5C-hVZE`qri-""XT#=BY-5(6Z*L[AZa@-K[^WcV\[f;`]Y(qk^;%Fu^qp#e!Q2kT`W*sXa8X0[ +aoBN]bPo`bc2#Z_chl)]dJMAje,%Snec+.tfDjM'g&9Y)g]-(.h>c=3hu;R6iW%p;j8\0?jo4EB +k5a`Fl2U#Kli-5PmI'EAn,MkWnc&+ZoDeI]p&Facp\agcq>U6equ$BhrS@I(s+13Ns*t~> +JcC<$JcC<$rr;?aq>L3go_\O^qt]p[qtL!]q=X^Yrq$$Xs7-*XrU9dSs6]gPs6K^Mroj[OkND!i +jlPS&irS/urnmh7hYu=GgtUQ:g"G$0f@JL&eC;sqda?Ihd*M^:!R8jfbQ#]bao09^a2Z-t`<*uq +_u7IO_>h=K^]2%J^&,JB]DfD?\c0,=\,<]7[K!W4Zi@?2Z2V!-YQ(d)XTGT)X8].!W;rmrVuNUo +V>d:jUB%%eT`UmZTDkG^SH,2YS,\rWRJiNQQiEBKQ2[$IPPC=:OlqhkO8P%9NVSP3MuAP-M>E%s +L\lo(M>`>3Mu8P5NW5%:O8k=AOo1CBPQ$gEQ2R$JQhZsERIQa3S,AfUSbo#YTDtS_U&UkeU].%j +V5C-hVZE`qri-""XT#=BY-5(6Z*L[AZa@-K[^WcV\[f;`]Y(qk^;%Fu^qp#e!Q2kT`W*sXa8X0[ +aoBN]bPo`bc2#Z_chl)]dJMAje,%Snec+.tfDjM'g&9Y)g]-(.h>c=3hu;R6iW%p;j8\0?jo4EB +k5a`Fl2U#Kli-5PmI'EAn,MkWnc&+ZoDeI]p&Facp\agcq>U6equ$BhrS@I(s+13Ns*t~> +JcC<$JcC<$rVu3_q>L3go_\L]qt]mZr:g*^q=XaZrq$$Xs7--Yr9j^TmHsl=!pf.:roj[OkND!i +jlPS&irS/urnmh7hYu=3gtVh^#2.Y\f@JO'rmUttdf.Vpd*M^:s31Pfrlb>a!6P2\!lr=#rPefT +s24fPrk\WMr4i9Grk86Brk&3Ar42j;s0qp7s0_m6rNcR2Z*F83!jAc0riQ4%s/Z.!!i`,srhfgp +V5=0e!i)Karh9@b!2'4]!hGjOrLs,m5Bs-*JIr0@8Irg3JKrL*POjI>n6r13YTrh'4`r1X.b!2KLgs.o^m +rhgs=WMuntX/i>(Xfek2YctCVf]tXK\!PlPN_?e&t`5T^8`lH.!aT'B^ +b5KN`bl5lacMc)dd.G`_dehMheG[qsf)4/!f`0Y'gAfq-h#6%1hV[5ii;_a9ir.m=jQ5M&joOZ/ +rosIJ!:0XNs6TgSrpTmVs7-*Zs766_rUp3as7cHdrqZQiqYU3gqu,IPJcC<$VuM8~> +JcC<$JcC<$rVu3_q>L3go_\L]qt]mZr:g*^q=XaZrq$$Xs7--Yr9j^TmHsl=!pf.:roj[OkND!i +jlPS&irS/urnmh7hYu=3gtVh^#2.Y\f@JO'rmUttdf.Vpd*M^:s31Pfrlb>a!6P2\!lr=#rPefT +s24fPrk\WMr4i9Grk86Brk&3Ar42j;s0qp7s0_m6rNcR2Z*F83!jAc0riQ4%s/Z.!!i`,srhfgp +V5=0e!i)Karh9@b!2'4]!hGjOrLs,m5Bs-*JIr0@8Irg3JKrL*POjI>n6r13YTrh'4`r1X.b!2KLgs.o^m +rhgs=WMuntX/i>(Xfek2YctCVf]tXK\!PlPN_?e&t`5T^8`lH.!aT'B^ +b5KN`bl5lacMc)dd.G`_dehMheG[qsf)4/!f`0Y'gAfq-h#6%1hV[5ii;_a9ir.m=jQ5M&joOZ/ +rosIJ!:0XNs6TgSrpTmVs7-*Zs766_rUp3as7cHdrqZQiqYU3gqu,IPJcC<$VuM8~> +JcC<$JcC<$rVu3_q>L3go_\L]qt]mZr:g*^q=XaZrq$$Xs7--Yr9j^TmHsl=!pf.:roj[OkND!i +jlPS&irS/urnmh7hYu=3gtVh^#2.Y\f@JO'rmUttdf.Vpd*M^:s31Pfrlb>a!6P2\!lr=#rPefT +s24fPrk\WMr4i9Grk86Brk&3Ar42j;s0qp7s0_m6rNcR2Z*F83!jAc0riQ4%s/Z.!!i`,srhfgp +V5=0e!i)Karh9@b!2'4]!hGjOrLs,m5Bs-*JIr0@8Irg3JKrL*POjI>n6r13YTrh'4`r1X.b!2KLgs.o^m +rhgs=WMuntX/i>(Xfek2YctCVf]tXK\!PlPN_?e&t`5T^8`lH.!aT'B^ +b5KN`bl5lacMc)dd.G`_dehMheG[qsf)4/!f`0Y'gAfq-h#6%1hV[5ii;_a9ir.m=jQ5M&joOZ/ +rosIJ!:0XNs6TgSrpTmVs7-*Zs766_rUp3as7cHdrqZQiqYU3gqu,IPJcC<$VuM8~> +JcC<$JcC<$rVu0^q>L0fo_\L]qYBdYr:g-_q=XaZrq$'Yrpg$XrU9dS!:BaO!pf.:roj[OkND!i +jlPS&irS/urnmh7hYu=3gtVh^!SQ-)f)aIQrmUttdf.YociDDkc2u87bl5fcaoKQ^aT'<\`r3mV +`;daQ_Z.IO_#1tI^AbhD]`5VC])9,=\Gs&:[f%(rS%;+s4mS/s5*e5ro!h8!94" +JcC<$JcC<$rVu0^q>L0fo_\L]qYBdYr:g-_q=XaZrq$'Yrpg$XrU9dS!:BaO!pf.:roj[OkND!i +jlPS&irS/urnmh7hYu=3gtVh^!SQ-)f)aIQrmUttdf.YociDDkc2u87bl5fcaoKQ^aT'<\`r3mV +`;daQ_Z.IO_#1tI^AbhD]`5VC])9,=\Gs&:[f%(rS%;+s4mS/s5*e5ro!h8!94" +JcC<$JcC<$rVu0^q>L0fo_\L]qYBdYr:g-_q=XaZrq$'Yrpg$XrU9dS!:BaO!pf.:roj[OkND!i +jlPS&irS/urnmh7hYu=3gtVh^!SQ-)f)aIQrmUttdf.YociDDkc2u87bl5fcaoKQ^aT'<\`r3mV +`;daQ_Z.IO_#1tI^AbhD]`5VC])9,=\Gs&:[f%(rS%;+s4mS/s5*e5ro!h8!94" +JcC<$JcC<$qu>s\qYg6foDAC\qYBdYr:g0`q=XaZrq$'Ys7--YrU9dSs6]gP!pf.:rojLJkNDj, +!TiDAirS/urnmh7hYu=3gtVh^!SQ-)f*BmWe^W*te'e6C!mo9>rltSibfp(0s2k>`rQ,#Zs2OuU +s2=rTr5/HLs1nNHs1\KGr4N'Arjr'=s1&*ldci2;edJMAge+;)eec"(qfDaG%g&9Y(g]-(-h>c=3hu2L5i;hm9ir\<'jo4BDkNM./klU/9 +li-5PmI'EAn,MkWnbr"[oCV\Rp&Facp\agcq>U6equ-HirT4$0s+13Cs*t~> +JcC<$JcC<$qu>s\qYg6foDAC\qYBdYr:g0`q=XaZrq$'Ys7--YrU9dSs6]gP!pf.:rojLJkNDj, +!TiDAirS/urnmh7hYu=3gtVh^!SQ-)f*BmWe^W*te'e6C!mo9>rltSibfp(0s2k>`rQ,#Zs2OuU +s2=rTr5/HLs1nNHs1\KGr4N'Arjr'=s1&*ldci2;edJMAge+;)eec"(qfDaG%g&9Y(g]-(-h>c=3hu2L5i;hm9ir\<'jo4BDkNM./klU/9 +li-5PmI'EAn,MkWnbr"[oCV\Rp&Facp\agcq>U6equ-HirT4$0s+13Cs*t~> +JcC<$JcC<$qu>s\qYg6foDAC\qYBdYr:g0`q=XaZrq$'Ys7--YrU9dSs6]gP!pf.:rojLJkNDj, +!TiDAirS/urnmh7hYu=3gtVh^!SQ-)f*BmWe^W*te'e6C!mo9>rltSibfp(0s2k>`rQ,#Zs2OuU +s2=rTr5/HLs1nNHs1\KGr4N'Arjr'=s1&*ldci2;edJMAge+;)eec"(qfDaG%g&9Y(g]-(-h>c=3hu2L5i;hm9ir\<'jo4BDkNM./klU/9 +li-5PmI'EAn,MkWnbr"[oCV\Rp&Facp\agcq>U6equ-HirT4$0s+13Cs*t~> +JcC<$JcC<$q>]d[q>L-eo)&:[qYBdYr:g0`qXsj[rq$*Zs7-*XrpTmTs6]gPs6B[MrosIH!9a@D +!TiDAirS/urnnCGhVR)EgtUT;g=b-2f@SU)ec+&!e'e6Cs3Lblrm(Pgs31Jcs2tA`rQ,#Zs2P#V +rl"iSr5/HLrkSHHrkAEGr4N$@s180>s1&*Hsss/Q+"!3H1% +!NrX*YQ;#7rj)d8[C3NQ\Gj#B]">Vf]tXK\!PlPN_?%Qmrl"oXa8X0[aT0K^bQ#cdc2>leci2;f +dJ_Mke+2#bebn"nfDaG%g&0S'g]-(-h>c@3hu2I7iSrkrj8\3?jo4BDkNM./klU/9li-8Nm/ZSR +n,MnWnc&+ZoDeI]p&Facp\agdq>U6equ$BirT4$0s+13Bs*t~> +JcC<$JcC<$q>]d[q>L-eo)&:[qYBdYr:g0`qXsj[rq$*Zs7-*XrpTmTs6]gPs6B[MrosIH!9a@D +!TiDAirS/urnnCGhVR)EgtUT;g=b-2f@SU)ec+&!e'e6Cs3Lblrm(Pgs31Jcs2tA`rQ,#Zs2P#V +rl"iSr5/HLrkSHHrkAEGr4N$@s180>s1&*Hsss/Q+"!3H1% +!NrX*YQ;#7rj)d8[C3NQ\Gj#B]">Vf]tXK\!PlPN_?%Qmrl"oXa8X0[aT0K^bQ#cdc2>leci2;f +dJ_Mke+2#bebn"nfDaG%g&0S'g]-(-h>c@3hu2I7iSrkrj8\3?jo4BDkNM./klU/9li-8Nm/ZSR +n,MnWnc&+ZoDeI]p&Facp\agdq>U6equ$BirT4$0s+13Bs*t~> +JcC<$JcC<$q>]d[q>L-eo)&:[qYBdYr:g0`qXsj[rq$*Zs7-*XrpTmTs6]gPs6B[MrosIH!9a@D +!TiDAirS/urnnCGhVR)EgtUT;g=b-2f@SU)ec+&!e'e6Cs3Lblrm(Pgs31Jcs2tA`rQ,#Zs2P#V +rl"iSr5/HLrkSHHrkAEGr4N$@s180>s1&*Hsss/Q+"!3H1% +!NrX*YQ;#7rj)d8[C3NQ\Gj#B]">Vf]tXK\!PlPN_?%Qmrl"oXa8X0[aT0K^bQ#cdc2>leci2;f +dJ_Mke+2#bebn"nfDaG%g&0S'g]-(-h>c@3hu2I7iSrkrj8\3?jo4BDkNM./klU/9li-8Nm/ZSR +n,MnWnc&+ZoDeI]p&Facp\agdq>U6equ$BirT4$0s+13Bs*t~> +JcC<$JcC<$q#BXYq>L-eo)&7ZqYBgZr:g0`qt9s\rq$'Ys7--YrpTmTs6]gPs6B[MrosIH!9a@D +!TiDAit:;0iS`YOhVR)EgtUT;g=b03rmq2%ec+&"e'c\Dd/q\@ci25ic2Z#ebQ#`bao0<[a8a0W +`W*mU_u%=N_>_7J^](tI^&5PC]DoJ@\c92>\,E`:[C!=?Zi@?2Z2Us/YHG&-XTGT)X8]+#WMlcp +VZN`lV>d:jUB%%eU&UecTDbA]Sc>5XS,SlTRJE6GQg9t#Q2?gEPPC=>Oo:C;O8P%7NUVo(NW"n6 +O8k=@Oo1CBPQ-mFQ2d0MQi*6NRJrZQS,JlVSbJ`MTB`*@U&C_bU\pqfV>mFkVuN^qWW&nLX/rD) +Xfeh1YctC;ZEpmE[C*HO\%&uZ]"5Md]Y2%o^VIY$_SX4/`5T^8a2e2#!m/U-rlYAec-?44s3L\k +r6bJkrR:Jiq:5;lpXfArrRq)%s4dP.rS@M1s53e5s5F";ro=%>s5j7B!pAe2rosIJ!:0XNs6]jS +rpKpXnaZSK!qZ'VrUp3as7cHdrqZQiqYU6hqu,[VJcC<$T)X<~> +JcC<$JcC<$q#BXYq>L-eo)&7ZqYBgZr:g0`qt9s\rq$'Ys7--YrpTmTs6]gPs6B[MrosIH!9a@D +!TiDAit:;0iS`YOhVR)EgtUT;g=b03rmq2%ec+&"e'c\Dd/q\@ci25ic2Z#ebQ#`bao0<[a8a0W +`W*mU_u%=N_>_7J^](tI^&5PC]DoJ@\c92>\,E`:[C!=?Zi@?2Z2Us/YHG&-XTGT)X8]+#WMlcp +VZN`lV>d:jUB%%eU&UecTDbA]Sc>5XS,SlTRJE6GQg9t#Q2?gEPPC=>Oo:C;O8P%7NUVo(NW"n6 +O8k=@Oo1CBPQ-mFQ2d0MQi*6NRJrZQS,JlVSbJ`MTB`*@U&C_bU\pqfV>mFkVuN^qWW&nLX/rD) +Xfeh1YctC;ZEpmE[C*HO\%&uZ]"5Md]Y2%o^VIY$_SX4/`5T^8a2e2#!m/U-rlYAec-?44s3L\k +r6bJkrR:Jiq:5;lpXfArrRq)%s4dP.rS@M1s53e5s5F";ro=%>s5j7B!pAe2rosIJ!:0XNs6]jS +rpKpXnaZSK!qZ'VrUp3as7cHdrqZQiqYU6hqu,[VJcC<$T)X<~> +JcC<$JcC<$q#BXYq>L-eo)&7ZqYBgZr:g0`qt9s\rq$'Ys7--YrpTmTs6]gPs6B[MrosIH!9a@D +!TiDAit:;0iS`YOhVR)EgtUT;g=b03rmq2%ec+&"e'c\Dd/q\@ci25ic2Z#ebQ#`bao0<[a8a0W +`W*mU_u%=N_>_7J^](tI^&5PC]DoJ@\c92>\,E`:[C!=?Zi@?2Z2Us/YHG&-XTGT)X8]+#WMlcp +VZN`lV>d:jUB%%eU&UecTDbA]Sc>5XS,SlTRJE6GQg9t#Q2?gEPPC=>Oo:C;O8P%7NUVo(NW"n6 +O8k=@Oo1CBPQ-mFQ2d0MQi*6NRJrZQS,JlVSbJ`MTB`*@U&C_bU\pqfV>mFkVuN^qWW&nLX/rD) +Xfeh1YctC;ZEpmE[C*HO\%&uZ]"5Md]Y2%o^VIY$_SX4/`5T^8a2e2#!m/U-rlYAec-?44s3L\k +r6bJkrR:Jiq:5;lpXfArrRq)%s4dP.rS@M1s53e5s5F";ro=%>s5j7B!pAe2rosIJ!:0XNs6]jS +rpKpXnaZSK!qZ'VrUp3as7cHdrqZQiqYU6hqu,[VJcC<$T)X<~> +JcC<$JcC<$pAaFWq>L-enb`.YqYBgZrV-9aqt9s\s7?0Zs7--YrU0gUmHso>s6B[MrosIH!9a@D +!TiDAisar+iS`YOhqm2Fgt^Z`g&]mZrmq5&e^aZK!n5TGrm:eocd2U9s3:SfrQG5`s2k5\rl>&Y +qo/TRrknWMs2"]Mr4i6Fs1SBDrk&3Arji'=s0r!9s0_m6rj2X1!3uO-s/uF*riQ4%!3?+!s/?!s +rhodn!2]Xi!i)KarLs7as.B7]s.0.Zqj[PQrL*/BjHoY-p6GQ?rKI&?rfR,?pQ,*0qMk91q2bN: +rfR,ArfdAHr0@;Js-NYNs-`nUr1!\UrginWr1EhYhkBn@rM04bs/#^lrMT[o!3,ps!irE(riH4( +YPta1Z*L[AZa@.>[KX.M\[f;`rk&TO^;%Fu_84"*_o2Pn!QN1ZaT'?^b5TTabQ,odcMu5jd/;;j +df._jeG@_kf(7Mlf_jG"gA]k+h#-".hZ)L3i;_d9ir8! +JcC<$JcC<$pAaFWq>L-enb`.YqYBgZrV-9aqt9s\s7?0Zs7--YrU0gUmHso>s6B[MrosIH!9a@D +!TiDAisar+iS`YOhqm2Fgt^Z`g&]mZrmq5&e^aZK!n5TGrm:eocd2U9s3:SfrQG5`s2k5\rl>&Y +qo/TRrknWMs2"]Mr4i6Fs1SBDrk&3Arji'=s0r!9s0_m6rj2X1!3uO-s/uF*riQ4%!3?+!s/?!s +rhodn!2]Xi!i)KarLs7as.B7]s.0.Zqj[PQrL*/BjHoY-p6GQ?rKI&?rfR,?pQ,*0qMk91q2bN: +rfR,ArfdAHr0@;Js-NYNs-`nUr1!\UrginWr1EhYhkBn@rM04bs/#^lrMT[o!3,ps!irE(riH4( +YPta1Z*L[AZa@.>[KX.M\[f;`rk&TO^;%Fu_84"*_o2Pn!QN1ZaT'?^b5TTabQ,odcMu5jd/;;j +df._jeG@_kf(7Mlf_jG"gA]k+h#-".hZ)L3i;_d9ir8! +JcC<$JcC<$pAaFWq>L-enb`.YqYBgZrV-9aqt9s\s7?0Zs7--YrU0gUmHso>s6B[MrosIH!9a@D +!TiDAisar+iS`YOhqm2Fgt^Z`g&]mZrmq5&e^aZK!n5TGrm:eocd2U9s3:SfrQG5`s2k5\rl>&Y +qo/TRrknWMs2"]Mr4i6Fs1SBDrk&3Arji'=s0r!9s0_m6rj2X1!3uO-s/uF*riQ4%!3?+!s/?!s +rhodn!2]Xi!i)KarLs7as.B7]s.0.Zqj[PQrL*/BjHoY-p6GQ?rKI&?rfR,?pQ,*0qMk91q2bN: +rfR,ArfdAHr0@;Js-NYNs-`nUr1!\UrginWr1EhYhkBn@rM04bs/#^lrMT[o!3,ps!irE(riH4( +YPta1Z*L[AZa@.>[KX.M\[f;`rk&TO^;%Fu_84"*_o2Pn!QN1ZaT'?^b5TTabQ,odcMu5jd/;;j +df._jeG@_kf(7Mlf_jG"gA]k+h#-".hZ)L3i;_d9ir8! +JcC<$JcC<$pAaCVq#1$dnGE%XqYBj[rV-s6B[MrosIH!9a@D +!TiDAis4T&iS`YOhqn@g!SlH/g'?<`f[na+f%'cLs3gtrrmCbms3L\is3:SfrQG5`rlP)Zs2Y,Y +r5JZRrknWMs2"]Mr4i9Gs1S?Cs189BrOMsd:jU]7(eU&UecTDY;[Sc5/US,A`MRG!u(Qi*0EQ2QsGPPLC?Oo1=$O8Y1=Oo(=APQ$gF +Q2d0LQi3mFjVuN^qWVrguX/rE%XTu#4YHY79Z*OA8 +'=>0U[^WcV\[f;`]Y(qk^;%Fu_>_:U_o0O5`l?'ua8sE*rlb>c!6tJf!mf6?r6bPmrmU_nr71\q +n^mWir7Uo"rnIG-qq_;/s53e5s5F";rT!q=!9O1A!pAe2rosIJs6K[N!q#FDrpTmVs7-*Zs7?9_ +rUp3as7cHds7uZjqYU6hqu,j[JcC<$QiDR~> +JcC<$JcC<$pAaCVq#1$dnGE%XqYBj[rV-s6B[MrosIH!9a@D +!TiDAis4T&iS`YOhqn@g!SlH/g'?<`f[na+f%'cLs3gtrrmCbms3L\is3:SfrQG5`rlP)Zs2Y,Y +r5JZRrknWMs2"]Mr4i9Gs1S?Cs189BrOMsd:jU]7(eU&UecTDY;[Sc5/US,A`MRG!u(Qi*0EQ2QsGPPLC?Oo1=$O8Y1=Oo(=APQ$gF +Q2d0LQi3mFjVuN^qWVrguX/rE%XTu#4YHY79Z*OA8 +'=>0U[^WcV\[f;`]Y(qk^;%Fu_>_:U_o0O5`l?'ua8sE*rlb>c!6tJf!mf6?r6bPmrmU_nr71\q +n^mWir7Uo"rnIG-qq_;/s53e5s5F";rT!q=!9O1A!pAe2rosIJs6K[N!q#FDrpTmVs7-*Zs7?9_ +rUp3as7cHds7uZjqYU6hqu,j[JcC<$QiDR~> +JcC<$JcC<$pAaCVq#1$dnGE%XqYBj[rV-s6B[MrosIH!9a@D +!TiDAis4T&iS`YOhqn@g!SlH/g'?<`f[na+f%'cLs3gtrrmCbms3L\is3:SfrQG5`rlP)Zs2Y,Y +r5JZRrknWMs2"]Mr4i9Gs1S?Cs189BrOMsd:jU]7(eU&UecTDY;[Sc5/US,A`MRG!u(Qi*0EQ2QsGPPLC?Oo1=$O8Y1=Oo(=APQ$gF +Q2d0LQi3mFjVuN^qWVrguX/rE%XTu#4YHY79Z*OA8 +'=>0U[^WcV\[f;`]Y(qk^;%Fu_>_:U_o0O5`l?'ua8sE*rlb>c!6tJf!mf6?r6bPmrmU_nr71\q +n^mWir7Uo"rnIG-qq_;/s53e5s5F";rT!q=!9O1A!pAe2rosIJs6K[N!q#FDrpTmVs7-*Zs7?9_ +rUp3as7cHds7uZjqYU6hqu,j[JcC<$QiDR~> +JcC<$JcC<$p&F:Uq#1!cn,)qWqt]s\rV-\,a#:[KaMrpp*\ +s7H9_s7ZKer:p9erqcNhr;?KkmJ_\:JcCu7J,~> +JcC<$JcC<$p&F:Uq#1!cn,)qWqt]s\rV-\,a#:[KaMrpp*\ +s7H9_s7ZKer:p9erqcNhr;?KkmJ_\:JcCu7J,~> +JcC<$JcC<$p&F:Uq#1!cn,)qWqt]s\rV-\,a#:[KaMrpp*\ +s7H9_s7ZKer:p9erqcNhr;?KkmJ_\:JcCu7J,~> +JcC<$JcC<$oDe(Sp\jmbn,)qWqt^!]rV-+P5^[EPl-gGQN*jdJqYpe,7_pec"(nfD=.p +g%3qrg\oq(h>Z:2hu)F4iW%p9j8\3?jo+U6fqu$BirUBf;s+133s*t~> +JcC<$JcC<$oDe(Sp\jmbn,)qWqt^!]rV-+P5^[EPl-gGQN*jdJqYpe,7_pec"(nfD=.p +g%3qrg\oq(h>Z:2hu)F4iW%p9j8\3?jo+U6fqu$BirUBf;s+133s*t~> +JcC<$JcC<$oDe(Sp\jmbn,)qWqt^!]rV-+P5^[EPl-gGQN*jdJqYpe,7_pec"(nfD=.p +g%3qrg\oq(h>Z:2hu)F4iW%p9j8\3?jo+U6fqu$BirUBf;s+133s*t~> +JcC<$JcC<$oDe"Qp\jjan,)tXqt^!]rqHEcqt:!]rq$*Zs7$*YrU9dS!:BdPs6B[MrosIH!9a@D +#Nb%-j5].YiVqa?hqm5Gh;$f?rn7G,f\$2Ts4.2#rm^tss3gkns3UelrQbGfs31A`s2t>_qoJcW +rl4iSrl"iSr5/KMrkSKIs1\NHrk/9Cs183?s0r'Ql^[+,r0mPOq3_,IrKd;Fr07,Ck*#Y+rfm;Frg*SNr0[MP +s-inUrga"ZrLX"\rh01_rM':doq_&Qn##fVri#gqr2Tass/c4%s/uC*ricF.ZMq0<['ddc2Q#gcN)>jdJqYpe,@eqec+.rfDF4sg$dYl +g\oq'h>Z:1hu)F4iW%p8j8\3?jo4EBkPscFl2U&Kli-8NmJlVRn,MkWnbr%YoDeI]p&Facp\agd +q>U6equ-HkrUBf;s+131s*t~> +JcC<$JcC<$oDe"Qp\jjan,)tXqt^!]rqHEcqt:!]rq$*Zs7$*YrU9dS!:BdPs6B[MrosIH!9a@D +#Nb%-j5].YiVqa?hqm5Gh;$f?rn7G,f\$2Ts4.2#rm^tss3gkns3UelrQbGfs31A`s2t>_qoJcW +rl4iSrl"iSr5/KMrkSKIs1\NHrk/9Cs183?s0r'Ql^[+,r0mPOq3_,IrKd;Fr07,Ck*#Y+rfm;Frg*SNr0[MP +s-inUrga"ZrLX"\rh01_rM':doq_&Qn##fVri#gqr2Tass/c4%s/uC*ricF.ZMq0<['ddc2Q#gcN)>jdJqYpe,@eqec+.rfDF4sg$dYl +g\oq'h>Z:1hu)F4iW%p8j8\3?jo4EBkPscFl2U&Kli-8NmJlVRn,MkWnbr%YoDeI]p&Facp\agd +q>U6equ-HkrUBf;s+131s*t~> +JcC<$JcC<$oDe"Qp\jjan,)tXqt^!]rqHEcqt:!]rq$*Zs7$*YrU9dS!:BdPs6B[MrosIH!9a@D +#Nb%-j5].YiVqa?hqm5Gh;$f?rn7G,f\$2Ts4.2#rm^tss3gkns3UelrQbGfs31A`s2t>_qoJcW +rl4iSrl"iSr5/KMrkSKIs1\NHrk/9Cs183?s0r'Ql^[+,r0mPOq3_,IrKd;Fr07,Ck*#Y+rfm;Frg*SNr0[MP +s-inUrga"ZrLX"\rh01_rM':doq_&Qn##fVri#gqr2Tass/c4%s/uC*ricF.ZMq0<['ddc2Q#gcN)>jdJqYpe,@eqec+.rfDF4sg$dYl +g\oq'h>Z:1hu)F4iW%p8j8\3?jo4EBkPscFl2U&Kli-8NmJlVRn,MkWnbr%YoDeI]p&Facp\agd +q>U6equ-HkrUBf;s+131s*t~> +JcC<$JcC<$nc.bNp\jg`n,)tXr;$-_rqHEcr:U']s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D +!p/M(ro4%=iVqa:hqm5hh#Zerlk;`rlY5^qoJcW +rl4iSs2=oSr5/KMs1nTJs1SKHrOi0B!4r->!k>_KrjDm9[']h=!j])9ricI-Y-.c+!j&H'ri6!t +!3#jos/,gmrM9IgrhB:`rh01]n=J[2pmh)Jr0mSPqO%5JrKd8EqipH2r07#Brg*SNr0[MPrgNeT +s.'(ZrLX%]rh01_rhBCeqP="bq52uGr2BRnql9Xrs/c1$s/uC*ricI/ZEjJ9!OT96[K3kIrj`'@ +]DfGH]tV7r^qp#e&AuH*`Q#p +JcC<$JcC<$nc.bNp\jg`n,)tXr;$-_rqHEcr:U']s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D +!p/M(ro4%=iVqa:hqm5hh#Zerlk;`rlY5^qoJcW +rl4iSs2=oSr5/KMs1nTJs1SKHrOi0B!4r->!k>_KrjDm9[']h=!j])9ricI-Y-.c+!j&H'ri6!t +!3#jos/,gmrM9IgrhB:`rh01]n=J[2pmh)Jr0mSPqO%5JrKd8EqipH2r07#Brg*SNr0[MPrgNeT +s.'(ZrLX%]rh01_rhBCeqP="bq52uGr2BRnql9Xrs/c1$s/uC*ricI/ZEjJ9!OT96[K3kIrj`'@ +]DfGH]tV7r^qp#e&AuH*`Q#p +JcC<$JcC<$nc.bNp\jg`n,)tXr;$-_rqHEcr:U']s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D +!p/M(ro4%=iVqa:hqm5hh#Zerlk;`rlY5^qoJcW +rl4iSs2=oSr5/KMs1nTJs1SKHrOi0B!4r->!k>_KrjDm9[']h=!j])9ricI-Y-.c+!j&H'ri6!t +!3#jos/,gmrM9IgrhB:`rh01]n=J[2pmh)Jr0mSPqO%5JrKd8EqipH2r07#Brg*SNr0[MPrgNeT +s.'(ZrLX%]rh01_rhBCeqP="bq52uGr2BRnql9Xrs/c1$s/uC*ricI/ZEjJ9!OT96[K3kIrj`'@ +]DfGH]tV7r^qp#e&AuH*`Q#p +JcC<$JcC<$nGhYMpAO^_n,)tXr;$0`rqHEcr:U']s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D +!p/M(ro4%=iVqd8hZ2O4h#cBdg]#n.g"=sVfDjG%ec+(ue,RkpdJqSmci)/gc2PrabPoZ`ans0Y +a8X*U`W*mU_u7IP_>h=L^]2"J^&>SF]=PTQ\c9/>\,Ni9[/dT5ZN@G;Z2Us/YHG&-XoGI&X8T%" +WMlcoVuNXoV>R.hU]."aU&:SZT@]\2Sc##QS,SlTRJE6LQi*0BQ1L76Q2[*KQi!0MRK&`RS,]#Y +Sc#)ZTDtS^U&UkdU\gkcV>R4UVsLAYWVWXoX8]3uXoGO(YPk[,Z*L\7ZQ?K][C3NQ\%&uZ]"5Md +]Y2%n^V@S#_SX4.`5T^8a8X-\aiaV+!R/gfcMu2jd/MGmdf7eqeGn(uf)4/!f_sLrgA'Fsh"BM% +hYuF/i;_d8ir%j:jT"??k5XWEkl0iHlMp2Lm/QJQmf)\TnGi%Wo)J=]o_nI_pAambq#C0hqYU0g +r;?N`rdk*#s,?u.~> +JcC<$JcC<$nGhYMpAO^_n,)tXr;$0`rqHEcr:U']s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D +!p/M(ro4%=iVqd8hZ2O4h#cBdg]#n.g"=sVfDjG%ec+(ue,RkpdJqSmci)/gc2PrabPoZ`ans0Y +a8X*U`W*mU_u7IP_>h=L^]2"J^&>SF]=PTQ\c9/>\,Ni9[/dT5ZN@G;Z2Us/YHG&-XoGI&X8T%" +WMlcoVuNXoV>R.hU]."aU&:SZT@]\2Sc##QS,SlTRJE6LQi*0BQ1L76Q2[*KQi!0MRK&`RS,]#Y +Sc#)ZTDtS^U&UkdU\gkcV>R4UVsLAYWVWXoX8]3uXoGO(YPk[,Z*L\7ZQ?K][C3NQ\%&uZ]"5Md +]Y2%n^V@S#_SX4.`5T^8a8X-\aiaV+!R/gfcMu2jd/MGmdf7eqeGn(uf)4/!f_sLrgA'Fsh"BM% +hYuF/i;_d8ir%j:jT"??k5XWEkl0iHlMp2Lm/QJQmf)\TnGi%Wo)J=]o_nI_pAambq#C0hqYU0g +r;?N`rdk*#s,?u.~> +JcC<$JcC<$nGhYMpAO^_n,)tXr;$0`rqHEcr:U']s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D +!p/M(ro4%=iVqd8hZ2O4h#cBdg]#n.g"=sVfDjG%ec+(ue,RkpdJqSmci)/gc2PrabPoZ`ans0Y +a8X*U`W*mU_u7IP_>h=L^]2"J^&>SF]=PTQ\c9/>\,Ni9[/dT5ZN@G;Z2Us/YHG&-XoGI&X8T%" +WMlcoVuNXoV>R.hU]."aU&:SZT@]\2Sc##QS,SlTRJE6LQi*0BQ1L76Q2[*KQi!0MRK&`RS,]#Y +Sc#)ZTDtS^U&UkdU\gkcV>R4UVsLAYWVWXoX8]3uXoGO(YPk[,Z*L\7ZQ?K][C3NQ\%&uZ]"5Md +]Y2%n^V@S#_SX4.`5T^8a8X-\aiaV+!R/gfcMu2jd/MGmdf7eqeGn(uf)4/!f_sLrgA'Fsh"BM% +hYuF/i;_d8ir%j:jT"??k5XWEkl0iHlMp2Lm/QJQmf)\TnGi%Wo)J=]o_nI_pAambq#C0hqYU0g +r;?N`rdk*#s,?u.~> +JcC<$JcC<$nGhSKpAO[^n,*"Yr;$0`rqHEcr:U*^s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D +s5a7Aro47CiSi_Qhr!;ih>c71g]#q,g&K_(fDjG%ec+(ue,RkodJqSmchu)fc2PrabPfT_ans0Y +a8a0W`W!gU_u7IP_>h=M^]2%J^&G\E])]GA\c9/>\,Ni9[/dT5Zi@<2Z2V!-Y5ka)XoGL&X8].! +WW/pqVuNXoV>I(fU]."]U%+fd@eVtd4PWUm.gX8]3tXoGR(YPk[,Z*L\7Zi@B4[JmTB\%&rY\[oDb]Y(ql +rkAfU_8=(,`5KX6`lJ)"#0G$2bKS2TrltPjd/MGmdf7eqeGn)!f)4/!f`'S"gA9Ruh!j.thYl@. +i;V^7ir%j:jT"??k5XWEkl'cGlMp2Lm/QJQmf)\TnGi%Wo)J=]o_nI_pAambq#C0hqYL*fr;?Na +rdk*#s,6o-~> +JcC<$JcC<$nGhSKpAO[^n,*"Yr;$0`rqHEcr:U*^s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D +s5a7Aro47CiSi_Qhr!;ih>c71g]#q,g&K_(fDjG%ec+(ue,RkodJqSmchu)fc2PrabPfT_ans0Y +a8a0W`W!gU_u7IP_>h=M^]2%J^&G\E])]GA\c9/>\,Ni9[/dT5Zi@<2Z2V!-Y5ka)XoGL&X8].! +WW/pqVuNXoV>I(fU]."]U%+fd@eVtd4PWUm.gX8]3tXoGR(YPk[,Z*L\7Zi@B4[JmTB\%&rY\[oDb]Y(ql +rkAfU_8=(,`5KX6`lJ)"#0G$2bKS2TrltPjd/MGmdf7eqeGn)!f)4/!f`'S"gA9Ruh!j.thYl@. +i;V^7ir%j:jT"??k5XWEkl'cGlMp2Lm/QJQmf)\TnGi%Wo)J=]o_nI_pAambq#C0hqYL*fr;?Na +rdk*#s,6o-~> +JcC<$JcC<$nGhSKpAO[^n,*"Yr;$0`rqHEcr:U*^s7?3[s7--YrpTmT!:BdPs6B[MrosIH!9a@D +s5a7Aro47CiSi_Qhr!;ih>c71g]#q,g&K_(fDjG%ec+(ue,RkodJqSmchu)fc2PrabPfT_ans0Y +a8a0W`W!gU_u7IP_>h=M^]2%J^&G\E])]GA\c9/>\,Ni9[/dT5Zi@<2Z2V!-Y5ka)XoGL&X8].! +WW/pqVuNXoV>I(fU]."]U%+fd@eVtd4PWUm.gX8]3tXoGR(YPk[,Z*L\7Zi@B4[JmTB\%&rY\[oDb]Y(ql +rkAfU_8=(,`5KX6`lJ)"#0G$2bKS2TrltPjd/MGmdf7eqeGn)!f)4/!f`'S"gA9Ruh!j.thYl@. +i;V^7ir%j:jT"??k5XWEkl'cGlMp2Lm/QJQmf)\TnGi%Wo)J=]o_nI_pAambq#C0hqYL*fr;?Na +rdk*#s,6o-~> +JcC<$JcC<$mJl8Hp&4R]nb`4[r;$3arqHEcr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojIIkPjWD +jT+B@ir\6!iVqa:hqm5hh#cBdg]#q,f`9\'fDjG%ec""te,RkodJqSmchl#ec2Pr`bPoZ`ans0Y +a8a0W`W*mV_u7IP_>h=M^]2"J^&G\E]DoJA\HfXR\$i`Q[C#q>s0;X0rilF+s/u@'!j&H'rMoms +s/>morhf^lqP=(br1_i;pRqDUpn%GTrLE_RrL3\QpmCoEns90>q3_/Ls-ikTrga"ZrLX"\s.K=a +s.]Lfr1s@hrhfOir2BLlfrFqMrN,muriZ:)rNQ=,s0DX1s0Md6rjMj9!4`$=!P5oB]F)?d^V@S" +_8=(,`;[^e`lH0Aai_cLbKS5UcHab^d/MDodaQ\EeGn)!f)=5#f`'S#gATe&h!NqohYZ4+i;V^7 +iqqd9jT"?>k5XWEkl'cGlMp2Lm/QJQmeuSUnF?&Io)J=]o_nI_pAambq#:*gqYU0gr;?N`rdk*# +s,6o-~> +JcC<$JcC<$mJl8Hp&4R]nb`4[r;$3arqHEcr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojIIkPjWD +jT+B@ir\6!iVqa:hqm5hh#cBdg]#q,f`9\'fDjG%ec""te,RkodJqSmchl#ec2Pr`bPoZ`ans0Y +a8a0W`W*mV_u7IP_>h=M^]2"J^&G\E]DoJA\HfXR\$i`Q[C#q>s0;X0rilF+s/u@'!j&H'rMoms +s/>morhf^lqP=(br1_i;pRqDUpn%GTrLE_RrL3\QpmCoEns90>q3_/Ls-ikTrga"ZrLX"\s.K=a +s.]Lfr1s@hrhfOir2BLlfrFqMrN,muriZ:)rNQ=,s0DX1s0Md6rjMj9!4`$=!P5oB]F)?d^V@S" +_8=(,`;[^e`lH0Aai_cLbKS5UcHab^d/MDodaQ\EeGn)!f)=5#f`'S#gATe&h!NqohYZ4+i;V^7 +iqqd9jT"?>k5XWEkl'cGlMp2Lm/QJQmeuSUnF?&Io)J=]o_nI_pAambq#:*gqYU0gr;?N`rdk*# +s,6o-~> +JcC<$JcC<$mJl8Hp&4R]nb`4[r;$3arqHEcr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojIIkPjWD +jT+B@ir\6!iVqa:hqm5hh#cBdg]#q,f`9\'fDjG%ec""te,RkodJqSmchl#ec2Pr`bPoZ`ans0Y +a8a0W`W*mV_u7IP_>h=M^]2"J^&G\E]DoJA\HfXR\$i`Q[C#q>s0;X0rilF+s/u@'!j&H'rMoms +s/>morhf^lqP=(br1_i;pRqDUpn%GTrLE_RrL3\QpmCoEns90>q3_/Ls-ikTrga"ZrLX"\s.K=a +s.]Lfr1s@hrhfOir2BLlfrFqMrN,muriZ:)rNQ=,s0DX1s0Md6rjMj9!4`$=!P5oB]F)?d^V@S" +_8=(,`;[^e`lH0Aai_cLbKS5UcHab^d/MDodaQ\EeGn)!f)=5#f`'S#gATe&h!NqohYZ4+i;V^7 +iqqd9jT"?>k5XWEkl'cGlMp2Lm/QJQmeuSUnF?&Io)J=]o_nI_pAambq#:*gqYU0gr;?N`rdk*# +s,6o-~> +JcC<$JcC<$m/Q,Fo_nL]nb`4[rV?dc2Puncd:%ddF-Ilrm^tus47/#s4IA)qqD&(r7pl!p>5W&pYc#/rSmb8roF(? +rT=.Cs60CFs69UMrTsROs6fjSs6p$YrUU![s7H9_rq?Bdr:p +JcC<$JcC<$m/Q,Fo_nL]nb`4[rV?dc2Puncd:%ddF-Ilrm^tus47/#s4IA)qqD&(r7pl!p>5W&pYc#/rSmb8roF(? +rT=.Cs60CFs69UMrTsROs6fjSs6p$YrUU![s7H9_rq?Bdr:p +JcC<$JcC<$m/Q,Fo_nL]nb`4[rV?dc2Puncd:%ddF-Ilrm^tus47/#s4IA)qqD&(r7pl!p>5W&pYc#/rSmb8roF(? +rT=.Cs60CFs69UMrTsROs6fjSs6p$YrUU![s7H9_rq?Bdr:p +JcC<$JcC<$lMolCo_nI\o)&@]rV?h=M^B2-_^&G\E])]GA\H9:M\,Nf;[C!=?ZN@G;Z2V!-Y5ka(XoGL&X8T'u +WW&joVuU\UYXU&CY_TDG/YSc,)SS,A`PRIHU@RJiTOS,SrXSc#)ZTDtS^U&UkeU]%"f +V>mFjVuEXoWVNRkX7NFNXo,@$YPYR(Z2_-.Zi@E4[JmT9\%&sI\H0:Rrk&9F^AbkJ^qp#e"iJ9t +`Q#sta8sE*rlY>dc2Puhcd;[=!n,QHrmV#"f%0fOs4IA)r7_/)rnR8(ptk]$oAKQ*rSm_7roF(? +r9"%Bs60FGs6BXMrTsROs6fjSs7$'YrUU![s7H9_s7ZKer:p9erqcNhrVZTlnc"+>JcCW-J,~> +JcC<$JcC<$lMolCo_nI\o)&@]rV?h=M^B2-_^&G\E])]GA\H9:M\,Nf;[C!=?ZN@G;Z2V!-Y5ka(XoGL&X8T'u +WW&joVuU\UYXU&CY_TDG/YSc,)SS,A`PRIHU@RJiTOS,SrXSc#)ZTDtS^U&UkeU]%"f +V>mFjVuEXoWVNRkX7NFNXo,@$YPYR(Z2_-.Zi@E4[JmT9\%&sI\H0:Rrk&9F^AbkJ^qp#e"iJ9t +`Q#sta8sE*rlY>dc2Puhcd;[=!n,QHrmV#"f%0fOs4IA)r7_/)rnR8(ptk]$oAKQ*rSm_7roF(? +r9"%Bs60FGs6BXMrTsROs6fjSs7$'YrUU![s7H9_s7ZKer:p9erqcNhrVZTlnc"+>JcCW-J,~> +JcC<$JcC<$lMolCo_nI\o)&@]rV?h=M^B2-_^&G\E])]GA\H9:M\,Nf;[C!=?ZN@G;Z2V!-Y5ka(XoGL&X8T'u +WW&joVuU\UYXU&CY_TDG/YSc,)SS,A`PRIHU@RJiTOS,SrXSc#)ZTDtS^U&UkeU]%"f +V>mFjVuEXoWVNRkX7NFNXo,@$YPYR(Z2_-.Zi@E4[JmT9\%&sI\H0:Rrk&9F^AbkJ^qp#e"iJ9t +`Q#sta8sE*rlY>dc2Puhcd;[=!n,QHrmV#"f%0fOs4IA)r7_/)rnR8(ptk]$oAKQ*rSm_7roF(? +r9"%Bs60FGs6BXMrTsROs6fjSs7$'YrUU![s7H9_s7ZKer:p9erqcNhrVZTlnc"+>JcCW-J,~> +JcC<$JcC<$kl9W@oDSC\o_\R_rV?iSjdo!oMkkrn[V0s4dP,s4RG)rR_)#rmgqrs3ptqqU,;hrm1GdrQY>cqoeu]s2k2[ +s2Y/ZrPefT!5ncP!l;[frkJKI!58BEs189Brji'=!4Vs9s0Vj6rj2X1!3uL,!jAc0rN6+$s/Z't +s/H!rqPX7gq5)W;qkO(`q4[b[rh'%YrLNnWpRCoGrgEMLpm_8QrgitYs.B=ar1X.bs.fOgs/#^l +rMTXnri,dprN#jtfrb(Qr3,t$riuI.rNlO2s0_j7s0i!WcHjkadF$Cje,IkseH"2!fDjJ'g&0S'g]-()h>?((hsB:uiVhd3j8S-=jo"9@ +kPj]Dl2U&Kli$2MmJlVQn,MnWnbr%YoDeI]p&Fabp\jmdq>U6equ-HjrUTr=s+13,s*t~> +JcC<$JcC<$kl9W@oDSC\o_\R_rV?iSjdo!oMkkrn[V0s4dP,s4RG)rR_)#rmgqrs3ptqqU,;hrm1GdrQY>cqoeu]s2k2[ +s2Y/ZrPefT!5ncP!l;[frkJKI!58BEs189Brji'=!4Vs9s0Vj6rj2X1!3uL,!jAc0rN6+$s/Z't +s/H!rqPX7gq5)W;qkO(`q4[b[rh'%YrLNnWpRCoGrgEMLpm_8QrgitYs.B=ar1X.bs.fOgs/#^l +rMTXnri,dprN#jtfrb(Qr3,t$riuI.rNlO2s0_j7s0i!WcHjkadF$Cje,IkseH"2!fDjJ'g&0S'g]-()h>?((hsB:uiVhd3j8S-=jo"9@ +kPj]Dl2U&Kli$2MmJlVQn,MnWnbr%YoDeI]p&Fabp\jmdq>U6equ-HjrUTr=s+13,s*t~> +JcC<$JcC<$kl9W@oDSC\o_\R_rV?iSjdo!oMkkrn[V0s4dP,s4RG)rR_)#rmgqrs3ptqqU,;hrm1GdrQY>cqoeu]s2k2[ +s2Y/ZrPefT!5ncP!l;[frkJKI!58BEs189Brji'=!4Vs9s0Vj6rj2X1!3uL,!jAc0rN6+$s/Z't +s/H!rqPX7gq5)W;qkO(`q4[b[rh'%YrLNnWpRCoGrgEMLpm_8QrgitYs.B=ar1X.bs.fOgs/#^l +rMTXnri,dprN#jtfrb(Qr3,t$riuI.rNlO2s0_j7s0i!WcHjkadF$Cje,IkseH"2!fDjJ'g&0S'g]-()h>?((hsB:uiVhd3j8S-=jo"9@ +kPj]Dl2U&Kli$2MmJlVQn,MnWnbr%YoDeI]p&Fabp\jmdq>U6equ-HjrUTr=s+13,s*t~> +JcC<$JcC<$kPsH=oDSF]o_\R_rV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj, +!p/M(ro4(>iSjdos5*h5rS@M/!8IJ+s4RG)r7Cu"s4."rrmUkpqU,;hrQk>crltGdr6,)^s2k2[ +s2Y/Zrl+oUs24iQs1n]NrkJKI!58BEs189Brji'=!4Vs9s0Vj6rj2X1s0;R-s0)I*rN6+$s/Z't +ri,jppS[Y\iMH1Br1j4bqP!n]rL`qXrLNkVjI?+)rnIJ.qq_2,r86l!pYl#/puDA7roO%>s6'CFrTX=H +s6KXMs6]jSrU9dUs7-'Ys7?9_rUp3arqH?cs7uZjqYU6hr;H0bJcC<$M>r)~> +JcC<$JcC<$kPsH=oDSF]o_\R_rV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj, +!p/M(ro4(>iSjdos5*h5rS@M/!8IJ+s4RG)r7Cu"s4."rrmUkpqU,;hrQk>crltGdr6,)^s2k2[ +s2Y/Zrl+oUs24iQs1n]NrkJKI!58BEs189Brji'=!4Vs9s0Vj6rj2X1s0;R-s0)I*rN6+$s/Z't +ri,jppS[Y\iMH1Br1j4bqP!n]rL`qXrLNkVjI?+)rnIJ.qq_2,r86l!pYl#/puDA7roO%>s6'CFrTX=H +s6KXMs6]jSrU9dUs7-'Ys7?9_rUp3arqH?cs7uZjqYU6hr;H0bJcC<$M>r)~> +JcC<$JcC<$kPsH=oDSF]o_\R_rV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj, +!p/M(ro4(>iSjdos5*h5rS@M/!8IJ+s4RG)r7Cu"s4."rrmUkpqU,;hrQk>crltGdr6,)^s2k2[ +s2Y/Zrl+oUs24iQs1n]NrkJKI!58BEs189Brji'=!4Vs9s0Vj6rj2X1s0;R-s0)I*rN6+$s/Z't +ri,jppS[Y\iMH1Br1j4bqP!n]rL`qXrLNkVjI?+)rnIJ.qq_2,r86l!pYl#/puDA7roO%>s6'CFrTX=H +s6KXMs6]jSrU9dUs7-'Ys7?9_rUp3arqH?cs7uZjqYU6hr;H0bJcC<$M>r)~> +JcC<$JcC<$jo=3:oDSF]p&"^arV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj, +!p/M(ro=%\,E`:[C!=?Zi@<2Z2Lp,YQ(d(XoGL%X8Apq +WVi^FVtd.dV>-kbU]."aU&CY`TD5#USbJZQS+iHOSberWTDtS^U&UkdU]%"gV>mFkVuEXpWVidq +X8]3sXo,?uYL]rVZ2M!*Zi7?3[JdQ6[fEr:\Hf^X]=bei]tXK\!PlPN_@OQ&`Poj:a2l?Db0%oN +bg$.4!RK-ld/h\Erm^tu!7q/$s4IA)rn@D,rnRG-rndV2oAK9"pYto,rT*q=qr[n@s60CFs6BXM +r9XINs6fjSs7$'YrUU![s7H9_rq?Bdr:p9erqcNhrVZTlnc"+>JcCQ+J,~> +JcC<$JcC<$jo=3:oDSF]p&"^arV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj, +!p/M(ro=%\,E`:[C!=?Zi@<2Z2Lp,YQ(d(XoGL%X8Apq +WVi^FVtd.dV>-kbU]."aU&CY`TD5#USbJZQS+iHOSberWTDtS^U&UkdU]%"gV>mFkVuEXpWVidq +X8]3sXo,?uYL]rVZ2M!*Zi7?3[JdQ6[fEr:\Hf^X]=bei]tXK\!PlPN_@OQ&`Poj:a2l?Db0%oN +bg$.4!RK-ld/h\Erm^tu!7q/$s4IA)rn@D,rnRG-rndV2oAK9"pYto,rT*q=qr[n@s60CFs6BXM +r9XINs6fjSs7$'YrUU![s7H9_rq?Bdr:p9erqcNhrVZTlnc"+>JcCQ+J,~> +JcC<$JcC<$jo=3:oDSF]p&"^arV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj, +!p/M(ro=%\,E`:[C!=?Zi@<2Z2Lp,YQ(d(XoGL%X8Apq +WVi^FVtd.dV>-kbU]."aU&CY`TD5#USbJZQS+iHOSberWTDtS^U&UkdU]%"gV>mFkVuEXpWVidq +X8]3sXo,?uYL]rVZ2M!*Zi7?3[JdQ6[fEr:\Hf^X]=bei]tXK\!PlPN_@OQ&`Poj:a2l?Db0%oN +bg$.4!RK-ld/h\Erm^tu!7q/$s4IA)rn@D,rnRG-rndV2oAK9"pYto,rT*q=qr[n@s60CFs6BXM +r9XINs6fjSs7$'YrUU![s7H9_rq?Bdr:p9erqcNhrVZTlnc"+>JcCQ+J,~> +JcC<$JcC<$jT"$7oDSI^pA=gbrV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj, +s5a7Aro=%(r7Cr!rmgkprmUhoq9f2grm1JerltGdrQG2_s2k8] +s2Y/Zrl+oUs24iQ!l;[frkANK]tOEX!kZ%Trj`*?\$u@F!k#DBrj2X1s0;O,s0)I*r2p"#ri>jp +qPiGPm&0cYrMB=crhKFdqP!n]rL`eTn"'3Erh'1_r1X.brhKFfs/#amrMTXns/Gssri?(#qlTh" +rNG^pi3E0bqQp1.rjD^5s0r$q^V@S"_8=(,_o0O5`l?'?aN;U(b5oi3rltPj +d/MDndaS3F!nGlQrmq5(g"HAYs4dS/r8%A/rnmM/q;Lr)nDjH-rT3n +JcC<$JcC<$jT"$7oDSI^pA=gbrV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj, +s5a7Aro=%(r7Cr!rmgkprmUhoq9f2grm1JerltGdrQG2_s2k8] +s2Y/Zrl+oUs24iQ!l;[frkANK]tOEX!kZ%Trj`*?\$u@F!k#DBrj2X1s0;O,s0)I*r2p"#ri>jp +qPiGPm&0cYrMB=crhKFdqP!n]rL`eTn"'3Erh'1_r1X.brhKFfs/#amrMTXns/Gssri?(#qlTh" +rNG^pi3E0bqQp1.rjD^5s0r$q^V@S"_8=(,_o0O5`l?'?aN;U(b5oi3rltPj +d/MDndaS3F!nGlQrmq5(g"HAYs4dS/r8%A/rnmM/q;Lr)nDjH-rT3n +JcC<$JcC<$jT"$7oDSI^pA=gbrV??crqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rojLJkNDj, +s5a7Aro=%(r7Cr!rmgkprmUhoq9f2grm1JerltGdrQG2_s2k8] +s2Y/Zrl+oUs24iQ!l;[frkANK]tOEX!kZ%Trj`*?\$u@F!k#DBrj2X1s0;O,s0)I*r2p"#ri>jp +qPiGPm&0cYrMB=crhKFdqP!n]rL`eTn"'3Erh'1_r1X.brhKFfs/#amrMTXns/Gssri?(#qlTh" +rNG^pi3E0bqQp1.rjD^5s0r$q^V@S"_8=(,_o0O5`l?'?aN;U(b5oi3rltPj +d/MDndaS3F!nGlQrmq5(g"HAYs4dS/r8%A/rnmM/q;Lr)nDjH-rT3n +JcC<$JcC<$i;_U3o_nU`pA=gbrqZHdrqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rosIH!9a@D +s5j:Aro=%)!o)Mcr8%D0rnmS1r8IJ2l/VX$r8mb:roa:Er9=4Gs6KULs6]jSr9s[T +s7-'Ys7?9_r:U*`s7cEcs7uZjqYU6hr;H0bJcC<$L];l~> +JcC<$JcC<$i;_U3o_nU`pA=gbrqZHdrqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rosIH!9a@D +s5j:Aro=%)!o)Mcr8%D0rnmS1r8IJ2l/VX$r8mb:roa:Er9=4Gs6KULs6]jSr9s[T +s7-'Ys7?9_r:U*`s7cEcs7uZjqYU6hr;H0bJcC<$L];l~> +JcC<$JcC<$i;_U3o_nU`pA=gbrqZHdrqHHdr:U*^s7?3[s7--YrpTmT!:BaO!pf.:rosIH!9a@D +s5j:Aro=%)!o)Mcr8%D0rnmS1r8IJ2l/VX$r8mb:roa:Er9=4Gs6KULs6]jSr9s[T +s7-'Ys7?9_r:U*`s7cEcs7uZjqYU6hr;H0bJcC<$L];l~> +JcC<$JcC<$hZ)=/pAOgbp\XpcrV??cs7cNdrUp3_s7?3[s7--YrpTmT!:BaO!pf.:rosIH!9a=C +!p/M(ro=%hrb0.uPbg"GYcd:%ddF-Lm +eC<%!f)F8&f\+sWgAfn-h#6(.hZ)L1i;MX4ip,RujSJ!5k5FKBkkjWElMg,Im/QJQmelPRnGi%W +o)J=\o_nI_pAXgaq#:*gqYL*fr;?N`rdk*#s+gW)~> +JcC<$JcC<$hZ)=/pAOgbp\XpcrV??cs7cNdrUp3_s7?3[s7--YrpTmT!:BaO!pf.:rosIH!9a=C +!p/M(ro=%hrb0.uPbg"GYcd:%ddF-Lm +eC<%!f)F8&f\+sWgAfn-h#6(.hZ)L1i;MX4ip,RujSJ!5k5FKBkkjWElMg,Im/QJQmelPRnGi%W +o)J=\o_nI_pAXgaq#:*gqYL*fr;?N`rdk*#s+gW)~> +JcC<$JcC<$hZ)=/pAOgbp\XpcrV??cs7cNdrUp3_s7?3[s7--YrpTmT!:BaO!pf.:rosIH!9a=C +!p/M(ro=%hrb0.uPbg"GYcd:%ddF-Lm +eC<%!f)F8&f\+sWgAfn-h#6(.hZ)L1i;MX4ip,RujSJ!5k5FKBkkjWElMg,Im/QJQmelPRnGi%W +o)J=\o_nI_pAXgaq#:*gqYL*fr;?N`rdk*#s+gW)~> +JcC<$JcC<$h#H+-pAOgbp\XsdrV??cs7cNdrUp3_s7?3[s7--YrpTmT!:BaO!pf.:rosIHs6'CD +s5a7ArT!q;!9*n7s53k5rS@J.s4dJ*rn7;'qUb\srRL_nrR:_nqpGDis3LVgs3:SfrQG5`s2k8] +s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs189Brji'=!4Vp8s0Vj6rNlO0riuC*ric=(poX7kg8jnH +rMfaoqPX=irh]IerM0=co:c#RoV)8YrM0:ds/#^lrMT[os/Gprs/Z1$rN6(%s0)=(riuF-p9WM\ +q6g%,rO;g:r42j=s1A9Cs1SHHrkBAe_84"*_o'F3`Q#ptu0rTF1DqW\%Frp0LKs6]gRrU9aTs7-'Ys7?6^ +rUp0`s7cHdrqZQiqYU6hr;H0bJcC<$LAuc~> +JcC<$JcC<$h#H+-pAOgbp\XsdrV??cs7cNdrUp3_s7?3[s7--YrpTmT!:BaO!pf.:rosIHs6'CD +s5a7ArT!q;!9*n7s53k5rS@J.s4dJ*rn7;'qUb\srRL_nrR:_nqpGDis3LVgs3:SfrQG5`s2k8] +s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs189Brji'=!4Vp8s0Vj6rNlO0riuC*ric=(poX7kg8jnH +rMfaoqPX=irh]IerM0=co:c#RoV)8YrM0:ds/#^lrMT[os/Gprs/Z1$rN6(%s0)=(riuF-p9WM\ +q6g%,rO;g:r42j=s1A9Cs1SHHrkBAe_84"*_o'F3`Q#ptu0rTF1DqW\%Frp0LKs6]gRrU9aTs7-'Ys7?6^ +rUp0`s7cHdrqZQiqYU6hr;H0bJcC<$LAuc~> +JcC<$JcC<$h#H+-pAOgbp\XsdrV??cs7cNdrUp3_s7?3[s7--YrpTmT!:BaO!pf.:rosIHs6'CD +s5a7ArT!q;!9*n7s53k5rS@J.s4dJ*rn7;'qUb\srRL_nrR:_nqpGDis3LVgs3:SfrQG5`s2k8] +s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs189Brji'=!4Vp8s0Vj6rNlO0riuC*ric=(poX7kg8jnH +rMfaoqPX=irh]IerM0=co:c#RoV)8YrM0:ds/#^lrMT[os/Gprs/Z1$rN6(%s0)=(riuF-p9WM\ +q6g%,rO;g:r42j=s1A9Cs1SHHrkBAe_84"*_o'F3`Q#ptu0rTF1DqW\%Frp0LKs6]gRrU9aTs7-'Ys7?6^ +rUp0`s7cHdrqZQiqYU6hr;H0bJcC<$LAuc~> +JcC<$JcC<$gAfk*p\jsdp\XsdrV?BdrqHHdr:U*^s7?3[s7$*YrU9dS!:BaOs6B[MrTOCIkNDj, +s5j:Aro=%(rn7;'q:GSrr71YnrR:boqpGGjrm1Pgs3:SfrQ>8baiXP' +s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs189BrOE!>\$u@Fs0_m6r3QF/s0;I*rNH.%d]N;Gr2]Um +rMfdpqPX=irMB@drM07am\0QQrM07crh]Xlr29Rns/Gssri?(#rN6+&ric7(s0;R/q6U"+pU/P[ +rO;d9r42j=rk&0Bs1SHHrkJKK!5\ZO&AuH)`Poj;a2l?Db0%oNbg$.4!RK-ld/h\ErmUu!f)F8& +f\+sWg&g$ah#?.0hZ)L2i;V^7iqVR0jRM@$k5=E?kkaQClMp2Im/QJPmeuVSnG_tVo)J=\o_nI^ +pAamaq#C0hqYC$er;?N`rdk*#s+^Q(~> +JcC<$JcC<$gAfk*p\jsdp\XsdrV?BdrqHHdr:U*^s7?3[s7$*YrU9dS!:BaOs6B[MrTOCIkNDj, +s5j:Aro=%(rn7;'q:GSrr71YnrR:boqpGGjrm1Pgs3:SfrQ>8baiXP' +s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs189BrOE!>\$u@Fs0_m6r3QF/s0;I*rNH.%d]N;Gr2]Um +rMfdpqPX=irMB@drM07am\0QQrM07crh]Xlr29Rns/Gssri?(#rN6+&ric7(s0;R/q6U"+pU/P[ +rO;d9r42j=rk&0Bs1SHHrkJKK!5\ZO&AuH)`Poj;a2l?Db0%oNbg$.4!RK-ld/h\ErmUu!f)F8& +f\+sWg&g$ah#?.0hZ)L2i;V^7iqVR0jRM@$k5=E?kkaQClMp2Im/QJPmeuVSnG_tVo)J=\o_nI^ +pAamaq#C0hqYC$er;?N`rdk*#s+^Q(~> +JcC<$JcC<$gAfk*p\jsdp\XsdrV?BdrqHHdr:U*^s7?3[s7$*YrU9dS!:BaOs6B[MrTOCIkNDj, +s5j:Aro=%(rn7;'q:GSrr71YnrR:boqpGGjrm1Pgs3:SfrQ>8baiXP' +s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs189BrOE!>\$u@Fs0_m6r3QF/s0;I*rNH.%d]N;Gr2]Um +rMfdpqPX=irMB@drM07am\0QQrM07crh]Xlr29Rns/Gssri?(#rN6+&ric7(s0;R/q6U"+pU/P[ +rO;d9r42j=rk&0Bs1SHHrkJKK!5\ZO&AuH)`Poj;a2l?Db0%oNbg$.4!RK-ld/h\ErmUu!f)F8& +f\+sWg&g$ah#?.0hZ)L2i;V^7iqVR0jRM@$k5=E?kkaQClMp2Im/QJPmeuVSnG_tVo)J=\o_nI^ +pAamaq#C0hqYC$er;?N`rdk*#s+^Q(~> +JcC<$JcC<$f`0V'q#1'eq"t$drqZHds7cNdrUp3_s7?3[s7--YrpTmTs6]gPs6K^MrosIH!9a=C +s5a7ArT!q;s5Eq7s53h4r8%D.rnI>(rRq/%q:GPqrRLbormUkpr6bPks3LVg!mSs5rQG5`!6P5] +s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs1Ag +r2][ori,mqqPX=irMB:bqP3bYqP3k^rh]Ukr29Rns/Gsss/Z.#rN6+&s0)@)s0;R/qm6:/r3aq\ +qR?F5qRQU:s1A6Bs1SHHrkJKK!5\ZOs2+iTrl"oXa8X-\aiaV+!R/gfc3qtFdF$Cje'umte^j`O +!SH*)gAfn-h#6%1hV[5gi;_d8iqh^5jS@p!k54?>kkXKBlMg,Hm/QJPmelPRnGi%Vo)J=\o_nI^ +pAamaq#:*gqYL*fr;?N`rdk*#s+UK'~> +JcC<$JcC<$f`0V'q#1'eq"t$drqZHds7cNdrUp3_s7?3[s7--YrpTmTs6]gPs6K^MrosIH!9a=C +s5a7ArT!q;s5Eq7s53h4r8%D.rnI>(rRq/%q:GPqrRLbormUkpr6bPks3LVg!mSs5rQG5`!6P5] +s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs1Ag +r2][ori,mqqPX=irMB:bqP3bYqP3k^rh]Ukr29Rns/Gsss/Z.#rN6+&s0)@)s0;R/qm6:/r3aq\ +qR?F5qRQU:s1A6Bs1SHHrkJKK!5\ZOs2+iTrl"oXa8X-\aiaV+!R/gfc3qtFdF$Cje'umte^j`O +!SH*)gAfn-h#6%1hV[5gi;_d8iqh^5jS@p!k54?>kkXKBlMg,Hm/QJPmelPRnGi%Vo)J=\o_nI^ +pAamaq#:*gqYL*fr;?N`rdk*#s+UK'~> +JcC<$JcC<$f`0V'q#1'eq"t$drqZHds7cNdrUp3_s7?3[s7--YrpTmTs6]gPs6K^MrosIH!9a=C +s5a7ArT!q;s5Eq7s53h4r8%D.rnI>(rRq/%q:GPqrRLbormUkpr6bPks3LVg!mSs5rQG5`!6P5] +s2P,Zrl+oU!5nfQs1n]NrkJKI!58BEs1Ag +r2][ori,mqqPX=irMB:bqP3bYqP3k^rh]Ukr29Rns/Gsss/Z.#rN6+&s0)@)s0;R/qm6:/r3aq\ +qR?F5qRQU:s1A6Bs1SHHrkJKK!5\ZOs2+iTrl"oXa8X-\aiaV+!R/gfc3qtFdF$Cje'umte^j`O +!SH*)gAfn-h#6%1hV[5gi;_d8iqh^5jS@p!k54?>kkXKBlMg,Hm/QJPmelPRnGi%Vo)J=\o_nI^ +pAamaq#:*gqYL*fr;?N`rdk*#s+UK'~> +JcC<$JcC<$ec4;$q>L3gq"t$drqZHds7cQer:U*^s7?3[s7--YrpTmTs6]gPs6K^MrosIHs6'CD +s5j:ArT!q;s5Eq7rnmb4r8%A-rS.2&rRq/%pt,JqrRLeprmUkprR(Yls3LYhs3:Sfrlb>as2k8] +!lr=#rl"rW_o)Jj!l;[frkANK]tOEX!kZ%Trji'=s0qs8s0_m6qm6:-riu.#f!"nPpT=Cqri>mq +ri,mqqPX:hr2&JMrMBIir29Rnri,jrs/Z1$r2p"%s0)C*riuL/r3QC0rO)F/pp]Y#pp]q+pppC8 +rk&*@s1SHHrkJKKs2"]O#K+Ku`Poj:a8X-\aiaV+(!OqJcHjh`dF$Cke'umtf%/I)f\"mVg&g$a +h#?.0hZ)L3i;_d9iqqd7jS\-&k4e'8kkOE@lMg,Hm/HDPmelPQnGi%Vo)J=\o_eC^pAXgaq#:*g +qYL*fr;6H_rdk*#s+UK'~> +JcC<$JcC<$ec4;$q>L3gq"t$drqZHds7cQer:U*^s7?3[s7--YrpTmTs6]gPs6K^MrosIHs6'CD +s5j:ArT!q;s5Eq7rnmb4r8%A-rS.2&rRq/%pt,JqrRLeprmUkprR(Yls3LYhs3:Sfrlb>as2k8] +!lr=#rl"rW_o)Jj!l;[frkANK]tOEX!kZ%Trji'=s0qs8s0_m6qm6:-riu.#f!"nPpT=Cqri>mq +ri,mqqPX:hr2&JMrMBIir29Rnri,jrs/Z1$r2p"%s0)C*riuL/r3QC0rO)F/pp]Y#pp]q+pppC8 +rk&*@s1SHHrkJKKs2"]O#K+Ku`Poj:a8X-\aiaV+(!OqJcHjh`dF$Cke'umtf%/I)f\"mVg&g$a +h#?.0hZ)L3i;_d9iqqd7jS\-&k4e'8kkOE@lMg,Hm/HDPmelPQnGi%Vo)J=\o_eC^pAXgaq#:*g +qYL*fr;6H_rdk*#s+UK'~> +JcC<$JcC<$ec4;$q>L3gq"t$drqZHds7cQer:U*^s7?3[s7--YrpTmTs6]gPs6K^MrosIHs6'CD +s5j:ArT!q;s5Eq7rnmb4r8%A-rS.2&rRq/%pt,JqrRLeprmUkprR(Yls3LYhs3:Sfrlb>as2k8] +!lr=#rl"rW_o)Jj!l;[frkANK]tOEX!kZ%Trji'=s0qs8s0_m6qm6:-riu.#f!"nPpT=Cqri>mq +ri,mqqPX:hr2&JMrMBIir29Rnri,jrs/Z1$r2p"%s0)C*riuL/r3QC0rO)F/pp]Y#pp]q+pppC8 +rk&*@s1SHHrkJKKs2"]O#K+Ku`Poj:a8X-\aiaV+(!OqJcHjh`dF$Cke'umtf%/I)f\"mVg&g$a +h#?.0hZ)L3i;_d9iqqd7jS\-&k4e'8kkOE@lMg,Hm/HDPmelPQnGi%Vo)J=\o_eC^pAXgaq#:*g +qYL*fr;6H_rdk*#s+UK'~> +JcC<$JcC<$df8#"q>L3gq"t'erqZHds7cNdrUp3_s7?3[s7--YrpTmTs6]gPs6K^MrosIHs6'@C +s5j:ArT!q;s5Eq7rnm_3r8%>,rnI8&r7V&$pt,Jqrmgnqs3ptqrR(Yls3LYhs31PfrQ>8baiXP' +!lr=#rl"rW_o)Jj!l;[frkANK]tOEXs189BrOMs +JcC<$JcC<$df8#"q>L3gq"t'erqZHds7cNdrUp3_s7?3[s7--YrpTmTs6]gPs6K^MrosIHs6'@C +s5j:ArT!q;s5Eq7rnm_3r8%>,rnI8&r7V&$pt,Jqrmgnqs3ptqrR(Yls3LYhs31PfrQ>8baiXP' +!lr=#rl"rW_o)Jj!l;[frkANK]tOEXs189BrOMs +JcC<$JcC<$df8#"q>L3gq"t'erqZHds7cNdrUp3_s7?3[s7--YrpTmTs6]gPs6K^MrosIHs6'@C +s5j:ArT!q;s5Eq7rnm_3r8%>,rnI8&r7V&$pt,Jqrmgnqs3ptqrR(Yls3LYhs31PfrQ>8baiXP' +!lr=#rl"rW_o)Jj!l;[frkANK]tOEXs189BrOMs +JcC<$JcC<$d/Vi!q>L6hq"t$drqZKerqHHdr:U*^s7?3[s7$*YrU9dSs6]gPs6K^MrTX@G!9a=C +s5j:ArT!n:s5En6rnm_3qq_5+rS.,$r7V&$q:GVsrmgqrs3ptqrR(Yls3L\is31PfrQ>8baiXP' +!lr=#rl"rW_o)Jj!l;[frkANK]tOEXs1Apr +rMfaopS[GVpo"+iri,gqs/Z1$r2p"%s0)C*s0;U0r3QF1rjD[4rO;a8o==;#o==V,r4Dj=rk8)[&BW);bKJ,Sc-FV\d*U1fdaS3F!S,d#f*Bs]g"P07gYDeas5*e5 +ro!h8s5Nt:roF(?pZD86n*'<+r9F7HqX"4KrpK^Qrp]pWr:9mZrq--]s7ZHdr:p9erqcHfrVZTl +nG\"=JcCE'J,~> +JcC<$JcC<$d/Vi!q>L6hq"t$drqZKerqHHdr:U*^s7?3[s7$*YrU9dSs6]gPs6K^MrTX@G!9a=C +s5j:ArT!n:s5En6rnm_3qq_5+rS.,$r7V&$q:GVsrmgqrs3ptqrR(Yls3L\is31PfrQ>8baiXP' +!lr=#rl"rW_o)Jj!l;[frkANK]tOEXs1Apr +rMfaopS[GVpo"+iri,gqs/Z1$r2p"%s0)C*s0;U0r3QF1rjD[4rO;a8o==;#o==V,r4Dj=rk8)[&BW);bKJ,Sc-FV\d*U1fdaS3F!S,d#f*Bs]g"P07gYDeas5*e5 +ro!h8s5Nt:roF(?pZD86n*'<+r9F7HqX"4KrpK^Qrp]pWr:9mZrq--]s7ZHdr:p9erqcHfrVZTl +nG\"=JcCE'J,~> +JcC<$JcC<$d/Vi!q>L6hq"t$drqZKerqHHdr:U*^s7?3[s7$*YrU9dSs6]gPs6K^MrTX@G!9a=C +s5j:ArT!n:s5En6rnm_3qq_5+rS.,$r7V&$q:GVsrmgqrs3ptqrR(Yls3L\is31PfrQ>8baiXP' +!lr=#rl"rW_o)Jj!l;[frkANK]tOEXs1Apr +rMfaopS[GVpo"+iri,gqs/Z1$r2p"%s0)C*s0;U0r3QF1rjD[4rO;a8o==;#o==V,r4Dj=rk8)[&BW);bKJ,Sc-FV\d*U1fdaS3F!S,d#f*Bs]g"P07gYDeas5*e5 +ro!h8s5Nt:roF(?pZD86n*'<+r9F7HqX"4KrpK^Qrp]pWr:9mZrq--]s7ZHdr:p9erqcHfrVZTl +nG\"=JcCE'J,~> +JcC<$JcC<$c2ZSuq>L6hq"t'erV?BdrqHHdr:U*^s7?3[s7--YrpTmTs6]dOs6B[MrTX@Gs6'@C +s5j:Ar8[h:s5Ek5rnm_3q;)#)r7h##rRq/%qUb_trmgtsrmUnqrQt\ncd2R8!mSs5rlYAcaiXP' +!lr=#rl"rW_o)Jj!l;[frkJKI!58?Ds1APqm#t$rNH4'qlTk!rN#dp +rMfaokGS9WrMf^pri?(#r2p"%s0)C*s0;U0r3QF1s0_d5rjVm:q76@5e@YIfrOr3ErP/?Is2"]O +s24lTrl#,^a2c9BaiV^)b5oi3rltPjd/MDndaS3F!S,d#f)aOWrn@D,!8RS0!oDhlro!h8s5Nt: +s5a1@qW@\ +JcC<$JcC<$c2ZSuq>L6hq"t'erV?BdrqHHdr:U*^s7?3[s7--YrpTmTs6]dOs6B[MrTX@Gs6'@C +s5j:Ar8[h:s5Ek5rnm_3q;)#)r7h##rRq/%qUb_trmgtsrmUnqrQt\ncd2R8!mSs5rlYAcaiXP' +!lr=#rl"rW_o)Jj!l;[frkJKI!58?Ds1APqm#t$rNH4'qlTk!rN#dp +rMfaokGS9WrMf^pri?(#r2p"%s0)C*s0;U0r3QF1s0_d5rjVm:q76@5e@YIfrOr3ErP/?Is2"]O +s24lTrl#,^a2c9BaiV^)b5oi3rltPjd/MDndaS3F!S,d#f)aOWrn@D,!8RS0!oDhlro!h8s5Nt: +s5a1@qW@\ +JcC<$JcC<$c2ZSuq>L6hq"t'erV?BdrqHHdr:U*^s7?3[s7--YrpTmTs6]dOs6B[MrTX@Gs6'@C +s5j:Ar8[h:s5Ek5rnm_3q;)#)r7h##rRq/%qUb_trmgtsrmUnqrQt\ncd2R8!mSs5rlYAcaiXP' +!lr=#rl"rW_o)Jj!l;[frkJKI!58?Ds1APqm#t$rNH4'qlTk!rN#dp +rMfaokGS9WrMf^pri?(#r2p"%s0)C*s0;U0r3QF1s0_d5rjVm:q76@5e@YIfrOr3ErP/?Is2"]O +s24lTrl#,^a2c9BaiV^)b5oi3rltPjd/MDndaS3F!S,d#f)aOWrn@D,!8RS0!oDhlro!h8s5Nt: +s5a1@qW@\ +JcC<$JcC<$aoC2rqYg?iq>:-erqZKerqHHdr:U*^s7?3[s7--YrU0gUmHsl=s6K^MrTX@Gs6'@C +s5j:Ar8[h:ro*b4rnm\2q;(u(r7h##rRq/%qq(l!rmgtss3q"rrR(Yl!71Vh!mSs5rlYAcaiXP' +!lr=#rl"rW_o)Jj!l;[frkJKIs1SEEs1A)[#Kb-2bKJ,Rc2Puhcd;[=!RfHre,e+Nrmq2'g&B\,gYCT`h#cHjhu;R6i;hm8j8\3? +jne-U6equ$BirUBf;s+13&s*t~> +JcC<$JcC<$aoC2rqYg?iq>:-erqZKerqHHdr:U*^s7?3[s7--YrU0gUmHsl=s6K^MrTX@Gs6'@C +s5j:Ar8[h:ro*b4rnm\2q;(u(r7h##rRq/%qq(l!rmgtss3q"rrR(Yl!71Vh!mSs5rlYAcaiXP' +!lr=#rl"rW_o)Jj!l;[frkJKIs1SEEs1A)[#Kb-2bKJ,Rc2Puhcd;[=!RfHre,e+Nrmq2'g&B\,gYCT`h#cHjhu;R6i;hm8j8\3? +jne-U6equ$BirUBf;s+13&s*t~> +JcC<$JcC<$aoC2rqYg?iq>:-erqZKerqHHdr:U*^s7?3[s7--YrU0gUmHsl=s6K^MrTX@Gs6'@C +s5j:Ar8[h:ro*b4rnm\2q;(u(r7h##rRq/%qq(l!rmgtss3q"rrR(Yl!71Vh!mSs5rlYAcaiXP' +!lr=#rl"rW_o)Jj!l;[frkJKIs1SEEs1A)[#Kb-2bKJ,Rc2Puhcd;[=!RfHre,e+Nrmq2'g&B\,gYCT`h#cHjhu;R6i;hm8j8\3? +jne-U6equ$BirUBf;s+13&s*t~> +JcC<$JcC<$`W+lqqYg?iq>:-erqZKerqHHdr:U*^s7?3[s7--YrU9dS!:BaOs6K^MrTX@Gs6'@C +roO1@r8[e9ro*b4rSRS1pYGc&r7h&$rn78&r7Cu"rmgtss3q"rrmCbms3L\i!mSs5rlb>a!6P5] +!lr=#rl"rW_o)Jjs1n]NrP/BH!58?Ds1A9Ar42j;rO;O0dC&eWpp9q)riu=(ric=(qlTgurN#Xl +oVqPari?%"r2ot$s0)C*s0;U0r3QF1s0_g6s0r!;r42g +JcC<$JcC<$`W+lqqYg?iq>:-erqZKerqHHdr:U*^s7?3[s7--YrU9dS!:BaOs6K^MrTX@Gs6'@C +roO1@r8[e9ro*b4rSRS1pYGc&r7h&$rn78&r7Cu"rmgtss3q"rrmCbms3L\i!mSs5rlb>a!6P5] +!lr=#rl"rW_o)Jjs1n]NrP/BH!58?Ds1A9Ar42j;rO;O0dC&eWpp9q)riu=(ric=(qlTgurN#Xl +oVqPari?%"r2ot$s0)C*s0;U0r3QF1s0_g6s0r!;r42g +JcC<$JcC<$`W+lqqYg?iq>:-erqZKerqHHdr:U*^s7?3[s7--YrU9dS!:BaOs6K^MrTX@Gs6'@C +roO1@r8[e9ro*b4rSRS1pYGc&r7h&$rn78&r7Cu"rmgtss3q"rrmCbms3L\i!mSs5rlb>a!6P5] +!lr=#rl"rW_o)Jjs1n]NrP/BH!58?Ds1A9Ar42j;rO;O0dC&eWpp9q)riu=(ric=(qlTgurN#Xl +oVqPari?%"r2ot$s0)C*s0;U0r3QF1s0_g6s0r!;r42g +JcC<$JcC<$^Am,Z%rS.2&rn7;'r7Cu"s4.(ts3q"rrmCbms3L\i!mSs5rlYAcaiXP' +!lr=#rl"rW_o)Jjs2"`NrkJKIs1SBDs1A9Aqml^9r3sbUqmHC0q6U(+riu@)ric:'qlTdtr2].` +rN#muqlTn$ric:)s0;U0rNlL1s0_g6s0r$r4Vm>o"XD&p:pRArk\NLs24lTrl+oW +s2Y,[s2b8`rlZ)$c-=PZcd0tcdF-IleC<%!f%8O+f\-8X!ScE/h#cHjhu;R6i;hm9j8\3?jo"9? +kPj]=l1=30lgsK@mJZJLn,DhUnb_nVoD\C[p&=[ap\agbq>U6equ$BirUBf;s+13$s*t~> +JcC<$JcC<$^Am,Z%rS.2&rn7;'r7Cu"s4.(ts3q"rrmCbms3L\i!mSs5rlYAcaiXP' +!lr=#rl"rW_o)Jjs2"`NrkJKIs1SBDs1A9Aqml^9r3sbUqmHC0q6U(+riu@)ric:'qlTdtr2].` +rN#muqlTn$ric:)s0;U0rNlL1s0_g6s0r$r4Vm>o"XD&p:pRArk\NLs24lTrl+oW +s2Y,[s2b8`rlZ)$c-=PZcd0tcdF-IleC<%!f%8O+f\-8X!ScE/h#cHjhu;R6i;hm9j8\3?jo"9? +kPj]=l1=30lgsK@mJZJLn,DhUnb_nVoD\C[p&=[ap\agbq>U6equ$BirUBf;s+13$s*t~> +JcC<$JcC<$^Am,Z%rS.2&rn7;'r7Cu"s4.(ts3q"rrmCbms3L\i!mSs5rlYAcaiXP' +!lr=#rl"rW_o)Jjs2"`NrkJKIs1SBDs1A9Aqml^9r3sbUqmHC0q6U(+riu@)ric:'qlTdtr2].` +rN#muqlTn$ric:)s0;U0rNlL1s0_g6s0r$r4Vm>o"XD&p:pRArk\NLs24lTrl+oW +s2Y,[s2b8`rlZ)$c-=PZcd0tcdF-IleC<%!f%8O+f\-8X!ScE/h#cHjhu;R6i;hm9j8\3?jo"9? +kPj]=l1=30lgsK@mJZJLn,DhUnb_nVoD\C[p&=[ap\agbq>U6equ$BirUBf;s+13$s*t~> +JcC<$JcC<$]`7-nqu-Hjq>:-erqZKerqHHdrUp0^s7?3[s7--YrU9dSs6]dOs6K^MrTX=Fs6'=B +s5j7@qr@\8rSdS1r87D.pYGf'rS.5'rn7;'rR_)#s4.(ts3gtrrQt\ncd2U9!mSs5rlYAcaiXP' +!lr=#rl+oU!5nfQs2"`NrP/BHs1SBDrk&0@qRQL5caWSUr3cO2qQp1,riu@)rNH4'q5sLpo;hbi +qQ9b"ric7(s0;U0r3QF1s0_g6s0r$c!6tMg(=1@SdF$Cke'umtf%/I)f\"m2g=tB;rnRY4hr"Fk!o`.uro=%>s5j1@s6'CFq<@b@ +na#H+qsF@Mq="=PrUKdUs7?6^qt9s^rqH:-gqu-'aJcC<$Jc>`MJ,~> +JcC<$JcC<$]`7-nqu-Hjq>:-erqZKerqHHdrUp0^s7?3[s7--YrU9dSs6]dOs6K^MrTX=Fs6'=B +s5j7@qr@\8rSdS1r87D.pYGf'rS.5'rn7;'rR_)#s4.(ts3gtrrQt\ncd2U9!mSs5rlYAcaiXP' +!lr=#rl+oU!5nfQs2"`NrP/BHs1SBDrk&0@qRQL5caWSUr3cO2qQp1,riu@)rNH4'q5sLpo;hbi +qQ9b"ric7(s0;U0r3QF1s0_g6s0r$c!6tMg(=1@SdF$Cke'umtf%/I)f\"m2g=tB;rnRY4hr"Fk!o`.uro=%>s5j1@s6'CFq<@b@ +na#H+qsF@Mq="=PrUKdUs7?6^qt9s^rqH:-gqu-'aJcC<$Jc>`MJ,~> +JcC<$JcC<$]`7-nqu-Hjq>:-erqZKerqHHdrUp0^s7?3[s7--YrU9dSs6]dOs6K^MrTX=Fs6'=B +s5j7@qr@\8rSdS1r87D.pYGf'rS.5'rn7;'rR_)#s4.(ts3gtrrQt\ncd2U9!mSs5rlYAcaiXP' +!lr=#rl+oU!5nfQs2"`NrP/BHs1SBDrk&0@qRQL5caWSUr3cO2qQp1,riu@)rNH4'q5sLpo;hbi +qQ9b"ric7(s0;U0r3QF1s0_g6s0r$c!6tMg(=1@SdF$Cke'umtf%/I)f\"m2g=tB;rnRY4hr"Fk!o`.uro=%>s5j1@s6'CFq<@b@ +na#H+qsF@Mq="=PrUKdUs7?6^qt9s^rqH:-gqu-'aJcC<$Jc>`MJ,~> +JcC<$JcC<$]Dq$mqu-Hjq>:-erqZKerqHHdr:U*^s7?3[s7--YrU9dSs6]dOrp0ULrTX@Groa4A +roO1@qW%P6rSdM/r87D.ptbo(rnI>(s4RG)r7Cu"s4.+us3q"rrm:eocd2U9s31Pfrlb>a!6P5] +s2P,Zrl+oU!5ncPs2"`NrkJHHs1S?Crk&-?ossCumCE#%r3uI0rjDa4qQp1,riu@)rNH1&o<%ql +oWA(pric7(s0;U0r3QF1s0_g6s0r$otf\(qn`-Grkn`RrPefVs2Y,[ +s2k;`rlYPjc-=PZcd0u;d/h\ErmUu!f)F8+f\+s3g=tEU6dqu$BirUBf;s+13$rrE(L~> +JcC<$JcC<$]Dq$mqu-Hjq>:-erqZKerqHHdr:U*^s7?3[s7--YrU9dSs6]dOrp0ULrTX@Groa4A +roO1@qW%P6rSdM/r87D.ptbo(rnI>(s4RG)r7Cu"s4.+us3q"rrm:eocd2U9s31Pfrlb>a!6P5] +s2P,Zrl+oU!5ncPs2"`NrkJHHs1S?Crk&-?ossCumCE#%r3uI0rjDa4qQp1,riu@)rNH1&o<%ql +oWA(pric7(s0;U0r3QF1s0_g6s0r$otf\(qn`-Grkn`RrPefVs2Y,[ +s2k;`rlYPjc-=PZcd0u;d/h\ErmUu!f)F8+f\+s3g=tEU6dqu$BirUBf;s+13$rrE(L~> +JcC<$JcC<$]Dq$mqu-Hjq>:-erqZKerqHHdr:U*^s7?3[s7--YrU9dSs6]dOrp0ULrTX@Groa4A +roO1@qW%P6rSdM/r87D.ptbo(rnI>(s4RG)r7Cu"s4.+us3q"rrm:eocd2U9s31Pfrlb>a!6P5] +s2P,Zrl+oU!5ncPs2"`NrkJHHs1S?Crk&-?ossCumCE#%r3uI0rjDa4qQp1,riu@)rNH1&o<%ql +oWA(pric7(s0;U0r3QF1s0_g6s0r$otf\(qn`-Grkn`RrPefVs2Y,[ +s2k;`rlYPjc-=PZcd0u;d/h\ErmUu!f)F8+f\+s3g=tEU6dqu$BirUBf;s+13$rrE(L~> +JcC<$JcC<$])UsmqYg?iq>:0frqZHds7cNdrUp0^s7?3[s7--Yr9s[Rs6]dOs6K^Mr9=7Froa4A +roO+>qW%P6r8IA-qqq>.q;)&*rnIA)s4RG)rR_)#s4.+us3q"rrm:eocd2U9!mSs5rlYAcaiXP' +s2P,Zrl+oUs24iQs2"`NrP/?Gs1Srk&-Ark8c +!6tMg!mf6?rm:bpe,Ihte^j`O!SH*)g'?BfgtgfChV\=j!o`.uro=%>s5j4As6'FGqs"(Er9NJ2 +o^2MCp[A(MrUKdUrq$-]qt9s^rqH9arqZQiq>:*fr;H-aJcC<$JcGcMJ,~> +JcC<$JcC<$])UsmqYg?iq>:0frqZHds7cNdrUp0^s7?3[s7--Yr9s[Rs6]dOs6K^Mr9=7Froa4A +roO+>qW%P6r8IA-qqq>.q;)&*rnIA)s4RG)rR_)#s4.+us3q"rrm:eocd2U9!mSs5rlYAcaiXP' +s2P,Zrl+oUs24iQs2"`NrP/?Gs1Srk&-Ark8c +!6tMg!mf6?rm:bpe,Ihte^j`O!SH*)g'?BfgtgfChV\=j!o`.uro=%>s5j4As6'FGqs"(Er9NJ2 +o^2MCp[A(MrUKdUrq$-]qt9s^rqH9arqZQiq>:*fr;H-aJcC<$JcGcMJ,~> +JcC<$JcC<$])UsmqYg?iq>:0frqZHds7cNdrUp0^s7?3[s7--Yr9s[Rs6]dOs6K^Mr9=7Froa4A +roO+>qW%P6r8IA-qqq>.q;)&*rnIA)s4RG)rR_)#s4.+us3q"rrm:eocd2U9!mSs5rlYAcaiXP' +s2P,Zrl+oUs24iQs2"`NrP/?Gs1Srk&-Ark8c +!6tMg!mf6?rm:bpe,Ihte^j`O!SH*)g'?BfgtgfChV\=j!o`.uro=%>s5j4As6'FGqs"(Er9NJ2 +o^2MCp[A(MrUKdUrq$-]qt9s^rqH9arqZQiq>:*fr;H-aJcC<$JcGcMJ,~> +JcC<$JcC<$\Gtakqu-Hjq>:0frqZHds7cNdr:U*^s7?3[rpg$XrU9dSs6]aNs6K^Mr9=4Es6':A +roO+>q;_D4qr.8,r87J0qVD/+rnID*rn7>(rn%2$s4.+us3q"rrm:eocd2U9!mSs5rlYAcaiXP' +s2P,ZrP\iV_o)Gis2"`Nr4i9Grk8*>qRc%(lauu(ppp@5rO;[4rjDa4qm6:-rNZ.%pojUupojLt +riuI.rNlL1s0_g6s0r$rk&-As1SEGr4i3GrPA'ApVYq+qnrBNqo/TTs2Y)Zs2k;`rQ>8d +c-?75#LCcDdF$Cje,Ihte^j`O!SH*)g'?BfgtgfChV\=j!o`.uro=%>!9O1As6'CFr9=4GrTj%@ +m-XN7p$_kKrUKaTrU^$\qt9s^rqH9arqZNhqYU3gr;H*`JcC<$JcGcMJ,~> +JcC<$JcC<$\Gtakqu-Hjq>:0frqZHds7cNdr:U*^s7?3[rpg$XrU9dSs6]aNs6K^Mr9=4Es6':A +roO+>q;_D4qr.8,r87J0qVD/+rnID*rn7>(rn%2$s4.+us3q"rrm:eocd2U9!mSs5rlYAcaiXP' +s2P,ZrP\iV_o)Gis2"`Nr4i9Grk8*>qRc%(lauu(ppp@5rO;[4rjDa4qm6:-rNZ.%pojUupojLt +riuI.rNlL1s0_g6s0r$rk&-As1SEGr4i3GrPA'ApVYq+qnrBNqo/TTs2Y)Zs2k;`rQ>8d +c-?75#LCcDdF$Cje,Ihte^j`O!SH*)g'?BfgtgfChV\=j!o`.uro=%>!9O1As6'CFr9=4GrTj%@ +m-XN7p$_kKrUKaTrU^$\qt9s^rqH9arqZNhqYU3gr;H*`JcC<$JcGcMJ,~> +JcC<$JcC<$\Gtakqu-Hjq>:0frqZHds7cNdr:U*^s7?3[rpg$XrU9dSs6]aNs6K^Mr9=4Es6':A +roO+>q;_D4qr.8,r87J0qVD/+rnID*rn7>(rn%2$s4.+us3q"rrm:eocd2U9!mSs5rlYAcaiXP' +s2P,ZrP\iV_o)Gis2"`Nr4i9Grk8*>qRc%(lauu(ppp@5rO;[4rjDa4qm6:-rNZ.%pojUupojLt +riuI.rNlL1s0_g6s0r$rk&-As1SEGr4i3GrPA'ApVYq+qnrBNqo/TTs2Y)Zs2k;`rQ>8d +c-?75#LCcDdF$Cje,Ihte^j`O!SH*)g'?BfgtgfChV\=j!o`.uro=%>!9O1As6'CFr9=4GrTj%@ +m-XN7p$_kKrUKaTrU^$\qt9s^rqH9arqZNhqYU3gr;H*`JcC<$JcGcMJ,~> +JcC<$JcC<$[K#Ljqu-Hjq>:0frqZHds7cNdr:U*^s7?0Zs7--YrU9dSrpB[Nrp0ULr9=4Eroa1@ +rT4"=pZ)22qVh2,rSRS1qq_;-rnID*s4RG)rR_)#!7h(us3q"rrm:eocd2U9!mSs5rlYAcaiXP' +s2P,ZrPefT!5n`Os2"`Nr4i3Erk67_qn)d;qRQR7rjVd5rjDa4qm67,rNYFfriuF-r3QF1rjD^5 +s0r$rk&-As1SHHr4i6Hrk\EIqSVU:l,3A9qSiHRrl=uYs2k;`rQG5b!6tMgs3C\lrm:u! +e'lgre^`7Mf)aOWrn7D-h#?+2hV[5ihu_lsir7s>jQ5M%joFTDkl'cFlMg,Dm.]o4md]cDnGMhQ +o)81Zo_S7[pAXg`q#1$fqYC$dr;?N^rdk*#s+14Ls*t~> +JcC<$JcC<$[K#Ljqu-Hjq>:0frqZHds7cNdr:U*^s7?0Zs7--YrU9dSrpB[Nrp0ULr9=4Eroa1@ +rT4"=pZ)22qVh2,rSRS1qq_;-rnID*s4RG)rR_)#!7h(us3q"rrm:eocd2U9!mSs5rlYAcaiXP' +s2P,ZrPefT!5n`Os2"`Nr4i3Erk67_qn)d;qRQR7rjVd5rjDa4qm67,rNYFfriuF-r3QF1rjD^5 +s0r$rk&-As1SHHr4i6Hrk\EIqSVU:l,3A9qSiHRrl=uYs2k;`rQG5b!6tMgs3C\lrm:u! +e'lgre^`7Mf)aOWrn7D-h#?+2hV[5ihu_lsir7s>jQ5M%joFTDkl'cFlMg,Dm.]o4md]cDnGMhQ +o)81Zo_S7[pAXg`q#1$fqYC$dr;?N^rdk*#s+14Ls*t~> +JcC<$JcC<$[K#Ljqu-Hjq>:0frqZHds7cNdr:U*^s7?0Zs7--YrU9dSrpB[Nrp0ULr9=4Eroa1@ +rT4"=pZ)22qVh2,rSRS1qq_;-rnID*s4RG)rR_)#!7h(us3q"rrm:eocd2U9!mSs5rlYAcaiXP' +s2P,ZrPefT!5n`Os2"`Nr4i3Erk67_qn)d;qRQR7rjVd5rjDa4qm67,rNYFfriuF-r3QF1rjD^5 +s0r$rk&-As1SHHr4i6Hrk\EIqSVU:l,3A9qSiHRrl=uYs2k;`rQG5b!6tMgs3C\lrm:u! +e'lgre^`7Mf)aOWrn7D-h#?+2hV[5ihu_lsir7s>jQ5M%joFTDkl'cFlMg,Dm.]o4md]cDnGMhQ +o)81Zo_S7[pAXg`q#1$fqYC$dr;?N^rdk*#s+14Ls*t~> +JcC<$JcC<$ZN'7iqu-Hjq>:0frqZHds7cNdr:U*^s7?0Zs7--Yr9s[Rs6]aNs6K[Lr9=4ErTF%> +rT3tqml^9rjVd5rjD^3qQp+*q6Bb"q6Bn(qm6:/ +rjD^5s0r$s5j7Bs6'FGrTX=Hrp0CHqsF(EipZd6 +r:0URrU^$\qXsj]rV-3arV?Hhq"t$fqu-$`JcC<$JcG]KJ,~> +JcC<$JcC<$ZN'7iqu-Hjq>:0frqZHds7cNdr:U*^s7?0Zs7--Yr9s[Rs6]aNs6K[Lr9=4ErTF%> +rT3tqml^9rjVd5rjD^3qQp+*q6Bb"q6Bn(qm6:/ +rjD^5s0r$s5j7Bs6'FGrTX=Hrp0CHqsF(EipZd6 +r:0URrU^$\qXsj]rV-3arV?Hhq"t$fqu-$`JcC<$JcG]KJ,~> +JcC<$JcC<$ZN'7iqu-Hjq>:0frqZHds7cNdr:U*^s7?0Zs7--Yr9s[Rs6]aNs6K[Lr9=4ErTF%> +rT3tqml^9rjVd5rjD^3qQp+*q6Bb"q6Bn(qm6:/ +rjD^5s0r$s5j7Bs6'FGrTX=Hrp0CHqsF(EipZd6 +r:0URrU^$\qXsj]rV-3arV?Hhq"t$fqu-$`JcC<$JcG]KJ,~> +JcC<$JcC<$Y5dngr;HQkq>:0frqZHds7cNdr:U*^s7?0Zs7-*XrU9aRs6]aNs6K[Lqs"+DrTF"= +r8mh:p#Gr/r8IM1rnm_3r8%D.s4dM+s4RG)rn%2$!7h%t!n5TGrm:eocd2U9!mSs5rlb>a!6P2\ +!lr=#rPefTs24cOrk\TLpqPUupqQO:qn;g +JcC<$JcC<$Y5dngr;HQkq>:0frqZHds7cNdr:U*^s7?0Zs7-*XrU9aRs6]aNs6K[Lqs"+DrTF"= +r8mh:p#Gr/r8IM1rnm_3r8%D.s4dM+s4RG)rn%2$!7h%t!n5TGrm:eocd2U9!mSs5rlb>a!6P2\ +!lr=#rPefTs24cOrk\TLpqPUupqQO:qn;g +JcC<$JcC<$Y5dngr;HQkq>:0frqZHds7cNdr:U*^s7?0Zs7-*XrU9aRs6]aNs6K[Lqs"+DrTF"= +r8mh:p#Gr/r8IM1rnm_3r8%D.s4dM+s4RG)rn%2$!7h%t!n5TGrm:eocd2U9!mSs5rlb>a!6P2\ +!lr=#rPefTs24cOrk\TLpqPUupqQO:qn;g +JcC<$JcC<$WrMPer;HTlq>:0frqZHdrqHHdr:U*^rq$*Zrpg$Xr9s[RrpBXMrp0ULqW\"CrTEq; +qrR_9p#Gu0rSdY3rnm_3rS@M/s4dM+s4RG)rn%2$!7h(us3gtrrmCbm!71Vh!mSs5rlYAcaiXM& +!lr=#rPecSs24`Nrk\QK_8#o^rOr'?rk&0@qml^9rjVa4rO)U2kHk,orjDX3s0r!;rOMs>s1A6B +s1SHHr4i9Is2"WMrkn`RqSi?OjN$T+qoANRrlP2_r6,,as3:Pgs3L_lrm:eqe'n +JcC<$JcC<$WrMPer;HTlq>:0frqZHdrqHHdr:U*^rq$*Zrpg$Xr9s[RrpBXMrp0ULqW\"CrTEq; +qrR_9p#Gu0rSdY3rnm_3rS@M/s4dM+s4RG)rn%2$!7h(us3gtrrmCbm!71Vh!mSs5rlYAcaiXM& +!lr=#rPecSs24`Nrk\QK_8#o^rOr'?rk&0@qml^9rjVa4rO)U2kHk,orjDX3s0r!;rOMs>s1A6B +s1SHHr4i9Is2"WMrkn`RqSi?OjN$T+qoANRrlP2_r6,,as3:Pgs3L_lrm:eqe'n +JcC<$JcC<$WrMPer;HTlq>:0frqZHdrqHHdr:U*^rq$*Zrpg$Xr9s[RrpBXMrp0ULqW\"CrTEq; +qrR_9p#Gu0rSdY3rnm_3rS@M/s4dM+s4RG)rn%2$!7h(us3gtrrmCbm!71Vh!mSs5rlYAcaiXM& +!lr=#rPecSs24`Nrk\QK_8#o^rOr'?rk&0@qml^9rjVa4rO)U2kHk,orjDX3s0r!;rOMs>s1A6B +s1SHHr4i9Is2"WMrkn`RqSi?OjN$T+qoANRrlP2_r6,,as3:Pgs3L_lrm:eqe'n +JcC<$JcC<$W;lAdr;HTlq>:0frqZHdrqHHdr:U']s7?0Zs7--Yr9sXQs6]^Mrp0RKqs"(Cr9*e9 +qW7S7pZ)53rSdY3s53k5r8%D.s4dP,s4RG)rmq5&e^aZKs3gtrrmCbm!71Yis3:Sfrlb>a!6P2\ +s2Y/ZrPecSrknWMr5&0DotTt2pVHR=pV6[@rk83Ark&0@qml^9rjV^3r3bmurO)L1rjVp;r42j= +s1A6Bs1SHHr4i9Is2"ZNrkncSqo/NRr5[O4p;cgHrQ5&]r6,)`s3:Pgs3L_lrmCbo!7Uqss4%,# +rmqD-g"G*5gY:N_h#ZBirnmk:io9st!p&J)roX7D!9jCGs6BULr9XFMrU07Fl1"E:o^_tPr:KjY +rV$3aqY:$brqcEer;?Kkn,@n +JcC<$JcC<$W;lAdr;HTlq>:0frqZHdrqHHdr:U']s7?0Zs7--Yr9sXQs6]^Mrp0RKqs"(Cr9*e9 +qW7S7pZ)53rSdY3s53k5r8%D.s4dP,s4RG)rmq5&e^aZKs3gtrrmCbm!71Yis3:Sfrlb>a!6P2\ +s2Y/ZrPecSrknWMr5&0DotTt2pVHR=pV6[@rk83Ark&0@qml^9rjV^3r3bmurO)L1rjVp;r42j= +s1A6Bs1SHHr4i9Is2"ZNrkncSqo/NRr5[O4p;cgHrQ5&]r6,)`s3:Pgs3L_lrmCbo!7Uqss4%,# +rmqD-g"G*5gY:N_h#ZBirnmk:io9st!p&J)roX7D!9jCGs6BULr9XFMrU07Fl1"E:o^_tPr:KjY +rV$3aqY:$brqcEer;?Kkn,@n +JcC<$JcC<$W;lAdr;HTlq>:0frqZHdrqHHdr:U']s7?0Zs7--Yr9sXQs6]^Mrp0RKqs"(Cr9*e9 +qW7S7pZ)53rSdY3s53k5r8%D.s4dP,s4RG)rmq5&e^aZKs3gtrrmCbm!71Yis3:Sfrlb>a!6P2\ +s2Y/ZrPecSrknWMr5&0DotTt2pVHR=pV6[@rk83Ark&0@qml^9rjV^3r3bmurO)L1rjVp;r42j= +s1A6Bs1SHHr4i9Is2"ZNrkncSqo/NRr5[O4p;cgHrQ5&]r6,)`s3:Pgs3L_lrmCbo!7Uqss4%,# +rmqD-g"G*5gY:N_h#ZBirnmk:io9st!p&J)roX7D!9jCGs6BULr9XFMrU07Fl1"E:o^_tPr:KjY +rV$3aqY:$brqcEer;?Kkn,@n +JcC<$JcC<$W;lAdqu-Kkq>:0frqZHdrqHHdr:U']s7?0Zrpg$Xr9sXQs6]^Mrp0OJqW[qAr9*\6 +qW7Y9puDA5ro*b4s53k5rS@M/s4dP,s4RG)rn%2$!7h(us3gtrrmCbm!71Vh!mSs5rlb>as2k5\ +s2Y/Zr5JZRrknKIjMC)tqSE*FqS3$DrOr-Ark&0@qml[8rjVU0o!S5#rjVm:r42j=s1A3As1SHH +rP/BJs2"ZNs24iSr5JZTrQ"ZRkfMo,r5no[qof#`s3:Je!mf6?rQt\pe'n +JcC<$JcC<$W;lAdqu-Kkq>:0frqZHdrqHHdr:U']s7?0Zrpg$Xr9sXQs6]^Mrp0OJqW[qAr9*\6 +qW7Y9puDA5ro*b4s53k5rS@M/s4dP,s4RG)rn%2$!7h(us3gtrrmCbm!71Vh!mSs5rlb>as2k5\ +s2Y/Zr5JZRrknKIjMC)tqSE*FqS3$DrOr-Ark&0@qml[8rjVU0o!S5#rjVm:r42j=s1A3As1SHH +rP/BJs2"ZNs24iSr5JZTrQ"ZRkfMo,r5no[qof#`s3:Je!mf6?rQt\pe'n +JcC<$JcC<$W;lAdqu-Kkq>:0frqZHdrqHHdr:U']s7?0Zrpg$Xr9sXQs6]^Mrp0OJqW[qAr9*\6 +qW7Y9puDA5ro*b4s53k5rS@M/s4dP,s4RG)rn%2$!7h(us3gtrrmCbm!71Vh!mSs5rlb>as2k5\ +s2Y/Zr5JZRrknKIjMC)tqSE*FqS3$DrOr-Ark&0@qml[8rjVU0o!S5#rjVm:r42j=s1A3As1SHH +rP/BJs2"ZNs24iSr5JZTrQ"ZRkfMo,r5no[qof#`s3:Je!mf6?rQt\pe'n +JcC<$JcC<$VuQ8cr;HQkq>:0frqZHdrqHHdr:U']s7?0Zrpg!Wr9sXQs6][Lrp0OJq<@e?qrdP4 +qrRe;q;_J6s5En6s53k5rS@M/s4dP,s4RG)rmq5&e^aZKs3gtrrmCbm!71Vh!mSs5rlb>as2k5\ +rl>&Yqo/QQr571(pVZOYs~> +JcC<$JcC<$VuQ8cr;HQkq>:0frqZHdrqHHdr:U']s7?0Zrpg!Wr9sXQs6][Lrp0OJq<@e?qrdP4 +qrRe;q;_J6s5En6s53k5rS@M/s4dP,s4RG)rmq5&e^aZKs3gtrrmCbm!71Vh!mSs5rlb>as2k5\ +rl>&Yqo/QQr571(pVZOYs~> +JcC<$JcC<$VuQ8cr;HQkq>:0frqZHdrqHHdr:U']s7?0Zrpg!Wr9sXQs6][Lrp0OJq<@e?qrdP4 +qrRe;q;_J6s5En6s53k5rS@M/s4dP,s4RG)rmq5&e^aZKs3gtrrmCbm!71Vh!mSs5rlb>as2k5\ +rl>&Yqo/QQr571(pVZOYs~> +JcC<$JcC<$VuQ5br;HQkqYU6frqZHdrqHHdqt:!]rq$'Yrpg$XqsXOPrpBULrTjFIpZ_P#XqSiBNikt$!qSW*Frk\QKqnN0Frk83Ark&0@q76F5m^N,(qRQU:s1A3As1SHHrP/BJs2"ZN +s24iSrPefVrl=oWrlP)\fus!0oZR6XrltAds3L_lrR(Yns3ptss4%,#rn%2&!87A*#M\%hh;-rE +hu;O=iSrkWj5f:_roX7Ds60IHs6BXMrTsONrpKXOr:'OPg[b44qt0[Vr:^*`q=ssbr;-6dr;?Hj +n,@nj~> +JcC<$JcC<$VuQ5br;HQkqYU6frqZHdrqHHdqt:!]rq$'Yrpg$XqsXOPrpBULrTjFIpZ_P#XqSiBNikt$!qSW*Frk\QKqnN0Frk83Ark&0@q76F5m^N,(qRQU:s1A3As1SHHrP/BJs2"ZN +s24iSrPefVrl=oWrlP)\fus!0oZR6XrltAds3L_lrR(Yns3ptss4%,#rn%2&!87A*#M\%hh;-rE +hu;O=iSrkWj5f:_roX7Ds60IHs6BXMrTsONrpKXOr:'OPg[b44qt0[Vr:^*`q=ssbr;-6dr;?Hj +n,@nj~> +JcC<$JcC<$VuQ5br;HQkqYU6frqZHdrqHHdqt:!]rq$'Yrpg$XqsXOPrpBULrTjFIpZ_P#XqSiBNikt$!qSW*Frk\QKqnN0Frk83Ark&0@q76F5m^N,(qRQU:s1A3As1SHHrP/BJs2"ZN +s24iSrPefVrl=oWrlP)\fus!0oZR6XrltAds3L_lrR(Yns3ptss4%,#rn%2&!87A*#M\%hh;-rE +hu;O=iSrkWj5f:_roX7Ds60IHs6BXMrTsONrpKXOr:'OPg[b44qt0[Vr:^*`q=ssbr;-6dr;?Hj +n,@nj~> +JcC<$JcC<$VZ6/bqu-Kkq>:-erqZHdrqHHdqt:!]rq$'Yrpg!WqsXOPrpBRKrTjCHo]c28qWIS7 +rT4%>qr@_9ro*h6s53k5rn[V0s4dP,s4ID)rn%2$s4.+u!n5TGrmCbm!71Vh!mSs5rQG5`rlP)Z +s2Y)XpVlF9hSoE2rPSKKrk\TLqnN-Erk83Ark&-?ossh,p::.5rk&*@s1SHHr4i9Is2"ZNs24lT +rPefVrl=rXrlP/^pWM^Cj3.AErQY5bs3L_lrR(Yns3ptss4./#rmq5(g"HAY!ScE/h>c=3hu;O7 +iSsjss5X1AroX7Ds60IHs6BXMrTsROrpK[PrUB^Sh=C:2qXjOTr:^*`q=sparVHj~> +JcC<$JcC<$VZ6/bqu-Kkq>:-erqZHdrqHHdqt:!]rq$'Yrpg!WqsXOPrpBRKrTjCHo]c28qWIS7 +rT4%>qr@_9ro*h6s53k5rn[V0s4dP,s4ID)rn%2$s4.+u!n5TGrmCbm!71Vh!mSs5rQG5`rlP)Z +s2Y)XpVlF9hSoE2rPSKKrk\TLqnN-Erk83Ark&-?ossh,p::.5rk&*@s1SHHr4i9Is2"ZNs24lT +rPefVrl=rXrlP/^pWM^Cj3.AErQY5bs3L_lrR(Yns3ptss4./#rmq5(g"HAY!ScE/h>c=3hu;O7 +iSsjss5X1AroX7Ds60IHs6BXMrTsROrpK[PrUB^Sh=C:2qXjOTr:^*`q=sparVHj~> +JcC<$JcC<$VZ6/bqu-Kkq>:-erqZHdrqHHdqt:!]rq$'Yrpg!WqsXOPrpBRKrTjCHo]c28qWIS7 +rT4%>qr@_9ro*h6s53k5rn[V0s4dP,s4ID)rn%2$s4.+u!n5TGrmCbm!71Vh!mSs5rQG5`rlP)Z +s2Y)XpVlF9hSoE2rPSKKrk\TLqnN-Erk83Ark&-?ossh,p::.5rk&*@s1SHHr4i9Is2"ZNs24lT +rPefVrl=rXrlP/^pWM^Cj3.AErQY5bs3L_lrR(Yns3ptss4./#rmq5(g"HAY!ScE/h>c=3hu;O7 +iSsjss5X1AroX7Ds60IHs6BXMrTsROrpK[PrUB^Sh=C:2qXjOTr:^*`q=sparVHj~> +JcC<$JcC<$V>p&aqu-Kkq>:-erqZHdrqHEcr:U']rq$'Yrpg!WqsXOPrU'FIr9O:Gn`fo6qrdb: +roO.?qr@_9s5Eq7s53k5rn[V0s4dP,s4ID)rn%2$!7h%t!n5TGrmCbm!71Vhs3:SfrQG5`rlP)Z +rQ"iUhSng#ou6mJrknTLrk\WMqnN-Erk80@rO`!=mCE/+rO`!?rk8?Gr4i9Is2"ZNs24lTrPefV +rl=uYrlP/^qoeo]qT\QUp!)dGqp"u_rm1SjrR(Yns3pqr!nGlQrn%2&!87A*s4[P/rnRY4hr"Fk +!TE&;j8\0?jo4EBk5a`EklU/9li$2LmJlVOn,DhSn`o]2oD%tNp&+O^p\=O^q>L0aqu$BhrU9`: +s+13$s7cPD~> +JcC<$JcC<$V>p&aqu-Kkq>:-erqZHdrqHEcr:U']rq$'Yrpg!WqsXOPrU'FIr9O:Gn`fo6qrdb: +roO.?qr@_9s5Eq7s53k5rn[V0s4dP,s4ID)rn%2$!7h%t!n5TGrmCbm!71Vhs3:SfrQG5`rlP)Z +rQ"iUhSng#ou6mJrknTLrk\WMqnN-Erk80@rO`!=mCE/+rO`!?rk8?Gr4i9Is2"ZNs24lTrPefV +rl=uYrlP/^qoeo]qT\QUp!)dGqp"u_rm1SjrR(Yns3pqr!nGlQrn%2&!87A*s4[P/rnRY4hr"Fk +!TE&;j8\0?jo4EBk5a`EklU/9li$2LmJlVOn,DhSn`o]2oD%tNp&+O^p\=O^q>L0aqu$BhrU9`: +s+13$s7cPD~> +JcC<$JcC<$V>p&aqu-Kkq>:-erqZHdrqHEcr:U']rq$'Yrpg!WqsXOPrU'FIr9O:Gn`fo6qrdb: +roO.?qr@_9s5Eq7s53k5rn[V0s4dP,s4ID)rn%2$!7h%t!n5TGrmCbm!71Vhs3:SfrQG5`rlP)Z +rQ"iUhSng#ou6mJrknTLrk\WMqnN-Erk80@rO`!=mCE/+rO`!?rk8?Gr4i9Is2"ZNs24lTrPefV +rl=uYrlP/^qoeo]qT\QUp!)dGqp"u_rm1SjrR(Yns3pqr!nGlQrn%2&!87A*s4[P/rnRY4hr"Fk +!TE&;j8\0?jo4EBk5a`EklU/9li$2LmJlVOn,DhSn`o]2oD%tNp&+O^p\=O^q>L0aqu$BhrU9`: +s+13$s7cPD~> +JcC<$JcC<$V#Tr`qu-Kkq>:-erqZHdrqHEcqt9s\s7?-Yrpg!WqsXLOrU'CHqs4+Dn`fr7r9*n< +roO1@r8[h:s5Eq7s53k5rn[V0s4dP,!nl5Yrn%2$!7h(us3q"rrmCbms3L\is3:Sfr6,,_rlOuW +r5[s>o#LUJp;d*Nq8N?OrknWMrk\TLqnN-Erk8-?qn)F1r4Dd;rk8?Gr4i9Is2"ZNs24lTr5J]U +s2Y)Zs2k8_qoeu_rQX$@n'1ROrQkJir6bPms3pqrs4%,#rRV,'g"HAY!o)McrnRV3hu;R6i;hm: +ir\<'jo4BDkNM./l2U&Kli$2MmJlVPn,;bSnauD8oCV\Hp&+O]p\=O^q>C*aqtp +JcC<$JcC<$V#Tr`qu-Kkq>:-erqZHdrqHEcqt9s\s7?-Yrpg!WqsXLOrU'CHqs4+Dn`fr7r9*n< +roO1@r8[h:s5Eq7s53k5rn[V0s4dP,!nl5Yrn%2$!7h(us3q"rrmCbms3L\is3:Sfr6,,_rlOuW +r5[s>o#LUJp;d*Nq8N?OrknWMrk\TLqnN-Erk8-?qn)F1r4Dd;rk8?Gr4i9Is2"ZNs24lTr5J]U +s2Y)Zs2k8_qoeu_rQX$@n'1ROrQkJir6bPms3pqrs4%,#rRV,'g"HAY!o)McrnRV3hu;R6i;hm: +ir\<'jo4BDkNM./l2U&Kli$2MmJlVPn,;bSnauD8oCV\Hp&+O]p\=O^q>C*aqtp +JcC<$JcC<$V#Tr`qu-Kkq>:-erqZHdrqHEcqt9s\s7?-Yrpg!WqsXLOrU'CHqs4+Dn`fr7r9*n< +roO1@r8[h:s5Eq7s53k5rn[V0s4dP,!nl5Yrn%2$!7h(us3q"rrmCbms3L\is3:Sfr6,,_rlOuW +r5[s>o#LUJp;d*Nq8N?OrknWMrk\TLqnN-Erk8-?qn)F1r4Dd;rk8?Gr4i9Is2"ZNs24lTr5J]U +s2Y)Zs2k8_qoeu_rQX$@n'1ROrQkJir6bPms3pqrs4%,#rRV,'g"HAY!o)McrnRV3hu;R6i;hm: +ir\<'jo4BDkNM./l2U&Kli$2MmJlVPn,;bSnauD8oCV\Hp&+O]p\=O^q>C*aqtp +JcC<$JcC<$V#To_r;HQkq>:-erqZHdrqHEcqt9s\rq$$Xrpg!WqX=CNrU'=FqWmqAoBH2:rTF%> +s5j7@rT!q;s5Eq7s53k5rn[V0!8IJ+!nl5Yrmq5&e^aZKs3q"rrmCbms3LYhs3:Sfr6,)^rlOlT +m)Ri$r5\cUqSiHPrknZNrk\TLqnN-ErOqj9qRcF5rOr3Er4i9Is2"WMs24lTrPefVs2Y)Zs2k8_ +r6,)`rlt5`jNli2r6PAhqpGDks3pqrs4./#rn%2&!87>)#M\%hh;-rEhu;R6i;hm:ir\<'jo4BD +kNM./l2U&Kli$2MmJlVPn,DhUnb;VJoB,]6p&+O\p\=O]q>L0aqtp +JcC<$JcC<$V#To_r;HQkq>:-erqZHdrqHEcqt9s\rq$$Xrpg!WqX=CNrU'=FqWmqAoBH2:rTF%> +s5j7@rT!q;s5Eq7s53k5rn[V0!8IJ+!nl5Yrmq5&e^aZKs3q"rrmCbms3LYhs3:Sfr6,)^rlOlT +m)Ri$r5\cUqSiHPrknZNrk\TLqnN-ErOqj9qRcF5rOr3Er4i9Is2"WMs24lTrPefVs2Y)Zs2k8_ +r6,)`rlt5`jNli2r6PAhqpGDks3pqrs4./#rn%2&!87>)#M\%hh;-rEhu;R6i;hm:ir\<'jo4BD +kNM./l2U&Kli$2MmJlVPn,DhUnb;VJoB,]6p&+O\p\=O]q>L0aqtp +JcC<$JcC<$V#To_r;HQkq>:-erqZHdrqHEcqt9s\rq$$Xrpg!WqX=CNrU'=FqWmqAoBH2:rTF%> +s5j7@rT!q;s5Eq7s53k5rn[V0!8IJ+!nl5Yrmq5&e^aZKs3q"rrmCbms3LYhs3:Sfr6,)^rlOlT +m)Ri$r5\cUqSiHPrknZNrk\TLqnN-ErOqj9qRcF5rOr3Er4i9Is2"WMs24lTrPefVs2Y)Zs2k8_ +r6,)`rlt5`jNli2r6PAhqpGDks3pqrs4./#rn%2&!87>)#M\%hh;-rEhu;R6i;hm:ir\<'jo4BD +kNM./l2U&Kli$2MmJlVPn,DhUnb;VJoB,]6p&+O\p\=O]q>L0aqtp +JcC<$JcC<$U]9i_qu-Hjq>:-erqZHdrqHEcqt9s\rq$!Wrpg!Wq=":Mr9a+Bq!7b@p?DP>rTF+@ +roO1@rT!q;s5Eq7s5*h5rS7P1gY;_]s4ID)rRV,%e^aZKs3q"rrmCbms3LYhrltJeqoeu]r5mp= +j2q&:rQ"oWqo/QQrknZNrk\TLqS3!Cr4VO2r4W*DqnN-Gs2"WMs24lTrPefVs2Y)Zs2k8_rQG2a +rlt>cr6P5do$R0Xjj3kOqU,;jrmUhqs4./#rRV,'g"HAYs4[P/rn[V2!8me6s5 +JcC<$JcC<$U]9i_qu-Hjq>:-erqZHdrqHEcqt9s\rq$!Wrpg!Wq=":Mr9a+Bq!7b@p?DP>rTF+@ +roO1@rT!q;s5Eq7s5*h5rS7P1gY;_]s4ID)rRV,%e^aZKs3q"rrmCbms3LYhrltJeqoeu]r5mp= +j2q&:rQ"oWqo/QQrknZNrk\TLqS3!Cr4VO2r4W*DqnN-Gs2"WMs24lTrPefVs2Y)Zs2k8_rQG2a +rlt>cr6P5do$R0Xjj3kOqU,;jrmUhqs4./#rRV,'g"HAYs4[P/rn[V2!8me6s5 +JcC<$JcC<$U]9i_qu-Hjq>:-erqZHdrqHEcqt9s\rq$!Wrpg!Wq=":Mr9a+Bq!7b@p?DP>rTF+@ +roO1@rT!q;s5Eq7s5*h5rS7P1gY;_]s4ID)rRV,%e^aZKs3q"rrmCbms3LYhrltJeqoeu]r5mp= +j2q&:rQ"oWqo/QQrknZNrk\TLqS3!Cr4VO2r4W*DqnN-Gs2"WMs24lTrPefVs2Y)Zs2k8_rQG2a +rlt>cr6P5do$R0Xjj3kOqU,;jrmUhqs4./#rRV,'g"HAYs4[P/rn[V2!8me6s5 +JcC<$JcC<$U]9f^qu-Hjq>:-erqZEcrqHEcqt9s\rq$!WrpfsVq="7LqsEn>q!7hBq!%b@roa4A +s5j:Ar8Rk +nB:XMr5nfVrl>#Xqo/QQrknZNrk\QKq7lg@oY(.9q7lpEs2"WMs24lTr5J]Us2Y)Zs2k;`rQG2a +s3:Gdrm1PigX594pX/ugrmUeps4./#rR_)%!87>)!o)Mcrn[V2!8me6!o`.uro4(@jlQL(!pAe2 +rosIJ!:0UMs6]jSr9s[TrpfjUqt'UTg%G48qY0aZr;$9ep\Xjcqu,s^JcC<$JcG?AJ,~> +JcC<$JcC<$U]9f^qu-Hjq>:-erqZEcrqHEcqt9s\rq$!WrpfsVq="7LqsEn>q!7hBq!%b@roa4A +s5j:Ar8Rk +nB:XMr5nfVrl>#Xqo/QQrknZNrk\QKq7lg@oY(.9q7lpEs2"WMs24lTr5J]Us2Y)Zs2k;`rQG2a +s3:Gdrm1PigX594pX/ugrmUeps4./#rR_)%!87>)!o)Mcrn[V2!8me6!o`.uro4(@jlQL(!pAe2 +rosIJ!:0UMs6]jSr9s[TrpfjUqt'UTg%G48qY0aZr;$9ep\Xjcqu,s^JcC<$JcG?AJ,~> +JcC<$JcC<$U]9f^qu-Hjq>:-erqZEcrqHEcqt9s\rq$!WrpfsVq="7LqsEn>q!7hBq!%b@roa4A +s5j:Ar8Rk +nB:XMr5nfVrl>#Xqo/QQrknZNrk\QKq7lg@oY(.9q7lpEs2"WMs24lTr5J]Us2Y)Zs2k;`rQG2a +s3:Gdrm1PigX594pX/ugrmUeps4./#rR_)%!87>)!o)Mcrn[V2!8me6!o`.uro4(@jlQL(!pAe2 +rosIJ!:0UMs6]jSr9s[TrpfjUqt'UTg%G48qY0aZr;$9ep\Xjcqu,s^JcC<$JcG?AJ,~> +JcC<$JcC<$UAs]]qu-Hjq>:-erqZEcrqHEcqXsj[rq$!WrUKjUq!\+Jq#Xr5JZRrknWMrk\QKikPH-rk\NLs24iSrPefVs2Y)Zs2k;`rQG2as3:Jerm1SjpsJ6P +h9l2LrR:\ormh&"rR_)%s4RD*s4dS/rnRY4hr"Fk!o`.uro4(@jlQL(!pAe2rojLLlg+N9s6]jS +rU9dUrpfjUrU]pYg%G+5qY0[Xr;$9epA=dcqYfj]JcC<$JcG<@J,~> +JcC<$JcC<$UAs]]qu-Hjq>:-erqZEcrqHEcqXsj[rq$!WrUKjUq!\+Jq#Xr5JZRrknWMrk\QKikPH-rk\NLs24iSrPefVs2Y)Zs2k;`rQG2as3:Jerm1SjpsJ6P +h9l2LrR:\ormh&"rR_)%s4RD*s4dS/rnRY4hr"Fk!o`.uro4(@jlQL(!pAe2rojLLlg+N9s6]jS +rU9dUrpfjUrU]pYg%G+5qY0[Xr;$9epA=dcqYfj]JcC<$JcG<@J,~> +JcC<$JcC<$UAs]]qu-Hjq>:-erqZEcrqHEcqXsj[rq$!WrUKjUq!\+Jq#Xr5JZRrknWMrk\QKikPH-rk\NLs24iSrPefVs2Y)Zs2k;`rQG2as3:Jerm1SjpsJ6P +h9l2LrR:\ormh&"rR_)%s4RD*s4dS/rnRY4hr"Fk!o`.uro4(@jlQL(!pAe2rojLLlg+N9s6]jS +rU9dUrpfjUrU]pYg%G+5qY0[Xr;$9epA=dcqYfj]JcC<$JcG<@J,~> +JcC<$JcC<$U&XT\qu-Hjq>:-erqZEcrqHBbqt9p[rq$!WrUKgTp@%kGq!IS;qs44Gqs"+Droa7B +roO1@ro=%&Yqo/QQrknWMrPABHn%\e9rPABJs24iSrPefVs2Y)Zs2k;`r6,,as3:Jes3L\k +qpG>iqU>#bp=&cao?mE_r6tMls4.,"rR_)%s4RA)!o)Mcrn[V2!8me6s5!9O4Bs6'FG +rojLLlg+N9!q#FDr9s[Ts7,sVrq$'[i:ZU5q=jOVqt^0dpA=dcqYfj]JcC<$JcG9?J,~> +JcC<$JcC<$U&XT\qu-Hjq>:-erqZEcrqHBbqt9p[rq$!WrUKgTp@%kGq!IS;qs44Gqs"+Droa7B +roO1@ro=%&Yqo/QQrknWMrPABHn%\e9rPABJs24iSrPefVs2Y)Zs2k;`r6,,as3:Jes3L\k +qpG>iqU>#bp=&cao?mE_r6tMls4.,"rR_)%s4RA)!o)Mcrn[V2!8me6s5!9O4Bs6'FG +rojLLlg+N9!q#FDr9s[Ts7,sVrq$'[i:ZU5q=jOVqt^0dpA=dcqYfj]JcC<$JcG9?J,~> +JcC<$JcC<$U&XT\qu-Hjq>:-erqZEcrqHBbqt9p[rq$!WrUKgTp@%kGq!IS;qs44Gqs"+Droa7B +roO1@ro=%&Yqo/QQrknWMrPABHn%\e9rPABJs24iSrPefVs2Y)Zs2k;`r6,,as3:Jes3L\k +qpG>iqU>#bp=&cao?mE_r6tMls4.,"rR_)%s4RA)!o)Mcrn[V2!8me6s5!9O4Bs6'FG +rojLLlg+N9!q#FDr9s[Ts7,sVrq$'[i:ZU5q=jOVqt^0dpA=dcqYfj]JcC<$JcG9?J,~> +JcC<$JcC<$U&XQ[qu-Hjq>:-erV?r9O@Iqs"+Ds6'=B +s5j:Aro=%#Xr5JZRrPSHJqSDm@qn`*FrkncSr5J]Url=uYs2k;`rQG5bs3:Mfrm1VkqpGDk +rR9QOo[E]cpXArfrRLr!r7Cu$s4RA)s4dS/rn[V2!8me6s5!9O4Bs5sCGrTOCKlg+Q: +s6]jSrU9dUrpfpWrU^![nFbl9p%S(Qqt^0dpA=abqYfg\JcC<$JcG9?J,~> +JcC<$JcC<$U&XQ[qu-Hjq>:-erV?r9O@Iqs"+Ds6'=B +s5j:Aro=%#Xr5JZRrPSHJqSDm@qn`*FrkncSr5J]Url=uYs2k;`rQG5bs3:Mfrm1VkqpGDk +rR9QOo[E]cpXArfrRLr!r7Cu$s4RA)s4dS/rn[V2!8me6s5!9O4Bs5sCGrTOCKlg+Q: +s6]jSrU9dUrpfpWrU^![nFbl9p%S(Qqt^0dpA=abqYfg\JcC<$JcG9?J,~> +JcC<$JcC<$U&XQ[qu-Hjq>:-erV?r9O@Iqs"+Ds6'=B +s5j:Aro=%#Xr5JZRrPSHJqSDm@qn`*FrkncSr5J]Url=uYs2k;`rQG5bs3:Mfrm1VkqpGDk +rR9QOo[E]cpXArfrRLr!r7Cu$s4RA)s4dS/rn[V2!8me6s5!9O4Bs5sCGrTOCKlg+Q: +s6]jSrU9dUrpfpWrU^![nFbl9p%S(Qqt^0dpA=abqYfg\JcC<$JcG9?J,~> +JcC<$JcC<$T`=HZqu-Hjq>:-erV?c +qTJl\s2k/Zrl>&Yqo/NPrPRX3rkn`Rr5JZTs2Y)Zs2k;`rQG2as3:Mfs3L_lr6bMlrmUYlkLJ88 +rRLnuqq(l#s4RA)s4dS/rS7P3hr"Fks5!9O4Bs5sCGrTOCKlg+Q:s6]jSrU9dUrpfpW +rq$*\p%@YEmJ$,Fqt^-cp&"XaqYfg\JcC<$JcG6>J,~> +JcC<$JcC<$T`=HZqu-Hjq>:-erV?c +qTJl\s2k/Zrl>&Yqo/NPrPRX3rkn`Rr5JZTs2Y)Zs2k;`rQG2as3:Mfs3L_lr6bMlrmUYlkLJ88 +rRLnuqq(l#s4RA)s4dS/rS7P3hr"Fks5!9O4Bs5sCGrTOCKlg+Q:s6]jSrU9dUrpfpW +rq$*\p%@YEmJ$,Fqt^-cp&"XaqYfg\JcC<$JcG6>J,~> +JcC<$JcC<$T`=HZqu-Hjq>:-erV?c +qTJl\s2k/Zrl>&Yqo/NPrPRX3rkn`Rr5JZTs2Y)Zs2k;`rQG2as3:Mfs3L_lr6bMlrmUYlkLJ88 +rRLnuqq(l#s4RA)s4dS/rS7P3hr"Fks5!9O4Bs5sCGrTOCKlg+Q:s6]jSrU9dUrpfpW +rq$*\p%@YEmJ$,Fqt^-cp&"XaqYfg\JcC<$JcG6>J,~> +JcC<$JcC<$TE"BZqu-Eiq>:-erV?#Xqo/NPqnqp?r58KOqo/QSs2Y&Ys2k;`rQG5bs3:Mfs3L_lr6bMls3phor71Vo +pXf,ipXSTZqpkYrqq(i"s4RA)s4dS/rS@M1!8mb5!o`.uro=%>!9O4Bs5sCGrosIJs6K[Ns6]jS +rU9dUs7-$Xrq$*\q"=CTj7hp8qYC$bp&"U`qYfg\JcC<$JcG3=J,~> +JcC<$JcC<$TE"BZqu-Eiq>:-erV?#Xqo/NPqnqp?r58KOqo/QSs2Y&Ys2k;`rQG5bs3:Mfs3L_lr6bMls3phor71Vo +pXf,ipXSTZqpkYrqq(i"s4RA)s4dS/rS@M1!8mb5!o`.uro=%>!9O4Bs5sCGrosIJs6K[Ns6]jS +rU9dUs7-$Xrq$*\q"=CTj7hp8qYC$bp&"U`qYfg\JcC<$JcG3=J,~> +JcC<$JcC<$TE"BZqu-Eiq>:-erV?#Xqo/NPqnqp?r58KOqo/QSs2Y&Ys2k;`rQG5bs3:Mfs3L_lr6bMls3phor71Vo +pXf,ipXSTZqpkYrqq(i"s4RA)s4dS/rS@M1!8mb5!o`.uro=%>!9O4Bs5sCGrosIJs6K[Ns6]jS +rU9dUs7-$Xrq$*\q"=CTj7hp8qYC$bp&"U`qYfg\JcC<$JcG3=J,~> +JcC<$JcC<$T)\9Yqu-Eiq>:*drqZBbrV-crltGd +qof#^rlP&Yrl>#Xq8N3Kp;?aFqSiHRrl=rXs2k;`rQG5bs3:Jes3L_lrR(YnrmUbormgtuhq.YS +ma_3cq:GVurn78(rnIJ.rn[V2s53h6s5F";ro4(@jlQL(s5sCGrosIJs6K[Ns6]jSrU9dUs7-$X +rq$-]q"=LWmJ#T7q>'m`p&"U`qYfd[JcC<$JcG0 +JcC<$JcC<$T)\9Yqu-Eiq>:*drqZBbrV-crltGd +qof#^rlP&Yrl>#Xq8N3Kp;?aFqSiHRrl=rXs2k;`rQG5bs3:Jes3L_lrR(YnrmUbormgtuhq.YS +ma_3cq:GVurn78(rnIJ.rn[V2s53h6s5F";ro4(@jlQL(s5sCGrosIJs6K[Ns6]jSrU9dUs7-$X +rq$-]q"=LWmJ#T7q>'m`p&"U`qYfd[JcC<$JcG0 +JcC<$JcC<$T)\9Yqu-Eiq>:*drqZBbrV-crltGd +qof#^rlP&Yrl>#Xq8N3Kp;?aFqSiHRrl=rXs2k;`rQG5bs3:Jes3L_lrR(YnrmUbormgtuhq.YS +ma_3cq:GVurn78(rnIJ.rn[V2s53h6s5F";ro4(@jlQL(s5sCGrosIJs6K[Ns6]jSrU9dUs7-$X +rq$-]q"=LWmJ#T7q>'m`p&"U`qYfd[JcC<$JcG0 +JcC<$JcC<$ScA-Wqu-Hjq"t$drV?9arqHBbq=X[Xr:BUPq!n%HnF-;CrU'LKrp0ULr9=7Fs6'@C +s5j:Aro=%'j_o_\L_qYfd[JcC<$JcG-;J,~> +JcC<$JcC<$ScA-Wqu-Hjq"t$drV?9arqHBbq=X[Xr:BUPq!n%HnF-;CrU'LKrp0ULr9=7Fs6'@C +s5j:Aro=%'j_o_\L_qYfd[JcC<$JcG-;J,~> +JcC<$JcC<$ScA-Wqu-Hjq"t$drV?9arqHBbq=X[Xr:BUPq!n%HnF-;CrU'LKrp0ULr9=7Fs6'@C +s5j:Aro=%'j_o_\L_qYfd[JcC<$JcG-;J,~> +JcC<$JcC<$SH&$Vqu-Hjq"t$drV?9arV-9aq"=RWr:BLMp$qbFo^DbHrU'LKs6K[LrTX@Gs6'@C +s5a7ArT!q;!9*n7!oMkkrS7P1gY;\\s4RG)rR_)#rmgqrrR:_nhpM5Im*kgZq9f2grQkDerltGd +r6,)^rlP&YrQ"fTn&>4ErQ"fVs2k8_rQG5bs3:Jes3L_lrR(Yns3pnqs4.,"qUbYtkLoX_jOa=^ +rRq)%s4dP.rS@M1s53h6s5F";ro=%>s5j7B!pAe2rosIJ!:0UMs6TgSrU9dUs7-$Xs7?6^qXsd[ +qY/M7p\FX]oDAC^q>K[ZJcC<$JcG*:J,~> +JcC<$JcC<$SH&$Vqu-Hjq"t$drV?9arV-9aq"=RWr:BLMp$qbFo^DbHrU'LKs6K[LrTX@Gs6'@C +s5a7ArT!q;!9*n7!oMkkrS7P1gY;\\s4RG)rR_)#rmgqrrR:_nhpM5Im*kgZq9f2grQkDerltGd +r6,)^rlP&YrQ"fTn&>4ErQ"fVs2k8_rQG5bs3:Jes3L_lrR(Yns3pnqs4.,"qUbYtkLoX_jOa=^ +rRq)%s4dP.rS@M1s53h6s5F";ro=%>s5j7B!pAe2rosIJ!:0UMs6TgSrU9dUs7-$Xs7?6^qXsd[ +qY/M7p\FX]oDAC^q>K[ZJcC<$JcG*:J,~> +JcC<$JcC<$SH&$Vqu-Hjq"t$drV?9arV-9aq"=RWr:BLMp$qbFo^DbHrU'LKs6K[LrTX@Gs6'@C +s5a7ArT!q;!9*n7!oMkkrS7P1gY;\\s4RG)rR_)#rmgqrrR:_nhpM5Im*kgZq9f2grQkDerltGd +r6,)^rlP&YrQ"fTn&>4ErQ"fVs2k8_rQG5bs3:Jes3L_lrR(Yns3pnqs4.,"qUbYtkLoX_jOa=^ +rRq)%s4dP.rS@M1s53h6s5F";ro=%>s5j7B!pAe2rosIJ!:0UMs6TgSrU9dUs7-$Xs7?6^qXsd[ +qY/M7p\FX]oDAC^q>K[ZJcC<$JcG*:J,~> +JcC<$JcC<$S,_pUqu-Hjq"t!crV?9arV-6`q"=OVqt'4Gp$qkIp[A+LrU'OLs6K[LrTX@Gs6'@C +!p/M(rSmt=iSjan!oMkkrS7P1gY;\\s4RG)r7Cu"rmgkprR:Sjo[3E]q:"KUqpYMlqU,;hs3LSf +rltJeqoeu]rlOuWqoAK[ZJcC<$JcG$8J,~> +JcC<$JcC<$S,_pUqu-Hjq"t!crV?9arV-6`q"=OVqt'4Gp$qkIp[A+LrU'OLs6K[LrTX@Gs6'@C +!p/M(rSmt=iSjan!oMkkrS7P1gY;\\s4RG)r7Cu"rmgkprR:Sjo[3E]q:"KUqpYMlqU,;hs3LSf +rltJeqoeu]rlOuWqoAK[ZJcC<$JcG$8J,~> +JcC<$JcC<$S,_pUqu-Hjq"t!crV?9arV-6`q"=OVqt'4Gp$qkIp[A+LrU'OLs6K[LrTX@Gs6'@C +!p/M(rSmt=iSjan!oMkkrS7P1gY;\\s4RG)r7Cu"rmgkprR:Sjo[3E]q:"KUqpYMlqU,;hs3LSf +rltJeqoeu]rlOuWqoAK[ZJcC<$JcG$8J,~> +JcC<$JcC<$S,_pUqYg?ip\XpcrV?6`rV-6`p\"FUqX`qAq!n7Nq!\4MrpBXMs6K[LrTX@Gs6'CD +s5j:Aro=%K[ZJcC<$JcG!7J,~> +JcC<$JcC<$S,_pUqYg?ip\XpcrV?6`rV-6`p\"FUqX`qAq!n7Nq!\4MrpBXMs6K[LrTX@Gs6'CD +s5j:Aro=%K[ZJcC<$JcG!7J,~> +JcC<$JcC<$S,_pUqYg?ip\XpcrV?6`rV-6`p\"FUqX`qAq!n7Nq!\4MrpBXMs6K[LrTX@Gs6'CD +s5j:Aro=%K[ZJcC<$JcG!7J,~> +JcC<$JcC<$RK)^Squ-Eiq"t!crV?6`rV-6`p%A1Rp[dV>qsjURq="=Ns6]aNs6K[LrTOCIkNDg+ +s5j:Aro=%,qq_;/ +rnm\4s5F";ro=%>s5j7Bs6'FGrosIJ!:0UM!q#FDrU9dUs7-'Ys7?6^qt9p]rV,jWiVE*An,)qY +q>KXYJcC<$JcFs6J,~> +JcC<$JcC<$RK)^Squ-Eiq"t!crV?6`rV-6`p%A1Rp[dV>qsjURq="=Ns6]aNs6K[LrTOCIkNDg+ +s5j:Aro=%,qq_;/ +rnm\4s5F";ro=%>s5j7Bs6'FGrosIJ!:0UM!q#FDrU9dUs7-'Ys7?6^qt9p]rV,jWiVE*An,)qY +q>KXYJcC<$JcFs6J,~> +JcC<$JcC<$RK)^Squ-Eiq"t!crV?6`rV-6`p%A1Rp[dV>qsjURq="=Ns6]aNs6K[LrTOCIkNDg+ +s5j:Aro=%,qq_;/ +rnm\4s5F";ro=%>s5j7Bs6'FGrosIJ!:0UM!q#FDrU9dUs7-'Ys7?6^qt9p]rV,jWiVE*An,)qY +q>KXYJcC<$JcFs6J,~> +JcC<$JcC<$RK)[Rqu-Eip\Xpcr;$-_r:g-_o_%tNo^hJ@r:0aTqX=FOs6]aNs6K^MrTX@Gs6'@C +!p/M(rSmt=iSjans5*h5rS@M/rnID*rn7>(qUb\sqpk)`q:5;lkL]U^rRLbormUkpr6bMjs3LSf +rltGdq9/ZXo#^dOqTJl^rltDerm1VkrR(Yns3pqrs4./#r7Cu$rn72&rS.8*lJ;9kptP,gqqM)) +qq_8.s53b4s5F";rT!q=!9O1As5sCGrTOCKlg+Q:s6]jSrU9dUs7-'Ys7?6^r:U$^rV,sZkkXQ@ +mJH_Wq#0OXJcC<$JcFp5J,~> +JcC<$JcC<$RK)[Rqu-Eip\Xpcr;$-_r:g-_o_%tNo^hJ@r:0aTqX=FOs6]aNs6K^MrTX@Gs6'@C +!p/M(rSmt=iSjans5*h5rS@M/rnID*rn7>(qUb\sqpk)`q:5;lkL]U^rRLbormUkpr6bMjs3LSf +rltGdq9/ZXo#^dOqTJl^rltDerm1VkrR(Yns3pqrs4./#r7Cu$rn72&rS.8*lJ;9kptP,gqqM)) +qq_8.s53b4s5F";rT!q=!9O1As5sCGrTOCKlg+Q:s6]jSrU9dUs7-'Ys7?6^r:U$^rV,sZkkXQ@ +mJH_Wq#0OXJcC<$JcFp5J,~> +JcC<$JcC<$RK)[Rqu-Eip\Xpcr;$-_r:g-_o_%tNo^hJ@r:0aTqX=FOs6]aNs6K^MrTX@Gs6'@C +!p/M(rSmt=iSjans5*h5rS@M/rnID*rn7>(qUb\sqpk)`q:5;lkL]U^rRLbormUkpr6bMjs3LSf +rltGdq9/ZXo#^dOqTJl^rltDerm1VkrR(Yns3pqrs4./#r7Cu$rn72&rS.8*lJ;9kptP,gqqM)) +qq_8.s53b4s5F";rT!q=!9O1As5sCGrTOCKlg+Q:s6]jSrU9dUs7-'Ys7?6^r:U$^rV,sZkkXQ@ +mJH_Wq#0OXJcC<$JcFp5J,~> +JcC<$JcC<$R/cRQqu-Eip\Xmbr;$-_qtL$^nb)SIoCMPDrUKjUqsXOPs6]aNs6K^MrTX@Gs6'CD +s5j:Aro=%cs3L_lrR(Vms3pqrs4./#rR_)%rn75'rnID,g>2PZmb@Woq;)&,rnmY3 +s5F";rT!q=s5j7Bs6'FGrosIJs6K[Ns6]jSrU0gWnaZPJs7?9_qt9s^rV-$\p%dPBl21;Sq#0LW +JcC<$JcFm4J,~> +JcC<$JcC<$R/cRQqu-Eip\Xmbr;$-_qtL$^nb)SIoCMPDrUKjUqsXOPs6]aNs6K^MrTX@Gs6'CD +s5j:Aro=%cs3L_lrR(Vms3pqrs4./#rR_)%rn75'rnID,g>2PZmb@Woq;)&,rnmY3 +s5F";rT!q=s5j7Bs6'FGrosIJs6K[Ns6]jSrU0gWnaZPJs7?9_qt9s^rV-$\p%dPBl21;Sq#0LW +JcC<$JcFm4J,~> +JcC<$JcC<$R/cRQqu-Eip\Xmbr;$-_qtL$^nb)SIoCMPDrUKjUqsXOPs6]aNs6K^MrTX@Gs6'CD +s5j:Aro=%cs3L_lrR(Vms3pqrs4./#rR_)%rn75'rnID,g>2PZmb@Woq;)&,rnmY3 +s5F";rT!q=s5j7Bs6'FGrosIJs6K[Ns6]jSrU0gWnaZPJs7?9_qt9s^rV-$\p%dPBl21;Sq#0LW +JcC<$JcFm4J,~> +JcC<$JcC<$R/cRQqYg(rnIG-q;(i&q;:o&nD3Thp"fW(rnmV2 +s5F";rT!q=s5j4As6'FGrosIJs6K[Ns6]jSrpTmVs7-$Xs7?9_r:U$^rqH0^q>'(Ij88TKq#0IV +JcC<$JcFj3J,~> +JcC<$JcC<$R/cRQqYg(rnIG-q;(i&q;:o&nD3Thp"fW(rnmV2 +s5F";rT!q=s5j4As6'FGrosIJs6K[Ns6]jSrpTmVs7-$Xs7?9_r:U$^rqH0^q>'(Ij88TKq#0IV +JcC<$JcFj3J,~> +JcC<$JcC<$R/cRQqYg(rnIG-q;(i&q;:o&nD3Thp"fW(rnmV2 +s5F";rT!q=s5j4As6'FGrosIJs6K[Ns6]jSrpTmVs7-$Xs7?9_r:U$^rqH0^q>'(Ij88TKq#0IV +JcC<$JcFj3J,~> +JcC<$JcC<$QN-@Oqu-EipA=dar;$']qY0j[kk4T?q=FCPrUKmVr9sXQs6]dOs6K^MrTX@Gs6'CD +s5j:ArT!q;s5Et8s53h4rS@J.s4dG)rRq,$kL]O^q:Y&eqq:r#qUb_trmgnqs3ptqqpGGjrQk>c +r6=ZRr6>)`rm1SjrR(Vms3pqrs4./#rR_)%rn78(rnIG-qq_2,q;:o(pYYi(i8+=frnmV2ro*n: +r8[h +JcC<$JcC<$QN-@Oqu-EipA=dar;$']qY0j[kk4T?q=FCPrUKmVr9sXQs6]dOs6K^MrTX@Gs6'CD +s5j:ArT!q;s5Et8s53h4rS@J.s4dG)rRq,$kL]O^q:Y&eqq:r#qUb_trmgnqs3ptqqpGGjrQk>c +r6=ZRr6>)`rm1SjrR(Vms3pqrs4./#rR_)%rn78(rnIG-qq_2,q;:o(pYYi(i8+=frnmV2ro*n: +r8[h +JcC<$JcC<$QN-@Oqu-EipA=dar;$']qY0j[kk4T?q=FCPrUKmVr9sXQs6]dOs6K^MrTX@Gs6'CD +s5j:ArT!q;s5Et8s53h4rS@J.s4dG)rRq,$kL]O^q:Y&eqq:r#qUb_trmgnqs3ptqqpGGjrQk>c +r6=ZRr6>)`rm1SjrR(Vms3pqrs4./#rR_)%rn78(rnIG-qq_2,q;:o(pYYi(i8+=frnmV2ro*n: +r8[h +JcC<$JcC<$Q2g7NqYgr:B^Srpg!Wr9s[RrpB[Ns6K^MrTOCIkNDg+ +s5j:ArSmt=iSj^ms53k5r8%D.rnI8&r7U>eq:XHTrRq2&qq(hurmgqrrmUkpr6bJirm1>ao$-pS +rm1SjqpGGls3pqrrmh&"rR_)%s4R>(s4dS/qq_5-rSQVmqVV))n_O&ur87A/ro*n:r8[h +JcC<$JcC<$Q2g7NqYgr:B^Srpg!Wr9s[RrpB[Ns6K^MrTOCIkNDg+ +s5j:ArSmt=iSj^ms53k5r8%D.rnI8&r7U>eq:XHTrRq2&qq(hurmgqrrmUkpr6bJirm1>ao$-pS +rm1SjqpGGls3pqrrmh&"rR_)%s4R>(s4dS/qq_5-rSQVmqVV))n_O&ur87A/ro*n:r8[h +JcC<$JcC<$Q2g7NqYgr:B^Srpg!Wr9s[RrpB[Ns6K^MrTOCIkNDg+ +s5j:ArSmt=iSj^ms53k5r8%D.rnI8&r7U>eq:XHTrRq2&qq(hurmgqrrmUkpr6bJirm1>ao$-pS +rm1SjqpGGls3pqrrmh&"rR_)%s4R>(s4dS/qq_5-rSQVmqVV))n_O&ur87A/ro*n:r8[h +JcC<$JcC<$Q2g4MqYg +JcC<$JcC<$Q2g4MqYg +JcC<$JcC<$Q2g4MqYg +JcC<$JcC<$PlL+LqYg9gpA=a`qt]gXp\44OlLk)IrU]mVrpg!Wr9s[Rs6]dOs6K^MrTX@Gs6'@C +!p/M(rT!q;ro*h6s53h4qq_8,r7g/`qV1i$n(miqr7h)%rn7;'r7Cr!rmgqrrmUkpqU,5fps8l` +ps8ocqU,>krmUeps4./#rR_)%s4R>(s4dS/r8%A/rnmS1qr-u&q;Lf#o\]?"rSdb8qr@_;roO+@ +s6'FGrTX@Is6KXM!q#FDrU9dUs7-'Ys7?6^r:U*`rqH6`r;$3cd/3D3pAO.QJcC<$JcF[.J,~> +JcC<$JcC<$PlL+LqYg9gpA=a`qt]gXp\44OlLk)IrU]mVrpg!Wr9s[Rs6]dOs6K^MrTX@Gs6'@C +!p/M(rT!q;ro*h6s53h4qq_8,r7g/`qV1i$n(miqr7h)%rn7;'r7Cr!rmgqrrmUkpqU,5fps8l` +ps8ocqU,>krmUeps4./#rR_)%s4R>(s4dS/r8%A/rnmS1qr-u&q;Lf#o\]?"rSdb8qr@_;roO+@ +s6'FGrTX@Is6KXM!q#FDrU9dUs7-'Ys7?6^r:U*`rqH6`r;$3cd/3D3pAO.QJcC<$JcF[.J,~> +JcC<$JcC<$PlL+LqYg9gpA=a`qt]gXp\44OlLk)IrU]mVrpg!Wr9s[Rs6]dOs6K^MrTX@Gs6'@C +!p/M(rT!q;ro*h6s53h4qq_8,r7g/`qV1i$n(miqr7h)%rn7;'r7Cr!rmgqrrmUkpqU,5fps8l` +ps8ocqU,>krmUeps4./#rR_)%s4R>(s4dS/r8%A/rnmS1qr-u&q;Lf#o\]?"rSdb8qr@_;roO+@ +s6'FGrTX@Is6KXM!q#FDrU9dUs7-'Ys7?6^r:U*`rqH6`r;$3cd/3D3pAO.QJcC<$JcF[.J,~> +JcC<$JcC<$P5jnJqYg +JcC<$JcC<$P5jnJqYg +JcC<$JcC<$P5jnJqYg +JcC<$JcC<$OoOeIqYg9go_\O^qYBLQn+ZJJp%A:UrU]pWrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'@C +s5j:ArT!q;ro*e5rnm_3ptbc$p=o>so%iNdptbo(rnI>(rn7>(qq(hus4."rrR:_njjF%TrR:\o +rmh&"rR_&$s4RA)s4dS/r8%D0s53_3ro*h8h;e@kp>Pc(pu2/1qW%S9roO+@roa=FrTX@Is6KXM +s6]jSrU9dUs7-'Ys7?9_r:U'_rqH9arV?BfiVV[5oDRbLJcC<$JcFR+J,~> +JcC<$JcC<$OoOeIqYg9go_\O^qYBLQn+ZJJp%A:UrU]pWrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'@C +s5j:ArT!q;ro*e5rnm_3ptbc$p=o>so%iNdptbo(rnI>(rn7>(qq(hus4."rrR:_njjF%TrR:\o +rmh&"rR_&$s4RA)s4dS/r8%D0s53_3ro*h8h;e@kp>Pc(pu2/1qW%S9roO+@roa=FrTX@Is6KXM +s6]jSrU9dUs7-'Ys7?9_r:U'_rqH9arV?BfiVV[5oDRbLJcC<$JcFR+J,~> +JcC<$JcC<$OoOeIqYg9go_\O^qYBLQn+ZJJp%A:UrU]pWrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'@C +s5j:ArT!q;ro*e5rnm_3ptbc$p=o>so%iNdptbo(rnI>(rn7>(qq(hus4."rrR:_njjF%TrR:\o +rmh&"rR_&$s4RA)s4dS/r8%D0s53_3ro*h8h;e@kp>Pc(pu2/1qW%S9roO+@roa=FrTX@Is6KXM +s6]jSrU9dUs7-'Ys7?9_r:U'_rqH9arV?BfiVV[5oDRbLJcC<$JcFR+J,~> +JcC<$JcC<$OT4\Hq>L0fo_\L]q>'4Kn+ZVNp\"LWrq$$Xs7-*XrU9aRs6]dOs6K^MrTX@Gs6'@C +s5j:ArT!n:s5Ek5rnm\2oA05tn(misp##Z)pYYo*q;)&*rnIA)rn7;'r7Cr!rmgkprR:Ylo$R?_ +rR:Ynrmh&"r7Cu$s4R>(s4dS/rS@J0s53b4ro*k9puCZ#o&KH'pYko,puDA7roO%>s6'FGr9=7H +s6KXMs6]jSrU9dUs7-'Ys7?9_r:U'_s7cBbrV?BflhfH7nbqPJJcC<$JcFL)J,~> +JcC<$JcC<$OT4\Hq>L0fo_\L]q>'4Kn+ZVNp\"LWrq$$Xs7-*XrU9aRs6]dOs6K^MrTX@Gs6'@C +s5j:ArT!n:s5Ek5rnm\2oA05tn(misp##Z)pYYo*q;)&*rnIA)rn7;'r7Cr!rmgkprR:Ylo$R?_ +rR:Ynrmh&"r7Cu$s4R>(s4dS/rS@J0s53b4ro*k9puCZ#o&KH'pYko,puDA7roO%>s6'FGr9=7H +s6KXMs6]jSrU9dUs7-'Ys7?9_r:U'_s7cBbrV?BflhfH7nbqPJJcC<$JcFL)J,~> +JcC<$JcC<$OT4\Hq>L0fo_\L]q>'4Kn+ZVNp\"LWrq$$Xs7-*XrU9aRs6]dOs6K^MrTX@Gs6'@C +s5j:ArT!n:s5Ek5rnm\2oA05tn(misp##Z)pYYo*q;)&*rnIA)rn7;'r7Cr!rmgkprR:Ylo$R?_ +rR:Ynrmh&"r7Cu$s4R>(s4dS/rS@J0s53b4ro*k9puCZ#o&KH'pYko,puDA7roO%>s6'FGr9=7H +s6KXMs6]jSrU9dUs7-'Ys7?9_r:U'_s7cBbrV?BflhfH7nbqPJJcC<$JcFL)J,~> +JcC<$JcC<$O8nSGq>L0foDA@[q"`nDo_84Uq"=UXrq$'Yrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'=B +s5j:Ar8[h:ro*b4rSRP0k2#mjqVU>kr87J0qq_8,rnIA)rn7;'r7Cr!rRL_nqU>,cqpYAjrmh#! +r7Cu$s4RA)rnIJ.rS@M1s53b4ro*k9qW%M7lK.j&n)O-$o],o2rT3q=s6'CFrTX@Is6KXMs6]gR +rU9dUs7-'Ys7?9_r:U'_rqH +JcC<$JcC<$O8nSGq>L0foDA@[q"`nDo_84Uq"=UXrq$'Yrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'=B +s5j:Ar8[h:ro*b4rSRP0k2#mjqVU>kr87J0qq_8,rnIA)rn7;'r7Cr!rRL_nqU>,cqpYAjrmh#! +r7Cu$s4RA)rnIJ.rS@M1s53b4ro*k9qW%M7lK.j&n)O-$o],o2rT3q=s6'CFrTX@Is6KXMs6]gR +rU9dUs7-'Ys7?9_r:U'_rqH +JcC<$JcC<$O8nSGq>L0foDA@[q"`nDo_84Uq"=UXrq$'Yrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'=B +s5j:Ar8[h:ro*b4rSRP0k2#mjqVU>kr87J0qq_8,rnIA)rn7;'r7Cr!rRL_nqU>,cqpYAjrmh#! +r7Cu$s4RA)rnIJ.rS@M1s53b4ro*k9qW%M7lK.j&n)O-$o],o2rT3q=s6'CFrTX@Is6KXMs6]gR +rU9dUs7-'Ys7?9_r:U'_rqH +JcC<$JcC<$O8nMEq>L0fo)&4YpA*S?q"O^[q"=XYrq$'Yrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'=B +s5j:Ar8[e9ro*\2r86bqq;:`#n_s0!rSRV2qq_8,s4dG)rn7>(qq(etrmgViqpY2erRLnur7Cu$ +rn78(s4dS/r8%D0s53b4s5Et:qr@Y9r8m2*qW7P6jQ$-urT3q=roa=Fr9=7Hrp0OLs6]jSrU9dU +s7-$Xs7?9_r:U*`rqH9arqZKgo)%GEkPa<;JcC<$JcFF'J,~> +JcC<$JcC<$O8nMEq>L0fo)&4YpA*S?q"O^[q"=XYrq$'Yrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'=B +s5j:Ar8[e9ro*\2r86bqq;:`#n_s0!rSRV2qq_8,s4dG)rn7>(qq(etrmgViqpY2erRLnur7Cu$ +rn78(s4dS/r8%D0s53b4s5Et:qr@Y9r8m2*qW7P6jQ$-urT3q=roa=Fr9=7Hrp0OLs6]jSrU9dU +s7-$Xs7?9_r:U*`rqH9arqZKgo)%GEkPa<;JcC<$JcFF'J,~> +JcC<$JcC<$O8nMEq>L0fo)&4YpA*S?q"O^[q"=XYrq$'Yrpg$Xr9s[Rs6]dOs6K^MrTX@Gs6'=B +s5j:Ar8[e9ro*\2r86bqq;:`#n_s0!rSRV2qq_8,s4dG)rn7>(qq(etrmgViqpY2erRLnur7Cu$ +rn78(s4dS/r8%D0s53b4s5Et:qr@Y9r8m2*qW7P6jQ$-urT3q=roa=Fr9=7Hrp0OLs6]jSrU9dU +s7-$Xs7?9_r:U*`rqH9arqZKgo)%GEkPa<;JcC<$JcFF'J,~> +JcC<$JcC<$NW8>Dq>L-enb`+XoD.;=qY0p]qXsgZs7?-Ys7--Yr9s[Rs6]dOs6K^Mr9=7Fs6'@C +roO1@qr@\8ro*V0l/2*jq;Lc$qVh8.rnm_3qq_8,rnIA)rn7;'qq(etqpk)`r71bsqq(i"s4R>( +s4dS/rS@J0s53e5ro*n:qr@\:rT2ktq;qA3p#Gl/r8mb:roa:Er9=7Hs6KULs6]jSrU9dUs7-'Y +rq$0^r:U*`rqH +JcC<$JcC<$NW8>Dq>L-enb`+XoD.;=qY0p]qXsgZs7?-Ys7--Yr9s[Rs6]dOs6K^Mr9=7Fs6'@C +roO1@qr@\8ro*V0l/2*jq;Lc$qVh8.rnm_3qq_8,rnIA)rn7;'qq(etqpk)`r71bsqq(i"s4R>( +s4dS/rS@J0s53e5ro*n:qr@\:rT2ktq;qA3p#Gl/r8mb:roa:Er9=7Hs6KULs6]jSrU9dUs7-'Y +rq$0^r:U*`rqH +JcC<$JcC<$NW8>Dq>L-enb`+XoD.;=qY0p]qXsgZs7?-Ys7--Yr9s[Rs6]dOs6K^Mr9=7Fs6'@C +roO1@qr@\8ro*V0l/2*jq;Lc$qVh8.rnm_3qq_8,rnIA)rn7;'qq(etqpk)`r71bsqq(i"s4R>( +s4dS/rS@J0s53e5ro*n:qr@\:rT2ktq;qA3p#Gl/r8mb:roa:Er9=7Hs6KULs6]jSrU9dUs7-'Y +rq$0^r:U*`rqH +JcC<$JcC<$N;r2Bq>L-en,)hTmeQ#?qtL'_qXsj[rq$'Yrpg$XrU9aRs6]dOs6K^MrTX=Fs6'=B +s5j7@qr@\8r8HJiqr.A1m,S!&r8IM1rnm_3r8%A-s4dG)rn7;'q:GPqmFD-cqUb`!s4R>(rnIJ. +rS@M1rnm\4s5Et:r8[e;roNq;lK@^"pZ;)/puV;5roa:Eqs".Grp0OLs6]jSr9s[Ts7-'Yrq$0^ +r:U*`rqH +JcC<$JcC<$N;r2Bq>L-en,)hTmeQ#?qtL'_qXsj[rq$'Yrpg$XrU9aRs6]dOs6K^MrTX=Fs6'=B +s5j7@qr@\8r8HJiqr.A1m,S!&r8IM1rnm_3r8%A-s4dG)rn7;'q:GPqmFD-cqUb`!s4R>(rnIJ. +rS@M1rnm\4s5Et:r8[e;roNq;lK@^"pZ;)/puV;5roa:Eqs".Grp0OLs6]jSr9s[Ts7-'Yrq$0^ +r:U*`rqH +JcC<$JcC<$N;r2Bq>L-en,)hTmeQ#?qtL'_qXsj[rq$'Yrpg$XrU9aRs6]dOs6K^MrTX=Fs6'=B +s5j7@qr@\8r8HJiqr.A1m,S!&r8IM1rnm_3r8%A-s4dG)rn7;'q:GPqmFD-cqUb`!s4R>(rnIJ. +rS@M1rnm\4s5Et:r8[e;roNq;lK@^"pZ;)/puV;5roa:Eqs".Grp0OLs6]jSr9s[Ts7-'Yrq$0^ +r:U*`rqH +JcC<$JcC<$MuW)Aq#1!cn,)_QlM9iBr:g0`qXsj[rq$'Ys7-*XrU9dSs6]aNs6K^MrTX=Fs6'=B +roO.?qr@V6qr-o"q;M20h;eInrSdY3rnm_3r8%A-rnIA)rRq2&pXelbpt,Jsrn75's4dS/r8%D0 +s53b4s5F";r8[e;roO"=r9*A/q<.5/o]>`-rTF.Cqs".Grp0LKs6]jSrU9aTs7-'Ys7?6^r:U*` +rqH +JcC<$JcC<$MuW)Aq#1!cn,)_QlM9iBr:g0`qXsj[rq$'Ys7-*XrU9dSs6]aNs6K^MrTX=Fs6'=B +roO.?qr@V6qr-o"q;M20h;eInrSdY3rnm_3r8%A-rnIA)rRq2&pXelbpt,Jsrn75's4dS/r8%D0 +s53b4s5F";r8[e;roO"=r9*A/q<.5/o]>`-rTF.Cqs".Grp0LKs6]jSrU9aTs7-'Ys7?6^r:U*` +rqH +JcC<$JcC<$MuW)Aq#1!cn,)_QlM9iBr:g0`qXsj[rq$'Ys7-*XrU9dSs6]aNs6K^MrTX=Fs6'=B +roO.?qr@V6qr-o"q;M20h;eInrSdY3rnm_3r8%A-rnIA)rRq2&pXelbpt,Jsrn75's4dS/r8%D0 +s53b4s5F";r8[e;roO"=r9*A/q<.5/o]>`-rTF.Cqs".Grp0LKs6]jSrU9aTs7-'Ys7?6^r:U*` +rqH +JcC<$JcC<$M>ul?q#1!cm/-2HmJ6>Jr:g0`qt9s\rq$'Ys7--Yr9s[Rs6]dOrp0ULrTX=Fs6'=B +roO+>q;_A3m,@d"o&K&spZ)53ro*b4rnm_3r8%A-rnI>(rRq/%jk'I`rn72&s4dP.r8%D0s53e5 +ro*n:r8[hrTF+BlKS-.q<-`!r9+%Bqs"+Frp0LKs6]gRrU9dUrpfsXs7?6^r:U*`rqH +JcC<$JcC<$M>ul?q#1!cm/-2HmJ6>Jr:g0`qt9s\rq$'Ys7--Yr9s[Rs6]dOrp0ULrTX=Fs6'=B +roO+>q;_A3m,@d"o&K&spZ)53ro*b4rnm_3r8%A-rnI>(rRq/%jk'I`rn72&s4dP.r8%D0s53e5 +ro*n:r8[hrTF+BlKS-.q<-`!r9+%Bqs"+Frp0LKs6]gRrU9dUrpfsXs7?6^r:U*`rqH +JcC<$JcC<$M>ul?q#1!cm/-2HmJ6>Jr:g0`qt9s\rq$'Ys7--Yr9s[Rs6]dOrp0ULrTX=Fs6'=B +roO+>q;_A3m,@d"o&K&spZ)53ro*b4rnm_3r8%A-rnI>(rRq/%jk'I`rn72&s4dP.r8%D0s53e5 +ro*n:r8[hrTF+BlKS-.q<-`!r9+%Bqs"+Frp0LKs6]gRrU9dUrpfsXs7?6^r:U*`rqH +JcC<$JcC<$M#Z`=q#0sbl20`AoD/%Rr:g3aqXsm\rq$'Ys7-*XrU9dSrpB[Ns6K^Mr9=4Es6':A +roO+>p>bQ"o&KQ,l/hg'q;_J6ro*e5rnm_3qq_;-rS.2&rRq&"p"0&mrRq&$rnIJ.r8%D0rnm\4 +s5Et:rT!n +JcC<$JcC<$M#Z`=q#0sbl20`AoD/%Rr:g3aqXsm\rq$'Ys7-*XrU9dSrpB[Ns6K^Mr9=4Es6':A +roO+>p>bQ"o&KQ,l/hg'q;_J6ro*e5rnm_3qq_;-rS.2&rRq&"p"0&mrRq&$rnIJ.r8%D0rnm\4 +s5Et:rT!n +JcC<$JcC<$M#Z`=q#0sbl20`AoD/%Rr:g3aqXsm\rq$'Ys7-*XrU9dSrpB[Ns6K^Mr9=4Es6':A +roO+>p>bQ"o&KQ,l/hg'q;_J6ro*e5rnm_3qq_;-rS.2&rRq&"p"0&mrRq&$rnIJ.r8%D0rnm\4 +s5Et:rT!n +JcC<$JcC<$L]?T;p\jjaj88*;q"aXYrV-9aqt9s\s7?0Zrpg$Xr9s[Rs6]aNs6K^Mr9=4Eroa1@ +rT4"=hW+InqW6r'qrRe;qW%S7ro*b4s53h4qq_8,rnI5%q:YPqq:YStrnIG-r8%D0s53b4s5F"; +r8[h +JcC<$JcC<$L]?T;p\jjaj88*;q"aXYrV-9aqt9s\s7?0Zrpg$Xr9s[Rs6]aNs6K^Mr9=4Eroa1@ +rT4"=hW+InqW6r'qrRe;qW%S7ro*b4s53h4qq_8,rnI5%q:YPqq:YStrnIG-r8%D0s53b4s5F"; +r8[h +JcC<$JcC<$L]?T;p\jjaj88*;q"aXYrV-9aqt9s\s7?0Zrpg$Xr9s[Rs6]aNs6K^Mr9=4Eroa1@ +rT4"=hW+InqW6r'qrRe;qW%S7ro*b4s53h4qq_8,rnI5%q:YPqq:YStrnIG-r8%D0s53b4s5F"; +r8[h +JcC<$JcC<$LB$K:p\jg`gACC9q>'d[rV-9aqt:!]rq$'Ys7-*XrU9aRs6]aNs6K^Mqs"+Droa.? +rT3n:mc4-(qW6GnrT4"=qr@\8ro*b4s53h4qq_5+rS-tuqq:SprnID,r8%A/s53b4s5F";r8[h< +s5j1@roa:Eq<@eAmHaT5nEKB)p$)G?rp0IJrpB^Qr9s[Ts7-$Xrq$0^r:U'_s7cEcrV?Hhp\Xgb +p&2H#JcC<$JcEmmJ,~> +JcC<$JcC<$LB$K:p\jg`gACC9q>'d[rV-9aqt:!]rq$'Ys7-*XrU9aRs6]aNs6K^Mqs"+Droa.? +rT3n:mc4-(qW6GnrT4"=qr@\8ro*b4s53h4qq_5+rS-tuqq:SprnID,r8%A/s53b4s5F";r8[h< +s5j1@roa:Eq<@eAmHaT5nEKB)p$)G?rp0IJrpB^Qr9s[Ts7-$Xrq$0^r:U'_s7cEcrV?Hhp\Xgb +p&2H#JcC<$JcEmmJ,~> +JcC<$JcC<$LB$K:p\jg`gACC9q>'d[rV-9aqt:!]rq$'Ys7-*XrU9aRs6]aNs6K^Mqs"+Droa.? +rT3n:mc4-(qW6GnrT4"=qr@\8ro*b4s53h4qq_5+rS-tuqq:SprnID,r8%A/s53b4s5F";r8[h< +s5j1@roa:Eq<@eAmHaT5nEKB)p$)G?rp0IJrpB^Qr9s[Ts7-$Xrq$0^r:U'_s7cEcrV?Hhp\Xgb +p&2H#JcC<$JcEmmJ,~> +JcC<$JcC<$K`C67pAO[^ebf%9qt^$^rV- +JcC<$JcC<$K`C67pAO[^ebf%9qt^$^rV- +JcC<$JcC<$K`C67pAO[^ebf%9qt^$^rV- +JcC<$JcC<$KE(*5p&4L[eGK(r8[e9ro*b4rnm_3qVD&(m+_HnqVD/-rnmY3ro*n:rT!n +JcC<$JcC<$KE(*5p&4L[eGK(r8[e9ro*b4rnm_3qVD&(m+_HnqVD/-rnmY3ro*n:rT!n +JcC<$JcC<$KE(*5p&4L[eGK(r8[e9ro*b4rnm_3qVD&(m+_HnqVD/-rnmY3ro*n:rT!n +JcC<$JcC<$KE('4o_n:Webf4>r;$-_rqHEcqt9s\s7?0Zrpg$Xr9sXQs6]aNrp0RKqs"(Cr9)r! +qWI\8q:'eq#.c&JcC<$JcERd +J,~> +JcC<$JcC<$KE('4o_n:Webf4>r;$-_rqHEcqt9s\s7?0Zrpg$Xr9sXQs6]aNrp0RKqs"(Cr9)r! +qWI\8q:'eq#.c&JcC<$JcERd +J,~> +JcC<$JcC<$KE('4o_n:Webf4>r;$-_rqHEcqt9s\s7?0Zrpg$Xr9sXQs6]aNrp0RKqs"(Cr9)r! +qWI\8q:'eq#.c&JcC<$JcERd +J,~> +JcC<$JcC<$JcFj2oDS(Sf_bOAr;$0`rqHEcqt9s\s7?0Zrpg$Xr9sXQs6]^Mrp0RKqW[qAqWI8. +q<.V +JcC<$JcC<$JcFj2oDS(Sf_bOAr;$0`rqHEcqt9s\s7?0Zrpg$Xr9sXQs6]^Mrp0RKqW[qAqWI8. +q<.V +JcC<$JcC<$JcFj2oDS(Sf_bOAr;$0`rqHEcqt9s\s7?0Zrpg$Xr9sXQs6]^Mrp0RKqW[qAqWI8. +q<.V +JcC<$JcC<$JcGcMir8NIjo"3:qYL0dq=ss`rq?6^rq-6^qssdWrp]jSs6fmRqs==JrTa4CqWR8. +q<7G7kN_j,rTO7DqW@h>roEt:ro3q9qV_>0qqgbsqqh;/qr%J4ro3k9s5a4Ar9"%Broj:Erp'LK +qX".IkO/05mHjW6na-5ArU0ONrp]pWr:9jYrq--]rq??cqtU0drVH?equ$ +JcC<$JcC<$JcGcMir8NIjo"3:qYL0dq=ss`rq?6^rq-6^qssdWrp]jSs6fmRqs==JrTa4CqWR8. +q<7G7kN_j,rTO7DqW@h>roEt:ro3q9qV_>0qqgbsqqh;/qr%J4ro3k9s5a4Ar9"%Broj:Erp'LK +qX".IkO/05mHjW6na-5ArU0ONrp]pWr:9jYrq--]rq??cqtU0drVH?equ$ +JcC<$JcC<$JcGcMir8NIjo"3:qYL0dq=ss`rq?6^rq-6^qssdWrp]jSs6fmRqs==JrTa4CqWR8. +q<7G7kN_j,rTO7DqW@h>roEt:ro3q9qV_>0qqgbsqqh;/qr%J4ro3k9s5a4Ar9"%Broj:Erp'LK +qX".IkO/05mHjW6na-5ArU0ONrp]pWr:9jYrq--]rq??cqtU0drVH?equ$ +JcC<$JcC<$JcG]KiVr +JcC<$JcC<$JcG]KiVr +JcC<$JcC<$JcG]KiVr +JcC<$JcC<$JcGZJi;W*Ai;E'@r;-?eqY:'arq?6^rq-6^qssdWrp]jSrpKdQqX"1Hr9E&$qWdnB +l0S<5rTa7Droj@Eqr[n>roEt:rSme7pYbPup>Gr/ro3h8s5a1@r9"%Broj:Es6BULqs=:KrU/S3 +qfJcC<$YQ'+~> +JcC<$JcC<$JcGZJi;W*Ai;E'@r;-?eqY:'arq?6^rq-6^qssdWrp]jSrpKdQqX"1Hr9E&$qWdnB +l0S<5rTa7Droj@Eqr[n>roEt:rSme7pYbPup>Gr/ro3h8s5a1@r9"%Broj:Es6BULqs=:KrU/S3 +qfJcC<$YQ'+~> +JcC<$JcC<$JcGZJi;W*Ai;E'@r;-?eqY:'arq?6^rq-6^qssdWrp]jSrpKdQqX"1Hr9E&$qWdnB +l0S<5rTa7Droj@Eqr[n>roEt:rSme7pYbPup>Gr/ro3h8s5a1@r9"%Broj:Es6BULqs=:KrU/S3 +qfJcC<$YQ'+~> +JcC<$JcC<$JcGWIh>ZL6kPXoJr;-Bfq=ss`rq?9_rq-3]r:9jWrp]gRrpKdQqX".Gqs*A/qroEq9rSme7jP]spro3h8roF(?r9"%Broj=Frp'LKr9XCLrU0@Io^M>< +q!RA5qX4.IrUBgVqXXXWrq--]rq??cqY:'crVH?er;?EibPm(mJcC<$VuM8~> +JcC<$JcC<$JcGWIh>ZL6kPXoJr;-Bfq=ss`rq?9_rq-3]r:9jWrp]gRrpKdQqX".Gqs*A/qroEq9rSme7jP]spro3h8roF(?r9"%Broj=Frp'LKr9XCLrU0@Io^M>< +q!RA5qX4.IrUBgVqXXXWrq--]rq??cqY:'crVH?er;?EibPm(mJcC<$VuM8~> +JcC<$JcC<$JcGWIh>ZL6kPXoJr;-Bfq=ss`rq?9_rq-3]r:9jWrp]gRrpKdQqX".Gqs*A/qroEq9rSme7jP]spro3h8roF(?r9"%Broj=Frp'LKr9XCLrU0@Io^M>< +q!RA5qX4.IrUBgVqXXXWrq--]rq??cqY:'crVH?er;?EibPm(mJcC<$VuM8~> +JcC<$JcC<$JcGQGgA]q,nGMnTr;-BfqY:'arq?6^rq-3]r:9jWrp]gRrpKaPq<\"Ejm)^.na,Z1 +p?_bDrTa:Eroj@Eqr[n>roEn8rSm\4n_j<'r8RV6roF(?r9""As60CFrp'OLqs==LrpKOLk4%m/ +jmMg1rUBdUqssaXrUg![rq??cqtU-crqcEer;?EifD^@$JcC<$Rf@m~> +JcC<$JcC<$JcGQGgA]q,nGMnTr;-BfqY:'arq?6^rq-3]r:9jWrp]gRrpKaPq<\"Ejm)^.na,Z1 +p?_bDrTa:Eroj@Eqr[n>roEn8rSm\4n_j<'r8RV6roF(?r9""As60CFrp'OLqs==LrpKOLk4%m/ +jmMg1rUBdUqssaXrUg![rq??cqtU-crqcEer;?EifD^@$JcC<$Rf@m~> +JcC<$JcC<$JcGQGgA]q,nGMnTr;-BfqY:'arq?6^rq-3]r:9jWrp]gRrpKaPq<\"Ejm)^.na,Z1 +p?_bDrTa:Eroj@Eqr[n>roEn8rSm\4n_j<'r8RV6roF(?r9""As60CFrp'OLqs==LrpKOLk4%m/ +jmMg1rUBdUqssaXrUg![rq??cqtU-crqcEer;?EifD^@$JcC<$Rf@m~> +JcC<$JcC<$JcGKEfDaP'o_e@YrVHKgqY:$`rq?9_rq-3]qssaVrp]gRrU0XOp[%Pq!@tFrp'CFroj@Eqr[n>rT*e7qVq&(qr7G3rT*t>r9""As60CFrp'OLqs=@MrU0LMr:&t@ +q!dY=q!RY?rUBdUq==OVrq-*\rq??cqY:'crVH?er;?Eih>W!*JcC<$P5g%~> +JcC<$JcC<$JcGKEfDaP'o_e@YrVHKgqY:$`rq?9_rq-3]qssaVrp]gRrU0XOp[%Pq!@tFrp'CFroj@Eqr[n>rT*e7qVq&(qr7G3rT*t>r9""As60CFrp'OLqs=@MrU0LMr:&t@ +q!dY=q!RY?rUBdUq==OVrq-*\rq??cqY:'crVH?er;?Eih>W!*JcC<$P5g%~> +JcC<$JcC<$JcGKEfDaP'o_e@YrVHKgqY:$`rq?9_rq-3]qssaVrp]gRrU0XOp[%Pq!@tFrp'CFroj@Eqr[n>rT*e7qVq&(qr7G3rT*t>r9""As60CFrp'OLqs=@MrU0LMr:&t@ +q!dY=q!RY?rUBdUq==OVrq-*\rq??cqY:'crVH?er;?Eih>W!*JcC<$P5g%~> +JcC<$JcC<$JcGHDd/Mo#p\a[\rVHKgqY:'arq?6^rq-3]qssaVrp]dQrU0XOna-#9md0f;p[7YA +qqr[qAroj:Es6BULr9XFMrpKXOr:'URmIL&B +q=*5/qsaORqXXUVrq-'[rq??cqtU-crqcEer;?Hjhu83,JcC<$NrOV~> +JcC<$JcC<$JcGHDd/Mo#p\a[\rVHKgqY:'arq?6^rq-3]qssaVrp]dQrU0XOna-#9md0f;p[7YA +qqr[qAroj:Es6BULr9XFMrpKXOr:'URmIL&B +q=*5/qsaORqXXUVrq-'[rq??cqtU-crqcEer;?Hjhu83,JcC<$NrOV~> +JcC<$JcC<$JcGHDd/Mo#p\a[\rVHKgqY:'arq?6^rq-3]qssaVrp]dQrU0XOna-#9md0f;p[7YA +qqr[qAroj:Es6BULr9XFMrpKXOr:'URmIL&B +q=*5/qsaORqXXUVrq-'[rq??cqtU-crqcEer;?Hjhu83,JcC<$NrOV~> +JcC<$JcC<$JcG?A`r>3#q#'g^rVHKgqY:'arV$-]rq-3]qssaVrp]aPrU0RMi9^:,qX3A3r9jON +qX"4IrTa:Eroj@EqW@b +JcC<$JcC<$JcG?A`r>3#q#'g^rVHKgqY:'arV$-]rq-3]qssaVrp]aPrU0RMi9^:,qX3A3r9jON +qX"4IrTa:Eroj@EqW@b +JcC<$JcC<$JcG?A`r>3#q#'g^rVHKgqY:'arV$-]rq-3]qssaVrp]aPrU0RMi9^:,qX3A3r9jON +qX"4IrTa:Eroj@EqW@b +JcC<$JcC<$JcG<@^AdR!q>Bp_rVHKgqY:'arq?6^rq-3]qXXXUrUBXOqsO:In*Ki:q +JcC<$JcC<$JcG<@^AdR!q>Bp_rVHKgqY:'arq?6^rq-3]qXXXUrUBXOqsO:In*Ki:q +JcC<$JcC<$JcG<@^AdR!q>Bp_rVHKgqY:'arq?6^rq-3]qXXXUrUBXOqsO:In*Ki:q +JcC<$JcC<$JcG6>\c24!q>Bs`rVHKgqY:'arV$-]rq-3]qXXXUrUBRMqX3\:q!R\@l1"E8rU0XO +qX"4Irp'CFrTO7Dpu_G7n`9Q.q<%Y=roj:Erp'LKr9XFMrpK[Prp]mVp@@SAn+-#=rUBILp%&(Q +rUfpYrq? +JcC<$JcC<$JcG6>\c24!q>Bs`rVHKgqY:'arV$-]rq-3]qXXXUrUBRMqX3\:q!R\@l1"E8rU0XO +qX"4Irp'CFrTO7Dpu_G7n`9Q.q<%Y=roj:Erp'LKr9XFMrpK[Prp]mVp@@SAn+-#=rUBILp%&(Q +rUfpYrq? +JcC<$JcC<$JcG6>\c24!q>Bs`rVHKgqY:'arV$-]rq-3]qXXXUrUBRMqX3\:q!R\@l1"E8rU0XO +qX"4Irp'CFrTO7Dpu_G7n`9Q.q<%Y=roj:Erp'LKr9XFMrpK[Prp]mVp@@SAn+-#=rUBILp%&(Q +rUfpYrq? +JcC<$JcC<$JcG-;\Gl.!qY^'arVHKgqY:'arq?3]rq-3]qXXUTr:'CJkjJ!0q!dY?qXF:KrU0[P +qs==JrTa:ErTO4Cp?(i*p?)>:roj7Drp'LKr9XFMs6fdQrp]mVq""7PoCVbJmIK`9o()_MrUfpY +rV$6bqY:$brVH?er;?Hjm/DS9JcC<$JcGZJJ,~> +JcC<$JcC<$JcG-;\Gl.!qY^'arVHKgqY:'arq?3]rq-3]qXXUTr:'CJkjJ!0q!dY?qXF:KrU0[P +qs==JrTa:ErTO4Cp?(i*p?)>:roj7Drp'LKr9XFMs6fdQrp]mVq""7PoCVbJmIK`9o()_MrUfpY +rV$6bqY:$brVH?er;?Hjm/DS9JcC<$JcGZJJ,~> +JcC<$JcC<$JcG-;\Gl.!qY^'arVHKgqY:'arq?3]rq-3]qXXUTr:'CJkjJ!0q!dY?qXF:KrU0[P +qs==JrTa:ErTO4Cp?(i*p?)>:roj7Drp'LKr9XFMs6fdQrp]mVq""7PoCVbJmIK`9o()_MrUfpY +rV$6bqY:$brVH?er;?Hjm/DS9JcC<$JcGZJJ,~> +JcC<$JcC<$JcG!7\Gl4#qY^*brVHKgqY:'arV$-]rUg*\q==LSr:&8*q=+.KnacMGr:'ONrpKaP +qs==JrTa7DrTO4CiTC+%rTO.Crp'LKqs=@MrpK[Prp]pWq==FSk4JH?eaiV/rUfmXrq? +JcC<$JcC<$JcG!7\Gl4#qY^*brVHKgqY:'arV$-]rUg*\q==LSr:&8*q=+.KnacMGr:'ONrpKaP +qs==JrTa7DrTO4CiTC+%rTO.Crp'LKqs=@MrpK[Prp]pWq==FSk4JH?eaiV/rUfmXrq? +JcC<$JcC<$JcG!7\Gl4#qY^*brVHKgqY:'arV$-]rUg*\q==LSr:&8*q=+.KnacMGr:'ONrpKaP +qs==JrTa7DrTO4CiTC+%rTO.Crp'LKqs=@MrpK[Prp]pWq==FSk4JH?eaiV/rUfmXrq? +JcC<$JcC<$JcFm4\,Q1$qY^-cr;-Egq=ss`rV$-]rUg'[q==IRqs`M3q=+4MjRW6=r:'ONrpKdQ +qX"4Irp'=Dr94%@mH4 +JcC<$JcC<$JcFm4\,Q1$qY^-cr;-Egq=ss`rV$-]rUg'[q==IRqs`M3q=+4MjRW6=r:'ONrpKdQ +qX"4Irp'=Dr94%@mH4 +JcC<$JcC<$JcFm4\,Q1$qY^-cr;-Egq=ss`rV$-]rUg'[q==IRqs`M3q=+4MjRW6=r:'ONrpKdQ +qX"4Irp'=Dr94%@mH4 +JcC<$JcC<$JcFd1\Gl=&qY^*brVHKgqY:$`rq?3]rUg'[q""=Pq!db@p[J"Kg%,(2rUB[PrU0[P +qX"4IrTa4CqrmA/qrmk?rp'LKqs==LrpK[Prp]pWqXXUVr:Jq?q"44MoCDVHqt0XUr:^*`q=spa +rVH +JcC<$JcC<$JcFd1\Gl=&qY^*brVHKgqY:$`rq?3]rUg'[q""=Pq!db@p[J"Kg%,(2rUB[PrU0[P +qX"4IrTa4CqrmA/qrmk?rp'LKqs==LrpK[Prp]pWqXXUVr:Jq?q"44MoCDVHqt0XUr:^*`q=spa +rVH +JcC<$JcC<$JcFd1\Gl=&qY^*brVHKgqY:$`rq?3]rUg'[q""=Pq!db@p[J"Kg%,(2rUB[PrU0[P +qX"4IrTa4CqrmA/qrmk?rp'LKqs==LrpK[Prp]pWqXXUVr:Jq?q"44MoCDVHqt0XUr:^*`q=spa +rVH +JcC<$JcC<$JcF^/\Gl=&qu$3crVHKgq=ss`rV$*\rUg$Zp[\.Ml1"Kq=OCRr:^*`q=spar;-3cr;?Hj +n,@n +JcC<$JcC<$JcF^/\Gl=&qu$3crVHKgq=ss`rV$*\rUg$Zp[\.Ml1"Kq=OCRr:^*`q=spar;-3cr;?Hj +n,@n +JcC<$JcC<$JcF^/\Gl=&qu$3crVHKgq=ss`rV$*\rUg$Zp[\.Ml1"Kq=OCRr:^*`q=spar;-3cr;?Hj +n,@n +JcC<$JcC<$JcFL)^&Ij+qu$3crVHKgq=sp_rV$*\r:KsZo^_)5n+-/Cp[n4Op[\:QrUB[PrpKaP +qX"1HrT`5'rTa@IqX"4KrpK^Qrp]pWqXXUVrUfaTnFl5Ai:Q[7r:^'_q=sm`rVH +JcC<$JcC<$JcFL)^&Ij+qu$3crVHKgq=sp_rV$*\r:KsZo^_)5n+-/Cp[n4Op[\:QrUB[PrpKaP +qX"1HrT`5'rTa@IqX"4KrpK^Qrp]pWqXXUVrUfaTnFl5Ai:Q[7r:^'_q=sm`rVH +JcC<$JcC<$JcFL)^&Ij+qu$3crVHKgq=sp_rV$*\r:KsZo^_)5n+-/Cp[n4Op[\:QrUB[PrpKaP +qX"1HrT`5'rTa@IqX"4KrpK^Qrp]pWqXXUVrUfaTnFl5Ai:Q[7r:^'_q=sm`rVH +JcC<$JcC<$JcF=$_#F0.qu$3crVHKgq=sp_rV$'[r:KpYlLFrFkjnN?jn/HAq""CRrp]dQrU0[P +q<\%Fqs*D0r9F4GqX"4KrpK[Prp]pWqXXXWrUfgVjn@s3nFZ2Br:^'_q"Xg`r;-3cr;?Ein,@n< +JcC<$JcG?AJ,~> +JcC<$JcC<$JcF=$_#F0.qu$3crVHKgq=sp_rV$'[r:KpYlLFrFkjnN?jn/HAq""CRrp]dQrU0[P +q<\%Fqs*D0r9F4GqX"4KrpK[Prp]pWqXXXWrUfgVjn@s3nFZ2Br:^'_q"Xg`r;-3cr;?Ein,@n< +JcC<$JcG?AJ,~> +JcC<$JcC<$JcF=$_#F0.qu$3crVHKgq=sp_rV$'[r:KpYlLFrFkjnN?jn/HAq""CRrp]dQrU0[P +q<\%Fqs*D0r9F4GqX"4KrpK[Prp]pWqXXXWrUfgVjn@s3nFZ2Br:^'_q"Xg`r;-3cr;?Ein,@n< +JcC<$JcG?AJ,~> +JcC<$JcC<$JcEmmb5V89qu$3crVHKgq=sp_r:]sZqt0dWg@G%1q"3nFqXj^Wq""FSrUB[PrpKaP +q!@qEpZhS=pZh\Bq<\(IrpK[Prp]pWqXXXWrUfmXq=a7Np%Hi,qY'j]p\=^_r;-3cqu$?in,@n< +JcC<$JcG9?J,~> +JcC<$JcC<$JcEmmb5V89qu$3crVHKgq=sp_r:]sZqt0dWg@G%1q"3nFqXj^Wq""FSrUB[PrpKaP +q!@qEpZhS=pZh\Bq<\(IrpK[Prp]pWqXXXWrUfmXq=a7Np%Hi,qY'j]p\=^_r;-3cqu$?in,@n< +JcC<$JcG9?J,~> +JcC<$JcC<$JcEmmb5V89qu$3crVHKgq=sp_r:]sZqt0dWg@G%1q"3nFqXj^Wq""FSrUB[PrpKaP +q!@qEpZhS=pZh\Bq<\(IrpK[Prp]pWqXXXWrUfmXq=a7Np%Hi,qY'j]p\=^_r;-3cqu$?in,@n< +JcC<$JcG9?J,~> +JcC<$JcC<$JcELbe,K1Ar;? +JcC<$JcC<$JcELbe,K1Ar;? +JcC<$JcC<$JcELbe,K1Ar;? +JcC<$JcC<$JcE.Xh#@-Jr;? +J,~> +JcC<$JcC<$JcE.Xh#@-Jr;? +J,~> +JcC<$JcC<$JcE.Xh#@-Jr;? +J,~> +JcC<$JcC<$JcDtShu +JcC<$JcC<$JcDtShu +JcC<$JcC<$JcDtShu +JcC<$JcC<$JcDeNj8SoRqu$3cr;-Bfp\=[\r:]^Sk4J'6j7`0=rUg'[q==LSrUBXOr9jFKlg4K8 +r9jCLrp]mVqss^Wrq-$ZrV$-_f_G+5m.U/IoD&7Zr;--aqu$ +JcC<$JcC<$JcDeNj8SoRqu$3cr;-Bfp\=[\r:]^Sk4J'6j7`0=rUg'[q==LSrUBXOr9jFKlg4K8 +r9jCLrp]mVqss^Wrq-$ZrV$-_f_G+5m.U/IoD&7Zr;--aqu$ +JcC<$JcC<$JcDeNj8SoRqu$3cr;-Bfp\=[\r:]^Sk4J'6j7`0=rUg'[q==LSrUBXOr9jFKlg4K8 +r9jCLrp]mVqss^Wrq-$ZrV$-_f_G+5m.U/IoD&7Zr;--aqu$ +JcC<$JcC<$JcDYJjo5,Tqu$3cr;-Bfp\=[\qtA8,p@dhHq=aRUrUg'[q==LSrUBUNqsNY7qsO7J +rUBgVqXXXWrUfsZr:^*`cM6;ko(`(Wr;-*`qu$?imJ_\:JcC<$JcG-;J,~> +JcC<$JcC<$JcDYJjo5,Tqu$3cr;-Bfp\=[\qtA8,p@dhHq=aRUrUg'[q==LSrUBUNqsNY7qsO7J +rUBgVqXXXWrUfsZr:^*`cM6;ko(`(Wr;-*`qu$?imJ_\:JcC<$JcG-;J,~> +JcC<$JcC<$JcDYJjo5,Tqu$3cr;-Bfp\=[\qtA8,p@dhHq=aRUrUg'[q==LSrUBUNqsNY7qsO7J +rUBgVqXXXWrUfsZr:^*`cM6;ko(`(Wr;-*`qu$?imJ_\:JcC<$JcG-;J,~> +JcC<$JcC<$JcDPGkPk>Vqu$0brVHHfpA"R[qY&J4q"EY?qY'^WrUg'[q==LSr:'FKp?qeEp?q\D +rUBdUqXXXWrUfsZrV$0`oD%bLjS83 +JcC<$JcC<$JcDPGkPk>Vqu$0brVHHfpA"R[qY&J4q"EY?qY'^WrUg'[q==LSr:'FKp?qeEp?q\D +rUBdUqXXXWrUfsZrV$0`oD%bLjS83 +JcC<$JcC<$JcDPGkPk>Vqu$0brVHHfpA"R[qY&J4q"EY?qY'^WrUg'[q==LSr:'FKp?qeEp?q\D +rUBdUqXXXWrUfsZrV$0`oD%bLjS83 +JcC<$JcC<$JcDDCl2LPXr;?9cr;-?epA"LYq"Eb@p@e4Sl1k)KqtBgXrUg'[q==IRr:':Go^;>> +r:'[Tq==OVrUfsZrV$3ao_@JBanY]-qtfs^qu$ +JcC<$JcC<$JcDDCl2LPXr;?9cr;-?epA"LYq"Eb@p@e4Sl1k)KqtBgXrUg'[q==IRr:':Go^;>> +r:'[Tq==OVrUfsZrV$3ao_@JBanY]-qtfs^qu$ +JcC<$JcC<$JcDDCl2LPXr;?9cr;-?epA"LYq"Eb@p@e4Sl1k)KqtBgXrUg'[q==IRr:':Go^;>> +r:'[Tq==OVrUfsZrV$3ao_@JBanY]-qtfs^qu$ +JcC<$JcC<$JcD;@li-bZqu$0br;-?ep%\@Wo_.tNo(MhPh>$mAqtBjYr:KsZq==IRqs`M3r:'XS +q==LUrq-$ZrV$3apA"@Wo_S+RdeNY6qYKj]qu$ +JcC<$JcC<$JcD;@li-bZqu$0br;-?ep%\@Wo_.tNo(MhPh>$mAqtBjYr:KsZq==IRqs`M3r:'XS +q==LUrq-$ZrV$3apA"@Wo_S+RdeNY6qYKj]qu$ +JcC<$JcC<$JcD;@li-bZqu$0br;-?ep%\@Wo_.tNo(MhPh>$mAqtBjYr:KsZq==IRqs`M3r:'XS +q==LUrq-$ZrV$3apA"@Wo_S+RdeNY6qYKj]qu$ +JcC<$JcC<$JcD5>m/Hk[qu$0bqtg3co_A4UjS&9@f(f.:r:]pYrUg'[p[\7Pq=*_=q=+=Pq""CT +rq-$ZrV$3ap\=R[jneTEhtZp@qYKg\qu$9gmJ_\:JcC<$JcFs6J,~> +JcC<$JcC<$JcD5>m/Hk[qu$0bqtg3co_A4UjS&9@f(f.:r:]pYrUg'[p[\7Pq=*_=q=+=Pq""CT +rq-$ZrV$3ap\=R[jneTEhtZp@qYKg\qu$9gmJ_\:JcC<$JcFs6J,~> +JcC<$JcC<$JcD5>m/Hk[qu$0bqtg3co_A4UjS&9@f(f.:r:]pYrUg'[p[\7Pq=*_=q=+=Pq""CT +rq-$ZrV$3ap\=R[jneTEhtZp@qYKg\qu$9gmJ_\:JcC<$JcFs6J,~> +JcC<$JcC<$JcD/ +JcC<$JcC<$JcD/ +JcC<$JcC<$JcD/ +JcC<$JcC<$JcD):m/Hk[qu$-aqtg0bn+c/AkkOB;o(`.WrV$$Zr:KsZp%%kIp$h_Gp@A1Rr:KjY +rV$0`q"Xa^q"j:Qo(q)9p\OIXq>C*fli)J8JcC<$JcFp5J,~> +JcC<$JcC<$JcD):m/Hk[qu$-aqtg0bn+c/AkkOB;o(`.WrV$$Zr:KsZp%%kIp$h_Gp@A1Rr:KjY +rV$0`q"Xa^q"j:Qo(q)9p\OIXq>C*fli)J8JcC<$JcFp5J,~> +JcC<$JcC<$JcD):m/Hk[qu$-aqtg0bn+c/AkkOB;o(`.WrV$$Zr:KsZp%%kIp$h_Gp@A1Rr:KjY +rV$0`q"Xa^q"j:Qo(q)9p\OIXq>C*fli)J8JcC<$JcFp5J,~> +JcC<$JcC<$JcD&9mJct\qY^$`qYL'a`q\Edo_A@Yr:]pYrUg!YoCD;=oCDhNrUfpYrV$0`q"Xd_ +q>0%HnbVJFo_S(SqY^0fli)J8JcC<$JcFj3J,~> +JcC<$JcC<$JcD&9mJct\qY^$`qYL'a`q\Edo_A@Yr:]pYrUg!YoCD;=oCDhNrUfpYrV$0`q"Xd_ +q>0%HnbVJFo_S(SqY^0fli)J8JcC<$JcFj3J,~> +JcC<$JcC<$JcD&9mJct\qY^$`qYL'a`q\Edo_A@Yr:]pYrUg!YoCD;=oCDhNrUfpYrV$0`q"Xd_ +q>0%HnbVJFo_S(SqY^0fli)J8JcC<$JcFj3J,~> +JcC<$JcC<$JcD#8m/Hk[qY^!_qYL$`chR/.m/$JPp%\IZrV$!Yr:KpYf^eq2rUfmXrV$3ap\=[^ +qYJh@eb\_2q>C'eli)J8JcC<$JcFg2J,~> +JcC<$JcC<$JcD#8m/Hk[qY^!_qYL$`chR/.m/$JPp%\IZrV$!Yr:KpYf^eq2rUfmXrV$3ap\=[^ +qYJh@eb\_2q>C'eli)J8JcC<$JcFg2J,~> +JcC<$JcC<$JcD#8m/Hk[qY^!_qYL$`chR/.m/$JPp%\IZrV$!Yr:KpYf^eq2rUfmXrV$3ap\=[^ +qYJh@eb\_2q>C'eli)J8JcC<$JcFg2J,~> +JcC<$JcC<$JcCu7m/HhZqY^!_q>0m^gA(=9htm3FpA"R[r:]mXqt0aViq!! +JcC<$JcC<$JcCu7m/HhZqY^!_q>0m^gA(=9htm3FpA"R[r:]mXqt0aViq!! +JcC<$JcC<$JcCu7m/HhZqY^!_q>0m^gA(=9htm3FpA"R[r:]mXqt0aViq!! +JcC<$JcC<$JcCr6m/HhZqY]p]q>0d[k4nQDo(qnRpA4X]pA"R[rV#sXqt0XSn+-8Fqt0XUr:^*` +q"Xd_qte,*p%mbHq#'pclMcA7JcC<$JcFa0J,~> +JcC<$JcC<$JcCr6m/HhZqY]p]q>0d[k4nQDo(qnRpA4X]pA"R[rV#sXqt0XSn+-8Fqt0XUr:^*` +q"Xd_qte,*p%mbHq#'pclMcA7JcC<$JcFa0J,~> +JcC<$JcC<$JcCr6m/HhZqY]p]q>0d[k4nQDo(qnRpA4X]pA"R[rV#sXqt0XSn+-8Fqt0XUr:^*` +q"Xd_qte,*p%mbHq#'pclMcA7JcC<$JcFa0J,~> +JcC<$JcC<$JcCo5li-_YqY]m\p\NP +JcC<$JcC<$JcCo5li-_YqY]m\p\NP +JcC<$JcC<$JcCo5li-_YqY]m\p\NP +JcC<$JcC<$JcCl4li-\XqY]j[p%m_Eo(q,1!apA"R[r:]aTiUld8r:^*`p\=[^qtfgZl28Hr +pAF[`l2H86JcC<$JcFX-J,~> +JcC<$JcC<$JcCl4li-\XqY]j[p%m_Eo(q,1!apA"R[r:]aTiUld8r:^*`p\=[^qtfgZl28Hr +pAF[`l2H86JcC<$JcFX-J,~> +JcC<$JcC<$JcCl4li-\XqY]j[p%m_Eo(q,1!apA"R[r:]aTiUld8r:^*`p\=[^qtfgZl28Hr +pAF[`l2H86JcC<$JcFX-J,~> +JcC<$JcC<$JcCi3lMgSWq>B[XeG@SiqYL*bpA"R[qtBOPme$&BqtBs^p\=[^qtfm\i;CdqpAFX_ +kl-/5JcC<$JcFU,J,~> +JcC<$JcC<$JcCi3lMgSWq>B[XeG@SiqYL*bpA"R[qtBOPme$&BqtBs^p\=[^qtfm\i;CdqpAFX_ +kl-/5JcC<$JcFU,J,~> +JcC<$JcC<$JcCi3lMgSWq>B[XeG@SiqYL*bpA"R[qtBOPme$&BqtBs^p\=[^qtfm\i;CdqpAFX_ +kl-/5JcC<$JcFU,J,~> +JcC<$JcC<$JcCc1lMgVXq#'LUh>57jqYL*bpA"R[qY&G3qtBp]p\=[^r;-!]ebn%ro_eF]kPg&4 +JcC<$JcFR+J,~> +JcC<$JcC<$JcCc1lMgVXq#'LUh>57jqYL*bpA"R[qY&G3qtBp]p\=[^r;-!]ebn%ro_eF]kPg&4 +JcC<$JcFR+J,~> +JcC<$JcC<$JcCc1lMgVXq#'LUh>57jqYL*bpA"R[qY&G3qtBp]p\=[^r;-!]ebn%ro_eF]kPg&4 +JcC<$JcFR+J,~> +JcC<$JcC<$JcC`0l2LJVq#'=Pn+s]oqtg3cp%\FYq=`Y;qY'g\pA"R]qtfs^oDJ.Wk5=NAn,2hV +kPg&4JcC<$JcFL)J,~> +JcC<$JcC<$JcC`0l2LJVq#'=Pn+s]oqtg3cp%\FYq=`Y;qY'g\pA"R]qtfs^oDJ.Wk5=NAn,2hV +kPg&4JcC<$JcFL)J,~> +JcC<$JcC<$JcC`0l2LJVq#'=Pn+s]oqtg3cp%\FYq=`Y;qY'g\pA"R]qtfs^oDJ.Wk5=NAn,2hV +kPg&4JcC<$JcFL)J,~> +JcC<$JcC<$JcCZ.lMgPVq#%Z!m/6;KqYL*bp%\CXq"EqEq"FRYpA"R]qtfs^p\a%LaSbZ.jo0i2 +JcC<$JcFL)J,~> +JcC<$JcC<$JcCZ.lMgPVq#%Z!m/6;KqYL*bp%\CXq"EqEq"FRYpA"R]qtfs^p\a%LaSbZ.jo0i2 +JcC<$JcFL)J,~> +JcC<$JcC<$JcCZ.lMgPVq#%Z!m/6;KqYL*bp%\CXq"EqEq"FRYpA"R]qtfs^p\a%LaSbZ.jo0i2 +JcC<$JcFL)J,~> +JcC<$JcC<$JcCZ.kl1AUpADf)i;E*Aqtg3co_A4Ui:d!@p%\F[qtfs^q#&hDe,8e8jo0i2JcC<$ +JcF@%J,~> +JcC<$JcC<$JcCZ.kl1AUpADf)i;E*Aqtg3co_A4Ui:d!@p%\F[qtfs^q#&hDe,8e8jo0i2JcC<$ +JcF@%J,~> +JcC<$JcC<$JcCZ.kl1AUpADf)i;E*Aqtg3co_A4Ui:d!@p%\F[qtfs^q#&hDe,8e8jo0i2JcC<$ +JcF@%J,~> +JcC<$JcC<$JcCT,kl1;Sp&*)3fDP19qtg0bo_A.SlLsuHo_A=Zqtfs^q#&J:i;E'Bj8OW0JcC<$ +JcF@%J,~> +JcC<$JcC<$JcCT,kl1;Sp&*)3fDP19qtg0bo_A.SlLsuHo_A=Zqtfs^q#&J:i;E'Bj8OW0JcC<$ +JcF@%J,~> +JcC<$JcC<$JcCT,kl1;Sp&*)3fDP19qtg0bo_A.SlLsuHo_A=Zqtfs^q#&J:i;E'Bj8OW0JcC<$ +JcF@%J,~> +JcC<$JcC<$JcCQ+kPk2RoDI2:m/6GQoDJ.Uqtg0bnbD&:o(`+Xqtfp]q>Ba\pAX"KnGMVNiVnE. +JcC<$JcF:#J,~> +JcC<$JcC<$JcCQ+kPk2RoDI2:m/6GQoDJ.Uqtg0bnbD&:o(`+Xqtfp]q>Ba\pAX"KnGMVNiVnE. +JcC<$JcF:#J,~> +JcC<$JcC<$JcCQ+kPk2RoDI2:m/6GQoDJ.Uqtg0bnbD&:o(`+Xqtfp]q>Ba\pAX"KnGMVNiVnE. +JcC<$JcF:#J,~> +JcC<$JcC<$JcCK)kPk/QnbhACm/6&Fp&+CXqYL'amJ-,DmeHYSqtfp]q>Bm`kl/O!i;S<-JcC<$ +JcF4!J,~> +JcC<$JcC<$JcCK)kPk/QnbhACm/6&Fp&+CXqYL'amJ-,DmeHYSqtfp]q>Bm`kl/O!i;S<-JcC<$ +JcF4!J,~> +JcC<$JcC<$JcCK)kPk/QnbhACm/6&Fp&+CXqYL'amJ-,DmeHYSqtfp]q>Bm`kl/O!i;S<-JcC<$ +JcF4!J,~> +JcC<$JcC<$JcCH(k5OuNl2:DTjo!s5p\aRYqYL'ac1q/2qYKj]q#'jag]#Y"h#;m)JcC<$JcF0u +J,~> +JcC<$JcC<$JcCH(k5OuNl2:DTjo!s5p\aRYqYL'ac1q/2qYKj]q#'jag]#Y"h#;m)JcC<$JcF0u +J,~> +JcC<$JcC<$JcCH(k5OuNl2:DTjo!s5p\aRYqYL'ac1q/2qYKj]q#'jag]#Y"h#;m)JcC<$JcF0u +J,~> +JcC<$JcC<$JcCE'jSn`KdJVJlp\aUZq>0m^f(f(:qYKg\q>Bsbdf/,%f`$I%JcC<$JcF*sJ,~> +JcC<$JcC<$JcCE'jSn`KdJVJlp\aUZq>0m^f(f(:qYKg\q>Bsbdf/,%f`$I%JcC<$JcF*sJ,~> +JcC<$JcC<$JcCE'jSn`KdJVJlp\aUZq>0m^f(f(:qYKg\q>Bsbdf/,%f`$I%JcC<$JcF*sJ,~> +JcC<$JcC<$JcCB&j8SQHg\g=7nc&(Wq#'^[q>0j]hY?mAq>0^[q>C!c`W#B*e,FpuJcC<$JcF!p +J,~> +JcC<$JcC<$JcCB&j8SQHg\g=7nc&(Wq#'^[q>0j]hY?mAq>0^[q>C!c`W#B*e,FpuJcC<$JcF!p +J,~> +JcC<$JcC<$JcCB&j8SQHg\g=7nc&(Wq#'^[q>0j]hY?mAq>0^[q>C!c`W#B*e,FpuJcC<$JcF!p +J,~> +JcC<$JcC<$JcC?%i;Vs=o_dhLiVrNKq#'^[q"jUXmeHGMq>0[Zq>C!cL&QZ'JcC<$JcEpnJ,~> +JcC<$JcC<$JcC?%i;Vs=o_dhLiVrNKq#'^[q"jUXmeHGMq>0[Zq>C!cL&QZ'JcC<$JcEpnJ,~> +JcC<$JcC<$JcC?%i;Vs=o_dhLiVrNKq#'^[q"jUXmeHGMq>0[Zq>C!cL&QZ'JcC<$JcEpnJ,~> +JcC<$JcC<$JcC<$!<:sU`r4Zkp&4[`nb`(Wg\LU?o)&7\p\fgFJcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$!<:sU`r4Zkp&4[`nb`(Wg\LU?o)&7\p\fgFJcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$!<:sU`r4Zkp&4[`nb`(Wg\LU?o)&7\p\fgFJcC<$JcC<$ao?k~> +JcC<$JcC<$JcC<$rr:gRci)Amp&4[`n,)bRl1suJnGE%Zq#,mFJcC<$JcC<$a8^Y~> +JcC<$JcC<$JcC<$rr:gRci)Amp&4[`n,)bRl1suJnGE%Zq#,mFJcC<$JcC<$a8^Y~> +JcC<$JcC<$JcC<$rr:gRci)Amp&4[`n,)bRl1suJnGE%Zq#,mFJcC<$JcC<$a8^Y~> +JcC<$JcC<$JcC<$r;YCJi;LarpAOdamebT3n,)nXq#,mFJcC<$JcC<$`W(G~> +JcC<$JcC<$JcC<$r;YCJi;LarpAOdamebT3n,)nXq#,mFJcC<$JcC<$`W(G~> +JcC<$JcC<$JcC<$r;YCJi;LarpAOdamebT3n,)nXq#,mFJcC<$JcC<$`W(G~> +JcC<$JcC<$JcC<$qu=t@p&2N%pAOa`lMKW +JcC<$JcC<$JcC<$qu=t@p&2N%pAOa`lMKW +JcC<$JcC<$JcC<$qu=t@p&2N%pAOa`lMKW +JcC<$JcC<$JcC<$q#>pEr;QEgp\a.Mp%meIp\agbLAlc(JcC<$JcEIaJ,~> +JcC<$JcC<$JcC<$q#>pEr;QEgp\a.Mp%meIp\agbLAlc(JcC<$JcEIaJ,~> +JcC<$JcC<$JcC<$q#>pEr;QEgp\a.Mp%meIp\agbLAlc(JcC<$JcEIaJ,~> +JcC<$JcC<$JcC<$p]#gDqu6 +JcC<$JcC<$JcC<$p]#gDqu6 +JcC<$JcC<$JcC<$p]#gDqu6 +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/doc/img/evas_big.png b/doc/img/evas_big.png new file mode 100644 index 0000000000000000000000000000000000000000..cd818f75b1d6aac7b03797683c85c80eff6230da GIT binary patch literal 937116 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%0DQEkHvE@L3(L4 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
      _*~<6{7!bbm5Xn5?q%&Jo*u-pmZ2>&)4$h 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 WwX}bvINF z%%*P+#tsF#ttPsKDEuMkD1d$P1iqIlZMm3o0W;Oa{(9x^h#0&}oI~>hn7vkj36UBv zxMuCgv~!e#4Qgq)Q$Xh%6wIXltUX??=)6Xs*w0;l)7{cetU#cD;f|GrZG^;zH~cFFA{BD6VmVMTO`l`EwHJ9=QcfM}(`OhHerX^?F*a(U7PiYuxWY`WAVOqHJY`I*D&1Ma~dtLNp= zQReCd339vv)h0XwdDx7Hq*!~VtGO{`jzP27D;*Tq6ZhAe!XMq8nddSV#Xup~I^7DO z24wR2KO*|q;*p1Q^y@B&=reNi8g{5za#?ZCzNs(0s6DvLh{ zV`jP(=LAr#{`Q1~(~DyH>G$=Ull6zZv|v=LtOq3WPY`p*8&E4KFigH|Q54_JAqag{ zRfqB(GnBCDGj{3v78REVD0cQ|OQGd@kfMKCL;#0T(?XpV^G1*bEY;hAo5&}M#5;h>UzE6g$=j}qjX*E!7GWwaX=-$GLG`sE;G}*cg@V6 z!W5Xc)U6ey^TBGI&OL5uY)V{r$e!s)WSU?1)~_NCgAyQS^+S`Wpi-G}bF?gCbRg@t z%EE(p3bKaSX+rs+WkLfU)x&Z){KK{lM%@hGwf!n^|PaLswOQo6>b+ zQLJa#`spEXrpSA_>d9X!*97EPwH-*3$Rddhs2S~7i_PiU4O-hSRHIgYmHUCn#mygNF2*^Ihptsz>4=6uc)W)O;6npyv+tjGA& z@))rm2c2g;(&gDrsmw)NPPJ0uDb)H}JZ>|_$RIc;ty2dd6!b~Q&pTu6n@q(T>G_6t zg?{%9@q76=j`5Oj*`)t9dJvN|I6lWdm3KyYk)eFEhm6XuN*3vG-5MkgCd<3$??6|) ze!k%c>9kOx#Y0&u;=i_;)OjHR-KXV_^*`Ul-CBSmRkGzt@Po~MW?Ur}78k?dtj9qC z%&vYg19>WJU7k)qHD}o+#rJi*?9cr;SvFBIhz_kfYs7`a{uRs%l!VLa#a=kk$H%w_ zuRlD6UVfgZKUctP^?A4(vo0-nnNBRdb6~`V{g}BsL!N^Tihfl=C)=^EVt67yIiVdp z6#D%eKZmDr0(JCNQ9ahBZZybkG$P-fEI#k+y;E2*=g=1~qt6P&D{;N34KMu!dv7C1 ze@aWT{#B1J`pz4Rmgv|ZLy$qOWmnn%QfaN=s)cvx7bl+zr9WP$4^A$Nzr$5A*+OPi zb32{%Dn3+(yCnEeC?3kQ7S{3JsFH{liZjWcYajh7w}GVP2%;K6=V~$LjFV>IaszGk zKSj78B+5MR-Jr!=TGhYsG_H~HMn1akA}^xVgNf8Q^$?n8WPZ&i{^a)S0|ItbC#9wxszq6in2;#nKTm+UX1dN z8c7wDH2ICmPw^-T1Ue-@f+hU|YDixC@uF+Pp~_NJ#cc06T=k|9zE?C|>$}8V%x(R! zzLiF>`iB;us(jw?-~rCx9rNM?VndnIScOqC*ortDfarmPS|r(DFPSpuN*!HG5p{H; zE{e&bz+13>Zb@gu6rE0l-0)93tTF<&=D40JU| z(_ofct=;*%nB#BT7B{tj_UhESvQGUJl;qv)cS*oul=iEBG|;AKJ&!j`0V5}=(b?IA z4DJ!@ikSjj9Rjxg^Yw_xNf$9H`u()>oquF?H<1(NZ; z5ZlBa#zGKMd~0>d73Pl9a$VHl{jJ9bGz^Wr#Om^C-UFk8vd$9vx3CCmQV^{AZtTml zIXJvEI6ppW#!L>9f`E067-n{(ddd_v)X58e}F>v`BxcY$J z@I4e8*N=G51zw1%aBZ$a^vmIwDNV=g<^k#Nk1UT3#PY@SkFg@v%&Tfed$ksEE>Q&* z5rj4W>`-*xNv+%3tdlr(rD8C`%UO*1-53Hlfl8ma8jqr>-`v=Xaq&⩔KKJ!;*JE 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
    1. KsiwQGKpr$-BPUIsAKQ;X74K-#Y=?mVF1-qNSh+z$FpM_q}kX{X8$tg zF!m){5NT!`%#0K^B?1RUI~B@p>p7uF@X+Bf_8ewi6D_%%G_Uj8Ufx6q3b+1l+oamKjD=4|`8eqMxkKrMH$@E{?Eo@Mkdyu+RIq!zlyQ<}o%7X|iF-Vi zoxAJ0p>(X=>w{+{gXR|Fr$*q>hzv zck1VfVeTs6H~(mkL??n;jp~KZC^K)gMMI>;6eGXNIo0CpJum&{Xrn(Lcg7w+MAG9| zbL2*|S78j}p};};h#t@I*76IclOy@bZNKbObqy=u?n(OLNpFn+%$ii?JHXrJWXrE7 zRXA6`zOzHx%`871hT{fn3(?%wdMBd{GzO zU+o%A0DC!XnZ||gNx=tSpdoDwie|ZH${+NrEDQg6Py^v&DE}Or`iC)m_vQe#VVrHr z)b_FcK*DOiFmz9n?kCK+8L;In7iT<^v4dA2S_z+a!B5^oe9H?XP1mP_- zM`auo?btv%k0^$D^pODgxY5D}zB6o9@#klq$2w?yAH!#gkUl6CcmxU@_}W6ww9%t& z+L+sKzTwPT6s*s|(Vxx|RX3!& zK{a6jb|MDw8d3do(`Rnq{pjgYxqkxfcVjKpPsM9}%r8*&0 zsBgQ3D^KH+q1Z>uOjq}L6`jWcCyA?iGbWg=&WBSXliQ8VwOus~vPR4HX?n_q*k4$W+1 zX8}SB)J?5oxPIfupKr-|HK6PRBszdtzGH1AKcnTIq5c9s4Sv3A6qPXIBk$h7SdD$& z#-*Rnad5DA)-0b~sM0~CeykS@+B{tIuHuhTMZ;Nx7_i^NemWVFL@X;HLGyCSsF)B@ znjq?J_?;gTiph3_0y-|MLU}@iT50z-d7{UdolVf)92L5gB2A#F)faRM+k~DJzERA+ z@X|Eksv9-^Oy-)dY0i8?)6TfIyH8p4>rM6AucKnD;^Puxmq&3}R93?@QvM9{uqj9J>MZJKC!AtsER~w?tv;YR}0(&XaVs@j6kvQX`@5 zco^=&GtAOR!Oh&DUaBQ%xnvX z4mV4Ou(fN&U732I%f0(fg&{tQ)l?GfL)W~`^)Aw^oW>BNXMx0`3;GIsj#ifFc{gGMc8oAIVrngIwkx!-h+Mp6QZ>F_tz#lCsoJ3NjfbzI#f2#im)Zyihg7Q2>}@ocOu#?NkDQyxrTwL>ff

      gaQ3`g5N(Oz?2AKIAV$y(tayTv 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 z

      + * If the parameter (@p focus) is set, the passed object will be set as the + * currently focused object. It will receive all keyboard events that are not + * exclusive key grabs on other objects. + * + * @see evas_object_focus_get + * @see evas_focus_get + * @see evas_object_key_grab + * @see evas_object_key_ungrab + */ +EAPI void +evas_object_focus_set(Evas_Object *obj, Evas_Bool focus) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + + if (focus) + { + if (obj->focused) return; + if (obj->layer->evas->focused) + evas_object_focus_set(obj->layer->evas->focused, 0); + obj->focused = 1; + obj->layer->evas->focused = obj; + evas_object_event_callback_call(obj, EVAS_CALLBACK_FOCUS_IN, NULL); + } + else + { + if (!obj->focused) return; + obj->focused = 0; + obj->layer->evas->focused = NULL; + evas_object_event_callback_call(obj, EVAS_CALLBACK_FOCUS_OUT, NULL); + } +} + +/** + * Test if the object has focus. + * + * @param obj The object to be tested. + * + * If the passed object is the currently focused object 1 is returned, + * 0 otherwise. + * + * @see evas_object_focus_set + * @see evas_focus_get + * @see evas_object_key_grab + * @see evas_object_key_ungrab + * + * @return 1 if the object has the focus, 0 otherwise. + */ +EAPI Evas_Bool +evas_object_focus_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + return obj->focused; +} + +/** + * Retrieve the object that currently has focus. + * + * @param e The @c Evas canvas to query focus on. + * + * Returns the object that currently has focus, NULL otherwise. + * + * @see evas_object_focus_set + * @see evas_object_focus_get + * @see evas_object_key_grab + * @see evas_object_key_ungrab + * + * @return The object that has focus or NULL is there is not one. + */ +EAPI Evas_Object * +evas_focus_get(const Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + return e->focused; +} diff --git a/src/lib/canvas/evas_font_dir.c b/src/lib/canvas/evas_font_dir.c new file mode 100644 index 0000000..a46b4d6 --- /dev/null +++ b/src/lib/canvas/evas_font_dir.c @@ -0,0 +1,787 @@ +#include "evas_common.h" +#include "evas_private.h" +#ifdef BUILD_FONT_LOADER_EET +#include +#endif +#ifdef HAVE_FONTCONFIG +#include +#endif + +/* font dir cache */ +static Evas_Hash *font_dirs = NULL; +static Evas_List *fonts_cache = NULL; +static Evas_List *fonts_zero = NULL; + +typedef struct _Fndat Fndat; + +struct _Fndat +{ + const char *name; + const char *source; + int size; + void *font; + int ref; +}; + +/* private methods for font dir cache */ +static Evas_Bool font_cache_dir_free(const Evas_Hash *hash, const char *key, void *data, void *fdata); +static Evas_Font_Dir *object_text_font_cache_dir_update(char *dir, Evas_Font_Dir *fd); +static Evas_Font *object_text_font_cache_font_find_x(Evas_Font_Dir *fd, char *font); +static Evas_Font *object_text_font_cache_font_find_file(Evas_Font_Dir *fd, char *font); +static Evas_Font *object_text_font_cache_font_find_alias(Evas_Font_Dir *fd, char *font); +static Evas_Font *object_text_font_cache_font_find(Evas_Font_Dir *fd, char *font); +static Evas_Font_Dir *object_text_font_cache_dir_add(char *dir); +static void object_text_font_cache_dir_del(char *dir, Evas_Font_Dir *fd); +static int evas_object_text_font_string_parse(char *buffer, char dest[14][256]); + +void +evas_font_dir_cache_free(void) +{ + if (!font_dirs) return; + + evas_hash_foreach(font_dirs, font_cache_dir_free, NULL); + evas_hash_free(font_dirs); + font_dirs = NULL; +} + +const char * +evas_font_dir_cache_find(char *dir, char *font) +{ + Evas_Font_Dir *fd; + + fd = evas_hash_find(font_dirs, dir); + fd = object_text_font_cache_dir_update(dir, fd); + if (fd) + { + Evas_Font *fn; + + fn = object_text_font_cache_font_find(fd, font); + if (fn) + { + return fn->path; + } + } + return NULL; +} + +static Evas_List * +evas_font_set_get(const char *name) +{ + Evas_List *fonts = NULL; + char *p; + + p = strchr(name, ','); + if (!p) + { + fonts = evas_list_append(fonts, evas_stringshare_add(name)); + } + else + { + const char *pp; + char *nm; + + pp = name; + while (p) + { + nm = alloca(p - pp + 1); + strncpy(nm, pp, p - pp); + nm[p - pp] = 0; + fonts = evas_list_append(fonts, evas_stringshare_add(nm)); + pp = p + 1; + p = strchr(pp, ','); + if (!p) fonts = evas_list_append(fonts, evas_stringshare_add(pp)); + } + } + return fonts; +} + +void +evas_font_free(Evas *evas, void *font) +{ + Evas_List *l; + + for (l = fonts_cache; l; l = l->next) + { + Fndat *fd; + + fd = l->data; + if (fd->font == font) + { + fd->ref--; + if (fd->ref == 0) + { + fonts_cache = evas_list_remove_list(fonts_cache, l); + fonts_zero = evas_list_append(fonts_zero, fd); + } + break; + } + } + while ((fonts_zero) && + (evas_list_count(fonts_zero) > 4)) /* 4 is arbitrary */ + { + Fndat *fd; + + fd = evas_list_data(fonts_zero); + if (fd->ref != 0) break; + fonts_zero = evas_list_remove_list(fonts_zero, fonts_zero); + if (fd->name) evas_stringshare_del(fd->name); + if (fd->source) evas_stringshare_del(fd->source); + evas->engine.func->font_free(evas->engine.data.output, fd->font); + free(fd); + } +} + +void * +evas_font_load(Evas *evas, const char *name, const char *source, int size) +{ + void *font = NULL; + Evas_List *fonts, *l; + Fndat *fd; + + if (!name) return NULL; + if (name[0] == 0) return NULL; + + for (l = fonts_cache; l; l = l->next) + { + fd = l->data; + if (!strcmp(name, fd->name)) + { + if (((!source) && (!fd->source)) || + ((source) && (fd->source) && (!strcmp(source, fd->source)))) + { + if (size == fd->size) + { + fonts_cache = evas_list_promote_list(fonts_cache, l); + fd->ref++; + return fd->font; + } + } + } + } + + for (l = fonts_zero; l; l = l->next) + { + fd = l->data; + if (!strcmp(name, fd->name)) + { + if (((!source) && (!fd->source)) || + ((source) && (fd->source) && (!strcmp(source, fd->source)))) + { + if (size == fd->size) + { + fonts_zero = evas_list_remove_list(fonts_zero, l); + fonts_cache = evas_list_prepend(fonts_cache, fd); + fd->ref++; + return fd->font; + } + } + } + } + fonts = evas_font_set_get(name); + for (l = fonts; l; l = l->next) /* Load each font in append */ + { + char *nm; + + nm = l->data; + if ((l == fonts) || (!font)) /* First iteration OR no font */ + { +#ifdef BUILD_FONT_LOADER_EET + if (source) /* Load Font from "eet" source */ + { + Eet_File *ef; + char *fake_name; + + fake_name = evas_file_path_join(source, nm); + if (fake_name) + { + font = evas->engine.func->font_load(evas->engine.data.output, fake_name, size); + if (!font) /* Load from fake name failed, probably not cached */ + { + /* read original!!! */ + ef = eet_open(source, EET_FILE_MODE_READ); + if (ef) + { + void *fdata; + int fsize = 0; + + fdata = eet_read(ef, nm, &fsize); + if ((fdata) && (fsize > 0)) + { + font = evas->engine.func->font_memory_load(evas->engine.data.output, fake_name, size, fdata, fsize); + free(fdata); + } + eet_close(ef); + } + } + free(fake_name); + } + } + if (!font) /* Source load failed */ + { +#endif + if (evas_file_path_is_full_path((char *)nm)) /* Try filename */ + font = evas->engine.func->font_load(evas->engine.data.output, (char *)nm, size); + else /* search font path */ + { + Evas_List *l; + + for (l = evas->font_path; l; l = l->next) + { + const char *f_file; + + f_file = evas_font_dir_cache_find(l->data, (char *)nm); + if (f_file) + { + font = evas->engine.func->font_load(evas->engine.data.output, f_file, size); + if (font) break; + } + } + } +#ifdef BUILD_FONT_LOADER_EET + } +#endif + } + else /* Base font loaded, append others */ + { +#ifdef BUILD_FONT_LOADER_EET + void *ok = NULL; + + if (source) + { + Eet_File *ef; + char *fake_name; + + fake_name = evas_file_path_join(source, nm); + if (fake_name) + { + /* FIXME: make an engine func */ + if (!evas->engine.func->font_add(evas->engine.data.output, font, fake_name, size)) + { + /* read original!!! */ + ef = eet_open(source, EET_FILE_MODE_READ); + if (ef) + { + void *fdata; + int fsize = 0; + + fdata = eet_read(ef, nm, &fsize); + if ((fdata) && (fsize > 0)) + { + ok = evas->engine.func->font_memory_add(evas->engine.data.output, font, fake_name, size, fdata, fsize); + free(fdata); + } + eet_close(ef); + } + } + else + ok = (void *)1; + free(fake_name); + } + } + if (!ok) + { +#endif + if (evas_file_path_is_full_path((char *)nm)) + evas->engine.func->font_add(evas->engine.data.output, font, (char *)nm, size); + else + { + Evas_List *l; + + for (l = evas->font_path; l; l = l->next) + { + const char *f_file; + + f_file = evas_font_dir_cache_find(l->data, (char *)nm); + if (f_file) + { + if (evas->engine.func->font_add(evas->engine.data.output, font, f_file, size)) + break; + } + } + } +#ifdef BUILD_FONT_LOADER_EET + } +#endif + } + evas_stringshare_del(nm); + } + evas_list_free(fonts); + +#ifdef HAVE_FONTCONFIG + + if (!font) /* Search using fontconfig */ + { + FcPattern *p_nm = NULL; + FcFontSet *set; + FcResult res; + int i; + + p_nm = FcNameParse((FcChar8 *)name); + FcConfigSubstitute(NULL, p_nm, FcMatchPattern); + FcDefaultSubstitute(p_nm); + + /* do matching */ + set = FcFontSort(NULL, p_nm, FcTrue, NULL, &res); + + /* Do loading for all in family */ + for (i = 0; i < set->nfont; i++) + { + FcValue filename; + + FcPatternGet(set->fonts[i], FC_FILE, 0, &filename); + + if (font) + evas->engine.func->font_add(evas->engine.data.output, font, (char *)filename.u.s, size); + else + font = evas->engine.func->font_load(evas->engine.data.output, (char *)filename.u.s, size); + } + + FcFontSetDestroy(set); + FcPatternDestroy(p_nm); + } +#endif + + fd = calloc(1, sizeof(Fndat)); + if (fd) + { + fd->name = evas_stringshare_add(name); + if (source) fd->source = evas_stringshare_add(source); + fd->size = size; + fd->font = font; + fd->ref = 1; + fonts_cache = evas_list_prepend(fonts_cache, fd); + } + + if (font) + evas->engine.func->font_hinting_set(evas->engine.data.output, font, + evas->hinting); + return font; +} + +void +evas_font_load_hinting_set(Evas *evas, void *font, int hinting) +{ + evas->engine.func->font_hinting_set(evas->engine.data.output, font, + hinting); +} + +Evas_List * +evas_font_dir_available_list(const Evas *evas) +{ + Evas_List *l; + Evas_List *ll; + Evas_List *available = NULL; + +#ifdef HAVE_FONTCONFIG + /* Add font config fonts */ + FcPattern *p; + FcFontSet *set = NULL; + FcObjectSet *os; + int i; + + p = FcPatternCreate(); + os = FcObjectSetBuild(FC_FAMILY, FC_STYLE, NULL); + + if (p && os) set = FcFontList(NULL, p, os); + + if (p) FcPatternDestroy(p); + if (os) FcObjectSetDestroy(os); + + if (set) + { + for (i = 0; i < set->nfont; i++) + { + char *font; + + font = (char *)FcNameUnparse(set->fonts[i]); + available = evas_list_append(available, evas_stringshare_add(font)); + free(font); + } + + FcFontSetDestroy(set); + } +#endif + + /* Add fonts in evas font_path*/ + if (!evas->font_path) + return available; + + for (l = evas->font_path; l; l = l->next) + { + Evas_Font_Dir *fd; + + fd = evas_hash_find(font_dirs, (char *)l->data); + fd = object_text_font_cache_dir_update((char *)l->data, fd); + if (fd && fd->aliases) + { + for (ll = fd->aliases; ll; ll = ll->next) + { + Evas_Font_Alias *fa; + + fa = ll->data; + available = evas_list_append(available, evas_stringshare_add((char *)fa->alias)); + } + } + } + + return available; +} + +void +evas_font_dir_available_list_free(Evas_List *available) +{ + while (available) + { + evas_stringshare_del(available->data); + available = evas_list_remove(available, available->data); + } +} + +/* private stuff */ +static Evas_Bool +font_cache_dir_free(const Evas_Hash *hash, const char *key, void *data, void *fdata) +{ + object_text_font_cache_dir_del((char *) key, data); + return 1; +} + +static Evas_Font_Dir * +object_text_font_cache_dir_update(char *dir, Evas_Font_Dir *fd) +{ + DATA64 mt; + char *tmp; + + if (fd) + { + mt = evas_file_modified_time(dir); + if (mt != fd->dir_mod_time) + { + object_text_font_cache_dir_del(dir, fd); + font_dirs = evas_hash_del(font_dirs, dir, fd); + } + else + { + tmp = evas_file_path_join(dir, "fonts.dir"); + if (tmp) + { + mt = evas_file_modified_time(tmp); + free(tmp); + if (mt != fd->fonts_dir_mod_time) + { + object_text_font_cache_dir_del(dir, fd); + font_dirs = evas_hash_del(font_dirs, dir, fd); + } + else + { + tmp = evas_file_path_join(dir, "fonts.alias"); + if (tmp) + { + mt = evas_file_modified_time(tmp); + free(tmp); + } + if (mt != fd->fonts_alias_mod_time) + { + object_text_font_cache_dir_del(dir, fd); + font_dirs = evas_hash_del(font_dirs, dir, fd); + } + else + return fd; + } + } + } + } + return object_text_font_cache_dir_add(dir); +} + +static Evas_Font * +object_text_font_cache_font_find_x(Evas_Font_Dir *fd, char *font) +{ + Evas_List *l; + char font_prop[14][256]; + int num; + + num = evas_object_text_font_string_parse(font, font_prop); + if (num != 14) return NULL; + for (l = fd->fonts; l; l = l->next) + { + Evas_Font *fn; + + fn = l->data; + if (fn->type == 1) + { + int i; + int match = 0; + + for (i = 0; i < 14; i++) + { + if ((font_prop[i][0] == '*') && (font_prop[i][1] == 0)) + match++; + else + { + if (!strcasecmp(font_prop[i], fn->x.prop[i])) match++; + else break; + } + } + if (match == 14) return fn; + } + } + return NULL; +} + +static Evas_Font * +object_text_font_cache_font_find_file(Evas_Font_Dir *fd, char *font) +{ + Evas_List *l; + + for (l = fd->fonts; l; l = l->next) + { + Evas_Font *fn; + + fn = l->data; + if (fn->type == 0) + { + if (!strcasecmp(font, fn->simple.name)) return fn; + } + } + return NULL; +} + +static Evas_Font * +object_text_font_cache_font_find_alias(Evas_Font_Dir *fd, char *font) +{ + Evas_List *l; + + for (l = fd->aliases; l; l = l->next) + { + Evas_Font_Alias *fa; + + fa = l->data; + if (!strcasecmp(fa->alias, font)) return fa->fn; + } + return NULL; +} + +static Evas_Font * +object_text_font_cache_font_find(Evas_Font_Dir *fd, char *font) +{ + Evas_Font *fn; + + fn = evas_hash_find(fd->lookup, font); + if (fn) return fn; + fn = object_text_font_cache_font_find_alias(fd, font); + if (!fn) fn = object_text_font_cache_font_find_x(fd, font); + if (!fn) fn = object_text_font_cache_font_find_file(fd, font); + if (!fn) return NULL; + fd->lookup = evas_hash_add(fd->lookup, font, fn); + return fn; +} + +static Evas_Font_Dir * +object_text_font_cache_dir_add(char *dir) +{ + Evas_Font_Dir *fd; + char *tmp, *tmp2; + Evas_List *fdir; + + fd = calloc(1, sizeof(Evas_Font_Dir)); + if (!fd) return NULL; + font_dirs = evas_hash_add(font_dirs, dir, fd); + + /* READ fonts.alias, fonts.dir and directory listing */ + + /* fonts.dir */ + tmp = evas_file_path_join(dir, "fonts.dir"); + if (tmp) + { + FILE *f; + + f = fopen(tmp, "r"); + if (f) + { + int num; + char fname[4096], fdef[4096]; + + if (fscanf(f, "%i\n", &num) != 1) goto cant_read; + /* read font lines */ + while (fscanf(f, "%4090s %[^\n]\n", fname, fdef) == 2) + { + char font_prop[14][256]; + int i; + + /* skip comments */ + if ((fdef[0] == '!') || (fdef[0] == '#')) continue; + /* parse font def */ + num = evas_object_text_font_string_parse((char *)fdef, font_prop); + if (num == 14) + { + Evas_Font *fn; + + fn = calloc(1, sizeof(Evas_Font)); + if (fn) + { + fn->type = 1; + for (i = 0; i < 14; i++) + fn->x.prop[i] = evas_stringshare_add(font_prop[i]); + tmp2 = evas_file_path_join(dir, fname); + if (tmp2) + { + fn->path = evas_stringshare_add(tmp2); + free(tmp2); + } + fd->fonts = evas_list_append(fd->fonts, fn); + } + } + } + cant_read: ; + fclose(f); + } + free(tmp); + } + + /* directoy listing */ + fdir = evas_file_path_list(dir, "*.ttf", 0); + while (fdir) + { + tmp = evas_file_path_join(dir, fdir->data); + if (tmp) + { + Evas_Font *fn; + + fn = calloc(1, sizeof(Evas_Font)); + if (fn) + { + char *p; + + fn->type = 0; + tmp2 = alloca(strlen(fdir->data) + 1); + strcpy(tmp2, fdir->data); + p = strrchr(tmp2, '.'); + if (p) *p = 0; + fn->simple.name = evas_stringshare_add(tmp2); + tmp2 = evas_file_path_join(dir, fdir->data); + if (tmp2) + { + fn->path = evas_stringshare_add(tmp2); + free(tmp2); + } + fd->fonts = evas_list_append(fd->fonts, fn); + } + free(tmp); + } + free(fdir->data); + fdir = evas_list_remove(fdir, fdir->data); + } + + /* fonts.alias */ + tmp = evas_file_path_join(dir, "fonts.alias"); + if (tmp) + { + FILE *f; + + f = fopen(tmp, "r"); + if (f) + { + char fname[4096], fdef[4096]; + + /* read font alias lines */ + while (fscanf(f, "%4090s %[^\n]\n", fname, fdef) == 2) + { + Evas_Font_Alias *fa; + + /* skip comments */ + if ((fname[0] == '!') || (fname[0] == '#')) continue; + fa = calloc(1, sizeof(Evas_Font_Alias)); + if (fa) + { + fa->alias = evas_stringshare_add(fname); + fa->fn = object_text_font_cache_font_find_x(fd, fdef); + if ((!fa->alias) || (!fa->fn)) + { + if (fa->alias) evas_stringshare_del(fa->alias); + free(fa); + } + else + fd->aliases = evas_list_append(fd->aliases, fa); + } + } + fclose(f); + } + free(tmp); + } + + fd->dir_mod_time = evas_file_modified_time(dir); + tmp = evas_file_path_join(dir, "fonts.dir"); + if (tmp) + { + fd->fonts_dir_mod_time = evas_file_modified_time(tmp); + free(tmp); + } + tmp = evas_file_path_join(dir, "fonts.alias"); + if (tmp) + { + fd->fonts_alias_mod_time = evas_file_modified_time(tmp); + free(tmp); + } + + return fd; +} + +static void +object_text_font_cache_dir_del(char *dir, Evas_Font_Dir *fd) +{ + if (fd->lookup) evas_hash_free(fd->lookup); + while (fd->fonts) + { + Evas_Font *fn; + int i; + + fn = fd->fonts->data; + fd->fonts = evas_list_remove(fd->fonts, fn); + for (i = 0; i < 14; i++) + { + if (fn->x.prop[i]) evas_stringshare_del(fn->x.prop[i]); + } + if (fn->simple.name) evas_stringshare_del(fn->simple.name); + if (fn->path) evas_stringshare_del(fn->path); + free(fn); + } + while (fd->aliases) + { + Evas_Font_Alias *fa; + + fa = fd->aliases->data; + fd->aliases = evas_list_remove(fd->aliases, fa); + if (fa->alias) evas_stringshare_del(fa->alias); + free(fa); + } + free(fd); +} + +static int +evas_object_text_font_string_parse(char *buffer, char dest[14][256]) +{ + char *p; + int n, m, i; + + n = 0; + m = 0; + p = buffer; + if (p[0] != '-') return 0; + i = 1; + while (p[i]) + { + dest[n][m] = p[i]; + if ((p[i] == '-') || (m == 256)) + { + dest[n][m] = 0; + n++; + m = -1; + } + i++; + m++; + if (n == 14) return n; + } + dest[n][m] = 0; + n++; + return n; +} diff --git a/src/lib/canvas/evas_key.c b/src/lib/canvas/evas_key.c new file mode 100644 index 0000000..289a3f4 --- /dev/null +++ b/src/lib/canvas/evas_key.c @@ -0,0 +1,418 @@ +#include "evas_common.h" +#include "evas_private.h" + +/* private calls */ + +static int +evas_key_modifier_number(const Evas_Modifier *m, const char *keyname) +{ + int i; + + for (i = 0; i < m->mod.count; i++) + { + if (!strcmp(m->mod.list[i], keyname)) return i; + } + return -1; +} + +static int +evas_key_lock_number(const Evas_Lock *l, const char *keyname) +{ + int i; + + for (i = 0; i < l->lock.count; i++) + { + if (!strcmp(l->lock.list[i], keyname)) return i; + } + return -1; +} + +/* local calls */ + +/* public calls */ + +/** + * Returns a handle to the modifiers available in the system. This is required to check + * for modifiers with the evas_key_modifier_is_set_get function. + * + * + * @see evas_key_modifier_add + * @see evas_key_modifier_del + * @see evas_key_modifier_on + * @see evas_key_modifier_off + * @see evas_key_modifier_is_set_get + * + * @param e The pointer to the Evas Canvas + * + * @return An Evas_Modifier handle to query the modifier subsystem with + * evas_key_modifier_is_set_get, or NULL on error. + */ +EAPI const Evas_Modifier * +evas_key_modifier_get(const Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + return &(e->modifiers); +} + +/** + * Returns a handle to the locks available in the system. This is required to check for + * locks with the evas_key_lock_is_set_get function. + * + * @see evas_key_lock_add + * @see evas_key_lock_del + * @see evas_key_lock_on + * @see evas_key_lock_off + * + * @see evas_key_lock_is_set_get + * @param e The pointer to the Evas Canvas + * + * @return An Evas_Lock handle to query the lock subsystem with + * evas_key_lock_is_set_get, or NULL on error. + */ +EAPI const Evas_Lock * +evas_key_lock_get(const Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + return &(e->locks); +} + +/** + * Checks the state of a given modifier. If the modifier is set, such as shift being pressed + * this function returns true. + * + * @see evas_key_modifier_add + * @see evas_key_modifier_del + * @see evas_key_modifier_get + * @see evas_key_modifier_on + * @see evas_key_modifier_off + * + * @param m The current modifier set as returned by evas_key_modifier_get. + * @param keyname The name of the key to check its status. + * + * @return 1 if the @p keyname is on, 0 otherwise. + */ +EAPI Evas_Bool +evas_key_modifier_is_set(const Evas_Modifier *m, const char *keyname) +{ + Evas_Modifier_Mask num; + int n; + + if (!m) return 0; + if (!keyname) return 0; + n = evas_key_modifier_number(m, keyname); + if (n < 0) return 0; + num = (Evas_Modifier_Mask)n; + num = 1 << num; + if (m->mask & num) return 1; + return 0; +} + +/** + * Checks the state of a given lock. If the lock is set, such as caps lock, this function + * returns true. + * + * @see evas_key_lock_get + * @see evas_key_lock_add + * @see evas_key_lock_del + * @see evas_key_lock_on + * @see evas_key_lock_off + * + * @param l The current lock set as returned by evas_key_lock_get. + * @param keyname The name of the lock to add the the list. + * + * @param 1 if the @p keyname kock is set, 0 otherwise. + */ +EAPI Evas_Bool +evas_key_lock_is_set(const Evas_Lock *l, const char *keyname) +{ + Evas_Modifier_Mask num; + int n; + + if (!l) return 0; + if (!keyname) return 0; + n = evas_key_lock_number(l, keyname); + if (n < 0) return 0; + num = (Evas_Modifier_Mask)n; + num = 1 << num; + if (l->mask & num) return 1; + return 0; +} + +/** + * Adds the @p keyname to the current list of modifiers. + * + * Modifiers can be keys like shift, alt and ctrl, as well as user defined. This allows + * custom modifiers to be added to the evas system as run time. It is then possible to set + * and unset the modifier for other parts of the program to check and act on. + * + * @see evas_key_modifier_del + * @see evas_key_modifier_get + * @see evas_key_modifier_on + * @see evas_key_modifier_off + * @see evas_key_modifier_is_set_get + * + * @param e The pointer to the Evas Canvas + * @param keyname The name of the modifier to add to the list. + */ +EAPI void +evas_key_modifier_add(Evas *e, const char *keyname) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + if (!keyname) return; + if (e->modifiers.mod.count >= 64) return; + evas_key_modifier_del(e, keyname); + e->modifiers.mod.count++; + e->modifiers.mod.list = realloc(e->modifiers.mod.list, e->modifiers.mod.count * sizeof(char *)); + e->modifiers.mod.list[e->modifiers.mod.count - 1] = strdup(keyname); + e->modifiers.mask = 0; +} + +/** + * Removes the @p keyname from the current list of modifiers. + * + * @see evas_key_modifier_add + * @see evas_key_modifier_get + * @see evas_key_modifier_on + * @see evas_key_modifier_off + * @see evas_key_modifier_is_set_get + * + * @param e The pointer to the Evas Canvas + * @param keyname The name of the key to remove from the modifiers list. + */ +EAPI void +evas_key_modifier_del(Evas *e, const char *keyname) +{ + int i; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + if (!keyname) return; + for (i = 0; i < e->modifiers.mod.count; i++) + { + if (!strcmp(e->modifiers.mod.list[i], keyname)) + { + int j; + + free(e->modifiers.mod.list[i]); + e->modifiers.mod.count--; + for (j = i; j < e->modifiers.mod.count; j++) + e->modifiers.mod.list[j] = e->modifiers.mod.list[j + 1]; + e->modifiers.mask = 0; + return; + } + } +} + +/** + * Adds the @p keyname to the current list of locks. + * + * Locks can be keys like caps lock, num lock or scroll lock, as well as user defined. This + * allows custom locks to be added to the evas system at run time. It is then possible to + * set and unset the lock for other parts of the program to check and act on. + * + * @see evas_key_lock_get + * @see evas_key_lock_del + * @see evas_key_lock_on + * @see evas_key_lock_off + * + * @param e The pointer to the Evas Canvas + * @param keyname The name of the key to remove from the modifier list. + */ +EAPI void +evas_key_lock_add(Evas *e, const char *keyname) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + if (!keyname) return; + if (e->locks.lock.count >= 64) return; + evas_key_lock_del(e, keyname); + e->locks.lock.count++; + e->locks.lock.list = realloc(e->locks.lock.list, e->locks.lock.count * sizeof(char *)); + e->locks.lock.list[e->locks.lock.count - 1] = strdup(keyname); + e->locks.mask = 0; +} + +/** + * Removes The @p keyname from the current list of locks. + * + * @see evas_key_lock_get + * @see evas_key_lock_add + * @see evas_key_lock_on + * @see evas_key_lock_off + * + * @param e The pointer to the Evas Canvas + * @param keyname The name of the key to remove from the lock list. + */ +EAPI void +evas_key_lock_del(Evas *e, const char *keyname) +{ + int i; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + if (!keyname) return; + e->locks.mask = 0; + for (i = 0; i < e->locks.lock.count; i++) + { + if (!strcmp(e->locks.lock.list[i], keyname)) + { + int j; + + free(e->locks.lock.list[i]); + e->locks.lock.count--; + for (j = i; j < e->locks.lock.count; j++) + e->locks.lock.list[j] = e->locks.lock.list[j + 1]; + e->locks.mask = 0; + return; + } + } +} + +/** + * Enables or turns on the modifier with name @p keyname. + * + * @see evas_key_modifier_add + * @see evas_key_modifier_get + * @see evas_key_modifier_off + * @see evas_key_modifier_is_set_get + * + * @param e The pointer to the Evas Canvas + * @param keyname The name of the modifier to set. + */ +EAPI void +evas_key_modifier_on(Evas *e, const char *keyname) +{ + Evas_Modifier_Mask num; + int n; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + n = (Evas_Modifier_Mask)evas_key_modifier_number(&(e->modifiers), keyname); + if (n < 0) return; + num = (Evas_Modifier_Mask)n; + num = 1 << num; + e->modifiers.mask |= num; +} + +/** + * Disables or turns off the modifier with name @p keyname. + * + * @see evas_key_modifier_add + * @see evas_key_modifier_get + * @see evas_key_modifier_on + * @see evas_key_modifier_is_set_get + * + * @param e The pointer to the Evas Canvas + * @param keyname The name of the modifier to un-set. + */ +EAPI void +evas_key_modifier_off(Evas *e, const char *keyname) +{ + Evas_Modifier_Mask num; + int n; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + n = evas_key_modifier_number(&(e->modifiers), keyname); + if (n < 0) return; + num = (Evas_Modifier_Mask)n; + num = 1 << num; + e->modifiers.mask &= ~num; +} + +/** + * Enables or turns on the lock with name @p keyname. + * + * @see evas_key_lock_get + * @see evas_key_lock_add + * @see evas_key_lock_del + * @see evas_key_lock_off + * + * @param e The pointer to the Evas Canvas + * @param keyname The name of the lock to set. + */ +EAPI void +evas_key_lock_on(Evas *e, const char *keyname) +{ + Evas_Modifier_Mask num; + int n; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + n = evas_key_lock_number(&(e->locks), keyname); + if (n < 0) return; + num = (Evas_Modifier_Mask)n; + num = 1 << num; + e->locks.mask |= num; +} + +/** + * Disables or turns off the lock with name @p keyname. + * + * @see evas_key_lock_get + * @see evas_key_lock_add + * @see evas_key_lock_del + * @see evas_key_lock_on + * + * @param e The pointer to the Evas Canvas + * @param keyname The name of the lock to un-set. + */ +EAPI void +evas_key_lock_off(Evas *e, const char *keyname) +{ + Evas_Modifier_Mask num; + int n; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + n = evas_key_lock_number(&(e->locks), keyname); + if (n < 0) return; + num = (Evas_Modifier_Mask)n; + num = 1 << num; + e->locks.mask &= ~num; +} + +/* errr need to add key grabbing/ungrabbing calls - missing modifier stuff. */ + +/** + * Creates a bit mask from the @p keyname for use with events to check for the presence + * of the @p keyname modifier. + * + * @see evas_key_modifier_add + * @see evas_key_modifier_get + * @see evas_key_modifier_on + * @see evas_key_modifier_off + * @see evas_key_modifier_is_set_get + * + * @param keyname The name of the modifier to create the mask for. + * + * @returns the bit mask or 0 if the @p keyname wasn't registered as a modifier. + */ +EAPI Evas_Modifier_Mask +evas_key_modifier_mask_get(const Evas *e, const char *keyname) +{ + Evas_Modifier_Mask num; + int n; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return 0; + MAGIC_CHECK_END(); + if (!keyname) return 0; + n = evas_key_modifier_number(&(e->modifiers), keyname); + if (n < 0) return 0; + num = (Evas_Modifier_Mask)n; + return 1 << num; +} diff --git a/src/lib/canvas/evas_key_grab.c b/src/lib/canvas/evas_key_grab.c new file mode 100644 index 0000000..ce227c2 --- /dev/null +++ b/src/lib/canvas/evas_key_grab.c @@ -0,0 +1,238 @@ +#include "evas_common.h" +#include "evas_private.h" + +/* private calls */ + +/* FIXME: this is not optimal, but works. i should have a hash of keys per */ +/* Evas and then a linked lists of grabs for that key and what */ +/* modifiers/not_modifers they use */ + +static Evas_Key_Grab *evas_key_grab_new (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive); +static Evas_Key_Grab *evas_key_grab_find (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive); + +static Evas_Key_Grab * +evas_key_grab_new(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive) +{ + /* MEM OK */ + Evas_Key_Grab *g; + + g = evas_mem_calloc(sizeof(Evas_Key_Grab)); + if (!g) return NULL; + g->object = obj; + g->modifiers = modifiers; + g->not_modifiers = not_modifiers; + g->exclusive = exclusive; + g->keyname = strdup(keyname); + if (obj->layer->evas->walking_grabs) + g->just_added = 1; + if (!g->keyname) + { + if (!evas_mem_free(strlen(keyname) + 1)) + { + free(g); + return NULL; + } + g->keyname = strdup(keyname); + if (!g->keyname) + { + free(g); + return NULL; + } + } + g->object->grabs = evas_list_append(g->object->grabs, g); + if (evas_list_alloc_error()) + { + MERR_BAD(); + evas_mem_free(sizeof(Evas_List)); + g->object->grabs = evas_list_append(g->object->grabs, g); + if (evas_list_alloc_error()) + { + MERR_FATAL(); + free(g); + free(g->keyname); + return NULL; + } + } + obj->layer->evas->grabs = evas_list_append(obj->layer->evas->grabs, g); + if (evas_list_alloc_error()) + { + MERR_BAD(); + evas_mem_free(sizeof(Evas_List)); + obj->layer->evas->grabs = evas_list_append(obj->layer->evas->grabs, g); + if (evas_list_alloc_error()) + { + MERR_FATAL(); + g->object->grabs = evas_list_remove(g->object->grabs, g); + free(g); + free(g->keyname); + return NULL; + } + } + return g; +} + +static Evas_Key_Grab * +evas_key_grab_find(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, int exclusive) +{ + /* MEM OK */ + Evas_List *l; + + for (l = obj->layer->evas->grabs; l; l = l->next) + { + Evas_Key_Grab *g; + + g = l->data; + if ((g->modifiers == modifiers) && + (g->not_modifiers == not_modifiers) && + (!strcmp(g->keyname, keyname))) + { + if ((exclusive) || (obj == g->object)) return g; + } + } + return NULL; +} + +/* local calls */ + +void +evas_object_grabs_cleanup(Evas_Object *obj) +{ + if (obj->layer->evas->walking_grabs) + { + Evas_List *l; + + for (l = obj->grabs; l; l = l->next) + { + Evas_Key_Grab *g; + + g = l->data; + g->delete_me = 1; + } + } + else + { + while (obj->grabs) + { + Evas_Key_Grab *g; + + g = obj->grabs->data; + if (g->keyname) free(g->keyname); + free(g); + obj->layer->evas->grabs = evas_list_remove(obj->layer->evas->grabs, g); + obj->grabs = evas_list_remove(obj->grabs, g); + } + } +} + +void +evas_key_grab_free(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers) +{ + /* MEM OK */ + Evas_Key_Grab *g; + + g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers, 0); + if (!g) return; + g->object->grabs = evas_list_remove(g->object->grabs, g); + obj->layer->evas->grabs = evas_list_remove(obj->layer->evas->grabs, g); + if (g->keyname) free(g->keyname); + free(g); +} + +/* public calls */ + +/** + * Requests @p keyname key events be directed to @p obj. + * + * Key grabs allow an object to receive key events for specific key strokes + * even if another object has focus. If the grab is non-exclusive then all + * objects that have grabs on the key will get the event, however if the + * grab is exclusive, no other object can get a grab on the key and only + * that object will get the event. + * + * @p keyname is a platform dependent symbolic name for the key pressed. + * It is sometimes possible to convert the string to an ASCII value of the + * key, but not always for example the enter key may be returned as the + * string 'Enter'. + * + * Typical platforms are Linux frame buffer (Ecore_FB) and X server (Ecore_X) + * when using Evas with Ecore and Ecore_Evas. + * + * For a list of keynames for the Linux frame buffer, please refer to the + * Ecore_FB documentation. + * + * @p modifiers and @p not_modifiers are bit masks of all the modifiers that are required and + * not required respectively for the new grab. Modifiers can be things such as shift and ctrl + * as well as user defigned types via evas_key_modifier_add. + * + * @see evas_object_key_ungrab + * @see evas_object_focus_set + * @see evas_object_focus_get + * @see evas_focus_get + * @see evas_key_modifier_add + * + * @param obj the object to direct @p keyname events to. + * @param keyname the key to request events for. + * @param modifiers a mask of modifiers that should be present to trigger the event. + * @param not_modifiers a mask of modifiers that should not be present to trigger the event. + * @param exclusive request that the @p obj is the only object receiving the @p keyname events. + * @return Boolean indicating whether the grab succeeded + */ +EAPI Evas_Bool +evas_object_key_grab(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, Evas_Bool exclusive) +{ + /* MEM OK */ + Evas_Key_Grab *g; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + if (!keyname) return 0; + if (exclusive) + { + g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers, exclusive); + if (g) return 0; + } + g = evas_key_grab_new(obj, keyname, modifiers, not_modifiers, exclusive); + if (!g) return 0; + return 1; +} + +/** + * Request that the grab on @p obj be removed. + * + * Removes the grab on @p obj if @p keyname, @p modifiers, and @p not_modifiers + * match. + * + * @see evas_object_key_grab + * @see evas_object_focus_set + * @see evas_object_focus_get + * @see evas_focus_get + * + * @param obj the object that has an existing grab. + * @param keyname the key the grab is for. + * @param modifiers a mask of modifiers that should be present to trigger the event. + * @param not_modifiers a mask of modifiers that should not be present to trigger the event. + */ +EAPI void +evas_object_key_ungrab(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers) +{ + /* MEM OK */ + Evas_Key_Grab *g; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!keyname) return; + g = evas_key_grab_find(obj, keyname, modifiers, not_modifiers, 0); + if (!g) return; + if (g->object->layer->evas->walking_grabs) + { + if (!g->delete_me) + { + g->object->layer->evas->delete_grabs++; + g->delete_me = 1; + } + } + else + evas_key_grab_free(g->object, keyname, modifiers, not_modifiers); +} diff --git a/src/lib/canvas/evas_layer.c b/src/lib/canvas/evas_layer.c new file mode 100644 index 0000000..2f8f613 --- /dev/null +++ b/src/lib/canvas/evas_layer.c @@ -0,0 +1,201 @@ +#include "evas_common.h" +#include "evas_private.h" + +void +evas_object_inject(Evas_Object *obj, Evas *e) +{ + Evas_Layer *lay; + + if (obj->in_layer) return; + lay = evas_layer_find(e, obj->cur.layer); + if (!lay) + { + lay = evas_layer_new(e); + lay->layer = obj->cur.layer; + evas_layer_add(lay); + } + lay->objects = evas_object_list_append(lay->objects, obj); + lay->usage++; + obj->layer = lay; + obj->in_layer = 1; +} + +void +evas_object_release(Evas_Object *obj, int clean_layer) +{ + if (!obj->in_layer) return; + obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); + obj->layer->usage--; + if (clean_layer) + { + if (obj->layer->usage <= 0) + { + evas_layer_del(obj->layer); + evas_layer_free(obj->layer); + } + } + obj->layer = NULL; + obj->in_layer = 0; +} + +Evas_Layer * +evas_layer_new(Evas *e) +{ + Evas_Layer *lay; + + lay = calloc(1, sizeof(Evas_Layer)); + if (!lay) return NULL; + lay->evas = e; + return lay; +} + +void +evas_layer_pre_free(Evas_Layer *lay) +{ + Evas_Object_List *l; + + for (l = (Evas_Object_List *)lay->objects; l; l = l->next) + { + Evas_Object *obj; + + obj = (Evas_Object *)l; + if ((!obj->smart.parent) && (!obj->delete_me)) + evas_object_del(obj); + } +} + +void +evas_layer_free(Evas_Layer *lay) +{ + while (lay->objects) + { + Evas_Object *obj; + + obj = (Evas_Object *)lay->objects; + evas_object_free(obj, 0); + } + free(lay); +} + +Evas_Layer * +evas_layer_find(Evas *e, short layer_num) +{ + Evas_Object_List *list; + + for (list = (Evas_Object_List *)e->layers; list; list = list->next) + { + Evas_Layer *layer; + + layer = (Evas_Layer *)list; + if (layer->layer == layer_num) return layer; + } + return NULL; +} + +void +evas_layer_add(Evas_Layer *lay) +{ + Evas_Object_List *list; + + for (list = (Evas_Object_List *)lay->evas->layers; list; list = list->next) + { + Evas_Layer *layer; + + layer = (Evas_Layer *)list; + if (layer->layer > lay->layer) + { + lay->evas->layers = evas_object_list_prepend_relative(lay->evas->layers, lay, layer); + return; + } + } + lay->evas->layers = evas_object_list_append(lay->evas->layers, lay); +} + +void +evas_layer_del(Evas_Layer *lay) +{ + Evas_Object_List *ol; + Evas *e; + + ol = (Evas_Object_List *)lay; + e = lay->evas; + e->layers = evas_object_list_remove(e->layers, lay); +} + +/* public functions */ + +/** + * @defgroup Evas_Object_Layer_Group Object Layer Functions + * + * Functions that retrieve and set the layer that an evas object is on. + * + * @todo Document which way layers go. + */ + +/** + * Sets the layer of the evas that the given object will be part of. + * @param obj The given evas object. + * @param l The number of the layer to place the object on. + * @ingroup Evas_Object_Layer_Group + */ +EAPI void +evas_object_layer_set(Evas_Object *obj, short l) +{ + Evas *e; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (evas_object_intercept_call_layer_set(obj, l)) return; + if (obj->smart.parent) return; + if (obj->cur.layer == l) + { + evas_object_raise(obj); + return; + } + e = obj->layer->evas; + evas_object_release(obj, 1); + obj->cur.layer = l; + evas_object_inject(obj, e); + obj->restack = 1; + evas_object_change(obj); + if (obj->clip.clipees) + { + evas_object_inform_call_restack(obj); + return; + } + evas_object_change(obj); + if (!obj->smart.smart) + { + if (evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1) && + obj->cur.visible) + if (evas_list_find(obj->layer->evas->pointer.object.in, obj)) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + } + evas_object_inform_call_restack(obj); +} + +/** + * Retrieves the layer of the evas that the given object is part of. + * @param obj The given evas object. + * @return Number of the layer. + * @ingroup Evas_Object_Layer_Group + */ +EAPI short +evas_object_layer_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + if (obj->smart.parent) + { + return obj->smart.parent->cur.layer; + } + return obj->cur.layer; +} diff --git a/src/lib/canvas/evas_main.c b/src/lib/canvas/evas_main.c new file mode 100644 index 0000000..27b3ce6 --- /dev/null +++ b/src/lib/canvas/evas_main.c @@ -0,0 +1,1023 @@ +#include "evas_common.h" +#include "evas_private.h" + +extern Evas_List *evas_modules; +static int initcount = 0; + +EAPI int +evas_init(void) +{ + if (initcount == 0) + evas_module_init(); + return ++initcount; +} + +EAPI int +evas_shutdown(void) +{ + initcount--; + if (initcount == 0) + { + evas_font_dir_cache_free(); + evas_common_shutdown(); + evas_module_shutdown(); + } + return initcount; +} + +/** + * @defgroup Evas_Canvas Evas Canvas + * + * Functions that deal with the basic evas object. They are the + * functions you need to use at a minimum to get a working evas, and + * to destroy it. + * + */ + +/** + * Creates a new empty evas. + * + * Note that before you can use the evas, you will to at a minimum: + * @li Set its render method with @ref evas_output_method_set . + * @li Set its viewport size with @ref evas_output_viewport_set . + * @li Set its size of the canvas with @ref evas_output_size_set . + * @li Ensure that the render engine is given the correct settings with + * @ref evas_engine_info_set . + * + * This function should only fail if the memory allocation fails. + * + * @return A new uninitialised Evas canvas on success. Otherwise, @c NULL. + * @ingroup Evas_Canvas + */ +EAPI Evas * +evas_new(void) +{ + Evas *e; + + e = calloc(1, sizeof(Evas)); + if (!e) return NULL; + + e->magic = MAGIC_EVAS; + e->output.render_method = RENDER_METHOD_INVALID; + e->viewport.w = 1; + e->viewport.h = 1; + e->hinting = EVAS_FONT_HINTING_BYTECODE; + + evas_array_setup(&e->delete_objects, 16); + evas_array_setup(&e->active_objects, 16); + evas_array_setup(&e->restack_objects, 16); + evas_array_setup(&e->render_objects, 16); + evas_array_setup(&e->pending_objects, 16); + evas_array_setup(&e->obscuring_objects, 16); + evas_array_setup(&e->temporary_objects, 16); + + return e; +} + +/** + * Frees the given evas and any objects created on it. + * + * Any objects with 'free' callbacks will have those callbacks called + * in this function. + * + * @param e The given evas. + * @ingroup Evas_Canvas + */ +EAPI void +evas_free(Evas *e) +{ + Evas_Object_List *l; + int i; + int del; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + if (e->walking_list == 0) evas_render_idle_flush(e); + + if (e->walking_list > 0) return; + del = 1; + e->walking_list++; + e->cleanup = 1; + while (del) + { + del = 0; + for (l = (Evas_Object_List *)(e->layers); l; l = l->next) + { + Evas_Layer *lay; + Evas_Object_List *ll; + + lay = (Evas_Layer *)l; + evas_layer_pre_free(lay); + for (ll = (Evas_Object_List *)lay->objects; ll; ll = ll->next) + { + Evas_Object *o; + + o = (Evas_Object *)ll; + if ((o->callbacks) && (o->callbacks->walking_list)) + { + /* Defer free */ + e->delete_me = 1; + e->walking_list--; + return; + } + if (!o->delete_me) + del = 1; + } + } + } + while (e->layers) + { + Evas_Layer *lay; + + lay = e->layers; + evas_layer_del(lay); + evas_layer_free(lay); + } + e->walking_list--; + + evas_font_path_clear(e); + e->pointer.object.in = evas_list_free(e->pointer.object.in); + + if (e->name_hash) evas_hash_free(e->name_hash); + + while (e->damages) + { + free(e->damages->data); + e->damages = evas_list_remove(e->damages, e->damages->data); + } + while (e->obscures) + { + free(e->obscures->data); + e->obscures = evas_list_remove(e->obscures, e->obscures->data); + } + + if (e->engine.func) + { + e->engine.func->info_free(e, e->engine.info); + e->engine.func->context_free(e->engine.data.output, e->engine.data.context); + e->engine.func->output_free(e->engine.data.output); + } + + for (i = 0; i < e->modifiers.mod.count; i++) + free(e->modifiers.mod.list[i]); + if (e->modifiers.mod.list) free(e->modifiers.mod.list); + + for (i = 0; i < e->locks.lock.count; i++) + free(e->locks.lock.list[i]); + if (e->locks.lock.list) free(e->locks.lock.list); + + if (e->engine.module) evas_module_unref(e->engine.module); + + evas_array_flush(&e->delete_objects); + evas_array_flush(&e->active_objects); + evas_array_flush(&e->restack_objects); + evas_array_flush(&e->render_objects); + evas_array_flush(&e->pending_objects); + evas_array_flush(&e->obscuring_objects); + evas_array_flush(&e->temporary_objects); + + e->magic = 0; + free(e); +} + +/** + * @defgroup Evas_Output_Method Evas Render Engine Functions + * + * Functions that are used to set the render engine for a given function, and + * then get that engine working. + * + * The following code snippet shows how they can be used to + * initialise an evas that uses the X11 software engine: + * @code + * Evas *evas; + * Evas_Engine_Info_Software_X11 *einfo; + * extern Display *display; + * extern Window win; + * + * evas = evas_new(); + * evas_output_method_set(evas, evas_render_method_lookup("software_x11")); + * evas_output_size_set(evas, 640, 480); + * evas_output_viewport_set(evas, 0, 0, 640, 480); + * einfo = (Evas_Engine_Info_Software_X11 *)evas_engine_info_get(evas); + * einfo->info.display = display; + * einfo->info.visual = DefaultVisual(display, DefaultScreen(display)); + * einfo->info.colormap = DefaultColormap(display, DefaultScreen(display)); + * einfo->info.drawable = win; + * einfo->info.depth = DefaultDepth(display, DefaultScreen(display)); + * evas_engine_info_set(evas, (Evas_Engine_Info *)einfo); + * @endcode + */ + +/** + * Sets the output engine for the given evas. + * + * Once the output engine for an evas is set, any attempt to change it + * will be ignored. The value for @p render_method can be found using + * @ref evas_render_method_lookup . + * + * @param e The given evas. + * @param render_method The numeric engine value to use. + * @ingroup Evas_Output_Method + */ +EAPI void +evas_output_method_set(Evas *e, int render_method) +{ + Evas_List *l; + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + /* if our engine to set it to is invalid - abort */ + if (render_method == RENDER_METHOD_INVALID) return; + /* if the engine is already set up - abort */ + if (e->output.render_method != RENDER_METHOD_INVALID) return; + /* iterate trough the list to find the id */ + for (l = evas_modules; l; l = l->next) + { + Evas_Module *em; + Evas_Module_Engine *eme; + + em = l->data; + if (em->type != EVAS_MODULE_TYPE_ENGINE) continue; + if (!em->data) continue; + eme = (Evas_Module_Engine *)em->data; + if (eme->id != render_method) continue; + if (!evas_module_load(em)) return; + /* set the correct render */ + e->output.render_method = render_method; + e->engine.func = (em->functions); + evas_module_use(em); + if (e->engine.module) evas_module_unref(e->engine.module); + e->engine.module = em; + evas_module_ref(em); + /* get the engine info struct */ + if (e->engine.func->info) e->engine.info = e->engine.func->info(e); + return; + } +} + +/** + * Retrieves the number of the output engine used for the given evas. + * @param e The given evas. + * @return The ID number of the output engine being used. @c 0 is + * returned if there is an error. + * @ingroup Evas_Output_Method + */ +EAPI int +evas_output_method_get(const Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return RENDER_METHOD_INVALID; + MAGIC_CHECK_END(); + + return e->output.render_method; +} + +/** + * Retrieves the current render engine info struct from the given evas. + * + * The returned structure is publicly modifiable. The contents are valid + * until either @ref evas_engine_info_set or @ref evas_render are called. + * + * This structure does not need to be freed by the caller. + * + * @param e The given evas. + * @return A pointer to the Engine Info structure. @c NULL is returned if + * an engine has not yet been assigned. + * @ingroup Evas_Output_Method + */ +EAPI Evas_Engine_Info * +evas_engine_info_get(const Evas *e) +{ + Evas_Engine_Info *info; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + + if (!e->engine.info) return NULL; + + info = e->engine.info; + ((Evas *)e)->engine.info_magic = info->magic; + + return info; +} + +/** + * Applies the engine settings for the given evas from the given @c + * Evas_Engine_Info structure. + * + * To get the Evas_Engine_Info structure to use, call @ref + * evas_engine_info_get . Do not try to obtain a pointer to an + * @c Evas_Engine_Info structure in any other way. + * + * You will need to call this function at least once before you can + * create objects on an evas or render that evas. Some engines allow + * their settings to be changed more than once. + * + * Once called, the @p info pointer should be considered invalid. + * + * Example: + * + * @param e The pointer to the Evas Canvas + * @param info The pointer to the Engine Info to use + * @ingroup Evas_Output_Method + */ +EAPI void +evas_engine_info_set(Evas *e, Evas_Engine_Info *info) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + if (!info) return; + if (info != e->engine.info) return; + if (info->magic != e->engine.info_magic) return; + e->engine.func->setup(e, info); +} + +/** + * @defgroup Evas_Output_Size Evas Output and Viewport Resizing Functions + * + * Functions that set and retrieve the output and viewport size of an evas. + */ + +/** + * Sets the output size of the render engine of the given evas. + * + * The evas will render to a rectangle of the given size once this + * function is called. The output size is independent of the viewport + * size. The viewport will be stretched to fill the given rectangle. + * + * The units used for @p w and @p h depend on the engine used by the + * evas. + * + * @param e The given evas. + * @param w The width in output units, usually pixels. + * @param h The height in output units, usually pixels. + * @ingroup Evas_Output_Size + */ +EAPI void +evas_output_size_set(Evas *e, int w, int h) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + if ((w == e->output.w) && (h == e->output.h)) return; + if (w < 1) w = 1; + if (h < 1) h = 1; + e->output.w = w; + e->output.h = h; + e->output.changed = 1; + e->output_validity++; + e->changed = 1; + evas_render_invalidate(e); +} + +/** + * Retrieve the output size of the render engine of the given evas. + * + * The output size is given in whatever the output units are for the + * engine. + * + * If either @p w or @p h is @c NULL, then it is ignored. If @p e is + * invalid, the returned results are undefined. + * + * @param e The given evas. + * @param w The pointer to an integer to store the width in. + * @param h The pointer to an integer to store the height in. + * @ingroup Evas_Output_Size + */ +EAPI void +evas_output_size_get(const Evas *e, int *w, int *h) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + if (w) *w = 0; + if (h) *h = 0; + return; + MAGIC_CHECK_END(); + + if (w) *w = e->output.w; + if (h) *h = e->output.h; +} + +/** + * Sets the output viewport of the given evas in evas units. + * + * The output viewport is the area of the evas that will be visible to the + * viewer. The viewport will be stretched to fit the output target of the + * evas when rendering is performed. + * + * @note The coordinate values do not have to map 1-to-1 with the output + * target. However, it is generally advised that it is done for ease + * of use. + * + * @param e The given evas. + * @param x The top-left corner x value of the viewport. + * @param y The top-left corner y value of the viewport. + * @param w The width of the viewport. Must be greater than 0. + * @param h The height of the viewport. Must be greater than 0. + * @ingroup Evas_Output_Size + */ +EAPI void +evas_output_viewport_set(Evas *e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + if ((x == e->viewport.x) && (y == e->viewport.y) && + (w == e->viewport.w) && (h == e->viewport.h)) return; + if (w <= 0) return; + if (h <= 0) return; + if ((x != 0) || (y != 0)) + { + printf("EVAS: compat error. viewport x,y != 0,0 not supported\n"); + x = 0; + y = 0; + } + e->viewport.x = x; + e->viewport.y = y; + e->viewport.w = w; + e->viewport.h = h; + e->viewport.changed = 1; + e->output_validity++; + e->changed = 1; +} + +/** + * Get the render engine's output viewport co-ordinates in canvas units. + * @param e The pointer to the Evas Canvas + * @param x The pointer to a x variable to be filled in + * @param y The pointer to a y variable to be filled in + * @param w The pointer to a width variable to be filled in + * @param h The pointer to a height variable to be filled in + * @ingroup Evas_Output_Size + * + * Calling this function writes the current canvas output viewport size and + * location values into the variables pointed to by @p x, @p y, @p w and @p h. + * On success the variables have the output location and size values written to + * them in canvas units. Any of @p x, @p y, @p w or @p h that are NULL will not + * be written to. If @p e is invalid, the results are undefined. + * + * Example: + * @code + * extern Evas *evas; + * Evas_Coord x, y, width, height; + * + * evas_output_viewport_get(evas, &x, &y, &w, &h); + * @endcode + */ +EAPI void +evas_output_viewport_get(const Evas *e, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + if (x) *x = 0; + if (y) *y = 0; + if (w) *w = 0; + if (h) *h = 0; + return; + MAGIC_CHECK_END(); + + if (x) *x = e->viewport.x; + if (y) *y = e->viewport.y; + if (w) *w = e->viewport.w; + if (h) *h = e->viewport.h; +} + +/** + * @defgroup Evas_Coord_Mapping_Group Evas Coordinate Mapping Functions + * + * Functions that are used to map coordinates from the canvas to the + * screen or the screen to the canvas. + */ + +/** + * Convert/scale an ouput screen co-ordinate into canvas co-ordinates + * + * @param e The pointer to the Evas Canvas + * @param x The screen/output x co-ordinate + * @return The screen co-ordinate translated to canvas unit co-ordinates + * @ingroup Evas_Coord_Mapping_Group + * + * This function takes in a horizontal co-ordinate as the @p x parameter and + * converts it into canvas units, accounting for output size, viewport size + * and location, returning it as the function return value. If @p e is + * invalid, the results are undefined. + * + * Example: + * @code + * extern Evas *evas; + * extern int screen_x; + * Evas_Coord canvas_x; + * + * canvas_x = evas_coord_screen_x_to_world(evas, screen_x); + * @endcode + */ +EAPI Evas_Coord +evas_coord_screen_x_to_world(const Evas *e, int x) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return 0; + MAGIC_CHECK_END(); + if (e->output.w == e->viewport.w) return e->viewport.x + x; + return (long long)e->viewport.x + (((long long)x * (long long)e->viewport.w) / (long long)e->output.w); +} + +/** + * Convert/scale an ouput screen co-ordinate into canvas co-ordinates + * + * @param e The pointer to the Evas Canvas + * @param y The screen/output y co-ordinate + * @return The screen co-ordinate translated to canvas unit co-ordinates + * @ingroup Evas_Coord_Mapping_Group + * + * This function takes in a vertical co-ordinate as the @p y parameter and + * converts it into canvas units, accounting for output size, viewport size + * and location, returning it as the function return value. If @p e is + * invalid, the results are undefined. + * + * Example: + * @code + * extern Evas *evas; + * extern int screen_y; + * Evas_Coord canvas_y; + * + * canvas_y = evas_coord_screen_y_to_world(evas, screen_y); + * @endcode + */ +EAPI Evas_Coord +evas_coord_screen_y_to_world(const Evas *e, int y) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return 0; + MAGIC_CHECK_END(); + if (e->output.h == e->viewport.h) return e->viewport.y + y; + return (long long)e->viewport.y + (((long long)y * (long long)e->viewport.h) / (long long)e->output.h); +} + +/** + * Convert/scale a canvas co-ordinate into output screen co-ordinates + * + * @param e The pointer to the Evas Canvas + * @param x The canvas x co-ordinate + * @return The output/screen co-ordinate translated to output co-ordinates + * @ingroup Evas_Coord_Mapping_Group + * + * This function takes in a horizontal co-ordinate as the @p x parameter and + * converts it into output units, accounting for output size, viewport size + * and location, returning it as the function return value. If @p e is + * invalid, the results are undefined. + * + * Example: + * @code + * extern Evas *evas; + * int screen_x; + * extern Evas_Coord canvas_x; + * + * screen_x = evas_coord_world_x_to_screen(evas, canvas_x); + * @endcode + */ +EAPI int +evas_coord_world_x_to_screen(const Evas *e, Evas_Coord x) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return 0; + MAGIC_CHECK_END(); + if (e->output.w == e->viewport.w) return x - e->viewport.x; + return (int)((((long long)x - (long long)e->viewport.x) * (long long)e->output.w) / (long long)e->viewport.w); +} + +/** + * Convert/scale a canvas co-ordinate into output screen co-ordinates + * + * @param e The pointer to the Evas Canvas + * @param y The canvas y co-ordinate + * @return The output/screen co-ordinate translated to output co-ordinates + * @ingroup Evas_Coord_Mapping_Group + * + * This function takes in a vertical co-ordinate as the @p x parameter and + * converts it into output units, accounting for output size, viewport size + * and location, returning it as the function return value. If @p e is + * invalid, the results are undefined. + * + * Example: + * @code + * extern Evas *evas; + * int screen_y; + * extern Evas_Coord canvas_y; + * + * screen_y = evas_coord_world_y_to_screen(evas, canvas_y); + * @endcode + */ +EAPI int +evas_coord_world_y_to_screen(const Evas *e, Evas_Coord y) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return 0; + MAGIC_CHECK_END(); + if (e->output.h == e->viewport.h) return y - e->viewport.y; + return (int)((((long long)y - (long long)e->viewport.y) * (long long)e->output.h) / (long long)e->viewport.h); +} + +/** + * Look up a numeric ID from a string name of a rendering engine. + * + * @param name The string name of an engine + * @return A numeric (opaque) ID for the rendering engine + * @ingroup Evas_Output_Method + * + * This function looks up a numeric return value for the named engine in the + * string @p name. This is a normal C string, NUL byte terminated. The name + * is case sensitive. If the rendering engine is available, a numeric ID for + * that engine is returned that is not 0. If the engine is not available, 0 + * is returned, indicating an invalid engine. + * + * The programmer should NEVER rely on the numeric ID of an engine unless it is + * returned by this function. Programs should NOT be written accessing render + * method ID's directly, without first obtaining it from this function. + * + * Example: + * @code + * int engine_id; + * Evas *evas; + * + * evas = evas_new(); + * if (!evas) + * { + * fprintf(stderr, "ERROR: Canvas creation failed. Fatal error.\n"); + * exit(-1); + * } + * engine_id = evas_render_method_lookup("software_x11"); + * if (!engine_id) + * { + * fprintf(stderr, "ERROR: Requested rendering engine is absent.\n"); + * exit(-1); + * } + * evas_output_method_set(evas, engine_id); + * @endcode + */ +EAPI int +evas_render_method_lookup(const char *name) +{ + static int i = 1; + Evas_Module *em; + Evas_Module_Engine *eem; + + if (!name) return RENDER_METHOD_INVALID; + /* search on the engines list for the name */ + em = evas_module_find_type(EVAS_MODULE_TYPE_ENGINE, name); + + if (!em) return RENDER_METHOD_INVALID; + + eem = (Evas_Module_Engine *)em->data; + if (!eem) + { + eem = malloc(sizeof(Evas_Module_Engine)); + em->data = eem; + eem->id = i; + i++; + } + return eem->id; +} + +/** + * List all the rendering engines compiled into the copy of the Evas library + * + * @return A linked list whose data members are C strings of engine names + * @ingroup Evas_Output_Method + * + * Calling this will return a handle (pointer) to an Evas linked list. Each node + * in the linked list will have the data pointer be a (char *) pointer to the + * string name of the rendering engine available. The strings should never be + * modified, neither should the list be modified. This list should be cleaned up + * as soon as the program no longer needs it using + * evas_render_method_list_free(). If no engines are available from Evas, NULL + * will be returned. + * + * Example: + * @code + * Evas_List *engine_list, *l; + * + * engine_list = evas_render_method_list(); + * if (!engine_list) + * { + * fprintf(stderr, "ERROR: Evas supports no engines! Exit.\n"); + * exit(-1); + * } + * printf("Availible Evas Engines:\n"); + * for (l = engine_list; l; l = l->next) + * { + * char *engine_name; + * + * engine_name = l->data; + * printf("%s\n", engine_name); + * } + * evas_render_method_list_free(engine_list); + * @endcode + */ +EAPI Evas_List * +evas_render_method_list(void) +{ + Evas_List *methods = NULL; + + /* FIXME: get from modules - this is currently coded-in */ +#ifdef BUILD_ENGINE_SOFTWARE_DDRAW + methods = evas_list_append(methods, strdup("software_ddraw")); +#endif +#ifdef BUILD_ENGINE_SOFTWARE_16_DDRAW + methods = evas_list_append(methods, strdup("software_16_ddraw")); +#endif +#ifdef BUILD_ENGINE_DIRECT3D + methods = evas_list_append(methods, strdup("direct3d")); +#endif +#ifdef BUILD_ENGINE_SOFTWARE_16_WINCE + methods = evas_list_append(methods, strdup("software_16_wince")); +#endif +#ifdef BUILD_ENGINE_SOFTWARE_X11 + methods = evas_list_append(methods, strdup("software_x11")); +#endif +#ifdef BUILD_ENGINE_XRENDER_X11 + methods = evas_list_append(methods, strdup("xrender_x11")); +#endif +#ifdef BUILD_ENGINE_SOFTWARE_XCB + methods = evas_list_append(methods, strdup("software_xcb")); +#endif +#ifdef BUILD_ENGINE_XRENDER_XCB + methods = evas_list_append(methods, strdup("xrender_xcb")); +#endif +#ifdef BUILD_ENGINE_SOFTWARE_16_X11 + methods = evas_list_append(methods, strdup("software_16_x11")); +#endif +#ifdef BUILD_ENGINE_GL_X11 + methods = evas_list_append(methods, strdup("gl_x11")); +#endif +#ifdef BUILD_ENGINE_GL_GLEW + methods = evas_list_append(methods, strdup("gl_glew")); +#endif +#ifdef BUILD_ENGINE_CAIRO_X11 + methods = evas_list_append(methods, strdup("cairo_x11")); +#endif +#ifdef BUILD_ENGINE_DIRECTFB + methods = evas_list_append(methods, strdup("directfb")); +#endif +#ifdef BUILD_ENGINE_FB + methods = evas_list_append(methods, strdup("fb")); +#endif +#ifdef BUILD_ENGINE_BUFFER + methods = evas_list_append(methods, strdup("buffer")); +#endif +#ifdef BUILD_ENGINE_SOFTWARE_WIN32_GDI + methods = evas_list_append(methods, strdup("software_win32_gdi")); +#endif +#ifdef BUILD_ENGINE_SOFTWARE_QTOPIA + methods = evas_list_append(methods, strdup("software_qtopia")); +#endif +#ifdef BUILD_ENGINE_SDL + methods = evas_list_append(methods, strdup("software_sdl")); +#endif + + return methods; +} + +/** + * This function should be called to free a list of engine names + * + * @param list The Evas_List base pointer for the engine list to be freed + * @ingroup Evas_Output_Method + * + * When this function is called it will free the engine list passed in as + * @p list. The list should only be a list of engines generated by calling + * evas_render_method_list(). If @p list is NULL, nothing will happen. + * + * Example: + * @code + * Evas_List *engine_list, *l; + * + * engine_list = evas_render_method_list(); + * if (!engine_list) + * { + * fprintf(stderr, "ERROR: Evas supports no engines! Exit.\n"); + * exit(-1); + * } + * printf("Availible Evas Engines:\n"); + * for (l = engine_list; l; l = l->next) + * { + * char *engine_name; + * + * engine_name = l->data; + * printf("%s\n", engine_name); + * } + * evas_render_method_list_free(engine_list); + * @endcode + */ +EAPI void +evas_render_method_list_free(Evas_List *list) +{ + while (list) + { + free(list->data); + list = evas_list_remove(list, list->data); + } +} + +/** + * @defgroup Evas_Pointer_Group Evas Pointer Functions + * + * Functions that deal with the status of the pointer. + */ + +/** + * This function returns the current known pointer co-ordinates + * + * @param e The pointer to the Evas Canvas + * @param x The pointer to an integer to be filled in + * @param y The pointer to an integer to be filled in + * @ingroup Evas_Pointer_Group + * + * This function returns the current known screen/output co-ordinates of the + * mouse pointer and sets the contents of the integers pointed to by @p x + * and @p y to contain these co-ordinates. If @p e is not a valid canvas the + * results of this function are undefined. + * + * Example: + * @code + * extern Evas *evas; + * int mouse_x, mouse_y; + * + * evas_pointer_output_xy_get(evas, &mouse_x, &mouse_y); + * printf("Mouse is at screen position %i, %i\n", mouse_x, mouse_y); + * @endcode + */ +EAPI void +evas_pointer_output_xy_get(const Evas *e, int *x, int *y) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + if (x) *x = 0; + if (y) *y = 0; + return; + MAGIC_CHECK_END(); + if (x) *x = e->pointer.x; + if (y) *y = e->pointer.y; +} + +/** + * This function returns the current known pointer co-ordinates + * + * @param e The pointer to the Evas Canvas + * @param x The pointer to a Evas_Coord to be filled in + * @param y The pointer to a Evas_Coord to be filled in + * @ingroup Evas_Pointer_Group + * + * This function returns the current known canvas unit co-ordinates of the + * mouse pointer and sets the contents of the Evas_Coords pointed to by @p x + * and @p y to contain these co-ordinates. If @p e is not a valid canvas the + * results of this function are undefined. + * + * Example: + * @code + * extern Evas *evas; + * Evas_Coord mouse_x, mouse_y; + * + * evas_pointer_output_xy_get(evas, &mouse_x, &mouse_y); + * printf("Mouse is at canvas position %f, %f\n", mouse_x, mouse_y); + * @endcode + */ +EAPI void +evas_pointer_canvas_xy_get(const Evas *e, Evas_Coord *x, Evas_Coord *y) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + if (x) *x = 0; + if (y) *y = 0; + return; + MAGIC_CHECK_END(); + if (x) *x = e->pointer.x; + if (y) *y = e->pointer.y; +} + +/** + * Returns a bitmask with the mouse buttons currently pressed, set to 1 + * + * @param e The pointer to the Evas Canvas + * @return A bitmask of the currently depressed buttons on the cavas + * @ingroup Evas_Pointer_Group + * + * Calling this function will return a 32-bit integer with the appropriate bits + * set to 1 that correspond to a mouse button being depressed. This limits + * Evas to a mouse devices with a maximum of 32 buttons, but that is generally + * in excess of any host system's pointing device abilities. + * + * A canvas by default begins with no mouse buttons being pressed and only + * calls to evas_event_feed_mouse_down(), evas_event_feed_mouse_down_data(), + * evas_event_feed_mouse_up() and evas_event_feed_mouse_up_data() will alter + * that. + * + * The least significant bit corresponds to the first mouse button (button 1) + * and the most significant bit corresponds to the last mouse button + * (button 32). + * + * If @p e is not a valid canvas, the return value is undefined. + * + * Example: + * @code + * extern Evas *evas; + * int button_mask, i; + * + * button_mask = evas_pointer_button_down_mask_get(evas); + * printf("Buttons currently pressed:\n"); + * for (i = 0; i < 32; i++) + * { + * if ((button_mask & (1 << i)) != 0) printf("Button %i\n", i + 1); + * } + * @endcode + */ +EAPI int +evas_pointer_button_down_mask_get(const Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return 0; + MAGIC_CHECK_END(); + return (int)e->pointer.button; +} + +/** + * Returns whether the mouse pointer is logically inside the canvas + * + * @param e The pointer to the Evas Canvas + * @return An integer that is 1 if the mouse is inside the canvas, 0 otherwise + * @ingroup Evas_Pointer_Group + * + * When this function is called it will return a value of either 0 or 1, + * depending on if evas_event_feed_mouse_in(), evas_event_feed_mouse_in_data(), + * or evas_event_feed_mouse_out(), evas_event_feed_mouse_out_data() have been + * called to feed in a mouse enter event into the canvas. + * + * A return value of 1 indicates the mouse is logically inside the canvas, and + * 0 implies it is logically outside the canvas. + * + * A canvas begins with the mouse being assumed outside (0). + * + * If @p e is not a valid canvas, the return value is undefined. + * + * Example: + * @code + * extern Evas *evas; + * + * if (evas_pointer_inside_get(evas)) printf("Mouse is in!\n"); + * else printf("Mouse is out!\n"); + * @endcode + */ +EAPI Evas_Bool +evas_pointer_inside_get(const Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return 0; + MAGIC_CHECK_END(); + return (int)e->pointer.inside; +} + +/** + * Attaches a specific pointer to the evas for fetching later + * + * @param e The canvas to attach the pointer to + * @param data The pointer to attach + */ +EAPI void +evas_data_attach_set(Evas *e, void *data) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + e->attach_data = data; +} + +/** + * Returns the pointer attached by evas_data_attach_set() + * + * @param e The canvas to attach the pointer to + * @return The pointer attached + */ +EAPI void * +evas_data_attach_get(const Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + return e->attach_data; +} + +void +_evas_walk(Evas *e) +{ + e->walking_list++; +} + +void +_evas_unwalk(Evas *e) +{ + e->walking_list--; + if ((e->walking_list == 0) && (e->delete_me)) evas_free(e); +} + diff --git a/src/lib/canvas/evas_name.c b/src/lib/canvas/evas_name.c new file mode 100644 index 0000000..c1cc94d --- /dev/null +++ b/src/lib/canvas/evas_name.c @@ -0,0 +1,67 @@ +#include "evas_common.h" +#include "evas_private.h" + +/** + * @defgroup Evas_Object_Name_Group Object Name Function + * + * Functions that retrieve and set the name of an evas object. + */ + +/** + * Sets the name of the given evas object to the given name. + * @param obj The given object. + * @param name The given name. + * @ingroup Evas_Object_Name_Group + */ +EAPI void +evas_object_name_set(Evas_Object *obj, const char *name) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (obj->name) + { + obj->layer->evas->name_hash = evas_hash_del(obj->layer->evas->name_hash, obj->name, obj); + free(obj->name); + } + if (!name) obj->name = NULL; + else + { + obj->name = strdup(name); + obj->layer->evas->name_hash = evas_hash_add(obj->layer->evas->name_hash, obj->name, obj); + } +} + +/** + * Retrieves the name of the given evas object. + * @param obj The given object. + * @return The name of the object. @c NULL if no name has been given + * to the object. + * @ingroup Evas_Object_Name_Group + */ +EAPI const char * +evas_object_name_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + return obj->name; +} + +/** + * Retrieves the object on the given evas with the given name. + * @param e The given evas. + * @param name The given name. + * @return If successful, the evas object with the given name. Otherwise, + * @c NULL. + * @ingroup Evas_Object_Name_Group + */ +EAPI Evas_Object * +evas_object_name_find(const Evas *e, const char *name) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + if (!name) return NULL; + return (Evas_Object *)evas_hash_find(e->name_hash, name); +} diff --git a/src/lib/canvas/evas_object_gradient.c b/src/lib/canvas/evas_object_gradient.c new file mode 100644 index 0000000..aef1059 --- /dev/null +++ b/src/lib/canvas/evas_object_gradient.c @@ -0,0 +1,1091 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_private.h" +#include "../engines/common/evas_convert_color.h" + +/* private magic number for gradient objects */ +static const char o_type[] = "gradient"; + +/* private struct for gradient object internal data */ +typedef struct _Evas_Object_Gradient Evas_Object_Gradient; + +struct _Evas_Object_Gradient +{ + DATA32 magic; + + struct { + struct { + Evas_Angle angle; + float offset; + int direction; + } map; + struct { + Evas_Coord x, y, w, h; + Evas_Angle angle; + int spread; + } fill; + struct { + char *name; + char *params; + } type; + unsigned char gradient_opaque : 1; + } cur, prev; + + void *engine_data; + + unsigned char changed : 1; + unsigned char gradient_changed : 1; + unsigned char type_changed : 1; +}; + +/* private methods for gradient objects */ +static void evas_object_gradient_init(Evas_Object *obj); +static void *evas_object_gradient_new(void); +static void evas_object_gradient_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y); +static void evas_object_gradient_free(Evas_Object *obj); +static void evas_object_gradient_render_pre(Evas_Object *obj); +static void evas_object_gradient_render_post(Evas_Object *obj); + +static int evas_object_gradient_is_opaque(Evas_Object *obj); +static int evas_object_gradient_was_opaque(Evas_Object *obj); + +static const Evas_Object_Func object_func = +{ + /* methods (compulsory) */ + evas_object_gradient_free, + evas_object_gradient_render, + evas_object_gradient_render_pre, + evas_object_gradient_render_post, + /* these are optional. NULL = nothing */ + NULL, + NULL, + NULL, + NULL, + evas_object_gradient_is_opaque, + evas_object_gradient_was_opaque, + NULL, + NULL, + NULL +}; + +/* the actual api call to add a gradient */ + +/** + * @defgroup Evas_Object_Gradient_Group Evas Gradient Object Functions + * + * Functions that work on evas gradient objects. + * + * The following example shows how + */ + +/** + * Adds a gradient object to the given evas. + * @param e The given evas. + * @return A new evas gradient object if successful. Otherwise, @c NULL. + * @ingroup Evas_Object_Gradient_Group + */ +EAPI Evas_Object * +evas_object_gradient_add(Evas *e) +{ + Evas_Object *obj; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + obj = evas_object_new(); + evas_object_gradient_init(obj); + evas_object_inject(obj, e); + if (obj->object_data) + { + Evas_Object_Gradient *o = (Evas_Object_Gradient *)(obj->object_data); + + o->engine_data = e->engine.func->gradient_new(e->engine.data.output); + } + evas_object_change(obj); + return obj; +} + +/** + * Adds a color stop to the given evas gradient object. + * + * The @p delta parameter determines the proportion of the gradient + * object that is to be set to the color. For instance, if red is + * added with @p delta set to 2, and green is added with @p + * delta set to 1, two-thirds will be red or reddish and one-third + * will be green or greenish. + * + * Colors are added from the top downwards. + * + * @param obj The given evas gradient object. + * @param r Red component of the given color. + * @param g Green component of the given color. + * @param b Blue component of the given color. + * @param a Alpha component of the given color. + * @param delta Proportion of the gradient object that is this color. + * @ingroup Evas_Object_Gradient_Group + */ +EAPI void +evas_object_gradient_color_stop_add(Evas_Object *obj, int r, int g, int b, int a, int delta) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return; + MAGIC_CHECK_END(); + if (o->engine_data) + obj->layer->evas->engine.func->gradient_color_stop_add(obj->layer->evas->engine.data.output, + o->engine_data, + r, g, b, a, delta); + o->gradient_changed = 1; + o->changed = 1; + evas_object_change(obj); +} + +/** + * Adds an alpha stop to the given evas gradient object. + * + * The @p delta parameter determines the proportion of the gradient + * object that is to be set to the alpha value. + * + * Alphas are added from the top downwards. + * + * @param obj The given evas gradient object. + * @param a Alpha value. + * @param delta Proportion of the gradient object that is this alpha. + * @ingroup Evas_Object_Gradient_Group + */ +EAPI void +evas_object_gradient_alpha_stop_add(Evas_Object *obj, int a, int delta) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return; + MAGIC_CHECK_END(); + if (o->engine_data) + obj->layer->evas->engine.func->gradient_alpha_stop_add(obj->layer->evas->engine.data.output, + o->engine_data, a, delta); + o->gradient_changed = 1; + o->changed = 1; + evas_object_change(obj); +} + +/** + * Deletes all stops set for the given evas gradient object or any set data. + * @param obj The given evas gradient object. + * @ingroup Evas_Object_Gradient_Group + */ +EAPI void +evas_object_gradient_clear(Evas_Object *obj) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return; + MAGIC_CHECK_END(); + if (o->engine_data) + obj->layer->evas->engine.func->gradient_clear(obj->layer->evas->engine.data.output, + o->engine_data); + o->gradient_changed = 1; + o->changed = 1; + o->cur.gradient_opaque = 0; + evas_object_change(obj); +} + +/** + * Sets color data for the given evas gradient object. + * + * If data is so set, any existing gradient stops will be deleted, + * The data is not copied, so if it was allocated, do not free it while it's set. + * + * @param obj The given evas gradient object. + * @param data The color data to be set. Should be in argb32 pixel format. + * @param len The length of the data pointer - multiple of the pixel size. + * @param has_alpha A flag indicating if the data has alpha or not. + * @ingroup Evas_Object_Gradient_Group + */ +EAPI void +evas_object_gradient_color_data_set(Evas_Object *obj, void *data, int len, Evas_Bool has_alpha) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return; + MAGIC_CHECK_END(); + if (o->engine_data) + obj->layer->evas->engine.func->gradient_color_data_set(obj->layer->evas->engine.data.output, + o->engine_data, + data, len, has_alpha); + o->gradient_changed = 1; + o->changed = 1; + evas_object_change(obj); +} + +/** + * Sets alpha data for the given evas gradient object. + * + * If alpha data is so set, any existing gradient stops will be cleared, + * The data is not copied, so if it was allocated, do not free it while it's set. + * + * @param obj The given evas gradient object. + * @param data The alpha data to be set, in a8 format. + * @param len The length of the data pointer - multiple of the pixel size. + * @ingroup Evas_Object_Gradient_Group + */ +EAPI void +evas_object_gradient_alpha_data_set(Evas_Object *obj, void *data, int len) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return; + MAGIC_CHECK_END(); + if (o->engine_data) + obj->layer->evas->engine.func->gradient_alpha_data_set(obj->layer->evas->engine.data.output, + o->engine_data, + data, len); + o->gradient_changed = 1; + o->changed = 1; + evas_object_change(obj); +} + +/** + * @defgroup Evas_Object_Gradient_Fill_Group Gradient Object Fill Rectangle Functions + * + * Functions that deal with what areas of the gradient object are to be + * tiled with the gradient. + */ + +/** + * Sets the rectangle on the gradient object that the gradient will be + * drawn to. + * + * Note that the gradient may be tiled around this one rectangle, + * according to its spread value - restrict, repeat, or reflect. To have + * only one 'cycle' of the gradient drawn, the spread value must be set + * to restrict, or @p x and @p y must be 0 and @p w and @p h need to be + * the width and height of the gradient object respectively. + * + * The default values for the fill parameters is @p x = 0, @p y = 0, + * @p w = 32 and @p h = 32. + * + * @param obj The given evas gradient object. + * @param x The X coordinate for the top left corner of the rect. + * @param y The Y coordinate for the top left corner of the rect. + * @param w The width of the rect. + * @param h The height of the rect. + * @ingroup Evas_Object_Gradient_Fill_Group + */ +EAPI void +evas_object_gradient_fill_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) +{ + Evas_Object_Gradient *o; + + if (w < 0) w = -w; + if (h < 0) h = -h; + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return; + MAGIC_CHECK_END(); + if ((o->cur.fill.x == x) && + (o->cur.fill.y == y) && + (o->cur.fill.w == w) && + (o->cur.fill.h == h)) return; + o->cur.fill.x = x; + o->cur.fill.y = y; + o->cur.fill.w = w; + o->cur.fill.h = h; + o->gradient_changed = 1; + o->changed = 1; + evas_object_change(obj); +} + +/** + * Retrieves the dimensions of the rectangle on the gradient object that + * the gradient will use as its fill rect. + * + * See @ref evas_object_gradient_fill_set for more details. + * + * @param obj The given evas gradient object. + * @param x Pointer to an Evas_Coord to store the X coordinate in. + * @param y Pointer to an Evas_Coord to store the Y coordinate in. + * @param w Pointer to an Evas_Coord to store the width in. + * @param h Pointer to an Evas_Coord to store the height in. + * @ingroup Evas_Object_Gradient_Fill_Group + */ +EAPI void +evas_object_gradient_fill_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (x) *x = 0; + if (y) *y = 0; + if (w) *w = 0; + if (h) *h = 0; + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + if (x) *x = 0; + if (y) *y = 0; + if (w) *w = 0; + if (h) *h = 0; + return; + MAGIC_CHECK_END(); + if (x) *x = o->cur.fill.x; + if (y) *y = o->cur.fill.y; + if (w) *w = o->cur.fill.w; + if (h) *h = o->cur.fill.h; + return; +} + +/** + * Sets the angle at which the given evas gradient object's fill sits clockwise + * from vertical. + * @param obj The given evas gradient object. + * @param angle Angle in degrees. Can be negative. + * @ingroup Evas_Object_Gradient_Group + */ +EAPI void +evas_object_gradient_fill_angle_set(Evas_Object *obj, Evas_Angle angle) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return; + MAGIC_CHECK_END(); + if (angle == o->cur.fill.angle) return; + o->cur.fill.angle = angle; + o->changed = 1; + evas_object_change(obj); +} + +/** + * Retrieves the angle at which the given evas gradient object's fill sits + * clockwise from the vertical. + * @param obj The given evas gradient object. + * @return The current angle if successful. @c 0.0 otherwise. + * @ingroup Evas_Object_Gradient_Group + */ +EAPI Evas_Angle +evas_object_gradient_fill_angle_get(const Evas_Object *obj) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0.0; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return 0.0; + MAGIC_CHECK_END(); + return o->cur.fill.angle; +} + +/** + * Sets the tiling mode for the given evas gradient object's fill. + * @param obj The given evas gradient object. + * @param spread One of EVAS_TEXTURE_REFLECT, EVAS_TEXTURE_REPEAT, + * EVAS_TEXTURE_RESTRICT, EVAS_TEXTURE_RESTRICT_REFLECT, EVAS_TEXTURE_RESTRICT_REPEAT, + * or EVAS_TEXTURE_PAD. + * @ingroup Evas_Object_Gradient_Group + */ +EAPI void +evas_object_gradient_fill_spread_set(Evas_Object *obj, int spread) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return; + MAGIC_CHECK_END(); + if (spread == o->cur.fill.spread) return; + o->cur.fill.spread = spread; + o->changed = 1; + evas_object_change(obj); +} + +/** + * Retrieves the spread (tiling mode) for the given gradient object's fill. + * @param obj The given evas gradient object. + * @return The current spread mode of the gradient object. + * @ingroup Evas_Object_Gradient_Group + */ +EAPI int +evas_object_gradient_fill_spread_get(const Evas_Object *obj) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return EVAS_TEXTURE_REFLECT; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return EVAS_TEXTURE_REFLECT; + MAGIC_CHECK_END(); + return o->cur.fill.spread; +} + +/** + * Sets the angle at which the given evas gradient sits, + * relative to whatever intrinsic orientation of the grad type. + * Used mostly by 'linear' kinds of gradients. + * @param obj The given evas gradient object. + * @param angle Angle in degrees. Can be negative. + * @ingroup Evas_Object_Gradient_Group + */ +EAPI void +evas_object_gradient_angle_set(Evas_Object *obj, Evas_Angle angle) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return; + MAGIC_CHECK_END(); + if (angle == o->cur.map.angle) return; + o->cur.map.angle = angle; + o->gradient_changed = 1; + o->changed = 1; + evas_object_change(obj); +} + +/** + * Retrieves the angle at which the given evas gradient object sits + * rel to its intrinsic orientation. + * @param obj The given evas gradient object. + * @return The current angle if successful. @c 0.0 otherwise. + * @ingroup Evas_Object_Gradient_Group + */ +EAPI Evas_Angle +evas_object_gradient_angle_get(const Evas_Object *obj) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0.0; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return 0.0; + MAGIC_CHECK_END(); + return o->cur.map.angle; +} + +/** + * Sets the offset of the given evas gradient object's spectrum. + * @param obj The given evas gradient object. + * @param offset Values can be negative. + * @ingroup Evas_Object_Gradient_Group + */ +EAPI void +evas_object_gradient_offset_set(Evas_Object *obj, float offset) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return; + MAGIC_CHECK_END(); + if (offset == o->cur.map.offset) return; + o->cur.map.offset = offset; + o->changed = 1; + evas_object_change(obj); +} + +/** + * Retrieves the spectrum's offset + * @param obj The given evas gradient object. + * @return The current gradient offset if successful. @c 0.0 otherwise. + * @ingroup Evas_Object_Gradient_Group + */ +EAPI float +evas_object_gradient_offset_get(const Evas_Object *obj) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0.0; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return 0.0; + MAGIC_CHECK_END(); + return o->cur.map.offset; +} + +/** + * Sets the direction of the given evas gradient object's spectrum. + * @param obj The given evas gradient object. + * @param direction Values are either 1 (the default) or -1. + * @ingroup Evas_Object_Gradient_Group + */ +EAPI void +evas_object_gradient_direction_set(Evas_Object *obj, int direction) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return; + MAGIC_CHECK_END(); + if (direction == o->cur.map.direction) return; + o->cur.map.direction = direction; + o->changed = 1; + o->gradient_changed = 1; + evas_object_change(obj); +} + +/** + * Retrieves the evas gradient object's spectrum direction + * @param obj The given evas gradient object. + * @return The current gradient direction if successful. @c 1 otherwise. + * @ingroup Evas_Object_Gradient_Group + */ +EAPI int +evas_object_gradient_direction_get(const Evas_Object *obj) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return 0; + MAGIC_CHECK_END(); + return o->cur.map.direction; +} + +/** + * @defgroup Evas_Object_Gradient_Type_Group Gradient Object Type Functions + * + * Functions that set or get a gradient's geometric type. Examples are "linear", + * "linear.diag", "linear.codiag", "radial", "rectangular", "angular", "sinusoidal", ... + * Some types may accept additional parameters to further specify the look. + */ + +/** + * Sets the geometric type displayed by the given gradient object. + * @param obj The given gradient object. + * @param name Name of the geometric type that the gradient is to be drawn as. + * @param params List of allowable params that the given gradient type allows. + * Can be NULL. + * @ingroup Evas_Object_Gradient_Type_Group + */ +EAPI void +evas_object_gradient_type_set(Evas_Object *obj, const char *name, const char *params) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return; + MAGIC_CHECK_END(); + if (!name || !*name) + { + name = "linear"; + params = NULL; + } + if (params && !*params) + params = NULL; + if ((o->cur.type.name) && (!strcmp(o->cur.type.name, name))) + { + if ((!o->cur.type.params) && (!params)) + return; + if ((o->cur.type.params) && (params) && (!strcmp(o->cur.type.params, params))) + return; + if (o->cur.type.params) + { + if (o->prev.type.params == o->cur.type.params) + o->prev.type.params = strdup(o->cur.type.params); + free(o->cur.type.params); + o->cur.type.params = NULL; + } + if (params) + o->cur.type.params = strdup(params); + o->changed = 1; + o->gradient_changed = 1; + o->type_changed = 1; + evas_object_change(obj); + return; + } + + if (o->cur.type.name) + { + if (o->prev.type.name == o->cur.type.name) + o->prev.type.name = strdup(o->cur.type.name); + free(o->cur.type.name); + o->cur.type.name = NULL; + } + o->cur.type.name = strdup(name); + + if (o->cur.type.params) + { + if (o->prev.type.params == o->cur.type.params) + o->prev.type.params = strdup(o->cur.type.params); + free(o->cur.type.params); + o->cur.type.params = NULL; + } + if (params) + o->cur.type.params = strdup(params); + o->changed = 1; + o->gradient_changed = 1; + o->type_changed = 1; + evas_object_change(obj); +} + +/** + * Retrieves the type name and params of the given gradient object. + * @param obj The given gradient object. + * @param name Pointer to a character pointer to store the pointer to the type + * name in. + * @param params Pointer to a character pointer to store the pointer to the type + * params string in. + * @ingroup Evas_Object_Gradient_Type_Group + */ +EAPI void +evas_object_gradient_type_get(const Evas_Object *obj, char **name, char **params) +{ + Evas_Object_Gradient *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (name) *name = NULL; + if (params) *params = NULL; + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + if (name) *name = NULL; + if (params) *params = NULL; + return; + MAGIC_CHECK_END(); + if (name) *name = o->cur.type.name; + if (params) *params = o->cur.type.params; +} + + +/* + these two functions don't really belong here as they can apply to other + objs as well, but for now.. +*/ + +/** + FIXME: ... +**/ +EAPI void +evas_color_hsv_to_rgb(float h, float s, float v, int *r, int *g, int *b) +{ + evas_common_convert_color_hsv_to_rgb(h, s, v, r, g, b); +} + +/** + FIXME: ... +**/ +EAPI void +evas_color_rgb_to_hsv(int r, int g, int b, float *h, float *s, float *v) +{ + evas_common_convert_color_rgb_to_hsv(r, g, b, h, s, v); +} + +/** + FIXME: ... +**/ +EAPI void +evas_color_argb_premul(int a, int *r, int *g, int *b) +{ + evas_common_convert_color_argb_premul(a, r, g, b); +} + +/** + FIXME: ... +**/ +EAPI void +evas_color_argb_unpremul(int a, int *r, int *g, int *b) +{ + evas_common_convert_color_argb_unpremul(a, r, g, b); +} + +/** + FIXME: ... +**/ +EAPI void +evas_data_argb_premul(unsigned int *data, unsigned int len) +{ + if (!data || (len < 1)) return; + evas_common_convert_argb_premul(data, len); +} + +/** + FIXME: ... +**/ +EAPI void +evas_data_argb_unpremul(unsigned int *data, unsigned int len) +{ + if (!data || (len < 1)) return; + evas_common_convert_argb_unpremul(data, len); +} + + + +/* all nice and private */ +static void +evas_object_gradient_init(Evas_Object *obj) +{ + /* alloc grad ob, setup methods and default values */ + obj->object_data = evas_object_gradient_new(); + /* set up default settings for this kind of object */ + obj->cur.color.r = 255; + obj->cur.color.g = 255; + obj->cur.color.b = 255; + obj->cur.color.a = 255; + obj->cur.geometry.x = 0; + obj->cur.geometry.y = 0; + obj->cur.geometry.w = 0; + obj->cur.geometry.h = 0; + obj->cur.layer = 0; + obj->cur.anti_alias = 1; + obj->cur.interpolation_color_space = EVAS_COLOR_SPACE_ARGB; + obj->cur.render_op = EVAS_RENDER_BLEND; + /* set up object-specific settings */ + obj->prev = obj->cur; + /* set up methods (compulsory) */ + obj->func = &object_func; + obj->type = o_type; +} + +static void * +evas_object_gradient_new(void) +{ + Evas_Object_Gradient *o; + + /* alloc obj private data */ + o = calloc(1, sizeof(Evas_Object_Gradient)); + if (!o) return NULL; + o->magic = MAGIC_OBJ_GRADIENT; + o->cur.map.angle = 0.0; + o->cur.map.offset = 0.0; + o->cur.map.direction = 1; + o->cur.fill.x = 0; + o->cur.fill.y = 0; + o->cur.fill.w = 1; + o->cur.fill.h = 1; + o->cur.fill.angle = 0.0; + o->cur.fill.spread = EVAS_TEXTURE_REFLECT; + o->cur.type.name = strdup("linear"); + o->cur.type.params = NULL; + o->cur.gradient_opaque = 0; + o->prev = o->cur; + o->changed = 1; + o->gradient_changed = 1; + o->type_changed = 1; + return o; +} + +static void +evas_object_gradient_free(Evas_Object *obj) +{ + Evas_Object_Gradient *o; + + /* frees private object data. very simple here */ + o = (Evas_Object_Gradient *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Gradient, MAGIC_OBJ_GRADIENT); + return; + MAGIC_CHECK_END(); + /* free obj */ + if (o->prev.type.name && (o->prev.type.name != o->cur.type.name)) + free(o->prev.type.name); + if (o->prev.type.params && (o->prev.type.params != o->cur.type.params)) + free(o->prev.type.params); + if (o->cur.type.name) + free(o->cur.type.name); + if (o->cur.type.params) + free(o->cur.type.params); + if (o->engine_data) + obj->layer->evas->engine.func->gradient_free(obj->layer->evas->engine.data.output, + o->engine_data); + free(o); + obj->object_data = NULL; +} + + +static void +evas_object_grad_get_fill_coords(Evas_Object *obj, Evas_Coord fx, Evas_Coord fy, Evas_Coord fw, Evas_Coord fh, Evas_Coord *fx_ret, Evas_Coord *fy_ret, Evas_Coord *fw_ret, +Evas_Coord *fh_ret) +{ + Evas_Coord x, y, w, h; + + x = ((fx * obj->layer->evas->output.w) / + (Evas_Coord)obj->layer->evas->viewport.w); + w = ((fw * obj->layer->evas->output.w) / + (Evas_Coord)obj->layer->evas->viewport.w); + y = ((fy * obj->layer->evas->output.h) / + (Evas_Coord)obj->layer->evas->viewport.h); + h = ((fh * obj->layer->evas->output.h) / + (Evas_Coord)obj->layer->evas->viewport.h); + + if (w < 1) w = 1; + if (h < 1) h = 1; + + *fx_ret = x; *fw_ret = w; + *fy_ret = y; *fh_ret = h; +} + + + +static void +evas_object_gradient_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y) +{ + Evas_Object_Gradient *o; + + /* render object to surface with context, and offxet by x,y */ + o = (Evas_Object_Gradient *)(obj->object_data); + obj->layer->evas->engine.func->context_multiplier_unset(output, context); + obj->layer->evas->engine.func->context_anti_alias_set(output, context, obj->cur.anti_alias); + obj->layer->evas->engine.func->context_render_op_set(output, context, obj->cur.render_op); + if (o->engine_data) + { + obj->layer->evas->engine.func->gradient_draw(output, context, surface, + o->engine_data, + obj->cur.geometry.x + x, + obj->cur.geometry.y + y, + obj->cur.geometry.w, + obj->cur.geometry.h); +//// obj->cur.cache.geometry.x + x, +//// obj->cur.cache.geometry.y + y, +//// obj->cur.cache.geometry.w, +//// obj->cur.cache.geometry.h); + } +} + +static void +evas_object_gradient_render_pre(Evas_Object *obj) +{ + Evas_Rectangles rects = { 0, 0, NULL }; + Evas_Object_Gradient *o; + int is_v, was_v; + + /* dont pre-render the obj twice! */ + if (obj->pre_render_done) return; + obj->pre_render_done = 1; + /* pre-render phase. this does anything an object needs to do just before */ + /* rendering. this could mean loading the image data, retrieving it from */ + /* elsewhere, decoding video etc. */ + /* then when this is done the object needs to figure if it changed and */ + /* if so what and where and add the appropriate redraw rectangles */ + o = (Evas_Object_Gradient *)(obj->object_data); + /* if someone is clipping this obj - go calculate the clipper */ + if (obj->cur.clipper) + { + if (obj->cur.cache.clip.dirty) + evas_object_clip_recalc(obj->cur.clipper); + obj->cur.clipper->func->render_pre(obj->cur.clipper); + } + /* if it changed color */ + if ((obj->cur.color.r != obj->prev.color.r) || + (obj->cur.color.g != obj->prev.color.g) || + (obj->cur.color.b != obj->prev.color.b) || + (obj->cur.color.a != obj->prev.color.a)) + { o->gradient_changed = 1; o->changed = 1; } + if ((!o->gradient_changed) && ((obj->cur.cache.clip.r != obj->prev.cache.clip.r) || + (obj->cur.cache.clip.g != obj->prev.cache.clip.g) || + (obj->cur.cache.clip.b != obj->prev.cache.clip.b) || + (obj->cur.cache.clip.a != obj->prev.cache.clip.a))) + { o->gradient_changed = 1; o->changed = 1; } + if (!o->gradient_changed && (obj->cur.interpolation_color_space != obj->prev.interpolation_color_space)) + { o->gradient_changed = 1; o->changed = 1; } + if (!o->changed && (obj->cur.render_op != obj->prev.render_op)) + o->changed = 1; + if (!o->changed && (obj->cur.anti_alias != obj->prev.anti_alias)) + o->changed = 1; + if (o->changed && o->engine_data) + { + Evas_Coord fx, fy, fw, fh; + + evas_object_grad_get_fill_coords(obj, o->cur.fill.x, o->cur.fill.y, + o->cur.fill.w, o->cur.fill.h, + &fx, &fy, &fw, &fh); + obj->layer->evas->engine.func->gradient_fill_set(obj->layer->evas->engine.data.output, o->engine_data, + fx, fy, fw, fh); + obj->layer->evas->engine.func->gradient_fill_angle_set(obj->layer->evas->engine.data.output, o->engine_data, + o->cur.fill.angle); + obj->layer->evas->engine.func->gradient_fill_spread_set(obj->layer->evas->engine.data.output, o->engine_data, + o->cur.fill.spread); + obj->layer->evas->engine.func->gradient_angle_set(obj->layer->evas->engine.data.output, o->engine_data, + o->cur.map.angle); + obj->layer->evas->engine.func->gradient_direction_set(obj->layer->evas->engine.data.output, o->engine_data, + o->cur.map.direction); + obj->layer->evas->engine.func->gradient_offset_set(obj->layer->evas->engine.data.output, o->engine_data, + o->cur.map.offset); + if (o->type_changed) + obj->layer->evas->engine.func->gradient_type_set(obj->layer->evas->engine.data.output, o->engine_data, + o->cur.type.name, o->cur.type.params); + + obj->layer->evas->engine.func->context_anti_alias_set(obj->layer->evas->engine.data.output, + obj->layer->evas->engine.data.context, + obj->cur.anti_alias); + obj->layer->evas->engine.func->context_render_op_set(obj->layer->evas->engine.data.output, + obj->layer->evas->engine.data.context, obj->cur.render_op); + obj->layer->evas->engine.func->context_multiplier_set(obj->layer->evas->engine.data.output, + obj->layer->evas->engine.data.context, + obj->cur.cache.clip.r, obj->cur.cache.clip.g, + obj->cur.cache.clip.b, obj->cur.cache.clip.a); + obj->layer->evas->engine.func->context_color_interpolation_set(obj->layer->evas->engine.data.output, + obj->layer->evas->engine.data.context, + obj->cur.interpolation_color_space); + if (o->gradient_changed) + obj->layer->evas->engine.func->gradient_render_pre(obj->layer->evas->engine.data.output, + obj->layer->evas->engine.data.context, + o->engine_data); + o->cur.gradient_opaque = obj->layer->evas->engine.func->gradient_is_opaque(obj->layer->evas->engine.data.output, + obj->layer->evas->engine.data.context, + o->engine_data, + obj->cur.cache.clip.x, obj->cur.cache.clip.y, + obj->cur.cache.clip.w, obj->cur.cache.clip.h); + + if (obj->cur.cache.clip.a != 255) + o->cur.gradient_opaque = 0; + } + /* now figure what changed and add draw rects */ + /* if it just became visible or invisible */ + is_v = evas_object_is_visible(obj); + was_v = evas_object_was_visible(obj); + if (is_v != was_v) + { + evas_object_render_pre_visible_change(&rects, obj, is_v, was_v); + goto done; + } + /* its not visible - we accounted for it appearing or not so just abort */ + if (!is_v) goto done; + /* clipper changed this is in addition to anything else for obj */ + evas_object_render_pre_clipper_change(&rects, obj); + /* gradient changed */ + if (o->changed || obj->restack) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + /* if it changed geometry */ + if ((obj->cur.geometry.x != obj->prev.geometry.x) || + (obj->cur.geometry.y != obj->prev.geometry.y) || + (obj->cur.geometry.w != obj->prev.geometry.w) || + (obj->cur.geometry.h != obj->prev.geometry.h)) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + /* it obviously didn't change - add a NO obscure - this "unupdates" this */ + /* area so if there were updates for it they get wiped. don't do it if we */ + /* arent fully opaque and we are visible */ + + if (evas_object_is_visible(obj) && + evas_object_is_opaque(obj)) + obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output, + obj->cur.cache.clip.x, + obj->cur.cache.clip.y, + obj->cur.cache.clip.w, + obj->cur.cache.clip.h); + + done: + evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v); +} + +static void +evas_object_gradient_render_post(Evas_Object *obj) +{ + Evas_Object_Gradient *o; + + /* this moves the current data to the previous state parts of the object */ + /* in whatever way is safest for the object. also if we don't need object */ + /* data anymore we can free it if the object deems this is a good idea */ + o = (Evas_Object_Gradient *)(obj->object_data); + /* remove those pesky changes */ + while (obj->clip.changes) + { + Evas_Rectangle *r; + + r = (Evas_Rectangle *)obj->clip.changes->data; + obj->clip.changes = evas_list_remove(obj->clip.changes, r); + free(r); + } + /* move cur to prev safely for object data */ + obj->prev = obj->cur; + if (o->prev.type.name && (o->prev.type.name != o->cur.type.name)) + free(o->prev.type.name); + if (o->prev.type.params && (o->prev.type.params != o->cur.type.params)) + free(o->prev.type.params); + o->prev = o->cur; + o->changed = 0; + o->gradient_changed = 0; + o->type_changed = 0; +} + +static int +evas_object_gradient_is_opaque(Evas_Object *obj) +{ + Evas_Object_Gradient *o; + + /* this returns 1 if the internal object data implies that the object is */ + /* currently fully opaque over the entire region it occupies */ + o = (Evas_Object_Gradient *)(obj->object_data); + if (!o->engine_data) return 0; + return o->cur.gradient_opaque; + } + +static int +evas_object_gradient_was_opaque(Evas_Object *obj) +{ + Evas_Object_Gradient *o; + + /* this returns 1 if the internal object data implies that the object was */ + /* currently fully opaque over the entire region it occupies */ + o = (Evas_Object_Gradient *)(obj->object_data); + if (!o->engine_data) return 0; + return o->prev.gradient_opaque; +} diff --git a/src/lib/canvas/evas_object_image.c b/src/lib/canvas/evas_object_image.c new file mode 100644 index 0000000..487350c --- /dev/null +++ b/src/lib/canvas/evas_object_image.c @@ -0,0 +1,2463 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_private.h" +#include "../engines/common/evas_convert_color.h" +#include "../engines/common/evas_convert_colorspace.h" +#include "../engines/common/evas_convert_yuv.h" + +/* private magic number for image objects */ +static const char o_type[] = "image"; + +/* private struct for rectangle object internal data */ +typedef struct _Evas_Object_Image Evas_Object_Image; + +struct _Evas_Object_Image +{ + DATA32 magic; + + struct { + Evas_Coord_Rectangle fill; + struct { + short w, h, stride; + } image; + struct { + short l, r, t, b; + unsigned char fill; + } border; + + const char *file; + const char *key; + int cspace; + + unsigned char smooth_scale : 1; + unsigned char has_alpha :1; + } cur, prev; + + int pixels_checked_out; + int load_error; + Evas_List *pixel_updates; + + struct { + unsigned char scale_down_by; + double dpi; + short w, h; + } load_opts; + + struct { + void (*get_pixels) (void *data, Evas_Object *o); + void *get_pixels_data; + } func; + + void *engine_data; + + unsigned char changed : 1; + unsigned char dirty_pixels : 1; +}; + +/* private methods for image objects */ +static void evas_object_image_unload(Evas_Object *obj); +static void evas_object_image_load(Evas_Object *obj); +static Evas_Coord evas_object_image_figure_x_fill(Evas_Object *obj, Evas_Coord start, Evas_Coord size, Evas_Coord *size_ret); +static Evas_Coord evas_object_image_figure_y_fill(Evas_Object *obj, Evas_Coord start, Evas_Coord size, Evas_Coord *size_ret); + +static void evas_object_image_init(Evas_Object *obj); +static void *evas_object_image_new(void); +static void evas_object_image_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y); +static void evas_object_image_free(Evas_Object *obj); +static void evas_object_image_render_pre(Evas_Object *obj); +static void evas_object_image_render_post(Evas_Object *obj); + +static int evas_object_image_is_opaque(Evas_Object *obj); +static int evas_object_image_was_opaque(Evas_Object *obj); +static int evas_object_image_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y); + +static void *evas_object_image_data_convert_internal(Evas_Object_Image *o, void *data, Evas_Colorspace to_cspace); + +static const Evas_Object_Func object_func = +{ + /* methods (compulsory) */ + evas_object_image_free, + evas_object_image_render, + evas_object_image_render_pre, + evas_object_image_render_post, + /* these are optional. NULL = nothing */ + NULL, + NULL, + NULL, + NULL, + evas_object_image_is_opaque, + evas_object_image_was_opaque, + evas_object_image_is_inside, + NULL, + NULL +}; + +/** + * @defgroup Evas_Object_Image Image Object Functions + * + * Functions used to create and manipulate image objects. + * + * Note - Image objects may return or accept "image data" in multiple formats. + * This is based on the colorspace of an object. Here is a rundown on formats: + * + * EVAS_COLORSPACE_ARGB8888: + * + * This pixel format is a linear block of pixels, starting at the top-left row + * by row until the bottom right of the image or pixel region. All pixels are + * 32-bit unsigned int's with the high-byte being alpha and the low byte being + * blue in the format ARGB. Alpha may or may not be used by evas depending on + * the alpha flag of the image, but if not used, should be set to 0xff anyway. + * + * This colorspace uses premultiplied alpha. That means that R, G and B cannot + * exceed A in value. The conversion from non-premultiplied colorspace is: + * + * R = (r * a) / 255; G = (g * a) / 255; B = (b * a) / 255; + * + * So 50% transparent blue will be: 0x80000080. This will not be "dark" - just + * 50% transparent. Values are 0 == black, 255 == solid or full red, green or + * blue. + * + * EVAS_COLORSPACE_YCBCR422P601_PL: + * + * This is a pointer-list indirected set of YUV (YCbCr) pixel data. This means + * that the data returned or set is not actual pixel data, but pointers TO + * lines of pixel data. The list of pointers will first be N rows of pointers + * to the Y plane - pointing to the first pixel at the start of each row in + * the Y plane. N is the height of the image data in pixels. Each pixel in the + * Y, U and V planes is 1 byte exactly, packed. The next N / 2 pointers will + * point to rows in the U plane, and the next N / 2 pointers will point to + * the V plane rows. U and V planes are half the horizontal and vertical + * resolution of the U plane. + * + * Row order is top to bottom and row pixels are stored left to right. + * + * There is a limitation that these images MUST be a multiple of 2 pixels in + * size horizontally or vertically. This is due to the U and V planes being + * half resolution. Also note that this assumes the itu601 YUV colorspace + * specification. This is defined for standard television and mpeg streams. + * HDTV may use the itu709 specification. + * + * Values are 0 to 255, indicating full or no signal in that plane + * respectively. + * + * EVAS_COLORSPACE_YCBCR422P709_PL: + * + * Not implemented yet. + * + * EVAS_COLORSPACE_RGB565_A5P: + * + * In the process of being implemented in 1 engine only. This may change. + * + * This is a pointer to image data for 16-bit half-word pixel data in 16bpp + * RGB 565 format (5 bits red, 6 bits green, 5 bits blue), with the high-byte + * containing red and the low byte containing blue, per pixel. This data is + * packed row by row from the top-left to the bottom right. + * + * If the image has an alpha channel enabled there will be an extra alpha plane + * after the color pixel plane. If not, then this data will not exist and + * should not be accessed in any way. This plane is a set of pixels with 1 + * byte per pixel defining the alpha values of all pixels in the image from + * the top-left to the bottom right of the image, row by row. Even though + * the values of the alpha pixels can be 0 to 255, only values 0 through to 32 + * are used, 32 being solid and 0 being transparent. + * + * RGB values can be 0 to 31 for red and blue and 0 to 63 for green, with 0 + * being black and 31 or 63 being full red, green or blue respectively. This + * colorspace is also pre-multiplied like EVAS_COLORSPACE_ARGB8888 so: + * + * R = (r * a) / 32; G = (g * a) / 32; B = (b * a) / 32; + */ + +/** + * Creates a new image object on the given evas. + * + * @param e The given evas. + * @return The created image object. + * @ingroup Evas_Object_Image + */ +EAPI Evas_Object * +evas_object_image_add(Evas *e) +{ + Evas_Object *obj; + Evas_Object_Image *o; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + obj = evas_object_new(); + evas_object_image_init(obj); + evas_object_inject(obj, e); + o = (Evas_Object_Image *)(obj->object_data); + o->cur.cspace = obj->layer->evas->engine.func->image_colorspace_get(obj->layer->evas->engine.data.output, + o->engine_data); + return obj; +} + +/** + * @defgroup Evas_Object_Image_File_Group Image Object File Functions + * + * Functions that write to or retrieve images from files. + */ + +/** + * Sets the filename and key of the given image object. + * + * If the file supports multiple data stored in it as eet, + * you can specify the key to be used as the index of the + * image in this file. + * + * @param obj The given image object. + * @param file The image filename. + * @param key The image key in file, or NULL. + * @ingroup Evas_Object_Image_File_Group + */ +EAPI void +evas_object_image_file_set(Evas_Object *obj, const char *file, const char *key) +{ + Evas_Object_Image *o; + Evas_Image_Load_Opts lo; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + if ((o->cur.file) && (file) && (!strcmp(o->cur.file, file))) + { + if ((!o->cur.key) && (!key)) + return; + if ((o->cur.key) && (key) && (!strcmp(o->cur.key, key))) + return; + } + if (o->cur.file) evas_stringshare_del(o->cur.file); + if (o->cur.key) evas_stringshare_del(o->cur.key); + if (file) o->cur.file = evas_stringshare_add(file); + else o->cur.file = NULL; + if (key) o->cur.key = evas_stringshare_add(key); + else o->cur.key = NULL; + o->prev.file = NULL; + o->prev.key = NULL; + if (o->engine_data) + obj->layer->evas->engine.func->image_free(obj->layer->evas->engine.data.output, + o->engine_data); + o->load_error = EVAS_LOAD_ERROR_NONE; + lo.scale_down_by = o->load_opts.scale_down_by; + lo.dpi = o->load_opts.dpi; + lo.w = o->load_opts.w; + lo.h = o->load_opts.h; + o->engine_data = obj->layer->evas->engine.func->image_load(obj->layer->evas->engine.data.output, + o->cur.file, + o->cur.key, + &o->load_error, + &lo); + if (o->engine_data) + { + int w, h; + int stride; + + obj->layer->evas->engine.func->image_size_get(obj->layer->evas->engine.data.output, + o->engine_data, &w, &h); + if (obj->layer->evas->engine.func->image_stride_get) + obj->layer->evas->engine.func->image_stride_get(obj->layer->evas->engine.data.output, + o->engine_data, &stride); + else + stride = w; + o->cur.has_alpha = obj->layer->evas->engine.func->image_alpha_get(obj->layer->evas->engine.data.output, + o->engine_data); + o->cur.cspace = obj->layer->evas->engine.func->image_colorspace_get(obj->layer->evas->engine.data.output, + o->engine_data); + o->cur.image.w = w; + o->cur.image.h = h; + o->cur.image.stride = stride; + } + else + { + o->load_error = EVAS_LOAD_ERROR_GENERIC; + o->cur.has_alpha = 1; + o->cur.cspace = EVAS_COLORSPACE_ARGB8888; + o->cur.image.w = 0; + o->cur.image.h = 0; + o->cur.image.stride = 0; + } + o->changed = 1; + evas_object_change(obj); +} + +/** + * Retrieves the filename and key of the given image object. + * + * @param obj The given image object. + * @param file Location to store the image filename, or NULL. + * @param key Location to store the image key, or NULL. + * @ingroup Evas_Object_Image_File_Group + */ +EAPI void +evas_object_image_file_get(const Evas_Object *obj, const char **file, const char **key) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (file) *file = NULL; + if (key) *key = NULL; + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + if (file) *file = NULL; + if (key) *key = NULL; + return; + MAGIC_CHECK_END(); + if (file) *file = o->cur.file; + if (key) *key = o->cur.key; +} + +/** + * @defgroup Evas_Object_Image_Border_Group Image Object Border Functions + * + * Functions that adjust the unscaled image border of image objects. + */ + +/** + * Sets how much of each border of the given image object is not + * to be scaled. + * + * When rendering, the image may be scaled to fit the size of the + * image object. This function sets what area around the border of + * the image is not to be scaled. This sort of function is useful for + * widget theming, where, for example, buttons may be of varying + * sizes, but the border size must remain constant. + * + * The units used for @p l, @p r, @p t and @p b are output units. + * + * @param obj The given image object. + * @param l Distance of the left border that is not to be stretched. + * @param r Distance of the right border that is not to be stretched. + * @param t Distance of the top border that is not to be stretched. + * @param b Distance of the bottom border that is not to be stretched. + * @ingroup Evas_Object_Image_Border_Group + */ +EAPI void +evas_object_image_border_set(Evas_Object *obj, int l, int r, int t, int b) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + if (l < 0) l = 0; + if (r < 0) r = 0; + if (t < 0) t = 0; + if (b < 0) b = 0; + if ((o->cur.border.l == l) && + (o->cur.border.r == r) && + (o->cur.border.t == t) && + (o->cur.border.b == b)) return; + o->cur.border.l = l; + o->cur.border.r = r; + o->cur.border.t = t; + o->cur.border.b = b; + o->changed = 1; + evas_object_change(obj); +} + +/** + * Retrieves how much of each border of the given image object is not to + * be scaled. + * + * See @ref evas_object_image_border_set for more details. + * + * @param obj The given image object. + * @param l Location to store the left border width in, or NULL. + * @param r Location to store the right border width in, or NULL. + * @param t Location to store the top border width in, or NULL. + * @param b Location to store the bottom border width in, or NULL. + * @ingroup Evas_Object_Image_Border_Group + */ +EAPI void +evas_object_image_border_get(const Evas_Object *obj, int *l, int *r, int *t, int *b) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (l) *l = 0; + if (r) *r = 0; + if (t) *t = 0; + if (b) *b = 0; + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + if (l) *l = 0; + if (r) *r = 0; + if (t) *t = 0; + if (b) *b = 0; + return; + MAGIC_CHECK_END(); + if (l) *l = o->cur.border.l; + if (r) *r = o->cur.border.r; + if (t) *t = o->cur.border.t; + if (b) *b = o->cur.border.b; +} + +/** + * @defgroup Evas_Object_Image_Fill_Group Image Object Fill Rectangle Functions + * + * Functions that deal with what areas of the image object are to be + * tiled with the given image. + */ + +/** + * Sets if the center part of the given image object (not the border) + * should be drawn. + * + * When rendering, the image may be scaled to fit the size of the + * image object. This function sets if the center part of the scaled image + * is to be drawn or left completely blank. Very useful for frames and + * decorations. + * + * @param obj The given image object. + * @param fill Whether the center should be drawn. + * @ingroup Evas_Object_Image_Fill_Group + */ +EAPI void +evas_object_image_border_center_fill_set(Evas_Object *obj, Evas_Bool fill) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + if (((o->cur.border.fill) && (fill)) || + ((!o->cur.border.fill) && (!fill))) + return; + o->cur.border.fill = fill; + o->changed = 1; + evas_object_change(obj); +} + +/** + * Retrieves if the center of the given image object is to be drawn + * or not. + * + * See @ref evas_object_image_fill_set for more details. + * + * @param obj The given image object. + * @return If the center is to be drawn or not. + * @ingroup Evas_Object_Image_Fill_Group + */ +EAPI Evas_Bool +evas_object_image_border_center_fill_get(const Evas_Object *obj) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return 0; + MAGIC_CHECK_END(); + return o->cur.border.fill; +} + +/** + * Sets the rectangle of the given image object that the image will + * be drawn to. + * + * Note that the image will be tiled around this one rectangle. To have + * only one copy of the image drawn, @p x and @p y must be 0 and @p w + * and @p h need to be the width and height of the image object + * respectively. + * + * The default values for the fill parameters is @p x = 0, @p y = 0, + * @p w = 32 and @p h = 32. + * + * @param obj The given image object. + * @param x The X coordinate for the top left corner of the image. + * @param y The Y coordinate for the top left corner of the image. + * @param w The width of the image. + * @param h The height of the image. + * @ingroup Evas_Object_Image_Fill_Group + */ +EAPI void +evas_object_image_fill_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) +{ + Evas_Object_Image *o; + + if (w < 0) w = -w; + if (h < 0) h = -h; + if (w == 0.0) return; + if (h == 0.0) return; + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + if ((o->cur.fill.x == x) && + (o->cur.fill.y == y) && + (o->cur.fill.w == w) && + (o->cur.fill.h == h)) return; + o->cur.fill.x = x; + o->cur.fill.y = y; + o->cur.fill.w = w; + o->cur.fill.h = h; + o->changed = 1; + evas_object_change(obj); +} + +/** + * Retrieves the dimensions of the rectangle of the given image object + * that the image will be drawn to. + * + * See @ref evas_object_image_fill_set for more details. + * + * @param obj The given image object. + * @param x Location to store the X coordinate for the top left corner of the image in, or NULL. + * @param y Location to store the Y coordinate for the top left corner of the image in, or NULL. + * @param w Location to store the width of the image in, or NULL. + * @param h Location to store the height of the image in, or NULL. + * @ingroup Evas_Object_Image_Fill_Group + */ +EAPI void +evas_object_image_fill_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (x) *x = 0; + if (y) *y = 0; + if (w) *w = 0; + if (h) *h = 0; + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + if (x) *x = 0; + if (y) *y = 0; + if (w) *w = 0; + if (h) *h = 0; + return; + MAGIC_CHECK_END(); + if (x) *x = o->cur.fill.x; + if (y) *y = o->cur.fill.y; + if (w) *w = o->cur.fill.w; + if (h) *h = o->cur.fill.h; +} + +/** + * @defgroup Evas_Object_Image_Size Image Object Image Size Functions + * + * Functions that change the size of the image used by an image object. + */ + +/** + * Sets the size of the given image object. + * + * This function will scale down or crop the image so that it is + * treated as if it were at the given size. If the size given is + * smaller than the image, it will be cropped. If the size given is + * larger, then the image will be treated as if it were in the upper + * left hand corner of a larger image that is otherwise transparent. + * + * @param obj The given image object. + * @param w The new width of the image. + * @param h The new height of the image. + * @ingroup Evas_Object_Image_Size + */ +EAPI void +evas_object_image_size_set(Evas_Object *obj, int w, int h) +{ + Evas_Object_Image *o; + int stride; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + if (w < 1) w = 1; + if (h < 1) h = 1; + if (w > 32768) return; + if (h > 32768) return; + if ((w == o->cur.image.w) && + (h == o->cur.image.h)) return; + o->cur.image.w = w; + o->cur.image.h = h; + if (o->engine_data) + o->engine_data = obj->layer->evas->engine.func->image_size_set(obj->layer->evas->engine.data.output, + o->engine_data, + w, h); + else + o->engine_data = obj->layer->evas->engine.func->image_new_from_copied_data + (obj->layer->evas->engine.data.output, w, h, NULL, o->cur.has_alpha, + o->cur.cspace); + + if (obj->layer->evas->engine.func->image_stride_get) + obj->layer->evas->engine.func->image_stride_get(obj->layer->evas->engine.data.output, + o->engine_data, &stride); + else + stride = w; + o->cur.image.stride = stride; + +/* FIXME - in engine call above + if (o->engine_data) + o->engine_data = obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output, + o->engine_data, + o->cur.has_alpha); +*/ + EVAS_OBJECT_IMAGE_FREE_FILE_AND_KEY(o); + o->changed = 1; + evas_object_change(obj); +} + +/** + * Retrieves the size of the given image object. + * + * See @ref evas_object_image_size_set for more details. + * + * @param obj The given image object. + * @param w Location to store the width of the image in, or NULL. + * @param h Location to store the height of the image in, or NULL. + * @ingroup Evas_Object_Image_Size + */ +EAPI void +evas_object_image_size_get(const Evas_Object *obj, int *w, int *h) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (w) *w = 0; + if (h) *h = 0; + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + if (w) *w = 0; + if (h) *h = 0; + return; + MAGIC_CHECK_END(); + if (w) *w = o->cur.image.w; + if (h) *h = o->cur.image.h; +} + +/** + * Retrieves the row stride of the given image object, + * + * The row stride is the number of units between the start of a + * row and the start of the next row. + * + * @param obj The given image object. + * @return The stride of the image. + * @ingroup Evas_Object_Image_Size + */ +EAPI int +evas_object_image_stride_get(const Evas_Object *obj) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return 0; + MAGIC_CHECK_END(); + return o->cur.image.stride; +} + +/** + * Retrieves a number representing any error that occurred during the last + * load of the given image object. + * + * @param obj The given image object. + * @return A value giving the last error that occurred. It should be one of + * the @c EVAS_LOAD_ERROR_* values. @c EVAS_LOAD_ERROR_NONE is + * returned if there was no error. + * @ingroup Evas_Object_Image + */ +EAPI int +evas_object_image_load_error_get(const Evas_Object *obj) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return 0; + MAGIC_CHECK_END(); + return o->load_error; +} + +/** + * @defgroup Evas_Object_Image_Data Image Object Image Data Functions + * + * Functions that allow you to access or modify the image pixel data of an + * image object. + */ + +/** + * Converts the raw image data of the given image object to the + * specified colorspace. + * + * Note that this function does not modify the raw image data. + * If the requested colorspace is the same as the image colorspace + * nothing is done and NULL is returned. You should use + * evas_object_image_colorspace_get() to check the current image + * colorspace. + * + * See @ref evas_object_image_colorspace_get. + * + * @param obj The given image object. + * @param to_cspace The colorspace to which the image raw data will be converted. + * @return data A newly allocated data in the format specified by to_cspace. + * @ingroup Evas_Object_Image_Data + */ +EAPI void * +evas_object_image_data_convert(Evas_Object *obj, Evas_Colorspace to_cspace) +{ + Evas_Object_Image *o; + DATA32 *data; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return NULL; + MAGIC_CHECK_END(); + if (!o->engine_data) return NULL; + if (!o->cur.cspace == to_cspace) return NULL; + data = NULL; + o->engine_data = obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output, + o->engine_data, + 0, + &data); + return evas_object_image_data_convert_internal(o, data, to_cspace); +} + +/** + * Sets the raw image data of the given image object. + * + * Note that the raw data must be of the same size and colorspace + * of the image. If data is NULL the current image data will be freed. + * + * @param obj The given image object. + * @param data The raw data, or NULL. + * @ingroup Evas_Object_Image_Data + */ +EAPI void +evas_object_image_data_set(Evas_Object *obj, void *data) +{ + Evas_Object_Image *o; + void *p_data; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + p_data = o->engine_data; + if (data) + { + if (o->engine_data) + o->engine_data = obj->layer->evas->engine.func->image_data_put(obj->layer->evas->engine.data.output, + o->engine_data, + data); + else + o->engine_data = obj->layer->evas->engine.func->image_new_from_data(obj->layer->evas->engine.data.output, + o->cur.image.w, + o->cur.image.h, + data, + o->cur.has_alpha, + o->cur.cspace); + } + else + { + if (o->engine_data) + obj->layer->evas->engine.func->image_free(obj->layer->evas->engine.data.output, + o->engine_data); + o->load_error = EVAS_LOAD_ERROR_NONE; + o->cur.image.w = 0; + o->cur.image.h = 0; + o->cur.image.stride = 0; + o->engine_data = NULL; + } +/* FIXME - in engine call above + if (o->engine_data) + o->engine_data = obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output, + o->engine_data, + o->cur.has_alpha); +*/ + if (o->pixels_checked_out > 0) o->pixels_checked_out--; + if (p_data != o->engine_data) + { + EVAS_OBJECT_IMAGE_FREE_FILE_AND_KEY(o); + o->pixels_checked_out = 0; + } + o->changed = 1; + evas_object_change(obj); +} + +/** + * Get a pointer to the raw image data of the given image object. + * + * This function returns a pointer to an image object's internal pixel buffer, + * for reading only or read/write. If you request it for writing, the image + * will be marked dirty so that it gets redrawn at the next update. + * + * This is best suited when you want to modify an existing image, + * without changing its dimensions. + * + * @param obj The given image object. + * @param for_writing Whether the data being retrieved will be modified. + * @return The raw image data. + * @ingroup Evas_Object_Image_Data + */ +EAPI void * +evas_object_image_data_get(const Evas_Object *obj, Evas_Bool for_writing) +{ + Evas_Object_Image *o; + DATA32 *data; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return NULL; + MAGIC_CHECK_END(); + if (!o->engine_data) return NULL; + data = NULL; + o->engine_data = obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output, + o->engine_data, + for_writing, + &data); + o->pixels_checked_out++; + if (for_writing) + { + EVAS_OBJECT_IMAGE_FREE_FILE_AND_KEY(o); + } + + return data; +} + +/** + * Replaces the raw image data of the given image object. + * + * This function lets the application replace an image object's internal pixel + * buffer with a user-allocated one. For best results, you should generally + * first call evas_object_image_size_set() with the width and height for the + * new buffer. + * + * This call is best suited for when you will be using image data with + * different dimensions than the existing image data, if any. If you only need + * to modify the existing image in some fashion, then using + * evas_object_image_data_get() is probably what you are after. + * + * Note that the caller is responsible for freeing the buffer when finished + * with it, as user-set image data will not be automatically freed when the + * image object is deleted. + * + * See @ref evas_object_image_data_get for more details. + * + * @param obj The given image object. + * @param data The raw data. + * @ingroup Evas_Object_Image_Data + */ +EAPI void +evas_object_image_data_copy_set(Evas_Object *obj, void *data) +{ + Evas_Object_Image *o; + + if (!data) return; + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + if ((o->cur.image.w <= 0) || + (o->cur.image.h <= 0)) return; + if (o->engine_data) + obj->layer->evas->engine.func->image_free(obj->layer->evas->engine.data.output, + o->engine_data); + o->engine_data = obj->layer->evas->engine.func->image_new_from_copied_data(obj->layer->evas->engine.data.output, + o->cur.image.w, + o->cur.image.h, + data, + o->cur.has_alpha, + o->cur.cspace); + if (o->engine_data) + o->engine_data = obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output, + o->engine_data, + o->cur.has_alpha); + o->pixels_checked_out = 0; + EVAS_OBJECT_IMAGE_FREE_FILE_AND_KEY(o); +} + +/** + * Mark a sub-region of the given image object to be redrawn. + * + * This function schedules a particular rectangular region of an image + * object to be updated (redrawn) at the next render. + * + * @param obj The given image object. + * @param x X-offset of the region to be updated. + * @param y Y-offset of the region to be updated. + * @param w Width of the region to be updated. + * @param h Height of the region to be updated. + * @ingroup Evas_Object_Image_Data + */ +EAPI void +evas_object_image_data_update_add(Evas_Object *obj, int x, int y, int w, int h) +{ + Evas_Object_Image *o; + Evas_Rectangle *r; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, o->cur.image.w, o->cur.image.h); + if ((w <= 0) || (h <= 0)) return; + NEW_RECT(r, x, y, w, h); + if (r) o->pixel_updates = evas_list_append(o->pixel_updates, r); + o->changed = 1; + evas_object_change(obj); +} + +/** + * @defgroup Evas_Object_Image_Alpha Image Object Image Alpha Functions + * + * Functions that change the alpha of an image object. + */ + +/** + * Enable or disable alpha channel of the given image object. + * + * This function sets a flag on an image object indicating whether or not to + * use alpha channel data. A value of 1 indicates to use alpha channel data, + * and 0 indicates to ignore any alpha channel data. Note that this has + * nothing to do with an object's color as manipulated by + * evas_object_color_set(). + * + * @param obj The given image object. + * @param has_alpha Whether to use alpha channel data or not. + * @ingroup Evas_Object_Image_Alpha + */ +EAPI void +evas_object_image_alpha_set(Evas_Object *obj, Evas_Bool has_alpha) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + if (((has_alpha) && (o->cur.has_alpha)) || + ((!has_alpha) && (!o->cur.has_alpha))) + return; + o->cur.has_alpha = has_alpha; + if (o->engine_data) + o->engine_data = obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output, + o->engine_data, + o->cur.has_alpha); + evas_object_image_data_update_add(obj, 0, 0, o->cur.image.w, o->cur.image.h); + EVAS_OBJECT_IMAGE_FREE_FILE_AND_KEY(o); +} + + +/** + * Retrieves the alpha channel setting of the given image object. + * + * This function returns 1 if the image object's alpha channel is being used, + * or 0 otherwise. + * + * See @ref evas_object_image_alpha_set for more details. + * + * @param obj The given image object. + * @return Whether the alpha channel data is being used. + * @ingroup Evas_Object_Image_Alpha + */ +EAPI Evas_Bool +evas_object_image_alpha_get(const Evas_Object *obj) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return 0; + MAGIC_CHECK_END(); + return o->cur.has_alpha; +} + +/** + * @defgroup Evas_Object_Image_Scale Image Object Image Scaling Functions + * + * Functions that change the scaling quality of an image object. + */ + +/** + * Sets whether to use of high-quality image scaling algorithm + * of the given image object. + * + * When enabled, a higher quality image scaling algorithm is used when scaling + * images to sizes other than the source image. This gives better results but + * is more computationally expensive. + * + * @param obj The given image object. + * @param smooth_scale Whether to use smooth scale or not. + * @ingroup Evas_Object_Image_Scale + */ +EAPI void +evas_object_image_smooth_scale_set(Evas_Object *obj, Evas_Bool smooth_scale) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + if (((smooth_scale) && (o->cur.smooth_scale)) || + ((!smooth_scale) && (!o->cur.smooth_scale))) + return; + o->cur.smooth_scale = smooth_scale; +} + +/** + * Retrieves whether the given image object is using use a high-quality + * image scaling algorithm. + * + * See @ref evas_object_image_smooth_scale_set for more details. + * + * @param obj The given image object. + * @return Whether smooth scale is being used. + * @ingroup Evas_Object_Image_Scale + */ +EAPI Evas_Bool +evas_object_image_smooth_scale_get(const Evas_Object *obj) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return 0; + MAGIC_CHECK_END(); + return o->cur.smooth_scale; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_image_reload(Evas_Object *obj) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + if ((!o->cur.file) || + (o->pixels_checked_out > 0)) return; + if (o->engine_data) + o->engine_data = obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output, o->engine_data, 0, 0, o->cur.image.w, o->cur.image.h); + evas_object_image_unload(obj); + evas_object_image_load(obj); + o->changed = 1; + evas_object_change(obj); +} + +/** + * Save the given image object to a file. + * + * Note that you should pass the filename extension when saving. + * If the file supports multiple data stored in it as eet, + * you can specify the key to be used as the index of the + * image in this file. + * + * You can specify some flags when saving the image. + * Currently acceptable flags are quality and compress. + * Eg.: "quality=100 compress=9" + * + * @param obj The given image object. + * @param file The filename to be used to save the image. + * @param key The image key in file, or NULL. + * @param flags String containing the flags to be used. + * @ingroup Evas_Object_Image + */ +EAPI Evas_Bool +evas_object_image_save(const Evas_Object *obj, const char *file, const char *key, const char *flags) +{ + Evas_Object_Image *o; + DATA32 *data = NULL; + int quality = 80, compress = 9, ok = 0; + RGBA_Image *im; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return 0; + MAGIC_CHECK_END(); + + if (!o->engine_data) return 0; + o->engine_data = obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output, + o->engine_data, + 0, + &data); + if (flags) + { + char *p, *pp; + char *tflags; + + tflags = alloca(strlen(flags) + 1); + strcpy(tflags, flags); + p = tflags; + while (p) + { + pp = strchr(p, ' '); + if (pp) *pp = 0; + sscanf(p, "quality=%i", &quality); + sscanf(p, "compress=%i", &compress); + if (pp) p = pp + 1; + else break; + } + } + im = (RGBA_Image*) evas_cache_image_data(evas_common_image_cache_get(), + o->cur.image.w, + o->cur.image.h, + data, + o->cur.has_alpha, + EVAS_COLORSPACE_ARGB8888); + if (im) + { + if (o->cur.cspace == EVAS_COLORSPACE_ARGB8888) + im->image.data = data; + else + im->image.data = evas_object_image_data_convert_internal(o, + data, + EVAS_COLORSPACE_ARGB8888); + if (im->image.data) + { + ok = evas_common_save_image_to_file(im, file, key, quality, compress); + + if (o->cur.cspace != EVAS_COLORSPACE_ARGB8888) + free(im->image.data); + } + + evas_cache_image_drop(&im->cache_entry); + } + return ok; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI Evas_Bool +evas_object_image_pixels_import(Evas_Object *obj, Evas_Pixel_Import_Source *pixels) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return 0; + MAGIC_CHECK_END(); + + if ((pixels->w != o->cur.image.w) || (pixels->h != o->cur.image.h)) return 0; + switch (pixels->format) + { +#if 0 + case EVAS_PIXEL_FORMAT_ARGB32: + { + if (o->engine_data) + { + DATA32 *image_pixels = NULL; + + o->engine_data = + obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output, + o->engine_data, + 1, + &image_pixels); +/* FIXME: need to actualyl support this */ +/* memcpy(image_pixels, pixels->rows, o->cur.image.w * o->cur.image.h * 4);*/ + if (o->engine_data) + o->engine_data = + obj->layer->evas->engine.func->image_data_put(obj->layer->evas->engine.data.output, + o->engine_data, + image_pixels); + if (o->engine_data) + o->engine_data = + obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output, + o->engine_data, + o->cur.has_alpha); + o->changed = 1; + evas_object_change(obj); + } + } + break; +#endif +#ifdef BUILD_CONVERT_YUV + case EVAS_PIXEL_FORMAT_YUV420P_601: + { + if (o->engine_data) + { + DATA32 *image_pixels = NULL; + + o->engine_data = + obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output, + o->engine_data, + 1, + &image_pixels); + if (image_pixels) + evas_common_convert_yuv_420p_601_rgba((DATA8 **) pixels->rows, + (DATA8 *) image_pixels, + o->cur.image.w, + o->cur.image.h); + if (o->engine_data) + o->engine_data = + obj->layer->evas->engine.func->image_data_put(obj->layer->evas->engine.data.output, + o->engine_data, + image_pixels); + if (o->engine_data) + o->engine_data = + obj->layer->evas->engine.func->image_alpha_set(obj->layer->evas->engine.data.output, + o->engine_data, + o->cur.has_alpha); + o->changed = 1; + evas_object_change(obj); + } + } + break; +#endif + default: + return 0; + break; + } + return 1; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_image_pixels_get_callback_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *o), void *data) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + o->func.get_pixels = func; + o->func.get_pixels_data = data; +} + +/** + * Mark whether the given image object is dirty (needs to be redrawn). + * + * @param obj The given image object. + * @param dirty Whether the image is dirty. + * @ingroup Evas_Object_Image + */ +EAPI void +evas_object_image_pixels_dirty_set(Evas_Object *obj, Evas_Bool dirty) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + if (dirty) o->dirty_pixels = 1; + else o->dirty_pixels = 0; + o->changed = 1; + evas_object_change(obj); +} + +/** + * Retrieves whether the given image object is dirty (needs to be redrawn). + * + * @param obj The given image object. + * @return Whether the image is dirty. + * @ingroup Evas_Object_Image + */ +EAPI Evas_Bool +evas_object_image_pixels_dirty_get(const Evas_Object *obj) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return 0; + MAGIC_CHECK_END(); + if (o->dirty_pixels) return 1; + return 0; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_image_load_dpi_set(Evas_Object *obj, double dpi) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + o->load_opts.dpi = dpi; + if (o->cur.file) + { + evas_object_image_unload(obj); + evas_object_image_load(obj); + o->changed = 1; + evas_object_change(obj); + } +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI double +evas_object_image_load_dpi_get(const Evas_Object *obj) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0.0; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return 0.0; + MAGIC_CHECK_END(); + return o->load_opts.dpi; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_image_load_size_set(Evas_Object *obj, int w, int h) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + o->load_opts.w = w; + o->load_opts.h = h; + if (o->cur.file) + { + evas_object_image_unload(obj); + evas_object_image_load(obj); + o->changed = 1; + evas_object_change(obj); + } +} + +EAPI void +evas_object_image_load_size_get(const Evas_Object *obj, int *w, int *h) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + if (w) *w = o->load_opts.w; + if (h) *h = o->load_opts.h; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_image_load_scale_down_set(Evas_Object *obj, int scale_down) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + o->load_opts.scale_down_by = scale_down; + if (o->cur.file) + { + evas_object_image_unload(obj); + evas_object_image_load(obj); + o->changed = 1; + evas_object_change(obj); + } +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI int +evas_object_image_load_scale_down_get(const Evas_Object *obj) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return 0; + MAGIC_CHECK_END(); + return o->load_opts.scale_down_by; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_image_colorspace_set(Evas_Object *obj, Evas_Colorspace cspace) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + o->cur.cspace = cspace; + if (o->engine_data) + obj->layer->evas->engine.func->image_colorspace_set(obj->layer->evas->engine.data.output, + o->engine_data, + cspace); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI Evas_Colorspace +evas_object_image_colorspace_get(const Evas_Object *obj) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return EVAS_COLORSPACE_ARGB8888; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return EVAS_COLORSPACE_ARGB8888; + MAGIC_CHECK_END(); + return o->cur.cspace; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_image_native_surface_set(Evas_Object *obj, Evas_Native_Surface *surf) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + obj->layer->evas->engine.func->image_native_set(obj->layer->evas->engine.data.output, + o->engine_data, + surf); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI Evas_Native_Surface * +evas_object_image_native_surface_get(const Evas_Object *obj) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return NULL; + MAGIC_CHECK_END(); + return obj->layer->evas->engine.func->image_native_get(obj->layer->evas->engine.data.output, + o->engine_data); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_image_cache_flush(Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + e->engine.func->image_cache_flush(e->engine.data.output); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_image_cache_reload(Evas *e) +{ + Evas_Object_List *l; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + evas_image_cache_flush(e); + for (l = (Evas_Object_List *)e->layers; l; l = l->next) + { + Evas_Layer *layer; + Evas_Object_List *l2; + + layer = (Evas_Layer *)l; + for (l2 = (Evas_Object_List *)layer->objects; l2; l2 = l2->next) + { + Evas_Object *obj; + Evas_Object_Image *o; + + obj = (Evas_Object *)l2; + o = (Evas_Object_Image *)(obj->object_data); + if (o->magic == MAGIC_OBJ_IMAGE) + { + evas_object_image_unload(obj); + } + } + } + evas_image_cache_flush(e); + for (l = (Evas_Object_List *)e->layers; l; l = l->next) + { + Evas_Layer *layer; + Evas_Object_List *l2; + + layer = (Evas_Layer *)l; + for (l2 = (Evas_Object_List *)layer->objects; l2; l2 = l2->next) + { + Evas_Object *obj; + Evas_Object_Image *o; + + obj = (Evas_Object *)l2; + o = (Evas_Object_Image *)(obj->object_data); + if (o->magic == MAGIC_OBJ_IMAGE) + { + evas_object_image_load(obj); + o->changed = 1; + evas_object_change(obj); + } + } + } + evas_image_cache_flush(e); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_image_cache_set(Evas *e, int size) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + if (size < 0) size = 0; + e->engine.func->image_cache_set(e->engine.data.output, size); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI int +evas_image_cache_get(const Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return 0; + MAGIC_CHECK_END(); + + return e->engine.func->image_cache_get(e->engine.data.output); +} + +/* all nice and private */ + +static void +evas_object_image_unload(Evas_Object *obj) +{ + Evas_Object_Image *o; + + o = (Evas_Object_Image *)(obj->object_data); + + if ((!o->cur.file) || + (o->pixels_checked_out > 0)) return; + if (o->engine_data) + o->engine_data = obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output, + o->engine_data, + 0, 0, + o->cur.image.w, o->cur.image.h); + if (o->engine_data) + obj->layer->evas->engine.func->image_free(obj->layer->evas->engine.data.output, + o->engine_data); + o->engine_data = NULL; + o->load_error = EVAS_LOAD_ERROR_NONE; + o->cur.has_alpha = 1; + o->cur.cspace = EVAS_COLORSPACE_ARGB8888; + o->cur.image.w = 0; + o->cur.image.h = 0; + o->cur.image.stride = 0; +} + +static void +evas_object_image_load(Evas_Object *obj) +{ + Evas_Object_Image *o; + Evas_Image_Load_Opts lo; + + o = (Evas_Object_Image *)(obj->object_data); + if (o->engine_data) return; + + lo.scale_down_by = o->load_opts.scale_down_by; + lo.dpi = o->load_opts.dpi; + lo.w = o->load_opts.w; + lo.h = o->load_opts.h; + o->engine_data = obj->layer->evas->engine.func->image_load(obj->layer->evas->engine.data.output, + o->cur.file, + o->cur.key, + &o->load_error, + &lo); + if (o->engine_data) + { + int w, h; + int stride; + + obj->layer->evas->engine.func->image_size_get(obj->layer->evas->engine.data.output, + o->engine_data, &w, &h); + if (obj->layer->evas->engine.func->image_stride_get) + obj->layer->evas->engine.func->image_stride_get(obj->layer->evas->engine.data.output, + o->engine_data, &stride); + else + stride = w; + o->cur.has_alpha = obj->layer->evas->engine.func->image_alpha_get(obj->layer->evas->engine.data.output, + o->engine_data); + o->cur.cspace = obj->layer->evas->engine.func->image_colorspace_get(obj->layer->evas->engine.data.output, + o->engine_data); + o->cur.image.w = w; + o->cur.image.h = h; + o->cur.image.stride = stride; + } + else + { + o->load_error = EVAS_LOAD_ERROR_GENERIC; + } +} + +static Evas_Coord +evas_object_image_figure_x_fill(Evas_Object *obj, Evas_Coord start, Evas_Coord size, Evas_Coord *size_ret) +{ + Evas_Coord w; + + w = ((size * obj->layer->evas->output.w) / + (Evas_Coord)obj->layer->evas->viewport.w); + if (size <= 0) size = 1; + if (start > 0) + { + while (start - size > 0) start -= size; + } + else if (start < 0) + { + while (start < 0) start += size; + } + start = ((start * obj->layer->evas->output.w) / + (Evas_Coord)obj->layer->evas->viewport.w); + *size_ret = w; + return start; +} + +static Evas_Coord +evas_object_image_figure_y_fill(Evas_Object *obj, Evas_Coord start, Evas_Coord size, Evas_Coord *size_ret) +{ + Evas_Coord h; + + h = ((size * obj->layer->evas->output.h) / + (Evas_Coord)obj->layer->evas->viewport.h); + if (size <= 0) size = 1; + if (start > 0) + { + while (start - size > 0) start -= size; + } + else if (start < 0) + { + while (start < 0) start += size; + } + start = ((start * obj->layer->evas->output.h) / + (Evas_Coord)obj->layer->evas->viewport.h); + *size_ret = h; + return start; +} + +static void +evas_object_image_init(Evas_Object *obj) +{ + /* alloc image ob, setup methods and default values */ + obj->object_data = evas_object_image_new(); + /* set up default settings for this kind of object */ + obj->cur.color.r = 255; + obj->cur.color.g = 255; + obj->cur.color.b = 255; + obj->cur.color.a = 255; + obj->cur.geometry.x = 0; + obj->cur.geometry.y = 0; + obj->cur.geometry.w = 0; + obj->cur.geometry.h = 0; + obj->cur.layer = 0; + obj->cur.anti_alias = 0; + obj->cur.render_op = EVAS_RENDER_BLEND; + /* set up object-specific settings */ + obj->prev = obj->cur; + /* set up methods (compulsory) */ + obj->func = &object_func; + obj->type = o_type; +} + +static void * +evas_object_image_new(void) +{ + Evas_Object_Image *o; + + /* alloc obj private data */ + o = calloc(1, sizeof(Evas_Object_Image)); + o->magic = MAGIC_OBJ_IMAGE; + o->cur.fill.w = 1; + o->cur.fill.h = 1; + o->cur.smooth_scale = 1; + o->cur.border.fill = 1; + o->cur.cspace = EVAS_COLORSPACE_ARGB8888; + o->prev = o->cur; + return o; +} + +static void +evas_object_image_free(Evas_Object *obj) +{ + Evas_Object_Image *o; + + /* frees private object data. very simple here */ + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + /* free obj */ + if (o->cur.file) evas_stringshare_del(o->cur.file); + if (o->cur.key) evas_stringshare_del(o->cur.key); + if (o->engine_data) + obj->layer->evas->engine.func->image_free(obj->layer->evas->engine.data.output, + o->engine_data); + o->engine_data = NULL; + o->magic = 0; + while (o->pixel_updates) + { + Evas_Rectangle *r; + + r = (Evas_Rectangle *)o->pixel_updates->data; + o->pixel_updates = evas_list_remove(o->pixel_updates, r); + free(r); + } + free(o); +} + +static void +evas_object_image_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y) +{ + Evas_Object_Image *o; + + /* render object to surface with context, and offset by x,y */ + o = (Evas_Object_Image *)(obj->object_data); + obj->layer->evas->engine.func->context_color_set(output, + context, + 255, 255, 255, 255); + + if ((obj->cur.cache.clip.r == 255) && + (obj->cur.cache.clip.g == 255) && + (obj->cur.cache.clip.b == 255) && + (obj->cur.cache.clip.a == 255)) + { + obj->layer->evas->engine.func->context_multiplier_unset(output, + context); + } + else + obj->layer->evas->engine.func->context_multiplier_set(output, + context, + obj->cur.cache.clip.r, + obj->cur.cache.clip.g, + obj->cur.cache.clip.b, + obj->cur.cache.clip.a); + + obj->layer->evas->engine.func->context_render_op_set(output, context, + obj->cur.render_op); + if (o->engine_data) + { + Evas_Coord idw, idh, idx, idy; + int ix, iy, iw, ih; + + if (o->dirty_pixels) + { + if (o->func.get_pixels) + { + o->func.get_pixels(o->func.get_pixels_data, obj); + o->engine_data = obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output, o->engine_data, 0, 0, o->cur.image.w, o->cur.image.h); + } + o->dirty_pixels = 0; + } + o->engine_data = obj->layer->evas->engine.func->image_border_set(output, o->engine_data, + o->cur.border.l, o->cur.border.r, + o->cur.border.t, o->cur.border.b); + idx = evas_object_image_figure_x_fill(obj, o->cur.fill.x, o->cur.fill.w, &idw); + idy = evas_object_image_figure_y_fill(obj, o->cur.fill.y, o->cur.fill.h, &idh); + if (idw < 1.0) idw = 1.0; + if (idh < 1.0) idh = 1.0; + if (idx > 0.0) idx -= idw; + if (idy > 0.0) idy -= idh; + while ((int)idx < obj->cur.geometry.w) + { + Evas_Coord ydy; + int dobreak_w = 0; + + ydy = idy; + ix = idx; + if ((o->cur.fill.w == obj->cur.geometry.w) && + (o->cur.fill.x == 0.0)) + { + dobreak_w = 1; + iw = obj->cur.geometry.w; + } + else + iw = ((int)(idx + idw)) - ix; + while ((int)idy < obj->cur.geometry.h) + { + int dobreak_h = 0; + + iy = idy; + if ((o->cur.fill.h == obj->cur.geometry.h) && + (o->cur.fill.y == 0.0)) + { + ih = obj->cur.geometry.h; + dobreak_h = 1; + } + else + ih = ((int)(idy + idh)) - iy; + if ((o->cur.border.l == 0) && + (o->cur.border.r == 0) && + (o->cur.border.t == 0) && + (o->cur.border.b == 0) && + (o->cur.border.fill != 0)) + obj->layer->evas->engine.func->image_draw(output, + context, + surface, + o->engine_data, + 0, 0, + o->cur.image.w, + o->cur.image.h, + obj->cur.geometry.x + ix + x, + obj->cur.geometry.y + iy + y, + iw, ih, + o->cur.smooth_scale); + else + { + int inx, iny, inw, inh, outx, outy, outw, outh; + int bl, br, bt, bb; + int imw, imh, ox, oy; + + ox = obj->cur.geometry.x + ix + x; + oy = obj->cur.geometry.y + iy + y; + imw = o->cur.image.w; + imh = o->cur.image.h; + bl = o->cur.border.l; + br = o->cur.border.r; + bt = o->cur.border.t; + bb = o->cur.border.b; + if ((bl + br) > iw) + { + bl = iw / 2; + br = iw - bl; + } + if ((bl + br) > imw) + { + bl = imw / 2; + br = imw - bl; + } + if ((bt + bb) > ih) + { + bt = ih / 2; + bb = ih - bt; + } + if ((bt + bb) > imh) + { + bt = imh / 2; + bb = imh - bt; + } + + inx = 0; iny = 0; + inw = bl; inh = bt; + outx = ox; outy = oy; + outw = bl; outh = bt; + obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale); + inx = bl; iny = 0; + inw = imw - bl - br; inh = bt; + outx = ox + bl; outy = oy; + outw = iw - bl - br; outh = bt; + obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale); + inx = imw - br; iny = 0; + inw = br; inh = bt; + outx = ox + iw - br; outy = oy; + outw = br; outh = bt; + obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale); + + inx = 0; iny = bt; + inw = bl; inh = imh - bt - bb; + outx = ox; outy = oy + bt; + outw = bl; outh = ih - bt - bb; + obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale); + if (o->cur.border.fill) + { + inx = bl; iny = bt; + inw = imw - bl - br; inh = imh - bt - bb; + outx = ox + bl; outy = oy + bt; + outw = iw - bl - br; outh = ih - bt - bb; + obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale); + } + inx = imw - br; iny = bt; + inw = br; inh = imh - bt - bb; + outx = ox + iw - br; outy = oy + bt; + outw = br; outh = ih - bt - bb; + obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale); + + inx = 0; iny = imh - bb; + inw = bl; inh = bb; + outx = ox; outy = oy + ih - bb; + outw = bl; outh = bb; + obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale); + inx = bl; iny = imh - bb; + inw = imw - bl - br; inh = bb; + outx = ox + bl; outy = oy + ih - bb; + outw = iw - bl - br; outh = bb; + obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale); + inx = imw - br; iny = imh - bb; + inw = br; inh = bb; + outx = ox + iw - br; outy = oy + ih - bb; + outw = br; outh = bb; + obj->layer->evas->engine.func->image_draw(output, context, surface, o->engine_data, inx, iny, inw, inh, outx, outy, outw, outh, o->cur.smooth_scale); + } + idy += idh; + if (dobreak_h) break; + } + idx += idw; + idy = ydy; + if (dobreak_w) break; + } + } +} + +static void +evas_object_image_render_pre(Evas_Object *obj) +{ + Evas_Rectangles rects = { 0, 0, NULL }; + Evas_Object_Image *o; + int is_v, was_v; + + /* dont pre-render the obj twice! */ + if (obj->pre_render_done) return; + obj->pre_render_done = 1; + /* pre-render phase. this does anything an object needs to do just before */ + /* rendering. this could mean loading the image data, retrieving it from */ + /* elsewhere, decoding video etc. */ + /* then when this is done the object needs to figure if it changed and */ + /* if so what and where and add the appropriate redraw rectangles */ + o = (Evas_Object_Image *)(obj->object_data); + /* if someone is clipping this obj - go calculate the clipper */ + if (obj->cur.clipper) + { + if (obj->cur.cache.clip.dirty) + evas_object_clip_recalc(obj->cur.clipper); + obj->cur.clipper->func->render_pre(obj->cur.clipper); + } + /* now figure what changed and add draw rects */ + /* if it just became visible or invisible */ + is_v = evas_object_is_visible(obj); + was_v = evas_object_was_visible(obj); + if (is_v != was_v) + { + evas_object_render_pre_visible_change(&rects, obj, is_v, was_v); + if (!o->pixel_updates) goto done; + } + /* it's not visible - we accounted for it appearing or not so just abort */ + if (!is_v) goto done; + /* clipper changed this is in addition to anything else for obj */ + evas_object_render_pre_clipper_change(&rects, obj); + /* if we restacked (layer or just within a layer) and don't clip anyone */ + if (obj->restack) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + if (!o->pixel_updates) goto done; + } + /* if it changed color */ + if ((obj->cur.color.r != obj->prev.color.r) || + (obj->cur.color.g != obj->prev.color.g) || + (obj->cur.color.b != obj->prev.color.b) || + (obj->cur.color.a != obj->prev.color.a)) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + if (!o->pixel_updates) goto done; + } + /* if it changed render op */ + if (obj->cur.render_op != obj->prev.render_op) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + if (!o->pixel_updates) goto done; + } + /* if it changed anti_alias */ + if (obj->cur.anti_alias != obj->prev.anti_alias) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + if (!o->pixel_updates) goto done; + } + if (o->changed) + { + if (((o->cur.file) && (!o->prev.file)) || + ((!o->cur.file) && (o->prev.file)) || + ((o->cur.key) && (!o->prev.key)) || + ((!o->cur.key) && (o->prev.key)) + ) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + if (!o->pixel_updates) goto done; + } + if ((o->cur.image.w != o->prev.image.w) || + (o->cur.image.h != o->prev.image.h) || + (o->cur.has_alpha != o->prev.has_alpha) || + (o->cur.cspace != o->prev.cspace) || + (o->cur.smooth_scale != o->prev.smooth_scale)) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + if (!o->pixel_updates) goto done; + } + if ((o->cur.border.l != o->prev.border.l) || + (o->cur.border.r != o->prev.border.r) || + (o->cur.border.t != o->prev.border.t) || + (o->cur.border.b != o->prev.border.b)) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + if (!o->pixel_updates) goto done; + } + if (o->dirty_pixels) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + if (!o->pixel_updates) goto done; + } + } + /* if it changed geometry - and obviously not visibility or color */ + /* caluclate differences since we have a constant color fill */ + /* we really only need to update the differences */ + if (((obj->cur.geometry.x != obj->prev.geometry.x) || + (obj->cur.geometry.y != obj->prev.geometry.y) || + (obj->cur.geometry.w != obj->prev.geometry.w) || + (obj->cur.geometry.h != obj->prev.geometry.h)) && + (o->cur.fill.w == o->prev.fill.w) && + (o->cur.fill.h == o->prev.fill.h) && + ((o->cur.fill.x + obj->cur.geometry.x) == (o->prev.fill.x + obj->prev.geometry.x)) && + ((o->cur.fill.y + obj->cur.geometry.y) == (o->prev.fill.y + obj->prev.geometry.y)) && + (!o->pixel_updates) + ) + { + evas_rects_return_difference_rects(&rects, + obj->cur.geometry.x, + obj->cur.geometry.y, + obj->cur.geometry.w, + obj->cur.geometry.h, + obj->prev.geometry.x, + obj->prev.geometry.y, + obj->prev.geometry.w, + obj->prev.geometry.h); + if (!o->pixel_updates) goto done; + } + if (((obj->cur.geometry.x != obj->prev.geometry.x) || + (obj->cur.geometry.y != obj->prev.geometry.y) || + (obj->cur.geometry.w != obj->prev.geometry.w) || + (obj->cur.geometry.h != obj->prev.geometry.h)) + ) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + if (!o->pixel_updates) goto done; + } + if (o->changed) + { + if ((o->cur.fill.x != o->prev.fill.x) || + (o->cur.fill.y != o->prev.fill.y) || + (o->cur.fill.w != o->prev.fill.w) || + (o->cur.fill.h != o->prev.fill.h)) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + if (!o->pixel_updates) goto done; + } + if ((o->cur.border.l == 0) && + (o->cur.border.r == 0) && + (o->cur.border.t == 0) && + (o->cur.border.b == 0)) + { + while (o->pixel_updates) + { + Evas_Rectangle *rr; + Evas_Coord idw, idh, idx, idy; + int x, y, w, h; + + rr = o->pixel_updates->data; + o->pixel_updates = evas_list_remove(o->pixel_updates, rr); + obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output, o->engine_data, rr->x, rr->y, rr->w, rr->h); + + idx = evas_object_image_figure_x_fill(obj, o->cur.fill.x, o->cur.fill.w, &idw); + idy = evas_object_image_figure_y_fill(obj, o->cur.fill.y, o->cur.fill.h, &idh); + + if (idw < 1) idw = 1; + if (idh < 1) idh = 1; + if (idx > 0) idx -= idw; + if (idy > 0) idy -= idh; + while (idx < obj->cur.geometry.w) + { + Evas_Coord ydy; + + ydy = idy; + x = idx; + w = ((int)(idx + idw)) - x; + while (idy < obj->cur.geometry.h) + { + Evas_Rectangle r; + + y = idy; + h = ((int)(idy + idh)) - y; + + r.x = ((rr->x - 1) * w) / o->cur.image.w; + r.y = ((rr->y - 1) * h) / o->cur.image.h; + r.w = ((rr->w + 2) * w) / o->cur.image.w; + r.h = ((rr->h + 2) * h) / o->cur.image.h; + r.x += obj->cur.geometry.x + x; + r.y += obj->cur.geometry.y + y; + evas_add_rect(&rects, r.x, r.y, r.w, r.h); + idy += h; + } + idx += idw; + idy = ydy; + } + free(rr); + } + goto done; + } + else + { + if (o->pixel_updates) + { + while (o->pixel_updates) + { + Evas_Rectangle *r; + + r = (Evas_Rectangle *)o->pixel_updates->data; + o->pixel_updates = evas_list_remove(o->pixel_updates, r); + free(r); + } + obj->layer->evas->engine.func->image_dirty_region(obj->layer->evas->engine.data.output, o->engine_data, 0, 0, o->cur.image.w, o->cur.image.h); + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + } + } + /* it obviously didn't change - add a NO obscure - this "unupdates" this */ + /* area so if there were updates for it they get wiped. don't do it if we */ + /* aren't fully opaque and we are visible */ + if (evas_object_is_visible(obj) && + evas_object_is_opaque(obj)) + obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output, + obj->cur.cache.clip.x, + obj->cur.cache.clip.y, + obj->cur.cache.clip.w, + obj->cur.cache.clip.h); + done: + evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v); +} + +static void +evas_object_image_render_post(Evas_Object *obj) +{ + Evas_Object_Image *o; + + /* this moves the current data to the previous state parts of the object */ + /* in whatever way is safest for the object. also if we don't need object */ + /* data anymore we can free it if the object deems this is a good idea */ + o = (Evas_Object_Image *)(obj->object_data); + /* remove those pesky changes */ + while (obj->clip.changes) + { + Evas_Rectangle *r; + + r = (Evas_Rectangle *)obj->clip.changes->data; + obj->clip.changes = evas_list_remove(obj->clip.changes, r); + free(r); + } + while (o->pixel_updates) + { + Evas_Rectangle *r; + + r = (Evas_Rectangle *)o->pixel_updates->data; + o->pixel_updates = evas_list_remove(o->pixel_updates, r); + free(r); + } + /* move cur to prev safely for object data */ + obj->prev = obj->cur; + o->prev = o->cur; + o->changed = 0; + /* FIXME: copy strings across */ +} + +static int +evas_object_image_is_opaque(Evas_Object *obj) +{ + Evas_Object_Image *o; + + /* this returns 1 if the internal object data implies that the object is */ + /* currently fully opaque over the entire rectangle it occupies */ + o = (Evas_Object_Image *)(obj->object_data); + if (((o->cur.border.l != 0) || + (o->cur.border.r != 0) || + (o->cur.border.t != 0) || + (o->cur.border.b != 0)) && + (!o->cur.border.fill)) return 0; + if (!o->engine_data) return 0; + if (obj->cur.render_op == EVAS_RENDER_COPY) + return 1; + if (o->cur.has_alpha) return 0; + if (obj->cur.render_op != EVAS_RENDER_BLEND) + return 0; + return 1; +} + +static int +evas_object_image_was_opaque(Evas_Object *obj) +{ + Evas_Object_Image *o; + + /* this returns 1 if the internal object data implies that the object was */ + /* previously fully opaque over the entire rectangle it occupies */ + o = (Evas_Object_Image *)(obj->object_data); + if (((o->prev.border.l != 0) || + (o->prev.border.r != 0) || + (o->prev.border.t != 0) || + (o->prev.border.b != 0)) && + (!o->prev.border.fill)) return 0; + if (!o->engine_data) return 0; + if (obj->prev.render_op == EVAS_RENDER_COPY) + return 1; + if (o->prev.has_alpha) return 0; + if (obj->prev.render_op != EVAS_RENDER_BLEND) + return 0; + return 1; +} + +static int +evas_object_image_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + Evas_Object_Image *o; + DATA32 *data; + int w, h, stride; + int a; + + o = (Evas_Object_Image *)(obj->object_data); + + x -= obj->cur.cache.clip.x; + y -= obj->cur.cache.clip.y; + w = o->cur.image.w; + h = o->cur.image.h; + + if ((x > w) || (y > h)) + return 0; + + if (!o->cur.has_alpha) + return 1; + + stride = o->cur.image.stride; + + o->engine_data = obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output, + o->engine_data, + 0, + &data); + if (!data) + return 0; + + switch (o->cur.cspace) + { + case EVAS_COLORSPACE_ARGB8888: + data = ((DATA32*)(data) + ((y * stride) + x)); + a = (*((DATA32*)(data)) >> 24) & 0xff; + break; + case EVAS_COLORSPACE_RGB565_A5P: + data = (void*) ((DATA16*)(data) + (h * stride)); + data = (void*) ((DATA8*)(data) + ((y * stride) + x)); + a = (*((DATA8*)(data))) & 0x1f; + break; + default: + return 1; + break; + } + + return (a != 0); +} + +static void * +evas_object_image_data_convert_internal(Evas_Object_Image *o, void *data, Evas_Colorspace to_cspace) +{ + void *out = NULL; + + if (!data) + return NULL; + + switch (o->cur.cspace) + { + case EVAS_COLORSPACE_ARGB8888: + out = evas_common_convert_argb8888_to(data, + o->cur.image.w, + o->cur.image.h, + o->cur.image.stride, + o->cur.has_alpha, + to_cspace); + break; + case EVAS_COLORSPACE_RGB565_A5P: + out = evas_common_convert_rgb565_a5p_to(data, + o->cur.image.w, + o->cur.image.h, + o->cur.image.stride, + o->cur.has_alpha, + to_cspace); + break; + default: + break; + } + + return out; +} diff --git a/src/lib/canvas/evas_object_inform.c b/src/lib/canvas/evas_object_inform.c new file mode 100644 index 0000000..31271fc --- /dev/null +++ b/src/lib/canvas/evas_object_inform.c @@ -0,0 +1,40 @@ +#include "evas_common.h" +#include "evas_private.h" + +/* local calls */ + +void +evas_object_inform_call_show(Evas_Object *obj) +{ + evas_object_event_callback_call(obj, EVAS_CALLBACK_SHOW, NULL); +} + +void +evas_object_inform_call_hide(Evas_Object *obj) +{ + evas_object_event_callback_call(obj, EVAS_CALLBACK_HIDE, NULL); +} + +void +evas_object_inform_call_move(Evas_Object *obj) +{ + evas_object_event_callback_call(obj, EVAS_CALLBACK_MOVE, NULL); +} + +void +evas_object_inform_call_resize(Evas_Object *obj) +{ + evas_object_event_callback_call(obj, EVAS_CALLBACK_RESIZE, NULL); +} + +void +evas_object_inform_call_restack(Evas_Object *obj) +{ + evas_object_event_callback_call(obj, EVAS_CALLBACK_RESTACK, NULL); +} + +void +evas_object_inform_call_changed_size_hints(Evas_Object *obj) +{ + evas_object_event_callback_call(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, NULL); +} diff --git a/src/lib/canvas/evas_object_intercept.c b/src/lib/canvas/evas_object_intercept.c new file mode 100644 index 0000000..d724dd9 --- /dev/null +++ b/src/lib/canvas/evas_object_intercept.c @@ -0,0 +1,769 @@ +#include "evas_common.h" +#include "evas_private.h" + +/* local calls */ + +static void evas_object_intercept_init(Evas_Object *obj); +static void evas_object_intercept_deinit(Evas_Object *obj); + +static void +evas_object_intercept_init(Evas_Object *obj) +{ + /* MEM OK */ + if (!obj->interceptors) + obj->interceptors = evas_mem_calloc(sizeof(Evas_Intercept_Func)); +} + +static void +evas_object_intercept_deinit(Evas_Object *obj) +{ + /* MEM OK */ + if (!obj->interceptors) return; + if ((obj->interceptors->show.func) || + (obj->interceptors->hide.func) || + (obj->interceptors->move.func) || + (obj->interceptors->resize.func) || + (obj->interceptors->raise.func) || + (obj->interceptors->lower.func) || + (obj->interceptors->stack_above.func) || + (obj->interceptors->stack_below.func) || + (obj->interceptors->layer_set.func) || + (obj->interceptors->color_set.func) || + (obj->interceptors->clip_set.func) || + (obj->interceptors->clip_unset.func)) + return; + free(obj->interceptors); + obj->interceptors = NULL; +} + +/* private calls */ + +void +evas_object_intercept_cleanup(Evas_Object *obj) +{ + /* MEM OK */ + if (obj->interceptors) free(obj->interceptors); +} + +int +evas_object_intercept_call_show(Evas_Object *obj) +{ + /* MEM OK */ + int ret; + + if (!obj->interceptors) return 0; + if (obj->intercepted) return 0; + obj->intercepted = 1; + ret = ((obj->interceptors->show.func) != NULL); + if (obj->interceptors->show.func) + obj->interceptors->show.func(obj->interceptors->show.data, obj); + obj->intercepted = 0; + return ret; +} + +int +evas_object_intercept_call_hide(Evas_Object *obj) +{ + /* MEM OK */ + int ret; + + if (!obj->interceptors) return 0; + if (obj->intercepted) return 0; + obj->intercepted = 1; + ret = ((obj->interceptors->hide.func) != NULL); + if (obj->interceptors->hide.func) + obj->interceptors->hide.func(obj->interceptors->hide.data, obj); + obj->intercepted = 0; + return ret; +} + +int +evas_object_intercept_call_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + /* MEM OK */ + int ret; + + if (!obj->interceptors) return 0; + if (obj->intercepted) return 0; + obj->intercepted = 1; + ret = ((obj->interceptors->move.func) != NULL); + if (obj->interceptors->move.func) + obj->interceptors->move.func(obj->interceptors->move.data, obj, x, y); + obj->intercepted = 0; + return ret; +} + +int +evas_object_intercept_call_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h) +{ + /* MEM OK */ + int ret; + + if (!obj->interceptors) return 0; + if (obj->intercepted) return 0; + obj->intercepted = 1; + ret = ((obj->interceptors->resize.func) != NULL); + if (obj->interceptors->resize.func) + obj->interceptors->resize.func(obj->interceptors->resize.data, obj, w, h); + obj->intercepted = 0; + return ret; +} + +int +evas_object_intercept_call_raise(Evas_Object *obj) +{ + /* MEM OK */ + int ret; + + if (!obj->interceptors) return 0; + if (obj->intercepted) return 0; + obj->intercepted = 1; + ret = ((obj->interceptors->raise.func) != NULL); + if (obj->interceptors->raise.func) + obj->interceptors->raise.func(obj->interceptors->raise.data, obj); + obj->intercepted = 0; + return ret; +} + +int +evas_object_intercept_call_lower(Evas_Object *obj) +{ + /* MEM OK */ + int ret; + + if (!obj->interceptors) return 0; + if (obj->intercepted) return 0; + obj->intercepted = 1; + ret = ((obj->interceptors->lower.func) != NULL); + if (obj->interceptors->lower.func) + obj->interceptors->lower.func(obj->interceptors->lower.data, obj); + obj->intercepted = 0; + return ret; +} + +int +evas_object_intercept_call_stack_above(Evas_Object *obj, Evas_Object *above) +{ + /* MEM OK */ + int ret; + + if (!obj->interceptors) return 0; + if (obj->intercepted) return 0; + obj->intercepted = 1; + ret = ((obj->interceptors->stack_above.func) != NULL); + if (obj->interceptors->stack_above.func) + obj->interceptors->stack_above.func(obj->interceptors->stack_above.data, obj, above); + obj->intercepted = 0; + return ret; +} + +int +evas_object_intercept_call_stack_below(Evas_Object *obj, Evas_Object *below) +{ + /* MEM OK */ + int ret; + + if (!obj->interceptors) return 0; + if (obj->intercepted) return 0; + obj->intercepted = 1; + ret = ((obj->interceptors->stack_below.func) != NULL); + if (obj->interceptors->stack_below.func) + obj->interceptors->stack_below.func(obj->interceptors->stack_below.data, obj, below); + obj->intercepted = 0; + return ret; +} + +int +evas_object_intercept_call_layer_set(Evas_Object *obj, int l) +{ + /* MEM OK */ + int ret; + + if (!obj->interceptors) return 0; + if (obj->intercepted) return 0; + obj->intercepted = 1; + ret = ((obj->interceptors->layer_set.func) != NULL); + if (obj->interceptors->layer_set.func) + obj->interceptors->layer_set.func(obj->interceptors->layer_set.data, obj, l); + obj->intercepted = 0; + return ret; +} + +int +evas_object_intercept_call_color_set(Evas_Object *obj, int r, int g, int b, int a) +{ + /* MEM OK */ + int ret; + + if (!obj->interceptors) return 0; + if (obj->intercepted) return 0; + obj->intercepted = 1; + ret = ((obj->interceptors->color_set.func) != NULL); + if (obj->interceptors->color_set.func) + obj->interceptors->color_set.func(obj->interceptors->color_set.data, obj, r, g, b, a); + obj->intercepted = 0; + return ret; +} + +int +evas_object_intercept_call_clip_set(Evas_Object *obj, Evas_Object *clip) +{ + /* MEM OK */ + int ret; + + if (!obj->interceptors) return 0; + if (obj->intercepted) return 0; + obj->intercepted = 1; + ret = ((obj->interceptors->clip_set.func) != NULL); + if (obj->interceptors->clip_set.func) + obj->interceptors->clip_set.func(obj->interceptors->clip_set.data, obj, clip); + obj->intercepted = 0; + return ret; +} + +int +evas_object_intercept_call_clip_unset(Evas_Object *obj) +{ + /* MEM OK */ + int ret; + + if (!obj->interceptors) return 0; + if (obj->intercepted) return 0; + obj->intercepted = 1; + ret = ((obj->interceptors->clip_unset.func) != NULL); + if (obj->interceptors->clip_unset.func) + obj->interceptors->clip_unset.func(obj->interceptors->clip_unset.data, obj); + obj->intercepted = 0; + return ret; +} + +/* public calls */ + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_intercept_show_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data) +{ + /* MEM OK */ + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; + evas_object_intercept_init(obj); + if (!obj->interceptors) return; + obj->interceptors->show.func = func; + obj->interceptors->show.data = (void *)data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void * +evas_object_intercept_show_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)) +{ + /* MEM OK */ + void *data; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + if (!obj->interceptors) return NULL; + obj->interceptors->show.func = NULL; + data = obj->interceptors->show.data; + obj->interceptors->show.data = NULL; + evas_object_intercept_deinit(obj); + return data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_intercept_hide_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data) +{ + /* MEM OK */ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; + evas_object_intercept_init(obj); + if (!obj->interceptors) return; + obj->interceptors->hide.func = func; + obj->interceptors->hide.data = (void *)data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void * +evas_object_intercept_hide_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)) +{ + /* MEM OK */ + void *data; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + if (!obj->interceptors) return NULL; + obj->interceptors->hide.func = NULL; + data = obj->interceptors->hide.data; + obj->interceptors->hide.data = NULL; + evas_object_intercept_deinit(obj); + return data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_intercept_move_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y), const void *data) +{ + /* MEM OK */ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; + evas_object_intercept_init(obj); + if (!obj->interceptors) return; + obj->interceptors->move.func = func; + obj->interceptors->move.data = (void *)data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void * +evas_object_intercept_move_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y)) +{ + /* MEM OK */ + void *data; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + if (!obj->interceptors) return NULL; + obj->interceptors->move.func = NULL; + data = obj->interceptors->move.data; + obj->interceptors->move.data = NULL; + evas_object_intercept_deinit(obj); + return data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_intercept_resize_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord w, Evas_Coord h), const void *data) +{ + /* MEM OK */ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; + evas_object_intercept_init(obj); + if (!obj->interceptors) return; + obj->interceptors->resize.func = func; + obj->interceptors->resize.data = (void *)data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void * +evas_object_intercept_resize_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord w, Evas_Coord h)) +{ + /* MEM OK */ + void *data; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + if (!obj->interceptors) return NULL; + obj->interceptors->resize.func = NULL; + data = obj->interceptors->resize.data; + obj->interceptors->resize.data = NULL; + evas_object_intercept_deinit(obj); + return data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_intercept_raise_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data) +{ + /* MEM OK */ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; + evas_object_intercept_init(obj); + if (!obj->interceptors) return; + obj->interceptors->raise.func = func; + obj->interceptors->raise.data = (void *)data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void * +evas_object_intercept_raise_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)) +{ + /* MEM OK */ + void *data; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + if (!obj->interceptors) return NULL; + obj->interceptors->raise.func = NULL; + data = obj->interceptors->raise.data; + obj->interceptors->raise.data = NULL; + evas_object_intercept_deinit(obj); + return data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_intercept_lower_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data) +{ + /* MEM OK */ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; + evas_object_intercept_init(obj); + if (!obj->interceptors) return; + obj->interceptors->lower.func = func; + obj->interceptors->lower.data = (void *)data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void * +evas_object_intercept_lower_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)) +{ + /* MEM OK */ + void *data; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + if (!obj->interceptors) return NULL; + obj->interceptors->lower.func = NULL; + data = obj->interceptors->lower.data; + obj->interceptors->lower.data = NULL; + evas_object_intercept_deinit(obj); + return data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_intercept_stack_above_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above), const void *data) +{ + /* MEM OK */ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; + evas_object_intercept_init(obj); + if (!obj->interceptors) return; + obj->interceptors->stack_above.func = func; + obj->interceptors->stack_above.data = (void *)data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void * +evas_object_intercept_stack_above_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above)) +{ + /* MEM OK */ + void *data; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + if (!obj->interceptors) return NULL; + obj->interceptors->stack_above.func = NULL; + data = obj->interceptors->stack_above.data; + obj->interceptors->stack_above.data = NULL; + evas_object_intercept_deinit(obj); + return data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_intercept_stack_below_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below), const void *data) +{ + /* MEM OK */ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; + evas_object_intercept_init(obj); + if (!obj->interceptors) return; + obj->interceptors->stack_below.func = func; + obj->interceptors->stack_below.data = (void *)data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void * +evas_object_intercept_stack_below_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below)) +{ + /* MEM OK */ + void *data; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + if (!obj->interceptors) return NULL; + obj->interceptors->stack_below.func = NULL; + data = obj->interceptors->stack_below.data; + obj->interceptors->stack_below.data = NULL; + evas_object_intercept_deinit(obj); + return data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_intercept_layer_set_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l), const void *data) +{ + /* MEM OK */ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; + evas_object_intercept_init(obj); + if (!obj->interceptors) return; + obj->interceptors->layer_set.func = func; + obj->interceptors->layer_set.data = (void *)data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void * +evas_object_intercept_layer_set_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l)) +{ + /* MEM OK */ + void *data; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + if (!obj->interceptors) return NULL; + obj->interceptors->layer_set.func = NULL; + data = obj->interceptors->layer_set.data; + obj->interceptors->layer_set.data = NULL; + evas_object_intercept_deinit(obj); + return data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_intercept_color_set_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int r, int g, int b, int a), const void *data) +{ + /* MEM OK */ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; + evas_object_intercept_init(obj); + if (!obj->interceptors) return; + obj->interceptors->color_set.func = func; + obj->interceptors->color_set.data = (void *)data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void * +evas_object_intercept_color_set_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int r, int g, int b, int a)) +{ + /* MEM OK */ + void *data; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + if (!obj->interceptors) return NULL; + obj->interceptors->color_set.func = NULL; + data = obj->interceptors->color_set.data; + obj->interceptors->color_set.data = NULL; + evas_object_intercept_deinit(obj); + return data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_intercept_clip_set_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *clip), const void *data) +{ + /* MEM OK */ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; + evas_object_intercept_init(obj); + if (!obj->interceptors) return; + obj->interceptors->clip_set.func = func; + obj->interceptors->clip_set.data = (void *)data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void * +evas_object_intercept_clip_set_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *clip)) +{ + /* MEM OK */ + void *data; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + if (!obj->interceptors) return NULL; + obj->interceptors->clip_set.func = NULL; + data = obj->interceptors->clip_set.data; + obj->interceptors->clip_set.data = NULL; + evas_object_intercept_deinit(obj); + return data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_intercept_clip_unset_callback_add(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data) +{ + /* MEM OK */ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!func) return; + evas_object_intercept_init(obj); + if (!obj->interceptors) return; + obj->interceptors->clip_unset.func = func; + obj->interceptors->clip_unset.data = (void *)data; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void * +evas_object_intercept_clip_unset_callback_del(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)) +{ + /* MEM OK */ + void *data; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!func) return NULL; + if (!obj->interceptors) return NULL; + obj->interceptors->clip_unset.func = NULL; + data = obj->interceptors->clip_unset.data; + obj->interceptors->clip_unset.data = NULL; + evas_object_intercept_deinit(obj); + return data; +} diff --git a/src/lib/canvas/evas_object_line.c b/src/lib/canvas/evas_object_line.c new file mode 100644 index 0000000..15bf61c --- /dev/null +++ b/src/lib/canvas/evas_object_line.c @@ -0,0 +1,468 @@ +#include "evas_common.h" +#include "evas_private.h" + +/* private magic number for line objects */ +static const char o_type[] = "line"; + +/* private struct for line object internal data */ +typedef struct _Evas_Object_Line Evas_Object_Line; + +struct _Evas_Object_Line +{ + DATA32 magic; + struct { + struct { + int x1, y1, x2, y2; + struct { + Evas_Coord w, h; + } object; + } cache; + Evas_Coord x1, y1, x2, y2; + } cur, prev; + + void *engine_data; + + char changed : 1; +}; + +/* private methods for line objects */ +static void evas_object_line_init(Evas_Object *obj); +static void *evas_object_line_new(void); +static void evas_object_line_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y); +static void evas_object_line_free(Evas_Object *obj); +static void evas_object_line_render_pre(Evas_Object *obj); +static void evas_object_line_render_post(Evas_Object *obj); + +static int evas_object_line_is_opaque(Evas_Object *obj); +static int evas_object_line_was_opaque(Evas_Object *obj); +static int evas_object_line_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y); +static int evas_object_line_was_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y); +static void evas_object_line_coords_recalc(Evas_Object *obj); + +static const Evas_Object_Func object_func = +{ + /* methods (compulsory) */ + evas_object_line_free, + evas_object_line_render, + evas_object_line_render_pre, + evas_object_line_render_post, + /* these are optional. NULL = nothing */ + NULL, + NULL, + NULL, + NULL, + evas_object_line_is_opaque, + evas_object_line_was_opaque, + evas_object_line_is_inside, + evas_object_line_was_inside, + evas_object_line_coords_recalc +}; + +/* the actual api call to add a rect */ +/* it has no other api calls as all properties are standard */ + +/** + * @defgroup Evas_Line_Group Line Functions + * + * Functions used to deal with evas line objects. + */ + +/** + * Adds a new evas line object to the given evas. + * @param e The given evas. + * @return The new evas line object. + * @ingroup Evas_Line_Group + */ +EAPI Evas_Object * +evas_object_line_add(Evas *e) +{ + Evas_Object *obj; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + obj = evas_object_new(); + evas_object_line_init(obj); + evas_object_inject(obj, e); + return obj; +} + +/** + * Sets the coordinates of the end points of the given evas line object. + * @param obj The given evas line object. + * @param x1 The X coordinate of the first point. + * @param y1 The Y coordinate of the first point. + * @param x2 The X coordinate of the second point. + * @param y2 The Y coordinate of the second point. + * @ingroup Evas_Line_Group + */ +EAPI void +evas_object_line_xy_set(Evas_Object *obj, Evas_Coord x1, Evas_Coord y1, Evas_Coord x2, Evas_Coord y2) +{ + Evas_Object_Line *o; + Evas_Coord min_x, max_x, min_y, max_y; + int is, was = 0; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Line *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Line, MAGIC_OBJ_LINE); + return; + MAGIC_CHECK_END(); + if ((x1 == o->cur.x1) && (y1 == o->cur.y1) && + (x2 == o->cur.x2) && (y2 == o->cur.y2)) return; + if (obj->layer->evas->events_frozen <= 0) + { + if (!evas_event_passes_through(obj)) + was = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + } + if (x1 < x2) + { + min_x = x1; + max_x = x2; + } + else + { + min_x = x2; + max_x = x1; + } + if (y1 < y2) + { + min_y = y1; + max_y = y2; + } + else + { + min_y = y2; + max_y = y1; + } + obj->cur.geometry.x = min_x; + obj->cur.geometry.y = min_y; + obj->cur.geometry.w = max_x - min_x + 2.0; + obj->cur.geometry.h = max_y - min_y + 2.0; +//// obj->cur.cache.geometry.validity = 0; + o->cur.x1 = x1 - min_x; + o->cur.y1 = y1 - min_y; + o->cur.x2 = x2 - min_x; + o->cur.y2 = y2 - min_y; + o->changed = 1; + evas_object_change(obj); + evas_object_coords_recalc(obj); + if (obj->layer->evas->events_frozen <= 0) + { + is = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + if (!evas_event_passes_through(obj)) + { + if ((is ^ was) && obj->cur.visible) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + } + } + evas_object_inform_call_move(obj); + evas_object_inform_call_resize(obj); +} + +/** + * Retrieves the coordinates of the end points of the given evas line object. + * @param obj The given line object. + * @param x1 Pointer to an integer in which to store the X coordinate of the + * first end point. + * @param y1 Pointer to an integer in which to store the Y coordinate of the + * first end point. + * @param x2 Pointer to an integer in which to store the X coordinate of the + * second end point. + * @param y2 Pointer to an integer in which to store the Y coordinate of the + * second end point. + * @ingroup Evas_Line_Group + */ +EAPI void +evas_object_line_xy_get(const Evas_Object *obj, Evas_Coord *x1, Evas_Coord *y1, Evas_Coord *x2, Evas_Coord *y2) +{ + Evas_Object_Line *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (x1) *x1 = 0.0; + if (y1) *y1 = 0.0; + if (x2) *x2 = 0.0; + if (y2) *y2 = 0.0; + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Line *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Line, MAGIC_OBJ_LINE); + if (x1) *x1 = 0.0; + if (y1) *y1 = 0.0; + if (x2) *x2 = 0.0; + if (y2) *y2 = 0.0; + return; + MAGIC_CHECK_END(); + if (x1) *x1 = obj->cur.geometry.x + o->cur.x1; + if (y1) *y1 = obj->cur.geometry.y + o->cur.y1; + if (x2) *x2 = obj->cur.geometry.x + o->cur.x2; + if (y2) *y2 = obj->cur.geometry.y + o->cur.y2; +} + + + +/* all nice and private */ +static void +evas_object_line_init(Evas_Object *obj) +{ + /* alloc image ob, setup methods and default values */ + obj->object_data = evas_object_line_new(); + /* set up default settings for this kind of object */ + obj->cur.color.r = 255; + obj->cur.color.g = 255; + obj->cur.color.b = 255; + obj->cur.color.a = 255; + obj->cur.geometry.x = 0; + obj->cur.geometry.y = 0; + obj->cur.geometry.w = 0; + obj->cur.geometry.h = 0; + obj->cur.layer = 0; + obj->cur.anti_alias = 1; + obj->cur.render_op = EVAS_RENDER_BLEND; + /* set up object-specific settings */ + obj->prev = obj->cur; + /* set up methods (compulsory) */ + obj->func = &object_func; + obj->type = o_type; +} + +static void * +evas_object_line_new(void) +{ + Evas_Object_Line *o; + + /* alloc obj private data */ + o = calloc(1, sizeof(Evas_Object_Line)); + o->magic = MAGIC_OBJ_LINE; + o->cur.x1 = 0.0; + o->cur.y1 = 0.0; + o->cur.x2 = 31.0; + o->cur.y2 = 31.0; + o->prev = o->cur; + return o; +} + +static void +evas_object_line_free(Evas_Object *obj) +{ + Evas_Object_Line *o; + + /* frees private object data. very simple here */ + o = (Evas_Object_Line *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Line, MAGIC_OBJ_LINE); + return; + MAGIC_CHECK_END(); + /* free obj */ + o->magic = 0; + free(o); +} + +static void +evas_object_line_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y) +{ + Evas_Object_Line *o; + + /* render object to surface with context, and offxet by x,y */ + o = (Evas_Object_Line *)(obj->object_data); + obj->layer->evas->engine.func->context_color_set(output, + context, + obj->cur.cache.clip.r, + obj->cur.cache.clip.g, + obj->cur.cache.clip.b, + obj->cur.cache.clip.a); + obj->layer->evas->engine.func->context_multiplier_unset(output, + context); + obj->layer->evas->engine.func->context_anti_alias_set(output, context, + obj->cur.anti_alias); + obj->layer->evas->engine.func->context_render_op_set(output, context, + obj->cur.render_op); + obj->layer->evas->engine.func->line_draw(output, + context, + surface, + o->cur.cache.x1 + x, + o->cur.cache.y1 + y, + o->cur.cache.x2 + x, + o->cur.cache.y2 + y); +} + +static void +evas_object_line_render_pre(Evas_Object *obj) +{ + Evas_Rectangles rects = { 0, 0, NULL }; + Evas_Object_Line *o; + int is_v, was_v; + + /* dont pre-render the obj twice! */ + if (obj->pre_render_done) return; + obj->pre_render_done = 1; + /* pre-render phase. this does anything an object needs to do just before */ + /* rendering. this could mean loading the image data, retrieving it from */ + /* elsewhere, decoding video etc. */ + /* then when this is done the object needs to figure if it changed and */ + /* if so what and where and add the appropriate redraw lines */ + o = (Evas_Object_Line *)(obj->object_data); + /* if someone is clipping this obj - go calculate the clipper */ + if (obj->cur.clipper) + { + if (obj->cur.cache.clip.dirty) + evas_object_clip_recalc(obj->cur.clipper); + obj->cur.clipper->func->render_pre(obj->cur.clipper); + } + /* now figure what changed and add draw rects */ + /* if it just became visible or invisible */ + is_v = evas_object_is_visible(obj); + was_v = evas_object_was_visible(obj); + if (is_v != was_v) + { + evas_object_render_pre_visible_change(&rects, obj, is_v, was_v); + goto done; + } + /* it's not visible - we accounted for it appearing or not so just abort */ + if (!is_v) goto done; + /* clipper changed this is in addition to anything else for obj */ + evas_object_render_pre_clipper_change(&rects, obj); + /* if we restacked (layer or just within a layer) */ + if (obj->restack) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + /* if it changed anti_alias */ + if (obj->cur.anti_alias != obj->prev.anti_alias) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + /* if it changed render op */ + if (obj->cur.render_op != obj->prev.render_op) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + /* if it changed color */ + if ((obj->cur.color.r != obj->prev.color.r) || + (obj->cur.color.g != obj->prev.color.g) || + (obj->cur.color.b != obj->prev.color.b) || + (obj->cur.color.a != obj->prev.color.a)) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + /* if it changed geometry - and obviously not visibility or color */ + /* caluclate differences since we have a constant color fill */ + /* we really only need to update the differences */ + if ((obj->cur.geometry.x != obj->prev.geometry.x) || + (obj->cur.geometry.y != obj->prev.geometry.y) || + (obj->cur.geometry.w != obj->prev.geometry.w) || + (obj->cur.geometry.h != obj->prev.geometry.h) || + ((o->changed) && + ((o->cur.x1 != o->prev.x1) || + (o->cur.y1 != o->prev.y1) || + (o->cur.x2 != o->prev.x2) || + (o->cur.y2 != o->prev.y2))) + ) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + done: + evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v); +} + +static void +evas_object_line_render_post(Evas_Object *obj) +{ + Evas_Object_Line *o; + + /* this moves the current data to the previous state parts of the object */ + /* in whatever way is safest for the object. also if we don't need object */ + /* data anymore we can free it if the object deems this is a good idea */ + o = (Evas_Object_Line *)(obj->object_data); + /* remove those pesky changes */ + while (obj->clip.changes) + { + Evas_Rectangle *r; + + r = (Evas_Rectangle *)obj->clip.changes->data; + obj->clip.changes = evas_list_remove(obj->clip.changes, r); + free(r); + } + /* move cur to prev safely for object data */ + obj->prev = obj->cur; + o->prev = o->cur; + o->changed = 0; +} + +static int +evas_object_line_is_opaque(Evas_Object *obj) +{ + Evas_Object_Line *o; + + /* this returns 1 if the internal object data implies that the object is */ + /* currently fully opaque over the entire line it occupies */ + o = (Evas_Object_Line *)(obj->object_data); + return 0; +} + +static int +evas_object_line_was_opaque(Evas_Object *obj) +{ + Evas_Object_Line *o; + + /* this returns 1 if the internal object data implies that the object was */ + /* previously fully opaque over the entire line it occupies */ + o = (Evas_Object_Line *)(obj->object_data); + return 0; +} + +static int +evas_object_line_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + Evas_Object_Line *o; + + /* this returns 1 if the canvas co-ordinates are inside the object based */ + /* on object private data. not much use for rects, but for polys, images */ + /* and other complex objects it might be */ + o = (Evas_Object_Line *)(obj->object_data); + return 1; + x = 0; + y = 0; +} + +static int +evas_object_line_was_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + Evas_Object_Line *o; + + /* this returns 1 if the canvas co-ordinates were inside the object based */ + /* on object private data. not much use for rects, but for polys, images */ + /* and other complex objects it might be */ + o = (Evas_Object_Line *)(obj->object_data); + return 1; + x = 0; + y = 0; +} + +static void +evas_object_line_coords_recalc(Evas_Object *obj) +{ + Evas_Object_Line *o; + + o = (Evas_Object_Line *)(obj->object_data); + o->cur.cache.x1 = obj->cur.geometry.x + o->cur.x1; + o->cur.cache.y1 = obj->cur.geometry.y + o->cur.y1; + o->cur.cache.x2 = obj->cur.geometry.x + o->cur.x2; + o->cur.cache.y2 = obj->cur.geometry.y + o->cur.y2; + o->cur.cache.object.w = obj->cur.geometry.w; + o->cur.cache.object.h = obj->cur.geometry.h; +} diff --git a/src/lib/canvas/evas_object_main.c b/src/lib/canvas/evas_object_main.c new file mode 100644 index 0000000..a585ce6 --- /dev/null +++ b/src/lib/canvas/evas_object_main.c @@ -0,0 +1,1424 @@ +#include "evas_common.h" +#include "evas_private.h" + +/* FIXME: this broken e17's mouse cursor - need to figure out why */ + +/* uncomment the next line if smart objects should be informed + * if they are moved to the position they are already in + * (e.g. if they are in 0,0 and you call evas_object_move(o, 0, 0) + */ +//#define FORWARD_NOOP_MOVES_TO_SMART_OBJS + +/* likewise, for resizes + */ +//#define FORWARD_NOOP_RESIZES_TO_SMART_OBJS + +static Evas_Object_List * +get_layer_objects_last(Evas_Layer *l) +{ + if( !l || !l->objects ) return NULL; + + return ((Evas_Object_List *)(l->objects))->last; +} + +/* evas internal stuff */ +Evas_Object * +evas_object_new(void) +{ + Evas_Object *obj; + + obj = calloc(1, sizeof(Evas_Object)); + if (!obj) return NULL; + + obj->magic = MAGIC_OBJ; + + return obj; +} + +void +evas_object_free(Evas_Object *obj, int clean_layer) +{ + int was_smart_child = 0; + + evas_object_grabs_cleanup(obj); + evas_object_intercept_cleanup(obj); + if (obj->smart.parent) was_smart_child = 1; + evas_object_smart_cleanup(obj); + obj->func->free(obj); + if (!was_smart_child) evas_object_release(obj, clean_layer); + if (obj->clip.clipees) + evas_list_free(obj->clip.clipees); + while (obj->clip.changes) + { + Evas_Rectangle *r; + + r = (Evas_Rectangle *)obj->clip.changes->data; + obj->clip.changes = evas_list_remove(obj->clip.changes, r); + free(r); + } + evas_object_event_callback_all_del(obj); + evas_object_event_callback_cleanup(obj); + while (obj->data.elements) + { + Evas_Data_Node *node; + + node = obj->data.elements->data; + obj->data.elements = evas_list_remove(obj->data.elements, node); + free(node); + } + obj->magic = 0; + if (obj->size_hints) free(obj->size_hints); + free(obj); +} + +void +evas_object_change(Evas_Object *obj) +{ + Evas_List *l; + + obj->layer->evas->changed = 1; + if (obj->changed) return; + evas_render_object_recalc(obj); + /* set changed flag on all objects this one clips too */ + for (l = obj->clip.clipees; l; l = l->next) + evas_object_change((Evas_Object *)l->data); + if (obj->smart.parent) evas_object_change(obj->smart.parent); +} + +void +evas_object_render_pre_visible_change(Evas_Rectangles *rects, Evas_Object *obj, int is_v, int was_v) +{ + if (obj->smart.smart) return ; + if (is_v == was_v) return ; + if (is_v) + { + evas_add_rect(rects, + obj->cur.cache.clip.x, + obj->cur.cache.clip.y, + obj->cur.cache.clip.w, + obj->cur.cache.clip.h); + } + else + { + evas_add_rect(rects, + obj->prev.cache.clip.x, + obj->prev.cache.clip.y, + obj->prev.cache.clip.w, + obj->prev.cache.clip.h); + } +} + +void +evas_object_render_pre_clipper_change(Evas_Rectangles *rects, Evas_Object *obj) +{ + if (obj->smart.smart) return ; + if (obj->cur.clipper == obj->prev.clipper) return ; + if ((obj->cur.clipper) && (obj->prev.clipper)) + { + /* get difference rects between clippers */ + evas_rects_return_difference_rects(rects, + obj->cur.clipper->cur.cache.clip.x, + obj->cur.clipper->cur.cache.clip.y, + obj->cur.clipper->cur.cache.clip.w, + obj->cur.clipper->cur.cache.clip.h, + obj->prev.clipper->prev.cache.clip.x, + obj->prev.clipper->prev.cache.clip.y, + obj->prev.clipper->prev.cache.clip.w, + obj->prev.clipper->prev.cache.clip.h); + } + else if (obj->cur.clipper) + { + evas_rects_return_difference_rects(rects, + obj->cur.geometry.x, + obj->cur.geometry.y, + obj->cur.geometry.w, + obj->cur.geometry.h, +//// rl = evas_rects_return_difference_rects(obj->cur.cache.geometry.x, +//// obj->cur.cache.geometry.y, +//// obj->cur.cache.geometry.w, +//// obj->cur.cache.geometry.h, + obj->cur.clipper->cur.cache.clip.x, + obj->cur.clipper->cur.cache.clip.y, + obj->cur.clipper->cur.cache.clip.w, + obj->cur.clipper->cur.cache.clip.h); + } + else if (obj->prev.clipper) + { + evas_rects_return_difference_rects(rects, + obj->prev.geometry.x, + obj->prev.geometry.y, + obj->prev.geometry.w, + obj->prev.geometry.h, +//// rl = evas_rects_return_difference_rects(obj->prev.cache.geometry.x, +//// obj->prev.cache.geometry.y, +//// obj->prev.cache.geometry.w, +//// obj->prev.cache.geometry.h, + obj->prev.clipper->prev.cache.clip.x, + obj->prev.clipper->prev.cache.clip.y, + obj->prev.clipper->prev.cache.clip.w, + obj->prev.clipper->prev.cache.clip.h); + } +} + +void +evas_object_render_pre_prev_cur_add(Evas_Rectangles *rects, Evas_Object *obj) +{ + evas_add_rect(rects, + obj->cur.geometry.x, + obj->cur.geometry.y, + obj->cur.geometry.w, + obj->cur.geometry.h); +//// obj->cur.cache.geometry.x, +//// obj->cur.cache.geometry.y, +//// obj->cur.cache.geometry.w, +//// obj->cur.cache.geometry.h); + evas_add_rect(rects, + obj->prev.geometry.x, + obj->prev.geometry.y, + obj->prev.geometry.w, + obj->prev.geometry.h); +//// obj->prev.cache.geometry.x, +//// obj->prev.cache.geometry.y, +//// obj->prev.cache.geometry.w, +//// obj->prev.cache.geometry.h); +} + +void +evas_object_render_pre_effect_updates(Evas_Rectangles *rects, Evas_Object *obj, int is_v, int was_v) +{ + Evas_Rectangle *r; + Evas_Object *clipper; + Evas_List *l; + unsigned int i; + int x, y, w, h; + + if (obj->smart.smart) goto end; + /* FIXME: was_v isn't used... why? */ + was_v = 0; + if (!obj->clip.clipees) + { + for (i = 0; i < rects->count; ++i) + { + /* get updates and clip to current clip */ + x = rects->array[i].x; + y = rects->array[i].y; + w = rects->array[i].w; + h = rects->array[i].h; + RECTS_CLIP_TO_RECT(x, y, w, h, + obj->cur.cache.clip.x, + obj->cur.cache.clip.y, + obj->cur.cache.clip.w, + obj->cur.cache.clip.h); + if ((w > 0) && (h > 0)) + obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output, + x, y, w, h); + /* get updates and clip to previous clip */ + x = rects->array[i].x; + y = rects->array[i].y; + w = rects->array[i].w; + h = rects->array[i].h; + RECTS_CLIP_TO_RECT(x, y, w, h, + obj->prev.cache.clip.x, + obj->prev.cache.clip.y, + obj->prev.cache.clip.w, + obj->prev.cache.clip.h); + if ((w > 0) && (h > 0)) + obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output, + x, y, w, h); + } + /* if the object is actually visible, take any parent clip changes */ + if (is_v) + { + clipper = obj->cur.clipper; + while (clipper) + { + for (l = clipper->clip.changes; l; l = l->next) + { + r = (Evas_Rectangle *)(l->data); + /* get updates and clip to current clip */ + x = r->x; y = r->y; w = r->w; h = r->h; + RECTS_CLIP_TO_RECT(x, y, w, h, + obj->cur.cache.clip.x, + obj->cur.cache.clip.y, + obj->cur.cache.clip.w, + obj->cur.cache.clip.h); + if ((w > 0) && (h > 0)) + obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output, + x, y, w, h); + /* get updates and clip to previous clip */ + x = r->x; y = r->y; w = r->w; h = r->h; + RECTS_CLIP_TO_RECT(x, y, w, h, + obj->prev.cache.clip.x, + obj->prev.cache.clip.y, + obj->prev.cache.clip.w, + obj->prev.cache.clip.h); + if ((w > 0) && (h > 0)) + obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output, + x, y, w, h); + } + clipper = clipper->cur.clipper; + } + } + } + else + { + while (obj->clip.changes) + { + free(obj->clip.changes->data); + obj->clip.changes = evas_list_remove(obj->clip.changes, obj->clip.changes->data); + } + for (i = 0; i < rects->count; ++i) + { + r = malloc(sizeof(Evas_Rectangle)); + if (!r) goto end; + + *r = rects->array[i]; + obj->clip.changes = evas_list_append(obj->clip.changes, r); + } + } + + end: + free(rects->array); + rects->array = NULL; + rects->count = 0; + rects->total = 0; +} + +int +evas_object_was_in_output_rect(Evas_Object *obj, int x, int y, int w, int h) +{ + if (obj->smart.smart) return 0; + /* assumes coords have been recalced */ + if ((RECTS_INTERSECT(x, y, w, h, + obj->prev.cache.clip.x, + obj->prev.cache.clip.y, + obj->prev.cache.clip.w, + obj->prev.cache.clip.h))) + return 1; + return 0; +} + +int +evas_object_was_visible(Evas_Object *obj) +{ + if (obj->smart.smart) return 0; + if ((obj->prev.visible) && + (obj->prev.cache.clip.visible) && + (obj->prev.cache.clip.a > 0)) + { + if (obj->func->was_visible) + return obj->func->was_visible(obj); + return 1; + } + return 0; +} + +int +evas_object_was_opaque(Evas_Object *obj) +{ + if (obj->smart.smart) return 0; + if (obj->prev.cache.clip.a == 255) + { + if (obj->func->was_opaque) + return obj->func->was_opaque(obj); + return 1; + } + return 0; +} + +int +evas_object_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + if (obj->smart.smart) return 0; + if (obj->func->is_inside) + return obj->func->is_inside(obj, x, y); + return 0; +} + +int +evas_object_was_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + if (obj->smart.smart) return 0; + if (obj->func->was_inside) + return obj->func->was_inside(obj, x, y); + return 0; +} +/* routines apps will call */ + +/** + * @defgroup Evas_Object_Group Generic Object Functions + * + * Functions that manipulate generic evas objects. + */ + +/** + * Deletes the given evas object and frees its memory. + * + * The object's 'free' callback is called when this function is called. + * If the object currently has the focus, its 'focus out' callback is + * also called. + * + * @param obj The given evas object. + * @ingroup Evas_Object_Group + */ +EAPI void +evas_object_del(Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + + if (obj->delete_me) return; + + evas_object_event_callback_call(obj, EVAS_CALLBACK_DEL, NULL); + if (obj->name) evas_object_name_set(obj, NULL); + if (!obj->layer) + { + evas_object_free(obj, 1); + return; + } + if (obj->focused) + { + obj->focused = 0; + obj->layer->evas->focused = NULL; + evas_object_event_callback_call(obj, EVAS_CALLBACK_FOCUS_OUT, NULL); + } + obj->layer->evas->pointer.mouse_grabbed -= obj->mouse_grabbed; + obj->mouse_grabbed = 0; + evas_object_hide(obj); + evas_object_grabs_cleanup(obj); + while (obj->clip.clipees) evas_object_clip_unset(obj->clip.clipees->data); + if (obj->cur.clipper) evas_object_clip_unset(obj); + if (obj->smart.smart) evas_object_smart_del(obj); + evas_object_event_callback_call(obj, EVAS_CALLBACK_FREE, NULL); + evas_object_smart_cleanup(obj); + obj->delete_me = 1; + evas_object_change(obj); +} + +/** + * Moves the given evas object to the given location. + * @param obj The given evas object. + * @param x X position to move the object to, in canvas units. + * @param y Y position to move the object to, in canvas units. + * @ingroup Evas_Object_Group + */ +EAPI void +evas_object_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + int is, was = 0, pass = 0; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (obj->delete_me) return; + if (evas_object_intercept_call_move(obj, x, y)) return; +#ifdef FORWARD_NOOP_MOVES_TO_SMART_OBJS + if (obj->smart.smart) + { + if (obj->smart.smart->smart_class->move) + obj->smart.smart->smart_class->move(obj, x, y); + } +#endif + if ((obj->cur.geometry.x == x) && + (obj->cur.geometry.y == y)) + { + evas_object_inform_call_move(obj); + return; + } +#ifndef FORWARD_NOOP_MOVES_TO_SMART_OBJS + if (obj->smart.smart) + { + if (obj->smart.smart->smart_class->move) + obj->smart.smart->smart_class->move(obj, x, y); + } +#endif + if (obj->layer->evas->events_frozen <= 0) + { + pass = evas_event_passes_through(obj); + if (!pass) + was = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + } + obj->cur.geometry.x = x; + obj->cur.geometry.y = y; +//// obj->cur.cache.geometry.validity = 0; + evas_object_change(obj); + evas_object_clip_dirty(obj); + if (obj->layer->evas->events_frozen <= 0) + { + evas_object_recalc_clippees(obj); + if (!pass) + { + if (!obj->smart.smart) + { + is = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + if ((is ^ was) && obj->cur.visible) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + } + } + } + evas_object_inform_call_move(obj); +} + +/** + * Changes the size of the given evas object. + * @param obj The given evas object. + * @param w The new width of the evas object. + * @param h The new height of the evas object. + * @ingroup Evas_Object_Group + */ +EAPI void +evas_object_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h) +{ + int is, was = 0, pass = 0; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (obj->delete_me) return; + if (w < 0.0) w = 0.0; if (h < 0.0) h = 0.0; + if (evas_object_intercept_call_resize(obj, w, h)) return; +#ifdef FORWARD_NOOP_RESIZES_TO_SMART_OBJS + if (obj->smart.smart) + { + if (obj->smart.smart->smart_class->resize) + obj->smart.smart->smart_class->resize(obj, w, h); + } +#endif + if ((obj->cur.geometry.w == w) && + (obj->cur.geometry.h == h)) + { + evas_object_inform_call_resize(obj); + return; + } +#ifndef FORWARD_NOOP_RESIZES_TO_SMART_OBJS + if (obj->smart.smart) + { + if (obj->smart.smart->smart_class->resize) + obj->smart.smart->smart_class->resize(obj, w, h); + } +#endif + if (obj->layer->evas->events_frozen <= 0) + { + pass = evas_event_passes_through(obj); + if (!pass) + was = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + } + obj->cur.geometry.w = w; + obj->cur.geometry.h = h; +//// obj->cur.cache.geometry.validity = 0; + evas_object_change(obj); + evas_object_clip_dirty(obj); + evas_object_recalc_clippees(obj); + if (obj->layer->evas->events_frozen <= 0) + { + // if (obj->func->coords_recalc) obj->func->coords_recalc(obj); + if (!pass) + { + if (!obj->smart.smart) + { + is = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + if ((is ^ was) && (obj->cur.visible)) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + } + } + } + evas_object_inform_call_resize(obj); +} + +/** + * Retrieves the position and rectangular size of the given evas object. + * + * Note that if any of @p x, @p y, @p w or @p h are @c NULL, the @c NULL + * parameters are ignored. + * + * @param obj The given evas object. + * @param x Pointer to an integer in which to store the X coordinate of + * the object. + * @param y Pointer to an integer in which to store the Y coordinate of + * the object. + * @param w Pointer to an integer in which to store the width of the + * object. + * @param h Pointer to an integer in which to store the height of the + * object. + * @ingroup Evas_Object_Group + */ +EAPI void +evas_object_geometry_get(const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (x) *x = 0; if (y) *y = 0; if (w) *w = 0; if (h) *h = 0; + return; + MAGIC_CHECK_END(); + if (obj->delete_me) + { + if (x) *x = 0; if (y) *y = 0; if (w) *w = 0; if (h) *h = 0; + return; + } + if (x) *x = obj->cur.geometry.x; + if (y) *y = obj->cur.geometry.y; + if (w) *w = obj->cur.geometry.w; + if (h) *h = obj->cur.geometry.h; +} + +/** + * @defgroup Evas_Object_Size_Hints_Group Generic Object Size Hints Functions + * + * Functions that deals with hints about object size. + */ + +/** + * Retrieves the size hint for the minimum size. + * + * This is not a size enforcement in any way, it's just a hint that should + * be used whenever appropriate. + * + * Note that if any of @p w or @p h are @c NULL, the @c NULL + * parameters are ignored. + * + * @param obj The given evas object. + * @param w Pointer to an integer in which to store the minimum width. + * @param h Pointer to an integer in which to store the minimum height. + * @ingroup Evas_Object_Size_Hints_Group + */ +EAPI void +evas_object_size_hint_min_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (w) *w = 0; if (h) *h = 0; + return; + MAGIC_CHECK_END(); + if ((!obj->size_hints) || obj->delete_me) + { + if (w) *w = 0; if (h) *h = 0; + return; + } + if (w) *w = obj->size_hints->min.w; + if (h) *h = obj->size_hints->min.h; +} + +/** + * Sets the size hint for the minimum size. + * + * This is not a size enforcement in any way, it's just a hint that should + * be used whenever appropriate. + * + * @param obj The given evas object. + * @param w Integer to use as the minimum width hint. + * @param h Integer to use as the minimum height hint. + * @ingroup Evas_Object_Size_Hints_Group + */ +EAPI void +evas_object_size_hint_min_set(Evas_Object *obj, Evas_Coord w, Evas_Coord h) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (obj->delete_me) + return; + if (!obj->size_hints) + obj->size_hints = calloc(1, sizeof(Evas_Size_Hints)); + + obj->size_hints->min.w = w; + obj->size_hints->min.h = h; + + evas_object_inform_call_changed_size_hints(obj); +} + +/** + * Retrieves the size hint for the maximum size. + * + * This is not a size enforcement in any way, it's just a hint that should + * be used whenever appropriate. + * + * Note that if any of @p w or @p h are @c NULL, the @c NULL + * parameters are ignored. + * + * @param obj The given evas object. + * @param w Pointer to an integer in which to store the maximum width. + * @param h Pointer to an integer in which to store the maximum height. + * @ingroup Evas_Object_Size_Hints_Group + */ +EAPI void +evas_object_size_hint_max_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (w) *w = 0; if (h) *h = 0; + return; + MAGIC_CHECK_END(); + if ((!obj->size_hints) || obj->delete_me) + { + if (w) *w = 0; if (h) *h = 0; + return; + } + if (w) *w = obj->size_hints->max.w; + if (h) *h = obj->size_hints->max.h; +} + +/** + * Sets the size hint for the maximum size. + * + * This is not a size enforcement in any way, it's just a hint that should + * be used whenever appropriate. + * + * @param obj The given evas object. + * @param w Integer to use as the maximum width hint. + * @param h Integer to use as the maximum height hint. + * @ingroup Evas_Object_Size_Hints_Group + */ +EAPI void +evas_object_size_hint_max_set(Evas_Object *obj, Evas_Coord w, Evas_Coord h) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (obj->delete_me) + return; + if (!obj->size_hints) + obj->size_hints = calloc(1, sizeof(Evas_Size_Hints)); + + obj->size_hints->max.w = w; + obj->size_hints->max.h = h; + + evas_object_inform_call_changed_size_hints(obj); +} + +/** + * Retrieves the size request hint. + * + * This is not a size enforcement in any way, it's just a hint that should + * be used whenever appropriate. + * + * Note that if any of @p w or @p h are @c NULL, the @c NULL + * parameters are ignored. + * + * @param obj The given evas object. + * @param w Pointer to an integer in which to store the requested width. + * @param h Pointer to an integer in which to store the requested height. + * @ingroup Evas_Object_Size_Hints_Group + */ +EAPI void +evas_object_size_hint_request_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (w) *w = 0; if (h) *h = 0; + return; + MAGIC_CHECK_END(); + if ((!obj->size_hints) || obj->delete_me) + { + if (w) *w = 0; if (h) *h = 0; + return; + } + if (w) *w = obj->size_hints->request.w; + if (h) *h = obj->size_hints->request.h; +} + +/** + * Sets the requested size hint. + * + * This is not a size enforcement in any way, it's just a hint that should + * be used whenever appropriate. + * + * @param obj The given evas object. + * @param w Integer to use as the preferred width hint. + * @param h Integer to use as the preferred height hint. + * @ingroup Evas_Object_Size_Hints_Group + */ +EAPI void +evas_object_size_hint_request_set(Evas_Object *obj, Evas_Coord w, Evas_Coord h) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (obj->delete_me) + return; + if (!obj->size_hints) + obj->size_hints = calloc(1, sizeof(Evas_Size_Hints)); + + obj->size_hints->request.w = w; + obj->size_hints->request.h = h; + + evas_object_inform_call_changed_size_hints(obj); +} + +/** + * Retrieves the size aspect control hint. + * + * This is not a size enforcement in any way, it's just a hint that should + * be used whenever appropriate. + * + * Note that if any of @p aspect, @p w or @p h are @c NULL, the @c NULL + * parameters are ignored. + * + * @param obj The given evas object. + * @param aspect Returns the hint on how size should be calculated. + * @param w Pointer to an integer in which to store the aspect width. + * @param h Pointer to an integer in which to store the aspect height. + * @ingroup Evas_Object_Size_Hints_Group + */ +EAPI void +evas_object_size_hint_aspect_get(const Evas_Object *obj, Evas_Aspect_Control *aspect, Evas_Coord *w, Evas_Coord *h) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (aspect) *aspect = EVAS_ASPECT_CONTROL_NONE; + if (w) *w = 0; if (h) *h = 0; + return; + MAGIC_CHECK_END(); + if ((!obj->size_hints) || obj->delete_me) + { + if (aspect) *aspect = EVAS_ASPECT_CONTROL_NONE; + if (w) *w = 0; if (h) *h = 0; + return; + } + if (aspect) *aspect = obj->size_hints->aspect.mode; + if (w) *w = obj->size_hints->aspect.size.w; + if (h) *h = obj->size_hints->aspect.size.h; +} + +/** + * Sets the size aspect control hint. + * + * This is not a size enforcement in any way, it's just a hint that should + * be used whenever appropriate. + * + * @param obj The given evas object. + * @param aspect Hint on how to calculate size. + * @param w Integer to use as aspect width hint. + * @param h Integer to use as aspect height hint. + * @ingroup Evas_Object_Size_Hints_Group + */ +EAPI void +evas_object_size_hint_aspect_set(Evas_Object *obj, Evas_Aspect_Control aspect, Evas_Coord w, Evas_Coord h) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (obj->delete_me) + return; + if (!obj->size_hints) + obj->size_hints = calloc(1, sizeof(Evas_Size_Hints)); + + obj->size_hints->aspect.mode = aspect; + obj->size_hints->aspect.size.w = w; + obj->size_hints->aspect.size.h = h; + + evas_object_inform_call_changed_size_hints(obj); +} + + +/** + * @defgroup Evas_Object_Visibility_Group Generic Object Visibility Functions + * + * Functions that deal with the visibility of evas objects. + */ + +/** + * Makes the given evas object visible. + * @param obj The given evas object. + * @ingroup Evas_Object_Visibility_Group + */ +EAPI void +evas_object_show(Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (obj->delete_me) return; + if (evas_object_intercept_call_show(obj)) return; + if (obj->smart.smart) + { + if (obj->smart.smart->smart_class->show) + obj->smart.smart->smart_class->show(obj); + } + if (obj->cur.visible) + { + evas_object_inform_call_show(obj); + return; + } + obj->cur.visible = 1; + evas_object_change(obj); + evas_object_clip_dirty(obj); + if (obj->layer->evas->events_frozen <= 0) + { + evas_object_recalc_clippees(obj); + if (!evas_event_passes_through(obj)) + { + if (!obj->smart.smart) + { + if (evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1)) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + } + } + } + evas_object_inform_call_show(obj); +} + +/** + * Makes the given evas object invisible. + * @param obj The given evas object. + * @ingroup Evas_Object_Visibility_Group + */ +EAPI void +evas_object_hide(Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (obj->delete_me) return; + if (evas_object_intercept_call_hide(obj)) return; + if (obj->smart.smart) + { + if (obj->smart.smart->smart_class->hide) + obj->smart.smart->smart_class->hide(obj); + } + if (!obj->cur.visible) + { + evas_object_inform_call_hide(obj); + return; + } + obj->cur.visible = 0; + evas_object_change(obj); + evas_object_clip_dirty(obj); + if (obj->layer->evas->events_frozen <= 0) + { + evas_object_recalc_clippees(obj); + if (!evas_event_passes_through(obj)) + { + if (!obj->smart.smart) + { + if (evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1)) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + if (obj->delete_me) return; + if (obj->mouse_grabbed > 0) + { +// if (obj->layer->evas->pointer.mouse_grabbed >= obj->mouse_grabbed) + obj->layer->evas->pointer.mouse_grabbed -= obj->mouse_grabbed; + } + { + if ((obj->mouse_in) || (obj->mouse_grabbed > 0)) + { + obj->layer->evas->pointer.object.in = evas_list_remove(obj->layer->evas->pointer.object.in, obj); + } + obj->mouse_grabbed = 0; + if (obj->layer->evas->events_frozen > 0) + { + obj->mouse_in = 0; + return; + } + if (obj->mouse_in) + { + Evas_Event_Mouse_Out ev; + + obj->mouse_in = 0; + ev.buttons = obj->layer->evas->pointer.button; + ev.output.x = obj->layer->evas->pointer.x; + ev.output.y = obj->layer->evas->pointer.y; + ev.canvas.x = obj->layer->evas->pointer.x; + ev.canvas.y = obj->layer->evas->pointer.y; + ev.data = NULL; + ev.modifiers = &(obj->layer->evas->modifiers); + ev.locks = &(obj->layer->evas->locks); + evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev); + } + } + } + } + } + else + { + if ((obj->mouse_in) || (obj->mouse_grabbed > 0)) + obj->layer->evas->pointer.object.in = evas_list_remove(obj->layer->evas->pointer.object.in, obj); + obj->mouse_grabbed = 0; + obj->mouse_in = 0; + } + evas_object_inform_call_hide(obj); +} + +/** + * Retrieves whether or not the given evas object is visible. + * @param obj The given evas object. + * @return @c 1 if the object is visible. @c 0 otherwise. + * @ingroup Evas_Object_Visibility_Group + */ +EAPI Evas_Bool +evas_object_visible_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + if (obj->delete_me) return 0; + return obj->cur.visible; +} + +/** + * Sets the general colour of the given evas object to the given colour. + * @param obj The given evas object. + * @param r The red component of the given colour. + * @param g The green component of the given colour. + * @param b The blue component of the given colour. + * @param a The alpha component of the given colour. + * @ingroup Evas_Object_Group + */ +EAPI void +evas_object_color_set(Evas_Object *obj, int r, int g, int b, int a) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (obj->delete_me) return; + if (r > 255) r = 255; if (r < 0) r = 0; + if (g > 255) g = 255; if (g < 0) g = 0; + if (b > 255) b = 255; if (b < 0) b = 0; + if (a > 255) a = 255; if (a < 0) a = 0; + if (evas_object_intercept_call_color_set(obj, r, g, b, a)) return; + if (obj->smart.smart) + { + if (obj->smart.smart->smart_class->color_set) + obj->smart.smart->smart_class->color_set(obj, r, g, b, a); + } + if ((obj->cur.color.r == r) && + (obj->cur.color.g == g) && + (obj->cur.color.b == b) && + (obj->cur.color.a == a)) return; + obj->cur.color.r = r; + obj->cur.color.g = g; + obj->cur.color.b = b; + if ((obj->cur.color.a == 0) && (a == 0)) return; + obj->cur.color.a = a; + evas_object_change(obj); +} + +/** + * Retrieves the general colour of the given evas object. + * + * Note that if any of @p r, @p g, @p b or @p a are @c NULL, then the + * @c NULL parameters are ignored. + * + * @param obj The given evas object. + * @param r Pointer to an integer in which to store the red component of + * the colour. + * @param g Pointer to an integer in which to store the green component of + * the colour. + * @param b Pointer to an integer in which to store the blue component of + * the colour. + * @param a Pointer to an integer in which to store the alpha component of + * the colour. + * @ingroup Evas_Object_Group + */ +EAPI void +evas_object_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (r) *r = 0; if (g) *g = 0; if (b) *b = 0; if (a) *a = 0; + return; + MAGIC_CHECK_END(); + if (obj->delete_me) + { + if (r) *r = 0; if (g) *g = 0; if (b) *b = 0; if (a) *a = 0; + return; + } + if (r) *r = obj->cur.color.r; + if (g) *g = obj->cur.color.g; + if (b) *b = obj->cur.color.b; + if (a) *a = obj->cur.color.a; +} + +/** + * Sets whether or not the given evas object is to be drawn anti_aliased. + * @param obj The given evas object. + * @param anti_alias. 1 if the object is to be anti_aliased, 0 otherwise. + * @ingroup Evas_Object_Group + */ +EAPI void +evas_object_anti_alias_set(Evas_Object *obj, Evas_Bool anti_alias) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (obj->delete_me) return; + if (obj->cur.anti_alias == !!anti_alias) + return; + obj->cur.anti_alias = !!anti_alias; + evas_object_change(obj); +} + + +/** + * Retrieves whether or not the given evas object is to be drawn anti_aliased. + * @param obj The given evas object. + * @return @c 1 if the object is to be anti_aliased. @c 0 otherwise. + * @ingroup Evas_Object_Group + */ +EAPI Evas_Bool +evas_object_anti_alias_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + if (obj->delete_me) return 0; + return obj->cur.anti_alias; +} + +/** + * Sets the color_space to be used for linear interpolation of colors. + * @param obj The given evas object. + * @param color_space, one of EVAS_COLOR_SPACE_ARGB or EVAS_COLOR_SPACE_AHSV. + * @ingroup Evas_Object_Group + */ +EAPI void +evas_object_color_interpolation_set(Evas_Object *obj, int color_space) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (obj->delete_me) return; + if (obj->cur.interpolation_color_space == color_space) + return; + obj->cur.interpolation_color_space = color_space; + evas_object_change(obj); +} + + +/** + * Retrieves the current value of the color space used for linear interpolation. + * @param obj The given evas object. + * @return @c EVAS_COLOR_SPACE_ARGB or EVAS_COLOR_SPACE_AHSV. + * @ingroup Evas_Object_Group + */ +EAPI int +evas_object_color_interpolation_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + if (obj->delete_me) return 0; + return obj->cur.interpolation_color_space; +} + +/** + * Sets the render_op to be used for rendering the evas object. + * @param obj The given evas object. + * @param render_op one of the Evas_Render_Op values. + * @ingroup Evas_Object_Group + */ +EAPI void +evas_object_render_op_set(Evas_Object *obj, Evas_Render_Op render_op) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (obj->delete_me) return; + if ((Evas_Render_Op)obj->cur.render_op == render_op) + return; + obj->cur.render_op = render_op; + evas_object_change(obj); +} + + +/** + * Retrieves the current value of the operation used for rendering the evas object. + * @param obj The given evas object. + * @return one of the enumerated values in Evas_Render_Op. + * @ingroup Evas_Object_Group + */ +EAPI Evas_Render_Op +evas_object_render_op_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + if (obj->delete_me) return EVAS_RENDER_BLEND; + return obj->cur.render_op; +} + +/** + * Retrieves the evas that the given evas object is on. + * @param obj The given evas object. + * @return The evas that the object is on. + * @ingroup Evas_Object_Group + */ +EAPI Evas * +evas_object_evas_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (obj->delete_me) return 0; + return obj->layer->evas; +} + +/** + * @defgroup Evas_Object_Finders Object Finder Functions + * + * Functions that determine what evas objects are at a given location + * or within a given region of an evas. + */ + +/** + * To be documented. + * + * FIXME: To be fixed. + * @ingroup Evas_Object_Finders + */ +EAPI Evas_Object * +evas_object_top_at_xy_get(const Evas *e, Evas_Coord x, Evas_Coord y, Evas_Bool include_pass_events_objects, Evas_Bool include_hidden_objects) +{ + Evas_Object_List *l; + int xx, yy; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + xx = x; + yy = y; +//// xx = evas_coord_world_x_to_screen(e, x); +//// yy = evas_coord_world_y_to_screen(e, y); + for (l = ((Evas_Object_List *)(e->layers))->last; l; l = l->prev) + { + Evas_Object_List *l2; + Evas_Layer *lay; + + lay = (Evas_Layer *)l; + for (l2 = get_layer_objects_last(lay); l2; l2 = l2->prev) + { + Evas_Object *obj; + + obj = (Evas_Object *)l2; + if (obj->delete_me) continue; + if ((!include_pass_events_objects) && (evas_event_passes_through(obj))) continue; + if ((!include_hidden_objects) && (!obj->cur.visible)) continue; + evas_object_clip_recalc(obj); + if ((evas_object_is_in_output_rect(obj, xx, yy, 1, 1)) && + (!obj->clip.clipees)) + return obj; + } + } + return NULL; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * @ingroup Evas_Object_Finders + */ +EAPI Evas_Object * +evas_object_top_at_pointer_get(const Evas *e) +{ +//// return evas_object_top_at_xy_get(e, e->pointer.canvas_x, e->pointer.canvas_y, 0, 0); + return evas_object_top_at_xy_get(e, e->pointer.x, e->pointer.y, 1, 1); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * @ingroup Evas_Object_Finders + */ +EAPI Evas_Object * +evas_object_top_in_rectangle_get(const Evas *e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Evas_Bool include_pass_events_objects, Evas_Bool include_hidden_objects) +{ + Evas_Object_List *l; + int xx, yy, ww, hh; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + xx = x; + yy = y; + ww = w; + hh = h; +//// xx = evas_coord_world_x_to_screen(e, x); +//// yy = evas_coord_world_y_to_screen(e, y); +//// ww = evas_coord_world_x_to_screen(e, w); +//// hh = evas_coord_world_y_to_screen(e, h); + if (ww < 1) ww = 1; + if (hh < 1) hh = 1; + for (l = ((Evas_Object_List *)(e->layers))->last; l; l = l->prev) + { + Evas_Object_List *l2; + Evas_Layer *lay; + + lay = (Evas_Layer *)l; + for (l2 = get_layer_objects_last(lay); l2; l2 = l2->prev) + { + Evas_Object *obj; + + obj = (Evas_Object *)l2; + if (obj->delete_me) continue; + if ((!include_pass_events_objects) && (evas_event_passes_through(obj))) continue; + if ((!include_hidden_objects) && (!obj->cur.visible)) continue; + evas_object_clip_recalc(obj); + if ((evas_object_is_in_output_rect(obj, xx, yy, ww, hh)) && + (!obj->clip.clipees)) + return obj; + } + } + return NULL; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * @ingroup Evas_Object_Finders + */ +EAPI Evas_List * +evas_objects_at_xy_get(const Evas *e, Evas_Coord x, Evas_Coord y, Evas_Bool include_pass_events_objects, Evas_Bool include_hidden_objects) +{ + Evas_List *in = NULL; + Evas_Object_List *l; + int xx, yy; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + xx = x; + yy = y; +//// xx = evas_coord_world_x_to_screen(e, x); +//// yy = evas_coord_world_y_to_screen(e, y); + for (l = ((Evas_Object_List *)(e->layers))->last; l; l = l->prev) + { + Evas_Object_List *l2; + Evas_Layer *lay; + + lay = (Evas_Layer *)l; + for (l2 = get_layer_objects_last(lay); l2; l2 = l2->prev) + { + Evas_Object *obj; + + obj = (Evas_Object *)l2; + if (obj->delete_me) continue; + if ((!include_pass_events_objects) && (evas_event_passes_through(obj))) continue; + if ((!include_hidden_objects) && (!obj->cur.visible)) continue; + evas_object_clip_recalc(obj); + if ((evas_object_is_in_output_rect(obj, xx, yy, 1, 1)) && + (!obj->clip.clipees)) + in = evas_list_prepend(in, obj); + } + } + return in; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * @ingroup Evas_Object_Finders + */ +EAPI Evas_List * +evas_objects_in_rectangle_get(const Evas *e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Evas_Bool include_pass_events_objects, Evas_Bool include_hidden_objects) +{ + Evas_List *in = NULL; + Evas_Object_List *l; + int xx, yy, ww, hh; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + xx = x; + yy = y; + ww = w; + hh = h; +//// xx = evas_coord_world_x_to_screen(e, x); +//// yy = evas_coord_world_y_to_screen(e, y); +//// ww = evas_coord_world_x_to_screen(e, w); +//// hh = evas_coord_world_y_to_screen(e, h); + if (ww < 1) ww = 1; + if (hh < 1) hh = 1; + for (l = ((Evas_Object_List *)(e->layers))->last; l; l = l->prev) + { + Evas_Object_List *l2; + Evas_Layer *lay; + + lay = (Evas_Layer *)l; + for (l2 = get_layer_objects_last(lay); l2; l2 = l2->prev) + { + Evas_Object *obj; + + obj = (Evas_Object *)l2; + if (obj->delete_me) continue; + if ((!include_pass_events_objects) && (evas_event_passes_through(obj))) continue; + if ((!include_hidden_objects) && (!obj->cur.visible)) continue; + evas_object_clip_recalc(obj); + if ((evas_object_is_in_output_rect(obj, xx, yy, ww, hh)) && + (!obj->clip.clipees)) + in = evas_list_prepend(in, obj); + } + } + return in; +} + +/** + * Retrieves the name of the type of the given evas object. + * @param obj The given object. + * @return The name. + * @ingroup Evas_Object_Group + */ +EAPI const char * +evas_object_type_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (obj->delete_me) return ""; + return obj->type; +} + +/** + * Set whether to use a precise (usually expensive) point collision detection. + * @param obj The given object. + * @param precise wheter to use a precise point collision detection or not + * The default value is false. + * @ingroup Evas_Object_Group + */ +EAPI void +evas_object_precise_is_inside_set(Evas_Object *obj, Evas_Bool precise) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + obj->precise_is_inside = precise; +} + +/** + * Determine whether an object is set to use a precise point collision detection. + * @param obj The given object. + * @ingroup Evas_Object_Group + */ +EAPI Evas_Bool +evas_object_precise_is_inside_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + return obj->precise_is_inside; +} diff --git a/src/lib/canvas/evas_object_polygon.c b/src/lib/canvas/evas_object_polygon.c new file mode 100644 index 0000000..d327a61 --- /dev/null +++ b/src/lib/canvas/evas_object_polygon.c @@ -0,0 +1,460 @@ +#include "evas_common.h" +#include "evas_private.h" + +/* private magic number for polygon objects */ +static const char o_type[] = "polygon"; + +/* private struct for line object internal data */ +typedef struct _Evas_Object_Polygon Evas_Object_Polygon; +typedef struct _Evas_Polygon_Point Evas_Polygon_Point; + +struct _Evas_Object_Polygon +{ + DATA32 magic; + Evas_List *points; + + void *engine_data; + + char changed : 1; +}; + +struct _Evas_Polygon_Point +{ + Evas_Coord x, y; +}; + +/* private methods for polygon objects */ +static void evas_object_polygon_init(Evas_Object *obj); +static void *evas_object_polygon_new(void); +static void evas_object_polygon_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y); +static void evas_object_polygon_free(Evas_Object *obj); +static void evas_object_polygon_render_pre(Evas_Object *obj); +static void evas_object_polygon_render_post(Evas_Object *obj); + +static int evas_object_polygon_is_opaque(Evas_Object *obj); +static int evas_object_polygon_was_opaque(Evas_Object *obj); +static int evas_object_polygon_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y); +static int evas_object_polygon_was_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y); + +static const Evas_Object_Func object_func = +{ + /* methods (compulsory) */ + evas_object_polygon_free, + evas_object_polygon_render, + evas_object_polygon_render_pre, + evas_object_polygon_render_post, + /* these are optional. NULL = nothing */ + NULL, + NULL, + NULL, + NULL, + evas_object_polygon_is_opaque, + evas_object_polygon_was_opaque, + evas_object_polygon_is_inside, + evas_object_polygon_was_inside, + NULL +}; + +/* the actual api call to add a rect */ +/* it has no other api calls as all properties are standard */ + +/** + * @defgroup Evas_Polygon_Group Polygon Functions + * + * Functions that operate on evas polygon objects. + */ + +/** + * Adds a new evas polygon object to the given evas. + * @param e The given evas. + * @return A new evas polygon object. + * @ingroup Evas_Polygon_Group + */ +EAPI Evas_Object * +evas_object_polygon_add(Evas *e) +{ + Evas_Object *obj; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + obj = evas_object_new(); + evas_object_polygon_init(obj); + evas_object_inject(obj, e); + return obj; +} + +/** + * Adds the given point to the given evas polygon object. + * @param obj The given evas polygon object. + * @param x The X coordinate of the given point. + * @param y The Y coordinate of the given point. + * @ingroup Evas_Polygon_Group + */ +EAPI void +evas_object_polygon_point_add(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + Evas_Object_Polygon *o; + Evas_Polygon_Point *p; + Evas_Coord min_x, max_x, min_y, max_y; + int is, was = 0; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Polygon *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Polygon, MAGIC_OBJ_POLYGON); + return; + MAGIC_CHECK_END(); + if (obj->layer->evas->events_frozen != 0) + { + if (!evas_event_passes_through(obj)) + was = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + } + p = malloc(sizeof(Evas_Polygon_Point)); + if (!p) return; + p->x = x; + p->y = y; + + if (!o->points) + { + obj->cur.geometry.x = p->x; + obj->cur.geometry.y = p->y; + obj->cur.geometry.w = 2.0; + obj->cur.geometry.h = 2.0; + } + else + { + if (x < obj->cur.geometry.x) min_x = x; + else min_x = obj->cur.geometry.x; + if (x > (obj->cur.geometry.x + obj->cur.geometry.w - 2.0)) max_x = x; + else max_x = obj->cur.geometry.x + obj->cur.geometry.w - 2.0; + if (y < obj->cur.geometry.y) min_y = y; + else min_y = obj->cur.geometry.y; + if (y > (obj->cur.geometry.y + obj->cur.geometry.h - 2.0)) max_y = y; + else max_y = obj->cur.geometry.y + obj->cur.geometry.h - 2.0; + obj->cur.geometry.x = min_x; + obj->cur.geometry.y = min_y; + obj->cur.geometry.w = max_x - min_x + 2.0; + obj->cur.geometry.h = max_y - min_y + 2.0; + } + o->points = evas_list_append(o->points, p); + +//// obj->cur.cache.geometry.validity = 0; + o->changed = 1; + evas_object_change(obj); + evas_object_coords_recalc(obj); + if (obj->layer->evas->events_frozen != 0) + { + is = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + if (!evas_event_passes_through(obj)) + { + if ((is ^ was) && obj->cur.visible) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + } + } + evas_object_inform_call_move(obj); + evas_object_inform_call_resize(obj); +} + +/** + * Removes all of the points from the given evas polygon object. + * @param obj The given polygon object. + * @ingroup Evas_Polygon_Group + */ +EAPI void +evas_object_polygon_points_clear(Evas_Object *obj) +{ + Evas_Object_Polygon *o; + int is, was; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Polygon *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Polygon, MAGIC_OBJ_POLYGON); + return; + MAGIC_CHECK_END(); + was = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + while (o->points) + { + free(o->points->data); + o->points = evas_list_remove(o->points, o->points->data); + } + obj->cur.geometry.w = 0; + obj->cur.geometry.h = 0; +//// obj->cur.cache.geometry.validity = 0; + o->changed = 1; + evas_object_change(obj); + evas_object_coords_recalc(obj); + is = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + if ((is || was) && obj->cur.visible) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + evas_object_inform_call_move(obj); + evas_object_inform_call_resize(obj); +} + + + + + +/* all nice and private */ +static void +evas_object_polygon_init(Evas_Object *obj) +{ + /* alloc image ob, setup methods and default values */ + obj->object_data = evas_object_polygon_new(); + /* set up default settings for this kind of object */ + obj->cur.color.r = 255; + obj->cur.color.g = 255; + obj->cur.color.b = 255; + obj->cur.color.a = 255; + obj->cur.geometry.x = 0.0; + obj->cur.geometry.y = 0.0; + obj->cur.geometry.w = 0.0; + obj->cur.geometry.h = 0.0; + obj->cur.layer = 0; + /* set up object-specific settings */ + obj->prev = obj->cur; + /* set up methods (compulsory) */ + obj->func = &object_func; + obj->type = o_type; +} + +static void * +evas_object_polygon_new(void) +{ + Evas_Object_Polygon *o; + + /* alloc obj private data */ + o = calloc(1, sizeof(Evas_Object_Polygon)); + o->magic = MAGIC_OBJ_POLYGON; + return o; +} + +static void +evas_object_polygon_free(Evas_Object *obj) +{ + Evas_Object_Polygon *o; + + /* frees private object data. very simple here */ + o = (Evas_Object_Polygon *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Polygon, MAGIC_OBJ_POLYGON); + return; + MAGIC_CHECK_END(); + /* free obj */ + while (o->points) + { + free(o->points->data); + o->points = evas_list_remove(o->points, o->points->data); + } + o->engine_data = obj->layer->evas->engine.func->polygon_points_clear(obj->layer->evas->engine.data.output, + obj->layer->evas->engine.data.context, + o->engine_data); + o->magic = 0; + free(o); +} + +static void +evas_object_polygon_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y) +{ + Evas_Object_Polygon *o; + Evas_List *l; + + /* render object to surface with context, and offxet by x,y */ + o = (Evas_Object_Polygon *)(obj->object_data); + obj->layer->evas->engine.func->context_color_set(output, + context, + obj->cur.cache.clip.r, + obj->cur.cache.clip.g, + obj->cur.cache.clip.b, + obj->cur.cache.clip.a); + obj->layer->evas->engine.func->context_multiplier_unset(output, + context); + obj->layer->evas->engine.func->context_render_op_set(output, context, + obj->cur.render_op); + o->engine_data = obj->layer->evas->engine.func->polygon_points_clear(obj->layer->evas->engine.data.output, + obj->layer->evas->engine.data.context, + o->engine_data); + for (l = o->points; l; l = l->next) + { + Evas_Polygon_Point *p; + //int px, py; + + p = l->data; + + //px = evas_coord_world_x_to_screen(obj->layer->evas, p->x); + //py = evas_coord_world_y_to_screen(obj->layer->evas, p->y); + o->engine_data = obj->layer->evas->engine.func->polygon_point_add(obj->layer->evas->engine.data.output, + obj->layer->evas->engine.data.context, + o->engine_data, + p->x + x, p->y + y); + } + if (o->engine_data) + obj->layer->evas->engine.func->polygon_draw(output, + context, + surface, + o->engine_data); +} + +static void +evas_object_polygon_render_pre(Evas_Object *obj) +{ + Evas_Rectangles rects = { 0, 0, NULL }; + Evas_Object_Polygon *o; + int is_v, was_v; + + /* dont pre-render the obj twice! */ + if (obj->pre_render_done) return; + obj->pre_render_done = 1; + /* pre-render phase. this does anything an object needs to do just before */ + /* rendering. this could mean loading the image data, retrieving it from */ + /* elsewhere, decoding video etc. */ + /* then when this is done the object needs to figure if it changed and */ + /* if so what and where and add the appropriate redraw lines */ + o = (Evas_Object_Polygon *)(obj->object_data); + /* if someone is clipping this obj - go calculate the clipper */ + if (obj->cur.clipper) + { + if (obj->cur.cache.clip.dirty) + evas_object_clip_recalc(obj->cur.clipper); + obj->cur.clipper->func->render_pre(obj->cur.clipper); + } + /* now figure what changed and add draw rects */ + /* if it just became visible or invisible */ + is_v = evas_object_is_visible(obj); + was_v = evas_object_was_visible(obj); + if (is_v != was_v) + { + evas_object_render_pre_visible_change(&rects, obj, is_v, was_v); + goto done; + } + /* it's not visible - we accounted for it appearing or not so just abort */ + if (!is_v) goto done; + /* clipper changed this is in addition to anything else for obj */ + evas_object_render_pre_clipper_change(&rects, obj); + /* if we restacked (layer or just within a layer) */ + if (obj->restack) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + /* if it changed render op */ + if (obj->cur.render_op != obj->prev.render_op) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + /* if it changed color */ + if ((obj->cur.color.r != obj->prev.color.r) || + (obj->cur.color.g != obj->prev.color.g) || + (obj->cur.color.b != obj->prev.color.b) || + (obj->cur.color.a != obj->prev.color.a)) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + /* if it changed geometry - and obviously not visibility or color */ + /* caluclate differences since we have a constant color fill */ + /* we really only need to update the differences */ + if ((obj->cur.geometry.x != obj->prev.geometry.x) || + (obj->cur.geometry.y != obj->prev.geometry.y) || + (obj->cur.geometry.w != obj->prev.geometry.w) || + (obj->cur.geometry.h != obj->prev.geometry.h) || + (o->changed)) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + done: + evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v); +} + +static void +evas_object_polygon_render_post(Evas_Object *obj) +{ + Evas_Object_Polygon *o; + + /* this moves the current data to the previous state parts of the object */ + /* in whatever way is safest for the object. also if we don't need object */ + /* data anymore we can free it if the object deems this is a good idea */ + o = (Evas_Object_Polygon *)(obj->object_data); + /* remove those pesky changes */ + while (obj->clip.changes) + { + Evas_Rectangle *r; + + r = (Evas_Rectangle *)obj->clip.changes->data; + obj->clip.changes = evas_list_remove(obj->clip.changes, r); + free(r); + } + /* move cur to prev safely for object data */ + obj->prev = obj->cur; + o->changed = 0; +} + +static int +evas_object_polygon_is_opaque(Evas_Object *obj) +{ + Evas_Object_Polygon *o; + + /* this returns 1 if the internal object data implies that the object is */ + /* currently fully opaque over the entire line it occupies */ + o = (Evas_Object_Polygon *)(obj->object_data); + return 0; +} + +static int +evas_object_polygon_was_opaque(Evas_Object *obj) +{ + Evas_Object_Polygon *o; + + /* this returns 1 if the internal object data implies that the object was */ + /* previously fully opaque over the entire line it occupies */ + o = (Evas_Object_Polygon *)(obj->object_data); + return 0; +} + +static int +evas_object_polygon_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + Evas_Object_Polygon *o; + + /* this returns 1 if the canvas co-ordinates are inside the object based */ + /* on object private data. not much use for rects, but for polys, images */ + /* and other complex objects it might be */ + o = (Evas_Object_Polygon *)(obj->object_data); + return 1; + x = 0; + y = 0; +} + +static int +evas_object_polygon_was_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y) +{ + Evas_Object_Polygon *o; + + /* this returns 1 if the canvas co-ordinates were inside the object based */ + /* on object private data. not much use for rects, but for polys, images */ + /* and other complex objects it might be */ + o = (Evas_Object_Polygon *)(obj->object_data); + return 1; + x = 0; + y = 0; +} diff --git a/src/lib/canvas/evas_object_rectangle.c b/src/lib/canvas/evas_object_rectangle.c new file mode 100644 index 0000000..306877b --- /dev/null +++ b/src/lib/canvas/evas_object_rectangle.c @@ -0,0 +1,376 @@ +#include "evas_common.h" +#include "evas_private.h" + +/* private magic number for rectangle objects */ +static const char o_type[] = "rectangle"; + +/* private struct for rectangle object internal data */ +typedef struct _Evas_Object_Rectangle Evas_Object_Rectangle; + +struct _Evas_Object_Rectangle +{ + DATA32 magic; + void *engine_data; +}; + +/* private methods for rectangle objects */ +static void evas_object_rectangle_init(Evas_Object *obj); +static void *evas_object_rectangle_new(void); +static void evas_object_rectangle_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y); +static void evas_object_rectangle_free(Evas_Object *obj); +static void evas_object_rectangle_render_pre(Evas_Object *obj); +static void evas_object_rectangle_render_post(Evas_Object *obj); +static int evas_object_rectangle_is_opaque(Evas_Object *obj); +static int evas_object_rectangle_was_opaque(Evas_Object *obj); + +#if 0 /* usless calls for a rect object. much more useful for images etc. */ +static void evas_object_rectangle_store(Evas_Object *obj); +static void evas_object_rectangle_unstore(Evas_Object *obj); +static int evas_object_rectangle_is_visible(Evas_Object *obj); +static int evas_object_rectangle_was_visible(Evas_Object *obj); +static int evas_object_rectangle_is_inside(Evas_Object *obj, double x, double y); +static int evas_object_rectangle_was_inside(Evas_Object *obj, double x, double y); +#endif + +static const Evas_Object_Func object_func = +{ + /* methods (compulsory) */ + evas_object_rectangle_free, + evas_object_rectangle_render, + evas_object_rectangle_render_pre, + evas_object_rectangle_render_post, + /* these are optional. NULL = nothing */ + NULL, + NULL, + NULL, + NULL, + evas_object_rectangle_is_opaque, + evas_object_rectangle_was_opaque, + NULL, + NULL, + NULL +}; + +/* the actual api call to add a rect */ +/* it has no other api calls as all properties are standard */ + +/** + * Adds a rectangle to the given evas. + * @param e The given evas. + * @return The new rectangle object. + * @todo Find a documentation group to put this under. + */ +EAPI Evas_Object * +evas_object_rectangle_add(Evas *e) +{ + Evas_Object *obj; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + obj = evas_object_new(); + evas_object_rectangle_init(obj); + evas_object_inject(obj, e); + return obj; +} + + + + + + +/* all nice and private */ +static void +evas_object_rectangle_init(Evas_Object *obj) +{ + /* alloc image ob, setup methods and default values */ + obj->object_data = evas_object_rectangle_new(); + /* set up default settings for this kind of object */ + obj->cur.color.r = 255; + obj->cur.color.g = 255; + obj->cur.color.b = 255; + obj->cur.color.a = 255; + obj->cur.geometry.x = 0; + obj->cur.geometry.y = 0; + obj->cur.geometry.w = 0; + obj->cur.geometry.h = 0; + obj->cur.layer = 0; + obj->cur.render_op = EVAS_RENDER_BLEND; + /* set up object-specific settings */ + obj->prev = obj->cur; + /* set up methods (compulsory) */ + obj->func = &object_func; + obj->type = o_type; +} + +static void * +evas_object_rectangle_new(void) +{ + Evas_Object_Rectangle *o; + + /* alloc obj private data */ + o = calloc(1, sizeof(Evas_Object_Rectangle)); + o->magic = MAGIC_OBJ_RECTANGLE; + return o; +} + +static void +evas_object_rectangle_free(Evas_Object *obj) +{ + Evas_Object_Rectangle *o; + + /* frees private object data. very simple here */ + o = (Evas_Object_Rectangle *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Rectangle, MAGIC_OBJ_RECTANGLE); + return; + MAGIC_CHECK_END(); + /* free obj */ + o->magic = 0; + free(o); +} + +static void +evas_object_rectangle_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y) +{ + Evas_Object_Rectangle *o; + + /* render object to surface with context, and offxet by x,y */ + o = (Evas_Object_Rectangle *)(obj->object_data); + obj->layer->evas->engine.func->context_color_set(output, + context, + obj->cur.cache.clip.r, + obj->cur.cache.clip.g, + obj->cur.cache.clip.b, + obj->cur.cache.clip.a); + obj->layer->evas->engine.func->context_multiplier_unset(output, + context); + obj->layer->evas->engine.func->context_render_op_set(output, context, + obj->cur.render_op); + obj->layer->evas->engine.func->rectangle_draw(output, + context, + surface, + obj->cur.geometry.x + x, + obj->cur.geometry.y + y, + obj->cur.geometry.w, + obj->cur.geometry.h); +//// obj->cur.cache.geometry.x + x, +//// obj->cur.cache.geometry.y + y, +//// obj->cur.cache.geometry.w, +//// obj->cur.cache.geometry.h); +} + +static void +evas_object_rectangle_render_pre(Evas_Object *obj) +{ + Evas_Rectangles rects = { 0, 0, NULL }; + Evas_Object_Rectangle *o; + int is_v, was_v; + + /* dont pre-render the obj twice! */ + if (obj->pre_render_done) return; + obj->pre_render_done = 1; + /* pre-render phase. this does anything an object needs to do just before */ + /* rendering. this could mean loading the image data, retrieving it from */ + /* elsewhere, decoding video etc. */ + /* then when this is done the object needs to figure if it changed and */ + /* if so what and where and add the appropriate redraw rectangles */ + o = (Evas_Object_Rectangle *)(obj->object_data); + /* if someone is clipping this obj - go calculate the clipper */ + if (obj->cur.clipper) + { + if (obj->cur.cache.clip.dirty) + evas_object_clip_recalc(obj->cur.clipper); + obj->cur.clipper->func->render_pre(obj->cur.clipper); + } + /* now figure what changed and add draw rects */ + /* if it just became visible or invisible */ + is_v = evas_object_is_visible(obj); + was_v = evas_object_was_visible(obj); + if (is_v != was_v) + { + evas_object_render_pre_visible_change(&rects, obj, is_v, was_v); + goto done; + } + /* it's not visible - we accounted for it appearing or not so just abort */ + if (!is_v) goto done; + /* clipper changed this is in addition to anything else for obj */ + evas_object_render_pre_clipper_change(&rects, obj); + /* if we restacked (layer or just within a layer) and don't clip anyone */ + if ((obj->restack) && (!obj->clip.clipees)) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + /* if it changed render op */ + if (obj->cur.render_op != obj->prev.render_op) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + /* if it changed color */ + if ((obj->cur.color.r != obj->prev.color.r) || + (obj->cur.color.g != obj->prev.color.g) || + (obj->cur.color.b != obj->prev.color.b) || + (obj->cur.color.a != obj->prev.color.a)) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + /* if it changed geometry - and obviously not visibility or color */ + /* caluclate differences since we have a constant color fill */ + /* we really only need to update the differences */ + if ((obj->cur.geometry.x != obj->prev.geometry.x) || + (obj->cur.geometry.y != obj->prev.geometry.y) || + (obj->cur.geometry.w != obj->prev.geometry.w) || + (obj->cur.geometry.h != obj->prev.geometry.h)) + { + evas_rects_return_difference_rects(&rects, + obj->cur.geometry.x, + obj->cur.geometry.y, + obj->cur.geometry.w, + obj->cur.geometry.h, + obj->prev.geometry.x, + obj->prev.geometry.y, + obj->prev.geometry.w, + obj->prev.geometry.h); +//// rl = evas_rects_return_difference_rects(obj->cur.cache.geometry.x, +//// obj->cur.cache.geometry.y, +//// obj->cur.cache.geometry.w, +//// obj->cur.cache.geometry.h, +//// obj->prev.cache.geometry.x, +//// obj->prev.cache.geometry.y, +//// obj->prev.cache.geometry.w, +//// obj->prev.cache.geometry.h); + goto done; + } + /* it obviously didn't change - add a NO obscure - this "unupdates" this */ + /* area so if there were updates for it they get wiped. don't do it if we */ + /* arent fully opaque and we are visible */ + /* + if (evas_object_is_visible(obj) && + evas_object_is_opaque(obj) && + (!obj->clip.clipees)) + obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output, + obj->cur.cache.clip.x, + obj->cur.cache.clip.y, + obj->cur.cache.clip.w, + obj->cur.cache.clip.h); + */ + done: + evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v); +} + +static void +evas_object_rectangle_render_post(Evas_Object *obj) +{ + Evas_Object_Rectangle *o; + + /* this moves the current data to the previous state parts of the object */ + /* in whatever way is safest for the object. also if we don't need object */ + /* data anymore we can free it if the object deems this is a good idea */ + o = (Evas_Object_Rectangle *)(obj->object_data); + /* remove those pesky changes */ + while (obj->clip.changes) + { + Evas_Rectangle *r; + + r = (Evas_Rectangle *)obj->clip.changes->data; + obj->clip.changes = evas_list_remove(obj->clip.changes, r); + free(r); + } + /* move cur to prev safely for object data */ + obj->prev = obj->cur; +} + +static int +evas_object_rectangle_is_opaque(Evas_Object *obj) +{ + Evas_Object_Rectangle *o; + + /* this returns 1 if the internal object data implies that the object is */ + /* currently fully opaque over the entire rectangle it occupies */ + o = (Evas_Object_Rectangle *)(obj->object_data); + if (obj->cur.render_op == EVAS_RENDER_COPY) + return 1; + if (obj->cur.render_op != EVAS_RENDER_BLEND) + return 0; + return 1; +} + +static int +evas_object_rectangle_was_opaque(Evas_Object *obj) +{ + Evas_Object_Rectangle *o; + + /* this returns 1 if the internal object data implies that the object was */ + /* previously fully opaque over the entire rectangle it occupies */ + o = (Evas_Object_Rectangle *)(obj->object_data); + if (obj->prev.render_op == EVAS_RENDER_COPY) + return 1; + if (obj->prev.render_op != EVAS_RENDER_BLEND) + return 0; + return 1; +} + +#if 0 /* usless calls for a rect object. much more useful for images etc. */ +static void +evas_object_rectangle_store(Evas_Object *obj) +{ + /* store... nothing for rectangle objects... it's a bit silly */ + /* but for others that may have expensive caluclations to do to */ + /* generate the object data, hint that they might want to be pre-calced */ + /* once and stored */ +} + +static void +evas_object_rectangle_unstore(Evas_Object *obj) +{ + /* store... nothing for rectangle objects... it's a bit silly */ +} + +static int +evas_object_rectangle_is_visible(Evas_Object *obj) +{ + Evas_Object_Rectangle *o; + + /* this returns 1 if the internal object data would imply that it is */ + /* visible (ie drawing it draws something. this is not to do with events */ + o = (Evas_Object_Rectangle *)(obj->object_data); + return 1; +} + +static int +evas_object_rectangle_was_visible(Evas_Object *obj) +{ + Evas_Object_Rectangle *o; + + /* this returns 1 if the internal object data would imply that it was */ + /* visible (ie drawing it draws something. this is not to do with events */ + o = (Evas_Object_Rectangle *)(obj->object_data); + return 1; +} + +static int +evas_object_rectangle_is_inside(Evas_Object *obj, double x, double y) +{ + Evas_Object_Rectangle *o; + + /* this returns 1 if the canvas co-ordinates are inside the object based */ + /* on object private data. not much use for rects, but for polys, images */ + /* and other complex objects it might be */ + o = (Evas_Object_Rectangle *)(obj->object_data); + return 1; +} + +static int +evas_object_rectangle_was_inside(Evas_Object *obj, double x, double y) +{ + Evas_Object_Rectangle *o; + + /* this returns 1 if the canvas co-ordinates were inside the object based */ + /* on object private data. not much use for rects, but for polys, images */ + /* and other complex objects it might be */ + o = (Evas_Object_Rectangle *)(obj->object_data); + return 1; +} +#endif diff --git a/src/lib/canvas/evas_object_smart.c b/src/lib/canvas/evas_object_smart.c new file mode 100644 index 0000000..aaffd3e --- /dev/null +++ b/src/lib/canvas/evas_object_smart.c @@ -0,0 +1,628 @@ +#include "evas_common.h" +#include "evas_private.h" + +typedef struct _Evas_Object_Smart Evas_Object_Smart; +typedef struct _Evas_Smart_Callback Evas_Smart_Callback; + +struct _Evas_Object_Smart +{ + DATA32 magic; + void *engine_data; + void *data; + Evas_List *callbacks; + Evas_Object_List *contained; + int walking_list; + Evas_Bool deletions_waiting : 1; +}; + +struct _Evas_Smart_Callback +{ + const char *event; + void (*func) (void *data, Evas_Object *obj, void *event_info); + void *func_data; + char delete_me : 1; +}; + +/* private methods for smart objects */ +static void evas_object_smart_callbacks_clear(Evas_Object *obj); +static void evas_object_smart_init(Evas_Object *obj); +static void *evas_object_smart_new(void); +static void evas_object_smart_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y); +static void evas_object_smart_free(Evas_Object *obj); +static void evas_object_smart_render_pre(Evas_Object *obj); +static void evas_object_smart_render_post(Evas_Object *obj); + +static const Evas_Object_Func object_func = +{ + /* methods (compulsory) */ + evas_object_smart_free, + evas_object_smart_render, + evas_object_smart_render_pre, + evas_object_smart_render_post, + /* these are optional. NULL = nothing */ + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +/* public funcs */ +/** + * @defgroup Evas_Smart_Object_Group Evas Smart Object Functions + * + * Functions dealing with evas smart objects. + * + * Smart objects are groupings of primitive evas objects that behave as a + * cohesive group. For instance, a file manager icon may be a smart object + * composed of an image object, a text label and two rectangles that appear + * behind the image and text when the icon is selected. As a smart object, + * the normal evas api could be used on the icon object. + * + */ +/** + * Store a pointer to user data for a smart object. + * + * @param obj The smart object + * @param data A pointer to user data + * @ingroup Evas_Smart_Object_Group + */ +EAPI void +evas_object_smart_data_set(Evas_Object *obj, void *data) +{ + Evas_Object_Smart *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Smart *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART); + return; + MAGIC_CHECK_END(); + o->data = data; +} + +/** + * Retrieve user data stored on a smart object. + * + * @param obj The smart object + * @return A pointer to data stored using evas_object_smart_data_set(), or + * NULL if none has been set. + * @ingroup Evas_Smart_Object_Group + */ +EAPI void * +evas_object_smart_data_get(const Evas_Object *obj) +{ + Evas_Object_Smart *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + o = (Evas_Object_Smart *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART); + return NULL; + MAGIC_CHECK_END(); + return o->data; +} + +/** + * Get the Evas_Smart from which @p obj was created. + * + * @param obj a smart object + * @return the Evas_Smart + * @ingroup Evas_Smart_Object_Group + */ +EAPI Evas_Smart * +evas_object_smart_smart_get(const Evas_Object *obj) +{ + Evas_Object_Smart *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + o = (Evas_Object_Smart *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART); + return NULL; + MAGIC_CHECK_END(); + return obj->smart.smart; +} + +/** + * Set an evas object as a member of a smart object. + * + * @param obj The member object + * @param smart_obj The smart object + * + * Members will automatically be stacked and layered with the smart object. + * The various stacking function will operate on members relative to the + * other members instead of the entire canvas. + * + * Non-member objects can not interleave a smart object's members. + * + * @ingroup Evas_Smart_Object_Group + */ +EAPI void +evas_object_smart_member_add(Evas_Object *obj, Evas_Object *smart_obj) +{ + Evas_Object_Smart *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + MAGIC_CHECK(smart_obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Smart *)(smart_obj->object_data); + MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART); + return; + MAGIC_CHECK_END(); + + if (obj->delete_me) + { + printf("EVAS ERROR: Adding deleted object %p to smart obj %p\n", obj, smart_obj); + abort(); + return; + } + if (smart_obj->delete_me) + { + printf("EVAS ERROR: Adding object %p to deleted smart obj %p\n", obj, smart_obj); + abort(); + return; + } + if (obj->smart.parent == smart_obj) return; + + if (obj->smart.parent) evas_object_smart_member_del(obj); + + evas_object_release(obj, 1); + obj->layer = smart_obj->layer; + obj->cur.layer = obj->layer->layer; + obj->layer->usage++; + obj->smart.parent = smart_obj; + o->contained = evas_object_list_append(o->contained, obj); + evas_object_smart_member_cache_invalidate(obj); + obj->restack = 1; + evas_object_change(obj); +} + +/** + * Removes a member object from a smart object. + * + * @param obj the member object + * @ingroup Evas_Smart_Object_Group + * + * This removes a member object from a smart object. The object will still + * be on the canvas, but no longer associated with whichever smart object + * it was associated with. + * + */ +EAPI void +evas_object_smart_member_del(Evas_Object *obj) +{ + Evas_Object_Smart *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + + if (!obj->smart.parent) return; + + o = (Evas_Object_Smart *)(obj->smart.parent->object_data); + o->contained = evas_object_list_remove(o->contained, obj); + obj->smart.parent = NULL; + evas_object_smart_member_cache_invalidate(obj); + obj->layer->usage--; + obj->cur.layer = obj->layer->layer; + evas_object_inject(obj, obj->layer->evas); + obj->restack = 1; + evas_object_change(obj); +} + +/** + * Gets the smart parent of an Evas_Object + * @param obj the Evas_Object you want to get the parent + * @return Returns the smart parent of @a obj, or NULL if @a obj is not a smart member of another Evas_Object + * @ingroup Evas_Smart_Object_Group + */ +EAPI Evas_Object * +evas_object_smart_parent_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + + return obj->smart.parent; +} + +/** + * Gets the list of the member objects of an Evas_Object + * @param obj the Evas_Object you want to get the list of member objects + * @return Returns the list of the member objects of @a obj. + * The returned list should be freed with evas_list_free() when you no longer need it + */ +EAPI Evas_List * +evas_object_smart_members_get(const Evas_Object *obj) +{ + Evas_Object_Smart *o; + Evas_List *members; + Evas_Object_List *member; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + o = (Evas_Object_Smart *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART); + return NULL; + MAGIC_CHECK_END(); + + members = NULL; + for (member = o->contained; member; member = member->next) + members = evas_list_append(members, member); + + return members; +} + +const Evas_Object_List * +evas_object_smart_members_get_direct(const Evas_Object *obj) +{ + Evas_Object_Smart *o; + + o = (Evas_Object_Smart *)(obj->object_data); + return o->contained; +} + +/** + * Instantiates a new smart object described by @p s. + * + * @param e the evas on which to add the object + * @param s the Evas_Smart describing the smart object + * @return a new Evas_Object + * @ingroup Evas_Smart_Object_Group + */ +EAPI Evas_Object * +evas_object_smart_add(Evas *e, Evas_Smart *s) +{ + Evas_Object *obj; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + MAGIC_CHECK(s, Evas_Smart, MAGIC_SMART); + return NULL; + MAGIC_CHECK_END(); + + obj = evas_object_new(); + if (!obj) return NULL; + obj->smart.smart = s; + obj->type = s->smart_class->name; + evas_object_smart_init(obj); + evas_object_inject(obj, e); + + evas_object_smart_use(s); + + if (s->smart_class->add) s->smart_class->add(obj); + + return obj; +} + +/** + * Add a callback for the smart event specified by @p event. + * + * @param obj a smart object + * @param event the event name + * @param func the callback function + * @param data user data to be passed to the callback function + * @ingroup Evas_Smart_Object_Group + */ +EAPI void +evas_object_smart_callback_add(Evas_Object *obj, const char *event, void (*func) (void *data, Evas_Object *obj, void *event_info), const void *data) +{ + Evas_Object_Smart *o; + Evas_Smart_Callback *cb; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Smart *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART); + return; + MAGIC_CHECK_END(); + if (!event) return; + if (!func) return; + cb = calloc(1, sizeof(Evas_Smart_Callback)); + cb->event = evas_stringshare_add(event); + cb->func = func; + cb->func_data = (void *)data; + o->callbacks = evas_list_prepend(o->callbacks, cb); +} + +/** + * Remove a smart callback + * + * Removes a callback that was added by evas_object_smart_callback_add() + * + * @param obj a smart object + * @param event the event name + * @param func the callback function + * @return the data pointer + * @ingroup Evas_Smart_Object_Group + */ +EAPI void * +evas_object_smart_callback_del(Evas_Object *obj, const char *event, void (*func) (void *data, Evas_Object *obj, void *event_info)) +{ + Evas_Object_Smart *o; + Evas_List *l; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + o = (Evas_Object_Smart *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART); + return NULL; + MAGIC_CHECK_END(); + if (!event) return NULL; + for (l = o->callbacks; l; l = l->next) + { + Evas_Smart_Callback *cb; + + cb = l->data; + if ((!strcmp(cb->event, event)) && (cb->func == func)) + { + void *data; + + data = cb->func_data; + cb->delete_me = 1; + o->deletions_waiting = 1; + evas_object_smart_callbacks_clear(obj); + return data; + } + } + return NULL; +} + +/** + * Call any smart callbacks on @p obj for @p event. + * + * @param obj the smart object + * @param event the event name + * @param event_info an event specific struct of info to pass to the callback + * + * This should be called internally in the smart object when some specific + * event has occured. The documentation for the smart object should include + * a list of possible events and what type of @p event_info to expect. + * + * @ingroup Evas_Smart_Object_Group + */ +EAPI void +evas_object_smart_callback_call(Evas_Object *obj, const char *event, void *event_info) +{ + Evas_Object_Smart *o; + Evas_List *l; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Smart *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART); + return; + MAGIC_CHECK_END(); + if (!event) return; + if (obj->delete_me) return; + o->walking_list++; + for (l = o->callbacks; l; l = l->next) + { + Evas_Smart_Callback *cb; + + cb = l->data; + if (!cb->delete_me) + { + if (!strcmp(cb->event, event)) + cb->func(cb->func_data, obj, event_info); + } + if (obj->delete_me) + break; + } + o->walking_list--; + evas_object_smart_callbacks_clear(obj); +} + +/* internal calls */ +static void +evas_object_smart_callbacks_clear(Evas_Object *obj) +{ + Evas_Object_Smart *o; + Evas_List *l; + + o = (Evas_Object_Smart *)(obj->object_data); + + if (o->walking_list) return; + if (!o->deletions_waiting) return; + for (l = o->callbacks; l;) + { + Evas_Smart_Callback *cb; + + cb = l->data; + l = l->next; + if (cb->delete_me) + { + o->callbacks = evas_list_remove(o->callbacks, cb); + if (cb->event) evas_stringshare_del(cb->event); + free(cb); + } + } +} + +void +evas_object_smart_del(Evas_Object *obj) +{ + Evas_Smart *s; + + s = obj->smart.smart; + if (obj->delete_me) return; + if ((s) && (s->smart_class->del)) s->smart_class->del(obj); + if (obj->smart.parent) evas_object_smart_member_del(obj); + if (s) evas_object_smart_unuse(s); +} + +void +evas_object_smart_cleanup(Evas_Object *obj) +{ + Evas_Object_Smart *o; + + if (obj->smart.parent) + evas_object_smart_member_del(obj); + + o = (Evas_Object_Smart *)(obj->object_data); + if (o->magic == MAGIC_OBJ_SMART) + { + while (o->contained) + evas_object_smart_member_del((Evas_Object *)o->contained); + + while (o->callbacks) + { + Evas_Smart_Callback *cb; + + cb = o->callbacks->data; + o->callbacks = evas_list_remove(o->callbacks, cb); + if (cb->event) evas_stringshare_del(cb->event); + free(cb); + } + + o->data = NULL; + } + + obj->smart.parent = NULL; + obj->smart.smart = NULL; +} + +void +evas_object_smart_member_cache_invalidate(Evas_Object *obj) +{ + Evas_Object_Smart *o; + Evas_Object_List *l; + + o = (Evas_Object_Smart *)(obj->object_data); + if (o->magic != MAGIC_OBJ_SMART) + return; + + obj->parent_cache_valid = 0; + for (l = o->contained; l; l = l->next) + { + Evas_Object *obj2; + + obj2 = (Evas_Object *)l; + evas_object_smart_member_cache_invalidate(obj2); + } +} + +void +evas_object_smart_member_raise(Evas_Object *member) +{ + Evas_Object_Smart *o; + + o = (Evas_Object_Smart *)(member->smart.parent->object_data); + o->contained = evas_object_list_remove(o->contained, member); + o->contained = evas_object_list_append(o->contained, member); +} + +void +evas_object_smart_member_lower(Evas_Object *member) +{ + Evas_Object_Smart *o; + + o = (Evas_Object_Smart *)(member->smart.parent->object_data); + o->contained = evas_object_list_remove(o->contained, member); + o->contained = evas_object_list_prepend(o->contained, member); +} + +void +evas_object_smart_member_stack_above(Evas_Object *member, Evas_Object *other) +{ + Evas_Object_Smart *o; + + o = (Evas_Object_Smart *)(member->smart.parent->object_data); + o->contained = evas_object_list_remove(o->contained, member); + o->contained = evas_object_list_append_relative(o->contained, member, other); +} + +void +evas_object_smart_member_stack_below(Evas_Object *member, Evas_Object *other) +{ + Evas_Object_Smart *o; + + o = (Evas_Object_Smart *)(member->smart.parent->object_data); + o->contained = evas_object_list_remove(o->contained, member); + o->contained = evas_object_list_prepend_relative(o->contained, member, other); +} + +/* all nice and private */ +static void +evas_object_smart_init(Evas_Object *obj) +{ + /* alloc smart obj, setup methods and default values */ + obj->object_data = evas_object_smart_new(); + /* set up default settings for this kind of object */ + obj->cur.color.r = 255; + obj->cur.color.g = 255; + obj->cur.color.b = 255; + obj->cur.color.a = 255; + obj->cur.geometry.x = 0; + obj->cur.geometry.y = 0; + obj->cur.geometry.w = 0; + obj->cur.geometry.h = 0; + obj->cur.layer = 0; + /* set up object-specific settings */ + obj->prev = obj->cur; + /* set up methods (compulsory) */ + obj->func = &object_func; +} + +static void * +evas_object_smart_new(void) +{ + Evas_Object_Smart *o; + + /* alloc obj private data */ + o = calloc(1, sizeof(Evas_Object_Smart)); + o->magic = MAGIC_OBJ_SMART; + return o; +} + +static void +evas_object_smart_free(Evas_Object *obj) +{ + Evas_Object_Smart *o; + + /* frees private object data. very simple here */ + o = (Evas_Object_Smart *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Smart, MAGIC_OBJ_SMART); + return; + MAGIC_CHECK_END(); + /* free obj */ + o->magic = 0; + free(o); +} + +static void +evas_object_smart_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y) +{ + return; + obj = output = context = surface = NULL; + x = y = 0; +} + +static void +evas_object_smart_render_pre(Evas_Object *obj) +{ + if (obj->pre_render_done) return; + obj->pre_render_done = 1; +} + +static void +evas_object_smart_render_post(Evas_Object *obj) +{ + obj->prev = obj->cur; +} diff --git a/src/lib/canvas/evas_object_text.c b/src/lib/canvas/evas_object_text.c new file mode 100644 index 0000000..55a9648 --- /dev/null +++ b/src/lib/canvas/evas_object_text.c @@ -0,0 +1,1740 @@ +#include "evas_common.h" +#include "evas_private.h" + +/* save typing */ +#define ENFN obj->layer->evas->engine.func +#define ENDT obj->layer->evas->engine.data.output + +/* private magic number for text objects */ +static const char o_type[] = "text"; + +/* private struct for text object internal data */ +typedef struct _Evas_Object_Text Evas_Object_Text; + +struct _Evas_Object_Text +{ + DATA32 magic; + + struct { + const char *text; + const char *font; + const char *source; + Evas_Font_Size size; + struct { + unsigned char r, g, b, a; + } outline, shadow, glow, glow2; + + unsigned char style; + } cur, prev; + + float ascent, descent; + float max_ascent, max_descent; + + void *engine_data; + + char changed : 1; +}; + +/* private methods for text objects */ +static void evas_object_text_init(Evas_Object *obj); +static void *evas_object_text_new(void); +static void evas_object_text_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y); +static void evas_object_text_free(Evas_Object *obj); +static void evas_object_text_render_pre(Evas_Object *obj); +static void evas_object_text_render_post(Evas_Object *obj); + +static int evas_object_text_is_opaque(Evas_Object *obj); +static int evas_object_text_was_opaque(Evas_Object *obj); + +static const Evas_Object_Func object_func = +{ + /* methods (compulsory) */ + evas_object_text_free, + evas_object_text_render, + evas_object_text_render_pre, + evas_object_text_render_post, + /* these are optional. NULL = nothing */ + NULL, + NULL, + NULL, + NULL, + evas_object_text_is_opaque, + evas_object_text_was_opaque, + NULL, + NULL, + NULL +}; + +/* the actual api call to add a rect */ +/* it has no other api calls as all properties are standard */ + +/** + * Creates a new text @c Evas_Object on the provided @c Evas canvas. + * + * @param e The @c Evas canvas to create the text object upon. + * + * @see evas_object_text_font_source_set + * @see evas_object_text_font_set + * @see evas_object_text_text_set + * + * @returns NULL on error, A pointer to a new @c Evas_Object on success. + */ +EAPI Evas_Object * +evas_object_text_add(Evas *e) +{ + Evas_Object *obj; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + obj = evas_object_new(); + evas_object_text_init(obj); + evas_object_inject(obj, e); + return obj; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_text_font_source_set(Evas_Object *obj, const char *font_source) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return; + MAGIC_CHECK_END(); + + if ((o->cur.source) && (font_source) && + (!strcmp(o->cur.source, font_source))) + return; + if (o->cur.source) evas_stringshare_del(o->cur.source); + if (font_source) o->cur.source = evas_stringshare_add(font_source); + else o->cur.source = NULL; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI const char * +evas_object_text_font_source_get(const Evas_Object *obj) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return NULL; + MAGIC_CHECK_END(); + return o->cur.source; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_text_font_set(Evas_Object *obj, const char *font, Evas_Font_Size size) +{ + Evas_Object_Text *o; + int l = 0, r = 0, t = 0, b = 0; + int is, was = 0, pass = 0; + int same_font = 0; + + if (!font) return; + if (size <= 0) return; + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return; + MAGIC_CHECK_END(); + + if ((o->cur.font) && (font) && (!strcmp(o->cur.font, font))) + { + same_font = 1; + if (size == o->cur.size) return; + } + if (obj->layer->evas->events_frozen <= 0) + { + pass = evas_event_passes_through(obj); + if (!pass) + was = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + } + /* DO IT */ + if (o->engine_data) + { + evas_font_free(obj->layer->evas, o->engine_data); + o->engine_data = NULL; + } + o->engine_data = evas_font_load(obj->layer->evas, font, o->cur.source, size); + if (!same_font) + { + if (o->cur.font) evas_stringshare_del(o->cur.font); + if (font) o->cur.font = evas_stringshare_add(font); + else o->cur.font = NULL; + o->prev.font = NULL; + } + o->cur.size = size; + evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b); + if ((o->engine_data) && (o->cur.text)) + { + int w, h; + + ENFN->font_string_size_get(ENDT, + o->engine_data, + o->cur.text, + &w, &h); + o->ascent = ENFN->font_ascent_get(ENDT, o->engine_data); + o->descent = ENFN->font_descent_get(ENDT, o->engine_data); + o->max_ascent = ENFN->font_max_ascent_get(ENDT, o->engine_data); + o->max_descent = ENFN->font_max_descent_get(ENDT, o->engine_data); + obj->cur.geometry.w = w + l + r; + obj->cur.geometry.h = o->max_ascent + o->max_descent + t + b; +//// obj->cur.cache.geometry.validity = 0; + } + else + { + if (o->engine_data) + { + o->ascent = ENFN->font_ascent_get(ENDT, o->engine_data); + o->descent = ENFN->font_descent_get(ENDT, o->engine_data); + o->max_ascent = ENFN->font_max_ascent_get(ENDT, o->engine_data); + o->max_descent = ENFN->font_max_descent_get(ENDT, o->engine_data); + } + else + { + o->ascent = 0; + o->descent = 0; + o->max_ascent = 0; + o->max_descent = 0; + } + obj->cur.geometry.w = 0; + obj->cur.geometry.h = o->max_ascent + o->max_descent + t + b; +//// obj->cur.cache.geometry.validity = 0; + } + o->changed = 1; + evas_object_change(obj); + evas_object_coords_recalc(obj); + if (obj->layer->evas->events_frozen <= 0) + { + if (!pass) + { + is = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + if ((is ^ was) && obj->cur.visible) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + } + } + evas_object_inform_call_resize(obj); +} + +/** + * Query evas for font information of a text @c Evas_Object. + * + * This function allows the font name and size of a text @c Evas_Object as + * created with evas_object_text_add() to be queried. Be aware that the font + * name string is still owned by Evas and should NOT have free() called on + * it by the caller of the function. + * + * @param obj The evas text object to query for font information. + * @param font A pointer to the location to store the font name in (may be NULL). + * @param size A pointer to the location to store the font size in (may be NULL). + */ +EAPI void +evas_object_text_font_get(const Evas_Object *obj, const char **font, Evas_Font_Size *size) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + if (font) *font = ""; + if (size) *size = 0; + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + if (font) *font = ""; + if (size) *size = 0; + return; + MAGIC_CHECK_END(); + if (font) *font = o->cur.font; + if (size) *size = o->cur.size; +} + +/** + * Sets the text to be displayed by the given evas text object. + * @param obj Evas text object. + * @param text Text to display. + */ +EAPI void +evas_object_text_text_set(Evas_Object *obj, const char *text) +{ + Evas_Object_Text *o; + int is, was; + + if (!text) text = ""; + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return; + MAGIC_CHECK_END(); + if ((o->cur.text) && (text) && (!strcmp(o->cur.text, text))) return; + was = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + /* DO II */ + if (o->cur.text) evas_stringshare_del(o->cur.text); + if ((text) && (*text)) o->cur.text = evas_stringshare_add(text); + else o->cur.text = NULL; + o->prev.text = NULL; + if ((o->engine_data) && (o->cur.text)) + { + int w, h; + int l = 0, r = 0, t = 0, b = 0; + + ENFN->font_string_size_get(ENDT, + o->engine_data, + o->cur.text, + &w, &h); + evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b); + obj->cur.geometry.w = w + l + r; + obj->cur.geometry.h = h + t + b; +//// obj->cur.cache.geometry.validity = 0; + } + else + { + int t = 0, b = 0; + + evas_text_style_pad_get(o->cur.style, NULL, NULL, &t, &b); + obj->cur.geometry.w = 0; + obj->cur.geometry.h = o->max_ascent + o->max_descent + t + b; +//// obj->cur.cache.geometry.validity = 0; + } + o->changed = 1; + evas_object_change(obj); + evas_object_coords_recalc(obj); + is = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + if ((is || was) && obj->cur.visible) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + evas_object_inform_call_resize(obj); +} + +/** + * Retrieves the text currently being displayed by the given evas text object. + * @param obj The given evas text object. + * @return The text currently being displayed. Do not free it. + */ +EAPI const char * +evas_object_text_text_get(const Evas_Object *obj) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return NULL; + MAGIC_CHECK_END(); + return o->cur.text; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI Evas_Coord +evas_object_text_ascent_get(const Evas_Object *obj) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return 0; + MAGIC_CHECK_END(); + return o->ascent; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI Evas_Coord +evas_object_text_descent_get(const Evas_Object *obj) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return 0; + MAGIC_CHECK_END(); + return o->descent; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI Evas_Coord +evas_object_text_max_ascent_get(const Evas_Object *obj) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return 0; + MAGIC_CHECK_END(); + return o->max_ascent; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI Evas_Coord +evas_object_text_max_descent_get(const Evas_Object *obj) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return 0; + MAGIC_CHECK_END(); + return o->max_descent; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI Evas_Coord +evas_object_text_inset_get(const Evas_Object *obj) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return 0; + MAGIC_CHECK_END(); + if (!o->engine_data) return 0; + if (!o->cur.text) return 0; + return ENFN->font_inset_get(ENDT, o->engine_data, o->cur.text); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI Evas_Coord +evas_object_text_horiz_advance_get(const Evas_Object *obj) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return 0; + MAGIC_CHECK_END(); + if (!o->engine_data) return 0; + if (!o->cur.text) return 0; + return ENFN->font_h_advance_get(ENDT, o->engine_data, o->cur.text); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI Evas_Coord +evas_object_text_vert_advance_get(const Evas_Object *obj) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return 0; + MAGIC_CHECK_END(); + if (!o->engine_data) return 0; + if (!o->cur.text) return o->ascent + o->descent; + return ENFN->font_v_advance_get(ENDT, o->engine_data, o->cur.text); +} + +/** + * Retrieve position and dimension information of a character within a text @c Evas_Object. + * + * This function is used to obtain the X, Y, width and height of a the character + * located at @p pos within the @c Evas_Object @p obj. @p obj must be a text object + * as created with evas_object_text_add(). Any of the @c Evas_Coord parameters (@p cx, + * @p cy, @p cw, @p ch) may be NULL in which case no value will be assigned to that + * parameter. + * + * @param obj The text object to retrieve position information for. + * @param pos The character position to request co-ordinates for. + * @param cx A pointer to an @c Evas_Coord to store the X value in (can be NULL). + * @param cy A pointer to an @c Evas_Coord to store the Y value in (can be NULL). + * @param cw A pointer to an @c Evas_Coord to store the Width value in (can be NULL). + * @param ch A pointer to an @c Evas_Coord to store the Height value in (can be NULL). + * + * @returns 0 on error, 1 on success. + */ +EAPI int +evas_object_text_char_pos_get(const Evas_Object *obj, int pos, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) +{ + Evas_Object_Text *o; + int l = 0, r = 0, t = 0, b = 0; + int ret, x = 0, y = 0, w = 0, h = 0; + int inset; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return 0; + MAGIC_CHECK_END(); + if (!o->engine_data) return 0; + if (!o->cur.text) return 0; + inset = + ENFN->font_inset_get(ENDT, o->engine_data, o->cur.text); + ret = ENFN->font_char_coords_get(ENDT, o->engine_data, o->cur.text, + pos, + &x, &y, + &w, &h); + evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b); + y += o->max_ascent - t; + x -= inset + l; + if (x < 0) + { + w += x; + x = 0; + } + if (x + w > obj->cur.geometry.w) w = obj->cur.geometry.w - x; + if (w < 0) w = 0; + if (y < 0) + { + h += y; + y = 0; + } + if (y + h > obj->cur.geometry.h) h = obj->cur.geometry.h - y; + if (h < 0) h = 0; + if (cx) *cx = x; + if (cy) *cy = y; + if (cw) *cw = w + l + r; + if (ch) *ch = h + t + b; + return ret; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI int +evas_object_text_char_coords_get(const Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) +{ + Evas_Object_Text *o; + int l = 0, r = 0, t = 0, b = 0; + int ret, rx = 0, ry = 0, rw = 0, rh = 0; + int inset; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return -1; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return -1; + MAGIC_CHECK_END(); + if (!o->engine_data) return -1; + if (!o->cur.text) return -1; + inset = + ENFN->font_inset_get(ENDT, o->engine_data, o->cur.text); + ret = ENFN->font_char_at_coords_get(ENDT, + o->engine_data, + o->cur.text, + x + inset, + y - o->max_ascent, + &rx, &ry, + &rw, &rh); + evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b); + ry += o->max_ascent - t; + rx -= inset + l; + if (rx < 0) + { + rw += rx; + rx = 0; + } + if (rx + rw > obj->cur.geometry.w) rw = obj->cur.geometry.w - rx; + if (rw < 0) rw = 0; + if (ry < 0) + { + rh += ry; + ry = 0; + } + if (ry + rh > obj->cur.geometry.h) rh = obj->cur.geometry.h - ry; + if (rh < 0) rh = 0; + if (cx) *cx = rx; + if (cy) *cy = ry; + if (cw) *cw = rw + l + r; + if (ch) *ch = rh + t + b; + return ret; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_text_style_set(Evas_Object *obj, Evas_Text_Style_Type style) +{ + Evas_Object_Text *o; + int pl = 0, pr = 0, pt = 0, pb = 0, l = 0, r = 0, t = 0, b = 0; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return; + MAGIC_CHECK_END(); + if (o->cur.style == style) + return; + evas_text_style_pad_get(o->cur.style, &pl, &pr, &pt, &pb); + o->cur.style = style; + evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b); + if (o->cur.text) + obj->cur.geometry.w += (l - pl) + (r - pr); + else + obj->cur.geometry.w = 0; + obj->cur.geometry.h += (t - pt) + (b - pb); + evas_object_change(obj); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI Evas_Text_Style_Type +evas_object_text_style_get(const Evas_Object *obj) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return EVAS_TEXT_STYLE_PLAIN; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return EVAS_TEXT_STYLE_PLAIN; + MAGIC_CHECK_END(); + return o->cur.style; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_text_shadow_color_set(Evas_Object *obj, int r, int g, int b, int a) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return; + MAGIC_CHECK_END(); + if ((o->cur.shadow.r == r) && (o->cur.shadow.g == g) && + (o->cur.shadow.b == b) && (o->cur.shadow.a == a)) + return; + o->cur.shadow.r = r; + o->cur.shadow.g = g; + o->cur.shadow.b = b; + o->cur.shadow.a = a; + evas_object_change(obj); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_text_shadow_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return; + MAGIC_CHECK_END(); + if (r) *r = o->cur.shadow.r; + if (g) *g = o->cur.shadow.g; + if (b) *b = o->cur.shadow.b; + if (a) *a = o->cur.shadow.a; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_text_glow_color_set(Evas_Object *obj, int r, int g, int b, int a) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return; + MAGIC_CHECK_END(); + if ((o->cur.glow.r == r) && (o->cur.glow.g == g) && + (o->cur.glow.b == b) && (o->cur.glow.a == a)) + return; + o->cur.glow.r = r; + o->cur.glow.g = g; + o->cur.glow.b = b; + o->cur.glow.a = a; + evas_object_change(obj); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_text_glow_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return; + MAGIC_CHECK_END(); + if (r) *r = o->cur.glow.r; + if (g) *g = o->cur.glow.g; + if (b) *b = o->cur.glow.b; + if (a) *a = o->cur.glow.a; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_text_glow2_color_set(Evas_Object *obj, int r, int g, int b, int a) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return; + MAGIC_CHECK_END(); + if ((o->cur.glow2.r == r) && (o->cur.glow2.g == g) && + (o->cur.glow2.b == b) && (o->cur.glow2.a == a)) + return; + o->cur.glow2.r = r; + o->cur.glow2.g = g; + o->cur.glow2.b = b; + o->cur.glow2.a = a; + evas_object_change(obj); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_text_glow2_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return; + MAGIC_CHECK_END(); + if (r) *r = o->cur.glow2.r; + if (g) *g = o->cur.glow2.g; + if (b) *b = o->cur.glow2.b; + if (a) *a = o->cur.glow2.a; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_text_outline_color_set(Evas_Object *obj, int r, int g, int b, int a) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return; + MAGIC_CHECK_END(); + if ((o->cur.outline.r == r) && (o->cur.outline.g == g) && + (o->cur.outline.b == b) && (o->cur.outline.a == a)) + return; + o->cur.outline.r = r; + o->cur.outline.g = g; + o->cur.outline.b = b; + o->cur.outline.a = a; + evas_object_change(obj); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_text_outline_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return; + MAGIC_CHECK_END(); + if (r) *r = o->cur.outline.r; + if (g) *g = o->cur.outline.g; + if (b) *b = o->cur.outline.b; + if (a) *a = o->cur.outline.a; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_object_text_style_pad_get(const Evas_Object *obj, int *l, int *r, int *t, int *b) +{ + int sl = 0, sr = 0, st = 0, sb = 0; + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return; + MAGIC_CHECK_END(); + /* use temps to be certain we have initialized values */ + evas_text_style_pad_get(o->cur.style, &sl, &sr, &st, &sb); + if (l) *l = sl; + if (r) *r = sr; + if (t) *t = st; + if (b) *b = sb; +} + + +/** + * @defgroup Evas_Font_Path_Group Font Path Functions + * + * Functions that edit the paths being used to load fonts. + */ + +/** + * Removes all font paths loaded into memory for the given evas. + * @param e The given evas. + * @ingroup Evas_Font_Path_Group + */ +EAPI void +evas_font_path_clear(Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + while (e->font_path) + { + evas_stringshare_del(e->font_path->data); + e->font_path = evas_list_remove(e->font_path, e->font_path->data); + } +} + +/** + * Appends a font path to the list of font paths used by the given evas. + * @param e The given evas. + * @param path The new font path. + * @ingroup Evas_Font_Path_Group + */ +EAPI void +evas_font_path_append(Evas *e, const char *path) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + if (!path) return; + + e->font_path = evas_list_append(e->font_path, evas_stringshare_add(path)); +} + +/** + * Prepends a font path to the list of font paths used by the given evas. + * @param e The given evas. + * @param path The new font path. + * @ingroup Evas_Font_Path_Group + */ +EAPI void +evas_font_path_prepend(Evas *e, const char *path) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + if (!path) return; + e->font_path = evas_list_prepend(e->font_path, evas_stringshare_add(path)); +} + +/** + * Retrieves the list of font paths used by the given evas. + * @param e The given evas. + * @return The list of font paths used. + * @ingroup Evas_Font_Path_Group + */ +EAPI const Evas_List * +evas_font_path_list(const Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + return e->font_path; +} + +static void +evas_font_object_rehint(Evas_Object *obj) +{ + if (obj->smart.smart) + { + const Evas_Object_List *l3; + + for (l3 = evas_object_smart_members_get_direct(obj); l3; l3 = l3->next) + { + obj = (Evas_Object *)l3; + evas_font_object_rehint(obj); + } + } + else + { + if (!strcmp(obj->type, "text")) + _evas_object_text_rehint(obj); + if (!strcmp(obj->type, "textblock")) + _evas_object_textblock_rehint(obj); + } +} + +EAPI void +evas_font_hinting_set(Evas *e, Evas_Font_Hinting_Flags hinting) +{ + Evas_Object_List *l; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + if (e->hinting == hinting) return; + e->hinting = hinting; + for (l = (Evas_Object_List *)e->layers; l; l = l->next) + { + Evas_Object_List *l2; + Evas_Layer *lay; + + lay = (Evas_Layer *)l; + for (l2 = (Evas_Object_List *)lay->objects; l2; l2 = l2->next) + { + Evas_Object *obj; + + obj = (Evas_Object *)l2; + evas_font_object_rehint(obj); + } + } +} + +EAPI Evas_Font_Hinting_Flags +evas_font_hinting_get(const Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return EVAS_FONT_HINTING_BYTECODE; + MAGIC_CHECK_END(); + return e->hinting; +} + +EAPI Evas_Bool +evas_font_hinting_can_hint(const Evas *e, Evas_Font_Hinting_Flags hinting) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return 0; + MAGIC_CHECK_END(); + if (e->engine.func->font_hinting_can_hint) + return e->engine.func->font_hinting_can_hint(e->engine.data.output, + hinting); + return 0; +} + + + + + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_font_cache_flush(Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + e->engine.func->font_cache_flush(e->engine.data.output); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_font_cache_set(Evas *e, int size) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + if (size < 0) size = 0; + e->engine.func->font_cache_set(e->engine.data.output, size); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI int +evas_font_cache_get(const Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return 0; + MAGIC_CHECK_END(); + + return e->engine.func->font_cache_get(e->engine.data.output); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI Evas_List * +evas_font_available_list(const Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + + return evas_font_dir_available_list(e); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_font_available_list_free(Evas *e, Evas_List *available) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + return evas_font_dir_available_list_free(available); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI int +evas_string_char_next_get(const char *str, int pos, int *decoded) +{ + int p, d; + + if (decoded) *decoded = 0; + if (!str) return 0; + if (pos < 0) return 0; + p = pos; + d = evas_common_font_utf8_get_next((unsigned char *)str, &p); + if (decoded) *decoded = d; + return p; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI int +evas_string_char_prev_get(const char *str, int pos, int *decoded) +{ + int p, d; + + if (decoded) *decoded = 0; + if (!str) return 0; + if (pos < 1) return 0; + p = pos; + d = evas_common_font_utf8_get_prev((unsigned char *)str, &p); + if (decoded) *decoded = d; + return p; +} + +/** + * Get the minimum padding a style adds to the text. + * @param style The style to determine padding. + * @param l Pointer to the current left padding value + * @param r Pointer to the current right padding value + * @param t Pointer to the current top padding value + * @param b Pointer to the current bottom padding value + */ +void +evas_text_style_pad_get(Evas_Text_Style_Type style, int *l, int *r, int *t, int *b) +{ + int sl, sr, st, sb; + + if (l) sl = *l; + else sl = 0; + + if (r) sr = *r; + else sr = 0; + + if (t) st = *t; + else st = 0; + + if (b) sb = *b; + else sb = 0; + + if (style == EVAS_TEXT_STYLE_SHADOW) + { + if (sr < 1) sr = 1; + if (sb < 1) sb = 1; + } + else if (style == EVAS_TEXT_STYLE_OUTLINE) + { + if (sl < 1) sl = 1; + if (sr < 1) sr = 1; + if (st < 1) st = 1; + if (sb < 1) sb = 1; + } + else if (style == EVAS_TEXT_STYLE_SOFT_OUTLINE) + { + if (sl < 2) sl = 2; + if (sr < 2) sr = 2; + if (st < 2) st = 2; + if (sb < 2) sb = 2; + } + else if (style == EVAS_TEXT_STYLE_GLOW) + { + if (sl < 2) sl = 2; + if (sr < 2) sr = 2; + if (st < 2) st = 2; + if (sb < 2) sb = 2; + } + else if (style == EVAS_TEXT_STYLE_OUTLINE_SHADOW) + { + if (sl < 1) sl = 1; + if (sr < 2) sr = 2; + if (st < 1) st = 1; + if (sb < 2) sb = 2; + } + else if (style == EVAS_TEXT_STYLE_FAR_SHADOW) + { + if (sr < 2) sr = 2; + if (sb < 2) sb = 2; + } + else if (style == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW) + { + if (sl < 1) sl = 1; + if (sr < 3) sr = 3; + if (st < 1) st = 1; + if (sb < 3) sb = 3; + } + else if (style == EVAS_TEXT_STYLE_SOFT_SHADOW) + { + if (sl < 1) sl = 1; + if (sr < 3) sr = 3; + if (st < 1) st = 1; + if (sb < 3) sb = 3; + } + else if (style == EVAS_TEXT_STYLE_FAR_SOFT_SHADOW) + { + if (sr < 4) sr = 4; + if (sb < 4) sb = 4; + } + + if (l) *l = sl; + if (r) *r = sr; + if (t) *t = st; + if (b) *b = sb; +} + +/* all nice and private */ +static void +evas_object_text_init(Evas_Object *obj) +{ + /* alloc text ob, setup methods and default values */ + obj->object_data = evas_object_text_new(); + /* set up default settings for this kind of object */ + obj->cur.color.r = 255; + obj->cur.color.g = 255; + obj->cur.color.b = 255; + obj->cur.color.a = 255; + obj->cur.geometry.x = 0.0; + obj->cur.geometry.y = 0.0; + obj->cur.geometry.w = 0.0; + obj->cur.geometry.h = 0.0; + obj->cur.layer = 0; + /* set up object-specific settings */ + obj->prev = obj->cur; + /* set up methods (compulsory) */ + obj->func = &object_func; + obj->type = o_type; +} + +static void * +evas_object_text_new(void) +{ + Evas_Object_Text *o; + + /* alloc obj private data */ + o = calloc(1, sizeof(Evas_Object_Text)); + o->magic = MAGIC_OBJ_TEXT; + o->prev = o->cur; + return o; +} + +static void +evas_object_text_free(Evas_Object *obj) +{ + Evas_Object_Text *o; + + /* frees private object data. very simple here */ + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return; + MAGIC_CHECK_END(); + /* free obj */ + if (o->cur.text) evas_stringshare_del(o->cur.text); + if (o->cur.font) evas_stringshare_del(o->cur.font); + if (o->cur.source) evas_stringshare_del(o->cur.source); + if (o->engine_data) evas_font_free(obj->layer->evas, o->engine_data); + o->magic = 0; + free(o); +} + +static void +evas_object_text_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y) +{ + int i, j; + Evas_Object_Text *o; + const char vals[5][5] = + { + {0, 1, 2, 1, 0}, + {1, 3, 4, 3, 1}, + {2, 4, 5, 4, 2}, + {1, 3, 4, 3, 1}, + {0, 1, 2, 1, 0} + }; + int sl = 0, st = 0; + + /* render object to surface with context, and offxet by x,y */ + o = (Evas_Object_Text *)(obj->object_data); + evas_text_style_pad_get(o->cur.style, &sl, NULL, &st, NULL); + ENFN->context_multiplier_unset(output, context); + ENFN->context_render_op_set(output, context, obj->cur.render_op); +/* + ENFN->context_color_set(output, + context, + 230, 160, 30, 100); + ENFN->rectangle_draw(output, + context, + surface, + obj->cur.cache.geometry.x + x, + obj->cur.cache.geometry.y + y, + obj->cur.cache.geometry.w, + obj->cur.cache.geometry.h); + */ + +#define COLOR_ONLY_SET(object, sub, col) \ + ENFN->context_color_set(output, context, \ + object->sub.col.r, \ + object->sub.col.g, \ + object->sub.col.b, \ + object->sub.col.a); + +#define COLOR_SET(object, sub, col) \ + if (obj->cur.clipper)\ + ENFN->context_color_set(output, context, \ + ((int)object->sub.col.r * ((int)obj->cur.clipper->cur.cache.clip.r + 1)) >> 8, \ + ((int)object->sub.col.g * ((int)obj->cur.clipper->cur.cache.clip.g + 1)) >> 8, \ + ((int)object->sub.col.b * ((int)obj->cur.clipper->cur.cache.clip.b + 1)) >> 8, \ + ((int)object->sub.col.a * ((int)obj->cur.clipper->cur.cache.clip.a + 1)) >> 8); \ + else\ + ENFN->context_color_set(output, context, \ + object->sub.col.r, \ + object->sub.col.g, \ + object->sub.col.b, \ + object->sub.col.a); + +#define COLOR_SET_AMUL(object, sub, col, amul) \ + if (obj->cur.clipper) \ + ENFN->context_color_set(output, context, \ + (((int)object->sub.col.r) * ((int)obj->cur.clipper->cur.cache.clip.r) * (amul)) / 65025, \ + (((int)object->sub.col.g) * ((int)obj->cur.clipper->cur.cache.clip.g) * (amul)) / 65025, \ + (((int)object->sub.col.b) * ((int)obj->cur.clipper->cur.cache.clip.b) * (amul)) / 65025, \ + (((int)object->sub.col.a) * ((int)obj->cur.clipper->cur.cache.clip.a) * (amul)) / 65025); \ + else \ + ENFN->context_color_set(output, context, \ + (((int)object->sub.col.r) * (amul)) / 255, \ + (((int)object->sub.col.g) * (amul)) / 255, \ + (((int)object->sub.col.b) * (amul)) / 255, \ + (((int)object->sub.col.a) * (amul)) / 255); + + +#define DRAW_TEXT(ox, oy) \ + if ((o->engine_data) && (o->cur.text)) \ + ENFN->font_draw(output, \ + context, \ + surface, \ + o->engine_data, \ + obj->cur.geometry.x + x + sl + ox, \ + obj->cur.geometry.y + y + st + oy + \ + (int) \ + (((o->max_ascent * obj->cur.geometry.h) / obj->cur.geometry.h) - 0.5), \ + obj->cur.geometry.w, \ + obj->cur.geometry.h, \ + obj->cur.geometry.w, \ + obj->cur.geometry.h, \ + o->cur.text); +#if 0 +#define DRAW_TEXT(ox, oy) \ + if ((o->engine_data) && (o->cur.text)) \ + ENFN->font_draw(output, \ + context, \ + surface, \ + o->engine_data, \ + obj->cur.cache.geometry.x + x + sl + ox - \ + ENFN->font_inset_get(ENDT, o->engine_data, o->cur.text), \ + obj->cur.cache.geometry.y + y + st + oy + \ + (int) \ + (((o->max_ascent * obj->cur.cache.geometry.h) / obj->cur.geometry.h) - 0.5), \ + obj->cur.cache.geometry.w, \ + obj->cur.cache.geometry.h, \ + obj->cur.geometry.w, \ + obj->cur.geometry.h, \ + o->cur.text); +#endif + /* shadows */ + if (o->cur.style == EVAS_TEXT_STYLE_SHADOW) + { + COLOR_SET(o, cur, shadow); + DRAW_TEXT(1, 1); + } + else if ((o->cur.style == EVAS_TEXT_STYLE_OUTLINE_SHADOW) || + (o->cur.style == EVAS_TEXT_STYLE_FAR_SHADOW)) + { + COLOR_SET(o, cur, shadow); + DRAW_TEXT(2, 2); + } + else if ((o->cur.style == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW) || + (o->cur.style == EVAS_TEXT_STYLE_FAR_SOFT_SHADOW)) + { + for (j = 0; j < 5; j++) + { + for (i = 0; i < 5; i++) + { + if (vals[i][j] != 0) + { + COLOR_SET_AMUL(o, cur, shadow, vals[i][j] * 50); + DRAW_TEXT(i, j); + } + } + } + } + else if (o->cur.style == EVAS_TEXT_STYLE_SOFT_SHADOW) + { + for (j = 0; j < 5; j++) + { + for (i = 0; i < 5; i++) + { + if (vals[i][j] != 0) + { + COLOR_SET_AMUL(o, cur, shadow, vals[i][j] * 50); + DRAW_TEXT(i - 1, j - 1); + } + } + } + } + + /* glows */ + if (o->cur.style == EVAS_TEXT_STYLE_GLOW) + { + for (j = 0; j < 5; j++) + { + for (i = 0; i < 5; i++) + { + if (vals[i][j] != 0) + { + COLOR_SET_AMUL(o, cur, glow, vals[i][j] * 50); + DRAW_TEXT(i - 2, j - 2); + } + } + } + COLOR_SET(o, cur, glow2); + DRAW_TEXT(-1, 0); + DRAW_TEXT(1, 0); + DRAW_TEXT(0, -1); + DRAW_TEXT(0, 1); + } + + /* outlines */ + if ((o->cur.style == EVAS_TEXT_STYLE_OUTLINE) || + (o->cur.style == EVAS_TEXT_STYLE_OUTLINE_SHADOW) || + (o->cur.style == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW)) + { + COLOR_SET(o, cur, outline); + DRAW_TEXT(-1, 0); + DRAW_TEXT(1, 0); + DRAW_TEXT(0, -1); + DRAW_TEXT(0, 1); + } + else if (o->cur.style == EVAS_TEXT_STYLE_SOFT_OUTLINE) + { + for (j = 0; j < 5; j++) + { + for (i = 0; i < 5; i++) + { + if (((i != 2) || (j != 2)) && (vals[i][j] != 0)) + { + COLOR_SET_AMUL(o, cur, outline, vals[i][j] * 50); + DRAW_TEXT(i - 2, j - 2); + } + } + } + } + + /* normal text */ + COLOR_ONLY_SET(obj, cur.cache, clip); + DRAW_TEXT(0, 0); +} + +static void +evas_object_text_render_pre(Evas_Object *obj) +{ + Evas_Rectangles rects = { 0, 0, NULL }; + Evas_Object_Text *o; + int is_v, was_v; + + /* dont pre-render the obj twice! */ + if (obj->pre_render_done) return; + obj->pre_render_done = 1; + /* pre-render phase. this does anything an object needs to do just before */ + /* rendering. this could mean loading the image data, retrieving it from */ + /* elsewhere, decoding video etc. */ + /* then when this is done the object needs to figure if it changed and */ + /* if so what and where and add thr appropriate redraw rectangles */ + o = (Evas_Object_Text *)(obj->object_data); + /* if someone is clipping this obj - go calculate the clipper */ + if (obj->cur.clipper) + { + if (obj->cur.cache.clip.dirty) + evas_object_clip_recalc(obj->cur.clipper); + obj->cur.clipper->func->render_pre(obj->cur.clipper); + } + /* now figure what changed and add draw rects */ + /* if it just became visible or invisible */ + is_v = evas_object_is_visible(obj); + was_v = evas_object_was_visible(obj); + if (is_v != was_v) + { + evas_object_render_pre_visible_change(&rects, obj, is_v, was_v); + goto done; + } + /* its not visible - we accounted for it appearing or not so just abort */ + if (!is_v) goto done; + /* clipper changed this is in addition to anything else for obj */ + evas_object_render_pre_clipper_change(&rects, obj); + /* if we restacked (layer or just within a layer) and dont clip anyone */ + if (obj->restack) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + /* if it changed color */ + if ((obj->cur.color.r != obj->prev.color.r) || + (obj->cur.color.g != obj->prev.color.g) || + (obj->cur.color.b != obj->prev.color.b) || + (obj->cur.color.a != obj->prev.color.a)) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + /* if it changed geometry - and obviously not visibility or color */ + /* caluclate differences since we have a constant color fill */ + /* we really only need to update the differences */ + if ((obj->cur.geometry.x != obj->prev.geometry.x) || + (obj->cur.geometry.y != obj->prev.geometry.y) || + (obj->cur.geometry.w != obj->prev.geometry.w) || + (obj->cur.geometry.h != obj->prev.geometry.h)) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + if (obj->cur.render_op != obj->prev.render_op) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + if (o->changed) + { + if ((o->cur.size != o->prev.size) || + ((o->cur.font) && (o->prev.font) && (strcmp(o->cur.font, o->prev.font))) || + ((o->cur.font) && (!o->prev.font)) || + ((!o->cur.font) && (o->prev.font)) || + ((o->cur.text) && (o->prev.text) && (strcmp(o->cur.text, o->prev.text))) || + ((o->cur.text) && (!o->prev.text)) || + ((!o->cur.text) && (o->prev.text)) || + ((o->cur.style != o->prev.style)) || + ((o->cur.shadow.r != o->prev.shadow.r)) || + ((o->cur.shadow.g != o->prev.shadow.g)) || + ((o->cur.shadow.b != o->prev.shadow.b)) || + ((o->cur.shadow.a != o->prev.shadow.a)) || + ((o->cur.outline.r != o->prev.outline.r)) || + ((o->cur.outline.g != o->prev.outline.g)) || + ((o->cur.outline.b != o->prev.outline.b)) || + ((o->cur.outline.a != o->prev.outline.a)) || + ((o->cur.glow.r != o->prev.glow.r)) || + ((o->cur.glow.g != o->prev.glow.g)) || + ((o->cur.glow.b != o->prev.glow.b)) || + ((o->cur.glow.a != o->prev.glow.a)) || + ((o->cur.glow2.r != o->prev.glow2.r)) || + ((o->cur.glow2.g != o->prev.glow2.g)) || + ((o->cur.glow2.b != o->prev.glow2.b)) || + ((o->cur.glow2.a != o->prev.glow2.a))) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + } + done: + evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v); +} + +static void +evas_object_text_render_post(Evas_Object *obj) +{ + Evas_Object_Text *o; + + /* this moves the current data to the previous state parts of the object */ + /* in whatever way is safest for the object. also if we don't need object */ + /* data anymore we can free it if the object deems this is a good idea */ + o = (Evas_Object_Text *)(obj->object_data); + /* remove those pesky changes */ + while (obj->clip.changes) + { + Evas_Rectangle *r; + + r = (Evas_Rectangle *)obj->clip.changes->data; + obj->clip.changes = evas_list_remove(obj->clip.changes, r); + free(r); + } + /* move cur to prev safely for object data */ + obj->prev = obj->cur; + o->prev = o->cur; + o->changed = 0; +} + +static int +evas_object_text_is_opaque(Evas_Object *obj) +{ + Evas_Object_Text *o; + + /* this returns 1 if the internal object data implies that the object is */ + /* currently fulyl opque over the entire gradient it occupies */ + o = (Evas_Object_Text *)(obj->object_data); + return 0; +} + +static int +evas_object_text_was_opaque(Evas_Object *obj) +{ + Evas_Object_Text *o; + + /* this returns 1 if the internal object data implies that the object was */ + /* currently fulyl opque over the entire gradient it occupies */ + o = (Evas_Object_Text *)(obj->object_data); + return 0; +} + +void +_evas_object_text_rehint(Evas_Object *obj) +{ + Evas_Object_Text *o; + int is, was; + + o = (Evas_Object_Text *)(obj->object_data); + if (!o->engine_data) return; + evas_font_load_hinting_set(obj->layer->evas, o->engine_data, + obj->layer->evas->hinting); + was = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + /* DO II */ + o->prev.text = NULL; + if ((o->engine_data) && (o->cur.text)) + { + int w, h; + int l = 0, r = 0, t = 0, b = 0; + + ENFN->font_string_size_get(ENDT, + o->engine_data, + o->cur.text, + &w, &h); + evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b); + obj->cur.geometry.w = w + l + r; + obj->cur.geometry.h = h + t + b; +//// obj->cur.cache.geometry.validity = 0; + } + else + { + int t = 0, b = 0; + + evas_text_style_pad_get(o->cur.style, NULL, NULL, &t, &b); + obj->cur.geometry.w = 0; + obj->cur.geometry.h = o->max_ascent + o->max_descent + t + b; +//// obj->cur.cache.geometry.validity = 0; + } + o->changed = 1; + evas_object_change(obj); + evas_object_coords_recalc(obj); + is = evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1); + if ((is || was) && obj->cur.visible) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + evas_object_inform_call_resize(obj); +} diff --git a/src/lib/canvas/evas_object_textblock.c b/src/lib/canvas/evas_object_textblock.c new file mode 100644 index 0000000..baeaa8d --- /dev/null +++ b/src/lib/canvas/evas_object_textblock.c @@ -0,0 +1,4939 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_private.h" + +/* save typing */ +#define ENFN obj->layer->evas->engine.func +#define ENDT obj->layer->evas->engine.data.output + +/* private magic number for textblock objects */ +static const char o_type[] = "textblock"; + +/* private struct for textblock object internal data */ +typedef struct _Evas_Object_Textblock Evas_Object_Textblock; +typedef struct _Evas_Object_Style_Tag Evas_Object_Style_Tag; +typedef struct _Evas_Object_Textblock_Node Evas_Object_Textblock_Node; +typedef struct _Evas_Object_Textblock_Line Evas_Object_Textblock_Line; +typedef struct _Evas_Object_Textblock_Item Evas_Object_Textblock_Item; +typedef struct _Evas_Object_Textblock_Format_Item Evas_Object_Textblock_Format_Item; +typedef struct _Evas_Object_Textblock_Format Evas_Object_Textblock_Format; + +/* the current state of the formatting */ + +#define NODE_TEXT 0 +#define NODE_FORMAT 1 + +struct _Evas_Object_Style_Tag +{ Evas_Object_List _list_data; + char *tag; + char *replace; +}; + +struct _Evas_Object_Textblock_Node +{ Evas_Object_List _list_data; + char *text; + int type; + int len, alloc; +}; + +struct _Evas_Object_Textblock_Line +{ Evas_Object_List _list_data; + Evas_Object_Textblock_Item *items; + Evas_Object_Textblock_Format_Item *format_items; + int x, y, w, h; + int baseline; + int line_no; +}; + +struct _Evas_Object_Textblock_Item +{ Evas_Object_List _list_data; + char *text; + Evas_Object_Textblock_Format *format; + Evas_Object_Textblock_Node *source_node; + int x, w, h; + int inset, baseline; + int source_pos; + unsigned char type; +}; + +struct _Evas_Object_Textblock_Format_Item +{ Evas_Object_List _list_data; + const char *item; + Evas_Object_Textblock_Node *source_node; + int x, w; +}; + +struct _Evas_Object_Textblock_Format +{ + int ref; + double halign; + double valign; + struct { + const char *name; + const char *source; + const char *fallbacks; + int size; + void *font; + } font; + struct { + struct { + unsigned char r, g, b, a; + } normal, underline, underline2, outline, shadow, glow, glow2, backing, + strikethrough; + } color; + struct { + int l, r; + } margin; + int tabstops; + unsigned char style; + unsigned char wrap_word : 1; + unsigned char wrap_char : 1; + unsigned char underline : 1; + unsigned char underline2 : 1; + unsigned char strikethrough : 1; + unsigned char backing : 1; +}; + +struct _Evas_Textblock_Style +{ + char *style_text; + char *default_tag; + Evas_Object_Style_Tag *tags; + Evas_List *objects; + unsigned char delete_me : 1; +}; + +struct _Evas_Textblock_Cursor +{ + Evas_Object *obj; + int pos; + Evas_Object_Textblock_Node *node; +}; + +struct _Evas_Object_Textblock +{ + DATA32 magic; + Evas_Textblock_Style *style; + Evas_Textblock_Cursor *cursor; + Evas_List *cursors; + Evas_Object_Textblock_Node *nodes; + Evas_Object_Textblock_Line *lines; + int last_w; + struct { + int l, r, t, b; + } style_pad; + char *markup_text; + void *engine_data; + struct { + int w, h; + unsigned char valid : 1; + } formatted, native; + unsigned char redraw : 1; + unsigned char changed : 1; +}; + +/* private methods for textblock objects */ +static void evas_object_textblock_init(Evas_Object *obj); +static void *evas_object_textblock_new(void); +static void evas_object_textblock_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y); +static void evas_object_textblock_free(Evas_Object *obj); +static void evas_object_textblock_render_pre(Evas_Object *obj); +static void evas_object_textblock_render_post(Evas_Object *obj); + +static int evas_object_textblock_is_opaque(Evas_Object *obj); +static int evas_object_textblock_was_opaque(Evas_Object *obj); + +static void evas_object_textblock_coords_recalc(Evas_Object *obj); + +static const Evas_Object_Func object_func = +{ + /* methods (compulsory) */ + evas_object_textblock_free, + evas_object_textblock_render, + evas_object_textblock_render_pre, + evas_object_textblock_render_post, + /* these are optional. NULL = nothing */ + NULL, + NULL, + NULL, + NULL, + evas_object_textblock_is_opaque, + evas_object_textblock_was_opaque, + NULL, + NULL, + evas_object_textblock_coords_recalc +}; + +/* the actual api call to add a textblock */ + +#define TB_HEAD() \ + Evas_Object_Textblock *o; \ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); \ + return; \ + MAGIC_CHECK_END(); \ + o = (Evas_Object_Textblock *)(obj->object_data); \ + MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK); \ + return; \ + MAGIC_CHECK_END(); + +#define TB_HEAD_RETURN(x) \ + Evas_Object_Textblock *o; \ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); \ + return (x); \ + MAGIC_CHECK_END(); \ + o = (Evas_Object_Textblock *)(obj->object_data); \ + MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK); \ + return (x); \ + MAGIC_CHECK_END(); + + + +/* styles */ +static void +_style_clear(Evas_Textblock_Style *ts) +{ + if (ts->style_text) free(ts->style_text); + if (ts->default_tag) free(ts->default_tag); + while (ts->tags) + { + Evas_Object_Style_Tag *tag; + + tag = (Evas_Object_Style_Tag *)ts->tags; + ts->tags = evas_object_list_remove(ts->tags, tag); + free(tag->tag); + free(tag->replace); + free(tag); + } + ts->style_text = NULL; + ts->default_tag = NULL; + ts->tags = NULL; +} + +/* setting a textblock via markup */ +/* +static char * +_style_match_replace(Evas_Textblock_Style *ts, char *s) +{ + Evas_Object_List *l; + + for (l = (Evas_Object_List *)ts->tags; l; l = l->next) + { + Evas_Object_Style_Tag *tag; + + tag = (Evas_Object_Style_Tag *)l; + if (!strcmp(tag->replace, s)) return tag->tag; + } + return NULL; +} +*/ + +static char * +_style_match_tag(Evas_Textblock_Style *ts, char *s) +{ + Evas_Object_List *l; + + for (l = (Evas_Object_List *)ts->tags; l; l = l->next) + { + Evas_Object_Style_Tag *tag; + + tag = (Evas_Object_Style_Tag *)l; + if (!strcmp(tag->tag, s)) return tag->replace; + } + return NULL; +} + +static inline int +_strbuf_realloc(char **strbuf, int *strbuf_alloc, int req_alloc) +{ + char *newbuf; + int newbuf_alloc; + + newbuf_alloc = ((req_alloc + 31) >> 5) << 5; + if (newbuf_alloc == *strbuf_alloc) + return 1; + + newbuf = realloc(*strbuf, newbuf_alloc); + if (!newbuf) + { + perror("realloc: could not allocate new strbuf"); + return 0; + } + + *strbuf = newbuf; + *strbuf_alloc = newbuf_alloc; + return 1; +} + +static inline int +_strbuf_grow_if_required(char **strbuf, int *strbuf_alloc, int req_alloc) +{ + if (req_alloc <= *strbuf_alloc) + return 1; + + return _strbuf_realloc(strbuf, strbuf_alloc, req_alloc); +} + +static char * +_strbuf_append_int(char *strbuf, const char *text, int text_len, int *strbuf_len, int *strbuf_alloc) +{ + int req_alloc; + + req_alloc = *strbuf_len + text_len + 1; + if (!_strbuf_grow_if_required(&strbuf, strbuf_alloc, req_alloc)) + return strbuf; + + memcpy(strbuf + *strbuf_len, text, text_len); + *strbuf_len += text_len; + strbuf[*strbuf_len] = '\0'; + + return strbuf; +} + +static inline char * +_strbuf_append(char *strbuf, const char *text, int *strbuf_len, int *strbuf_alloc) +{ + int text_len; + + if ((!text) || (text[0] == '\0')) + return strbuf; + + text_len = strlen(text); + return _strbuf_append_int(strbuf, text, text_len, strbuf_len, strbuf_alloc); +} + +static inline char * +_strbuf_append_n(char *strbuf, const char *text, int max_text_len, int *strbuf_len, int *strbuf_alloc) +{ + const char *p; + int text_len; + + if ((!text) || (max_text_len < 1) || (text[0] == '\0')) + return strbuf; + + text_len = 0; + for (p = text; (text_len < max_text_len) && (*p != '\0'); p++) + text_len++; + + return _strbuf_append_int(strbuf, text, text_len, strbuf_len, strbuf_alloc); +} + +static char * +_strbuf_insert(char *strbuf, const char *text, int pos, int *strbuf_len, int *strbuf_alloc) +{ + int req_alloc, text_len, tail_len; + + if ((!text) || (text[0] == '\0')) + return strbuf; + + if (pos >= *strbuf_len) + return _strbuf_append(strbuf, text, strbuf_len, strbuf_alloc); + else if (pos < 0) + pos = 0; + + text_len = strlen(text); + req_alloc = *strbuf_len + text_len + 1; + if (!_strbuf_grow_if_required(&strbuf, strbuf_alloc, req_alloc)) + return strbuf; + + tail_len = *strbuf_len - pos + 1; /* includes '\0' */ + memmove(strbuf + pos + text_len, strbuf + pos, tail_len); + memcpy(strbuf + pos, text, text_len); + *strbuf_len += text_len; + + return strbuf; +} + +static char * +_strbuf_remove(char *strbuf, int start, int end, int *strbuf_len, int *strbuf_alloc) +{ + int remove_len, tail_len, req_alloc; + + if (!strbuf) + return NULL; + + if (start <= 0) + start = 0; + + if (end >= *strbuf_len) + end = *strbuf_len; + + remove_len = end - start; + if (remove_len <= 0) + return strbuf; + else if (remove_len == *strbuf_len) + { + free(strbuf); + *strbuf_len = 0; + *strbuf_alloc = 0; + return NULL; + } + + tail_len = *strbuf_len - end + 1; /* includes '\0' */ + memmove(strbuf + start, strbuf + end, tail_len); + *strbuf_len -= remove_len; + + req_alloc = *strbuf_len + 1; + _strbuf_realloc(&strbuf, strbuf_alloc, req_alloc); + + return strbuf; +} + +static void +_nodes_clear(const Evas_Object *obj) +{ + Evas_Object_Textblock *o; + + o = (Evas_Object_Textblock *)(obj->object_data); + while (o->nodes) + { + Evas_Object_Textblock_Node *n; + + n = (Evas_Object_Textblock_Node *)o->nodes; + o->nodes = evas_object_list_remove(o->nodes, n); + if (n->text) free(n->text); + free(n); + } +} + +static void +_format_free(const Evas_Object *obj, Evas_Object_Textblock_Format *fmt) +{ + fmt->ref--; + if (fmt->ref > 0) return; + if (fmt->font.name) evas_stringshare_del(fmt->font.name); + if (fmt->font.fallbacks) evas_stringshare_del(fmt->font.fallbacks); + if (fmt->font.source) evas_stringshare_del(fmt->font.source); + evas_font_free(obj->layer->evas, fmt->font.font); + free(fmt); +} + +static void +_line_free(const Evas_Object *obj, Evas_Object_Textblock_Line *ln) +{ + while (ln->items) + { + Evas_Object_Textblock_Item *it; + + it = (Evas_Object_Textblock_Item *)ln->items; + ln->items = evas_object_list_remove(ln->items, ln->items); + if (it->text) free(it->text); + _format_free(obj, it->format); + free(it); + } + while (ln->format_items) + { + Evas_Object_Textblock_Format_Item *fi; + + fi = (Evas_Object_Textblock_Format_Item *)ln->format_items; + ln->format_items = evas_object_list_remove(ln->format_items, ln->format_items); + if (fi->item) evas_stringshare_del(fi->item); + free(fi); + } + if (ln) free(ln); +} + +static void +_lines_clear(const Evas_Object *obj, Evas_Object_Textblock_Line *lines) +{ + Evas_Object_Textblock *o; + + o = (Evas_Object_Textblock *)(obj->object_data); + while (lines) + { + Evas_Object_Textblock_Line *ln; + + ln = (Evas_Object_Textblock_Line *)lines; + lines = evas_object_list_remove(lines, ln); + _line_free(obj, ln); + } +} + +/* table of html escapes (that i can find) this should be ordered with the + * most common first as it's a linear search to match - no hash for this. + * + * these are stored as one large string and one additional array that + * contains the offsets to the tokens for space efficiency. + */ +static const char escape_strings[] = + /* most common escaped stuff */ + "<\0\x3c\0" + ">\0\x3e\0" + "&\0\x26\0" + " \0\x20\0" /* NOTE: we allow nsbp's to break as we map early - maybe map to ascii 0x01 and then make the rendering code think 0x01 -> 0x20 */ + ""\0\x22\0" + /* all the rest */ + "©\0\xc2\xa9\0" + "®\0\xc2\xae\0" + "…\0\xe2\x80\xa6\0" + "Ñ\0\xc3\x91\0" + "ñ\0\xc3\xb1\0" + "Ç\0\xc3\x87\0" + "ç\0\xc3\xa7\0" + "ß\0\xc3\x9f\0" + "Þ\0\xc3\x9e\0" + "þ\0\xc3\xbe\0" + "Ð\0\xc3\x90\0" + "ð\0\xc3\xb0\0" + "´\0\xc2\xb4\0" + "¸\0\xc2\xb8\0" + "°\0\xc2\xb0\0" + "¨\0\xc2\xa8\0" + "¢\0\xc2\xa2\0" + "£\0\xc2\xa3\0" + "¤\0\xc2\xa4\0" + "¥\0\xc2\xa5\0" + "€\0\xe2\x82\xac\0" + "§\0\xc2\xa7\0" + "¶\0\xc2\xb6\0" + "«\0\xc2\xab\0" + "»\0\xc2\xbb\0" + "¡\0\xc2\xa1\0" + "¿\0\xc2\xbf\0" + "¦\0\xc2\xa6\0" + "ª\0\xc2\xaa\0" + "º\0\xc2\xba\0" + "µ\0\xc2\xb5\0" + "¯\0\xc2\xaf\0" + "⊕\0\xe2\x8a\x95\0" + "∫\0\xe2\x88\xab\0" + "∑\0\xe2\x88\x91\0" + "∏\0\xe2\x88\x8f\0" + "⊥\0\xe2\x8a\xa5\0" + "∨\0\xe2\x88\xa8\0" + "∧\0\xe2\x88\xa7\0" + "≡\0\xe2\x89\xa1\0" + "≠\0\xe2\x89\xa0\0" + "∀\0\xe2\x88\x80\0" + "∃\0\xe2\x88\x83\0" + "∇\0\xe2\x88\x87\0" + "←\0\xe2\x86\x90\0" + "→\0\xe2\x86\x92\0" + "↑\0\xe2\x86\x91\0" + "↓\0\xe2\x86\x93\0" + "↔\0\xe2\x86\x94\0" + "⇐\0\xe2\x87\x90\0" + "⇒\0\xe2\x87\x92\0" + "±\0\xc2\xb1\0" + "·\0\xc2\xb7\0" + "×\0\xc3\x97\0" + "÷\0\xc3\xb7\0" + "¹\0\xc2\xb9\0" + "²\0\xc2\xb2\0" + "³\0\xc2\xb3\0" + "¼\0\xc2\xbc\0" + "½\0\xc2\xbd\0" + "¾\0\xc2\xbe\0" + "¬\0\xc2\xac\0" + "Á\0\xc3\x81\0" + "É\0\xc3\x89\0" + "Í\0\xc3\x8d\0" + "Ó\0\xc3\x93\0" + "Ú\0\xc3\x9a\0" + "Ý\0\xc3\x9d\0" + "á\0\xc3\xa1\0" + "é\0\xc3\xa9\0" + "í\0\xc3\xad\0" + "ó\0\xc3\xb3\0" + "ú\0\xc3\xba\0" + "ý\0\xc3\xbd\0" + "Â\0\xc3\x82\0" + "Ê\0\xc3\x8a\0" + "Î\0\xc3\x8e\0" + "Ô\0\xc3\x94\0" + "Û\0\xc3\x9b\0" + "â\0\xc3\xa2\0" + "ê\0\xc3\xaa\0" + "î\0\xc3\xae\0" + "ô\0\xc3\xb4\0" + "û\0\xc3\xbb\0" + "À\0\xc3\x80\0" + "È\0\xc3\x88\0" + "Ì\0\xc3\x8c\0" + "Ò\0\xc3\x92\0" + "Ù\0\xc3\x99\0" + "à\0\xc3\xa0\0" + "è\0\xc3\xa8\0" + "ì\0\xc3\xac\0" + "ò\0\xc3\xb2\0" + "ù\0\xc3\xb9\0" + "Ä\0\xc3\x84\0" + "Ë\0\xc3\x8b\0" + "Ï\0\xc3\x8f\0" + "Ö\0\xc3\x96\0" + "ä\0\xc3\xa4\0" + "ë\0\xc3\xab\0" + "ï\0\xc3\xaf\0" + "ö\0\xc3\xb6\0" + "ü\0\xc3\xbc\0" + "ÿ\0\xc3\xbf\0" + "Ã\0\xc3\x83\0" + "ã\0\xc3\xa3\0" + "Õ\0\xc3\x95\0" + "õ\0\xc3\xb5\0" + "å\0\xc3\xa5\0" + "Å\0\xc3\x85\0" + "Ø\0\xc3\x98\0" + "ø\0\xc3\xb8\0" + "Æ\0\xc3\x86\0" + "æ\0\xc3\xa6\0" + "Ñ\0\xc3\x91\0" + "ñ\0\xc3\xb1\0" + "Ç\0\xc3\x87\0" + "ç\0\xc3\xa7\0" + "ß\0\xc3\x9f\0" + "Þ\0\xc3\x9e\0" + "þ\0\xc3\xbe\0" + "Ð\0\xc3\x90\0" + "ð\0\xc3\xb0\0" + "α\0\xce\xb1\0" + "β\0\xce\xb2\0" + "γ\0\xce\xb3\0" + "δ\0\xce\xb4\0" + "ε\0\xce\xb5\0" + "ζ\0\xce\xb6\0" + "η\0\xce\xb7\0" + "θ\0\xce\xb8\0" + "ι\0\xce\xb9\0" + "κ\0\xce\xba\0" + "λ\0\xce\xbb\0" + "μ\0\xce\xbc\0" + "ν\0\xce\xbd\0" + "ο\0\xce\xbf\0" + "ξ\0\xce\xbe\0" + "π\0\xcf\x80\0" + "ρ\0\xcf\x81\0" + "σ\0\xcf\x83\0" + "τ\0\xcf\x84\0" + "υ\0\xcf\x85\0" + "φ\0\xcf\x86\0" + "χ\0\xcf\x87\0" + "ψ\0\xcf\x88\0" + "ω\0\xcf\x89\0" + "Α\0\xce\x91\0" + "Β\0\xce\x92\0" + "Γ\0\xce\x93\0" + "Δ\0\xce\x94\0" + "Ε\0\xce\x95\0" + "Ζ\0\xce\x96\0" + "Η\0\xce\x97\0" + "Θ\0\xce\x98\0" + "Ι\0\xce\x99\0" + "Κ\0\xce\x9a\0" + "Λ\0\xce\x9b\0" + "Μ\0\xce\x9c\0" + "Ν\0\xce\x9d\0" + "Ο\0\xce\x9f\0" + "Ξ\0\xce\x9e\0" + "Π\0\xce\xa0\0" + "Ρ\0\xce\xa1\0" + "Σ\0\xce\xa3\0" + "Τ\0\xce\xa4\0" + "Υ\0\xce\xa5\0" + "Φ\0\xce\xa6\0" + "Χ\0\xce\xa7\0" + "Ψ\0\xce\xa8\0" + "Ω\0\xce\xa9\0" +; + + +static int +_is_white(int c) +{ + /* + * unicode list of whitespace chars + * + * 0009..000D .. + * 0020 SPACE + * 0085 + * 00A0 NO-BREAK SPACE + * 1680 OGHAM SPACE MARK + * 180E MONGOLIAN VOWEL SEPARATOR + * 2000..200A EN QUAD..HAIR SPACE + * 2028 LINE SEPARATOR + * 2029 PARAGRAPH SEPARATOR + * 202F NARROW NO-BREAK SPACE + * 205F MEDIUM MATHEMATICAL SPACE + * 3000 IDEOGRAPHIC SPACE + */ + if ( + (c == 0x20) || + ((c >= 0x9) && (c <= 0xd)) || + (c == 0x85) || + (c == 0xa0) || + (c == 0x1680) || + (c == 0x180e) || + ((c >= 0x2000) && (c <= 0x200a)) || + (c == 0x2028) || + (c == 0x2029) || + (c == 0x202f) || + (c == 0x205f) || + (c == 0x3000) + ) + return 1; + return 0; +} + +static char * +_clean_white(int clean_start, int clean_end, char *str) +{ + char *p, *p2, *str2 = NULL; + int white, pwhite, start, ok; + + return str; + str2 = malloc(strlen(str) + 2); + p = str; + p2 = str2; + white = 0; + pwhite = 0; + start = 1; + ok = 1; + while (*p != 0) + { + pwhite = white; + if (isspace(*p) || _is_white(*p)) white = 1; + else white = 0; + if ((pwhite) && (white)) ok = 0; + else + { + if (!clean_start) + { + if ((start) && (pwhite) && (!white)) + { +// *p2 = ' '; +// p2++; + } + } + ok = 1; + if (!white) start = 0; + } + if (clean_start) + { + if ((start) && (ok)) ok = 0; + } + if (ok) + { + *p2 = *p; + p2++; + } + p++; + } + *p2 = 0; + if (clean_end) + { + while (p2 > str2) + { + p2--; + if (!(isspace(*p2) || _is_white(*p2))) break; + *p2 = 0; + } + } + free(str); + return str2; +} + +static void +_append_text_run(Evas_Object_Textblock *o, char *s, char *p) +{ + if ((s) && (p > s)) + { + char *ts; + + ts = alloca(p - s + 1); + strncpy(ts, s, p - s); + ts[p - s] = 0; + ts = _clean_white(0, 0, ts); + evas_textblock_cursor_text_append(o->cursor, ts); + } +} + + +static int +_hex_string_get(char ch) +{ + if ((ch >= '0') && (ch <= '9')) return (ch - '0'); + else if ((ch >= 'A') && (ch <= 'F')) return (ch - 'A' + 10); + else if ((ch >= 'a') && (ch <= 'f')) return (ch - 'a' + 10); + return 0; +} + +static void +_format_color_parse(const char *str, unsigned char *r, unsigned char *g, unsigned char *b, unsigned char *a) +{ + int slen; + + slen = strlen(str); + *r = *g = *b = *a = 0; + + if (slen == 7) /* #RRGGBB */ + { + *r = (_hex_string_get(str[1]) << 4) | (_hex_string_get(str[2])); + *g = (_hex_string_get(str[3]) << 4) | (_hex_string_get(str[4])); + *b = (_hex_string_get(str[5]) << 4) | (_hex_string_get(str[6])); + *a = 0xff; + } + else if (slen == 9) /* #RRGGBBAA */ + { + *r = (_hex_string_get(str[1]) << 4) | (_hex_string_get(str[2])); + *g = (_hex_string_get(str[3]) << 4) | (_hex_string_get(str[4])); + *b = (_hex_string_get(str[5]) << 4) | (_hex_string_get(str[6])); + *a = (_hex_string_get(str[7]) << 4) | (_hex_string_get(str[8])); + } + else if (slen == 4) /* #RGB */ + { + *r = _hex_string_get(str[1]); + *r = (*r << 4) | *r; + *g = _hex_string_get(str[2]); + *g = (*g << 4) | *g; + *b = _hex_string_get(str[3]); + *b = (*b << 4) | *b; + *a = 0xff; + } + else if (slen == 5) /* #RGBA */ + { + *r = _hex_string_get(str[1]); + *r = (*r << 4) | *r; + *g = _hex_string_get(str[2]); + *g = (*g << 4) | *g; + *b = _hex_string_get(str[3]); + *b = (*b << 4) | *b; + *a = _hex_string_get(str[4]); + *a = (*a << 4) | *a; + } + *r = (*r * *a) / 255; + *g = (*g * *a) / 255; + *b = (*b * *a) / 255; +} + +static const char *fontstr; +static const char *font_fallbacksstr; +static const char *font_sizestr; +static const char *font_sourcestr; +static const char *colorstr; +static const char *underline_colorstr; +static const char *underline2_colorstr; +static const char *outline_colorstr; +static const char *shadow_colorstr; +static const char *glow_colorstr; +static const char *glow2_colorstr; +static const char *backing_colorstr; +static const char *strikethrough_colorstr; +static const char *alignstr; +static const char *valignstr; +static const char *wrapstr; +static const char *left_marginstr; +static const char *right_marginstr; +static const char *underlinestr; +static const char *strikethroughstr; +static const char *backingstr; +static const char *stylestr; +static const char *tabstopsstr; + +static void +_format_command_init(void) +{ + fontstr = evas_stringshare_add("font"); + font_fallbacksstr = evas_stringshare_add("font_fallbacks"); + font_sizestr = evas_stringshare_add("font_size"); + font_sourcestr = evas_stringshare_add("font_source"); + colorstr = evas_stringshare_add("color"); + underline_colorstr = evas_stringshare_add("underline_color"); + underline2_colorstr = evas_stringshare_add("underline2_color"); + outline_colorstr = evas_stringshare_add("outline_color"); + shadow_colorstr = evas_stringshare_add("shadow_color"); + glow_colorstr = evas_stringshare_add("glow_color"); + glow2_colorstr = evas_stringshare_add("glow2_color"); + backing_colorstr = evas_stringshare_add("backing_color"); + strikethrough_colorstr = evas_stringshare_add("strikethrough_color"); + alignstr = evas_stringshare_add("align"); + valignstr = evas_stringshare_add("valign"); + wrapstr = evas_stringshare_add("wrap"); + left_marginstr = evas_stringshare_add("left_margin"); + right_marginstr = evas_stringshare_add("right_margin"); + underlinestr = evas_stringshare_add("underline"); + strikethroughstr = evas_stringshare_add("strikethrough"); + backingstr = evas_stringshare_add("backing"); + stylestr = evas_stringshare_add("style"); + tabstopsstr = evas_stringshare_add("tabstops"); +} + +static void +_format_command_shutdown(void) +{ + evas_stringshare_del(fontstr); + evas_stringshare_del(font_fallbacksstr); + evas_stringshare_del(font_sizestr); + evas_stringshare_del(font_sourcestr); + evas_stringshare_del(colorstr); + evas_stringshare_del(underline_colorstr); + evas_stringshare_del(underline2_colorstr); + evas_stringshare_del(outline_colorstr); + evas_stringshare_del(shadow_colorstr); + evas_stringshare_del(glow_colorstr); + evas_stringshare_del(glow2_colorstr); + evas_stringshare_del(backing_colorstr); + evas_stringshare_del(strikethrough_colorstr); + evas_stringshare_del(alignstr); + evas_stringshare_del(valignstr); + evas_stringshare_del(wrapstr); + evas_stringshare_del(left_marginstr); + evas_stringshare_del(right_marginstr); + evas_stringshare_del(underlinestr); + evas_stringshare_del(strikethroughstr); + evas_stringshare_del(backingstr); + evas_stringshare_del(stylestr); + evas_stringshare_del(tabstopsstr); +} + +static void +_format_clean_param(char *dst, const char *src) +{ + const char *ss; + char *ds; + + ds = dst; + for (ss = src; *ss; ss++, ds++) + { + if ((*ss == '\\') && *(ss + 1)) ss++; + *ds = *ss; + } + *ds = 0; +} + +static void +_format_command(Evas_Object *obj, Evas_Object_Textblock_Format *fmt, const char *cmd, const char *param) +{ + int new_font = 0; + char *tmp_param; + + tmp_param = alloca(strlen(param) + 1); + + _format_clean_param(tmp_param, param); + if (cmd == fontstr) + { + if ((!fmt->font.name) || + ((fmt->font.name) && (strcmp(fmt->font.name, tmp_param)))) + { + if (fmt->font.name) evas_stringshare_del(fmt->font.name); + fmt->font.name = evas_stringshare_add(tmp_param); + new_font = 1; + } + } + else if (cmd == font_fallbacksstr) + { + if ((!fmt->font.fallbacks) || + ((fmt->font.fallbacks) && (strcmp(fmt->font.fallbacks, tmp_param)))) + { + /* policy - when we say "fallbacks" do we prepend and use prior + * fallbacks... or should we replace. for now we replace + */ + if (fmt->font.fallbacks) evas_stringshare_del(fmt->font.fallbacks); + fmt->font.fallbacks = evas_stringshare_add(tmp_param); + new_font = 1; + } + } + else if (cmd == font_sizestr) + { + int v; + + v = atoi(tmp_param); + if (v != fmt->font.size) + { + fmt->font.size = v; + new_font = 1; + } + } + else if (cmd == font_sourcestr) + { + if ((!fmt->font.source) || + ((fmt->font.source) && (strcmp(fmt->font.source, tmp_param)))) + { + if (fmt->font.source) evas_stringshare_del(fmt->font.source); + fmt->font.source = evas_stringshare_add(tmp_param); + new_font = 1; + } + } + else if (cmd == colorstr) + _format_color_parse(tmp_param, + &(fmt->color.normal.r), &(fmt->color.normal.g), + &(fmt->color.normal.b), &(fmt->color.normal.a)); + else if (cmd == underline_colorstr) + _format_color_parse(tmp_param, + &(fmt->color.underline.r), &(fmt->color.underline.g), + &(fmt->color.underline.b), &(fmt->color.underline.a)); + else if (cmd == underline2_colorstr) + _format_color_parse(tmp_param, + &(fmt->color.underline2.r), &(fmt->color.underline2.g), + &(fmt->color.underline2.b), &(fmt->color.underline2.a)); + else if (cmd == outline_colorstr) + _format_color_parse(tmp_param, + &(fmt->color.outline.r), &(fmt->color.outline.g), + &(fmt->color.outline.b), &(fmt->color.outline.a)); + else if (cmd == shadow_colorstr) + _format_color_parse(tmp_param, + &(fmt->color.shadow.r), &(fmt->color.shadow.g), + &(fmt->color.shadow.b), &(fmt->color.shadow.a)); + else if (cmd == glow_colorstr) + _format_color_parse(tmp_param, + &(fmt->color.glow.r), &(fmt->color.glow.g), + &(fmt->color.glow.b), &(fmt->color.glow.a)); + else if (cmd == glow2_colorstr) + _format_color_parse(tmp_param, + &(fmt->color.glow2.r), &(fmt->color.glow2.g), + &(fmt->color.glow2.b), &(fmt->color.glow2.a)); + else if (cmd == backing_colorstr) + _format_color_parse(tmp_param, + &(fmt->color.backing.r), &(fmt->color.backing.g), + &(fmt->color.backing.b), &(fmt->color.backing.a)); + else if (cmd == strikethrough_colorstr) + _format_color_parse(tmp_param, + &(fmt->color.strikethrough.r), &(fmt->color.strikethrough.g), + &(fmt->color.strikethrough.b), &(fmt->color.strikethrough.a)); + else if (cmd == alignstr) + { + if (!strcmp(tmp_param, "middle")) fmt->halign = 0.5; + else if (!strcmp(tmp_param, "center")) fmt->halign = 0.5; + else if (!strcmp(tmp_param, "left")) fmt->halign = 0.0; + else if (!strcmp(tmp_param, "right")) fmt->halign = 1.0; + else if (strchr(tmp_param, '%')) + { + char *ts, *p; + + ts = alloca(strlen(tmp_param) + 1); + strcpy(ts, tmp_param); + p = strchr(ts, '%'); + *p = 0; + fmt->halign = ((double)atoi(ts)) / 100.0; + if (fmt->halign < 0.0) fmt->halign = 0.0; + else if (fmt->halign > 1.0) fmt->halign = 1.0; + } + else + { + fmt->halign = atof(tmp_param); + if (fmt->halign < 0.0) fmt->halign = 0.0; + else if (fmt->halign > 1.0) fmt->halign = 1.0; + } + } + else if (cmd == valignstr) + { + if (!strcmp(tmp_param, "top")) fmt->valign = 0.0; + else if (!strcmp(tmp_param, "middle")) fmt->valign = 0.5; + else if (!strcmp(tmp_param, "center")) fmt->valign = 0.5; + else if (!strcmp(tmp_param, "bottom")) fmt->valign = 1.0; + else if (!strcmp(tmp_param, "baseline")) fmt->valign = -1.0; + else if (!strcmp(tmp_param, "base")) fmt->valign = -1.0; + else if (strchr(tmp_param, '%')) + { + char *ts, *p; + + ts = alloca(strlen(tmp_param) + 1); + strcpy(ts, tmp_param); + p = strchr(ts, '%'); + *p = 0; + fmt->valign = ((double)atoi(ts)) / 100.0; + if (fmt->valign < 0.0) fmt->valign = 0.0; + else if (fmt->valign > 1.0) fmt->valign = 1.0; + } + else + { + fmt->valign = atof(tmp_param); + if (fmt->valign < 0.0) fmt->valign = 0.0; + else if (fmt->valign > 1.0) fmt->valign = 1.0; + } + } + else if (cmd == wrapstr) + { + if (!strcmp(tmp_param, "word")) + { + fmt->wrap_word = 1; + fmt->wrap_char = 0; + } + else if (!strcmp(tmp_param, "char")) + { + fmt->wrap_word = 0; + fmt->wrap_char = 1; + } + else + { + fmt->wrap_word = 0; + fmt->wrap_char = 0; + } + } + else if (cmd == left_marginstr) + { + if (!strcmp(tmp_param, "reset")) + fmt->margin.l = 0; + else + { + if (tmp_param[0] == '+') + fmt->margin.l += atoi(&(tmp_param[1])); + else if (tmp_param[0] == '-') + fmt->margin.l -= atoi(&(tmp_param[1])); + else + fmt->margin.l = atoi(tmp_param); + if (fmt->margin.l < 0) fmt->margin.l = 0; + } + } + else if (cmd == right_marginstr) + { + if (!strcmp(tmp_param, "reset")) + fmt->margin.r = 0; + else + { + if (tmp_param[0] == '+') + fmt->margin.r += atoi(&(tmp_param[1])); + else if (tmp_param[0] == '-') + fmt->margin.r -= atoi(&(tmp_param[1])); + else + fmt->margin.r = atoi(tmp_param); + if (fmt->margin.r < 0) fmt->margin.r = 0; + } + } + else if (cmd == underlinestr) + { + if (!strcmp(tmp_param, "off")) + { + fmt->underline = 0; + fmt->underline2 = 0; + } + else if ((!strcmp(tmp_param, "on")) || + (!strcmp(tmp_param, "single"))) + { + fmt->underline = 1; + fmt->underline2 = 0; + } + else if (!strcmp(tmp_param, "double")) + { + fmt->underline = 1; + fmt->underline2 = 1; + } + } + else if (cmd == strikethroughstr) + { + if (!strcmp(tmp_param, "off")) + fmt->strikethrough = 0; + else if (!strcmp(tmp_param, "on")) + fmt->strikethrough = 1; + } + else if (cmd == backingstr) + { + if (!strcmp(tmp_param, "off")) + fmt->backing = 0; + else if (!strcmp(tmp_param, "on")) + fmt->backing = 1; + } + else if (cmd == stylestr) + { + if (!strcmp(tmp_param, "off")) fmt->style = EVAS_TEXT_STYLE_PLAIN; + else if (!strcmp(tmp_param, "none")) fmt->style = EVAS_TEXT_STYLE_PLAIN; + else if (!strcmp(tmp_param, "plain")) fmt->style = EVAS_TEXT_STYLE_PLAIN; + else if (!strcmp(tmp_param, "shadow")) fmt->style = EVAS_TEXT_STYLE_SHADOW; + else if (!strcmp(tmp_param, "outline")) fmt->style = EVAS_TEXT_STYLE_OUTLINE; + else if (!strcmp(tmp_param, "soft_outline")) fmt->style = EVAS_TEXT_STYLE_SOFT_OUTLINE; + else if (!strcmp(tmp_param, "outline_shadow")) fmt->style = EVAS_TEXT_STYLE_OUTLINE_SHADOW; + else if (!strcmp(tmp_param, "outline_soft_shadow")) fmt->style = EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW; + else if (!strcmp(tmp_param, "glow")) fmt->style = EVAS_TEXT_STYLE_GLOW; + else if (!strcmp(tmp_param, "far_shadow")) fmt->style = EVAS_TEXT_STYLE_FAR_SHADOW; + else if (!strcmp(tmp_param, "soft_shadow")) fmt->style = EVAS_TEXT_STYLE_SOFT_SHADOW; + else if (!strcmp(tmp_param, "far_soft_shadow")) fmt->style = EVAS_TEXT_STYLE_FAR_SOFT_SHADOW; + else fmt->style = EVAS_TEXT_STYLE_PLAIN; + } + else if (cmd == tabstopsstr) + { + fmt->tabstops = atoi(tmp_param); + if (fmt->tabstops < 1) fmt->tabstops = 1; + } + + if (new_font) + { + void *of; + char *buf = NULL; + + of = fmt->font.font; + if ((fmt->font.name) && (fmt->font.fallbacks)) + { + buf = malloc(strlen(fmt->font.name) + 1 + strlen(fmt->font.fallbacks) + 1); + strcpy(buf, fmt->font.name); + strcat(buf, ","); + strcat(buf, fmt->font.fallbacks); + } + else if (fmt->font.name) + buf = strdup(fmt->font.name); + fmt->font.font = evas_font_load(obj->layer->evas, + buf, fmt->font.source, + fmt->font.size); + if (buf) free(buf); + if (of) evas_font_free(obj->layer->evas, of); + } +} + +static int +_format_is_param(char *item) +{ + if (strchr(item, '=')) return 1; + return 0; +} + +static void +_format_param_parse(char *item, const char **key, const char **val) +{ + char *p; + const char *k, *v; + + p = strchr(item, '='); + *p = '\0'; + k = evas_stringshare_add(item); + *key = k; + *p = '='; + p++; + v = evas_stringshare_add(p); + *val = v; +} + +static char * +_format_parse(char **s) +{ + char *p, *item; + char *s1 = NULL, *s2 = NULL; + + p = *s; + if (*p == 0) return NULL; + for (;;) + { + if (!s1) + { + if (*p != ' ') s1 = p; + if (*p == 0) break; + } + else if (!s2) + { + if ((p > *s) && (p[-1] != '\\')) + { + if (*p == ' ') s2 = p; + } + if (*p == 0) s2 = p; + } + p++; + if (s1 && s2) + { + item = s1; + + *s = s2; + return item; + } + } + *s = p; + return NULL; +} + +static void +_format_fill(Evas_Object *obj, Evas_Object_Textblock_Format *fmt, char *str) +{ + char *s; + char *item; + + s = str; + + /* get rid of anything +s or -s off the start of the string */ + while ((*s == ' ') || (*s == '+') || (*s == '-')) s++; + + while ((item = _format_parse(&s))) + { + char tmp_delim = *s; + *s = '\0'; + if (_format_is_param(item)) + { + const char *key = NULL, *val = NULL; + + _format_param_parse(item, &key, &val); + _format_command(obj, fmt, key, val); + evas_stringshare_del(key); + evas_stringshare_del(val); + } + else + { + /* immediate - not handled here */ + } + *s = tmp_delim; + } +} + +static Evas_Object_Textblock_Format * +_format_dup(Evas_Object *obj, Evas_Object_Textblock_Format *fmt) +{ + Evas_Object_Textblock_Format *fmt2; + char *buf = NULL; + + fmt2 = calloc(1, sizeof(Evas_Object_Textblock_Format)); + memcpy(fmt2, fmt, sizeof(Evas_Object_Textblock_Format)); + fmt2->ref = 1; + if (fmt->font.name) fmt2->font.name = evas_stringshare_add(fmt->font.name); + if (fmt->font.fallbacks) fmt2->font.fallbacks = evas_stringshare_add(fmt->font.fallbacks); + if (fmt->font.source) fmt2->font.source = evas_stringshare_add(fmt->font.source); + + if ((fmt2->font.name) && (fmt2->font.fallbacks)) + { + buf = malloc(strlen(fmt2->font.name) + 1 + strlen(fmt2->font.fallbacks) + 1); + strcpy(buf, fmt2->font.name); + strcat(buf, ","); + strcat(buf, fmt2->font.fallbacks); + } + else if (fmt2->font.name) + buf = strdup(fmt2->font.name); + fmt2->font.font = evas_font_load(obj->layer->evas, + buf, fmt2->font.source, + fmt2->font.size); + if (buf) free(buf); + return fmt2; +} + + + + + + + + + + +typedef struct _Ctxt Ctxt; + +struct _Ctxt +{ + Evas_Object *obj; + Evas_Object_Textblock *o; + + Evas_Object_Textblock_Line *lines; + Evas_Object_Textblock_Line *ln; + + Evas_List *format_stack; + + int x, y; + int w, h; + int wmax, hmax; + int maxascent, maxdescent; + int marginl, marginr; + int line_no; + int underline_extend; + int have_underline, have_underline2; + double align; +}; + +static void +_layout_format_ascent_descent_adjust(Ctxt *c, Evas_Object_Textblock_Format *fmt) +{ + int ascent, descent; + + if (fmt->font.font) + { + ascent = c->ENFN->font_max_ascent_get(c->ENDT, fmt->font.font); + descent = c->ENFN->font_max_descent_get(c->ENDT, fmt->font.font); + if (c->maxascent < ascent) c->maxascent = ascent; + if (c->maxdescent < descent) c->maxdescent = descent; + } +} + +static void +_layout_line_new(Ctxt *c, Evas_Object_Textblock_Format *fmt) +{ + c->ln = calloc(1, sizeof(Evas_Object_Textblock_Line)); + c->align = fmt->halign; + c->marginl = fmt->margin.l; + c->marginr = fmt->margin.r; + c->lines = evas_object_list_append(c->lines, c->ln); + c->x = 0; + c->maxascent = c->maxdescent = 0; + c->ln->line_no = -1; + _layout_format_ascent_descent_adjust(c, fmt); +} + +static Evas_Object_Textblock_Format * +_layout_format_push(Ctxt *c, Evas_Object_Textblock_Format *fmt) +{ + if (fmt) + { + fmt = _format_dup(c->obj, fmt); + c->format_stack = evas_list_prepend(c->format_stack, fmt); + } + else + { + fmt = calloc(1, sizeof(Evas_Object_Textblock_Format)); + c->format_stack = evas_list_prepend(c->format_stack, fmt); + fmt->ref = 1; + fmt->halign = 0.0; + fmt->valign = -1.0; + fmt->style = EVAS_TEXT_STYLE_PLAIN; + fmt->tabstops = 32; + } + return fmt; +} + +static Evas_Object_Textblock_Format * +_layout_format_pop(Ctxt *c, Evas_Object_Textblock_Format *fmt) +{ + if ((c->format_stack) && (c->format_stack->next)) + { + _format_free(c->obj, fmt); + c->format_stack = evas_list_remove_list(c->format_stack, c->format_stack); + fmt = c->format_stack->data; + } + return fmt; +} + +static void +_layout_format_value_handle(Ctxt *c, Evas_Object_Textblock_Format *fmt, char *item) +{ + const char *key = NULL, *val = NULL; + + _format_param_parse(item, &key, &val); + if ((key) && (val)) _format_command(c->obj, fmt, key, val); + if (key) evas_stringshare_del(key); + if (val) evas_stringshare_del(val); + c->align = fmt->halign; + c->marginl = fmt->margin.l; + c->marginr = fmt->margin.r; +} + +static void +_layout_line_advance(Ctxt *c, Evas_Object_Textblock_Format *fmt) +{ + Evas_Object_Textblock_Item *it; + Evas_Object_List *l; + + c->maxascent = c->maxdescent = 0; + if (!c->ln->items) + _layout_format_ascent_descent_adjust(c, fmt); + for (l = (Evas_Object_List *)c->ln->items; l; l = l->next) + { + int endx; + + it = (Evas_Object_Textblock_Item *)l; + if (it->format->font.font) + it->baseline = c->ENFN->font_max_ascent_get(c->ENDT, it->format->font.font); + _layout_format_ascent_descent_adjust(c, it->format); + endx = it->x + it->w; + if (endx > c->ln->w) c->ln->w = endx; + } + c->ln->y = c->y + c->o->style_pad.t; + c->ln->h = c->maxascent + c->maxdescent; + c->ln->baseline = c->maxascent; + if (c->have_underline2) + { + if (c->maxdescent < 4) c->underline_extend = 4 - c->maxdescent; + } + else if (c->have_underline) + { + if (c->maxdescent < 2) c->underline_extend = 2 - c->maxdescent; + } + c->ln->line_no = c->line_no; + c->line_no++; + c->y += c->maxascent + c->maxdescent; + if (c->w >= 0) + { + c->ln->x = c->marginl + c->o->style_pad.l + + ((c->w - c->ln->w - + c->o->style_pad.l - c->o->style_pad.r - + c->marginl - c->marginr) * c->align); + if ((c->ln->x + c->ln->w + c->marginr - c->o->style_pad.l) > c->wmax) + c->wmax = c->ln->x + c->ln->w + c->marginl + c->marginr - c->o->style_pad.l; + } + else + { + c->ln->x = c->marginl + c->o->style_pad.l; + if ((c->ln->x + c->ln->w + c->marginr - c->o->style_pad.l) > c->wmax) + c->wmax = c->ln->x + c->ln->w + c->marginl + c->marginr - c->o->style_pad.l; + } + _layout_line_new(c, fmt); +} + +static Evas_Object_Textblock_Item * +_layout_item_new(Ctxt *c, Evas_Object_Textblock_Format *fmt, char *str) +{ + Evas_Object_Textblock_Item *it; + + it = calloc(1, sizeof(Evas_Object_Textblock_Item)); + it->format = fmt; + it->format->ref++; + it->text = strdup(str); + return it; +} + +static int +_layout_text_cutoff_get(Ctxt *c, Evas_Object_Textblock_Format *fmt, Evas_Object_Textblock_Item *it) +{ + int cx, cy, cw, ch; + + if (fmt->font.font) + return c->ENFN->font_char_at_coords_get(c->ENDT, fmt->font.font, it->text, + c->w - + c->o->style_pad.l - + c->o->style_pad.r - + c->marginl - + c->marginr - + c->x, + 0, &cx, &cy, &cw, &ch); + return -1; +} + +static void +_layout_item_text_cutoff(Ctxt *c, Evas_Object_Textblock_Item *it, int cut) +{ + char *ts; + + ts = it->text; + ts[cut] = 0; + it->text = strdup(ts); + free(ts); +} + +static int +_layout_word_start(char *str, int start) +{ + int p, tp, chr = 0; + + p = start; + chr = evas_common_font_utf8_get_next((unsigned char *)(str), &p); + if (_is_white(chr)) + { + tp = p; + while (_is_white(chr) && (p >= 0)) + { + tp = p; + chr = evas_common_font_utf8_get_next((unsigned char *)(str), &p); + } + return tp; + } + p = start; + tp = p; + while (p > 0) + { + chr = evas_common_font_utf8_get_prev((unsigned char *)(str), &p); + if (_is_white(chr)) break; + tp = p; + } + p = tp; + if (p < 0) p = 0; + if ((p >= 0) && (_is_white(chr))) + evas_common_font_utf8_get_next((unsigned char *)(str), &p); + return p; +} + +static int +_layout_ends_with_space(char *str) +{ + int p, chr; + + p = evas_common_font_utf8_get_last((unsigned char *)(str), strlen(str)); + if (p < 0) return 0; + chr = evas_common_font_utf8_get_next((unsigned char *)(str), &p); + return _is_white(chr); +} + +static int +_layout_strip_trailing_whitespace(Ctxt *c, Evas_Object_Textblock_Format *fmt, Evas_Object_Textblock_Item *it) +{ + int p, tp, chr, adv, tw, th; + + p = evas_common_font_utf8_get_last((unsigned char *)(it->text), strlen(it->text)); + tp = p; + if (p >= 0) + { + chr = evas_common_font_utf8_get_prev((unsigned char *)(it->text), &p); + if (_is_white(chr)) + { + _layout_item_text_cutoff(c, it, tp); + adv = 0; + if (it->format->font.font) + adv = c->ENFN->font_h_advance_get(c->ENDT, it->format->font.font, it->text); + tw = th = 0; + if (it->format->font.font) + c->ENFN->font_string_size_get(c->ENDT, it->format->font.font, it->text, &tw, &th); + it->w = tw; + it->h = th; + c->x = it->x + adv; + return 1; + } + } + return 0; +} + +static int +_layout_item_abort(Ctxt *c, Evas_Object_Textblock_Format *fmt, Evas_Object_Textblock_Item *it) +{ + if (it->text) free(it->text); + _format_free(c->obj, it->format); + free(it); + if (c->ln->items) + { + it = (Evas_Object_Textblock_Item *)((Evas_Object_List *)c->ln->items)->last; + return _layout_strip_trailing_whitespace(c, fmt, it); + } + return 0; +} + +#if 0 +static char * +_layout_next_char_jump(Ctxt *c, Evas_Object_Textblock_Item *it, char *str) +{ + int index; + + index = 0; + evas_common_font_utf8_get_next((unsigned char *)str, &index); + if (index >= 0) + { + str = str + index; + _layout_item_text_cutoff(c, it, index); + } + else + str = NULL; + return str; +} +#endif + +static int +_layout_last_item_ends_in_whitespace(Ctxt *c) +{ + Evas_Object_Textblock_Item *it; + + if (!c->ln->items) return 1; + it = (Evas_Object_Textblock_Item *)((Evas_Object_List *)c->ln->items)->last; + return _layout_ends_with_space(it->text); +} + +static int +_layout_word_end(char *str, int p) +{ + int ch, tp; + + tp = p; + ch = evas_common_font_utf8_get_next((unsigned char *)str, &tp); + while ((!_is_white(ch)) && (tp >= 0) && (ch != 0)) + { + p = tp; + ch = evas_common_font_utf8_get_next((unsigned char *)str, &tp); + } + if (ch == 0) return -1; + return p; +} + +static int +_layout_word_next(char *str, int p) +{ + int ch, tp; + + tp = p; + ch = evas_common_font_utf8_get_next((unsigned char *)str, &tp); + while ((!_is_white(ch)) && (tp >= 0) && (ch != 0)) + { + p = tp; + ch = evas_common_font_utf8_get_next((unsigned char *)str, &tp); + } + if (ch == 0) return -1; + while ((_is_white(ch)) && (tp >= 0) && (ch != 0)) + { + p = tp; + ch = evas_common_font_utf8_get_next((unsigned char *)str, &tp); + } + if (ch == 0) return -1; + return p; +} + +static void +_layout_walk_back_to_item_word_redo(Ctxt *c, Evas_Object_Textblock_Item *it) +{ + Evas_Object_Textblock_Item *pit, *new_it = NULL; + Evas_List *remove_items = NULL, *l; + int index, tw, th, inset, adv; + + /* it is not appended yet */ + for (pit = (Evas_Object_Textblock_Item *)((Evas_Object_List *)c->ln->items)->last; + pit; + pit = (Evas_Object_Textblock_Item *)((Evas_Object_List *)pit)->prev) + { + if (_layout_ends_with_space(pit->text)) + { + break; + } + index = evas_common_font_utf8_get_last((unsigned char *)(pit->text), strlen(pit->text)); + index = _layout_word_start(pit->text, index); + if (index == 0) + remove_items = evas_list_prepend(remove_items, pit); + else + { + new_it = _layout_item_new(c, pit->format, pit->text + index); + new_it->source_node = pit->source_node; + new_it->source_pos = pit->source_pos + index; + _layout_item_text_cutoff(c, pit, index); + _layout_strip_trailing_whitespace(c, pit->format, pit); + break; + } + } + for (l = remove_items; l; l = l->next) + { + c->ln->items = evas_object_list_remove(c->ln->items, l->data); + } + /* new line now */ + if (remove_items) + { + pit = remove_items->data; + _layout_line_advance(c, pit->format); + } + else + { + _layout_line_advance(c, it->format); + } + if (new_it) + { + /* append new_it */ + tw = th = 0; + if (new_it->format->font.font) + c->ENFN->font_string_size_get(c->ENDT, new_it->format->font.font, new_it->text, &tw, &th); + new_it->w = tw; + new_it->h = th; + inset = 0; + if (new_it->format->font.font) + inset = c->ENFN->font_inset_get(c->ENDT, new_it->format->font.font, new_it->text); + new_it->inset = inset; + new_it->x = c->x; + adv = 0; + if (new_it->format->font.font) + adv = c->ENFN->font_h_advance_get(c->ENDT, new_it->format->font.font, new_it->text); + c->x += adv; + c->ln->items = evas_object_list_append(c->ln->items, new_it); + } + while (remove_items) + { + pit = remove_items->data; + remove_items = evas_list_remove_list(remove_items, remove_items); + /* append pit */ + pit->x = c->x; + adv = c->ENFN->font_h_advance_get(c->ENDT, pit->format->font.font, pit->text); + c->x += adv; + c->ln->items = evas_object_list_append(c->ln->items, pit); + } + if (it) + { + /* append it */ + it->x = c->x; + adv = 0; + if (it->format->font.font) + adv = c->ENFN->font_h_advance_get(c->ENDT, it->format->font.font, it->text); + c->x += adv; + c->ln->items = evas_object_list_append(c->ln->items, it); + } +} + +static void +_layout_text_append(Ctxt *c, Evas_Object_Textblock_Format *fmt, Evas_Object_Textblock_Node *n) +{ + int adv, inset, tw, th, new_line, empty_item; + int wrap, twrap, ch, index, white_stripped; + char *str; + Evas_Object_Textblock_Item *it; + + str = n->text; + new_line = 0; + empty_item = 0; + while (str) + { + /* if this is the first line item and it starts with spaces - remove them */ + wrap = 0; + white_stripped = 0; +/* + if (!c->ln->items) + { + twrap = wrap; + ch = evas_common_font_utf8_get_next((unsigned char *)str, &wrap); + while (_is_white(ch)) + { + twrap = wrap; + ch = evas_common_font_utf8_get_next((unsigned char *)str, &wrap); + } + str = str + twrap; + } + */ + it = _layout_item_new(c, fmt, str); + it->source_node = n; + it->source_pos = str - n->text; + tw = th = 0; + if (fmt->font.font) + c->ENFN->font_string_size_get(c->ENDT, fmt->font.font, it->text, &tw, &th); + if ((c->w >= 0) && + ((fmt->wrap_word) || (fmt->wrap_char)) && + ((c->x + tw) > + (c->w - c->o->style_pad.l - c->o->style_pad.r - + c->marginl - c->marginr))) + { + wrap = _layout_text_cutoff_get(c, fmt, it); + if (wrap > 0) + { + if (fmt->wrap_word) + { + index = wrap; + ch = evas_common_font_utf8_get_next((unsigned char *)str, &index); + if (!_is_white(ch)) + wrap = _layout_word_start(str, wrap); + if (wrap > 0) + { + twrap = wrap; + ch = evas_common_font_utf8_get_prev((unsigned char *)str, &twrap); + /* the text intersects the wrap point on a whitespace char */ + if (_is_white(ch)) + { + _layout_item_text_cutoff(c, it, wrap); + twrap = wrap; + ch = evas_common_font_utf8_get_next((unsigned char *)str, &twrap); + str = str + twrap; + } + /* intersects a word */ + else + { + /* walk back to start of word */ + twrap = _layout_word_start(str, wrap); + if (twrap != 0) + { + wrap = twrap; + ch = evas_common_font_utf8_get_prev((unsigned char *)str, &twrap); + _layout_item_text_cutoff(c, it, twrap); + str = str + wrap; + } + else + { + empty_item = 1; + if (it->text) free(it->text); + _format_free(c->obj, it->format); + free(it); + it = (Evas_Object_Textblock_Item *)((Evas_Object_List *)c->ln->items)->last; + _layout_strip_trailing_whitespace(c, fmt, it); + twrap = _layout_word_end(str, wrap); + ch = evas_common_font_utf8_get_next((unsigned char *)str, &twrap); + str = str + twrap; + } + } + } + else + { + /* wrap now is the index of the word START */ + index = wrap; + ch = evas_common_font_utf8_get_next((unsigned char *)str, &index); + if (!_is_white(ch) && + (!_layout_last_item_ends_in_whitespace(c))) + { + _layout_walk_back_to_item_word_redo(c, it); + return; + } + if (c->ln->items != NULL) + { + white_stripped = _layout_item_abort(c, fmt, it); + empty_item = 1; + } + else + { + if (wrap <= 0) + { + wrap = 0; + twrap = _layout_word_end(it->text, wrap); + wrap = twrap; + ch = evas_common_font_utf8_get_next((unsigned char *)str, &wrap); + if (twrap >= 0) + _layout_item_text_cutoff(c, it, twrap); + if (wrap > 0) + str = str + wrap; + else + str = NULL; + } + else + str = NULL; + } + } + } + else if (fmt->wrap_char) + { + _layout_item_text_cutoff(c, it, wrap); + str = str + wrap; + } + new_line = 1; + } + else + { + /* wrap now is the index of the word START */ + if (wrap <= 0) + { + if (wrap < 0) wrap = 0; + index = wrap; + ch = evas_common_font_utf8_get_next((unsigned char *)str, &index); + if (!_is_white(ch) && + (!_layout_last_item_ends_in_whitespace(c))) + { + _layout_walk_back_to_item_word_redo(c, it); + return; + } + } + if (c->ln->items != NULL) + { + white_stripped = _layout_item_abort(c, fmt, it); + empty_item = 1; + new_line = 1; + } + else + { + if (wrap <= 0) + { + wrap = 0; + twrap = _layout_word_end(it->text, wrap); + wrap = _layout_word_next(it->text, wrap); + if (twrap >= 0) + _layout_item_text_cutoff(c, it, twrap); + if (wrap >= 0) + str = str + wrap; + else + str = NULL; + } + else + str = NULL; + new_line = 1; + } + } + if (!empty_item) + { + tw = th = 0; + if (fmt->font.font) + c->ENFN->font_string_size_get(c->ENDT, fmt->font.font, it->text, &tw, &th); + } + } + else + str = NULL; + if (empty_item) empty_item = 0; + else + { + it->w = tw; + it->h = th; + inset = 0; + if (fmt->font.font) + inset = c->ENFN->font_inset_get(c->ENDT, fmt->font.font, it->text); + it->inset = inset; + it->x = c->x; + adv = 0; + if (fmt->font.font) + adv = c->ENFN->font_h_advance_get(c->ENDT, fmt->font.font, it->text); + c->x += adv; + c->ln->items = evas_object_list_append(c->ln->items, it); + } + if (new_line) + { + if (str) + { + if (!white_stripped) + { + index = 0; + ch = evas_common_font_utf8_get_next((unsigned char *)str, &index); + if (_is_white(ch)) str += index; + } + } + new_line = 0; + _layout_line_advance(c, fmt); + } + } +} + +static Evas_Object_Textblock_Format_Item * +_layout_format_item_add(Ctxt *c, Evas_Object_Textblock_Node *n, char *item) +{ + Evas_Object_Textblock_Format_Item *fi; + + fi = calloc(1, sizeof(Evas_Object_Textblock_Format_Item)); + fi->item = evas_stringshare_add(item); + fi->source_node = n; + c->ln->format_items = evas_object_list_append(c->ln->format_items, fi); + return fi; +} + +static void +_layout(const Evas_Object *obj, int calc_only, int w, int h, int *w_ret, int *h_ret) +{ + Evas_Object_Textblock *o; + Ctxt ctxt, *c; + Evas_Object_List *l; + Evas_List *removes = NULL; + Evas_Object_Textblock_Format *fmt = NULL; + int style_pad_l = 0, style_pad_r = 0, style_pad_t = 0, style_pad_b = 0; + + /* setup context */ + o = (Evas_Object_Textblock *)(obj->object_data); + c = &ctxt; + c->obj = (Evas_Object *)obj; + c->o = o; + c->lines = c->ln = NULL; + c->format_stack = NULL; + c->x = c->y = 0; + c->w = w; + c->h = h; + c->wmax = c->hmax = 0; + c->maxascent = c->maxdescent = 0; + c->marginl = c->marginr = 0; + c->have_underline = 0; + c->have_underline2 = 0; + c->underline_extend = 0; + c->line_no = 0; + c->align = 0.0; + + _format_command_init(); + + /* setup default base style */ + if ((c->o->style) && (c->o->style->default_tag)) + { + fmt = _layout_format_push(c, NULL); + _format_fill(c->obj, fmt, c->o->style->default_tag); + } + if (!fmt) + { + _format_command_shutdown(); + if (w_ret) *w_ret = 0; + if (h_ret) *h_ret = 0; + return; + } + /* run through all text and format nodes generating lines */ + for (l = (Evas_Object_List *)c->o->nodes; l; l = l->next) + { + Evas_Object_Textblock_Node *n; + + n = (Evas_Object_Textblock_Node *)l; + if (!c->ln) _layout_line_new(c, fmt); + if ((n->type == NODE_FORMAT) && (n->text)) + { + char *s; + char *item; + + s = n->text; + if (s[0] == '+') + { + fmt = _layout_format_push(c, fmt); + s++; + } + else if (s[0] == '-') + { + fmt = _layout_format_pop(c, fmt); + s++; + } + while ((item = _format_parse(&s))) + { + char tmp_delim = *s; + *s = '\0'; + if (_format_is_param(item)) + _layout_format_value_handle(c, fmt, item); + else + { + if ((!strcmp(item, "\n")) || (!strcmp(item, "\\n"))) + { + Evas_Object_Textblock_Format_Item *fi; + + fi = _layout_format_item_add(c, n, item); + fi->x = c->x; + fi->w = 0; + _layout_line_advance(c, fmt); + } + else if ((!strcmp(item, "\t")) || (!strcmp(item, "\\t"))) + { + Evas_Object_Textblock_Format_Item *fi; + int x2; + + x2 = (fmt->tabstops * ((c->x + fmt->tabstops) / fmt->tabstops)); + if (x2 > + (c->w - c->o->style_pad.l - + c->o->style_pad.r - + c->marginl - c->marginr)) + { + + _layout_line_advance(c, fmt); + x2 = (fmt->tabstops * ((c->x + fmt->tabstops) / fmt->tabstops)); + } + if (c->ln->items) + { + Evas_Object_Textblock_Item *it; + + it = (Evas_Object_Textblock_Item *)((Evas_Object_List *)c->ln->items)->last; + _layout_strip_trailing_whitespace(c, fmt, it); + } + fi = _layout_format_item_add(c, n, item); + fi->x = c->x; + fi->w = x2 - c->x; + c->x = x2; + } + } + *s = tmp_delim; + } + + evas_text_style_pad_get(fmt->style, &style_pad_l, &style_pad_r, &style_pad_t, &style_pad_b); + + if (fmt->underline2) + c->have_underline2 = 1; + else if (fmt->underline) + c->have_underline = 1; + } + else if ((n->type == NODE_TEXT) && (n->text)) + { + _layout_text_append(c, fmt, n); + if ((c->have_underline2) || (c->have_underline)) + { + if (style_pad_b < c->underline_extend) + style_pad_b = c->underline_extend; + c->have_underline = 0; + c->have_underline2 = 0; + c->underline_extend = 0; + } + } + } + if ((c->ln) && (c->ln->items) && (fmt)) + _layout_line_advance(c, fmt); + while (c->format_stack) + { + fmt = c->format_stack->data; + c->format_stack = evas_list_remove_list(c->format_stack, c->format_stack); + _format_free(c->obj, fmt); + } + for (l = (Evas_Object_List *)c->lines; l; l = l->next) + { + Evas_Object_Textblock_Line *ln; + + ln = (Evas_Object_Textblock_Line *)l; + if (ln->line_no == -1) + { + removes = evas_list_append(removes, ln); + } + else + { + if ((ln->y + ln->h) > c->hmax) c->hmax = ln->y + ln->h; + } + } + while (removes) + { + Evas_Object_Textblock_Line *ln; + + ln = removes->data; + c->lines = evas_object_list_remove(c->lines, ln); + removes = evas_list_remove_list(removes, removes); + _line_free(obj, ln); + } + + if (w_ret) *w_ret = c->wmax; + if (h_ret) *h_ret = c->hmax; + if ((o->style_pad.l != style_pad_l) || (o->style_pad.r != style_pad_r) || + (o->style_pad.t != style_pad_t) || (o->style_pad.b != style_pad_b)) + { + Evas_Object_Textblock_Line *lines; + + lines = c->lines; + c->lines = NULL; + o->style_pad.l = style_pad_l; + o->style_pad.r = style_pad_r; + o->style_pad.t = style_pad_t; + o->style_pad.b = style_pad_b; + _layout(obj, calc_only, w, h, w_ret, h_ret); + _lines_clear(obj, lines); + _format_command_shutdown(); + return; + } + if (!calc_only) + { + o->lines = c->lines; + _format_command_shutdown(); + return; + } + if (c->lines) _lines_clear(obj, c->lines); + _format_command_shutdown(); +} + +static void +_relayout(const Evas_Object *obj) +{ + Evas_Object_Textblock *o; + Evas_Object_Textblock_Line *lines; + + o = (Evas_Object_Textblock *)(obj->object_data); + lines = o->lines; + o->lines = NULL; + o->formatted.valid = 0; + o->native.valid = 0; + _layout(obj, + 0, + obj->cur.geometry.w, obj->cur.geometry.h, + &o->formatted.w, &o->formatted.h); + o->formatted.valid = 1; + if (lines) _lines_clear(obj, lines); + o->last_w = obj->cur.geometry.w; + o->changed = 0; + o->redraw = 1; +} + +static void +_find_layout_item_line_match(Evas_Object *obj, Evas_Object_Textblock_Node *n, int pos, Evas_Object_Textblock_Line **lnr, Evas_Object_Textblock_Item **itr) +{ + Evas_Object_List *l, *ll; + Evas_Object_Textblock *o; + + o = (Evas_Object_Textblock *)(obj->object_data); + for (l = (Evas_Object_List *)o->lines; l; l = l->next) + { + Evas_Object_Textblock_Line *ln; + + ln = (Evas_Object_Textblock_Line *)l; + for (ll = (Evas_Object_List *)ln->items; ll; ll = ll->next) + { + Evas_Object_Textblock_Item *it; + + it = (Evas_Object_Textblock_Item *)ll; + if (it->source_node == n) + { + if ((int)(it->source_pos + strlen(it->text)) >= pos) + { + *lnr = ln; + *itr = it; + return; + } + } + } + } +} + +static void +_find_layout_format_item_line_match(Evas_Object *obj, Evas_Object_Textblock_Node *n, Evas_Object_Textblock_Line **lnr, Evas_Object_Textblock_Format_Item **fir) +{ + Evas_Object_List *l, *ll; + Evas_Object_Textblock *o; + + o = (Evas_Object_Textblock *)(obj->object_data); + for (l = (Evas_Object_List *)o->lines; l; l = l->next) + { + Evas_Object_Textblock_Line *ln; + + ln = (Evas_Object_Textblock_Line *)l; + for (ll = (Evas_Object_List *)ln->format_items; ll; ll = ll->next) + { + Evas_Object_Textblock_Format_Item *fi; + + fi = (Evas_Object_Textblock_Format_Item *)ll; + if (fi->source_node == n) + { + *lnr = ln; + *fir = fi; + return; + } + } + } +} + +static Evas_Object_Textblock_Line * +_find_layout_line_num(const Evas_Object *obj, int line) +{ + Evas_Object_List *l; + Evas_Object_Textblock *o; + + o = (Evas_Object_Textblock *)(obj->object_data); + for (l = (Evas_Object_List *)o->lines; l; l = l->next) + { + Evas_Object_Textblock_Line *ln; + + ln = (Evas_Object_Textblock_Line *)l; + if (ln->line_no == line) return ln; + } + return NULL; +} + +/** + * Adds a textblock to the given evas. + * @param e The given evas. + * @return The new textblock object. + * @todo Find a documentation group to put this under. + */ +EAPI Evas_Object * +evas_object_textblock_add(Evas *e) +{ + Evas_Object *obj; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + obj = evas_object_new(); + evas_object_textblock_init(obj); + evas_object_inject(obj, e); + return obj; +} + +/** + * Creates a new textblock style. + * @return The new textblock style. + */ +EAPI Evas_Textblock_Style * +evas_textblock_style_new(void) +{ + Evas_Textblock_Style *ts; + + ts = calloc(1, sizeof(Evas_Textblock_Style)); + return ts; +} + +/** + * Destroys a textblock style. + * @param The textblock style to free. + * @return Returns no value. + */ +EAPI void +evas_textblock_style_free(Evas_Textblock_Style *ts) +{ + if (!ts) return; + if (ts->objects) + { + ts->delete_me = 1; + return; + } + _style_clear(ts); + free(ts); +} + +/** + * to be documented. + * @param ts to be documented. + * @param text to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_style_set(Evas_Textblock_Style *ts, const char *text) +{ + Evas_List *l; + + if (!ts) return; + _style_clear(ts); + if (text) ts->style_text = strdup(text); + + if (ts->style_text) + { + // format MUST be KEY='VALUE'[KEY='VALUE']... + char *p; + char *key_start, *key_stop, *val_start, *val_stop; + + key_start = key_stop = val_start = val_stop = NULL; + p = ts->style_text; + while (*p) + { + if (!key_start) + { + if (!isspace(*p)) + key_start = p; + } + else if (!key_stop) + { + if ((*p == '=') || (isspace(*p))) + key_stop = p; + } + else if (!val_start) + { + if (((*p) == '\'') && (*(p + 1))) + val_start = p + 1; + } + else if (!val_stop) + { + if (((*p) == '\'') && (p > ts->style_text) && (p[-1] != '\\')) + val_stop = p; + } + if ((key_start) && (key_stop) && (val_start) && (val_stop)) + { + char *tags, *replaces; + Evas_Object_Style_Tag *tag; + + tags = malloc(key_stop - key_start + 1); + if (tags) + { + tags[key_stop - key_start] = 0; + strncpy(tags, key_start, key_stop - key_start); + tags[key_stop - key_start] = 0; + } + + replaces = malloc(val_stop - val_start + 1); + if (replaces) + { + replaces[val_stop - val_start] = 0; + strncpy(replaces, val_start, val_stop - val_start); + replaces[val_stop - val_start] = 0; + } + if ((tags) && (replaces)) + { + if (!strcmp(tags, "DEFAULT")) + { + ts->default_tag = replaces; + free(tags); + } + else + { + tag = calloc(1, sizeof(Evas_Object_Style_Tag)); + if (tag) + { + tag->tag = tags; + tag->replace = replaces; + ts->tags = evas_object_list_append(ts->tags, tag); + } + else + { + free(tags); + free(replaces); + } + } + } + else + { + if (tags) free(tags); + if (replaces) free(replaces); + } + key_start = key_stop = val_start = val_stop = NULL; + } + p++; + } + } + + for (l = ts->objects; l; l = l->next) + { + Evas_Object *obj; + Evas_Object_Textblock *o; + + obj = l->data; + o = (Evas_Object_Textblock *)(obj->object_data); + if (o->markup_text) + evas_object_textblock_text_markup_set(obj, o->markup_text); + } +} + +/** + * to be documented. + * @param ts to be documented. + * @return to be documented. + */ +EAPI const char * +evas_textblock_style_get(const Evas_Textblock_Style *ts) +{ + if (!ts) return NULL; + return ts->style_text; +} + +/* textblock styles */ +/** + * to be documented. + * @param obj to be documented. + * @param ts to be documented. + * @return Returns no value. + */ +EAPI void +evas_object_textblock_style_set(Evas_Object *obj, Evas_Textblock_Style *ts) +{ + TB_HEAD(); + if (ts == o->style) return; + if ((ts) && (ts->delete_me)) return; + if (o->style) + { + Evas_Textblock_Style *old_ts; + + old_ts = o->style; + old_ts->objects = evas_list_remove(old_ts->objects, obj); + if ((old_ts->delete_me) && (!old_ts->objects)) + evas_textblock_style_free(old_ts); + } + if (ts) + { + ts->objects = evas_list_append(ts->objects, obj); + o->style = ts; + } + else + { + o->style = NULL; + } + if (o->markup_text) + evas_object_textblock_text_markup_set(obj, o->markup_text); +} + +/** + * to be documented. + * @param obj to be documented. + * @return to be documented. + */ +EAPI const Evas_Textblock_Style * +evas_object_textblock_style_get(const Evas_Object *obj) +{ + TB_HEAD_RETURN(NULL); + return o->style; +} + +static inline void +_advance_after_end_of_string(const char **p_buf) +{ + while (**p_buf != 0) (*p_buf)++; + (*p_buf)++; +} + +static inline int +_is_eq_and_advance(const char *s, const char *s_end, + const char **p_m, const char *m_end) +{ + for (;((s < s_end) && (*p_m < m_end)); s++, (*p_m)++) + { + if (*s != **p_m) + { + _advance_after_end_of_string(p_m); + return 0; + } + } + + if (*p_m < m_end) + _advance_after_end_of_string(p_m); + + return s == s_end; +} + +static inline void +_append_escaped_char(Evas_Textblock_Cursor *cur, const char *s, + const char *s_end) +{ + const char *map_itr, *map_end; + + map_itr = escape_strings; + map_end = map_itr + sizeof(escape_strings); + + while (map_itr < map_end) + { + if (_is_eq_and_advance(s, s_end, &map_itr, map_end)) + { + evas_textblock_cursor_text_append(cur, map_itr); + return; + } + + if (map_itr < map_itr) + _advance_after_end_of_string(&map_itr); + } +} + +/** + * to be documented. + * @param ts to be documented. + * @param text to be documented. + * @return Return no value. + */ +EAPI void +evas_object_textblock_text_markup_set(Evas_Object *obj, const char *text) +{ + TB_HEAD(); + if ((text != o->markup_text) && (o->markup_text)) + { + free(o->markup_text); + o->markup_text = NULL; + } + _nodes_clear(obj); + o->formatted.valid = 0; + o->native.valid = 0; + o->changed = 1; + evas_object_change(obj); + if (!o->style) + { + if (text != o->markup_text) + { + if (text) o->markup_text = strdup(text); + } + return; + } + evas_textblock_cursor_node_first(o->cursor); + if (text) + { + char *s, *p; + char *tag_start, *tag_end, *esc_start, *esc_end; + + tag_start = tag_end = esc_start = esc_end = NULL; + p = (char *)text; + s = p; + for (;;) + { + if ((*p == 0) || + (tag_end) || (esc_end) || + (tag_start) || (esc_start)) + { + if (tag_end) + { + char *ttag, *match; + + ttag = malloc(tag_end - tag_start); + if (ttag) + { + strncpy(ttag, tag_start + 1, tag_end - tag_start - 1); + ttag[tag_end - tag_start - 1] = 0; + match = _style_match_tag(o->style, ttag); + if (match) + evas_textblock_cursor_format_append(o->cursor, match); + else + { + if (ttag[0] == '/') + evas_textblock_cursor_format_append(o->cursor, "-"); + else + { + char *ttag2; + + ttag2 = malloc(strlen(ttag) + 2 + 1); + if (ttag2) + { + strcpy(ttag2, "+ "); + strcat(ttag2, ttag); + evas_textblock_cursor_format_append(o->cursor, ttag2); + free(ttag2); + } + } + } + free(ttag); + } + tag_start = tag_end = NULL; + } + else if (esc_end) + { + _append_escaped_char(o->cursor, esc_start, esc_end); + esc_start = esc_end = NULL; + } + else if (*p == 0) + { + _append_text_run(o, s, p); + s = NULL; + } + if (*p == 0) + break; + } + if (*p == '<') + { + if (!esc_start) + { + tag_start = p; + tag_end = NULL; + _append_text_run(o, s, p); + s = NULL; + } + } + else if (*p == '>') + { + if (tag_start) + { + tag_end = p; + s = p + 1; + } + } + else if (*p == '&') + { + if (!tag_start) + { + esc_start = p; + esc_end = NULL; + _append_text_run(o, s, p); + s = NULL; + } + } + else if (*p == ';') + { + if (esc_start) + { + esc_end = p; + s = p + 1; + } + } + p++; + } + if (text != o->markup_text) + o->markup_text = strdup(text); + } + { + Evas_List *l; + + evas_textblock_cursor_node_first(o->cursor); + for (l = o->cursors; l; l = l->next) + evas_textblock_cursor_node_first(l->data); + } +} + +/* + * to be documented. + * @param obj to be documented. + * @return to be documented. + */ +EAPI const char * +evas_object_textblock_text_markup_get(const Evas_Object *obj) +{ + TB_HEAD_RETURN(NULL); + return o->markup_text; +} + +/* cursors */ +/* + * to be documented. + * @param obj to be documented. + * @return to be documented. + */ +EAPI const Evas_Textblock_Cursor * +evas_object_textblock_cursor_get(const Evas_Object *obj) +{ + TB_HEAD_RETURN(NULL); + return o->cursor; +} + +/* + * to be documented. + * @param obj to be documented. + * @return to be documented. + */ +EAPI Evas_Textblock_Cursor * +evas_object_textblock_cursor_new(Evas_Object *obj) +{ + Evas_Textblock_Cursor *cur; + + TB_HEAD_RETURN(NULL); + cur = calloc(1, sizeof(Evas_Textblock_Cursor)); + cur->obj = obj; + cur->node = o->nodes; + cur->pos = 0; + o->cursors = evas_list_append(o->cursors, cur); + return cur; +} + +/* + * to be documented. + * @param cur to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_cursor_free(Evas_Textblock_Cursor *cur) +{ + Evas_Object_Textblock *o; + + if (!cur) return; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + if (cur == o->cursor) return; + o->cursors = evas_list_remove(o->cursors, cur); + free(cur); +} + +/* + * to be documented. + * @param cur to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_cursor_node_first(Evas_Textblock_Cursor *cur) +{ + Evas_Object_Textblock *o; + + if (!cur) return; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + cur->node = o->nodes; + cur->pos = 0; +} + +/* + * to be documented. + * @param cur to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_cursor_node_last(Evas_Textblock_Cursor *cur) +{ + Evas_Object_Textblock *o; + + if (!cur) return; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + if (o->nodes) + { + cur->node = (Evas_Object_Textblock_Node *)(((Evas_Object_List *)(o->nodes))->last); + cur->pos = 0; + evas_textblock_cursor_char_last(cur); + } + else + { + cur->node = NULL; + cur->pos = 0; + } +} + +/* + * to be documented. + * @param cur to be documented. + * @return to be documented. + */ +EAPI Evas_Bool +evas_textblock_cursor_node_next(Evas_Textblock_Cursor *cur) +{ + Evas_Object_Textblock *o; + + if (!cur) return 0; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + if (!cur->node) return 0; + if (((Evas_Object_List *)(cur->node))->next) + { + cur->node = (Evas_Object_Textblock_Node *)(((Evas_Object_List *)(cur->node))->next); + cur->pos = 0; + return 1; + } + return 0; +} + +/* + * to be documented. + * @param cur to be documented. + * @return to be documented. + */ +EAPI Evas_Bool +evas_textblock_cursor_node_prev(Evas_Textblock_Cursor *cur) +{ + Evas_Object_Textblock *o; + + if (!cur) return 0; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + if (!cur->node) return 0; + if (((Evas_Object_List *)(cur->node))->prev) + { + cur->node = (Evas_Object_Textblock_Node *)(((Evas_Object_List *)(cur->node))->prev); + evas_textblock_cursor_char_last(cur); + return 1; + } + return 0; +} + +/* + * to be documented. + * @param cur to be documented. + * @return to be documented. + */ +EAPI Evas_Bool +evas_textblock_cursor_char_next(Evas_Textblock_Cursor *cur) +{ + Evas_Object_Textblock *o; + int index, tindex, ch; + + if (!cur) return 0; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + if (!cur->node) return 0; + if (cur->node->type == NODE_FORMAT) return 0; + index = cur->pos; + ch = evas_common_font_utf8_get_next((unsigned char *)(cur->node->text), &index); + if ((ch == 0) || (index < 0)) return 0; + if (cur->node->text[index] == 0) return 0; + tindex = index; + cur->pos = index; + return 1; +} + +/* + * to be documented. + * @param cur to be documented. + * @return to be documented. + */ +EAPI Evas_Bool +evas_textblock_cursor_char_prev(Evas_Textblock_Cursor *cur) +{ + Evas_Object_Textblock *o; + int index, ch; + + if (!cur) return 0; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + if (!cur->node) return 0; + if (cur->node->type == NODE_FORMAT) return 0; + index = cur->pos; + ch = evas_common_font_utf8_get_prev((unsigned char *)(cur->node->text), &index); + if ((ch == 0) || (index < 0)) return 0; + cur->pos = index; + return 1; +} + +/* + * to be documented. + * @param cur to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_cursor_char_first(Evas_Textblock_Cursor *cur) +{ + if (!cur) return; + cur->pos = 0; +} + +/* + * to be documented. + * @param cur to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_cursor_char_last(Evas_Textblock_Cursor *cur) +{ + int index; + + if (!cur) return; + if (!cur->node) return; + if (cur->node->type == NODE_FORMAT) + { + cur->pos = 0; + return; + } + index = evas_common_font_utf8_get_last((unsigned char *)cur->node->text, cur->node->len); + if (index < 0) cur->pos = 0; + cur->pos = index; +} + +/* + * to be documented. + * @param cur to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_cursor_line_first(Evas_Textblock_Cursor *cur) +{ + Evas_Object_Textblock *o; + Evas_Object_Textblock_Line *ln = NULL; + Evas_Object_Textblock_Item *it = NULL; + Evas_Object_Textblock_Format_Item *fi = NULL; + + if (!cur) return; + if (!cur->node) return; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + if (!o->formatted.valid) _relayout(cur->obj); + if (cur->node->type == NODE_FORMAT) + _find_layout_format_item_line_match(cur->obj, cur->node, &ln, &fi); + else + _find_layout_item_line_match(cur->obj, cur->node, cur->pos, &ln, &it); + if (!ln) return; + it = (Evas_Object_Textblock_Item *)ln->items; + fi = (Evas_Object_Textblock_Format_Item *)ln->format_items; + if ((it) && (fi)) + { + if (it->x < fi->x) fi = NULL; + else it = NULL; + } + if (it) + { + cur->pos = it->source_pos; + cur->node = it->source_node; + } + else if (fi) + { + cur->pos = 0; + cur->node = fi->source_node; + } +} + +/* + * to be documented. + * @param cur to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_cursor_line_last(Evas_Textblock_Cursor *cur) +{ + Evas_Object_Textblock *o; + Evas_Object_Textblock_Line *ln = NULL; + Evas_Object_Textblock_Item *it = NULL; + Evas_Object_Textblock_Format_Item *fi = NULL; + + if (!cur) return; + if (!cur->node) return; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + if (!o->formatted.valid) _relayout(cur->obj); + if (cur->node->type == NODE_FORMAT) + _find_layout_format_item_line_match(cur->obj, cur->node, &ln, &fi); + else + _find_layout_item_line_match(cur->obj, cur->node, cur->pos, &ln, &it); + if (!ln) return; + if (ln->items) + it = (Evas_Object_Textblock_Item *)(((Evas_Object_List *)ln->items)->last); + else + it = NULL; + if (ln->format_items) + fi = (Evas_Object_Textblock_Format_Item *)(((Evas_Object_List *)ln->format_items)->last); + else + fi = NULL; + if ((it) && (fi)) + { + if ((it->x + it->w) > (fi->x + fi->w)) fi = NULL; + else it = NULL; + } + if (it) + { + int index; + + cur->pos = it->source_pos; + cur->node = it->source_node; + index = evas_common_font_utf8_get_last((unsigned char *)it->text, strlen(it->text)); + if (index >= 0) cur->pos += index; + } + else if (fi) + { + cur->pos = 0; + cur->node = fi->source_node; + } +} + +/* + * to be documented. + * @param cur to be documented. + * @return to be documented. + */ +EAPI int +evas_textblock_cursor_pos_get(const Evas_Textblock_Cursor *cur) +{ + if (!cur) return -1; + return cur->pos; +} + +/* + * to be documented. + * @param cur to be documented. + * @param int to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_cursor_pos_set(Evas_Textblock_Cursor *cur, int pos) +{ + if (!cur) return; + if (!cur->node) return; + if (cur->node->type == NODE_FORMAT) pos = 0; + if (pos < 0) pos = 0; + else if (pos > cur->node->len) pos = cur->node->len; + cur->pos = pos; +} + +/* + * to be documented. + * @param cur to be documented. + * @param int to be documented. + * @return to be documented. + */ +EAPI Evas_Bool +evas_textblock_cursor_line_set(Evas_Textblock_Cursor *cur, int line) +{ + Evas_Object_Textblock *o; + Evas_Object_Textblock_Line *ln; + Evas_Object_Textblock_Item *it; + Evas_Object_Textblock_Format_Item *fi; + + if (!cur) return 0; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + if (!o->formatted.valid) _relayout(cur->obj); + + ln = _find_layout_line_num(cur->obj, line); + if (!ln) return 0; + it = (Evas_Object_Textblock_Item *)ln->items; + fi = (Evas_Object_Textblock_Format_Item *)ln->format_items; + if ((it) && (fi)) + { + if (it->x < fi->x) fi = NULL; + else it = NULL; + } + if (it) + { + cur->pos = it->source_pos; + cur->node = it->source_node; + } + else if (fi) + { + cur->pos = 0; + cur->node = fi->source_node; + } + return 1; +} + +/* + * to be documented. + * @param cur1 to be documented. + * @param cur2 to be documented. + * @return to be documented. + */ +EAPI int +evas_textblock_cursor_compare(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *cur2) +{ + Evas_Object_List *l1, *l2; + + if (!cur1) return 0; + if (!cur2) return 0; + if (cur1->obj != cur2->obj) return 0; + if ((!cur1->node) || (!cur2->node)) return 0; + if (cur1->node == cur2->node) + { + if (cur1->pos < cur2->pos) return -1; /* cur1 < cur2 */ + else if (cur1->pos > cur2->pos) return 1; /* cur2 < cur1 */ + return 0; /* cur1 == cur2 */ + } + for (l1 = (Evas_Object_List *)cur1->node, + l2 = (Evas_Object_List *)cur1->node; (l1) || (l2);) + { + if (l1 == (Evas_Object_List *)cur2->node) return 1; /* cur2 < cur 1 */ + else if (l2 == (Evas_Object_List *)cur2->node) return -1; /* cur1 < cur 2 */ + else if (!l1) return -1; /* cur1 < cur 2 */ + else if (!l2) return 1; /* cur2 < cur 1 */ + if (l1) l1 = l1->prev; + if (l2) l2 = l2->next; + } + return 0; +} + +/* + * to be documented. + * @param cur to be documented. + * @param cur_dest to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_cursor_copy(const Evas_Textblock_Cursor *cur, Evas_Textblock_Cursor *cur_dest) +{ + if (!cur) return; + if (!cur_dest) return; + if (cur->obj != cur_dest->obj) return; + cur_dest->pos = cur->pos; + cur_dest->node = cur->node; +} + + +/* text controls */ +/* + * to be documented. + * @param cur to be documented. + * @param text to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_cursor_text_append(Evas_Textblock_Cursor *cur, const char *text) +{ + Evas_Object_Textblock *o; + Evas_Object_Textblock_Node *n; + int index, ch; + + if (!cur) return; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + { + Evas_List *l; + + if (cur != o->cursor) + { + if (cur->node == o->cursor->node) + { + if (o->cursor->pos > cur->pos) + o->cursor->pos += strlen(text); + } + } + for (l = o->cursors; l; l = l->next) + { + if (l->data != cur) + { + if (cur->node == ((Evas_Textblock_Cursor *)l->data)->node) + { + if (((Evas_Textblock_Cursor *)l->data)->pos > cur->pos) + ((Evas_Textblock_Cursor *)l->data)->pos += strlen(text); + } + } + } + } + n = cur->node; + if ((!n) || (n->type == NODE_FORMAT)) + { + n = calloc(1, sizeof(Evas_Object_Textblock_Node)); + n->type = NODE_TEXT; + o->nodes = evas_object_list_append(o->nodes, n); + } + cur->node = n; + index = cur->pos; + if (n->text) + { + ch = evas_common_font_utf8_get_next((unsigned char *)(n->text), &index); + if (ch != 0) + cur->pos = index; + } + if (cur->pos >= (n->len - 1)) + n->text = _strbuf_append(n->text, (char *)text, &(n->len), &(n->alloc)); + else + n->text = _strbuf_insert(n->text, (char *)text, cur->pos, &(n->len), &(n->alloc)); + cur->pos += strlen(text); + o->formatted.valid = 0; + o->native.valid = 0; + o->changed = 1; + evas_object_change(cur->obj); +} + +/* + * to be documented. + * @param cur to be documented. + * @param text to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_cursor_text_prepend(Evas_Textblock_Cursor *cur, const char *text) +{ + Evas_Object_Textblock *o; + Evas_Object_Textblock_Node *n; + int index; + + if (!cur) return; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + { + Evas_List *l; + + if (cur != o->cursor) + { + if (cur->node == o->cursor->node) + { + if ((o->cursor->node) && + (o->cursor->node->type == NODE_TEXT) && + (o->cursor->pos >= cur->pos)) + o->cursor->pos += strlen(text); + } + } + for (l = o->cursors; l; l = l->next) + { + if (l->data != cur) + { + if (cur->node == ((Evas_Textblock_Cursor *)l->data)->node) + { + if ((((Evas_Textblock_Cursor *)l->data)->node) && + (((Evas_Textblock_Cursor *)l->data)->node->type == NODE_TEXT) && + (((Evas_Textblock_Cursor *)l->data)->pos >= cur->pos)) + ((Evas_Textblock_Cursor *)l->data)->pos += strlen(text); + } + } + } + } + n = cur->node; + if ((!n) || (n->type == NODE_FORMAT)) + { + n = calloc(1, sizeof(Evas_Object_Textblock_Node)); + n->type = NODE_TEXT; + o->nodes = evas_object_list_append(o->nodes, n); + } + cur->node = n; + index = cur->pos; + if (cur->pos >= (n->len - 1)) + n->text = _strbuf_append(n->text, (char *)text, &(n->len), &(n->alloc)); + else + n->text = _strbuf_insert(n->text, (char *)text, cur->pos, &(n->len), &(n->alloc)); + cur->pos += strlen(text); + o->formatted.valid = 0; + o->native.valid = 0; + o->changed = 1; + evas_object_change(cur->obj); +} + +/* + * to be documented. + * @param cur to be documented. + * @param format to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_cursor_format_append(Evas_Textblock_Cursor *cur, const char *format) +{ + Evas_Object_Textblock *o; + Evas_Object_Textblock_Node *n, *nc, *n2; + + if (!cur) return; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + nc = cur->node; + n = calloc(1, sizeof(Evas_Object_Textblock_Node)); + n->type = NODE_FORMAT; + n->text = strdup(format); + n->len = strlen(n->text); + n->alloc = n->len + 1; + if (!nc) + { + o->nodes = evas_object_list_append(o->nodes, n); + } + else if (nc->type == NODE_FORMAT) + { + o->nodes = evas_object_list_append_relative(o->nodes, n, nc); + } + else if (nc->type == NODE_TEXT) + { + int index, ch = 0; + char *ts; + + index = cur->pos; + if (nc->text) + { + ch = evas_common_font_utf8_get_next((unsigned char *)(nc->text), &index); + if (ch != 0) + cur->pos = index; + } + o->nodes = evas_object_list_append_relative(o->nodes, n, nc); + if ((ch != 0) && (cur->pos < nc->len)) + { + n2 = calloc(1, sizeof(Evas_Object_Textblock_Node)); + n2->type = NODE_TEXT; + n2->text = _strbuf_append(n2->text, (char *)(nc->text + cur->pos), &(n2->len), &(n2->alloc)); + o->nodes = evas_object_list_append_relative(o->nodes, n2, n); + + *(nc->text + cur->pos) = 0; + nc->len = cur->pos; + ts = realloc(nc->text, nc->len + 1); + if (ts) + { + nc->text = ts; + nc->alloc = nc->len + 1; + } + } + } + cur->node = n; + cur->pos = 0; + o->formatted.valid = 0; + o->native.valid = 0; + o->changed = 1; + evas_object_change(cur->obj); +} + +/* + * to be documented. + * @param cur to be documented. + * @param format to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_cursor_format_prepend(Evas_Textblock_Cursor *cur, const char *format) +{ + Evas_Object_Textblock *o; + Evas_Object_Textblock_Node *n, *nc, *n2; + + if (!cur) return; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + nc = cur->node; + n = calloc(1, sizeof(Evas_Object_Textblock_Node)); + n->type = NODE_FORMAT; + n->text = strdup(format); + n->len = strlen(n->text); + n->alloc = n->len + 1; + if (!nc) + { + o->nodes = evas_object_list_prepend(o->nodes, n); + } + else if (nc->type == NODE_FORMAT) + { + o->nodes = evas_object_list_prepend_relative(o->nodes, n, nc); + } + else if (nc->type == NODE_TEXT) + { + char *ts; + + if (cur->pos == 0) + o->nodes = evas_object_list_prepend_relative(o->nodes, n, nc); + else + o->nodes = evas_object_list_append_relative(o->nodes, n, nc); + if ((cur->pos < nc->len) && (cur->pos != 0)) + { + n2 = calloc(1, sizeof(Evas_Object_Textblock_Node)); + n2->type = NODE_TEXT; + n2->text = _strbuf_append(n2->text, (char *)(nc->text + cur->pos), &(n2->len), &(n2->alloc)); + o->nodes = evas_object_list_append_relative(o->nodes, n2, n); + + *(nc->text + cur->pos) = 0; + nc->len = cur->pos; + ts = realloc(nc->text, nc->len + 1); + if (ts) + { + nc->text = ts; + nc->alloc = nc->len + 1; + } + } + } + cur->node = n; + cur->pos = 0; + o->formatted.valid = 0; + o->native.valid = 0; + o->changed = 1; + evas_object_change(cur->obj); +} + +/* + * to be documented. + * @param cur to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_cursor_node_delete(Evas_Textblock_Cursor *cur) +{ + Evas_Object_Textblock *o; + Evas_Object_Textblock_Node *n, *n2; + + if (!cur) return; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + n = cur->node; + n2 = (Evas_Object_Textblock_Node *)(((Evas_Object_List *)n)->next); + if (n2) + { + cur->node = n2; + cur->pos = 0; + } + else + { + n2 = (Evas_Object_Textblock_Node *)(((Evas_Object_List *)n)->prev); + cur->node = n2; + cur->pos = 0; + evas_textblock_cursor_char_last(cur); + } + + { + Evas_List *l; + + if (cur != o->cursor) + { + if (n == o->cursor->node) + { + o->cursor->node = cur->node; + o->cursor->pos = cur->pos; + } + } + for (l = o->cursors; l; l = l->next) + { + if (l->data != cur) + { + if (n == ((Evas_Textblock_Cursor *)l->data)->node) + { + ((Evas_Textblock_Cursor *)l->data)->node = cur->node; + ((Evas_Textblock_Cursor *)l->data)->pos = cur->pos; + } + } + } + } + + o->nodes = evas_object_list_remove(o->nodes, n); + if (n->text) free(n->text); + free(n); + + o->formatted.valid = 0; + o->native.valid = 0; + o->changed = 1; + evas_object_change(cur->obj); +} + +/* + * to be documented. + * @param cur to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_cursor_char_delete(Evas_Textblock_Cursor *cur) +{ + Evas_Object_Textblock *o; + Evas_Object_Textblock_Node *n, *n2; + int chr, index, ppos; + + if (!cur) return; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + n = cur->node; + if (n->type == NODE_FORMAT) + { + evas_textblock_cursor_node_delete(cur); + return; + } + index = cur->pos; + chr = evas_common_font_utf8_get_next((unsigned char *)n->text, &index); + if (chr == 0) return; + ppos = cur->pos; + n->text = _strbuf_remove(n->text, cur->pos, index, &(n->len), &(n->alloc)); + if (!n->text) + { + evas_textblock_cursor_node_delete(cur); + return; + } + if (cur->pos == n->len) + { + n2 = (Evas_Object_Textblock_Node *)(((Evas_Object_List *)n)->next); + if (n2) + { + cur->node = n2; + cur->pos = 0; + } + else + { + cur->pos = 0; + evas_textblock_cursor_char_last(cur); + } + } + + { + Evas_List *l; + + if (cur != o->cursor) + { + if ((n == o->cursor->node) && + (o->cursor->pos > ppos)) + { + o->cursor->pos -= (index - ppos); + } + } + for (l = o->cursors; l; l = l->next) + { + if (l->data != cur) + { + if ((n == ((Evas_Textblock_Cursor *)l->data)->node) && + (((Evas_Textblock_Cursor *)l->data)->pos > ppos)) + { + ((Evas_Textblock_Cursor *)l->data)->pos -= (index - ppos); + } + } + } + } + + o->formatted.valid = 0; + o->native.valid = 0; + o->changed = 1; + evas_object_change(cur->obj); +} + +/* + * to be documented. + * @param cur1 to be documented. + * @param cur2 to be documented. + * @return Returns no value. + */ +EAPI void +evas_textblock_cursor_range_delete(Evas_Textblock_Cursor *cur1, Evas_Textblock_Cursor *cur2) +{ + Evas_Object_Textblock *o; + Evas_Object_Textblock_Node *n1, *n2, *n, *tn; + Evas_Object_List *l; + + int chr, index; + + if (!cur1) return; + if (!cur2) return; + if (cur1->obj != cur2->obj) return; + o = (Evas_Object_Textblock *)(cur1->obj->object_data); + if (evas_textblock_cursor_compare(cur1, cur2) > 0) + { + Evas_Textblock_Cursor *tc; + + tc = cur1; + cur1 = cur2; + cur2 = tc; + } + n1 = cur1->node; + n2 = cur2->node; + index = cur2->pos; + chr = evas_common_font_utf8_get_next((unsigned char *)n2->text, &index); + if (chr == 0) return; + if (n1 == n2) + { + if (cur1->pos == cur2->pos) + { + evas_textblock_cursor_char_delete(cur1); + evas_textblock_cursor_copy(cur1, cur2); + return; + } + n1->text = _strbuf_remove(n1->text, cur1->pos, index, &(n1->len), &(n1->alloc)); + if (!n1->text) + { + evas_textblock_cursor_node_delete(cur1); + evas_textblock_cursor_copy(cur1, cur2); + return; + } + if (cur1->pos >= n1->len) + { + n2 = (Evas_Object_Textblock_Node *)(((Evas_Object_List *)n1)->next); + if (n2) + { + cur1->node = n2; + cur1->pos = 0; + } + else + { + cur1->pos = 0; + evas_textblock_cursor_char_last(cur1); + } + } + evas_textblock_cursor_copy(cur1, cur2); + } + else + { + Evas_List *removes, *format_hump = NULL; + Evas_Textblock_Cursor tcur; + + tcur.node = n2; + tcur.pos = 0; + index = cur2->pos; + chr = evas_common_font_utf8_get_next((unsigned char *)n2->text, &index); + if ((chr == 0) || (index >= n2->len)) + { + tcur.node = (Evas_Object_Textblock_Node *)((Evas_Object_List *)n2)->next; + tcur.pos = 0; + if (!tcur.node) + { + if (cur1->pos != 0) + { + tcur.node = n1; + index = cur1->pos; + chr = evas_common_font_utf8_get_prev((unsigned char *)n2->text, &index); + tcur.pos = index; + } + else + { + tcur.node = (Evas_Object_Textblock_Node *)((Evas_Object_List *)n1)->prev; + if (tcur.node->type == NODE_TEXT) + tcur.pos = evas_common_font_utf8_get_last((unsigned char *)tcur.node->text, tcur.node->len); + else + tcur.pos = 0; + } + } + } + n1->text = _strbuf_remove(n1->text, cur1->pos, n1->len, &(n1->len), &(n1->alloc)); + removes = NULL; + for (l = ((Evas_Object_List *)n1)->next; l != (Evas_Object_List *)n2; l = l->next) + removes = evas_list_append(removes, l); + if (n1->type == NODE_TEXT) + { + if (!n1->text) + evas_textblock_cursor_node_delete(cur1); + } + else + { + if (n1->text[0] == '+') + format_hump = evas_list_append(format_hump, n1); + else + { + o->nodes = evas_object_list_remove(o->nodes, n1); + if (n1->text) free(n1->text); + free(n1); + } + } + format_hump = NULL; + while (removes) + { + n = removes->data; + if (n->type == NODE_TEXT) + { + o->nodes = evas_object_list_remove(o->nodes, n); + if (n->text) free(n->text); + free(n); + } + else + { + if (n->text[0] == '+') + { + format_hump = evas_list_append(format_hump, n); + } + else if (n->text[0] == '-') + { + tn = evas_list_data(evas_list_last(format_hump)); + if (tn) + { + format_hump = evas_list_remove_list(format_hump, evas_list_last(format_hump)); + o->nodes = evas_object_list_remove(o->nodes, tn); + if (tn->text) free(tn->text); + free(tn); + o->nodes = evas_object_list_remove(o->nodes, n); + if (n->text) free(n->text); + free(n); + } + } + else + { + o->nodes = evas_object_list_remove(o->nodes, n); + if (n->text) free(n->text); + free(n); + } + } + removes = evas_list_remove_list(removes, removes); + } + if (n2->type == NODE_TEXT) + { + n2->text = _strbuf_remove(n2->text, 0, index, &(n2->len), &(n2->alloc)); + if (!n2->text) + evas_textblock_cursor_node_delete(cur2); + } + else + { + if (n2->text[0] == '-') + { + o->nodes = evas_object_list_remove(o->nodes, n2); + if (n2->text) free(n2->text); + free(n2); + n = evas_list_data(evas_list_last(format_hump)); + if (n) + { + o->nodes = evas_object_list_remove(o->nodes, n); + if (n->text) free(n->text); + free(n); + } + } + else + { + o->nodes = evas_object_list_remove(o->nodes, n2); + if (n2->text) free(n2->text); + free(n2); + } + } + if (format_hump) format_hump = evas_list_free(format_hump); + cur1->node = tcur.node; + cur1->pos = tcur.pos; + cur2->node = tcur.node; + cur2->pos = tcur.pos; + } + + /* FIXME: adjust cursors that are affected by the change */ + /* this is temporary just avoiding segv's - it sets all other cursors to + * the same pos as cur1 and cur2 + */ + { + Evas_List *l; + + if ((cur1 != o->cursor) && (cur2 != o->cursor)) + { + evas_textblock_cursor_copy(cur1, o->cursor); + } + for (l = o->cursors; l; l = l->next) + { + if ((l->data != cur1) && (l->data != cur2)) + { + evas_textblock_cursor_copy(cur1, l->data); + } + } + } + + o->formatted.valid = 0; + o->native.valid = 0; + o->changed = 1; + evas_object_change(cur1->obj); +} + +/* + * to be documented. + * @param cur to be documented. + * @return to be documented. + */ +EAPI const char * +evas_textblock_cursor_node_text_get(const Evas_Textblock_Cursor *cur) +{ + if (!cur) return NULL; + if (!cur->node) return NULL; + if (cur->node->type == NODE_TEXT) + { + return cur->node->text; + } + return NULL; +} + +/* + * to be documented. + * @param cur to be documented. + * @return to be documented. + */ +EAPI int +evas_textblock_cursor_node_text_length_get(const Evas_Textblock_Cursor *cur) +{ + if (!cur) return 0; + if (!cur->node) return 0; + if (cur->node->type == NODE_TEXT) + { + return cur->node->len; + } + return 0; +} + +/* + * to be documented. + * @param cur to be documented. + * @return to be documented. + */ +EAPI const char * +evas_textblock_cursor_node_format_get(const Evas_Textblock_Cursor *cur) +{ + if (!cur) return NULL; + if (!cur->node) return NULL; + if (cur->node->type == NODE_FORMAT) + { + return cur->node->text; + } + return NULL; +} + +/* + * to be documented. + * @param cur1 to be documented. + * @param cur2 to be documented. + * @param format to be documented. + * @return to be documented. + */ +EAPI char * +evas_textblock_cursor_range_text_get(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *cur2, Evas_Textblock_Text_Type format) +{ + Evas_Object_Textblock *o; + Evas_Object_Textblock_Node *n1, *n2, *n; + Evas_Object_List *l; + char *str = NULL, *s; + int len = 0, alloc = 0, chr, index; + + if (!cur1) return NULL; + if (!cur2) return NULL; + if (cur1->obj != cur2->obj) return NULL; + o = (Evas_Object_Textblock *)(cur1->obj->object_data); + if (evas_textblock_cursor_compare(cur1, cur2) > 0) + { + const Evas_Textblock_Cursor *tc; + + tc = cur1; + cur1 = cur2; + cur2 = tc; + } + n1 = cur1->node; + n2 = cur2->node; + index = cur2->pos; + chr = evas_common_font_utf8_get_next((unsigned char *)n2->text, &index); + for (l = (Evas_Object_List *)n1; ;l = l->next) + { + n = (Evas_Object_Textblock_Node *)l; + if (n->type == NODE_TEXT) + { + s = n->text; + if ((n == n1) && (n == n2)) + { + s += cur1->pos; + str = _strbuf_append_n(str, s, index - cur1->pos, &len, &alloc); + + } + else if (n == n1) + { + s += cur1->pos; + str = _strbuf_append(str, s, &len, &alloc); + } + else if (n == n2) + { + str = _strbuf_append_n(str, s, index, &len, &alloc); + } + else + { + str = _strbuf_append(str, s, &len, &alloc); + } + } + else + { + if (format == EVAS_TEXTBLOCK_TEXT_PLAIN) + { + s = n->text; + while (*s) + { + if (*s == '\n') + str = _strbuf_append(str, "\n", &len, &alloc); + else if (*s == '\t') + str = _strbuf_append(str, "\t", &len, &alloc); + s++; + } + } + } + if (l == (Evas_Object_List *)n2) break; + } + return str; +} + +/* + * to be documented. + * @param cur to be documented. + * @param cx to be documented. + * @param cy to be documented. + * @param cw to be documented. + * @param ch to be documented. + * @return to be documented. + */ +EAPI int +evas_textblock_cursor_char_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) +{ + Evas_Object_Textblock *o; + Evas_Object_Textblock_Line *ln = NULL; + Evas_Object_Textblock_Item *it = NULL; + Evas_Object_Textblock_Format_Item *fi = NULL; + int x = 0, y = 0, w = 0, h = 0; + int pos, ret; + + if (!cur) return -1; + if (!cur->node) return -1; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + if (!o->formatted.valid) _relayout(cur->obj); + if (cur->node->type == NODE_FORMAT) + _find_layout_format_item_line_match(cur->obj, cur->node, &ln, &fi); + else + _find_layout_item_line_match(cur->obj, cur->node, cur->pos, &ln, &it); + if (!ln) return -1; + if (it) + { + pos = cur->pos - it->source_pos; + ret = -1; + if (it->format->font.font) + ret = cur->ENFN->font_char_coords_get(cur->ENDT, it->format->font.font, + it->text, + pos, + &x, &y, &w, &h); + if (ret <= 0) return -1; + x = ln->x + it->x - it->inset + x; + if (x < ln->x) + { + x = ln->x; + w -= (ln->x - x); + } + y = ln->y; + h = ln->h; + } + else if (fi) + { + x = ln->x + fi->x; + y = ln->y; + w = fi->w; + h = ln->h; + } + else + return -1; + if (cx) *cx = x; + if (cy) *cy = y; + if (cw) *cw = w; + if (ch) *ch = h; + return ln->line_no; +} + +/* + * to be documented. + * @param cur to be documented. + * @param cx to be documented. + * @param cy to be documented. + * @param cw to be documented. + * @param ch to be documented. + * @return to be documented. + */ +EAPI int +evas_textblock_cursor_line_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) +{ + Evas_Object_Textblock *o; + Evas_Object_Textblock_Line *ln = NULL; + Evas_Object_Textblock_Item *it = NULL; + Evas_Object_Textblock_Format_Item *fi = NULL; + int x, y, w, h; + + if (!cur) return -1; + if (!cur->node) return -1; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + if (!o->formatted.valid) _relayout(cur->obj); + if (cur->node->type == NODE_FORMAT) + _find_layout_format_item_line_match(cur->obj, cur->node, &ln, &fi); + else + _find_layout_item_line_match(cur->obj, cur->node, cur->pos, &ln, &it); + if (!ln) return -1; + x = ln->x; + y = ln->y; + w = ln->w; + h = ln->h; + if (cx) *cx = x; + if (cy) *cy = y; + if (cw) *cw = w; + if (ch) *ch = h; + return ln->line_no; +} + +/* + * to be documented. + * @param cur to be documented. + * @param x to be documented. + * @param y to be documented. + * @return to be documented. + */ +EAPI Evas_Bool +evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, Evas_Coord y) +{ + Evas_Object_Textblock *o; + Evas_Object_List *l, *ll; + Evas_Object_Textblock_Item *it = NULL, *it_break = NULL; + Evas_Object_Textblock_Format_Item *fi = NULL; + + if (!cur) return 0; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + if (!o->formatted.valid) _relayout(cur->obj); + x += o->style_pad.l; + y += o->style_pad.t; + for (l = (Evas_Object_List *)o->lines; l; l = l->next) + { + Evas_Object_Textblock_Line *ln; + + ln = (Evas_Object_Textblock_Line *)l; + if (ln->y > y) break; + if ((ln->y <= y) && ((ln->y + ln->h) > y)) + { + for (ll = (Evas_Object_List *)ln->items; ll; ll = ll->next) + { + it = (Evas_Object_Textblock_Item *)ll; + if ((it->x +ln->x) > x) + { + it_break = it; + break; + } + if (((it->x + ln->x) <= x) && (((it->x + ln->x) + it->w) > x)) + { + int pos; + int cx, cy, cw, ch; + + pos = -1; + if (it->format->font.font) + pos = cur->ENFN->font_char_at_coords_get(cur->ENDT, + it->format->font.font, + it->text, + x - it->x - ln->x, 0, + &cx, &cy, &cw, &ch); + if (pos < 0) + return 0; + cur->pos = pos + it->source_pos; + cur->node = it->source_node; + return 1; + } + } + for (ll = (Evas_Object_List *)ln->format_items; ll; ll = ll->next) + { + fi = (Evas_Object_Textblock_Format_Item *)ll; + if ((fi->x + ln->x) > x) break; + if (((fi->x + ln->x) <= x) && (((fi->x + ln->x) + fi->w) > x)) + { + cur->pos = 0; + cur->node = fi->source_node; + return 1; + } + } + if (it_break) + { + it = it_break; + cur->pos = it->source_pos; + cur->node = it->source_node; + return 1; + } + } + } + return 0; +} + +/* + * to be documented. + * @param cur to be documented. + * @param y to be documented. + * @return to be documented. + */ +EAPI int +evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord y) +{ + Evas_Object_Textblock *o; + Evas_Object_List *l; + + if (!cur) return -1; + o = (Evas_Object_Textblock *)(cur->obj->object_data); + if (!o->formatted.valid) _relayout(cur->obj); + y += o->style_pad.t; + for (l = (Evas_Object_List *)o->lines; l; l = l->next) + { + Evas_Object_Textblock_Line *ln; + + ln = (Evas_Object_Textblock_Line *)l; + if (ln->y > y) break; + if ((ln->y <= y) && ((ln->y + ln->h) > y)) + { + evas_textblock_cursor_line_set(cur, ln->line_no); + return ln->line_no; + } + } + return -1; +} + +/* + * to be documented. + * @param cur1 to be documented. + * @param cur2 to be documented. + * @return to be documented. + */ +EAPI Evas_List * +evas_textblock_cursor_range_geometry_get(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *cur2) +{ + Evas_Object_Textblock *o; + Evas_List *rects = NULL; + Evas_Coord cx, cy, cw, ch, lx, ly, lw, lh; + Evas_Textblock_Rectangle *tr; + int i, line, line2; + + if (!cur1) return NULL; + if (!cur2) return NULL; + if (cur1->obj != cur2->obj) return NULL; + o = (Evas_Object_Textblock *)(cur1->obj->object_data); + if (evas_textblock_cursor_compare(cur1, cur2) > 0) + { + const Evas_Textblock_Cursor *tc; + + tc = cur1; + cur1 = cur2; + cur2 = tc; + } + line = evas_textblock_cursor_char_geometry_get(cur1, &cx, &cy, &cw, &ch); + if (line < 0) return NULL; + line = evas_textblock_cursor_line_geometry_get(cur1, &lx, &ly, &lw, &lh); + if (line < 0) return NULL; + line2 = evas_textblock_cursor_line_geometry_get(cur2, NULL, NULL, NULL, NULL); + if (line2 < 0) return NULL; + if (line == line2) + { + tr = calloc(1, sizeof(Evas_Textblock_Rectangle)); + rects = evas_list_append(rects, tr); + tr->x = cx; + tr->y = ly; + tr->h = lh; + line = evas_textblock_cursor_char_geometry_get(cur2, &cx, &cy, &cw, &ch); + if (line < 0) + { + while (rects) + { + free(rects->data); + rects = evas_list_remove_list(rects, rects); + } + return NULL; + } + tr->w = cx + cw - tr->x; + } + else + { + tr = calloc(1, sizeof(Evas_Textblock_Rectangle)); + rects = evas_list_append(rects, tr); + tr->x = cx; + tr->y = ly; + tr->h = lh; + tr->w = lx + lw - cx; + for (i = line +1; i < line2; i++) + { + evas_object_textblock_line_number_geometry_get(cur1->obj, i, &lx, &ly, &lw, &lh); + tr = calloc(1, sizeof(Evas_Textblock_Rectangle)); + rects = evas_list_append(rects, tr); + tr->x = lx; + tr->y = ly; + tr->h = lh; + tr->w = lw; + } + line = evas_textblock_cursor_char_geometry_get(cur2, &cx, &cy, &cw, &ch); + if (line < 0) + { + while (rects) + { + free(rects->data); + rects = evas_list_remove_list(rects, rects); + } + return NULL; + } + line = evas_textblock_cursor_line_geometry_get(cur2, &lx, &ly, &lw, &lh); + if (line < 0) + { + while (rects) + { + free(rects->data); + rects = evas_list_remove_list(rects, rects); + } + return NULL; + } + tr = calloc(1, sizeof(Evas_Textblock_Rectangle)); + rects = evas_list_append(rects, tr); + tr->x = lx; + tr->y = ly; + tr->h = lh; + tr->w = cx + cw - lx; + } + return rects; +} + +/* general controls */ +/* + * to be documented. + * @param obj to be documented. + * @param line to be documented. + * @param cx to be documented. + * @param cy to be documented. + * @param cw to be documented. + * @param ch to be documented. + * @return to be documented. + */ +EAPI Evas_Bool +evas_object_textblock_line_number_geometry_get(const Evas_Object *obj, int line, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) +{ + Evas_Object_Textblock_Line *ln; + + TB_HEAD_RETURN(0); + ln = _find_layout_line_num(obj, line); + if (!ln) return 0; + if (cx) *cx = ln->x; + if (cy) *cy = ln->y; + if (cw) *cw = ln->w; + if (ch) *ch = ln->h; + return 1; +} + +/* + * to be documented. + * @param obj to be documented. + * @return Returns no value. + */ +EAPI void +evas_object_textblock_clear(Evas_Object *obj) +{ + Evas_List *l; + + TB_HEAD(); + _nodes_clear(obj); + o->cursor->node = NULL; + o->cursor->pos = 0; + for (l = o->cursors; l; l = l->next) + { + Evas_Textblock_Cursor *cur; + + cur = (Evas_Textblock_Cursor *)l->data; + cur->node = NULL; + cur->pos = 0; + } + if (o->markup_text) + { + free(o->markup_text); + o->markup_text = NULL; + } + if (o->lines) + { + _lines_clear(obj, o->lines); + o->lines = NULL; + } + o->formatted.valid = 0; + o->native.valid = 0; + o->changed = 1; + evas_object_change(obj); + /* FIXME: adjust cursors that are affected by the change */ +} + +/* + * to be documented. + * @param obj to be documented. + * @param w to be documented. + * @param h to be documented. + * @return Returns no value. + */ +EAPI void +evas_object_textblock_size_formatted_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) +{ + TB_HEAD(); + if (!o->formatted.valid) _relayout(obj); + if (w) *w = o->formatted.w; + if (h) *h = o->formatted.h; +} + +/* + * to be documented. + * @param obj to be documented. + * @param w to be documented. + * @param h to be documented. + * @return Returns no value. + */ +EAPI void +evas_object_textblock_size_native_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h) +{ + TB_HEAD(); + if (!o->native.valid) + { + _layout(obj, + 1, + -1, -1, + &o->native.w, &o->native.h); + o->native.valid = 1; + } + if (w) *w = o->native.w; + if (h) *h = o->native.h; +} + +/* + * to be documented. + * @param obj to be documented. + * @param l to be documented. + * @param r to be documented. + * @param t to be documented. + * @param b to be documented. + * @return Returns no value. + */ +EAPI void +evas_object_textblock_style_insets_get(const Evas_Object *obj, Evas_Coord *l, Evas_Coord *r, Evas_Coord *t, Evas_Coord *b) +{ + TB_HEAD(); + if (!o->formatted.valid) _relayout(obj); + if (l) *l = o->style_pad.l; + if (r) *r = o->style_pad.r; + if (t) *t = o->style_pad.t; + if (b) *b = o->style_pad.b; +} + +/* all nice and private */ +static void +evas_object_textblock_init(Evas_Object *obj) +{ + Evas_Object_Textblock *o; + + /* alloc image ob, setup methods and default values */ + obj->object_data = evas_object_textblock_new(); + /* set up default settings for this kind of object */ + obj->cur.color.r = 255; + obj->cur.color.g = 255; + obj->cur.color.b = 255; + obj->cur.color.a = 255; + obj->cur.geometry.x = 0.0; + obj->cur.geometry.y = 0.0; + obj->cur.geometry.w = 0.0; + obj->cur.geometry.h = 0.0; + obj->cur.layer = 0; + /* set up object-specific settings */ + obj->prev = obj->cur; + /* set up methods (compulsory) */ + obj->func = &object_func; + obj->type = o_type; + + o = (Evas_Object_Textblock *)(obj->object_data); + o->cursor->obj = obj; +} + +static void * +evas_object_textblock_new(void) +{ + Evas_Object_Textblock *o; + + /* alloc obj private data */ + o = calloc(1, sizeof(Evas_Object_Textblock)); + o->magic = MAGIC_OBJ_TEXTBLOCK; + o->cursor = calloc(1, sizeof(Evas_Textblock_Cursor)); + return o; +} + +static void +evas_object_textblock_free(Evas_Object *obj) +{ + Evas_Object_Textblock *o; + + evas_object_textblock_clear(obj); + evas_object_textblock_style_set(obj, NULL); + o = (Evas_Object_Textblock *)(obj->object_data); + free(o->cursor); + while (o->cursors) + { + Evas_Textblock_Cursor *cur; + + cur = (Evas_Textblock_Cursor *)o->cursors->data; + o->cursors = evas_list_remove_list(o->cursors, o->cursors); + free(cur); + } + o->magic = 0; + free(o); +} + +static void +evas_object_textblock_render(Evas_Object *obj, void *output, void *context, void *surface, int x, int y) +{ + Evas_Object_Textblock *o; + Evas_Object_List *l, *ll; + int i, j; + int pback = 0, backx = 0; + int pline = 0, linex = 0; + int pline2 = 0, line2x = 0; + int pstrike = 0, strikex = 0; + int x2; + unsigned char r = 0, g = 0, b = 0, a = 0; + unsigned char r2 = 0, g2 = 0, b2 = 0, a2 = 0; + unsigned char r3 = 0, g3 = 0, b3 = 0, a3 = 0; + const char vals[5][5] = + { + {0, 1, 2, 1, 0}, + {1, 3, 4, 3, 1}, + {2, 4, 5, 4, 2}, + {1, 3, 4, 3, 1}, + {0, 1, 2, 1, 0} + }; + + /* render object to surface with context, and offxet by x,y */ + o = (Evas_Object_Textblock *)(obj->object_data); + obj->layer->evas->engine.func->context_multiplier_unset(output, + context); +#if 0 /* using for some debugging. will go soon */ + obj->layer->evas->engine.func->context_color_set(output, + context, + 230, 160, 30, 100); + obj->layer->evas->engine.func->rectangle_draw(output, + context, + surface, + obj->cur.geometry.x + x, + obj->cur.geometry.y + y, + obj->cur.geometry.w, + obj->cur.geometry.h); +//// obj->cur.cache.geometry.x + x, +//// obj->cur.cache.geometry.y + y, +//// obj->cur.cache.geometry.w, +//// obj->cur.cache.geometry.h); +#endif +#define ITEM_WALK() \ + for (l = (Evas_Object_List *)o->lines; l; l = l->next) \ + { \ + Evas_Object_Textblock_Line *ln; \ + \ + ln = (Evas_Object_Textblock_Line *)l; \ + pback = 0; \ + pline = 0; \ + pline2 = 0; \ + pstrike = 0; \ + for (ll = (Evas_Object_List *)ln->items; ll; ll = ll->next) \ + { \ + Evas_Object_Textblock_Item *it; \ + int yoff; \ + \ + it = (Evas_Object_Textblock_Item *)ll; \ + yoff = ln->baseline; \ + if (it->format->valign != -1.0) \ + yoff = (it->format->valign * (double)(ln->h - it->h)) + it->baseline; +#define ITEM_WALK_END() \ + } \ + } +#define COLOR_SET(col) \ + ENFN->context_color_set(output, context, \ + (obj->cur.cache.clip.r * it->format->color.col.r) / 255, \ + (obj->cur.cache.clip.g * it->format->color.col.g) / 255, \ + (obj->cur.cache.clip.b * it->format->color.col.b) / 255, \ + (obj->cur.cache.clip.a * it->format->color.col.a) / 255); +#define COLOR_SET_AMUL(col, amul) \ + ENFN->context_color_set(output, context, \ + (obj->cur.cache.clip.r * it->format->color.col.r * (amul)) / 65025, \ + (obj->cur.cache.clip.g * it->format->color.col.g * (amul)) / 65025, \ + (obj->cur.cache.clip.b * it->format->color.col.b * (amul)) / 65025, \ + (obj->cur.cache.clip.a * it->format->color.col.a * (amul)) / 65025); +#define DRAW_TEXT(ox, oy) \ + if (it->format->font.font) ENFN->font_draw(output, context, surface, it->format->font.font, \ + obj->cur.geometry.x + ln->x + it->x - it->inset + x + (ox), \ + obj->cur.geometry.y + ln->y + yoff + y + (oy), \ + it->w, it->h, it->w, it->h, it->text); +#if 0 +#define DRAW_TEXT(ox, oy) \ + if (it->format->font.font) ENFN->font_draw(output, context, surface, it->format->font.font, \ + obj->cur.geometry.x + ln->x + it->x - it->inset + x + (ox), \ + obj->cur.geometry.y + ln->y + yoff + y + (oy), \ + obj->cur.cache.geometry.x + ln->x + it->x - it->inset + x + (ox), \ + obj->cur.cache.geometry.y + ln->y + yoff + y + (oy), \ + it->w, it->h, it->w, it->h, it->text); +#endif + + pback = 0; + /* backing */ + ITEM_WALK(); + if ((it->format->backing) && (!pback) && (ll->next)) + { + pback = 1; + backx = it->x; + r = it->format->color.backing.r; + g = it->format->color.backing.g; + b = it->format->color.backing.b; + a = it->format->color.backing.a; + } + else if (((pback) && (!it->format->backing)) || + (!ll->next) || + (it->format->color.backing.r != r) || + (it->format->color.backing.g != g) || + (it->format->color.backing.b != b) || + (it->format->color.backing.a != a)) + { + if ((it->format->backing) && (!pback)) + { + backx = it->x; + r = it->format->color.backing.r; + g = it->format->color.backing.g; + b = it->format->color.backing.b; + a = it->format->color.backing.a; + } + x2 = it->x + it->w; + if (!it->format->backing) + { + x2 = it->x; + pback = 0; + } + if (x2 > backx) + { + ENFN->context_color_set(output, + context, + (obj->cur.cache.clip.r * r) / 255, + (obj->cur.cache.clip.g * g) / 255, + (obj->cur.cache.clip.b * b) / 255, + (obj->cur.cache.clip.a * a) / 255); + ENFN->rectangle_draw(output, + context, + surface, + obj->cur.geometry.x + ln->x + backx + x, + obj->cur.geometry.y + ln->y + y, +//// obj->cur.cache.geometry.x + ln->x + backx + x, +//// obj->cur.cache.geometry.y + ln->y + y, + x2 - backx, + ln->h); + } + if (it->format->backing) pback = 1; + backx = it->x; + r = it->format->color.backing.r; + g = it->format->color.backing.g; + b = it->format->color.backing.b; + a = it->format->color.backing.a; + } + ITEM_WALK_END(); + + /* shadows */ + ITEM_WALK(); + if (it->format->style == EVAS_TEXT_STYLE_SHADOW) + { + COLOR_SET(shadow); + DRAW_TEXT(1, 1); + } + else if ((it->format->style == EVAS_TEXT_STYLE_OUTLINE_SHADOW) || + (it->format->style == EVAS_TEXT_STYLE_FAR_SHADOW)) + { + COLOR_SET(shadow); + DRAW_TEXT(2, 2); + } + else if ((it->format->style == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW) || + (it->format->style == EVAS_TEXT_STYLE_FAR_SOFT_SHADOW)) + { + for (j = 0; j < 5; j++) + { + for (i = 0; i < 5; i++) + { + if (vals[i][j] != 0) + { + COLOR_SET_AMUL(shadow, vals[i][j] * 50); + DRAW_TEXT(i, j); + } + } + } + } + else if (it->format->style == EVAS_TEXT_STYLE_SOFT_SHADOW) + { + for (j = 0; j < 5; j++) + { + for (i = 0; i < 5; i++) + { + if (vals[i][j] != 0) + { + COLOR_SET_AMUL(shadow, vals[i][j] * 50); + DRAW_TEXT(i - 1, j - 1); + } + } + } + } + ITEM_WALK_END(); + + /* glows */ + ITEM_WALK(); + if (it->format->style == EVAS_TEXT_STYLE_GLOW) + { + for (j = 0; j < 5; j++) + { + for (i = 0; i < 5; i++) + { + if (vals[i][j] != 0) + { + COLOR_SET_AMUL(glow, vals[i][j] * 50); + DRAW_TEXT(i - 2, j - 2); + } + } + } + COLOR_SET(glow2); + DRAW_TEXT(-1, 0); + DRAW_TEXT(1, 0); + DRAW_TEXT(0, -1); + DRAW_TEXT(0, 1); + } + ITEM_WALK_END(); + + /* outlines */ + ITEM_WALK(); + if ((it->format->style == EVAS_TEXT_STYLE_OUTLINE) || + (it->format->style == EVAS_TEXT_STYLE_OUTLINE_SHADOW) || + (it->format->style == EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW)) + { + COLOR_SET(outline); + DRAW_TEXT(-1, 0); + DRAW_TEXT(1, 0); + DRAW_TEXT(0, -1); + DRAW_TEXT(0, 1); + } + else if (it->format->style == EVAS_TEXT_STYLE_SOFT_OUTLINE) + { + for (j = 0; j < 5; j++) + { + for (i = 0; i < 5; i++) + { + if (((i != 2) || (j != 2)) && (vals[i][j] != 0)) + { + COLOR_SET_AMUL(outline, vals[i][j] * 50); + DRAW_TEXT(i - 2, j - 2); + } + } + } + } + ITEM_WALK_END(); + + /* normal text */ + ITEM_WALK(); + COLOR_SET(normal); + DRAW_TEXT(0, 0); + if ((it->format->strikethrough) && (!pstrike) && (ll->next)) + { + pstrike = 1; + strikex = it->x; + r3 = it->format->color.strikethrough.r; + g3 = it->format->color.strikethrough.g; + b3 = it->format->color.strikethrough.b; + a3 = it->format->color.strikethrough.a; + } + else if (((pstrike) && (!it->format->strikethrough)) || + (!ll->next) || + (it->format->color.strikethrough.r != r3) || + (it->format->color.strikethrough.g != g3) || + (it->format->color.strikethrough.b != b3) || + (it->format->color.strikethrough.a != a3)) + { + if ((it->format->strikethrough) && (!pstrike)) + { + strikex = it->x; + r3 = it->format->color.strikethrough.r; + g3 = it->format->color.strikethrough.g; + b3 = it->format->color.strikethrough.b; + a3 = it->format->color.strikethrough.a; + } + x2 = it->x + it->w; + if (!it->format->strikethrough) + { + x2 = it->x; + pstrike = 0; + } + if (x2 > strikex) + { + ENFN->context_color_set(output, + context, + (obj->cur.cache.clip.r * r3) / 255, + (obj->cur.cache.clip.g * g3) / 255, + (obj->cur.cache.clip.b * b3) / 255, + (obj->cur.cache.clip.a * a3) / 255); + ENFN->rectangle_draw(output, + context, + surface, + obj->cur.geometry.x + ln->x + strikex + x, + obj->cur.geometry.y + ln->y + y + (ln->h / 2), +//// obj->cur.cache.geometry.x + ln->x + strikex + x, +//// obj->cur.cache.geometry.y + ln->y + y + (ln->h / 2), + x2 - strikex, + 1); + } + if (it->format->strikethrough) pstrike = 1; + strikex = it->x; + r3 = it->format->color.strikethrough.r; + g3 = it->format->color.strikethrough.g; + b3 = it->format->color.strikethrough.b; + a3 = it->format->color.strikethrough.a; + } + if ((it->format->underline) && (!pline) && (ll->next)) + { + pline = 1; + linex = it->x; + r = it->format->color.underline.r; + g = it->format->color.underline.g; + b = it->format->color.underline.b; + a = it->format->color.underline.a; + } + else if (((pline) && (!it->format->underline)) || + (!ll->next) || + (it->format->color.underline.r != r) || + (it->format->color.underline.g != g) || + (it->format->color.underline.b != b) || + (it->format->color.underline.a != a)) + { + if ((it->format->underline) && (!pline)) + { + linex = it->x; + r = it->format->color.underline.r; + g = it->format->color.underline.g; + b = it->format->color.underline.b; + a = it->format->color.underline.a; + } + x2 = it->x + it->w; + if (!it->format->underline) + { + x2 = it->x; + pline = 0; + } + if (x2 > linex) + { + ENFN->context_color_set(output, + context, + (obj->cur.cache.clip.r * r) / 255, + (obj->cur.cache.clip.g * g) / 255, + (obj->cur.cache.clip.b * b) / 255, + (obj->cur.cache.clip.a * a) / 255); + ENFN->rectangle_draw(output, + context, + surface, + obj->cur.geometry.x + ln->x + linex + x, + obj->cur.geometry.y + ln->y + y + ln->baseline + 1, +//// obj->cur.cache.geometry.x + ln->x + linex + x, +//// obj->cur.cache.geometry.y + ln->y + y + ln->baseline + 1, + x2 - linex, + 1); + } + if (it->format->underline) pline = 1; + linex = it->x; + r = it->format->color.underline.r; + g = it->format->color.underline.g; + b = it->format->color.underline.b; + a = it->format->color.underline.a; + } + if ((it->format->underline2) && (!pline2) && (ll->next)) + { + pline2 = 1; + line2x = it->x; + r2 = it->format->color.underline2.r; + g2 = it->format->color.underline2.g; + b2 = it->format->color.underline2.b; + a2 = it->format->color.underline2.a; + } + else if (((pline2) && (!it->format->underline2)) || + (!ll->next) || + (it->format->color.underline2.r != r2) || + (it->format->color.underline2.g != g2) || + (it->format->color.underline2.b != b2) || + (it->format->color.underline2.a != a2)) + { + if ((it->format->underline2) && (!pline2)) + { + line2x = it->x; + r2 = it->format->color.underline2.r; + g2 = it->format->color.underline2.g; + b2 = it->format->color.underline2.b; + a2 = it->format->color.underline2.a; + } + x2 = it->x + it->w; + if (!it->format->underline2) + { + x2 = it->x; + pline2 = 0; + } + if (x2 > line2x) + { + ENFN->context_color_set(output, + context, + (obj->cur.cache.clip.r * r2) / 255, + (obj->cur.cache.clip.g * g2) / 255, + (obj->cur.cache.clip.b * b2) / 255, + (obj->cur.cache.clip.a * a2) / 255); + ENFN->rectangle_draw(output, + context, + surface, + obj->cur.geometry.x + ln->x + line2x + x, + obj->cur.geometry.y + ln->y + y + ln->baseline + 3, +//// obj->cur.cache.geometry.x + ln->x + line2x + x, +//// obj->cur.cache.geometry.y + ln->y + y + ln->baseline + 3, + x2 - line2x, + 1); + } + if (it->format->underline2) pline2 = 1; + line2x = it->x; + r2 = it->format->color.underline2.r; + g2 = it->format->color.underline2.g; + b2 = it->format->color.underline2.b; + a2 = it->format->color.underline2.a; + } + ITEM_WALK_END(); +} + +static void +evas_object_textblock_render_pre(Evas_Object *obj) +{ + Evas_Rectangles rects = { 0, 0, NULL }; + Evas_Object_Textblock *o; + int is_v, was_v; + + /* dont pre-render the obj twice! */ + if (obj->pre_render_done) return; + obj->pre_render_done = 1; + /* pre-render phase. this does anything an object needs to do just before */ + /* rendering. this could mean loading the image data, retrieving it from */ + /* elsewhere, decoding video etc. */ + /* then when this is done the object needs to figure if it changed and */ + /* if so what and where and add the appropriate redraw textblocks */ + o = (Evas_Object_Textblock *)(obj->object_data); + if ((o->changed) || + (o->last_w != obj->cur.geometry.w)) + { + Evas_Object_Textblock_Line *lines; + + lines = o->lines; + o->lines = NULL; + o->formatted.valid = 0; + o->native.valid = 0; + _layout(obj, + 0, + obj->cur.geometry.w, obj->cur.geometry.h, + &o->formatted.w, &o->formatted.h); + o->formatted.valid = 1; + if (lines) _lines_clear(obj, lines); + o->last_w = obj->cur.geometry.w; + o->redraw = 0; + evas_object_render_pre_prev_cur_add(&rects, obj); + o->changed = 0; + is_v = evas_object_is_visible(obj); + was_v = evas_object_was_visible(obj); + goto done; + } + if (o->redraw) + { + o->redraw = 0; + evas_object_render_pre_prev_cur_add(&rects, obj); + o->changed = 0; + is_v = evas_object_is_visible(obj); + was_v = evas_object_was_visible(obj); + goto done; + } + /* if someone is clipping this obj - go calculate the clipper */ + if (obj->cur.clipper) + { + if (obj->cur.cache.clip.dirty) + evas_object_clip_recalc(obj->cur.clipper); + obj->cur.clipper->func->render_pre(obj->cur.clipper); + } + /* now figure what changed and add draw rects */ + /* if it just became visible or invisible */ + is_v = evas_object_is_visible(obj); + was_v = evas_object_was_visible(obj); + if (is_v != was_v) + { + evas_object_render_pre_visible_change(&rects, obj, is_v, was_v); + goto done; + } + /* it's not visible - we accounted for it appearing or not so just abort */ + if (!is_v) goto done; + /* clipper changed this is in addition to anything else for obj */ + evas_object_render_pre_clipper_change(&rects, obj); + /* if we restacked (layer or just within a layer) and don't clip anyone */ + if (obj->restack) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + /* if it changed color */ + if ((obj->cur.color.r != obj->prev.color.r) || + (obj->cur.color.g != obj->prev.color.g) || + (obj->cur.color.b != obj->prev.color.b) || + (obj->cur.color.a != obj->prev.color.a)) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + /* if it changed geometry - and obviously not visibility or color */ + /* caluclate differences since we have a constant color fill */ + /* we really only need to update the differences */ + if ((obj->cur.geometry.x != obj->prev.geometry.x) || + (obj->cur.geometry.y != obj->prev.geometry.y) || + (obj->cur.geometry.w != obj->prev.geometry.w) || + (obj->cur.geometry.h != obj->prev.geometry.h)) + { + evas_object_render_pre_prev_cur_add(&rects, obj); + goto done; + } + if (o->changed) + { +/* + Evas_Rectangle *r; + + r = malloc(sizeof(Evas_Rectangle)); + r->x = 0; r->y = 0; + r->w = obj->cur.geometry.w; + r->h = obj->cur.geometry.h; + updates = evas_list_append(updates, r); +*/ + evas_object_render_pre_prev_cur_add(&rects, obj); + o->changed = 0; + } + done: + evas_object_render_pre_effect_updates(&rects, obj, is_v, was_v); +} + +static void +evas_object_textblock_render_post(Evas_Object *obj) +{ + Evas_Object_Textblock *o; + + /* this moves the current data to the previous state parts of the object */ + /* in whatever way is safest for the object. also if we don't need object */ + /* data anymore we can free it if the object deems this is a good idea */ + o = (Evas_Object_Textblock *)(obj->object_data); + /* remove those pesky changes */ + while (obj->clip.changes) + { + Evas_Rectangle *r; + + r = (Evas_Rectangle *)obj->clip.changes->data; + obj->clip.changes = evas_list_remove(obj->clip.changes, r); + free(r); + } + /* move cur to prev safely for object data */ + obj->prev = obj->cur; +// o->prev = o->cur; +/* o->changed = 0; */ +} + +static int +evas_object_textblock_is_opaque(Evas_Object *obj) +{ + Evas_Object_Textblock *o; + + /* this returns 1 if the internal object data implies that the object is */ + /* currently fulyl opque over the entire gradient it occupies */ + o = (Evas_Object_Textblock *)(obj->object_data); + return 0; +} + +static int +evas_object_textblock_was_opaque(Evas_Object *obj) +{ + Evas_Object_Textblock *o; + + /* this returns 1 if the internal object data implies that the object was */ + /* currently fulyl opque over the entire gradient it occupies */ + o = (Evas_Object_Textblock *)(obj->object_data); + return 0; +} + +static void +evas_object_textblock_coords_recalc(Evas_Object *obj) +{ + Evas_Object_Textblock *o; + + o = (Evas_Object_Textblock *)(obj->object_data); + if (obj->cur.geometry.w != o->last_w) + { + o->formatted.valid = 0; + o->native.valid = 0; + o->changed = 1; + } +} + +void +_evas_object_textblock_rehint(Evas_Object *obj) +{ + Evas_Object_Textblock *o; + Evas_Object_List *l, *ll; + + o = (Evas_Object_Textblock *)(obj->object_data); + for (l = (Evas_Object_List *)o->lines; l; l = l->next) + { + Evas_Object_Textblock_Line *ln; + + ln = (Evas_Object_Textblock_Line *)l; + for (ll = (Evas_Object_List *)ln->items; ll; ll = ll->next) + { + Evas_Object_Textblock_Item *it; + + it = (Evas_Object_Textblock_Item *)ll; + if (it->format->font.font) + evas_font_load_hinting_set(obj->layer->evas, + it->format->font.font, + obj->layer->evas->hinting); + } + } + o->formatted.valid = 0; + o->native.valid = 0; + o->changed = 1; + evas_object_change(obj); +} diff --git a/src/lib/canvas/evas_rectangle.c b/src/lib/canvas/evas_rectangle.c new file mode 100644 index 0000000..023442d --- /dev/null +++ b/src/lib/canvas/evas_rectangle.c @@ -0,0 +1,101 @@ +#include "evas_common.h" +#include "evas_private.h" + +void +evas_rects_return_difference_rects(Evas_Rectangles *rects, int x, int y, int w, int h, int xx, int yy, int ww, int hh) +{ + unsigned int available = 0; + + if (!RECTS_INTERSECT(x, y, w, h, xx, yy, ww, hh)) + { + evas_add_rect(rects, x, y, w, h); + evas_add_rect(rects, xx, yy, ww, hh); + } + else + { + int x1[4], y1[4], i, j; + Evas_Rectangles tmp = { 0, 0, NULL }; + + if (x < xx) + { + x1[0] = x; + x1[1] = xx; + } + else + { + x1[0] = xx; + x1[1] = x; + } + if ((x + w) < (xx + ww)) + { + x1[2] = x + w; + x1[3] = xx + ww; + } + else + { + x1[2] = xx + ww; + x1[3] = x + w; + } + if (y < yy) + { + y1[0] = y; + y1[1] = yy; + } + else + { + y1[0] = yy; + y1[1] = y; + } + if ((y + h) < (yy + hh)) + { + y1[2] = y + h; + y1[3] = yy + hh; + } + else + { + y1[2] = yy + hh; + y1[3] = y + h; + } + for (j = 0; j < 3; j++) + { + for (i = 0; i < 3; i++) + { + int intsec1, intsec2; + int tx, ty, tw, th; + + tx = x1[i]; + ty = y1[j]; + tw = x1[i + 1] - x1[i]; + th = y1[j + 1] - y1[j]; + + intsec1 = (RECTS_INTERSECT(tx, ty, tw, th, x, y, w, h)); + intsec2 = (RECTS_INTERSECT(tx, ty, tw, th, xx, yy, ww, hh)); + if (intsec1 ^ intsec2) + { + evas_add_rect(rects, tx, ty, tw, th); + } + } + } +/* if (tmp.count > 0) */ +/* { */ +/* unsigned int i; */ + +/* for (i = 0; i < tmp.count; ++i) */ +/* { */ +/* if ((tmp.array[i].w > 0) && (tmp.array[i].h > 0)) */ +/* { */ +/* int intsec1, intsec2; */ + +/* intsec1 = (RECTS_INTERSECT(tmp.array[i].x, tmp.array[i].y, tmp.array[i].w, tmp.array[i].h, x, y, w, h)); */ +/* intsec2 = (RECTS_INTERSECT(tmp.array[i].x, tmp.array[i].y, tmp.array[i].w, tmp.array[i].h, xx, yy, ww, hh)); */ +/* if (intsec1 ^ intsec2) */ +/* { */ +/* evas_add_rect(rects, tmp.array[i].x, tmp.array[i].y, tmp.array[i].w, tmp.array[i].h); */ +/* } */ +/* } */ +/* } */ +/* free(tmp.array); */ +/* } */ + + } +} diff --git a/src/lib/canvas/evas_render.c b/src/lib/canvas/evas_render.c new file mode 100644 index 0000000..8eb6a96 --- /dev/null +++ b/src/lib/canvas/evas_render.c @@ -0,0 +1,732 @@ +#include "evas_common.h" +#include "evas_private.h" + +static Evas_List * +evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char do_draw); + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_damage_rectangle_add(Evas *e, int x, int y, int w, int h) +{ + Evas_Rectangle *r; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + r = malloc(sizeof(Evas_Rectangle)); + if (!r) return; + r->x = x; r->y = y; r->w = w; r->h = h; + e->damages = evas_list_append(e->damages, r); + e->changed = 1; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_obscured_rectangle_add(Evas *e, int x, int y, int w, int h) +{ + Evas_Rectangle *r; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + r = malloc(sizeof(Evas_Rectangle)); + if (!r) return; + r->x = x; r->y = y; r->w = w; r->h = h; + e->obscures = evas_list_append(e->obscures, r); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_obscured_clear(Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + while (e->obscures) + { + Evas_Rectangle *r; + + r = (Evas_Rectangle *)e->obscures->data; + e->obscures = evas_list_remove(e->obscures, r); + free(r); + } +} + +static void +_evas_render_phase1_direct(Evas *e, Evas_Array *render_objects) +{ + unsigned int i; + + for (i = 0; i < render_objects->count; ++i) + { + Evas_Object *obj; + + obj = _evas_array_get(render_objects, i); + if (obj->changed) obj->func->render_pre(obj); + else + { + if (obj->smart.smart) + obj->func->render_pre(obj); + else + if (obj->rect_del) + { + e->engine.func->output_redraws_rect_del(e->engine.data.output, + obj->cur.cache.clip.x, + obj->cur.cache.clip.y, + obj->cur.cache.clip.w, + obj->cur.cache.clip.h); + } + } + } +} + +static Evas_Bool +_evas_render_phase1_object_process(Evas *e, Evas_Object *obj, Evas_Array *active_objects, Evas_Array *restack_objects, Evas_Array *delete_objects, Evas_Array *render_objects, int restack) +{ + int clean_them = 0; + int is_active; + + obj->rect_del = 0; + obj->render_pre = 0; + +/* if (obj->cur.cache.clip.dirty) */ + evas_object_clip_recalc(obj); + /* because of clip objects - delete 2 cycles later */ + if (obj->delete_me == 2) + _evas_array_append(delete_objects, obj); + else if (obj->delete_me != 0) obj->delete_me++; + /* If the object will be removed, we should not cache anything during this run. */ + if (obj->delete_me != 0) + clean_them = 1; + + /* build active object list */ + is_active = evas_object_is_active(obj); + + obj->is_active = is_active; + if ((is_active) || (obj->delete_me != 0)) + _evas_array_append(active_objects, obj); + if (restack) + { + if (!obj->changed) + _evas_array_append(&e->pending_objects, obj); + obj->restack = 1; + obj->changed = 1; + clean_them = 1; + } + if (obj->changed) + { + if (obj->smart.smart) + { + const Evas_Object_List *l; + + _evas_array_append(render_objects, obj); + obj->render_pre = 1; + for (l = evas_object_smart_members_get_direct(obj); l; l = l->next) + { + Evas_Object *obj2; + + obj2 = (Evas_Object *)l; + _evas_render_phase1_object_process(e, obj2, + active_objects, + restack_objects, + delete_objects, + render_objects, + obj->restack); + } + } + else + { + if ((is_active) && (obj->restack) && (!obj->clip.clipees) && + ((evas_object_is_visible(obj) && (!obj->cur.have_clipees)) || + (evas_object_was_visible(obj) && (!obj->prev.have_clipees)))) + _evas_array_append(restack_objects, obj); + else if ((is_active) && (!obj->clip.clipees) && + ((evas_object_is_visible(obj) && (!obj->cur.have_clipees)) || + (evas_object_was_visible(obj) && (!obj->prev.have_clipees)))) + { + _evas_array_append(render_objects, obj); + obj->render_pre = 1; + } + } + } + else + { + if ((!obj->clip.clipees) && (obj->delete_me == 0) && + ((evas_object_is_visible(obj) && (!obj->cur.have_clipees)) || + (evas_object_was_visible(obj) && (!obj->prev.have_clipees)))) + { + if (obj->smart.smart) + { + const Evas_Object_List *l; + + _evas_array_append(render_objects, obj); + obj->render_pre = 1; + for (l = evas_object_smart_members_get_direct(obj); l; l = l->next) + { + Evas_Object *obj2; + + obj2 = (Evas_Object *)l; + _evas_render_phase1_object_process(e, obj2, + active_objects, + restack_objects, + delete_objects, + render_objects, + restack); + } + } + else + { + if (evas_object_is_opaque(obj) && + evas_object_is_visible(obj)) + { + _evas_array_append(render_objects, obj); + obj->rect_del = 1; + } + } + } + } + if (!is_active) obj->restack = 0; + return clean_them; +} + +static Evas_Bool +_evas_render_phase1_process(Evas *e, Evas_Array *active_objects, Evas_Array *restack_objects, Evas_Array *delete_objects, Evas_Array *render_objects) +{ + Evas_Object_List *l; + int clean_them = 0; + + for (l = (Evas_Object_List *)e->layers; l; l = l->next) + { + Evas_Object_List *l2; + Evas_Layer *lay; + + lay = (Evas_Layer *)l; + for (l2 = (Evas_Object_List *)lay->objects; l2; l2 = l2->next) + { + Evas_Object *obj; + + obj = (Evas_Object *)l2; + clean_them |= _evas_render_phase1_object_process(e, obj, + active_objects, restack_objects, + delete_objects, render_objects, + 0); + } + } + + return clean_them; +} + +static void +_evas_render_check_pending_objects(Evas_Array *pending_objects, Evas *e) +{ + unsigned int i; + + for (i = 0; i < pending_objects->count; ++i) + { + Evas_Object *obj; + int ok = 0; + int is_active; + + obj = _evas_array_get(pending_objects, i); + + if (!obj->layer) goto clean_stuff; + + evas_object_clip_recalc(obj); + is_active = evas_object_is_active(obj); + + if (!is_active && + !obj->is_active && + !obj->render_pre && + !obj->rect_del) + { + ok = 1; + goto clean_stuff; + } + + if (obj->is_active == is_active) + { + if (obj->changed) + { + if (obj->smart.smart) + { + if (obj->render_pre + || obj->rect_del) + ok = 1; + } + else + if ((is_active) && (obj->restack) && (!obj->clip.clipees) && + ((evas_object_is_visible(obj) && (!obj->cur.have_clipees)) || + (evas_object_was_visible(obj) && (!obj->prev.have_clipees)))) + { + if (!(obj->render_pre + || obj->rect_del)) + ok = 1; + } + else + if (is_active && (!obj->clip.clipees) && + ((evas_object_is_visible(obj) && (!obj->cur.have_clipees)) || + (evas_object_was_visible(obj) && (!obj->prev.have_clipees)))) + { + if (obj->render_pre + || obj->rect_del) + ok = 1; + } + } + else + { + if ((!obj->clip.clipees) && (obj->delete_me == 0) && + (!obj->cur.have_clipees || (evas_object_was_visible(obj) && (!obj->prev.have_clipees))) + && evas_object_is_opaque(obj) && evas_object_is_visible(obj)) + if (obj->rect_del || obj->smart.smart) + { + ok = 1; + } + } + } + + clean_stuff: + if (!ok) + { + evas_array_clean(&e->active_objects); + evas_array_clean(&e->render_objects); + + evas_array_clean(&e->restack_objects); + evas_array_clean(&e->delete_objects); + + e->invalidate = 1; + + return ; + } + } +} + +Evas_Bool pending_change(void *data, void *gdata) +{ + Evas_Object *obj; + + obj = data; + if (obj->delete_me) return 0; + if (!obj->layer) obj->changed = 0; + return obj->changed; +} + +static Evas_List * +evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char do_draw) +{ + Evas_List *updates = NULL; + Evas_List *ll; + void *surface; + Evas_Bool clean_them = 0; + int ux, uy, uw, uh; + int cx, cy, cw, ch; + unsigned int i, j; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + if (!e->changed) return NULL; + + /* Check if the modified object mean recalculating every thing */ + if (!e->invalidate) + _evas_render_check_pending_objects(&e->pending_objects, e); + + /* phase 1. add extra updates for changed objects */ + if (e->invalidate || e->render_objects.count <= 0) + clean_them = _evas_render_phase1_process(e, &e->active_objects, &e->restack_objects, &e->delete_objects, &e->render_objects); + + _evas_render_phase1_direct(e, &e->render_objects); + + /* phase 2. force updates for restacks */ + for (i = 0; i < e->restack_objects.count; ++i) + { + Evas_Object *obj; + + obj = _evas_array_get(&e->restack_objects, i); + obj->func->render_pre(obj); + e->engine.func->output_redraws_rect_add(e->engine.data.output, + obj->prev.cache.clip.x, + obj->prev.cache.clip.y, + obj->prev.cache.clip.w, + obj->prev.cache.clip.h); + e->engine.func->output_redraws_rect_add(e->engine.data.output, + obj->cur.cache.clip.x, + obj->cur.cache.clip.y, + obj->cur.cache.clip.w, + obj->cur.cache.clip.h); + } + evas_array_clean(&e->restack_objects); + /* phase 3. add exposes */ + while (e->damages) + { + Evas_Rectangle *r; + + r = e->damages->data; + e->damages = evas_list_remove(e->damages, r); + e->engine.func->output_redraws_rect_add(e->engine.data.output, + r->x, r->y, r->w, r->h); + free(r); + } + /* phase 4. output & viewport changes */ + if (e->viewport.changed) + { + e->engine.func->output_redraws_rect_add(e->engine.data.output, + 0, 0, + e->output.w, e->output.h); + } + if (e->output.changed) + { + e->engine.func->output_resize(e->engine.data.output, + e->output.w, e->output.h); + e->engine.func->output_redraws_rect_add(e->engine.data.output, + 0, 0, + e->output.w, e->output.h); + } + if ((e->output.w != e->viewport.w) || (e->output.h != e->viewport.h)) + { + printf("EVAS: error: viewport size != output size!\n"); + } + /* phase 5. add obscures */ + for (ll = e->obscures; ll; ll = ll->next) + { + Evas_Rectangle *r; + + r = ll->data; + e->engine.func->output_redraws_rect_del(e->engine.data.output, + r->x, r->y, r->w, r->h); + } + /* build obscure objects list of active objects that obscure */ + for (i = 0; i < e->active_objects.count; ++i) + { + Evas_Object *obj; + + obj = _evas_array_get(&e->active_objects, i); + if (UNLIKELY(evas_object_is_opaque(obj) && + evas_object_is_visible(obj) && + (!obj->clip.clipees) && + (obj->cur.visible) && + (!obj->delete_me) && + (obj->cur.cache.clip.visible) && + (!obj->smart.smart))) +/* obscuring_objects = evas_list_append(obscuring_objects, obj); */ + _evas_array_append(&e->obscuring_objects, obj); + } + /* save this list */ +/* obscuring_objects_orig = obscuring_objects; */ +/* obscuring_objects = NULL; */ + /* phase 6. go thru each update rect and render objects in it*/ + if (do_draw) + { + unsigned int offset = 0; + + while ((surface = + e->engine.func->output_redraws_next_update_get(e->engine.data.output, + &ux, &uy, &uw, &uh, + &cx, &cy, &cw, &ch))) + { + int off_x, off_y; + + if (make_updates) + { + Evas_Rectangle *rect; + + rect = malloc(sizeof(Evas_Rectangle)); + if (rect) + { + rect->x = ux; rect->y = uy; rect->w = uw; rect->h = uh; + updates = evas_list_append(updates, rect); + } + } + off_x = cx - ux; + off_y = cy - uy; + /* build obscuring objects list (in order from bottom to top) */ + for (i = 0; i < e->obscuring_objects.count; ++i) + { + Evas_Object *obj; + + obj = (Evas_Object *) _evas_array_get(&e->obscuring_objects, i); + if (evas_object_is_in_output_rect(obj, ux, uy, uw, uh)) + _evas_array_append(&e->temporary_objects, obj); + } + /* render all object that intersect with rect */ + for (i = 0; i < e->active_objects.count; ++i) + { + Evas_Object *obj; + + obj = _evas_array_get(&e->active_objects, i); + + /* if it's in our outpout rect and it doesn't clip anything */ + if (evas_object_is_in_output_rect(obj, ux, uy, uw, uh) && + (!obj->clip.clipees) && + (obj->cur.visible) && + (!obj->delete_me) && + (obj->cur.cache.clip.visible) && + (!obj->smart.smart) && + (obj->cur.color.a > 0)) + { + int x, y, w, h; + + if ((e->temporary_objects.count > offset) && + (_evas_array_get(&e->temporary_objects, offset) == obj)) + offset++; + x = cx; y = cy; w = cw; h = ch; + RECTS_CLIP_TO_RECT(x, y, w, h, + obj->cur.cache.clip.x + off_x, + obj->cur.cache.clip.y + off_y, + obj->cur.cache.clip.w, + obj->cur.cache.clip.h); + if ((w > 0) && (h > 0)) + { +/// printf("CLIP: %p | %i %i, %ix%i | %p %i %i %ix%i\n", +/// obj, +/// x, y, w, h, +/// obj->cur.clipper, +/// obj->cur.cache.clip.x + off_x, +/// obj->cur.cache.clip.y + off_y, +/// obj->cur.cache.clip.w, +/// obj->cur.cache.clip.h +/// ); +/// if (((obj->cur.cache.clip.x + off_x) == 0) && +/// ((obj->cur.cache.clip.w) == 960)) +/// { +/// abort(); +/// } + + e->engine.func->context_clip_set(e->engine.data.output, + e->engine.data.context, + x, y, w, h); +#if 1 /* FIXME: this can slow things down... figure out optimum... coverage */ + for (j = offset; j < e->temporary_objects.count; ++j) + { + Evas_Object *obj2; + + obj2 = (Evas_Object *) _evas_array_get(&e->temporary_objects, j); + e->engine.func->context_cutout_add(e->engine.data.output, + e->engine.data.context, + obj2->cur.cache.clip.x + off_x, + obj2->cur.cache.clip.y + off_y, + obj2->cur.cache.clip.w, + obj2->cur.cache.clip.h); + } +#endif + obj->func->render(obj, + e->engine.data.output, + e->engine.data.context, + surface, + off_x, off_y); + e->engine.func->context_cutout_clear(e->engine.data.output, + e->engine.data.context); + } + } + } + /* punch rect out */ + e->engine.func->output_redraws_next_update_push(e->engine.data.output, + surface, + ux, uy, uw, uh); + /* free obscuring objects list */ + evas_array_clean(&e->temporary_objects); + } + /* flush redraws */ + e->engine.func->output_flush(e->engine.data.output); + } + /* clear redraws */ + e->engine.func->output_redraws_clear(e->engine.data.output); + /* and do a post render pass */ + for (i = 0; i < e->active_objects.count; ++i) + { + Evas_Object *obj; + + obj = _evas_array_get(&e->active_objects, i); + obj->pre_render_done = 0; + if ((obj->changed) && (do_draw)) + { + obj->func->render_post(obj); + obj->restack = 0; + obj->changed = 0; + } +/* moved to other pre-process phase 1 + if (obj->delete_me == 2) + { + delete_objects = evas_list_append(delete_objects, obj); + } + else if (obj->delete_me != 0) obj->delete_me++; + */ + } + /* free our obscuring object list */ + evas_array_clean(&e->obscuring_objects); + + /* If some object are still marked as changed, do not remove + them from the pending list. */ + evas_array_remove(&e->pending_objects, pending_change, NULL); + + /* delete all objects flagged for deletion now */ + for (i = 0; i < e->delete_objects.count; ++i) + { + Evas_Object *obj; + + obj = _evas_array_get(&e->delete_objects, i); + evas_object_free(obj, 1); + } + evas_array_clean(&e->delete_objects); + + e->changed = 0; + e->viewport.changed = 0; + e->output.changed = 0; + e->invalidate = 0; + + /* If their are some object to restack or some object to delete, it's useless to keep the render object list around. */ + if (clean_them) + { + evas_array_clean(&e->active_objects); + evas_array_clean(&e->render_objects); + + e->invalidate = 1; + } + + evas_module_clean(); + + return updates; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_render_updates_free(Evas_List *updates) +{ + while (updates) + { + free(updates->data); + updates = evas_list_remove(updates, updates->data); + } +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI Evas_List * +evas_render_updates(Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + + if (!e->changed) return NULL; + return evas_render_updates_internal(e, 1, 1); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_render(Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + if (!e->changed) return; + evas_render_updates_internal(e, 0, 1); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_norender(Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + +// if (!e->changed) return; + evas_render_updates_internal(e, 0, 0); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_render_idle_flush(Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + if ((e->engine.func) && (e->engine.func->output_idle_flush) && + (e->engine.data.output)) + e->engine.func->output_idle_flush(e->engine.data.output); + + evas_array_flush(&e->delete_objects); + evas_array_flush(&e->active_objects); + evas_array_flush(&e->restack_objects); + evas_array_flush(&e->render_objects); + + e->invalidate = 1; +} + +void +evas_render_invalidate(Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + evas_array_clean(&e->active_objects); + evas_array_clean(&e->render_objects); + + evas_array_flush(&e->restack_objects); + evas_array_flush(&e->delete_objects); + + e->invalidate = 1; +} + +void +evas_render_object_recalc(Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + + if ((!obj->changed) && (obj->delete_me < 2)) + { + Evas *e; + + e = obj->layer->evas; + if (!e || e->cleanup) return ; + + if (!obj->changed) + _evas_array_append(&e->pending_objects, obj); + obj->changed = 1; + } +} + diff --git a/src/lib/canvas/evas_smart.c b/src/lib/canvas/evas_smart.c new file mode 100644 index 0000000..4fcb8c8 --- /dev/null +++ b/src/lib/canvas/evas_smart.c @@ -0,0 +1,190 @@ +#include "evas_common.h" +#include "evas_private.h" + +/* all public */ + +/** + * @defgroup Evas_Smart_Group Evas Smart Functions + * + * Functions that deal with Evas_Smart's. + * + */ + +/** + * Create an Evas_Smart, which can be used to instantiate new smart objects. + * + * This function internally creates an Evas_Smart_Class and sets the + * provided callbacks. Callbacks that are unneeded (or marked DEPRECATED + * below) should be set to NULL. + * + * Alternatively you can create an Evas_Smart_Class yourself and use + * evas_smart_class_new(). + * + * @param name a unique name for the smart + * @param func_add callback called when smart object is added + * @param func_del callback called when smart object is deleted + * @param func_layer_set DEPRECATED + * @param func_raise DEPRECATED + * @param func_lower DEPRECATED + * @param func_stack_above DEPRECATED + * @param func_stack_below DEPRECATED + * @param func_move callback called when smart object is moved + * @param func_resize callback called when smart object is resized + * @param func_show callback called when smart object is shown + * @param func_hide callback called when smart object is hidden + * @param func_color_set callback called when smart object has its color set + * @param func_clip_set callback called when smart object has its clip set + * @param func_clip_unset callback called when smart object has its clip unset + * @param data a pointer to user data for the smart + * @return an Evas_Smart + * + */ +EAPI Evas_Smart * +evas_smart_new(const char *name, + void (*func_add) (Evas_Object *o), + void (*func_del) (Evas_Object *o), + void (*func_layer_set) (Evas_Object *o, int l), + void (*func_raise) (Evas_Object *o), + void (*func_lower) (Evas_Object *o), + void (*func_stack_above) (Evas_Object *o, Evas_Object *above), + void (*func_stack_below) (Evas_Object *o, Evas_Object *below), + void (*func_move) (Evas_Object *o, Evas_Coord x, Evas_Coord y), + void (*func_resize) (Evas_Object *o, Evas_Coord w, Evas_Coord h), + void (*func_show) (Evas_Object *o), + void (*func_hide) (Evas_Object *o), + void (*func_color_set) (Evas_Object *o, int r, int g, int b, int a), + void (*func_clip_set) (Evas_Object *o, Evas_Object *clip), + void (*func_clip_unset) (Evas_Object *o), + const void *data) +{ + Evas_Smart *s; + Evas_Smart_Class *sc; + + printf("----- WARNING. evas_smart_new() will be deprecated and removed soon\n" + "----- Please use evas_smart_class_new() instead\n"); + + if (!name) return NULL; + + s = evas_mem_calloc(sizeof(Evas_Smart)); + if (!s) return NULL; + + s->magic = MAGIC_SMART; + + s->class_allocated = 1; + + sc = evas_mem_calloc(sizeof(Evas_Smart_Class)); + if (!sc) + { + free(s); + return NULL; + } + sc->name = name; + sc->add = func_add; + sc->del = func_del; + sc->move = func_move; + sc->resize = func_resize; + sc->show = func_show; + sc->hide = func_hide; + sc->color_set = func_color_set; + sc->clip_set = func_clip_set; + sc->clip_unset = func_clip_unset; + sc->data = (void *)data; + s->smart_class = sc; + + return s; +} + +/** + * Free an Evas_Smart + * + * If this smart was created using evas_smart_class_new(), the associated + * Evas_Smart_Class will not be freed. + * + * @param s the Evas_Smart to free + * + */ +EAPI void +evas_smart_free(Evas_Smart *s) +{ + MAGIC_CHECK(s, Evas_Smart, MAGIC_SMART); + return; + MAGIC_CHECK_END(); + s->delete_me = 1; + if (s->usage > 0) return; + if (s->class_allocated) free((void *)s->smart_class); + free(s); +} + +/** + * Creates an Evas_Smart from an Evas_Smart_Class. + * + * @param Evas_Smart_Class the smart class definition + * @return an Evas_Smart + */ +EAPI Evas_Smart * +evas_smart_class_new(const Evas_Smart_Class *sc) +{ + Evas_Smart *s; + + if (!sc) return NULL; + + /* api does not match abi! for now refuse as we only have 1 version */ + if (sc->version != EVAS_SMART_CLASS_VERSION) return NULL; + + s = evas_mem_calloc(sizeof(Evas_Smart)); + if (!s) return NULL; + + s->magic = MAGIC_SMART; + + s->smart_class = sc; + + return s; +} + +/** + * Get the Evas_Smart_Class of an Evas_Smart + * + * @param s the Evas_Smart + * @return the Evas_Smart_Class + */ +EAPI const Evas_Smart_Class * +evas_smart_class_get(const Evas_Smart *s) +{ + MAGIC_CHECK(s, Evas_Smart, MAGIC_SMART); + return NULL; + MAGIC_CHECK_END(); + return s->smart_class; +} + +/** + * Get the data pointer set on an Evas_Smart. + * + * This data pointer is set either as the final parameter to + * evas_smart_new or as the data field in the Evas_Smart_Class passed + * in to evas_smart_class_new + * + * @param Evas_Smart + * + */ +EAPI void * +evas_smart_data_get(const Evas_Smart *s) +{ + MAGIC_CHECK(s, Evas_Smart, MAGIC_SMART); + return NULL; + MAGIC_CHECK_END(); + return (void *)s->smart_class->data; +} + +/* internal funcs */ +void +evas_object_smart_use(Evas_Smart *s) +{ + s->usage++; +} + +void +evas_object_smart_unuse(Evas_Smart *s) +{ + s->usage--; + if ((s->usage <= 0) && (s->delete_me)) evas_smart_free(s); +} diff --git a/src/lib/canvas/evas_stack.c b/src/lib/canvas/evas_stack.c new file mode 100644 index 0000000..9579557 --- /dev/null +++ b/src/lib/canvas/evas_stack.c @@ -0,0 +1,450 @@ +#include "evas_common.h" +#include "evas_private.h" + +static Evas_Object * +evas_object_above_get_internal(const Evas_Object *obj) +{ + if (((Evas_Object_List *)obj)->next) + return (Evas_Object *)(((Evas_Object_List *)obj)->next); + else + { + if (((Evas_Object_List *)(((Evas_Object *)obj)->layer))->next) + { + Evas_Layer *l; + + l = (Evas_Layer *)(((Evas_Object_List *)(((Evas_Object *)obj)->layer))->next); + return l->objects; + } + } + return NULL; +} + +static Evas_Object * +evas_object_below_get_internal(const Evas_Object *obj) +{ + if (((Evas_Object_List *)obj)->prev) + return (Evas_Object *)(((Evas_Object_List *)obj)->prev); + else + { + if (((Evas_Object_List *)(((Evas_Object *)obj)->layer))->prev) + { + Evas_Layer *l; + + l = (Evas_Layer *)(((Evas_Object_List *)(((Evas_Object *)obj)->layer))->prev); + return (Evas_Object *)(((Evas_Object_List *)(l->objects))->last); + } + } + return NULL; +} + +/** + * Raise @p obj to the top of its layer. + * + * @param obj the object to raise + * + */ +EAPI void +evas_object_raise(Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (evas_object_intercept_call_raise(obj)) return; + if (!(((Evas_Object_List *)obj)->next)) + { + evas_object_inform_call_restack(obj); + return; + } + if (obj->smart.parent) + evas_object_smart_member_raise(obj); + else + { + if (obj->in_layer) + { + obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); + obj->layer->objects = evas_object_list_append(obj->layer->objects, obj); + } + } + if (obj->clip.clipees) + { + evas_object_inform_call_restack(obj); + return; + } + if (obj->layer) evas_render_invalidate(obj->layer->evas); + obj->restack = 1; + evas_object_change(obj); + evas_object_inform_call_restack(obj); + if (obj->layer->evas->events_frozen <= 0) + { + if (!evas_event_passes_through(obj)) + { + if (!obj->smart.smart) + { + if (evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1) && + obj->cur.visible) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + } + } + } +} + +/** + * Lower @p obj to the bottom of its layer. + * + * @param obj the object to lower + * + */ +EAPI void +evas_object_lower(Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (evas_object_intercept_call_lower(obj)) return; + if (!(((Evas_Object_List *)obj)->prev)) + { + evas_object_inform_call_restack(obj); + return; + } + if (obj->smart.parent) + evas_object_smart_member_lower(obj); + else + { + if (obj->in_layer) + { + obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); + obj->layer->objects = evas_object_list_prepend(obj->layer->objects, obj); + } + } + if (obj->clip.clipees) + { + evas_object_inform_call_restack(obj); + return; + } + if (obj->layer) evas_render_invalidate(obj->layer->evas); + obj->restack = 1; + evas_object_change(obj); + evas_object_inform_call_restack(obj); + if (obj->layer->evas->events_frozen <= 0) + { + if (!evas_event_passes_through(obj)) + { + if (!obj->smart.smart) + { + if (evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1) && + obj->cur.visible) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + } + } + } +} + +/** + * Stack @p obj immediately above @p above + * + * If @p obj is a member of a smart object, then @p above must also be + * a member of the same smart object. + * + * Similarly, if @p obj is not a member of smart object, @p above may + * not either. + * + * @param obj the object to stack + * @param above the object above which to stack + * + */ +EAPI void +evas_object_stack_above(Evas_Object *obj, Evas_Object *above) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + MAGIC_CHECK(above, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (evas_object_intercept_call_stack_above(obj, above)) return; + if (!above) + { + evas_object_raise(obj); + return; + } + if (((Evas_Object_List *)obj)->prev == (Evas_Object_List *)above) + { + evas_object_inform_call_restack(obj); + return; + } + if (obj->smart.parent) + { + if (obj->smart.parent != above->smart.parent) + { +// printf("BITCH! evas_object_stack_above(), %p not inside same smart as %p!\n", obj, above); + return; + } + evas_object_smart_member_stack_above(obj, above); + } + else + { + if (above->smart.parent) return; + if (obj->layer != above->layer) + { + return; + } + if (obj->in_layer) + { + obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); + obj->layer->objects = evas_object_list_append_relative(obj->layer->objects, obj, above); + } + } + if (obj->clip.clipees) + { + evas_object_inform_call_restack(obj); + return; + } + if (obj->layer) evas_render_invalidate(obj->layer->evas); + obj->restack = 1; + evas_object_change(obj); + evas_object_inform_call_restack(obj); + if (obj->layer->evas->events_frozen <= 0) + { + if (!evas_event_passes_through(obj)) + { + if (!obj->smart.smart) + { + if (evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1) && + obj->cur.visible) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + } + } + } +} + +/** + * Stack @p obj immediately below @p below + * + * If @p obj is a member of a smart object, then @p below must also be + * a member of the same smart object. + * + * Similarly, if @p obj is not a member of smart object, @p below may + * not either. + * + * @param obj the object to stack + * @param below the object below which to stack + * + */ +EAPI void +evas_object_stack_below(Evas_Object *obj, Evas_Object *below) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + MAGIC_CHECK(below, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (evas_object_intercept_call_stack_below(obj, below)) return; + if (!below) + { + evas_object_lower(obj); + return; + } + if (((Evas_Object_List *)obj)->next == (Evas_Object_List *)below) + { + evas_object_inform_call_restack(obj); + return; + } + if (obj->smart.parent) + { + if (obj->smart.parent != below->smart.parent) + { +// printf("BITCH! evas_object_stack_below(), %p not inside same smart as %p!\n", obj, below); + return; + } + evas_object_smart_member_stack_below(obj, below); + } + else + { + if (below->smart.parent) return; + if (obj->layer != below->layer) + { + return; + } + if (obj->in_layer) + { + obj->layer->objects = evas_object_list_remove(obj->layer->objects, obj); + obj->layer->objects = evas_object_list_prepend_relative(obj->layer->objects, obj, below); + } + } + if (obj->clip.clipees) + { + evas_object_inform_call_restack(obj); + return; + } + if (obj->layer) evas_render_invalidate(obj->layer->evas); + obj->restack = 1; + evas_object_change(obj); + evas_object_inform_call_restack(obj); + if (obj->layer->evas->events_frozen <= 0) + { + if (!evas_event_passes_through(obj)) + { + if (!obj->smart.smart) + { + if (evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1) && + obj->cur.visible) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + } + } + } +} + +/** + * Get the evas object above @p obj + * + * @param obj an Evas_Object + * @return the Evas_Object directly above + * + */ +EAPI Evas_Object * +evas_object_above_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (obj->smart.parent) + { + do + { + obj = (Evas_Object *)(((Evas_Object_List *)(obj))->next); + if ((obj) && (!obj->delete_me)) return (Evas_Object *)obj; + } + while (obj); + return NULL; + } + obj = evas_object_above_get_internal(obj); + while (obj) + { + if (!obj->delete_me) return (Evas_Object *)obj; + obj = evas_object_above_get_internal(obj); + } + return NULL; +} + +/** + * Get the evas object below @p obj + * + * @param obj an Evas_Object + * @return the Evas_Object directly below + * + */ +EAPI Evas_Object * +evas_object_below_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (obj->smart.parent) + { + do + { + obj = (Evas_Object *)(((Evas_Object_List *)(obj))->prev); + if ((obj) && (!obj->delete_me)) return (Evas_Object *)obj; + } + while (obj); + return NULL; + } + obj = evas_object_below_get_internal(obj); + while (obj) + { + if (!obj->delete_me) return (Evas_Object *)obj; + obj = evas_object_below_get_internal(obj); + } + return NULL; +} + +/** + * Get the lowest evas object on the Evas @p e + * + * @param e an Evas + * @return the lowest object + * + */ +EAPI Evas_Object * +evas_object_bottom_get(const Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + if (e->layers) + { + Evas_Object *obj; + + obj = e->layers->objects; + while (obj) + { + if (!obj->delete_me) return obj; + obj = evas_object_above_get_internal(obj); + } + } + return NULL; +} + +/** + * Get the highest evas object on the Evas @p e + * + * @param e an Evas + * @return the highest object + * + */ +EAPI Evas_Object * +evas_object_top_get(const Evas *e) +{ + Evas_Object *obj = NULL; + Evas_Object_List *list; + Evas_Layer *layer; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return NULL; + MAGIC_CHECK_END(); + + list = (Evas_Object_List *) e->layers; + if (!list) return NULL; + + layer = (Evas_Layer *) list->last; + if (!layer) return NULL; + + list = (Evas_Object_List *) layer->objects; + if (!list) return NULL; + + obj = (Evas_Object *) list->last; + if (!obj) return NULL; + + while (obj) + { + if (!obj->delete_me) return obj; + obj = evas_object_below_get_internal(obj); + } + + return obj; +} diff --git a/src/lib/data/.cvsignore b/src/lib/data/.cvsignore new file mode 100644 index 0000000..b477e9c --- /dev/null +++ b/src/lib/data/.cvsignore @@ -0,0 +1,6 @@ +Makefile.in +Makefile +.deps +.libs +*.la +*.lo diff --git a/src/lib/data/Makefile.am b/src/lib/data/Makefile.am new file mode 100644 index 0000000..6d3ef57 --- /dev/null +++ b/src/lib/data/Makefile.am @@ -0,0 +1,25 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = -I. \ + -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/lib/include \ + -DPACKAGE_BIN_DIR=\"$(bindir)\" \ + -DPACKAGE_LIB_DIR=\"$(libdir)\" \ + -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ + @FREETYPE_CFLAGS@ + +noinst_LTLIBRARIES = libevas_data.la +libevas_data_la_SOURCES = \ +evas_inline_array.x \ +evas_hash.c \ +evas_list.c \ +evas_array.c \ +evas_object_list.c \ +evas_stringshare.c \ +evas_array_hash.c \ +evas_mempool.c + +libevas_data_la_DEPENDENCIES = $(top_builddir)/config.h + +EXTRA_DIST = evas_mempool.h diff --git a/src/lib/data/evas_array.c b/src/lib/data/evas_array.c new file mode 100644 index 0000000..af9b3b8 --- /dev/null +++ b/src/lib/data/evas_array.c @@ -0,0 +1,110 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "Evas_Data.h" +#include "evas_inline_array.x" + +EAPI void +evas_array_append(Evas_Array *array, void *data) +{ + _evas_array_append(array, data); +} + +EAPI void * +evas_array_get(Evas_Array *array, unsigned int index) +{ + return _evas_array_get(array, index); +} + +EAPI void +evas_array_clean(Evas_Array *array) +{ + array->count = 0; +} + +EAPI void +evas_array_setup(Evas_Array *array, unsigned int step) +{ + array->step = step; +} + +EAPI void +evas_array_flush(Evas_Array *array) +{ + array->count = 0; + array->total = 0; + + if (array->data) free(array->data); + array->data = NULL; +} + +EAPI Evas_Array * +evas_array_new(unsigned int step) +{ + Evas_Array *array; + + array = malloc(sizeof (Evas_Array)); + if (!array) return NULL; + + array->data = NULL; + array->total = 0; + array->count = 0; + array->step = step; + + return array; +} + +EAPI void +evas_array_free(Evas_Array *array) +{ + evas_array_flush(array); + free(array); +} + +EAPI void +evas_array_remove(Evas_Array *array, Evas_Bool (*keep)(void *data, void *gdata), void *gdata) +{ + void **tmp; + unsigned int total = 0; + unsigned int i; + + if (array->total == 0) return ; + + tmp = malloc(sizeof (void*) * array->total); + if (!tmp) return ; + + for (i = 0; i < array->count; i++) + { + void *data; + + data = _evas_array_get(array, i); + + if (keep(data, gdata)) + { + tmp[total] = data; + total++; + } + } + + free(array->data); + + if (total == 0) + { + array->total = 0; + array->data = NULL; + free(tmp); + } + else + { + array->data = tmp; + } + + array->count = total; +} diff --git a/src/lib/data/evas_array_hash.c b/src/lib/data/evas_array_hash.c new file mode 100644 index 0000000..3724f43 --- /dev/null +++ b/src/lib/data/evas_array_hash.c @@ -0,0 +1,122 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "Evas_Data.h" + +#define EAH_BUCKETS 256 +#define EAH_HASH(key) \ + ( key % EAH_BUCKETS ) + +typedef struct _Evas_Array_Hash_El Evas_Array_Hash_El; + +struct _Evas_Array_Hash +{ + Evas_Array_Hash_El *buckets[EAH_BUCKETS]; +}; + +struct _Evas_Array_Hash_El +{ + int data_max; + int data_count; + int *data; +}; + +/* + These functions provide an interface for a simple hash. The hash + is and array of int array pointers. Right now that hash size is 256. + The hash size is static. The key and data are ints. + + Keys must be added in ascending order because the search function + assumes that the hash buckets are sorted. + */ +EAPI Evas_Array_Hash * +evas_array_hash_new(void) +{ + Evas_Array_Hash *hash; + + hash = calloc(1, sizeof(Evas_Array_Hash)); + return hash; +} + +EAPI void +evas_array_hash_free(Evas_Array_Hash *hash) +{ + int i; + + for (i = 0; i < EAH_BUCKETS; i++) + { + if (hash->buckets[i]) + { + free(hash->buckets[i]->data); + free(hash->buckets[i]); + } + } + + free(hash); +} + +EAPI void +evas_array_hash_add(Evas_Array_Hash *hash, int key, int data) +{ + int hash_val; + Evas_Array_Hash_El *el; + + hash_val = EAH_HASH(key); + el = hash->buckets[hash_val]; + if (!el) + { + el = malloc(sizeof(Evas_Array_Hash_El)); + el->data_max = 4; + el->data = malloc(sizeof(int) * el->data_max); + el->data_count = 0; + hash->buckets[hash_val] = el; + } + else if (el->data_count == el->data_max) + { + el->data_max *= 2; + el->data = realloc(el->data, sizeof(int) * el->data_max); + } + + el->data[el->data_count++] = key; + el->data[el->data_count++] = data; +} + +EAPI int +evas_array_hash_search(Evas_Array_Hash *hash, int key) +{ + int hash_val; + Evas_Array_Hash_El *el; + int low, high, i, val; + + hash_val = EAH_HASH(key); + + el = hash->buckets[hash_val]; + if (!el) + return 0; + + /* Binary Search the bucket for key */ + low = 0; + high = ( el->data_count / 2 ) - 1; + + while ( high >= low ) + { + i = (high + low) / 2; + + val = el->data[i << 1]; + + if (val == key) + return el->data[(i << 1) + 1]; + else if (val > key) + high = i - 1; + else + low = i + 1; + } + return 0; +} diff --git a/src/lib/data/evas_hash.c b/src/lib/data/evas_hash.c new file mode 100644 index 0000000..9d36648 --- /dev/null +++ b/src/lib/data/evas_hash.c @@ -0,0 +1,497 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include "Evas_Data.h" + +typedef struct _Evas_Hash_El Evas_Hash_El; + +struct _Evas_Hash_El +{ + Evas_Object_List _list_data; + const char *key; + void *data; +}; + +static inline int _evas_hash_gen(const char *key); + +static int _evas_hash_alloc_error = 0; + +static inline int +_evas_hash_gen(const char *key) +{ + unsigned int hash_num = 5381; + const unsigned char *ptr; + + if (!key) return 0; + for (ptr = (unsigned char *)key; *ptr; ptr++) + hash_num = (hash_num * 33) ^ *ptr; + + hash_num &= 0xff; + return (int)hash_num; +} + +/** + * @defgroup Evas_Hash_Data Hash Data Functions + * + * Functions that add, access or remove data from hashes. + * + * The following example shows how to add and then access data in a + * hash table: + * @code + * Evas_Hash *hash = NULL; + * extern void *my_data; + * + * hash = evas_hash_add(hash, "My Data", my_data); + * if (evas_hash_alloc_error()) + * { + * fprintf(stderr, "ERROR: Memory is low. Hash allocation failed.\n"); + * exit(-1); + * } + * if (evas_hash_find(hash, "My Data") == my_data) + * { + * printf("My Data inserted and successfully found.\n"); + * } + * @endcode + * + * What follows is another example, showing how the @ref evas_hash_del + * function is used: + * @code + * extern Evas_Hash *hash; + * extern void *data; + * + * printf("Insert some data...\n"); + * hash = evas_hash_add(hash, "My Data", my_data); + * printf("Removing by key...\n"); + * hash = evas_hash_del(hash, "My Data", NULL); + * printf("Insert some more data as a NULL key...\n"); + * hash = evas_hash_add(hash, NULL, my_data); + * printf("Removing by data as a NULL key...\n"); + * hash = evas_hash_del(hash, NULL, my_data); + * @endcode + */ + +/** + * Adds an entry to the given hash table. + * + * @p key is expected to be a unique string within the hash table. + * Otherwise, you cannot be sure which inserted data pointer will be + * accessed with @ref evas_hash_find , and removed with + * @ref evas_hash_del . + * + * Key strings are case sensitive. + * + * @ref evas_hash_alloc_error should be used to determine if an + * allocation error occurred during this function. + * + * @param hash The given hash table. Can be @c NULL, in which case a + * new hash table is allocated and returned. + * @param key A unique string. Can be @c NULL. + * @param data Data to associate with the string given by @p key. + * @return Either the given hash table, or if the given value for @p + * hash is @c NULL, then a new one. @c NULL will be returned + * if memory could not be allocated for a new table. + * @ingroup Evas_Hash_Data + */ +EAPI Evas_Hash * +evas_hash_add(Evas_Hash *hash, const char *key, const void *data) +{ + int hash_num; + Evas_Hash_El *el; + + if ((!key) || (!data)) return hash; + _evas_hash_alloc_error = 0; + if (!hash) + { + hash = calloc(1, sizeof(struct _Evas_Hash)); + if (!hash) + { + _evas_hash_alloc_error = 1; + return NULL; + } + } + if (!(el = malloc(sizeof(struct _Evas_Hash_El) + strlen(key) + 1))) + { + if (hash->population <= 0) + { + free(hash); + hash = NULL; + } + _evas_hash_alloc_error = 1; + return hash; + }; + el->key = ((char *)el) + sizeof(struct _Evas_Hash_El); + strcpy((char *) el->key, key); + el->data = (void *)data; + hash_num = _evas_hash_gen(key); + hash->buckets[hash_num] = evas_object_list_prepend(hash->buckets[hash_num], el); + hash->population++; + return hash; +} + +/** + * Adds an entry to the given hash table and does not duplicate the string key. + * + * @p key is expected to be a unique string within the hash table. + * Otherwise, you cannot be sure which inserted data pointer will be + * accessed with @ref evas_hash_find , and removed with + * @ref evas_hash_del . This call does not make a copy of the key so it must + * be a string constant or stored elsewhere (in the object being added) etc. + * + * Key strings are case sensitive. + * + * @ref evas_hash_alloc_error should be used to determine if an + * allocation error occurred during this function. + * + * @param hash The given hash table. Can be @c NULL, in which case a + * new hash table is allocated and returned. + * @param key A unique string. Can be @c NULL. + * @param data Data to associate with the string given by @p key. + * @return Either the given hash table, or if the given value for @p + * hash is @c NULL, then a new one. @c NULL will be returned + * if memory could not be allocated for a new table. + * @ingroup Evas_Hash_Data + */ +EAPI Evas_Hash * +evas_hash_direct_add(Evas_Hash *hash, const char *key, const void *data) +{ + int hash_num; + Evas_Hash_El *el; + + if ((!key) || (!data)) return hash; + _evas_hash_alloc_error = 0; + if (!hash) + { + hash = calloc(1, sizeof(struct _Evas_Hash)); + if (!hash) + { + _evas_hash_alloc_error = 1; + return NULL; + } + } + if (!(el = malloc(sizeof(struct _Evas_Hash_El)))) + { + if (hash->population <= 0) + { + free(hash); + hash = NULL; + } + _evas_hash_alloc_error = 1; + return hash; + }; + el->key = key; + el->data = (void *)data; + hash_num = _evas_hash_gen(key); + hash->buckets[hash_num] = evas_object_list_prepend(hash->buckets[hash_num], el); + hash->population++; + return hash; +} + +/** + * Removes the entry identified by @p key or @p data from the given + * hash table. + * + * If @p key is @c NULL, then @p data is used to find a match to + * remove. + * + * @param hash The given hash table. + * @param key The key string. Can be @c NULL. + * @param data The data pointer to remove if @p key is @c NULL. + * Otherwise, not required and can be @c NULL. + * @return The modified hash table. If there are no entries left, the + * hash table will be freed and @c NULL will be returned. + * @ingroup Evas_Hash_Data + */ +EAPI Evas_Hash * +evas_hash_del(Evas_Hash *hash, const char *key, const void *data) +{ + int hash_num; + Evas_Hash_El *el; + Evas_Object_List *l; + + if (!hash) return NULL; + if (!key) + { + int hash_num; + + for (hash_num = 0; hash_num < 256; hash_num++) + { + for (l = hash->buckets[hash_num]; l; l = l->next) + { + el = (Evas_Hash_El *)l; + if (el->data == data) + { + hash->buckets[hash_num] = evas_object_list_remove(hash->buckets[hash_num], el); + free(el); + hash->population--; + if (hash->population <= 0) + { + free(hash); + hash = NULL; + } + return hash; + } + } + } + } + else + { + hash_num = _evas_hash_gen(key); + for (l = hash->buckets[hash_num]; l; l = l->next) + { + el = (Evas_Hash_El *)l; + if (!strcmp(el->key, key)) + { + hash->buckets[hash_num] = evas_object_list_remove(hash->buckets[hash_num], el); + free(el); + hash->population--; + if (hash->population <= 0) + { + free(hash); + hash = NULL; + } + return hash; + } + } + } + return hash; +} + +/** + * Retrieves a specific entry in the given hash table. + * @param hash The given hash table. + * @param key The key string of the entry to find. + * @return The data pointer for the stored entry, or @c NULL if not + * found. + * @ingroup Evas_Hash_Data + */ +EAPI void * +evas_hash_find(const Evas_Hash *hash, const char *key) +{ + int hash_num; + Evas_Hash_El *el; + Evas_Object_List *l; + + _evas_hash_alloc_error = 0; + if ((!hash) || (!key)) return NULL; + hash_num = _evas_hash_gen(key); + for (l = hash->buckets[hash_num]; l; l = l->next) + { + el = (Evas_Hash_El *)l; + if (!strcmp(el->key, key)) + { + if (l != hash->buckets[hash_num]) + { + Evas_Object_List *bucket; + + bucket = hash->buckets[hash_num]; + bucket = evas_object_list_remove(bucket, el); + bucket = evas_object_list_prepend(bucket, el); + ((Evas_Hash *)hash)->buckets[hash_num] = bucket; + } + return el->data; + } + } + return NULL; +} + +/** + * Modifies the entry pointer at the specified key and returns the old entry + * @param hash The given hash table. + * @param key The key string of the entry to modify. + * @param data The data to replace the old entry, if it exists. + * @return The data pointer for the old stored entry, or @c NULL if not + * found. If an existing entry is not found, nothing is added to the + * hash. + * @ingroup Evas_Hash_Data + */ +EAPI void * +evas_hash_modify(Evas_Hash *hash, const char *key, const void *data) +{ + int hash_num; + Evas_Hash_El *el; + Evas_Object_List *l; + + _evas_hash_alloc_error = 0; + if (!hash) return NULL; + hash_num = _evas_hash_gen(key); + for (l = hash->buckets[hash_num]; l; l = l->next) + { + el = (Evas_Hash_El *)l; + if ((key) && (!strcmp(el->key, key))) + { + void *old_data; + + if (l != hash->buckets[hash_num]) + { + hash->buckets[hash_num] = evas_object_list_remove(hash->buckets[hash_num], el); + hash->buckets[hash_num] = evas_object_list_prepend(hash->buckets[hash_num], el); + } + old_data = el->data; + el->data = (void *) data; + return old_data; + } + } + return NULL; +} + +/** + * @defgroup Evas_Hash_General_Group Hash General Functions + * + * Miscellaneous functions that operate on hash objects. + */ + +/** + * Retrieves the number of buckets available in the given hash table. + * @param hash The given hash table. + * @return @c 256 if @p hash is not @c NULL. @c 0 otherwise. + * @ingroup Evas_Hash_General_Group + */ +EAPI int +evas_hash_size(const Evas_Hash *hash) +{ + if (!hash) return 0; + return 256; +} + +/** + * @todo Complete polishing documentation for evas_hash.c. The + * functions' docs may be grouped, but they need some simplification. + */ + +/** + * Free an entire hash table + * @param hash The hash table to be freed + * + * This function frees up all the memory allocated to storing the specified + * hash tale pointed to by @p hash. Any entries in the table that the program + * has no more pointers for elsewhere may now be lost, so this should only be + * called if the program has lready freed any allocated data in the hash table + * or has the pointers for data in teh table stored elswehere as well. + * + * Example: + * @code + * extern Evas_Hash *hash; + * + * evas_hash_free(hash); + * hash = NULL; + * @endcode + * @ingroup Evas_Hash_General_Group + */ +EAPI void +evas_hash_free(Evas_Hash *hash) +{ + int i, size; + + if (!hash) return; + size = evas_hash_size(hash); + for (i = 0; i < size; i++) + { + while (hash->buckets[i]) + { + Evas_Hash_El *el; + + el = (Evas_Hash_El *)hash->buckets[i]; + hash->buckets[i] = evas_object_list_remove(hash->buckets[i], el); + free(el); + } + } + free(hash); +} + +/** + * Call a function on every member stored in the hash table + * @param hash The hash table whose members will be walked + * @param func The function to call on each parameter + * @param fdata The data pointer to pass to the function being called + * + * This function goes through every entry in the hash table @p hash and calls + * the function @p func on each member. The function should NOT modify the + * hash table contents if it returns 1. IF the hash table contents are + * modified by this function or the function wishes to stop processing it must + * return 0, otherwise return 1 to keep processing. + * + * Example: + * @code + * extern Evas_Hash *hash; + * + * Evas_Bool hash_fn(Evas_Hash *hash, const char *key, void *data, void *fdata) + * { + * printf("Func data: %s, Hash entry: %s / %p\n", fdata, key, data); + * return 1; + * } + * + * int main(int argc, char **argv) + * { + * char *hash_fn_data; + * + * hash_fn_data = strdup("Hello World"); + * evas_hash_foreach(hash, hash_fn, hash_fn_data); + * free(hash_fn_data); + * } + * @endcode + * @ingroup Evas_Hash_General_Group + */ +EAPI void +evas_hash_foreach(const Evas_Hash *hash, Evas_Bool (*func) (const Evas_Hash *hash, const char *key, void *data, void *fdata), const void *fdata) +{ + int i, size; + + if (!hash) return; + size = evas_hash_size(hash); + for (i = 0; i < size; i++) + { + Evas_Object_List *l, *next_l; + + for (l = hash->buckets[i]; l;) + { + Evas_Hash_El *el; + + next_l = l->next; + el = (Evas_Hash_El *)l; + if (!func(hash, el->key, el->data, (void *)fdata)) return; + l = next_l; + } + } +} + +/** + * Return memory allocation failure flag after an function requiring allocation + * @return The state of the allocation flag + * + * This function returns the state of the memory allocation flag. This flag is + * set if memory allocations fail during evas_hash_add() calls. If they do, 1 + * will be returned, otherwise 0 will be returned. The flag will remain in its + * current state until the next call that requires allocation is called, and + * is then reset. + * + * Example: + * @code + * Evas_Hash *hash = NULL; + * extern void *my_data; + * + * hash = evas_hash_add(hash, "My Data", my_data); + * if (evas_hash_alloc_error()) + * { + * fprintf(stderr, "ERROR: Memory is low. Hash allocation failed.\n"); + * exit(-1); + * } + * if (evas_hash_find(hash, "My Data") == my_data) + * { + * printf("My Data inserted and successfully found.\n"); + * } + * @endcode + * @ingroup Evas_Hash_General_Group + */ +EAPI int +evas_hash_alloc_error(void) +{ + return _evas_hash_alloc_error; +} diff --git a/src/lib/data/evas_inline_array.x b/src/lib/data/evas_inline_array.x new file mode 100644 index 0000000..0ea0a0d --- /dev/null +++ b/src/lib/data/evas_inline_array.x @@ -0,0 +1,41 @@ +#ifndef EVAS_INLINE_ARRAY_H +#define EVAS_INLINE_ARRAY_H + +#ifdef __GNUC__ +# define UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +# define UNLIKELY(x) (x) +#endif + +static inline Evas_Bool +_evas_array_grow(Evas_Array *array) +{ + void **tmp; + size_t total; + + total = array->total + array->step; + tmp = realloc(array->data, sizeof (void*) * total); + if (!tmp) return 0; + + array->total = total; + array->data = tmp; + + return 1; +} + +static inline void +_evas_array_append(Evas_Array *array, void *data) +{ + if (UNLIKELY((array->count + array->step) > array->total)) + if (!_evas_array_grow(array)) return ; + + array->data[array->count++] = data; +} + +static inline void * +_evas_array_get(Evas_Array *array, unsigned int index) +{ + return array->data[index]; +} + +#endif diff --git a/src/lib/data/evas_list.c b/src/lib/data/evas_list.c new file mode 100644 index 0000000..926a495 --- /dev/null +++ b/src/lib/data/evas_list.c @@ -0,0 +1,1031 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "Evas_Data.h" +#include + +typedef struct _Evas_List_Accounting Evas_List_Accounting; + +struct _Evas_List_Accounting +{ + Evas_List *last; + int count; +}; + +static int _evas_list_alloc_error = 0; + +static Evas_Mempool _evas_list_mempool = +{ + sizeof(Evas_List), + 320, + 0, NULL, NULL +}; +static Evas_Mempool _evas_list_accounting_mempool = +{ + sizeof(Evas_List_Accounting), + 80, + 0, NULL, NULL +}; + +/** + * @defgroup Evas_List_Data_Group Linked List Creation Functions + * + * Functions that add data to an Evas_List. + */ + +/** + * Appends the given data to the given linked list. + * + * The following example code demonstrates how to ensure that the + * given data has been successfully appended. + * + * @code + * Evas_List *list = NULL; + * extern void *my_data; + * + * list = evas_list_append(list, my_data); + * if (evas_list_alloc_error()) + * { + * fprintf(stderr, "ERROR: Memory is low. List allocation failed.\n"); + * exit(-1); + * } + * @endcode + * + * @param list The given list. If @c NULL is given, then a new list + * is created. + * @param data The data to append. + * @return A new list pointer that should be used in place of the one + * given to this function if successful. Otherwise, the old + * pointer is returned. + * @ingroup Evas_List_Data_Group + */ +EAPI Evas_List * +evas_list_append(Evas_List *list, const void *data) +{ + Evas_List *l, *new_l; + + _evas_list_alloc_error = 0; + new_l = evas_mempool_malloc(&_evas_list_mempool, sizeof(Evas_List)); + if (!new_l) + { + _evas_list_alloc_error = 1; + return list; + } + new_l->next = NULL; + new_l->data = (void *)data; + if (!list) + { + new_l->prev = NULL; + new_l->accounting = evas_mempool_malloc(&_evas_list_accounting_mempool, sizeof(Evas_List_Accounting)); + if (!new_l->accounting) + { + _evas_list_alloc_error = 1; + evas_mempool_free(&_evas_list_mempool, new_l); + return list; + } + new_l->accounting->last = new_l; + new_l->accounting->count = 1; + return new_l; + } + l = list->accounting->last; + l->next = new_l; + new_l->prev = l; + new_l->accounting = list->accounting; + list->accounting->last = new_l; + list->accounting->count++; + return list; +} + +/** + * Prepends the given data to the given linked list. + * + * The following example code demonstrates how to ensure that the + * given data has been successfully prepended. + * + * Example: + * @code + * Evas_List *list = NULL; + * extern void *my_data; + * + * list = evas_list_prepend(list, my_data); + * if (evas_list_alloc_error()) + * { + * fprintf(stderr, "ERROR: Memory is low. List allocation failed.\n"); + * exit(-1); + * } + * @endcode + * + * @param list The given list. + * @param data The given data. + * @return A new list pointer that should be used in place of the one + * given to this function, if successful. Otherwise, the old + * pointer is returned. + * @ingroup Evas_List_Data_Group + */ +EAPI Evas_List * +evas_list_prepend(Evas_List *list, const void *data) +{ + Evas_List *new_l; + + _evas_list_alloc_error = 0; + new_l = evas_mempool_malloc(&_evas_list_mempool, sizeof(Evas_List)); + if (!new_l) + { + _evas_list_alloc_error = 1; + return list; + } + new_l->prev = NULL; + new_l->data = (void *)data; + if (!list) + { + new_l->next = NULL; + new_l->accounting = evas_mempool_malloc(&_evas_list_accounting_mempool, sizeof(Evas_List_Accounting)); + if (!new_l->accounting) + { + _evas_list_alloc_error = 1; + evas_mempool_free(&_evas_list_mempool, new_l); + return list; + } + new_l->accounting->last = new_l; + new_l->accounting->count = 1; + return new_l; + } + new_l->next = list; + list->prev = new_l; + new_l->accounting = list->accounting; + list->accounting->count++; + return new_l; +} + +/** + * Inserts the given data into the given linked list after the specified data. + * + * If @p relative is not in the list, @p data is appended to the end of the + * list. If there are multiple instances of @p relative in the list, + * @p data is inserted after the first instance. + * + * The following example code demonstrates how to ensure that the + * given data has been successfully inserted. + * + * @code + * Evas_List *list = NULL; + * extern void *my_data; + * extern void *relative_member; + * + * list = evas_list_append(list, relative_member); + * if (evas_list_alloc_error()) + * { + * fprintf(stderr, "ERROR: Memory is low. List allocation failed.\n"); + * exit(-1); + * } + * list = evas_list_append_relative(list, my_data, relative_member); + * if (evas_list_alloc_error()) + * { + * fprintf(stderr, "ERROR: Memory is low. List allocation failed.\n"); + * exit(-1); + * } + * @endcode + * + * @param list The given linked list. + * @param data The given data. + * @param relative The data to insert after. + * @return A new list pointer that should be used in place of the one + * given to this function if successful. Otherwise, the old pointer + * is returned. + * @ingroup Evas_List_Data_Group + */ +EAPI Evas_List * +evas_list_append_relative(Evas_List *list, const void *data, const void *relative) +{ + Evas_List *l; + + for (l = list; l; l = l->next) + { + if (l->data == relative) + return evas_list_append_relative_list(list, data, l); + } + return evas_list_append(list, data); +} + +EAPI Evas_List * +evas_list_append_relative_list(Evas_List *list, const void *data, Evas_List *relative) +{ + Evas_List *new_l; + + if ((!list) || (!relative)) return evas_list_append(list, data); + _evas_list_alloc_error = 0; + new_l = evas_mempool_malloc(&_evas_list_mempool, sizeof(Evas_List)); + if (!new_l) + { + _evas_list_alloc_error = 1; + return list; + } + new_l->data = (void *)data; + if (relative->next) + { + new_l->next = relative->next; + relative->next->prev = new_l; + } + else + new_l->next = NULL; + + relative->next = new_l; + new_l->prev = relative; + new_l->accounting = list->accounting; + list->accounting->count++; + if (!new_l->next) + new_l->accounting->last = new_l; + return list; +} + +/** + * Prepend a data pointer to a linked list before the memeber specified + * @param list The list handle to prepend @p data too + * @param data The data pointer to prepend to list @p list before @p relative + * @param relative The data pointer before which to insert @p data + * @return A new list handle to replace the old one + + * Inserts the given data into the given linked list before the member + * specified. + * + * If @p relative is not in the list, @p data is prepended to the + * start of the list. If there are multiple instances of @p relative + * in the list, @p data is inserted before the first instance. + * + * The following code example demonstrates how to ensure that the + * given data has been successfully inserted. + * + * @code + * Evas_List *list = NULL; + * extern void *my_data; + * extern void *relative_member; + * + * list = evas_list_append(list, relative_member); + * if (evas_list_alloc_error()) + * { + * fprintf(stderr, "ERROR: Memory is low. List allocation failed.\n"); + * exit(-1); + * } + * list = evas_list_prepend_relative(list, my_data, relative_member); + * if (evas_list_alloc_error()) + * { + * fprintf(stderr, "ERROR: Memory is low. List allocation failed.\n"); + * exit(-1); + * } + * @endcode + * + * @param list The given linked list. + * @param data The given data. + * @param relative The data to insert before. + * @return A new list pointer that should be used in place of the one + * given to this function if successful. Otherwise the old pointer + * is returned. + * @ingroup Evas_List_Data_Group + */ +EAPI Evas_List * +evas_list_prepend_relative(Evas_List *list, const void *data, const void *relative) +{ + Evas_List *l; + + _evas_list_alloc_error = 0; + for (l = list; l; l = l->next) + { + if (l->data == relative) + return evas_list_prepend_relative_list(list, data, l); + } + return evas_list_prepend(list, data); +} + +EAPI Evas_List * +evas_list_prepend_relative_list(Evas_List *list, const void *data, Evas_List *relative) +{ + Evas_List *new_l; + + if ((!list) || (!relative)) return evas_list_prepend(list, data); + _evas_list_alloc_error = 0; + new_l = evas_mempool_malloc(&_evas_list_mempool, sizeof(Evas_List)); + if (!new_l) + { + _evas_list_alloc_error = 1; + return list; + } + new_l->data = (void *)data; + new_l->prev = relative->prev; + new_l->next = relative; + if (relative->prev) relative->prev->next = new_l; + relative->prev = new_l; + new_l->accounting = list->accounting; + list->accounting->count++; + if (new_l->prev) + return list; + return new_l; +} + +/** + * @defgroup Evas_List_Remove_Group Linked List Remove Functions + * + * Functions that remove data from linked lists. + */ + +/** + * Removes the first instance of the specified data from the given list. + * + * If the specified data is not in the given list, nothing is done. + * + * @param list The given list. + * @param data The specified data. + * @return A new list pointer that should be used in place of the one + * passed to this functions. + * @ingroup Evas_List_Remove_Group + */ +EAPI Evas_List * +evas_list_remove(Evas_List *list, const void *data) +{ + Evas_List *l; + + for (l = list; l; l = l->next) + { + if (l->data == data) + return evas_list_remove_list(list, l); + } + return list; +} + +/** + * Removes the specified data + * + * Remove a specified member from a list + * @param list The list handle to remove @p remove_list from + * @param remove_list The list node which is to be removed + * @return A new list handle to replace the old one + * + * Calling this function takes the list node @p remove_list and removes it + * from the list @p list, freeing the list node structure @p remove_list. + * + * Example: + * @code + * extern Evas_List *list; + * Evas_List *l; + * extern void *my_data; + * + * for (l = list; l; l= l->next) + * { + * if (l->data == my_data) + * { + * list = evas_list_remove_list(list, l); + * break; + * } + * } + * @endcode + * @ingroup Evas_List_Remove_Group + */ +EAPI Evas_List * +evas_list_remove_list(Evas_List *list, Evas_List *remove_list) +{ + Evas_List *return_l; + + if (!list) return NULL; + if (!remove_list) return list; + if (remove_list->next) remove_list->next->prev = remove_list->prev; + if (remove_list->prev) + { + remove_list->prev->next = remove_list->next; + return_l = list; + } + else + return_l = remove_list->next; + if (remove_list == list->accounting->last) + list->accounting->last = remove_list->prev; + list->accounting->count--; + if (list->accounting->count == 0) + evas_mempool_free(&_evas_list_accounting_mempool, list->accounting); + evas_mempool_free(&_evas_list_mempool, remove_list); + return return_l; +} + +/** + * Moves the specified data to the head of the list + * + * Move a specified member to the head of the list + * @param list The list handle to move @p inside + * @param move_list The list node which is to be moved + * @return A new list handle to replace the old one + * + * Calling this function takes the list node @p move_list and moves it + * to the front of the @p list. + * + * Example: + * @code + * extern Evas_List *list; + * Evas_List *l; + * extern void *my_data; + * + * for (l = list; l; l= l->next) + * { + * if (l->data == my_data) + * { + * list = evas_list_promote_list(list, l); + * break; + * } + * } + * @endcode + * @ingroup Evas_List_Promote_Group + */ +EAPI Evas_List * +evas_list_promote_list(Evas_List *list, Evas_List *move_list) +{ + Evas_List *return_l; + + if (!list) return NULL; + if (!move_list) return list; + if (move_list == list) return list; + if (move_list->next) move_list->next->prev = move_list->prev; + if (move_list->prev) + { + move_list->prev->next = move_list->next; + return_l = list; + } + else + return_l = move_list->next; + if (move_list == list->accounting->last) + list->accounting->last = move_list->prev; + move_list->prev = return_l->prev; + if (return_l->prev) + return_l->prev->next = move_list; + return_l->prev = move_list; + move_list->next = return_l; + return move_list; +} + + + +/** + * @defgroup Evas_List_Find_Group Linked List Find Functions + * + * Functions that find specified data in a linked list. + */ + +/** + * Find a member of a list and return the member + * @param list The list handle to search for @p data + * @param data The data pointer to find in the list @p list + * @return The found member data pointer + * + * A call to this function will search the list @p list from beginning to end + * for the first member whose data pointer is @p data. If it is found, @p data + * will be returned, otherwise NULL will be returned. + * + * Example: + * @code + * extern Evas_List *list; + * extern void *my_data; + * + * if (evas_list_find(list, my_data) == my_data) + * { + * printf("Found member %p\n", my_data); + * } + * @endcode + * @ingroup Evas_List_Find_Group + */ +EAPI void * +evas_list_find(const Evas_List *list, const void *data) +{ + const Evas_List *l; + + for (l = list; l; l = l->next) + { + if (l->data == data) return (void *)data; + } + return NULL; +} + +/** + * Find a member of a list and return the list node containing that member + * @param list The list handle to search for @p data + * @param data The data pointer to find in the list @p list + * @return The found members list node + * + * A call to this function will search the list @p list from beginning to end + * for the first member whose data pointer is @p data. If it is found, the + * list node containing the specified member will be returned, otherwise NULL + * will be returned. + * + * Example: + * @code + * extern Evas_List *list; + * extern void *my_data; + * Evas_List *found_node; + * + * found_node = evas_list_find_list(list, my_data); + * if (found_node) + * { + * printf("Found member %p\n", found_node->data); + * } + * @endcode + * @ingroup Evas_List_Find_Group + */ +EAPI Evas_List * +evas_list_find_list(const Evas_List *list, const void *data) +{ + const Evas_List *l; + + for (l = list; l; l = l->next) + { + if (l->data == data) return (Evas_List *)l; + } + return NULL; +} + +/** + * Free an entire list and all the nodes, ignoring the data contained + * @param list The list to free + * @return A NULL pointer + * + * This function will free all the list nodes in list specified by @p list. + * + * Example: + * @code + * extern Evas_List *list; + * + * list = evas_list_free(list); + * @endcode + * @ingroup Evas_List_Remove_Group + */ +EAPI Evas_List * +evas_list_free(Evas_List *list) +{ + Evas_List *l, *free_l; + + if (!list) return NULL; + evas_mempool_free(&_evas_list_accounting_mempool, list->accounting); + for (l = list; l;) + { + free_l = l; + l = l->next; + evas_mempool_free(&_evas_list_mempool, free_l); + } + return NULL; +} + +/** + * @defgroup Evas_List_Traverse_Group Linked List Traverse Functions + * + * Functions that you can use to traverse a linked list. + */ + +/** + * Get the last list node in the list + * @param list The list to get the last list node from + * @return The last list node in the list @p list + * + * This function will return the last list node in the list (or NULL if the + * list is empty). + * + * NB: This is a order-1 operation (it takes the same short time regardless of + * the length of the list). + * + * Example: + * @code + * extern Evas_List *list; + * Evas_List *last, *l; + * + * last = evas_list_last(list); + * printf("The list in reverse:\n"); + * for (l = last; l; l = l->prev) + * { + * printf("%p\n", l->data); + * } + * @endcode + * @ingroup Evas_List_Traverse_Group + */ +EAPI Evas_List * +evas_list_last(const Evas_List *list) +{ + if (!list) return NULL; + return list->accounting->last; +} + +/** + * Get the next list node after the specified list node + * @param list The list node to get the next list node from + * @return The next list node, or NULL if no next list node exists + * + * This function returns the next list node after the current one. It is + * equivalent to list->next. + * + * Example: + * @code + * extern Evas_List *list; + * Evas_List *l; + * + * printf("The list:\n"); + * for (l = list; l; l = evas_list_next(l)) + * { + * printf("%p\n", l->data); + * } + * @endcode + * @ingroup Evas_List_Traverse_Group + */ +EAPI Evas_List * +evas_list_next(const Evas_List *list) +{ + if (!list) return NULL; + return list->next; +} + +/** + * Get the previous list node before the specified list node + * @param list The list node to get the previous list node from + * @return The previous list node, or NULL if no previous list node exists + * + * This function returns the previous list node before the current one. It is + * equivalent to list->prev. + * + * Example: + * @code + * extern Evas_List *list; + * Evas_List *last, *l; + * + * last = evas_list_last(list); + * printf("The list in reverse:\n"); + * for (l = last; l; l = evas_list_prev(l)) + * { + * printf("%p\n", l->data); + * } + * @endcode + * @ingroup Evas_List_Traverse_Group + */ +EAPI Evas_List * +evas_list_prev(const Evas_List *list) +{ + if (!list) return NULL; + return list->prev; +} + +/** + * @defgroup Evas_List_General_Group Linked List General Functions + * + * Miscellaneous functions that work on linked lists. + */ + +/** + * Get the list node data member + * @param list The list node to get the data member of + * @return The data member from the list node @p list + * + * This function returns the data member of the specified list node @p list. + * It is equivalent to list->data. + * + * Example: + * @code + * extern Evas_List *list; + * Evas_List *l; + * + * printf("The list:\n"); + * for (l = list; l; l = evas_list_next(l)) + * { + * printf("%p\n", evas_list_data(l)); + * } + * @endcode + * @ingroup Evas_List_General_Group + */ +EAPI void * +evas_list_data(const Evas_List *list) +{ + if (!list) return NULL; + return list->data; +} + +/** + * Get the count of the number of items in a list + * @param list The list whose count to return + * @return The number of members in the list @p list + * + * This function returns how many members in the specified list: @p list. If + * the list is empty (NULL), 0 is returned. + * + * NB: This is an order-1 operation and takes the same tiem regardless of the + * length of the list. + * + * Example: + * @code + * extern Evas_List *list; + * + * printf("The list has %i members\n", evas_list_count(list)); + * @endcode + * @ingroup Evas_List_General_Group + */ +EAPI int +evas_list_count(const Evas_List *list) +{ + if (!list) return 0; + return list->accounting->count; +} + +/** + * Get the nth member's data pointer in a list + * @param list The list to get member number @p n from + * @param n The number of the element (0 being the first) + * @return The data pointer stored in the specified element + * + * This function returns the data pointer of element number @p n, in the list + * @p list. The first element in the array is element number 0. If the element + * number @p n does not exist, NULL will be returned. + * + * Example: + * @code + * extern Evas_List *list; + * extern int number; + * void *data; + * + * data = evas_list_nth(list, number); + * if (data) + * printf("Element number %i has data %p\n", number, data); + * @endcode + * @ingroup Evas_List_Find_Group + */ +EAPI void * +evas_list_nth(const Evas_List *list, int n) +{ + Evas_List *l; + + l = evas_list_nth_list(list, n); + return l ? l->data : NULL; +} + +/** + * Get the nth member's list node in a list + * @param list The list to get member number @p n from + * @param n The number of the element (0 being the first) + * @return The list node stored in the numbered element + * + * This function returns the list node of element number @p n, in the list + * @p list. The first element in the array is element number 0. If the element + * number @p n does not exist, NULL will be returned. + * + * Example: + * @code + * extern Evas_List *list; + * extern int number; + * Evas_List *nth_list; + * + * nth_list = evas_list_nth_list(list, number); + * if (nth_list) + * printf("Element number %i has data %p\n", number, nth_list->data); + * @endcode + * @ingroup Evas_List_Find_Group + */ +EAPI Evas_List * +evas_list_nth_list(const Evas_List *list, int n) +{ + int i; + const Evas_List *l; + + /* check for non-existing nodes */ + if ((!list) || (n < 0) || + (n > (list->accounting->count - 1))) + return NULL; + + /* if the node is in the 2nd half of the list, search from the end + * else, search from the beginning. + */ + if (n > (list->accounting->count / 2)) + { + for (i = list->accounting->count - 1, + l = list->accounting->last; + l; + l = l->prev, i--) + { + if (i == n) return (Evas_List *)l; + } + } + else + { + for (i = 0, l = list; l; l = l->next, i++) + { + if (i == n) return (Evas_List *)l; + } + } + return NULL; +} + +/** + * @defgroup Evas_List_Ordering_Group Linked List Ordering Functions + * + * Functions that change the ordering of data in a linked list. + */ + +/** + * Reverse all the elements in the list + * @param list The list to reverse + * @return The list after it has been reversed + * + * This takes a list @p list, and reverses the order of all elements in the + * list, so the last member is now first, and so on. + * + * Example: + * @code + * extern Evas_List *list; + * + * list = evas_list_reverse(list); + * @endcode + * @ingroup Evas_List_Ordering_Group + */ +EAPI Evas_List * +evas_list_reverse(Evas_List *list) +{ + Evas_List *l1, *l2; + + if (!list) return NULL; + l1 = list; + l2 = list->accounting->last; + while (l1 != l2) + { + void *data; + + data = l1->data; + l1->data = l2->data; + l2->data = data; + l1 = l1->next; + if (l1 == l2) break; + l2 = l2->prev; + } + + return list; +} + +/** + * Sort a list according to the ordering func will return + * @param list The list handle to sort + * @param size The length of the list to sort + * @param func A function pointer that can handle comparing the list data + * nodes + * @return A new sorted list + * + * This function sorts your list. The data in your nodes can be arbitrary, + * you just have to be smart enough to know what kind of data is in your + * lists + * + * Example: + * @code + * int + * sort_cb(void *d1, void *d2) + * { + * const char *txt = NULL; + * const char *txt2 = NULL; + * + * if(!d1) return(1); + * if(!d2) return(-1); + * + * return(strcmp((const char*)d1, (const char*)d2)); + * } + * extern Evas_List *list; + * + * list = evas_list_sort(list, evas_list_count(list), sort_cb); + * if (evas_list_alloc_error()) + * { + * fprintf(stderr, "ERROR: Memory is low. List Sorting failed.\n"); + * exit(-1); + * } + * @endcode + * @ingroup Evas_List_Ordering_Group + */ +EAPI Evas_List * +evas_list_sort(Evas_List *list, int size, int (*func)(void *, void *)) +{ + Evas_List* last; + unsigned int list_number; + unsigned int middle; + int list_size; + + if (!list || !func) + return NULL; + + /* if the caller specified an invalid size, sort the whole list */ + if ((size <= 0) || + (size > list->accounting->count)) + size = list->accounting->count; + + last = list->accounting->last; + middle = size - size / 2; + + for (list_number = middle, list_size = 1; + list_size < middle * 2; + list_number >>= 1, list_size <<= 1) + { + Evas_List *head1 = list; + unsigned int limit = size; + unsigned int process_list; + unsigned int pass_number; + unsigned int split_size = list_size; + + for (process_list = 0; process_list < list_number + 1; ++process_list) + { + Evas_List *head2; + unsigned int size_sum; + int size1, size2; + int i; + + size1 = limit < split_size ? limit : split_size; + limit -= size1; + + size2 = limit < split_size ? limit : split_size; + limit -= size2; + + size_sum = size1 + size2; + + for (head2 = head1, i = 0; i < size1; ++i) + head2 = evas_list_next (head2); + + for (pass_number = 0; pass_number < size_sum; ++pass_number) + { + Evas_List *next; + Evas_List *prev1; + Evas_List *prev2; + + if (size1 == 0 || head1 == NULL) /* List1 is empty, head1 is already at the end of the list. So only need to update head2 */ + { + for (; pass_number < size_sum; ++pass_number) + head2 = evas_list_next (head2); + break; + } + else + if (size2 == 0 || head2 == NULL) /* List2 is empty, just leave */ + break; + else + if (func (head1->data, head2->data) < 0) + { + head1 = evas_list_next (head1); + --size1; + } + else + { + next = evas_list_next (head2); + prev1 = evas_list_prev (head1); + prev2 = evas_list_prev (head2); + + if (next) + next->prev = prev2; + if (prev1) + prev1->next = head2; + if (prev2) + prev2->next = next; + + head2->prev = prev1; + head2->next = head1; + head1->prev = head2; + + --size2; + + if (head1 == list) + list = head2; + if (head2 == last) + last = prev2; + + head2 = next; + } + } + head1 = head2; + } + } + + list->accounting->last = last; + return list; +} +/** + * Return the memory allocation failure flag after any operation needin allocation + * @return The state of the allocation flag + * + * This function returns the state of the memory allocation flag. This flag is + * set if memory allocations during evas_list_append(), evas_list_prepend(), + * evas_list_append_relative(), or evas_list_prepend_relative() fail. If they + * do fail, 1 will be returned, otherwise 0 will be returned. The flag will + * remain in its current state until the next call that requires allocation + * is called, and is then reset. + * + * Example: + * @code + * Evas_List *list = NULL; + * extern void *my_data; + * + * list = evas_list_append(list, my_data); + * if (evas_list_alloc_error()) + * { + * fprintf(stderr, "ERROR: Memory is low. List allocation failed.\n"); + * exit(-1); + * } + * @endcode + * @ingroup Evas_List_General_Group + */ +EAPI int +evas_list_alloc_error(void) +{ + return _evas_list_alloc_error; +} diff --git a/src/lib/data/evas_mempool.c b/src/lib/data/evas_mempool.c new file mode 100644 index 0000000..6bbf390 --- /dev/null +++ b/src/lib/data/evas_mempool.c @@ -0,0 +1,188 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include "Evas_Data.h" +#include "evas_mempool.h" + +//#define NOPOOL + +typedef struct _Pool Pool; + +struct _Pool +{ + int usage; + void *base; + Pool *prev, *next; +}; + + +Pool * +_evas_mp_pool_new(Evas_Mempool *pool) +#ifdef NOPOOL +{ + static Pool thepool; + return &thepool; +} +#else +{ + Pool *p; + void **ptr; + int item_alloc, i; + + item_alloc = ((pool->item_size + sizeof(void *) - 1) / sizeof(void *)) * sizeof(void *); + p = malloc(sizeof(Pool) + (pool->pool_size * item_alloc)); + ptr = (void **)(((unsigned char *)p) + sizeof(Pool)); + p->usage = 0; + p->base = ptr; + for (i = 0; i < pool->pool_size - 1; i++) + { + *ptr = (void **)(((unsigned char *)ptr) + item_alloc); + ptr = *ptr; + } + *ptr = NULL; + return p; +} +#endif + +void +_evas_mp_pool_free(Pool *p) +#ifdef NOPOOL +{ +} +#else +{ + free(p); +} +#endif + +void * +evas_mempool_malloc(Evas_Mempool *pool, int size) +#ifdef NOPOOL +{ + return malloc(size); +} +#else +{ + Pool *p; + void *mem; + + for (p = pool->first; p; p = p->next) // look 4 pool from 2nd bucket on + { + if (p->base) // base is not NULL - has a free slot + { + if (p->prev) + { + if (pool->last == p) pool->last = p->prev; + p->prev->next = p->next; + p->prev = NULL; + p->next = pool->first; + p->next->prev = p; + pool->first = p; + } + break; + } + } + if (!p) // we have reached the end of the list - no free pools + { + p = _evas_mp_pool_new(pool); + if (!p) return NULL; + p->prev = NULL; + p->next = pool->first; + if (p->next) p->next->prev = p; + if (!pool->last) pool->last = p; + pool->first = p; + } + mem = p->base; // this points to the next free block - so take it + p->base = *((void **)mem); // base now points to the next free block + if (!p->base) // move to end - it just filled up + { + if (p->next) + { + if (p->prev) p->prev->next = p->next; + else pool->first = p->next; + p->next->prev = p->prev; + ((Pool *)pool->last)->next = p; + p->prev = pool->last; + p->next = NULL; + pool->last = p; + } + } + p->usage++; + pool->usage++; + return mem; +} +#endif + +void +evas_mempool_free(Evas_Mempool *pool, void *ptr) +#ifdef NOPOOL +{ + free(ptr); +} +#else +{ + Pool *p; + void *pmem; + int item_alloc, psize; + + item_alloc = ((pool->item_size + sizeof(void *) - 1) / sizeof(void *)) * sizeof(void *); + psize = item_alloc * pool->pool_size; + for (p = (Pool *)(pool->first); p; p = p->next) // look 4 pool + { + pmem = (void *)(((unsigned char *)p) + sizeof(Pool)); // pool mem base + if ((ptr >= pmem) && ((unsigned char *)ptr < (((unsigned char *)pmem) + psize))) // is it in pool mem? + { + *((void **)ptr) = p->base; // freed node points to prev free node + p->base = ptr; // next free node is now the one we freed + p->usage--; + pool->usage--; + if (p->usage == 0) // free bucket + { + if (p->prev) p->prev->next = p->next; + if (p->next) p->next->prev = p->prev; + if (pool->last == p) pool->last = p->prev; + if (pool->first == p) pool->first = p->next; + _evas_mp_pool_free(p); + } + else + { + if (p->prev) // if not the first - move to front + { + p->prev->next = p->next; + if (p->next) p->next->prev = p->prev; + if (pool->last == p) pool->last = p->prev; + p->prev = NULL; + p->next = pool->first; + p->next->prev = p; + pool->first = p; + } + } + break; + } + } +} +#endif + +void * +evas_mempool_calloc(Evas_Mempool *pool, int size) +#ifdef NOPOOL +{ + return calloc(1, size); +} +#else +{ + void *mem; + + mem = evas_mempool_malloc(pool, size); + memset(mem, 0, size); + return mem; +} +#endif diff --git a/src/lib/data/evas_mempool.h b/src/lib/data/evas_mempool.h new file mode 100644 index 0000000..b1d5283 --- /dev/null +++ b/src/lib/data/evas_mempool.h @@ -0,0 +1,25 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_MEMPOOL_H +#define _EVAS_MEMPOOL_H + + +typedef struct _Evas_Mempool Evas_Mempool; + +struct _Evas_Mempool +{ + int item_size; + int pool_size; + int usage; + void *first, *last; +}; + + +void *evas_mempool_malloc(Evas_Mempool *pool, int size); +void evas_mempool_free(Evas_Mempool *pool, void *ptr); +void *evas_mempool_calloc(Evas_Mempool *pool, int size); + + +#endif /* _EVAS_MEMPOOL_H */ diff --git a/src/lib/data/evas_object_list.c b/src/lib/data/evas_object_list.c new file mode 100644 index 0000000..d77687c --- /dev/null +++ b/src/lib/data/evas_object_list.c @@ -0,0 +1,164 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "Evas_Data.h" + +/* list ops */ +void * +evas_object_list_append(void *in_list, void *in_item) +{ + Evas_Object_List *l, *new_l; + Evas_Object_List *list; + + list = in_list; + new_l = in_item; + new_l->next = NULL; + if (!list) + { + new_l->prev = NULL; + new_l->last = new_l; + return new_l; + } + if (list->last) l = list->last; + else for (l = list; (l) && (l->next); l = l->next); + l->next = new_l; + new_l->prev = l; + list->last = new_l; + return list; +} + +void * +evas_object_list_prepend(void *in_list, void *in_item) +{ + Evas_Object_List *new_l; + Evas_Object_List *list; + + list = in_list; + new_l = in_item; + new_l->prev = NULL; + if (!list) + { + new_l->next = NULL; + new_l->last = new_l; + return new_l; + } + new_l->next = list; + list->prev = new_l; + new_l->last = list->last; + list->last = NULL; + return new_l; +} + +void * +evas_object_list_append_relative(void *in_list, void *in_item, void *in_relative) +{ + Evas_Object_List *list, *relative, *new_l; + + list = in_list; + new_l = in_item; + relative = in_relative; + if (relative) + { + if (relative->next) + { + new_l->next = relative->next; + relative->next->prev = new_l; + } + else new_l->next = NULL; + relative->next = new_l; + new_l->prev = relative; + if (!new_l->next) list->last = new_l; + return list; + } + return evas_object_list_append(list, new_l); +} + +void * +evas_object_list_prepend_relative(void *in_list, void *in_item, void *in_relative) +{ + Evas_Object_List *list, *relative, *new_l; + + list = in_list; + new_l = in_item; + relative = in_relative; + if (relative) + { + new_l->prev = relative->prev; + new_l->next = relative; + relative->prev = new_l; + if (new_l->prev) + { + new_l->prev->next = new_l; + if (!new_l->next) + list->last = new_l; + return list; + } + else + { + if (!new_l->next) + new_l->last = new_l; + else + { + new_l->last = list->last; + list->last = NULL; + } + return new_l; + } + } + return evas_object_list_prepend(list, new_l); +} + +void * +evas_object_list_remove(void *in_list, void *in_item) +{ + Evas_Object_List *return_l; + Evas_Object_List *list, *item; + + /* checkme */ + if(!in_list) + return in_list; + + list = in_list; + item = in_item; + if (!item) return list; + if (item->next) + item->next->prev = item->prev; + if (item->prev) + { + item->prev->next = item->next; + return_l = list; + } + else + { + return_l = item->next; + if (return_l) + return_l->last = list->last; + } + if (item == list->last) + list->last = item->prev; + item->next = NULL; + item->prev = NULL; + return return_l; +} + +void * +evas_object_list_find(void *in_list, void *in_item) +{ + Evas_Object_List *l; + Evas_Object_List *list, *item; + + list = in_list; + item = in_item; + for (l = list; l; l = l->next) + { + if (l == item) return item; + } + return NULL; +} diff --git a/src/lib/data/evas_stringshare.c b/src/lib/data/evas_stringshare.c new file mode 100644 index 0000000..b05dcdf --- /dev/null +++ b/src/lib/data/evas_stringshare.c @@ -0,0 +1,205 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + + +#include "Evas_Data.h" + +typedef struct _Evas_Stringshare Evas_Stringshare; +typedef struct _Evas_Stringshare_El Evas_Stringshare_El; + +struct _Evas_Stringshare +{ + Evas_Stringshare_El *buckets[1024]; +}; + +struct _Evas_Stringshare_El +{ + Evas_Stringshare_El *next; +// int op; + int references; +}; + +static Evas_Stringshare share = +{ + { + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL + } +}; + +//static int op = 0; +//static FILE *f = NULL; + +static inline int +_evas_stringshare_hash_gen(const char *str, int *len) +{ + unsigned int hash_num = 5381; + const unsigned char *ptr; + + for (ptr = (const unsigned char *)str; *ptr; ptr++) + { + hash_num = (hash_num * 33) ^ *ptr; + } + + hash_num &= 0x3ff; + *len = ptr - (const unsigned char *)str; + return (int)hash_num; +} + +EAPI const char * +evas_stringshare_add(const char *str) +{ + int hash_num, slen; + char *el_str; + Evas_Stringshare_El *el, *pel = NULL; + + if (!str) return NULL; +// if (!f) +// { +// char bf[256]; +// snprintf(bf, sizeof(bf), "strlog-%i", getpid()); +// f = fopen(bf, "w"); +// } + hash_num = _evas_stringshare_hash_gen(str, &slen); + for (el = share.buckets[hash_num]; el; pel = el, el = el->next) + { + el_str = ((char *)el) + sizeof(Evas_Stringshare_El); + if (!strcmp(el_str, str)) + { + if (pel) + { + pel->next = el->next; + el->next = share.buckets[hash_num]; + share.buckets[hash_num] = el; + } + el->references++; +// fprintf(f, "strings[%i] = str->add(strings[%i]);\n", el->op, el->op); +// fflush(f); + return el_str; + } + } + if (!(el = malloc(sizeof(Evas_Stringshare_El) + slen + 1))) return NULL; + el_str = ((char *)el) + sizeof(Evas_Stringshare_El); + strcpy(el_str, str); + el->references = 1; + el->next = share.buckets[hash_num]; + share.buckets[hash_num] = el; +// el->op = op; +// fprintf(f, "strings[%i] = str->add(\"%s\");\n", el->op, el_str); +// fflush(f); +// op++; + return el_str; +} + +EAPI void +evas_stringshare_del(const char *str) +{ + int hash_num, slen; + char *el_str; + Evas_Stringshare_El *el, *pel = NULL; + + if (!str) return; + hash_num = _evas_stringshare_hash_gen(str, &slen); + for (el = share.buckets[hash_num]; el; pel = el, el = el->next) + { + el_str = ((char *)el) + sizeof(Evas_Stringshare_El); + if (el_str == str) + { + el->references--; +// fprintf(f, "str->del(strings[%i]);\n", el->op); +// fflush(f); + if (el->references == 0) + { + if (pel) pel->next = el->next; + else share.buckets[hash_num] = el->next; + free(el); + } + else + { + if (pel) + { + pel->next = el->next; + el->next = share.buckets[hash_num]; + share.buckets[hash_num] = el; + } + } + return; + } + } + printf("EEEK trying to del non-shared stringshare \"%s\"\n", str); + abort(); +} diff --git a/src/lib/engines/.cvsignore b/src/lib/engines/.cvsignore new file mode 100644 index 0000000..3dda729 --- /dev/null +++ b/src/lib/engines/.cvsignore @@ -0,0 +1,2 @@ +Makefile.in +Makefile diff --git a/src/lib/engines/Makefile.am b/src/lib/engines/Makefile.am new file mode 100644 index 0000000..13f48e3 --- /dev/null +++ b/src/lib/engines/Makefile.am @@ -0,0 +1,5 @@ + +MAINTAINERCLEANFILES = Makefile.in + +SUBDIRS = \ +common common_16 diff --git a/src/lib/engines/common/.cvsignore b/src/lib/engines/common/.cvsignore new file mode 100644 index 0000000..306efda --- /dev/null +++ b/src/lib/engines/common/.cvsignore @@ -0,0 +1,6 @@ +Makefile.in +Makefile +.deps +.libs +libevas_engine_common.la +*.lo diff --git a/src/lib/engines/common/Makefile.am b/src/lib/engines/common/Makefile.am new file mode 100644 index 0000000..516caf9 --- /dev/null +++ b/src/lib/engines/common/Makefile.am @@ -0,0 +1,100 @@ + +SUBDIRS = evas_op_add evas_op_blend evas_op_copy evas_op_mask evas_op_mul evas_op_sub + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = -I. \ + -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/lib/include \ + -DPACKAGE_BIN_DIR=\"$(bindir)\" \ + -DPACKAGE_LIB_DIR=\"$(libdir)\" \ + -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ + @FREETYPE_CFLAGS@ @VALGRIND_CFLAGS@ \ + @EET_CFLAGS@ @pthread_cflags@ \ + @WIN32_CFLAGS@ + +noinst_LTLIBRARIES = libevas_engine_common.la +libevas_engine_common_la_SOURCES = \ +evas_op_copy_main_.c \ +evas_op_blend_main_.c \ +evas_op_add_main_.c \ +evas_op_sub_main_.c \ +evas_op_mask_main_.c \ +evas_op_mul_main_.c \ +evas_blend_main.c \ +evas_blit_main.c \ +evas_convert_color.c \ +evas_convert_colorspace.c \ +evas_convert_gry_1.c \ +evas_convert_gry_4.c \ +evas_convert_gry_8.c \ +evas_convert_main.c \ +evas_convert_rgb_16.c \ +evas_convert_rgb_24.c \ +evas_convert_rgb_32.c \ +evas_convert_rgb_8.c \ +evas_convert_yuv.c \ +evas_cpu.c \ +evas_draw_main.c \ +evas_font_draw.c \ +evas_font_load.c \ +evas_font_main.c \ +evas_font_query.c \ +evas_gradient_main.c \ +evas_gradient_linear.c \ +evas_gradient_radial.c \ +evas_gradient_angular.c \ +evas_gradient_rectangular.c \ +evas_gradient_sinusoidal.c \ +evas_image_load.c \ +evas_image_save.c \ +evas_image_main.c \ +evas_image_data.c \ +evas_line_main.c \ +evas_polygon_main.c \ +evas_rectangle_main.c \ +evas_scale_main.c \ +evas_scale_sample.c \ +evas_scale_smooth.c \ +evas_scale_span.c \ +evas_tiler.c \ +evas_regionbuf.c \ +evas_pipe.c + +EXTRA_DIST = \ +evas_blend.h \ +evas_blend_private.h \ +evas_convert_color.h \ +evas_convert_colorspace.h \ +evas_convert_gry_1.h \ +evas_convert_gry_4.h \ +evas_convert_gry_8.h \ +evas_convert_main.h \ +evas_convert_rgb_16.h \ +evas_convert_rgb_24.h \ +evas_convert_rgb_32.h \ +evas_convert_rgb_8.h \ +evas_convert_yuv.h \ +evas_draw.h \ +evas_font.h \ +evas_gradient.h \ +evas_gradient_private.h \ +evas_image.h \ +evas_image_private.h \ +evas_line.h \ +evas_polygon.h \ +evas_rectangle.h \ +evas_scale_main.h \ +evas_scale_smooth.h \ +evas_scale_smooth_scaler.c \ +evas_scale_smooth_scaler_down.c \ +evas_scale_smooth_scaler_downx.c \ +evas_scale_smooth_scaler_downx_downy.c \ +evas_scale_smooth_scaler_downy.c \ +evas_scale_smooth_scaler_noscale.c \ +evas_scale_smooth_scaler_up.c \ +evas_scale_span.h \ +evas_pipe.h + +libevas_engine_common_la_DEPENDENCIES = \ +$(top_builddir)/config.h diff --git a/src/lib/engines/common/evas_blend.h b/src/lib/engines/common/evas_blend.h new file mode 100644 index 0000000..65ed493 --- /dev/null +++ b/src/lib/engines/common/evas_blend.h @@ -0,0 +1,12 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_BLEND_H +#define _EVAS_BLEND_H + + +EAPI void evas_common_blend_init (void); + + +#endif /* _EVAS_BLEND_H */ diff --git a/src/lib/engines/common/evas_blend_main.c b/src/lib/engines/common/evas_blend_main.c new file mode 100644 index 0000000..cd9808a --- /dev/null +++ b/src/lib/engines/common/evas_blend_main.c @@ -0,0 +1,329 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_blend_private.h" + +#if defined BUILD_MMX || defined BUILD_SSE +#include "evas_mmx.h" +#endif + +const DATA32 ALPHA_255 = 255; +const DATA32 ALPHA_256 = 256; + +static void +_composite_span_nothing(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) +{ +} + +static void +_composite_pt_nothing(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) +{ +} + +static RGBA_Gfx_Compositor * +evas_gfx_compositor_get(unsigned char op) +{ + RGBA_Gfx_Compositor *comp; + + switch (op) + { + case _EVAS_RENDER_BLEND: + comp = evas_common_gfx_compositor_blend_get(); + break; + case _EVAS_RENDER_BLEND_REL: + comp = evas_common_gfx_compositor_blend_rel_get(); + break; + case _EVAS_RENDER_COPY: + comp = evas_common_gfx_compositor_copy_get(); + break; + case _EVAS_RENDER_COPY_REL: + comp = evas_common_gfx_compositor_copy_rel_get(); + break; +/* + case _EVAS_RENDER_ADD: + comp = evas_common_gfx_compositor_add_get(); + break; + case _EVAS_RENDER_ADD_REL: + comp = evas_common_gfx_compositor_add_rel_get(); + break; + case _EVAS_RENDER_SUB: + comp = evas_common_gfx_compositor_sub_get(); + break; + case _EVAS_RENDER_SUB_REL: + comp = evas_common_gfx_compositor_sub_rel_get(); + break; +*/ + case _EVAS_RENDER_MASK: + comp = evas_common_gfx_compositor_mask_get(); + break; + case _EVAS_RENDER_MUL: + comp = evas_common_gfx_compositor_mul_get(); + break; + default: + comp = evas_common_gfx_compositor_blend_get(); + break; + } + return comp; +} + +EAPI void +evas_common_blend_init(void) +{ + static int gfx_initialised = 0; + static int mmx = 0; + static int sse = 0; + static int sse2 = 0; + RGBA_Gfx_Compositor *comp; + + if (gfx_initialised) return; + gfx_initialised = 1; + + evas_common_cpu_can_do(&mmx, &sse, &sse2); + + comp = evas_common_gfx_compositor_copy_get(); + if (comp) comp->init(); + comp = evas_common_gfx_compositor_copy_rel_get(); + if (comp) comp->init(); + + comp = evas_common_gfx_compositor_blend_get(); + if (comp) comp->init(); + comp = evas_common_gfx_compositor_blend_rel_get(); + if (comp) comp->init(); + +/* + comp = evas_common_gfx_compositor_add_get(); + if (comp) comp->init(); + comp = evas_common_gfx_compositor_add_rel_get(); + if (comp) comp->init(); + comp = evas_common_gfx_compositor_sub_get(); + if (comp) comp->init(); + comp = evas_common_gfx_compositor_sub_rel_get(); + if (comp) comp->init(); +*/ + comp = evas_common_gfx_compositor_mask_get(); + if (comp) comp->init(); + + comp = evas_common_gfx_compositor_mul_get(); + if (comp) comp->init(); +} + +void +evas_common_blend_shutdown(void) +{ + RGBA_Gfx_Compositor *comp; + + comp = evas_common_gfx_compositor_copy_get(); + if (comp) comp->shutdown(); + comp = evas_common_gfx_compositor_copy_rel_get(); + if (comp) comp->shutdown(); + + comp = evas_common_gfx_compositor_blend_get(); + if (comp) comp->shutdown(); + comp = evas_common_gfx_compositor_blend_rel_get(); + if (comp) comp->shutdown(); + +/* + comp = evas_common_gfx_compositor_add_get(); + if (comp) comp->shutdown(); + comp = evas_common_gfx_compositor_add_rel_get(); + if (comp) comp->shutdown(); + comp = evas_common_gfx_compositor_sub_get(); + if (comp) comp->shutdown(); + comp = evas_common_gfx_compositor_sub_rel_get(); + if (comp) comp->shutdown(); +*/ + comp = evas_common_gfx_compositor_mask_get(); + if (comp) comp->shutdown(); + + comp = evas_common_gfx_compositor_mul_get(); + if (comp) comp->shutdown(); +} + + +RGBA_Gfx_Func +evas_common_gfx_func_composite_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels, int op) +{ + RGBA_Gfx_Compositor *comp; + RGBA_Gfx_Func func = NULL; + + if (src && (!src->cache_entry.flags.alpha)) + { + if (op == _EVAS_RENDER_BLEND) + op = _EVAS_RENDER_COPY; + if (op == _EVAS_RENDER_BLEND_REL) + op = _EVAS_RENDER_COPY_REL; + } + comp = evas_gfx_compositor_get(op); + if (comp) + func = comp->composite_pixel_span_get(src, dst, pixels); + if (func) + return func; + return _composite_span_nothing; +} + +RGBA_Gfx_Func +evas_common_gfx_func_composite_color_span_get(DATA32 col, RGBA_Image *dst, int pixels, int op) +{ + RGBA_Gfx_Compositor *comp; + RGBA_Gfx_Func func = NULL; + + if ((col & 0xff000000) == 0xff000000) + { + if (op == _EVAS_RENDER_BLEND) + op = _EVAS_RENDER_COPY; + if (op == EVAS_RENDER_BLEND_REL) + op = _EVAS_RENDER_COPY_REL; + } + + comp = evas_gfx_compositor_get(op); + if (comp) + func = comp->composite_color_span_get(col, dst, pixels); + if (func) + return func; + return _composite_span_nothing; +} + +RGBA_Gfx_Func +evas_common_gfx_func_composite_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels, int op) +{ + RGBA_Gfx_Compositor *comp; + RGBA_Gfx_Func func = NULL; + + if ((src && (!src->cache_entry.flags.alpha)) && ((col & 0xff000000) == 0xff000000)) + { + if (op == _EVAS_RENDER_BLEND) + op = _EVAS_RENDER_COPY; + if (op == _EVAS_RENDER_BLEND_REL) + op = _EVAS_RENDER_COPY_REL; + } + + comp = evas_gfx_compositor_get(op); + if (comp) + func = comp->composite_pixel_color_span_get(src, col, dst, pixels); + if (func) + return func; + return _composite_span_nothing; +} + +RGBA_Gfx_Func +evas_common_gfx_func_composite_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels, int op) +{ + RGBA_Gfx_Compositor *comp; + RGBA_Gfx_Func func = NULL; + + comp = evas_gfx_compositor_get(op); + if (comp) + func = comp->composite_mask_color_span_get(col, dst, pixels); + if (func) + return func; + return _composite_span_nothing; +} + +RGBA_Gfx_Func +evas_common_gfx_func_composite_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels, int op) +{ + RGBA_Gfx_Compositor *comp; + RGBA_Gfx_Func func = NULL; + + comp = evas_gfx_compositor_get(op); + if (comp) + func = comp->composite_pixel_mask_span_get(src, dst, pixels); + if (func) + return func; + return _composite_span_nothing; +} + +RGBA_Gfx_Pt_Func +evas_common_gfx_func_composite_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst, int op) +{ + RGBA_Gfx_Compositor *comp; + RGBA_Gfx_Pt_Func func = NULL; + + if (!src_flags.alpha) + { + if (op == _EVAS_RENDER_BLEND) + op = _EVAS_RENDER_COPY; + if (op == _EVAS_RENDER_BLEND_REL) + op = _EVAS_RENDER_COPY_REL; + } + comp = evas_gfx_compositor_get(op); + if (comp) + func = comp->composite_pixel_pt_get(src_flags, dst); + if (func) + return func; + return _composite_pt_nothing; +} + +RGBA_Gfx_Pt_Func +evas_common_gfx_func_composite_color_pt_get(DATA32 col, RGBA_Image *dst, int op) +{ + RGBA_Gfx_Compositor *comp; + RGBA_Gfx_Pt_Func func = NULL; + + if ((col & 0xff000000) == 0xff000000) + { + if (op == _EVAS_RENDER_BLEND) + op = _EVAS_RENDER_COPY; + if (op == EVAS_RENDER_BLEND_REL) + op = _EVAS_RENDER_COPY_REL; + } + + comp = evas_gfx_compositor_get(op); + if (comp) + func = comp->composite_color_pt_get(col, dst); + if (func) + return func; + return _composite_pt_nothing; +} + +RGBA_Gfx_Pt_Func +evas_common_gfx_func_composite_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst, int op) +{ + RGBA_Gfx_Compositor *comp; + RGBA_Gfx_Pt_Func func = NULL; + + if ((!src_flags.alpha) && ((col & 0xff000000) == 0xff000000)) + { + if (op == _EVAS_RENDER_BLEND) + op = _EVAS_RENDER_COPY; + if (op == _EVAS_RENDER_BLEND_REL) + op = _EVAS_RENDER_COPY_REL; + } + + comp = evas_gfx_compositor_get(op); + if (comp) + func = comp->composite_pixel_color_pt_get(src_flags, col, dst); + if (func) + return func; + return _composite_pt_nothing; +} + +RGBA_Gfx_Pt_Func +evas_common_gfx_func_composite_mask_color_pt_get(DATA32 col, RGBA_Image *dst, int op) +{ + RGBA_Gfx_Compositor *comp; + RGBA_Gfx_Pt_Func func = NULL; + + comp = evas_gfx_compositor_get(op); + if (comp) + func = comp->composite_mask_color_pt_get(col, dst); + if (func) + return func; + return _composite_pt_nothing; +} + +RGBA_Gfx_Pt_Func +evas_common_gfx_func_composite_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst, int op) +{ + RGBA_Gfx_Compositor *comp; + RGBA_Gfx_Pt_Func func = NULL; + + comp = evas_gfx_compositor_get(op); + if (comp) + func = comp->composite_pixel_mask_pt_get(src_flags, dst); + if (func) + return func; + return _composite_pt_nothing; +} diff --git a/src/lib/engines/common/evas_blend_private.h b/src/lib/engines/common/evas_blend_private.h new file mode 100644 index 0000000..84513d1 --- /dev/null +++ b/src/lib/engines/common/evas_blend_private.h @@ -0,0 +1,35 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_BLEND_PRIVATE_H +#define _EVAS_BLEND_PRIVATE_H + + +RGBA_Gfx_Compositor *evas_common_gfx_compositor_blend_get (void); +RGBA_Gfx_Compositor *evas_common_gfx_compositor_blend_rel_get (void); +RGBA_Gfx_Compositor *evas_common_gfx_compositor_copy_get (void); +RGBA_Gfx_Compositor *evas_common_gfx_compositor_copy_rel_get (void); +RGBA_Gfx_Compositor *evas_common_gfx_compositor_add_get (void); +RGBA_Gfx_Compositor *evas_common_gfx_compositor_add_rel_get (void); +/* +RGBA_Gfx_Compositor *evas_common_gfx_compositor_sub_get(void); +RGBA_Gfx_Compositor *evas_common_gfx_compositor_sub_rel_get(void); +*/ +RGBA_Gfx_Compositor *evas_common_gfx_compositor_mask_get (void); +RGBA_Gfx_Compositor *evas_common_gfx_compositor_mul_get (void); + +RGBA_Gfx_Func evas_common_gfx_func_composite_pixel_span_get (RGBA_Image *src, RGBA_Image *dst, int pixels, int op); +RGBA_Gfx_Func evas_common_gfx_func_composite_color_span_get (DATA32 col, RGBA_Image *dst, int pixels, int op); +RGBA_Gfx_Func evas_common_gfx_func_composite_pixel_color_span_get (RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels, int op); +RGBA_Gfx_Func evas_common_gfx_func_composite_mask_color_span_get (DATA32 col, RGBA_Image *dst, int pixels, int op); +RGBA_Gfx_Func evas_common_gfx_func_composite_pixel_mask_span_get (RGBA_Image *src, RGBA_Image *dst, int pixels, int op); + +RGBA_Gfx_Pt_Func evas_common_gfx_func_composite_pixel_pt_get (Image_Entry_Flags src_flags, RGBA_Image *dst, int op); +RGBA_Gfx_Pt_Func evas_common_gfx_func_composite_color_pt_get (DATA32 col, RGBA_Image *dst, int op); +RGBA_Gfx_Pt_Func evas_common_gfx_func_composite_pixel_color_pt_get (Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst, int op); +RGBA_Gfx_Pt_Func evas_common_gfx_func_composite_mask_color_pt_get (DATA32 col, RGBA_Image *dst, int op); +RGBA_Gfx_Pt_Func evas_common_gfx_func_composite_pixel_mask_pt_get (Image_Entry_Flags src_flags, RGBA_Image *dst, int op); + + +#endif /* _EVAS_BLEND_PRIVATE_H */ diff --git a/src/lib/engines/common/evas_blit_main.c b/src/lib/engines/common/evas_blit_main.c new file mode 100644 index 0000000..e350d79 --- /dev/null +++ b/src/lib/engines/common/evas_blit_main.c @@ -0,0 +1,491 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" + +#if defined BUILD_MMX || defined BUILD_SSE +#include "evas_mmx.h" +#endif + +#define ALIGN_FIX + +static void evas_common_copy_pixels_c (DATA32 *src, DATA32 *dst, int len); +static void evas_common_copy_pixels_mmx (DATA32 *src, DATA32 *dst, int len); +static void evas_common_copy_pixels_mmx2 (DATA32 *src, DATA32 *dst, int len); +static void evas_common_copy_pixels_sse/*NB*/ (DATA32 *src, DATA32 *dst, int len); + +static void evas_common_copy_pixels_rev_c (DATA32 *src, DATA32 *dst, int len); +static void evas_common_copy_pixels_rev_mmx (DATA32 *src, DATA32 *dst, int len); +static void evas_common_copy_pixels_rev_sse/*NB*/ (DATA32 *src, DATA32 *dst, int len); + +static void evas_common_copy_rev_pixels_c (DATA32 *src, DATA32 *dst, int len); + + +EAPI void +evas_common_blit_init(void) +{ +} + +EAPI void +evas_common_blit_rectangle(const RGBA_Image *src, RGBA_Image *dst, int src_x, int src_y, int w, int h, int dst_x, int dst_y) +{ + int y; + Gfx_Func_Copy func; + DATA32 *src_ptr, *dst_ptr; + + /* clip clip clip */ + if (w <= 0) return; + if (src_x + w > src->cache_entry.w) w = src->cache_entry.w - src_x; + if (w <= 0) return; + if (src_x < 0) + { + dst_x -= src_x; + w += src_x; + src_x = 0; + } + if (w <= 0) return; + + if (h <= 0) return; + if (src_y + h > src->cache_entry.h) h = src->cache_entry.h - src_y; + if (h <= 0) return; + if (src_y < 0) + { + dst_y -= src_y; + h += src_y; + src_y = 0; + } + if (h <= 0) return; + + if (w <= 0) return; + if (dst_x + w > dst->cache_entry.w) w = dst->cache_entry.w - dst_x; + if (w <= 0) return; + if (dst_x < 0) + { + src_x -= dst_x; + w += dst_x; + dst_x = 0; + } + if (w <= 0) return; + + if (h <= 0) return; + if (dst_y + h > dst->cache_entry.h) h = dst->cache_entry.h - dst_y; + if (h <= 0) return; + if (dst_y < 0) + { + src_y -= dst_y; + h += dst_y; + dst_y = 0; + } + if (h <= 0) return; + + if (dst == src) + { + /* src after dst - go forward */ + if (((src_y * src->cache_entry.w) + src_x) > ((dst_y * dst->cache_entry.w) + dst_x)) + { + func = evas_common_draw_func_copy_get(w, 0); + for (y = 0; y < h; y++) + { + src_ptr = src->image.data + ((y + src_y) * src->cache_entry.w) + src_x; + dst_ptr = dst->image.data + ((y + dst_y) * dst->cache_entry.w) + dst_x; + func(src_ptr, dst_ptr, w); + } + } + /* reverse */ + else + { + func = evas_common_draw_func_copy_get(w, 1); + for (y = h - 1; y >= 0; y--) + { + src_ptr = src->image.data + ((y + src_y) * src->cache_entry.w) + src_x; + dst_ptr = dst->image.data + ((y + dst_y) * dst->cache_entry.w) + dst_x; + func(src_ptr, dst_ptr, w); + } + } + } + else + { + func = evas_common_draw_func_copy_get(w, 0); + for (y = 0; y < h; y++) + { + src_ptr = src->image.data + ((y + src_y) * src->cache_entry.w) + src_x; + dst_ptr = dst->image.data + ((y + dst_y) * dst->cache_entry.w) + dst_x; + func(src_ptr, dst_ptr, w); + } + } +} + + +/****************************************************************************/ + +static void +evas_common_copy_rev_pixels_c(DATA32 *src, DATA32 *dst, int len) +{ + DATA32 *dst_end = dst + len; + + src += len - 1; + while (dst < dst_end) + *dst++ = *src--; +} + +#ifdef BUILD_C +static void +evas_common_copy_pixels_c(DATA32 *src, DATA32 *dst, int len) +{ + DATA32 *dst_end = dst + len; + + while (dst < dst_end) + *dst++ = *src++; +} +#endif + +#ifdef BUILD_MMX +static void +evas_common_copy_pixels_mmx(DATA32 *src, DATA32 *dst, int len) +{ + DATA32 *dst_end, *dst_end_pre; +#ifdef ALIGN_FIX + intptr_t src_align; + intptr_t dst_align; + + src_align = (intptr_t)src & 0x3f; /* 64 byte alignment */ + dst_align = (intptr_t)dst & 0x3f; /* 64 byte alignment */ + + if ((src_align != dst_align) || + ((src_align & 0x3) != 0)) + { +#ifdef BUILD_C + evas_common_copy_pixels_c(src, dst, len); + return; + } +#endif + + while ((src_align > 0) && (len > 0)) + { + *dst++ = *src++; + len--; + src_align -= sizeof(DATA32); + } +#endif /* ALIGN_FIX */ + + dst_end = dst + len; + dst_end_pre = dst + ((len / 16) * 16); + + while (dst < dst_end_pre) + { + MOVE_16DWORDS_MMX(src, dst); + src += 16; + dst += 16; + } + while (dst < dst_end) + *dst++ = *src++; +} +#endif + +#ifdef BUILD_MMX +static void +evas_common_copy_pixels_mmx2(DATA32 *src, DATA32 *dst, int len) +{ + DATA32 *dst_end, *dst_end_pre; +#ifdef ALIGN_FIX + intptr_t src_align; + intptr_t dst_align; + + src_align = (intptr_t)src & 0x3f; /* 64 byte alignment */ + dst_align = (intptr_t)dst & 0x3f; /* 64 byte alignment */ + + if ((src_align != dst_align) || + ((src_align & 0x3) != 0)) + { +#ifdef BUILD_C + evas_common_copy_pixels_c(src, dst, len); +#endif + return; + } + + while ((src_align > 0) && (len > 0)) + { + *dst++ = *src++; + len--; + src_align -= sizeof(DATA32); + } +#endif + + dst_end = dst + len; + dst_end_pre = dst + ((len / 16) * 16); + + while (dst < dst_end_pre) + { + MOVE_16DWORDS_MMX(src, dst); + src += 16; + dst += 16; + } + while (dst < dst_end) + *dst++ = *src++; +} +#endif + +#ifdef BUILD_SSE +static void +evas_common_copy_pixels_sse(DATA32 *src, DATA32 *dst, int len) +{ + DATA32 *src_ptr, *dst_ptr, *dst_end_ptr; + + dst_end_ptr = dst + len; + dst_end_ptr -= 15; + src_ptr = src; + dst_ptr = dst; + while (dst_ptr < dst_end_ptr) + { + MOVE_16DWORDS_MMX2(src_ptr, dst_ptr); + src_ptr+=16; + dst_ptr+=16; + } + dst_end_ptr = dst + len; + while (dst_ptr < dst_end_ptr) + { + *dst_ptr = *src_ptr; + src_ptr++; + dst_ptr++; + } +#if 0 +#ifdef ALIGN_FIX + int src_align; + int dst_align; + + src_align = (int)src & 0x3f; /* 64 byte alignment */ + dst_align = (int)dst & 0x3f; /* 64 byte alignment */ + + if ((src_align != dst_align) || + ((src_align & 0x3) != 0)) + { +#ifdef BUILD_C + evas_common_copy_pixels_c(src, dst, len); +#endif + return; + } + + while ((src_align > 0) && (len > 0)) + { + *dst = *src; + dst++; + src++; + len--; + src_align -= sizeof(DATA32); + } +#endif /* ALIGN_FIX */ + + src_ptr = src; + dst_ptr = dst; + dst_end_ptr = dst + len; + dst_end_ptr_pre = dst + ((len / 16) * 16); + + while (dst_ptr < dst_end_ptr_pre) + { + prefetch(&src_ptr[16]); + MOVE_16DWORDS_MMX(src_ptr, dst_ptr); + src_ptr+=16; + dst_ptr+=16; + } + while (dst_ptr < dst_end_ptr) + { + *dst_ptr = *src_ptr; + src_ptr++; + dst_ptr++; + } +#endif +} +#endif + +/****************************************************************************/ + +#ifdef BUILD_C +static void +evas_common_copy_pixels_rev_c(DATA32 *src, DATA32 *dst, int len) +{ + DATA32 *dst_end; + + src = src + len - 1; + dst_end = dst - 1; + dst = dst + len - 1; + + while (dst > dst_end) + *dst-- = *src--; +} +#endif + +#ifdef BUILD_MMX +static void +evas_common_copy_pixels_rev_mmx(DATA32 *src, DATA32 *dst, int len) +{ + DATA32 *dst_end, *dst_end_pre; + + if (len >= 16) + { + src = src + len - 16; + dst_end = dst; + dst_end_pre = dst + len - ((len / 16) * 16); + dst = dst + len - 16; + + while (dst >= dst_end_pre) + { + MOVE_16DWORDS_MMX(src, dst); + src -= 16; + dst -= 16; + } + src += 15; + dst += 15; + while (dst >= dst_end) + *dst-- = *src--; + } + else + { + src = src + len - 1; + dst_end = dst - 1; + dst = dst + len - 1; + while (dst > dst_end) + *dst-- = *src--; + } +} +#endif + +#ifdef BUILD_SSE +static void +evas_common_copy_pixels_rev_sse(DATA32 *src, DATA32 *dst, int len) +{ + DATA32 *src_ptr, *dst_ptr, *dst_end_ptr, *dst_end_ptr_pre; + + src_ptr = src + len - 16; + dst_ptr = dst + len - 16; + dst_end_ptr = dst; + dst_end_ptr_pre = dst + len - ((len / 16) * 16); + + if (len >= 16) + { + while (dst_ptr >= dst_end_ptr_pre) + { + prefetch(&src_ptr[-16]); + MOVE_10DWORDS_MMX(src_ptr, dst_ptr); + src_ptr -= 16; + dst_ptr -= 16; + } + src_ptr += 15; + dst_ptr += 15; + while (dst_ptr >= dst_end_ptr) + { + *dst_ptr = *src_ptr; + src_ptr--; + dst_ptr--; + } + } + else + { + src_ptr = src + len - 1; + dst_ptr = dst + len - 1; + while (dst_ptr >= dst_end_ptr) + { + *dst_ptr = *src_ptr; + src_ptr--; + dst_ptr--; + } + } +} +#endif + + +Gfx_Func_Copy +evas_common_draw_func_copy_get(int pixels, int reverse) +{ + if (reverse == -1) + return evas_common_copy_rev_pixels_c; + if (reverse) + { +#ifdef BUILD_SSE + if (evas_common_cpu_has_feature(CPU_FEATURE_SSE) && (pixels > 256 * 256)) + return evas_common_copy_pixels_rev_sse; +#endif +#ifdef BUILD_MMX +# ifdef BUILD_SSE + else +# endif + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + return evas_common_copy_pixels_rev_mmx; +#endif +#ifdef BUILD_C +# ifdef BUILD_MMX + else +# endif + return evas_common_copy_pixels_rev_c; +#endif + } + else + { +#if 1 + +# ifdef BUILD_MMX +# ifdef BUILD_C + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX2)) +# endif + return evas_common_copy_pixels_mmx2; +# ifdef BUILD_SSE + else +# endif +#endif +#ifdef BUILD_SSE +# ifdef BUILD_C + if (evas_common_cpu_has_feature(CPU_FEATURE_SSE) && (pixels > 64 * 64)) +# endif + return evas_common_copy_pixels_sse; +# ifdef BUILD_MMX + else +# endif +#endif +#ifdef BUILD_MMX +# ifdef BUILD_C + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) +# endif + return evas_common_copy_pixels_mmx; +# ifdef BUILD_C + else +# endif +#endif +#ifdef BUILD_C + return evas_common_copy_pixels_c; +#endif + +#else + +# ifdef BUILD_SSE + if (evas_common_cpu_has_feature(CPU_FEATURE_SSE) && (pixels > 256 * 256)) + return evas_common_copy_pixels_sse; +# ifdef BUILD_MMX + else +# endif +#endif +#ifdef BUILD_MMX +# ifdef BUILD_C + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX2)) +# endif + return evas_common_copy_pixels_mmx2; +# ifdef BUILD_C + else if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) +# endif + return evas_common_copy_pixels_mmx; +# ifdef BUILD_C + else +# endif +#endif +#ifdef BUILD_C + return evas_common_copy_pixels_c; +#endif + +#endif + } +#ifdef BUILD_C + return evas_common_copy_pixels_c; +#else + return NULL; +#endif + pixels = 0; +} diff --git a/src/lib/engines/common/evas_convert_color.c b/src/lib/engines/common/evas_convert_color.c new file mode 100644 index 0000000..3d75685 --- /dev/null +++ b/src/lib/engines/common/evas_convert_color.c @@ -0,0 +1,244 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_convert_color.h" + + +EAPI void +evas_common_convert_argb_premul(DATA32 *data, unsigned int len) +{ + DATA32 *de = data + len; + + while (data < de) + { + DATA32 a = 1 + (*data >> 24); + + *data = (*data & 0xff000000) + + (((((*data) >> 8) & 0xff) * a) & 0xff00) + + (((((*data) & 0x00ff00ff) * a) >> 8) & 0x00ff00ff); + data++; + } +} + +EAPI void +evas_common_convert_argb_unpremul(DATA32 *data, unsigned int len) +{ + DATA32 *de = data + len; + + while (data < de) + { + DATA32 a = (*data >> 24); + + if ((a > 0) && (a < 255)) + *data = ARGB_JOIN(a, + (R_VAL(data) * 255) / a, + (G_VAL(data) * 255) / a, + (B_VAL(data) * 255) / a); + data++; + } + +} + +EAPI void +evas_common_convert_color_argb_premul(int a, int *r, int *g, int *b) +{ + a++; + if (r) { *r = (a * *r) >> 8; } + if (g) { *g = (a * *g) >> 8; } + if (b) { *b = (a * *b) >> 8; } +} + +EAPI void +evas_common_convert_color_argb_unpremul(int a, int *r, int *g, int *b) +{ + if (!a) return; + if (r) { *r = (255 * *r) / a; } + if (g) { *g = (255 * *g) / a; } + if (b) { *b = (255 * *b) / a; } +} + +EAPI void +evas_common_convert_color_hsv_to_rgb(float h, float s, float v, int *r, int *g, int *b) +{ + int i; + float f; + + v *= 255; + if (s == 0) + { + if (r) *r = v; + if (g) *g = v; + if (b) *b = v; + return; + } + + h /= 60; + i = h; + f = h - i; + + s *= v; + f *= s; + s = v - s; + + switch (i) + { + case 1: + if (r) *r = v - f; if (g) *g = v; if (b) *b = s; + return; + case 2: + if (r) *r = s; if (g) *g = v; if (b) *b = s + f; + return; + case 3: + if (r) *r = s; if (g) *g = v - f; if (b) *b = v; + return; + case 4: + if (r) *r = s + f; if (g) *g = s; if (b) *b = v; + return; + case 5: + if (r) *r = v; if (g) *g = s; if (b) *b = v - f; + return; + default: + if (r) *r = v; if (g) *g = s + f; if (b) *b = s; + break; + } +} + +EAPI void +evas_common_convert_color_rgb_to_hsv(int r, int g, int b, float *h, float *s, float *v) +{ + int max, min, d = r - g; + + //set min to MIN(g,r) + d = (d & (~(d >> 8))); + min = r - d; + //set max to MAX(g,r) + max = g + d; + + //set min to MIN(b,min) + d = min - b; + min -= (d & (~(d >> 8))); + + //set max to MAX(max,b) + d = b - max; + max += (d & (~(d >> 8))); + + d = max - min; + + if (v) *v = (max / 255.0); + if (!max) + { + if (s) *s = 0; + if (h) *h = 0; + return; + } + + if (s) *s = (d / (float)max); + if (r == max) + { + if (h) + { + *h = 60 * ((g - b) / (float)d); + if (*h < 0) *h += 360; + } + return; + } + if (g == max) + { + if (h) + { + *h = 120 + (60 * ((b - r) / (float)d)); + if (*h < 0) *h += 360; + } + return; + } + if (h) + { + *h = 240 + (60 * ((r - g) / (float)d)); + if (*h < 0) *h += 360; + } +} + +EAPI void +evas_common_convert_color_hsv_to_rgb_int(int h, int s, int v, int *r, int *g, int *b) +{ + int i, f; + + if (!s) + { + *r = *g = *b = v; + return; + } + + i = h / 255; + f = h - (i * 255); + s = (v * s) / 255; + f = (s * f) / 255; + s = v - s; + + switch (i) + { + case 1: + *r = v - f; *g = v; *b = s; + return; + case 2: + *r = s; *g = v; *b = s + f; + return; + case 3: + *r = s; *g = v - f; *b = v; + return; + case 4: + *r = s + f; *g = s; *b = v; + return; + case 5: + *r = v; *g = s; *b = v - f; + return; + default: + *r = v; *g = s + f; *b = s; + break; + } +} + +EAPI void +evas_common_convert_color_rgb_to_hsv_int(int r, int g, int b, int *h, int *s, int *v) +{ + int min, max, d = r - g; + + d = (d & (~(d >> 8))); + min = r - d; + max = g + d; + + d = min - b; + min -= (d & (~(d >> 8))); + + d = b - max; + max += (d & (~(d >> 8))); + + d = max - min; + + *v = max; + if (!max) + { + *s = *h = 0; + return; + } + + *s = ((d * 255) / max); + + if (r == max) + { + *h = (((g - b) * 255) / d); + if (*h < 0) *h += 1530; + return; + } + if (g == max) + { + *h = 510 + (((b - r) * 255) / d); + if (*h < 0) *h += 1530; + return; + } + *h = 1020 + (((r - g) * 255) / d); + if (*h < 0) *h += 1530; + +} diff --git a/src/lib/engines/common/evas_convert_color.h b/src/lib/engines/common/evas_convert_color.h new file mode 100644 index 0000000..81cb8c0 --- /dev/null +++ b/src/lib/engines/common/evas_convert_color.h @@ -0,0 +1,20 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_CONVERT_COLOR_H +#define _EVAS_CONVERT_COLOR_H + + +EAPI void evas_common_convert_argb_premul (DATA32 *src, unsigned int len); +EAPI void evas_common_convert_argb_unpremul (DATA32 *src, unsigned int len); +EAPI void evas_common_convert_color_argb_premul (int a, int *r, int *g, int *b); +EAPI void evas_common_convert_color_argb_unpremul (int a, int *r, int *g, int *b); + +EAPI void evas_common_convert_color_hsv_to_rgb (float h, float s, float v, int *r, int *g, int *b); +EAPI void evas_common_convert_color_rgb_to_hsv (int r, int g, int b, float *h, float *s, float *v); +EAPI void evas_common_convert_color_hsv_to_rgb_int (int h, int s, int v, int *r, int *g, int *b); +EAPI void evas_common_convert_color_rgb_to_hsv_int (int r, int g, int b, int *h, int *s, int *v); + + +#endif /* _EVAS_CONVERT_COLOR_H */ diff --git a/src/lib/engines/common/evas_convert_colorspace.c b/src/lib/engines/common/evas_convert_colorspace.c new file mode 100644 index 0000000..5cfa501 --- /dev/null +++ b/src/lib/engines/common/evas_convert_colorspace.c @@ -0,0 +1,74 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_convert_colorspace.h" + +#define CONVERT_RGB_565_TO_RGB_888(s) \ + (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \ + ((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \ + ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000))) + +#define CONVERT_A5P_TO_A8(s) \ + ((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) + +static inline void * +evas_common_convert_argb8888_to_rgb565_a5p(void *data, int w, int h, int stride, Evas_Bool has_alpha) +{ + return NULL; +} + +static inline void * +evas_common_convert_rgb565_a5p_to_argb8888(void *data, int w, int h, int stride, Evas_Bool has_alpha) +{ + DATA16 *src, *end; + DATA32 *ret, *dst; + + src = data; + end = src + (stride * h); + ret = malloc(w * h * sizeof(DATA32)); + + dst = ret; + if (has_alpha) + { + DATA8 *alpha; + + alpha = end; + for (; src < end; src++, alpha++, dst++) + *dst = (CONVERT_A5P_TO_A8(*alpha) << 24) | + CONVERT_RGB_565_TO_RGB_888(*src); + } + else + { + for (; src < end; src++, dst++) + *dst = CONVERT_RGB_565_TO_RGB_888(*src); + } + return ret; +} + +EAPI void * +evas_common_convert_argb8888_to(void *data, int w, int h, int stride, Evas_Bool has_alpha, Evas_Colorspace cspace) +{ + switch (cspace) + { + case EVAS_COLORSPACE_RGB565_A5P: + return evas_common_convert_argb8888_to_rgb565_a5p(data, w, h, stride, has_alpha); + default: + break; + } + return NULL; +} + +EAPI void * +evas_common_convert_rgb565_a5p_to(void *data, int w, int h, int stride, Evas_Bool has_alpha, Evas_Colorspace cspace) +{ + switch (cspace) + { + case EVAS_COLORSPACE_ARGB8888: + return evas_common_convert_rgb565_a5p_to_argb8888(data, w, h, stride, has_alpha); + default: + break; + } + return NULL; +} diff --git a/src/lib/engines/common/evas_convert_colorspace.h b/src/lib/engines/common/evas_convert_colorspace.h new file mode 100644 index 0000000..9630110 --- /dev/null +++ b/src/lib/engines/common/evas_convert_colorspace.h @@ -0,0 +1,13 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_CONVERT_COLORSPACE_H +#define _EVAS_CONVERT_COLORSPACE_H + + +EAPI void *evas_common_convert_argb8888_to (void *data, int w, int h, int stride, Evas_Bool has_alpha, Evas_Colorspace cspace); +EAPI void *evas_common_convert_rgb565_a5p_to (void *data, int w, int h, int stride, Evas_Bool has_alpha, Evas_Colorspace cspace); + + +#endif /* _EVAS_CONVERT_COLORSPACE_H */ diff --git a/src/lib/engines/common/evas_convert_gry_1.c b/src/lib/engines/common/evas_convert_gry_1.c new file mode 100644 index 0000000..3f9b5f2 --- /dev/null +++ b/src/lib/engines/common/evas_convert_gry_1.c @@ -0,0 +1,10 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_convert_gry_1.h" + +#ifdef BUILD_CONVERT_1_GRY_1 +void evas_common_convert_rgba_to_1bpp_gry_1_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal){} +#endif diff --git a/src/lib/engines/common/evas_convert_gry_1.h b/src/lib/engines/common/evas_convert_gry_1.h new file mode 100644 index 0000000..81c99f6 --- /dev/null +++ b/src/lib/engines/common/evas_convert_gry_1.h @@ -0,0 +1,13 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_CONVERT_GRY_1_H +#define _EVAS_CONVERT_GRY_1_H + + +void evas_common_convert_rgba_to_1bpp_gry_1_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); + + + +#endif /* _EVAS_CONVERT_GRY_1_H */ diff --git a/src/lib/engines/common/evas_convert_gry_4.c b/src/lib/engines/common/evas_convert_gry_4.c new file mode 100644 index 0000000..a633f28 --- /dev/null +++ b/src/lib/engines/common/evas_convert_gry_4.c @@ -0,0 +1,14 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_convert_gry_4.h" + +#ifdef BUILD_CONVERT_4_GRY_4 +void evas_common_convert_rgba_to_4bpp_gry_4_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal){} +#endif + +#ifdef BUILD_CONVERT_4_GRY_1 +void evas_common_convert_rgba_to_4bpp_gry_1_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal){} +#endif diff --git a/src/lib/engines/common/evas_convert_gry_4.h b/src/lib/engines/common/evas_convert_gry_4.h new file mode 100644 index 0000000..fc7b0a7 --- /dev/null +++ b/src/lib/engines/common/evas_convert_gry_4.h @@ -0,0 +1,13 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_CONVERT_GRY_4_H +#define _EVAS_CONVERT_GRY_4_H + + +void evas_common_convert_rgba_to_4bpp_gry_4_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_4bpp_gry_1_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); + + +#endif /* _EVAS_CONVERT_GRY_4_H */ diff --git a/src/lib/engines/common/evas_convert_gry_8.c b/src/lib/engines/common/evas_convert_gry_8.c new file mode 100644 index 0000000..a547114 --- /dev/null +++ b/src/lib/engines/common/evas_convert_gry_8.c @@ -0,0 +1,26 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_convert_gry_8.h" + +#ifdef BUILD_CONVERT_8_GRY_1 +void evas_common_convert_rgba_to_8bpp_gry_256_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal){} +#endif + +#ifdef BUILD_CONVERT_8_GRY_4 +void evas_common_convert_rgba_to_8bpp_gry_64_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal){} +#endif + +#ifdef BUILD_CONVERT_8_GRY_16 +void evas_common_convert_rgba_to_8bpp_gry_16_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal){} +#endif + +#ifdef BUILD_CONVERT_8_GRY_64 +void evas_common_convert_rgba_to_8bpp_gry_4_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal){} +#endif + +#ifdef BUILD_CONVERT_8_GRY_256 +void evas_common_convert_rgba_to_8bpp_gry_1_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal){} +#endif diff --git a/src/lib/engines/common/evas_convert_gry_8.h b/src/lib/engines/common/evas_convert_gry_8.h new file mode 100644 index 0000000..9e393cb --- /dev/null +++ b/src/lib/engines/common/evas_convert_gry_8.h @@ -0,0 +1,16 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_CONVERT_GRY_8_H +#define _EVAS_CONVERT_GRY_8_H + + +void evas_common_convert_rgba_to_8bpp_gry_256_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_8bpp_gry_64_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_8bpp_gry_16_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_8bpp_gry_4_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_8bpp_gry_1_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); + + +#endif /* _EVAS_CONVERT_GRY_8_H */ diff --git a/src/lib/engines/common/evas_convert_main.c b/src/lib/engines/common/evas_convert_main.c new file mode 100644 index 0000000..2a98b4c --- /dev/null +++ b/src/lib/engines/common/evas_convert_main.c @@ -0,0 +1,604 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_convert_rgb_8.h" +#include "evas_convert_rgb_16.h" +#include "evas_convert_rgb_24.h" +#include "evas_convert_rgb_32.h" +#include "evas_convert_yuv.h" + +#ifdef USE_DITHER_44 +const DATA8 _evas_dither_44[4][4] = +{ + { 0, 8, 2, 10}, + {12, 4, 14, 6}, + { 3, 11, 1, 9}, + {15, 7, 13, 5} +}; +#endif + +#ifdef USE_DITHER_128128 +const DATA8 _evas_dither_128128[128][128] = +{ + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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, 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 } +}; +#endif + +EAPI void +evas_common_convert_init(void) +{ +} + +EAPI Gfx_Func_Convert +evas_common_convert_func_get(DATA8 *dest, int w, int h, int depth, DATA32 rmask, DATA32 gmask, DATA32 bmask, Convert_Pal_Mode pal_mode, int rotation) +{ + if ((rmask == 0) && (gmask == 0) && (bmask == 0)) + { + if (depth == 8) + { +#ifdef BUILD_CONVERT_8_RGB_332 + if (pal_mode == PAL_MODE_RGB332) + return evas_common_convert_rgba_to_8bpp_rgb_332_dith; +#endif +#ifdef BUILD_CONVERT_8_RGB_666 + if (pal_mode == PAL_MODE_RGB666) + return evas_common_convert_rgba_to_8bpp_rgb_666_dith; +#endif +#ifdef BUILD_CONVERT_8_RGB_232 + if (pal_mode == PAL_MODE_RGB232) + return evas_common_convert_rgba_to_8bpp_rgb_232_dith; +#endif +#ifdef BUILD_CONVERT_8_RGB_222 + if (pal_mode == PAL_MODE_RGB222) + return evas_common_convert_rgba_to_8bpp_rgb_222_dith; +#endif +#ifdef BUILD_CONVERT_8_RGB_221 + if (pal_mode == PAL_MODE_RGB221) + return evas_common_convert_rgba_to_8bpp_rgb_221_dith; +#endif +#ifdef BUILD_CONVERT_8_RGB_121 + if (pal_mode == PAL_MODE_RGB121) + return evas_common_convert_rgba_to_8bpp_rgb_121_dith; +#endif +#ifdef BUILD_CONVERT_8_RGB_111 + if (pal_mode == PAL_MODE_RGB111) + return evas_common_convert_rgba_to_8bpp_rgb_111_dith; +#endif + } + if (depth == 1) + { + } + if (depth == 4) + { + } + } + else + { + if (depth == 16) + { +#ifdef BUILD_CONVERT_16_RGB_565 + if ((rmask == 0x0000f800) && (gmask == 0x000007e0) && (bmask == 0x0000001f)) + { +#ifdef BUILD_CONVERT_16_RGB_ROT0 + if (rotation == 0) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_565_dith; + else + return evas_common_convert_rgba_to_16bpp_rgb_565_dith; + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT180 + if (rotation == 180) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_180; + else + return evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_180; + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT270 + if (rotation == 270) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_270; + else + return evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_270; + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT90 + if (rotation == 90) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_90; + else + return evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_90; + } +#endif + } +#endif +#ifdef BUILD_CONVERT_16_BGR_565 + if ((rmask == 0x0000001f) && (gmask == 0x000007e0) && (bmask == 0x0000f800)) + { +#ifdef BUILD_CONVERT_16_RGB_ROT0 + if (rotation == 0) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_bgr_565_dith; + else + return evas_common_convert_rgba_to_16bpp_bgr_565_dith; + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT180 + if (rotation == 180) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_180; + else + return evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_180; + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT270 + if (rotation == 270) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_270; + else + return evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_270; + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT90 + if (rotation == 90) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_90; + else + return evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_90; + } +#endif + } +#endif +#ifdef BUILD_CONVERT_16_RGB_555 + if ((rmask == 0x00007c00) && (gmask == 0x000003e0) && (bmask == 0x0000001f)) + { +#ifdef BUILD_CONVERT_16_RGB_ROT0 + if (rotation == 0) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_555_dith; + else + return evas_common_convert_rgba_to_16bpp_rgb_555_dith; + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT180 + if (rotation == 180) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_180; + else + return evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_180; + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT270 + if (rotation == 270) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_270; + else + return evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_270; + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT90 + if (rotation == 90) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_90; + else + return evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_90; + } +#endif + } +#endif +#ifdef BUILD_CONVERT_16_RGB_444 + if ((rmask == 0x00000f00) && (gmask == 0x000000f0) && (bmask == 0x0000000f)) + { +#ifdef BUILD_CONVERT_16_RGB_ROT0 + if (rotation == 0) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_444_dith; + else + return evas_common_convert_rgba_to_16bpp_rgb_444_dith; + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT180 + if (rotation == 180) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_180; + else + return evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_180; + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT270 + if (rotation == 270) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_270; + else + return evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_270; + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT90 + if (rotation == 90) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_90; + else + return evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_90; + } +#endif + } +#endif +#ifdef BUILD_CONVERT_16_RGB_454645 + if ((rmask == 0x0000f000) && (gmask == 0x00000780) && (bmask == 0x0000001e)) + { +#ifdef BUILD_CONVERT_16_RGB_ROT0 + if (rotation == 0) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_454645_dith; + else + return evas_common_convert_rgba_to_16bpp_rgb_454645_dith; + + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT180 + if (rotation == 180) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_180; + else + return evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_180; + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT270 + if (rotation == 270) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_270; + else + return evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_270; + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT90 + if (rotation == 270) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_90; + else + return evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_90; + } +#endif + } +#endif +#ifdef BUILD_CONVERT_16_RGB_454645 + if ((rmask == 0x0000f800) && (gmask == 0x000007e0) && (bmask == 0x0000001f)) + { +#ifdef BUILD_CONVERT_16_RGB_ROT0 + if (rotation == 0) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_454645_dith; + else + return evas_common_convert_rgba_to_16bpp_rgb_454645_dith; + + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT180 + if (rotation == 180) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_180; + else + return evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_180; + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT270 + if (rotation == 270) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_270; + else + return evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_270; + } +#endif +#ifdef BUILD_CONVERT_16_RGB_ROT90 + if (rotation == 90) + { + if ((!(w & 0x1)) && (!((intptr_t)dest & 0x3))) + return evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_90; + else + return evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_90; + } +#endif + } +#endif + } + if (depth == 32) + { +#ifdef BUILD_CONVERT_32_RGB_8888 + if ((rmask == 0x00ff0000) && (gmask == 0x0000ff00) && (bmask == 0x000000ff)) + { +#ifdef BUILD_CONVERT_32_RGB_ROT0 + if (rotation == 0) + return evas_common_convert_rgba_to_32bpp_rgb_8888; +#endif +#ifdef BUILD_CONVERT_32_RGB_ROT180 + if (rotation == 180) + return evas_common_convert_rgba_to_32bpp_rgb_8888_rot_180; +#endif +#ifdef BUILD_CONVERT_32_RGB_ROT270 + if (rotation == 270) + return evas_common_convert_rgba_to_32bpp_rgb_8888_rot_270; +#endif +#ifdef BUILD_CONVERT_32_RGB_ROT90 + if (rotation == 90) + return evas_common_convert_rgba_to_32bpp_rgb_8888_rot_90; +#endif + } +#endif +#ifdef BUILD_CONVERT_32_RGBX_8888 + if ((rmask == 0xff000000) && (gmask == 0x00ff0000) && (bmask == 0x0000ff00)) + { +#ifdef BUILD_CONVERT_32_RGB_ROT0 + if (rotation == 0) + return evas_common_convert_rgba_to_32bpp_rgbx_8888; +#endif +#ifdef BUILD_CONVERT_32_RGB_ROT180 + if (rotation == 180) + return evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_180; +#endif +#ifdef BUILD_CONVERT_32_RGB_ROT270 + if (rotation == 270) + return evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_270; +#endif +#ifdef BUILD_CONVERT_32_RGB_ROT90 + if (rotation == 90) + return evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_90; +#endif + } +#endif +#ifdef BUILD_CONVERT_32_BGR_8888 + if ((rmask == 0x000000ff) && (gmask == 0x0000ff00) && (bmask == 0x00ff0000)) + { +#ifdef BUILD_CONVERT_32_RGB_ROT0 + if (rotation == 0) + return evas_common_convert_rgba_to_32bpp_bgr_8888; +#endif +#ifdef BUILD_CONVERT_32_RGB_ROT180 + if (rotation == 180) + return evas_common_convert_rgba_to_32bpp_bgr_8888_rot_180; +#endif +#ifdef BUILD_CONVERT_32_RGB_ROT270 + if (rotation == 270) + return evas_common_convert_rgba_to_32bpp_bgr_8888_rot_270; +#endif +#ifdef BUILD_CONVERT_32_RGB_ROT90 + if (rotation == 90) + return evas_common_convert_rgba_to_32bpp_bgr_8888_rot_90; +#endif + } +#endif +#ifdef BUILD_CONVERT_32_BGRX_8888 + if ((rmask == 0x0000ff00) && (gmask == 0x00ff0000) && (bmask == 0xff000000)) + { +#ifdef BUILD_CONVERT_32_RGB_ROT0 + if (rotation == 0) + return evas_common_convert_rgba_to_32bpp_bgrx_8888; +#endif +#ifdef BUILD_CONVERT_32_RGB_ROT180 + if (rotation == 180) + return evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_180; +#endif +#ifdef BUILD_CONVERT_32_RGB_ROT270 + if (rotation == 270) + return evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_270; +#endif +#ifdef BUILD_CONVERT_32_RGB_ROT90 + if (rotation == 90) + return evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_90; +#endif + } +#endif + } + if (depth == 24) + { +#ifdef BUILD_CONVERT_24_RGB_888 + if ((rmask == 0x00ff0000) && (gmask == 0x0000ff00) && (bmask == 0x000000ff)) + { + if (rotation == 0) + return evas_common_convert_rgba_to_24bpp_rgb_888; + } +#endif +#ifdef BUILD_CONVERT_24_BGR_888 + if ((rmask == 0x000000ff) && (gmask == 0x0000ff00) && (bmask == 0x00ff0000)) + { + if (rotation == 0) + return evas_common_convert_rgba_to_24bpp_bgr_888; + } +#endif + } + printf("depth = %i mode = %i\n", depth, pal_mode); + if (depth == 8) + { +#ifdef BUILD_CONVERT_8_RGB_332 + if (pal_mode == PAL_MODE_RGB332) + return evas_common_convert_rgba_to_8bpp_rgb_332_dith; +#endif +#ifdef BUILD_CONVERT_8_RGB_666 + if (pal_mode == PAL_MODE_RGB666) + return evas_common_convert_rgba_to_8bpp_rgb_666_dith; +#endif +#ifdef BUILD_CONVERT_8_RGB_232 + if (pal_mode == PAL_MODE_RGB232) + return evas_common_convert_rgba_to_8bpp_rgb_232_dith; +#endif +#ifdef BUILD_CONVERT_8_RGB_222 + if (pal_mode == PAL_MODE_RGB222) + return evas_common_convert_rgba_to_8bpp_rgb_222_dith; +#endif +#ifdef BUILD_CONVERT_8_RGB_221 + if (pal_mode == PAL_MODE_RGB221) + return evas_common_convert_rgba_to_8bpp_rgb_221_dith; +#endif +#ifdef BUILD_CONVERT_8_RGB_121 + if (pal_mode == PAL_MODE_RGB121) + return evas_common_convert_rgba_to_8bpp_rgb_121_dith; +#endif +#ifdef BUILD_CONVERT_8_RGB_111 + if (pal_mode == PAL_MODE_RGB111) + return evas_common_convert_rgba_to_8bpp_rgb_111_dith; +#endif + } + if (depth == 1) + { + } + if (depth == 4) + { + } + } + /* no optimised converter for this... no generic one either. NULL */ + return NULL; + h = 0; + pal_mode = 0; +} diff --git a/src/lib/engines/common/evas_convert_main.h b/src/lib/engines/common/evas_convert_main.h new file mode 100644 index 0000000..fb21203 --- /dev/null +++ b/src/lib/engines/common/evas_convert_main.h @@ -0,0 +1,13 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_CONVERT_MAIN_H +#define _EVAS_CONVERT_MAIN_H + + +EAPI void evas_common_convert_init (void); +EAPI Gfx_Func_Convert evas_common_convert_func_get (DATA8 *dest, int w, int h, int depth, DATA32 rmask, DATA32 gmask, DATA32 bmask, Convert_Pal_Mode pal_mode, int rotation); + + +#endif /* _EVAS_CONVERT_MAIN_H */ diff --git a/src/lib/engines/common/evas_convert_rgb_16.c b/src/lib/engines/common/evas_convert_rgb_16.c new file mode 100644 index 0000000..907fab2 --- /dev/null +++ b/src/lib/engines/common/evas_convert_rgb_16.c @@ -0,0 +1,1959 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_convert_rgb_16.h" + +#ifndef BUILD_NO_DITHER_MASK +#ifdef USE_DITHER_44 +extern const DATA8 _evas_dither_44[4][4]; +#endif +#ifdef USE_DITHER_128128 +extern const DATA8 _evas_dither_128128[128][128]; +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_565 +#ifdef BUILD_CONVERT_16_RGB_ROT0 +void +evas_common_convert_rgba2_to_16bpp_rgb_565_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith, dith2; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_0(); + + r1 = (R_VAL(src_ptr)) >> 3; + g1 = (G_VAL(src_ptr)) >> 2; + b1 = (B_VAL(src_ptr)) >> 3; +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++; +#endif + CONVERT_LOOP2_INC_ROT_0(); + + r2 = (R_VAL(src_ptr)) >> 3; + g2 = (G_VAL(src_ptr)) >> 2; + b2 = (B_VAL(src_ptr)) >> 3; +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (r2 << 27) | (g2 << 21) | (b2 << 16) | + (r1 << 11) | (g1 << 5 ) | (b1 ); +#else + *((DATA32 *)dst_ptr) = + (r1 << 27) | (g1 << 21) | (b1 << 16) | + (r2 << 11) | (g2 << 5 ) | (b2 ); +#endif + + CONVERT_LOOP2_END_ROT_0(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_565 +#ifdef BUILD_CONVERT_16_RGB_ROT0 +void +evas_common_convert_rgba_to_16bpp_rgb_565_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith, dith2; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_0(); + + r = (R_VAL(src_ptr)) >> 3; + g = (G_VAL(src_ptr)) >> 2; + b = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++; + if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++; + if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++; +#endif + + *dst_ptr = (r << 11) | (g << 5) | (b); + + CONVERT_LOOP_END_ROT_0(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_565 +#ifdef BUILD_CONVERT_16_RGB_ROT180 +void +evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith, dith2; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_180(); + + r1 = (R_VAL(src_ptr)) >> 3; + g1 = (G_VAL(src_ptr)) >> 2; + b1 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_180(); + + r2 = (R_VAL(src_ptr)) >> 3; + g2 = (G_VAL(src_ptr)) >> 2; + b2 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (r2 << 27) | (g2 << 21) | (b2 << 16) | + (r1 << 11) | (g1 << 5 ) | (b1 ); +#else + *((DATA32 *)dst_ptr) = + (r1 << 27) | (g1 << 21) | (b1 << 16) | + (r2 << 11) | (g2 << 5 ) | (b2 ); +#endif + + CONVERT_LOOP2_END_ROT_180(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_565 +#ifdef BUILD_CONVERT_16_RGB_ROT180 +void +evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith, dith2; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_180(); + + r = (R_VAL(src_ptr)) >> 3; + g = (G_VAL(src_ptr)) >> 2; + b = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++; + if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++; + if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++; +#endif + + *dst_ptr = (r << 11) | (g << 5) | (b); + + CONVERT_LOOP_END_ROT_180(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_565 +#ifdef BUILD_CONVERT_16_RGB_ROT270 +void +evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith, dith2; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_270(); + + r1 = (R_VAL(src_ptr)) >> 3; + g1 = (G_VAL(src_ptr)) >> 2; + b1 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_270(); + + r2 = (R_VAL(src_ptr)) >> 3; + g2 = (G_VAL(src_ptr)) >> 2; + b2 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (r2 << 27) | (g2 << 21) | (b2 << 16) | + (r1 << 11) | (g1 << 5 ) | (b1 ); +#else + *((DATA32 *)dst_ptr) = + (r1 << 27) | (g1 << 21) | (b1 << 16) | + (r2 << 11) | (g2 << 5 ) | (b2 ); +#endif + + CONVERT_LOOP2_END_ROT_270(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_565 +#ifdef BUILD_CONVERT_16_RGB_ROT270 +void +evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith, dith2; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_270(); + + r = (R_VAL(src_ptr)) >> 3; + g = (G_VAL(src_ptr)) >> 2; + b = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++; + if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++; + if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++; +#endif + + *dst_ptr = (r << 11) | (g << 5) | (b); + + CONVERT_LOOP_END_ROT_270(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_565 +#ifdef BUILD_CONVERT_16_RGB_ROT90 +void +evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith, dith2; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_90(); + + r1 = (R_VAL(src_ptr)) >> 3; + g1 = (G_VAL(src_ptr)) >> 2; + b1 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_90(); + + r2 = (R_VAL(src_ptr)) >> 3; + g2 = (G_VAL(src_ptr)) >> 2; + b2 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (r2 << 27) | (g2 << 21) | (b2 << 16) | + (r1 << 11) | (g1 << 5 ) | (b1 ); +#else + *((DATA32 *)dst_ptr) = + (r1 << 27) | (g1 << 21) | (b1 << 16) | + (r2 << 11) | (g2 << 5 ) | (b2 ); +#endif + + CONVERT_LOOP2_END_ROT_90(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_565 +#ifdef BUILD_CONVERT_16_RGB_ROT90 +void +evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith, dith2; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_90(); + + r = (R_VAL(src_ptr)) >> 3; + g = (G_VAL(src_ptr)) >> 2; + b = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++; + if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++; + if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++; +#endif + + *dst_ptr = (r << 11) | (g << 5) | (b); + + CONVERT_LOOP_END_ROT_90(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_BGR_565 +#ifdef BUILD_CONVERT_16_RGB_ROT0 +void +evas_common_convert_rgba2_to_16bpp_bgr_565_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith, dith2; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_0(); + + r1 = (R_VAL(src_ptr)) >> 3; + g1 = (G_VAL(src_ptr)) >> 2; + b1 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_0(); + + r2 = (R_VAL(src_ptr)) >> 3; + g2 = (G_VAL(src_ptr)) >> 2; + b2 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (b2 << 27) | (g2 << 21) | (r2 << 16) | + (b1 << 11) | (g1 << 5 ) | (r1 ); +#else + *((DATA32 *)dst_ptr) = + (b1 << 27) | (g1 << 21) | (r1 << 16) | + (b2 << 11) | (g2 << 5 ) | (r2 ); +#endif + + CONVERT_LOOP2_END_ROT_0(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_BGR_565 +#ifdef BUILD_CONVERT_16_RGB_ROT0 +void +evas_common_convert_rgba_to_16bpp_bgr_565_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith, dith2; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_0(); + + r = (R_VAL(src_ptr)) >> 3; + g = (G_VAL(src_ptr)) >> 2; + b = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++; + if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++; + if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++; +#endif + + *dst_ptr = (b << 11) | (g << 5) | (r); + + CONVERT_LOOP_END_ROT_0(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_BGR_565 +#ifdef BUILD_CONVERT_16_RGB_ROT180 +void +evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith, dith2; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_180(); + + r1 = (R_VAL(src_ptr)) >> 3; + g1 = (G_VAL(src_ptr)) >> 2; + b1 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_180(); + + r2 = (R_VAL(src_ptr)) >> 3; + g2 = (G_VAL(src_ptr)) >> 2; + b2 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (b2 << 27) | (g2 << 21) | (r2 << 16) | + (b1 << 11) | (g1 << 5 ) | (r1 ); +#else + *((DATA32 *)dst_ptr) = + (b1 << 27) | (g1 << 21) | (r1 << 16) | + (b2 << 11) | (g2 << 5 ) | (r2 ); +#endif + + CONVERT_LOOP2_END_ROT_180(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_BGR_565 +#ifdef BUILD_CONVERT_16_RGB_ROT180 +void +evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith, dith2; +#endif + + dst_ptr = (DATA16 *)dst; + + fprintf(stderr, "evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_180\n"); + + CONVERT_LOOP_START_ROT_180(); + + r = (R_VAL(src_ptr)) >> 3; + g = (G_VAL(src_ptr)) >> 2; + b = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++; + if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++; + if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++; +#endif + + *dst_ptr = (b << 11) | (g << 5) | (r); + + CONVERT_LOOP_END_ROT_180(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_BGR_565 +#ifdef BUILD_CONVERT_16_RGB_ROT270 +void +evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith, dith2; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_270(); + + r1 = (R_VAL(src_ptr)) >> 3; + g1 = (G_VAL(src_ptr)) >> 2; + b1 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_270(); + + r2 = (R_VAL(src_ptr)) >> 3; + g2 = (G_VAL(src_ptr)) >> 2; + b2 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (b2 << 27) | (g2 << 21) | (r2 << 16) | + (b1 << 11) | (g1 << 5 ) | (r1 ); +#else + *((DATA32 *)dst_ptr) = + (b1 << 27) | (g1 << 21) | (r1 << 16) | + (b2 << 11) | (g2 << 5 ) | (r2 ); +#endif + + CONVERT_LOOP2_END_ROT_270(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_BGR_565 +#ifdef BUILD_CONVERT_16_RGB_ROT270 +void +evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith, dith2; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_270(); + + r = (R_VAL(src_ptr)) >> 3; + g = (G_VAL(src_ptr)) >> 2; + b = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++; + if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++; + if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++; +#endif + + *dst_ptr = (b << 11) | (g << 5) | (r); + + CONVERT_LOOP_END_ROT_270(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_BGR_565 +#ifdef BUILD_CONVERT_16_RGB_ROT90 +void +evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith, dith2; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_90(); + + r1 = (R_VAL(src_ptr)) >> 3; + g1 = (G_VAL(src_ptr)) >> 2; + b1 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r1 << 3)) >= dith ) && (r1 < 0x1f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 2)) >= dith2) && (g1 < 0x3f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 3)) >= dith ) && (b1 < 0x1f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_90(); + + r2 = (R_VAL(src_ptr)) >> 3; + g2 = (G_VAL(src_ptr)) >> 2; + b2 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r2 << 3)) >= dith ) && (r2 < 0x1f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 2)) >= dith2) && (g2 < 0x3f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 3)) >= dith ) && (b2 < 0x1f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (b2 << 27) | (g2 << 21) | (r2 << 16) | + (b1 << 11) | (g1 << 5 ) | (r1 ); +#else + *((DATA32 *)dst_ptr) = + (b1 << 27) | (g1 << 21) | (r1 << 16) | + (b2 << 11) | (g2 << 5 ) | (r2 ); +#endif + + CONVERT_LOOP2_END_ROT_90(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_BGR_565 +#ifdef BUILD_CONVERT_16_RGB_ROT90 +void +evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith, dith2; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_90(); + + r = (R_VAL(src_ptr)) >> 3; + g = (G_VAL(src_ptr)) >> 2; + b = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(6); + if (((R_VAL(src_ptr) - (r << 3)) >= dith ) && (r < 0x1f)) r++; + if (((G_VAL(src_ptr) - (g << 2)) >= dith2) && (g < 0x3f)) g++; + if (((B_VAL(src_ptr) - (b << 3)) >= dith ) && (b < 0x1f)) b++; +#endif + + *dst_ptr = (b << 11) | (g << 5) | (r); + + CONVERT_LOOP_END_ROT_90(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_444 +#ifdef BUILD_CONVERT_16_RGB_ROT0 +void +evas_common_convert_rgba2_to_16bpp_rgb_444_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_0(); + + r1 = (R_VAL(src_ptr)) >> 4; + g1 = (G_VAL(src_ptr)) >> 4; + b1 = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r1 << 4)) >= dith ) && (r1 < 0x0f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 4)) >= dith ) && (g1 < 0x0f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 4)) >= dith ) && (b1 < 0x0f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_0(); + + r2 = (R_VAL(src_ptr)) >> 4; + g2 = (G_VAL(src_ptr)) >> 4; + b2 = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r2 << 4)) >= dith ) && (r2 < 0x0f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 4)) >= dith ) && (g2 < 0x0f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 4)) >= dith ) && (b2 < 0x0f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (r2 << 24) | (g2 << 20) | (b2 << 16) | + (r1 << 8 ) | (g1 << 4 ) | (b1 ); +#else + *((DATA32 *)dst_ptr) = + (r1 << 24) | (g1 << 20) | (b1 << 16) | + (r2 << 8 ) | (g2 << 4 ) | (b2 ); +#endif + + CONVERT_LOOP2_END_ROT_0(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_444 +#ifdef BUILD_CONVERT_16_RGB_ROT0 +void +evas_common_convert_rgba_to_16bpp_rgb_444_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_0(); + + r = (R_VAL(src_ptr)) >> 4; + g = (G_VAL(src_ptr)) >> 4; + b = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r << 4)) >= dith ) && (r < 0x0f)) r++; + if (((G_VAL(src_ptr) - (g << 4)) >= dith ) && (g < 0x0f)) g++; + if (((B_VAL(src_ptr) - (b << 4)) >= dith ) && (b < 0x0f)) b++; +#endif + + *dst_ptr = (r << 8) | (g << 4) | (b); + + CONVERT_LOOP_END_ROT_0(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_444 +#ifdef BUILD_CONVERT_16_RGB_ROT180 +void +evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_180(); + + r1 = (R_VAL(src_ptr)) >> 4; + g1 = (G_VAL(src_ptr)) >> 4; + b1 = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r1 << 4)) >= dith ) && (r1 < 0x0f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 4)) >= dith ) && (g1 < 0x0f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 4)) >= dith ) && (b1 < 0x0f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_180(); + + r2 = (R_VAL(src_ptr)) >> 4; + g2 = (G_VAL(src_ptr)) >> 4; + b2 = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r2 << 4)) >= dith ) && (r2 < 0x0f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 4)) >= dith ) && (g2 < 0x0f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 4)) >= dith ) && (b2 < 0x0f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (r2 << 24) | (g2 << 20) | (b2 << 16) | + (r1 << 8 ) | (g1 << 4 ) | (b1 ); +#else + *((DATA32 *)dst_ptr) = + (r1 << 24) | (g1 << 20) | (b1 << 16) | + (r2 << 8 ) | (g2 << 4 ) | (b2 ); +#endif + + CONVERT_LOOP2_END_ROT_180(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_444 +#ifdef BUILD_CONVERT_16_RGB_ROT180 +void +evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_180(); + + r = (R_VAL(src_ptr)) >> 4; + g = (G_VAL(src_ptr)) >> 4; + b = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r << 4)) >= dith ) && (r < 0x0f)) r++; + if (((G_VAL(src_ptr) - (g << 4)) >= dith ) && (g < 0x0f)) g++; + if (((B_VAL(src_ptr) - (b << 4)) >= dith ) && (b < 0x0f)) b++; +#endif + + *dst_ptr = (r << 8) | (g << 4) | (b); + + CONVERT_LOOP_END_ROT_180(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_444 +#ifdef BUILD_CONVERT_16_RGB_ROT270 +void +evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_270(); + + r1 = (R_VAL(src_ptr)) >> 4; + g1 = (G_VAL(src_ptr)) >> 4; + b1 = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r1 << 4)) >= dith ) && (r1 < 0x0f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 4)) >= dith ) && (g1 < 0x0f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 4)) >= dith ) && (b1 < 0x0f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_270(); + + r2 = (R_VAL(src_ptr)) >> 4; + g2 = (G_VAL(src_ptr)) >> 4; + b2 = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r2 << 4)) >= dith ) && (r2 < 0x0f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 4)) >= dith ) && (g2 < 0x0f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 4)) >= dith ) && (b2 < 0x0f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (r2 << 24) | (g2 << 20) | (b2 << 16) | + (r1 << 8 ) | (g1 << 4 ) | (b1 ); +#else + *((DATA32 *)dst_ptr) = + (r1 << 24) | (g1 << 20) | (b1 << 16) | + (r2 << 8 ) | (g2 << 4 ) | (b2 ); +#endif + + CONVERT_LOOP2_END_ROT_270(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_444 +#ifdef BUILD_CONVERT_16_RGB_ROT270 +void +evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_270(); + + r = (R_VAL(src_ptr)) >> 4; + g = (G_VAL(src_ptr)) >> 4; + b = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r << 4)) >= dith ) && (r < 0x0f)) r++; + if (((G_VAL(src_ptr) - (g << 4)) >= dith ) && (g < 0x0f)) g++; + if (((B_VAL(src_ptr) - (b << 4)) >= dith ) && (b < 0x0f)) b++; +#endif + + *dst_ptr = (r << 8) | (g << 4) | (b); + + CONVERT_LOOP_END_ROT_270(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_444 +#ifdef BUILD_CONVERT_16_RGB_ROT90 +void +evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_90(); + + r1 = (R_VAL(src_ptr)) >> 4; + g1 = (G_VAL(src_ptr)) >> 4; + b1 = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r1 << 4)) >= dith ) && (r1 < 0x0f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 4)) >= dith ) && (g1 < 0x0f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 4)) >= dith ) && (b1 < 0x0f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_90(); + + r2 = (R_VAL(src_ptr)) >> 4; + g2 = (G_VAL(src_ptr)) >> 4; + b2 = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r2 << 4)) >= dith ) && (r2 < 0x0f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 4)) >= dith ) && (g2 < 0x0f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 4)) >= dith ) && (b2 < 0x0f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (r2 << 24) | (g2 << 20) | (b2 << 16) | + (r1 << 8 ) | (g1 << 4 ) | (b1 ); +#else + *((DATA32 *)dst_ptr) = + (r1 << 24) | (g1 << 20) | (b1 << 16) | + (r2 << 8 ) | (g2 << 4 ) | (b2 ); +#endif + + CONVERT_LOOP2_END_ROT_90(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_444 +#ifdef BUILD_CONVERT_16_RGB_ROT90 +void +evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_90(); + + r = (R_VAL(src_ptr)) >> 4; + g = (G_VAL(src_ptr)) >> 4; + b = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r << 4)) >= dith ) && (r < 0x0f)) r++; + if (((G_VAL(src_ptr) - (g << 4)) >= dith ) && (g < 0x0f)) g++; + if (((B_VAL(src_ptr) - (b << 4)) >= dith ) && (b < 0x0f)) b++; +#endif + + *dst_ptr = (r << 8) | (g << 4) | (b); + + CONVERT_LOOP_END_ROT_90(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_454645 +#ifdef BUILD_CONVERT_16_RGB_ROT0 +void +evas_common_convert_rgba2_to_16bpp_rgb_454645_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_0(); + + r1 = (R_VAL(src_ptr)) >> 4; + g1 = (G_VAL(src_ptr)) >> 4; + b1 = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r1 << 4)) >= dith ) && (r1 < 0x0f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 4)) >= dith ) && (g1 < 0x0f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 4)) >= dith ) && (b1 < 0x0f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_0(); + + r2 = (R_VAL(src_ptr)) >> 4; + g2 = (G_VAL(src_ptr)) >> 4; + b2 = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r2 << 4)) >= dith ) && (r2 < 0x0f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 4)) >= dith ) && (g2 < 0x0f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 4)) >= dith ) && (b2 < 0x0f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (r2 << 28) | (g2 << 23) | (b2 << 17) | + (r1 << 12) | (g1 << 7 ) | (b1 << 1 ); +#else + *((DATA32 *)dst_ptr) = + (r1 << 28) | (g1 << 23) | (b1 << 17) | + (r2 << 12) | (g2 << 7 ) | (b2 << 1 ); +#endif + + CONVERT_LOOP2_END_ROT_0(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_454645 +#ifdef BUILD_CONVERT_16_RGB_ROT0 +void +evas_common_convert_rgba_to_16bpp_rgb_454645_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_0(); + + r = (R_VAL(src_ptr)) >> 4; + g = (G_VAL(src_ptr)) >> 4; + b = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r << 4)) >= dith ) && (r < 0x0f)) r++; + if (((G_VAL(src_ptr) - (g << 4)) >= dith ) && (g < 0x0f)) g++; + if (((B_VAL(src_ptr) - (b << 4)) >= dith ) && (b < 0x0f)) b++; +#endif + + *dst_ptr = (r << 12) | (g << 7) | (b << 1); + + CONVERT_LOOP_END_ROT_0(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_454645 +#ifdef BUILD_CONVERT_16_RGB_ROT180 +void +evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_180(); + + r1 = (R_VAL(src_ptr)) >> 4; + g1 = (G_VAL(src_ptr)) >> 4; + b1 = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r1 << 4)) >= dith ) && (r1 < 0x0f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 4)) >= dith ) && (g1 < 0x0f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 4)) >= dith ) && (b1 < 0x0f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_180(); + + r2 = (R_VAL(src_ptr)) >> 4; + g2 = (G_VAL(src_ptr)) >> 4; + b2 = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r2 << 4)) >= dith ) && (r2 < 0x0f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 4)) >= dith ) && (g2 < 0x0f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 4)) >= dith ) && (b2 < 0x0f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (r2 << 28) | (g2 << 23) | (b2 << 17) | + (r1 << 12) | (g1 << 7 ) | (b1 << 1 ); +#else + *((DATA32 *)dst_ptr) = + (r1 << 28) | (g1 << 23) | (b1 << 17) | + (r2 << 12) | (g2 << 7 ) | (b2 << 1 ); +#endif + + CONVERT_LOOP2_END_ROT_180(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_454645 +#ifdef BUILD_CONVERT_16_RGB_ROT180 +void +evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_180(); + + r = (R_VAL(src_ptr)) >> 4; + g = (G_VAL(src_ptr)) >> 4; + b = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r << 4)) >= dith ) && (r < 0x0f)) r++; + if (((G_VAL(src_ptr) - (g << 4)) >= dith ) && (g < 0x0f)) g++; + if (((B_VAL(src_ptr) - (b << 4)) >= dith ) && (b < 0x0f)) b++; +#endif + + *dst_ptr = (r << 12) | (g << 7) | (b << 1); + + CONVERT_LOOP_END_ROT_180(); + return; + pal = 0; +} +#endif +#endif + + +#ifdef BUILD_CONVERT_16_RGB_454645 +#ifdef BUILD_CONVERT_16_RGB_ROT270 +void +evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_270(); + + r1 = (R_VAL(src_ptr)) >> 4; + g1 = (G_VAL(src_ptr)) >> 4; + b1 = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r1 << 4)) >= dith ) && (r1 < 0x0f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 4)) >= dith ) && (g1 < 0x0f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 4)) >= dith ) && (b1 < 0x0f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_270(); + + r2 = (R_VAL(src_ptr)) >> 4; + g2 = (G_VAL(src_ptr)) >> 4; + b2 = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r2 << 4)) >= dith ) && (r2 < 0x0f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 4)) >= dith ) && (g2 < 0x0f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 4)) >= dith ) && (b2 < 0x0f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (r2 << 28) | (g2 << 23) | (b2 << 17) | + (r1 << 12) | (g1 << 7 ) | (b1 << 1 ); +#else + *((DATA32 *)dst_ptr) = + (r1 << 28) | (g1 << 23) | (b1 << 17) | + (r2 << 12) | (g2 << 7 ) | (b2 << 1 ); +#endif + + CONVERT_LOOP2_END_ROT_270(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_454645 +#ifdef BUILD_CONVERT_16_RGB_ROT270 +void +evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_270(); + + r = (R_VAL(src_ptr)) >> 4; + g = (G_VAL(src_ptr)) >> 4; + b = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r << 4)) >= dith ) && (r < 0x0f)) r++; + if (((G_VAL(src_ptr) - (g << 4)) >= dith ) && (g < 0x0f)) g++; + if (((B_VAL(src_ptr) - (b << 4)) >= dith ) && (b < 0x0f)) b++; +#endif + + *dst_ptr = (r << 12) | (g << 7) | (b << 1); + + CONVERT_LOOP_END_ROT_270(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_454645 +#ifdef BUILD_CONVERT_16_RGB_ROT90 +void +evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_90(); + + r1 = (R_VAL(src_ptr)) >> 4; + g1 = (G_VAL(src_ptr)) >> 4; + b1 = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r1 << 4)) >= dith ) && (r1 < 0x0f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 4)) >= dith ) && (g1 < 0x0f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 4)) >= dith ) && (b1 < 0x0f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_90(); + + r2 = (R_VAL(src_ptr)) >> 4; + g2 = (G_VAL(src_ptr)) >> 4; + b2 = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r2 << 4)) >= dith ) && (r2 < 0x0f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 4)) >= dith ) && (g2 < 0x0f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 4)) >= dith ) && (b2 < 0x0f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (r2 << 28) | (g2 << 23) | (b2 << 17) | + (r1 << 12) | (g1 << 7 ) | (b1 << 1 ); +#else + *((DATA32 *)dst_ptr) = + (r1 << 28) | (g1 << 23) | (b1 << 17) | + (r2 << 12) | (g2 << 7 ) | (b2 << 1 ); +#endif + + CONVERT_LOOP2_END_ROT_90(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_454645 +#ifdef BUILD_CONVERT_16_RGB_ROT90 +void +evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_90(); + + r = (R_VAL(src_ptr)) >> 4; + g = (G_VAL(src_ptr)) >> 4; + b = (B_VAL(src_ptr)) >> 4; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(4); + if (((R_VAL(src_ptr) - (r << 4)) >= dith ) && (r < 0x0f)) r++; + if (((G_VAL(src_ptr) - (g << 4)) >= dith ) && (g < 0x0f)) g++; + if (((B_VAL(src_ptr) - (b << 4)) >= dith ) && (b < 0x0f)) b++; +#endif + + *dst_ptr = (r << 12) | (g << 7) | (b << 1); + + CONVERT_LOOP_END_ROT_90(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_555 +#ifdef BUILD_CONVERT_16_RGB_ROT0 +void +evas_common_convert_rgba2_to_16bpp_rgb_555_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_0(); + + r1 = (R_VAL(src_ptr)) >> 3; + g1 = (G_VAL(src_ptr)) >> 3; + b1 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + if (((R_VAL(src_ptr) - (r1 << 3)) >= dith) && (r1 < 0x1f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 3)) >= dith) && (g1 < 0x1f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 3)) >= dith) && (b1 < 0x1f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_0(); + + r2 = (R_VAL(src_ptr)) >> 3; + g2 = (G_VAL(src_ptr)) >> 3; + b2 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + if (((R_VAL(src_ptr) - (r2 << 3)) >= dith) && (r2 < 0x1f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 3)) >= dith) && (g2 < 0x1f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 3)) >= dith) && (b2 < 0x1f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (r2 << 26) | (g2 << 21) | (b2 << 16) | + (r1 << 10) | (g1 << 5 ) | (b1 ); +#else + *((DATA32 *)dst_ptr) = + (r1 << 26) | (g1 << 21) | (b1 << 16) | + (r2 << 10) | (g2 << 5 ) | (b2 ); +#endif + + CONVERT_LOOP2_END_ROT_0(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_555 +#ifdef BUILD_CONVERT_16_RGB_ROT0 +void +evas_common_convert_rgba_to_16bpp_rgb_555_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_0(); + + r = (R_VAL(src_ptr)) >> 3; + g = (G_VAL(src_ptr)) >> 3; + b = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + if (((R_VAL(src_ptr) - (r << 3)) >= dith) && (r < 0x1f)) r++; + if (((G_VAL(src_ptr) - (g << 3)) >= dith) && (g < 0x1f)) g++; + if (((B_VAL(src_ptr) - (b << 3)) >= dith) && (b < 0x1f)) b++; +#endif + + *dst_ptr = (r << 10) | (g << 5) | (b); + + CONVERT_LOOP_END_ROT_0(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_555 +#ifdef BUILD_CONVERT_16_RGB_ROT180 +void +evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_180(); + + r1 = (R_VAL(src_ptr)) >> 3; + g1 = (G_VAL(src_ptr)) >> 3; + b1 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + if (((R_VAL(src_ptr) - (r1 << 3)) >= dith) && (r1 < 0x1f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 3)) >= dith) && (g1 < 0x1f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 3)) >= dith) && (b1 < 0x1f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_180(); + + r2 = (R_VAL(src_ptr)) >> 3; + g2 = (G_VAL(src_ptr)) >> 3; + b2 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + if (((R_VAL(src_ptr) - (r2 << 3)) >= dith) && (r2 < 0x1f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 3)) >= dith) && (g2 < 0x1f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 3)) >= dith) && (b2 < 0x1f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (r2 << 26) | (g2 << 21) | (b2 << 16) | + (r1 << 10) | (g1 << 5 ) | (b1 ); +#else + *((DATA32 *)dst_ptr) = + (r1 << 26) | (g1 << 21) | (b1 << 16) | + (r2 << 10) | (g2 << 5 ) | (b2 ); +#endif + + CONVERT_LOOP2_END_ROT_180(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_555 +#ifdef BUILD_CONVERT_16_RGB_ROT180 +void +evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_180(); + + r = (R_VAL(src_ptr)) >> 3; + g = (G_VAL(src_ptr)) >> 3; + b = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + if (((R_VAL(src_ptr) - (r << 3)) >= dith) && (r < 0x1f)) r++; + if (((G_VAL(src_ptr) - (g << 3)) >= dith) && (g < 0x1f)) g++; + if (((B_VAL(src_ptr) - (b << 3)) >= dith) && (b < 0x1f)) b++; +#endif + + *dst_ptr = (r << 10) | (g << 5) | (b); + + CONVERT_LOOP_END_ROT_180(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_555 +#ifdef BUILD_CONVERT_16_RGB_ROT270 +void +evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_270(); + + r1 = (R_VAL(src_ptr)) >> 3; + g1 = (G_VAL(src_ptr)) >> 3; + b1 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + if (((R_VAL(src_ptr) - (r1 << 3)) >= dith) && (r1 < 0x1f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 3)) >= dith) && (g1 < 0x1f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 3)) >= dith) && (b1 < 0x1f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_270(); + + r2 = (R_VAL(src_ptr)) >> 3; + g2 = (G_VAL(src_ptr)) >> 3; + b2 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + if (((R_VAL(src_ptr) - (r2 << 3)) >= dith) && (r2 < 0x1f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 3)) >= dith) && (g2 < 0x1f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 3)) >= dith) && (b2 < 0x1f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (r2 << 26) | (g2 << 21) | (b2 << 16) | + (r1 << 10) | (g1 << 5 ) | (b1 ); +#else + *((DATA32 *)dst_ptr) = + (r1 << 26) | (g1 << 21) | (b1 << 16) | + (r2 << 10) | (g2 << 5 ) | (b2 ); +#endif + + CONVERT_LOOP2_END_ROT_270(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_555 +#ifdef BUILD_CONVERT_16_RGB_ROT270 +void +evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_270(); + + r = (R_VAL(src_ptr)) >> 3; + g = (G_VAL(src_ptr)) >> 3; + b = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + if (((R_VAL(src_ptr) - (r << 3)) >= dith) && (r < 0x1f)) r++; + if (((G_VAL(src_ptr) - (g << 3)) >= dith) && (g < 0x1f)) g++; + if (((B_VAL(src_ptr) - (b << 3)) >= dith) && (b < 0x1f)) b++; +#endif + + *dst_ptr = (r << 10) | (g << 5) | (b); + + CONVERT_LOOP_END_ROT_270(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_555 +#ifdef BUILD_CONVERT_16_RGB_ROT90 +void +evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r1, g1, b1; + DATA8 r2, g2, b2; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP2_START_ROT_90(); + + r1 = (R_VAL(src_ptr)) >> 3; + g1 = (G_VAL(src_ptr)) >> 3; + b1 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + if (((R_VAL(src_ptr) - (r1 << 3)) >= dith) && (r1 < 0x1f)) r1++; + if (((G_VAL(src_ptr) - (g1 << 3)) >= dith) && (g1 < 0x1f)) g1++; + if (((B_VAL(src_ptr) - (b1 << 3)) >= dith) && (b1 < 0x1f)) b1++; +#endif + + CONVERT_LOOP2_INC_ROT_90(); + + r2 = (R_VAL(src_ptr)) >> 3; + g2 = (G_VAL(src_ptr)) >> 3; + b2 = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + if (((R_VAL(src_ptr) - (r2 << 3)) >= dith) && (r2 < 0x1f)) r2++; + if (((G_VAL(src_ptr) - (g2 << 3)) >= dith) && (g2 < 0x1f)) g2++; + if (((B_VAL(src_ptr) - (b2 << 3)) >= dith) && (b2 < 0x1f)) b2++; +#endif + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)dst_ptr) = + (r2 << 26) | (g2 << 21) | (b2 << 16) | + (r1 << 10) | (g1 << 5 ) | (b1 ); +#else + *((DATA32 *)dst_ptr) = + (r1 << 26) | (g1 << 21) | (b1 << 16) | + (r2 << 10) | (g2 << 5 ) | (b2 ); +#endif + + CONVERT_LOOP2_END_ROT_90(); + return; + pal = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_16_RGB_555 +#ifdef BUILD_CONVERT_16_RGB_ROT90 +void +evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA16 *dst_ptr; + int x, y; + DATA8 r, g, b; +#ifndef BUILD_NO_DITHER_MASK + DATA8 dith; +#endif + + dst_ptr = (DATA16 *)dst; + + CONVERT_LOOP_START_ROT_90(); + + r = (R_VAL(src_ptr)) >> 3; + g = (G_VAL(src_ptr)) >> 3; + b = (B_VAL(src_ptr)) >> 3; + +#ifndef BUILD_NO_DITHER_MASK + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(5); + if (((R_VAL(src_ptr) - (r << 3)) >= dith) && (r < 0x1f)) r++; + if (((G_VAL(src_ptr) - (g << 3)) >= dith) && (g < 0x1f)) g++; + if (((B_VAL(src_ptr) - (b << 3)) >= dith) && (b < 0x1f)) b++; +#endif + + *dst_ptr = (r << 10) | (g << 5) | (b); + + CONVERT_LOOP_END_ROT_90(); + return; + pal = 0; +} +#endif +#endif diff --git a/src/lib/engines/common/evas_convert_rgb_16.h b/src/lib/engines/common/evas_convert_rgb_16.h new file mode 100644 index 0000000..fd1e570 --- /dev/null +++ b/src/lib/engines/common/evas_convert_rgb_16.h @@ -0,0 +1,54 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_CONVERT_RGB_16_H +#define _EVAS_CONVERT_RGB_16_H + + +void evas_common_convert_rgba2_to_16bpp_rgb_565_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_rgb_565_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba2_to_16bpp_bgr_565_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_bgr_565_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba2_to_16bpp_rgb_444_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_rgb_444_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba2_to_16bpp_rgb_454645_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_rgb_454645_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba2_to_16bpp_rgb_555_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_rgb_555_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); + +void evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); + +void evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); + +void evas_common_convert_rgba2_to_16bpp_rgb_565_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_rgb_565_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba2_to_16bpp_bgr_565_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba2_to_16bpp_rgb_444_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_rgb_444_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba2_to_16bpp_rgb_454645_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_rgb_454645_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba2_to_16bpp_rgb_555_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_16bpp_rgb_555_dith_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); + + +#endif /* _EVAS_CONVERT_RGB_16_H */ diff --git a/src/lib/engines/common/evas_convert_rgb_24.c b/src/lib/engines/common/evas_convert_rgb_24.c new file mode 100644 index 0000000..ffb3ff8 --- /dev/null +++ b/src/lib/engines/common/evas_convert_rgb_24.c @@ -0,0 +1,67 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_convert_rgb_24.h" + +#ifdef BUILD_CONVERT_24_RGB_888 +void +evas_common_convert_rgba_to_24bpp_rgb_888(DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA8 *dst_ptr; + int x, y; + + dst_ptr = (DATA8 *)dst; + src_ptr = (DATA32 *)src; + + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + dst_ptr[0] = R_VAL(src_ptr); + dst_ptr[1] = G_VAL(src_ptr); + dst_ptr[2] = B_VAL(src_ptr); + src_ptr++; + dst_ptr+=3; + } + src_ptr += src_jump; + dst_ptr += (dst_jump * 3); + } + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#ifdef BUILD_CONVERT_24_BGR_888 +void +evas_common_convert_rgba_to_24bpp_bgr_888(DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA8 *dst_ptr; + int x, y; + + dst_ptr = (DATA8 *)dst; + src_ptr = (DATA32 *)src; + + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + dst_ptr[2] = R_VAL(src_ptr); + dst_ptr[1] = G_VAL(src_ptr); + dst_ptr[0] = B_VAL(src_ptr); + src_ptr++; + dst_ptr+=3; + } + src_ptr += src_jump; + dst_ptr += (dst_jump * 3); + } + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif diff --git a/src/lib/engines/common/evas_convert_rgb_24.h b/src/lib/engines/common/evas_convert_rgb_24.h new file mode 100644 index 0000000..53fe088 --- /dev/null +++ b/src/lib/engines/common/evas_convert_rgb_24.h @@ -0,0 +1,13 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_CONVERT_RGB_24_H +#define _EVAS_CONVERT_RGB_24_H + + +void evas_common_convert_rgba_to_24bpp_rgb_888 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_24bpp_bgr_888 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); + + +#endif /* _EVAS_CONVERT_RGB_24_H */ diff --git a/src/lib/engines/common/evas_convert_rgb_32.c b/src/lib/engines/common/evas_convert_rgb_32.c new file mode 100644 index 0000000..9d03a31 --- /dev/null +++ b/src/lib/engines/common/evas_convert_rgb_32.c @@ -0,0 +1,399 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_convert_rgb_32.h" + +#ifdef BUILD_CONVERT_32_RGB_8888 +#ifdef BUILD_CONVERT_32_RGB_ROT0 +void +evas_common_convert_rgba_to_32bpp_rgb_8888 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int y; + Gfx_Func_Copy func; + + dst_ptr = (DATA32 *)dst; + src_ptr = src; + + func = evas_common_draw_func_copy_get(w, 0); + + for (y = 0; y < h; y++) + { + func(src_ptr, dst_ptr, w); + src_ptr += w + src_jump; + dst_ptr += w + dst_jump; + } + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_32_RGB_8888 +#ifdef BUILD_CONVERT_32_RGB_ROT180 +void +evas_common_convert_rgba_to_32bpp_rgb_8888_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int x, y; + + dst_ptr = (DATA32 *)dst; + + CONVERT_LOOP_START_ROT_180(); + + *dst_ptr = *src_ptr; + + CONVERT_LOOP_END_ROT_180(); + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_32_RGB_8888 +#ifdef BUILD_CONVERT_32_RGB_ROT270 +void +evas_common_convert_rgba_to_32bpp_rgb_8888_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int x, y; + + dst_ptr = (DATA32 *)dst; + + CONVERT_LOOP_START_ROT_270(); + + *dst_ptr = *src_ptr; + + CONVERT_LOOP_END_ROT_270(); + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_32_RGB_8888 +#ifdef BUILD_CONVERT_32_RGB_ROT90 +void +evas_common_convert_rgba_to_32bpp_rgb_8888_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int x, y; + + dst_ptr = (DATA32 *)dst; + + CONVERT_LOOP_START_ROT_90(); + + *dst_ptr = *src_ptr; + + CONVERT_LOOP_END_ROT_90(); + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_32_RGBX_8888 +#ifdef BUILD_CONVERT_32_RGB_ROT0 +void +evas_common_convert_rgba_to_32bpp_rgbx_8888 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int x, y; + + dst_ptr = (DATA32 *)dst; + + CONVERT_LOOP_START_ROT_0(); + +// *dst_ptr = (R_VAL(src_ptr) << 24) | (G_VAL(src_ptr) << 16) | (B_VAL(src_ptr) << 8); + *dst_ptr = (*src_ptr << 8); + + CONVERT_LOOP_END_ROT_0(); + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_32_RGBX_8888 +#ifdef BUILD_CONVERT_32_RGB_ROT180 +void +evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int x, y; + + dst_ptr = (DATA32 *)dst; + + CONVERT_LOOP_START_ROT_180(); + +// *dst_ptr = (R_VAL(src_ptr) << 24) | (G_VAL(src_ptr) << 16) | (B_VAL(src_ptr) << 8); + *dst_ptr = (*src_ptr << 8); + + CONVERT_LOOP_END_ROT_180(); + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_32_RGBX_8888 +#ifdef BUILD_CONVERT_32_RGB_ROT270 +void +evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int x, y; + + dst_ptr = (DATA32 *)dst; + + CONVERT_LOOP_START_ROT_270(); + +// *dst_ptr = (R_VAL(src_ptr) << 24) | (G_VAL(src_ptr) << 16) | (B_VAL(src_ptr) << 8); + *dst_ptr = (*src_ptr << 8); + + CONVERT_LOOP_END_ROT_270(); + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_32_RGBX_8888 +#ifdef BUILD_CONVERT_32_RGB_ROT90 +void +evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int x, y; + + dst_ptr = (DATA32 *)dst; + + CONVERT_LOOP_START_ROT_90(); + +// *dst_ptr = (R_VAL(src_ptr) << 24) | (G_VAL(src_ptr) << 16) | (B_VAL(src_ptr) << 8); + *dst_ptr = (*src_ptr << 8); + + CONVERT_LOOP_END_ROT_90(); + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_32_BGR_8888 +#ifdef BUILD_CONVERT_32_RGB_ROT0 +void +evas_common_convert_rgba_to_32bpp_bgr_8888 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int x, y; + + dst_ptr = (DATA32 *)dst; + + CONVERT_LOOP_START_ROT_0(); + + *dst_ptr = (B_VAL(src_ptr) << 16) | (G_VAL(src_ptr) << 8) | (R_VAL(src_ptr)); + + CONVERT_LOOP_END_ROT_0(); + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_32_BGR_8888 +#ifdef BUILD_CONVERT_32_RGB_ROT180 +void +evas_common_convert_rgba_to_32bpp_bgr_8888_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int x, y; + + dst_ptr = (DATA32 *)dst; + + CONVERT_LOOP_START_ROT_180(); + + *dst_ptr = (B_VAL(src_ptr) << 16) | (G_VAL(src_ptr) << 8) | (R_VAL(src_ptr)); + + CONVERT_LOOP_END_ROT_180(); + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_32_BGR_8888 +#ifdef BUILD_CONVERT_32_RGB_ROT270 +void +evas_common_convert_rgba_to_32bpp_bgr_8888_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int x, y; + + dst_ptr = (DATA32 *)dst; + + CONVERT_LOOP_START_ROT_270(); + + *dst_ptr = (B_VAL(src_ptr) << 16) | (G_VAL(src_ptr) << 8) | (R_VAL(src_ptr)); + + CONVERT_LOOP_END_ROT_270(); + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_32_BGR_8888 +#ifdef BUILD_CONVERT_32_RGB_ROT90 +void +evas_common_convert_rgba_to_32bpp_bgr_8888_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int x, y; + + dst_ptr = (DATA32 *)dst; + + CONVERT_LOOP_START_ROT_90(); + + *dst_ptr = (B_VAL(src_ptr) << 16) | (G_VAL(src_ptr) << 8) | (R_VAL(src_ptr)); + + CONVERT_LOOP_END_ROT_90(); + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_32_BGRX_8888 +#ifdef BUILD_CONVERT_32_RGB_ROT0 +void +evas_common_convert_rgba_to_32bpp_bgrx_8888 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int x, y; + + dst_ptr = (DATA32 *)dst; + + CONVERT_LOOP_START_ROT_0(); + + *dst_ptr = (B_VAL(src_ptr) << 24) | (G_VAL(src_ptr) << 16) | (R_VAL(src_ptr) << 8); + + CONVERT_LOOP_END_ROT_0(); + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_32_BGRX_8888 +#ifdef BUILD_CONVERT_32_RGB_ROT180 +void +evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int x, y; + + dst_ptr = (DATA32 *)dst; + + CONVERT_LOOP_START_ROT_180(); + + *dst_ptr = (B_VAL(src_ptr) << 24) | (G_VAL(src_ptr) << 16) | (R_VAL(src_ptr) << 8); + + CONVERT_LOOP_END_ROT_180(); + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_32_BGRX_8888 +#ifdef BUILD_CONVERT_32_RGB_ROT270 +void +evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int x, y; + + dst_ptr = (DATA32 *)dst; + + CONVERT_LOOP_START_ROT_270(); + + *dst_ptr = (B_VAL(src_ptr) << 24) | (G_VAL(src_ptr) << 16) | (R_VAL(src_ptr) << 8); + + CONVERT_LOOP_END_ROT_270(); + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#endif + +#ifdef BUILD_CONVERT_32_BGRX_8888 +#ifdef BUILD_CONVERT_32_RGB_ROT90 +void +evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int x, y; + + dst_ptr = (DATA32 *)dst; + + CONVERT_LOOP_START_ROT_90(); + + *dst_ptr = (B_VAL(src_ptr) << 24) | (G_VAL(src_ptr) << 16) | (R_VAL(src_ptr) << 8); + + CONVERT_LOOP_END_ROT_90(); + return; + pal = 0; + dith_x = 0; + dith_y = 0; +} +#endif +#endif diff --git a/src/lib/engines/common/evas_convert_rgb_32.h b/src/lib/engines/common/evas_convert_rgb_32.h new file mode 100644 index 0000000..7adb9b2 --- /dev/null +++ b/src/lib/engines/common/evas_convert_rgb_32.h @@ -0,0 +1,27 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_CONVERT_RGB_32_H +#define _EVAS_CONVERT_RGB_32_H + + +void evas_common_convert_rgba_to_32bpp_rgb_8888 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_32bpp_rgb_8888_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_32bpp_rgb_8888_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_32bpp_rgb_8888_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_32bpp_rgbx_8888 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_32bpp_rgbx_8888_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_32bpp_bgr_8888 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_32bpp_bgr_8888_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_32bpp_bgr_8888_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_32bpp_bgr_8888_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_32bpp_bgrx_8888 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_180 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_270 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_32bpp_bgrx_8888_rot_90 (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); + + +#endif /* _EVAS_CONVERT_RGB_32_H */ diff --git a/src/lib/engines/common/evas_convert_rgb_8.c b/src/lib/engines/common/evas_convert_rgb_8.c new file mode 100644 index 0000000..c2f08fb --- /dev/null +++ b/src/lib/engines/common/evas_convert_rgb_8.c @@ -0,0 +1,252 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_convert_rgb_8.h" + +#ifdef USE_DITHER_44 +extern const DATA8 _evas_dither_44[4][4]; +#endif +#ifdef USE_DITHER_128128 +extern const DATA8 _evas_dither_128128[128][128]; +#endif + +#ifdef BUILD_CONVERT_8_RGB_332 +void evas_common_convert_rgba_to_8bpp_rgb_332_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA8 *dst_ptr; + int x, y; + DATA8 r, g, b; + DATA8 dith, dith2; + + dst_ptr = (DATA8 *)dst; + + CONVERT_LOOP_START_ROT_0(); + + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(3); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(2); +/* r = (R_VAL(src_ptr)) >> (8 - 3);*/ +/* g = (G_VAL(src_ptr)) >> (8 - 3);*/ +/* b = (B_VAL(src_ptr)) >> (8 - 2);*/ +/* if (((R_VAL(src_ptr) - (r << (8 - 3))) >= dith ) && (r < 0x07)) r++;*/ +/* if (((G_VAL(src_ptr) - (g << (8 - 3))) >= dith ) && (g < 0x07)) g++;*/ +/* if (((B_VAL(src_ptr) - (b << (8 - 2))) >= dith2) && (b < 0x03)) b++;*/ + r = (R_VAL(src_ptr)) * 7 / 255; + if (((R_VAL(src_ptr) - (r * 255 / 7)) >= dith ) && (r < 0x07)) r++; + g = (G_VAL(src_ptr)) * 7 / 255; + if (((G_VAL(src_ptr) - (g * 255 / 7)) >= dith ) && (g < 0x07)) g++; + b = (B_VAL(src_ptr)) * 3 / 255; + if (((B_VAL(src_ptr) - (b * 255 / 3)) >= dith2) && (b < 0x03)) b++; + + *dst_ptr = pal[(r << 5) | (g << 2) | (b)]; + + CONVERT_LOOP_END_ROT_0(); +} +#endif +#ifdef BUILD_CONVERT_8_RGB_666 +static DATA8 p_to_6[256]; +static DATA8 p_to_6_err[256]; + +void evas_common_convert_rgba_to_8bpp_rgb_666_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA8 *dst_ptr; + int x, y; + DATA8 r, g, b; + DATA8 dith; + static int tables_calcualted = 0; + + if (!tables_calcualted) + { + int i; + + tables_calcualted = 1; + for (i = 0; i < 256; i++) + p_to_6[i] = (i * 5) / 255; + for (i = 0; i < 256; i++) + p_to_6_err[i] = ((i * 5) - (p_to_6[i] * 255)) * DM_DIV / 255; + } + dst_ptr = (DATA8 *)dst; + + CONVERT_LOOP_START_ROT_0(); + + r = p_to_6[(R_VAL(src_ptr))]; + g = p_to_6[(G_VAL(src_ptr))]; + b = p_to_6[(B_VAL(src_ptr))]; + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK]; + if ((p_to_6_err[(R_VAL(src_ptr))] >= dith ) && (r < 5)) r++; + if ((p_to_6_err[(G_VAL(src_ptr))] >= dith ) && (g < 5)) g++; + if ((p_to_6_err[(B_VAL(src_ptr))] >= dith ) && (b < 5)) b++; + + *dst_ptr = pal[(r * 36) + (g * 6) + (b)]; + + CONVERT_LOOP_END_ROT_0(); +} +#endif +#ifdef BUILD_CONVERT_8_RGB_232 +void evas_common_convert_rgba_to_8bpp_rgb_232_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA8 *dst_ptr; + int x, y; + DATA8 r, g, b; + DATA8 dith, dith2; + + dst_ptr = (DATA8 *)dst; + + CONVERT_LOOP_START_ROT_0(); + + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(3); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(2); +/* r = (R_VAL(src_ptr)) >> (8 - 2);*/ +/* g = (G_VAL(src_ptr)) >> (8 - 3);*/ +/* b = (B_VAL(src_ptr)) >> (8 - 2);*/ +/* if (((R_VAL(src_ptr) - (r << (8 - 2))) >= dith2) && (r < 0x03)) r++;*/ +/* if (((G_VAL(src_ptr) - (g << (8 - 3))) >= dith ) && (g < 0x07)) g++;*/ +/* if (((B_VAL(src_ptr) - (b << (8 - 2))) >= dith2) && (b < 0x03)) b++;*/ + r = (R_VAL(src_ptr)) * 3 / 255; + if (((R_VAL(src_ptr) - (r * 255 / 3)) >= dith2) && (r < 0x03)) r++; + g = (G_VAL(src_ptr)) * 7 / 255; + if (((G_VAL(src_ptr) - (g * 255 / 7)) >= dith ) && (g < 0x07)) g++; + b = (B_VAL(src_ptr)) * 3 / 255; + if (((B_VAL(src_ptr) - (b * 255 / 3)) >= dith2) && (b < 0x03)) b++; + + *dst_ptr = pal[(r << 5) | (g << 2) | (b)]; + + CONVERT_LOOP_END_ROT_0(); +} +#endif +#ifdef BUILD_CONVERT_8_RGB_222 +void evas_common_convert_rgba_to_8bpp_rgb_222_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA8 *dst_ptr; + int x, y; + DATA8 r, g, b; + DATA8 dith; + + dst_ptr = (DATA8 *)dst; + + CONVERT_LOOP_START_ROT_0(); + + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(2); +/* r = (R_VAL(src_ptr)) >> (8 - 2);*/ +/* g = (G_VAL(src_ptr)) >> (8 - 2);*/ +/* b = (B_VAL(src_ptr)) >> (8 - 2);*/ +/* if (((R_VAL(src_ptr) - (r << (8 - 2))) >= dith ) && (r < 0x03)) r++;*/ +/* if (((G_VAL(src_ptr) - (g << (8 - 2))) >= dith ) && (g < 0x03)) g++;*/ +/* if (((B_VAL(src_ptr) - (b << (8 - 2))) >= dith ) && (b < 0x03)) b++;*/ + r = (R_VAL(src_ptr)) * 3 / 255; + if (((R_VAL(src_ptr) - (r * 255 / 3)) >= dith ) && (r < 0x03)) r++; + g = (G_VAL(src_ptr)) * 3 / 255; + if (((G_VAL(src_ptr) - (g * 255 / 3)) >= dith ) && (g < 0x03)) g++; + b = (B_VAL(src_ptr)) * 3 / 255; + if (((B_VAL(src_ptr) - (b * 255 / 3)) >= dith ) && (b < 0x03)) b++; + + *dst_ptr = pal[(r << 4) | (g << 2) | (b)]; + + CONVERT_LOOP_END_ROT_0(); +} +#endif +#ifdef BUILD_CONVERT_8_RGB_221 +void evas_common_convert_rgba_to_8bpp_rgb_221_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA8 *dst_ptr; + int x, y; + DATA8 r, g, b; + DATA8 dith, dith2; + + dst_ptr = (DATA8 *)dst; + + CONVERT_LOOP_START_ROT_0(); + + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(2); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(1); +/* r = (R_VAL(src_ptr)) >> (8 - 2);*/ +/* g = (G_VAL(src_ptr)) >> (8 - 2);*/ +/* b = (B_VAL(src_ptr)) >> (8 - 1);*/ +/* if (((R_VAL(src_ptr) - (r << (8 - 2))) >= dith ) && (r < 0x03)) r++;*/ +/* if (((G_VAL(src_ptr) - (g << (8 - 2))) >= dith ) && (g < 0x03)) g++;*/ +/* if (((B_VAL(src_ptr) - (b << (8 - 1))) >= dith2) && (b < 0x01)) b++;*/ + r = (R_VAL(src_ptr)) * 3 / 255; + if (((R_VAL(src_ptr) - (r * 255 / 3)) >= dith ) && (r < 0x03)) r++; + g = (G_VAL(src_ptr)) * 3 / 255; + if (((G_VAL(src_ptr) - (g * 255 / 3)) >= dith ) && (g < 0x03)) g++; + b = (B_VAL(src_ptr)) * 1 / 255; + if (((B_VAL(src_ptr) - (b * 255 / 1)) >= dith2) && (b < 0x01)) b++; + + *dst_ptr = pal[(r << 3) | (g << 1) | (b)]; + + CONVERT_LOOP_END_ROT_0(); +} +#endif +#ifdef BUILD_CONVERT_8_RGB_121 +void evas_common_convert_rgba_to_8bpp_rgb_121_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA8 *dst_ptr; + int x, y; + DATA8 r, g, b; + DATA8 dith, dith2; + + dst_ptr = (DATA8 *)dst; + + CONVERT_LOOP_START_ROT_0(); + + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(2); + dith2 = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(1); +/* r = (R_VAL(src_ptr)) >> (8 - 1);*/ +/* g = (G_VAL(src_ptr)) >> (8 - 2);*/ +/* b = (B_VAL(src_ptr)) >> (8 - 1);*/ +/* if (((R_VAL(src_ptr) - (r << (8 - 1))) >= dith2) && (r < 0x01)) r++;*/ +/* if (((G_VAL(src_ptr) - (g << (8 - 2))) >= dith ) && (g < 0x03)) g++;*/ +/* if (((B_VAL(src_ptr) - (b << (8 - 1))) >= dith2) && (b < 0x01)) b++;*/ + + r = (R_VAL(src_ptr)) * 1 / 255; + if (((R_VAL(src_ptr) - (r * 255 / 1)) >= dith2) && (r < 0x01)) r++; + g = (G_VAL(src_ptr)) * 3 / 255; + if (((G_VAL(src_ptr) - (g * 255 / 3)) >= dith ) && (g < 0x03)) g++; + b = (B_VAL(src_ptr)) * 1 / 255; + if (((B_VAL(src_ptr) - (b * 255 / 1)) >= dith2) && (b < 0x01)) b++; + + *dst_ptr = pal[(r << 3) | (g << 1) | (b)]; + + CONVERT_LOOP_END_ROT_0(); +} +#endif +#ifdef BUILD_CONVERT_8_RGB_111 +void evas_common_convert_rgba_to_8bpp_rgb_111_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA8 *dst_ptr; + int x, y; + DATA8 r, g, b; + DATA8 dith; + + dst_ptr = (DATA8 *)dst; + + CONVERT_LOOP_START_ROT_0(); + + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK] >> DM_SHF(1); +/* r = (R_VAL(src_ptr)) >> (8 - 1);*/ +/* g = (G_VAL(src_ptr)) >> (8 - 1);*/ +/* b = (B_VAL(src_ptr)) >> (8 - 1);*/ +/* if (((R_VAL(src_ptr) - (r << (8 - 1))) >= dith ) && (r < 0x01)) r++;*/ +/* if (((G_VAL(src_ptr) - (g << (8 - 1))) >= dith ) && (g < 0x01)) g++;*/ +/* if (((B_VAL(src_ptr) - (b << (8 - 1))) >= dith ) && (b < 0x01)) b++;*/ + + r = (R_VAL(src_ptr)) * 1 / 255; + if (((R_VAL(src_ptr) - (r * 255 / 1)) >= dith ) && (r < 0x01)) r++; + g = (G_VAL(src_ptr)) * 1 / 255; + if (((G_VAL(src_ptr) - (g * 255 / 1)) >= dith ) && (g < 0x01)) g++; + b = (B_VAL(src_ptr)) * 1 / 255; + if (((B_VAL(src_ptr) - (b * 255 / 1)) >= dith ) && (b < 0x01)) b++; + + *dst_ptr = pal[(r << 2) | (g << 1) | (b)]; + + CONVERT_LOOP_END_ROT_0(); +} +#endif diff --git a/src/lib/engines/common/evas_convert_rgb_8.h b/src/lib/engines/common/evas_convert_rgb_8.h new file mode 100644 index 0000000..b7f85b0 --- /dev/null +++ b/src/lib/engines/common/evas_convert_rgb_8.h @@ -0,0 +1,18 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_CONVERT_RGB_8_H +#define _EVAS_CONVERT_RGB_8_H + + +void evas_common_convert_rgba_to_8bpp_rgb_332_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_8bpp_rgb_666_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_8bpp_rgb_232_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_8bpp_rgb_222_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_8bpp_rgb_221_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_8bpp_rgb_121_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); +void evas_common_convert_rgba_to_8bpp_rgb_111_dith (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); + + +#endif /* _EVAS_CONVERT_RGB_8_H */ diff --git a/src/lib/engines/common/evas_convert_yuv.c b/src/lib/engines/common/evas_convert_yuv.c new file mode 100644 index 0000000..ebd019b --- /dev/null +++ b/src/lib/engines/common/evas_convert_yuv.c @@ -0,0 +1,978 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_convert_yuv.h" + +#if defined BUILD_MMX || defined BUILD_SSE +# include "evas_mmx.h" +#endif + +#if defined HAVE_ALTIVEC_H +# include +#ifdef CONFIG_DARWIN +#define AVV(x...) (x) +#else +#define AVV(x...) {x} +#endif + +#endif + +#ifdef BUILD_CONVERT_YUV + +static void _evas_yuv_init (void); +static void _evas_yv12torgb_sse (unsigned char **yuv, unsigned char *rgb, int w, int h); +static void _evas_yv12torgb_mmx (unsigned char **yuv, unsigned char *rgb, int w, int h); +static void _evas_yv12torgb_altivec(unsigned char **yuv, unsigned char *rgb, int w, int h); +static void _evas_yv12torgb_raster (unsigned char **yuv, unsigned char *rgb, int w, int h); +static void _evas_yv12torgb_diz (unsigned char **yuv, unsigned char *rgb, int w, int h); + +#define CRV 104595 +#define CBU 132251 +#define CGU 25624 +#define CGV 53280 +#define YMUL 76283 +#define OFF 32768 +#define BITRES 16 + +/* calculation float resolution in bits */ +/* ie RES = 6 is 10.6 fixed point */ +/* RES = 8 is 8.8 fixed point */ +/* RES = 4 is 12.4 fixed point */ +/* NB: going above 6 will lead to overflow... :( */ +#define RES 6 + +#define RZ(i) (i >> (BITRES - RES)) +#define FOUR(i) {i, i, i, i} + +#if defined BUILD_MMX || defined BUILD_SSE +__attribute__ ((aligned (8))) const volatile unsigned short _const_crvcrv[4] = FOUR(RZ(CRV)); +__attribute__ ((aligned (8))) const volatile unsigned short _const_cbucbu[4] = FOUR(RZ(CBU)); +__attribute__ ((aligned (8))) const volatile unsigned short _const_cgucgu[4] = FOUR(RZ(CGU)); +__attribute__ ((aligned (8))) const volatile unsigned short _const_cgvcgv[4] = FOUR(RZ(CGV)); +__attribute__ ((aligned (8))) const volatile unsigned short _const_ymul [4] = FOUR(RZ(YMUL)); +__attribute__ ((aligned (8))) const volatile unsigned short _const_128 [4] = FOUR(128); +__attribute__ ((aligned (8))) const volatile unsigned short _const_32 [4] = FOUR(RZ(OFF)); +__attribute__ ((aligned (8))) const volatile unsigned short _const_16 [4] = FOUR(16); +__attribute__ ((aligned (8))) const volatile unsigned short _const_ff [4] = FOUR(-1); + +#define CONST_CRVCRV *_const_crvcrv +#define CONST_CBUCBU *_const_cbucbu +#define CONST_CGUCGU *_const_cgucgu +#define CONST_CGVCGV *_const_cgvcgv +#define CONST_YMUL *_const_ymul +#define CONST_128 *_const_128 +#define CONST_32 *_const_32 +#define CONST_16 *_const_16 +#define CONST_FF *_const_ff + +/* for C non aligned cleanup */ +const int _crv = RZ(CRV); /* 1.596 */ +const int _cbu = RZ(CBU); /* 2.018 */ +const int _cgu = RZ(CGU); /* 0.391 */ +const int _cgv = RZ(CGV); /* 0.813 */ + +#endif + +#ifdef BUILD_ALTIVEC +#ifdef __VEC__ +const vector unsigned short res = AVV(RES); +const vector signed short crv = AVV(RZ(CRV)); +const vector signed short cbu = AVV(RZ(CBU)); +const vector signed short cgu = AVV(RZ(CGU)); +const vector signed short cgv = AVV(RZ(CGV)); +const vector signed short ymul = AVV(RZ(YMUL)); +const vector signed short c128 = AVV(128); +const vector signed short c32 = AVV(RZ(OFF)); +const vector signed short c16 = AVV(16); +const vector unsigned char zero = AVV(0); +const vector signed short maxchar = AVV(255); +const vector unsigned char pickrg1 = AVV(0, 0x1, 0x11, 0, + 0, 0x3, 0x13, 0, + 0, 0x5, 0x15, 0, + 0, 0x7, 0x17, 0); +const vector unsigned char pickrg2 = AVV(0, 0x9, 0x19, 0, + 0, 0xb, 0x1b, 0, + 0, 0xd, 0x1d, 0, + 0, 0xf, 0x1f, 0); +const vector unsigned char pickrgb1 = AVV(0x3, 0x1, 0x2, 0x11, + 0x7, 0x5, 0x6, 0x13, + 0xb, 0x9, 0xa, 0x15, + 0xf, 0xd, 0xe, 0x17); +const vector unsigned char pickrgb2 = AVV(0x3, 0x1, 0x2, 0x19, + 0x7, 0x5, 0x6, 0x1b, + 0xb, 0x9, 0xa, 0x1d, + 0xf, 0xd, 0xe, 0x1f); +#endif +#endif + +#ifdef BUILD_C + +/* shortcut speedup lookup-tables */ +static short _v1164[256]; +static short _v1596[256]; +static short _v813[256]; +static short _v391[256]; +static short _v2018[256]; + +static unsigned char _clip_lut[1024]; +#define LUT_CLIP(i) ((_clip_lut+384)[(i)]) + +#define CMP_CLIP(i) ((i&256)? (~(i>>10)) : i); + +#endif + +void +evas_common_convert_yuv_420p_601_rgba(DATA8 **src, DATA8 *dst, int w, int h) +{ + int mmx, sse, sse2; + +#if defined BUILD_MMX || defined BUILD_SSE + evas_common_cpu_can_do(&mmx, &sse, &sse2); +#endif +#ifndef BUILD_SSE + sse = 0; + sse2 = 0; +#endif +#ifndef BUILD_MMX + mmx = 0; +#endif + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX2)) + _evas_yv12torgb_sse(src, dst, w, h); + else if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + _evas_yv12torgb_mmx(src, dst, w, h); +#ifdef BUILD_ALTIVEC + if (evas_common_cpu_has_feature(CPU_FEATURE_ALTIVEC)) + _evas_yv12torgb_altivec(src, dst, w, h); +#endif + else + { +#ifdef BUILD_C + static int initted = 0; + + if (!initted) _evas_yuv_init(); + initted = 1; + /* FIXME: diz may be faster sometimes */ + _evas_yv12torgb_raster(src, dst, w, h); +#endif + } +} + +/* Thanks to Diz for this code. i've munged it a little and turned it into */ +/* inline macros. I tried beating it with a different algorithm using MMX */ +/* but failed. So here we are. This is the fastest YUV->RGB i know of for */ +/* x86. It has an issue that it doesnt convert colours accurately so the */ +/* image looks a little "yellowy". This is a result of only 10.6 fixed point */ +/* resolution as opposed to 16.16 in the C code. This could be fixed by */ +/* processing half the number of pixels per cycle and going up to 32bits */ +/* per element during compute, but it would all but negate the speedup */ +/* from mmx I think :( It might be possible to use SSE and SSE2 here, but */ +/* I haven't tried yet. Let's see. */ + +/* NB: XviD has almost the same code in it's assembly YV12->RGB code. same */ +/* algorithm, same constants, same all over actually, except it actually */ +/* does a few extra memory accesses that this one doesn't, so in theory */ +/* this code should be faster. In the end it's all just an mmx version of */ +/* the reference implimentation done with fixed point math */ + +static void +_evas_yv12torgb_sse(unsigned char **yuv, unsigned char *rgb, int w, int h) +{ +#ifdef BUILD_SSE + int xx, yy; + register unsigned char *yp1, *up, *vp; + unsigned char *dp1; + + /* destination pointers */ + dp1 = rgb; + + for (yy = 0; yy < h; yy++) + { + /* plane pointers */ + yp1 = yuv[yy]; + up = yuv[h + (yy / 2)]; + vp = yuv[h + (h / 2) + (yy / 2)]; + for (xx = 0; xx < (w - 7); xx += 8) + { + movd_m2r(*up, mm3); + movd_m2r(*vp, mm2); + movq_m2r(*yp1, mm0); + + pxor_r2r(mm7, mm7); + punpcklbw_r2r(mm7, mm2); + punpcklbw_r2r(mm7, mm3); + + movq_r2r(mm0, mm1); + psrlw_i2r(8, mm0); + psllw_i2r(8, mm1); + psrlw_i2r(8, mm1); + + movq_m2r(CONST_16, mm4); + psubsw_r2r(mm4, mm0); + psubsw_r2r(mm4, mm1); + + movq_m2r(CONST_128, mm5); + psubsw_r2r(mm5, mm2); + psubsw_r2r(mm5, mm3); + + movq_m2r(CONST_YMUL, mm4); + pmullw_r2r(mm4, mm0); + pmullw_r2r(mm4, mm1); + + movq_m2r(CONST_CRVCRV, mm7); + pmullw_r2r(mm3, mm7); + movq_m2r(CONST_CBUCBU, mm6); + pmullw_r2r(mm2, mm6); + movq_m2r(CONST_CGUCGU, mm5); + pmullw_r2r(mm2, mm5); + movq_m2r(CONST_CGVCGV, mm4); + pmullw_r2r(mm3, mm4); + + movq_r2r(mm0, mm2); + paddsw_r2r(mm7, mm2); + paddsw_r2r(mm1, mm7); + + psraw_i2r(RES, mm2); + psraw_i2r(RES, mm7); + packuswb_r2r(mm7, mm2); + + pxor_r2r(mm7, mm7); + movq_r2r(mm2, mm3); + punpckhbw_r2r(mm7, mm2); + punpcklbw_r2r(mm3, mm7); + por_r2r(mm7, mm2); + + movq_r2r(mm0, mm3); + psubsw_r2r(mm5, mm3); + psubsw_r2r(mm4, mm3); + paddsw_m2r(CONST_32, mm3); + + movq_r2r(mm1, mm7); + psubsw_r2r(mm5, mm7); + psubsw_r2r(mm4, mm7); + paddsw_m2r(CONST_32, mm7); + + psraw_i2r(RES, mm3); + psraw_i2r(RES, mm7); + packuswb_r2r(mm7, mm3); + + pxor_r2r(mm7, mm7); + movq_r2r(mm3, mm4); + punpckhbw_r2r(mm7, mm3); + punpcklbw_r2r(mm4, mm7); + por_r2r(mm7, mm3); + + movq_m2r(CONST_32, mm4); + paddsw_r2r(mm6, mm0); + paddsw_r2r(mm6, mm1); + paddsw_r2r(mm4, mm0); + paddsw_r2r(mm4, mm1); + psraw_i2r(RES, mm0); + psraw_i2r(RES, mm1); + packuswb_r2r(mm1, mm0); + + pxor_r2r(mm7, mm7); + movq_r2r(mm0, mm5); + punpckhbw_r2r(mm7, mm0); + punpcklbw_r2r(mm5, mm7); + por_r2r(mm7, mm0); + + movq_m2r(CONST_FF, mm1); + movq_r2r(mm0, mm5); + movq_r2r(mm3, mm6); + movq_r2r(mm2, mm7); + punpckhbw_r2r(mm3, mm2); + punpcklbw_r2r(mm6, mm7); + punpckhbw_r2r(mm1, mm0); + punpcklbw_r2r(mm1, mm5); + + movq_r2r(mm7, mm1); + punpckhwd_r2r(mm5, mm7); + punpcklwd_r2r(mm5, mm1); + + movq_r2r(mm2, mm4); + punpckhwd_r2r(mm0, mm2); + punpcklwd_r2r(mm0, mm4); + + movntq_r2m(mm1, *(dp1)); + movntq_r2m(mm7, *(dp1 + 8)); + movntq_r2m(mm4, *(dp1 + 16)); + movntq_r2m(mm2, *(dp1 + 24)); + + yp1 += 8; + up += 4; + vp += 4; + dp1 += 8 * 4; + } + /* cleanup pixles that arent a multiple of 8 pixels wide */ + if (xx < w) + { + int y, u, v, r, g, b; + + for (; xx < w; xx += 2) + { + u = (*up++) - 128; + v = (*vp++) - 128; + + A_VAL(dp1) = 0xff; + y = RZ(YMUL) * ((*yp1++) - 16); + r = (y + (_crv * v)) >> RES; + r = LUT_CLIP(r); + R_VAL(dp1) = r; + g = (y - (_cgu * u) - (_cgv * v) + RZ(OFF)) >> RES; + g = LUT_CLIP(g); + G_VAL(dp1) = g; + b = (y + (_cbu * u) + RZ(OFF)) >> RES; + b = LUT_CLIP(b); + B_VAL(dp1) = b; + + dp1 += 4; + + A_VAL(dp1) = 0xff; + y = RZ(YMUL) * ((*yp1++) - 16); + r = (y + (_crv * v)) >> RES; + r = LUT_CLIP(r); + R_VAL(dp1) = r; + g = (y - (_cgu * u) - (_cgv * v) + RZ(OFF)) >> RES; + g = LUT_CLIP(g); + G_VAL(dp1) = g; + b = (y + (_cbu * u) + RZ(OFF)) >> RES; + b = LUT_CLIP(b); + B_VAL(dp1) = b; + + dp1 += 4; + } + } + } + emms(); +#else + _evas_yv12torgb_mmx(yuv, rgb, w, h); +#endif +} + +static void +_evas_yv12torgb_mmx(unsigned char **yuv, unsigned char *rgb, int w, int h) +{ +#ifdef BUILD_MMX + int xx, yy; + register unsigned char *yp1, *up, *vp; + unsigned char *dp1; + + /* destination pointers */ + dp1 = rgb; + + for (yy = 0; yy < h; yy++) + { + /* plane pointers */ + yp1 = yuv[yy]; + up = yuv[h + (yy / 2)]; + vp = yuv[h + (h / 2) + (yy / 2)]; + for (xx = 0; xx < (w - 7); xx += 8) + { + movd_m2r(*up, mm3); + movd_m2r(*vp, mm2); + movq_m2r(*yp1, mm0); + + pxor_r2r(mm7, mm7); + punpcklbw_r2r(mm7, mm2); + punpcklbw_r2r(mm7, mm3); + + movq_r2r(mm0, mm1); + psrlw_i2r(8, mm0); + psllw_i2r(8, mm1); + psrlw_i2r(8, mm1); + + movq_m2r(CONST_16, mm4); + psubsw_r2r(mm4, mm0); + psubsw_r2r(mm4, mm1); + + movq_m2r(CONST_128, mm5); + psubsw_r2r(mm5, mm2); + psubsw_r2r(mm5, mm3); + + movq_m2r(CONST_YMUL, mm4); + pmullw_r2r(mm4, mm0); + pmullw_r2r(mm4, mm1); + + movq_m2r(CONST_CRVCRV, mm7); + pmullw_r2r(mm3, mm7); + movq_m2r(CONST_CBUCBU, mm6); + pmullw_r2r(mm2, mm6); + movq_m2r(CONST_CGUCGU, mm5); + pmullw_r2r(mm2, mm5); + movq_m2r(CONST_CGVCGV, mm4); + pmullw_r2r(mm3, mm4); + + movq_r2r(mm0, mm2); + paddsw_r2r(mm7, mm2); + paddsw_r2r(mm1, mm7); + + psraw_i2r(RES, mm2); + psraw_i2r(RES, mm7); + packuswb_r2r(mm7, mm2); + + pxor_r2r(mm7, mm7); + movq_r2r(mm2, mm3); + punpckhbw_r2r(mm7, mm2); + punpcklbw_r2r(mm3, mm7); + por_r2r(mm7, mm2); + + movq_r2r(mm0, mm3); + psubsw_r2r(mm5, mm3); + psubsw_r2r(mm4, mm3); + paddsw_m2r(CONST_32, mm3); + + movq_r2r(mm1, mm7); + psubsw_r2r(mm5, mm7); + psubsw_r2r(mm4, mm7); + paddsw_m2r(CONST_32, mm7); + + psraw_i2r(RES, mm3); + psraw_i2r(RES, mm7); + packuswb_r2r(mm7, mm3); + + pxor_r2r(mm7, mm7); + movq_r2r(mm3, mm4); + punpckhbw_r2r(mm7, mm3); + punpcklbw_r2r(mm4, mm7); + por_r2r(mm7, mm3); + + movq_m2r(CONST_32, mm4); + paddsw_r2r(mm6, mm0); + paddsw_r2r(mm6, mm1); + paddsw_r2r(mm4, mm0); + paddsw_r2r(mm4, mm1); + psraw_i2r(RES, mm0); + psraw_i2r(RES, mm1); + packuswb_r2r(mm1, mm0); + + pxor_r2r(mm7, mm7); + movq_r2r(mm0, mm5); + punpckhbw_r2r(mm7, mm0); + punpcklbw_r2r(mm5, mm7); + por_r2r(mm7, mm0); + + movq_m2r(CONST_FF, mm1); + movq_r2r(mm0, mm5); + movq_r2r(mm3, mm6); + movq_r2r(mm2, mm7); + punpckhbw_r2r(mm3, mm2); + punpcklbw_r2r(mm6, mm7); + punpckhbw_r2r(mm1, mm0); + punpcklbw_r2r(mm1, mm5); + + movq_r2r(mm7, mm1); + punpckhwd_r2r(mm5, mm7); + punpcklwd_r2r(mm5, mm1); + + movq_r2r(mm2, mm4); + punpckhwd_r2r(mm0, mm2); + punpcklwd_r2r(mm0, mm4); + + movq_r2m(mm1, *(dp1)); + movq_r2m(mm7, *(dp1 + 8)); + movq_r2m(mm4, *(dp1 + 16)); + movq_r2m(mm2, *(dp1 + 24)); + + yp1 += 8; + up += 4; + vp += 4; + dp1 += 8 * 4; + } + /* cleanup pixles that arent a multiple of 8 pixels wide */ + if (xx < w) + { + int y, u, v, r, g, b; + + for (; xx < w; xx += 2) + { + u = (*up++) - 128; + v = (*vp++) - 128; + + A_VAL(dp1) = 0xff; + y = RZ(YMUL) * ((*yp1++) - 16); + r = (y + (_crv * v)) >> RES; + r = LUT_CLIP(r); + R_VAL(dp1) = r; + g = (y - (_cgu * u) - (_cgv * v) + RZ(OFF)) >> RES; + g = LUT_CLIP(g); + G_VAL(dp1) = g; + b = (y + (_cbu * u) + RZ(OFF)) >> RES; + b = LUT_CLIP(b); + B_VAL(dp1) = b; + + dp1 += 4; + + A_VAL(dp1) = 0xff; + y = RZ(YMUL) * ((*yp1++) - 16); + r = (y + (_crv * v)) >> RES; + r = LUT_CLIP(r); + R_VAL(dp1) = r; + g = (y - (_cgu * u) - (_cgv * v) + RZ(OFF)) >> RES; + g = LUT_CLIP(g); + G_VAL(dp1) = g; + b = (y + (_cbu * u) + RZ(OFF)) >> RES; + b = LUT_CLIP(b); + B_VAL(dp1) = b; + + dp1 += 4; + } + } + } + emms(); +#else + _evas_yv12torgb_raster(yuv, rgb, w, h); +#endif +} + +static void +_evas_yv12torgb_altivec(unsigned char **yuv, unsigned char *rgb, int w, int h) +{ +#ifdef BUILD_ALTIVEC +#ifdef __VEC__ + int xx, yy; + int w2, h2; + unsigned char *yp1, *yp2, *up, *vp; + unsigned char *dp1, *dp2; + vector signed short y, u, v; + vector signed short r, g, b; + vector signed short tmp1, tmp2, tmp3; + vector unsigned char yperm, uperm, vperm, rgb1, rgb2; + vector unsigned char alpha; + + /* handy halved w & h */ + w2 = w / 2; + h2 = h / 2; + /* plane pointers */ + yp1 = yuv; + yp2 = yuv + w; + up = yuv + (w * h); + vp = up + (w2 * h2); + /* destination pointers */ + dp1 = rgb; + dp2 = rgb + (w * 4); + + alpha = vec_mergeh((vector unsigned char)AVV(255), zero); + alpha = (vector unsigned char)vec_mergeh((vector unsigned short)alpha, + (vector unsigned short)zero); + + for (yy = 0; yy < h2; yy++) + { + for (xx = 0; xx < w2; xx += 4) + { +/* Cycles */ + /* + * Load 4 y and 4 u & v pixels for the 8x2 pixel block. + */ +/* 3 */ tmp3 = (vector signed short)vec_lde(0, (unsigned int *)yp1); +/* 3 */ tmp1 = (vector signed short)vec_lde(0, (unsigned int *)up); +/* 3 */ tmp2 = (vector signed short)vec_lde(0, (unsigned int *)vp); + + /* Prepare for aligning the data in their vectors */ +/* 3 */ yperm = vec_lvsl(0, yp1); +/* 3 */ uperm = vec_lvsl(0, up); +/* 3 */ vperm = vec_lvsl(0, vp); + yp1 += 4; + + /* Save y and load the next 4 y pixels for a total of 8 */ +/* 2 */ y = vec_perm(tmp3, tmp3, yperm); +/* 3 */ tmp3 = (vector signed short)vec_lde(0, (unsigned int *)yp1); + + /* Setup and calculate the 4 u pixels */ +/* 2 */ tmp1 = vec_perm(tmp1, tmp1, uperm); +/* 2 */ tmp2 = vec_perm(tmp2, tmp2, vperm); + + /* Avoid dependancy stalls on yperm and calculate the 4 u values */ +/* 3 */ yperm = vec_lvsr(12, yp1); +/* 1 */ tmp1 = (vector signed short)vec_mergeh((vector unsigned char)tmp1, + (vector unsigned char)tmp1); +/* 1 */ u = (vector signed short)vec_mergeh(zero, + (vector unsigned char)tmp1); + +/* 1 */ u = vec_sub(u, c128); +/* 2 */ tmp3 = vec_perm(tmp3, tmp3, yperm); + + /* Setup and calculate the 4 v values */ +/* 1 */ tmp2 = (vector signed short)vec_mergeh((vector unsigned char)tmp2, + (vector unsigned char)tmp2); +/* 1 */ v = (vector signed short)vec_mergeh(zero, + (vector unsigned char)tmp2); +/* 4 */ tmp2 = vec_mladd(cgu, u, (vector signed short)zero); +/* 1 */ v = vec_sub(v, c128); + + /* Move the data into y and start loading the next 4 pixels */ +/* 1 */ y = (vector signed short)vec_mergeh(zero, + (vector unsigned char)y); +/* 1 */ tmp3 = (vector signed short)vec_mergeh(zero, + (vector unsigned char)tmp3); +/* 1 */ y = vec_or(y, tmp3); + + /* Finish calculating y */ +/* 1 */ y = vec_sub(y, c16); +/* 4 */ y = vec_mladd(ymul, y, (vector signed short)zero); + + /* Perform non-dependant multiplies first. */ +/* 4 */ tmp1 = vec_mladd(crv, v, y); +/* 4 */ tmp2 = vec_mladd(cgv, v, tmp2); +/* 4 */ tmp3 = vec_mladd(cbu, u, y); + + /* Calculate rgb values */ +/* 1 */ r = vec_sra(tmp1, res); + +/* 1 */ tmp2 = vec_sub(y, tmp2); +/* 1 */ tmp2 = vec_add(tmp2, c32); +/* 1 */ g = vec_sra(tmp2, res); + +/* 1 */ tmp3 = vec_add(tmp3, c32); +/* 1 */ b = vec_sra(tmp3, res); + + /* Bound to 0 <= x <= 255 */ +/* 1 */ r = vec_min(r, maxchar); +/* 1 */ g = vec_min(g, maxchar); +/* 1 */ b = vec_min(b, maxchar); +/* 1 */ r = vec_max(r, (vector signed short)zero); +/* 1 */ g = vec_max(g, (vector signed short)zero); +/* 1 */ b = vec_max(b, (vector signed short)zero); + + /* Combine r, g and b. */ +/* 2 */ rgb1 = vec_perm((vector unsigned char)r, (vector unsigned char)g, + pickrg1); +/* 2 */ rgb2 = vec_perm((vector unsigned char)r, (vector unsigned char)g, + pickrg2); + +/* 2 */ rgb1 = vec_perm(rgb1, (vector unsigned char)b, pickrgb1); +/* 2 */ rgb2 = vec_perm(rgb2, (vector unsigned char)b, pickrgb2); + +/* 1 */ rgb1 = vec_or(alpha, rgb1); +/* 1 */ rgb2 = vec_or(alpha, rgb2); + +/* 3 */ vec_stl(rgb1, 0, dp1); + dp1 += 16; +/* 3 */ vec_stl(rgb2, 0, dp1); + + /* + * Begin the second row calculations + */ + + /* + * Load 4 y pixels for the 8x2 pixel block. + */ +/* 3 */ yperm = vec_lvsl(0, yp2); +/* 3 */ tmp3 = (vector signed short)vec_lde(0, (unsigned int *)yp2); + yp2 += 4; + + /* Save y and load the next 4 y pixels for a total of 8 */ +/* 2 */ y = vec_perm(tmp3, tmp3, yperm); +/* 3 */ yperm = vec_lvsr(12, yp2); +/* 3 */ tmp3 = (vector signed short)vec_lde(0, (unsigned int *)yp2); +/* 1 */ y = (vector signed short)vec_mergeh(zero, + (vector unsigned char)y); + + /* Avoid dependancy stalls on yperm */ +/* 2 */ tmp3 = vec_perm(tmp3, tmp3, yperm); +/* 1 */ tmp3 = (vector signed short)vec_mergeh(zero, + (vector unsigned char)tmp3); +/* 1 */ y = vec_or(y, tmp3); + + /* Start the calculation for g */ +/* 4 */ tmp2 = vec_mladd(cgu, u, (vector signed short)zero); + + /* Finish calculating y */ +/* 1 */ y = vec_sub(y, c16); +/* 4 */ y = vec_mladd(ymul, y, (vector signed short)zero); + + /* Perform non-dependant multiplies first. */ +/* 4 */ tmp2 = vec_mladd(cgv, v, tmp2); +/* 4 */ tmp1 = vec_mladd(crv, v, y); +/* 4 */ tmp3 = vec_mladd(cbu, u, y); + + /* Calculate rgb values */ +/* 1 */ r = vec_sra(tmp1, res); + +/* 1 */ tmp2 = vec_sub(y, tmp2); +/* 1 */ tmp2 = vec_add(tmp2, c32); +/* 1 */ g = vec_sra(tmp2, res); + +/* 1 */ tmp3 = vec_add(tmp3, c32); +/* 1 */ b = vec_sra(tmp3, res); + + /* Bound to 0 <= x <= 255 */ +/* 1 */ r = vec_min(r, maxchar); +/* 1 */ g = vec_min(g, maxchar); +/* 1 */ b = vec_min(b, maxchar); +/* 1 */ r = vec_max(r, (vector signed short)zero); +/* 1 */ g = vec_max(g, (vector signed short)zero); +/* 1 */ b = vec_max(b, (vector signed short)zero); + + /* Combine r, g and b. */ +/* 2 */ rgb1 = vec_perm((vector unsigned char)r, (vector unsigned char)g, + pickrg1); +/* 2 */ rgb2 = vec_perm((vector unsigned char)r, (vector unsigned char)g, + pickrg2); + +/* 2 */ rgb1 = vec_perm(rgb1, (vector unsigned char)b, pickrgb1); +/* 2 */ rgb2 = vec_perm(rgb2, (vector unsigned char)b, pickrgb2); + +/* 1 */ rgb1 = vec_or(alpha, rgb1); +/* 1 */ rgb2 = vec_or(alpha, rgb2); + +/* 3 */ vec_stl(rgb1, 0, dp2); + dp2 += 16; +/* 3 */ vec_stl(rgb2, 0, dp2); + + /* Increment the YUV data pointers to the next set of pixels. */ + yp1 += 4; + yp2 += 4; + up += 4; + vp += 4; + + /* Move the destination pointers to the next set of pixels. */ + dp1 += 16; + dp2 += 16; + } + + /* jump down one line since we are doing 2 at once */ + yp1 += w; + yp2 += w; + dp1 += (w * 4); + dp2 += (w * 4); + } +#endif +#else + _evas_yv12torgb_diz(yuv, rgb, w, h); +#endif +} + +static void +_evas_yuv_init(void) +{ +#ifdef BUILD_C + int i; + + for (i = 0; i < 256; i++) + { + _v1164[i] = (int)(((float)(i - 16 )) * 1.164); + + _v1596[i] = (int)(((float)(i - 128)) * 1.596); + _v813[i] = (int)(((float)(i - 128)) * 0.813); + + _v391[i] = (int)(((float)(i - 128)) * 0.391); + _v2018[i] = (int)(((float)(i - 128)) * 2.018); + } + + for (i = -384; i < 640; i++) + { + _clip_lut[i+384] = i < 0 ? 0 : (i > 255) ? 255 : i; + } +#endif +} + +static void +_evas_yv12torgb_diz(unsigned char **yuv, unsigned char *rgb, int w, int h) +{ +#ifdef BUILD_C + int xx, yy; + int y, u, v, r, g, b; + unsigned char *yp1, *yp2, *up, *vp; + unsigned char *dp1, *dp2; + int crv, cbu, cgu, cgv; + + /* destination pointers */ + dp1 = rgb; + dp2 = rgb + (w * 4); + + crv = CRV; /* 1.596 */ + cbu = CBU; /* 2.018 */ + cgu = CGU; /* 0.391 */ + cgv = CGU; /* 0.813 */ + + for (yy = 0; yy < h; yy += 2) + { + /* plane pointers */ + yp1 = yuv[yy]; + yp2 = yuv[yy + 1]; + up = yuv[h + (yy / 2)]; + vp = yuv[h + (h / 2) + (yy / 2)]; + for (xx = 0; xx < w; xx += 2) + { + /* collect u & v for 2x2 pixel block */ + u = (*up++) - 128; + v = (*vp++) - 128; + + /* do the top 2 pixels of the 2x2 block whcih shared u & v */ + /* yuv to rgb */ + A_VAL(dp1) = 0xff; + y = YMUL * ((*yp1++) - 16); + r = (y + (crv * v)) >> 16; + r = LUT_CLIP(r); + R_VAL(dp1) = r; + g = (y - (cgu * u) - (cgv * v) + OFF) >>16; + g = LUT_CLIP(g); + G_VAL(dp1) = g; + b = (y + (cbu * u) + OFF) >> 16; + b = LUT_CLIP(b); + B_VAL(dp1) = b; + + dp1 += 4; + + /* yuv to rgb */ + A_VAL(dp1) = 0xff; + y = YMUL * ((*yp1++) - 16); + r = (y + (crv * v)) >> 16; + r = LUT_CLIP(r); + R_VAL(dp1) = r; + g = (y - (cgu * u) - (cgv * v) + OFF) >>16; + g = LUT_CLIP(g); + G_VAL(dp1) = g; + b = (y + (cbu * u) + OFF) >> 16; + b = LUT_CLIP(b); + B_VAL(dp1) = b; + + dp1 += 4; + + /* do the bottom 2 pixels */ + /* yuv to rgb */ + A_VAL(dp2) = 0xff; + y = YMUL * ((*yp2++) - 16); + r = (y + (crv * v)) >> 16; + r = LUT_CLIP(r); + R_VAL(dp2) = r; + g = (y - (cgu * u) - (cgv * v) + OFF) >>16; + g = LUT_CLIP(g); + G_VAL(dp2) = g; + b = (y + (cbu * u) + OFF) >> 16; + b = LUT_CLIP(b); + B_VAL(dp2) = b; + + dp2 += 4; + + /* yuv to rgb */ + A_VAL(dp2) = 0xff; + y = YMUL * ((*yp2++) - 16); + r = (y + (crv * v)) >> 16; + r = LUT_CLIP(r); + R_VAL(dp2) = r; + g = (y - (cgu * u) - (cgv * v) + OFF) >>16; + g = LUT_CLIP(g); + G_VAL(dp2) = g; + b = (y + (cbu * u) + OFF) >> 16; + b = LUT_CLIP(b); + B_VAL(dp2) = b; + + dp2 += 4; + } + /* jump down one line since we are doing 2 at once */ + dp1 += (w * 4); + dp2 += (w * 4); + } +#endif +} + +static void +_evas_yv12torgb_raster(unsigned char **yuv, unsigned char *rgb, int w, int h) +{ +#ifdef BUILD_C + int xx, yy; + int y, u, v, r, g, b; + unsigned char *yp1, *yp2, *up, *vp; + unsigned char *dp1, *dp2; + + /* destination pointers */ + dp1 = rgb; + dp2 = rgb + (w * 4); + + for (yy = 0; yy < h; yy += 2) + { + /* plane pointers */ + yp1 = yuv[yy]; + yp2 = yuv[yy + 1]; + up = yuv[h + (yy / 2)]; + vp = yuv[h + (h / 2) + (yy / 2)]; + for (xx = 0; xx < w; xx += 2) + { + int vmu; + + /* collect u & v for 2x2 pixel block */ + u = *up++; + v = *vp++; + + /* save lookups */ + vmu = _v813[v] + _v391[u]; + u = _v2018[u]; + v = _v1596[v]; + + /* do the top 2 pixels of the 2x2 block whcih shared u & v */ + /* yuv to rgb */ + y = _v1164[*yp1++]; + r = y + v; + r = LUT_CLIP(r); + g = y - vmu; + g = LUT_CLIP(g); + b = y + u; + b = LUT_CLIP(b); + + A_VAL(dp1) = 0xff; + R_VAL(dp1) = r; + G_VAL(dp1) = g; + B_VAL(dp1) = b; + + dp1 += 4; + + /* yuv to rgb */ + y = _v1164[*yp1++]; + r = y + v; + r = LUT_CLIP(r); + g = y - vmu; + g = LUT_CLIP(g); + b = y + u; + b = LUT_CLIP(b); + + A_VAL(dp1) = 0xff; + R_VAL(dp1) = r; + G_VAL(dp1) = g; + B_VAL(dp1) = b; + + dp1 += 4; + + /* do the bottom 2 pixels */ + /* yuv to rgb */ + y = _v1164[*yp2++]; + r = y + v; + r = LUT_CLIP(r); + g = y - vmu; + g = LUT_CLIP(g); + b = y + u; + b = LUT_CLIP(b); + + A_VAL(dp2) = 0xff; + R_VAL(dp2) = r; + G_VAL(dp2) = g; + B_VAL(dp2) = b; + + dp2 += 4; + + /* yuv to rgb */ + y = _v1164[*yp2++]; + r = y + v; + r = LUT_CLIP(r); + g = y - vmu; + g = LUT_CLIP(g); + b = y + u; + b = LUT_CLIP(b); + + A_VAL(dp2) = 0xff; + R_VAL(dp2) = r; + G_VAL(dp2) = g; + B_VAL(dp2) = b; + + dp2 += 4; + } + /* jump down one line since we are doing 2 at once */ + dp1 += (w * 4); + dp2 += (w * 4); + } +#endif +} + +#endif diff --git a/src/lib/engines/common/evas_convert_yuv.h b/src/lib/engines/common/evas_convert_yuv.h new file mode 100644 index 0000000..e03ff8b --- /dev/null +++ b/src/lib/engines/common/evas_convert_yuv.h @@ -0,0 +1,12 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_CONVERT_YUV_H +#define _EVAS_CONVERT_YUV_H + + +EAPI void evas_common_convert_yuv_420p_601_rgba (DATA8 **src, DATA8 *dst, int w, int h); + + +#endif /* _EVAS_CONVERT_YUV_H */ diff --git a/src/lib/engines/common/evas_cpu.c b/src/lib/engines/common/evas_cpu.c new file mode 100644 index 0000000..1fbb673 --- /dev/null +++ b/src/lib/engines/common/evas_cpu.c @@ -0,0 +1,238 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" + +#if defined BUILD_MMX || defined BUILD_SSE +#include "evas_mmx.h" +#endif + +#include + +#ifndef _WIN32 +static sigjmp_buf detect_buf; +#endif + +static int cpu_feature_mask = 0; + +#ifndef _WIN32 +static void evas_common_cpu_catch_ill(int sig); +static void evas_common_cpu_catch_segv(int sig); + +static void +evas_common_cpu_catch_ill(int sig) +{ + siglongjmp(detect_buf, 1); +} + +static void +evas_common_cpu_catch_segv(int sig) +{ + siglongjmp(detect_buf, 1); +} +#endif + +void +evas_common_cpu_mmx_test(void) +{ +#ifdef BUILD_MMX + pxor_r2r(mm4, mm4); +#endif +} + +void +evas_common_cpu_mmx2_test(void) +{ +#ifdef BUILD_MMX + char data[16]; + + data[0] = 0; + mmx_r2m(movntq, mm0, data); + data[0] = 0; +#endif +} + +void +evas_common_cpu_sse_test(void) +{ +#ifdef BUILD_SSE + int blah[16]; + + movntq_r2m(mm0, blah); +#endif +} + +void +evas_common_cpu_altivec_test(void) +{ +#ifdef __POWERPC__ +#ifdef __VEC__ + vector unsigned int zero; + + zero = vec_splat_u32(0); +#endif /* __VEC__ */ +#endif /* __POWERPC__ */ +} + +void +evas_common_cpu_vis_test(void) +{ +#ifdef __SPARC__ +#endif /* __SPARC__ */ +} + +int +evas_common_cpu_feature_test(void (*feature)(void)) +{ +#ifndef _WIN32 + int enabled = 1; + struct sigaction act, oact, oact2; + + act.sa_handler = evas_common_cpu_catch_ill; + act.sa_flags = SA_RESTART; + sigemptyset(&act.sa_mask); + sigaction(SIGILL, &act, &oact); + + act.sa_handler = evas_common_cpu_catch_segv; + act.sa_flags = SA_RESTART; + sigemptyset(&act.sa_mask); + sigaction(SIGSEGV, &act, &oact2); + + if (sigsetjmp(detect_buf, 1)) + { + sigaction(SIGILL, &oact, NULL); + sigaction(SIGSEGV, &oact2, NULL); + return 0; + } + + feature(); + + sigaction(SIGILL, &oact, NULL); + sigaction(SIGSEGV, &oact2, NULL); + return enabled; +#else + return 0; +#endif +} + +EAPI void +evas_common_cpu_init(void) +{ + static int called = 0; + + if (called) return; + called = 1; +#ifdef BUILD_MMX + cpu_feature_mask |= CPU_FEATURE_MMX * + evas_common_cpu_feature_test(evas_common_cpu_mmx_test); + evas_common_cpu_end_opt(); + cpu_feature_mask |= CPU_FEATURE_MMX2 * + evas_common_cpu_feature_test(evas_common_cpu_mmx2_test); + evas_common_cpu_end_opt(); +#ifdef BUILD_SSE + cpu_feature_mask |= CPU_FEATURE_SSE * + evas_common_cpu_feature_test(evas_common_cpu_sse_test); + evas_common_cpu_end_opt(); +#endif /* BUILD_SSE */ +#endif /* BUILD_MMX */ +#ifdef __POWERPC__ +#ifdef __VEC__ + cpu_feature_mask |= CPU_FEATURE_ALTIVEC * + evas_common_cpu_feature_test(evas_common_cpu_altivec_test); + evas_common_cpu_end_opt(); +#endif /* __VEC__ */ +#endif /* __POWERPC__ */ +#ifdef __SPARC__ + cpu_feature_mask |= CPU_FEATURE_VIS * + evas_common_cpu_feature_test(evas_common_cpu_vis_test); + evas_common_cpu_end_opt(); +#endif /* __SPARC__ */ +} + +int +evas_common_cpu_has_feature(unsigned int feature) +{ + return (cpu_feature_mask & feature); +} + +int +evas_common_cpu_have_cpuid(void) +{ + return 0; +/* +#ifdef BUILD_MMX + unsigned int have_cpu_id; + + have_cpu_id = 0; + have_cpuid(have_cpu_id); + return have_cpu_id; +#else + return 0; +#endif + */ +} + +EAPI void +evas_common_cpu_can_do(int *mmx, int *sse, int *sse2) +{ + static int do_mmx = 0, do_sse = 0, do_sse2 = 0, done = 0; + + if (!done) + { +# ifdef HARD_CODED_P3 + cpu_feature_mask |= CPU_FEATURE_MMX; + cpu_feature_mask |= CPU_FEATURE_SSE; +#endif +#ifdef HARD_CODED_P2 + cpu_feature_mask |= CPU_FEATURE_MMX; +#endif + if (cpu_feature_mask & CPU_FEATURE_MMX) do_mmx = 1; + if (cpu_feature_mask & CPU_FEATURE_MMX2) do_sse = 1; + if (cpu_feature_mask & CPU_FEATURE_SSE) do_sse = 1; + } +// printf("%i %i %i\n", do_mmx, do_sse, do_sse2); + *mmx = do_mmx; + *sse = do_sse; + *sse2 = do_sse2; + done = 1; +} + +#ifdef BUILD_MMX +EAPI void +evas_common_cpu_end_opt(void) +{ + if (cpu_feature_mask & + (CPU_FEATURE_MMX | CPU_FEATURE_MMX2)) + { + emms(); + } +} +#else +EAPI void +evas_common_cpu_end_opt(void) +{ +} +#endif + +EAPI int +evas_common_cpu_count(void) +{ +#ifdef BUILD_PTHREAD + cpu_set_t cpu; + int i; + static int cpus = 0; + + if (cpus != 0) return cpus; + + sched_getaffinity(getpid(), sizeof(cpu), &cpu); + for (i = 0; i < TH_MAX; i++) + { + if (CPU_ISSET(i, &cpu)) cpus = i + 1; + else break; + } + return cpus; +#else + return 1; +#endif +} diff --git a/src/lib/engines/common/evas_draw.h b/src/lib/engines/common/evas_draw.h new file mode 100644 index 0000000..4683bc3 --- /dev/null +++ b/src/lib/engines/common/evas_draw.h @@ -0,0 +1,38 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_DRAW_H +#define _EVAS_DRAW_H + + +EAPI void evas_common_draw_init (void); + +EAPI RGBA_Draw_Context *evas_common_draw_context_new (void); +EAPI void evas_common_draw_context_free (RGBA_Draw_Context *dc); +EAPI void evas_common_draw_context_font_ext_set (RGBA_Draw_Context *dc, + void *data, + void *(*gl_new) (void *data, RGBA_Font_Glyph *fg), + void (*gl_free) (void *ext_dat), + void (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y)); +EAPI void evas_common_draw_context_clip_clip (RGBA_Draw_Context *dc, int x, int y, int w, int h); +EAPI void evas_common_draw_context_set_clip (RGBA_Draw_Context *dc, int x, int y, int w, int h); +EAPI void evas_common_draw_context_unset_clip (RGBA_Draw_Context *dc); +EAPI void evas_common_draw_context_set_color (RGBA_Draw_Context *dc, int r, int g, int b, int a); +EAPI void evas_common_draw_context_set_multiplier (RGBA_Draw_Context *dc, int r, int g, int b, int a); +EAPI void evas_common_draw_context_unset_multiplier (RGBA_Draw_Context *dc); +EAPI Cutout_Rects *evas_common_draw_context_cutouts_new (void); +EAPI void evas_common_draw_context_cutouts_free (Cutout_Rects* rects); +EAPI void evas_common_draw_context_cutouts_del (Cutout_Rects* rects, int index); +EAPI void evas_common_draw_context_add_cutout (RGBA_Draw_Context *dc, int x, int y, int w, int h); +EAPI void evas_common_draw_context_clear_cutouts (RGBA_Draw_Context *dc); +EAPI Cutout_Rects *evas_common_draw_context_apply_cutouts (RGBA_Draw_Context *dc); +EAPI void evas_common_draw_context_apply_clear_cutouts (Cutout_Rects* rects); +EAPI void evas_common_draw_context_apply_clean_cutouts (Cutout_Rects* rects); +EAPI void evas_common_draw_context_set_anti_alias (RGBA_Draw_Context *dc, unsigned char aa); +EAPI void evas_common_draw_context_set_color_interpolation (RGBA_Draw_Context *dc, int color_space); +EAPI void evas_common_draw_context_set_render_op (RGBA_Draw_Context *dc, int op); +EAPI void evas_common_draw_context_set_sli (RGBA_Draw_Context *dc, int y, int h); + + +#endif /* _EVAS_DRAW_H */ diff --git a/src/lib/engines/common/evas_draw_main.c b/src/lib/engines/common/evas_draw_main.c new file mode 100644 index 0000000..3c2962b --- /dev/null +++ b/src/lib/engines/common/evas_draw_main.c @@ -0,0 +1,559 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_convert_main.h" + +EAPI Cutout_Rects* +evas_common_draw_context_cutouts_new(void) +{ + Cutout_Rects *rects; + + rects = malloc(sizeof(Cutout_Rects)); + rects->rects = NULL; + rects->active = 0; + rects->max = 0; + + return rects; +} + +EAPI void +evas_common_draw_context_cutouts_free(Cutout_Rects* rects) +{ + rects->active = 0; +} + +static Cutout_Rect* +evas_common_draw_context_cutouts_add(Cutout_Rects* rects, + int x, int y, int w, int h) +{ + Cutout_Rect* rect; + + if (rects->max < (rects->active + 1)) + { + rects->max += 32; + rects->rects = realloc(rects->rects, sizeof(Cutout_Rect) * rects->max); + } + + rect = rects->rects + rects->active; + rect->x = x; + rect->y = y; + rect->w = w; + rect->h = h; + rects->active++; + + return rect; +} + +EAPI void +evas_common_draw_context_cutouts_del(Cutout_Rects* rects, + int index) +{ + if ((index >= 0) && (index < rects->active)) + { + Cutout_Rect* rect; + + rect = rects->rects + index; + memmove(rect, rect + 1, + sizeof(Cutout_Rect) * (rects->active - index - 1)); + rects->active--; + } +} + +void +evas_common_init(void) +{ + evas_common_cpu_init(); + + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); +} + +void +evas_common_shutdown(void) +{ + evas_font_dir_cache_free(); + evas_common_image_cache_free(); +} + +EAPI void +evas_common_draw_init(void) +{ +} + +EAPI RGBA_Draw_Context * +evas_common_draw_context_new(void) +{ + RGBA_Draw_Context *dc; + + dc = calloc(1, sizeof(RGBA_Draw_Context)); + dc->sli.h = 1; + return dc; +} + +EAPI void +evas_common_draw_context_free(RGBA_Draw_Context *dc) +{ + if (!dc) return; + + evas_common_draw_context_apply_clean_cutouts(&dc->cutout); + free(dc); +} + +EAPI void +evas_common_draw_context_clear_cutouts(RGBA_Draw_Context *dc) +{ + evas_common_draw_context_apply_clean_cutouts(&dc->cutout); +} + +EAPI void +evas_common_draw_context_font_ext_set(RGBA_Draw_Context *dc, + void *data, + void *(*gl_new) (void *data, RGBA_Font_Glyph *fg), + void (*gl_free) (void *ext_dat), + void (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y)) +{ + dc->font_ext.data = data; + dc->font_ext.func.gl_new = gl_new; + dc->font_ext.func.gl_free = gl_free; + dc->font_ext.func.gl_draw = gl_draw; +} + +EAPI void +evas_common_draw_context_clip_clip(RGBA_Draw_Context *dc, int x, int y, int w, int h) +{ + if (dc->clip.use) + { + RECTS_CLIP_TO_RECT(dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h, + x, y, w, h); + } + else + evas_common_draw_context_set_clip(dc, x, y, w, h); +} + +EAPI void +evas_common_draw_context_set_clip(RGBA_Draw_Context *dc, int x, int y, int w, int h) +{ + dc->clip.use = 1; + dc->clip.x = x; + dc->clip.y = y; + dc->clip.w = w; + dc->clip.h = h; +} + +EAPI void +evas_common_draw_context_unset_clip(RGBA_Draw_Context *dc) +{ + dc->clip.use = 0; +} + +EAPI void +evas_common_draw_context_set_color(RGBA_Draw_Context *dc, int r, int g, int b, int a) +{ + R_VAL(&(dc->col.col)) = (DATA8)r; + G_VAL(&(dc->col.col)) = (DATA8)g; + B_VAL(&(dc->col.col)) = (DATA8)b; + A_VAL(&(dc->col.col)) = (DATA8)a; +} + +EAPI void +evas_common_draw_context_set_multiplier(RGBA_Draw_Context *dc, int r, int g, int b, int a) +{ + dc->mul.use = 1; + R_VAL(&(dc->mul.col)) = (DATA8)r; + G_VAL(&(dc->mul.col)) = (DATA8)g; + B_VAL(&(dc->mul.col)) = (DATA8)b; + A_VAL(&(dc->mul.col)) = (DATA8)a; +} + +EAPI void +evas_common_draw_context_unset_multiplier(RGBA_Draw_Context *dc) +{ + dc->mul.use = 0; +} + +EAPI void +evas_common_draw_context_add_cutout(RGBA_Draw_Context *dc, int x, int y, int w, int h) +{ + if (dc->clip.use) + { + RECTS_CLIP_TO_RECT(x, y, w, h, + dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h); + if ((w < 1) || (h < 1)) return; + } + evas_common_draw_context_cutouts_add(&dc->cutout, x, y, w, h); +} + +int +evas_common_draw_context_cutout_split(Cutout_Rects* res, int index, Cutout_Rect *split) +{ + /* 1 input rect, multiple out */ + Cutout_Rect in = res->rects[index]; + + /* this is to save me a LOT of typing */ +#define INX1 (in.x) +#define INX2 (in.x + in.w) +#define SPX1 (split->x) +#define SPX2 (split->x + split->w) +#define INY1 (in.y) +#define INY2 (in.y + in.h) +#define SPY1 (split->y) +#define SPY2 (split->y + split->h) +#define X1_IN (in.x < split->x) +#define X2_IN ((in.x + in.w) > (split->x + split->w)) +#define Y1_IN (in.y < split->y) +#define Y2_IN ((in.y + in.h) > (split->y + split->h)) +#define R_NEW(_r, _x, _y, _w, _h) { evas_common_draw_context_cutouts_add(_r, _x, _y, _w, _h); } + if (!RECTS_INTERSECT(in.x, in.y, in.w, in.h, + split->x, split->y, split->w, split->h)) + { + /* No colision => no clipping, don't touch it. */ + return 1; + } + + /* S = split (ie cut out rect) */ + /* +--+ = in (rect to be cut) */ + + /* + * +---+ + * | | + * | S | + * | | + * +---+ + * + */ + if (X1_IN && X2_IN && Y1_IN && Y2_IN) + { + R_NEW(res, in.x, in.y, in.w, SPY1 - in.y); + R_NEW(res, in.x, SPY1, SPX1 - in.x, SPY2 - SPY1); + R_NEW(res, SPX2, SPY1, INX2 - SPX2, SPY2 - SPY1); + /* out => (in.x, SPY2, in.w, INY2 - SPY2) */ + res->rects[index].h = INY2 - SPY2; + res->rects[index].y = SPY2; + return 1; + } + /* SSSSSSS + * S+---+S + * S|SSS|S + * S|SSS|S + * S|SSS|S + * S+---+S + * SSSSSSS + */ + if (!X1_IN && !X2_IN && !Y1_IN && !Y2_IN) + { + evas_common_draw_context_cutouts_del(res, index); + return 0; + } + /* SSS + * S+---+ + * S|S | + * S|S | + * S|S | + * S+---+ + * SSS + */ + if (!X1_IN && X2_IN && !Y1_IN && !Y2_IN) + { + /* in => (SPX2, in.y, INX2 - SPX2, in.h) */ + res->rects[index].w = INX2 - SPX2; + res->rects[index].x = SPX2; + return 1; + } + /* S + * +---+ + * | S | + * | S | + * | S | + * +---+ + * S + */ + if (X1_IN && X2_IN && !Y1_IN && !Y2_IN) + { + R_NEW(res, in.x, in.y, SPX1 - in.x, in.h); + /* in => (SPX2, in.y, INX2 - SPX2, in.h) */ + res->rects[index].w = INX2 - SPX2; + res->rects[index].x = SPX2; + return 1; + } + /* SSS + * +---+S + * | S|S + * | S|S + * | S|S + * +---+S + * SSS + */ + if (X1_IN && !X2_IN && !Y1_IN && !Y2_IN) + { + /* in => (in.x, in.y, SPX1 - in.x, in.h) */ + res->rects[index].w = SPX1 - in.x; + return 1; + } + /* SSSSSSS + * S+---+S + * S|SSS|S + * | | + * | | + * +---+ + * + */ + if (!X1_IN && !X2_IN && !Y1_IN && Y2_IN) + { + /* in => (in.x, SPY2, in.w, INY2 - SPY2) */ + res->rects[index].h = INY2 - SPY2; + res->rects[index].y = SPY2; + return 1; + } + /* + * +---+ + * | | + * S|SSS|S + * | | + * +---+ + * + */ + if (!X1_IN && !X2_IN && Y1_IN && Y2_IN) + { + R_NEW(res, in.x, SPY2, in.w, INY2 - SPY2); + /* in => (in.x, in.y, in.w, SPY1 - in.y) */ + res->rects[index].h = SPY1 - in.y; + return 1; + } + /* + * +---+ + * | | + * | | + * S|SSS|S + * S+---+S + * SSSSSSS + */ + if (!X1_IN && !X2_IN && Y1_IN && !Y2_IN) + { + /* in => (in.x, in.y, in.w, SPY1 - in.y) */ + res->rects[index].h = SPY1 - in.y; + return 1; + } + /* SSS + * S+---+ + * S|S | + * | | + * | | + * +---+ + * + */ + if (!X1_IN && X2_IN && !Y1_IN && Y2_IN) + { + R_NEW(res, SPX2, in.y, INX2 - SPX2, SPY2 - in.y); + /* in => (in.x, SPY2, in.w, INY2 - SPY2) */ + res->rects[index].h = INY2 - SPY2; + res->rects[index].y = SPY2; + return 1; + } + /* S + * +---+ + * | S | + * | | + * | | + * +---+ + * + */ + if (X1_IN && X2_IN && !Y1_IN && Y2_IN) + { + R_NEW(res, in.x, in.y, SPX1 - in.x, SPY2 - in.y); + R_NEW(res, SPX2, in.y, INX2 - SPX2, SPY2 - in.y); + /* in => (in.x, SPY2, in.w, INY2 - SPY2) */ + res->rects[index].h = INY2 - SPY2; + res->rects[index].y = SPY2; + return 1; + } + /* SSS + * +---+S + * | S|S + * | | + * | | + * +---+ + * + */ + if (X1_IN && !X2_IN && !Y1_IN && Y2_IN) + { + R_NEW(res, in.x, in.y, SPX1 - in.x, SPY2 - in.y); + /* in => (in.x, SPY2, in.w, INY2 - SPY2) */ + res->rects[index].h = INY2 - SPY2; + res->rects[index].y = SPY2; + return 1; + } + /* + * +---+ + * | | + * S|S | + * | | + * +---+ + * + */ + if (!X1_IN && X2_IN && Y1_IN && Y2_IN) + { + R_NEW(res, in.x, SPY2, in.w, INY2 - SPY2); + R_NEW(res, SPX2, SPY1, INX2 - SPX2, SPY2 - SPY1); + /* in => (in.x, SPY2, in.w, INY2 - SPY2) */ + res->rects[index].h = SPY1 - in.y; + return 1; + } + /* + * +---+ + * | | + * | S|S + * | | + * +---+ + * + */ + if (X1_IN && !X2_IN && Y1_IN && Y2_IN) + { + R_NEW(res, in.x, SPY2, in.w, INY2 - SPY2); + R_NEW(res, in.x, SPY1, SPX1 - in.x, SPY2 - SPY1); + /* in => (in.x, in.y, in.w, SPY1 - in.y) */ + res->rects[index].h = SPY1 - in.y; + return 1; + } + /* + * +---+ + * | | + * | | + * S|S | + * S+---+ + * SSS + */ + if (!X1_IN && X2_IN && Y1_IN && !Y2_IN) + { + R_NEW(res, SPX2, SPY1, INX2 - SPX2, INY2 - SPY1); + /* in => (in.x, in.y, in.w, SPY1 - in.y) */ + res->rects[index].h = SPY1 - in.y; + return 1; + } + /* + * +---+ + * | | + * | | + * | S | + * +---+ + * S + */ + if (X1_IN && X2_IN && Y1_IN && !Y2_IN) + { + R_NEW(res, in.x, SPY1, SPX1 - in.x, INY2 - SPY1); + R_NEW(res, SPX2, SPY1, INX2 - SPX2, INY2 - SPY1); + /* in => (in.x, in.y, in.w, SPY1 - in.y) */ + res->rects[index].h = SPY1 - in.y; + return 1; + } + /* + * +---+ + * | | + * | | + * | S|S + * +---+S + * SSS + */ + if (X1_IN && !X2_IN && Y1_IN && !Y2_IN) + { + R_NEW(res, in.x, SPY1, SPX1 - in.x, INY2 - SPY1); + /* in => (in.x, in.y, in.w, SPY1 - in.y) */ + res->rects[index].h = SPY1 - in.y; + return 1; + } + evas_common_draw_context_cutouts_del(res, index); + return 0; +#undef INX1 +#undef INX2 +#undef SPX1 +#undef SPX2 +#undef INY1 +#undef INY2 +#undef SPY1 +#undef SPY2 +#undef X1_IN +#undef X2_IN +#undef Y1_IN +#undef Y2_IN +#undef R_NEW +} + +EAPI Cutout_Rects* +evas_common_draw_context_apply_cutouts(RGBA_Draw_Context *dc) +{ + Cutout_Rects* res; + int i; + int j; + + if (!dc->clip.use) return NULL; + if ((dc->clip.w <= 0) || (dc->clip.h <= 0)) return NULL; + + res = evas_common_draw_context_cutouts_new(); + evas_common_draw_context_cutouts_add(res, dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h); + + for (i = 0; i < dc->cutout.active; ++i) + { + /* Don't loop on the element just added to the list as they are already correctly clipped. */ + int active = res->active; + + for (j = 0; j < active; ) + { + if (evas_common_draw_context_cutout_split(res, j, dc->cutout.rects + i)) + ++j; + else + active--; + } + } + return res; +} + +EAPI void +evas_common_draw_context_apply_clear_cutouts(Cutout_Rects* rects) +{ + evas_common_draw_context_apply_clean_cutouts(rects); + free(rects); +} + +EAPI void +evas_common_draw_context_apply_clean_cutouts(Cutout_Rects* rects) +{ + free(rects->rects); + rects->rects = NULL; + rects->active = 0; + rects->max = 0; +} + +EAPI void +evas_common_draw_context_set_anti_alias(RGBA_Draw_Context *dc , unsigned char aa) +{ + dc->anti_alias = !!aa; +} + +EAPI void +evas_common_draw_context_set_color_interpolation(RGBA_Draw_Context *dc, int color_space) +{ + dc->interpolation.color_space = color_space; +} + +EAPI void +evas_common_draw_context_set_render_op(RGBA_Draw_Context *dc , int op) +{ + dc->render_op = op; +} + +EAPI void +evas_common_draw_context_set_sli(RGBA_Draw_Context *dc, int y, int h) +{ + dc->sli.y = y; + dc->sli.h = h; +} diff --git a/src/lib/engines/common/evas_font.h b/src/lib/engines/common/evas_font.h new file mode 100644 index 0000000..0bf799c --- /dev/null +++ b/src/lib/engines/common/evas_font.h @@ -0,0 +1,69 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_FONT_H +#define _EVAS_FONT_H + + +/* main */ + +EAPI void evas_common_font_init (void); +EAPI void evas_common_font_shutdown (void); + +EAPI int evas_common_font_ascent_get (RGBA_Font *fn); +EAPI int evas_common_font_descent_get (RGBA_Font *fn); +EAPI int evas_common_font_max_ascent_get (RGBA_Font *fn); +EAPI int evas_common_font_max_descent_get (RGBA_Font *fn); +EAPI int evas_common_font_get_line_advance (RGBA_Font *fn); + +EAPI int evas_common_font_utf8_get_next (unsigned char *buf, int *iindex); +EAPI int evas_common_font_utf8_get_prev (unsigned char *buf, int *iindex); +EAPI int evas_common_font_utf8_get_last (unsigned char *buf, int buflen); + +/* draw */ + +EAPI void evas_common_font_draw (RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int x, int y, const char *text); +EAPI int evas_common_font_glyph_search (RGBA_Font *fn, RGBA_Font_Int **fi_ret, int gl); +EAPI RGBA_Font_Glyph *evas_common_font_int_cache_glyph_get (RGBA_Font_Int *fi, FT_UInt index); + +/* load */ + +EAPI RGBA_Font_Source *evas_common_font_source_memory_load (const char *name, const void *data, int data_size); +EAPI RGBA_Font_Source *evas_common_font_source_load (const char *name); +EAPI int evas_common_font_source_load_complete (RGBA_Font_Source *fs); +EAPI RGBA_Font_Source *evas_common_font_source_find (const char *name); +EAPI void evas_common_font_source_free (RGBA_Font_Source *fs); +EAPI void evas_common_font_size_use (RGBA_Font *fn); +EAPI RGBA_Font *evas_common_font_memory_load (const char *name, int size, const void *data, int data_size); +EAPI RGBA_Font_Int *evas_common_font_int_load (const char *name, int size); +EAPI RGBA_Font_Int *evas_common_font_int_load_init (RGBA_Font_Int *fn); +EAPI RGBA_Font_Int *evas_common_font_int_load_complete (RGBA_Font_Int *fi); +EAPI RGBA_Font *evas_common_font_memory_load (const char *name, int size, const void *data, int data_size); +EAPI RGBA_Font *evas_common_font_load (const char *name, int size); +EAPI RGBA_Font *evas_common_font_add (RGBA_Font *fn, const char *name, int size); +EAPI RGBA_Font *evas_common_font_memory_add (RGBA_Font *fn, const char *name, int size, const void *data, int data_size); +EAPI void evas_common_font_free (RGBA_Font *fn); +EAPI void evas_common_font_hinting_set (RGBA_Font *fn, Font_Hint_Flags hinting); +EAPI Evas_Bool evas_common_hinting_available (Font_Hint_Flags hinting); +EAPI RGBA_Font *evas_common_font_memory_hinting_load (const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting); +EAPI RGBA_Font *evas_common_font_hinting_load (const char *name, int size, Font_Hint_Flags hinting); +EAPI RGBA_Font *evas_common_font_hinting_add (RGBA_Font *fn, const char *name, int size, Font_Hint_Flags hinting); +EAPI RGBA_Font *evas_common_font_memory_hinting_add (RGBA_Font *fn, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting); +EAPI void evas_common_font_int_modify_cache_by (RGBA_Font_Int *fi, int dir); +EAPI int evas_common_font_cache_get (void); +EAPI void evas_common_font_cache_set (int size); +EAPI void evas_common_font_flush (void); +EAPI void evas_common_font_flush_last (void); +EAPI RGBA_Font_Int *evas_common_font_int_find (const char *name, int size); + +/* query */ + +EAPI void evas_common_font_query_size (RGBA_Font *fn, const char *text, int *w, int *h); +EAPI int evas_common_font_query_inset (RGBA_Font *fn, const char *text); +EAPI void evas_common_font_query_advance (RGBA_Font *fn, const char *text, int *h_adv, int *v_adv); +EAPI int evas_common_font_query_char_coords (RGBA_Font *fn, const char *text, int pos, int *cx, int *cy, int *cw, int *ch); +EAPI int evas_common_font_query_text_at_pos (RGBA_Font *fn, const char *text, int x, int y, int *cx, int *cy, int *cw, int *ch); + + +#endif /* _EVAS_FONT_H */ diff --git a/src/lib/engines/common/evas_font_draw.c b/src/lib/engines/common/evas_font_draw.c new file mode 100644 index 0000000..e2f87ab --- /dev/null +++ b/src/lib/engines/common/evas_font_draw.c @@ -0,0 +1,359 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_blend_private.h" + +EAPI RGBA_Font_Glyph * +evas_common_font_int_cache_glyph_get(RGBA_Font_Int *fi, FT_UInt index) +{ + RGBA_Font_Glyph *fg; + char key[6]; + FT_UInt hindex; + FT_Error error; + const FT_Int32 hintflags[3] = + { FT_LOAD_NO_HINTING, FT_LOAD_FORCE_AUTOHINT, FT_LOAD_NO_AUTOHINT }; + + hindex = index + (fi->hinting * 500000000); + + key[0] = ((hindex ) & 0x7f) + 1; + key[1] = ((hindex >> 7 ) & 0x7f) + 1; + key[2] = ((hindex >> 14 ) & 0x7f) + 1; + key[3] = ((hindex >> 21 ) & 0x7f) + 1; + key[4] = ((hindex >> 28 ) & 0x0f) + 1; + key[5] = 0; + + fg = evas_hash_find(fi->glyphs, key); + if (fg) return fg; + +// error = FT_Load_Glyph(fi->src->ft.face, index, FT_LOAD_NO_BITMAP); + error = FT_Load_Glyph(fi->src->ft.face, index, + FT_LOAD_RENDER | hintflags[fi->hinting]); + if (error) return NULL; + + fg = malloc(sizeof(struct _RGBA_Font_Glyph)); + if (!fg) return NULL; + memset(fg, 0, (sizeof(struct _RGBA_Font_Glyph))); + + error = FT_Get_Glyph(fi->src->ft.face->glyph, &(fg->glyph)); + if (error) + { + free(fg); + return NULL; + } + if (fg->glyph->format != FT_GLYPH_FORMAT_BITMAP) + { + error = FT_Glyph_To_Bitmap(&(fg->glyph), FT_RENDER_MODE_NORMAL, 0, 1); + if (error) + { + FT_Done_Glyph(fg->glyph); + free(fg); + return NULL; + } + } + fg->glyph_out = (FT_BitmapGlyph)fg->glyph; + + fi->glyphs = evas_hash_add(fi->glyphs, key, fg); + return fg; +} + +EAPI int +evas_common_font_glyph_search(RGBA_Font *fn, RGBA_Font_Int **fi_ret, int gl) +{ + Evas_List *l; + + for (l = fn->fonts; l; l = l->next) + { + RGBA_Font_Int *fi; + int index; + + fi = l->data; + + if (fi->src->charmap) /* Charmap loaded, FI/FS blank */ + { + index = evas_array_hash_search(fi->src->charmap, gl); + if (index != 0) + { + evas_common_font_source_load_complete(fi->src); + evas_common_font_int_load_complete(fi); + + evas_array_hash_free(fi->src->charmap); + fi->src->charmap = NULL; + + *fi_ret = fi; + return index; + } + } + else if (!fi->src->ft.face) /* Charmap not loaded, FI/FS blank */ + { + if (evas_common_font_source_load_complete(fi->src)) + return 0; +#if 0 /* FIXME: disable this. this can eat a LOT of memory and in my tests with expedite at any rate shows no visible improvements */ + index = FT_Get_Char_Index(fi->src->ft.face, gl); + if (index == 0) + { + /* Load Hash */ + FT_ULong charcode; + FT_UInt gindex; + + fi->src->charmap = evas_array_hash_new(); + charcode = FT_Get_First_Char(fi->src->ft.face, &gindex); + while (gindex != 0) + { + evas_array_hash_add(fi->src->charmap, charcode, gindex); + charcode = FT_Get_Next_Char(fi->src->ft.face, charcode, &gindex); + } + + /* Free face */ + FT_Done_Face(fi->src->ft.face); + fi->src->ft.face = NULL; + } + else + { + evas_common_font_int_load_complete(fi); + + *fi_ret = fi; + return index; + } +#endif + } + else /* Charmap not loaded, FS loaded */ + { + index = FT_Get_Char_Index(fi->src->ft.face, gl); + if (index != 0) + { + if (!fi->ft.size) + evas_common_font_int_load_complete(fi); + + *fi_ret = fi; + return index; + } + } + } + return 0; +} + +EAPI void +evas_common_font_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int x, int y, const char *text) +{ + int use_kerning; + int pen_x, pen_y; + int chr; + FT_UInt prev_index; + RGBA_Gfx_Func func; + int ext_x, ext_y, ext_w, ext_h; + DATA32 *im; + int im_w, im_h; + int c; + RGBA_Font_Int *fi; + FT_Face pface = NULL; + + fi = fn->fonts->data; + + im = dst->image.data; + im_w = dst->cache_entry.w; + im_h = dst->cache_entry.h; + + ext_x = 0; ext_y = 0; ext_w = im_w; ext_h = im_h; + if (dc->clip.use) + { + ext_x = dc->clip.x; + ext_y = dc->clip.y; + ext_w = dc->clip.w; + ext_h = dc->clip.h; + if (ext_x < 0) + { + ext_w += ext_x; + ext_x = 0; + } + if (ext_y < 0) + { + ext_h += ext_y; + ext_y = 0; + } + if ((ext_x + ext_w) > im_w) + ext_w = im_w - ext_x; + if ((ext_y + ext_h) > im_h) + ext_h = im_h - ext_y; + } + if (ext_w <= 0) return; + if (ext_h <= 0) return; + + pen_x = x; + pen_y = y; + LKL(fn->lock); + evas_common_font_size_use(fn); + use_kerning = FT_HAS_KERNING(fi->src->ft.face); + prev_index = 0; + func = evas_common_gfx_func_composite_mask_color_span_get(dc->col.col, dst, 1, dc->render_op); + for (c = 0, chr = 0; text[chr];) + { + FT_UInt index; + RGBA_Font_Glyph *fg; + int chr_x, chr_y; + int gl; + + gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr); + if (gl == 0) break; + index = evas_common_font_glyph_search(fn, &fi, gl); + /* hmmm kerning means i can't sanely do my own cached metric tables! */ + /* grrr - this means font face sharing is kinda... not an option if */ + /* you want performance */ + if ((use_kerning) && (prev_index) && (index) && + (pface == fi->src->ft.face)) + { + FT_Vector delta; + + if (FT_Get_Kerning(fi->src->ft.face, prev_index, index, + ft_kerning_default, &delta) == 0) + pen_x += delta.x >> 6; + } + pface = fi->src->ft.face; + fg = evas_common_font_int_cache_glyph_get(fi, index); + if (!fg) continue; + + if (dc->font_ext.func.gl_new) + { + /* extension calls */ + fg->ext_dat = dc->font_ext.func.gl_new(dc->font_ext.data, fg); + fg->ext_dat_free = dc->font_ext.func.gl_free; + } + + chr_x = (pen_x + (fg->glyph_out->left)); + chr_y = (pen_y + (fg->glyph_out->top)); + + if (chr_x < (ext_x + ext_w)) + { + DATA8 *data; + int i, j, w, h; + + data = fg->glyph_out->bitmap.buffer; + j = fg->glyph_out->bitmap.pitch; + w = fg->glyph_out->bitmap.width; + if (j < w) j = w; + h = fg->glyph_out->bitmap.rows; +/* + if ((fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays) + && (fg->glyph_out->bitmap.num_grays == 256) + ) + */ + { + if ((j > 0) && (chr_x + w > ext_x)) + { + if ((fg->ext_dat) && (dc->font_ext.func.gl_draw)) + { + /* ext glyph draw */ + dc->font_ext.func.gl_draw(dc->font_ext.data, + (void *)dst, + dc, fg, + chr_x, + y - (chr_y - y) + ); + } + else + { + if ((fg->glyph_out->bitmap.num_grays == 256) && + (fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays)) + { + for (i = 0; i < h; i++) + { + int dx, dy; + int in_x, in_w; + + in_x = 0; + in_w = 0; + dx = chr_x; + dy = y - (chr_y - i - y); +#ifdef EVAS_SLI + if (((dy) % dc->sli.h) == dc->sli.y) +#endif + { + if ((dx < (ext_x + ext_w)) && + (dy >= (ext_y)) && + (dy < (ext_y + ext_h))) + { + if (dx + w > (ext_x + ext_w)) + in_w += (dx + w) - (ext_x + ext_w); + if (dx < ext_x) + { + in_w += ext_x - dx; + in_x = ext_x - dx; + dx = ext_x; + } + if (in_w < w) + { + func(NULL, data + (i * j) + in_x, dc->col.col, + im + (dy * im_w) + dx, w - in_w); + } + } + } + } + } + else + { + DATA8 *tmpbuf = NULL, *dp, *tp, bits; + int bi, bj; + const DATA8 bitrepl[2] = {0x0, 0xff}; + + tmpbuf = alloca(w); + for (i = 0; i < h; i++) + { + int dx, dy; + int in_x, in_w, end; + + in_x = 0; + in_w = 0; + dx = chr_x; + dy = y - (chr_y - i - y); +#ifdef EVAS_SLI + if (((dy) % dc->sli.h) == dc->sli.y) +#endif + { + tp = tmpbuf; + dp = data + (i * fg->glyph_out->bitmap.pitch); + for (bi = 0; bi < w; bi += 8) + { + bits = *dp; + if ((w - bi) < 8) end = w - bi; + else end = 8; + for (bj = 0; bj < end; bj++) + { + *tp = bitrepl[(bits >> (7 - bj)) & 0x1]; + tp++; + } + dp++; + } + if ((dx < (ext_x + ext_w)) && + (dy >= (ext_y)) && + (dy < (ext_y + ext_h))) + { + if (dx + w > (ext_x + ext_w)) + in_w += (dx + w) - (ext_x + ext_w); + if (dx < ext_x) + { + in_w += ext_x - dx; + in_x = ext_x - dx; + dx = ext_x; + } + if (in_w < w) + { + func(NULL, tmpbuf + in_x, dc->col.col, + im + (dy * im_w) + dx, w - in_w); + } + } + } + } + } + } + c++; + } + } + } + else + break; + pen_x += fg->glyph->advance.x >> 16; + prev_index = index; + } + LKU(fn->lock); +} diff --git a/src/lib/engines/common/evas_font_load.c b/src/lib/engines/common/evas_font_load.c new file mode 100644 index 0000000..e8f64e9 --- /dev/null +++ b/src/lib/engines/common/evas_font_load.c @@ -0,0 +1,598 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_private.h" + +extern FT_Library evas_ft_lib; + +static int font_cache_usage = 0; +static int font_cache = 0; +static Evas_Object_List * fonts_src = NULL; +static Evas_Object_List * fonts = NULL; + +static Evas_Bool font_modify_cache_cb(const Evas_Hash *hash, const char *key, void *data, void *fdata); +static Evas_Bool font_flush_free_glyph_cb(const Evas_Hash *hash, const char *key, void *data, void *fdata); + +EAPI RGBA_Font_Source * +evas_common_font_source_memory_load(const char *name, const void *data, int data_size) +{ + int error; + RGBA_Font_Source *fs; + + fs = calloc(1, sizeof(RGBA_Font_Source) + data_size); + if (!fs) return NULL; + fs->data = ((unsigned char *)fs) + sizeof(RGBA_Font_Source); + fs->data_size = data_size; + fs->current_size = 0; + memcpy(fs->data, data, data_size); + error = FT_New_Memory_Face(evas_ft_lib, fs->data, fs->data_size, 0, &(fs->ft.face)); + if (error) + { + free(fs); + return NULL; + } + fs->name = evas_stringshare_add(name); + fs->file = NULL; + error = FT_Select_Charmap(fs->ft.face, ft_encoding_unicode); + fs->ft.orig_upem = fs->ft.face->units_per_EM; + fs->references = 1; + fonts_src = evas_object_list_prepend(fonts_src, fs); + return fs; +} + +EAPI RGBA_Font_Source * +evas_common_font_source_load(const char *name) +{ + RGBA_Font_Source *fs; + + fs = calloc(1, sizeof(RGBA_Font_Source)); + if (!fs) return NULL; + fs->data = NULL; + fs->data_size = 0; + fs->current_size = 0; + fs->ft.face = NULL; + + fs->name = evas_stringshare_add(name); + fs->file = fs->name; + + fs->ft.orig_upem = 0; + + fs->references = 1; + fonts_src = evas_object_list_prepend(fonts_src, fs); + return fs; +} + +EAPI int +evas_common_font_source_load_complete(RGBA_Font_Source *fs) +{ + int error; + + error = FT_New_Face(evas_ft_lib, fs->file, 0, &(fs->ft.face)); + if (error) + { + fs->ft.face = NULL; + return error; + } + + error = FT_Select_Charmap(fs->ft.face, ft_encoding_unicode); + if (error) + { + FT_Done_Face(fs->ft.face); + fs->ft.face = NULL; + return error; + } + + fs->ft.orig_upem = fs->ft.face->units_per_EM; + return error; +} + +EAPI RGBA_Font_Source * +evas_common_font_source_find(const char *name) +{ + Evas_Object_List *l; + + if (!name) return NULL; + for (l = fonts_src; l; l = l->next) + { + RGBA_Font_Source *fs; + + fs = (RGBA_Font_Source *)l; + if ((fs->name) && (!strcmp(name, fs->name))) + { + fs->references++; + fonts_src = evas_object_list_remove(fonts_src, fs); + fonts_src = evas_object_list_prepend(fonts_src, fs); + return fs; + } + } + return NULL; +} + +EAPI void +evas_common_font_source_free(RGBA_Font_Source *fs) +{ + fs->references--; + if (fs->references > 0) return; + + fonts_src = evas_object_list_remove(fonts_src, fs); + FT_Done_Face(fs->ft.face); + if (fs->charmap) evas_array_hash_free(fs->charmap); + if (fs->name) evas_stringshare_del(fs->name); + free(fs); +} + +EAPI void +evas_common_font_size_use(RGBA_Font *fn) +{ + Evas_List *l; + + for (l = fn->fonts; l; l = l->next) + { + RGBA_Font_Int *fi; + + fi = l->data; + + if (fi->src->current_size != fi->size) + { + FT_Activate_Size(fi->ft.size); + fi->src->current_size = fi->size; + } + } +} + +EAPI RGBA_Font_Int * +evas_common_font_int_memory_load(const char *name, int size, const void *data, int data_size) +{ + RGBA_Font_Int *fi; + + fi = evas_common_font_int_find(name, size); + if (fi) return fi; + + fi = calloc(1, sizeof(RGBA_Font_Int)); + if (!fi) return NULL; + + fi->src = evas_common_font_source_find(name); + if (!fi->src) + fi->src = evas_common_font_source_memory_load(name, data, data_size); + + if (!fi->src) + { + free(fi); + return NULL; + } + + fi->size = size; + + fi = evas_common_font_int_load_init(fi); + evas_common_font_int_load_complete(fi); + + return fi; +} + +EAPI RGBA_Font_Int * +evas_common_font_int_load(const char *name, int size) +{ + RGBA_Font_Int *fi; + + fi = evas_common_font_int_find(name, size); + if (fi) return fi; + + fi = calloc(1, sizeof(RGBA_Font_Int)); + if (!fi) return NULL; + + fi->src = evas_common_font_source_find(name); + if (!fi->src && evas_file_path_is_file(name)) + fi->src = evas_common_font_source_load(name); + + if (!fi->src) + { + free(fi); + return NULL; + } + + fi->size = size; + + return evas_common_font_int_load_init(fi); +} + +EAPI RGBA_Font_Int * +evas_common_font_int_load_init(RGBA_Font_Int *fi) +{ + fi->ft.size = NULL; + fi->glyphs = NULL; + fi->usage = 0; + fi->references = 1; + fonts = evas_object_list_prepend(fonts, fi); + return fi; +} + +EAPI RGBA_Font_Int * +evas_common_font_int_load_complete(RGBA_Font_Int *fi) +{ + int error; + + error = FT_New_Size(fi->src->ft.face, &(fi->ft.size)); + if (!error) + { + FT_Activate_Size(fi->ft.size); + } + fi->real_size = fi->size * 64; + error = FT_Set_Char_Size(fi->src->ft.face, 0, fi->real_size, 75, 75); + if (error) + { + fi->real_size = fi->size; + error = FT_Set_Pixel_Sizes(fi->src->ft.face, 0, fi->real_size); + } + if (error) + { + int i; + int chosen_size = 0; + int chosen_width = 0; + + for (i = 0; i < fi->src->ft.face->num_fixed_sizes; i++) + { + int s; + int d, cd; + + s = fi->src->ft.face->available_sizes[i].height; + cd = chosen_size - fi->size; + if (cd < 0) cd = -cd; + d = s - fi->size; + if (d < 0) d = -d; + if (d < cd) + { + chosen_width = fi->src->ft.face->available_sizes[i].width; + chosen_size = s; + } + if (d == 0) break; + } + fi->real_size = chosen_size; + error = FT_Set_Pixel_Sizes(fi->src->ft.face, chosen_width, fi->real_size); + if (error) + { + /* couldn't choose the size anyway... what now? */ + } + } + fi->src->current_size = fi->size; + + return fi; +} + +EAPI RGBA_Font * +evas_common_font_memory_load(const char *name, int size, const void *data, int data_size) +{ + RGBA_Font *fn; + RGBA_Font_Int *fi; + + fi = evas_common_font_int_memory_load(name, size, data, data_size); + if (!fi) return NULL; + fn = calloc(1, sizeof(RGBA_Font)); + if (!fn) + { + free(fi); + return NULL; + } + fn->fonts = evas_list_append(fn->fonts, fi); + fn->hinting = FONT_BYTECODE_HINT; + fi->hinting = fn->hinting; + fn->references = 1; + LKI(fn->lock); + return fn; +} + +EAPI RGBA_Font * +evas_common_font_load(const char *name, int size) +{ + RGBA_Font *fn; + RGBA_Font_Int *fi; + + fi = evas_common_font_int_load(name, size); + if (!fi) return NULL; + + /* First font, complete load */ + if (!fi->ft.size) + { + if (!fi->src->ft.face) + { + if (evas_common_font_source_load_complete(fi->src)) + { + fi->references--; + if (fi->references == 0) + { + evas_common_font_int_modify_cache_by(fi, 1); + evas_common_font_flush(); + } + return NULL; + } + } + evas_common_font_int_load_complete(fi); + } + + fn = calloc(1, sizeof(RGBA_Font)); + if (!fn) + { + fi->references--; + if (fi->references == 0) + { + evas_common_font_int_modify_cache_by(fi, 1); + evas_common_font_flush(); + } + return NULL; + } + fn->fonts = evas_list_append(fn->fonts, fi); + fn->hinting = FONT_BYTECODE_HINT; + fi->hinting = fn->hinting; + fn->references = 1; + LKI(fn->lock); + return fn; +} + +EAPI RGBA_Font * +evas_common_font_add(RGBA_Font *fn, const char *name, int size) +{ + RGBA_Font_Int *fi; + + if (!fn) + return NULL; + fi = evas_common_font_int_load(name, size); + if (fi) + { + fn->fonts = evas_list_append(fn->fonts, fi); + fi->hinting = fn->hinting; + return fn; + } + return NULL; +} + +EAPI RGBA_Font * +evas_common_font_memory_add(RGBA_Font *fn, const char *name, int size, const void *data, int data_size) +{ + RGBA_Font_Int *fi; + + if (!fn) + return NULL; + fi = evas_common_font_int_memory_load(name, size, data, data_size); + if (fi) + { + fn->fonts = evas_list_append(fn->fonts, fi); + fi->hinting = fn->hinting; + return fn; + } + return NULL; +} + +EAPI void +evas_common_font_free(RGBA_Font *fn) +{ + Evas_List *l; + + if (!fn) + return; + fn->references--; + if (fn->references > 0) return; + for (l = fn->fonts; l; l = l->next) + { + RGBA_Font_Int *fi; + + fi = l->data; + fi->references--; + if (fi->references == 0) + { + evas_common_font_int_modify_cache_by(fi, 1); + evas_common_font_flush(); + } + } + evas_list_free(fn->fonts); + LKD(fn->lock); + free(fn); +} + +EAPI void +evas_common_font_hinting_set(RGBA_Font *fn, Font_Hint_Flags hinting) +{ + Evas_List *l; + + if (!fn) + return; + fn->hinting = hinting; + for (l = fn->fonts; l; l = l->next) + { + RGBA_Font_Int *fi; + + fi = l->data; + fi->hinting = fn->hinting; + } +} + +EAPI Evas_Bool +evas_common_hinting_available(Font_Hint_Flags hinting) +{ + switch (hinting) + { + case FONT_NO_HINT: + case FONT_AUTO_HINT: + /* these two hinting modes are always available */ + return 1; + case FONT_BYTECODE_HINT: + /* Only use the bytecode interpreter if support for the _patented_ + * algorithms is available because the free bytecode + * interpreter's results are too crappy. + * + * On freetyp 2.2+, we can ask the library about support for + * the patented interpreter. On older versions, we need to use + * macros to check for it. + */ +#if FREETYPE_MINOR >= 2 + return FT_Get_TrueType_Engine_Type(evas_ft_lib) >= + FT_TRUETYPE_ENGINE_TYPE_PATENTED; +#else + /* we may not rely on TT_CONFIG_OPTION_BYTECODE_INTERPRETER + * here to find out whether it's supported. + * + * so, assume it is. o_O + */ + return 1; +#endif + } + + /* shouldn't get here - need to add another case statement */ + return 0; +} + +EAPI RGBA_Font * +evas_common_font_memory_hinting_load(const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting) +{ + RGBA_Font *fn; + + fn = evas_common_font_memory_load(name, size, data, data_size); + if (fn) evas_common_font_hinting_set(fn, hinting); + return fn; +} + +EAPI RGBA_Font * +evas_common_font_hinting_load(const char *name, int size, Font_Hint_Flags hinting) +{ + RGBA_Font *fn; + + fn = evas_common_font_load(name, size); + if (fn) evas_common_font_hinting_set(fn, hinting); + return fn; +} + +EAPI RGBA_Font * +evas_common_font_hinting_add(RGBA_Font *fn, const char *name, int size, Font_Hint_Flags hinting) +{ + fn = evas_common_font_add(fn, name, size); + if (fn) evas_common_font_hinting_set(fn, hinting); + return fn; +} + +EAPI RGBA_Font * +evas_common_font_memory_hinting_add(RGBA_Font *fn, const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting) +{ + fn = evas_common_font_memory_add(fn, name, size, data, data_size); + if (fn) evas_common_font_hinting_set(fn, hinting); + return fn; +} + +static Evas_Bool +font_modify_cache_cb(const Evas_Hash *hash, const char *key, void *data, void *fdata) +{ + int *dir; + RGBA_Font_Glyph *fg; + + fg = data; + dir = fdata; + font_cache_usage += (*dir) * + ((fg->glyph_out->bitmap.width * fg->glyph_out->bitmap.rows) + + sizeof(RGBA_Font_Glyph) + sizeof(Evas_List) + 400); /* fudge values */ + return 1; + hash = 0; + key = 0; +} + +/* when the fi->references == 0 we increase this instead of really deleting + * we then check if the cache_useage size is larger than allowed + * !If the cache is NOT too large we dont delete font_int + * !If the cache is too large we really delete font_int */ +EAPI void +evas_common_font_int_modify_cache_by(RGBA_Font_Int *fi, int dir) +{ + int sz_hash = 0; + + if (fi->glyphs) sz_hash = sizeof(Evas_Hash); + evas_hash_foreach(fi->glyphs, font_modify_cache_cb, &dir); + font_cache_usage += dir * (sizeof(RGBA_Font) + sz_hash + + sizeof(FT_FaceRec) + 16384); /* fudge values */ +} + +EAPI int +evas_common_font_cache_get(void) +{ + return font_cache; +} + +EAPI void +evas_common_font_cache_set(int size) +{ + font_cache = size; + evas_common_font_flush(); +} + +EAPI void +evas_common_font_flush(void) +{ + if (font_cache_usage < font_cache) return; + while (font_cache_usage > font_cache) evas_common_font_flush_last(); +} + +static Evas_Bool +font_flush_free_glyph_cb(const Evas_Hash *hash, const char *key, void *data, void *fdata) +{ + RGBA_Font_Glyph *fg; + + fg = data; + FT_Done_Glyph(fg->glyph); + /* extension calls */ + if (fg->ext_dat_free) fg->ext_dat_free(fg->ext_dat); + free(fg); + return 1; + hash = 0; + key = 0; + fdata = 0; +} + +/* We run this when the cache gets larger than allowed size + * We check cache size each time a fi->references goes to 0 + * PERFORMS: Find font_int(s) with references == 0 and delete them */ +EAPI void +evas_common_font_flush_last(void) +{ + Evas_Object_List *l; + RGBA_Font_Int *fi = NULL; + + for (l = fonts; l; l = l->next) + { + RGBA_Font_Int *fi_tmp; + + fi_tmp = (RGBA_Font_Int *)l; + if (fi_tmp->references == 0) fi = fi_tmp; + } + if (!fi) return; + + FT_Done_Size(fi->ft.size); + + fonts = evas_object_list_remove(fonts, fi); + evas_common_font_int_modify_cache_by(fi, -1); + + evas_hash_foreach(fi->glyphs, font_flush_free_glyph_cb, NULL); + evas_hash_free(fi->glyphs); + + evas_common_font_source_free(fi->src); + + free(fi); +} + +EAPI RGBA_Font_Int * +evas_common_font_int_find(const char *name, int size) +{ + Evas_Object_List *l; + + for (l = fonts; l; l = l->next) + { + RGBA_Font_Int *fi; + + fi = (RGBA_Font_Int *)l; + if ((fi->size == size) && (!strcmp(name, fi->src->name))) + { + if (fi->references == 0) evas_common_font_int_modify_cache_by(fi, -1); + fi->references++; + fonts = evas_object_list_remove(fonts, fi); + fonts = evas_object_list_prepend(fonts, fi); + return fi; + } + } + return NULL; +} diff --git a/src/lib/engines/common/evas_font_main.c b/src/lib/engines/common/evas_font_main.c new file mode 100644 index 0000000..7f95760 --- /dev/null +++ b/src/lib/engines/common/evas_font_main.c @@ -0,0 +1,273 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" + +FT_Library evas_ft_lib = 0; +static int initialised = 0; + +EAPI void +evas_common_font_init(void) +{ + int error; + + initialised++; + if (initialised != 1) return; + error = FT_Init_FreeType(&evas_ft_lib); + if (error) + { + initialised--; + return; + } +} + +EAPI void +evas_common_font_shutdown(void) +{ + int error; + + initialised--; + if (initialised != 0) return; + + evas_common_font_cache_set(0); + evas_common_font_flush(); + + error = FT_Done_FreeType(evas_ft_lib); + evas_ft_lib = 0; +} + +EAPI int +evas_common_font_ascent_get(RGBA_Font *fn) +{ + int val, dv; + int ret; + RGBA_Font_Int *fi; + + evas_common_font_size_use(fn); + fi = fn->fonts->data; + val = (int)fi->src->ft.face->size->metrics.ascender; + if (fi->src->ft.face->units_per_EM == 0) + return val; + dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM; + ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv); + return ret; +} + +EAPI int +evas_common_font_descent_get(RGBA_Font *fn) +{ + int val, dv; + int ret; + RGBA_Font_Int *fi; + + evas_common_font_size_use(fn); + fi = fn->fonts->data; + val = -(int)fi->src->ft.face->size->metrics.descender; + if (fi->src->ft.face->units_per_EM == 0) + return val; + dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM; + ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv); + return ret; +} + +EAPI int +evas_common_font_max_ascent_get(RGBA_Font *fn) +{ + int val, dv; + int ret; + RGBA_Font_Int *fi; + + evas_common_font_size_use(fn); + fi = fn->fonts->data; + val = (int)fi->src->ft.face->bbox.yMax; + if (fi->src->ft.face->units_per_EM == 0) + return val; + dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM; + ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv); + return ret; +} + +EAPI int +evas_common_font_max_descent_get(RGBA_Font *fn) +{ + int val, dv; + int ret; + RGBA_Font_Int *fi; + + evas_common_font_size_use(fn); + fi = fn->fonts->data; + val = -(int)fi->src->ft.face->bbox.yMin; + if (fi->src->ft.face->units_per_EM == 0) + return val; + dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM; + ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv); + return ret; +} + +EAPI int +evas_common_font_get_line_advance(RGBA_Font *fn) +{ + int val, dv; + int ret; + RGBA_Font_Int *fi; + + evas_common_font_size_use(fn); + fi = fn->fonts->data; + val = (int)fi->src->ft.face->size->metrics.height; + if (fi->src->ft.face->units_per_EM == 0) + return val; + dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM; + ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv); + return ret; +} + +EAPI int +evas_common_font_utf8_get_next(unsigned char *buf, int *iindex) +{ + /* Reads UTF8 bytes from @buf, starting at *@index and returns + * the decoded code point at iindex offset, and advances iindex + * to the next code point after this. + * + * Returns 0 to indicate there is no next char + */ + int index = *iindex, len, r; + unsigned char d, d2, d3, d4; + + d = buf[index++]; + if (!d) + return 0; + + while (buf[index] && ((buf[index] & 0xc0) == 0x80)) + index++; + len = index - *iindex; + + if (len == 1) + r = d; + else if (len == 2) + { + /* 2 bytes */ + d2 = buf[*iindex + 1]; + r = d & 0x1f; /* copy lower 5 */ + r <<= 6; + r |= (d2 & 0x3f); /* copy lower 6 */ + } + else if (len == 3) + { + /* 3 bytes */ + d2 = buf[*iindex + 1]; + d3 = buf[*iindex + 2]; + r = d & 0x0f; /* copy lower 4 */ + r <<= 6; + r |= (d2 & 0x3f); + r <<= 6; + r |= (d3 & 0x3f); + } + else + { + /* 4 bytes */ + d2 = buf[*iindex + 1]; + d3 = buf[*iindex + 2]; + d4 = buf[*iindex + 3]; + r = d & 0x0f; /* copy lower 4 */ + r <<= 6; + r |= (d2 & 0x3f); + r <<= 6; + r |= (d3 & 0x3f); + r <<= 6; + r |= (d4 & 0x3f); + } + + *iindex = index; + return r; +} + +EAPI int +evas_common_font_utf8_get_prev(unsigned char *buf, int *iindex) +{ + /* Reads UTF8 bytes from @buf, starting at *@index and returns + * the decoded code point at iindex offset, and advances iindex + * to the prev code point after this. + * + * Returns 0 to indicate there is no prev char + */ + int index = *iindex, len, r; + unsigned char d, d2, d3, d4; + + if (index <= 0) + return 0; + d = buf[index--]; + + while ((index > 0) && ((buf[index] & 0xc0) == 0x80)) + index--; + len = *iindex - index; + + if (len == 1) + r = d; + else if (len == 2) + { + /* 2 bytes */ + d2 = buf[index + 1]; + r = d & 0x1f; /* copy lower 5 */ + r <<= 6; + r |= (d2 & 0x3f); /* copy lower 6 */ + } + else if (len == 3) + { + /* 3 bytes */ + d2 = buf[index + 1]; + d3 = buf[index + 2]; + r = d & 0x0f; /* copy lower 4 */ + r <<= 6; + r |= (d2 & 0x3f); + r <<= 6; + r |= (d3 & 0x3f); + } + else + { + /* 4 bytes */ + d2 = buf[index + 1]; + d3 = buf[index + 2]; + d4 = buf[index + 3]; + r = d & 0x0f; /* copy lower 4 */ + r <<= 6; + r |= (d2 & 0x3f); + r <<= 6; + r |= (d3 & 0x3f); + r <<= 6; + r |= (d4 & 0x3f); + } + + *iindex = index; + return r; +} + +EAPI int +evas_common_font_utf8_get_last(unsigned char *buf, int buflen) +{ + /* jumps to the nul byte at the buffer end and decodes backwards and + * returns the offset index byte in the buffer where the last character + * in the buffer begins. + * + * Returns -1 to indicate an error + */ + int index; + unsigned char d; + + if (buflen < 1) return 0; + index = buflen - 1; + d = buf[index]; + if (!(d & 0x80)) + return index; + else + { + while (index > 0) + { + index--; + d = buf[index]; + if ((d & 0xc0) != 0x80) + return index; + } + } + return 0; +} diff --git a/src/lib/engines/common/evas_font_query.c b/src/lib/engines/common/evas_font_query.c new file mode 100644 index 0000000..4595874 --- /dev/null +++ b/src/lib/engines/common/evas_font_query.c @@ -0,0 +1,344 @@ +#include "evas_common.h" + +/* string extents */ +EAPI void +evas_common_font_query_size(RGBA_Font *fn, const char *text, int *w, int *h) +{ + int use_kerning; + int pen_x, pen_y; + int start_x, end_x; + int chr; + FT_UInt prev_index; + RGBA_Font_Int *fi; + FT_Face pface = NULL; + + fi = fn->fonts->data; + + start_x = 0; + end_x = 0; + + pen_x = 0; + pen_y = 0; + evas_common_font_size_use(fn); + use_kerning = FT_HAS_KERNING(fi->src->ft.face); + prev_index = 0; + for (chr = 0; text[chr];) + { + FT_UInt index; + RGBA_Font_Glyph *fg; + int chr_x, chr_y, chr_w; + int gl, kern; + + gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr); + if (gl == 0) break; + index = evas_common_font_glyph_search(fn, &fi, gl); + /* hmmm kerning means i can't sanely do my own cached metric tables! */ + /* grrr - this means font face sharing is kinda... not an option if */ + /* you want performance */ + kern = 0; + if ((use_kerning) && (prev_index) && (index) && + (pface == fi->src->ft.face)) + { + FT_Vector delta; + + if (FT_Get_Kerning(fi->src->ft.face, prev_index, index, + ft_kerning_default, &delta) == 0) + { + kern = delta.x >> 6; + pen_x += kern; + } + } + pface = fi->src->ft.face; + fg = evas_common_font_int_cache_glyph_get(fi, index); + if (!fg) continue; + + if (kern < 0) kern = 0; + chr_x = ((pen_x - kern) + (fg->glyph_out->left)); + chr_y = (pen_y + (fg->glyph_out->top)); +// chr_w = fg->glyph_out->bitmap.width; + chr_w = fg->glyph_out->bitmap.width + kern; + { + int advw; + + advw = ((fg->glyph->advance.x + (kern << 16)) >> 16); + if (chr_w < advw) chr_w = advw; + } + + if ((!prev_index) && (chr_x < 0)) + start_x = chr_x; + if ((chr_x + chr_w) > end_x) + end_x = chr_x + chr_w; + + pen_x += fg->glyph->advance.x >> 16; + prev_index = index; + } + if (w) *w = end_x - start_x; + if (h) *h = evas_common_font_max_ascent_get(fn) + evas_common_font_max_descent_get(fn); +} + +/* text x inset */ +EAPI int +evas_common_font_query_inset(RGBA_Font *fn, const char *text) +{ + FT_UInt index; + RGBA_Font_Glyph *fg; + int chr; + int gl; + RGBA_Font_Int *fi; + + fi = fn->fonts->data; + + chr = 0; + if (!text[0]) return 0; + gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr); + if (gl == 0) return 0; + evas_common_font_size_use(fn); + index = evas_common_font_glyph_search(fn, &fi, gl); + fg = evas_common_font_int_cache_glyph_get(fi, index); + if (!fg) return 0; +/* + printf("fg->glyph_out->left = %i\n" + "fi->src->ft.face->glyph->bitmap_left = %i\n" + "fi->src->ft.face->glyph->metrics.horiBearingX = %i\n" + "fi->src->ft.face->glyph->metrics.horiBearingY = %i\n" + "fi->src->ft.face->glyph->metrics.horiAdvance = %i\n" + , + (int)fg->glyph_out->left, + (int)fi->src->ft.face->glyph->bitmap_left, + (int)fi->src->ft.face->glyph->metrics.horiBearingX >> 6, + (int)fi->src->ft.face->glyph->metrics.horiBearingY >> 6, + (int)fi->src->ft.face->glyph->metrics.horiAdvance >> 6 + ); + */ + return fg->glyph_out->left; +} + +/* h & v advance */ +EAPI void +evas_common_font_query_advance(RGBA_Font *fn, const char *text, int *h_adv, int *v_adv) +{ + int use_kerning; + int pen_x, pen_y; + int start_x; + int chr; + FT_UInt prev_index; + RGBA_Font_Int *fi; + FT_Face pface = NULL; + + fi = fn->fonts->data; + + start_x = 0; + pen_x = 0; + pen_y = 0; + evas_common_font_size_use(fn); + use_kerning = FT_HAS_KERNING(fi->src->ft.face); + prev_index = 0; + for (chr = 0; text[chr];) + { + FT_UInt index; + RGBA_Font_Glyph *fg; + int chr_x, chr_y, chr_w; + int gl; + + gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr); + if (gl == 0) break; + index = evas_common_font_glyph_search(fn, &fi, gl); + /* hmmm kerning means i can't sanely do my own cached metric tables! */ + /* grrr - this means font face sharing is kinda... not an option if */ + /* you want performance */ + if ((use_kerning) && (prev_index) && (index) && + (pface == fi->src->ft.face)) + { + FT_Vector delta; + + if (FT_Get_Kerning(fi->src->ft.face, prev_index, index, + ft_kerning_default, &delta) == 0) + pen_x += delta.x >> 6; + } + pface = fi->src->ft.face; + fg = evas_common_font_int_cache_glyph_get(fi, index); + if (!fg) continue; + + chr_x = (pen_x + (fg->glyph_out->left)); + chr_y = (pen_y + (fg->glyph_out->top)); + chr_w = fg->glyph_out->bitmap.width; + + pen_x += fg->glyph->advance.x >> 16; + prev_index = index; + } + if (v_adv) *v_adv = evas_common_font_get_line_advance(fn); + if (h_adv) *h_adv = pen_x - start_x; +} + +/* x y w h for char at char pos */ +EAPI int +evas_common_font_query_char_coords(RGBA_Font *fn, const char *text, int pos, int *cx, int *cy, int *cw, int *ch) +{ + int use_kerning; + int pen_x, pen_y; + int prev_chr_end; + int chr; + int asc, desc; + FT_UInt prev_index; + RGBA_Font_Int *fi; + FT_Face pface = NULL; + + fi = fn->fonts->data; + + pen_x = 0; + pen_y = 0; + evas_common_font_size_use(fn); + use_kerning = FT_HAS_KERNING(fi->src->ft.face); + prev_index = 0; + prev_chr_end = 0; + asc = evas_common_font_max_ascent_get(fn); + desc = evas_common_font_max_descent_get(fn); + for (chr = 0; text[chr];) + { + int pchr; + FT_UInt index; + RGBA_Font_Glyph *fg; + int chr_x, chr_y, chr_w; + int gl, kern; + + pchr = chr; + gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr); + if (gl == 0) break; + index = evas_common_font_glyph_search(fn, &fi, gl); + kern = 0; + /* hmmm kerning means i can't sanely do my own cached metric tables! */ + /* grrr - this means font face sharing is kinda... not an option if */ + /* you want performance */ + if ((use_kerning) && (prev_index) && (index) && + (pface == fi->src->ft.face)) + { + FT_Vector delta; + + if (FT_Get_Kerning(fi->src->ft.face, prev_index, index, + ft_kerning_default, &delta) == 0) + { + kern = delta.x >> 6; + pen_x += kern; + } + } + pface = fi->src->ft.face; + fg = evas_common_font_int_cache_glyph_get(fi, index); + if (!fg) continue; + + if (kern < 0) kern = 0; + chr_x = ((pen_x - kern) + (fg->glyph_out->left)); + chr_y = (pen_y + (fg->glyph_out->top)); + chr_w = fg->glyph_out->bitmap.width + (kern); +/* if (text[chr]) */ + { + int advw; + + advw = ((fg->glyph->advance.x + (kern << 16)) >> 16); + if (chr_w < advw) chr_w = advw; + } + if (chr_x > prev_chr_end) + { + chr_w += (chr_x - prev_chr_end); + chr_x = prev_chr_end; + } + if (pchr == pos) + { + if (cx) *cx = chr_x; + if (cy) *cy = -asc; + if (cw) *cw = chr_w; + if (ch) *ch = asc + desc; + return 1; + } + prev_chr_end = chr_x + chr_w; + pen_x += fg->glyph->advance.x >> 16; + prev_index = index; + } + return 0; +} + +/* char pos of text at xy pos */ +EAPI int +evas_common_font_query_text_at_pos(RGBA_Font *fn, const char *text, int x, int y, int *cx, int *cy, int *cw, int *ch) +{ + int use_kerning; + int pen_x, pen_y; + int prev_chr_end; + int chr; + int asc, desc; + FT_UInt prev_index; + RGBA_Font_Int *fi; + FT_Face pface = NULL; + + fi = fn->fonts->data; + + pen_x = 0; + pen_y = 0; + evas_common_font_size_use(fn); + use_kerning = FT_HAS_KERNING(fi->src->ft.face); + prev_index = 0; + prev_chr_end = 0; + asc = evas_common_font_max_ascent_get(fn); + desc = evas_common_font_max_descent_get(fn); + for (chr = 0; text[chr];) + { + int pchr; + FT_UInt index; + RGBA_Font_Glyph *fg; + int chr_x, chr_y, chr_w; + int gl, kern; + + pchr = chr; + gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr); + if (gl == 0) break; + index = evas_common_font_glyph_search(fn, &fi, gl); + kern = 0; + /* hmmm kerning means i can't sanely do my own cached metric tables! */ + /* grrr - this means font face sharing is kinda... not an option if */ + /* you want performance */ + if ((use_kerning) && (prev_index) && (index) && + (pface == fi->src->ft.face)) + { + FT_Vector delta; + + if (FT_Get_Kerning(fi->src->ft.face, prev_index, index, + ft_kerning_default, &delta) == 0) + { + kern = delta.x >> 6; + pen_x += kern; + } + } + pface = fi->src->ft.face; + fg = evas_common_font_int_cache_glyph_get(fi, index); + if (!fg) continue; + + if (kern < 0) kern = 0; + chr_x = ((pen_x - kern) + (fg->glyph_out->left)); + chr_y = (pen_y + (fg->glyph_out->top)); + chr_w = fg->glyph_out->bitmap.width + kern; +/* if (text[chr]) */ + { + int advw; + + advw = ((fg->glyph->advance.x + (kern << 16)) >> 16); + if (chr_w < advw) chr_w = advw; + } + if (chr_x > prev_chr_end) + { + chr_w += (chr_x - prev_chr_end); + chr_x = prev_chr_end; + } + if ((x >= chr_x) && (x <= (chr_x + chr_w)) && + (y >= -asc) && (y <= desc)) + { + if (cx) *cx = chr_x; + if (cy) *cy = -asc; + if (cw) *cw = chr_w; + if (ch) *ch = asc + desc; + return pchr; + } + prev_chr_end = chr_x + chr_w; + pen_x += fg->glyph->advance.x >> 16; + prev_index = index; + } + return -1; +} diff --git a/src/lib/engines/common/evas_gradient.h b/src/lib/engines/common/evas_gradient.h new file mode 100644 index 0000000..d32d356 --- /dev/null +++ b/src/lib/engines/common/evas_gradient.h @@ -0,0 +1,31 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_GRADIENT_H +#define _EVAS_GRADIENT_H + + +EAPI void evas_common_gradient_init (void); + +EAPI RGBA_Gradient *evas_common_gradient_new (void); +EAPI void evas_common_gradient_free (RGBA_Gradient *gr); +EAPI void evas_common_gradient_clear (RGBA_Gradient *gr); +EAPI void evas_common_gradient_color_stop_add (RGBA_Gradient *gr, int r, int g, int b, int a, int dist); +EAPI void evas_common_gradient_alpha_stop_add (RGBA_Gradient *gr, int a, int dist); +EAPI void evas_common_gradient_color_data_set (RGBA_Gradient *gr, DATA32 *data, int len, int alpha_flags); +EAPI void evas_common_gradient_alpha_data_set (RGBA_Gradient *gr, DATA8 *adata, int len); +EAPI void evas_common_gradient_type_set (RGBA_Gradient *gr, const char *name, char *params); +EAPI void evas_common_gradient_fill_set (RGBA_Gradient *gr, int x, int y, int w, int h); +EAPI void evas_common_gradient_fill_angle_set (RGBA_Gradient *gr, float angle); +EAPI void evas_common_gradient_fill_spread_set (RGBA_Gradient *gr, int spread); +EAPI void evas_common_gradient_map_angle_set (RGBA_Gradient *gr, float angle); +EAPI void evas_common_gradient_map_offset_set (RGBA_Gradient *gr, float offset); +EAPI void evas_common_gradient_map_direction_set (RGBA_Gradient *gr, int direction); +EAPI void evas_common_gradient_map (RGBA_Draw_Context *dc, RGBA_Gradient *gr, int len); +EAPI void evas_common_gradient_draw (RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h, RGBA_Gradient *gr); + +EAPI RGBA_Gradient_Type *evas_common_gradient_geometer_get (const char *name); + + +#endif /* _EVAS_GRADIENT_H */ diff --git a/src/lib/engines/common/evas_gradient_angular.c b/src/lib/engines/common/evas_gradient_angular.c new file mode 100644 index 0000000..2ee2368 --- /dev/null +++ b/src/lib/engines/common/evas_gradient_angular.c @@ -0,0 +1,1899 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include + +#include "evas_common.h" +#include "evas_gradient_private.h" + +typedef struct _Angular_Data Angular_Data; +struct _Angular_Data +{ + float an, cy; + + int sx, sy, s; + float off; + int len; +}; + +static void +angular_init(void); + +static void +angular_shutdown(void); + +static void +angular_init_geom(RGBA_Gradient *gr); + +static void +angular_setup_geom(RGBA_Gradient *gr); + +static void +angular_free_geom(void *gdata); + +static int +angular_has_alpha(RGBA_Gradient *gr, int op); + +static int +angular_has_mask(RGBA_Gradient *gr, int op); + +static int +angular_get_map_len(RGBA_Gradient *gr); + +static Gfx_Func_Gradient_Fill +angular_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa); + +static RGBA_Gradient_Type angular = {"angular", angular_init, angular_shutdown, + angular_init_geom, angular_setup_geom, angular_free_geom, + angular_has_alpha, angular_has_mask, + angular_get_map_len, angular_get_fill_func}; + + +/** internal functions **/ + +static void +angular_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_reflect_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_reflect_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_reflect_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_reflect_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_repeat_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_repeat_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_repeat_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_repeat_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_restrict_reflect_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_restrict_reflect_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_restrict_reflect_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_restrict_reflect_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_restrict_repeat_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_restrict_repeat_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_restrict_repeat_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_restrict_repeat_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_pad_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_pad_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_pad_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +angular_pad_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + + + +RGBA_Gradient_Type * +evas_common_gradient_angular_get(void) +{ + return &angular; +} + +static void +angular_init(void) +{ +} + +static void +angular_shutdown(void) +{ +} + +static void +angular_free_geom(void *gdata) +{ + Angular_Data *data = (Angular_Data *)gdata; + if (data) free(data); +} + +static void +angular_setup_geom(RGBA_Gradient *gr) +{ + Angular_Data *angular_data; + + if (!gr || (gr->type.geometer != &angular)) return; + + angular_data = (Angular_Data *)gr->type.gdata; + if (!angular_data) return; + angular_data->sx = gr->fill.w; + angular_data->sy = gr->fill.h; + angular_data->s = angular_data->sx; + if (angular_data->sy > angular_data->sx) + angular_data->s = angular_data->sy; + angular_data->off = gr->map.offset; + angular_data->len = (2 * M_PI) * angular_data->s * angular_data->cy; +} + +static void +angular_init_geom(RGBA_Gradient *gr) +{ + Angular_Data *angular_data; + int err = 1; + char *s, *p, key[256]; + float val, an, cy; + + if (!gr || (gr->type.geometer != &angular)) return; + + angular_data = (Angular_Data *)gr->type.gdata; + if (!angular_data) + { + angular_data = calloc(1, sizeof(Angular_Data)); + if (!angular_data) return; + angular_data->an = -1.0; + angular_data->cy = 1.0; + angular_data->sx = 32; + angular_data->sy = 32; + angular_data->s = 32; + angular_data->off = 0.0; + angular_data->len = (2 * M_PI) * 32; + } + gr->type.gdata = angular_data; + if (!gr->type.params || !*(gr->type.params)) + return; + + s = strdup(gr->type.params); + if (!s) return; + + an = angular_data->an; + cy = angular_data->cy; + p = s; + while ((p = evas_common_gradient_get_key_fval(p, key, &val))) + { + if (!strcmp(key, "annulus")) + { + err = 0; + an = val; + } + else if (!strcmp(key, "wrap")) + { + err = 0; + cy = val; + } + else + { + err = 1; + break; + } + } + if (!err) + { + if (an < 0.0) an = 0.0; + if (an > 1.0) an = 1.0; + angular_data->an = an; + if (cy < 0.0) cy = 0.0; + if (cy > 1.0) cy = 1.0; + angular_data->cy = cy; + } + free(s); +} + + +static int +angular_has_alpha(RGBA_Gradient *gr, int op) +{ + Angular_Data *angular_data; + + if (!gr || (gr->type.geometer != &angular)) return 0; + + if (gr->has_alpha | gr->map.has_alpha) + return 1; + if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || + (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) ) + return 0; + angular_data = (Angular_Data *)gr->type.gdata; + if (!angular_data) return 0; + if ((int)angular_data->an >= 0) + return 1; + if ( ((gr->fill.spread == _EVAS_TEXTURE_RESTRICT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT)) + && (angular_data->cy < 1.0) ) + return 1; + return 0; +} + +static int +angular_has_mask(RGBA_Gradient *gr, int op) +{ + Angular_Data *angular_data; + + if (!gr || (gr->type.geometer != &angular)) return 0; + if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || + (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) ) + { + angular_data = (Angular_Data *)gr->type.gdata; + if (!angular_data) return 0; + if ((int)angular_data->an >= 0) + return 1; + if ( ((gr->fill.spread == _EVAS_TEXTURE_RESTRICT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT)) + && (angular_data->cy < 1.0) ) + return 1; + } + return 0; +} + +static int +angular_get_map_len(RGBA_Gradient *gr) +{ + Angular_Data *angular_data; + + if (!gr || (gr->type.geometer != &angular)) return 0; + angular_data = (Angular_Data *)gr->type.gdata; + if (!angular_data) return 0; + return angular_data->len; +} + +static Gfx_Func_Gradient_Fill +angular_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa) +{ + Gfx_Func_Gradient_Fill sfunc = NULL; + int masked_op = 0; + Angular_Data *angular_data; + + if (!gr || (gr->type.geometer != &angular)) return sfunc; + angular_data = (Angular_Data *)gr->type.gdata; + if (!angular_data) return sfunc; + + angular_data->off = gr->map.offset; + if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || + (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) ) + masked_op = 1; + + switch (gr->fill.spread) + { + case _EVAS_TEXTURE_REFLECT: + { + if (aa) + { + if ((int)angular_data->an >= 0) + { + if (masked_op) + sfunc = angular_reflect_aa_masked_annulus; + else + sfunc = angular_reflect_aa_annulus; + } + else + sfunc = angular_reflect_aa; + } + else + { + if ((int)angular_data->an >= 0) + { + if (masked_op) + sfunc = angular_reflect_masked_annulus; + else + sfunc = angular_reflect_annulus; + } + else + sfunc = angular_reflect; + } + } + break; + case _EVAS_TEXTURE_REPEAT: + { + if (aa) + { + if ((int)angular_data->an >= 0) + { + if (masked_op) + sfunc = angular_repeat_aa_masked_annulus; + else + sfunc = angular_repeat_aa_annulus; + } + else + sfunc = angular_repeat_aa; + } + else + { + if ((int)angular_data->an >= 0) + { + if (masked_op) + sfunc = angular_repeat_masked_annulus; + else + sfunc = angular_repeat_annulus; + } + else + sfunc = angular_repeat; + } + } + break; + case _EVAS_TEXTURE_RESTRICT: + angular_data->off = 0; + case _EVAS_TEXTURE_RESTRICT_REFLECT: + { + if (aa) + { + if ((int)angular_data->an >= 0) + { + if (masked_op) + sfunc = angular_restrict_reflect_aa_masked_annulus; + else + sfunc = angular_restrict_reflect_aa_annulus; + } + else if (angular_data->cy < 1.0) + { + if (masked_op) + sfunc = angular_restrict_reflect_aa_masked; + else + sfunc = angular_restrict_reflect_aa; + } + else + sfunc = angular_restrict_reflect_aa; + } + else + { + if ((int)angular_data->an >= 0) + { + if (masked_op) + sfunc = angular_restrict_reflect_masked_annulus; + else + sfunc = angular_restrict_reflect_annulus; + } + else if (angular_data->cy < 1.0) + { + if (masked_op) + sfunc = angular_restrict_reflect_masked; + else + sfunc = angular_restrict_reflect; + } + else + sfunc = angular_restrict_reflect; + } + } + break; + case _EVAS_TEXTURE_RESTRICT_REPEAT: + { + if (aa) + { + if ((int)angular_data->an >= 0) + { + if (masked_op) + sfunc = angular_restrict_repeat_aa_masked_annulus; + else + sfunc = angular_restrict_repeat_aa_annulus; + } + else if (angular_data->cy < 1.0) + { + if (masked_op) + sfunc = angular_restrict_repeat_aa_masked; + else + sfunc = angular_restrict_repeat_aa; + } + else + sfunc = angular_restrict_repeat_aa; + } + else + { + if ((int)angular_data->an >= 0) + { + if (masked_op) + sfunc = angular_restrict_repeat_masked_annulus; + else + sfunc = angular_restrict_repeat_annulus; + } + else if (angular_data->cy < 1.0) + { + if (masked_op) + sfunc = angular_restrict_repeat_masked; + else + sfunc = angular_restrict_repeat; + } + else + sfunc = angular_restrict_repeat; + } + } + break; + case _EVAS_TEXTURE_PAD: + { + if (aa) + { + if ((int)angular_data->an >= 0) + { + if (masked_op) + sfunc = angular_pad_aa_masked_annulus; + else + sfunc = angular_pad_aa_annulus; + } + else + sfunc = angular_pad_aa; + } + else + { + if ((int)angular_data->an >= 0) + { + if (masked_op) + sfunc = angular_pad_masked_annulus; + else + sfunc = angular_pad_annulus; + } + else + sfunc = angular_pad; + } + } + default: + sfunc = angular_reflect_aa; + break; + } + return sfunc; +} + +#define SETUP_ANGULAR_FILL \ + if (gdata->sx != gdata->s) \ + { \ + axx = (gdata->s * axx) / gdata->sx; \ + axy = (gdata->s * axy) / gdata->sx; \ + } \ + if (gdata->sy != gdata->s) \ + { \ + ayy = (gdata->s * ayy) / gdata->sy; \ + ayx = (gdata->s * ayx) / gdata->sy; \ + } \ + xx = (axx * x) + (axy * y); \ + yy = (ayx * x) + (ayy * y); + + +static void +angular_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = (ll >> 16); + + l += ((ll - (l << 16)) >> 15) + off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = (ll >> 16), lp; + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + lp = l + off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } + *dst = src[lp]; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_reflect_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; + if ((r >= r0) && (r <= r1)) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = (ll >> 16); + + l += ((ll - (l << 16)) >> 15) + off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; + } + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_reflect_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + int rr0 = r0 << 16, rr1 = r1 << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; + if ((r >= r0) && (r <= r1)) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = (ll >> 16), lp; + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + lp = l + off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } + *dst = src[lp]; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (r == r0) + { + a = 1 + ((rr - rr0) >> 8); + *dst = MUL_256(a, *dst); + } + if (r == r1) + { + a = 256 - ((rr - rr1) >> 8); + *dst = MUL_256(a, *dst); + } + } + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_reflect_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; *mask = 0; + if ((r >= r0) && (r <= r1)) + { + int ll = ss * (M_PI + atan2(yy, xx)), l = ll >> 16; + + l += ((ll - (l << 16)) >> 15) + off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; *mask = 255; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +angular_reflect_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + int rr0 = r0 << 16, rr1 = r1 << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; *mask = 0; + if ((r >= r0) && (r <= r1)) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = (ll >> 16), lp; + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + lp = l + off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } + *dst = src[lp]; *mask = 255; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (r == r0) + *mask = ((rr - rr0) >> 8); + if (r == r1) + *mask = 255 - ((rr - rr1) >> 8); + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +angular_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16; + + l += ((ll - (l << 16)) >> 15) + off; + l = l % src_len; + if (l < 0) + l += src_len; + *dst = src[l]; + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = (ll >> 16), lp; + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + lp = l + off; + lp = lp % src_len; + if (lp < 0) + lp += src_len; + *dst = src[lp]; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (lp == (src_len - 1)) + *dst = INTERP_256(a, src[0], *dst); + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_repeat_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; + if ((r >= r0) && (r <= r1)) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16; + + l += ((ll - (l << 16)) >> 15) + off; + l = l % src_len; + if (l < 0) + l += src_len; + *dst = src[l]; + } + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_repeat_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + int rr0 = r0 << 16, rr1 = r1 << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; + if ((r >= r0) && (r <= r1)) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16, lp; + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + lp = l + off; + lp = lp % src_len; + if (lp < 0) + lp += src_len; + *dst = src[lp]; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (lp == (src_len - 1)) + *dst = INTERP_256(a, src[0], *dst); + if (r == r0) + { + a = 1 + ((rr - rr0) >> 8); + *dst = MUL_256(a, *dst); + } + if (r == r1) + { + a = 256 - ((rr - rr1) >> 8); + *dst = MUL_256(a, *dst); + } + } + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_repeat_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; *mask = 0; + if ((r >= r0) && (r <= r1)) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16; + + l += ((ll - (l << 16)) >> 15) + off; + l = l % src_len; + if (l < 0) + l += src_len; + *dst = src[l]; *mask = 255; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +angular_repeat_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + int rr0 = r0 << 16, rr1 = r1 << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; *mask = 0; + if ((r >= r0) && (r <= r1)) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16, lp; + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + lp = l + off; + lp = lp % src_len; + if (lp < 0) + lp += src_len; + *dst = src[lp]; *mask = 255; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (lp == (src_len - 1)) + *dst = INTERP_256(a, src[0], *dst); + if (r == r0) + *mask = ((rr - rr0) >> 8); + if (r == r1) + *mask = 255 - ((rr - rr1) >> 8); + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +angular_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16; + + *dst = 0; + l += ((ll - (l << 16)) >> 15); + if (l < src_len) + { + l += off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; + } + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16, lp; + + *dst = 0; + if (l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a; + + lp = l + off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } + *dst = src[lp]; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (l == (src_len - 1)) + *dst = MUL_256(257 - a0, *dst); + if (l == 0) + *dst = MUL_256(a0, *dst); + } + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int ll = ss * (M_PI + atan2(yy, xx)), l = ll >> 16; + + *dst = 0; *mask = 0; + l += (ll - (l << 16)) >> 15; + if (l < src_len) + { + l += off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; *mask = 255; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +angular_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16, lp; + + *dst = 0; *mask = 0; + if (l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1; + + lp = l + off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } + *dst = src[lp]; *mask = 255; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (l == (src_len - 1)) + *mask = 255 - a0; + if (l == 0) + *mask = a0; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +angular_restrict_reflect_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; + if ( (r >= r0) && (r <= r1) ) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16; + + l += (ll - (l << 16)) >> 15; + if (l < src_len) + { + l += off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; + } + } + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_restrict_reflect_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + int rr0 = r0 << 16, rr1 = r1 << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; + if ( (r >= r0) && (r <= r1) ) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16, lp; + + if (l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a; + + lp = l + off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } + *dst = src[lp]; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (l == (src_len - 1)) + *dst = MUL_256(257 - a0, *dst); + if (l == 0) + *dst = MUL_256(a0, *dst); + if (r == r0) + { + a = 1 + ((rr - rr0) >> 8); + *dst = MUL_256(a, *dst); + } + if (r == r1) + { + a = 256 - ((rr - rr1) >> 8); + *dst = MUL_256(a, *dst); + } + } + } + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_restrict_reflect_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; *mask = 0; + if ( (r >= r0) && (r <= r1) ) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16; + + l += (ll - (l << 16)) >> 15; + if (l < src_len) + { + l += off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; *mask = 255; + } + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +angular_restrict_reflect_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + int rr0 = r0 << 16, rr1 = r1 << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; *mask = 0; + if ( (r >= r0) && (r <= r1) ) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16, lp; + + if (l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1; + + lp = l + off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } + *dst = src[lp]; *mask = 255; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (l == (src_len - 1)) + *mask = 255 - a0; + if (l == 0) + *mask = a0; + if (r == r0) + *mask = ((rr - rr0) >> 8); + if (r == r1) + *mask = 255 - ((rr - rr1) >> 8); + } + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +angular_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16; + + *dst = 0; + l += ((ll - (l << 16)) >> 15); + if (l < src_len) + { + l += off; + l = l % src_len; + if (l < 0) + l += src_len; + *dst = src[l]; + } + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16, lp; + + *dst = 0; + if (l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a; + + lp = l + off; + lp = lp % src_len; + if (lp < 0) + lp += src_len; + *dst = src[lp]; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (lp == (src_len - 1)) + *dst = INTERP_256(a, src[0], *dst); + if (l == (src_len - 1)) + *dst = MUL_256(257 - a0, *dst); + if (l == 0) + *dst = MUL_256(a0, *dst); + } + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int ll = ss * (M_PI + atan2(yy, xx)), l = ll >> 16; + + *dst = 0; *mask = 0; + l += (ll - (l << 16)) >> 15; + if (l < src_len) + { + l += off; + l = l % src_len; + if (l < 0) + l += src_len; + *dst = src[l]; *mask = 255; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +angular_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16, lp; + + *dst = 0; *mask = 0; + if (l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1; + + lp = l + off; + lp = lp % src_len; + if (lp < 0) + lp += src_len; + *dst = src[lp]; *mask = 255; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (lp == (src_len - 1)) + *dst = INTERP_256(a, src[0], *dst); + if (l == (src_len - 1)) + *mask = 255 - a0; + if (l == 0) + *mask = a0; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +angular_restrict_repeat_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; + if ( (r >= r0) && (r <= r1) ) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16; + + l += (ll - (l << 16)) >> 15; + if (l < src_len) + { + l += off; + l = l % src_len; + if (l < 0) + l += src_len; + *dst = src[l]; + } + } + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_restrict_repeat_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + int rr0 = r0 << 16, rr1 = r1 << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; + if ( (r >= r0) && (r <= r1) ) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16, lp; + + if (l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a; + + lp = l + off; + lp = lp % src_len; + if (lp < 0) + lp += src_len; + *dst = src[lp]; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (lp == (src_len - 1)) + *dst = INTERP_256(a, src[0], *dst); + if (l == (src_len - 1)) + *dst = MUL_256(257 - a0, *dst); + if (l == 0) + *dst = MUL_256(a0, *dst); + if (r == r0) + { + a = 1 + ((rr - rr0) >> 8); + *dst = MUL_256(a, *dst); + } + if (r == r1) + { + a = 256 - ((rr - rr1) >> 8); + *dst = MUL_256(a, *dst); + } + } + } + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_restrict_repeat_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; *mask = 0; + if ( (r >= r0) && (r <= r1) ) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16; + + l += (ll - (l << 16)) >> 15; + if (l < src_len) + { + l += off; + l = l % src_len; + if (l < 0) + l += src_len; + *dst = src[l]; *mask = 255; + } + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +angular_restrict_repeat_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + int rr0 = r0 << 16, rr1 = r1 << 16; + float off = gdata->off * (src_len - 1); + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; *mask = 0; + if ( (r >= r0) && (r <= r1) ) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16, lp; + + if (l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1; + + lp = l + off; + lp = lp % src_len; + if (lp < 0) + lp += src_len; + *dst = src[lp]; *mask = 255; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (lp == (src_len - 1)) + *dst = INTERP_256(a, src[0], *dst); + if (l == (src_len - 1)) + *mask = 255 - a0; + if (l == 0) + *mask = a0; + if (r == r0) + *mask = ((rr - rr0) >> 8); + if (r == r1) + *mask = 255 - ((rr - rr1) >> 8); + } + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +angular_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16; + + l += (ll - (l << 16)) >> 15; + if (l >= src_len) + l = src_len - 1; + *dst++ = src[l]; xx += axx; yy += ayx; + } +} + +static void +angular_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16; + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + if (l + 1 < src_len) + *dst = INTERP_256(a, src[l + 1], src[l]); + else + *dst = src[src_len - 1]; + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_pad_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; + if ( (r >= r0) && (r <= r1) ) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16; + + l += (ll - (l << 16)) >> 15; + if (l >= src_len) + l = src_len - 1; + *dst = src[l]; + } + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_pad_aa_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + int rr0 = r0 << 16, rr1 = r1 << 16; + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; + if ( (r >= r0) && (r <= r1) ) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16; + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + if (l + 1 < src_len) + *dst = INTERP_256(a, src[l + 1], src[l]); + else + *dst = src[src_len - 1]; + if (r == r0) + { + a = 1 + ((rr - rr0) >> 8); + *dst = MUL_256(a, *dst); + } + if (r == r1) + { + a = 256 - ((rr - rr1) >> 8); + *dst = MUL_256(a, *dst); + } + } + dst++; xx += axx; yy += ayx; + } +} + +static void +angular_pad_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; *mask = 0; + if ( (r >= r0) && (r <= r1) ) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16; + + l += (ll - (l << 16)) >> 15; + if (l >= src_len) + l = src_len - 1; + *dst = src[l]; *mask = 255; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +angular_pad_aa_masked_annulus(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Angular_Data *gdata = (Angular_Data *)params_data; + int xx, yy; + int ss = (gdata->s) << 16; + int r1 = gdata->s, r0 = gdata->an * r1; + int rr0 = r0 << 16, rr1 = r1 << 16; + + SETUP_ANGULAR_FILL + + while (dst < dst_end) + { + int rr = hypot(xx, yy), r = (rr >> 16); + + *dst = 0; *mask = 0; + if ( (r >= r0) && (r <= r1) ) + { + int ll = ss * (M_PI + atan2(yy, xx)); + int l = ll >> 16; + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + if (l + 1 < src_len) + *dst = INTERP_256(a, src[l + 1], src[l]); + else + *dst = src[src_len - 1]; + + *mask = 255; + if (r == r0) + *mask = ((rr - rr0) >> 8); + if (r == r1) + *mask = 255 - ((rr - rr1) >> 8); + } + dst++; mask++; xx += axx; yy += ayx; + } +} diff --git a/src/lib/engines/common/evas_gradient_linear.c b/src/lib/engines/common/evas_gradient_linear.c new file mode 100644 index 0000000..8095285 --- /dev/null +++ b/src/lib/engines/common/evas_gradient_linear.c @@ -0,0 +1,1510 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include + +#include "evas_common.h" +#include "evas_gradient_private.h" + +#define GRAD_LINEAR_DIAG 1 +#define GRAD_LINEAR_CODIAG 2 + +typedef struct _Linear_Data Linear_Data; +struct _Linear_Data +{ + int type; + + int yy0; + float ca, sa; + float off; + int len; + + unsigned char at_angle : 1; +}; + +static void +linear_init(void); + +static void +linear_shutdown(void); + +static void +linear_init_geom(RGBA_Gradient *gr); + +static void +linear_setup_geom(RGBA_Gradient *gr); + +static void +linear_free_geom(void *gdata); + +static int +linear_has_alpha(RGBA_Gradient *gr, int op); + +static int +linear_has_mask(RGBA_Gradient *gr, int op); + +static int +linear_get_map_len(RGBA_Gradient *gr); + +static Gfx_Func_Gradient_Fill +linear_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa); + +static RGBA_Gradient_Type linear = {"linear", linear_init, linear_shutdown, + linear_init_geom, linear_setup_geom, linear_free_geom, + linear_has_alpha, linear_has_mask, + linear_get_map_len, linear_get_fill_func}; + + + +/** internal functions **/ +static void +linear_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_restrict(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_restrict_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_restrict_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_restrict_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +linear_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + + + +RGBA_Gradient_Type * +evas_common_gradient_linear_get(void) +{ + return &linear; +} + +static void +linear_init(void) +{ +} + +static void +linear_shutdown(void) +{ +} + +static void +linear_free_geom(void *gdata) +{ + Linear_Data *data = (Linear_Data *)gdata; + if (data) free(data); +} + +static void +linear_init_geom(RGBA_Gradient *gr) +{ + Linear_Data *linear_data; + + if (!gr || (gr->type.geometer != &linear)) return; + linear_data = (Linear_Data *)gr->type.gdata; + if (!linear_data) + { + linear_data = calloc(1, sizeof(Linear_Data)); + if (!linear_data) return; + linear_data->type = 0; + linear_data->yy0 = 0; + linear_data->ca = 1.0; + linear_data->sa = 0.0; + linear_data->off = 0.0; + linear_data->len = 32; + linear_data->at_angle = 0; + gr->type.gdata = linear_data; + } + + linear_data->type = 0; + if (gr->type.name && !strcmp(gr->type.name, "linear.diag")) + linear_data->type = GRAD_LINEAR_DIAG; + else if (gr->type.name && !strcmp(gr->type.name, "linear.codiag")) + linear_data->type = GRAD_LINEAR_CODIAG; +} + +static void +linear_setup_geom(RGBA_Gradient *gr) +{ + Linear_Data *linear_data; + float angle, a, ca, sa; + int xoff = 0, yoff = 0; + + if (!gr || (gr->type.geometer != &linear)) return; + linear_data = (Linear_Data *)gr->type.gdata; + if (!linear_data) return; + + angle = gr->map.angle; + if (linear_data->type == GRAD_LINEAR_DIAG) + angle += ((atan2(gr->fill.h - 1, gr->fill.w - 1) * 180.0) / M_PI) - 90.0; + else if (linear_data->type == GRAD_LINEAR_CODIAG) + angle -= ((atan2(gr->fill.h - 1, gr->fill.w - 1) * 180.0) / M_PI) - 90.0; + a = ((angle + 90.0) * M_PI) / 180.0; + ca = cos(a); + sa = sin(a); + if ((sa >= 0) && (ca <= 0)) + { + ca = -ca; + xoff = -(gr->fill.w - 1); + } + else if ((sa <= 0) && (ca <= 0)) + { + ca = -ca; sa = -sa; + xoff = -(gr->fill.w - 1); + yoff = -(gr->fill.h - 1); + } + else if ((sa <= 0) && (ca >= 0)) + { + sa = -sa; + yoff = -(gr->fill.h - 1); + } + linear_data->len = 0.9961 + (ca * gr->fill.w) + (sa * gr->fill.h); + + a = (angle * M_PI) / 180.0; + linear_data->ca = cos(a); + linear_data->sa = sin(a); + + linear_data->yy0 = (linear_data->ca * (yoff << 16)) - (linear_data->sa * (xoff << 16)); + linear_data->off = gr->map.offset; + + if ((linear_data->ca != 1.0) || (linear_data->sa != 0.0)) + linear_data->at_angle = 1; +} + +static int +linear_has_alpha(RGBA_Gradient *gr, int op) +{ + if (!gr || (gr->type.geometer != &linear)) return 0; + if (gr->has_alpha | gr->map.has_alpha) + return 1; + if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || + (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) ) + return 0; + if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) ) + return 1; + return 0; +} + +static int +linear_has_mask(RGBA_Gradient *gr, int op) +{ + if (!gr || (gr->type.geometer != &linear)) return 0; + if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || + (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) ) + { + if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) ) + return 1; + } + return 0; +} + +static int +linear_get_map_len(RGBA_Gradient *gr) +{ + Linear_Data *linear_data; + + if (!gr || (gr->type.geometer != &linear)) return 0; + linear_data = (Linear_Data *)gr->type.gdata; + if (!linear_data) return 0; + return linear_data->len; +} + +static Gfx_Func_Gradient_Fill +linear_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa) +{ + Linear_Data *linear_data; + Gfx_Func_Gradient_Fill sfunc = NULL; + int masked_op = 0; + + if (!gr || (gr->type.geometer != &linear)) + return sfunc; + linear_data = (Linear_Data *)gr->type.gdata; + if (!linear_data) return sfunc; + + if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || + (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) ) + masked_op = 1; + + switch (gr->fill.spread) + { + case _EVAS_TEXTURE_REFLECT: + { + if (aa) + sfunc = linear_reflect_aa; + else + sfunc = linear_reflect; + } + break; + case _EVAS_TEXTURE_REPEAT: + { + if (aa) + sfunc = linear_repeat_aa; + else + sfunc = linear_repeat; + } + break; + case _EVAS_TEXTURE_RESTRICT: + { + if (aa) + { + if (masked_op) + sfunc = linear_restrict_aa_masked; + else + sfunc = linear_restrict_aa; + } + else + { + if (masked_op) + sfunc = linear_restrict_masked; + else + sfunc = linear_restrict; + } + } + break; + case _EVAS_TEXTURE_RESTRICT_REFLECT: + { + if (aa) + { + if (masked_op) + sfunc = linear_restrict_reflect_aa_masked; + else + sfunc = linear_restrict_reflect_aa; + } + else + { + if (masked_op) + sfunc = linear_restrict_reflect_masked; + else + sfunc = linear_restrict_reflect; + } + } + break; + case _EVAS_TEXTURE_RESTRICT_REPEAT: + { + if (aa) + { + if (masked_op) + sfunc = linear_restrict_repeat_aa_masked; + else + sfunc = linear_restrict_repeat_aa; + } + else + { + if (masked_op) + sfunc = linear_restrict_repeat_masked; + else + sfunc = linear_restrict_repeat; + } + } + break; + case _EVAS_TEXTURE_PAD: + { + if (aa) + sfunc = linear_pad_aa; + else + sfunc = linear_pad; + } + break; + default: + sfunc = linear_reflect_aa; + break; + } + return sfunc; +} + +/* the fill functions */ + +#ifdef BUILD_MMX +#define INTERP_256_P2R(a, s, mma, mms, mmd, mmz) \ + MOV_A2R(a, mma) \ + MOV_P2R(s, mms, mmz) \ + INTERP_256_R2R(mma, mms, mmd, mm5) + +#define MUL_256_A2R(a, mma, mmd, mmz) \ + MOV_A2R(a, mma) \ + MUL4_256_R2R(mma, mmd) +#endif + +#define AXIS_ALIGNED \ + ( ((ayy == 0) || (ayx == 0)) && ((gdata->ca == 0.0) || (gdata->sa == 0.0)) ) + +#define SETUP_LINEAR_FILL \ + if (gdata->at_angle) \ + { \ + ayx = (-gdata->sa * axx) + (gdata->ca * ayx); \ + ayy = (-gdata->sa * axy) + (gdata->ca * ayy); \ + } \ + yy = (ayx * x) + (ayy * y) + gdata->yy0; + + +static void +linear_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int off = gdata->off * (src_len - 1); + int yy; + + SETUP_LINEAR_FILL + + if (ayx == 0) + { + DATA32 c; + + y = (yy >> 16) + off; + if (y < 0) y = -y; + if (y >= src_len) + { + int m = (y % (2 * src_len)); + + y = (y % src_len); + if (m >= src_len) + y = src_len - y - 1; + } + c = src[y]; + while (dst < dst_end) + *dst++ = c; + return; + } + + while (dst < dst_end) + { + int l = (yy >> 16); + + l += ((yy - (l << 16)) >> 15) + off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst++ = src[l]; yy += ayx; + } +} + +static void +linear_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int off = gdata->off * (src_len - 1); + int yy; + + if (AXIS_ALIGNED) + { + linear_reflect(src, src_len, dst, mask, dst_len, x, y, + axx, axy, ayx, ayy, params_data); + return; + } + + SETUP_LINEAR_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int l = (yy >> 16); + int a = 1 + ((yy - (l << 16)) >> 8); + + l += off; + if (l < 0) { l = -l; a = 257 - a; } + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + { l = src_len - l - 1; a = 257 - a; } + } +#ifdef BUILD_MMX + MOV_P2R(src[l], mm1, mm0) +#else + *dst = src[l]; +#endif + if (l + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[l + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[l + 1], *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + dst++; yy += ayx; + } +} + +static void +linear_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int off = gdata->off * (src_len - 1); + int yy; + + SETUP_LINEAR_FILL + + if (ayx == 0) + { + DATA32 c; + + y = (yy >> 16) + off; + y = y % src_len; + if (y < 0) + y += src_len; + c = src[y]; + while (dst < dst_end) + *dst++ = c; + return; + } + + if (ayy == 0) + { + Gfx_Func_Copy func; + int l; + + x = (yy >> 16) + off; + x = x % src_len; + if (x < 0) + x += src_len; + if (ayx < 0) + { + l = x + 1; x = 0; + } + else + l = src_len - x; + if (l > dst_len) l = dst_len; + func = evas_common_draw_func_copy_get(1, (ayx < 0 ? -1 : 0)); + func(src + x, dst, l); + if (l == dst_len) return; + dst += l; dst_len -= l; + l = dst_len / src_len; + while (l--) + { + func(src, dst, src_len); + dst += src_len; + } + l = dst_len % src_len; + if (ayx < 0) + src += src_len - l; + func(src, dst, l); + return; + } + + while (dst < dst_end) + { + int l = (yy >> 16); + + l += ((yy - (l << 16)) >> 15) + off; + l = l % src_len; + if (l < 0) + l += src_len; + *dst++ = src[l]; yy += ayx; + } +} + +static void +linear_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int off = gdata->off * (src_len - 1); + int yy; + + if (AXIS_ALIGNED) + { + linear_repeat(src, src_len, dst, mask, dst_len, x, y, + axx, axy, ayx, ayy, params_data); + return; + } + + SETUP_LINEAR_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int l = (yy >> 16); + int a = 1 + ((yy - (l << 16)) >> 8); + + l += off; + l = l % src_len; + if (l < 0) + l += src_len; +#ifdef BUILD_MMX + MOV_P2R(src[l], mm1, mm0) +#else + *dst = src[l]; +#endif + if (l + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[l + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[l + 1], *dst); +#endif + } + if (l == (src_len - 1)) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[0], *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + dst++; yy += ayx; + } +} + +static void +linear_restrict(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int yy; + + SETUP_LINEAR_FILL + + if (ayx == 0) + { + DATA32 c; + + y = (yy >> 16); + if ((y < 0) || (y >= src_len)) + { + memset(dst, 0, sizeof(DATA32) * dst_len); + return; + } + c = src[y]; + while (dst < dst_end) + *dst++ = c; + return; + } + + if (ayy == 0) + { + Gfx_Func_Copy func; + + x = yy >> 16; + ayx = (ayx < 0 ? -1 : 1); + if ((unsigned)x < src_len) + { + if ((ayx > 0) && ((src_len - x) >= dst_len)) + { + func = evas_common_draw_func_copy_get(dst_len, 0); + func(src + x, dst, dst_len); + return; + } + if ((ayx < 0) && (x >= (dst_len - 1))) + { + func = evas_common_draw_func_copy_get(dst_len, -1); + func(src + x - (dst_len - 1), dst, dst_len); + return; + } + } + while (dst < dst_end) + { + *dst = 0; + if ((unsigned)x < src_len) + *dst = src[x]; + dst++; x += ayx; + } + return; + } + + while (dst < dst_end) + { + int l = (yy >> 16); + + l += (yy - (l << 16)) >> 15; + *dst = 0; + if ((unsigned)l < src_len) + *dst = src[l]; + dst++; yy += ayx; + } +} + +static void +linear_restrict_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int yy; + + if (AXIS_ALIGNED) + { + linear_restrict(src, src_len, dst, mask, dst_len, x, y, + axx, axy, ayx, ayy, params_data); + return; + } + + SETUP_LINEAR_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int l = (yy >> 16); + + *dst = 0; + if ((unsigned)(l + 1) < (src_len + 1)) + { + DATA32 a = 1 + ((yy - (l << 16)) >> 8); + int lp = l; + + if (l == -1) lp = 0; +#ifdef BUILD_MMX + MOV_P2R(src[lp], mm1, mm0) +#else + *dst = src[lp]; +#endif + if (lp + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[lp + 1], *dst); +#endif + } + if (l == -1) + { +#ifdef BUILD_MMX + MUL_256_A2R(a, mm3, mm1, mm0) +#else + *dst = MUL_256(a, *dst); +#endif + } + if (l == (src_len - 1)) + { +#ifdef BUILD_MMX + a = 257 - a; + MUL_256_A2R(a, mm3, mm1, mm0) +#else + *dst = MUL_256(257 - a, *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + } + dst++; yy += ayx; + } +} + +static void +linear_restrict_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int yy; + + SETUP_LINEAR_FILL + + if (ayx == 0) + { + DATA32 c; + + y = (yy >> 16); + if ((y < 0) || (y >= src_len)) + { + memset(dst, 0, sizeof(DATA32) * dst_len); + memset(mask, 0, sizeof(DATA8) * dst_len); + return; + } + c = src[y]; + while (dst < dst_end) + { + *dst++ = c; *mask++ = 255; + } + return; + } + + if (ayy == 0) + { + Gfx_Func_Copy func; + + x = yy >> 16; + ayx = (ayx < 0 ? -1 : 1); + if ((unsigned)x < src_len) + { + if ((ayx > 0) && ((src_len - x) >= dst_len)) + { + func = evas_common_draw_func_copy_get(dst_len, 0); + func(src + x, dst, dst_len); + memset(mask, 255, sizeof(DATA8) * dst_len); + return; + } + if ((ayx < 0) && (x >= (dst_len - 1))) + { + func = evas_common_draw_func_copy_get(dst_len, -1); + func(src + x - (dst_len - 1), dst, dst_len); + memset(mask, 255, sizeof(DATA8) * dst_len); + return; + } + } + while (dst < dst_end) + { + *dst = 0; *mask = 0; + if ((unsigned)x < src_len) + { + *dst = src[x]; *mask = 255; + } + dst++; mask++; x += ayx; + } + return; + } + + while (dst < dst_end) + { + int l = (yy >> 16); + + l += (yy - (l << 16)) >> 15; + *dst = 0; *mask = 0; + if ((unsigned)l < src_len) + { + *dst = src[l]; *mask = 255; + } + dst++; mask++; yy += ayx; + } +} + +static void +linear_restrict_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int yy; + + if (AXIS_ALIGNED) + { + linear_restrict_masked(src, src_len, dst, mask, dst_len, x, y, + axx, axy, ayx, ayy, params_data); + return; + } + + SETUP_LINEAR_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int l = (yy >> 16); + + *dst = 0; *mask = 0; + if ((unsigned)(l + 1) < (src_len + 1)) + { + DATA32 a = 1 + ((yy - (l << 16)) >> 8); + int lp = l; + + if (l == -1) lp = 0; + +#ifdef BUILD_MMX + MOV_P2R(src[lp], mm1, mm0) +#else + *dst = src[lp]; *mask = 255; +#endif + if (lp + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[lp + 1], *dst); +#endif + } + if (l == -1) + *mask = a - 1; + if (l == (src_len - 1)) + *mask = 256 - a; +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + } + dst++; mask++; yy += ayx; + } +} + +static void +linear_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int off = gdata->off * (src_len - 1); + int yy; + + SETUP_LINEAR_FILL + + if (ayx == 0) + { + DATA32 c; + + y = (yy >> 16); + if ((y < 0) || (y >= src_len)) + { + memset(dst, 0, sizeof(DATA32) * dst_len); + return; + } + y += off; + if (y < 0) y = -y; + if (y >= src_len) + { + int m = (y % (2 * src_len)); + + y = (y % src_len); + if (m >= src_len) + y = src_len - y - 1; + } + c = src[y]; + while (dst < dst_end) + *dst++ = c; + return; + } + + while (dst < dst_end) + { + int l = (yy >> 16); + + l += (yy - (l << 16)) >> 15; + *dst = 0; + if ((unsigned)l < src_len) + { + l += off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; + } + dst++; yy += ayx; + } +} + +static void +linear_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int off = gdata->off * (src_len - 1); + int yy; + + if (AXIS_ALIGNED) + { + linear_restrict_reflect(src, src_len, dst, mask, dst_len, x, y, + axx, axy, ayx, ayy, params_data); + return; + } + + SETUP_LINEAR_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int l = (yy >> 16); + + *dst = 0; + if ((unsigned)(l + 1) < (src_len + 1)) + { + DATA32 a = 1 + ((yy - (l << 16)) >> 8), a0 = a; + int lp = l + off; + + if (l == -1) lp = off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } +#ifdef BUILD_MMX + MOV_P2R(src[lp], mm1, mm0) +#else + *dst = src[lp]; +#endif + if (lp + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[lp + 1], *dst); +#endif + } + if (l == -1) + { +#ifdef BUILD_MMX + MUL_256_A2R(a0, mm3, mm1, mm0) +#else + *dst = MUL_256(a0, *dst); +#endif + } + if (l == (src_len - 1)) + { +#ifdef BUILD_MMX + a0 = 257 - a0; + MUL_256_A2R(a0, mm3, mm1, mm0) +#else + *dst = MUL_256(257 - a0, *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + } + dst++; yy += ayx; + } +} + +static void +linear_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int off = gdata->off * (src_len - 1); + int yy; + + SETUP_LINEAR_FILL + + if (ayx == 0) + { + DATA32 c; + + y = (yy >> 16); + if ((y < 0) || (y >= src_len)) + { + memset(dst, 0, sizeof(DATA32) * dst_len); + memset(mask, 0, sizeof(DATA8) * dst_len); + return; + } + y += off; + if (y < 0) y = -y; + if (y >= src_len) + { + int m = (y % (2 * src_len)); + + y = (y % src_len); + if (m >= src_len) + y = src_len - y - 1; + } + c = src[y]; + while (dst < dst_end) + { *dst++ = c; *mask++ = 255; } + return; + } + + while (dst < dst_end) + { + int l = (yy >> 16); + + l += ((yy - (l << 16)) >> 15); + *dst = 0; *mask = 0; + if ((unsigned)l < src_len) + { + l += off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; *mask = 255; + } + dst++; mask++; yy += ayx; + } +} + +static void +linear_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int off = gdata->off * (src_len - 1); + int yy; + + if (AXIS_ALIGNED) + { + linear_restrict_reflect_masked(src, src_len, dst, mask, dst_len, x, y, + axx, axy, ayx, ayy, params_data); + return; + } + + SETUP_LINEAR_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int l = (yy >> 16); + + *dst = 0; *mask = 0; + if ((unsigned)(l + 1) < (src_len + 1)) + { + DATA32 a = 1 + ((yy - (l << 16)) >> 8), a0 = a - 1; + int lp = l + off; + + if (l == -1) lp = off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } +#ifdef BUILD_MMX + MOV_P2R(src[lp], mm1, mm0) +#else + *dst = src[lp]; +#endif + *mask = 255; + + if (lp + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[lp + 1], *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + if (l == -1) + *mask = a0; + if (l == (src_len - 1)) + *mask = 255 - a0; + } + dst++; mask++; yy += ayx; + } +} + +static void +linear_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int off = gdata->off * (src_len - 1); + int yy; + + SETUP_LINEAR_FILL + + if (ayx == 0) + { + DATA32 c; + + y = (yy >> 16); + if ((y < 0) || (y >= src_len)) + { + memset(dst, 0, sizeof(DATA32) * dst_len); + return; + } + y += off; + y = y % src_len; + if (y < 0) + y += src_len; + c = src[y]; + while (dst < dst_end) + *dst++ = c; + return; + } + + while (dst < dst_end) + { + int l = (yy >> 16); + + l += (yy - (l << 16)) >> 15; + *dst = 0; + if ((unsigned)l < src_len) + { + l += off; + l = l % src_len; + if (l < 0) + l += src_len; + *dst = src[l]; + } + dst++; yy += ayx; + } +} + +static void +linear_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int off = gdata->off * (src_len - 1); + int yy; + + if (AXIS_ALIGNED) + { + linear_restrict_repeat(src, src_len, dst, mask, dst_len, x, y, + axx, axy, ayx, ayy, params_data); + return; + } + + SETUP_LINEAR_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int l = (yy >> 16); + + *dst = 0; + if ((unsigned)(l + 1) < (src_len + 1)) + { + DATA32 a = 1 + ((yy - (l << 16)) >> 8); + int lp = l + off; + + if (l == -1) lp = off; + lp = lp % src_len; + if (lp < 0) + lp += src_len; +#ifdef BUILD_MMX + MOV_P2R(src[lp], mm1, mm0) +#else + *dst = src[lp]; +#endif + if (lp + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[lp + 1], *dst); +#endif + } + if (lp == (src_len - 1)) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[0], *dst); +#endif + } + if (l == -1) + { +#ifdef BUILD_MMX + MUL_256_A2R(a, mm3, mm1, mm0) +#else + *dst = MUL_256(a, *dst); +#endif + } + if (l == (src_len - 1)) + { +#ifdef BUILD_MMX + a = 257 - a; + MUL_256_A2R(a, mm3, mm1, mm0) +#else + *dst = MUL_256(257 - a, *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + } + dst++; yy += ayx; + } +} + +static void +linear_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int off = gdata->off * (src_len - 1); + int yy; + + SETUP_LINEAR_FILL + + if (ayx == 0) + { + DATA32 c; + + y = (yy >> 16); + if ((y < 0) || (y >= src_len)) + { + memset(dst, 0, sizeof(DATA32) * dst_len); + memset(mask, 0, sizeof(DATA8) * dst_len); + return; + } + y += off; + y = y % src_len; + if (y < 0) + y += src_len; + c = src[y]; + while (dst < dst_end) + { *dst++ = c; *mask++ = 255; } + return; + } + + while (dst < dst_end) + { + int l = (yy >> 16); + + l += ((yy - (l << 16)) >> 15); + *dst = 0; *mask = 0; + if ((unsigned)l < src_len) + { + l += off; + l = l % src_len; + if (l < 0) + l += src_len; + *dst = src[l]; *mask = 255; + } + dst++; mask++; yy += ayx; + } +} + +static void +linear_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int off = gdata->off * (src_len - 1); + int yy; + + if (AXIS_ALIGNED) + { + linear_restrict_repeat_masked(src, src_len, dst, mask, dst_len, x, y, + axx, axy, ayx, ayy, params_data); + return; + } + + SETUP_LINEAR_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int l = (yy >> 16); + + *dst = 0; *mask = 0; + if ((unsigned)(l + 1) < (src_len + 1)) + { + DATA32 a = 1 + ((yy - (l << 16)) >> 8); + int lp = l + off; + + if (l == -1) lp = off; + lp = lp % src_len; + if (lp < 0) + lp += src_len; +#ifdef BUILD_MMX + MOV_P2R(src[lp], mm1, mm0) +#else + *dst = src[lp]; +#endif + *mask = 255; + + if (lp + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[lp + 1], *dst); +#endif + } + if (lp == (src_len - 1)) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[0], *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + if (l == -1) + *mask = a - 1; + if (l == (src_len - 1)) + *mask = 256 - a; + } + dst++; mask++; yy += ayx; + } +} + +static void +linear_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int yy; + + SETUP_LINEAR_FILL + + while (dst < dst_end) + { + int l = (yy >> 16); + + l += (yy - (l << 16)) >> 15; + if (l < 0) l = 0; + if (l >= src_len) l = src_len - 1; + *dst = src[l]; + dst++; yy += ayx; + } +} + +static void +linear_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Linear_Data *gdata = (Linear_Data *)params_data; + int yy; + + if (AXIS_ALIGNED) + { + linear_pad(src, src_len, dst, mask, dst_len, x, y, + axx, axy, ayx, ayy, params_data); + return; + } + + SETUP_LINEAR_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int l = (yy >> 16); + + if (l < 0) *dst = src[0]; + if (l >= src_len) *dst = src[src_len - 1]; + if ((unsigned)l < src_len) + { + DATA32 a = 1 + ((yy - (l << 16)) >> 8); + +#ifdef BUILD_MMX + MOV_P2R(src[l], mm1, mm0) +#else + *dst = src[l]; +#endif + if (l && (l + 1 < src_len)) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[l + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[l + 1], *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + } + dst++; yy += ayx; + } +} diff --git a/src/lib/engines/common/evas_gradient_main.c b/src/lib/engines/common/evas_gradient_main.c new file mode 100644 index 0000000..7a18836 --- /dev/null +++ b/src/lib/engines/common/evas_gradient_main.c @@ -0,0 +1,924 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include + +#include "evas_common.h" +#include "evas_blend_private.h" +#include "evas_gradient_private.h" + + +static void _get_word(char *in, char *key); +static void evas_common_gradient_map_argb(RGBA_Draw_Context *dc, RGBA_Gradient *gr, int len); +static void evas_common_gradient_map_ahsv(RGBA_Draw_Context *dc, RGBA_Gradient *gr, int len); + +static int grad_initialised = 0; + +static void +_get_word(char *in, char *key) +{ + char *p, *pp; + int l; + + if (!key) return; + *key = 0; + if (!in || !*in) return; + + p = in; + while (*p && isspace(*p)) + p++; + if (!*p) return; + pp = p; + while (*pp && !isspace(*pp)) + pp++; + l = pp - p; + if (l >= 255) return; + *(p + l) = 0; + strncpy(key, p, l + 1); +} + +static void +_evas_common_gradient_stops_free(RGBA_Gradient *gr) +{ + if (!gr) return; + if (gr->color.stops) + { + Evas_Object_List *l; + + while (gr->color.stops) + { + l = gr->color.stops; + gr->color.stops = evas_object_list_remove(gr->color.stops, gr->color.stops); + free(l); + } + gr->color.stops = NULL; + gr->color.nstops = 0; + } + if (gr->alpha.stops) + { + Evas_Object_List *l; + + while (gr->alpha.stops) + { + l = gr->alpha.stops; + gr->alpha.stops = evas_object_list_remove(gr->alpha.stops, gr->alpha.stops); + free(l); + } + gr->alpha.stops = NULL; + gr->alpha.nstops = 0; + } +} + + +char * +evas_common_gradient_get_key_fval(char *in, char *key, float *val) +{ + char *p, *pp, sval[256]; + + if (!key || !val) return NULL; + *key = 0; + if (!in || !*in) return NULL; + p = strchr(in, '='); + if (!p || !*p) return NULL; + *p = 0; p++; + if (!*p) return NULL; + pp = strchr(p, ';'); + if (!pp || !*pp) return NULL; + _get_word(in, key); + if (!*key) return NULL; + *pp = 0; + _get_word(p, sval); + if (!sval[0]) return NULL; + *val = atof(sval); + return (pp + 1); +} + +EAPI void +evas_common_gradient_init(void) +{ + RGBA_Gradient_Type *geom; + + if (grad_initialised) + return; + geom = evas_common_gradient_geometer_get("linear"); + if (geom) + geom->init(); + geom = evas_common_gradient_geometer_get("radial"); + if (geom) + geom->init(); + geom = evas_common_gradient_geometer_get("rectangular"); + if (geom) + geom->init(); + geom = evas_common_gradient_geometer_get("angular"); + if (geom) + geom->init(); + geom = evas_common_gradient_geometer_get("sinusoidal"); + if (geom) + geom->init(); + grad_initialised = 1; +} + +void +evas_common_gradient_shutdown(void) +{ + RGBA_Gradient_Type *geom; + + if (!grad_initialised) + return; + geom = evas_common_gradient_geometer_get("linear"); + if (geom) + geom->shutdown(); + geom = evas_common_gradient_geometer_get("radial"); + if (geom) + geom->shutdown(); + geom = evas_common_gradient_geometer_get("rectangular"); + if (geom) + geom->shutdown(); + geom = evas_common_gradient_geometer_get("angular"); + if (geom) + geom->shutdown(); + geom = evas_common_gradient_geometer_get("sinusoidal"); + if (geom) + geom->shutdown(); + grad_initialised = 0; +} + +EAPI RGBA_Gradient * +evas_common_gradient_new(void) +{ + RGBA_Gradient *gr; + + gr = calloc(1, sizeof(RGBA_Gradient)); + gr->references = 1; + return gr; +} + +EAPI void +evas_common_gradient_free(RGBA_Gradient *gr) +{ + if (!gr) return; + gr->references--; + if (gr->references > 0) return; + evas_common_gradient_clear(gr); + if (gr->type.name) free(gr->type.name); + if (gr->type.params) free(gr->type.params); + if (gr->type.geometer && gr->type.gdata) + gr->type.geometer->geom_free(gr->type.gdata); + if (gr->map.data) free(gr->map.data); + free(gr); +} + +EAPI void +evas_common_gradient_clear(RGBA_Gradient *gr) +{ + if (!gr) return; + + _evas_common_gradient_stops_free(gr); + + if (gr->color.data && !gr->imported_data) + free(gr->color.data); + gr->color.data = NULL; + gr->color.len = 0; + if (gr->alpha.data && !gr->imported_data) + free(gr->alpha.data); + gr->alpha.data = NULL; + gr->alpha.len = 0; + + gr->imported_data = 0; + gr->has_alpha = 0; +} + +EAPI void +evas_common_gradient_color_stop_add(RGBA_Gradient *gr, int r, int g, int b, int a, int dist) +{ + RGBA_Gradient_Color_Stop *gc, *gcm, *gc_last; + + if (!gr) return; + if (gr->imported_data) + { + gr->color.data = NULL; + gr->color.len = 0; + gr->alpha.data = NULL; + gr->alpha.len = 0; + gr->imported_data = 0; + gr->has_alpha = 0; + } + gc = malloc(sizeof(RGBA_Gradient_Color_Stop)); + if (!gc) return; + if (dist < 1) dist = 1; + if (dist > 32768) dist = 32768; + if (r < 0) r = 0; if (r > 255) r = 255; + if (g < 0) g = 0; if (g > 255) g = 255; + if (b < 0) b = 0; if (b > 255) b = 255; + if (a < 0) a = 0; if (a > 255) a = 255; + gc->r = r; + gc->g = g; + gc->b = b; + gc->a = a; + gc->dist = dist; + + if (!gr->color.stops) + { + gr->color.stops = evas_object_list_append(gr->color.stops, gc); + gr->color.nstops = 1; + gr->color.len = 1; + if (a < 255) + gr->has_alpha = 1; + return; + } + gcm = malloc(sizeof(RGBA_Gradient_Color_Stop)); + if (!gcm) { free(gc); return; } + gc_last = (RGBA_Gradient_Color_Stop *)(gr->color.stops->last); + if ((dist + gc_last->dist + gr->color.len) > 65535) + { free(gc); free(gcm); return; } + gcm->r = (gc_last->r + r) / 2; + gcm->g = (gc_last->g + g) / 2; + gcm->b = (gc_last->b + b) / 2; + gcm->a = (gc_last->a + a) / 2; + gcm->dist = dist; + gr->color.stops = evas_object_list_append(gr->color.stops, gcm); + gr->color.len += gc_last->dist; + gr->color.stops = evas_object_list_append(gr->color.stops, gc); + gr->color.len += dist; + gr->color.nstops += 2; + if (a < 255) + gr->has_alpha = 1; +} + +EAPI void +evas_common_gradient_alpha_stop_add(RGBA_Gradient *gr, int a, int dist) +{ + RGBA_Gradient_Alpha_Stop *ga, *gam, *ga_last; + + if (!gr) return; + if (gr->imported_data) + { + gr->color.data = NULL; + gr->color.len = 0; + gr->alpha.data = NULL; + gr->alpha.len = 0; + gr->imported_data = 0; + gr->has_alpha = 0; + } + ga = malloc(sizeof(RGBA_Gradient_Alpha_Stop)); + if (!ga) return; + if (dist < 1) dist = 1; + if (dist > 32768) dist = 32768; + if (a < 0) a = 0; if (a > 255) a = 255; + ga->a = a; + ga->dist = dist; + + if (!gr->alpha.stops) + { + gr->alpha.stops = evas_object_list_append(gr->alpha.stops, ga); + gr->alpha.nstops = 1; + gr->alpha.len = 1; + if (a < 255) + gr->has_alpha = 1; + return; + } + gam = malloc(sizeof(RGBA_Gradient_Alpha_Stop)); + if (!gam) { free(ga); return; } + ga_last = (RGBA_Gradient_Alpha_Stop *)(gr->alpha.stops->last); + if ((dist + ga_last->dist + gr->alpha.len) > 65535) + { free(ga); free(gam); return; } + gam->a = (ga_last->a + a) / 2; + gam->dist = dist; + gr->alpha.stops = evas_object_list_append(gr->alpha.stops, gam); + gr->alpha.len += ga_last->dist; + gr->alpha.stops = evas_object_list_append(gr->alpha.stops, ga); + gr->alpha.len += dist; + gr->alpha.nstops += 2; + if (a < 255) + gr->has_alpha = 1; +} + +EAPI void +evas_common_gradient_color_data_set(RGBA_Gradient *gr, DATA32 *data, int len, int alpha_flags) +{ + if (!gr) return; + if (!gr->imported_data) + evas_common_gradient_clear(gr); + if (len < 1) data = NULL; + if (!data) len = 0; + gr->color.data = data; + gr->color.len = len; + gr->has_alpha = !!alpha_flags; + gr->imported_data = 1; +} + +EAPI void +evas_common_gradient_alpha_data_set(RGBA_Gradient *gr, DATA8 *data, int len) +{ + if (!gr) return; + if (!gr->imported_data) + evas_common_gradient_clear(gr); + if (len < 1) data = NULL; + if (!data) len = 0; + gr->alpha.data = data; + gr->alpha.len = len; + gr->has_alpha = 1; + gr->imported_data = 1; +} + +EAPI void +evas_common_gradient_type_set(RGBA_Gradient *gr, const char *name, char *params) +{ + RGBA_Gradient_Type *geometer; + + if (!gr) return; + if (!name || !*name) + name = "linear"; + + geometer = evas_common_gradient_geometer_get(name); + if (!geometer) return; + if (gr->type.gdata && (geometer != gr->type.geometer)) + { + if (gr->type.geometer) + gr->type.geometer->geom_free(gr->type.gdata); + gr->type.gdata = NULL; + } + gr->type.geometer = geometer; + + if (gr->type.name) free(gr->type.name); + gr->type.name = strdup(name); + + if (params && !*params) + params = NULL; + if (gr->type.params) free(gr->type.params); + gr->type.params = NULL; + if (params) gr->type.params = strdup(params); + + gr->type.geometer->geom_init(gr); +} + +EAPI void +evas_common_gradient_fill_set(RGBA_Gradient *gr, int x, int y, int w, int h) +{ + if (!gr) return; + gr->fill.x = x; + gr->fill.y = y; + if ((w < 1) && (h < 1)) + { w = h = 1; } + gr->fill.w = w; + gr->fill.h = h; +} + +EAPI void +evas_common_gradient_fill_angle_set(RGBA_Gradient *gr, float angle) +{ + if (!gr) return; + gr->fill.angle = angle; +} + +EAPI void +evas_common_gradient_fill_spread_set(RGBA_Gradient *gr, int spread) +{ + if (!gr) return; + gr->fill.spread = spread; +} + +EAPI void +evas_common_gradient_map_offset_set(RGBA_Gradient *gr, float offset) +{ + if (!gr) return; + gr->map.offset = offset; +} + +EAPI void +evas_common_gradient_map_direction_set(RGBA_Gradient *gr, int direction) +{ + if (!gr) return; + gr->map.direction = (direction >= 0 ? 1 : -1); +} + +EAPI void +evas_common_gradient_map_angle_set(RGBA_Gradient *gr, float angle) +{ + if (!gr) return; + gr->map.angle = angle; +} + +EAPI RGBA_Gradient_Type * +evas_common_gradient_geometer_get(const char *name) +{ + RGBA_Gradient_Type *geom = NULL; + + if (!name || !*name) + name = "linear"; + if (!strcmp(name,"linear") || !strcmp(name,"linear.diag") || !strcmp(name,"linear.codiag")) + geom = evas_common_gradient_linear_get(); + else if (!strcmp(name,"radial")) + geom = evas_common_gradient_radial_get(); + else if (!strcmp(name,"angular")) + geom = evas_common_gradient_angular_get(); + else if (!strcmp(name,"sinusoidal")) + geom = evas_common_gradient_sinusoidal_get(); + else if (!strcmp(name,"rectangular")) + geom = evas_common_gradient_rectangular_get(); + if (!geom) + geom = evas_common_gradient_linear_get(); + return geom; +} + +EAPI void +evas_common_gradient_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, + int x, int y, int w, int h, RGBA_Gradient *gr) +{ + Gfx_Func_Gradient_Fill gfunc; + RGBA_Gfx_Func bfunc; + int len; + int xin, yin, xoff, yoff; + int clx, cly, clw, clh; + int axx, axy, ayx, ayy; + DATA32 *pdst, *dst_end, *buf, *map; + RGBA_Image *argb_buf = NULL, *alpha_buf = NULL; + DATA8 *mask = NULL; + void *gdata; + float angle; + int direct_copy = 0, buf_step = 0; + + if (!dst || !dc || !gr || !dst || !dst->image.data) + return; + if (!gr->map.data || !gr->type.geometer) + return; + if ((gr->fill.w < 1) || (gr->fill.h < 1)) + return; + if ((w < 1) || (h < 1)) + return; + clx = 0; cly = 0; clw = dst->cache_entry.w; clh = dst->cache_entry.h; + if ((clw < 1) || (clh < 1)) return; + + if (dc->clip.use) + RECTS_CLIP_TO_RECT(clx,cly,clw,clh, dc->clip.x,dc->clip.y,dc->clip.w,dc->clip.h); + if ((clw < 1) || (clh < 1)) return; + + xin = x; yin = y; + RECTS_CLIP_TO_RECT(x,y,w,h, clx,cly,clw,clh); + if ((w < 1) || (h < 1)) return; + + xoff = (x - xin) - gr->fill.x; + yoff = (y - yin) - gr->fill.y; + + if (!gr->type.geometer->has_mask(gr, dc->render_op)) + { + if ((dc->render_op == _EVAS_RENDER_FILL) || + (dc->render_op == _EVAS_RENDER_COPY)) + { + direct_copy = 1; buf_step = dst->cache_entry.w; + if (gr->type.geometer->has_alpha(gr, dc->render_op)) + dst->cache_entry.flags.alpha = 1; + } + else if ((dc->render_op == _EVAS_RENDER_BLEND) && + !gr->type.geometer->has_alpha(gr, dc->render_op)) + { + direct_copy = 1; buf_step = dst->cache_entry.w; + } + } + + if (!direct_copy) + { + argb_buf = evas_common_image_line_buffer_obtain(w); + if (!argb_buf) + return; + argb_buf->cache_entry.flags.alpha = gr->type.geometer->has_alpha(gr, dc->render_op) ? 1 : 0; + + if (gr->type.geometer->has_mask(gr, dc->render_op)) + { + alpha_buf = evas_common_image_alpha_line_buffer_obtain(w); + if (!alpha_buf) + { + evas_common_image_line_buffer_release(argb_buf); + return; + } + bfunc = evas_common_gfx_func_composite_pixel_mask_span_get(argb_buf, dst, w, dc->render_op); + } + else + bfunc = evas_common_gfx_func_composite_pixel_span_get(argb_buf, dst, w, dc->render_op); + } + + gfunc = gr->type.geometer->get_fill_func(gr, dc->render_op, dc->anti_alias); + gdata = gr->type.gdata; + if (!gdata) + { + if (!direct_copy) + { + evas_common_image_line_buffer_release(argb_buf); + if (alpha_buf) + evas_common_image_alpha_line_buffer_release(alpha_buf); + } + return; + } + + /* I TOLD YOU! this here STOPS the gradeint bugs. it's a missing + * emms() before doing floating point operations! the thread pipe code + * just brought it out reliably. i swear i had seen this long before i + * ever added the thread/pipe code. + * + * now here is why it happens. NO drawing function... EXCEPT + * evas_common_polygon_draw() and evas_common_gradient_draw() use floating + * point for drawing (the poly stuff should really lose it actually), but + * nicely nestled in the poly draw code is a evas_common_cpu_end_opt() + * before it does any operations that would use floating point. the fact + * is the gradient code was LUCKY before without the thread pipes to almost + * all the time have another func do a evas_common_cpu_end_opt() before it + * was called. that was no longer the case with the thread renderer and + * it suffered. that is why on amd systems it seemed to work as i beileve + * on amd cpu's the amms done by evas_common_cpu_end_opt() is not needed + * to do floatingpoint ops again. + * + * after a lot of futzing about - this was the culprit (well axx and axy + * were garbage values eventually i found after much debugging and i traced + * their garbageness back to here). + */ + evas_common_cpu_end_opt(); + + angle = (gr->fill.angle * M_PI) / 180.0; + axx = (cos(angle) * 65536.0); + ayy = axx; + axy = (sin(angle) * 65536.0); + ayx = -axy; + + map = gr->map.data; + len = gr->map.len; + pdst = dst->image.data + (y * dst->cache_entry.w) + x; + dst_end = pdst + (h * dst->cache_entry.w); + if (!direct_copy) + { + buf = argb_buf->image.data; + if (alpha_buf) + mask = (DATA8 *)alpha_buf->image.data; + } + else + buf = pdst; + while (pdst < dst_end) + { +#ifdef EVAS_SLI + if (((yoff + y) % dc->sli.h) == dc->sli.y) +#endif + { + gfunc(map, len, buf, mask, w, xoff, yoff, axx, axy, ayx, ayy, gdata); + evas_common_cpu_end_opt(); + if (!direct_copy) + bfunc(buf, mask, 0, pdst, w); + evas_common_cpu_end_opt(); + } + buf += buf_step; + pdst += dst->cache_entry.w; + yoff++; + } + + if (!direct_copy) + { + evas_common_image_line_buffer_release(argb_buf); + if (alpha_buf) + evas_common_image_alpha_line_buffer_release(alpha_buf); + } +} + +static void +evas_common_gradient_map_argb(RGBA_Draw_Context *dc, RGBA_Gradient *gr, int len) +{ + DATA32 color; + int mul_use; + + if (!gr || !dc) + return; + if (len < 1) + { + if (gr->map.data) + free(gr->map.data); + gr->map.data = NULL; + gr->map.len = 0; + return; + } + if ((len != gr->map.len) || (!gr->map.data)) + gr->map.data = realloc(gr->map.data, len * sizeof(DATA32)); + if (!gr->map.data) + { gr->map.len = 0; return; } + gr->map.len = len; + gr->map.has_alpha = gr->has_alpha; + + color = dc->mul.col; + mul_use = dc->mul.use; + if (dc->mul.col == 0xffffffff) + mul_use = 0; + + if ((!gr->imported_data) && (!gr->color.stops) && (!gr->alpha.stops)) + { + static DATA32 p = 0xffffffff; + + gr->color.data = &p; + gr->color.len = 1; + gr->imported_data = 1; + gr->has_alpha = 0; + } + + if (gr->color.stops) + { + Evas_Object_List *lc; + RGBA_Gradient_Color_Stop *gc, *gc_next; + DATA32 *pmap, *map_end; + int i, dii; + int r, g, b, a; + int next_r, next_g, next_b, next_a; + int rr, drr, gg, dgg, bb, dbb, aa, daa; + int mr = 256, mg = 256, mb = 256, ma = 256; + + gr->color.data = realloc(gr->color.data, gr->color.len * sizeof(DATA32)); + if (!gr->color.data) return; + + gc = (RGBA_Gradient_Color_Stop *)gr->color.stops; + r = gc->r; g = gc->g; b = gc->b; a = gc->a; + if (mul_use) + { + mr = 1 + ((color >> 16) & 0xff); mg = 1 + ((color >> 8) & 0xff); + mb = 1 + ((color) & 0xff); ma = 1 + (color >> 24); + if (ma < 256) + gr->map.has_alpha = 1; + r = (r * mr) >> 8; g = (g * mg) >> 8; + b = (b * mb) >> 8; a = (a * ma) >> 8; + } + lc = gr->color.stops->next; + pmap = gr->color.data; map_end = pmap + gr->color.len; + + while (pmap < map_end) + { + if (lc) + { + i = gc->dist; + dii = 65536 / i; + gc_next = (RGBA_Gradient_Color_Stop *)lc; + next_r = gc_next->r; next_g = gc_next->g; + next_b = gc_next->b; next_a = gc_next->a; + if (mul_use) + { + next_r = (next_r * mr) >> 8; next_g = (next_g * mg) >> 8; + next_b = (next_b * mb) >> 8; next_a = (next_a * ma) >> 8; + } + rr = r << 16; drr = ((next_r - r) * dii); + gg = g << 16; dgg = ((next_g - g) * dii); + bb = b << 16; dbb = ((next_b - b) * dii); + aa = a << 16; daa = ((next_a - a) * dii); + while (i--) + { + r = rr >> 16; r += (rr - (r << 16)) >> 15; + g = gg >> 16; g += (gg - (g << 16)) >> 15; + b = bb >> 16; b += (bb - (b << 16)) >> 15; + a = aa >> 16; a += (aa - (a << 16)) >> 15; + *pmap++ = ARGB_JOIN(a,r,g,b); + rr += drr; gg += dgg; bb += dbb; aa += daa; + } + gc = gc_next; + r = next_r; g = next_g; b = next_b; a = next_a; + lc = lc->next; + } + else + *pmap++ = ARGB_JOIN(a,r,g,b); + } + } + + if (gr->alpha.stops) + { + Evas_Object_List *lc; + RGBA_Gradient_Alpha_Stop *ga, *ga_next; + DATA8 *pamap, *amap_end; + int i, dii; + int a, next_a; + int aa, daa; + + gr->alpha.data = realloc(gr->alpha.data, gr->alpha.len * sizeof(DATA8)); + if (!gr->alpha.data) return; + + ga = (RGBA_Gradient_Alpha_Stop *)gr->alpha.stops; + a = ga->a; + lc = gr->alpha.stops->next; + pamap = gr->alpha.data; amap_end = pamap + gr->alpha.len; + + while (pamap < amap_end) + { + if (lc) + { + i = ga->dist; + dii = 65536 / i; + ga_next = (RGBA_Gradient_Alpha_Stop *)lc; + next_a = ga_next->a; + aa = a << 16; daa = ((next_a - a) * dii); + while (i--) + { + a = aa >> 16; a += (aa - (a << 16)) >> 15; + *pamap++ = a; + aa += daa; + } + ga = ga_next; + a = next_a; + lc = lc->next; + } + else + *pamap++ = a; + } + } + + if (gr->color.data && gr->alpha.data) + { + if (!gr->imported_data) + color = 0xffffffff; + if (gr->color.len == gr->alpha.len) + { + evas_common_scale_rgba_a8_span(gr->color.data, gr->alpha.data, gr->color.len, + color, gr->map.data, gr->map.len, gr->map.direction); + return; + } + evas_common_scale_rgba_span(gr->color.data, NULL, gr->color.len, + color, gr->map.data, gr->map.len, gr->map.direction); + evas_common_scale_clip_a8_span(NULL, gr->alpha.data, gr->alpha.len, + 0xffffffff, gr->map.data, gr->map.len, gr->map.direction); + return; + } + + if (gr->color.data) + { + if (!gr->imported_data) + color = 0xffffffff; + evas_common_scale_rgba_span(gr->color.data, NULL, gr->color.len, + color, gr->map.data, gr->map.len, gr->map.direction); + gr->map.has_alpha |= (!!(255 - (color >> 24))); + return; + } + + evas_common_scale_a8_span(NULL, gr->alpha.data, gr->alpha.len, + color, gr->map.data, gr->map.len, gr->map.direction); +} + +static void +evas_common_gradient_map_ahsv(RGBA_Draw_Context *dc, RGBA_Gradient *gr, int len) +{ + DATA32 color; + + if (!gr || !dc) + return; + if (len < 1) + { + if (gr->map.data) + free(gr->map.data); + gr->map.data = NULL; + gr->map.len = 0; + return; + } + if ((len != gr->map.len) || (!gr->map.data)) + gr->map.data = realloc(gr->map.data, len * sizeof(DATA32)); + if (!gr->map.data) + { gr->map.len = 0; return; } + gr->map.len = len; + gr->map.has_alpha = gr->has_alpha; + + color = dc->mul.col; + if (!dc->mul.use) + color = 0xffffffff; + + if ((!gr->imported_data) && (!gr->color.stops) && (!gr->alpha.stops)) + { + static DATA32 p = 0xffffffff; + + gr->color.data = &p; + gr->color.len = 1; + gr->imported_data = 1; + gr->has_alpha = 0; + } + + if (gr->color.stops) + { + Evas_Object_List *lc; + RGBA_Gradient_Color_Stop *gc, *gc_next; + DATA32 *pmap, *map_end; + int i, dii; + int h, s, v; + int next_h, next_s, next_v; + int hh, dhh, ss, dss, vv, dvv, aa, daa; + int r, g, b, a; + int next_r, next_g, next_b, next_a; + + gr->color.data = realloc(gr->color.data, gr->color.len * sizeof(DATA32)); + if (!gr->color.data) return; + + gc = (RGBA_Gradient_Color_Stop *)gr->color.stops; + r = gc->r; g = gc->g; b = gc->b; a = gc->a; + evas_common_convert_color_rgb_to_hsv_int(r, g, b, &h, &s, &v); + + lc = gr->color.stops->next; + pmap = gr->color.data; map_end = pmap + gr->color.len; + + while (pmap < map_end) + { + if (lc) + { + i = gc->dist; + dii = 65536 / i; + gc_next = (RGBA_Gradient_Color_Stop *)lc; + + next_r = gc_next->r; next_g = gc_next->g; + next_b = gc_next->b; next_a = gc_next->a; + evas_common_convert_color_rgb_to_hsv_int(next_r, next_g, next_b, + &next_h, &next_s, &next_v); + hh = h << 16; dhh = ((next_h - h) * dii); + ss = s << 16; dss = ((next_s - s) * dii); + vv = v << 16; dvv = ((next_v - v) * dii); + aa = a << 16; daa = ((next_a - a) * dii); + while (i--) + { + h = hh >> 16; h += (hh - (h << 16)) >> 15; + s = ss >> 16; s += (ss - (s << 16)) >> 15; + v = vv >> 16; v += (vv - (v << 16)) >> 15; + a = aa >> 16; a += (aa - (a << 16)) >> 15; + evas_common_convert_color_hsv_to_rgb_int(h, s, v, &r, &g, &b); + *pmap++ = ARGB_JOIN(a,r,g,b); + hh += dhh; ss += dss; vv += dvv; aa += daa; + } + gc = gc_next; + h = next_h; s = next_s; v = next_v; a = next_a; + lc = lc->next; + } + else + *pmap++ = ARGB_JOIN(gc->a,gc->r,gc->g,gc->b); + } + } + + if (gr->alpha.stops) + { + Evas_Object_List *lc; + RGBA_Gradient_Alpha_Stop *ga, *ga_next; + DATA8 *pamap, *amap_end; + int i, dii; + int a, next_a; + int aa, daa; + + gr->alpha.data = realloc(gr->alpha.data, gr->alpha.len * sizeof(DATA8)); + if (!gr->alpha.data) return; + + ga = (RGBA_Gradient_Alpha_Stop *)gr->alpha.stops; + a = ga->a; + lc = gr->alpha.stops->next; + pamap = gr->alpha.data; amap_end = pamap + gr->alpha.len; + + while (pamap < amap_end) + { + if (lc) + { + i = ga->dist; + dii = 65536 / i; + ga_next = (RGBA_Gradient_Alpha_Stop *)lc; + next_a = ga_next->a; + aa = a << 16; daa = ((next_a - a) * dii); + while (i--) + { + a = aa >> 16; a += (aa - (a << 16)) >> 15; + *pamap++ = a; + aa += daa; + } + ga = ga_next; + a = next_a; + lc = lc->next; + } + else + *pamap++ = a; + } + } + + if (gr->color.data && gr->alpha.data) + { + if (gr->color.len == gr->alpha.len) + { + evas_common_scale_hsva_a8_span(gr->color.data, gr->alpha.data, gr->color.len, + color, gr->map.data, gr->map.len, gr->map.direction); + return; + } + evas_common_scale_hsva_span(gr->color.data, NULL, gr->color.len, + color, gr->map.data, gr->map.len, gr->map.direction); + evas_common_scale_clip_a8_span(NULL, gr->alpha.data, gr->alpha.len, + 0xffffffff, gr->map.data, gr->map.len, gr->map.direction); + return; + } + if (gr->color.data) + { + evas_common_scale_hsva_span(gr->color.data, NULL, gr->color.len, + color, gr->map.data, gr->map.len, gr->map.direction); + gr->map.has_alpha |= (!!(255 - (color >> 24))); + return; + } + + evas_common_scale_a8_span(NULL, gr->alpha.data, gr->alpha.len, + color, gr->map.data, gr->map.len, gr->map.direction); +} + +EAPI void +evas_common_gradient_map(RGBA_Draw_Context *dc, RGBA_Gradient *gr, int len) +{ + if (!gr || !dc) return; + if (dc->interpolation.color_space == _EVAS_COLOR_SPACE_AHSV) + { + evas_common_gradient_map_ahsv(dc, gr, len); + return; + } + evas_common_gradient_map_argb(dc, gr, len); +} diff --git a/src/lib/engines/common/evas_gradient_private.h b/src/lib/engines/common/evas_gradient_private.h new file mode 100644 index 0000000..b4639d2 --- /dev/null +++ b/src/lib/engines/common/evas_gradient_private.h @@ -0,0 +1,17 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_GRADIENT_PRIVATE_H +#define _EVAS_GRADIENT_PRIVATE_H + + +RGBA_Gradient_Type *evas_common_gradient_linear_get (void); +RGBA_Gradient_Type *evas_common_gradient_radial_get (void); +RGBA_Gradient_Type *evas_common_gradient_angular_get (void); +RGBA_Gradient_Type *evas_common_gradient_rectangular_get (void); +RGBA_Gradient_Type *evas_common_gradient_sinusoidal_get (void); +char *evas_common_gradient_get_key_fval (char *in, char *key, float *val); + + +#endif /* _EVAS_GRADIENT_PRIVATE_H */ diff --git a/src/lib/engines/common/evas_gradient_radial.c b/src/lib/engines/common/evas_gradient_radial.c new file mode 100644 index 0000000..300dbb1 --- /dev/null +++ b/src/lib/engines/common/evas_gradient_radial.c @@ -0,0 +1,1147 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include + +#include "evas_common.h" +#include "evas_gradient_private.h" + + +typedef struct _Radial_Data Radial_Data; +struct _Radial_Data +{ + float r0; + + int sx, sy, s; + float off; + int len; +}; + +static void +radial_init(void); + +static void +radial_shutdown(void); + +static void +radial_init_geom(RGBA_Gradient *gr); + +static void +radial_setup_geom(RGBA_Gradient *gr); + +static void +radial_free_geom(void *gdata); + +static int +radial_has_alpha(RGBA_Gradient *gr, int op); + +static int +radial_has_mask(RGBA_Gradient *gr, int op); + +static int +radial_get_map_len(RGBA_Gradient *gr); + +static Gfx_Func_Gradient_Fill +radial_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa); + +static RGBA_Gradient_Type radial = {"radial", radial_init, radial_shutdown, + radial_init_geom, radial_setup_geom, radial_free_geom, + radial_has_alpha, radial_has_mask, + radial_get_map_len, radial_get_fill_func}; + + +/** internal functions **/ + +static void +radial_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); +static void +radial_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_pad_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +radial_pad_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + + +RGBA_Gradient_Type * +evas_common_gradient_radial_get(void) +{ + return &radial; +} + +static void +radial_init(void) +{ +} + +static void +radial_shutdown(void) +{ +} + +static void +radial_free_geom(void *gdata) +{ + Radial_Data *data = (Radial_Data *)gdata; + if (data) free(data); +} + +static void +radial_setup_geom(RGBA_Gradient *gr) +{ + Radial_Data *radial_data; + + if (!gr || (gr->type.geometer != &radial)) return; + + radial_data = (Radial_Data *)gr->type.gdata; + if (!radial_data) return; + radial_data->sx = gr->fill.w; + radial_data->sy = gr->fill.h; + radial_data->s = radial_data->sx; + if (radial_data->sy > radial_data->sx) + radial_data->s = radial_data->sy; + radial_data->off = gr->map.offset; + radial_data->len = radial_data->s - (int)(radial_data->s * radial_data->r0); +} + +static void +radial_init_geom(RGBA_Gradient *gr) +{ + Radial_Data *radial_data; + int err = 1; + char *s, *p, key[256]; + float r0; + + if (!gr || (gr->type.geometer != &radial)) return; + + radial_data = (Radial_Data *)gr->type.gdata; + if (!radial_data) + { + radial_data = calloc(1, sizeof(Radial_Data)); + if (!radial_data) return; + radial_data->r0 = 0.0; + radial_data->sx = 32; + radial_data->sy = 32; + radial_data->s = 32; + radial_data->off = 0.0; + radial_data->len = 32; + } + gr->type.gdata = radial_data; + + if (!gr->type.params || !*(gr->type.params)) + return; + + s = strdup(gr->type.params); + if (!s) return; + + r0 = radial_data->r0; + p = s; + while ((p = evas_common_gradient_get_key_fval(p, key, &r0))) + { + if (!strcmp(key, "inner_radius")) + err = 0; + else + { + err = 1; + break; + } + } + if (!err) + { + if (r0 < 0.0) r0 = 0.0; + if (r0 > 1.0) r0 = 1.0; + radial_data->r0 = r0; + } + free(s); +} + + +static int +radial_has_alpha(RGBA_Gradient *gr, int op) +{ + Radial_Data *radial_data; + + if (!gr || (gr->type.geometer != &radial)) return 0; + if (gr->has_alpha | gr->map.has_alpha) + return 1; + if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || + (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) ) + return 0; + radial_data = (Radial_Data *)gr->type.gdata; + if (!radial_data) return 0; + if (radial_data->r0 > 0) + return 1; + if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) ) + return 1; + return 0; +} + +static int +radial_has_mask(RGBA_Gradient *gr, int op) +{ + Radial_Data *radial_data; + + if (!gr || (gr->type.geometer != &radial)) return 0; + if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || + (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) ) + { + radial_data = (Radial_Data *)gr->type.gdata; + if (!radial_data) return 0; + if (radial_data->r0 > 0) + return 1; + if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) ) + return 1; + } + return 0; +} + +static int +radial_get_map_len(RGBA_Gradient *gr) +{ + Radial_Data *radial_data; + + if (!gr || (gr->type.geometer != &radial)) return 0; + radial_data = (Radial_Data *)gr->type.gdata; + if (!radial_data) return 0; + return radial_data->len; +} + +static Gfx_Func_Gradient_Fill +radial_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa) +{ + Radial_Data *radial_data; + Gfx_Func_Gradient_Fill sfunc = NULL; + int masked_op = 0; + + if (!gr || (gr->type.geometer != &radial)) return sfunc; + radial_data = (Radial_Data *)gr->type.gdata; + if (!radial_data) return sfunc; + + radial_data->off = gr->map.offset; + if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || + (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) ) + masked_op = 1; + + switch (gr->fill.spread) + { + case _EVAS_TEXTURE_REFLECT: + { + if (aa) + { + if (radial_data->r0 > 0) + { + if (masked_op) + sfunc = radial_reflect_aa_masked; + else + sfunc = radial_reflect_aa; + } + else + sfunc = radial_reflect_aa; + } + else + { + if (radial_data->r0 > 0) + { + if (masked_op) + sfunc = radial_reflect_masked; + else + sfunc = radial_reflect; + } + else + sfunc = radial_reflect; + } + } + break; + case _EVAS_TEXTURE_REPEAT: + { + if (aa) + { + if (radial_data->r0 > 0) + { + if (masked_op) + sfunc = radial_repeat_aa_masked; + else + sfunc = radial_repeat_aa; + } + else + sfunc = radial_repeat_aa; + } + else + { + if (radial_data->r0 > 0) + { + if (masked_op) + sfunc = radial_repeat_masked; + else + sfunc = radial_repeat; + } + else + sfunc = radial_repeat; + } + } + break; + case _EVAS_TEXTURE_RESTRICT: + radial_data->off = 0; + case _EVAS_TEXTURE_RESTRICT_REFLECT: + { + if (aa) + { + if (masked_op) + sfunc = radial_restrict_reflect_aa_masked; + else + sfunc = radial_restrict_reflect_aa; + } + else + { + if (masked_op) + sfunc = radial_restrict_reflect_masked; + else + sfunc = radial_restrict_reflect; + } + } + break; + case _EVAS_TEXTURE_RESTRICT_REPEAT: + { + if (aa) + { + if (masked_op) + sfunc = radial_restrict_repeat_aa_masked; + else + sfunc = radial_restrict_repeat_aa; + } + else + { + if (masked_op) + sfunc = radial_restrict_repeat_masked; + else + sfunc = radial_restrict_repeat; + } + } + break; + case _EVAS_TEXTURE_PAD: + { + if (aa) + { + if (masked_op) + sfunc = radial_pad_aa_masked; + else + sfunc = radial_pad_aa; + } + else + { + if (masked_op) + sfunc = radial_pad_masked; + else + sfunc = radial_pad; + } + } + break; + default: + sfunc = radial_reflect_aa; + break; + } + return sfunc; +} + +#define SETUP_RADIAL_FILL \ + if (gdata->sx != gdata->s) \ + { \ + axx = (gdata->s * axx) / gdata->sx; \ + axy = (gdata->s * axy) / gdata->sx; \ + } \ + if (gdata->sy != gdata->s) \ + { \ + ayy = (gdata->s * ayy) / gdata->sy; \ + ayx = (gdata->s * ayx) / gdata->sy; \ + } \ + xx = (axx * x) + (axy * y); \ + yy = (ayx * x) + (ayy * y); \ + rr0 = gdata->r0 * gdata->s; \ + rr0 <<= 16; + + +static void +radial_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16); + + l += (ll - (l << 16)) >> 15; + *dst = 0; + if (l >= 0) + { + l += off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; + } + dst++; xx += axx; yy += ayx; + } +} + +static void +radial_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16), lp; + + *dst = 0; + if (l >= 0) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a; + + lp = l + off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } + *dst = src[lp]; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if ((l == 0) && rr0) + *dst = MUL_256(a0, *dst); + } + dst++; xx += axx; yy += ayx; + } +} + +static void +radial_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16); + + l += (ll - (l << 16)) >> 15; + *dst = 0; *mask = 0; + if (l >= 0) + { + l += off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; *mask = 255; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +radial_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16), lp; + + *dst = 0; *mask = 0; + if (l >= 0) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1; + + lp = l + off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } + *dst = src[lp]; *mask = 255; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if ((l == 0) && rr0) + *mask = a0; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +radial_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16); + + l += (ll - (l << 16)) >> 15; + *dst = 0; + if (l >= 0) + { + l += off; + l = l % src_len; + if (l < 0) + l += src_len; + *dst = src[l]; + } + dst++; xx += axx; yy += ayx; + } +} + +static void +radial_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16), lp; + + *dst = 0; + if (l >= 0) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + lp = l + off; + lp = lp % src_len; + if (lp < 0) + lp += src_len; + *dst = src[lp]; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (lp == src_len - 1) + *dst = INTERP_256(a, src[0], *dst); + if ((l == 0) && rr0) + *dst = MUL_256(a, *dst); + } + dst++; xx += axx; yy += ayx; + } +} + +static void +radial_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16); + + l += (ll - (l << 16)) >> 15; + *dst = 0; *mask = 0; + if (l >= 0) + { + l += off; + l = l % src_len; + if (l < 0) + l += src_len; + *dst = src[l]; *mask = 255; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +radial_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16), lp; + + *dst = 0; + if (l >= 0) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + lp = l + off; + lp = lp % src_len; + if (lp < 0) + lp += src_len; + *dst = src[lp]; *mask = 255; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (lp == src_len - 1) + *dst = INTERP_256(a, src[0], *dst); + if ((l == 0) && rr0) + *mask = a - 1; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +radial_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16); + + l += (ll - (l << 16)) >> 15; + *dst = 0; + if ((unsigned)l < src_len) + { + l += off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; + } + dst++; xx += axx; yy += ayx; + } +} + +static void +radial_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16), lp; + + *dst = 0; + if ((unsigned)l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a; + + lp = l + off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } + *dst = src[lp]; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (l == (src_len - 1)) + *dst = MUL_256(257 - a0, *dst); + if ((l == 0) && rr0) + *dst = MUL_256(a0, *dst); + } + dst++; xx += axx; yy += ayx; + } +} + +static void +radial_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16); + + l += (ll - (l << 16)) >> 15; + *dst = 0; *mask = 0; + if ((unsigned)l < src_len) + { + l += off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; *mask = 255; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +radial_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16), lp; + + *dst = 0; *mask = 0; + if ((unsigned)l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1; + + lp = l + off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } + *dst = src[lp]; *mask = 255; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (l == (src_len - 1)) + *mask = 255 - a0; + if ((l == 0) && rr0) + *mask = a0; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +radial_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16); + + l += (ll - (l << 16)) >> 15; + *dst = 0; + if ((unsigned)l < src_len) + { + l += off; + l = (l % src_len); + if (l < 0) + l += src_len; + *dst = src[l]; + } + dst++; xx += axx; yy += ayx; + } +} + +static void +radial_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16), lp; + + *dst = 0; + if ((unsigned)l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + lp = l + off; + lp = (lp % src_len); + if (lp < 0) + lp += src_len; + *dst = src[lp]; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (lp == (src_len - 1)) + *dst = INTERP_256(a, src[0], *dst); + if (l == (src_len - 1)) + *dst = MUL_256(257 - a, *dst); + if ((l == 0) && rr0) + *dst = MUL_256(a, *dst); + } + dst++; xx += axx; yy += ayx; + } +} + +static void +radial_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16); + + l += (ll - (l << 16)) >> 15; + *dst = 0; *mask = 0; + if ((unsigned)l < src_len) + { + l += off; + l = (l % src_len); + if (l < 0) + l += src_len; + *dst = src[l]; *mask = 255; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +radial_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16), lp; + + *dst = 0; *mask = 0; + if ((unsigned)l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + lp = l + off; + lp = (lp % src_len); + if (lp < 0) + lp += src_len; + *dst = src[lp]; *mask = 255; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (lp == (src_len - 1)) + *dst = INTERP_256(a, src[0], *dst); + if (l == (src_len - 1)) + *mask = 256 - a; + if ((l == 0) && rr0) + *mask = a - 1; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +radial_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16); + + l += (ll - (l << 16)) >> 15; + *dst = 0; + if (l >= 0) + { + if (l >= src_len) + l = src_len - 1; + *dst = src[l]; + } + dst++; xx += axx; yy += ayx; + } +} + +static void +radial_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16); + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + *dst = 0; + if ((unsigned)l < src_len) + { + *dst = src[l]; + if (l + 1 < src_len) + *dst = INTERP_256(a, src[l + 1], src[l]); + } + if (l == 0) + { + *dst = src[0]; + if (rr0) + *dst = MUL_256(a, *dst); + } + if (l >= src_len) + { + *dst = src[src_len - 1]; + } + dst++; xx += axx; yy += ayx; + } +} + +static void +radial_pad_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16); + + l += (ll - (l << 16)) >> 15; + *dst = 0; *mask = 0; + if (l >= 0) + { + if (l >= src_len) + l = src_len - 1; + *dst = src[l]; *mask = 255; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +radial_pad_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Radial_Data *gdata = (Radial_Data *)params_data; + int xx, yy, rr0; + + SETUP_RADIAL_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16); + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + *dst = 0; *mask = 0; + if ((unsigned)l < src_len) + { + *dst = src[l]; + if (l + 1 < src_len) + *dst = INTERP_256(a, src[l + 1], src[l]); + } + if (l == 0) + { + *dst = src[0]; *mask = 255; + if (rr0) + *mask = a - 1; + } + if (l >= src_len) + { + *dst = src[src_len - 1]; *mask = 255; + } + dst++; mask++; xx += axx; yy += ayx; + } +} diff --git a/src/lib/engines/common/evas_gradient_rectangular.c b/src/lib/engines/common/evas_gradient_rectangular.c new file mode 100644 index 0000000..fbdfb3e --- /dev/null +++ b/src/lib/engines/common/evas_gradient_rectangular.c @@ -0,0 +1,1463 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include + +#include "evas_common.h" +#include "evas_gradient_private.h" + + +typedef struct _Rectangular_Data Rectangular_Data; +struct _Rectangular_Data +{ + float r0; + + int sx, sy, s; + float off; + int len; +}; + +static void +rectangular_init(void); + +static void +rectangular_shutdown(void); + +static void +rectangular_init_geom(RGBA_Gradient *gr); + +static void +rectangular_setup_geom(RGBA_Gradient *gr); + +static void +rectangular_free_geom(void *gdata); + +static int +rectangular_has_alpha(RGBA_Gradient *gr, int op); + +static int +rectangular_has_mask(RGBA_Gradient *gr, int op); + +static int +rectangular_get_map_len(RGBA_Gradient *gr); + +static Gfx_Func_Gradient_Fill +rectangular_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa); + +static RGBA_Gradient_Type rectangular = {"rectangular", rectangular_init, rectangular_shutdown, + rectangular_init_geom, rectangular_setup_geom, rectangular_free_geom, + rectangular_has_alpha, rectangular_has_mask, + rectangular_get_map_len, rectangular_get_fill_func}; + + +/** internal functions **/ + +static void +rectangular_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_pad_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +rectangular_pad_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +RGBA_Gradient_Type * +evas_common_gradient_rectangular_get(void) +{ + return &rectangular; +} + +static void +rectangular_init(void) +{ +} + +static void +rectangular_shutdown(void) +{ +} + +static void +rectangular_free_geom(void *gdata) +{ + Rectangular_Data *data = (Rectangular_Data *)gdata; + if (data) free(data); +} + +static void +rectangular_setup_geom(RGBA_Gradient *gr) +{ + Rectangular_Data *rectangular_data; + + if (!gr || (gr->type.geometer != &rectangular)) return; + + rectangular_data = (Rectangular_Data *)gr->type.gdata; + if (!rectangular_data) return; + rectangular_data->sx = gr->fill.w; + rectangular_data->sy = gr->fill.h; + rectangular_data->s = rectangular_data->sx; + if (rectangular_data->sy > rectangular_data->sx) + rectangular_data->s = rectangular_data->sy; + rectangular_data->off = gr->map.offset; + rectangular_data->len = rectangular_data->s - (int)(rectangular_data->s * rectangular_data->r0); +} + +static void +rectangular_init_geom(RGBA_Gradient *gr) +{ + Rectangular_Data *rectangular_data; + int err = 1; + char *s, *p, key[256]; + float r0; + + if (!gr || (gr->type.geometer != &rectangular)) return; + + rectangular_data = (Rectangular_Data *)gr->type.gdata; + if (!rectangular_data) + { + rectangular_data = calloc(1, sizeof(Rectangular_Data)); + if (!rectangular_data) return; + rectangular_data->r0 = 0.0; + rectangular_data->sx = 32; + rectangular_data->sy = 32; + rectangular_data->s = 32; + rectangular_data->off = 0.0; + rectangular_data->len = 32; + } + gr->type.gdata = rectangular_data; + + if (!gr->type.params || !*(gr->type.params)) + return; + + s = strdup(gr->type.params); + if (!s) return; + + r0 = rectangular_data->r0; + p = s; + while ((p = evas_common_gradient_get_key_fval(p, key, &r0))) + { + if (!strcmp(key, "inner_radius")) + err = 0; + else + { + err = 1; + break; + } + } + if (!err) + { + if (r0 < 0.0) r0 = 0.0; + if (r0 > 1.0) r0 = 1.0; + rectangular_data->r0 = r0; + } + free(s); +} + + +static int +rectangular_has_alpha(RGBA_Gradient *gr, int op) +{ + Rectangular_Data *rectangular_data; + + if (!gr || (gr->type.geometer != &rectangular)) return 0; + if (gr->has_alpha | gr->map.has_alpha) + return 1; + if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || + (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) ) + return 0; + rectangular_data = (Rectangular_Data *)gr->type.gdata; + if (!rectangular_data) return 0; + if (rectangular_data->r0 > 0) + return 1; + if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) ) + return 1; + return 0; +} + +static int +rectangular_has_mask(RGBA_Gradient *gr, int op) +{ + Rectangular_Data *rectangular_data; + + if (!gr || (gr->type.geometer != &rectangular)) return 0; + if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || + (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) ) + { + rectangular_data = (Rectangular_Data *)gr->type.gdata; + if (!rectangular_data) return 0; + if (rectangular_data->r0 > 0) + return 1; + if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) ) + return 1; + } + return 0; +} + +static int +rectangular_get_map_len(RGBA_Gradient *gr) +{ + Rectangular_Data *rectangular_data; + + if (!gr || (gr->type.geometer != &rectangular)) return 0; + rectangular_data = (Rectangular_Data *)gr->type.gdata; + if (!rectangular_data) return 0; + return rectangular_data->len; +} + +static Gfx_Func_Gradient_Fill +rectangular_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa) +{ + Rectangular_Data *rectangular_data; + Gfx_Func_Gradient_Fill sfunc = NULL; + int masked_op = 0; + + if (!gr || (gr->type.geometer != &rectangular)) + return sfunc; + rectangular_data = (Rectangular_Data *)gr->type.gdata; + if (!rectangular_data) return sfunc; + + rectangular_data->off = gr->map.offset; + if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || + (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) ) + masked_op = 1; + switch (gr->fill.spread) + { + case _EVAS_TEXTURE_REFLECT: + { + if (aa) + { + if (rectangular_data->r0 > 0) + { + if (masked_op) + sfunc = rectangular_reflect_aa_masked; + else + sfunc = rectangular_reflect_aa; + } + else + sfunc = rectangular_reflect_aa; + } + else + { + if (rectangular_data->r0 > 0) + { + if (masked_op) + sfunc = rectangular_reflect_masked; + else + sfunc = rectangular_reflect; + } + else + sfunc = rectangular_reflect; + } + } + break; + case _EVAS_TEXTURE_REPEAT: + { + if (aa) + { + if (rectangular_data->r0 > 0) + { + if (masked_op) + sfunc = rectangular_repeat_aa_masked; + else + sfunc = rectangular_repeat_aa; + } + else + sfunc = rectangular_repeat_aa; + } + else + { + if (rectangular_data->r0 > 0) + { + if (masked_op) + sfunc = rectangular_repeat_masked; + else + sfunc = rectangular_repeat; + } + else + sfunc = rectangular_repeat; + } + } + break; + case _EVAS_TEXTURE_RESTRICT: + rectangular_data->off = 0; + case _EVAS_TEXTURE_RESTRICT_REFLECT: + { + if (aa) + { + if (masked_op) + sfunc = rectangular_restrict_reflect_aa_masked; + else + sfunc = rectangular_restrict_reflect_aa; + } + else + { + if (masked_op) + sfunc = rectangular_restrict_reflect_masked; + else + sfunc = rectangular_restrict_reflect; + } + } + break; + case _EVAS_TEXTURE_RESTRICT_REPEAT: + { + if (aa) + { + if (masked_op) + sfunc = rectangular_restrict_repeat_aa_masked; + else + sfunc = rectangular_restrict_repeat_aa; + } + else + { + if (masked_op) + sfunc = rectangular_restrict_repeat_masked; + else + sfunc = rectangular_restrict_repeat; + } + } + break; + case _EVAS_TEXTURE_PAD: + { + if (aa) + { + if (rectangular_data->r0 > 0) + { + if (masked_op) + sfunc = rectangular_pad_aa_masked; + else + sfunc = rectangular_pad_aa; + } + else + sfunc = rectangular_pad_aa; + } + else + { + if (rectangular_data->r0 > 0) + { + if (masked_op) + sfunc = rectangular_pad_masked; + else + sfunc = rectangular_pad; + } + else + sfunc = rectangular_pad; + } + } + default: + sfunc = rectangular_reflect; + break; + } + return sfunc; +} + +/* the fill functions */ + +#ifdef BUILD_MMX +#define INTERP_256_P2R(a, s, mma, mms, mmd, mmz) \ + MOV_A2R(a, mma) \ + MOV_P2R(s, mms, mmz) \ + INTERP_256_R2R(mma, mms, mmd, mm5) + +#define MUL_256_A2R(a, mma, mmd, mmz) \ + MOV_A2R(a, mma) \ + MUL4_256_R2R(mma, mmd) +#endif + +#define SETUP_RECT_FILL \ + if (gdata->sx != gdata->s) \ + { \ + axx = (gdata->s * axx) / gdata->sx; \ + axy = (gdata->s * axy) / gdata->sx; \ + } \ + if (gdata->sy != gdata->s) \ + { \ + ayy = (gdata->s * ayy) / gdata->sy; \ + ayx = (gdata->s * ayx) / gdata->sy; \ + } \ + xx = (axx * x) + (axy * y); \ + yy = (ayx * x) + (ayy * y); \ + rr0 = gdata->r0 * gdata->s; \ + rr0 <<= 16; + +static void +rectangular_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RECT_FILL + + while (dst < dst_end) + { + int ll = xx, l = yy; + + if (ll < 0) ll = -ll; + if (l < 0) l = -l; + if (ll < l) ll = l; + ll = ll - rr0; l = ll >> 16; + + l += (ll - (l << 16)) >> 15; + *dst = 0; + if (l >= 0) + { + l += off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; + } + dst++; xx += axx; yy += ayx; + } +} + +static void +rectangular_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RECT_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int ll = xx, l = yy, lp; + + if (ll < 0) ll = -ll; + if (l < 0) l = -l; + if (ll < l) ll = l; + ll = ll - rr0; l = ll >> 16; + + *dst = 0; + if (l >= 0) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a; + + lp = l + off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } +#ifdef BUILD_MMX + MOV_P2R(src[lp], mm1, mm0) +#else + *dst = src[lp]; +#endif + if (lp + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[lp + 1], *dst); +#endif + } + if ((l == 0) && rr0) + { +#ifdef BUILD_MMX + MUL_256_A2R(a0, mm3, mm1, mm0) +#else + *dst = MUL_256(a0, *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + } + dst++; xx += axx; yy += ayx; + } +} + +static void +rectangular_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RECT_FILL + + while (dst < dst_end) + { + int ll = xx, l = yy; + + if (ll < 0) ll = -ll; + if (l < 0) l = -l; + if (ll < l) ll = l; + ll = ll - rr0; l = ll >> 16; + + l += (ll - (l << 16)) >> 15; + *dst = 0; *mask = 0; + if (l >= 0) + { + l += off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; *mask = 255; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +rectangular_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RECT_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int ll = xx, l = yy, lp; + + if (ll < 0) ll = -ll; + if (l < 0) l = -l; + if (ll < l) ll = l; + ll = ll - rr0; l = ll >> 16; + + *dst = 0; *mask = 0; + if (l >= 0) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1; + + lp = l + off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } +#ifdef BUILD_MMX + MOV_P2R(src[lp], mm1, mm0) +#else + *dst = src[lp]; +#endif + *mask = 255; + if (lp + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[lp + 1], *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + if ((l == 0) && rr0) + *mask = a0; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +rectangular_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RECT_FILL + + while (dst < dst_end) + { + int ll = xx, l = yy; + + if (ll < 0) ll = -ll; + if (l < 0) l = -l; + if (ll < l) ll = l; + ll = ll - rr0; l = ll >> 16; + + l += (ll - (l << 16)) >> 15; + *dst = 0; + if (l >= 0) + { + l += off; + l = l % src_len; + if (l < 0) + l += src_len; + *dst = src[l]; + } + dst++; xx += axx; yy += ayx; + } +} + +static void +rectangular_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RECT_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int ll = xx, l = yy, lp; + + if (ll < 0) ll = -ll; + if (l < 0) l = -l; + if (ll < l) ll = l; + ll = ll - rr0; l = ll >> 16; + + *dst = 0; + if (l >= 0) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + lp = l + off; + lp = lp % src_len; + if (lp < 0) + lp += src_len; +#ifdef BUILD_MMX + MOV_P2R(src[lp], mm1, mm0) +#else + *dst = src[lp]; +#endif + if (lp + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[lp + 1], *dst); +#endif + } + if (lp == (src_len - 1)) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[0], *dst); +#endif + } + if ((l == 0) && rr0) + { +#ifdef BUILD_MMX + MUL_256_A2R(a, mm3, mm1, mm0) +#else + *dst = MUL_256(a, *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + } + dst++; xx += axx; yy += ayx; + } +} + +static void +rectangular_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RECT_FILL + + while (dst < dst_end) + { + int ll = xx, l = yy; + + if (ll < 0) ll = -ll; + if (l < 0) l = -l; + if (ll < l) ll = l; + ll = ll - rr0; l = ll >> 16; + + l += (ll - (l << 16)) >> 15; + *dst = 0; *mask = 0; + if (l >= 0) + { + l += off; + l = l % src_len; + if (l < 0) + l += src_len; + *dst = src[l]; *mask = 255; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +rectangular_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RECT_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int ll = xx, l = yy, lp; + + if (ll < 0) ll = -ll; + if (l < 0) l = -l; + if (ll < l) ll = l; + ll = ll - rr0; l = ll >> 16; + + *dst = 0; *mask = 0; + if (l >= 0) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + lp = l + off; + lp = lp % src_len; + if (lp < 0) + lp += src_len; +#ifdef BUILD_MMX + MOV_P2R(src[lp], mm1, mm0) +#else + *dst = src[lp]; +#endif + *mask = 255; + if (lp + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[lp + 1], *dst); +#endif + } + if (lp == (src_len - 1)) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[0], *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + if ((l == 0) && rr0) + *mask = a - 1; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +rectangular_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RECT_FILL + + while (dst < dst_end) + { + int ll = xx, l = yy; + + if (ll < 0) ll = -ll; + if (l < 0) l = -l; + if (ll < l) ll = l; + ll = ll - rr0; l = ll >> 16; + + l += (ll - (l << 16)) >> 15; + *dst = 0; + if ((unsigned)l < src_len) + { + l += off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; + } + dst++; xx += axx; yy += ayx; + } +} + +static void +rectangular_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RECT_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int ll = xx, l = yy, lp; + + if (ll < 0) ll = -ll; + if (l < 0) l = -l; + if (ll < l) ll = l; + ll = ll - rr0; l = ll >> 16; + + *dst = 0; + if ((unsigned)l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a; + + lp = l + off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } +#ifdef BUILD_MMX + MOV_P2R(src[lp], mm1, mm0) +#else + *dst = src[lp]; +#endif + if (lp + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[lp + 1], *dst); +#endif + } + if (l == (src_len - 1)) + { +#ifdef BUILD_MMX + a = 257 - a0; + MUL_256_A2R(a, mm3, mm1, mm0) +#else + *dst = MUL_256(257 - a0, *dst); +#endif + } + if ((l == 0) && rr0) + { +#ifdef BUILD_MMX + MUL_256_A2R(a0, mm3, mm1, mm0) +#else + *dst = MUL_256(a0, *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + } + dst++; xx += axx; yy += ayx; + } +} + +static void +rectangular_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RECT_FILL + + while (dst < dst_end) + { + int ll = xx, l = yy; + + if (ll < 0) ll = -ll; + if (l < 0) l = -l; + if (ll < l) ll = l; + ll = ll - rr0; l = ll >> 16; + + l += (ll - (l << 16)) >> 15; + *dst = 0; *mask = 0; + if ((unsigned)l < src_len) + { + l += off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; *mask = 255; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +rectangular_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RECT_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int ll = xx, l = yy, lp; + + if (ll < 0) ll = -ll; + if (l < 0) l = -l; + if (ll < l) ll = l; + ll = ll - rr0; l = ll >> 16; + + *dst = 0; *mask = 0; + if ((unsigned)l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a0 = a - 1; + + lp = l + off; + if (lp < 0) { lp = -lp; a = 257 - a; } + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } +#ifdef BUILD_MMX + MOV_P2R(src[lp], mm1, mm0) +#else + *dst = src[lp]; +#endif + *mask = 255; + if (lp + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[lp + 1], *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + if (l == (src_len - 1)) + *mask = 255 - a0; + if ((l == 0) && rr0) + *mask = a0; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +rectangular_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RECT_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16); + + l += (ll - (l << 16)) >> 15; + *dst = 0; + if ((unsigned)l < src_len) + { + l += off; + l = (l % src_len); + if (l < 0) + l += src_len; + *dst = src[l]; + } + dst++; xx += axx; yy += ayx; + } +} + +static void +rectangular_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RECT_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16), lp; + + *dst = 0; + if ((unsigned)l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8), a1 = 257 - a; + + lp = l + off; + lp = (lp % src_len); + if (lp < 0) + lp += src_len; +#ifdef BUILD_MMX + MOV_P2R(src[lp], mm1, mm0) +#else + *dst = src[lp]; +#endif + if (lp + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[lp + 1], *dst); +#endif + } + if (lp == (src_len - 1)) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[0], *dst); +#endif + } + if (l == (src_len - 1)) + { +#ifdef BUILD_MMX + MUL_256_A2R(a1, mm3, mm1, mm0) +#else + *dst = MUL_256(a1, *dst); +#endif + } + if ((l == 0) && rr0) + { +#ifdef BUILD_MMX + MUL_256_A2R(a, mm3, mm1, mm0) +#else + *dst = MUL_256(a, *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + } + dst++; xx += axx; yy += ayx; + } +} + +static void +rectangular_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RECT_FILL + + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16); + + l += (ll - (l << 16)) >> 15; + *dst = 0; *mask = 0; + if ((unsigned)l < src_len) + { + l += off; + l = (l % src_len); + if (l < 0) + l += src_len; + *dst = src[l]; *mask = 255; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +rectangular_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + int off = gdata->off * (src_len - 1); + + SETUP_RECT_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int ll = (hypot(xx, yy) - rr0); + int l = (ll >> 16), lp; + + *dst = 0; *mask = 0; + if ((unsigned)l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + + lp = l + off; + lp = (lp % src_len); + if (lp < 0) + lp += src_len; +#ifdef BUILD_MMX + MOV_P2R(src[lp], mm1, mm0) +#else + *dst = src[lp]; +#endif + *mask = 255; + if (lp + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[lp + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[lp + 1], *dst); +#endif + } + if (lp == (src_len - 1)) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[0], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[0], *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + if (l == (src_len - 1)) + *mask = 256 - a; + if ((l == 0) && rr0) + *mask = a - 1; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + + +static void +rectangular_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + + SETUP_RECT_FILL + + while (dst < dst_end) + { + int ll = xx, l = yy; + + if (ll < 0) ll = -ll; + if (l < 0) l = -l; + if (ll < l) ll = l; + ll = ll - rr0; l = ll >> 16; + + l += (ll - (l << 16)) >> 15; + *dst = 0; + if (l >= 0) + { + if (l >= src_len) + l = src_len - 1; + *dst = src[l]; + } + dst++; xx += axx; yy += ayx; + } +} + +static void +rectangular_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + + SETUP_RECT_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int ll = xx, l = yy; + + if (ll < 0) ll = -ll; + if (l < 0) l = -l; + if (ll < l) ll = l; + ll = ll - rr0; l = ll >> 16; + + *dst = 0; + if (l >= src_len) *dst = src[src_len - 1]; + if ((unsigned)l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + +#ifdef BUILD_MMX + MOV_P2R(src[l], mm1, mm0) +#else + *dst = src[l]; +#endif + if (l + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[l + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[l + 1], *dst); +#endif + } + if ((l == 0) && rr0) + { +#ifdef BUILD_MMX + MUL_256_A2R(a, mm3, mm1, mm0) +#else + *dst = MUL_256(a, *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + } + dst++; xx += axx; yy += ayx; + } +} + +static void +rectangular_pad_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + + SETUP_RECT_FILL + + while (dst < dst_end) + { + int ll = xx, l = yy; + + if (ll < 0) ll = -ll; + if (l < 0) l = -l; + if (ll < l) ll = l; + ll = ll - rr0; l = ll >> 16; + + l += (ll - (l << 16)) >> 15; + *dst = 0; *mask = 0; + if (l >= 0) + { + if (l >= src_len) + l = src_len - 1; + *dst = src[l]; *mask = 255; + } + dst++; mask++; xx += axx; yy += ayx; + } +} + +static void +rectangular_pad_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Rectangular_Data *gdata = (Rectangular_Data *)params_data; + int xx, yy, rr0; + + SETUP_RECT_FILL + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (dst < dst_end) + { + int ll = xx, l = yy; + + if (ll < 0) ll = -ll; + if (l < 0) l = -l; + if (ll < l) ll = l; + ll = ll - rr0; l = ll >> 16; + + *dst = 0; *mask = 0; + if (l >= src_len) { *dst = src[src_len - 1]; *mask = 255; } + if ((unsigned)l < src_len) + { + DATA32 a = 1 + ((ll - (l << 16)) >> 8); + +#ifdef BUILD_MMX + MOV_P2R(src[l], mm1, mm0) +#else + *dst = src[l]; +#endif + *mask = 255; + if (l + 1 < src_len) + { +#ifdef BUILD_MMX + INTERP_256_P2R(a, src[l + 1], mm3, mm2, mm1, mm0) +#else + *dst = INTERP_256(a, src[l + 1], *dst); +#endif + } +#ifdef BUILD_MMX + MOV_R2P(mm1, *dst, mm0) +#endif + if ((l == 0) && rr0) + *mask = a - 1; + } + dst++; mask++; xx += axx; yy += ayx; + } +} diff --git a/src/lib/engines/common/evas_gradient_sinusoidal.c b/src/lib/engines/common/evas_gradient_sinusoidal.c new file mode 100644 index 0000000..9db4eec --- /dev/null +++ b/src/lib/engines/common/evas_gradient_sinusoidal.c @@ -0,0 +1,838 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include + +#include "evas_common.h" +#include "evas_gradient_private.h" + +typedef struct _Sinusoidal_Data Sinusoidal_Data; +struct _Sinusoidal_Data +{ + float amp, per; + + float sa, sp; + float off; + int len; +}; + +static void +sinusoidal_init(void); + +static void +sinusoidal_shutdown(void); + +static void +sinusoidal_init_geom(RGBA_Gradient *gr); + +static void +sinusoidal_setup_geom(RGBA_Gradient *gr); + +static void +sinusoidal_free_geom(void *gdata); + +static int +sinusoidal_has_alpha(RGBA_Gradient *gr, int op); + +static int +sinusoidal_has_mask(RGBA_Gradient *gr, int op); + +static int +sinusoidal_get_map_len(RGBA_Gradient *gr); + +static Gfx_Func_Gradient_Fill +sinusoidal_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa); + +static RGBA_Gradient_Type sinusoidal = {"sinusoidal", sinusoidal_init, sinusoidal_shutdown, + sinusoidal_init_geom, sinusoidal_setup_geom, sinusoidal_free_geom, + sinusoidal_has_alpha, sinusoidal_has_mask, + sinusoidal_get_map_len, sinusoidal_get_fill_func}; + + +/** internal functions **/ + +static void +sinusoidal_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +sinusoidal_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +sinusoidal_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +sinusoidal_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +sinusoidal_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +sinusoidal_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +sinusoidal_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +sinusoidal_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +sinusoidal_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +sinusoidal_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +sinusoidal_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +sinusoidal_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +sinusoidal_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + +static void +sinusoidal_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data); + + +RGBA_Gradient_Type * +evas_common_gradient_sinusoidal_get(void) +{ + return &sinusoidal; +} + +static void +sinusoidal_init(void) +{ +} + +static void +sinusoidal_shutdown(void) +{ +} + +static void +sinusoidal_free_geom(void *gdata) +{ + Sinusoidal_Data *data = (Sinusoidal_Data *)gdata; + if (data) free(data); +} + +static void +sinusoidal_setup_geom(RGBA_Gradient *gr) +{ + Sinusoidal_Data *sinusoidal_data; + + if (!gr || (gr->type.geometer != &sinusoidal)) return; + + sinusoidal_data = (Sinusoidal_Data *)gr->type.gdata; + if (!sinusoidal_data) return; + sinusoidal_data->sa = sinusoidal_data->amp * gr->fill.h; + sinusoidal_data->sp = sinusoidal_data->per * (M_PI / gr->fill.w); + sinusoidal_data->off = gr->map.offset; + sinusoidal_data->len = gr->fill.h; +} + +static void +sinusoidal_init_geom(RGBA_Gradient *gr) +{ + Sinusoidal_Data *sinusoidal_data; + int err = 1; + char *s, *p, key[256]; + float amp, per, val; + + if (!gr || (gr->type.geometer != &sinusoidal)) return; + + sinusoidal_data = (Sinusoidal_Data *)gr->type.gdata; + if (!sinusoidal_data) + { + sinusoidal_data = calloc(1, sizeof(Sinusoidal_Data)); + if (!sinusoidal_data) return; + sinusoidal_data->amp = 1.0; + sinusoidal_data->per = 1.0; + sinusoidal_data->sa = 32; + sinusoidal_data->sp = M_PI / 32; + sinusoidal_data->off = 0.0; + sinusoidal_data->len = 32; + } + gr->type.gdata = sinusoidal_data; + + if (!gr->type.params || !*(gr->type.params)) + return; + + s = strdup(gr->type.params); + if (!s) return; + + amp = sinusoidal_data->amp; + per = sinusoidal_data->per; + p = s; + while ((p = evas_common_gradient_get_key_fval(p, key, &val))) + { + if (!strcmp(key, "amplitude")) + { + err = 0; + amp = val; + } + else if (!strcmp(key, "period")) + { + err = 0; + per = val; + } + else + { + err = 1; + break; + } + } + if (!err) + { + sinusoidal_data->amp = amp; + if (per < 0.0) per = -per; + sinusoidal_data->per = per; + } + free(s); +} + + +static int +sinusoidal_has_alpha(RGBA_Gradient *gr, int op) +{ + if (!gr || (gr->type.geometer != &sinusoidal)) return 0; + + if (gr->has_alpha | gr->map.has_alpha) + return 1; + if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || + (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) ) + return 0; + if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) ) + return 1; + return 0; +} + +static int +sinusoidal_has_mask(RGBA_Gradient *gr, int op) +{ + if (!gr || (gr->type.geometer != &sinusoidal)) return 0; + if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || + (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) ) + { + if ( (gr->fill.spread == _EVAS_TEXTURE_RESTRICT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REFLECT) || + (gr->fill.spread == _EVAS_TEXTURE_RESTRICT_REPEAT) ) + return 1; + } + + return 0; +} + +static int +sinusoidal_get_map_len(RGBA_Gradient *gr) +{ + Sinusoidal_Data *sinusoidal_data; + + if (!gr || (gr->type.geometer != &sinusoidal)) return 0; + sinusoidal_data = (Sinusoidal_Data *)gr->type.gdata; + if (!sinusoidal_data) return 0; + return sinusoidal_data->len; +} + +static Gfx_Func_Gradient_Fill +sinusoidal_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa) +{ + Sinusoidal_Data *sinusoidal_data; + Gfx_Func_Gradient_Fill sfunc = NULL; + int masked_op = 0; + + if (!gr || (gr->type.geometer != &sinusoidal)) + return sfunc; + sinusoidal_data = (Sinusoidal_Data *)gr->type.gdata; + if (!sinusoidal_data) return sfunc; + + sinusoidal_data->off = gr->map.offset; + if ( (op == _EVAS_RENDER_COPY) || (op == _EVAS_RENDER_COPY_REL) || + (op == _EVAS_RENDER_MASK) || (op == _EVAS_RENDER_MUL) ) + masked_op = 1; + + switch (gr->fill.spread) + { + case _EVAS_TEXTURE_REFLECT: + { + if (aa) + sfunc = sinusoidal_reflect_aa; + else + sfunc = sinusoidal_reflect; + } + break; + case _EVAS_TEXTURE_REPEAT: + { + if (aa) + sfunc = sinusoidal_repeat_aa; + else + sfunc = sinusoidal_repeat; + } + break; + case _EVAS_TEXTURE_RESTRICT: + sinusoidal_data->off = 0; + case _EVAS_TEXTURE_RESTRICT_REFLECT: + { + if (aa) + { + if (masked_op) + sfunc = sinusoidal_restrict_reflect_aa_masked; + else + sfunc = sinusoidal_restrict_reflect_aa; + } + else + { + if (masked_op) + sfunc = sinusoidal_restrict_reflect_masked; + else + sfunc = sinusoidal_restrict_reflect; + } + } + break; + case _EVAS_TEXTURE_RESTRICT_REPEAT: + { + if (aa) + { + if (masked_op) + sfunc = sinusoidal_restrict_repeat_aa_masked; + else + sfunc = sinusoidal_restrict_repeat_aa; + } + else + { + if (masked_op) + sfunc = sinusoidal_restrict_repeat_masked; + else + sfunc = sinusoidal_restrict_repeat; + } + } + break; + case _EVAS_TEXTURE_PAD: + { + if (aa) + sfunc = sinusoidal_pad_aa; + else + sfunc = sinusoidal_pad; + } + break; + default: + sfunc = sinusoidal_reflect_aa; + break; + } + return sfunc; +} + +#define SETUP_SINU_FILL \ + a00 = gdata->sp * (axx / 65536.0); \ + a01 = gdata->sp * (axy / 65536.0); \ + a10 = ayx / 65536.0; \ + a11 = ayy / 65536.0; \ + xf = (a00 * x) + (a01 * y); \ + yf = (a10 * x) + (a11 * y); + +static void +sinusoidal_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data; + float xf, yf, sa = gdata->sa; + float a00, a01, a10, a11; + float off = gdata->off * (src_len - 1); + + SETUP_SINU_FILL + + while (dst < dst_end) + { + int l = (yf - (sa * sin(xf))) + off; + + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst++ = src[l]; xf += a00; yf += a10; + } +} + +static void +sinusoidal_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data; + float xf, yf, sa = gdata->sa; + float a00, a01, a10, a11; + float off = gdata->off * (src_len - 1); + + SETUP_SINU_FILL + + while (dst < dst_end) + { + float r = (yf - (sa * sin(xf))) + off; + int l = r, a; + + if (r < 0) r = -r; + a = 1 + (int)(255 * (r - (int)r)); + + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + { l = src_len - l - 1; a = 257 - a; } + } + *dst = src[l]; + if (l + 1 < src_len) + *dst = INTERP_256(a, src[l + 1], *dst); + + dst++; xf += a00; yf += a10; + } +} + +static void +sinusoidal_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data; + float xf, yf, sa = gdata->sa; + float a00, a01, a10, a11; + float off = gdata->off * (src_len - 1); + + SETUP_SINU_FILL + + while (dst < dst_end) + { + int l = (yf - (sa * sin(xf))) + off; + + l = (l % src_len); + if (l < 0) + l += src_len; + *dst++ = src[l]; xf += a00; yf += a10; + } +} + +static void +sinusoidal_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data; + float xf, yf, sa = gdata->sa; + float a00, a01, a10, a11; + float off = gdata->off * (src_len - 1); + + SETUP_SINU_FILL + + while (dst < dst_end) + { + float r = (yf - (sa * sin(xf))) + off; + int l = r, a; + + if (r < 0) r = -r; + a = 1 + (int)(255 * (r - (int)r)); + + l = l % src_len; + if (l < 0) + { l += src_len; a = 257 - a; } + + *dst = src[l]; + if (l + 1 < src_len) + *dst = INTERP_256(a, src[l + 1], *dst); + if (l == (src_len - 1)) + *dst = INTERP_256(a, src[0], *dst); + dst++; xf += a00; yf += a10; + } +} + +static void +sinusoidal_restrict_reflect(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data; + float xf, yf, sa = gdata->sa; + float a00, a01, a10, a11; + float off = gdata->off * (src_len - 1); + + SETUP_SINU_FILL + + while (dst < dst_end) + { + int l = (yf - (sa * sin(xf))); + + *dst = 0; + if ((unsigned)l < src_len) + { + l += off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; + } + dst++; xf += a00; yf += a10; + } +} + +static void +sinusoidal_restrict_reflect_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data; + float xf, yf, sa = gdata->sa; + float a00, a01, a10, a11; + float off = gdata->off * (src_len - 1); + + SETUP_SINU_FILL + + while (dst < dst_end) + { + float r = (yf - (sa * sin(xf))) + off, s = r - off; + int l = s; + + *dst = 0; + if ((unsigned)l < src_len) + { + int a, lp = r; + + if (r < 0) r = -r; + a = 1 + (int)(255 * (r - (int)r)); + if (lp < 0) lp = -lp; + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } + *dst = src[lp]; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if ((l == 0) && (s < 0)) + { + a = 256 + (255 * s); + *dst = MUL_256(a, *dst); + } + if (l == (src_len - 1)) + { + a = 256 - (255 * (s - l)); + *dst = MUL_256(a, *dst); + } + } + dst++; xf += a00; yf += a10; + } +} + +static void +sinusoidal_restrict_reflect_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data; + float xf, yf, sa = gdata->sa; + float a00, a01, a10, a11; + float off = gdata->off * (src_len - 1); + + SETUP_SINU_FILL + + while (dst < dst_end) + { + int l = (yf - (sa * sin(xf))); + + *dst = 0; *mask = 0; + if ((unsigned)l < src_len) + { + l += off; + if (l < 0) l = -l; + if (l >= src_len) + { + int m = (l % (2 * src_len)); + + l = (l % src_len); + if (m >= src_len) + l = src_len - l - 1; + } + *dst = src[l]; *mask = 255; + } + dst++; mask++; xf += a00; yf += a10; + } +} + +static void +sinusoidal_restrict_reflect_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data; + float xf, yf, sa = gdata->sa; + float a00, a01, a10, a11; + float off = gdata->off * (src_len - 1); + + SETUP_SINU_FILL + + while (dst < dst_end) + { + float r = (yf - (sa * sin(xf))) + off, s = r - off; + int l = s; + + *dst = 0; *mask = 0; + if ((unsigned)l < src_len) + { + int a, lp = r; + + if (r < 0) r = -r; + a = 1 + (int)(255 * (r - (int)r)); + if (lp < 0) lp = -lp; + if (lp >= src_len) + { + int m = (lp % (2 * src_len)); + + lp = (lp % src_len); + if (m >= src_len) + { lp = src_len - lp - 1; a = 257 - a; } + } + *dst = src[lp]; *mask = 255; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if ((l == 0) && (s < 0)) + *mask = 255 + (255 * s); + if (l == (src_len - 1)) + *mask = 255 - (255 * (s - l)); + } + dst++; mask++; xf += a00; yf += a10; + } +} + +static void +sinusoidal_restrict_repeat(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data; + float xf, yf, sa = gdata->sa; + float a00, a01, a10, a11; + float off = gdata->off * (src_len - 1); + + SETUP_SINU_FILL + + while (dst < dst_end) + { + int l = (yf - (sa * sin(xf))); + + *dst = 0; + if ((unsigned)l < src_len) + { + l += off; + l = l % src_len; + if (l < 0) + l += src_len; + *dst = src[l]; + } + dst++; xf += a00; yf += a10; + } +} + +static void +sinusoidal_restrict_repeat_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data; + float xf, yf, sa = gdata->sa; + float a00, a01, a10, a11; + float off = gdata->off * (src_len - 1); + + SETUP_SINU_FILL + + while (dst < dst_end) + { + float r = (yf - (sa * sin(xf))) + off, s = r - off; + int l = s; + + *dst = 0; + if ((unsigned)l < src_len) + { + int a, lp = r; + + if (r < 0) r = -r; + a = 1 + (int)(255 * (r - (int)r)); + lp = lp % src_len; + if (lp < 0) + { lp += src_len; a = 257 - a; } + *dst = src[lp]; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (lp == (src_len - 1)) + *dst = INTERP_256(a, src[0], *dst); + if ((l == 0) && (s < 0)) + { + a = 256 + (255 * s); + *dst = MUL_256(a, *dst); + } + if (l == (src_len - 1)) + { + a = 256 - (255 * (s - l)); + *dst = MUL_256(a, *dst); + } + } + dst++; xf += a00; yf += a10; + } +} + +static void +sinusoidal_restrict_repeat_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data; + float xf, yf, sa = gdata->sa; + float a00, a01, a10, a11; + float off = gdata->off * (src_len - 1); + + SETUP_SINU_FILL + + while (dst < dst_end) + { + int l = (yf - (sa * sin(xf))); + + *dst = 0; *mask = 0; + if ((unsigned)l < src_len) + { + l += off; + l = l % src_len; + if (l < 0) + l += src_len; + *dst = src[l]; *mask = 255; + } + dst++; mask++; xf += a00; yf += a10; + } +} + +static void +sinusoidal_restrict_repeat_aa_masked(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data; + float xf, yf, sa = gdata->sa; + float a00, a01, a10, a11; + float off = gdata->off * (src_len - 1); + + SETUP_SINU_FILL + + while (dst < dst_end) + { + float r = (yf - (sa * sin(xf))) + off, s = r - off; + int l = s; + + *dst = 0; *mask = 0; + if ((unsigned)l < src_len) + { + int a, lp = r; + + if (r < 0) r = -r; + a = 1 + (int)(255 * (r - (int)r)); + lp = lp % src_len; + if (lp < 0) + { lp += src_len; a = 257 - a; } + *dst = src[lp]; *mask = 255; + if (lp + 1 < src_len) + *dst = INTERP_256(a, src[lp + 1], *dst); + if (lp == (src_len - 1)) + *dst = INTERP_256(a, src[0], *dst); + if ((l == 0) && (s < 0)) + *mask = 255 + (255 * s); + if (l == (src_len - 1)) + *mask = 255 - (255 * (s - l)); + } + dst++; mask++; xf += a00; yf += a10; + } +} + +static void +sinusoidal_pad(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data; + float xf, yf, sa = gdata->sa; + float a00, a01, a10, a11; + + SETUP_SINU_FILL + + while (dst < dst_end) + { + int l = (yf - (sa * sin(xf))); + + if (l < 0) + l = 0; + if (l >= src_len) + l = src_len - 1; + *dst = src[l]; + dst++; xf += a00; yf += a10; + } +} + +static void +sinusoidal_pad_aa(DATA32 *src, int src_len, DATA32 *dst, DATA8 *mask, int dst_len, + int x, int y, int axx, int axy, int ayx, int ayy, void *params_data) +{ + DATA32 *dst_end = dst + dst_len; + Sinusoidal_Data *gdata = (Sinusoidal_Data *)params_data; + float xf, yf, sa = gdata->sa; + float a00, a01, a10, a11; + + SETUP_SINU_FILL + + while (dst < dst_end) + { + float r = (yf - (sa * sin(xf))); + int l = r; + + *dst = 0; + if ((unsigned)l < (src_len - 1)) + { + int a; + + if (r < 0) r = -r; + a = 1 + (int)(255 * (r - (int)r)); + *dst = INTERP_256(a, src[l + 1], src[l]); + } + if (l < 0) *dst = src[0]; + if (l >= src_len) *dst = src[src_len - 1]; + dst++; xf += a00; yf += a10; + } +} diff --git a/src/lib/engines/common/evas_image.h b/src/lib/engines/common/evas_image.h new file mode 100644 index 0000000..2dfde62 --- /dev/null +++ b/src/lib/engines/common/evas_image.h @@ -0,0 +1,32 @@ +#ifndef _EVAS_IMAGE_H +#define _EVAS_IMAGE_H + + +EAPI void evas_common_image_init (void); +EAPI void evas_common_image_shutdown (void); + +EAPI void evas_common_image_colorspace_normalize (RGBA_Image *im); +EAPI void evas_common_image_colorspace_dirty (RGBA_Image *im); +EAPI void evas_common_image_cache_free (void); /*2*/ +EAPI void evas_common_image_premul (Image_Entry *ie); /*2*/ +EAPI void evas_common_image_set_alpha_sparse (Image_Entry *ie); /*2*/ +/* EAPI RGBA_Image *evas_common_image_alpha_create (int w, int h); */ +/* EAPI RGBA_Image *evas_common_image_create (int w, int h); */ +EAPI RGBA_Image *evas_common_image_new (void); +EAPI Evas_Cache_Image *evas_common_image_cache_get (void); + +EAPI void evas_common_image_set_cache (int size); +EAPI int evas_common_image_get_cache (void); + +EAPI RGBA_Image *evas_common_image_line_buffer_obtain (int len); +EAPI void evas_common_image_line_buffer_release (RGBA_Image *im); + +EAPI RGBA_Image *evas_common_image_alpha_line_buffer_obtain (int len); +EAPI void evas_common_image_alpha_line_buffer_release (RGBA_Image *im); +EAPI void evas_common_image_alpha_line_buffer_free (RGBA_Image *im); + +EAPI RGBA_Image *evas_common_load_image_from_file (const char *file, const char *key, RGBA_Image_Loadopts *lo); +EAPI int evas_common_save_image_to_file (RGBA_Image *im, const char *file, const char *key, int quality, int compress); + + +#endif /* _EVAS_IMAGE_H */ diff --git a/src/lib/engines/common/evas_image_data.c b/src/lib/engines/common/evas_image_data.c new file mode 100644 index 0000000..1a7090f --- /dev/null +++ b/src/lib/engines/common/evas_image_data.c @@ -0,0 +1,128 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include + +#include "evas_common.h" +#include "evas_private.h" + +int +evas_common_rgba_image_from_data(Image_Entry* ie_dst, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + RGBA_Image *dst = (RGBA_Image *) ie_dst; + + switch (cspace) + { + case EVAS_COLORSPACE_ARGB8888: + dst->cache_entry.w = w; + dst->cache_entry.h = h; + dst->image.data = image_data; + dst->image.no_free = 1; + dst->cache_entry.flags.alpha = alpha ? 1 : 0; + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + w &= ~0x1; + dst->cache_entry.w = w; + dst->cache_entry.h = h; + dst->cs.data = image_data; + dst->cs.no_free = 1; + break; + default: + abort(); + break; + } + dst->cache_entry.space = cspace; + evas_common_image_colorspace_dirty(dst); + return 0; +} + +int +evas_common_rgba_image_from_copied_data(Image_Entry* ie_dst, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + RGBA_Image *dst = (RGBA_Image *) ie_dst; + + /* FIXME: Is dst->image.data valid. */ + switch (cspace) + { + case EVAS_COLORSPACE_ARGB8888: + dst->cache_entry.flags.alpha = alpha ? 1 : 0; + if (image_data) + memcpy(dst->image.data, image_data, w * h * sizeof(DATA32)); + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + dst->cs.data = calloc(1, dst->cache_entry.h * sizeof(unsigned char*) * 2); + if (image_data && (dst->cs.data)) + memcpy(dst->cs.data, image_data, dst->cache_entry.h * sizeof(unsigned char*) * 2); + break; + default: + abort(); + break; + } + + dst->cache_entry.space = cspace; + evas_common_image_colorspace_dirty(dst); + return 0; +} + +int +evas_common_rgba_image_size_set(Image_Entry *ie_dst, const Image_Entry *ie_im, int w, int h) +{ + RGBA_Image *dst = (RGBA_Image *) ie_dst; + RGBA_Image *im = (RGBA_Image *) ie_im; + + if ((im->cache_entry.space == EVAS_COLORSPACE_YCBCR422P601_PL) || + (im->cache_entry.space == EVAS_COLORSPACE_YCBCR422P709_PL)) + w &= ~0x1; + + dst->flags = im->flags; + dst->cs.no_free = 0; + if ((im->cache_entry.space == EVAS_COLORSPACE_YCBCR422P601_PL) || + (im->cache_entry.space == EVAS_COLORSPACE_YCBCR422P709_PL)) + dst->cs.data = calloc(1, dst->cache_entry.h * sizeof(unsigned char *) * 2); + evas_common_image_colorspace_dirty(dst); + + return 0; +} + +int +evas_common_rgba_image_colorspace_set(Image_Entry* ie_dst, int cspace) +{ + RGBA_Image *dst = (RGBA_Image *) ie_dst; + + switch (cspace) + { + case EVAS_COLORSPACE_ARGB8888: + if (dst->cs.data) + { + if (!dst->cs.no_free) free(dst->cs.data); + dst->cs.data = NULL; + dst->cs.no_free = 0; + } + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if (dst->image.no_free) + { + dst->image.data = NULL; + dst->image.no_free = 0; + /* FIXME: Must allocate image.data surface cleanly. */ + } + if (dst->cs.data) + { + if (!dst->cs.no_free) free(dst->cs.data); + } + dst->cs.data = calloc(1, dst->cache_entry.h * sizeof(unsigned char *) * 2); + dst->cs.no_free = 0; + break; + default: + abort(); + break; + } + dst->cache_entry.space = cspace; + evas_common_image_colorspace_dirty(dst); + + return 0; +} diff --git a/src/lib/engines/common/evas_image_load.c b/src/lib/engines/common/evas_image_load.c new file mode 100644 index 0000000..71a8486 --- /dev/null +++ b/src/lib/engines/common/evas_image_load.c @@ -0,0 +1,117 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_private.h" + +extern Evas_List *evas_modules; + +struct ext_loader_s { + const char* extention; + const char* loader; +}; + +static struct ext_loader_s loaders[] = { + { "png", "png" }, + { "jpg", "jpeg" }, + { "jpeg", "jpeg" }, + { "jfif", "jpeg" }, + { "eet", "eet" }, + { "edj", "eet" }, + { "eap", "eet" }, + { "edb", "edb" }, + { "xpm", "xpm" }, + { "tiff", "tiff" }, + { "tif", "tiff" }, + { "svg", "svg" }, + { "svgz", "svg" }, + { "gif", "gif" }, + { "pbm", "pmaps" }, + { "pgm", "pmaps" }, + { "ppm", "pmaps" }, + { "pnm", "pmaps" } +}; + +int +evas_common_load_rgba_image_module_from_file(Image_Entry *ie) +{ + Evas_Image_Load_Func *evas_image_load_func = NULL; + const char *loader = NULL; + Evas_List *l; + Evas_Module *em; + char *dot; + int i; + + dot = strrchr (ie->file, '.'); + if (dot) + { + for (i = 0, ++dot; i < (sizeof (loaders) / sizeof (struct ext_loader_s)); ++i) + { + if (!strcasecmp (dot, loaders[i].extention)) + { + loader = loaders[i].loader; + break; + } + } + } + + if (loader) + { + em = evas_module_find_type(EVAS_MODULE_TYPE_IMAGE_LOADER, loader); + if (em) + { + if (evas_module_load(em)) + { + evas_module_use(em); + evas_image_load_func = em->functions; + if (evas_image_load_func->file_head(ie, ie->file, ie->key)) + goto ok; + } + } + } + + for (l = evas_modules; l; l = l->next) + { + em = l->data; + if (em->type != EVAS_MODULE_TYPE_IMAGE_LOADER) continue; + if (!evas_module_load(em)) continue; + evas_image_load_func = em->functions; + evas_module_use(em); + if (evas_image_load_func->file_head(ie, ie->file, ie->key)) + { + if (evas_modules != l) + { + evas_modules = evas_list_promote_list(evas_modules, l); + } + goto ok; + } + } + + return -1; + + ok: + ie->info.module = (void*) em; + ie->info.loader = (void*) evas_image_load_func; + evas_module_ref((Evas_Module*) ie->info.module); + return 0; +} + +int +evas_common_load_rgba_image_data_from_file(Image_Entry *ie) +{ + Evas_Image_Load_Func *evas_image_load_func = NULL; + + if (!ie->info.module) return -1; + if (ie->flags.loaded) return -1; + + evas_image_load_func = ie->info.loader; + evas_module_use((Evas_Module*) ie->info.module); + if (!evas_image_load_func->file_data(ie, ie->file, ie->key)) + return -1; + + evas_module_unref((Evas_Module*) ie->info.module); + ie->info.module = NULL; + + return 0; +} diff --git a/src/lib/engines/common/evas_image_main.c b/src/lib/engines/common/evas_image_main.c new file mode 100644 index 0000000..6943120 --- /dev/null +++ b/src/lib/engines/common/evas_image_main.c @@ -0,0 +1,592 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" /* so that EAPI in Eet.h is correctly defined */ +#endif + +#ifdef BUILD_LOADER_EET +# include +#endif + +#include "evas_common.h" +#include "evas_private.h" +#include "evas_image_private.h" +#include "evas_convert_yuv.h" + +#ifdef HAVE_VALGRIND +# include +#endif + +static Evas_Cache_Image * eci = NULL; +static int reference = 0; + +/* static RGBA_Image *evas_rgba_line_buffer = NULL; */ + +#define EVAS_RGBA_LINE_BUFFER_MIN_LEN 256 +#define EVAS_RGBA_LINE_BUFFER_MAX_LEN 2048 + +/* static RGBA_Image *evas_alpha_line_buffer = NULL; */ + +#define EVAS_ALPHA_LINE_BUFFER_MIN_LEN 256 +#define EVAS_ALPHA_LINE_BUFFER_MAX_LEN 2048 + + +static Image_Entry *_evas_common_rgba_image_new(void); +static void _evas_common_rgba_image_delete(Image_Entry *ie); + +static int _evas_common_rgba_image_surface_alloc(Image_Entry *ie, int w, int h); +static void _evas_common_rgba_image_surface_delete(Image_Entry *ie); +static DATA32 *_evas_common_rgba_image_surface_pixels(Image_Entry *ie); + +static void _evas_common_rgba_image_unload(Image_Entry *im); + +static void _evas_common_rgba_image_dirty_region(Image_Entry *im, int x, int y, int w, int h); + +static int _evas_common_rgba_image_ram_usage(Image_Entry *ie); + +/* Only called when references > 0. Need to provide a fresh copie of im. */ +/* The destination surface does have a surface, but no allocated pixel data. */ +static int _evas_common_rgba_image_dirty(Image_Entry* dst, const Image_Entry* src); + +static void +_evas_common_rgba_image_debug(const char* context, Image_Entry *eim) +{ + fprintf(stderr, "%p = [%s] {%s,%s} %i [%i|%i]\n", eim, context, eim->file, eim->key, eim->references, eim->w, eim->h); +} + +static const Evas_Cache_Image_Func _evas_common_image_func = +{ + _evas_common_rgba_image_new, + _evas_common_rgba_image_delete, + _evas_common_rgba_image_surface_alloc, + _evas_common_rgba_image_surface_delete, + _evas_common_rgba_image_surface_pixels, + evas_common_load_rgba_image_module_from_file, + _evas_common_rgba_image_unload, + _evas_common_rgba_image_dirty_region, + _evas_common_rgba_image_dirty, + evas_common_rgba_image_size_set, + evas_common_rgba_image_from_copied_data, + evas_common_rgba_image_from_data, + evas_common_rgba_image_colorspace_set, + evas_common_load_rgba_image_data_from_file, + _evas_common_rgba_image_ram_usage, +/* _evas_common_rgba_image_debug */ + NULL +}; + +EAPI void +evas_common_image_init(void) +{ + if (!eci) + eci = evas_cache_image_init(&_evas_common_image_func); + reference++; +//// printf("REF++=%i\n", reference); + +#ifdef BUILD_LOADER_EET + eet_init(); +#endif +} + +EAPI void +evas_common_image_shutdown(void) +{ + if (--reference == 0) + { +//// printf("REF--=%i\n", reference); +// DISABLE for now - something wrong with cache shutdown freeing things +// still in use - rage_thumb segv's now. +// +// actually - i think i see it. cache ref goes to 0 (and thus gets freed) +// because in eng_setup() when a buffer changes size it is FIRST freed +// THEN allocated again - thus brignhjing ref to 0 then back to 1 immediately +// where it should stay at 1. - see evas_engine.c in the buffer enigne for +// example. eng_output_free() is called BEFORE _output_setup(). although this +// is only a SIGNE of the problem. we can patch this up with either freeing +// after the setup (so we just pt a ref of 2 then back to 1), or just +// evas_common_image_init() at the start and evas_common_image_shutdown() +// after it all. really ref 0 should only be reached when no more canvases +// with no more objects exist anywhere. +// evas_cache_image_shutdown(eci); +// eci = NULL; + } + +#ifdef BUILD_LOADER_EET + eet_shutdown(); +#endif +} + +static Image_Entry * +_evas_common_rgba_image_new(void) +{ + RGBA_Image *im; + + im = calloc(1, sizeof(RGBA_Image)); + if (!im) return NULL; + im->flags = RGBA_IMAGE_NOTHING; + im->ref = 1; + return &im->cache_entry; +} + +static void +_evas_common_rgba_image_delete(Image_Entry *ie) +{ + RGBA_Image *im = (RGBA_Image *) ie; + + evas_common_pipe_free(im); + if (ie->info.module) evas_module_unref((Evas_Module *)ie->info.module); + /* memset the image to 0x99 because i recently saw a segv where an + * seemed to be used BUT its contents were wrong - it looks like it was + * overwritten by something from efreet - as there was an execute command + * for a command there and some other signs - but to make sure, I am + * going to empty this struct out in case this happens again so i know + * that something else is overwritign this struct - or not */ + memset(im, 0x99, sizeof(im)); + free(im); +} + +static int +_evas_common_rgba_image_surface_alloc(Image_Entry *ie, int w, int h) +{ + RGBA_Image *im = (RGBA_Image *) ie; + size_t siz = 0; + + if (im->image.no_free) return 0; + + if (im->flags & RGBA_IMAGE_ALPHA_ONLY) + siz = w * h * sizeof(DATA8); + else + siz = w * h * sizeof(DATA32); + + if (im->image.data) free(im->image.data); + im->image.data = malloc(siz); + if (im->image.data == NULL) return -1; + +#ifdef HAVE_VALGRIND +# ifdef VALGRIND_MAKE_READABLE + VALGRIND_MAKE_READABLE(im->image.data, siz); +# else +# ifdef VALGRIND_MAKE_MEM_DEFINED + VALGRIND_MAKE_MEM_DEFINED(im->image.data, siz); +# endif +# endif +#endif + + return 0; +} + +static void +_evas_common_rgba_image_surface_delete(Image_Entry *ie) +{ + RGBA_Image *im = (RGBA_Image *) ie; + + if ((im->cs.data) && (im->image.data)) + { + if (im->cs.data != im->image.data) + { + if (!im->cs.no_free) free(im->cs.data); + } + } + else if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + } + im->cs.data = NULL; + + if (im->image.data && !im->image.no_free) + free(im->image.data); + im->image.data = NULL; +} + +static void +_evas_common_rgba_image_unload(Image_Entry* im) +{ +} + +static void +_evas_common_rgba_image_dirty_region(Image_Entry* ie, int x, int y, int w, int h) +{ + RGBA_Image *im = (RGBA_Image *) ie; + + im->flags |= RGBA_IMAGE_IS_DIRTY; +} + +/* Only called when references > 0. Need to provide a fresh copie of im. */ +static int +_evas_common_rgba_image_dirty(Image_Entry *ie_dst, const Image_Entry *ie_src) +{ + RGBA_Image *dst = (RGBA_Image *) ie_dst; + RGBA_Image *src = (RGBA_Image *) ie_src; + + evas_cache_image_load_data(&src->cache_entry); + if (_evas_common_rgba_image_surface_alloc(&dst->cache_entry, + src->cache_entry.w, src->cache_entry.h)) + return 1; + + evas_common_image_colorspace_normalize(src); + evas_common_image_colorspace_normalize(dst); +/* evas_common_blit_rectangle(src, dst, 0, 0, src->cache_entry.w, src->cache_entry.h, 0, 0); */ +/* evas_common_cpu_end_opt(); */ + + return 0; +} + +static int +_evas_common_rgba_image_ram_usage(Image_Entry *ie) +{ + RGBA_Image *im = (RGBA_Image *) ie; + +// ram += sizeof(struct _RGBA_Image); +// if (im->info.real_file) ram += strlen(im->info.real_file); +// if (im->info.comment) ram += strlen(im->info.comment); + if ((im->image.data) && (!im->image.no_free)) + return im->cache_entry.w * im->cache_entry.h * sizeof(DATA32); + return 0; +} + +static DATA32 * +_evas_common_rgba_image_surface_pixels(Image_Entry *ie) +{ + RGBA_Image *im = (RGBA_Image *) ie; + + return im->image.data; +} + +#if 0 +void +evas_common_image_surface_alpha_tiles_calc(RGBA_Surface *is, int tsize) +{ + int x, y; + DATA32 *ptr; + + if (is->spans) return; + if (!is->im->cache_entry.flags.alpha) return; + /* FIXME: dont handle alpha only images yet */ + if ((is->im->flags & RGBA_IMAGE_ALPHA_ONLY)) return; + if (tsize < 0) tsize = 0; + is->spans = calloc(1, sizeof(RGBA_Image_Span *) * is->h); + if (!is->spans) return; + ptr = is->data; + for (y = 0; y < is->h; y++) + { + RGBA_Image_Span *sp; + + sp = NULL; + for (x = 0; x < is->w; x++) + { + DATA8 a; + + a = A_VAL(ptr); + if (sp) + { + if (a == 0) + { + is->spans[y] = evas_object_list_append(is->spans[y], sp); + sp = NULL; + } + else + { + sp->w++; + if ((sp->v == 2) && (a != 255)) sp->v = 1; + } + } + else + { + if (a == 255) + { + sp = calloc(1, sizeof(RGBA_Image_Span)); + sp->x = x; + sp->w = 1; + sp->v = 2; + } + else if (a > 0) + { + sp = calloc(1, sizeof(RGBA_Image_Span)); + sp->x = x; + sp->w = 1; + sp->v = 1; + } + } + ptr++; + } + if (sp) + { + is->spans[y] = evas_object_list_append(is->spans[y], sp); + sp = NULL; + } + } +} +#endif + +/* EAPI void */ +/* evas_common_image_surface_dealloc(RGBA_Surface *is) */ +/* { */ +/* if ((is->data) && (!is->no_free)) */ +/* { */ +/* free(is->data); */ +/* is->data = NULL; */ +/* } */ +/* } */ + +static RGBA_Image * +evas_common_image_create(int w, int h) +{ + RGBA_Image *im; + + im = (RGBA_Image *) _evas_common_rgba_image_new(); + if (!im) return NULL; + im->cache_entry.w = w; + im->cache_entry.h = h; + if (_evas_common_rgba_image_surface_alloc(&im->cache_entry, w, h)) + { + _evas_common_rgba_image_delete(&im->cache_entry); + return NULL; + } + im->cache_entry.flags.cached = 0; + return im; +} + +EAPI RGBA_Image * +evas_common_image_alpha_create(int w, int h) +{ + RGBA_Image *im; + + im = (RGBA_Image *) _evas_common_rgba_image_new(); + if (!im) return NULL; + im->cache_entry.w = w; + im->cache_entry.h = h; + im->flags |= RGBA_IMAGE_ALPHA_ONLY; + if (_evas_common_rgba_image_surface_alloc(&im->cache_entry, w, h)) + { + _evas_common_rgba_image_delete(&im->cache_entry); + return NULL; + } + im->cache_entry.flags.cached = 0; + return im; +} + +void +evas_common_image_colorspace_normalize(RGBA_Image *im) +{ + if ((!im->cs.data) || + ((!im->cs.dirty) && (!(im->flags & RGBA_IMAGE_IS_DIRTY)))) return; + switch (im->cache_entry.space) + { + case EVAS_COLORSPACE_ARGB8888: + if (im->image.data != im->cs.data) + { + if (!im->image.no_free) free(im->image.data); + im->image.data = im->cs.data; + im->cs.no_free = im->image.no_free; + } + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: +#ifdef BUILD_CONVERT_YUV + if ((im->image.data) && (*((unsigned char **)im->cs.data))) + evas_common_convert_yuv_420p_601_rgba(im->cs.data, (DATA8*) im->image.data, + im->cache_entry.w, im->cache_entry.h); +#endif + break; + default: + break; + } + im->cs.dirty = 0; +} + +EAPI void +evas_common_image_colorspace_dirty(RGBA_Image *im) +{ + im->cs.dirty = 1; +} + +EAPI void +evas_common_image_set_cache(int size) +{ + if (eci != NULL) + evas_cache_image_set(eci, size); +} + +EAPI int +evas_common_image_get_cache(void) +{ + return evas_cache_image_get(eci); +} + +EAPI RGBA_Image * +evas_common_load_image_from_file(const char *file, const char *key, RGBA_Image_Loadopts *lo) +{ + int error; + + if (file == NULL) return NULL; + return (RGBA_Image *) evas_cache_image_request(eci, file, key, lo, &error); +} + +EAPI void +evas_common_image_cache_free(void) +{ + evas_common_image_set_cache(0); +} + +EAPI Evas_Cache_Image* +evas_common_image_cache_get(void) +{ + return eci; +} + +EAPI RGBA_Image * +evas_common_image_line_buffer_obtain(int len) +{ + if (len < 1) return NULL; + if (len < EVAS_RGBA_LINE_BUFFER_MIN_LEN) + len = EVAS_RGBA_LINE_BUFFER_MIN_LEN; + return evas_common_image_create(len, 1); +/* + if (evas_rgba_line_buffer) + { + if (evas_rgba_line_buffer->image->w >= len) + return evas_rgba_line_buffer; + evas_rgba_line_buffer->image->data = (DATA32 *)realloc(evas_rgba_line_buffer->image->data, len * sizeof(DATA32)); + if (!evas_rgba_line_buffer->image->data) + { + evas_common_image_free(evas_rgba_line_buffer); + evas_rgba_line_buffer = NULL; + return NULL; + } + evas_rgba_line_buffer->image->w = len; + return evas_rgba_line_buffer; + } + evas_rgba_line_buffer = evas_common_image_create(len, 1); + if (!evas_rgba_line_buffer) return NULL; + return evas_rgba_line_buffer; + */ +} + +EAPI void +evas_common_image_line_buffer_release(RGBA_Image *im) +{ + _evas_common_rgba_image_delete(&im->cache_entry); +/* + if (!evas_rgba_line_buffer) return; + if (EVAS_RGBA_LINE_BUFFER_MAX_LEN < evas_rgba_line_buffer->image->w) + { + evas_rgba_line_buffer->image->w = EVAS_RGBA_LINE_BUFFER_MAX_LEN; + evas_rgba_line_buffer->image->data = (DATA32 *)realloc(evas_rgba_line_buffer->image->data, + evas_rgba_line_buffer->image->w * sizeof(DATA32)); + if (!evas_rgba_line_buffer->image->data) + { + evas_common_image_free(evas_rgba_line_buffer); + evas_rgba_line_buffer = NULL; + } + } + */ +} + +EAPI void +evas_common_image_line_buffer_free(RGBA_Image *im) +{ + _evas_common_rgba_image_delete(&im->cache_entry); +/* + if (!evas_rgba_line_buffer) return; + evas_common_image_free(evas_rgba_line_buffer); + evas_rgba_line_buffer = NULL; + */ +} + +EAPI RGBA_Image * +evas_common_image_alpha_line_buffer_obtain(int len) +{ + if (len < 1) return NULL; + if (len < EVAS_ALPHA_LINE_BUFFER_MIN_LEN) + len = EVAS_ALPHA_LINE_BUFFER_MIN_LEN; + return evas_common_image_alpha_create(len, 1); +/* + if (evas_alpha_line_buffer) + { + if (evas_alpha_line_buffer->image->w >= len) + return evas_alpha_line_buffer; + evas_alpha_line_buffer->image->data = realloc(evas_alpha_line_buffer->image->data, len * sizeof(DATA8)); + if (!evas_alpha_line_buffer->image->data) + { + evas_common_image_free(evas_alpha_line_buffer); + evas_alpha_line_buffer = NULL; + return NULL; + } + evas_alpha_line_buffer->image->w = len; + return evas_alpha_line_buffer; + } + evas_alpha_line_buffer = evas_common_image_alpha_create(len, 1); + return evas_alpha_line_buffer; + */ +} + +EAPI void +evas_common_image_alpha_line_buffer_release(RGBA_Image *im) +{ + _evas_common_rgba_image_delete(&im->cache_entry); +/* + if (!evas_alpha_line_buffer) return; + if (EVAS_ALPHA_LINE_BUFFER_MAX_LEN < evas_alpha_line_buffer->image->w) + { + evas_alpha_line_buffer->image->w = EVAS_ALPHA_LINE_BUFFER_MAX_LEN; + evas_alpha_line_buffer->image->data = realloc(evas_alpha_line_buffer->image->data, + evas_alpha_line_buffer->image->w * sizeof(DATA8)); + if (!evas_alpha_line_buffer->image->data) + { + evas_common_image_free(evas_alpha_line_buffer); + evas_alpha_line_buffer = NULL; + } + } + */ +} + +EAPI void +evas_common_image_premul(Image_Entry *ie) +{ + DATA32 *s, *se; + DATA32 nas = 0; + + if (!ie) return ; + if (!evas_cache_image_pixels(ie)) return ; + if (!ie->flags.alpha) return; + + s = evas_cache_image_pixels(ie); + se = s + (ie->w * ie->h); + while (s < se) + { + DATA32 a = 1 + (*s >> 24); + + *s = (*s & 0xff000000) + (((((*s) >> 8) & 0xff) * a) & 0xff00) + + (((((*s) & 0x00ff00ff) * a) >> 8) & 0x00ff00ff); + s++; + if ((a == 1) || (a == 256)) + nas++; + } + if ((ALPHA_SPARSE_INV_FRACTION * nas) >= (ie->w * ie->h)) + ie->flags.alpha_sparse = 1; +} + +EAPI void +evas_common_image_set_alpha_sparse(Image_Entry *ie) +{ + DATA32 *s, *se; + DATA32 nas = 0; + + if (!ie) return; + if (!evas_cache_image_pixels(ie)) return ; + if (!ie->flags.alpha) return; + + s = evas_cache_image_pixels(ie); + se = s + (ie->w * ie->h); + while (s < se) + { + DATA32 p = *s & 0xff000000; + + if (!p || (p == 0xff000000)) + nas++; + s++; + } + if ((ALPHA_SPARSE_INV_FRACTION * nas) >= (ie->w * ie->h)) + ie->flags.alpha_sparse = 1; +} diff --git a/src/lib/engines/common/evas_image_private.h b/src/lib/engines/common/evas_image_private.h new file mode 100644 index 0000000..5f07e8c --- /dev/null +++ b/src/lib/engines/common/evas_image_private.h @@ -0,0 +1,13 @@ +#ifndef _EVAS_IMAGE_PRIVATE_H +#define _EVAS_IMAGE_PRIVATE_H + +int evas_common_load_rgba_image_module_from_file (Image_Entry *im); +int evas_common_load_rgba_image_data_from_file (Image_Entry *im); + +int evas_common_rgba_image_size_set (Image_Entry* dst, const Image_Entry* im, int w, int h); +int evas_common_rgba_image_from_copied_data (Image_Entry* dst, int w, int h, DATA32 *image_data, int alpha, int cspace); +int evas_common_rgba_image_from_data (Image_Entry* dst, int w, int h, DATA32 *image_data, int alpha, int cspace); +int evas_common_rgba_image_colorspace_set (Image_Entry* dst, int cspace); + + +#endif /* _EVAS_IMAGE_PRIVATE_H */ diff --git a/src/lib/engines/common/evas_image_save.c b/src/lib/engines/common/evas_image_save.c new file mode 100644 index 0000000..9d2a686 --- /dev/null +++ b/src/lib/engines/common/evas_image_save.c @@ -0,0 +1,57 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "evas_options.h" + +#include "evas_common.h" +#include "evas_private.h" + + +extern Evas_List *evas_modules; + +int +evas_common_save_image_to_file(RGBA_Image *im, const char *file, const char *key, int quality, int compress) +{ + Evas_Image_Save_Func *evas_image_save_func = NULL; + char *p; + char *saver = NULL; + + p = strrchr(file, '.'); + if (p) + { + p++; + + if (!strcasecmp(p, "png")) + saver = "png"; + if ((!strcasecmp(p, "jpg")) || (!strcasecmp(p, "jpeg")) || + (!strcasecmp(p, "jfif"))) + saver = "jpeg"; + if ((!strcasecmp(p, "eet")) || (!strcasecmp(p, "edj")) || + (!strcasecmp(p, "eap"))) + saver = "eet"; + if (!strcasecmp(p, "edb")) + saver = "edb"; + } + + if (saver) + { + Evas_Module *em; + + em = evas_module_find_type(EVAS_MODULE_TYPE_IMAGE_SAVER, saver); + if (em) + { + evas_module_use(em); + if (evas_module_load(em)) + { + evas_image_save_func = em->functions; + return evas_image_save_func->image_save(im, file, key, quality, compress); + } + } + } + return 0; +} diff --git a/src/lib/engines/common/evas_line.h b/src/lib/engines/common/evas_line.h new file mode 100644 index 0000000..9d45e3d --- /dev/null +++ b/src/lib/engines/common/evas_line.h @@ -0,0 +1,11 @@ +#ifndef _EVAS_LINE_H +#define _EVAS_LINE_H + + +EAPI void evas_common_line_init (void); + +EAPI void evas_common_line_draw (RGBA_Image *dst, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2); + + +#endif /* _EVAS_LINE_H */ + diff --git a/src/lib/engines/common/evas_line_main.c b/src/lib/engines/common/evas_line_main.c new file mode 100644 index 0000000..d036ff3 --- /dev/null +++ b/src/lib/engines/common/evas_line_main.c @@ -0,0 +1,663 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_blend_private.h" + + +static void +_evas_draw_point(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y); + +static void +_evas_draw_simple_line(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1); + +static void +_evas_draw_line(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1); + +static void +_evas_draw_line_aa(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1); + + +#define IN_RANGE(x, y, w, h) \ +( ((unsigned)(x) < (w)) && ((unsigned)(y) < (h)) ) + +#define IN_RECT(x, y, rx, ry, rw, rh) \ +( ((unsigned)((x) - (rx)) < (rw)) && ((unsigned)((y) - (ry)) < (rh)) ) + +#define EXCHANGE_POINTS(x0, y0, x1, y1) \ +{ \ + int _tmp = y0; \ + \ + y0 = y1; \ + y1 = _tmp; \ + \ + _tmp = x0; \ + x0 = x1; \ + x1 = _tmp; \ +} + + +EAPI void +evas_common_line_init(void) +{ +} + +EAPI void +evas_common_line_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1) +{ + int x, y, w, h; + int clx, cly, clw, clh; + int cuse, cx, cy, cw, ch; + + if ((x0 == x1) && (y0 == y1)) + { + _evas_draw_point(dst, dc, x0, y0); + return; + } + + clx = cly = 0; + clw = dst->cache_entry.w; + clh = dst->cache_entry.h; + + /* save out clip info */ + cuse = dc->clip.use; + cx = dc->clip.x; + cy = dc->clip.y; + cw = dc->clip.w; + ch = dc->clip.h; + + if (cuse) + { + RECTS_CLIP_TO_RECT(clx, cly, clw, clh, cx, cy, cw, ch); + if ((clw < 1) || (clh < 1)) + return; + } + + x = MIN(x0, x1); + y = MIN(y0, y1); + w = MAX(x0, x1) - x + 1; + h = MAX(y0, y1) - y + 1; + + RECTS_CLIP_TO_RECT(clx, cly, clw, clh, x, y, w, h); + if ((clw < 1) || (clh < 1)) + return; + + dc->clip.use = 1; + dc->clip.x = clx; + dc->clip.y = cly; + dc->clip.w = clw; + dc->clip.h = clh; + + if (dc->anti_alias) + _evas_draw_line_aa(dst, dc, x0, y0, x1, y1); + else + _evas_draw_line(dst, dc, x0, y0, x1, y1); + + /* restore clip info */ + dc->clip.use = cuse; + dc->clip.x = cx; + dc->clip.y = cy; + dc->clip.w = cw; + dc->clip.h = ch; +} + + +static void +_evas_draw_point(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y) +{ + RGBA_Gfx_Pt_Func pfunc; + + if (!IN_RANGE(x, y, dst->cache_entry.w, dst->cache_entry.h)) + return; + if ((dc->clip.use) && (!IN_RECT(x, y, dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h))) + return; + pfunc = evas_common_gfx_func_composite_color_pt_get(dc->col.col, dst, dc->render_op); + if (pfunc) + pfunc(0, 255, dc->col.col, dst->image.data + (dst->cache_entry.w * y) + x); +} + +/* + these functions use the dc->clip data as bounding + data. they assume that such data has already been cut + back to lie in the dst image rect and the object's + (line) bounding rect. +*/ +static void +_evas_draw_simple_line(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1) +{ + int dx, dy, len, lx, ty, rx, by; + int clx, cly, clw, clh; + int dstw; + DATA32 *p, color; + RGBA_Gfx_Pt_Func pfunc; + RGBA_Gfx_Func sfunc; + + dstw = dst->cache_entry.w; + color = dc->col.col; + + if (y0 > y1) + EXCHANGE_POINTS(x0, y0, x1, y1) + if (x0 > x1) + EXCHANGE_POINTS(x0, y0, x1, y1) + + dx = x1 - x0; + dy = y1 - y0; + + clx = dc->clip.x; + cly = dc->clip.y; + clw = dc->clip.w; + clh = dc->clip.h; + + lx = clx; + rx = clx + clw - 1; + ty = cly; + by = cly + clh - 1; + + if (dy == 0) + { +#ifdef EVAS_SLI + if (((y0) % dc->sli.h) == dc->sli.y) +#endif + { + if ((y0 >= ty) && (y0 <= by)) + { + if (dx < 0) + { + int tmp = x1; + + x1 = x0; + x0 = tmp; + } + + if (x0 < lx) x0 = lx; + if (x1 > rx) x1 = rx; + + len = x1 - x0 + 1; + p = dst->image.data + (dstw * y0) + x0; + sfunc = evas_common_gfx_func_composite_color_span_get(color, dst, len, dc->render_op); + if (sfunc) + sfunc(NULL, NULL, color, p, len); + } + } + return; + } + + pfunc = evas_common_gfx_func_composite_color_pt_get(color, dst, dc->render_op); + if (!pfunc) return; + + if (dx == 0) + { + if ((x0 >= lx) && (x0 <= rx)) + { + if (y0 < ty) y0 = ty; + if (y1 > by) y1 = by; + + len = y1 - y0 + 1; + p = dst->image.data + (dstw * y0) + x0; + while (len--) + { +#ifdef EVAS_SLI + if (((y1 + 1 - len) % dc->sli.h) == dc->sli.y) +#endif + { + pfunc(0, 255, color, p); + } + p += dstw; + } + } + return; + } + + if ((dy == dx) || (dy == -dx)) + { + int p0_in, p1_in; + + p0_in = (IN_RECT(x0, y0, clx, cly, clw, clh) ? 1 : 0); + p1_in = (IN_RECT(x1, y1, clx, cly, clw, clh) ? 1 : 0); + + if (dx > 0) + { + if (!p0_in) + { + x0 = x0 + (ty - y0); + y0 = ty; + if (x0 > rx) return; + if (x0 < lx) + { + y0 = y0 + (lx - x0); + x0 = lx; + if ((y0 < ty) || (y0 > by)) return; + } + } + if (!p1_in) + { + x1 = x0 + (by - y0); + y1 = by; + if (x1 < lx) return; + if (x1 > rx) + { + y1 = y0 + (rx - x0); + x1 = rx; + if ((y1 < ty) || (y1 > by)) return; + } + } + } + else + { + if (!p0_in) + { + x0 = x0 - (ty - y0); + y0 = ty; + if (x0 < lx) return; + if (x0 > rx) + { + y0 = y0 - (rx - x0); + x0 = rx; + if ((y0 < ty) || (y0 > by)) return; + } + } + if (!p1_in) + { + x1 = x0 - (by - y0); + y1 = by; + if (x1 > rx) return; + if (x1 < lx) + { + y1 = y0 - (lx - x0); + x1 = lx; + if ((y1 < ty) || (y1 > by)) return; + } + } + } + if (y1 > y0) + { + p = dst->image.data + (dstw * y0) + x0; + len = y1 - y0 + 1; + if (dx > 0) dstw++; + else dstw--; + } + else + { + len = y0 - y1 + 1; + p = dst->image.data + (dstw * y1) + x1; + if (dx > 0) dstw--; + else dstw++; + } + + while (len--) + { +#ifdef EVAS_SLI + if (((y1 + 1 - len) % dc->sli.h) == dc->sli.y) +#endif + { + pfunc(0, 255, color, p); + } + p += dstw; + } + } +} + + +#define SETUP_LINE_SHALLOW \ + if (x0 > x1) \ + { \ + EXCHANGE_POINTS(x0, y0, x1, y1) \ + dx = -dx; \ + dy = -dy; \ + } \ + \ + px = x0; \ + py = y0; \ + \ + p0_in = (IN_RANGE(x0 , y0 , clw, clh) ? 1 : 0); \ + p1_in = (IN_RANGE(x1 , y1 , clw, clh) ? 1 : 0); \ + \ + dely = 1; \ + dh = dstw; \ + if (dy < 0) \ + { \ + dely = -1; \ + dh = -dstw; \ + } \ + \ + dyy = ((dy) << 16) / (dx); \ + \ + if (!p0_in) \ + { \ + dxx = ((dx) << 16) / (dy); \ + if (px < 0) \ + { \ + x = -px; px = 0; \ + yy = x * dyy; \ + y = yy >> 16; \ + if (!a_a) \ + y += (yy - (y << 16)) >> 15; \ + py += y; \ + if ((dely > 0) && (py >= clh)) \ + return; \ + else if ((dely < 0) && (py < -1)) \ + return; \ + } \ + \ + y = 0; \ + if ((dely > 0) && (py < -1)) \ + y = (-1 - py); \ + else if ((dely < 0) && (py >= clh)) \ + y = (clh - 1 - py); \ + \ + xx = y * dxx; \ + x = xx >> 16; \ + if (!a_a) \ + x += (xx - (x << 16)) >> 15; \ + px += x; \ + if (px >= clw) return; \ + \ + yy = x * dyy; \ + y = yy >> 16; \ + if (!a_a) \ + y += (yy - (y << 16)) >> 15; \ + py += y; \ + if ((dely > 0) && (py >= clh)) \ + return; \ + else if ((dely < 0) && (py < -1)) \ + return; \ + } \ + \ + p = data + (dstw * py) + px; \ + \ + x = px - x0; \ + yy = x * dyy; \ + prev_y = (yy >> 16); \ + \ + rx = MIN(x1 + 1, clw); \ + by = clh - 1; + + +#define SETUP_LINE_STEEP \ + if (y0 > y1) \ + { \ + EXCHANGE_POINTS(x0, y0, x1, y1) \ + dx = -dx; \ + dy = -dy; \ + } \ + \ + px = x0; \ + py = y0; \ + \ + p0_in = (IN_RANGE(x0 , y0 , clw, clh) ? 1 : 0); \ + p1_in = (IN_RANGE(x1 , y1 , clw, clh) ? 1 : 0); \ + \ + delx = 1; \ + if (dx < 0) \ + delx = -1; \ + \ + dxx = ((dx) << 16) / (dy); \ + \ + if (!p0_in) \ + { \ + dyy = ((dy) << 16) / (dx); \ + \ + if (py < 0) \ + { \ + y = -py; py = 0; \ + xx = y * dxx; \ + x = xx >> 16; \ + if (!a_a) \ + x += (xx - (x << 16)) >> 15; \ + px += x; \ + if ((delx > 0) && (px >= clw)) \ + return; \ + else if ((delx < 0) && (px < -1)) \ + return; \ + } \ + \ + x = 0; \ + if ((delx > 0) && (px < -1)) \ + x = (-1 - px); \ + else if ((delx < 0) && (px >= clw)) \ + x = (clw - 1 - px); \ + \ + yy = x * dyy; \ + y = yy >> 16; \ + if (!a_a) \ + y += (yy - (y << 16)) >> 15; \ + py += y; \ + if (py >= clh) return; \ + \ + xx = y * dxx; \ + x = xx >> 16; \ + if (!a_a) \ + x += (xx - (x << 16)) >> 15; \ + px += x; \ + if ((delx > 0) && (px >= clw)) \ + return; \ + else if ((delx < 0) && (px < -1)) \ + return; \ + } \ + \ + p = data + (dstw * py) + px; \ + \ + y = py - y0; \ + xx = y * dxx; \ + prev_x = (xx >> 16); \ + \ + by = MIN(y1 + 1, clh); \ + rx = clw - 1; + + + +static void +_evas_draw_line(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1) +{ + int px, py, x, y, prev_x, prev_y; + int dx, dy, rx, by, p0_in, p1_in, dh, a_a = 0; + int delx, dely, xx, yy, dxx, dyy; + int clx, cly, clw, clh; + int dstw; + DATA32 *p, *data, color; + RGBA_Gfx_Pt_Func pfunc; + + dx = x1 - x0; + dy = y1 - y0; + + if ( (dx == 0) || (dy == 0) || (dx == dy) || (dx == -dy) ) + { + _evas_draw_simple_line(dst, dc, x0, y0, x1, y1); + return; + } + + color = dc->col.col; + pfunc = evas_common_gfx_func_composite_color_pt_get(color, dst, dc->render_op); + if (!pfunc) return; + + clx = dc->clip.x; + cly = dc->clip.y; + clw = dc->clip.w; + clh = dc->clip.h; + + data = dst->image.data; + dstw = dst->cache_entry.w; + + data += (dstw * cly) + clx; + x0 -= clx; + y0 -= cly; + x1 -= clx; + y1 -= cly; + + /* shallow: x-parametric */ + if ((dy < dx) || (dy < -dx)) + { + SETUP_LINE_SHALLOW + + while (px < rx) + { + y = (yy >> 16); + y += ((yy - (y << 16)) >> 15); + if (prev_y != y) + { + prev_y = y; + p += dh; + py += dely; + } + if (!p1_in) + { + if ((py < 0) && (dely < 0)) return; + if ((py > by) && (dely > 0)) return; + } +#ifdef EVAS_SLI + if (((py) % dc->sli.h) == dc->sli.y) +#endif + { + if (IN_RANGE(px, py, clw, clh)) + pfunc(0, 255, color, p); + } + yy += dyy; + px++; + p++; + } + return; + } + + /* steep: y-parametric */ + + SETUP_LINE_STEEP + + while (py < by) + { + x = (xx >> 16); + x += ((xx - (x << 16)) >> 15); + if (prev_x != x) + { + prev_x = x; + px += delx; + p += delx; + } + if (!p1_in) + { + if ((px < 0) && (delx < 0)) return; + if ((px > rx) && (delx > 0)) return; + } +#ifdef EVAS_SLI + if (((py) % dc->sli.h) == dc->sli.y) +#endif + { + if (IN_RANGE(px, py, clw, clh)) + pfunc(0, 255, color, p); + } + xx += dxx; + py++; + p += dstw; + } +} + + +static void +_evas_draw_line_aa(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1) +{ + int px, py, x, y, prev_x, prev_y; + int dx, dy, rx, by, p0_in, p1_in, dh, a_a = 1; + int delx, dely, xx, yy, dxx, dyy; + int clx, cly, clw, clh; + int dstw; + DATA32 *p, *data, color; + RGBA_Gfx_Pt_Func pfunc; + + if (y0 > y1) + EXCHANGE_POINTS(x0, y0, x1, y1) + dx = x1 - x0; + dy = y1 - y0; + + if ( (dx == 0) || (dy == 0) || (dx == dy) || (dx == -dy) ) + { + _evas_draw_simple_line(dst, dc, x0, y0, x1, y1); + return; + } + + color = dc->col.col; + pfunc = evas_common_gfx_func_composite_mask_color_pt_get(color, dst, dc->render_op); + if (!pfunc) return; + + clx = dc->clip.x; + cly = dc->clip.y; + clw = dc->clip.w; + clh = dc->clip.h; + + data = dst->image.data; + dstw = dst->cache_entry.w; + + data += (dstw * cly) + clx; + x0 -= clx; + y0 -= cly; + x1 -= clx; + y1 -= cly; + + /* shallow: x-parametric */ + if ((dy < dx) || (dy < -dx)) + { + SETUP_LINE_SHALLOW + + while (px < rx) + { + DATA8 aa; + + y = (yy >> 16); + if (prev_y != y) + { + prev_y = y; + p += dh; + py += dely; + } + if (!p1_in) + { + if ((py < -1) && (dely < 0)) return; + if ((py > by) && (dely > 0)) return; + } + if ((unsigned)(px) < clw) + { + aa = ((yy - (y << 16)) >> 8); + if ((unsigned)(py) < clh) + pfunc(0, 255 - aa, color, p); + if ((unsigned)(py + 1) < clh) + pfunc(0, aa, color, p + dstw); + } + yy += dyy; + px++; + p++; + } + return; + } + + /* steep: y-parametric */ + + SETUP_LINE_STEEP + + while (py < by) + { + DATA8 aa; + + x = (xx >> 16); + if (prev_x != x) + { + prev_x = x; + px += delx; + p += delx; + } + if (!p1_in) + { + if ((px < -1) && (delx < 0)) return; + if ((px > rx) && (delx > 0)) return; + } + if ((unsigned)(py) < clh) + { + aa = ((xx - (x << 16)) >> 8); + if ((unsigned)(px) < clw) + pfunc(0, 255 - aa, color, p); + if ((unsigned)(px + 1) < clw) + pfunc(0, aa, color, p + 1); + } + xx += dxx; + py++; + p += dstw; + } +} diff --git a/src/lib/engines/common/evas_op_add/.cvsignore b/src/lib/engines/common/evas_op_add/.cvsignore new file mode 100644 index 0000000..282522d --- /dev/null +++ b/src/lib/engines/common/evas_op_add/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/src/lib/engines/common/evas_op_add/Makefile.am b/src/lib/engines/common/evas_op_add/Makefile.am new file mode 100644 index 0000000..8b2c2f3 --- /dev/null +++ b/src/lib/engines/common/evas_op_add/Makefile.am @@ -0,0 +1,11 @@ +EXTRA_DIST = \ +op_add_color_.c \ +op_add_color_i386.c \ +op_add_mask_color_.c \ +op_add_mask_color_i386.c \ +op_add_pixel_.c \ +op_add_pixel_color_.c \ +op_add_pixel_color_i386.c \ +op_add_pixel_i386.c \ +op_add_pixel_mask_.c \ +op_add_pixel_mask_i386.c diff --git a/src/lib/engines/common/evas_op_add/op_add_color_.c b/src/lib/engines/common/evas_op_add/op_add_color_.c new file mode 100644 index 0000000..214ab67 --- /dev/null +++ b/src/lib/engines/common/evas_op_add/op_add_color_.c @@ -0,0 +1,34 @@ + +/* add color -> dst */ + +#ifdef BUILD_C +static void +init_add_color_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_add_color_pt_funcs_c(void) +{ +} +#endif + +/*-----*/ + +/* add_rel color -> dst */ + +#ifdef BUILD_C +static void +init_add_rel_color_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_add_rel_color_pt_funcs_c(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_add/op_add_color_i386.c b/src/lib/engines/common/evas_op_add/op_add_color_i386.c new file mode 100644 index 0000000..f81d47d --- /dev/null +++ b/src/lib/engines/common/evas_op_add/op_add_color_i386.c @@ -0,0 +1,34 @@ + +/* add color -> dst */ + +#ifdef BUILD_MMX +static void +init_add_color_span_funcs_mmx(void) +{ +} +#endif + +#ifdef BUILD_MMX +static void +init_add_color_pt_funcs_mmx(void) +{ +} +#endif + +/*-----*/ + +/* add_rel color -> dst */ + +#ifdef BUILD_MMX +static void +init_add_rel_color_span_funcs_mmx(void) +{ +} +#endif + +#ifdef BUILD_MMX +static void +init_add_rel_color_pt_funcs_mmx(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_add/op_add_mask_color_.c b/src/lib/engines/common/evas_op_add/op_add_mask_color_.c new file mode 100644 index 0000000..4d903c2 --- /dev/null +++ b/src/lib/engines/common/evas_op_add/op_add_mask_color_.c @@ -0,0 +1,34 @@ + +/* add mask x color -> dst */ + +#ifdef BUILD_C +static void +init_add_mask_color_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_add_mask_color_pt_funcs_c(void) +{ +} +#endif + +/*-----*/ + +/* add_rel mask x color -> dst */ + +#ifdef BUILD_C +static void +init_add_rel_mask_color_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_add_rel_mask_color_pt_funcs_c(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_add/op_add_mask_color_i386.c b/src/lib/engines/common/evas_op_add/op_add_mask_color_i386.c new file mode 100644 index 0000000..bcef9b2 --- /dev/null +++ b/src/lib/engines/common/evas_op_add/op_add_mask_color_i386.c @@ -0,0 +1,34 @@ + +/* add mask x color -> dst */ + +#ifdef BUILD_MMX +static void +init_add_mask_color_span_funcs_mmx(void) +{ +} +#endif + +#ifdef BUILD_MMX +static void +init_add_mask_color_pt_funcs_mmx(void) +{ +} +#endif + +/*-----*/ + +/* add_rel mask x color -> dst */ + +#ifdef BUILD_MMX +static void +init_add_rel_mask_color_span_funcs_mmx(void) +{ +} +#endif + +#ifdef BUILD_MMX +static void +init_add_rel_mask_color_pt_funcs_mmx(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_add/op_add_pixel_.c b/src/lib/engines/common/evas_op_add/op_add_pixel_.c new file mode 100644 index 0000000..b2a6cf1 --- /dev/null +++ b/src/lib/engines/common/evas_op_add/op_add_pixel_.c @@ -0,0 +1,34 @@ + +/* add pixel --> dst */ + +#ifdef BUILD_C +static void +init_add_pixel_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_add_pixel_pt_funcs_c(void) +{ +} +#endif + +/*-----*/ + +/* add_rel pixel --> dst */ + +#ifdef BUILD_C +static void +init_add_rel_pixel_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_add_rel_pixel_pt_funcs_c(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_add/op_add_pixel_color_.c b/src/lib/engines/common/evas_op_add/op_add_pixel_color_.c new file mode 100644 index 0000000..35c8fab --- /dev/null +++ b/src/lib/engines/common/evas_op_add/op_add_pixel_color_.c @@ -0,0 +1,34 @@ + +/* add pixel x color --> dst */ + +#ifdef BUILD_C +static void +init_add_pixel_color_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_add_pixel_color_pt_funcs_c(void) +{ +} +#endif + +/*-----*/ + +/* add_rel pixel x color --> dst */ + +#ifdef BUILD_C +static void +init_add_rel_pixel_color_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_add_rel_pixel_color_pt_funcs_c(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_add/op_add_pixel_color_i386.c b/src/lib/engines/common/evas_op_add/op_add_pixel_color_i386.c new file mode 100644 index 0000000..ce65d45 --- /dev/null +++ b/src/lib/engines/common/evas_op_add/op_add_pixel_color_i386.c @@ -0,0 +1,30 @@ + +/* add pixel x color --> dst */ + +#ifdef BUILD_MMX +static void +init_add_pixel_color_span_funcs_mmx(void) +{ } +#endif + +#ifdef BUILD_MMX +static void +init_add_pixel_color_pt_funcs_mmx(void) +{ } +#endif + +/*-----*/ + +/* add_rel pixel x color --> dst */ + +#ifdef BUILD_MMX +static void +init_add_rel_pixel_color_span_funcs_mmx(void) +{ } +#endif + +#ifdef BUILD_MMX +static void +init_add_rel_pixel_color_pt_funcs_mmx(void) +{ } +#endif diff --git a/src/lib/engines/common/evas_op_add/op_add_pixel_i386.c b/src/lib/engines/common/evas_op_add/op_add_pixel_i386.c new file mode 100644 index 0000000..01497b2 --- /dev/null +++ b/src/lib/engines/common/evas_op_add/op_add_pixel_i386.c @@ -0,0 +1,34 @@ + +/* add pixel --> dst */ + +#ifdef BUILD_MMX +static void +init_add_pixel_span_funcs_mmx(void) +{ +} +#endif + +#ifdef BUILD_MMX +static void +init_add_pixel_pt_funcs_mmx(void) +{ +} +#endif + +/*-----*/ + +/* add_rel pixel --> dst */ + +#ifdef BUILD_MMX +static void +init_add_rel_pixel_span_funcs_mmx(void) +{ +} +#endif + +#ifdef BUILD_MMX +static void +init_add_rel_pixel_pt_funcs_mmx(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_add/op_add_pixel_mask_.c b/src/lib/engines/common/evas_op_add/op_add_pixel_mask_.c new file mode 100644 index 0000000..70c5d9d --- /dev/null +++ b/src/lib/engines/common/evas_op_add/op_add_pixel_mask_.c @@ -0,0 +1,34 @@ + +/* add pixel x mask --> dst */ + +#ifdef BUILD_C +static void +init_add_pixel_mask_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_add_pixel_mask_pt_funcs_c(void) +{ +} +#endif + +/*-----*/ + +/* add_rel pixel x mask --> dst */ + +#ifdef BUILD_C +static void +init_add_rel_pixel_mask_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_add_rel_pixel_mask_pt_funcs_c(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_add/op_add_pixel_mask_i386.c b/src/lib/engines/common/evas_op_add/op_add_pixel_mask_i386.c new file mode 100644 index 0000000..746d11d --- /dev/null +++ b/src/lib/engines/common/evas_op_add/op_add_pixel_mask_i386.c @@ -0,0 +1,34 @@ + +/* add pixel x mask -> dst */ + +#ifdef BUILD_MMX +static void +init_add_pixel_mask_span_funcs_mmx(void) +{ +} +#endif + +#ifdef BUILD_MMX +static void +init_add_pixel_mask_pt_funcs_mmx(void) +{ +} +#endif + +/*-----*/ + +/* add_rel pixel x mask -> dst */ + +#ifdef BUILD_MMX +static void +init_add_rel_pixel_mask_span_funcs_mmx(void) +{ +} +#endif + +#ifdef BUILD_MMX +static void +init_add_rel_pixel_mask_pt_funcs_mmx(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_add_main_.c b/src/lib/engines/common/evas_op_add_main_.c new file mode 100644 index 0000000..83121f5 --- /dev/null +++ b/src/lib/engines/common/evas_op_add_main_.c @@ -0,0 +1,546 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" + +static RGBA_Gfx_Func op_add_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; +static RGBA_Gfx_Pt_Func op_add_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; + +static void op_add_init(void); +static void op_add_shutdown(void); + +static RGBA_Gfx_Func op_add_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_add_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_add_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_add_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_add_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); + +static RGBA_Gfx_Pt_Func op_add_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_add_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_add_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_add_mask_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_add_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); + +static RGBA_Gfx_Compositor _composite_add = { "add", + op_add_init, op_add_shutdown, + op_add_pixel_span_get, op_add_color_span_get, + op_add_pixel_color_span_get, op_add_mask_color_span_get, + op_add_pixel_mask_span_get, + op_add_pixel_pt_get, op_add_color_pt_get, + op_add_pixel_color_pt_get, op_add_mask_color_pt_get, + op_add_pixel_mask_pt_get + }; + +RGBA_Gfx_Compositor * +evas_common_gfx_compositor_add_get(void) +{ + return &(_composite_add); +} + +static RGBA_Gfx_Func op_add_rel_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; +static RGBA_Gfx_Pt_Func op_add_rel_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; + +static void op_add_rel_init(void); +static void op_add_rel_shutdown(void); + +static RGBA_Gfx_Func op_add_rel_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_add_rel_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_add_rel_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_add_rel_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_add_rel_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); + +static RGBA_Gfx_Pt_Func op_add_rel_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_add_rel_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_add_rel_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_add_rel_mask_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_add_rel_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); + +static RGBA_Gfx_Compositor _composite_add_rel = { "add_rel", + op_add_rel_init, op_add_rel_shutdown, + op_add_rel_pixel_span_get, op_add_rel_color_span_get, + op_add_rel_pixel_color_span_get, op_add_rel_mask_color_span_get, + op_add_rel_pixel_mask_span_get, + op_add_rel_pixel_pt_get, op_add_rel_color_pt_get, + op_add_rel_pixel_color_pt_get, op_add_rel_mask_color_pt_get, + op_add_rel_pixel_mask_pt_get + }; + +RGBA_Gfx_Compositor * +evas_common_gfx_compositor_add_rel_get(void) +{ + return &(_composite_add_rel); +} + + +# include "./evas_op_add/op_add_pixel_.c" +# include "./evas_op_add/op_add_color_.c" +# include "./evas_op_add/op_add_pixel_color_.c" +# include "./evas_op_add/op_add_pixel_mask_.c" +# include "./evas_op_add/op_add_mask_color_.c" +//# include "./evas_op_add/op_add_pixel_mask_color_.c" + +# include "./evas_op_add/op_add_pixel_i386.c" +# include "./evas_op_add/op_add_color_i386.c" +# include "./evas_op_add/op_add_pixel_color_i386.c" +# include "./evas_op_add/op_add_pixel_mask_i386.c" +# include "./evas_op_add/op_add_mask_color_i386.c" +//# include "op_add_pixel_mask_color_.c" + +static void +op_add_init(void) +{ + memset(op_add_span_funcs, 0, sizeof(op_add_span_funcs)); + memset(op_add_pt_funcs, 0, sizeof(op_add_pt_funcs)); +#ifdef BUILD_MMX + init_add_pixel_span_funcs_mmx(); + init_add_pixel_color_span_funcs_mmx(); + init_add_pixel_mask_span_funcs_mmx(); + init_add_color_span_funcs_mmx(); + init_add_mask_color_span_funcs_mmx(); + + init_add_pixel_pt_funcs_mmx(); + init_add_pixel_color_pt_funcs_mmx(); + init_add_pixel_mask_pt_funcs_mmx(); + init_add_color_pt_funcs_mmx(); + init_add_mask_color_pt_funcs_mmx(); +#endif +#ifdef BUILD_C + init_add_pixel_span_funcs_c(); + init_add_pixel_color_span_funcs_c(); + init_add_rel_pixel_mask_span_funcs_c(); + init_add_color_span_funcs_c(); + init_add_mask_color_span_funcs_c(); + + init_add_pixel_pt_funcs_c(); + init_add_pixel_color_pt_funcs_c(); + init_add_rel_pixel_mask_pt_funcs_c(); + init_add_color_pt_funcs_c(); + init_add_mask_color_pt_funcs_c(); +#endif +} + +static void +op_add_shutdown(void) +{ +} + +static RGBA_Gfx_Func +add_gfx_span_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_add_span_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_add_span_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Func +op_add_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_add_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_add_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + s = SP; + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_add_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_add_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +add_gfx_pt_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Pt_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_add_pt_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_add_pt_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Pt_Func +op_add_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_add_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_add_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_add_mask_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_add_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_gfx_pt_func_cpu(s, m, c, d); +} + + + +static void +op_add_rel_init(void) +{ + memset(op_add_rel_span_funcs, 0, sizeof(op_add_rel_span_funcs)); + memset(op_add_rel_pt_funcs, 0, sizeof(op_add_rel_pt_funcs)); +#ifdef BUILD_MMX + init_add_rel_pixel_span_funcs_mmx(); + init_add_rel_pixel_color_span_funcs_mmx(); + init_add_rel_pixel_mask_span_funcs_mmx(); + init_add_rel_color_span_funcs_mmx(); + init_add_rel_mask_color_span_funcs_mmx(); + + init_add_rel_pixel_pt_funcs_mmx(); + init_add_rel_pixel_color_pt_funcs_mmx(); + init_add_rel_pixel_mask_pt_funcs_mmx(); + init_add_rel_color_pt_funcs_mmx(); + init_add_rel_mask_color_pt_funcs_mmx(); +#endif +#ifdef BUILD_C + init_add_rel_pixel_span_funcs_c(); + init_add_rel_pixel_color_span_funcs_c(); + init_add_rel_pixel_mask_span_funcs_c(); + init_add_rel_color_span_funcs_c(); + init_add_rel_mask_color_span_funcs_c(); + + init_add_rel_pixel_pt_funcs_c(); + init_add_rel_pixel_color_pt_funcs_c(); + init_add_rel_pixel_mask_pt_funcs_c(); + init_add_rel_color_pt_funcs_c(); + init_add_rel_mask_color_pt_funcs_c(); +#endif +} + +static void +op_add_rel_shutdown(void) +{ +} + +static RGBA_Gfx_Func +add_rel_gfx_span_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_add_rel_span_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_add_rel_span_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Func +op_add_rel_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_add_rel_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_add_rel_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + s = SP; + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_add_rel_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_add_rel_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +add_rel_gfx_pt_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Pt_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_add_rel_pt_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_add_rel_pt_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Pt_Func +op_add_rel_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_rel_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_add_rel_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_rel_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_add_rel_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_rel_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_add_rel_mask_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_rel_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_add_rel_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return add_rel_gfx_pt_func_cpu(s, m, c, d); +} diff --git a/src/lib/engines/common/evas_op_blend/.cvsignore b/src/lib/engines/common/evas_op_blend/.cvsignore new file mode 100644 index 0000000..282522d --- /dev/null +++ b/src/lib/engines/common/evas_op_blend/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/src/lib/engines/common/evas_op_blend/Makefile.am b/src/lib/engines/common/evas_op_blend/Makefile.am new file mode 100644 index 0000000..196dbd0 --- /dev/null +++ b/src/lib/engines/common/evas_op_blend/Makefile.am @@ -0,0 +1,11 @@ +EXTRA_DIST = \ +op_blend_color_.c \ +op_blend_color_i386.c \ +op_blend_mask_color_.c \ +op_blend_mask_color_i386.c \ +op_blend_pixel_.c \ +op_blend_pixel_color_.c \ +op_blend_pixel_color_i386.c \ +op_blend_pixel_i386.c \ +op_blend_pixel_mask_.c \ +op_blend_pixel_mask_i386.c diff --git a/src/lib/engines/common/evas_op_blend/op_blend_color_.c b/src/lib/engines/common/evas_op_blend/op_blend_color_.c new file mode 100644 index 0000000..667f5f2 --- /dev/null +++ b/src/lib/engines/common/evas_op_blend/op_blend_color_.c @@ -0,0 +1,110 @@ + +/* blend color -> dst */ + +#ifdef BUILD_C +static void +_op_blend_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l, a = 256 - (c >> 24); + while (d < e) + { + *d = c + MUL_256(a, *d); + d++; + } +} + +#define _op_blend_caa_dp _op_blend_c_dp + +#define _op_blend_c_dpan _op_blend_c_dp +#define _op_blend_caa_dpan _op_blend_c_dpan + +static void +init_blend_color_span_funcs_c(void) +{ + op_blend_span_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_blend_c_dp; + op_blend_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_blend_caa_dp; + + op_blend_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_blend_c_dpan; + op_blend_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_blend_pt_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = 256 - (c >> 24); + *d = c + MUL_256(s, *d); +} + +#define _op_blend_pt_caa_dp _op_blend_pt_c_dp + +#define _op_blend_pt_c_dpan _op_blend_pt_c_dp +#define _op_blend_pt_caa_dpan _op_blend_pt_c_dpan + +#define _op_blend_pt_c_dpas _op_blend_pt_c_dp +#define _op_blend_pt_caa_dpas _op_blend_pt_c_dp + +static void +init_blend_color_pt_funcs_c(void) +{ + op_blend_pt_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_blend_pt_c_dp; + op_blend_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_blend_pt_caa_dp; + + op_blend_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_blend_pt_c_dpan; + op_blend_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_pt_caa_dpan; +} +#endif + +/*-----*/ + +/* blend_rel color -> dst */ + +#ifdef BUILD_C +static void +_op_blend_rel_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + l = 256 - (c >> 24); + while (d < e) + { + *d = MUL_SYM(*d >> 24, c) + MUL_256(l, *d); + d++; + } +} + +#define _op_blend_rel_caa_dp _op_blend_rel_c_dp + +#define _op_blend_rel_c_dpan _op_blend_c_dpan +#define _op_blend_rel_caa_dpan _op_blend_caa_dpan + +static void +init_blend_rel_color_span_funcs_c(void) +{ + op_blend_rel_span_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_blend_rel_c_dp; + op_blend_rel_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_blend_rel_caa_dp; + + op_blend_rel_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_blend_rel_c_dpan; + op_blend_rel_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_rel_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_blend_rel_pt_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = *d >> 24; + *d = MUL_SYM(s, c) + MUL_256(256 - (c >> 24), *d); +} + +#define _op_blend_rel_pt_caa_dp _op_blend_rel_pt_c_dp + +#define _op_blend_rel_pt_c_dpan _op_blend_pt_c_dpan +#define _op_blend_rel_pt_caa_dpan _op_blend_pt_caa_dpan + +static void +init_blend_rel_color_pt_funcs_c(void) +{ + op_blend_rel_pt_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_blend_rel_pt_c_dp; + op_blend_rel_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_blend_rel_pt_caa_dp; + + op_blend_rel_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_blend_rel_pt_c_dpan; + op_blend_rel_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_rel_pt_caa_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_blend/op_blend_color_i386.c b/src/lib/engines/common/evas_op_blend/op_blend_color_i386.c new file mode 100644 index 0000000..d6c921b --- /dev/null +++ b/src/lib/engines/common/evas_op_blend/op_blend_color_i386.c @@ -0,0 +1,139 @@ + +/* blend color --> dst */ + +#ifdef BUILD_MMX +static void +_op_blend_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm2, mm0) + c = 256 - (c >> 24); + MOV_A2R(c, mm3) + while (d < e) { + MOV_P2R(*d, mm1, mm0) + MUL4_256_R2R(mm3, mm1) + paddw_r2r(mm2, mm1); + MOV_R2P(mm1, *d, mm0) + d++; + } +} + +#define _op_blend_caa_dp_mmx _op_blend_c_dp_mmx + +#define _op_blend_c_dpan_mmx _op_blend_c_dp_mmx +#define _op_blend_caa_dpan_mmx _op_blend_c_dpan_mmx + +static void +init_blend_color_span_funcs_mmx(void) +{ + op_blend_span_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_blend_c_dp_mmx; + op_blend_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_caa_dp_mmx; + + op_blend_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_c_dpan_mmx; + op_blend_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_caa_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_blend_pt_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm2, mm0) + c = 256 - (c >> 24); + MOV_A2R(c, mm3) + MOV_P2R(*d, mm1, mm0) + MUL4_256_R2R(mm3, mm1) + paddw_r2r(mm2, mm1); + MOV_R2P(mm1, *d, mm0) +} + +#define _op_blend_pt_caa_dp_mmx _op_blend_pt_c_dp_mmx + +#define _op_blend_pt_c_dpan_mmx _op_blend_pt_c_dp_mmx +#define _op_blend_pt_caa_dpan_mmx _op_blend_pt_c_dpan_mmx + +static void +init_blend_color_pt_funcs_mmx(void) +{ + op_blend_pt_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_blend_pt_c_dp_mmx; + op_blend_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_pt_caa_dp_mmx; + + op_blend_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_pt_c_dpan_mmx; + op_blend_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_pt_caa_dpan_mmx; +} +#endif +/*-----*/ + +/* blend_rel color -> dst */ + +#ifdef BUILD_MMX +static void +_op_blend_rel_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm2, mm0) + c = 256 - (c >> 24); + MOV_A2R(c, mm3) + MOV_A2R(ALPHA_255, mm5) + while (d < e) { + MOV_P2R(*d, mm1, mm0) + MOV_RA2R(mm1, mm4) + MUL4_256_R2R(mm3, mm1) + MUL4_SYM_R2R(mm2, mm4, mm5) + paddw_r2r(mm4, mm1); + MOV_R2P(mm1, *d, mm0) + d++; + } +} + +#define _op_blend_rel_caa_dp_mmx _op_blend_rel_c_dp_mmx + +#define _op_blend_rel_c_dpan_mmx _op_blend_c_dpan_mmx +#define _op_blend_rel_caa_dpan_mmx _op_blend_caa_dpan_mmx + +static void +init_blend_rel_color_span_funcs_mmx(void) +{ + op_blend_rel_span_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_blend_rel_c_dp_mmx; + op_blend_rel_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_rel_caa_dp_mmx; + + op_blend_rel_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_rel_c_dpan_mmx; + op_blend_rel_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_caa_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_blend_rel_pt_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_256, mm6) + MOV_A2R(ALPHA_255, mm5) + + MOV_P2R(c, mm2, mm0) + MOV_RA2R(mm2, mm1) + psubw_r2r(mm1, mm6); + + MOV_P2R(*d, mm1, mm0) + MOV_RA2R(mm1, mm4) + MUL4_256_R2R(mm6, mm1) + + MUL4_SYM_R2R(mm4, mm2, mm5) + paddw_r2r(mm2, mm1); + MOV_R2P(mm1, *d, mm0) +} + +#define _op_blend_rel_pt_caa_dp_mmx _op_blend_rel_pt_c_dp_mmx + +#define _op_blend_rel_pt_c_dpan_mmx _op_blend_pt_c_dpan_mmx +#define _op_blend_rel_pt_caa_dpan_mmx _op_blend_pt_caa_dpan_mmx + +static void +init_blend_rel_color_pt_funcs_mmx(void) +{ + op_blend_rel_pt_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_blend_rel_pt_c_dp_mmx; + op_blend_rel_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_rel_pt_caa_dp_mmx; + + op_blend_rel_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_rel_pt_c_dpan_mmx; + op_blend_rel_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_pt_caa_dpan_mmx; +} +#endif diff --git a/src/lib/engines/common/evas_op_blend/op_blend_mask_color_.c b/src/lib/engines/common/evas_op_blend/op_blend_mask_color_.c new file mode 100644 index 0000000..c88b0fe --- /dev/null +++ b/src/lib/engines/common/evas_op_blend/op_blend_mask_color_.c @@ -0,0 +1,181 @@ + +/* blend mask x color -> dst */ + +#ifdef BUILD_C +static void +_op_blend_mas_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + l = 256 - (c >> 24); + while (d < e) { + DATA32 a = *m; + switch(a) + { + case 0: + break; + case 255: + *d = c + MUL_256(l, *d); + break; + default: + { + DATA32 mc = MUL_SYM(a, c); + a = 256 - (mc >> 24); + *d = mc + MUL_256(a, *d); + } + break; + } + m++; d++; + } +} + +static void +_op_blend_mas_can_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + case 255: + *d = c; + break; + default: + l++; + *d = INTERP_256(l, c, *d); + break; + } + m++; d++; + } +} + +#define _op_blend_mas_cn_dp _op_blend_mas_can_dp +#define _op_blend_mas_caa_dp _op_blend_mas_c_dp + +#define _op_blend_mas_c_dpan _op_blend_mas_c_dp +#define _op_blend_mas_cn_dpan _op_blend_mas_cn_dp +#define _op_blend_mas_can_dpan _op_blend_mas_can_dp +#define _op_blend_mas_caa_dpan _op_blend_mas_caa_dp + +static void +init_blend_mask_color_span_funcs_c(void) +{ + op_blend_span_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_blend_mas_c_dp; + op_blend_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_C] = _op_blend_mas_cn_dp; + op_blend_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_blend_mas_can_dp; + op_blend_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_blend_mas_caa_dp; + + op_blend_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_blend_mas_c_dpan; + op_blend_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_mas_cn_dpan; + op_blend_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_blend_mas_can_dpan; + op_blend_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_blend_mas_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_blend_pt_mas_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = MUL_SYM(m, c); + m = 256 - (s >> 24); + *d = s + MUL_256(m, *d); +} + +static void +_op_blend_pt_mas_can_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = INTERP_256(m + 1, c, *d); +} + +#define _op_blend_pt_mas_cn_dp _op_blend_pt_mas_can_dp +#define _op_blend_pt_mas_caa_dp _op_blend_pt_mas_c_dp + +#define _op_blend_pt_mas_c_dpan _op_blend_pt_mas_c_dp +#define _op_blend_pt_mas_cn_dpan _op_blend_pt_mas_cn_dp +#define _op_blend_pt_mas_can_dpan _op_blend_pt_mas_can_dp +#define _op_blend_pt_mas_caa_dpan _op_blend_pt_mas_caa_dp + +static void +init_blend_mask_color_pt_funcs_c(void) +{ + op_blend_pt_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_blend_pt_mas_c_dp; + op_blend_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_C] = _op_blend_pt_mas_cn_dp; + op_blend_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_blend_pt_mas_can_dp; + op_blend_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_blend_pt_mas_caa_dp; + + op_blend_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_blend_pt_mas_c_dpan; + op_blend_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_pt_mas_cn_dpan; + op_blend_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_blend_pt_mas_can_dpan; + op_blend_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_blend_pt_mas_caa_dpan; +} +#endif + +/*-----*/ + +/* blend_rel mask x color --> dst */ + +#ifdef BUILD_C +static void +_op_blend_rel_mas_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + DATA32 mc = MUL_SYM(*m, c); + l = 256 - (mc >> 24); + *d = MUL_SYM(*d >> 24, mc) + MUL_256(l, *d); + d++; + m++; + } +} + +#define _op_blend_rel_mas_cn_dp _op_blend_rel_mas_c_dp +#define _op_blend_rel_mas_can_dp _op_blend_rel_mas_c_dp +#define _op_blend_rel_mas_caa_dp _op_blend_rel_mas_c_dp + +#define _op_blend_rel_mas_c_dpan _op_blend_mas_c_dpan +#define _op_blend_rel_mas_cn_dpan _op_blend_mas_cn_dpan +#define _op_blend_rel_mas_can_dpan _op_blend_mas_can_dpan +#define _op_blend_rel_mas_caa_dpan _op_blend_mas_caa_dpan + +static void +init_blend_rel_mask_color_span_funcs_c(void) +{ + op_blend_rel_span_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_blend_rel_mas_c_dp; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_C] = _op_blend_rel_mas_can_dp; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_blend_rel_mas_can_dp; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_blend_rel_mas_caa_dp; + + op_blend_rel_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_blend_rel_mas_c_dpan; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_rel_mas_cn_dpan; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_blend_rel_mas_can_dpan; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_blend_rel_mas_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_blend_rel_pt_mas_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = MUL_SYM(m, c); + c = 256 - (s >> 24); + *d = MUL_SYM(*d >> 24, s) + MUL_256(c, *d); +} + +#define _op_blend_rel_pt_mas_cn_dp _op_blend_rel_pt_mas_c_dp +#define _op_blend_rel_pt_mas_can_dp _op_blend_rel_pt_mas_c_dp +#define _op_blend_rel_pt_mas_caa_dp _op_blend_rel_pt_mas_c_dp + +#define _op_blend_rel_pt_mas_c_dpan _op_blend_pt_mas_c_dpan +#define _op_blend_rel_pt_mas_cn_dpan _op_blend_pt_mas_cn_dpan +#define _op_blend_rel_pt_mas_can_dpan _op_blend_pt_mas_can_dpan +#define _op_blend_rel_pt_mas_caa_dpan _op_blend_pt_mas_caa_dpan + +static void +init_blend_rel_mask_color_pt_funcs_c(void) +{ + op_blend_rel_pt_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_blend_rel_pt_mas_c_dp; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_C] = _op_blend_rel_pt_mas_cn_dp; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_blend_rel_pt_mas_can_dp; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_blend_rel_pt_mas_caa_dp; + + op_blend_rel_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_blend_rel_pt_mas_c_dpan; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_rel_pt_mas_cn_dpan; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_blend_rel_pt_mas_can_dpan; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_blend_rel_pt_mas_caa_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_blend/op_blend_mask_color_i386.c b/src/lib/engines/common/evas_op_blend/op_blend_mask_color_i386.c new file mode 100644 index 0000000..a9ecfc4 --- /dev/null +++ b/src/lib/engines/common/evas_op_blend/op_blend_mask_color_i386.c @@ -0,0 +1,252 @@ + +/* blend mask x color -> dst */ + +#ifdef BUILD_MMX +static void +_op_blend_mas_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_256, mm6) + MOV_P2R(c, mm2, mm0) + c = 256 - (c >> 24); + MOV_A2R(c, mm4) + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + case 255: + MOV_P2R(*d, mm1, mm0) + MUL4_256_R2R(mm4, mm1) + paddw_r2r(mm2, mm1); + MOV_R2P(mm1, *d, mm0) + break; + default: + l++; + MOV_A2R(l, mm3) + MUL4_256_R2R(mm2, mm3) + + MOV_RA2R(mm3, mm1) + movq_r2r(mm6, mm7); + psubw_r2r(mm1, mm7); + + MOV_P2R(*d, mm1, mm0) + MUL4_256_R2R(mm7, mm1) + + paddw_r2r(mm3, mm1); + MOV_R2P(mm1, *d, mm0) + break; + } + m++; d++; + } +} + +static void +_op_blend_mas_can_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm2, mm0) + MOV_A2R(ALPHA_255, mm5) + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + case 255: + *d = c; + break; + default: + l++; + MOV_A2R(l, mm3) + MOV_P2R(*d, mm1, mm0) + movq_r2r(mm2, mm4); + INTERP_256_R2R(mm3, mm4, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + break; + } + m++; d++; + } +} + +#define _op_blend_mas_cn_dp_mmx _op_blend_mas_can_dp_mmx +#define _op_blend_mas_caa_dp_mmx _op_blend_mas_c_dp_mmx + +#define _op_blend_mas_c_dpan_mmx _op_blend_mas_c_dp_mmx +#define _op_blend_mas_cn_dpan_mmx _op_blend_mas_cn_dp_mmx +#define _op_blend_mas_can_dpan_mmx _op_blend_mas_can_dp_mmx +#define _op_blend_mas_caa_dpan_mmx _op_blend_mas_caa_dp_mmx + +static void +init_blend_mask_color_span_funcs_mmx(void) +{ + op_blend_span_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_blend_mas_c_dp_mmx; + op_blend_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_mas_cn_dp_mmx; + op_blend_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_blend_mas_can_dp_mmx; + op_blend_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_blend_mas_caa_dp_mmx; + + op_blend_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_blend_mas_c_dpan_mmx; + op_blend_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_mas_cn_dpan_mmx; + op_blend_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_blend_mas_can_dpan_mmx; + op_blend_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_blend_mas_caa_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_blend_pt_mas_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = m + 1; + MOV_A2R(s, mm3) + MOV_A2R(ALPHA_256, mm6) + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm2, mm0) + MUL4_256_R2R(mm2, mm3) + + MOV_RA2R(mm3, mm1) + psubw_r2r(mm1, mm6); + + MOV_P2R(*d, mm1, mm0) + MUL4_256_R2R(mm6, mm1) + + paddw_r2r(mm3, mm1); + MOV_R2P(mm1, *d, mm0) +} + + +#define _op_blend_pt_mas_cn_dp_mmx _op_blend_pt_mas_c_dp_mmx +#define _op_blend_pt_mas_can_dp_mmx _op_blend_pt_mas_c_dp_mmx +#define _op_blend_pt_mas_caa_dp_mmx _op_blend_pt_mas_c_dp_mmx + +#define _op_blend_pt_mas_c_dpan_mmx _op_blend_pt_mas_c_dp_mmx +#define _op_blend_pt_mas_cn_dpan_mmx _op_blend_pt_mas_cn_dp_mmx +#define _op_blend_pt_mas_can_dpan_mmx _op_blend_pt_mas_can_dp_mmx +#define _op_blend_pt_mas_caa_dpan_mmx _op_blend_pt_mas_caa_dp_mmx + +static void +init_blend_mask_color_pt_funcs_mmx(void) +{ + op_blend_pt_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_blend_pt_mas_c_dp_mmx; + op_blend_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pt_mas_cn_dp_mmx; + op_blend_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_blend_pt_mas_can_dp_mmx; + op_blend_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_blend_pt_mas_caa_dp_mmx; + + op_blend_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_blend_pt_mas_c_dpan_mmx; + op_blend_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_mas_cn_dpan_mmx; + op_blend_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_blend_pt_mas_can_dpan_mmx; + op_blend_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_blend_pt_mas_caa_dpan_mmx; +} +#endif + +/*-----*/ + +/* blend_rel mask x color -> dst */ + +#ifdef BUILD_MMX +static void +_op_blend_rel_mas_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_256, mm6) + MOV_A2R(ALPHA_255, mm5) + MOV_P2R(c, mm2, mm0) + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + default: + l++; + MOV_A2R(l, mm3) + MUL4_256_R2R(mm2, mm3) + + MOV_RA2R(mm3, mm1) + movq_r2r(mm6, mm7); + psubw_r2r(mm1, mm7); + + MOV_P2R(*d, mm1, mm0) + MOV_RA2R(mm1, mm4) + MUL4_256_R2R(mm7, mm1) + + MUL4_SYM_R2R(mm4, mm3, mm5) + + paddw_r2r(mm3, mm1); + MOV_R2P(mm1, *d, mm0) + break; + } + m++; d++; + } +} + +#define _op_blend_rel_mas_cn_dp_mmx _op_blend_rel_mas_c_dp_mmx +#define _op_blend_rel_mas_can_dp_mmx _op_blend_rel_mas_c_dp_mmx +#define _op_blend_rel_mas_caa_dp_mmx _op_blend_rel_mas_c_dp_mmx + +#define _op_blend_rel_mas_c_dpan_mmx _op_blend_mas_c_dpan_mmx +#define _op_blend_rel_mas_cn_dpan_mmx _op_blend_mas_cn_dpan_mmx +#define _op_blend_rel_mas_can_dpan_mmx _op_blend_mas_can_dpan_mmx +#define _op_blend_rel_mas_caa_dpan_mmx _op_blend_mas_caa_dpan_mmx + +static void +init_blend_rel_mask_color_span_funcs_mmx(void) +{ + op_blend_rel_span_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_blend_rel_mas_c_dp_mmx; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_rel_mas_cn_dp_mmx; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_blend_rel_mas_can_dp_mmx; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_blend_rel_mas_caa_dp_mmx; + + op_blend_rel_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_blend_rel_mas_c_dpan_mmx; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_mas_cn_dpan_mmx; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_mas_can_dpan_mmx; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_mas_caa_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_blend_rel_pt_mas_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_256, mm6) + MOV_A2R(ALPHA_255, mm5) + s = m + 1; + MOV_A2R(s, mm3) + MOV_P2R(c, mm2, mm0) + MUL4_256_R2R(mm2, mm3) + + MOV_RA2R(mm3, mm1) + psubw_r2r(mm1, mm6); + + MOV_P2R(*d, mm1, mm0) + MOV_RA2R(mm1, mm4) + MUL4_256_R2R(mm6, mm1) + + MUL4_SYM_R2R(mm4, mm3, mm5) + + paddw_r2r(mm3, mm1); + MOV_R2P(mm1, *d, mm0) +} + +#define _op_blend_rel_pt_mas_cn_dp_mmx _op_blend_rel_pt_mas_c_dp_mmx +#define _op_blend_rel_pt_mas_can_dp_mmx _op_blend_rel_pt_mas_c_dp_mmx +#define _op_blend_rel_pt_mas_caa_dp_mmx _op_blend_rel_pt_mas_c_dp_mmx + +#define _op_blend_rel_pt_mas_c_dpan_mmx _op_blend_pt_mas_c_dpan_mmx +#define _op_blend_rel_pt_mas_cn_dpan_mmx _op_blend_pt_mas_cn_dpan_mmx +#define _op_blend_rel_pt_mas_can_dpan_mmx _op_blend_pt_mas_can_dpan_mmx +#define _op_blend_rel_pt_mas_caa_dpan_mmx _op_blend_pt_mas_caa_dpan_mmx + +static void +init_blend_rel_mask_color_pt_funcs_mmx(void) +{ + op_blend_rel_pt_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_blend_rel_pt_mas_c_dp_mmx; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_rel_pt_mas_cn_dp_mmx; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_blend_rel_pt_mas_can_dp_mmx; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_blend_rel_pt_mas_caa_dp_mmx; + + op_blend_rel_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_blend_rel_pt_mas_c_dpan_mmx; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_mas_cn_dpan_mmx; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_pt_mas_can_dpan_mmx; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_pt_mas_caa_dpan_mmx; +} +#endif diff --git a/src/lib/engines/common/evas_op_blend/op_blend_pixel_.c b/src/lib/engines/common/evas_op_blend/op_blend_pixel_.c new file mode 100644 index 0000000..25c1b06 --- /dev/null +++ b/src/lib/engines/common/evas_op_blend/op_blend_pixel_.c @@ -0,0 +1,157 @@ + +/* blend pixel --> dst */ + +#ifdef BUILD_C +static void +_op_blend_p_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + l = 256 - (*s >> 24); + *d = *s++ + MUL_256(l, *d); + d++; + } +} + +static void +_op_blend_pas_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) + { + switch (*s & 0xff000000) + { + case 0: + break; + case 0xff000000: + *d = *s; + break; + default : + l = 256 - (*s >> 24); + *d = *s + MUL_256(l, *d); + break; + } + s++; d++; + } +} + +#define _op_blend_pan_dp NULL + +#define _op_blend_p_dpan _op_blend_p_dp +#define _op_blend_pas_dpan _op_blend_pas_dp +#define _op_blend_pan_dpan _op_blend_pan_dp + +static void +init_blend_pixel_span_funcs_c(void) +{ + op_blend_span_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_blend_p_dp; + op_blend_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_blend_pas_dp; + op_blend_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_blend_pan_dp; + + op_blend_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_p_dpan; + op_blend_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_pas_dpan; + op_blend_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_pan_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_blend_pt_p_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + c = 256 - (s >> 24); + *d = s + MUL_256(c, *d); +} + +#define _op_blend_pt_pas_dp _op_blend_pt_p_dp +#define _op_blend_pt_pan_dp NULL + +#define _op_blend_pt_p_dpan _op_blend_pt_p_dp +#define _op_blend_pt_pan_dpan _op_blend_pt_pan_dp +#define _op_blend_pt_pas_dpan _op_blend_pt_pas_dp + +static void +init_blend_pixel_pt_funcs_c(void) +{ + op_blend_pt_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_blend_pt_p_dp; + op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_blend_pt_pas_dp; + op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_blend_pt_pan_dp; + + op_blend_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_pt_p_dpan; + op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_pt_pas_dpan; + op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_pt_pan_dpan; +} +#endif + +/*-----*/ + +/* blend_rel pixel -> dst */ + +#ifdef BUILD_C +static void +_op_blend_rel_p_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + l = 256 - (*s >> 24); + c = 1 + (*d >> 24); + *d = MUL_256(c, *s) + MUL_256(l, *d); + d++; + s++; + } +} + +static void +_op_blend_rel_pan_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + c = 1 + (*d >> 24); + *d++ = MUL_256(c, *s); + s++; + } +} + +#define _op_blend_rel_pas_dp _op_blend_rel_p_dp + +#define _op_blend_rel_p_dpan _op_blend_p_dpan +#define _op_blend_rel_pan_dpan _op_blend_pan_dpan +#define _op_blend_rel_pas_dpan _op_blend_pas_dpan + +static void +init_blend_rel_pixel_span_funcs_c(void) +{ + op_blend_rel_span_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_blend_rel_p_dp; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_blend_rel_pas_dp; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_blend_rel_pan_dp; + + op_blend_rel_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_rel_p_dpan; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_rel_pas_dpan; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_rel_pan_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_blend_rel_pt_p_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + c = 256 - (s >> 24); + *d = MUL_SYM(*d >> 24, s) + MUL_256(c, *d); +} + +static void +_op_blend_rel_pt_pan_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = MUL_SYM(*d >> 24, s); +} + +#define _op_blend_rel_pt_pas_dp _op_blend_rel_pt_p_dp + +#define _op_blend_rel_pt_p_dpan _op_blend_pt_p_dpan +#define _op_blend_rel_pt_pan_dpan _op_blend_pt_pan_dpan +#define _op_blend_rel_pt_pas_dpan _op_blend_pt_pas_dpan + +static void +init_blend_rel_pixel_pt_funcs_c(void) +{ + op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_blend_rel_pt_p_dp; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_blend_rel_pt_pas_dp; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_blend_rel_pt_pan_dp; + + op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_rel_pt_p_dpan; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_rel_pt_pas_dpan; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_blend_rel_pt_pan_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_.c b/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_.c new file mode 100644 index 0000000..871df02 --- /dev/null +++ b/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_.c @@ -0,0 +1,274 @@ + +/* blend pixel x color --> dst */ + +#ifdef BUILD_C +static void +_op_blend_p_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + DATA32 sc = MUL4_SYM(c, *s); + l = 256 - (sc >> 24); + *d = sc + MUL_256(l, *d); + d++; + s++; + } +} + +static void +_op_blend_pan_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + l = 256 - (c >> 24); + while (d < e) { + *d = ((c & 0xff000000) + MUL3_SYM(c, *s)) + MUL_256(l, *d); + d++; + s++; + } +} + +static void +_op_blend_p_can_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + l = 256 - (*s >> 24); + *d = ((*s & 0xff000000) + MUL3_SYM(c, *s)) + MUL_256(l, *d); + d++; + s++; + } +} + +static void +_op_blend_pan_can_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + *d++ = 0xff000000 + MUL3_SYM(c, *s); + s++; + } +} + +static void +_op_blend_p_caa_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + c = 1 + (c & 0xff); + while (d < e) { + DATA32 sc = MUL_256(c, *s); + l = 256 - (sc >> 24); + *d = sc + MUL_256(l, *d); + d++; + s++; + } +} + +static void +_op_blend_pan_caa_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + c = 1 + (c & 0xff); + while (d < e) { + *d = INTERP_256(c, *s, *d); + d++; + s++; + } +} + +#define _op_blend_pas_c_dp _op_blend_p_c_dp +#define _op_blend_pas_can_dp _op_blend_p_can_dp +#define _op_blend_pas_caa_dp _op_blend_p_caa_dp + +#define _op_blend_p_c_dpan _op_blend_p_c_dp +#define _op_blend_pas_c_dpan _op_blend_pas_c_dp +#define _op_blend_pan_c_dpan _op_blend_pan_c_dp +#define _op_blend_p_can_dpan _op_blend_p_can_dp +#define _op_blend_pas_can_dpan _op_blend_pas_can_dp +#define _op_blend_pan_can_dpan _op_blend_pan_can_dp +#define _op_blend_p_caa_dpan _op_blend_p_caa_dp +#define _op_blend_pas_caa_dpan _op_blend_pas_caa_dp +#define _op_blend_pan_caa_dpan _op_blend_pan_caa_dp + +static void +init_blend_pixel_color_span_funcs_c(void) +{ + op_blend_span_funcs[SP][SM_N][SC][DP][CPU_C] = _op_blend_p_c_dp; + op_blend_span_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_blend_pas_c_dp; + op_blend_span_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_blend_pan_c_dp; + op_blend_span_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_blend_p_can_dp; + op_blend_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_blend_pas_can_dp; + op_blend_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_blend_pan_can_dp; + op_blend_span_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_blend_p_caa_dp; + op_blend_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_blend_pas_caa_dp; + op_blend_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_blend_pan_caa_dp; + + op_blend_span_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_blend_p_c_dpan; + op_blend_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_blend_pas_c_dpan; + op_blend_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_blend_pan_c_dpan; + op_blend_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_p_can_dpan; + op_blend_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_pas_can_dpan; + op_blend_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_pan_can_dpan; + op_blend_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_p_caa_dpan; + op_blend_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_pas_caa_dpan; + op_blend_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_pan_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_blend_pt_p_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = MUL4_SYM(c, s); + c = 256 - (s >> 24); + *d = s + MUL_256(c, *d); +} + +#define _op_blend_pt_pas_c_dp _op_blend_pt_p_c_dp +#define _op_blend_pt_pan_c_dp _op_blend_pt_p_c_dp +#define _op_blend_pt_p_can_dp _op_blend_pt_p_c_dp +#define _op_blend_pt_pas_can_dp _op_blend_pt_p_c_dp +#define _op_blend_pt_pan_can_dp _op_blend_pt_p_c_dp +#define _op_blend_pt_p_caa_dp _op_blend_pt_p_c_dp +#define _op_blend_pt_pas_caa_dp _op_blend_pt_p_c_dp +#define _op_blend_pt_pan_caa_dp _op_blend_pt_p_c_dp + +#define _op_blend_pt_p_c_dpan _op_blend_pt_p_c_dp +#define _op_blend_pt_pas_c_dpan _op_blend_pt_pas_c_dp +#define _op_blend_pt_pan_c_dpan _op_blend_pt_pan_c_dp +#define _op_blend_pt_p_can_dpan _op_blend_pt_p_can_dp +#define _op_blend_pt_pas_can_dpan _op_blend_pt_pas_can_dp +#define _op_blend_pt_pan_can_dpan _op_blend_pt_pan_can_dp +#define _op_blend_pt_p_caa_dpan _op_blend_pt_p_caa_dp +#define _op_blend_pt_pas_caa_dpan _op_blend_pt_pas_caa_dp +#define _op_blend_pt_pan_caa_dpan _op_blend_pt_pan_caa_dp + +static void +init_blend_pixel_color_pt_funcs_c(void) +{ + op_blend_pt_funcs[SP][SM_N][SC][DP][CPU_C] = _op_blend_pt_p_c_dp; + op_blend_pt_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_blend_pt_pas_c_dp; + op_blend_pt_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_blend_pt_pan_c_dp; + op_blend_pt_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_blend_pt_p_can_dp; + op_blend_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_blend_pt_pas_can_dp; + op_blend_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_blend_pt_pan_can_dp; + op_blend_pt_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_blend_pt_p_caa_dp; + op_blend_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_blend_pt_pas_caa_dp; + op_blend_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_blend_pt_pan_caa_dp; + + op_blend_pt_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_blend_pt_p_c_dpan; + op_blend_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_blend_pt_pas_c_dpan; + op_blend_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_blend_pt_pan_c_dpan; + op_blend_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_pt_p_can_dpan; + op_blend_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_pt_pas_can_dpan; + op_blend_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_pt_pan_can_dpan; + op_blend_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_pt_p_caa_dpan; + op_blend_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_pt_pas_caa_dpan; + op_blend_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_pt_pan_caa_dpan; +} +#endif + +/*-----*/ + +/* blend_rel pixel x color -> dst */ + +#ifdef BUILD_C +static void +_op_blend_rel_p_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + DATA32 sc = MUL4_SYM(c, *s); + l = 256 - (sc >> 24); + *d = MUL_SYM(*d >> 24, sc) + MUL_256(l, *d); + d++; + s++; + } +} + +#define _op_blend_rel_pas_c_dp _op_blend_rel_p_c_dp +#define _op_blend_rel_pan_c_dp _op_blend_rel_p_c_dp +#define _op_blend_rel_p_can_dp _op_blend_rel_p_c_dp +#define _op_blend_rel_pas_can_dp _op_blend_rel_p_c_dp +#define _op_blend_rel_pan_can_dp _op_blend_rel_p_c_dp +#define _op_blend_rel_p_caa_dp _op_blend_rel_p_c_dp +#define _op_blend_rel_pas_caa_dp _op_blend_rel_p_c_dp +#define _op_blend_rel_pan_caa_dp _op_blend_rel_p_c_dp + +#define _op_blend_rel_p_c_dpan _op_blend_p_c_dpan +#define _op_blend_rel_pas_c_dpan _op_blend_pas_c_dpan +#define _op_blend_rel_pan_c_dpan _op_blend_pan_c_dpan +#define _op_blend_rel_p_can_dpan _op_blend_p_can_dpan +#define _op_blend_rel_pas_can_dpan _op_blend_pas_can_dpan +#define _op_blend_rel_pan_can_dpan _op_blend_pan_can_dpan +#define _op_blend_rel_p_caa_dpan _op_blend_p_caa_dpan +#define _op_blend_rel_pas_caa_dpan _op_blend_pas_caa_dpan +#define _op_blend_rel_pan_caa_dpan _op_blend_pan_caa_dpan + +static void +init_blend_rel_pixel_color_span_funcs_c(void) +{ + op_blend_rel_span_funcs[SP][SM_N][SC][DP][CPU_C] = _op_blend_rel_p_c_dp; + op_blend_rel_span_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_blend_rel_pas_c_dp; + op_blend_rel_span_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_blend_rel_pan_c_dp; + op_blend_rel_span_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_blend_rel_p_can_dp; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_blend_rel_pas_can_dp; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_blend_rel_pan_can_dp; + op_blend_rel_span_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_blend_rel_p_caa_dp; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_blend_rel_pas_caa_dp; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_blend_rel_pan_caa_dp; + + op_blend_rel_span_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_blend_rel_p_c_dpan; + op_blend_rel_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_blend_rel_pas_c_dpan; + op_blend_rel_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_blend_rel_pan_c_dpan; + op_blend_rel_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_rel_p_can_dpan; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_rel_pas_can_dpan; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_rel_pan_can_dpan; + op_blend_rel_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_rel_p_caa_dpan; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_rel_pas_caa_dpan; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_rel_pan_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_blend_rel_pt_p_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = MUL4_SYM(c, s); + c = 256 - (s >> 24); + *d = MUL_SYM(*d >> 24, s) + MUL_256(c, *d); +} + +#define _op_blend_rel_pt_pas_c_dp _op_blend_rel_pt_p_c_dp +#define _op_blend_rel_pt_pan_c_dp _op_blend_rel_pt_p_c_dp +#define _op_blend_rel_pt_p_can_dp _op_blend_rel_pt_p_c_dp +#define _op_blend_rel_pt_pas_can_dp _op_blend_rel_pt_p_c_dp +#define _op_blend_rel_pt_pan_can_dp _op_blend_rel_pt_p_c_dp +#define _op_blend_rel_pt_p_caa_dp _op_blend_rel_pt_p_c_dp +#define _op_blend_rel_pt_pas_caa_dp _op_blend_rel_pt_p_c_dp +#define _op_blend_rel_pt_pan_caa_dp _op_blend_rel_pt_p_c_dp + +#define _op_blend_rel_pt_p_c_dpan _op_blend_pt_p_c_dpan +#define _op_blend_rel_pt_pas_c_dpan _op_blend_pt_pas_c_dpan +#define _op_blend_rel_pt_pan_c_dpan _op_blend_pt_pan_c_dpan +#define _op_blend_rel_pt_p_can_dpan _op_blend_pt_p_can_dpan +#define _op_blend_rel_pt_pas_can_dpan _op_blend_pt_pas_can_dpan +#define _op_blend_rel_pt_pan_can_dpan _op_blend_pt_pan_can_dpan +#define _op_blend_rel_pt_p_caa_dpan _op_blend_pt_p_caa_dpan +#define _op_blend_rel_pt_pas_caa_dpan _op_blend_pt_pas_caa_dpan +#define _op_blend_rel_pt_pan_caa_dpan _op_blend_pt_pan_caa_dpan + +static void +init_blend_rel_pixel_color_pt_funcs_c(void) +{ + op_blend_rel_pt_funcs[SP][SM_N][SC][DP][CPU_C] = _op_blend_rel_pt_p_c_dp; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_blend_rel_pt_pas_c_dp; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_blend_rel_pt_pan_c_dp; + op_blend_rel_pt_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_blend_rel_pt_p_can_dp; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_blend_rel_pt_pas_can_dp; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_blend_rel_pt_pan_can_dp; + op_blend_rel_pt_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_blend_rel_pt_p_caa_dp; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_blend_rel_pt_pas_caa_dp; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_blend_rel_pt_pan_caa_dp; + + op_blend_rel_pt_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_blend_rel_pt_p_c_dpan; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_blend_rel_pt_pas_c_dpan; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_blend_rel_pt_pan_c_dpan; + op_blend_rel_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_rel_pt_p_can_dpan; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_rel_pt_pas_can_dpan; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_blend_rel_pt_pan_can_dpan; + op_blend_rel_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_rel_pt_p_caa_dpan; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_rel_pt_pas_caa_dpan; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_blend_rel_pt_pan_caa_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_i386.c b/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_i386.c new file mode 100644 index 0000000..9a50a7b --- /dev/null +++ b/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_i386.c @@ -0,0 +1,222 @@ + +/* blend pixel x color --> dst */ + +#ifdef BUILD_MMX +static void +_op_blend_p_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + MOV_A2R(ALPHA_256, mm6) + MOV_A2R(ALPHA_255, mm5) + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm2, mm0) + while (d < e) { + MOV_P2R(*s, mm3, mm0) + MUL4_SYM_R2R(mm2, mm3, mm5) + + MOV_RA2R(mm3, mm1) + movq_r2r(mm6, mm4); + psubw_r2r(mm1, mm4); + + MOV_P2R(*d, mm1, mm0) + MUL4_256_R2R(mm4, mm1) + + paddw_r2r(mm3, mm1); + MOV_R2P(mm1, *d, mm0) + s++; d++; + } +} + +static void +_op_blend_pan_can_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm2, mm0) + MOV_A2R(ALPHA_255, mm5) + while (d < e) { + MOV_P2R(*s, mm1, mm0) + MUL4_SYM_R2R(mm2, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + s++; d++; + } +} + +static void +_op_blend_pan_caa_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + c = 1 + (c & 0xff); + MOV_A2R(c, mm2) + MOV_A2R(ALPHA_255, mm5) + pxor_r2r(mm0, mm0); + while (d < e) { + MOV_P2R(*s, mm3, mm0) + MOV_P2R(*d, mm1, mm0) + INTERP_256_R2R(mm2, mm3, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + s++; d++; + } +} + +#define _op_blend_pas_c_dp_mmx _op_blend_p_c_dp_mmx +#define _op_blend_pan_c_dp_mmx _op_blend_p_c_dp_mmx +#define _op_blend_p_can_dp_mmx _op_blend_p_c_dp_mmx +#define _op_blend_pas_can_dp_mmx _op_blend_p_c_dp_mmx +#define _op_blend_p_caa_dp_mmx _op_blend_p_c_dp_mmx +#define _op_blend_pas_caa_dp_mmx _op_blend_p_c_dp_mmx + +#define _op_blend_p_c_dpan_mmx _op_blend_p_c_dp_mmx +#define _op_blend_pas_c_dpan_mmx _op_blend_pas_c_dp_mmx +#define _op_blend_pan_c_dpan_mmx _op_blend_pan_c_dp_mmx +#define _op_blend_p_can_dpan_mmx _op_blend_p_can_dp_mmx +#define _op_blend_pas_can_dpan_mmx _op_blend_pas_can_dp_mmx +#define _op_blend_pan_can_dpan_mmx _op_blend_pan_can_dp_mmx +#define _op_blend_p_caa_dpan_mmx _op_blend_p_caa_dp_mmx +#define _op_blend_pas_caa_dpan_mmx _op_blend_pas_caa_dp_mmx +#define _op_blend_pan_caa_dpan_mmx _op_blend_pan_caa_dp_mmx + + +static void +init_blend_pixel_color_span_funcs_mmx(void) +{ + op_blend_span_funcs[SP][SM_N][SC][DP][CPU_MMX] = _op_blend_p_c_dp_mmx; + op_blend_span_funcs[SP_AS][SM_N][SC][DP][CPU_MMX] = _op_blend_pas_c_dp_mmx; + op_blend_span_funcs[SP_AN][SM_N][SC][DP][CPU_MMX] = _op_blend_pan_c_dp_mmx; + op_blend_span_funcs[SP][SM_N][SC_AN][DP][CPU_MMX] = _op_blend_p_can_dp_mmx; + op_blend_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_MMX] = _op_blend_pas_can_dp_mmx; + op_blend_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_MMX] = _op_blend_pan_can_dp_mmx; + op_blend_span_funcs[SP][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_p_caa_dp_mmx; + op_blend_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_pas_caa_dp_mmx; + op_blend_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_pan_caa_dp_mmx; + + op_blend_span_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_p_c_dpan_mmx; + op_blend_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_pas_c_dpan_mmx; + op_blend_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_pan_c_dpan_mmx; + op_blend_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_p_can_dpan_mmx; + op_blend_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_pas_can_dpan_mmx; + op_blend_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_pan_can_dpan_mmx; + op_blend_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_p_caa_dpan_mmx; + op_blend_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_pas_caa_dpan_mmx; + op_blend_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_pan_caa_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_blend_pt_p_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + MOV_A2R(ALPHA_256, mm4) + MOV_A2R(ALPHA_255, mm5) + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm2, mm0) + MOV_P2R(s, mm3, mm0) + MUL4_SYM_R2R(mm2, mm3, mm5) + + MOV_RA2R(mm3, mm1) + psubw_r2r(mm1, mm4); + + MOV_P2R(*d, mm1, mm0) + MUL4_256_R2R(mm4, mm1) + + paddw_r2r(mm3, mm1); + MOV_R2P(mm1, *d, mm0) +} + +#define _op_blend_pt_pas_c_dp_mmx _op_blend_pt_p_c_dp_mmx +#define _op_blend_pt_pan_c_dp_mmx _op_blend_pt_p_c_dp_mmx +#define _op_blend_pt_p_can_dp_mmx _op_blend_pt_p_c_dp_mmx +#define _op_blend_pt_pas_can_dp_mmx _op_blend_pt_p_c_dp_mmx +#define _op_blend_pt_pan_can_dp_mmx _op_blend_pt_p_c_dp_mmx +#define _op_blend_pt_p_caa_dp_mmx _op_blend_pt_p_c_dp_mmx +#define _op_blend_pt_pas_caa_dp_mmx _op_blend_pt_p_c_dp_mmx +#define _op_blend_pt_pan_caa_dp_mmx _op_blend_pt_p_c_dp_mmx + +#define _op_blend_pt_p_c_dpan_mmx _op_blend_pt_p_c_dp_mmx +#define _op_blend_pt_pas_c_dpan_mmx _op_blend_pt_p_c_dp_mmx +#define _op_blend_pt_pan_c_dpan_mmx _op_blend_pt_p_c_dp_mmx +#define _op_blend_pt_p_can_dpan_mmx _op_blend_pt_p_c_dp_mmx +#define _op_blend_pt_pas_can_dpan_mmx _op_blend_pt_p_c_dp_mmx +#define _op_blend_pt_pan_can_dpan_mmx _op_blend_pt_p_c_dp_mmx +#define _op_blend_pt_p_caa_dpan_mmx _op_blend_pt_p_c_dp_mmx +#define _op_blend_pt_pas_caa_dpan_mmx _op_blend_pt_p_c_dp_mmx +#define _op_blend_pt_pan_caa_dpan_mmx _op_blend_pt_p_c_dp_mmx + +static void +init_blend_pixel_color_pt_funcs_mmx(void) +{ + op_blend_pt_funcs[SP][SM_N][SC][DP][CPU_MMX] = _op_blend_pt_p_c_dp_mmx; + op_blend_pt_funcs[SP_AS][SM_N][SC][DP][CPU_MMX] = _op_blend_pt_pas_c_dp_mmx; + op_blend_pt_funcs[SP_AN][SM_N][SC][DP][CPU_MMX] = _op_blend_pt_pan_c_dp_mmx; + op_blend_pt_funcs[SP][SM_N][SC_AN][DP][CPU_MMX] = _op_blend_pt_p_can_dp_mmx; + op_blend_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_MMX] = _op_blend_pt_pas_can_dp_mmx; + op_blend_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_MMX] = _op_blend_pt_pan_can_dp_mmx; + op_blend_pt_funcs[SP][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_pt_p_caa_dp_mmx; + op_blend_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_pt_pas_caa_dp_mmx; + op_blend_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_MMX] = _op_blend_pt_pan_caa_dp_mmx; + + op_blend_pt_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_pt_p_c_dpan_mmx; + op_blend_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_pt_pas_c_dpan_mmx; + op_blend_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_pt_pan_c_dpan_mmx; + op_blend_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_pt_p_can_dpan_mmx; + op_blend_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_pt_pas_can_dpan_mmx; + op_blend_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_pt_pan_can_dpan_mmx; + op_blend_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_pt_p_caa_dpan_mmx; + op_blend_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_pt_pas_caa_dpan_mmx; + op_blend_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_pt_pan_caa_dpan_mmx; +} +#endif + +/*-----*/ + +/* blend_rel pixel x color -> dst */ + +#ifdef BUILD_MMX + +#define _op_blend_rel_p_c_dpan_mmx _op_blend_p_c_dpan_mmx +#define _op_blend_rel_pas_c_dpan_mmx _op_blend_pas_c_dpan_mmx +#define _op_blend_rel_pan_c_dpan_mmx _op_blend_pan_c_dpan_mmx +#define _op_blend_rel_p_can_dpan_mmx _op_blend_p_can_dpan_mmx +#define _op_blend_rel_pas_can_dpan_mmx _op_blend_pas_can_dpan_mmx +#define _op_blend_rel_pan_can_dpan_mmx _op_blend_pan_can_dpan_mmx +#define _op_blend_rel_p_caa_dpan_mmx _op_blend_p_caa_dpan_mmx +#define _op_blend_rel_pas_caa_dpan_mmx _op_blend_pas_caa_dpan_mmx +#define _op_blend_rel_pan_caa_dpan_mmx _op_blend_pan_caa_dpan_mmx + +static void +init_blend_rel_pixel_color_span_funcs_mmx(void) +{ + op_blend_rel_span_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_rel_p_c_dpan_mmx; + op_blend_rel_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_rel_pas_c_dpan_mmx; + op_blend_rel_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_rel_pan_c_dpan_mmx; + op_blend_rel_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_p_can_dpan_mmx; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_pas_can_dpan_mmx; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_pan_can_dpan_mmx; + op_blend_rel_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_p_caa_dpan_mmx; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_pas_caa_dpan_mmx; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_pan_caa_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX + +#define _op_blend_rel_pt_p_c_dpan_mmx _op_blend_pt_p_c_dpan_mmx +#define _op_blend_rel_pt_pas_c_dpan_mmx _op_blend_pt_pas_c_dpan_mmx +#define _op_blend_rel_pt_pan_c_dpan_mmx _op_blend_pt_pan_c_dpan_mmx +#define _op_blend_rel_pt_p_can_dpan_mmx _op_blend_pt_p_can_dpan_mmx +#define _op_blend_rel_pt_pas_can_dpan_mmx _op_blend_pt_pas_can_dpan_mmx +#define _op_blend_rel_pt_pan_can_dpan_mmx _op_blend_pt_pan_can_dpan_mmx +#define _op_blend_rel_pt_p_caa_dpan_mmx _op_blend_pt_p_caa_dpan_mmx +#define _op_blend_rel_pt_pas_caa_dpan_mmx _op_blend_pt_pas_caa_dpan_mmx +#define _op_blend_rel_pt_pan_caa_dpan_mmx _op_blend_pt_pan_caa_dpan_mmx + +static void +init_blend_rel_pixel_color_pt_funcs_mmx(void) +{ + op_blend_rel_pt_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_rel_pt_p_c_dpan_mmx; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_rel_pt_pas_c_dpan_mmx; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_blend_rel_pt_pan_c_dpan_mmx; + op_blend_rel_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_pt_p_can_dpan_mmx; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_pt_pas_can_dpan_mmx; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_blend_rel_pt_pan_can_dpan_mmx; + op_blend_rel_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_pt_p_caa_dpan_mmx; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_pt_pas_caa_dpan_mmx; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_blend_rel_pt_pan_caa_dpan_mmx; +} +#endif diff --git a/src/lib/engines/common/evas_op_blend/op_blend_pixel_i386.c b/src/lib/engines/common/evas_op_blend/op_blend_pixel_i386.c new file mode 100644 index 0000000..4dacf86 --- /dev/null +++ b/src/lib/engines/common/evas_op_blend/op_blend_pixel_i386.c @@ -0,0 +1,216 @@ + +/* blend pixel --> dst */ + +#ifdef BUILD_MMX +static void +_op_blend_p_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_256, mm6) + while (d < e) + { + MOV_P2R(*s, mm2, mm0) + MOV_RA2R(mm2, mm1) + movq_r2r(mm6, mm3); + psubw_r2r(mm1, mm3); + + MOV_P2R(*d, mm1, mm0) + MUL4_256_R2R(mm3, mm1) + + paddw_r2r(mm2, mm1); + MOV_R2P(mm1, *d, mm0) + s++; d++; + } +} + +static void +_op_blend_pas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_256, mm6) + while (d < e) + { + switch (*s & 0xff000000) + { + case 0: + break; + case 0xff000000: + *d = *s; + break; + default : + MOV_P2R(*s, mm2, mm0) + MOV_RA2R(mm2, mm1) + movq_r2r(mm6, mm3); + psubw_r2r(mm1, mm3); + + MOV_P2R(*d, mm1, mm0) + MUL4_256_R2R(mm3, mm1) + + paddw_r2r(mm2, mm1); + MOV_R2P(mm1, *d, mm0) + break; + } + s++; d++; + } +} + +#define _op_blend_pan_dp_mmx NULL + +#define _op_blend_p_dpan_mmx _op_blend_p_dp_mmx +#define _op_blend_pas_dpan_mmx _op_blend_pas_dp_mmx +#define _op_blend_pan_dpan_mmx _op_blend_pan_dp_mmx + +static void +init_blend_pixel_span_funcs_mmx(void) +{ + op_blend_span_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_blend_p_dp_mmx; + op_blend_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_blend_pas_dp_mmx; + op_blend_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_blend_pan_dp_mmx; + + op_blend_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_p_dpan_mmx; + op_blend_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_pas_dpan_mmx; + op_blend_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_pan_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_blend_pt_p_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_256, mm6) + MOV_P2R(s, mm2, mm0) + MOV_RA2R(mm2, mm1) + movq_r2r(mm6, mm3); + psubw_r2r(mm1, mm3); + + MOV_P2R(*d, mm1, mm0) + MUL4_256_R2R(mm3, mm1) + + paddw_r2r(mm2, mm1); + MOV_R2P(mm1, *d, mm0) +} + + +#define _op_blend_pt_pan_dp_mmx NULL +#define _op_blend_pt_pas_dp_mmx _op_blend_pt_p_dp_mmx + +#define _op_blend_pt_p_dpan_mmx _op_blend_pt_p_dp_mmx +#define _op_blend_pt_pan_dpan_mmx _op_blend_pt_pan_dp_mmx +#define _op_blend_pt_pas_dpan_mmx _op_blend_pt_pas_dp_mmx + +static void +init_blend_pixel_pt_funcs_mmx(void) +{ + op_blend_pt_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_blend_pt_p_dp_mmx; + op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_blend_pt_pas_dp_mmx; + op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_blend_pt_pan_dp_mmx; + + op_blend_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_p_dpan_mmx; + op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_pas_dpan_mmx; + op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_pan_dpan_mmx; +} +#endif + +/*-----*/ + +/* blend_rel pixel -> dst */ + +#ifdef BUILD_MMX +static void +_op_blend_rel_p_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_256, mm6) + MOV_A2R(ALPHA_255, mm5) + while (d < e) + { + MOV_P2R(*s, mm2, mm0) + MOV_RA2R(mm2, mm1) + movq_r2r(mm6, mm3); + psubw_r2r(mm1, mm3); + + MOV_P2R(*d, mm1, mm0) + MOV_RA2R(mm1, mm4) + MUL4_256_R2R(mm3, mm1) + + MUL4_SYM_R2R(mm4, mm2, mm5) + paddw_r2r(mm2, mm1); + MOV_R2P(mm1, *d, mm0) + s++; d++; + } +} + +static void +_op_blend_rel_pan_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_256, mm6) + MOV_A2R(ALPHA_255, mm5) + while (d < e) + { + MOV_P2R(*s, mm2, mm0) + MOV_PA2R(*d, mm1) + MUL4_SYM_R2R(mm2, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + s++; d++; + } +} + +#define _op_blend_rel_pas_dp_mmx _op_blend_rel_p_dp_mmx + +#define _op_blend_rel_p_dpan_mmx _op_blend_p_dpan_mmx +#define _op_blend_rel_pan_dpan_mmx _op_blend_pan_dpan_mmx +#define _op_blend_rel_pas_dpan_mmx _op_blend_pas_dpan_mmx + +static void +init_blend_rel_pixel_span_funcs_mmx(void) +{ + op_blend_rel_span_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_p_dp_mmx; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_pas_dp_mmx; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_pan_dp_mmx; + + op_blend_rel_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_p_dpan_mmx; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pas_dpan_mmx; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pan_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_blend_rel_pt_p_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_256, mm6) + MOV_A2R(ALPHA_255, mm5) + + MOV_P2R(s, mm2, mm0) + MOV_RA2R(mm2, mm1) + psubw_r2r(mm1, mm6); + + MOV_P2R(*d, mm1, mm0) + MOV_RA2R(mm1, mm4) + MUL4_256_R2R(mm6, mm1) + + MUL4_SYM_R2R(mm4, mm2, mm5) + paddw_r2r(mm2, mm1); + MOV_R2P(mm1, *d, mm0) +} + +#define _op_blend_rel_pt_pas_dp_mmx _op_blend_rel_pt_p_dp_mmx +#define _op_blend_rel_pt_pan_dp_mmx _op_blend_rel_pt_p_dp_mmx + +#define _op_blend_rel_pt_p_dpan_mmx _op_blend_pt_p_dpan_mmx +#define _op_blend_rel_pt_pas_dpan_mmx _op_blend_pt_pas_dpan_mmx +#define _op_blend_rel_pt_pan_dpan_mmx _op_blend_pt_pan_dpan_mmx + +static void +init_blend_rel_pixel_pt_funcs_mmx(void) +{ + op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_pt_p_dp_mmx; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_pt_pas_dp_mmx; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_blend_rel_pt_pan_dp_mmx; + + op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_p_dpan_mmx; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_pas_dpan_mmx; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_pan_dpan_mmx; +} +#endif diff --git a/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_.c b/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_.c new file mode 100644 index 0000000..641230c --- /dev/null +++ b/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_.c @@ -0,0 +1,185 @@ + +/* blend pixel x mask --> dst */ + +#ifdef BUILD_C +static void +_op_blend_p_mas_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + case 255: + l = 256 - (*s >> 24); + *d = *s + MUL_256(l, *d); + break; + default: + c = MUL_SYM(l, *s); + l = 256 - (c >> 24); + *d = c + MUL_256(l, *d); + break; + } + m++; s++; d++; + } +} + +static void +_op_blend_pas_mas_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + l = (*s >> 24); + switch(*m & l) + { + case 0: + break; + case 255: + *d = *s; + break; + default: + c = MUL_SYM(l, *s); + l = 256 - (c >> 24); + *d = c + MUL_256(l, *d); + break; + } + m++; s++; d++; + } +} + +static void +_op_blend_pan_mas_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + case 255: + *d = *s; + break; + default: + l++; + *d = INTERP_256(l, *s, *d); + break; + } + m++; s++; d++; + } +} + + +#define _op_blend_p_mas_dpan _op_blend_p_mas_dp +#define _op_blend_pas_mas_dpan _op_blend_pas_mas_dp +#define _op_blend_pan_mas_dpan _op_blend_pan_mas_dp + +static void +init_blend_pixel_mask_span_funcs_c(void) +{ + op_blend_span_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_blend_p_mas_dp; + op_blend_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_blend_pas_mas_dp; + op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_blend_pan_mas_dp; + + op_blend_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_p_mas_dpan; + op_blend_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_pas_mas_dpan; + op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_pan_mas_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_blend_pt_p_mas_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = MUL_SYM(m, s); + c = 256 - (s >> 24); + *d = s + MUL_256(c, *d); +} + +static void +_op_blend_pt_pan_mas_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = INTERP_256(m + 1, s, *d); +} + +#define _op_blend_pt_pas_mas_dp _op_blend_pt_p_mas_dp + +#define _op_blend_pt_p_mas_dpan _op_blend_pt_p_mas_dp +#define _op_blend_pt_pas_mas_dpan _op_blend_pt_pas_mas_dp +#define _op_blend_pt_pan_mas_dpan _op_blend_pt_pan_mas_dp + +static void +init_blend_pixel_mask_pt_funcs_c(void) +{ + op_blend_pt_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_blend_pt_p_mas_dp; + op_blend_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_blend_pt_pas_mas_dp; + op_blend_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_blend_pt_pan_mas_dp; + + op_blend_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_pt_p_mas_dpan; + op_blend_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_pt_pas_mas_dpan; + op_blend_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_pt_pan_mas_dpan; +} +#endif + +/*-----*/ + +/* blend_rel pixel x mask -> dst */ + +#ifdef BUILD_C +static void +_op_blend_rel_p_mas_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + c = MUL_SYM(*m, *s); + l = 256 - (c >> 24); + *d = MUL_SYM(*d >> 24, c) + MUL_256(l, *d); + d++; + m++; + s++; + } +} + +#define _op_blend_rel_pas_mas_dp _op_blend_rel_p_mas_dp +#define _op_blend_rel_pan_mas_dp _op_blend_rel_p_mas_dp + +#define _op_blend_rel_p_mas_dpan _op_blend_p_mas_dpan +#define _op_blend_rel_pas_mas_dpan _op_blend_pas_mas_dpan +#define _op_blend_rel_pan_mas_dpan _op_blend_pan_mas_dpan + +static void +init_blend_rel_pixel_mask_span_funcs_c(void) +{ + op_blend_rel_span_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_blend_rel_p_mas_dp; + op_blend_rel_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_blend_rel_pas_mas_dp; + op_blend_rel_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_blend_rel_pan_mas_dp; + + op_blend_rel_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_rel_p_mas_dpan; + op_blend_rel_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_rel_pas_mas_dpan; + op_blend_rel_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_rel_pan_mas_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_blend_rel_pt_p_mas_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = MUL_SYM(m, s); + c = 256 - (s >> 24); + *d = MUL_SYM(*d >> 24, s) + MUL_256(c, *d); +} + +#define _op_blend_rel_pt_pas_mas_dp _op_blend_rel_pt_p_mas_dp +#define _op_blend_rel_pt_pan_mas_dp _op_blend_rel_pt_p_mas_dp + +#define _op_blend_rel_pt_p_mas_dpan _op_blend_pt_p_mas_dpan +#define _op_blend_rel_pt_pas_mas_dpan _op_blend_pt_pas_mas_dpan +#define _op_blend_rel_pt_pan_mas_dpan _op_blend_pt_pan_mas_dpan + +static void +init_blend_rel_pixel_mask_pt_funcs_c(void) +{ + op_blend_rel_pt_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_blend_rel_pt_p_mas_dp; + op_blend_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_blend_rel_pt_pas_mas_dp; + op_blend_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_blend_rel_pt_pan_mas_dp; + + op_blend_rel_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_rel_pt_p_mas_dpan; + op_blend_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_rel_pt_pas_mas_dpan; + op_blend_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_blend_rel_pt_pan_mas_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_i386.c b/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_i386.c new file mode 100644 index 0000000..e81c6d2 --- /dev/null +++ b/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_i386.c @@ -0,0 +1,158 @@ + +/* blend pixel x mask --> dst */ + +#ifdef BUILD_MMX +static void +_op_blend_pas_mas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_256, mm6) + while (d < e) { + l = (*s >> 24); + switch(*m & l) + { + case 0: + break; + case 255: + *d = *s; + break; + default: + l = 1 + *m; + MOV_A2R(l, mm3) + MOV_P2R(*s, mm2, mm0) + MUL4_256_R2R(mm3, mm2) + + MOV_RA2R(mm2, mm1) + movq_r2r(mm6, mm3); + psubw_r2r(mm1, mm3); + + MOV_P2R(*d, mm1, mm0) + MUL4_256_R2R(mm3, mm1) + + paddw_r2r(mm2, mm1); + MOV_R2P(mm1, *d, mm0) + break; + } + m++; s++; d++; + } +} + +static void +_op_blend_pan_mas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + MOV_A2R(ALPHA_255, mm5) + pxor_r2r(mm0, mm0); + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + case 255: + *d = *s; + break; + default: + l++; + MOV_A2R(l, mm3) + MOV_P2R(*s, mm2, mm0) + MOV_P2R(*d, mm1, mm0) + INTERP_256_R2R(mm3, mm2, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + break; + } + m++; s++; d++; + } +} + +#define _op_blend_p_mas_dp_mmx _op_blend_pas_mas_dp_mmx + +#define _op_blend_p_mas_dpan_mmx _op_blend_p_mas_dp_mmx +#define _op_blend_pan_mas_dpan_mmx _op_blend_pan_mas_dp_mmx +#define _op_blend_pas_mas_dpan_mmx _op_blend_pas_mas_dp_mmx + +static void +init_blend_pixel_mask_span_funcs_mmx(void) +{ + op_blend_span_funcs[SP][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_p_mas_dp_mmx; + op_blend_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pas_mas_dp_mmx; + op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pan_mas_dp_mmx; + + op_blend_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_p_mas_dpan_mmx; + op_blend_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pas_mas_dpan_mmx; + op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pan_mas_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_blend_pt_p_mas_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + c = m + 1; + MOV_A2R(c, mm3) + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_256, mm6) + MOV_P2R(s, mm2, mm0) + MUL4_256_R2R(mm3, mm2) + + MOV_RA2R(mm2, mm1) + psubw_r2r(mm1, mm6); + + MOV_P2R(*d, mm1, mm0) + MUL4_256_R2R(mm6, mm1) + + paddw_r2r(mm2, mm1); + MOV_R2P(mm1, *d, mm0) +} + +#define _op_blend_pt_pan_mas_dp_mmx _op_blend_pt_p_mas_dp_mmx +#define _op_blend_pt_pas_mas_dp_mmx _op_blend_pt_p_mas_dp_mmx + +#define _op_blend_pt_p_mas_dpan_mmx _op_blend_pt_p_mas_dp_mmx +#define _op_blend_pt_pas_mas_dpan_mmx _op_blend_pt_pas_mas_dp_mmx +#define _op_blend_pt_pan_mas_dpan_mmx _op_blend_pt_pan_mas_dp_mmx + +static void +init_blend_pixel_mask_pt_funcs_mmx(void) +{ + op_blend_pt_funcs[SP][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pt_p_mas_dp_mmx; + op_blend_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pt_pas_mas_dp_mmx; + op_blend_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pt_pan_mas_dp_mmx; + + op_blend_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_p_mas_dpan_mmx; + op_blend_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_pas_mas_dpan_mmx; + op_blend_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_pan_mas_dpan_mmx; +} +#endif + +/*-----*/ + +/* blend_rel pixel x mask -> dst */ + +#ifdef BUILD_MMX + +#define _op_blend_rel_p_mas_dpan_mmx _op_blend_p_mas_dpan_mmx +#define _op_blend_rel_pas_mas_dpan_mmx _op_blend_pas_mas_dpan_mmx +#define _op_blend_rel_pan_mas_dpan_mmx _op_blend_pan_mas_dpan_mmx + +static void +init_blend_rel_pixel_mask_span_funcs_mmx(void) +{ + op_blend_rel_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_p_mas_dpan_mmx; + op_blend_rel_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pas_mas_dpan_mmx; + op_blend_rel_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pan_mas_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX + +#define _op_blend_rel_pt_p_mas_dpan_mmx _op_blend_pt_p_mas_dpan_mmx +#define _op_blend_rel_pt_pas_mas_dpan_mmx _op_blend_pt_pas_mas_dpan_mmx +#define _op_blend_rel_pt_pan_mas_dpan_mmx _op_blend_pt_pan_mas_dpan_mmx + +static void +init_blend_rel_pixel_mask_pt_funcs_mmx(void) +{ + op_blend_rel_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_p_mas_dpan_mmx; + op_blend_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_pas_mas_dpan_mmx; + op_blend_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_pan_mas_dpan_mmx; +} +#endif diff --git a/src/lib/engines/common/evas_op_blend_main_.c b/src/lib/engines/common/evas_op_blend_main_.c new file mode 100644 index 0000000..08cfe66 --- /dev/null +++ b/src/lib/engines/common/evas_op_blend_main_.c @@ -0,0 +1,563 @@ +#include "evas_common.h" + +static RGBA_Gfx_Func op_blend_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; +static RGBA_Gfx_Pt_Func op_blend_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; + +static void op_blend_init(void); +static void op_blend_shutdown(void); + +static RGBA_Gfx_Func op_blend_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_blend_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_blend_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_blend_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_blend_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); + +static RGBA_Gfx_Pt_Func op_blend_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_blend_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_blend_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_blend_mask_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_blend_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); + +static RGBA_Gfx_Compositor _composite_blend = { "blend", + op_blend_init, op_blend_shutdown, + op_blend_pixel_span_get, op_blend_color_span_get, + op_blend_pixel_color_span_get, op_blend_mask_color_span_get, + op_blend_pixel_mask_span_get, + op_blend_pixel_pt_get, op_blend_color_pt_get, + op_blend_pixel_color_pt_get, op_blend_mask_color_pt_get, + op_blend_pixel_mask_pt_get + }; + +RGBA_Gfx_Compositor * +evas_common_gfx_compositor_blend_get(void) +{ + return &(_composite_blend); +} + + +static RGBA_Gfx_Func op_blend_rel_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; +static RGBA_Gfx_Pt_Func op_blend_rel_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; + +static void op_blend_rel_init(void); +static void op_blend_rel_shutdown(void); + +static RGBA_Gfx_Func op_blend_rel_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_blend_rel_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_blend_rel_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_blend_rel_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_blend_rel_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); + +static RGBA_Gfx_Pt_Func op_blend_rel_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_blend_rel_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_blend_rel_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_blend_rel_mask_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_blend_rel_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); + +static RGBA_Gfx_Compositor _composite_blend_rel = { "blend_rel", + op_blend_rel_init, op_blend_rel_shutdown, + op_blend_rel_pixel_span_get, op_blend_rel_color_span_get, + op_blend_rel_pixel_color_span_get, op_blend_rel_mask_color_span_get, + op_blend_rel_pixel_mask_span_get, + op_blend_rel_pixel_pt_get, op_blend_rel_color_pt_get, + op_blend_rel_pixel_color_pt_get, op_blend_rel_mask_color_pt_get, + op_blend_rel_pixel_mask_pt_get + }; + +RGBA_Gfx_Compositor * +evas_common_gfx_compositor_blend_rel_get(void) +{ + return &(_composite_blend_rel); +} + + +# include "./evas_op_blend/op_blend_pixel_.c" +# include "./evas_op_blend/op_blend_color_.c" +# include "./evas_op_blend/op_blend_pixel_color_.c" +# include "./evas_op_blend/op_blend_pixel_mask_.c" +# include "./evas_op_blend/op_blend_mask_color_.c" +//# include "./evas_op_blend/op_blend_pixel_mask_color_.c" + +# include "./evas_op_blend/op_blend_pixel_i386.c" +# include "./evas_op_blend/op_blend_color_i386.c" +# include "./evas_op_blend/op_blend_pixel_color_i386.c" +# include "./evas_op_blend/op_blend_pixel_mask_i386.c" +# include "./evas_op_blend/op_blend_mask_color_i386.c" +//# include "./evas_op_blend/op_blend_pixel_mask_color_i386.c" + +static void +op_blend_init(void) +{ + memset(op_blend_span_funcs, 0, sizeof(op_blend_span_funcs)); + memset(op_blend_pt_funcs, 0, sizeof(op_blend_pt_funcs)); +#ifdef BUILD_MMX + init_blend_pixel_span_funcs_mmx(); + init_blend_pixel_color_span_funcs_mmx(); + init_blend_pixel_mask_span_funcs_mmx(); + init_blend_color_span_funcs_mmx(); + init_blend_mask_color_span_funcs_mmx(); + + init_blend_pixel_pt_funcs_mmx(); + init_blend_pixel_color_pt_funcs_mmx(); + init_blend_pixel_mask_pt_funcs_mmx(); + init_blend_color_pt_funcs_mmx(); + init_blend_mask_color_pt_funcs_mmx(); +#endif +#ifdef BUILD_C + init_blend_pixel_span_funcs_c(); + init_blend_pixel_color_span_funcs_c(); + init_blend_pixel_mask_span_funcs_c(); + init_blend_color_span_funcs_c(); + init_blend_mask_color_span_funcs_c(); + + init_blend_pixel_pt_funcs_c(); + init_blend_pixel_color_pt_funcs_c(); + init_blend_pixel_mask_pt_funcs_c(); + init_blend_color_pt_funcs_c(); + init_blend_mask_color_pt_funcs_c(); +#endif +} + +static void +op_blend_shutdown(void) +{ +} + +static RGBA_Gfx_Func +blend_gfx_span_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_blend_span_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_blend_span_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Func +op_blend_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + { + s = SP; + if (src->cache_entry.flags.alpha_sparse) + s = SP_AS; + } + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_blend_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_blend_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + { + s = SP; + if (src->cache_entry.flags.alpha_sparse) + s = SP_AS; + } + if ((col >> 24) < 255) + c = SC; + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_blend_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_blend_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + { + s = SP; + if (src->cache_entry.flags.alpha_sparse) + s = SP_AS; + } + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_gfx_span_func_cpu(s, m, c, d); +} + + +static RGBA_Gfx_Pt_Func +blend_gfx_pt_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Pt_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_blend_pt_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_blend_pt_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Pt_Func +op_blend_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_blend_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_blend_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if ((col >> 24) < 255) + c = SC; + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_blend_mask_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_blend_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_gfx_pt_func_cpu(s, m, c, d); +} + + +static void +op_blend_rel_init(void) +{ + memset(op_blend_rel_span_funcs, 0, sizeof(op_blend_rel_span_funcs)); + memset(op_blend_rel_pt_funcs, 0, sizeof(op_blend_rel_pt_funcs)); +#ifdef BUILD_MMX + init_blend_rel_pixel_span_funcs_mmx(); + init_blend_rel_pixel_color_span_funcs_mmx(); + init_blend_rel_pixel_mask_span_funcs_mmx(); + init_blend_rel_color_span_funcs_mmx(); + init_blend_rel_mask_color_span_funcs_mmx(); + + init_blend_rel_pixel_pt_funcs_mmx(); + init_blend_rel_pixel_color_pt_funcs_mmx(); + init_blend_rel_pixel_mask_pt_funcs_mmx(); + init_blend_rel_color_pt_funcs_mmx(); + init_blend_rel_mask_color_pt_funcs_mmx(); +#endif +#ifdef BUILD_C + init_blend_rel_pixel_span_funcs_c(); + init_blend_rel_pixel_color_span_funcs_c(); + init_blend_rel_pixel_mask_span_funcs_c(); + init_blend_rel_color_span_funcs_c(); + init_blend_rel_mask_color_span_funcs_c(); + + init_blend_rel_pixel_pt_funcs_c(); + init_blend_rel_pixel_color_pt_funcs_c(); + init_blend_rel_pixel_mask_pt_funcs_c(); + init_blend_rel_color_pt_funcs_c(); + init_blend_rel_mask_color_pt_funcs_c(); +#endif +} + +static void +op_blend_rel_shutdown(void) +{ +} + +static RGBA_Gfx_Func +blend_rel_gfx_span_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_blend_rel_span_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_blend_rel_span_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Func +op_blend_rel_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + { + s = SP; + if (src->cache_entry.flags.alpha_sparse) + s = SP_AS; + } + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_blend_rel_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_blend_rel_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + s = SP; + if ((col >> 24) < 255) + c = SC; + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_blend_rel_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_blend_rel_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + { + s = SP; + if (src->cache_entry.flags.alpha_sparse) + s = SP_AS; + } + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +blend_rel_gfx_pt_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Pt_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_blend_rel_pt_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_blend_rel_pt_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Pt_Func +op_blend_rel_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_rel_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_blend_rel_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_rel_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_blend_rel_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if ((col >> 24) < 255) + c = SC; + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_rel_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_blend_rel_mask_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_rel_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_blend_rel_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return blend_rel_gfx_pt_func_cpu(s, m, c, d); +} diff --git a/src/lib/engines/common/evas_op_copy/.cvsignore b/src/lib/engines/common/evas_op_copy/.cvsignore new file mode 100644 index 0000000..282522d --- /dev/null +++ b/src/lib/engines/common/evas_op_copy/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/src/lib/engines/common/evas_op_copy/Makefile.am b/src/lib/engines/common/evas_op_copy/Makefile.am new file mode 100644 index 0000000..7c1a883 --- /dev/null +++ b/src/lib/engines/common/evas_op_copy/Makefile.am @@ -0,0 +1,11 @@ +EXTRA_DIST = \ +op_copy_color_.c \ +op_copy_color_i386.c \ +op_copy_mask_color_.c \ +op_copy_mask_color_i386.c \ +op_copy_pixel_.c \ +op_copy_pixel_color_.c \ +op_copy_pixel_color_i386.c \ +op_copy_pixel_i386.c \ +op_copy_pixel_mask_.c \ +op_copy_pixel_mask_i386.c diff --git a/src/lib/engines/common/evas_op_copy/op_copy_color_.c b/src/lib/engines/common/evas_op_copy/op_copy_color_.c new file mode 100644 index 0000000..8b54e1d --- /dev/null +++ b/src/lib/engines/common/evas_op_copy/op_copy_color_.c @@ -0,0 +1,135 @@ + +/* copy color --> dst */ + +#ifdef BUILD_C +static void +_op_copy_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + for (; d < e; d++) { + *d = c; + } +} + +#define _op_copy_cn_dp _op_copy_c_dp +#define _op_copy_can_dp _op_copy_c_dp +#define _op_copy_caa_dp _op_copy_c_dp + +#define _op_copy_c_dpan _op_copy_c_dp +#define _op_copy_cn_dpan _op_copy_c_dp +#define _op_copy_can_dpan _op_copy_c_dp +#define _op_copy_caa_dpan _op_copy_c_dp + +static void +init_copy_color_span_funcs_c(void) +{ + op_copy_span_funcs[SP_N][SM_N][SC_N][DP][CPU_C] = _op_copy_cn_dp; + op_copy_span_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_copy_c_dp; + op_copy_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_C] = _op_copy_can_dp; + op_copy_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_copy_caa_dp; + + op_copy_span_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_cn_dpan; + op_copy_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_copy_c_dpan; + op_copy_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_can_dpan; + op_copy_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_copy_pt_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = c; +} + +#define _op_copy_pt_cn_dp _op_copy_pt_c_dp +#define _op_copy_pt_can_dp _op_copy_pt_c_dp +#define _op_copy_pt_caa_dp _op_copy_pt_c_dp + +#define _op_copy_pt_c_dpan _op_copy_pt_c_dp +#define _op_copy_pt_cn_dpan _op_copy_pt_c_dp +#define _op_copy_pt_can_dpan _op_copy_pt_c_dp +#define _op_copy_pt_caa_dpan _op_copy_pt_c_dp + +static void +init_copy_color_pt_funcs_c(void) +{ + op_copy_pt_funcs[SP_N][SM_N][SC_N][DP][CPU_C] = _op_copy_pt_cn_dp; + op_copy_pt_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_copy_pt_c_dp; + op_copy_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_C] = _op_copy_pt_can_dp; + op_copy_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_copy_pt_caa_dp; + + op_copy_pt_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_pt_cn_dpan; + op_copy_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_copy_pt_c_dpan; + op_copy_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_pt_can_dpan; + op_copy_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_pt_caa_dpan; +} +#endif + +/*-----*/ + +/* copy_rel color --> dst */ + +#ifdef BUILD_C +static void +_op_copy_rel_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + for (; d < e; d++) { + *d = MUL_SYM(*d >> 24, c); + } +} + + +#define _op_copy_rel_cn_dp _op_copy_rel_c_dp +#define _op_copy_rel_can_dp _op_copy_rel_c_dp +#define _op_copy_rel_caa_dp _op_copy_rel_c_dp + +#define _op_copy_rel_c_dpan _op_copy_c_dp +#define _op_copy_rel_cn_dpan _op_copy_cn_dp +#define _op_copy_rel_can_dpan _op_copy_can_dp +#define _op_copy_rel_caa_dpan _op_copy_caa_dp + +static void +init_copy_rel_color_span_funcs_c(void) +{ + op_copy_rel_span_funcs[SP_N][SM_N][SC_N][DP][CPU_C] = _op_copy_rel_cn_dp; + op_copy_rel_span_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_copy_rel_c_dp; + op_copy_rel_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_C] = _op_copy_rel_can_dp; + op_copy_rel_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_copy_rel_caa_dp; + + op_copy_rel_span_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_rel_cn_dpan; + op_copy_rel_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_copy_rel_c_dpan; + op_copy_rel_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_rel_can_dpan; + op_copy_rel_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_rel_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_copy_rel_pt_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = 1 + (*d >> 24); + *d = MUL_256(s, c); +} + + +#define _op_copy_rel_pt_cn_dp _op_copy_rel_pt_c_dp +#define _op_copy_rel_pt_can_dp _op_copy_rel_pt_c_dp +#define _op_copy_rel_pt_caa_dp _op_copy_rel_pt_c_dp + +#define _op_copy_rel_pt_c_dpan _op_copy_pt_c_dp +#define _op_copy_rel_pt_cn_dpan _op_copy_pt_cn_dp +#define _op_copy_rel_pt_can_dpan _op_copy_pt_can_dp +#define _op_copy_rel_pt_caa_dpan _op_copy_pt_caa_dp + +static void +init_copy_rel_color_pt_funcs_c(void) +{ + op_copy_rel_pt_funcs[SP_N][SM_N][SC_N][DP][CPU_C] = _op_copy_rel_pt_cn_dp; + op_copy_rel_pt_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_copy_rel_pt_c_dp; + op_copy_rel_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_C] = _op_copy_rel_pt_can_dp; + op_copy_rel_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_copy_rel_pt_caa_dp; + + op_copy_rel_pt_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_rel_pt_cn_dpan; + op_copy_rel_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_copy_rel_pt_c_dpan; + op_copy_rel_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_rel_pt_can_dpan; + op_copy_rel_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_rel_pt_caa_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_copy/op_copy_color_i386.c b/src/lib/engines/common/evas_op_copy/op_copy_color_i386.c new file mode 100644 index 0000000..31be24b --- /dev/null +++ b/src/lib/engines/common/evas_op_copy/op_copy_color_i386.c @@ -0,0 +1,151 @@ + +/* copy color --> dst */ + +#ifdef BUILD_MMX +static void +_op_copy_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l - 1; + movd_m2r(c, mm1); + movq_r2r(mm1, mm2); + psllq_i2r(32, mm1); + por_r2r(mm2, mm1); + for (; d < e; d+=2) { + movq_r2m(mm1, d[0]); + } + e+=1; + for (; d < e; d++) { + *d = c; + } +} + +#define _op_copy_cn_dp_mmx _op_copy_c_dp_mmx +#define _op_copy_can_dp_mmx _op_copy_c_dp_mmx +#define _op_copy_caa_dp_mmx _op_copy_c_dp_mmx + +#define _op_copy_cn_dpan_mmx _op_copy_c_dp_mmx +#define _op_copy_c_dpan_mmx _op_copy_c_dp_mmx +#define _op_copy_can_dpan_mmx _op_copy_c_dp_mmx +#define _op_copy_caa_dpan_mmx _op_copy_c_dp_mmx + +static void +init_copy_color_span_funcs_mmx(void) +{ + op_copy_span_funcs[SP_N][SM_N][SC_N][DP][CPU_MMX] = _op_copy_cn_dp_mmx; + op_copy_span_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_copy_c_dp_mmx; + op_copy_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_can_dp_mmx; + op_copy_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_caa_dp_mmx; + + op_copy_span_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_cn_dpan_mmx; + op_copy_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_c_dpan_mmx; + op_copy_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_can_dpan_mmx; + op_copy_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_caa_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_copy_pt_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = c; +} + +#define _op_copy_pt_cn_dp_mmx _op_copy_pt_c_dp_mmx +#define _op_copy_pt_can_dp_mmx _op_copy_pt_c_dp_mmx +#define _op_copy_pt_caa_dp_mmx _op_copy_pt_c_dp_mmx + +#define _op_copy_pt_cn_dpan_mmx _op_copy_pt_c_dp_mmx +#define _op_copy_pt_c_dpan_mmx _op_copy_pt_c_dp_mmx +#define _op_copy_pt_can_dpan_mmx _op_copy_pt_c_dp_mmx +#define _op_copy_pt_caa_dpan_mmx _op_copy_pt_c_dp_mmx + +static void +init_copy_color_pt_funcs_mmx(void) +{ + op_copy_pt_funcs[SP_N][SM_N][SC_N][DP][CPU_MMX] = _op_copy_pt_cn_dp_mmx; + op_copy_pt_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_copy_pt_c_dp_mmx; + op_copy_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_pt_can_dp_mmx; + op_copy_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_pt_caa_dp_mmx; + + op_copy_pt_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_pt_cn_dpan_mmx; + op_copy_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_pt_c_dpan_mmx; + op_copy_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_pt_can_dpan_mmx; + op_copy_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_pt_caa_dpan_mmx; +} +#endif + +/*-----*/ + +/* copy_rel color --> dst */ + +#ifdef BUILD_MMX +static void +_op_copy_rel_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm2, mm0) + for (; d < e; d++) { + DATA32 da = 1 + (*d >> 24); + MOV_A2R(da, mm1) + MUL4_256_R2R(mm2, mm1) + MOV_R2P(mm1, *d, mm0) + } +} + +#define _op_copy_rel_cn_dp_mmx _op_copy_rel_c_dp_mmx +#define _op_copy_rel_can_dp_mmx _op_copy_rel_c_dp_mmx +#define _op_copy_rel_caa_dp_mmx _op_copy_rel_c_dp_mmx + +#define _op_copy_rel_cn_dpan_mmx _op_copy_cn_dpan_mmx +#define _op_copy_rel_c_dpan_mmx _op_copy_c_dpan_mmx +#define _op_copy_rel_can_dpan_mmx _op_copy_can_dpan_mmx +#define _op_copy_rel_caa_dpan_mmx _op_copy_caa_dpan_mmx + +static void +init_copy_rel_color_span_funcs_mmx(void) +{ + op_copy_rel_span_funcs[SP_N][SM_N][SC_N][DP][CPU_MMX] = _op_copy_rel_cn_dp_mmx; + op_copy_rel_span_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_copy_rel_c_dp_mmx; + op_copy_rel_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_rel_can_dp_mmx; + op_copy_rel_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_rel_caa_dp_mmx; + + op_copy_rel_span_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_cn_dpan_mmx; + op_copy_rel_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_rel_c_dpan_mmx; + op_copy_rel_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_can_dpan_mmx; + op_copy_rel_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_caa_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_copy_rel_pt_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = 1 + (*d >> 24); + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm2, mm0) + MOV_A2R(s, mm1) + MUL4_256_R2R(mm2, mm1) + MOV_R2P(mm1, *d, mm0) +} + + +#define _op_copy_rel_pt_cn_dp_mmx _op_copy_rel_pt_c_dp_mmx +#define _op_copy_rel_pt_can_dp_mmx _op_copy_rel_pt_c_dp_mmx +#define _op_copy_rel_pt_caa_dp_mmx _op_copy_rel_pt_c_dp_mmx + +#define _op_copy_rel_pt_cn_dpan_mmx _op_copy_pt_cn_dpan_mmx +#define _op_copy_rel_pt_c_dpan_mmx _op_copy_pt_c_dpan_mmx +#define _op_copy_rel_pt_can_dpan_mmx _op_copy_pt_can_dpan_mmx +#define _op_copy_rel_pt_caa_dpan_mmx _op_copy_pt_caa_dpan_mmx + +static void +init_copy_rel_color_pt_funcs_mmx(void) +{ + op_copy_rel_pt_funcs[SP_N][SM_N][SC_N][DP][CPU_MMX] = _op_copy_rel_pt_cn_dp_mmx; + op_copy_rel_pt_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_copy_rel_pt_c_dp_mmx; + op_copy_rel_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_rel_pt_can_dp_mmx; + op_copy_rel_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_rel_pt_caa_dp_mmx; + + op_copy_rel_pt_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pt_cn_dpan_mmx; + op_copy_rel_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_rel_pt_c_dpan_mmx; + op_copy_rel_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_pt_can_dpan_mmx; + op_copy_rel_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_pt_caa_dpan_mmx; +} +#endif diff --git a/src/lib/engines/common/evas_op_copy/op_copy_mask_color_.c b/src/lib/engines/common/evas_op_copy/op_copy_mask_color_.c new file mode 100644 index 0000000..c81888a --- /dev/null +++ b/src/lib/engines/common/evas_op_copy/op_copy_mask_color_.c @@ -0,0 +1,167 @@ + +/* copy mask x color -> dst */ + +#ifdef BUILD_C +static void +_op_copy_mas_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + case 255: + *d = c; + break; + default: + l++; + *d = INTERP_256(l, c, *d); + break; + } + m++; d++; + } +} + +#define _op_copy_mas_cn_dp _op_copy_mas_c_dp +#define _op_copy_mas_can_dp _op_copy_mas_c_dp +#define _op_copy_mas_caa_dp _op_copy_mas_c_dp + +#define _op_copy_mas_c_dpan _op_copy_mas_c_dp +#define _op_copy_mas_cn_dpan _op_copy_mas_c_dpan +#define _op_copy_mas_can_dpan _op_copy_mas_c_dpan +#define _op_copy_mas_caa_dpan _op_copy_mas_c_dpan + +static void +init_copy_mask_color_span_funcs_c(void) +{ + op_copy_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_C] = _op_copy_mas_cn_dp; + op_copy_span_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_copy_mas_c_dp; + op_copy_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_copy_mas_can_dp; + op_copy_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_copy_mas_caa_dp; + + op_copy_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_mas_cn_dpan; + op_copy_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_copy_mas_c_dpan; + op_copy_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_copy_mas_can_dpan; + op_copy_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_copy_mas_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_copy_pt_mas_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = INTERP_256(m + 1, c, *d); +} + + +#define _op_copy_pt_mas_cn_dp _op_copy_pt_mas_c_dp +#define _op_copy_pt_mas_can_dp _op_copy_pt_mas_c_dp +#define _op_copy_pt_mas_caa_dp _op_copy_pt_mas_c_dp + +#define _op_copy_pt_mas_c_dpan _op_copy_pt_mas_c_dp +#define _op_copy_pt_mas_cn_dpan _op_copy_pt_mas_c_dpan +#define _op_copy_pt_mas_can_dpan _op_copy_pt_mas_c_dpan +#define _op_copy_pt_mas_caa_dpan _op_copy_pt_mas_c_dpan + +static void +init_copy_mask_color_pt_funcs_c(void) +{ + op_copy_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_C] = _op_copy_pt_mas_cn_dp; + op_copy_pt_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_copy_pt_mas_c_dp; + op_copy_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_copy_pt_mas_can_dp; + op_copy_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_copy_pt_mas_caa_dp; + + op_copy_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_pt_mas_cn_dpan; + op_copy_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_copy_pt_mas_c_dpan; + op_copy_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_copy_pt_mas_can_dpan; + op_copy_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_copy_pt_mas_caa_dpan; +} +#endif + +/*-----*/ + +/* copy_rel mask x color -> dst */ + +#ifdef BUILD_C +static void +_op_copy_rel_mas_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + case 255: + l = 1 + (*d >> 24); + *d = MUL_256(l, c); + break; + default: + { + DATA32 da = 1 + (*d >> 24); + da = MUL_256(da, c); + l++; + *d = INTERP_256(l, da, *d); + } + break; + } + m++; d++; + } +} + + +#define _op_copy_rel_mas_cn_dp _op_copy_rel_mas_c_dp +#define _op_copy_rel_mas_can_dp _op_copy_rel_mas_c_dp +#define _op_copy_rel_mas_caa_dp _op_copy_rel_mas_c_dp + +#define _op_copy_rel_mas_c_dpan _op_copy_mas_c_dpan +#define _op_copy_rel_mas_cn_dpan _op_copy_mas_cn_dpan +#define _op_copy_rel_mas_can_dpan _op_copy_mas_can_dpan +#define _op_copy_rel_mas_caa_dpan _op_copy_mas_caa_dpan + +static void +init_copy_rel_mask_color_span_funcs_c(void) +{ + op_copy_rel_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_C] = _op_copy_rel_mas_cn_dp; + op_copy_rel_span_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_copy_rel_mas_c_dp; + op_copy_rel_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_copy_rel_mas_can_dp; + op_copy_rel_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_copy_rel_mas_caa_dp; + + op_copy_rel_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_rel_mas_cn_dpan; + op_copy_rel_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_copy_rel_mas_c_dpan; + op_copy_rel_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_copy_rel_mas_can_dpan; + op_copy_rel_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_copy_rel_mas_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_copy_rel_pt_mas_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = 1 + (*d >> 24); + s = MUL_256(s, c); + *d = INTERP_256(m + 1, s, *d); +} + +#define _op_copy_rel_pt_mas_cn_dp _op_copy_rel_pt_mas_c_dp +#define _op_copy_rel_pt_mas_can_dp _op_copy_rel_pt_mas_c_dp +#define _op_copy_rel_pt_mas_caa_dp _op_copy_rel_pt_mas_c_dp + +#define _op_copy_rel_pt_mas_c_dpan _op_copy_pt_mas_c_dpan +#define _op_copy_rel_pt_mas_cn_dpan _op_copy_pt_mas_cn_dpan +#define _op_copy_rel_pt_mas_can_dpan _op_copy_pt_mas_can_dpan +#define _op_copy_rel_pt_mas_caa_dpan _op_copy_pt_mas_caa_dpan + +static void +init_copy_rel_mask_color_pt_funcs_c(void) +{ + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_C] = _op_copy_rel_pt_mas_cn_dp; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_copy_rel_pt_mas_c_dp; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_copy_rel_pt_mas_can_dp; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_copy_rel_pt_mas_caa_dp; + + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_rel_pt_mas_cn_dpan; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_copy_rel_pt_mas_c_dpan; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_copy_rel_pt_mas_can_dpan; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_copy_rel_pt_mas_caa_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_copy/op_copy_mask_color_i386.c b/src/lib/engines/common/evas_op_copy/op_copy_mask_color_i386.c new file mode 100644 index 0000000..6704ba6 --- /dev/null +++ b/src/lib/engines/common/evas_op_copy/op_copy_mask_color_i386.c @@ -0,0 +1,194 @@ + +/* copy mask x color -> dst */ + +#ifdef BUILD_MMX +static void +_op_copy_mas_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm2, mm0) + MOV_A2R(ALPHA_255, mm5) + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + case 255: + *d = c; + break; + default: + { + l++; + MOV_A2R(l, mm3) + MOV_P2R(*d, mm1, mm0) + movq_r2r(mm2, mm4); + INTERP_256_R2R(mm3, mm4, mm1, mm5); + MOV_R2P(mm1, *d, mm0) + } + break; + } + m++; d++; + } +} + +#define _op_copy_mas_cn_dp_mmx _op_copy_mas_c_dp_mmx +#define _op_copy_mas_can_dp_mmx _op_copy_mas_c_dp_mmx +#define _op_copy_mas_caa_dp_mmx _op_copy_mas_c_dp_mmx + +#define _op_copy_mas_c_dpan_mmx _op_copy_mas_c_dp_mmx +#define _op_copy_mas_cn_dpan_mmx _op_copy_mas_c_dpan_mmx +#define _op_copy_mas_can_dpan_mmx _op_copy_mas_c_dpan_mmx +#define _op_copy_mas_caa_dpan_mmx _op_copy_mas_c_dpan_mmx + +static void +init_copy_mask_color_span_funcs_mmx(void) +{ + op_copy_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_mas_cn_dp_mmx; + op_copy_span_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_copy_mas_c_dp_mmx; + op_copy_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_copy_mas_can_dp_mmx; + op_copy_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_copy_mas_caa_dp_mmx; + + op_copy_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_mas_cn_dpan_mmx; + op_copy_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_copy_mas_c_dpan_mmx; + op_copy_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_copy_mas_can_dpan_mmx; + op_copy_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_copy_mas_caa_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_copy_pt_mas_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = m + 1; + MOV_A2R(ALPHA_255, mm5) + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm2, mm0) + MOV_A2R(s, mm3) + MOV_P2R(*d, mm1, mm0) + INTERP_256_R2R(mm3, mm2, mm1, mm5); + MOV_R2P(mm1, *d, mm0) +} + +#define _op_copy_pt_mas_cn_dp_mmx _op_copy_pt_mas_c_dp_mmx +#define _op_copy_pt_mas_can_dp_mmx _op_copy_pt_mas_c_dp_mmx +#define _op_copy_pt_mas_caa_dp_mmx _op_copy_pt_mas_c_dp_mmx + +#define _op_copy_pt_mas_c_dpan_mmx _op_copy_pt_mas_c_dp_mmx +#define _op_copy_pt_mas_cn_dpan_mmx _op_copy_pt_mas_c_dpan_mmx +#define _op_copy_pt_mas_can_dpan_mmx _op_copy_pt_mas_c_dpan_mmx +#define _op_copy_pt_mas_caa_dpan_mmx _op_copy_pt_mas_c_dpan_mmx + +static void +init_copy_mask_color_pt_funcs_mmx(void) +{ + op_copy_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_pt_mas_cn_dp_mmx; + op_copy_pt_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_copy_pt_mas_c_dp_mmx; + op_copy_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_copy_pt_mas_can_dp_mmx; + op_copy_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_copy_pt_mas_caa_dp_mmx; + + op_copy_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_pt_mas_cn_dpan_mmx; + op_copy_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_copy_pt_mas_c_dpan_mmx; + op_copy_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_copy_pt_mas_can_dpan_mmx; + op_copy_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_copy_pt_mas_caa_dpan_mmx; +} +#endif + +/*-----*/ + +/* copy_rel mask x color -> dst */ + +#ifdef BUILD_MMX +static void +_op_copy_rel_mas_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm2, mm0) + MOV_A2R(ALPHA_255, mm5) + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + case 255: + l = 1 + (*d >> 24); + MOV_A2R(l, mm1) + MUL4_256_R2R(mm2, mm1) + MOV_R2P(mm1, *d, mm0) + break; + default: + l++; + MOV_A2R(l, mm3) + MOV_P2R(*d, mm1, mm0) + MOV_RA2R(mm1, mm4) + MUL4_256_R2R(mm2, mm4) + INTERP_256_R2R(mm3, mm4, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + break; + } + m++; d++; + } +} + +#define _op_copy_rel_mas_cn_dp_mmx _op_copy_rel_mas_c_dp_mmx +#define _op_copy_rel_mas_can_dp_mmx _op_copy_rel_mas_c_dp_mmx +#define _op_copy_rel_mas_caa_dp_mmx _op_copy_rel_mas_c_dp_mmx + +#define _op_copy_rel_mas_c_dpan_mmx _op_copy_mas_c_dpan_mmx +#define _op_copy_rel_mas_cn_dpan_mmx _op_copy_mas_cn_dpan_mmx +#define _op_copy_rel_mas_can_dpan_mmx _op_copy_mas_can_dpan_mmx +#define _op_copy_rel_mas_caa_dpan_mmx _op_copy_mas_caa_dpan_mmx + +static void +init_copy_rel_mask_color_span_funcs_mmx(void) +{ + op_copy_rel_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_rel_mas_cn_dp_mmx; + op_copy_rel_span_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_copy_rel_mas_c_dp_mmx; + op_copy_rel_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_copy_rel_mas_can_dp_mmx; + op_copy_rel_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_copy_rel_mas_caa_dp_mmx; + + op_copy_rel_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_mas_cn_dpan_mmx; + op_copy_rel_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_copy_rel_mas_c_dpan_mmx; + op_copy_rel_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_mas_can_dpan_mmx; + op_copy_rel_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_mas_caa_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_copy_rel_pt_mas_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = m + 1; + MOV_A2R(ALPHA_255, mm5) + pxor_r2r(mm0, mm0); + MOV_A2R(s, mm3) + MOV_P2R(*d, mm1, mm0) + MOV_RA2R(mm1, mm4) + MOV_P2R(c, mm2, mm0) + MUL4_256_R2R(mm2, mm4) + INTERP_256_R2R(mm3, mm4, mm1, mm5) + MOV_R2P(mm1, *d, mm0) +} + +#define _op_copy_rel_pt_mas_cn_dp_mmx _op_copy_rel_pt_mas_c_dp_mmx +#define _op_copy_rel_pt_mas_can_dp_mmx _op_copy_rel_pt_mas_c_dp_mmx +#define _op_copy_rel_pt_mas_caa_dp_mmx _op_copy_rel_pt_mas_c_dp_mmx + +#define _op_copy_rel_pt_mas_c_dpan_mmx _op_copy_pt_mas_c_dpan_mmx +#define _op_copy_rel_pt_mas_cn_dpan_mmx _op_copy_pt_mas_cn_dpan_mmx +#define _op_copy_rel_pt_mas_can_dpan_mmx _op_copy_pt_mas_can_dpan_mmx +#define _op_copy_rel_pt_mas_caa_dpan_mmx _op_copy_pt_mas_caa_dpan_mmx + +static void +init_copy_rel_mask_color_pt_funcs_mmx(void) +{ + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_rel_pt_mas_cn_dp_mmx; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_copy_rel_pt_mas_c_dp_mmx; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_copy_rel_pt_mas_can_dp_mmx; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_copy_rel_pt_mas_caa_dp_mmx; + + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pt_mas_cn_dpan_mmx; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_copy_rel_pt_mas_c_dpan_mmx; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_pt_mas_can_dpan_mmx; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_pt_mas_caa_dpan_mmx; +} +#endif diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_.c new file mode 100644 index 0000000..2fa31c3 --- /dev/null +++ b/src/lib/engines/common/evas_op_copy/op_copy_pixel_.c @@ -0,0 +1,119 @@ + +/* copy pixel --> dst */ + +#ifdef BUILD_C +static void +_op_copy_p_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + for (; d < e; d++, s++) { + *d = *s; + } +} + +#define _op_copy_pan_dp _op_copy_p_dp +#define _op_copy_pas_dp _op_copy_p_dp + +#define _op_copy_p_dpan _op_copy_p_dp +#define _op_copy_pan_dpan _op_copy_pan_dp +#define _op_copy_pas_dpan _op_copy_pas_dp + +static void +init_copy_pixel_span_funcs_c(void) +{ + op_copy_span_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_copy_p_dp; + op_copy_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_copy_pan_dp; + op_copy_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_copy_pas_dp; + + op_copy_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_p_dpan; + op_copy_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_pan_dpan; + op_copy_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_pas_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_copy_pt_p_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = s; +} + +#define _op_copy_pt_pan_dp _op_copy_pt_p_dp +#define _op_copy_pt_pas_dp _op_copy_pt_p_dp + +#define _op_copy_pt_p_dpan _op_copy_pt_p_dp +#define _op_copy_pt_pan_dpan _op_copy_pt_pan_dp +#define _op_copy_pt_pas_dpan _op_copy_pt_pas_dp + +static void +init_copy_pixel_pt_funcs_c(void) +{ + op_copy_pt_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_copy_pt_p_dp; + op_copy_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_copy_pt_pan_dp; + op_copy_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_copy_pt_pas_dp; + + op_copy_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_pt_p_dpan; + op_copy_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_pt_pan_dpan; + op_copy_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_pt_pas_dpan; +} +#endif + +/*-----*/ + +/* copy_rel pixel --> dst */ + +#ifdef BUILD_C +static void +_op_copy_rel_p_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + for (; d < e; d++, s++) { + *d = MUL_SYM(*d >> 24, *s); + } +} + + +#define _op_copy_rel_pas_dp _op_copy_rel_p_dp +#define _op_copy_rel_pan_dp _op_copy_rel_p_dp + +#define _op_copy_rel_p_dpan _op_copy_p_dpan +#define _op_copy_rel_pan_dpan _op_copy_pan_dpan +#define _op_copy_rel_pas_dpan _op_copy_pas_dpan + +static void +init_copy_rel_pixel_span_funcs_c(void) +{ + op_copy_rel_span_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_copy_rel_p_dp; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_copy_rel_pan_dp; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_copy_rel_pas_dp; + + op_copy_rel_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_rel_p_dpan; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_rel_pan_dpan; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_rel_pas_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_copy_rel_pt_p_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + c = 1 + (*d >> 24); + *d = MUL_256(c, s); +} + + +#define _op_copy_rel_pt_pan_dp _op_copy_rel_pt_p_dp +#define _op_copy_rel_pt_pas_dp _op_copy_rel_pt_p_dp + +#define _op_copy_rel_pt_p_dpan _op_copy_pt_p_dpan +#define _op_copy_rel_pt_pan_dpan _op_copy_pt_pan_dpan +#define _op_copy_rel_pt_pas_dpan _op_copy_pt_pas_dpan + +static void +init_copy_rel_pixel_pt_funcs_c(void) +{ + op_copy_rel_pt_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_copy_rel_pt_p_dp; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_copy_rel_pt_pan_dp; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_copy_rel_pt_pas_dp; + + op_copy_rel_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_rel_pt_p_dpan; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_rel_pt_pan_dpan; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_copy_rel_pt_pas_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_.c new file mode 100644 index 0000000..f035cbc --- /dev/null +++ b/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_.c @@ -0,0 +1,234 @@ + +/* copy pixel x color --> dst */ + +#ifdef BUILD_C +static void +_op_copy_p_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + *d = MUL4_SYM(c, *s); + d++; + s++; + } +} + +static void +_op_copy_p_caa_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + c = 1 + (c >> 24); + while (d < e) { + *d = MUL_256(c, *s); + d++; + s++; + } +} + + +#define _op_copy_pas_c_dp _op_copy_p_c_dp +#define _op_copy_pan_c_dp _op_copy_p_c_dp +#define _op_copy_p_can_dp _op_copy_p_c_dp +#define _op_copy_pas_can_dp _op_copy_p_can_dp +#define _op_copy_pan_can_dp _op_copy_p_c_dp +#define _op_copy_pas_caa_dp _op_copy_p_caa_dp +#define _op_copy_pan_caa_dp _op_copy_p_caa_dp + +#define _op_copy_p_c_dpan _op_copy_p_c_dp +#define _op_copy_pas_c_dpan _op_copy_pas_c_dp +#define _op_copy_pan_c_dpan _op_copy_pan_c_dp +#define _op_copy_p_can_dpan _op_copy_p_can_dp +#define _op_copy_pas_can_dpan _op_copy_pas_can_dp +#define _op_copy_pan_can_dpan _op_copy_pan_can_dp +#define _op_copy_p_caa_dpan _op_copy_p_caa_dp +#define _op_copy_pas_caa_dpan _op_copy_pas_caa_dp +#define _op_copy_pan_caa_dpan _op_copy_pan_caa_dp + +static void +init_copy_pixel_color_span_funcs_c(void) +{ + op_copy_span_funcs[SP][SM_N][SC][DP][CPU_C] = _op_copy_p_c_dp; + op_copy_span_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_copy_pas_c_dp; + op_copy_span_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_copy_pan_c_dp; + op_copy_span_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_copy_p_can_dp; + op_copy_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_copy_pas_can_dp; + op_copy_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_copy_pan_can_dp; + op_copy_span_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_copy_p_caa_dp; + op_copy_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_copy_pas_caa_dp; + op_copy_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_copy_pan_caa_dp; + + op_copy_span_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_copy_p_c_dpan; + op_copy_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_copy_pas_c_dpan; + op_copy_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_copy_pan_c_dpan; + op_copy_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_p_can_dpan; + op_copy_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_pas_can_dpan; + op_copy_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_pan_can_dpan; + op_copy_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_p_caa_dpan; + op_copy_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_pas_caa_dpan; + op_copy_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_pan_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_copy_pt_p_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = MUL4_SYM(c, s); +} + +static void +_op_copy_pt_p_caa_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = MUL_SYM(c >> 24, s); +} + + +#define _op_copy_pt_p_can_dp _op_copy_pt_p_c_dp +#define _op_copy_pt_pan_c_dp _op_copy_pt_p_c_dp +#define _op_copy_pt_pan_can_dp _op_copy_pt_p_c_dp +#define _op_copy_pt_pan_caa_dp _op_copy_pt_p_caa_dp +#define _op_copy_pt_pas_c_dp _op_copy_pt_p_c_dp +#define _op_copy_pt_pas_can_dp _op_copy_pt_p_can_dp +#define _op_copy_pt_pas_caa_dp _op_copy_pt_p_caa_dp + +#define _op_copy_pt_p_c_dpan _op_copy_pt_p_c_dp +#define _op_copy_pt_pas_c_dpan _op_copy_pt_pas_c_dp +#define _op_copy_pt_pan_c_dpan _op_copy_pt_pan_c_dp +#define _op_copy_pt_p_can_dpan _op_copy_pt_p_can_dp +#define _op_copy_pt_pas_can_dpan _op_copy_pt_pas_can_dp +#define _op_copy_pt_pan_can_dpan _op_copy_pt_pan_can_dp +#define _op_copy_pt_p_caa_dpan _op_copy_pt_p_caa_dp +#define _op_copy_pt_pas_caa_dpan _op_copy_pt_pas_caa_dp +#define _op_copy_pt_pan_caa_dpan _op_copy_pt_pan_caa_dp + +static void +init_copy_pixel_color_pt_funcs_c(void) +{ + op_copy_pt_funcs[SP][SM_N][SC][DP][CPU_C] = _op_copy_pt_p_c_dp; + op_copy_pt_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_copy_pt_pas_c_dp; + op_copy_pt_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_copy_pt_pan_c_dp; + op_copy_pt_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_copy_pt_p_can_dp; + op_copy_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_copy_pt_pas_can_dp; + op_copy_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_copy_pt_pan_can_dp; + op_copy_pt_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_copy_pt_p_caa_dp; + op_copy_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_copy_pt_pas_caa_dp; + op_copy_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_copy_pt_pan_caa_dp; + + op_copy_pt_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_copy_pt_p_c_dpan; + op_copy_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_copy_pt_pas_c_dpan; + op_copy_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_copy_pt_pan_c_dpan; + op_copy_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_pt_p_can_dpan; + op_copy_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_pt_pas_can_dpan; + op_copy_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_pt_pan_can_dpan; + op_copy_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_pt_p_caa_dpan; + op_copy_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_pt_pas_caa_dpan; + op_copy_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_pt_pan_caa_dpan; +} +#endif + +/*-----*/ + +/* copy_rel pixel x color --> dst */ + +#ifdef BUILD_C +static void +_op_copy_rel_p_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + DATA32 cs = MUL4_SYM(c, *s); + *d = MUL_SYM(*d >> 24, cs); + d++; + s++; + } +} + +#define _op_copy_rel_pas_c_dp _op_copy_rel_p_c_dp +#define _op_copy_rel_pan_c_dp _op_copy_rel_p_c_dp +#define _op_copy_rel_p_can_dp _op_copy_rel_p_c_dp +#define _op_copy_rel_pas_can_dp _op_copy_rel_pas_c_dp +#define _op_copy_rel_pan_can_dp _op_copy_rel_p_c_dp +#define _op_copy_rel_p_caa_dp _op_copy_rel_p_c_dp +#define _op_copy_rel_pas_caa_dp _op_copy_rel_p_c_dp +#define _op_copy_rel_pan_caa_dp _op_copy_rel_p_c_dp + +#define _op_copy_rel_p_c_dpan _op_copy_p_c_dpan +#define _op_copy_rel_pas_c_dpan _op_copy_pas_c_dpan +#define _op_copy_rel_pan_c_dpan _op_copy_pan_c_dpan +#define _op_copy_rel_p_can_dpan _op_copy_p_can_dpan +#define _op_copy_rel_pas_can_dpan _op_copy_pas_can_dpan +#define _op_copy_rel_pan_can_dpan _op_copy_pan_can_dpan +#define _op_copy_rel_p_caa_dpan _op_copy_p_caa_dpan +#define _op_copy_rel_pas_caa_dpan _op_copy_pas_caa_dpan +#define _op_copy_rel_pan_caa_dpan _op_copy_pan_caa_dpan + +static void +init_copy_rel_pixel_color_span_funcs_c(void) +{ + op_copy_rel_span_funcs[SP][SM_N][SC][DP][CPU_C] = _op_copy_rel_p_c_dp; + op_copy_rel_span_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_copy_rel_pas_c_dp; + op_copy_rel_span_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_copy_rel_pan_c_dp; + op_copy_rel_span_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_copy_rel_p_can_dp; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_copy_rel_pas_can_dp; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_copy_rel_pan_can_dp; + op_copy_rel_span_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_copy_rel_p_caa_dp; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_copy_rel_pas_caa_dp; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_copy_rel_pan_caa_dp; + + op_copy_rel_span_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_copy_rel_p_c_dpan; + op_copy_rel_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_copy_rel_pas_c_dpan; + op_copy_rel_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_copy_rel_pan_c_dpan; + op_copy_rel_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_rel_p_can_dpan; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_rel_pas_can_dpan; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_rel_pan_can_dpan; + op_copy_rel_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_rel_p_caa_dpan; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_rel_pas_caa_dpan; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_rel_pan_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_copy_rel_pt_p_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = MUL4_SYM(c, s); + *d = MUL_SYM(*d >> 24, s); +} + +#define _op_copy_rel_pt_pas_c_dp _op_copy_rel_pt_p_c_dp +#define _op_copy_rel_pt_pan_c_dp _op_copy_rel_pt_p_c_dp +#define _op_copy_rel_pt_p_can_dp _op_copy_rel_pt_p_c_dp +#define _op_copy_rel_pt_pas_can_dp _op_copy_rel_pt_p_can_dp +#define _op_copy_rel_pt_pan_can_dp _op_copy_rel_pt_p_c_dp +#define _op_copy_rel_pt_p_caa_dp _op_copy_rel_pt_p_c_dp +#define _op_copy_rel_pt_pas_caa_dp _op_copy_rel_pt_p_caa_dp +#define _op_copy_rel_pt_pan_caa_dp _op_copy_rel_pt_p_caa_dp + +#define _op_copy_rel_pt_p_c_dpan _op_copy_pt_p_c_dpan +#define _op_copy_rel_pt_pas_c_dpan _op_copy_pt_pas_c_dpan +#define _op_copy_rel_pt_pan_c_dpan _op_copy_pt_pan_c_dpan +#define _op_copy_rel_pt_p_can_dpan _op_copy_pt_p_can_dpan +#define _op_copy_rel_pt_pas_can_dpan _op_copy_pt_pas_can_dpan +#define _op_copy_rel_pt_pan_can_dpan _op_copy_pt_pan_can_dpan +#define _op_copy_rel_pt_p_caa_dpan _op_copy_pt_p_caa_dpan +#define _op_copy_rel_pt_pas_caa_dpan _op_copy_pt_pas_caa_dpan +#define _op_copy_rel_pt_pan_caa_dpan _op_copy_pt_pan_caa_dpan + +static void +init_copy_rel_pixel_color_pt_funcs_c(void) +{ + op_copy_rel_pt_funcs[SP][SM_N][SC][DP][CPU_C] = _op_copy_rel_pt_p_c_dp; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_copy_rel_pt_pas_c_dp; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_copy_rel_pt_pan_c_dp; + op_copy_rel_pt_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_copy_rel_pt_p_can_dp; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_copy_rel_pt_pas_can_dp; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_copy_rel_pt_pan_can_dp; + op_copy_rel_pt_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_copy_rel_pt_p_caa_dp; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_copy_rel_pt_pas_caa_dp; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_copy_rel_pt_pan_caa_dp; + + op_copy_rel_pt_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_copy_rel_pt_p_c_dpan; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_copy_rel_pt_pas_c_dpan; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_copy_rel_pt_pan_c_dpan; + op_copy_rel_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_rel_pt_p_can_dpan; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_rel_pt_pas_can_dpan; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_copy_rel_pt_pan_can_dpan; + op_copy_rel_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_rel_pt_p_caa_dpan; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_rel_pt_pas_caa_dpan; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_copy_rel_pt_pan_caa_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_i386.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_i386.c new file mode 100644 index 0000000..48868c5 --- /dev/null +++ b/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_i386.c @@ -0,0 +1,256 @@ + +/* copy pixel x color --> dst */ + +#ifdef BUILD_MMX +static void +_op_copy_p_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm3, mm0) + MOV_A2R(ALPHA_255, mm5) + while (d < e) { + MOV_P2R(*s, mm2, mm0) + MUL4_SYM_R2R(mm3, mm2, mm5); + MOV_R2P(mm2, *d, mm0) + s++; d++; + } +} + + +static void +_op_copy_p_caa_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + c = 1 + (c >> 24); + MOV_A2R(c, mm3) + pxor_r2r(mm0, mm0); + while (d < e) { + MOV_P2R(*s, mm2, mm0) + MUL4_256_R2R(mm3, mm2); + MOV_R2P(mm2, *d, mm0) + s++; d++; + } +} + + +#define _op_copy_pas_c_dp_mmx _op_copy_p_c_dp_mmx +#define _op_copy_pan_c_dp_mmx _op_copy_p_c_dp_mmx +#define _op_copy_p_can_dp_mmx _op_copy_p_c_dp_mmx +#define _op_copy_pas_can_dp_mmx _op_copy_pas_c_dp_mmx +#define _op_copy_pan_can_dp_mmx _op_copy_pan_c_dp_mmx +#define _op_copy_pas_caa_dp_mmx _op_copy_p_caa_dp_mmx +#define _op_copy_pan_caa_dp_mmx _op_copy_p_caa_dp_mmx + +#define _op_copy_p_c_dpan_mmx _op_copy_p_c_dp_mmx +#define _op_copy_pas_c_dpan_mmx _op_copy_pas_c_dp_mmx +#define _op_copy_pan_c_dpan_mmx _op_copy_pan_c_dp_mmx +#define _op_copy_p_can_dpan_mmx _op_copy_p_can_dp_mmx +#define _op_copy_pas_can_dpan_mmx _op_copy_pas_can_dp_mmx +#define _op_copy_pan_can_dpan_mmx _op_copy_pan_can_dp_mmx +#define _op_copy_p_caa_dpan_mmx _op_copy_p_caa_dp_mmx +#define _op_copy_pas_caa_dpan_mmx _op_copy_pas_caa_dp_mmx +#define _op_copy_pan_caa_dpan_mmx _op_copy_pan_caa_dp_mmx + +static void +init_copy_pixel_color_span_funcs_mmx(void) +{ + op_copy_span_funcs[SP][SM_N][SC][DP][CPU_MMX] = _op_copy_p_c_dp_mmx; + op_copy_span_funcs[SP_AS][SM_N][SC][DP][CPU_MMX] = _op_copy_pas_c_dp_mmx; + op_copy_span_funcs[SP_AN][SM_N][SC][DP][CPU_MMX] = _op_copy_pan_c_dp_mmx; + op_copy_span_funcs[SP][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_p_can_dp_mmx; + op_copy_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_pas_can_dp_mmx; + op_copy_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_pan_can_dp_mmx; + op_copy_span_funcs[SP][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_p_caa_dp_mmx; + op_copy_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_pas_caa_dp_mmx; + op_copy_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_pan_caa_dp_mmx; + + op_copy_span_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_p_c_dpan_mmx; + op_copy_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_pas_c_dpan_mmx; + op_copy_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_pan_c_dpan_mmx; + op_copy_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_p_can_dpan_mmx; + op_copy_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_pas_can_dpan_mmx; + op_copy_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_pan_can_dpan_mmx; + op_copy_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_p_caa_dpan_mmx; + op_copy_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_pas_caa_dpan_mmx; + op_copy_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_pan_caa_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_copy_pt_p_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) + MOV_P2R(c, mm2, mm0) + MOV_P2R(s, mm2, mm0) + MUL4_SYM_R2R(mm3, mm2, mm5); + MOV_R2P(mm2, *d, mm0) +} + +#define _op_copy_pt_pas_c_dp_mmx _op_copy_pt_p_c_dp_mmx +#define _op_copy_pt_pan_c_dp_mmx _op_copy_pt_p_c_dp_mmx +#define _op_copy_pt_p_can_dp_mmx _op_copy_pt_p_c_dp_mmx +#define _op_copy_pt_pas_can_dp_mmx _op_copy_pt_p_c_dp_mmx +#define _op_copy_pt_pan_can_dp_mmx _op_copy_pt_p_c_dp_mmx +#define _op_copy_pt_p_caa_dp_mmx _op_copy_pt_p_c_dp_mmx +#define _op_copy_pt_pas_caa_dp_mmx _op_copy_pt_p_c_dp_mmx +#define _op_copy_pt_pan_caa_dp_mmx _op_copy_pt_p_c_dp_mmx + +#define _op_copy_pt_p_c_dpan_mmx _op_copy_pt_p_c_dp_mmx +#define _op_copy_pt_pas_c_dpan_mmx _op_copy_pt_pas_c_dp_mmx +#define _op_copy_pt_pan_c_dpan_mmx _op_copy_pt_pan_c_dp_mmx +#define _op_copy_pt_p_can_dpan_mmx _op_copy_pt_p_can_dp_mmx +#define _op_copy_pt_pas_can_dpan_mmx _op_copy_pt_pas_can_dp_mmx +#define _op_copy_pt_pan_can_dpan_mmx _op_copy_pt_pan_can_dp_mmx +#define _op_copy_pt_p_caa_dpan_mmx _op_copy_pt_p_caa_dp_mmx +#define _op_copy_pt_pas_caa_dpan_mmx _op_copy_pt_pas_caa_dp_mmx +#define _op_copy_pt_pan_caa_dpan_mmx _op_copy_pt_pan_caa_dp_mmx + +static void +init_copy_pixel_color_pt_funcs_mmx(void) +{ + op_copy_pt_funcs[SP][SM_N][SC][DP][CPU_MMX] = _op_copy_pt_p_c_dp_mmx; + op_copy_pt_funcs[SP_AS][SM_N][SC][DP][CPU_MMX] = _op_copy_pt_pas_c_dp_mmx; + op_copy_pt_funcs[SP_AN][SM_N][SC][DP][CPU_MMX] = _op_copy_pt_pan_c_dp_mmx; + op_copy_pt_funcs[SP][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_pt_p_can_dp_mmx; + op_copy_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_pt_pas_can_dp_mmx; + op_copy_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_pt_pan_can_dp_mmx; + op_copy_pt_funcs[SP][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_pt_p_caa_dp_mmx; + op_copy_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_pt_pas_caa_dp_mmx; + op_copy_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_pt_pan_caa_dp_mmx; + + op_copy_pt_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_pt_p_c_dpan_mmx; + op_copy_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_pt_pas_c_dpan_mmx; + op_copy_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_pt_pan_c_dpan_mmx; + op_copy_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_pt_p_can_dpan_mmx; + op_copy_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_pt_pas_can_dpan_mmx; + op_copy_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_pt_pan_can_dpan_mmx; + op_copy_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_pt_p_caa_dpan_mmx; + op_copy_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_pt_pas_caa_dpan_mmx; + op_copy_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_pt_pan_caa_dpan_mmx; +} +#endif + +/*-----*/ + +/* copy_rel pixel x color --> dst */ + +#ifdef BUILD_MMX +static void +_op_copy_rel_p_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm3, mm0) + MOV_A2R(ALPHA_255, mm5) + while (d < e) { + MOV_PA2R(*d, mm1) + MOV_P2R(*s, mm2, mm0) + MUL4_SYM_R2R(mm3, mm2, mm5); + MUL4_SYM_R2R(mm2, mm1, mm5); + MOV_R2P(mm1, *d, mm0) + s++; d++; + } +} + + +#define _op_copy_rel_pas_c_dp_mmx _op_copy_rel_p_c_dp_mmx +#define _op_copy_rel_pan_c_dp_mmx _op_copy_rel_p_c_dp_mmx +#define _op_copy_rel_p_can_dp_mmx _op_copy_rel_p_c_dp_mmx +#define _op_copy_rel_pas_can_dp_mmx _op_copy_rel_p_c_dp_mmx +#define _op_copy_rel_pan_can_dp_mmx _op_copy_rel_p_c_dp_mmx +#define _op_copy_rel_p_caa_dp_mmx _op_copy_rel_p_c_dp_mmx +#define _op_copy_rel_pas_caa_dp_mmx _op_copy_rel_p_c_dp_mmx +#define _op_copy_rel_pan_caa_dp_mmx _op_copy_rel_p_c_dp_mmx + +#define _op_copy_rel_p_c_dpan_mmx _op_copy_p_c_dpan_mmx +#define _op_copy_rel_pas_c_dpan_mmx _op_copy_pas_c_dpan_mmx +#define _op_copy_rel_pan_c_dpan_mmx _op_copy_pan_c_dpan_mmx +#define _op_copy_rel_p_can_dpan_mmx _op_copy_p_can_dpan_mmx +#define _op_copy_rel_pas_can_dpan_mmx _op_copy_pas_can_dpan_mmx +#define _op_copy_rel_pan_can_dpan_mmx _op_copy_pan_can_dpan_mmx +#define _op_copy_rel_p_caa_dpan_mmx _op_copy_p_caa_dpan_mmx +#define _op_copy_rel_pas_caa_dpan_mmx _op_copy_pas_caa_dpan_mmx +#define _op_copy_rel_pan_caa_dpan_mmx _op_copy_pan_caa_dpan_mmx + +static void +init_copy_rel_pixel_color_span_funcs_mmx(void) +{ + op_copy_rel_span_funcs[SP][SM_N][SC][DP][CPU_MMX] = _op_copy_rel_p_c_dp_mmx; + op_copy_rel_span_funcs[SP_AS][SM_N][SC][DP][CPU_MMX] = _op_copy_rel_pas_c_dp_mmx; + op_copy_rel_span_funcs[SP_AN][SM_N][SC][DP][CPU_MMX] = _op_copy_rel_pan_c_dp_mmx; + op_copy_rel_span_funcs[SP][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_rel_p_can_dp_mmx; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_rel_pas_can_dp_mmx; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_rel_pan_can_dp_mmx; + op_copy_rel_span_funcs[SP][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_rel_p_caa_dp_mmx; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_rel_pas_caa_dp_mmx; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_rel_pan_caa_dp_mmx; + + op_copy_rel_span_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_rel_p_c_dpan_mmx; + op_copy_rel_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_rel_pas_c_dpan_mmx; + op_copy_rel_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_rel_pan_c_dpan_mmx; + op_copy_rel_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_p_can_dpan_mmx; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_pas_can_dpan_mmx; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_pan_can_dpan_mmx; + op_copy_rel_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_p_caa_dpan_mmx; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_pas_caa_dpan_mmx; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_pan_caa_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_copy_rel_pt_p_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm3, mm0) + MOV_A2R(ALPHA_255, mm5) + MOV_PA2R(*d, mm1) + MOV_P2R(s, mm2, mm0) + MUL4_SYM_R2R(mm3, mm2, mm5); + MUL4_SYM_R2R(mm2, mm1, mm5); + MOV_R2P(mm1, *d, mm0) +} + + +#define _op_copy_rel_pt_pas_c_dp_mmx _op_copy_rel_pt_p_c_dp_mmx +#define _op_copy_rel_pt_pan_c_dp_mmx _op_copy_rel_pt_p_c_dp_mmx +#define _op_copy_rel_pt_p_can_dp_mmx _op_copy_rel_pt_p_c_dp_mmx +#define _op_copy_rel_pt_pas_can_dp_mmx _op_copy_rel_pt_p_c_dp_mmx +#define _op_copy_rel_pt_pan_can_dp_mmx _op_copy_rel_pt_p_c_dp_mmx +#define _op_copy_rel_pt_p_caa_dp_mmx _op_copy_rel_pt_p_c_dp_mmx +#define _op_copy_rel_pt_pas_caa_dp_mmx _op_copy_rel_pt_p_c_dp_mmx +#define _op_copy_rel_pt_pan_caa_dp_mmx _op_copy_rel_pt_p_c_dp_mmx + +#define _op_copy_rel_pt_p_c_dpan_mmx _op_copy_pt_p_c_dpan_mmx +#define _op_copy_rel_pt_pas_c_dpan_mmx _op_copy_pt_pas_c_dpan_mmx +#define _op_copy_rel_pt_pan_c_dpan_mmx _op_copy_pt_pan_c_dpan_mmx +#define _op_copy_rel_pt_p_can_dpan_mmx _op_copy_pt_p_can_dpan_mmx +#define _op_copy_rel_pt_pas_can_dpan_mmx _op_copy_pt_pas_can_dpan_mmx +#define _op_copy_rel_pt_pan_can_dpan_mmx _op_copy_pt_pan_can_dpan_mmx +#define _op_copy_rel_pt_p_caa_dpan_mmx _op_copy_pt_p_caa_dpan_mmx +#define _op_copy_rel_pt_pas_caa_dpan_mmx _op_copy_pt_pas_caa_dpan_mmx +#define _op_copy_rel_pt_pan_caa_dpan_mmx _op_copy_pt_pan_caa_dpan_mmx + + +static void +init_copy_rel_pixel_color_pt_funcs_mmx(void) +{ + op_copy_rel_pt_funcs[SP][SM_N][SC][DP][CPU_MMX] = _op_copy_rel_pt_p_c_dp_mmx; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC][DP][CPU_MMX] = _op_copy_rel_pt_pas_c_dp_mmx; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC][DP][CPU_MMX] = _op_copy_rel_pt_pan_c_dp_mmx; + op_copy_rel_pt_funcs[SP][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_rel_pt_p_can_dp_mmx; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_rel_pt_pas_can_dp_mmx; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_MMX] = _op_copy_rel_pt_pan_can_dp_mmx; + op_copy_rel_pt_funcs[SP][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_rel_pt_p_caa_dp_mmx; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_rel_pt_pas_caa_dp_mmx; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_MMX] = _op_copy_rel_pt_pan_caa_dp_mmx; + + op_copy_rel_pt_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_rel_pt_p_c_dpan_mmx; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_rel_pt_pas_c_dpan_mmx; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_copy_rel_pt_pan_c_dpan_mmx; + op_copy_rel_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_pt_p_can_dpan_mmx; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_pt_pas_can_dpan_mmx; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_copy_rel_pt_pan_can_dpan_mmx; + op_copy_rel_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_pt_p_caa_dpan_mmx; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_pt_pas_caa_dpan_mmx; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_copy_rel_pt_pan_caa_dpan_mmx; +} +#endif diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_i386.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_i386.c new file mode 100644 index 0000000..9c4197c --- /dev/null +++ b/src/lib/engines/common/evas_op_copy/op_copy_pixel_i386.c @@ -0,0 +1,132 @@ + +/* copy pixel --> dst */ + +#ifdef BUILD_MMX +static void +_op_copy_p_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l - 15; + for (; d < e; d+=16, s+=16) { + MOVE_16DWORDS_MMX(s, d); + } + e+=15; + for (; d < e; d++, s++) { + *d = *s; + } +} + +#define _op_copy_pan_dp_mmx _op_copy_p_dp_mmx +#define _op_copy_pas_dp_mmx _op_copy_p_dp_mmx + +#define _op_copy_p_dpan_mmx _op_copy_p_dp_mmx +#define _op_copy_pan_dpan_mmx _op_copy_pan_dp_mmx +#define _op_copy_pas_dpan_mmx _op_copy_pas_dp_mmx + +static void +init_copy_pixel_span_funcs_mmx(void) +{ + op_copy_span_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_copy_p_dp_mmx; + op_copy_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_copy_pan_dp_mmx; + op_copy_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_copy_pas_dp_mmx; + + op_copy_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_p_dpan_mmx; + op_copy_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_pan_dpan_mmx; + op_copy_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_pas_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_copy_pt_p_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = s; +} + +#define _op_copy_pt_pan_dp_mmx _op_copy_pt_p_dp_mmx +#define _op_copy_pt_pas_dp_mmx _op_copy_pt_p_dp_mmx + +#define _op_copy_pt_p_dpan_mmx _op_copy_pt_p_dp_mmx +#define _op_copy_pt_pan_dpan_mmx _op_copy_pt_pan_dp_mmx +#define _op_copy_pt_pas_dpan_mmx _op_copy_pt_pas_dp_mmx + +static void +init_copy_pixel_pt_funcs_mmx(void) +{ + op_copy_pt_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_copy_pt_p_dp_mmx; + op_copy_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_copy_pt_pan_dp_mmx; + op_copy_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_copy_pt_pas_dp_mmx; + + op_copy_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_pt_p_dpan_mmx; + op_copy_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_pt_pan_dpan_mmx; + op_copy_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_pt_pas_dpan_mmx; +} +#endif + +/*-----*/ + +/* copy_rel pixel --> dst */ + +#ifdef BUILD_MMX +static void +_op_copy_rel_p_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) + for (; d < e; d++, s++) { + MOV_PA2R(*d, mm1) + MOV_P2R(*s, mm2, mm0) + MUL4_SYM_R2R(mm2, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + } +} + + +#define _op_copy_rel_pas_dp_mmx _op_copy_rel_p_dp_mmx +#define _op_copy_rel_pan_dp_mmx _op_copy_rel_p_dp_mmx + +#define _op_copy_rel_p_dpan_mmx _op_copy_p_dpan_mmx +#define _op_copy_rel_pan_dpan_mmx _op_copy_pan_dpan_mmx +#define _op_copy_rel_pas_dpan_mmx _op_copy_pas_dpan_mmx + +static void +init_copy_rel_pixel_span_funcs_mmx(void) +{ + op_copy_rel_span_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_copy_rel_p_dp_mmx; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_copy_rel_pan_dp_mmx; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_copy_rel_pas_dp_mmx; + + op_copy_rel_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_p_dpan_mmx; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pan_dpan_mmx; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pas_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_copy_rel_pt_p_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + c = 1 + (*d >> 24); + MOV_A2R(c, mm1) + pxor_r2r(mm0, mm0); + MOV_P2R(s, mm2, mm0) + MUL4_256_R2R(mm2, mm1) + MOV_R2P(mm1, *d, mm0) +} + + +#define _op_copy_rel_pt_pan_dp_mmx _op_copy_rel_pt_p_dp_mmx +#define _op_copy_rel_pt_pas_dp_mmx _op_copy_rel_pt_p_dp_mmx + +#define _op_copy_rel_pt_p_dpan_mmx _op_copy_pt_p_dpan_mmx +#define _op_copy_rel_pt_pan_dpan_mmx _op_copy_pt_pan_dpan_mmx +#define _op_copy_rel_pt_pas_dpan_mmx _op_copy_pt_pas_dpan_mmx + +static void +init_copy_rel_pixel_pt_funcs_mmx(void) +{ + op_copy_rel_pt_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_copy_rel_pt_p_dp_mmx; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_copy_rel_pt_pan_dp_mmx; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_copy_rel_pt_pas_dp_mmx; + + op_copy_rel_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pt_p_dpan_mmx; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pt_pan_dpan_mmx; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pt_pas_dpan_mmx; +} +#endif diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_.c new file mode 100644 index 0000000..ecdcd48 --- /dev/null +++ b/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_.c @@ -0,0 +1,147 @@ + +/* copy pixel x mask --> dst */ + +#ifdef BUILD_C +static void +_op_copy_p_mas_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + case 255: + *d = *s; + break; + default: + l++; + *d = INTERP_256(l, *s, *d); + break; + } + m++; s++; d++; + } +} + + +#define _op_copy_pan_mas_dp _op_copy_p_mas_dp +#define _op_copy_pas_mas_dp _op_copy_p_mas_dp + +#define _op_copy_p_mas_dpan _op_copy_p_mas_dp +#define _op_copy_pan_mas_dpan _op_copy_p_mas_dpan +#define _op_copy_pas_mas_dpan _op_copy_p_mas_dpan + +static void +init_copy_pixel_mask_span_funcs_c(void) +{ + op_copy_span_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_copy_p_mas_dp; + op_copy_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_copy_pan_mas_dp; + op_copy_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_copy_pas_mas_dp; + + op_copy_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_p_mas_dpan; + op_copy_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_pan_mas_dpan; + op_copy_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_pas_mas_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_copy_pt_p_mas_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = INTERP_256(m + 1, s, *d); +} + +#define _op_copy_pt_pan_mas_dp _op_copy_pt_p_mas_dp +#define _op_copy_pt_pas_mas_dp _op_copy_pt_p_mas_dp + +#define _op_copy_pt_p_mas_dpan _op_copy_pt_p_mas_dp +#define _op_copy_pt_pan_mas_dpan _op_copy_pt_p_mas_dpan +#define _op_copy_pt_pas_mas_dpan _op_copy_pt_p_mas_dpan + +static void +init_copy_pixel_mask_pt_funcs_c(void) +{ + op_copy_pt_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_copy_pt_p_mas_dp; + op_copy_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_copy_pt_pan_mas_dp; + op_copy_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_copy_pt_pas_mas_dp; + + op_copy_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_pt_p_mas_dpan; + op_copy_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_pt_pan_mas_dpan; + op_copy_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_pt_pas_mas_dpan; +} +#endif + +/*-----*/ + +/* copy_rel pixel x mask --> dst */ + +#ifdef BUILD_C +static void +_op_copy_rel_p_mas_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + case 255: + *d = MUL_SYM(*d >> 24, *s); + break; + default: + c = MUL_SYM(*d >> 24, *s); + l++; + *d = INTERP_256(l, c, *d); + break; + } + m++; s++; d++; + } +} + + +#define _op_copy_rel_pan_mas_dp _op_copy_rel_p_mas_dp +#define _op_copy_rel_pas_mas_dp _op_copy_rel_p_mas_dp + +#define _op_copy_rel_p_mas_dpan _op_copy_p_mas_dpan +#define _op_copy_rel_pan_mas_dpan _op_copy_pan_mas_dpan +#define _op_copy_rel_pas_mas_dpan _op_copy_pas_mas_dpan + +static void +init_copy_rel_pixel_mask_span_funcs_c(void) +{ + op_copy_rel_span_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_copy_rel_p_mas_dp; + op_copy_rel_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_copy_rel_pan_mas_dp; + op_copy_rel_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_copy_rel_pas_mas_dp; + + op_copy_rel_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_rel_p_mas_dpan; + op_copy_rel_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_rel_pan_mas_dpan; + op_copy_rel_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_rel_pas_mas_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_copy_rel_pt_p_mas_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + c = MUL_SYM(*d >> 24, s); + *d = INTERP_256(m + 1, c, *d); +} + + +#define _op_copy_rel_pt_pan_mas_dp _op_copy_rel_pt_p_mas_dp +#define _op_copy_rel_pt_pas_mas_dp _op_copy_rel_pt_p_mas_dp + +#define _op_copy_rel_pt_p_mas_dpan _op_copy_pt_p_mas_dpan +#define _op_copy_rel_pt_pan_mas_dpan _op_copy_pt_pan_mas_dpan +#define _op_copy_rel_pt_pas_mas_dpan _op_copy_pt_pas_mas_dpan + +static void +init_copy_rel_pixel_mask_pt_funcs_c(void) +{ + op_copy_rel_pt_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_copy_rel_pt_p_mas_dp; + op_copy_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_copy_rel_pt_pan_mas_dp; + op_copy_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_copy_rel_pt_pas_mas_dp; + + op_copy_rel_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_rel_pt_p_mas_dpan; + op_copy_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_rel_pt_pan_mas_dpan; + op_copy_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_copy_rel_pt_pas_mas_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_i386.c b/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_i386.c new file mode 100644 index 0000000..2bfb85f --- /dev/null +++ b/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_i386.c @@ -0,0 +1,177 @@ + +/* copy pixel x mask --> dst */ + +#ifdef BUILD_MMX +static void +_op_copy_p_mas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + case 255: + *d = *s; + break; + default: + l++; + MOV_A2R(l, mm3) + MOV_P2R(*s, mm2, mm0) + MOV_P2R(*d, mm1, mm0) + INTERP_256_R2R(mm3, mm2, mm1, mm5); + MOV_R2P(mm1, *d, mm0) + break; + } + m++; d++; + } +} + +#define _op_copy_pan_mas_dp_mmx _op_copy_p_mas_dp_mmx +#define _op_copy_pas_mas_dp_mmx _op_copy_p_mas_dp_mmx + +#define _op_copy_p_mas_dpan_mmx _op_copy_p_mas_dp_mmx +#define _op_copy_pan_mas_dpan_mmx _op_copy_p_mas_dpan_mmx +#define _op_copy_pas_mas_dpan_mmx _op_copy_p_mas_dpan_mmx + +static void +init_copy_pixel_mask_span_funcs_mmx(void) +{ + op_copy_span_funcs[SP][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_p_mas_dp_mmx; + op_copy_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_pan_mas_dp_mmx; + op_copy_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_pas_mas_dp_mmx; + + op_copy_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_p_mas_dpan_mmx; + op_copy_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_pan_mas_dpan_mmx; + op_copy_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_pas_mas_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_copy_pt_p_mas_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + c = m + 1; + MOV_A2R(ALPHA_255, mm5) + MOV_A2R(c, mm3) + pxor_r2r(mm0, mm0); + MOV_P2R(s, mm2, mm0) + MOV_P2R(*d, mm1, mm0) + INTERP_256_R2R(mm3, mm2, mm1, mm5); + MOV_R2P(mm1, *d, mm0) +} + +#define _op_copy_pt_pan_mas_dp_mmx _op_copy_pt_p_mas_dp_mmx +#define _op_copy_pt_pas_mas_dp_mmx _op_copy_pt_p_mas_dp_mmx + +#define _op_copy_pt_p_mas_dpan_mmx _op_copy_pt_p_mas_dp_mmx +#define _op_copy_pt_pan_mas_dpan_mmx _op_copy_pt_p_mas_dpan_mmx +#define _op_copy_pt_pas_mas_dpan_mmx _op_copy_pt_p_mas_dpan_mmx + +static void +init_copy_pixel_mask_pt_funcs_mmx(void) +{ + op_copy_pt_funcs[SP][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_pt_p_mas_dp_mmx; + op_copy_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_pt_pan_mas_dp_mmx; + op_copy_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_pt_pas_mas_dp_mmx; + + op_copy_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_pt_p_mas_dpan_mmx; + op_copy_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_pt_pan_mas_dpan_mmx; + op_copy_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_pt_pas_mas_dpan_mmx; +} +#endif + +/*-----*/ + +/* copy_rel pixel x mask --> dst */ + +#ifdef BUILD_MMX +static void +_op_copy_rel_p_mas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + case 255: + MOV_P2R(*s, mm2, mm0) + MOV_PA2R(*d, mm1) + MUL4_SYM_R2R(mm2, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + break; + default: + l++; + MOV_P2R(*s, mm3, mm0) + MOV_P2R(*d, mm1, mm0) + MOV_RA2R(mm1, mm2) + MUL4_SYM_R2R(mm3, mm2, mm5) + MOV_A2R(l, mm3) + INTERP_256_R2R(mm3, mm2, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + break; + } + m++; s++; d++; + } +} + +#define _op_copy_rel_pan_mas_dp_mmx _op_copy_rel_p_mas_dp_mmx +#define _op_copy_rel_pas_mas_dp_mmx _op_copy_rel_p_mas_dp_mmx + +#define _op_copy_rel_p_mas_dpan_mmx _op_copy_p_mas_dpan_mmx +#define _op_copy_rel_pan_mas_dpan_mmx _op_copy_pan_mas_dpan_mmx +#define _op_copy_rel_pas_mas_dpan_mmx _op_copy_pas_mas_dpan_mmx + +static void +init_copy_rel_pixel_mask_span_funcs_mmx(void) +{ + op_copy_rel_span_funcs[SP][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_rel_p_mas_dp_mmx; + op_copy_rel_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_rel_pan_mas_dp_mmx; + op_copy_rel_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_rel_pas_mas_dp_mmx; + + op_copy_rel_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_p_mas_dpan_mmx; + op_copy_rel_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pan_mas_dpan_mmx; + op_copy_rel_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pas_mas_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_copy_rel_pt_p_mas_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + c = m + 1; + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) + MOV_P2R(s, mm3, mm0) + MOV_P2R(*d, mm1, mm0) + MOV_RA2R(mm1, mm2) + MUL4_SYM_R2R(mm3, mm2, mm5) + MOV_A2R(c, mm3) + INTERP_256_R2R(mm3, mm2, mm1, mm5) + MOV_R2P(mm1, *d, mm0) +} + + +#define _op_copy_rel_pt_pan_mas_dp_mmx _op_copy_rel_pt_p_mas_dp_mmx +#define _op_copy_rel_pt_pas_mas_dp_mmx _op_copy_rel_pt_p_mas_dp_mmx + +#define _op_copy_rel_pt_p_mas_dpan_mmx _op_copy_pt_p_mas_dpan_mmx +#define _op_copy_rel_pt_pan_mas_dpan_mmx _op_copy_pt_pan_mas_dpan_mmx +#define _op_copy_rel_pt_pas_mas_dpan_mmx _op_copy_pt_pas_mas_dpan_mmx + +static void +init_copy_rel_pixel_mask_pt_funcs_mmx(void) +{ + op_copy_rel_pt_funcs[SP][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_rel_pt_p_mas_dp_mmx; + op_copy_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_rel_pt_pan_mas_dp_mmx; + op_copy_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_MMX] = _op_copy_rel_pt_pas_mas_dp_mmx; + + op_copy_rel_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pt_p_mas_dpan_mmx; + op_copy_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pt_pan_mas_dpan_mmx; + op_copy_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_copy_rel_pt_pas_mas_dpan_mmx; +} +#endif + diff --git a/src/lib/engines/common/evas_op_copy_main_.c b/src/lib/engines/common/evas_op_copy_main_.c new file mode 100644 index 0000000..fa028af --- /dev/null +++ b/src/lib/engines/common/evas_op_copy_main_.c @@ -0,0 +1,610 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_blend_private.h" + +static RGBA_Gfx_Func op_copy_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; +static RGBA_Gfx_Pt_Func op_copy_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; + +static void op_copy_init(void); +static void op_copy_shutdown(void); + +static RGBA_Gfx_Func op_copy_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_copy_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_copy_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_copy_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_copy_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); + +static RGBA_Gfx_Pt_Func op_copy_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_copy_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_copy_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_copy_mask_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_copy_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); + +static RGBA_Gfx_Compositor _composite_copy = { "copy", + op_copy_init, op_copy_shutdown, + op_copy_pixel_span_get, op_copy_color_span_get, + op_copy_pixel_color_span_get, op_copy_mask_color_span_get, + op_copy_pixel_mask_span_get, + op_copy_pixel_pt_get, op_copy_color_pt_get, + op_copy_pixel_color_pt_get, op_copy_mask_color_pt_get, + op_copy_pixel_mask_pt_get + }; + +RGBA_Gfx_Compositor * +evas_common_gfx_compositor_copy_get(void) +{ + return &(_composite_copy); +} + + +static RGBA_Gfx_Func op_copy_rel_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; +static RGBA_Gfx_Pt_Func op_copy_rel_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; + +static void op_copy_rel_init(void); +static void op_copy_rel_shutdown(void); + +static RGBA_Gfx_Func op_copy_rel_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_copy_rel_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_copy_rel_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_copy_rel_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_copy_rel_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); + +static RGBA_Gfx_Pt_Func op_copy_rel_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_copy_rel_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_copy_rel_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_copy_rel_mask_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_copy_rel_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); + +static RGBA_Gfx_Compositor _composite_copy_rel = { "copy_rel", + op_copy_rel_init, op_copy_rel_shutdown, + op_copy_rel_pixel_span_get, op_copy_rel_color_span_get, + op_copy_rel_pixel_color_span_get, op_copy_rel_mask_color_span_get, + op_copy_rel_pixel_mask_span_get, + op_copy_rel_pixel_pt_get, op_copy_color_pt_get, + op_copy_rel_pixel_color_pt_get, op_copy_rel_mask_color_pt_get, + op_copy_rel_pixel_mask_pt_get + }; + +RGBA_Gfx_Compositor * +evas_common_gfx_compositor_copy_rel_get(void) +{ + return &(_composite_copy_rel); +} + + +# include "./evas_op_copy/op_copy_pixel_.c" +# include "./evas_op_copy/op_copy_color_.c" +# include "./evas_op_copy/op_copy_pixel_color_.c" +# include "./evas_op_copy/op_copy_pixel_mask_.c" +# include "./evas_op_copy/op_copy_mask_color_.c" +//# include "./evas_op_copy/op_copy_pixel_mask_color_.c" + +# include "./evas_op_copy/op_copy_pixel_i386.c" +# include "./evas_op_copy/op_copy_color_i386.c" +# include "./evas_op_copy/op_copy_pixel_color_i386.c" +# include "./evas_op_copy/op_copy_pixel_mask_i386.c" +# include "./evas_op_copy/op_copy_mask_color_i386.c" +//# include "./evas_op_copy/op_copy_pixel_mask_color_i386.c" + + +static void +op_copy_init(void) +{ + memset(op_copy_span_funcs, 0, sizeof(op_copy_span_funcs)); + memset(op_copy_pt_funcs, 0, sizeof(op_copy_pt_funcs)); +#ifdef BUILD_MMX + init_copy_pixel_span_funcs_mmx(); + init_copy_pixel_color_span_funcs_mmx(); + init_copy_pixel_mask_span_funcs_mmx(); + init_copy_color_span_funcs_mmx(); + init_copy_mask_color_span_funcs_mmx(); + + init_copy_pixel_pt_funcs_mmx(); + init_copy_pixel_color_pt_funcs_mmx(); + init_copy_pixel_mask_pt_funcs_mmx(); + init_copy_color_pt_funcs_mmx(); + init_copy_mask_color_pt_funcs_mmx(); +#endif +#ifdef BUILD_C + init_copy_pixel_span_funcs_c(); + init_copy_pixel_color_span_funcs_c(); + init_copy_pixel_mask_span_funcs_c(); + init_copy_color_span_funcs_c(); + init_copy_mask_color_span_funcs_c(); + + init_copy_pixel_pt_funcs_c(); + init_copy_pixel_color_pt_funcs_c(); + init_copy_pixel_mask_pt_funcs_c(); + init_copy_color_pt_funcs_c(); + init_copy_mask_color_pt_funcs_c(); +#endif +} + +static void +op_copy_shutdown(void) +{ +} + +static RGBA_Gfx_Func +copy_gfx_span_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_copy_span_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_copy_span_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Func +op_copy_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + { + dst->cache_entry.flags.alpha = 1; + s = SP; + } + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return copy_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_copy_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + c = SC; + } + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return copy_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_copy_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + s = SP; + } + if ((col >> 24) < 255) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + c = SC; + } + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return copy_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_copy_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP; + + if (dst) + dst->cache_entry.flags.alpha = 1; + if ((col >> 24) < 255) + c = SC; + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + return copy_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_copy_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP; + + if (dst) + dst->cache_entry.flags.alpha = 1; + if (src && src->cache_entry.flags.alpha) + s = SP; + return copy_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +copy_gfx_pt_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Pt_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_copy_pt_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_copy_pt_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Pt_Func +op_copy_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src_flags.alpha) + { + dst->cache_entry.flags.alpha = 1; + s = SP; + } + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return copy_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_copy_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + c = SC; + } + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return copy_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_copy_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src_flags.alpha) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + s = SP; + } + if ((col >> 24) < 255) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + c = SC; + } + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return copy_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_copy_mask_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP; + + if (dst) + dst->cache_entry.flags.alpha = 1; + if ((col >> 24) < 255) + c = SC; + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + return copy_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_copy_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP; + + if (dst) + dst->cache_entry.flags.alpha = 1; + if (src_flags.alpha) + s = SP; + return copy_gfx_pt_func_cpu(s, m, c, d); +} + + +static void +op_copy_rel_init(void) +{ + memset(op_copy_rel_span_funcs, 0, sizeof(op_copy_rel_span_funcs)); + memset(op_copy_rel_pt_funcs, 0, sizeof(op_copy_rel_pt_funcs)); +#ifdef BUILD_MMX + init_copy_rel_pixel_span_funcs_mmx(); + init_copy_rel_pixel_color_span_funcs_mmx(); + init_copy_rel_pixel_mask_span_funcs_mmx(); + init_copy_rel_color_span_funcs_mmx(); + init_copy_rel_mask_color_span_funcs_mmx(); + + init_copy_rel_pixel_pt_funcs_mmx(); + init_copy_rel_pixel_color_pt_funcs_mmx(); + init_copy_rel_pixel_mask_pt_funcs_mmx(); + init_copy_rel_color_pt_funcs_mmx(); + init_copy_rel_mask_color_pt_funcs_mmx(); +#endif +#ifdef BUILD_C + init_copy_rel_pixel_span_funcs_c(); + init_copy_rel_pixel_color_span_funcs_c(); + init_copy_rel_pixel_mask_span_funcs_c(); + init_copy_rel_color_span_funcs_c(); + init_copy_rel_mask_color_span_funcs_c(); + + init_copy_rel_pixel_pt_funcs_c(); + init_copy_rel_pixel_color_pt_funcs_c(); + init_copy_rel_pixel_mask_pt_funcs_c(); + init_copy_rel_color_pt_funcs_c(); + init_copy_rel_mask_color_pt_funcs_c(); +#endif +} + +static void +op_copy_rel_shutdown(void) +{ +} + +static RGBA_Gfx_Func +copy_rel_gfx_span_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_copy_rel_span_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_copy_rel_span_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Func +op_copy_rel_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + s = SP; + } + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return copy_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_copy_rel_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + c = SC; + } + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return copy_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_copy_rel_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + s = SP; + } + if ((col >> 24) < 255) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + c = SC; + } + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return copy_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_copy_rel_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP; + + if (dst) + dst->cache_entry.flags.alpha = 1; + if ((col >> 24) < 255) + c = SC; + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + return copy_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_copy_rel_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP; + + if (dst) + dst->cache_entry.flags.alpha = 1; + if (src && src->cache_entry.flags.alpha) + s = SP; + return copy_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +copy_rel_gfx_pt_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Pt_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_copy_rel_pt_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_copy_rel_pt_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Pt_Func +op_copy_rel_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src_flags.alpha) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + s = SP; + } + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return copy_rel_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_copy_rel_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + c = SC; + } + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return copy_rel_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_copy_rel_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src_flags.alpha) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + s = SP; + } + if ((col >> 24) < 255) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + c = SC; + } + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return copy_rel_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_copy_rel_mask_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP; + + if (dst) + dst->cache_entry.flags.alpha = 1; + if ((col >> 24) < 255) + c = SC; + if (col == ((col >> 24) * 0x01010101)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + return copy_rel_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_copy_rel_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP; + + if (dst) + dst->cache_entry.flags.alpha = 1; + if (src_flags.alpha) + s = SP; + return copy_rel_gfx_pt_func_cpu(s, m, c, d); +} diff --git a/src/lib/engines/common/evas_op_mask/.cvsignore b/src/lib/engines/common/evas_op_mask/.cvsignore new file mode 100644 index 0000000..282522d --- /dev/null +++ b/src/lib/engines/common/evas_op_mask/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/src/lib/engines/common/evas_op_mask/Makefile.am b/src/lib/engines/common/evas_op_mask/Makefile.am new file mode 100644 index 0000000..848c3e4 --- /dev/null +++ b/src/lib/engines/common/evas_op_mask/Makefile.am @@ -0,0 +1,11 @@ +EXTRA_DIST = \ +op_mask_color_.c \ +op_mask_color_i386.c \ +op_mask_mask_color_.c \ +op_mask_mask_color_i386.c \ +op_mask_pixel_.c \ +op_mask_pixel_color_.c \ +op_mask_pixel_color_i386.c \ +op_mask_pixel_i386.c \ +op_mask_pixel_mask_.c \ +op_mask_pixel_mask_i386.c diff --git a/src/lib/engines/common/evas_op_mask/op_mask_color_.c b/src/lib/engines/common/evas_op_mask/op_mask_color_.c new file mode 100644 index 0000000..43f5a8f --- /dev/null +++ b/src/lib/engines/common/evas_op_mask/op_mask_color_.c @@ -0,0 +1,51 @@ + + +/* mask color --> dst */ + +#ifdef BUILD_C +static void +_op_mask_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + c = 1 + (c >> 24); + for (; d < e; d++) { + *d = MUL_256(c, *d); + } +} + +#define _op_mask_caa_dp _op_mask_c_dp + +#define _op_mask_c_dpan _op_mask_c_dp +#define _op_mask_caa_dpan _op_mask_caa_dp + +static void +init_mask_color_span_funcs_c(void) +{ + op_mask_span_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_mask_c_dp; + op_mask_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_mask_caa_dp; + + op_mask_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_mask_c_dpan; + op_mask_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_mask_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_mask_pt_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = MUL_SYM(c >> 24, *d); +} + +#define _op_mask_pt_caa_dp _op_mask_pt_c_dp + +#define _op_mask_pt_c_dpan _op_mask_pt_c_dp +#define _op_mask_pt_caa_dpan _op_mask_pt_caa_dp + +static void +init_mask_color_pt_funcs_c(void) +{ + op_mask_pt_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_mask_pt_c_dp; + op_mask_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_mask_pt_caa_dp; + + op_mask_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_mask_pt_c_dpan; + op_mask_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_mask_pt_caa_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_mask/op_mask_color_i386.c b/src/lib/engines/common/evas_op_mask/op_mask_color_i386.c new file mode 100644 index 0000000..0a3e1d7 --- /dev/null +++ b/src/lib/engines/common/evas_op_mask/op_mask_color_i386.c @@ -0,0 +1,59 @@ + +/* mask color --> dst */ + +#ifdef BUILD_MMX +static void +_op_mask_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + c = 1 + (c >> 24); + MOV_A2R(c, mm2) + pxor_r2r(mm0, mm0); + for (; d < e; d++) { + MOV_P2R(*d, mm1, mm0) + MUL4_256_R2R(mm2, mm1) + MOV_R2P(mm1, *d, mm0) + } +} + +#define _op_mask_caa_dp_mmx _op_mask_c_dp_mmx + +#define _op_mask_c_dpan_mmx _op_mask_c_dp_mmx +#define _op_mask_caa_dpan_mmx _op_mask_caa_dp_mmx + +static void +init_mask_color_span_funcs_mmx(void) +{ + op_mask_span_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_mask_c_dp_mmx; + op_mask_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_mask_caa_dp_mmx; + + op_mask_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_mask_c_dpan_mmx; + op_mask_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mask_caa_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_mask_pt_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + c = 1 + (c >> 24); + MOV_A2R(c, mm2) + pxor_r2r(mm0, mm0); + MOV_P2R(*d, mm1, mm0) + MUL4_256_R2R(mm2, mm1) + MOV_R2P(mm1, *d, mm0) +} + +#define _op_mask_pt_caa_dp_mmx _op_mask_pt_c_dp_mmx + +#define _op_mask_pt_c_dpan_mmx _op_mask_pt_c_dp_mmx +#define _op_mask_pt_caa_dpan_mmx _op_mask_pt_caa_dp_mmx + +static void +init_mask_color_pt_funcs_mmx(void) +{ + op_mask_pt_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_mask_pt_c_dp_mmx; + op_mask_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_mask_pt_caa_dp_mmx; + + op_mask_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_mask_pt_c_dpan_mmx; + op_mask_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mask_pt_caa_dpan_mmx; +} +#endif diff --git a/src/lib/engines/common/evas_op_mask/op_mask_mask_color_.c b/src/lib/engines/common/evas_op_mask/op_mask_mask_color_.c new file mode 100644 index 0000000..5c8f2c3 --- /dev/null +++ b/src/lib/engines/common/evas_op_mask/op_mask_mask_color_.c @@ -0,0 +1,64 @@ + +/* mask mask x color -> dst */ + +#ifdef BUILD_C +static void +_op_mask_mas_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + c = 1 + (c >> 24); + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + case 255: + *d = MUL_256(c, *d); + break; + default: + l = 256 - (((257 - c) * l) >> 8); + *d = MUL_256(l, *d); + break; + } + m++; d++; + } +} + +#define _op_mask_mas_caa_dp _op_mask_mas_c_dp + +#define _op_mask_mas_c_dpan _op_mask_mas_c_dp +#define _op_mask_mas_caa_dpan _op_mask_mas_caa_dp + +static void +init_mask_mask_color_span_funcs_c(void) +{ + op_mask_span_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_mask_mas_c_dp; + op_mask_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_mask_mas_caa_dp; + + op_mask_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_mask_mas_c_dpan; + op_mask_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_mask_mas_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_mask_pt_mas_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + c = 256 - (((256 - (c >> 24)) * m) >> 8); + *d = MUL_256(c, *d); +} + +#define _op_mask_pt_mas_caa_dp _op_mask_pt_mas_c_dp + +#define _op_mask_pt_mas_c_dpan _op_mask_pt_mas_c_dp +#define _op_mask_pt_mas_caa_dpan _op_mask_pt_mas_caa_dp + +static void +init_mask_mask_color_pt_funcs_c(void) +{ + op_mask_pt_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_mask_pt_mas_c_dp; + op_mask_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_mask_pt_mas_caa_dp; + + op_mask_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_mask_pt_mas_c_dpan; + op_mask_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_mask_pt_mas_caa_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_mask/op_mask_mask_color_i386.c b/src/lib/engines/common/evas_op_mask/op_mask_mask_color_i386.c new file mode 100644 index 0000000..b1cc043 --- /dev/null +++ b/src/lib/engines/common/evas_op_mask/op_mask_mask_color_i386.c @@ -0,0 +1,14 @@ + +/* mask mask x color -> dst */ + +#ifdef BUILD_MMX +static void +init_mask_mask_color_span_funcs_mmx(void) +{} +#endif + +#ifdef BUILD_MMX +static void +init_mask_mask_color_pt_funcs_mmx(void) +{} +#endif diff --git a/src/lib/engines/common/evas_op_mask/op_mask_pixel_.c b/src/lib/engines/common/evas_op_mask/op_mask_pixel_.c new file mode 100644 index 0000000..20dcfa5 --- /dev/null +++ b/src/lib/engines/common/evas_op_mask/op_mask_pixel_.c @@ -0,0 +1,49 @@ + +/* mask pixel --> dst */ + +#ifdef BUILD_C +static void +_op_mask_p_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + for (; d < e; d++, s++) { + *d = MUL_SYM(*s >> 24, *d); + } +} + +#define _op_mask_pas_dp _op_mask_p_dp + +#define _op_mask_p_dpan _op_mask_p_dp +#define _op_mask_pas_dpan _op_mask_pas_dp + +static void +init_mask_pixel_span_funcs_c(void) +{ + op_mask_span_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_mask_p_dp; + op_mask_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_mask_pas_dp; + + op_mask_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_mask_p_dpan; + op_mask_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_mask_pas_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_mask_pt_p_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = MUL_SYM(s >> 24, *d); +} + +#define _op_mask_pt_pas_dp _op_mask_pt_p_dp + +#define _op_mask_pt_p_dpan _op_mask_pt_p_dp +#define _op_mask_pt_pas_dpan _op_mask_pt_pas_dp + +static void +init_mask_pixel_pt_funcs_c(void) +{ + op_mask_pt_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_mask_pt_p_dp; + op_mask_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_mask_pt_pas_dp; + + op_mask_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_mask_pt_p_dpan; + op_mask_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_mask_pt_pas_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_.c b/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_.c new file mode 100644 index 0000000..a381f6d --- /dev/null +++ b/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_.c @@ -0,0 +1,101 @@ + +/* mask pixel x color --> dst */ + +#ifdef BUILD_C +static void +_op_mask_p_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + l = 1 + (c >> 24); + while (d < e) { + c = 1 + ((l * (*s >> 24)) >> 8); + *d = MUL_256(c, *d); + s++; d++; + } +} + +#define _op_mask_pas_c_dp _op_mask_p_c_dp +#define _op_mask_pan_c_dp _op_mask_p_c_dp +#define _op_mask_p_can_dp _op_mask_p_c_dp +#define _op_mask_pas_can_dp _op_mask_p_c_dp +#define _op_mask_p_caa_dp _op_mask_p_c_dp +#define _op_mask_pas_caa_dp _op_mask_p_c_dp +#define _op_mask_pan_caa_dp _op_mask_p_c_dp + +#define _op_mask_p_c_dpan _op_mask_p_c_dp +#define _op_mask_pas_c_dpan _op_mask_p_c_dp +#define _op_mask_pan_c_dpan _op_mask_p_c_dp +#define _op_mask_p_can_dpan _op_mask_p_c_dp +#define _op_mask_pas_can_dpan _op_mask_p_c_dp +#define _op_mask_p_caa_dpan _op_mask_p_c_dp +#define _op_mask_pas_caa_dpan _op_mask_p_c_dp +#define _op_mask_pan_caa_dpan _op_mask_p_c_dp + +static void +init_mask_pixel_color_span_funcs_c(void) +{ + op_mask_span_funcs[SP][SM_N][SC][DP][CPU_C] = _op_mask_p_c_dp; + op_mask_span_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_mask_pas_c_dp; + op_mask_span_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_mask_pan_c_dp; + op_mask_span_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_mask_p_can_dp; + op_mask_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_mask_pas_can_dp; + op_mask_span_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_mask_p_caa_dp; + op_mask_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_mask_pas_caa_dp; + op_mask_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_mask_pan_caa_dp; + + op_mask_span_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_mask_p_c_dpan; + op_mask_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_mask_pas_c_dpan; + op_mask_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_mask_pan_c_dpan; + op_mask_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_mask_p_can_dpan; + op_mask_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_mask_pas_can_dpan; + op_mask_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_mask_p_caa_dpan; + op_mask_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_mask_pas_caa_dpan; + op_mask_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_mask_pan_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_mask_pt_p_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + c = 1 + ((((c >> 24) * (s >> 24)) + 255) >> 8); + *d = MUL_256(c, *d); +} + +#define _op_mask_pt_pas_c_dp _op_mask_pt_p_c_dp +#define _op_mask_pt_pan_c_dp _op_mask_pt_p_c_dp +#define _op_mask_pt_p_can_dp _op_mask_pt_p_c_dp +#define _op_mask_pt_pas_can_dp _op_mask_pt_p_c_dp +#define _op_mask_pt_p_caa_dp _op_mask_pt_p_c_dp +#define _op_mask_pt_pas_caa_dp _op_mask_pt_p_c_dp +#define _op_mask_pt_pan_caa_dp _op_mask_pt_p_c_dp + +#define _op_mask_pt_p_c_dpan _op_mask_pt_p_c_dp +#define _op_mask_pt_pas_c_dpan _op_mask_pt_p_c_dp +#define _op_mask_pt_pan_c_dpan _op_mask_pt_p_c_dp +#define _op_mask_pt_p_can_dpan _op_mask_pt_p_c_dp +#define _op_mask_pt_pas_can_dpan _op_mask_pt_p_c_dp +#define _op_mask_pt_p_caa_dpan _op_mask_pt_p_c_dp +#define _op_mask_pt_pas_caa_dpan _op_mask_pt_p_c_dp +#define _op_mask_pt_pan_caa_dpan _op_mask_pt_p_c_dp + +static void +init_mask_pixel_color_pt_funcs_c(void) +{ + op_mask_pt_funcs[SP][SM_N][SC][DP][CPU_C] = _op_mask_pt_p_c_dp; + op_mask_pt_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_mask_pt_pas_c_dp; + op_mask_pt_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_mask_pt_pan_c_dp; + op_mask_pt_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_mask_pt_p_can_dp; + op_mask_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_mask_pt_pas_can_dp; + op_mask_pt_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_mask_pt_p_caa_dp; + op_mask_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_mask_pt_pas_caa_dp; + op_mask_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_mask_pt_pan_caa_dp; + + op_mask_pt_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_mask_pt_p_c_dpan; + op_mask_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_mask_pt_pas_c_dpan; + op_mask_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_mask_pt_pan_c_dpan; + op_mask_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_mask_pt_p_can_dpan; + op_mask_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_mask_pt_pas_can_dpan; + op_mask_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_mask_pt_p_caa_dpan; + op_mask_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_mask_pt_pas_caa_dpan; + op_mask_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_mask_pt_pan_caa_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_i386.c b/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_i386.c new file mode 100644 index 0000000..8f6c89d --- /dev/null +++ b/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_i386.c @@ -0,0 +1,14 @@ + +/* mask pixel x color --> dst */ + +#ifdef BUILD_MMX +static void +init_mask_pixel_color_span_funcs_mmx(void) +{ } +#endif + +#ifdef BUILD_MMX +static void +init_mask_pixel_color_pt_funcs_mmx(void) +{ } +#endif diff --git a/src/lib/engines/common/evas_op_mask/op_mask_pixel_i386.c b/src/lib/engines/common/evas_op_mask/op_mask_pixel_i386.c new file mode 100644 index 0000000..76be59e --- /dev/null +++ b/src/lib/engines/common/evas_op_mask/op_mask_pixel_i386.c @@ -0,0 +1,59 @@ + +/* mask pixel --> dst */ + +#ifdef BUILD_MMX +static void +_op_mask_p_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + MOV_A2R(ALPHA_255, mm5) + pxor_r2r(mm0, mm0); + for (; d < e; d++) { + MOV_P2R(*d, mm1, mm0) + MOV_PA2R(*s, mm2) + MUL4_SYM_R2R(mm2, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + } +} + +#define _op_mask_pas_dp_mmx _op_mask_p_dp_mmx + +#define _op_mask_p_dpan_mmx _op_mask_p_dp_mmx +#define _op_mask_pas_dpan_mmx _op_mask_pas_dp_mmx + +static void +init_mask_pixel_span_funcs_mmx(void) +{ + op_mask_span_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_mask_p_dp_mmx; + op_mask_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_mask_pas_dp_mmx; + + op_mask_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mask_p_dpan_mmx; + op_mask_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mask_pas_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_mask_pt_p_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + MOV_A2R(ALPHA_255, mm5) + pxor_r2r(mm0, mm0); + MOV_P2R(*d, mm1, mm0) + MOV_PA2R(s, mm2) + MUL4_SYM_R2R(mm2, mm1, mm5) + MOV_R2P(mm1, *d, mm0) +} + +#define _op_mask_pt_pas_dp_mmx _op_mask_pt_p_dp_mmx + +#define _op_mask_pt_p_dpan_mmx _op_mask_pt_p_dp_mmx +#define _op_mask_pt_pas_dpan_mmx _op_mask_pt_pas_dp_mmx + +static void +init_mask_pixel_pt_funcs_mmx(void) +{ + op_mask_pt_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_mask_pt_p_dp_mmx; + op_mask_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_mask_pt_pas_dp_mmx; + + op_mask_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mask_pt_p_dpan_mmx; + op_mask_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mask_pt_pas_dpan_mmx; +} +#endif diff --git a/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_.c b/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_.c new file mode 100644 index 0000000..add2719 --- /dev/null +++ b/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_.c @@ -0,0 +1,63 @@ + +/* mask pixel x mask --> dst */ + +#ifdef BUILD_C +static void +_op_mask_p_mas_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + l = *m; + switch(l) + { + case 0: + break; + case 255: + *d = MUL_SYM(*s >> 24, *d); + break; + default: + l = 256 - (((256 - (*s >> 24)) * l) >> 8); + *d = MUL_256(l, *d); + break; + } + m++; s++; d++; + } +} + +#define _op_mask_pas_mas_dp _op_mask_p_mas_dp + +#define _op_mask_p_mas_dpan _op_mask_p_mas_dp +#define _op_mask_pas_mas_dpan _op_mask_pas_mas_dp + +static void +init_mask_pixel_mask_span_funcs_c(void) +{ + op_mask_span_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_mask_p_mas_dp; + op_mask_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_mask_pas_mas_dp; + + op_mask_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_mask_p_mas_dpan; + op_mask_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_mask_pas_mas_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_mask_pt_p_mas_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = 256 - (((256 - (s >> 24)) * m) >> 8); + *d = MUL_256(s, *d); +} + +#define _op_mask_pt_pas_mas_dp _op_mask_pt_p_mas_dp + +#define _op_mask_pt_p_mas_dpan _op_mask_pt_p_mas_dp +#define _op_mask_pt_pas_mas_dpan _op_mask_pt_pas_mas_dp + +static void +init_mask_pixel_mask_pt_funcs_c(void) +{ + op_mask_pt_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_mask_pt_p_mas_dp; + op_mask_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_mask_pt_pas_mas_dp; + + op_mask_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_mask_pt_p_mas_dpan; + op_mask_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_mask_pt_pas_mas_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_i386.c b/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_i386.c new file mode 100644 index 0000000..285ebbc --- /dev/null +++ b/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_i386.c @@ -0,0 +1,14 @@ + +/* mask pixel x mask --> dst */ + +#ifdef BUILD_MMX +static void +init_mask_pixel_mask_span_funcs_mmx(void) +{ } +#endif + +#ifdef BUILD_MMX +static void +init_mask_pixel_mask_pt_funcs_mmx(void) +{ } +#endif diff --git a/src/lib/engines/common/evas_op_mask_main_.c b/src/lib/engines/common/evas_op_mask_main_.c new file mode 100644 index 0000000..1d0b529 --- /dev/null +++ b/src/lib/engines/common/evas_op_mask_main_.c @@ -0,0 +1,309 @@ +#include "evas_common.h" + +static RGBA_Gfx_Func op_mask_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; +static RGBA_Gfx_Pt_Func op_mask_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; + +static void op_mask_init(void); +static void op_mask_shutdown(void); + +static RGBA_Gfx_Func op_mask_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_mask_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_mask_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_mask_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); + +static RGBA_Gfx_Pt_Func op_mask_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_mask_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_mask_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_mask_mask_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_mask_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); + +static RGBA_Gfx_Compositor _composite_mask = { "mask", + op_mask_init, op_mask_shutdown, + op_mask_pixel_span_get, op_mask_color_span_get, + op_mask_pixel_color_span_get, op_mask_mask_color_span_get, + op_mask_pixel_mask_span_get, + op_mask_pixel_pt_get, op_mask_color_pt_get, + op_mask_pixel_color_pt_get, op_mask_mask_color_pt_get, + op_mask_pixel_mask_pt_get + }; + +RGBA_Gfx_Compositor * +evas_common_gfx_compositor_mask_get(void) +{ + return &(_composite_mask); +} + + +# include "./evas_op_mask/op_mask_pixel_.c" +# include "./evas_op_mask/op_mask_color_.c" +# include "./evas_op_mask/op_mask_pixel_color_.c" +# include "./evas_op_mask/op_mask_pixel_mask_.c" +# include "./evas_op_mask/op_mask_mask_color_.c" +//# include "./evas_op_mask/op_mask_pixel_mask_color_.c" + +# include "./evas_op_mask/op_mask_pixel_i386.c" +# include "./evas_op_mask/op_mask_color_i386.c" +# include "./evas_op_mask/op_mask_pixel_color_i386.c" +# include "./evas_op_mask/op_mask_pixel_mask_i386.c" +# include "./evas_op_mask/op_mask_mask_color_i386.c" +//# include "./evas_op_mask/op_mask_pixel_mask_color_i386.c" + + +static void +op_mask_init(void) +{ + memset(op_mask_span_funcs, 0, sizeof(op_mask_span_funcs)); + memset(op_mask_pt_funcs, 0, sizeof(op_mask_pt_funcs)); +#ifdef BUILD_MMX + init_mask_pixel_span_funcs_mmx(); + init_mask_pixel_color_span_funcs_mmx(); + init_mask_pixel_mask_span_funcs_mmx(); + init_mask_color_span_funcs_mmx(); + init_mask_mask_color_span_funcs_mmx(); + + init_mask_pixel_pt_funcs_mmx(); + init_mask_pixel_color_pt_funcs_mmx(); + init_mask_pixel_mask_pt_funcs_mmx(); + init_mask_color_pt_funcs_mmx(); + init_mask_mask_color_pt_funcs_mmx(); +#endif +#ifdef BUILD_C + init_mask_pixel_span_funcs_c(); + init_mask_pixel_color_span_funcs_c(); + init_mask_pixel_mask_span_funcs_c(); + init_mask_color_span_funcs_c(); + init_mask_mask_color_span_funcs_c(); + + init_mask_pixel_pt_funcs_c(); + init_mask_pixel_color_pt_funcs_c(); + init_mask_pixel_mask_pt_funcs_c(); + init_mask_color_pt_funcs_c(); + init_mask_mask_color_pt_funcs_c(); +#endif +} + +static void +op_mask_shutdown(void) +{ +} + +static RGBA_Gfx_Func +mask_gfx_span_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_mask_span_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_mask_span_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Func +op_mask_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + { + dst->cache_entry.flags.alpha = 1; + s = SP; + } + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return mask_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + c = SC; + } + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return mask_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_mask_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + s = SP; + } + if ((col >> 24) < 255) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + c = SC; + } + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return mask_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_mask_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP; + + if (dst) + dst->cache_entry.flags.alpha = 1; + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + return mask_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_mask_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP; + + if (dst) + dst->cache_entry.flags.alpha = 1; + if (src && src->cache_entry.flags.alpha) + s = SP; + return mask_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +mask_gfx_pt_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Pt_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_mask_pt_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_mask_pt_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Pt_Func +op_mask_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src_flags.alpha) + { + dst->cache_entry.flags.alpha = 1; + s = SP; + } + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return mask_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_mask_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + c = SC; + } + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return mask_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_mask_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src_flags.alpha) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + s = SP; + } + if ((col >> 24) < 255) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + c = SC; + } + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return mask_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_mask_mask_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP; + + if (dst) + dst->cache_entry.flags.alpha = 1; + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + return mask_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_mask_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP; + + if (dst) + dst->cache_entry.flags.alpha = 1; + if (src_flags.alpha) + s = SP; + return mask_gfx_pt_func_cpu(s, m, c, d); +} diff --git a/src/lib/engines/common/evas_op_mul/.cvsignore b/src/lib/engines/common/evas_op_mul/.cvsignore new file mode 100644 index 0000000..282522d --- /dev/null +++ b/src/lib/engines/common/evas_op_mul/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/src/lib/engines/common/evas_op_mul/Makefile.am b/src/lib/engines/common/evas_op_mul/Makefile.am new file mode 100644 index 0000000..23a911b --- /dev/null +++ b/src/lib/engines/common/evas_op_mul/Makefile.am @@ -0,0 +1,11 @@ +EXTRA_DIST = \ +op_mul_color_.c \ +op_mul_color_i386.c \ +op_mul_mask_color_.c \ +op_mul_mask_color_i386.c \ +op_mul_pixel_.c \ +op_mul_pixel_color_.c \ +op_mul_pixel_color_i386.c \ +op_mul_pixel_i386.c \ +op_mul_pixel_mask_.c \ +op_mul_pixel_mask_i386.c diff --git a/src/lib/engines/common/evas_op_mul/op_mul_color_.c b/src/lib/engines/common/evas_op_mul/op_mul_color_.c new file mode 100644 index 0000000..da26658 --- /dev/null +++ b/src/lib/engines/common/evas_op_mul/op_mul_color_.c @@ -0,0 +1,66 @@ + +/* mul color --> dst */ + +#ifdef BUILD_C +static void +_op_mul_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + for (; d < e; d++) { + *d = MUL4_SYM(c, *d); + } +} + +static void +_op_mul_caa_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + c = 1 + (c >> 24); + for (; d < e; d++) { + *d = MUL_256(c, *d); + } +} + +#define _op_mul_can_dp _op_mul_c_dp + +#define _op_mul_c_dpan _op_mul_c_dp +#define _op_mul_can_dpan _op_mul_can_dp +#define _op_mul_caa_dpan _op_mul_caa_dp + +static void +init_mul_color_span_funcs_c(void) +{ + op_mul_span_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_mul_c_dp; + op_mul_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_C] = _op_mul_can_dp; + op_mul_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_mul_caa_dp; + + op_mul_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_mul_c_dpan; + op_mul_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_C] = _op_mul_can_dpan; + op_mul_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_mul_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_mul_pt_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = MUL4_SYM(c, *d); +} + +#define _op_mul_pt_can_dp _op_mul_pt_c_dp +#define _op_mul_pt_caa_dp _op_mul_pt_c_dp + +#define _op_mul_pt_c_dpan _op_mul_pt_c_dp +#define _op_mul_pt_can_dpan _op_mul_pt_can_dp +#define _op_mul_pt_caa_dpan _op_mul_pt_caa_dp + +static void +init_mul_color_pt_funcs_c(void) +{ + op_mul_pt_funcs[SP_N][SM_N][SC][DP][CPU_C] = _op_mul_pt_c_dp; + op_mul_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_C] = _op_mul_pt_can_dp; + op_mul_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_C] = _op_mul_pt_caa_dp; + + op_mul_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_C] = _op_mul_pt_c_dpan; + op_mul_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_C] = _op_mul_pt_can_dpan; + op_mul_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_C] = _op_mul_pt_caa_dpan; +} +#endif + diff --git a/src/lib/engines/common/evas_op_mul/op_mul_color_i386.c b/src/lib/engines/common/evas_op_mul/op_mul_color_i386.c new file mode 100644 index 0000000..3b0c941 --- /dev/null +++ b/src/lib/engines/common/evas_op_mul/op_mul_color_i386.c @@ -0,0 +1,67 @@ + +/* mul color --> dst */ + +#ifdef BUILD_MMX +static void +_op_mul_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) + MOV_P2R(c, mm2, mm0) + for (; d < e; d++) { + MOV_P2R(*d, mm1, mm0) + MUL4_SYM_R2R(mm2, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + } +} + +#define _op_mul_can_dp_mmx _op_mul_c_dp_mmx +#define _op_mul_caa_dp_mmx _op_mul_c_dp_mmx + +#define _op_mul_c_dpan_mmx _op_mul_c_dp_mmx +#define _op_mul_can_dpan_mmx _op_mul_can_dp_mmx +#define _op_mul_caa_dpan_mmx _op_mul_caa_dp_mmx + +static void +init_mul_color_span_funcs_mmx(void) +{ + op_mul_span_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_mul_c_dp_mmx; + op_mul_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_MMX] = _op_mul_can_dp_mmx; + op_mul_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_mul_caa_dp_mmx; + + op_mul_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_mul_c_dpan_mmx; + op_mul_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_mul_can_dpan_mmx; + op_mul_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mul_caa_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_mul_pt_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) + MOV_P2R(c, mm2, mm0) + MOV_P2R(*d, mm1, mm0) + MUL4_SYM_R2R(mm2, mm1, mm5) + MOV_R2P(mm1, *d, mm0) +} + +#define _op_mul_pt_caa_dp_mmx _op_mul_pt_c_dp_mmx +#define _op_mul_pt_can_dp_mmx _op_mul_pt_c_dp_mmx + +#define _op_mul_pt_c_dpan_mmx _op_mul_pt_c_dp_mmx +#define _op_mul_pt_can_dpan_mmx _op_mul_pt_can_dp_mmx +#define _op_mul_pt_caa_dpan_mmx _op_mul_pt_caa_dp_mmx + +static void +init_mul_color_pt_funcs_mmx(void) +{ + op_mul_pt_funcs[SP_N][SM_N][SC][DP][CPU_MMX] = _op_mul_pt_c_dp_mmx; + op_mul_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_MMX] = _op_mul_pt_can_dp_mmx; + op_mul_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_MMX] = _op_mul_pt_caa_dp_mmx; + + op_mul_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_MMX] = _op_mul_pt_c_dpan_mmx; + op_mul_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_mul_pt_can_dpan_mmx; + op_mul_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mul_pt_caa_dpan_mmx; +} +#endif diff --git a/src/lib/engines/common/evas_op_mul/op_mul_mask_color_.c b/src/lib/engines/common/evas_op_mul/op_mul_mask_color_.c new file mode 100644 index 0000000..687fcc7 --- /dev/null +++ b/src/lib/engines/common/evas_op_mul/op_mul_mask_color_.c @@ -0,0 +1,73 @@ + +/* mul mask x color -> dst */ + +#ifdef BUILD_C +static void +_op_mul_mas_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l, nc = ~c; + while (d < e) + { + DATA32 a = *m; + switch(a) + { + case 0: + break; + case 255: + *d = MUL4_SYM(c, *d); + break; + default: + a = ~MUL_SYM(a, nc); + *d = MUL4_SYM(a, *d); + break; + } + m++; d++; + } +} + +#define _op_mul_mas_can_dp _op_mul_mas_c_dp +#define _op_mul_mas_caa_dp _op_mul_mas_c_dp + +#define _op_mul_mas_c_dpan _op_mul_mas_c_dp +#define _op_mul_mas_can_dpan _op_mul_mas_can_dp +#define _op_mul_mas_caa_dpan _op_mul_mas_caa_dp + +static void +init_mul_mask_color_span_funcs_c(void) +{ + op_mul_span_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_mul_mas_c_dp; + op_mul_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_mul_mas_can_dp; + op_mul_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_mul_mas_caa_dp; + + op_mul_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_mul_mas_c_dpan; + op_mul_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_mul_mas_can_dpan; + op_mul_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_mul_mas_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_mul_pt_mas_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + c = ~c; + c = ~MUL_SYM(m, c); + *d = MUL4_SYM(c, *d); +} + +#define _op_mul_pt_mas_can_dp _op_mul_pt_mas_c_dp +#define _op_mul_pt_mas_caa_dp _op_mul_pt_mas_c_dp + +#define _op_mul_pt_mas_c_dpan _op_mul_pt_mas_c_dp +#define _op_mul_pt_mas_can_dpan _op_mul_pt_mas_can_dp +#define _op_mul_pt_mas_caa_dpan _op_mul_pt_mas_caa_dp + +static void +init_mul_mask_color_pt_funcs_c(void) +{ + op_mul_pt_funcs[SP_N][SM_AS][SC][DP][CPU_C] = _op_mul_pt_mas_c_dp; + op_mul_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_C] = _op_mul_pt_mas_can_dp; + op_mul_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_C] = _op_mul_pt_mas_caa_dp; + + op_mul_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_C] = _op_mul_pt_mas_c_dpan; + op_mul_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_C] = _op_mul_pt_mas_can_dpan; + op_mul_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_C] = _op_mul_pt_mas_caa_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_mul/op_mul_mask_color_i386.c b/src/lib/engines/common/evas_op_mul/op_mul_mask_color_i386.c new file mode 100644 index 0000000..8fd486e --- /dev/null +++ b/src/lib/engines/common/evas_op_mul/op_mul_mask_color_i386.c @@ -0,0 +1,93 @@ + +/* mul mask x color -> dst */ + +#ifdef BUILD_MMX +static void +_op_mul_mas_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + MOV_P2R(c, mm2, mm0) + c = ~c; + MOV_P2R(c, mm3, mm0) + MOV_A2R(ALPHA_255, mm5) + pxor_r2r(mm0, mm0); + while (d < e) { + DATA32 a = *m; + switch(a) + { + case 0: + break; + case 255: + MOV_P2R(*d, mm1, mm0) + MUL4_SYM_R2R(mm2, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + break; + default: + a++; + MOV_A2R(a, mm1) + MUL4_256_R2R(mm3, mm1) + movq_r2r(mm5, mm4); + psubw_r2r(mm1, mm4); + MOV_P2R(*d, mm1, mm0) + MUL4_SYM_R2R(mm4, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + break; + } + m++; d++; + } +} + +#define _op_mul_mas_can_dp_mmx _op_mul_mas_c_dp_mmx +#define _op_mul_mas_caa_dp_mmx _op_mul_mas_c_dp_mmx + +#define _op_mul_mas_c_dpan_mmx _op_mul_mas_c_dp_mmx +#define _op_mul_mas_can_dpan_mmx _op_mul_mas_can_dp_mmx +#define _op_mul_mas_caa_dpan_mmx _op_mul_mas_caa_dp_mmx + +static void +init_mul_mask_color_span_funcs_mmx(void) +{ + op_mul_span_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_mul_mas_c_dp_mmx; + op_mul_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_mul_mas_can_dp_mmx; + op_mul_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_mul_mas_caa_dp_mmx; + + op_mul_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_mul_mas_c_dpan_mmx; + op_mul_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_mul_mas_can_dpan_mmx; + op_mul_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_mul_mas_caa_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_mul_pt_mas_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = m + 1; + c = ~c; + MOV_P2R(c, mm3, mm0) + MOV_A2R(ALPHA_255, mm4) + pxor_r2r(mm0, mm0); + MOV_A2R(s, mm1) + MUL4_256_R2R(mm3, mm1) + psubw_r2r(mm1, mm4); + MOV_P2R(*d, mm1, mm0) + MUL4_SYM_R2R(mm4, mm1, mm5) + MOV_R2P(mm1, *d, mm0) +} + +#define _op_mul_pt_mas_can_dp_mmx _op_mul_pt_mas_c_dp_mmx +#define _op_mul_pt_mas_caa_dp_mmx _op_mul_pt_mas_c_dp_mmx + +#define _op_mul_pt_mas_c_dpan_mmx _op_mul_pt_mas_c_dp_mmx +#define _op_mul_pt_mas_can_dpan_mmx _op_mul_pt_mas_can_dp_mmx +#define _op_mul_pt_mas_caa_dpan_mmx _op_mul_pt_mas_caa_dp_mmx + +static void +init_mul_mask_color_pt_funcs_mmx(void) +{ + op_mul_pt_funcs[SP_N][SM_AS][SC][DP][CPU_MMX] = _op_mul_pt_mas_c_dp_mmx; + op_mul_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_MMX] = _op_mul_pt_mas_can_dp_mmx; + op_mul_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_MMX] = _op_mul_pt_mas_caa_dp_mmx; + + op_mul_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_MMX] = _op_mul_pt_mas_c_dpan_mmx; + op_mul_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_MMX] = _op_mul_pt_mas_can_dpan_mmx; + op_mul_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_MMX] = _op_mul_pt_mas_caa_dpan_mmx; +} +#endif diff --git a/src/lib/engines/common/evas_op_mul/op_mul_pixel_.c b/src/lib/engines/common/evas_op_mul/op_mul_pixel_.c new file mode 100644 index 0000000..1beb0cf --- /dev/null +++ b/src/lib/engines/common/evas_op_mul/op_mul_pixel_.c @@ -0,0 +1,57 @@ + +/* mul pixel --> dst */ + +#ifdef BUILD_C +static void +_op_mul_p_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + for (; d < e; d++, s++) { + *d = MUL4_SYM(*s, *d); + } +} + +#define _op_mul_pas_dp _op_mul_p_dp +#define _op_mul_pan_dp _op_mul_p_dp + +#define _op_mul_p_dpan _op_mul_p_dp +#define _op_mul_pas_dpan _op_mul_pas_dp +#define _op_mul_pan_dpan _op_mul_pan_dp + +static void +init_mul_pixel_span_funcs_c(void) +{ + op_mul_span_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_mul_p_dp; + op_mul_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_mul_pas_dp; + op_mul_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_mul_pan_dp; + + op_mul_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_mul_p_dpan; + op_mul_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_mul_pas_dpan; + op_mul_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_mul_pan_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_mul_pt_p_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = MUL4_SYM(s, *d); +} + +#define _op_mul_pt_pas_dp _op_mul_pt_p_dp +#define _op_mul_pt_pan_dp _op_mul_pt_p_dp + +#define _op_mul_pt_p_dpan _op_mul_pt_p_dp +#define _op_mul_pt_pan_dpan _op_mul_pt_pan_dp +#define _op_mul_pt_pas_dpan _op_mul_pt_pas_dp + +static void +init_mul_pixel_pt_funcs_c(void) +{ + op_mul_pt_funcs[SP][SM_N][SC_N][DP][CPU_C] = _op_mul_pt_p_dp; + op_mul_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_C] = _op_mul_pt_pas_dp; + op_mul_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_C] = _op_mul_pt_pan_dp; + + op_mul_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_C] = _op_mul_pt_p_dpan; + op_mul_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_C] = _op_mul_pt_pas_dpan; + op_mul_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_C] = _op_mul_pt_pan_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_.c b/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_.c new file mode 100644 index 0000000..8ba5a49 --- /dev/null +++ b/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_.c @@ -0,0 +1,123 @@ + +/* mul pixel x color --> dst */ + +#ifdef BUILD_C +static void +_op_mul_p_c_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) { + DATA32 cs = MUL4_SYM(c, *s); + *d = MUL4_SYM(cs, *d); + s++; d++; + } +} + +static void +_op_mul_p_caa_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + c = 1 + (c >> 24); + while (d < e) + { + DATA32 cs = MUL_256(c, *s); + *d = MUL4_SYM(cs, *d); + s++; d++; + } +} + +#define _op_mul_pas_c_dp _op_mul_p_c_dp +#define _op_mul_pan_c_dp _op_mul_p_c_dp +#define _op_mul_p_can_dp _op_mul_p_c_dp +#define _op_mul_pas_can_dp _op_mul_p_c_dp +#define _op_mul_pan_can_dp _op_mul_p_c_dp +#define _op_mul_pas_caa_dp _op_mul_p_caa_dp +#define _op_mul_pan_caa_dp _op_mul_p_caa_dp + +#define _op_mul_p_c_dpan _op_mul_p_c_dp +#define _op_mul_pas_c_dpan _op_mul_pas_c_dp +#define _op_mul_pan_c_dpan _op_mul_pan_c_dp +#define _op_mul_p_can_dpan _op_mul_p_can_dp +#define _op_mul_pas_can_dpan _op_mul_pas_can_dp +#define _op_mul_pan_can_dpan _op_mul_pan_can_dp +#define _op_mul_p_caa_dpan _op_mul_p_caa_dp +#define _op_mul_pas_caa_dpan _op_mul_pas_caa_dp +#define _op_mul_pan_caa_dpan _op_mul_pan_caa_dp + +static void +init_mul_pixel_color_span_funcs_c(void) +{ + op_mul_span_funcs[SP][SM_N][SC][DP][CPU_C] = _op_mul_p_c_dp; + op_mul_span_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_mul_pas_c_dp; + op_mul_span_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_mul_pan_c_dp; + op_mul_span_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_mul_p_can_dp; + op_mul_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_mul_pas_can_dp; + op_mul_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_mul_pan_can_dp; + op_mul_span_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_mul_p_caa_dp; + op_mul_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_mul_pas_caa_dp; + op_mul_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_mul_pan_caa_dp; + + op_mul_span_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_mul_p_c_dpan; + op_mul_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_mul_pas_c_dpan; + op_mul_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_mul_pan_c_dpan; + op_mul_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_mul_p_can_dpan; + op_mul_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_mul_pas_can_dpan; + op_mul_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_mul_pan_can_dpan; + op_mul_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_mul_p_caa_dpan; + op_mul_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_mul_pas_caa_dpan; + op_mul_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_mul_pan_caa_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_mul_pt_p_c_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = MUL4_SYM(c, s); + *d = MUL4_SYM(s, *d); +} + +static void +_op_mul_pt_p_caa_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = MUL_SYM(c >> 24, s); + *d = MUL4_SYM(s, *d); +} + +#define _op_mul_pt_pas_c_dp _op_mul_pt_p_c_dp +#define _op_mul_pt_pan_c_dp _op_mul_pt_p_c_dp +#define _op_mul_pt_p_can_dp _op_mul_pt_p_c_dp +#define _op_mul_pt_pas_can_dp _op_mul_pt_p_c_dp +#define _op_mul_pt_pan_can_dp _op_mul_pt_p_c_dp +#define _op_mul_pt_pas_caa_dp _op_mul_pt_p_caa_dp +#define _op_mul_pt_pan_caa_dp _op_mul_pt_p_caa_dp + +#define _op_mul_pt_p_c_dpan _op_mul_pt_p_c_dp +#define _op_mul_pt_pan_c_dpan _op_mul_pt_pan_c_dp +#define _op_mul_pt_pas_c_dpan _op_mul_pt_pas_c_dp +#define _op_mul_pt_p_can_dpan _op_mul_pt_p_can_dp +#define _op_mul_pt_pan_can_dpan _op_mul_pt_pan_can_dp +#define _op_mul_pt_pas_can_dpan _op_mul_pt_pas_can_dp +#define _op_mul_pt_p_caa_dpan _op_mul_pt_p_caa_dp +#define _op_mul_pt_pan_caa_dpan _op_mul_pt_pan_caa_dp +#define _op_mul_pt_pas_caa_dpan _op_mul_pt_pas_caa_dp +static void +init_mul_pixel_color_pt_funcs_c(void) +{ + op_mul_pt_funcs[SP][SM_N][SC][DP][CPU_C] = _op_mul_pt_p_c_dp; + op_mul_pt_funcs[SP_AS][SM_N][SC][DP][CPU_C] = _op_mul_pt_pas_c_dp; + op_mul_pt_funcs[SP_AN][SM_N][SC][DP][CPU_C] = _op_mul_pt_pan_c_dp; + op_mul_pt_funcs[SP][SM_N][SC_AN][DP][CPU_C] = _op_mul_pt_p_can_dp; + op_mul_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_C] = _op_mul_pt_pas_can_dp; + op_mul_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_C] = _op_mul_pt_pan_can_dp; + op_mul_pt_funcs[SP][SM_N][SC_AA][DP][CPU_C] = _op_mul_pt_p_caa_dp; + op_mul_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_C] = _op_mul_pt_pas_caa_dp; + op_mul_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_C] = _op_mul_pt_pan_caa_dp; + + op_mul_pt_funcs[SP][SM_N][SC][DP_AN][CPU_C] = _op_mul_pt_p_c_dpan; + op_mul_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_C] = _op_mul_pt_pas_c_dpan; + op_mul_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_C] = _op_mul_pt_pan_c_dpan; + op_mul_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_C] = _op_mul_pt_p_can_dpan; + op_mul_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_C] = _op_mul_pt_pas_can_dpan; + op_mul_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_C] = _op_mul_pt_pan_can_dpan; + op_mul_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_C] = _op_mul_pt_p_caa_dpan; + op_mul_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_C] = _op_mul_pt_pas_caa_dpan; + op_mul_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_C] = _op_mul_pt_pan_caa_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_i386.c b/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_i386.c new file mode 100644 index 0000000..22e40f6 --- /dev/null +++ b/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_i386.c @@ -0,0 +1,121 @@ + +/* mul pixel x color --> dst */ + +#ifdef BUILD_MMX +static void +_op_mul_p_c_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + MOV_A2R(ALPHA_255, mm5) + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm2, mm0) + while (d < e) + { + MOV_P2R(*s, mm3, mm0) + MUL4_SYM_R2R(mm2, mm3, mm5) + MOV_P2R(*d, mm1, mm0) + MUL4_SYM_R2R(mm3, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + s++; d++; + } +} + +#define _op_mul_pas_c_dp_mmx _op_mul_p_c_dp_mmx +#define _op_mul_pan_c_dp_mmx _op_mul_p_c_dp_mmx +#define _op_mul_p_can_dp_mmx _op_mul_p_c_dp_mmx +#define _op_mul_pas_can_dp_mmx _op_mul_p_c_dp_mmx +#define _op_mul_pan_can_dp_mmx _op_mul_p_c_dp_mmx +#define _op_mul_p_caa_dp_mmx _op_mul_p_c_dp_mmx +#define _op_mul_pas_caa_dp_mmx _op_mul_p_c_dp_mmx +#define _op_mul_pan_caa_dp_mmx _op_mul_p_c_dp_mmx + +#define _op_mul_p_c_dpan_mmx _op_mul_p_c_dp_mmx +#define _op_mul_pan_c_dpan_mmx _op_mul_pan_c_dp_mmx +#define _op_mul_pas_c_dpan_mmx _op_mul_pas_c_dp_mmx +#define _op_mul_p_can_dpan_mmx _op_mul_p_can_dp_mmx +#define _op_mul_pan_can_dpan_mmx _op_mul_pan_can_dp_mmx +#define _op_mul_pas_can_dpan_mmx _op_mul_pas_can_dp_mmx +#define _op_mul_p_caa_dpan_mmx _op_mul_p_caa_dp_mmx +#define _op_mul_pan_caa_dpan_mmx _op_mul_pan_caa_dp_mmx +#define _op_mul_pas_caa_dpan_mmx _op_mul_pas_caa_dp_mmx + +static void +init_mul_pixel_color_span_funcs_mmx(void) +{ + op_mul_span_funcs[SP][SM_N][SC][DP][CPU_MMX] = _op_mul_p_c_dp_mmx; + op_mul_span_funcs[SP_AS][SM_N][SC][DP][CPU_MMX] = _op_mul_pas_c_dp_mmx; + op_mul_span_funcs[SP_AN][SM_N][SC][DP][CPU_MMX] = _op_mul_pan_c_dp_mmx; + op_mul_span_funcs[SP][SM_N][SC_AN][DP][CPU_MMX] = _op_mul_p_can_dp_mmx; + op_mul_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_MMX] = _op_mul_pas_can_dp_mmx; + op_mul_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_MMX] = _op_mul_pan_can_dp_mmx; + op_mul_span_funcs[SP][SM_N][SC_AA][DP][CPU_MMX] = _op_mul_p_caa_dp_mmx; + op_mul_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_MMX] = _op_mul_pas_caa_dp_mmx; + op_mul_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_MMX] = _op_mul_pan_caa_dp_mmx; + + op_mul_span_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_mul_p_c_dpan_mmx; + op_mul_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_mul_pas_c_dpan_mmx; + op_mul_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_mul_pan_c_dpan_mmx; + op_mul_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_mul_p_can_dpan_mmx; + op_mul_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_mul_pas_can_dpan_mmx; + op_mul_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_mul_pan_can_dpan_mmx; + op_mul_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mul_p_caa_dpan_mmx; + op_mul_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mul_pas_caa_dpan_mmx; + op_mul_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mul_pan_caa_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_mul_pt_p_c_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + MOV_A2R(ALPHA_255, mm5) + pxor_r2r(mm0, mm0); + MOV_P2R(c, mm2, mm0) + MOV_P2R(s, mm3, mm0) + MUL4_SYM_R2R(mm2, mm3, mm5) + MOV_P2R(*d, mm1, mm0) + MUL4_SYM_R2R(mm3, mm1, mm5) + MOV_R2P(mm1, *d, mm0) +} + +#define _op_mul_pt_pas_c_dp_mmx _op_mul_pt_p_c_dp_mmx +#define _op_mul_pt_pan_c_dp_mmx _op_mul_pt_p_c_dp_mmx +#define _op_mul_pt_p_can_dp_mmx _op_mul_pt_p_c_dp_mmx +#define _op_mul_pt_pas_can_dp_mmx _op_mul_pt_p_c_dp_mmx +#define _op_mul_pt_pan_can_dp_mmx _op_mul_pt_p_c_dp_mmx +#define _op_mul_pt_p_caa_dp_mmx _op_mul_pt_p_c_dp_mmx +#define _op_mul_pt_pas_caa_dp_mmx _op_mul_pt_p_c_dp_mmx +#define _op_mul_pt_pan_caa_dp_mmx _op_mul_pt_p_c_dp_mmx + +#define _op_mul_pt_p_c_dpan_mmx _op_mul_pt_p_c_dp_mmx +#define _op_mul_pt_pan_c_dpan_mmx _op_mul_pt_pan_c_dp_mmx +#define _op_mul_pt_pas_c_dpan_mmx _op_mul_pt_pas_c_dp_mmx +#define _op_mul_pt_p_can_dpan_mmx _op_mul_pt_p_can_dp_mmx +#define _op_mul_pt_pan_can_dpan_mmx _op_mul_pt_pan_can_dp_mmx +#define _op_mul_pt_pas_can_dpan_mmx _op_mul_pt_pas_can_dp_mmx +#define _op_mul_pt_p_caa_dpan_mmx _op_mul_pt_p_caa_dp_mmx +#define _op_mul_pt_pan_caa_dpan_mmx _op_mul_pt_pan_caa_dp_mmx +#define _op_mul_pt_pas_caa_dpan_mmx _op_mul_pt_pas_caa_dp_mmx + +static void +init_mul_pixel_color_pt_funcs_mmx(void) +{ + op_mul_pt_funcs[SP][SM_N][SC][DP][CPU_MMX] = _op_mul_pt_p_c_dp_mmx; + op_mul_pt_funcs[SP_AS][SM_N][SC][DP][CPU_MMX] = _op_mul_pt_pas_c_dp_mmx; + op_mul_pt_funcs[SP_AN][SM_N][SC][DP][CPU_MMX] = _op_mul_pt_pan_c_dp_mmx; + op_mul_pt_funcs[SP][SM_N][SC_AN][DP][CPU_MMX] = _op_mul_pt_p_can_dp_mmx; + op_mul_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_MMX] = _op_mul_pt_pas_can_dp_mmx; + op_mul_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_MMX] = _op_mul_pt_pan_can_dp_mmx; + op_mul_pt_funcs[SP][SM_N][SC_AA][DP][CPU_MMX] = _op_mul_pt_p_caa_dp_mmx; + op_mul_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_MMX] = _op_mul_pt_pas_caa_dp_mmx; + op_mul_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_MMX] = _op_mul_pt_pan_caa_dp_mmx; + + op_mul_pt_funcs[SP][SM_N][SC][DP_AN][CPU_MMX] = _op_mul_pt_p_c_dpan_mmx; + op_mul_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_MMX] = _op_mul_pt_pas_c_dpan_mmx; + op_mul_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_MMX] = _op_mul_pt_pan_c_dpan_mmx; + op_mul_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_mul_pt_p_can_dpan_mmx; + op_mul_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_mul_pt_pas_can_dpan_mmx; + op_mul_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_MMX] = _op_mul_pt_pan_can_dpan_mmx; + op_mul_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mul_pt_p_caa_dpan_mmx; + op_mul_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mul_pt_pas_caa_dpan_mmx; + op_mul_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_MMX] = _op_mul_pt_pan_caa_dpan_mmx; +} +#endif diff --git a/src/lib/engines/common/evas_op_mul/op_mul_pixel_i386.c b/src/lib/engines/common/evas_op_mul/op_mul_pixel_i386.c new file mode 100644 index 0000000..8f7f15b --- /dev/null +++ b/src/lib/engines/common/evas_op_mul/op_mul_pixel_i386.c @@ -0,0 +1,67 @@ + +/* mul pixel --> dst */ + +#ifdef BUILD_MMX +static void +_op_mul_p_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = s + l; + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) + for (; s < e; s++, d++) { + MOV_P2R(*d, mm1, mm0) + MOV_P2R(*s, mm2, mm0) + MUL4_SYM_R2R(mm2, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + } +} + +#define _op_mul_pas_dp_mmx _op_mul_p_dp_mmx +#define _op_mul_pan_dp_mmx _op_mul_p_dp_mmx + +#define _op_mul_p_dpan_mmx _op_mul_p_dp_mmx +#define _op_mul_pan_dpan_mmx _op_mul_pan_dp_mmx +#define _op_mul_pas_dpan_mmx _op_mul_pas_dp_mmx + +static void +init_mul_pixel_span_funcs_mmx(void) +{ + op_mul_span_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_mul_p_dp_mmx; + op_mul_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_mul_pan_dp_mmx; + op_mul_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_mul_pas_dp_mmx; + + op_mul_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mul_p_dpan_mmx; + op_mul_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mul_pan_dpan_mmx; + op_mul_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mul_pas_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +_op_mul_pt_p_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) + MOV_P2R(*d, mm1, mm0) + MOV_P2R(s, mm2, mm0) + MUL4_SYM_R2R(mm2, mm1, mm5) + MOV_R2P(mm1, *d, mm0) +} + +#define _op_mul_pt_pan_dp_mmx _op_mul_pt_p_dp_mmx +#define _op_mul_pt_pas_dp_mmx _op_mul_pt_p_dp_mmx + +#define _op_mul_pt_p_dpan_mmx _op_mul_pt_p_dp_mmx +#define _op_mul_pt_pan_dpan_mmx _op_mul_pt_pan_dp_mmx +#define _op_mul_pt_pas_dpan_mmx _op_mul_pt_pas_dp_mmx + +static void +init_mul_pixel_pt_funcs_mmx(void) +{ + op_mul_pt_funcs[SP][SM_N][SC_N][DP][CPU_MMX] = _op_mul_pt_p_dp_mmx; + op_mul_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_MMX] = _op_mul_pt_pan_dp_mmx; + op_mul_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_MMX] = _op_mul_pt_pas_dp_mmx; + + op_mul_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mul_pt_p_dpan_mmx; + op_mul_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mul_pt_pan_dpan_mmx; + op_mul_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_MMX] = _op_mul_pt_pas_dpan_mmx; +} +#endif diff --git a/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_.c b/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_.c new file mode 100644 index 0000000..6617b63 --- /dev/null +++ b/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_.c @@ -0,0 +1,118 @@ + +/* mul pixel x mask --> dst */ + +#ifdef BUILD_C +static void +_op_mul_p_mas_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) + { + c = *m; + switch(c) + { + case 0: + break; + case 255: + *d = MUL4_SYM(*s, *d); + break; + default: + c = ~(*s); + c = ~MUL_SYM(*m, c); + *d = MUL4_SYM(c, *d); + break; + } + m++; s++; d++; + } +} + +static void +_op_mul_pan_mas_dp(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) + { + c = *m; + switch(c) + { + case 0: + break; + case 255: + *d = (*d & 0xff000000) + MUL3_SYM(*s, *d); + break; + default: + c = ~(*s); + c = ~MUL_SYM(*m, c); + *d = (*d & 0xff000000) + MUL3_SYM(c, *d); + break; + } + m++; s++; d++; + } +} + +static void +_op_mul_p_mas_dpan(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + while (d < e) + { + c = *m; + switch(c) + { + case 0: + break; + case 255: + *d = (*s & 0xff000000) + MUL3_SYM(*s, *d); + break; + default: + c = ~(*s); + c = ~MUL_SYM(*m, c); + *d = (c & 0xff000000) + MUL3_SYM(c, *d); + break; + } + m++; d++; + } +} + +#define _op_mul_pas_mas_dp _op_mul_p_mas_dp + +#define _op_mul_pan_mas_dpan _op_mul_p_mas_dpan +#define _op_mul_pas_mas_dpan _op_mul_p_mas_dpan + +static void +init_mul_pixel_mask_span_funcs_c(void) +{ + op_mul_span_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_mul_p_mas_dp; + op_mul_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_mul_pas_mas_dp; + op_mul_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_mul_pan_mas_dp; + + op_mul_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_mul_p_mas_dpan; + op_mul_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_mul_pas_mas_dpan; + op_mul_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_mul_pan_mas_dpan; +} +#endif + +#ifdef BUILD_C +static void +_op_mul_pt_p_mas_dp(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = ~s; + s = ~MUL_SYM(m, s); + *d = MUL4_SYM(s, *d); +} + +#define _op_mul_pt_pas_mas_dp _op_mul_pt_p_mas_dp +#define _op_mul_pt_pan_mas_dp _op_mul_pt_p_mas_dp + +#define _op_mul_pt_p_mas_dpan _op_mul_pt_p_mas_dp +#define _op_mul_pt_pas_mas_dpan _op_mul_pt_p_mas_dp +#define _op_mul_pt_pan_mas_dpan _op_mul_pt_p_mas_dp + +static void +init_mul_pixel_mask_pt_funcs_c(void) +{ + op_mul_pt_funcs[SP][SM_AS][SC_N][DP][CPU_C] = _op_mul_pt_p_mas_dp; + op_mul_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_C] = _op_mul_pt_pas_mas_dp; + op_mul_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_C] = _op_mul_pt_pan_mas_dp; + + op_mul_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_C] = _op_mul_pt_p_mas_dpan; + op_mul_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_C] = _op_mul_pt_pas_mas_dpan; + op_mul_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_C] = _op_mul_pt_pan_mas_dpan; +} +#endif diff --git a/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_i386.c b/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_i386.c new file mode 100644 index 0000000..b2c00ce --- /dev/null +++ b/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_i386.c @@ -0,0 +1,64 @@ + +/* mul pixel x mask --> dst */ + +#ifdef BUILD_MMX +static void +_op_mul_p_mas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e = d + l; + MOV_A2R(ALPHA_255, mm5) + pxor_r2r(mm0, mm0); + while (d < e) { + c = *m; + switch(c) + { + case 0: + break; + case 255: + MOV_P2R(*d, mm1, mm0) + MOV_P2R(*s, mm2, mm0) + MUL4_SYM_R2R(mm2, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + break; + default: + c++; + MOV_A2R(c, mm1) + c = ~(*s); + MOV_P2R(c, mm3, mm0) + MUL4_256_R2R(mm3, mm1) + movq_r2r(mm5, mm4); + psubw_r2r(mm1, mm4); + MOV_P2R(*d, mm1, mm0) + MUL4_SYM_R2R(mm4, mm1, mm5) + MOV_R2P(mm1, *d, mm0) + break; + } + s++; m++; d++; + } +} + +#define _op_mul_pas_mas_dp_mmx _op_mul_p_mas_dp_mmx +#define _op_mul_pan_mas_dp_mmx _op_mul_p_mas_dp_mmx + +#define _op_mul_p_mas_dpan_mmx _op_mul_p_mas_dp_mmx +#define _op_mul_pas_mas_dpan_mmx _op_mul_pas_mas_dp_mmx +#define _op_mul_pan_mas_dpan_mmx _op_mul_pan_mas_dp_mmx + +static void +init_mul_pixel_mask_span_funcs_mmx(void) +{ + op_mul_span_funcs[SP][SM_AS][SC_N][DP][CPU_MMX] = _op_mul_p_mas_dp_mmx; + op_mul_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_MMX] = _op_mul_pas_mas_dp_mmx; + op_mul_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_MMX] = _op_mul_pan_mas_dp_mmx; + + op_mul_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_mul_p_mas_dpan_mmx; + op_mul_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_mul_pas_mas_dpan_mmx; + op_mul_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_mul_pan_mas_dpan_mmx; +} +#endif + +#ifdef BUILD_MMX +static void +init_mul_pixel_mask_pt_funcs_mmx(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_mul_main_.c b/src/lib/engines/common/evas_op_mul_main_.c new file mode 100644 index 0000000..181352b --- /dev/null +++ b/src/lib/engines/common/evas_op_mul_main_.c @@ -0,0 +1,308 @@ +#include "evas_common.h" + +static RGBA_Gfx_Func op_mul_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; +static RGBA_Gfx_Pt_Func op_mul_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; + +static void op_mul_init(void); +static void op_mul_shutdown(void); + +static RGBA_Gfx_Func op_mul_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_mul_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_mul_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_mul_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_mul_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); + +static RGBA_Gfx_Pt_Func op_mul_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_mul_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_mul_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_mul_mask_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_mul_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); + +static RGBA_Gfx_Compositor _composite_mul = { "mul", + op_mul_init, op_mul_shutdown, + op_mul_pixel_span_get, op_mul_color_span_get, + op_mul_pixel_color_span_get, op_mul_mask_color_span_get, + op_mul_pixel_mask_span_get, + op_mul_pixel_pt_get, op_mul_color_pt_get, + op_mul_pixel_color_pt_get, op_mul_mask_color_pt_get, + op_mul_pixel_mask_pt_get + }; + +RGBA_Gfx_Compositor * +evas_common_gfx_compositor_mul_get(void) +{ + return &(_composite_mul); +} + + +# include "./evas_op_mul/op_mul_pixel_.c" +# include "./evas_op_mul/op_mul_color_.c" +# include "./evas_op_mul/op_mul_pixel_color_.c" +# include "./evas_op_mul/op_mul_pixel_mask_.c" +# include "./evas_op_mul/op_mul_mask_color_.c" +//# include "./evas_op_mul/op_mul_pixel_mask_color_.c" + +# include "./evas_op_mul/op_mul_pixel_i386.c" +# include "./evas_op_mul/op_mul_color_i386.c" +# include "./evas_op_mul/op_mul_pixel_color_i386.c" +# include "./evas_op_mul/op_mul_pixel_mask_i386.c" +# include "./evas_op_mul/op_mul_mask_color_i386.c" +// # include "./evas_op_mul/op_mul_pixel_mask_color_i386.c" + +static void +op_mul_init(void) +{ + memset(op_mul_span_funcs, 0, sizeof(op_mul_span_funcs)); + memset(op_mul_pt_funcs, 0, sizeof(op_mul_pt_funcs)); +#ifdef BUILD_MMX + init_mul_pixel_span_funcs_mmx(); + init_mul_pixel_color_span_funcs_mmx(); + init_mul_pixel_mask_span_funcs_mmx(); + init_mul_color_span_funcs_mmx(); + init_mul_mask_color_span_funcs_mmx(); + + init_mul_pixel_pt_funcs_mmx(); + init_mul_pixel_color_pt_funcs_mmx(); + init_mul_pixel_mask_pt_funcs_mmx(); + init_mul_color_pt_funcs_mmx(); + init_mul_mask_color_pt_funcs_mmx(); +#endif +#ifdef BUILD_C + init_mul_pixel_span_funcs_c(); + init_mul_pixel_color_span_funcs_c(); + init_mul_pixel_mask_span_funcs_c(); + init_mul_color_span_funcs_c(); + init_mul_mask_color_span_funcs_c(); + + init_mul_pixel_pt_funcs_c(); + init_mul_pixel_color_pt_funcs_c(); + init_mul_pixel_mask_pt_funcs_c(); + init_mul_color_pt_funcs_c(); + init_mul_mask_color_pt_funcs_c(); +#endif +} + +static void +op_mul_shutdown(void) +{ +} + +static RGBA_Gfx_Func +mul_gfx_span_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_mul_span_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_mul_span_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Func +op_mul_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + { + dst->cache_entry.flags.alpha = 1; + s = SP; + } + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return mul_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_mul_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + c = SC; + } + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return mul_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_mul_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + s = SP; + } + if ((col >> 24) < 255) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + c = SC; + } + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return mul_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_mul_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP; + + if (dst) + dst->cache_entry.flags.alpha = 1; + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + return mul_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_mul_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP; + + if (dst) + dst->cache_entry.flags.alpha = 1; + if (src && src->cache_entry.flags.alpha) + s = SP; + return mul_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +mul_gfx_pt_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Pt_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_mul_pt_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_mul_pt_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Pt_Func +op_mul_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src_flags.alpha) + { + dst->cache_entry.flags.alpha = 1; + s = SP; + } + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return mul_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_mul_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + c = SC; + } + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return mul_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_mul_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src_flags.alpha) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + s = SP; + } + if ((col >> 24) < 255) + { + if (dst) + dst->cache_entry.flags.alpha = 1; + c = SC; + } + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return mul_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_mul_mask_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP; + + if (dst) + dst->cache_entry.flags.alpha = 1; + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + return mul_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_mul_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP; + + if (dst) + dst->cache_entry.flags.alpha = 1; + if (src_flags.alpha) + s = SP; + return mul_gfx_pt_func_cpu(s, m, c, d); +} diff --git a/src/lib/engines/common/evas_op_sub/.cvsignore b/src/lib/engines/common/evas_op_sub/.cvsignore new file mode 100644 index 0000000..282522d --- /dev/null +++ b/src/lib/engines/common/evas_op_sub/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/src/lib/engines/common/evas_op_sub/Makefile.am b/src/lib/engines/common/evas_op_sub/Makefile.am new file mode 100644 index 0000000..cf0a068 --- /dev/null +++ b/src/lib/engines/common/evas_op_sub/Makefile.am @@ -0,0 +1,12 @@ +EXTRA_DIST = \ +op_sub_color_.c \ +op_sub_color_i386.c \ +op_sub_mask_color_.c \ +op_sub_mask_color_i386.c \ +op_sub_pixel_.c \ +op_sub_pixel_color_.c \ +op_sub_pixel_color_i386.c \ +op_sub_pixel_i386.c \ +op_sub_pixel_mask_.c \ +op_sub_pixel_mask_i386.c + diff --git a/src/lib/engines/common/evas_op_sub/op_sub_color_.c b/src/lib/engines/common/evas_op_sub/op_sub_color_.c new file mode 100644 index 0000000..82d6db4 --- /dev/null +++ b/src/lib/engines/common/evas_op_sub/op_sub_color_.c @@ -0,0 +1,34 @@ + +/* sub color -> dst */ + +#ifdef BUILD_C +static void +init_sub_color_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_sub_color_pt_funcs_c(void) +{ +} +#endif + +/*-----*/ + +/* sub_rel color -> dst */ + +#ifdef BUILD_C +static void +init_sub_rel_color_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_sub_rel_color_pt_funcs_c(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_sub/op_sub_color_i386.c b/src/lib/engines/common/evas_op_sub/op_sub_color_i386.c new file mode 100644 index 0000000..0b3d5e5 --- /dev/null +++ b/src/lib/engines/common/evas_op_sub/op_sub_color_i386.c @@ -0,0 +1,34 @@ + +/* sub color -> dst */ + +#ifdef BUILD_MMX +static void +init_sub_color_span_funcs_mmx(void) +{ +} +#endif + +#ifdef BUILD_MMX +static void +init_sub_color_pt_funcs_mmx(void) +{ +} +#endif + +/*-----*/ + +/* sub_rel color -> dst */ + +#ifdef BUILD_MMX +static void +init_sub_rel_color_span_funcs_mmx(void) +{ +} +#endif + +#ifdef BUILD_MMX +static void +init_sub_rel_color_pt_funcs_mmx(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_sub/op_sub_mask_color_.c b/src/lib/engines/common/evas_op_sub/op_sub_mask_color_.c new file mode 100644 index 0000000..8457a0b --- /dev/null +++ b/src/lib/engines/common/evas_op_sub/op_sub_mask_color_.c @@ -0,0 +1,34 @@ + +/* sub mask x color -> dst */ + +#ifdef BUILD_C +static void +init_sub_mask_color_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_sub_mask_color_pt_funcs_c(void) +{ +} +#endif + +/*-----*/ + +/* sub_rel mask x color -> dst */ + +#ifdef BUILD_C +static void +init_sub_rel_mask_color_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_sub_rel_mask_color_pt_funcs_c(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_sub/op_sub_mask_color_i386.c b/src/lib/engines/common/evas_op_sub/op_sub_mask_color_i386.c new file mode 100644 index 0000000..1304121 --- /dev/null +++ b/src/lib/engines/common/evas_op_sub/op_sub_mask_color_i386.c @@ -0,0 +1,34 @@ + +/* sub mask x color -> dst */ + +#ifdef BUILD_MMX +static void +init_sub_mask_color_span_funcs_mmx(void) +{ +} +#endif + +#ifdef BUILD_MMX +static void +init_sub_mask_color_pt_funcs_mmx(void) +{ +} +#endif + +/*-----*/ + +/* sub_rel mask x color -> dst */ + +#ifdef BUILD_MMX +static void +init_sub_rel_mask_color_span_funcs_mmx(void) +{ +} +#endif + +#ifdef BUILD_MMX +static void +init_sub_rel_mask_color_pt_funcs_mmx(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_sub/op_sub_pixel_.c b/src/lib/engines/common/evas_op_sub/op_sub_pixel_.c new file mode 100644 index 0000000..2ae74e3 --- /dev/null +++ b/src/lib/engines/common/evas_op_sub/op_sub_pixel_.c @@ -0,0 +1,34 @@ + +/* sub pixel --> dst */ + +#ifdef BUILD_C +static void +init_sub_pixel_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_sub_pixel_pt_funcs_c(void) +{ +} +#endif + +/*-----*/ + +/* sub_rel pixel --> dst */ + +#ifdef BUILD_C +static void +init_sub_rel_pixel_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_sub_rel_pixel_pt_funcs_c(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_.c b/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_.c new file mode 100644 index 0000000..14d6b39 --- /dev/null +++ b/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_.c @@ -0,0 +1,34 @@ + +/* sub pixel x color --> dst */ + +#ifdef BUILD_C +static void +init_sub_pixel_color_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_sub_pixel_color_pt_funcs_c(void) +{ +} +#endif + +/*-----*/ + +/* sub_rel pixel x color --> dst */ + +#ifdef BUILD_C +static void +init_sub_rel_pixel_color_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_sub_rel_pixel_color_pt_funcs_c(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_i386.c b/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_i386.c new file mode 100644 index 0000000..ebf0b2e --- /dev/null +++ b/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_i386.c @@ -0,0 +1,30 @@ + +/* sub pixel x color --> dst */ + +#ifdef BUILD_MMX +static void +init_sub_pixel_color_span_funcs_mmx(void) +{ } +#endif + +#ifdef BUILD_MMX +static void +init_sub_pixel_color_pt_funcs_mmx(void) +{ } +#endif + +/*-----*/ + +/* sub_rel pixel x color --> dst */ + +#ifdef BUILD_MMX +static void +init_sub_rel_pixel_color_span_funcs_mmx(void) +{ } +#endif + +#ifdef BUILD_MMX +static void +init_sub_rel_pixel_color_pt_funcs_mmx(void) +{ } +#endif diff --git a/src/lib/engines/common/evas_op_sub/op_sub_pixel_i386.c b/src/lib/engines/common/evas_op_sub/op_sub_pixel_i386.c new file mode 100644 index 0000000..93ddeaa --- /dev/null +++ b/src/lib/engines/common/evas_op_sub/op_sub_pixel_i386.c @@ -0,0 +1,34 @@ + +/* sub pixel --> dst */ + +#ifdef BUILD_MMX +static void +init_sub_pixel_span_funcs_mmx(void) +{ +} +#endif + +#ifdef BUILD_MMX +static void +init_sub_pixel_pt_funcs_mmx(void) +{ +} +#endif + +/*-----*/ + +/* sub_rel pixel --> dst */ + +#ifdef BUILD_MMX +static void +init_sub_rel_pixel_span_funcs_mmx(void) +{ +} +#endif + +#ifdef BUILD_MMX +static void +init_sub_rel_pixel_pt_funcs_mmx(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_.c b/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_.c new file mode 100644 index 0000000..041a736 --- /dev/null +++ b/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_.c @@ -0,0 +1,34 @@ + +/* sub pixel x mask --> dst */ + +#ifdef BUILD_C +static void +init_sub_pixel_mask_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_sub_pixel_mask_pt_funcs_c(void) +{ +} +#endif + +/*-----*/ + +/* sub_rel pixel x mask --> dst */ + +#ifdef BUILD_C +static void +init_sub_rel_pixel_mask_span_funcs_c(void) +{ +} +#endif + +#ifdef BUILD_C +static void +init_sub_rel_pixel_mask_pt_funcs_c(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_i386.c b/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_i386.c new file mode 100644 index 0000000..4875229 --- /dev/null +++ b/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_i386.c @@ -0,0 +1,34 @@ + +/* sub pixel x mask -> dst */ + +#ifdef BUILD_MMX +static void +init_sub_pixel_mask_span_funcs_mmx(void) +{ +} +#endif + +#ifdef BUILD_MMX +static void +init_sub_pixel_mask_pt_funcs_mmx(void) +{ +} +#endif + +/*-----*/ + +/* sub_rel pixel x mask -> dst */ + +#ifdef BUILD_MMX +static void +init_sub_rel_pixel_mask_span_funcs_mmx(void) +{ +} +#endif + +#ifdef BUILD_MMX +static void +init_sub_rel_pixel_mask_pt_funcs_mmx(void) +{ +} +#endif diff --git a/src/lib/engines/common/evas_op_sub_main_.c b/src/lib/engines/common/evas_op_sub_main_.c new file mode 100644 index 0000000..f056cfc --- /dev/null +++ b/src/lib/engines/common/evas_op_sub_main_.c @@ -0,0 +1,542 @@ +#include "evas_common.h" + +static RGBA_Gfx_Func op_sub_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; +static RGBA_Gfx_Pt_Func op_sub_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; + +static void op_sub_init(void); +static void op_sub_shutdown(void); + +static RGBA_Gfx_Func op_sub_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_sub_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_sub_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_sub_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_sub_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); + +static RGBA_Gfx_Pt_Func op_sub_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_sub_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_sub_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_sub_mask_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_sub_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); + +static RGBA_Gfx_Compositor _composite_sub = { "sub", + op_sub_init, op_sub_shutdown, + op_sub_pixel_span_get, op_sub_color_span_get, + op_sub_pixel_color_span_get, op_sub_mask_color_span_get, + op_sub_pixel_mask_span_get, + op_sub_pixel_pt_get, op_sub_color_pt_get, + op_sub_pixel_color_pt_get, op_sub_mask_color_pt_get, + op_sub_pixel_mask_pt_get + }; + +RGBA_Gfx_Compositor * +evas_common_gfx_compositor_sub_get(void) +{ + return &(_composite_sub); +} + +static RGBA_Gfx_Func op_sub_rel_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; +static RGBA_Gfx_Pt_Func op_sub_rel_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; + +static void op_sub_rel_init(void); +static void op_sub_rel_shutdown(void); + +static RGBA_Gfx_Func op_sub_rel_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_sub_rel_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_sub_rel_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_sub_rel_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels); +static RGBA_Gfx_Func op_sub_rel_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels); + +static RGBA_Gfx_Pt_Func op_sub_rel_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_sub_rel_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_sub_rel_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_sub_rel_mask_color_pt_get(DATA32 col, RGBA_Image *dst); +static RGBA_Gfx_Pt_Func op_sub_rel_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst); + +static RGBA_Gfx_Compositor _composite_sub_rel = { "sub_rel", + op_sub_rel_init, op_sub_rel_shutdown, + op_sub_rel_pixel_span_get, op_sub_rel_color_span_get, + op_sub_rel_pixel_color_span_get, op_sub_rel_mask_color_span_get, + op_sub_rel_pixel_mask_span_get, + op_sub_rel_pixel_pt_get, op_sub_rel_color_pt_get, + op_sub_rel_pixel_color_pt_get, op_sub_rel_mask_color_pt_get, + op_sub_rel_pixel_mask_pt_get + }; + +RGBA_Gfx_Compositor * +evas_common_gfx_compositor_sub_rel_get(void) +{ + return &(_composite_sub_rel); +} + + +# include "./evas_op_sub/op_sub_pixel_.c" +# include "./evas_op_sub/op_sub_color_.c" +# include "./evas_op_sub/op_sub_pixel_color_.c" +# include "./evas_op_sub/op_sub_pixel_mask_.c" +# include "./evas_op_sub/op_sub_mask_color_.c" +//# include "./evas_op_sub/op_sub_pixel_mask_color_.c" + +# include "./evas_op_sub/op_sub_pixel_i386.c" +# include "./evas_op_sub/op_sub_color_i386.c" +# include "./evas_op_sub/op_sub_pixel_color_i386.c" +# include "./evas_op_sub/op_sub_pixel_mask_i386.c" +# include "./evas_op_sub/op_sub_mask_color_i386.c" +//# include "./evas_op_sub/op_sub_pixel_mask_color_i386.c" + +static void +op_sub_init(void) +{ + memset(op_sub_span_funcs, 0, sizeof(op_sub_span_funcs)); + memset(op_sub_pt_funcs, 0, sizeof(op_sub_pt_funcs)); +#ifdef BUILD_MMX + init_sub_pixel_span_funcs_mmx(); + init_sub_pixel_color_span_funcs_mmx(); + init_sub_pixel_mask_span_funcs_mmx(); + init_sub_color_span_funcs_mmx(); + init_sub_mask_color_span_funcs_mmx(); + + init_sub_pixel_pt_funcs_mmx(); + init_sub_pixel_color_pt_funcs_mmx(); + init_sub_pixel_mask_pt_funcs_mmx(); + init_sub_color_pt_funcs_mmx(); + init_sub_mask_color_pt_funcs_mmx(); +#endif +#ifdef BUILD_C + init_sub_pixel_span_funcs_c(); + init_sub_pixel_color_span_funcs_c(); + init_sub_rel_pixel_mask_span_funcs_c(); + init_sub_color_span_funcs_c(); + init_sub_mask_color_span_funcs_c(); + + init_sub_pixel_pt_funcs_c(); + init_sub_pixel_color_pt_funcs_c(); + init_sub_rel_pixel_mask_pt_funcs_c(); + init_sub_color_pt_funcs_c(); + init_sub_mask_color_pt_funcs_c(); +#endif +} + +static void +op_sub_shutdown(void) +{ +} + +static RGBA_Gfx_Func +sub_gfx_span_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_sub_span_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_sub_span_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Func +op_sub_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_sub_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_sub_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + s = SP; + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_sub_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_sub_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +sub_gfx_pt_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Pt_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_sub_pt_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_sub_pt_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Pt_Func +op_sub_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_sub_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_sub_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_sub_mask_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_sub_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_gfx_pt_func_cpu(s, m, c, d); +} + + + +static void +op_sub_rel_init(void) +{ + memset(op_sub_rel_span_funcs, 0, sizeof(op_sub_rel_span_funcs)); + memset(op_sub_rel_pt_funcs, 0, sizeof(op_sub_rel_pt_funcs)); +#ifdef BUILD_MMX + init_sub_rel_pixel_span_funcs_mmx(); + init_sub_rel_pixel_color_span_funcs_mmx(); + init_sub_rel_pixel_mask_span_funcs_mmx(); + init_sub_rel_color_span_funcs_mmx(); + init_sub_rel_mask_color_span_funcs_mmx(); + + init_sub_rel_pixel_pt_funcs_mmx(); + init_sub_rel_pixel_color_pt_funcs_mmx(); + init_sub_rel_pixel_mask_pt_funcs_mmx(); + init_sub_rel_color_pt_funcs_mmx(); + init_sub_rel_mask_color_pt_funcs_mmx(); +#endif +#ifdef BUILD_C + init_sub_rel_pixel_span_funcs_c(); + init_sub_rel_pixel_color_span_funcs_c(); + init_sub_rel_pixel_mask_span_funcs_c(); + init_sub_rel_color_span_funcs_c(); + init_sub_rel_mask_color_span_funcs_c(); + + init_sub_rel_pixel_pt_funcs_c(); + init_sub_rel_pixel_color_pt_funcs_c(); + init_sub_rel_pixel_mask_pt_funcs_c(); + init_sub_rel_color_pt_funcs_c(); + init_sub_rel_mask_color_pt_funcs_c(); +#endif +} + +static void +op_sub_rel_shutdown(void) +{ +} + +static RGBA_Gfx_Func +sub_rel_gfx_span_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_sub_rel_span_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_sub_rel_span_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Func +op_sub_rel_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_sub_rel_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_sub_rel_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + s = SP; + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_sub_rel_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Func +op_sub_rel_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN; + + if (src && src->cache_entry.flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_rel_gfx_span_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +sub_rel_gfx_pt_func_cpu(int s, int m, int c, int d) +{ + RGBA_Gfx_Pt_Func func = NULL; + int cpu = CPU_N; +#ifdef BUILD_MMX + if (evas_common_cpu_has_feature(CPU_FEATURE_MMX)) + { + cpu = CPU_MMX; + func = op_sub_rel_pt_funcs[s][m][c][d][cpu]; + if (func) return func; + } +#endif +#ifdef BUILD_C + cpu = CPU_C; + func = op_sub_rel_pt_funcs[s][m][c][d][cpu]; + if (func) return func; +#endif + return func; +} + +static RGBA_Gfx_Pt_Func +op_sub_rel_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_N, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_rel_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_sub_rel_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_N, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_rel_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_sub_rel_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_N, c = SC_AN, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_rel_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_sub_rel_mask_color_pt_get(DATA32 col, RGBA_Image *dst) +{ + int s = SP_N, m = SM_AS, c = SC_AN, d = DP_AN; + + if ((col >> 24) < 255) + c = SC; + if (col == (col | 0x00ffffff)) + c = SC_AA; + if (col == 0xffffffff) + c = SC_N; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_rel_gfx_pt_func_cpu(s, m, c, d); +} + +static RGBA_Gfx_Pt_Func +op_sub_rel_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst) +{ + int s = SP_AN, m = SM_AS, c = SC_N, d = DP_AN; + + if (src_flags.alpha) + s = SP; + if (dst && dst->cache_entry.flags.alpha) + d = DP; + return sub_rel_gfx_pt_func_cpu(s, m, c, d); +} diff --git a/src/lib/engines/common/evas_pipe.c b/src/lib/engines/common/evas_pipe.c new file mode 100644 index 0000000..5ab156f --- /dev/null +++ b/src/lib/engines/common/evas_pipe.c @@ -0,0 +1,592 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" + +static RGBA_Pipe *evas_common_pipe_add(RGBA_Pipe *pipe, RGBA_Pipe_Op **op); +static void evas_common_pipe_draw_context_copy(RGBA_Draw_Context *dc, RGBA_Pipe_Op *op); +static void evas_common_pipe_op_free(RGBA_Pipe_Op *op); + +/* utils */ +static RGBA_Pipe * +evas_common_pipe_add(RGBA_Pipe *pipe, RGBA_Pipe_Op **op) +{ + RGBA_Pipe *p; + int first_pipe = 0; + + if (!pipe) + { + first_pipe = 1; + p = calloc(1, sizeof(RGBA_Pipe)); + if (!p) return NULL; + pipe = evas_object_list_append(pipe, p); + } + p = (RGBA_Pipe *)((Evas_Object_List *)pipe)->last; + if (p->op_num == PIPE_LEN) + { + p = calloc(1, sizeof(RGBA_Pipe)); + if (!p) return NULL; + pipe = evas_object_list_append(pipe, p); + } + p->op_num++; + *op = &(p->op[p->op_num - 1]); + if (first_pipe) + { + /* FIXME: PTHREAD init any thread locks etc */ + } + return pipe; +} + +static void +evas_common_pipe_draw_context_copy(RGBA_Draw_Context *dc, RGBA_Pipe_Op *op) +{ + memcpy(&(op->context), dc, sizeof(RGBA_Draw_Context)); + if (op->context.cutout.active > 0) + { + op->context.cutout.rects = malloc(sizeof(Cutout_Rect) * op->context.cutout.active); + memcpy(op->context.cutout.rects, dc->cutout.rects, sizeof(Cutout_Rect) * op->context.cutout.active); + } + else + op->context.cutout.rects = NULL; +} + +static void +evas_common_pipe_op_free(RGBA_Pipe_Op *op) +{ + evas_common_draw_context_apply_clean_cutouts(&op->context.cutout); +} + +/* main api calls */ +#ifdef BUILD_PTHREAD +typedef struct _Thinfo +{ + int thread_num; + pthread_t thread_id; + pthread_barrier_t *barrier; + RGBA_Pipe_Thread_Info *info; +} Thinfo; + +static void * +evas_common_pipe_thread(void *data) +{ + Thinfo *thinfo; + +// printf("TH [...........\n"); + thinfo = data; + for (;;) + { + RGBA_Pipe_Thread_Info *info; + RGBA_Pipe *p; + + /* wait for start signal */ +// printf(" TH %i START...\n", thinfo->thread_num); + pthread_barrier_wait(&(thinfo->barrier[0])); + info = thinfo->info; +// if (info) +// { +// thinfo->info = NULL; +// printf(" TH %i GO\n", thinfo->thread_num); + for (p = info->im->pipe; p; p = (RGBA_Pipe *)((Evas_Object_List *)p)->next) + { + int i; + + for (i = 0; i < p->op_num; i++) + { + if (p->op[i].op_func) + p->op[i].op_func(info->im, &(p->op[i]), info); + } + } + free(info); +// } +// printf(" TH %i DONE\n", thinfo->thread_num); + /* send finished signal */ + pthread_barrier_wait(&(thinfo->barrier[1])); + } + return NULL; +} +#endif + +#ifdef BUILD_PTHREAD +static int thread_num = 0; +static Thinfo thinfo[TH_MAX]; +static pthread_barrier_t thbarrier[2]; +#endif + +EAPI void +evas_common_pipe_begin(RGBA_Image *im) +{ +#ifdef BUILD_PTHREAD + int i, y, h; + + if (!im->pipe) return; + if (thread_num == 1) return; + if (thread_num == 0) + { + int cpunum; + + cpunum = evas_common_cpu_count(); + thread_num = cpunum; + if (thread_num == 1) return; + pthread_barrier_init(&(thbarrier[0]), NULL, thread_num + 1); + pthread_barrier_init(&(thbarrier[1]), NULL, thread_num + 1); + for (i = 0; i < thread_num; i++) + { + pthread_attr_t attr; + cpu_set_t cpu; + + pthread_attr_init(&attr); + CPU_ZERO(&cpu); + CPU_SET(i % cpunum, &cpu); + pthread_attr_setaffinity_np(&attr, sizeof(cpu), &cpu); + thinfo[i].thread_num = i; + thinfo[i].info = NULL; + thinfo[i].barrier = thbarrier; + /* setup initial locks */ + pthread_create(&(thinfo[i].thread_id), &attr, + evas_common_pipe_thread, &(thinfo[i])); + pthread_attr_destroy(&attr); + } + } + y = 0; + h = im->cache_entry.h / thread_num; + if (h < 1) h = 1; + for (i = 0; i < thread_num; i++) + { + RGBA_Pipe_Thread_Info *info; + +// if (y >= im->cache_entry.h) break; + info = calloc(1, sizeof(RGBA_Pipe_Thread_Info)); + info->im = im; +#ifdef EVAS_SLI + info->x = 0; + info->w = im->cache_entry.w; + info->y = i; + info->h = thread_num; +#else + info->x = 0; + info->y = y; + info->w = im->cache_entry.w; + if (i == (thread_num - 1)) + info->h = im->cache_entry.h - y; + else + info->h = h; + y += info->h; +#endif + thinfo[i].info = info; + } + /* tell worker threads to start */ + pthread_barrier_wait(&(thbarrier[0])); +#endif +} + +EAPI void +evas_common_pipe_flush(RGBA_Image *im) +{ + + RGBA_Pipe *p; + int i; + + if (!im->pipe) return; +#ifdef BUILD_PTHREAD + if (thread_num > 1) + { + /* sync worker threads */ + pthread_barrier_wait(&(thbarrier[1])); + } + else +#endif + { + /* process pipe - 1 thead */ + for (p = im->pipe; p; p = (RGBA_Pipe *)((Evas_Object_List *)p)->next) + { + for (i = 0; i < p->op_num; i++) + { + if (p->op[i].op_func) + p->op[i].op_func(im, &(p->op[i]), NULL); + } + } + } + evas_common_cpu_end_opt(); + evas_common_pipe_free(im); +} + +EAPI void +evas_common_pipe_free(RGBA_Image *im) +{ + + RGBA_Pipe *p; + int i; + + if (!im->pipe) return; + /* FIXME: PTHREAD join all threads here (if not finished) */ + + /* free pipe */ + while (im->pipe) + { + p = im->pipe; + for (i = 0; i < p->op_num; i++) + { + if (p->op[i].free_func) + p->op[i].free_func(&(p->op[i])); + } + im->pipe = evas_object_list_remove(im->pipe, p); + free(p); + } +} + + + +/* draw ops */ +/**************** RECT ******************/ +static void +evas_common_pipe_rectangle_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info) +{ + if (info) + { + RGBA_Draw_Context context; + + memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context)); +#ifdef EVAS_SLI + evas_common_draw_context_set_sli(&(context), info->y, info->h); +#else + evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h); +#endif + evas_common_rectangle_draw(dst, &(context), + op->op.rect.x, op->op.rect.y, + op->op.rect.w, op->op.rect.h); + } + else + evas_common_rectangle_draw(dst, &(op->context), + op->op.rect.x, op->op.rect.y, + op->op.rect.w, op->op.rect.h); +} + +EAPI void +evas_common_pipe_rectangle_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, + int x, int y, int w, int h) +{ + RGBA_Pipe_Op *op; + + if ((w < 1) || (h < 1)) return; + dst->pipe = evas_common_pipe_add(dst->pipe, &op); + if (!dst->pipe) return; + op->op.rect.x = x; + op->op.rect.y = y; + op->op.rect.w = w; + op->op.rect.h = h; + op->op_func = evas_common_pipe_rectangle_draw_do; + op->free_func = evas_common_pipe_op_free; + evas_common_pipe_draw_context_copy(dc, op); +} + +/**************** LINE ******************/ +static void +evas_common_pipe_line_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info) +{ + if (info) + { + RGBA_Draw_Context context; + + memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context)); +#ifdef EVAS_SLI + evas_common_draw_context_set_sli(&(context), info->y, info->h); +#else + evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h); +#endif + evas_common_line_draw(dst, &(context), + op->op.line.x0, op->op.line.y0, + op->op.line.x1, op->op.line.y1); + } + else + evas_common_line_draw(dst, &(op->context), + op->op.line.x0, op->op.line.y0, + op->op.line.x1, op->op.line.y1); +} + +EAPI void +evas_common_pipe_line_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, + int x0, int y0, int x1, int y1) +{ + RGBA_Pipe_Op *op; + + dst->pipe = evas_common_pipe_add(dst->pipe, &op); + if (!dst->pipe) return; + op->op.line.x0 = x0; + op->op.line.y0 = y0; + op->op.line.x1 = x1; + op->op.line.y1 = y1; + op->op_func = evas_common_pipe_line_draw_do; + op->free_func = evas_common_pipe_op_free; + evas_common_pipe_draw_context_copy(dc, op); +} + +/**************** POLY ******************/ +static void +evas_common_pipe_op_poly_free(RGBA_Pipe_Op *op) +{ + RGBA_Polygon_Point *p; + + while (op->op.poly.points) + { + p = op->op.poly.points; + op->op.poly.points = evas_object_list_remove(op->op.poly.points, p); + free(p); + } + evas_common_pipe_op_free(op); +} + +static void +evas_common_pipe_poly_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info) +{ + if (info) + { + RGBA_Draw_Context context; + + memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context)); +#ifdef EVAS_SLI + evas_common_draw_context_set_sli(&(context), info->y, info->h); +#else + evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h); +#endif + evas_common_polygon_draw(dst, &(context), + op->op.poly.points); + } + else + evas_common_polygon_draw(dst, &(op->context), + op->op.poly.points); +} + +EAPI void +evas_common_pipe_poly_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, + RGBA_Polygon_Point *points) +{ + RGBA_Pipe_Op *op; + RGBA_Polygon_Point *pts = NULL, *p, *pp; + + if (!points) return; + dst->pipe = evas_common_pipe_add(dst->pipe, &op); + if (!dst->pipe) return; + /* FIXME: copy points - maybe we should refcount? */ + for (p = points; p; p = (RGBA_Polygon_Point *)((Evas_Object_List *)p)->next) + { + pp = calloc(1, sizeof(RGBA_Polygon_Point)); + if (pp) + { + pp->x = p->x; + pp->y = p->y; + pts = evas_object_list_append(pts, pp); + } + } + op->op.poly.points = pts; + op->op_func = evas_common_pipe_poly_draw_do; + op->free_func = evas_common_pipe_op_poly_free; + evas_common_pipe_draw_context_copy(dc, op); +} + +/**************** GRAD ******************/ +static void +evas_common_pipe_op_grad_free(RGBA_Pipe_Op *op) +{ + evas_common_gradient_free(op->op.grad.grad); + evas_common_pipe_op_free(op); +} + +static void +evas_common_pipe_grad_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info) +{ + if (info) + { + RGBA_Draw_Context context; + + memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context)); +#ifdef EVAS_SLI + evas_common_draw_context_set_sli(&(context), info->y, info->h); +#else + evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h); +#endif + evas_common_gradient_draw(dst, &(context), + op->op.grad.x, op->op.grad.y, + op->op.grad.w, op->op.grad.h, + op->op.grad.grad); + } + else + evas_common_gradient_draw(dst, &(op->context), + op->op.grad.x, op->op.grad.y, + op->op.grad.w, op->op.grad.h, + op->op.grad.grad); +} + +EAPI void +evas_common_pipe_grad_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, + int x, int y, int w, int h, RGBA_Gradient *gr) +{ + RGBA_Pipe_Op *op; + + if (!gr) return; + dst->pipe = evas_common_pipe_add(dst->pipe, &op); + if (!dst->pipe) return; + op->op.grad.x = x; + op->op.grad.y = y; + op->op.grad.w = w; + op->op.grad.h = h; + gr->references++; + op->op.grad.grad = gr; + op->op_func = evas_common_pipe_grad_draw_do; + op->free_func = evas_common_pipe_op_grad_free; + evas_common_pipe_draw_context_copy(dc, op); +} + +/**************** TEXT ******************/ +static void +evas_common_pipe_op_text_free(RGBA_Pipe_Op *op) +{ + evas_common_font_free(op->op.text.font); + free(op->op.text.text); + evas_common_pipe_op_free(op); +} + +static void +evas_common_pipe_text_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info) +{ + if (info) + { + RGBA_Draw_Context context; + + memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context)); +#ifdef EVAS_SLI + evas_common_draw_context_set_sli(&(context), info->y, info->h); +#else + evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h); +#endif + evas_common_font_draw(dst, &(context), + op->op.text.font, op->op.text.x, op->op.text.y, + op->op.text.text); + } + else + evas_common_font_draw(dst, &(op->context), + op->op.text.font, op->op.text.x, op->op.text.y, + op->op.text.text); +} + +EAPI void +evas_common_pipe_text_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, + RGBA_Font *fn, int x, int y, const char *text) +{ + RGBA_Pipe_Op *op; + + if ((!fn) || (!text)) return; + dst->pipe = evas_common_pipe_add(dst->pipe, &op); + if (!dst->pipe) return; + op->op.text.x = x; + op->op.text.y = y; + op->op.text.text = strdup(text); + fn->references++; + op->op.text.font = fn; + op->op_func = evas_common_pipe_text_draw_do; + op->free_func = evas_common_pipe_op_text_free; + evas_common_pipe_draw_context_copy(dc, op); +} + +/**************** IMAGE *****************/ +static void +evas_common_pipe_op_image_free(RGBA_Pipe_Op *op) +{ + op->op.image.src->ref--; + if (op->op.image.src->ref == 0) + evas_cache_image_drop(&op->op.image.src->cache_entry); + evas_common_pipe_op_free(op); +} + +static void +evas_common_pipe_image_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info) +{ + if (info) + { + RGBA_Draw_Context context; + + memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context)); +#ifdef EVAS_SLI + evas_common_draw_context_set_sli(&(context), info->y, info->h); +#else + evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h); +#endif + if (op->op.image.smooth) + evas_common_scale_rgba_in_to_out_clip_smooth(op->op.image.src, + dst, &(context), + op->op.image.sx, + op->op.image.sy, + op->op.image.sw, + op->op.image.sh, + op->op.image.dx, + op->op.image.dy, + op->op.image.dw, + op->op.image.dh); + else + evas_common_scale_rgba_in_to_out_clip_sample(op->op.image.src, + dst, &(context), + op->op.image.sx, + op->op.image.sy, + op->op.image.sw, + op->op.image.sh, + op->op.image.dx, + op->op.image.dy, + op->op.image.dw, + op->op.image.dh); + } + else + { + if (op->op.image.smooth) + evas_common_scale_rgba_in_to_out_clip_smooth(op->op.image.src, + dst, &(op->context), + op->op.image.sx, + op->op.image.sy, + op->op.image.sw, + op->op.image.sh, + op->op.image.dx, + op->op.image.dy, + op->op.image.dw, + op->op.image.dh); + else + evas_common_scale_rgba_in_to_out_clip_sample(op->op.image.src, + dst, &(op->context), + op->op.image.sx, + op->op.image.sy, + op->op.image.sw, + op->op.image.sh, + op->op.image.dx, + op->op.image.dy, + op->op.image.dw, + op->op.image.dh); + } +} + +EAPI void +evas_common_pipe_image_draw(RGBA_Image *src, RGBA_Image *dst, + RGBA_Draw_Context *dc, int smooth, + int src_region_x, int src_region_y, + int src_region_w, int src_region_h, + int dst_region_x, int dst_region_y, + int dst_region_w, int dst_region_h) +{ + RGBA_Pipe_Op *op; + + if (!src) return; +// evas_common_pipe_flush(src); + dst->pipe = evas_common_pipe_add(dst->pipe, &op); + if (!dst->pipe) return; + op->op.image.smooth = smooth; + op->op.image.sx = src_region_x; + op->op.image.sy = src_region_y; + op->op.image.sw = src_region_w; + op->op.image.sh = src_region_h; + op->op.image.dx = dst_region_x; + op->op.image.dy = dst_region_y; + op->op.image.dw = dst_region_w; + op->op.image.dh = dst_region_h; + src->ref++; + op->op.image.src = src; + op->op_func = evas_common_pipe_image_draw_do; + op->free_func = evas_common_pipe_op_image_free; + evas_common_pipe_draw_context_copy(dc, op); +} diff --git a/src/lib/engines/common/evas_pipe.h b/src/lib/engines/common/evas_pipe.h new file mode 100644 index 0000000..fec0d2b --- /dev/null +++ b/src/lib/engines/common/evas_pipe.h @@ -0,0 +1,20 @@ +#ifndef _EVAS_PIPE_H +#define _EVAS_PIPE_H + + +/* image rendering pipelines... new optional system - non-immediate and + * threadable + */ + +EAPI void evas_common_pipe_begin(RGBA_Image *im); +EAPI void evas_common_pipe_flush(RGBA_Image *im); +EAPI void evas_common_pipe_free(RGBA_Image *im); +EAPI void evas_common_pipe_rectangle_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h); +EAPI void evas_common_pipe_line_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1); +EAPI void evas_common_pipe_poly_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points); +EAPI void evas_common_pipe_grad_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h, RGBA_Gradient *gr); +EAPI void evas_common_pipe_text_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int x, int y, const char *text); +EAPI void evas_common_pipe_image_draw(RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int smooth, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h); + + +#endif /* _EVAS_PIPE_H */ diff --git a/src/lib/engines/common/evas_polygon.h b/src/lib/engines/common/evas_polygon.h new file mode 100644 index 0000000..d023568 --- /dev/null +++ b/src/lib/engines/common/evas_polygon.h @@ -0,0 +1,13 @@ +#ifndef _EVAS_POLYGON_H +#define _EVAS_POLYGON_H + + +EAPI void evas_common_polygon_init (void); + +EAPI RGBA_Polygon_Point *evas_common_polygon_point_add (RGBA_Polygon_Point *points, int x, int y); +EAPI RGBA_Polygon_Point *evas_common_polygon_points_clear (RGBA_Polygon_Point *points); +EAPI void evas_common_polygon_draw (RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points); + + +#endif /* _EVAS_POLYGON_H */ + diff --git a/src/lib/engines/common/evas_polygon_main.c b/src/lib/engines/common/evas_polygon_main.c new file mode 100644 index 0000000..66ddb83 --- /dev/null +++ b/src/lib/engines/common/evas_polygon_main.c @@ -0,0 +1,301 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include + +#include "evas_common.h" +#include "evas_blend_private.h" + +typedef struct _RGBA_Span RGBA_Span; +typedef struct _RGBA_Edge RGBA_Edge; +typedef struct _RGBA_Vertex RGBA_Vertex; + +struct _RGBA_Span +{ + Evas_Object_List _list_data; + int x, y, w; +}; + +struct _RGBA_Edge +{ + double x, dx; + int i; +}; + +struct _RGBA_Vertex +{ + double x, y; + int i; +}; + +#define POLY_EDGE_DEL(_i) \ +{ \ + int _j; \ + \ + for (_j = 0; (_j < num_active_edges) && (edges[_j].i != _i); _j++); \ + if (_j < num_active_edges) \ + { \ + num_active_edges--; \ + memmove(&(edges[_j]), &(edges[_j + 1]), \ + (num_active_edges - _j) * sizeof(RGBA_Edge)); \ + } \ +} + +#define POLY_EDGE_ADD(_i, _y) \ +{ \ + int _j; \ + float _dx; \ + RGBA_Vertex *_p, *_q; \ + if (_i < (n - 1)) _j = _i + 1; \ + else _j = 0; \ + if (point[_i].y < point[_j].y) \ + { \ + _p = &(point[_i]); \ + _q = &(point[_j]); \ + } \ + else \ + { \ + _p = &(point[_j]); \ + _q = &(point[_i]); \ + } \ + edges[num_active_edges].dx = _dx = (_q->x - _p->x) / (_q->y - _p->y); \ + edges[num_active_edges].x = (_dx * ((float)_y + 0.5 - _p->y)) + _p->x; \ + edges[num_active_edges].i = _i; \ + num_active_edges++; \ +} + +EAPI void +evas_common_polygon_init(void) +{ +} + +EAPI RGBA_Polygon_Point * +evas_common_polygon_point_add(RGBA_Polygon_Point *points, int x, int y) +{ + RGBA_Polygon_Point *pt; + + pt = malloc(sizeof(RGBA_Polygon_Point)); + if (!pt) return points; + pt->x = x; + pt->y = y; + points = evas_object_list_append(points, pt); + return points; +} + +EAPI RGBA_Polygon_Point * +evas_common_polygon_points_clear(RGBA_Polygon_Point *points) +{ + if (points) + { + while (points) + { + RGBA_Polygon_Point *old_p; + + old_p = points; + points = evas_object_list_remove(points, points); + free(old_p); + } + } + return NULL; +} + +static int +polygon_point_sorter(const void *a, const void *b) +{ + RGBA_Vertex *p, *q; + + p = (RGBA_Vertex *)a; + q = (RGBA_Vertex *)b; + if (p->y <= q->y) return -1; + return 1; +} + +static int +polygon_edge_sorter(const void *a, const void *b) +{ + RGBA_Edge *p, *q; + + p = (RGBA_Edge *)a; + q = (RGBA_Edge *)b; + if (p->x <= q->x) return -1; + return 1; +} + +EAPI void +evas_common_polygon_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points) +{ + RGBA_Gfx_Func func; + RGBA_Polygon_Point *pt; + RGBA_Vertex *point; + RGBA_Edge *edges; + Evas_Object_List *spans, *l; + int num_active_edges; + int n; + int i, j, k; + int y0, y1, y; + int ext_x, ext_y, ext_w, ext_h; + int *sorted_index; + + ext_x = 0; + ext_y = 0; + ext_w = dst->cache_entry.w; + ext_h = dst->cache_entry.h; + if (dc->clip.use) + { + if (dc->clip.x > ext_x) + { + ext_w += ext_x - dc->clip.x; + ext_x = dc->clip.x; + } + if ((ext_x + ext_w) > (dc->clip.x + dc->clip.w)) + { + ext_w = (dc->clip.x + dc->clip.w) - ext_x; + } + if (dc->clip.y > ext_y) + { + ext_h += ext_y - dc->clip.y; + ext_y = dc->clip.y; + } + if ((ext_y + ext_h) > (dc->clip.y + dc->clip.h)) + { + ext_h = (dc->clip.y + dc->clip.h) - ext_y; + } + } + if ((ext_w <= 0) || (ext_h <= 0)) return; + + evas_common_cpu_end_opt(); + + n = 0; for (l = (Evas_Object_List *)points; l; l = l->next) n++; + if (n < 3) return; + edges = malloc(sizeof(RGBA_Edge) * n); + if (!edges) return; + point = malloc(sizeof(RGBA_Vertex) * n); + if (!point) + { + free(edges); + return; + } + sorted_index = malloc(sizeof(int) * n); + if (!sorted_index) + { + free(edges); + free(point); + return; + } + + k = 0; + for (l = (Evas_Object_List *)points; l; l = l->next) + { + pt = (RGBA_Polygon_Point *)l; + point[k].x = pt->x; + point[k].y = pt->y; + point[k].i = k; + k++; + } + qsort(point, n, sizeof(RGBA_Vertex), polygon_point_sorter); + for (k = 0; k < n; k++) sorted_index[k] = point[k].i; + k = 0; + for (l = (Evas_Object_List *)points; l; l = l->next) + { + pt = (RGBA_Polygon_Point *)l; + point[k].x = pt->x; + point[k].y = pt->y; + point[k].i = k; + k++; + } + + y0 = MAX(ext_y, ceil(point[sorted_index[0]].y - 0.5)); + y1 = MIN(ext_y + ext_h - 1, floor(point[sorted_index[n - 1]].y - 0.5)); + + k = 0; + num_active_edges = 0; + spans = NULL; + + for (y = y0; y <= y1; y++) + { + for (; (k < n) && (point[sorted_index[k]].y <= ((double)y + 0.5)); k++) + { + i = sorted_index[k]; + + if (i > 0) j = i - 1; + else j = n - 1; + if (point[j].y <= ((double)y - 0.5)) + { + POLY_EDGE_DEL(j) + } + else if (point[j].y > ((double)y + 0.5)) + { + POLY_EDGE_ADD(j, y) + } + if (i < (n - 1)) j = i + 1; + else j = 0; + if (point[j].y <= ((double)y - 0.5)) + { + POLY_EDGE_DEL(i) + } + else if (point[j].y > ((double)y + 0.5)) + { + POLY_EDGE_ADD(i, y) + } + } + + qsort(edges, num_active_edges, sizeof(RGBA_Edge), polygon_edge_sorter); + + for (j = 0; j < num_active_edges; j += 2) + { + int x0, x1; + + x0 = ceil(edges[j].x - 0.5); + if (j < (num_active_edges - 1)) + x1 = floor(edges[j + 1].x - 0.5); + else + x1 = x0; + if ((x1 >= ext_x) && (x0 < (ext_x + ext_w)) && (x0 <= x1)) + { + RGBA_Span *span; + + if (x0 < ext_x) x0 = ext_x; + if (x1 >= (ext_x + ext_w)) x1 = ext_x + ext_w - 1; + span = malloc(sizeof(RGBA_Span)); + spans = evas_object_list_append(spans, span); + span->y = y; + span->x = x0; + span->w = (x1 - x0) + 1; + } + edges[j].x += edges[j].dx; + edges[j + 1].x += edges[j + 1].dx; + } + } + + free(edges); + free(point); + free(sorted_index); + + func = evas_common_gfx_func_composite_color_span_get(dc->col.col, dst, 1, dc->render_op); + if (spans) + { + for (l = spans; l; l = l->next) + { + RGBA_Span *span; + DATA32 *ptr; + + span = (RGBA_Span *)l; +#ifdef EVAS_SLI + if (((span->y) % dc->sli.h) == dc->sli.y) +#endif + { + ptr = dst->image.data + (span->y * (dst->cache_entry.w)) + span->x; + func(NULL, NULL, dc->col.col, ptr, span->w); + } + } + while (spans) + { + RGBA_Span *span; + + span = (RGBA_Span *)spans; + spans = evas_object_list_remove(spans, spans); + free(span); + } + } +} diff --git a/src/lib/engines/common/evas_rectangle.h b/src/lib/engines/common/evas_rectangle.h new file mode 100644 index 0000000..a653b04 --- /dev/null +++ b/src/lib/engines/common/evas_rectangle.h @@ -0,0 +1,11 @@ +#ifndef _EVAS_RECTANGLE_H +#define _EVAS_RECTANGLE_H + + +EAPI void evas_common_rectangle_init (void); + +EAPI void evas_common_rectangle_draw (RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h); + + +#endif /* _EVAS_RECTANGLE_H */ + diff --git a/src/lib/engines/common/evas_rectangle_main.c b/src/lib/engines/common/evas_rectangle_main.c new file mode 100644 index 0000000..c457848 --- /dev/null +++ b/src/lib/engines/common/evas_rectangle_main.c @@ -0,0 +1,77 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_blend_private.h" + +static void rectangle_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h); + +EAPI void +evas_common_rectangle_init(void) +{ +} + +EAPI void +evas_common_rectangle_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h) +{ + Cutout_Rects *rects; + Cutout_Rect *r; + int c, cx, cy, cw, ch; + int i; + /* handle cutouts here! */ + + if ((w <= 0) || (h <= 0)) return; + if (!(RECTS_INTERSECT(x, y, w, h, 0, 0, dst->cache_entry.w, dst->cache_entry.h))) + return; + /* save out clip info */ + c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h; + evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h); + /* no cutouts - cut right to the chase */ + if (!dc->cutout.rects) + { + rectangle_draw_internal(dst, dc, x, y, w, h); + } + else + { + evas_common_draw_context_clip_clip(dc, x, y, w, h); + /* our clip is 0 size.. abort */ + if ((dc->clip.w > 0) && (dc->clip.h > 0)) + { + rects = evas_common_draw_context_apply_cutouts(dc); + for (i = 0; i < rects->active; ++i) + { + r = rects->rects + i; + evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h); + rectangle_draw_internal(dst, dc, x, y, w, h); + } + evas_common_draw_context_apply_clear_cutouts(rects); + } + } + /* restore clip info */ + dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; +} + +static void +rectangle_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h) +{ + RGBA_Gfx_Func func; + int yy; + DATA32 *ptr; + + RECTS_CLIP_TO_RECT(x, y, w, h, dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h); + if ((w <= 0) || (h <= 0)) return; + + func = evas_common_gfx_func_composite_color_span_get(dc->col.col, dst, w, dc->render_op); + ptr = dst->image.data + (y * dst->cache_entry.w) + x; + for (yy = 0; yy < h; yy++) + { +#ifdef EVAS_SLI + if (((yy + y) % dc->sli.h) == dc->sli.y) +#endif + { + func(NULL, NULL, dc->col.col, ptr, w); + } + ptr += dst->cache_entry.w; + } +} diff --git a/src/lib/engines/common/evas_regionbuf.c b/src/lib/engines/common/evas_regionbuf.c new file mode 100644 index 0000000..2e5150e --- /dev/null +++ b/src/lib/engines/common/evas_regionbuf.c @@ -0,0 +1,357 @@ +#include "evas_common.h" + +#if 0 +Regionbuf * +evas_common_regionbuf_new(int w, int h) +{ + Regionbuf *rb; + + rb = calloc(1, sizeof(Regionbuf) + (h * sizeof(Regionspan))); + if (!rb) return NULL; + rb->spans = (Regionspan **)(rb + sizeof(Regionbuf)); + rb->w = w; + rb->h = h; + return rb; +} + +void +evas_common_regionbuf_free(Regionbuf *rb) +{ + evas_common_regionbuf_clear(rb); + free(rb); +} + +void +evas_common_regionbuf_clear(Regionbuf *rb) +{ + int y; + + for (y = 0; y < rb->h; y++) + { + while (rb->spans[y]) + { + Regionspan *span; + + span = rb->spans[y]; + rb->spans[y] = evas_object_list_remove(rb->spans[y], rb->spans[y]); + free(span); + } + } +} + +void +evas_common_regionbuf_span_add(Regionbuf *rb, int x1, int x2, int y) +{ + Evas_Object_List *l; + Regionspan *span, *span2, *nspan, *sp_start, *sp_stop; + + /* abort if outside */ + if ((y < 0) || + (y >= rb->h) || + (x2 < 0) || + (x1 >= rb->w)) return; + /* clip to horiz bounds */ + if (x1 < 0) x1 = 0; + if (x2 < (rb->w - 1)) x2 = rb->w - 1; + sp_start = NULL; + sp_stop = NULL; + for (l = (Evas_Object_List *)rb->spans[y]; l; l = l->next) + { + span = (Regionspan *)l; + nspan = (Regionspan *)l->next; + /* we dont know what t do with the span yet */ + if (!sp_start) + { + /* if new span starts before or on this span or just after + * with no gap */ + if (x1 <= (span->x2 + 1)) + sp_start = span; + /* if there is no next span */ + if (!nspan) + { + sp_stop = span; + break; + } + /* if new span ends before the next span starts with a gap of + * 1 pixel (or more) */ + else if (x2 < (nspan->x1 - 1)) + { + sp_stop = span; + break; + } + } + /* we already know it already starts before or in sp_start */ + else + { + /* there is no span after this one, so this has to be the stop */ + if (!nspan) + { + sp_stop = span; + break; + } + /* if new span ends before the next span starts with a gap of + * 1 pixel (or more) */ + else if (x2 < (nspan->x1 - 1)) + { + sp_stop = span; + break; + } + } + } + /* sp_start is where the new span starts in or before */ + /* sp_stop is where the new span stops in or after */ + if ((sp_start) && (sp_stop)) + { + /* same start and stop */ + if (sp_start == sp_stop) + { + if (x2 < (sp_start->x1 - 1)) + { + span2 = calloc(1, sizeof(Regionspan)); + span2->x1 = x1; + span2->x2 = x2; + rb->spans[y] = evas_object_list_prepend_relative(rb->spans[y], span2, sp_start); + return; + } + if (x1 < sp_start->x1) + sp_start->x1 = x1; + if (x2 > sp_start->x2) + sp_start->x2 = x2; + return; + } + else + { + /* remove all nodes after sp_start and before_sp_stop because + * the new */ + for (l = ((Evas_Object_List *)sp_start)->next; l != (Evas_Object_List *)sp_stop;) + { + span = (Regionspan *)l; + l = l->next; + rb->spans[y] = evas_object_list_remove(rb->spans[y], span); + free(span); + } + /* remove the end span */ + rb->spans[y] = evas_object_list_remove(rb->spans[y], sp_stop); + /* if the new span is before the start span - extend */ + if (x1 < sp_start->x1) + sp_start->x1 = x1; + /* if it goes beyond the stop span - extend stop span */ + if (x2 > sp_stop->x2) + sp_stop->x2 = x2; + /* extend start span to stop span */ + sp_start->x2 = sp_stop->x2; + /* don't need stop span anymore */ + free(sp_stop); + return; + } + } + /* no start AND stop... just append */ + span2 = calloc(1, sizeof(Regionspan)); + span2->x1 = x1; + span2->x2 = x2; + rb->spans[y] = evas_object_list_append(rb->spans[y], span2); +} + +void +evas_common_regionbuf_span_del(Regionbuf *rb, int x1, int x2, int y) +{ + /* FIXME: del span */ + Evas_Object_List *l; + Regionspan *span, *span2, *nspan, *sp_start, *sp_stop; + + /* abort if outside */ + if ((y < 0) || + (y >= rb->h) || + (x2 < 0) || + (x1 >= rb->w)) return; + /* clip to horiz bounds */ + if (x1 < 0) x1 = 0; + if (x2 < (rb->w - 1)) x2 = rb->w - 1; + sp_start = NULL; + sp_stop = NULL; + for (l = (Evas_Object_List *)rb->spans[y]; l; l = l->next) + { + span = (Regionspan *)l; + nspan = (Regionspan *)l->next; + /* we dont know what t do with the span yet */ + if (!sp_start) + { + /* if new span starts before or on this span or just after + * with no gap */ + if (x1 <= (span->x2)) + sp_start = span; + /* if there is no next span */ + if (!nspan) + { + sp_stop = span; + break; + } + /* if new span ends before the next span starts with a gap of + * 1 pixel (or more) */ + else if (x2 < nspan->x1) + { + sp_stop = span; + break; + } + } + /* we already know it already starts before or in sp_start */ + else + { + /* there is no span after this one, so this has to be the stop */ + if (!nspan) + { + sp_stop = span; + break; + } + /* if new span ends before the next span starts with a gap of + * 1 pixel (or more) */ + else if (x2 < nspan->x1) + { + sp_stop = span; + break; + } + } + } + /* sp_start is where the new span starts in or before */ + /* sp_stop is where the new span stops in or after */ + if ((sp_start) && (sp_stop)) + { + /* same start and stop */ + if (sp_start == sp_stop) + { + /* if it ends before this the span start starts... return */ + if (x2 < sp_start->x1) + return; + /* it starts on or before this span */ + else if (x1 <= sp_start->x1) + { + /* right edge is within the span */ + if (x2 < sp_start->x2) + { + sp_start->x2 = x2; + return; + } + else + { + rb->spans[y] = evas_object_list_remove(rb->spans[y], sp_start); + return; + } + } + /* it ends on or after the end of thsi span */ + else if (x2 >= sp_start->x2) + { + /* it starts after the start */ + if (x1 > sp_start->x1) + { + sp_start->x1 = x1; + return; + } + /* remove it all */ + else + { + rb->spans[y] = evas_object_list_remove(rb->spans[y], sp_start); + return; + } + return; + } + /* this breaks the span into 2 */ + else + { + span2 = calloc(1, sizeof(Regionspan)); + span2->x1 = sp_start->x1; + span2->x2 = x1 - 1; + rb->spans[y] = evas_object_list_prepend_relative(rb->spans[y], span2, sp_start); + sp_start->x1 = x2 + 1; + return; + } + } + else + { + /* remove all nodes after sp_start and before_sp_stop because + * the new */ + for (l = ((Evas_Object_List *)sp_start)->next; l != (Evas_Object_List *)sp_stop;) + { + span = (Regionspan *)l; + l = l->next; + rb->spans[y] = evas_object_list_remove(rb->spans[y], span); + free(span); + } + /* all of the start span is cut out */ + if (x1 <= sp_start->x1) + { + rb->spans[y] = evas_object_list_remove(rb->spans[y], sp_start); + free(sp_start); + } + /* chup it off at the new span start */ + else + sp_start->x2 = x1 - 1; + /* all of the end span is cut out */ + if (x2 >= sp_stop->x2) + { + rb->spans[y] = evas_object_list_remove(rb->spans[y], sp_stop); + free(sp_stop); + } + /* chop it up at the end */ + else + sp_stop->x1 = x2 + 1; + return; + } + } +} + +Tilebuf_Rect * +evas_common_regionbuf_rects_get(Regionbuf *rb) +{ + Tilebuf_Rect *rects = NULL, *r; + int y; + + /* FIXME: take spans, make rects */ + for (y = 0; y < rb->h; y++) + { + Evas_Object_List *l, *ll; + + for (l = (Evas_Object_List *)rb->spans[y]; l;) + { + Regionspan *span; + Regionspan *sp_start; + int yy; + + sp_start = (Regionspan *)l; + l = l->next; + rb->spans[y] = evas_object_list_remove(rb->spans[y], sp_start); + for (yy = y + 1; yy < rb->h; yy++) + { + int match = 0; + + for (ll = (Evas_Object_List *)rb->spans[yy]; ll;) + { + span = (Regionspan *)ll; + ll = ll->next; + if (span->x1 == sp_start->x1) + { + if ((span->x1 != sp_start->x1) || + (span->x2 != sp_start->x2)) + { + goto coallate; + } + match = 1; + rb->spans[yy] = evas_object_list_remove(rb->spans[yy], span); + free(span); + } + } + if (!match) goto coallate; + } + coallate: + r = calloc(1, sizeof(Tilebuf_Rect)); + r->x = sp_start->x1; + r->y = y; + r->w = sp_start->x2 - sp_start->x1 + 1; + r->h = yy - y; + rects = evas_object_list_append(rects, r); + free(sp_start); + } + } + evas_common_regionbuf_clear(rb); + return rects; +} +#endif diff --git a/src/lib/engines/common/evas_scale_main.c b/src/lib/engines/common/evas_scale_main.c new file mode 100644 index 0000000..8f0f535 --- /dev/null +++ b/src/lib/engines/common/evas_scale_main.c @@ -0,0 +1,10 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" + +EAPI void +evas_common_scale_init(void) +{ +} diff --git a/src/lib/engines/common/evas_scale_main.h b/src/lib/engines/common/evas_scale_main.h new file mode 100644 index 0000000..5da6bdc --- /dev/null +++ b/src/lib/engines/common/evas_scale_main.h @@ -0,0 +1,16 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_SCALE_MAIN_H +#define _EVAS_SCALE_MAIN_H + + +EAPI void evas_common_scale_init (void); + +EAPI void evas_common_scale_rgba_in_to_out_clip_smooth (RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h); + +EAPI void evas_common_scale_rgba_in_to_out_clip_sample (RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h); + + +#endif /* _EVAS_SCALE_MAIN_H */ diff --git a/src/lib/engines/common/evas_scale_sample.c b/src/lib/engines/common/evas_scale_sample.c new file mode 100644 index 0000000..0d57717 --- /dev/null +++ b/src/lib/engines/common/evas_scale_sample.c @@ -0,0 +1,338 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_blend_private.h" + +void scale_rgba_in_to_out_clip_sample_internal(RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h); + +#ifndef BUILD_SCALE_SMOOTH +#ifdef BUILD_SCALE_SAMPLE +EAPI void +evas_common_scale_rgba_in_to_out_clip_smooth(RGBA_Image *src, RGBA_Image *dst, + RGBA_Draw_Context *dc, + int src_region_x, int src_region_y, + int src_region_w, int src_region_h, + int dst_region_x, int dst_region_y, + int dst_region_w, int dst_region_h) +{ + evas_common_scale_rgba_in_to_out_clip_sample(src, dst, dc, + src_region_x, src_region_y, + src_region_w, src_region_h, + dst_region_x, dst_region_y, + dst_region_w, dst_region_h); +} +#endif +#endif + +#ifdef BUILD_SCALE_SAMPLE +EAPI void +evas_common_scale_rgba_in_to_out_clip_sample(RGBA_Image *src, RGBA_Image *dst, + RGBA_Draw_Context *dc, + int src_region_x, int src_region_y, + int src_region_w, int src_region_h, + int dst_region_x, int dst_region_y, + int dst_region_w, int dst_region_h) +{ + Cutout_Rects *rects; + Cutout_Rect *r; + int c, cx, cy, cw, ch; + int i; + /* handle cutouts here! */ + + if ((dst_region_w <= 0) || (dst_region_h <= 0)) return; + if (!(RECTS_INTERSECT(dst_region_x, dst_region_y, dst_region_w, dst_region_h, 0, 0, dst->cache_entry.w, dst->cache_entry.h))) + return; + /* no cutouts - cut right to the chase */ + if (!dc->cutout.rects) + { + scale_rgba_in_to_out_clip_sample_internal(src, dst, dc, + src_region_x, src_region_y, + src_region_w, src_region_h, + dst_region_x, dst_region_y, + dst_region_w, dst_region_h); + return; + } + /* save out clip info */ + c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h; + evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h); + evas_common_draw_context_clip_clip(dc, dst_region_x, dst_region_y, dst_region_w, dst_region_h); + /* our clip is 0 size.. abort */ + if ((dc->clip.w <= 0) || (dc->clip.h <= 0)) + { + dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; + return; + } + rects = evas_common_draw_context_apply_cutouts(dc); + for (i = 0; i < rects->active; ++i) + { + r = rects->rects + i; + evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h); + scale_rgba_in_to_out_clip_sample_internal(src, dst, dc, + src_region_x, src_region_y, + src_region_w, src_region_h, + dst_region_x, dst_region_y, + dst_region_w, dst_region_h); + + } + evas_common_draw_context_apply_clear_cutouts(rects); + /* restore clip info */ + dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; +} + +void +scale_rgba_in_to_out_clip_sample_internal(RGBA_Image *src, RGBA_Image *dst, + RGBA_Draw_Context *dc, + int src_region_x, int src_region_y, + int src_region_w, int src_region_h, + int dst_region_x, int dst_region_y, + int dst_region_w, int dst_region_h) +{ + int x, y; + int *lin_ptr; + DATA32 *buf, *dptr; + DATA32 **row_ptr; + DATA32 *ptr, *dst_ptr, *src_data, *dst_data; + int dst_jump; + int dst_clip_x, dst_clip_y, dst_clip_w, dst_clip_h; + int src_w, src_h, dst_w, dst_h; + RGBA_Gfx_Func func; + + if (!(RECTS_INTERSECT(dst_region_x, dst_region_y, dst_region_w, dst_region_h, 0, 0, dst->cache_entry.w, dst->cache_entry.h))) + return; + if (!(RECTS_INTERSECT(src_region_x, src_region_y, src_region_w, src_region_h, 0, 0, src->cache_entry.w, src->cache_entry.h))) + return; + + src_w = src->cache_entry.w; + src_h = src->cache_entry.h; + dst_w = dst->cache_entry.w; + dst_h = dst->cache_entry.h; + + src_data = src->image.data; + dst_data = dst->image.data; + + if (dc->clip.use) + { + dst_clip_x = dc->clip.x; + dst_clip_y = dc->clip.y; + dst_clip_w = dc->clip.w; + dst_clip_h = dc->clip.h; + if (dst_clip_x < 0) + { + dst_clip_w += dst_clip_x; + dst_clip_x = 0; + } + if (dst_clip_y < 0) + { + dst_clip_h += dst_clip_y; + dst_clip_y = 0; + } + if ((dst_clip_x + dst_clip_w) > dst_w) + dst_clip_w = dst_w - dst_clip_x; + if ((dst_clip_y + dst_clip_h) > dst_h) + dst_clip_h = dst_h - dst_clip_y; + } + else + { + dst_clip_x = 0; + dst_clip_y = 0; + dst_clip_w = dst_w; + dst_clip_h = dst_h; + } + + if (dst_clip_x < dst_region_x) + { + dst_clip_w += dst_clip_x - dst_region_x; + dst_clip_x = dst_region_x; + } + if ((dst_clip_x + dst_clip_w) > (dst_region_x + dst_region_w)) + dst_clip_w = dst_region_x + dst_region_w - dst_clip_x; + if (dst_clip_y < dst_region_y) + { + dst_clip_h += dst_clip_y - dst_region_y; + dst_clip_y = dst_region_y; + } + if ((dst_clip_y + dst_clip_h) > (dst_region_y + dst_region_h)) + dst_clip_h = dst_region_y + dst_region_h - dst_clip_y; + + if ((src_region_w <= 0) || (src_region_h <= 0) || + (dst_region_w <= 0) || (dst_region_h <= 0) || + (dst_clip_w <= 0) || (dst_clip_h <= 0)) + return; + + /* sanitise x */ + if (src_region_x < 0) + { + dst_region_x -= (src_region_x * dst_region_w) / src_region_w; + dst_region_w += (src_region_x * dst_region_w) / src_region_w; + src_region_w += src_region_x; + src_region_x = 0; + } + if (src_region_x >= src_w) return; + if ((src_region_x + src_region_w) > src_w) + { + dst_region_w = (dst_region_w * (src_w - src_region_x)) / (src_region_w); + src_region_w = src_w - src_region_x; + } + if (dst_region_w <= 0) return; + if (src_region_w <= 0) return; + if (dst_clip_x < 0) + { + dst_clip_w += dst_clip_x; + dst_clip_x = 0; + } + if (dst_clip_w <= 0) return; + if (dst_clip_x >= dst_w) return; + if (dst_clip_x < dst_region_x) + { + dst_clip_w += (dst_clip_x - dst_region_x); + dst_clip_x = dst_region_x; + } + if ((dst_clip_x + dst_clip_w) > dst_w) + { + dst_clip_w = dst_w - dst_clip_x; + } + if (dst_clip_w <= 0) return; + + /* sanitise y */ + if (src_region_y < 0) + { + dst_region_y -= (src_region_y * dst_region_h) / src_region_h; + dst_region_h += (src_region_y * dst_region_h) / src_region_h; + src_region_h += src_region_y; + src_region_y = 0; + } + if (src_region_y >= src_h) return; + if ((src_region_y + src_region_h) > src_h) + { + dst_region_h = (dst_region_h * (src_h - src_region_y)) / (src_region_h); + src_region_h = src_h - src_region_y; + } + if (dst_region_h <= 0) return; + if (src_region_h <= 0) return; + if (dst_clip_y < 0) + { + dst_clip_h += dst_clip_y; + dst_clip_y = 0; + } + if (dst_clip_h <= 0) return; + if (dst_clip_y >= dst_h) return; + if (dst_clip_y < dst_region_y) + { + dst_clip_h += (dst_clip_y - dst_region_y); + dst_clip_y = dst_region_y; + } + if ((dst_clip_y + dst_clip_h) > dst_h) + { + dst_clip_h = dst_h - dst_clip_y; + } + if (dst_clip_h <= 0) return; + + /* allocate scale lookup tables */ + lin_ptr = alloca(dst_clip_w * sizeof(int)); + row_ptr = alloca(dst_clip_h * sizeof(DATA32 *)); + + /* figure out dst jump */ + dst_jump = dst_w - dst_clip_w; + + /* figure out dest start ptr */ + dst_ptr = dst_data + dst_clip_x + (dst_clip_y * dst_w); + + if (dc->mul.use) + func = evas_common_gfx_func_composite_pixel_color_span_get(src, dc->mul.col, dst, dst_clip_w, dc->render_op); + else + func = evas_common_gfx_func_composite_pixel_span_get(src, dst, dst_clip_w, dc->render_op); + + if ((dst_region_w == src_region_w) && (dst_region_h == src_region_h)) + { + ptr = src_data + ((dst_clip_y - dst_region_y + src_region_y) * src_w) + (dst_clip_x - dst_region_x) + src_region_x; + for (y = 0; y < dst_clip_h; y++) + { + /* * blend here [clip_w *] ptr -> dst_ptr * */ +#ifdef EVAS_SLI + if (((y + dst_clip_y) % dc->sli.h) == dc->sli.y) +#endif + { + func(ptr, NULL, dc->mul.col, dst_ptr, dst_clip_w); + } + ptr += src_w; + dst_ptr += dst_w; + } + } + else + { + /* fill scale tables */ + for (x = 0; x < dst_clip_w; x++) + lin_ptr[x] = (((x + dst_clip_x - dst_region_x) * src_region_w) / dst_region_w) + src_region_x; + for (y = 0; y < dst_clip_h; y++) + row_ptr[y] = src_data + (((((y + dst_clip_y - dst_region_y) * src_region_h) / dst_region_h) + + src_region_y) * src_w); + /* scale to dst */ + dptr = dst_ptr; +#ifdef DIRECT_SCALE + if ((!src->cache_entry.flags.alpha) && + (!dst->cache_entry.flags.alpha) && + (!dc->mul.use)) + { + for (y = 0; y < dst_clip_h; y++) + { +#ifdef EVAS_SLI + if (((y + dst_clip_y) % dc->sli.h) == dc->sli.y) +#endif + { + dst_ptr = dptr; + for (x = 0; x < dst_clip_w; x++) + { + ptr = row_ptr[y] + lin_ptr[x]; + *dst_ptr = *ptr; + dst_ptr++; + } + } + dptr += dst_w; + } + } + else +#endif + { + /* a scanline buffer */ + buf = alloca(dst_clip_w * sizeof(DATA32)); + for (y = 0; y < dst_clip_h; y++) + { +#ifdef EVAS_SLI + if (((y + dst_clip_y) % dc->sli.h) == dc->sli.y) +#endif + { + dst_ptr = buf; + for (x = 0; x < dst_clip_w; x++) + { + ptr = row_ptr[y] + lin_ptr[x]; + *dst_ptr = *ptr; + dst_ptr++; + } + /* * blend here [clip_w *] buf -> dptr * */ + func(buf, NULL, dc->mul.col, dptr, dst_clip_w); + } + dptr += dst_w; + } + } + } +} +#else +#ifdef BUILD_SCALE_SMOOTH +EAPI void +evas_common_scale_rgba_in_to_out_clip_sample(RGBA_Image *src, RGBA_Image *dst, + RGBA_Draw_Context *dc, + int src_region_x, int src_region_y, + int src_region_w, int src_region_h, + int dst_region_x, int dst_region_y, + int dst_region_w, int dst_region_h) +{ + evas_common_scale_rgba_in_to_out_clip_smooth(src, dst, dc, + src_region_x, src_region_y, + src_region_w, src_region_h, + dst_region_x, dst_region_y, + dst_region_w, dst_region_h); +} +#endif +#endif diff --git a/src/lib/engines/common/evas_scale_smooth.c b/src/lib/engines/common/evas_scale_smooth.c new file mode 100644 index 0000000..dcdcff6 --- /dev/null +++ b/src/lib/engines/common/evas_scale_smooth.c @@ -0,0 +1,525 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_scale_smooth.h" +#include "evas_blend_private.h" + + +static DATA32 **scale_calc_y_points(DATA32 *src, int sw, int sh, int dh); +static int *scale_calc_x_points(int sw, int dw); +static int *scale_calc_a_points(int s, int d); + +static DATA32 ** +scale_calc_y_points(DATA32 *src, int sw, int sh, int dh) +{ + DATA32 **p; + int i, val, inc; + + p = malloc((dh + 1) * sizeof(DATA32 *)); + if (!p) return NULL; + val = 0; + inc = (sh << 16) / dh; + for (i = 0; i < dh; i++) + { + p[i] = src + ((val >> 16) * sw); + val += inc; + } + p[i] = p[i - 1]; + return p; +} + +static int * +scale_calc_x_points(int sw, int dw) +{ + int *p; + int i, val, inc; + + p = malloc((dw + 1) * sizeof(int)); + if (!p) return NULL; + val = 0; + inc = (sw << 16) / dw; + for (i = 0; i < dw; i++) + { + p[i] = val >> 16; + val += inc; + } + p[i] = p[i - 1]; + return p; +} + +static int * +scale_calc_a_points(int s, int d) +{ + int *p; + int i, val, inc; + + p = malloc(d * sizeof(int)); + if (!p) return NULL; + if (d >= s) + { + val = 0; + inc = (s << 16) / d; + for (i = 0; i < d; i++) + { + p[i] = (val >> 8) - ((val >> 8) & 0xffffff00); + if ((val >> 16) >= (s - 1)) p[i] = 0; + val += inc; + } + } + else + { + int ap, Cp; + + val = 0; + inc = (s << 16) / d; + Cp = ((d << 14) / s) + 1; + for (i = 0; i < d; i++) + { + ap = ((0x100 - ((val >> 8) & 0xff)) * Cp) >> 8; + p[i] = ap | (Cp << 16); + val += inc; + } + } +// sleep(1); + return p; +} + +#ifdef BUILD_SCALE_SMOOTH +#ifdef BUILD_C +EAPI void +evas_common_scale_rgba_mipmap_down_2x2_c(DATA32 *src, DATA32 *dst, int src_w, int src_h) +{ + int x, y, dst_w, dst_h; + DATA32 *src_ptr, *src_ptr2, *dst_ptr; + + dst_w = src_w >> 1; + dst_h = src_h >> 1; + + if (dst_w < 1) dst_w = 1; + if (dst_h < 1) dst_h = 1; + + src_ptr = src; + src_ptr2 = src + src_w; + dst_ptr = dst; + for (y = 0; y < dst_h; y++) + { + src_ptr = src + (y * src_w * 2); + src_ptr2 = src_ptr + src_w; + for (x = 0; x < dst_w; x++) + { + R_VAL(dst_ptr) = (R_VAL(src_ptr) + R_VAL(src_ptr + 1) + R_VAL(src_ptr2) + R_VAL(src_ptr2 + 1)) >> 2; + G_VAL(dst_ptr) = (G_VAL(src_ptr) + G_VAL(src_ptr + 1) + G_VAL(src_ptr2) + G_VAL(src_ptr2 + 1)) >> 2; + B_VAL(dst_ptr) = (B_VAL(src_ptr) + B_VAL(src_ptr + 1) + B_VAL(src_ptr2) + B_VAL(src_ptr2 + 1)) >> 2; + A_VAL(dst_ptr) = (A_VAL(src_ptr) + A_VAL(src_ptr + 1) + A_VAL(src_ptr2) + A_VAL(src_ptr2 + 1)) >> 2; + + src_ptr+=2; + src_ptr2+=2; + dst_ptr++; + } + } +} +#endif +#endif + +#ifdef BUILD_SCALE_SMOOTH +#ifdef BUILD_C +EAPI void +evas_common_scale_rgba_mipmap_down_2x1_c(DATA32 *src, DATA32 *dst, int src_w, int src_h) +{ + int x, y, dst_w, dst_h; + DATA32 *src_ptr, *dst_ptr; + + dst_w = src_w >> 1; + dst_h = src_h >> 1; + + if (dst_w < 1) dst_w = 1; + if (dst_h < 1) dst_h = 1; + + src_ptr = src; + dst_ptr = dst; + for (y = 0; y < dst_h; y++) + { + src_ptr = src + (y * src_w * 2); + for (x = 0; x < dst_w; x++) + { + R_VAL(dst_ptr) = (R_VAL(src_ptr) + R_VAL(src_ptr + 1)) >> 1; + G_VAL(dst_ptr) = (G_VAL(src_ptr) + G_VAL(src_ptr + 1)) >> 1; + B_VAL(dst_ptr) = (B_VAL(src_ptr) + B_VAL(src_ptr + 1)) >> 1; + A_VAL(dst_ptr) = (A_VAL(src_ptr) + A_VAL(src_ptr + 1)) >> 1; + + src_ptr+=2; + dst_ptr++; + } + } +} +#endif +#endif + +#ifdef BUILD_SCALE_SMOOTH +#ifdef BUILD_C +EAPI void +evas_common_scale_rgba_mipmap_down_1x2_c(DATA32 *src, DATA32 *dst, int src_w, int src_h) +{ + int x, y, dst_w, dst_h; + DATA32 *src_ptr, *src_ptr2, *dst_ptr; + + dst_w = src_w >> 1; + dst_h = src_h >> 1; + + if (dst_w < 1) dst_w = 1; + if (dst_h < 1) dst_h = 1; + + src_ptr = src; + src_ptr2 = src + src_w; + dst_ptr = dst; + for (y = 0; y < dst_h; y++) + { + src_ptr = src + (y * src_w * 2); + src_ptr2 = src_ptr + src_w; + for (x = 0; x < dst_w; x++) + { + R_VAL(dst_ptr) = (R_VAL(src_ptr) + R_VAL(src_ptr2)) >> 1; + G_VAL(dst_ptr) = (G_VAL(src_ptr) + G_VAL(src_ptr2)) >> 1; + B_VAL(dst_ptr) = (B_VAL(src_ptr) + B_VAL(src_ptr2)) >> 1; + A_VAL(dst_ptr) = (A_VAL(src_ptr) + A_VAL(src_ptr2)) >> 1; + + src_ptr+=2; + src_ptr2+=2; + dst_ptr++; + } + } +} +#endif +#endif + +#ifdef BUILD_SCALE_SMOOTH +#ifdef BUILD_C +EAPI void +evas_common_scale_rgb_mipmap_down_2x2_c(DATA32 *src, DATA32 *dst, int src_w, int src_h) +{ + int x, y, dst_w, dst_h; + DATA32 *src_ptr, *src_ptr2, *dst_ptr; + + dst_w = src_w >> 1; + dst_h = src_h >> 1; + + if (dst_w < 1) dst_w = 1; + if (dst_h < 1) dst_h = 1; + + src_ptr = src; + src_ptr2 = src + src_w; + dst_ptr = dst; + for (y = 0; y < dst_h; y++) + { + for (x = 0; x < dst_w; x++) + { + R_VAL(dst_ptr) = (R_VAL(src_ptr) + R_VAL(src_ptr + 1) + R_VAL(src_ptr2) + R_VAL(src_ptr2 + 1)) >> 2; + G_VAL(dst_ptr) = (G_VAL(src_ptr) + G_VAL(src_ptr + 1) + G_VAL(src_ptr2) + G_VAL(src_ptr2 + 1)) >> 2; + B_VAL(dst_ptr) = (B_VAL(src_ptr) + B_VAL(src_ptr + 1) + B_VAL(src_ptr2) + B_VAL(src_ptr2 + 1)) >> 2; + A_VAL(dst_ptr) = 0xff; + + src_ptr+=2; + src_ptr2+=2; + dst_ptr++; + } + src_ptr += src_w; + src_ptr2 += src_w; + } +} +#endif +#endif + +#ifdef BUILD_SCALE_SMOOTH +#ifdef BUILD_C +EAPI void +evas_common_scale_rgb_mipmap_down_2x1_c(DATA32 *src, DATA32 *dst, int src_w, int src_h) +{ + int x, y, dst_w, dst_h; + DATA32 *src_ptr, *dst_ptr; + + dst_w = src_w >> 1; + dst_h = src_h >> 1; + + if (dst_w < 1) dst_w = 1; + if (dst_h < 1) dst_h = 1; + + src_ptr = src; + dst_ptr = dst; + for (y = 0; y < dst_h; y++) + { + for (x = 0; x < dst_w; x++) + { + R_VAL(dst_ptr) = (R_VAL(src_ptr) + R_VAL(src_ptr + 1)) >> 1; + G_VAL(dst_ptr) = (G_VAL(src_ptr) + G_VAL(src_ptr + 1)) >> 1; + B_VAL(dst_ptr) = (B_VAL(src_ptr) + B_VAL(src_ptr + 1)) >> 1; + A_VAL(dst_ptr) = 0xff; + + src_ptr+=2; + dst_ptr++; + } + src_ptr += src_w; + } +} +#endif +#endif + +#ifdef BUILD_SCALE_SMOOTH +#ifdef BUILD_C +EAPI void +evas_common_scale_rgb_mipmap_down_1x2_c(DATA32 *src, DATA32 *dst, int src_w, int src_h) +{ + int x, y, dst_w, dst_h; + DATA32 *src_ptr, *src_ptr2, *dst_ptr; + + dst_w = src_w >> 1; + dst_h = src_h >> 1; + + if (dst_w < 1) dst_w = 1; + if (dst_h < 1) dst_h = 1; + + src_ptr = src; + src_ptr2 = src + src_w; + dst_ptr = dst; + for (y = 0; y < dst_h; y++) + { + for (x = 0; x < dst_w; x++) + { + R_VAL(dst_ptr) = (R_VAL(src_ptr) + R_VAL(src_ptr2)) >> 1; + G_VAL(dst_ptr) = (G_VAL(src_ptr) + G_VAL(src_ptr2)) >> 1; + B_VAL(dst_ptr) = (B_VAL(src_ptr) + B_VAL(src_ptr2)) >> 1; + A_VAL(dst_ptr) = 0xff; + + src_ptr+=2; + src_ptr2+=2; + dst_ptr++; + } + src_ptr += src_w; + src_ptr2 += src_w; + } +} +#endif +#endif + +#ifdef BUILD_SCALE_SMOOTH +#ifdef BUILD_MMX +EAPI void +evas_common_scale_rgba_mipmap_down_2x2_mmx(DATA32 *src, DATA32 *dst, int src_w, int src_h) +{ + int x, y, dst_w, dst_h; + DATA32 *src_ptr, *src_ptr2, *dst_ptr; + + dst_w = src_w >> 1; + dst_h = src_h >> 1; + + if (dst_w < 1) dst_w = 1; + if (dst_h < 1) dst_h = 1; + + src_ptr = src; + src_ptr2 = src + src_w; + dst_ptr = dst; + for (y = 0; y < dst_h; y++) + { + src_ptr = src + (y * src_w * 2); + src_ptr2 = src_ptr + src_w; + for (x = 0; x < dst_w; x++) + { + punpcklbw_m2r(src_ptr[0], mm0); + punpcklbw_m2r(src_ptr[1], mm1); + punpcklbw_m2r(src_ptr2[0], mm2); + punpcklbw_m2r(src_ptr2[1], mm3); + psrlw_i2r(8, mm0); + psrlw_i2r(8, mm1); + psrlw_i2r(8, mm2); + psrlw_i2r(8, mm3); + paddw_r2r(mm1, mm0); + paddw_r2r(mm2, mm0); + paddw_r2r(mm3, mm0); + psrlw_i2r(2, mm0); + packuswb_r2r(mm0, mm0); + movd_r2m(mm0, dst_ptr[0]); + + src_ptr+=2; + src_ptr2+=2; + dst_ptr++; + } + } +} +#endif +#endif + +#ifdef BUILD_SCALE_SMOOTH +#ifdef BUILD_MMX +EAPI void +evas_common_scale_rgba_mipmap_down_2x1_mmx(DATA32 *src, DATA32 *dst, int src_w, int src_h) +{ + int x, y, dst_w, dst_h; + DATA32 *src_ptr, *dst_ptr; + + dst_w = src_w >> 1; + dst_h = src_h >> 1; + + if (dst_w < 1) dst_w = 1; + if (dst_h < 1) dst_h = 1; + + src_ptr = src; + dst_ptr = dst; + for (y = 0; y < dst_h; y++) + { + src_ptr = src + (y * src_w * 2); + for (x = 0; x < dst_w; x++) + { + punpcklbw_m2r(src_ptr[0], mm0); + punpcklbw_m2r(src_ptr[1], mm1); + psrlw_i2r(8, mm0); + psrlw_i2r(8, mm1); + paddw_r2r(mm1, mm0); + psrlw_i2r(1, mm0); + packuswb_r2r(mm0, mm0); + movd_r2m(mm0, dst_ptr[0]); + + src_ptr+=2; + dst_ptr++; + } + } +} +#endif +#endif + +#ifdef BUILD_SCALE_SMOOTH +#ifdef BUILD_MMX +EAPI void +evas_common_scale_rgba_mipmap_down_1x2_mmx(DATA32 *src, DATA32 *dst, int src_w, int src_h) +{ + int x, y, dst_w, dst_h; + DATA32 *src_ptr, *src_ptr2, *dst_ptr; + + dst_w = src_w >> 1; + dst_h = src_h >> 1; + + if (dst_w < 1) dst_w = 1; + if (dst_h < 1) dst_h = 1; + + src_ptr = src; + src_ptr2 = src + src_w; + dst_ptr = dst; + for (y = 0; y < dst_h; y++) + { + src_ptr = src + (y * src_w * 2); + src_ptr2 = src_ptr + src_w; + for (x = 0; x < dst_w; x++) + { + punpcklbw_m2r(src_ptr[0], mm0); + punpcklbw_m2r(src_ptr2[0], mm1); + psrlw_i2r(8, mm0); + psrlw_i2r(8, mm1); + paddw_r2r(mm1, mm0); + psrlw_i2r(1, mm0); + packuswb_r2r(mm0, mm0); + movd_r2m(mm0, dst_ptr[0]); + + src_ptr+=2; + src_ptr2+=2; + dst_ptr++; + } + } +} +#endif +#endif + +#ifdef BUILD_SCALE_SMOOTH +# ifdef BUILD_MMX +# undef SCALE_FUNC +# define SCALE_FUNC evas_common_scale_rgba_in_to_out_clip_smooth_mmx +# undef SCALE_USING_MMX +# define SCALE_USING_MMX +# include "evas_scale_smooth_scaler.c" +# endif +# ifdef BUILD_C +# undef SCALE_FUNC +# define SCALE_FUNC evas_common_scale_rgba_in_to_out_clip_smooth_c +# undef SCALE_USING_MMX +# include "evas_scale_smooth_scaler.c" +# endif +EAPI void +evas_common_scale_rgba_in_to_out_clip_smooth(RGBA_Image *src, RGBA_Image *dst, + RGBA_Draw_Context *dc, + int src_region_x, int src_region_y, + int src_region_w, int src_region_h, + int dst_region_x, int dst_region_y, + int dst_region_w, int dst_region_h) +{ +# ifdef BUILD_MMX + int mmx, sse, sse2; +# endif + Cutout_Rects *rects; + Cutout_Rect *r; + int c, cx, cy, cw, ch; + int i; + /* handle cutouts here! */ + + if ((dst_region_w <= 0) || (dst_region_h <= 0)) return; + if (!(RECTS_INTERSECT(dst_region_x, dst_region_y, dst_region_w, dst_region_h, 0, 0, dst->cache_entry.w, dst->cache_entry.h))) + return; +# ifdef BUILD_MMX + evas_common_cpu_can_do(&mmx, &sse, &sse2); +# endif + /* no cutouts - cut right to the chase */ + if (!dc->cutout.rects) + { +# ifdef BUILD_MMX + if (mmx) + evas_common_scale_rgba_in_to_out_clip_smooth_mmx(src, dst, dc, + src_region_x, src_region_y, + src_region_w, src_region_h, + dst_region_x, dst_region_y, + dst_region_w, dst_region_h); + else +# endif +# ifdef BUILD_C + evas_common_scale_rgba_in_to_out_clip_smooth_c(src, dst, dc, + src_region_x, src_region_y, + src_region_w, src_region_h, + dst_region_x, dst_region_y, + dst_region_w, dst_region_h); +# endif + return; + } + /* save out clip info */ + c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h; + evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h); + evas_common_draw_context_clip_clip(dc, dst_region_x, dst_region_y, dst_region_w, dst_region_h); + /* our clip is 0 size.. abort */ + if ((dc->clip.w <= 0) || (dc->clip.h <= 0)) + { + dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; + return; + } + rects = evas_common_draw_context_apply_cutouts(dc); + for (i = 0; i < rects->active; ++i) + { + r = rects->rects + i; + evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h); +# ifdef BUILD_MMX + if (mmx) + evas_common_scale_rgba_in_to_out_clip_smooth_mmx(src, dst, dc, + src_region_x, src_region_y, + src_region_w, src_region_h, + dst_region_x, dst_region_y, + dst_region_w, dst_region_h); + else +# endif +# ifdef BUILD_C + evas_common_scale_rgba_in_to_out_clip_smooth_c(src, dst, dc, + src_region_x, src_region_y, + src_region_w, src_region_h, + dst_region_x, dst_region_y, + dst_region_w, dst_region_h); +# endif + } + evas_common_draw_context_apply_clear_cutouts(rects); + /* restore clip info */ + dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; +} +#endif diff --git a/src/lib/engines/common/evas_scale_smooth.h b/src/lib/engines/common/evas_scale_smooth.h new file mode 100644 index 0000000..d4bfb46 --- /dev/null +++ b/src/lib/engines/common/evas_scale_smooth.h @@ -0,0 +1,23 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_SCALE_SMOOTH_H +#define _EVAS_SCALE_SMOOTH_H + +EAPI void evas_common_scale_rgba_mipmap_down_2x2_c (DATA32 *src, DATA32 *dst, int src_w, int src_h); +EAPI void evas_common_scale_rgba_mipmap_down_2x1_c (DATA32 *src, DATA32 *dst, int src_w, int src_h); +EAPI void evas_common_scale_rgba_mipmap_down_1x2_c (DATA32 *src, DATA32 *dst, int src_w, int src_h); +EAPI void evas_common_scale_rgb_mipmap_down_2x2_c (DATA32 *src, DATA32 *dst, int src_w, int src_h); +EAPI void evas_common_scale_rgb_mipmap_down_2x1_c (DATA32 *src, DATA32 *dst, int src_w, int src_h); +EAPI void evas_common_scale_rgb_mipmap_down_1x2_c (DATA32 *src, DATA32 *dst, int src_w, int src_h); + +EAPI void evas_common_scale_rgba_mipmap_down_2x2_mmx (DATA32 *src, DATA32 *dst, int src_w, int src_h); +EAPI void evas_common_scale_rgba_mipmap_down_2x1_mmx (DATA32 *src, DATA32 *dst, int src_w, int src_h); +EAPI void evas_common_scale_rgba_mipmap_down_1x2_mmx (DATA32 *src, DATA32 *dst, int src_w, int src_h); + +EAPI void evas_common_scale_rgba_in_to_out_clip_smooth_mmx (RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h); +EAPI void evas_common_scale_rgba_in_to_out_clip_smooth_c (RGBA_Image *src, RGBA_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h); + + +#endif /* _EVAS_SCALE_SMOOTH_H */ diff --git a/src/lib/engines/common/evas_scale_smooth_scaler.c b/src/lib/engines/common/evas_scale_smooth_scaler.c new file mode 100644 index 0000000..6cf7cc6 --- /dev/null +++ b/src/lib/engines/common/evas_scale_smooth_scaler.c @@ -0,0 +1,205 @@ +void +SCALE_FUNC(RGBA_Image *src, RGBA_Image *dst, + RGBA_Draw_Context *dc, + int src_region_x, int src_region_y, + int src_region_w, int src_region_h, + int dst_region_x, int dst_region_y, + int dst_region_w, int dst_region_h) +{ + DATA32 *dst_ptr; + int dst_jump; + int dst_clip_x, dst_clip_y, dst_clip_w, dst_clip_h; + int src_w, src_h, dst_w, dst_h; + + if (!(RECTS_INTERSECT(dst_region_x, dst_region_y, dst_region_w, dst_region_h, 0, 0, dst->cache_entry.w, dst->cache_entry.h))) + return; + if (!(RECTS_INTERSECT(src_region_x, src_region_y, src_region_w, src_region_h, 0, 0, src->cache_entry.w, src->cache_entry.h))) + return; + + src_w = src->cache_entry.w; + src_h = src->cache_entry.h; + dst_w = dst->cache_entry.w; + dst_h = dst->cache_entry.h; + + if (dc->clip.use) + { + dst_clip_x = dc->clip.x; + dst_clip_y = dc->clip.y; + dst_clip_w = dc->clip.w; + dst_clip_h = dc->clip.h; + if (dst_clip_x < 0) + { + dst_clip_w += dst_clip_x; + dst_clip_x = 0; + } + if (dst_clip_y < 0) + { + dst_clip_h += dst_clip_y; + dst_clip_y = 0; + } + if ((dst_clip_w <= 0) || (dst_clip_h <= 0)) return; + if ((dst_clip_x + dst_clip_w) > dst_w) dst_clip_w = dst_w - dst_clip_x; + if ((dst_clip_y + dst_clip_h) > dst_h) dst_clip_h = dst_h - dst_clip_y; + } + else + { + dst_clip_x = 0; + dst_clip_y = 0; + dst_clip_w = dst_w; + dst_clip_h = dst_h; + } + + if (dst_clip_x < dst_region_x) + { + dst_clip_w += dst_clip_x - dst_region_x; + dst_clip_x = dst_region_x; + } + if ((dst_clip_x + dst_clip_w) > (dst_region_x + dst_region_w)) + dst_clip_w = dst_region_x + dst_region_w - dst_clip_x; + if (dst_clip_y < dst_region_y) + { + dst_clip_h += dst_clip_y - dst_region_y; + dst_clip_y = dst_region_y; + } + if ((dst_clip_y + dst_clip_h) > (dst_region_y + dst_region_h)) + dst_clip_h = dst_region_y + dst_region_h - dst_clip_y; + + if ((src_region_w <= 0) || (src_region_h <= 0) || + (dst_region_w <= 0) || (dst_region_h <= 0) || + (dst_clip_w <= 0) || (dst_clip_h <= 0)) + return; + + /* sanitise x */ + if (src_region_x < 0) + { + dst_region_x -= (src_region_x * dst_region_w) / src_region_w; + dst_region_w += (src_region_x * dst_region_w) / src_region_w; + src_region_w += src_region_x; + src_region_x = 0; + } + if (src_region_x >= src_w) return; + if ((src_region_x + src_region_w) > src_w) + { + dst_region_w = (dst_region_w * (src_w - src_region_x)) / (src_region_w); + src_region_w = src_w - src_region_x; + } + if (dst_region_w <= 0) return; + if (src_region_w <= 0) return; + if (dst_clip_x < 0) + { + dst_clip_w += dst_clip_x; + dst_clip_x = 0; + } + if (dst_clip_w <= 0) return; + if (dst_clip_x >= dst_w) return; + if (dst_clip_x < dst_region_x) + { + dst_clip_w += (dst_clip_x - dst_region_x); + dst_clip_x = dst_region_x; + } + if ((dst_clip_x + dst_clip_w) > dst_w) + { + dst_clip_w = dst_w - dst_clip_x; + } + if (dst_clip_w <= 0) return; + + /* sanitise y */ + if (src_region_y < 0) + { + dst_region_y -= (src_region_y * dst_region_h) / src_region_h; + dst_region_h += (src_region_y * dst_region_h) / src_region_h; + src_region_h += src_region_y; + src_region_y = 0; + } + if (src_region_y >= src_h) return; + if ((src_region_y + src_region_h) > src_h) + { + dst_region_h = (dst_region_h * (src_h - src_region_y)) / (src_region_h); + src_region_h = src_h - src_region_y; + } + if (dst_region_h <= 0) return; + if (src_region_h <= 0) return; + if (dst_clip_y < 0) + { + dst_clip_h += dst_clip_y; + dst_clip_y = 0; + } + if (dst_clip_h <= 0) return; + if (dst_clip_y >= dst_h) return; + if (dst_clip_y < dst_region_y) + { + dst_clip_h += (dst_clip_y - dst_region_y); + dst_clip_y = dst_region_y; + } + if ((dst_clip_y + dst_clip_h) > dst_h) + { + dst_clip_h = dst_h - dst_clip_y; + } + if (dst_clip_h <= 0) return; + + /* figure out dst jump */ + dst_jump = dst_w - dst_clip_w; + + /* figure out dest start ptr */ + dst_ptr = dst->image.data + dst_clip_x + (dst_clip_y * dst_w); + +/* FIXME: + * + * things to do later for speedups: + * + * break upscale into 3 cases (as listed below - up:up, 1:up, up:1) + * + * break downscale into more cases (as listed below) + * + * roll func (blend/copy/cultiply/cmod) code into inner loop of scaler. + * (578 fps vs 550 in mmx upscale in evas demo - this means probably + * a good 10-15% speedup over the func call, but means massively larger + * code) + * + * anything involving downscaling has no mmx equivalent code and maybe the + * C could do with a little work. + * + * --------------------------------------------------------------------------- + * + * (1 = no scaling (1:1 ratio), + = scale up, - = scale down) + * (* == fully optimised mmx, # = fully optimised C) + * + * h:v mmx C + * + * 1:1 * # + * + * +:+ * # + * 1:+ * # + * +:1 * # + * + * 1:- + * -:1 + * +:- + * -:+ + * -:- + * + */ + + /* if 1:1 scale */ + if ((dst_region_w == src_region_w) && + (dst_region_h == src_region_h)) + { +#include "evas_scale_smooth_scaler_noscale.c" + } + else + { + /* scaling up only - dont need anything except original */ +// if ((!dc->anti_alias) || ((dst_region_w >= src_region_w) && (dst_region_h >= src_region_h))) + if (((dst_region_w >= src_region_w) && (dst_region_h >= src_region_h))) + { +#include "evas_scale_smooth_scaler_up.c" + return; + } + else + /* scaling down... funkiness */ + { +#include "evas_scale_smooth_scaler_down.c" + return; + } + } +} diff --git a/src/lib/engines/common/evas_scale_smooth_scaler_down.c b/src/lib/engines/common/evas_scale_smooth_scaler_down.c new file mode 100644 index 0000000..97498b0 --- /dev/null +++ b/src/lib/engines/common/evas_scale_smooth_scaler_down.c @@ -0,0 +1,50 @@ +{ + DATA32 **ypoints; + int *xpoints; + int *xapoints, *xapp; + int *yapoints, *yapp; + DATA32 *buf, *src_data; + + RGBA_Gfx_Func func; + + src_data = src->image.data; + + xpoints = scale_calc_x_points(src_region_w, dst_region_w); + ypoints = scale_calc_y_points(src_data, src_w, src_region_h, dst_region_h); + xapoints = scale_calc_a_points(src_region_w, dst_region_w); + yapoints = scale_calc_a_points(src_region_h, dst_region_h); + if ( (!xpoints) || (!ypoints) || (!xapoints) || (!yapoints) ) + goto done_scale_down; + + /* a scanline buffer */ + buf = alloca(dst_clip_w * sizeof(DATA32)); + + if (dc->mul.use) + func = evas_common_gfx_func_composite_pixel_color_span_get(src, dc->mul.col, dst, dst_clip_w, dc->render_op); + else + func = evas_common_gfx_func_composite_pixel_span_get(src, dst, dst_clip_w, dc->render_op); + /* scaling down vertically */ + if ((dst_region_w >= src_region_w) && + (dst_region_h < src_region_h)) + { +#include "evas_scale_smooth_scaler_downy.c" + } + /* scaling down horizontally */ + else if ((dst_region_w < src_region_w) && + (dst_region_h >= src_region_h)) + { +#include "evas_scale_smooth_scaler_downx.c" + } + /* scaling down both vertically & horizontally */ + else if ((dst_region_w < src_region_w) && + (dst_region_h < src_region_h)) + { +#include "evas_scale_smooth_scaler_downx_downy.c" + } + + done_scale_down: + if (xpoints) free(xpoints); + if (ypoints) free(ypoints); + if (xapoints) free(xapoints); + if (yapoints) free(yapoints); +} diff --git a/src/lib/engines/common/evas_scale_smooth_scaler_downx.c b/src/lib/engines/common/evas_scale_smooth_scaler_downx.c new file mode 100644 index 0000000..f413b22 --- /dev/null +++ b/src/lib/engines/common/evas_scale_smooth_scaler_downx.c @@ -0,0 +1,250 @@ +{ + int Cx, j; + DATA32 *pix, *dptr, *pbuf, **yp; + int r, g, b, a, rr, gg, bb, aa; + int *xp, xap, yap, pos; + int dyy, dxx; + int w = dst_clip_w; +#ifdef EVAS_SLI + int ysli = dst_clip_y; +#endif + + dptr = dst_ptr; + pos = (src_region_y * src_w) + src_region_x; + dyy = dst_clip_y - dst_region_y; + dxx = dst_clip_x - dst_region_x; + + xp = xpoints + dxx; + yp = ypoints + dyy; + xapp = xapoints + dxx; + yapp = yapoints + dyy; + pbuf = buf; + + if (src->cache_entry.flags.alpha) + { + while (dst_clip_h--) + { +#ifdef EVAS_SLI + if (((ysli) % dc->sli.h) == dc->sli.y) +#endif + { + while (dst_clip_w--) + { + Cx = *xapp >> 16; + xap = *xapp & 0xffff; + pix = *yp + *xp + pos; + + a = (A_VAL(pix) * xap) >> 10; + r = (R_VAL(pix) * xap) >> 10; + g = (G_VAL(pix) * xap) >> 10; + b = (B_VAL(pix) * xap) >> 10; + for (j = (1 << 14) - xap; j > Cx; j -= Cx) + { + pix++; + a += (A_VAL(pix) * Cx) >> 10; + r += (R_VAL(pix) * Cx) >> 10; + g += (G_VAL(pix) * Cx) >> 10; + b += (B_VAL(pix) * Cx) >> 10; + } + if (j > 0) + { + pix++; + a += (A_VAL(pix) * j) >> 10; + r += (R_VAL(pix) * j) >> 10; + g += (G_VAL(pix) * j) >> 10; + b += (B_VAL(pix) * j) >> 10; + } + if ((yap = *yapp) > 0) + { + pix = *yp + *xp + src_w + pos; + aa = (A_VAL(pix) * xap) >> 10; + rr = (R_VAL(pix) * xap) >> 10; + gg = (G_VAL(pix) * xap) >> 10; + bb = (B_VAL(pix) * xap) >> 10; + for (j = (1 << 14) - xap; j > Cx; j -= Cx) + { + pix++; + aa += (A_VAL(pix) * Cx) >> 10; + rr += (R_VAL(pix) * Cx) >> 10; + gg += (G_VAL(pix) * Cx) >> 10; + bb += (B_VAL(pix) * Cx) >> 10; + } + if (j > 0) + { + pix++; + aa += (A_VAL(pix) * j) >> 10; + rr += (R_VAL(pix) * j) >> 10; + gg += (G_VAL(pix) * j) >> 10; + bb += (B_VAL(pix) * j) >> 10; + } + a += ((aa - a) * yap) >> 8; + r += ((rr - r) * yap) >> 8; + g += ((gg - g) * yap) >> 8; + b += ((bb - b) * yap) >> 8; + } + *pbuf++ = ARGB_JOIN(a >> 4, r >> 4, g >> 4, b >> 4); + xp++; xapp++; + } + + func(buf, NULL, dc->mul.col, dptr, w); + } +#ifdef EVAS_SLI + ysli++; +#endif + pbuf = buf; + dptr += dst_w; dst_clip_w = w; + yp++; yapp++; + xp = xpoints + dxx; + xapp = xapoints + dxx; + } + } + else + { +#ifdef DIRECT_SCALE + if ((!src->cache_entry.flags.alpha) && + (!dst->cache_entry.flags.alpha) && + (!dc->mul.use)) + { + while (dst_clip_h--) + { + pbuf = dptr; +#ifdef EVAS_SLI + if (((ysli) % dc->sli.h) == dc->sli.y) +#endif + { + while (dst_clip_w--) + { + Cx = *xapp >> 16; + xap = *xapp & 0xffff; + pix = *yp + *xp + pos; + + r = (R_VAL(pix) * xap) >> 10; + g = (G_VAL(pix) * xap) >> 10; + b = (B_VAL(pix) * xap) >> 10; + for (j = (1 << 14) - xap; j > Cx; j -= Cx) + { + pix++; + r += (R_VAL(pix) * Cx) >> 10; + g += (G_VAL(pix) * Cx) >> 10; + b += (B_VAL(pix) * Cx) >> 10; + } + if (j > 0) + { + pix++; + r += (R_VAL(pix) * j) >> 10; + g += (G_VAL(pix) * j) >> 10; + b += (B_VAL(pix) * j) >> 10; + } + if ((yap = *yapp) > 0) + { + pix = *yp + *xp + src_w + pos; + rr = (R_VAL(pix) * xap) >> 10; + gg = (G_VAL(pix) * xap) >> 10; + bb = (B_VAL(pix) * xap) >> 10; + for (j = (1 << 14) - xap; j > Cx; j -= Cx) + { + pix++; + rr += (R_VAL(pix) * Cx) >> 10; + gg += (G_VAL(pix) * Cx) >> 10; + bb += (B_VAL(pix) * Cx) >> 10; + } + if (j > 0) + { + pix++; + rr += (R_VAL(pix) * j) >> 10; + gg += (G_VAL(pix) * j) >> 10; + bb += (B_VAL(pix) * j) >> 10; + } + r += ((rr - r) * yap) >> 8; + g += ((gg - g) * yap) >> 8; + b += ((bb - b) * yap) >> 8; + } + *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4); + xp++; xapp++; + } + } +#ifdef EVAS_SLI + ysli++; +#endif + + dptr += dst_w; dst_clip_w = w; + yp++; yapp++; + xp = xpoints + dxx; + xapp = xapoints + dxx; + } + } + else +#endif + { + while (dst_clip_h--) + { +#ifdef EVAS_SLI + if (((ysli) % dc->sli.h) == dc->sli.y) +#endif + { + while (dst_clip_w--) + { + Cx = *xapp >> 16; + xap = *xapp & 0xffff; + pix = *yp + *xp + pos; + + r = (R_VAL(pix) * xap) >> 10; + g = (G_VAL(pix) * xap) >> 10; + b = (B_VAL(pix) * xap) >> 10; + for (j = (1 << 14) - xap; j > Cx; j -= Cx) + { + pix++; + r += (R_VAL(pix) * Cx) >> 10; + g += (G_VAL(pix) * Cx) >> 10; + b += (B_VAL(pix) * Cx) >> 10; + } + if (j > 0) + { + pix++; + r += (R_VAL(pix) * j) >> 10; + g += (G_VAL(pix) * j) >> 10; + b += (B_VAL(pix) * j) >> 10; + } + if ((yap = *yapp) > 0) + { + pix = *yp + *xp + src_w + pos; + rr = (R_VAL(pix) * xap) >> 10; + gg = (G_VAL(pix) * xap) >> 10; + bb = (B_VAL(pix) * xap) >> 10; + for (j = (1 << 14) - xap; j > Cx; j -= Cx) + { + pix++; + rr += (R_VAL(pix) * Cx) >> 10; + gg += (G_VAL(pix) * Cx) >> 10; + bb += (B_VAL(pix) * Cx) >> 10; + } + if (j > 0) + { + pix++; + rr += (R_VAL(pix) * j) >> 10; + gg += (G_VAL(pix) * j) >> 10; + bb += (B_VAL(pix) * j) >> 10; + } + r += ((rr - r) * yap) >> 8; + g += ((gg - g) * yap) >> 8; + b += ((bb - b) * yap) >> 8; + } + *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4); + xp++; xapp++; + } + + func(buf, NULL, dc->mul.col, dptr, w); + } +#ifdef EVAS_SLI + ysli++; +#endif + + pbuf = buf; + dptr += dst_w; dst_clip_w = w; + yp++; yapp++; + xp = xpoints + dxx; + xapp = xapoints + dxx; + } + } + } +} diff --git a/src/lib/engines/common/evas_scale_smooth_scaler_downx_downy.c b/src/lib/engines/common/evas_scale_smooth_scaler_downx_downy.c new file mode 100644 index 0000000..f830187 --- /dev/null +++ b/src/lib/engines/common/evas_scale_smooth_scaler_downx_downy.c @@ -0,0 +1,378 @@ +{ + int Cx, Cy, i, j; + DATA32 *dptr, *sptr, *pix, *pbuf; + int a, r, g, b, rx, gx, bx, ax; + int xap, yap, pos; + int dyy, dxx; +#ifdef EVAS_SLI + int ysli = dst_clip_y; +#endif + + DATA32 **yp; + int *xp; + int w = dst_clip_w; + + dptr = dst_ptr; + pos = (src_region_y * src_w) + src_region_x; + dyy = dst_clip_y - dst_region_y; + dxx = dst_clip_x - dst_region_x; + + xp = xpoints + dxx; + yp = ypoints + dyy; + xapp = xapoints + dxx; + yapp = yapoints + dyy; + pbuf = buf; +/*#ifndef SCALE_USING_MMX */ +/* for now there's no mmx down scaling - so C only */ +#if 1 + if (src->cache_entry.flags.alpha) + { + while (dst_clip_h--) + { +#ifdef EVAS_SLI + if (((ysli) % dc->sli.h) == dc->sli.y) +#endif + { + Cy = *yapp >> 16; + yap = *yapp & 0xffff; + + while (dst_clip_w--) + { + Cx = *xapp >> 16; + xap = *xapp & 0xffff; + + sptr = *yp + *xp + pos; + pix = sptr; + sptr += src_w; + + ax = (A_VAL(pix) * xap) >> 9; + rx = (R_VAL(pix) * xap) >> 9; + gx = (G_VAL(pix) * xap) >> 9; + bx = (B_VAL(pix) * xap) >> 9; + pix++; + for (i = (1 << 14) - xap; i > Cx; i -= Cx) + { + ax += (A_VAL(pix) * Cx) >> 9; + rx += (R_VAL(pix) * Cx) >> 9; + gx += (G_VAL(pix) * Cx) >> 9; + bx += (B_VAL(pix) * Cx) >> 9; + pix++; + } + if (i > 0) + { + ax += (A_VAL(pix) * i) >> 9; + rx += (R_VAL(pix) * i) >> 9; + gx += (G_VAL(pix) * i) >> 9; + bx += (B_VAL(pix) * i) >> 9; + } + + a = (ax * yap) >> 14; + r = (rx * yap) >> 14; + g = (gx * yap) >> 14; + b = (bx * yap) >> 14; + + for (j = (1 << 14) - yap; j > Cy; j -= Cy) + { + pix = sptr; + sptr += src_w; + ax = (A_VAL(pix) * xap) >> 9; + rx = (R_VAL(pix) * xap) >> 9; + gx = (G_VAL(pix) * xap) >> 9; + bx = (B_VAL(pix) * xap) >> 9; + pix++; + for (i = (1 << 14) - xap; i > Cx; i -= Cx) + { + ax += (A_VAL(pix) * Cx) >> 9; + rx += (R_VAL(pix) * Cx) >> 9; + gx += (G_VAL(pix) * Cx) >> 9; + bx += (B_VAL(pix) * Cx) >> 9; + pix++; + } + if (i > 0) + { + ax += (A_VAL(pix) * i) >> 9; + rx += (R_VAL(pix) * i) >> 9; + gx += (G_VAL(pix) * i) >> 9; + bx += (B_VAL(pix) * i) >> 9; + } + + a += (ax * Cy) >> 14; + r += (rx * Cy) >> 14; + g += (gx * Cy) >> 14; + b += (bx * Cy) >> 14; + } + if (j > 0) + { + pix = sptr; + sptr += src_w; + ax = (A_VAL(pix) * xap) >> 9; + rx = (R_VAL(pix) * xap) >> 9; + gx = (G_VAL(pix) * xap) >> 9; + bx = (B_VAL(pix) * xap) >> 9; + pix++; + for (i = (1 << 14) - xap; i > Cx; i -= Cx) + { + ax += (A_VAL(pix) * Cx) >> 9; + rx += (R_VAL(pix) * Cx) >> 9; + gx += (G_VAL(pix) * Cx) >> 9; + bx += (B_VAL(pix) * Cx) >> 9; + pix++; + } + if (i > 0) + { + ax += (A_VAL(pix) * i) >> 9; + rx += (R_VAL(pix) * i) >> 9; + gx += (G_VAL(pix) * i) >> 9; + bx += (B_VAL(pix) * i) >> 9; + } + + a += (ax * j) >> 14; + r += (rx * j) >> 14; + g += (gx * j) >> 14; + b += (bx * j) >> 14; + } + *pbuf++ = ARGB_JOIN(a >> 5, r >> 5, g >> 5, b >> 5); + xp++; xapp++; + } + + func(buf, NULL, dc->mul.col, dptr, w); + } +#ifdef EVAS_SLI + ysli++; +#endif + pbuf = buf; + dptr += dst_w; dst_clip_w = w; + xp = xpoints + dxx; + xapp = xapoints + dxx; + yp++; yapp++; + } + } + else + { +#ifdef DIRECT_SCALE + if ((!src->cache_entry.flags.alpha) && + (!dst->cache_entry.flags.alpha) && + (!dc->mul.use)) + { + while (dst_clip_h--) + { +#ifdef EVAS_SLI + if (((ysli) % dc->sli.h) == dc->sli.y) +#endif + { + Cy = *yapp >> 16; + yap = *yapp & 0xffff; + + pbuf = dptr; + while (dst_clip_w--) + { + Cx = *xapp >> 16; + xap = *xapp & 0xffff; + + sptr = *yp + *xp + pos; + pix = sptr; + sptr += src_w; + + rx = (R_VAL(pix) * xap) >> 9; + gx = (G_VAL(pix) * xap) >> 9; + bx = (B_VAL(pix) * xap) >> 9; + pix++; + for (i = (1 << 14) - xap; i > Cx; i -= Cx) + { + rx += (R_VAL(pix) * Cx) >> 9; + gx += (G_VAL(pix) * Cx) >> 9; + bx += (B_VAL(pix) * Cx) >> 9; + pix++; + } + if (i > 0) + { + rx += (R_VAL(pix) * i) >> 9; + gx += (G_VAL(pix) * i) >> 9; + bx += (B_VAL(pix) * i) >> 9; + } + + r = (rx * yap) >> 14; + g = (gx * yap) >> 14; + b = (bx * yap) >> 14; + + for (j = (1 << 14) - yap; j > Cy; j -= Cy) + { + pix = sptr; + sptr += src_w; + rx = (R_VAL(pix) * xap) >> 9; + gx = (G_VAL(pix) * xap) >> 9; + bx = (B_VAL(pix) * xap) >> 9; + pix++; + for (i = (1 << 14) - xap; i > Cx; i -= Cx) + { + rx += (R_VAL(pix) * Cx) >> 9; + gx += (G_VAL(pix) * Cx) >> 9; + bx += (B_VAL(pix) * Cx) >> 9; + pix++; + } + if (i > 0) + { + rx += (R_VAL(pix) * i) >> 9; + gx += (G_VAL(pix) * i) >> 9; + bx += (B_VAL(pix) * i) >> 9; + } + + r += (rx * Cy) >> 14; + g += (gx * Cy) >> 14; + b += (bx * Cy) >> 14; + } + if (j > 0) + { + pix = sptr; + sptr += src_w; + rx = (R_VAL(pix) * xap) >> 9; + gx = (G_VAL(pix) * xap) >> 9; + bx = (B_VAL(pix) * xap) >> 9; + pix++; + for (i = (1 << 14) - xap; i > Cx; i -= Cx) + { + rx += (R_VAL(pix) * Cx) >> 9; + gx += (G_VAL(pix) * Cx) >> 9; + bx += (B_VAL(pix) * Cx) >> 9; + pix++; + } + if (i > 0) + { + rx += (R_VAL(pix) * i) >> 9; + gx += (G_VAL(pix) * i) >> 9; + bx += (B_VAL(pix) * i) >> 9; + } + + r += (rx * j) >> 14; + g += (gx * j) >> 14; + b += (bx * j) >> 14; + } + *pbuf++ = ARGB_JOIN(0xff, r >> 5, g >> 5, b >> 5); + xp++; xapp++; + } + } +#ifdef EVAS_SLI + ysli++; +#endif + dptr += dst_w; dst_clip_w = w; + xp = xpoints + dxx; + xapp = xapoints + dxx; + yp++; yapp++; + } + } + else +#endif + { + while (dst_clip_h--) + { +#ifdef EVAS_SLI + if (((ysli) % dc->sli.h) == dc->sli.y) +#endif + { + Cy = *yapp >> 16; + yap = *yapp & 0xffff; + + while (dst_clip_w--) + { + Cx = *xapp >> 16; + xap = *xapp & 0xffff; + + sptr = *yp + *xp + pos; + pix = sptr; + sptr += src_w; + + rx = (R_VAL(pix) * xap) >> 9; + gx = (G_VAL(pix) * xap) >> 9; + bx = (B_VAL(pix) * xap) >> 9; + pix++; + for (i = (1 << 14) - xap; i > Cx; i -= Cx) + { + rx += (R_VAL(pix) * Cx) >> 9; + gx += (G_VAL(pix) * Cx) >> 9; + bx += (B_VAL(pix) * Cx) >> 9; + pix++; + } + if (i > 0) + { + rx += (R_VAL(pix) * i) >> 9; + gx += (G_VAL(pix) * i) >> 9; + bx += (B_VAL(pix) * i) >> 9; + } + + r = (rx * yap) >> 14; + g = (gx * yap) >> 14; + b = (bx * yap) >> 14; + + for (j = (1 << 14) - yap; j > Cy; j -= Cy) + { + pix = sptr; + sptr += src_w; + rx = (R_VAL(pix) * xap) >> 9; + gx = (G_VAL(pix) * xap) >> 9; + bx = (B_VAL(pix) * xap) >> 9; + pix++; + for (i = (1 << 14) - xap; i > Cx; i -= Cx) + { + rx += (R_VAL(pix) * Cx) >> 9; + gx += (G_VAL(pix) * Cx) >> 9; + bx += (B_VAL(pix) * Cx) >> 9; + pix++; + } + if (i > 0) + { + rx += (R_VAL(pix) * i) >> 9; + gx += (G_VAL(pix) * i) >> 9; + bx += (B_VAL(pix) * i) >> 9; + } + + r += (rx * Cy) >> 14; + g += (gx * Cy) >> 14; + b += (bx * Cy) >> 14; + } + if (j > 0) + { + pix = sptr; + sptr += src_w; + rx = (R_VAL(pix) * xap) >> 9; + gx = (G_VAL(pix) * xap) >> 9; + bx = (B_VAL(pix) * xap) >> 9; + pix++; + for (i = (1 << 14) - xap; i > Cx; i -= Cx) + { + rx += (R_VAL(pix) * Cx) >> 9; + gx += (G_VAL(pix) * Cx) >> 9; + bx += (B_VAL(pix) * Cx) >> 9; + pix++; + } + if (i > 0) + { + rx += (R_VAL(pix) * i) >> 9; + gx += (G_VAL(pix) * i) >> 9; + bx += (B_VAL(pix) * i) >> 9; + } + + r += (rx * j) >> 14; + g += (gx * j) >> 14; + b += (bx * j) >> 14; + } + *pbuf++ = ARGB_JOIN(0xff, r >> 5, g >> 5, b >> 5); + xp++; xapp++; + } + + func(buf, NULL, dc->mul.col, dptr, w); + } +#ifdef EVAS_SLI + ysli++; +#endif + pbuf = buf; + dptr += dst_w; dst_clip_w = w; + xp = xpoints + dxx; + xapp = xapoints + dxx; + yp++; yapp++; + } + } + } +#else + /* MMX scaling down would go here */ +#endif +} diff --git a/src/lib/engines/common/evas_scale_smooth_scaler_downy.c b/src/lib/engines/common/evas_scale_smooth_scaler_downy.c new file mode 100644 index 0000000..89cc883 --- /dev/null +++ b/src/lib/engines/common/evas_scale_smooth_scaler_downy.c @@ -0,0 +1,251 @@ +{ + int Cy, j; + DATA32 *dptr, *pix, *pbuf, **yp; + int r, g, b, a, rr, gg, bb, aa; + int *xp, xap, yap, pos; + int dyy, dxx; + int w = dst_clip_w; +#ifdef EVAS_SLI + int ysli = dst_clip_y; +#endif + + dptr = dst_ptr; + pos = (src_region_y * src_w) + src_region_x; + dyy = dst_clip_y - dst_region_y; + dxx = dst_clip_x - dst_region_x; + + xp = xpoints + dxx; + yp = ypoints + dyy; + xapp = xapoints + dxx; + yapp = yapoints + dyy; + pbuf = buf; + + if (src->cache_entry.flags.alpha) + { + while (dst_clip_h--) + { +#ifdef EVAS_SLI + if (((ysli) % dc->sli.h) == dc->sli.y) +#endif + { + Cy = *yapp >> 16; + yap = *yapp & 0xffff; + + while (dst_clip_w--) + { + pix = *yp + *xp + pos; + + a = (A_VAL(pix) * yap) >> 10; + r = (R_VAL(pix) * yap) >> 10; + g = (G_VAL(pix) * yap) >> 10; + b = (B_VAL(pix) * yap) >> 10; + for (j = (1 << 14) - yap; j > Cy; j -= Cy) + { + pix += src_w; + a += (A_VAL(pix) * Cy) >> 10; + r += (R_VAL(pix) * Cy) >> 10; + g += (G_VAL(pix) * Cy) >> 10; + b += (B_VAL(pix) * Cy) >> 10; + } + if (j > 0) + { + pix += src_w; + a += (A_VAL(pix) * j) >> 10; + r += (R_VAL(pix) * j) >> 10; + g += (G_VAL(pix) * j) >> 10; + b += (B_VAL(pix) * j) >> 10; + } + if ((xap = *xapp) > 0) + { + pix = *yp + *xp + 1 + pos; + aa = (A_VAL(pix) * yap) >> 10; + rr = (R_VAL(pix) * yap) >> 10; + gg = (G_VAL(pix) * yap) >> 10; + bb = (B_VAL(pix) * yap) >> 10; + for (j = (1 << 14) - yap; j > Cy; j -= Cy) + { + pix += src_w; + aa += (A_VAL(pix) * Cy) >> 10; + rr += (R_VAL(pix) * Cy) >> 10; + gg += (G_VAL(pix) * Cy) >> 10; + bb += (B_VAL(pix) * Cy) >> 10; + } + if (j > 0) + { + pix += src_w; + aa += (A_VAL(pix) * j) >> 10; + rr += (R_VAL(pix) * j) >> 10; + gg += (G_VAL(pix) * j) >> 10; + bb += (B_VAL(pix) * j) >> 10; + } + a += ((aa - a) * xap) >> 8; + r += ((rr - r) * xap) >> 8; + g += ((gg - g) * xap) >> 8; + b += ((bb - b) * xap) >> 8; + } + *pbuf++ = ARGB_JOIN(a >> 4, r >> 4, g >> 4, b >> 4); + xp++; xapp++; + } + + func(buf, NULL, dc->mul.col, dptr, w); + } +#ifdef EVAS_SLI + ysli++; +#endif + pbuf = buf; + dptr += dst_w; dst_clip_w = w; + yp++; yapp++; + xp = xpoints + dxx; + xapp = xapoints + dxx; + } + } + else + { +#ifdef DIRECT_SCALE + if ((!src->cache_entry.flags.alpha) && + (!dst->cache_entry.flags.alpha) && + (!dc->mul.use)) + { + while (dst_clip_h--) + { +#ifdef EVAS_SLI + if (((ysli) % dc->sli.h) == dc->sli.y) +#endif + { + Cy = *yapp >> 16; + yap = *yapp & 0xffff; + + pbuf = dptr; + while (dst_clip_w--) + { + pix = *yp + *xp + pos; + + r = (R_VAL(pix) * yap) >> 10; + g = (G_VAL(pix) * yap) >> 10; + b = (B_VAL(pix) * yap) >> 10; + for (j = (1 << 14) - yap; j > Cy; j -= Cy) + { + pix += src_w; + r += (R_VAL(pix) * Cy) >> 10; + g += (G_VAL(pix) * Cy) >> 10; + b += (B_VAL(pix) * Cy) >> 10; + } + if (j > 0) + { + pix += src_w; + r += (R_VAL(pix) * j) >> 10; + g += (G_VAL(pix) * j) >> 10; + b += (B_VAL(pix) * j) >> 10; + } + if ((xap = *xapp) > 0) + { + pix = *yp + *xp + 1 + pos; + rr = (R_VAL(pix) * yap) >> 10; + gg = (G_VAL(pix) * yap) >> 10; + bb = (B_VAL(pix) * yap) >> 10; + for (j = (1 << 14) - yap; j > Cy; j -= Cy) + { + pix += src_w; + rr += (R_VAL(pix) * Cy) >> 10; + gg += (G_VAL(pix) * Cy) >> 10; + bb += (B_VAL(pix) * Cy) >> 10; + } + if (j > 0) + { + pix += src_w; + rr += (R_VAL(pix) * j) >> 10; + gg += (G_VAL(pix) * j) >> 10; + bb += (B_VAL(pix) * j) >> 10; + } + r += ((rr - r) * xap) >> 8; + g += ((gg - g) * xap) >> 8; + b += ((bb - b) * xap) >> 8; + } + *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4); + xp++; xapp++; + } + } +#ifdef EVAS_SLI + ysli++; +#endif + dptr += dst_w; dst_clip_w = w; + yp++; yapp++; + xp = xpoints + dxx; + xapp = xapoints + dxx; + } + } + else +#endif + { + while (dst_clip_h--) + { +#ifdef EVAS_SLI + if (((ysli) % dc->sli.h) == dc->sli.y) +#endif + { + Cy = *yapp >> 16; + yap = *yapp & 0xffff; + + while (dst_clip_w--) + { + pix = *yp + *xp + pos; + + r = (R_VAL(pix) * yap) >> 10; + g = (G_VAL(pix) * yap) >> 10; + b = (B_VAL(pix) * yap) >> 10; + for (j = (1 << 14) - yap; j > Cy; j -= Cy) + { + pix += src_w; + r += (R_VAL(pix) * Cy) >> 10; + g += (G_VAL(pix) * Cy) >> 10; + b += (B_VAL(pix) * Cy) >> 10; + } + if (j > 0) + { + pix += src_w; + r += (R_VAL(pix) * j) >> 10; + g += (G_VAL(pix) * j) >> 10; + b += (B_VAL(pix) * j) >> 10; + } + if ((xap = *xapp) > 0) + { + pix = *yp + *xp + 1 + pos; + rr = (R_VAL(pix) * yap) >> 10; + gg = (G_VAL(pix) * yap) >> 10; + bb = (B_VAL(pix) * yap) >> 10; + for (j = (1 << 14) - yap; j > Cy; j -= Cy) + { + pix += src_w; + rr += (R_VAL(pix) * Cy) >> 10; + gg += (G_VAL(pix) * Cy) >> 10; + bb += (B_VAL(pix) * Cy) >> 10; + } + if (j > 0) + { + pix += src_w; + rr += (R_VAL(pix) * j) >> 10; + gg += (G_VAL(pix) * j) >> 10; + bb += (B_VAL(pix) * j) >> 10; + } + r += ((rr - r) * xap) >> 8; + g += ((gg - g) * xap) >> 8; + b += ((bb - b) * xap) >> 8; + } + *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4); + xp++; xapp++; + } + + func(buf, NULL, dc->mul.col, dptr, w); + } +#ifdef EVAS_SLI + ysli++; +#endif + pbuf = buf; + dptr += dst_w; dst_clip_w = w; + yp++; yapp++; + xp = xpoints + dxx; + xapp = xapoints + dxx; + } + } + } +} diff --git a/src/lib/engines/common/evas_scale_smooth_scaler_noscale.c b/src/lib/engines/common/evas_scale_smooth_scaler_noscale.c new file mode 100644 index 0000000..957b6a3 --- /dev/null +++ b/src/lib/engines/common/evas_scale_smooth_scaler_noscale.c @@ -0,0 +1,27 @@ +{ + DATA32 *ptr; + RGBA_Gfx_Func func; +#ifdef EVAS_SLI + int ysli = dst_clip_y; +#endif + + ptr = src->image.data + ((dst_clip_y - dst_region_y + src_region_y) * src_w) + (dst_clip_x - dst_region_x) + src_region_x; + if (dc->mul.use) + func = evas_common_gfx_func_composite_pixel_color_span_get(src, dc->mul.col, dst, dst_clip_w, dc->render_op); + else + func = evas_common_gfx_func_composite_pixel_span_get(src, dst, dst_clip_w, dc->render_op); + while (dst_clip_h--) + { +#ifdef EVAS_SLI + if (((ysli) % dc->sli.h) == dc->sli.y) +#endif + { + func(ptr, NULL, dc->mul.col, dst_ptr, dst_clip_w); + } +#ifdef EVAS_SLI + ysli++; +#endif + ptr += src_w; + dst_ptr += dst_w; + } +} diff --git a/src/lib/engines/common/evas_scale_smooth_scaler_up.c b/src/lib/engines/common/evas_scale_smooth_scaler_up.c new file mode 100644 index 0000000..15f6a07 --- /dev/null +++ b/src/lib/engines/common/evas_scale_smooth_scaler_up.c @@ -0,0 +1,263 @@ +{ + int srx = src_region_x, sry = src_region_y; + int srw = src_region_w, srh = src_region_h; + int drx = dst_region_x, dry = dst_region_y; + int drw = dst_region_w, drh = dst_region_h; + + int dsxx, dsyy, sxx, syy, sx, sy; + int cx, cy; + int direct_scale = 0, buf_step = 0; + + DATA32 *psrc, *pdst, *pdst_end; + DATA32 *buf, *pbuf, *pbuf_end; + RGBA_Gfx_Func func; + + /* a scanline buffer */ + pdst = dst_ptr; // it's been set at (dst_clip_x, dst_clip_y) + pdst_end = pdst + (dst_clip_h * dst_w); + if (!dc->mul.use) + { + if ((dc->render_op == _EVAS_RENDER_BLEND) && !src->cache_entry.flags.alpha) + { direct_scale = 1; buf_step = dst->cache_entry.w; } + else if (dc->render_op == _EVAS_RENDER_COPY) + { + direct_scale = 1; buf_step = dst->cache_entry.w; + if (src->cache_entry.flags.alpha) + dst->cache_entry.flags.alpha = 1; + } + } + if (!direct_scale) + { + buf = alloca(dst_clip_w * sizeof(DATA32)); + if (dc->mul.use) + func = evas_common_gfx_func_composite_pixel_color_span_get(src, dc->mul.col, dst, dst_clip_w, dc->render_op); + else + func = evas_common_gfx_func_composite_pixel_span_get(src, dst, dst_clip_w, dc->render_op); + } + else + buf = pdst; + + if ((srw > 1) && (drw > 1)) + dsxx = ((srw - 1) << 16) / (drw - 1); + else + dsxx = (srw << 16) / drw; + if ((srh > 1) && (drh > 1)) + dsyy = ((srh - 1) << 16) / (drh - 1); + else + dsyy = (srh << 16) / drh; + + cx = dst_clip_x - drx; + cy = dst_clip_y - dry; + + sxx = (dsxx * cx); + syy = (dsyy * cy); + + sx = sxx >> 16; + sy = syy >> 16; + + if (drh == srh) + { + int sxx0 = sxx; +#ifdef EVAS_SLI + int ysli = dst_clip_y; +#endif + psrc = src->image.data + (src_w * (sry + cy)) + srx; + while (pdst < pdst_end) + { +#ifdef EVAS_SLI + if (((ysli) % dc->sli.h) == dc->sli.y) +#endif + { + pbuf = buf; pbuf_end = buf + dst_clip_w; + sxx = sxx0; +#ifdef SCALE_USING_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + while (pbuf < pbuf_end) + { + DATA32 p0, p1; + int ax; + + sx = (sxx >> 16); + ax = 1 + ((sxx - (sx << 16)) >> 8); + p0 = p1 = *(psrc + sx); + if ((sx + 1) < srw) + p1 = *(psrc + sx + 1); +#ifdef SCALE_USING_MMX + MOV_P2R(p0, mm1, mm0) + if (p0 | p1) + { + MOV_A2R(ax, mm3) + MOV_P2R(p1, mm2, mm0) + INTERP_256_R2R(mm3, mm2, mm1, mm5) + } + MOV_R2P(mm1, *pbuf, mm0) + pbuf++; +#else + if (p0 | p1) + p0 = INTERP_256(ax, p1, p0); + *pbuf++ = p0; +#endif + sxx += dsxx; + } + /* * blend here [clip_w *] buf -> dptr * */ + if (!direct_scale) + func(buf, NULL, dc->mul.col, pdst, dst_clip_w); + } +#ifdef EVAS_SLI + ysli++; +#endif + pdst += dst_w; + psrc += src_w; + buf += buf_step; + } + + goto done_scale_up; + } + else if (drw == srw) + { + DATA32 *ps = src->image.data + (src_w * sry) + srx + cx; +#ifdef EVAS_SLI + int ysli = dst_clip_y; +#endif + + while (pdst < pdst_end) + { +#ifdef EVAS_SLI + if (((ysli) % dc->sli.h) == dc->sli.y) +#endif + { + int ay; + + sy = syy >> 16; + psrc = ps + (sy * src_w); + ay = 1 + ((syy - (sy << 16)) >> 8); +#ifdef SCALE_USING_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) + MOV_A2R(ay, mm4) +#endif + pbuf = buf; pbuf_end = buf + dst_clip_w; + while (pbuf < pbuf_end) + { + DATA32 p0 = *psrc, p2 = p0; + + if ((sy + 1) < srh) + p2 = *(psrc + src_w); +#ifdef SCALE_USING_MMX + MOV_P2R(p0, mm1, mm0) + if (p0 | p2) + { + MOV_P2R(p2, mm2, mm0) + INTERP_256_R2R(mm4, mm2, mm1, mm5) + } + MOV_R2P(mm1, *pbuf, mm0) + pbuf++; +#else + if (p0 | p2) + p0 = INTERP_256(ay, p2, p0); + *pbuf++ = p0; +#endif + psrc++; + } + /* * blend here [clip_w *] buf -> dptr * */ + if (!direct_scale) + func(buf, NULL, dc->mul.col, pdst, dst_clip_w); + } +#ifdef EVAS_SLI + ysli++; +#endif + pdst += dst_w; + syy += dsyy; + buf += buf_step; + } + goto done_scale_up; + } + + { + DATA32 *ps = src->image.data + (src_w * sry) + srx; + int sxx0 = sxx; +#ifdef EVAS_SLI + int ysli = dst_clip_y; +#endif + + while (pdst < pdst_end) + { +#ifdef EVAS_SLI + if (((ysli) % dc->sli.h) == dc->sli.y) +#endif + { + int ay; + + sy = syy >> 16; + psrc = ps + (sy * src_w); + ay = 1 + ((syy - (sy << 16)) >> 8); +#ifdef SCALE_USING_MMX + MOV_A2R(ay, mm4) + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + pbuf = buf; pbuf_end = buf + dst_clip_w; + sxx = sxx0; + while (pbuf < pbuf_end) + { + int ax; + DATA32 *p, *q; + DATA32 p0, p1, p2, p3; + + sx = sxx >> 16; + ax = 1 + ((sxx - (sx << 16)) >> 8); + p = psrc + sx; q = p + src_w; + p0 = p1 = p2 = p3 = *p; + if ((sx + 1) < srw) + p1 = *(p + 1); + if ((sy + 1) < srh) + { + p2 = *q; p3 = p2; + if ((sx + 1) < srw) + p3 = *(q + 1); + } +#ifdef SCALE_USING_MMX + MOV_A2R(ax, mm6) + MOV_P2R(p0, mm1, mm0) + if (p0 | p1) + { + MOV_P2R(p1, mm2, mm0) + INTERP_256_R2R(mm6, mm2, mm1, mm5) + } + MOV_P2R(p2, mm2, mm0) + if (p2 | p3) + { + MOV_P2R(p3, mm3, mm0) + INTERP_256_R2R(mm6, mm3, mm2, mm5) + } + INTERP_256_R2R(mm4, mm2, mm1, mm5) + MOV_R2P(mm1, *pbuf, mm0) + pbuf++; +#else + if (p0 | p1) + p0 = INTERP_256(ax, p1, p0); + if (p2 | p3) + p2 = INTERP_256(ax, p3, p2); + if (p0 | p2) + p0 = INTERP_256(ay, p2, p0); + *pbuf++ = p0; +#endif + sxx += dsxx; + } + /* * blend here [clip_w *] buf -> dptr * */ + if (!direct_scale) + func(buf, NULL, dc->mul.col, pdst, dst_clip_w); + } +#ifdef EVAS_SLI + ysli++; +#endif + pdst += dst_w; + syy += dsyy; + buf += buf_step; + } + } + done_scale_up: + return; +} diff --git a/src/lib/engines/common/evas_scale_span.c b/src/lib/engines/common/evas_scale_span.c new file mode 100644 index 0000000..8725240 --- /dev/null +++ b/src/lib/engines/common/evas_scale_span.c @@ -0,0 +1,657 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include "evas_common.h" +#include "evas_convert_color.h" +#include "evas_scale_span.h" + +static void +evas_common_scale_rgba_span_(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir) +{ + int mul = 0, step = 1; + DATA32 *pdst = dst; + + if (!src || !dst) return; + if ((src_len < 1) || (dst_len < 1)) return; + if ((src_len > 65535) || (dst_len > 65535)) return; + if (mul_col != 0xffffffff) + mul = 1; + if (dir < 0) + { + pdst += dst_len - 1; + step = -1; + } + + if ((src_len == 1) || (dst_len == 1)) + { + DATA32 c = *src; + + if (mul) c = MUL4_SYM(mul_col, c); + while (dst_len--) + *dst++ = c; + return; + } + + if (src_len == dst_len) + { + if (mul) + { +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) + MOV_P2R(mul_col, mm7, mm0) +#endif + while (dst_len--) + { +#ifdef BUILD_MMX + MOV_P2R(*src, mm1, mm0) + MUL4_SYM_R2R(mm7, mm1, mm5) + MOV_R2P(mm1, *pdst, mm0) +#else + *pdst = MUL4_SYM(mul_col, *src); +#endif + src++; pdst += step; + } + return; + } + while (dst_len--) + { + *pdst = *src; + src++; pdst += step; + } + return; + } + + { + DATA32 dsxx = (((src_len - 1) << 16) / (dst_len - 1)); + DATA32 sxx = 0; + int sx = sxx >> 16; + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) + if (mul) + { + MOV_P2R(mul_col, mm7, mm0) + } +#endif + while (dst_len--) + { + DATA32 p2, p1 = 0; + int a; + + sx = (sxx >> 16); + if (sx < src_len) + p1 = *(src + sx); + p2 = p1; + if ((sx + 1) < src_len) + p2 = *(src + sx + 1); + a = 1 + ((sxx - (sx << 16)) >> 8); +#ifdef BUILD_MMX + MOV_A2R(a, mm3) + MOV_P2R(p1, mm1, mm0) + MOV_P2R(p2, mm2, mm0) + INTERP_256_R2R(mm3, mm2, mm1, mm5) + if (mul) + { + MUL4_SYM_R2R(mm7, mm1, mm5) + } + MOV_R2P(mm1, *pdst, mm0) +#else + p1 = INTERP_256(a, p2, p1); + if (mul) + p1 = MUL4_SYM(mul_col, p1); + *pdst = p1; +#endif + pdst += step; sxx += dsxx; + } + return; + } +} + +static void +evas_common_scale_rgba_a8_span_(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir) +{ + int mul = 0, step = 1; + DATA32 *pdst = dst; + + if (!src || !mask || !dst) return; + if ((src_len < 1) || (dst_len < 1)) return; + if ((src_len > 65535) || (dst_len > 65535)) return; + if (mul_col != 0xffffffff) + mul = 1; + if (dir < 0) + { + pdst += dst_len - 1; + step = -1; + } + + if ((src_len == 1) || (dst_len == 1)) + { + DATA32 c = MUL_SYM(*mask, *src); + + if (mul) c = MUL4_SYM(mul_col, c); + while (dst_len--) + *dst++ = c; + return; + } + + if (src_len == dst_len) + { +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + if (mul) + { +#ifdef BUILD_MMX + MOV_P2R(mul_col, mm7, mm0) +#endif + while (dst_len--) + { +#ifdef BUILD_MMX + MOV_P2R(*src, mm1, mm0) + MOV_A2R(*mask, mm3) + MUL4_SYM_R2R(mm3, mm1, mm5) + MUL4_SYM_R2R(mm7, mm1, mm5) + MOV_R2P(mm1, *pdst, mm0) +#else + DATA32 c = MUL_SYM(*mask, *src); + *pdst = MUL4_SYM(mul_col, c); +#endif + src++; mask++; pdst += step; + } + return; + } + while (dst_len--) + { +#ifdef BUILD_MMX + MOV_P2R(*src, mm1, mm0) + MOV_A2R(*mask, mm3) + MUL4_SYM_R2R(mm3, mm1, mm5) + MOV_R2P(mm1, *pdst, mm0) +#else + *pdst = MUL_SYM(*mask, *src); +#endif + src++; mask++; pdst += step; + } + return; + } + + { + DATA32 dsxx = (((src_len - 1) << 16) / (dst_len - 1)); + DATA32 sxx = 0; + int sx = sxx >> 16; + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) + if (mul) + { + MOV_P2R(mul_col, mm7, mm0) + } +#endif + while (dst_len--) + { + DATA32 p2, p1 = 0; + int a, a2, a1 = 0; + + sx = (sxx >> 16); + if (sx < src_len) + { + p1 = *(src + sx); + a1 = *(mask + sx); + } + p2 = p1; a2 = a1; + if ((sx + 1) < src_len) + { + p2 = *(src + sx + 1); + a2 = *(mask + sx + 1); + } + a = 1 + ((sxx - (sx << 16)) >> 8); +#ifdef BUILD_MMX + MOV_A2R(a, mm3) + MOV_P2R(p1, mm1, mm0) + MOV_P2R(p2, mm2, mm0) + INTERP_256_R2R(mm3, mm2, mm1, mm5) + a1 += 1 + ((a * (a2 - a1)) >> 8); + MOV_A2R(a1, mm3) + MUL4_256_R2R(mm3, mm1) + if (mul) + { + MUL4_SYM_R2R(mm7, mm1, mm5) + } + MOV_R2P(mm1, *pdst, mm0) +#else + p1 = INTERP_256(a, p2, p1); + a1 += 1 + ((a * (a2 - a1)) >> 8); + p1 = MUL_256(a1, p1); + if (mul) + p1 = MUL4_SYM(mul_col, p1); + *pdst = p1; +#endif + pdst += step; sxx += dsxx; + } + return; + } +} + +static void +evas_common_scale_a8_span_(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir) +{ + int step = 1; + DATA32 *pdst = dst; + + if (!mask || !dst) return; + if ((src_len < 1) || (dst_len < 1)) return; + if ((src_len > 65535) || (dst_len > 65535)) return; + if (dir < 0) + { + pdst += dst_len - 1; + step = -1; + } + + if ((src_len == 1) || (dst_len == 1)) + { + DATA32 c = MUL_SYM(*mask, mul_col); + + while (dst_len--) + *dst++ = c; + return; + } + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) + MOV_P2R(mul_col, mm7, mm0) +#endif + if (src_len == dst_len) + { + while (dst_len--) + { +#ifdef BUILD_MMX + MOV_A2R(*mask, mm3) + MUL4_SYM_R2R(mm7, mm3, mm5) + MOV_R2P(mm3, *pdst, mm0) +#else + *pdst = MUL_SYM(*mask, mul_col); +#endif + mask++; pdst += step; + } + return; + } + + { + DATA32 dsxx = (((src_len - 1) << 16) / (dst_len - 1)); + DATA32 sxx = 0; + int sx = sxx >> 16; + + while (dst_len--) + { + int a, a2, a1 = 0; + + sx = (sxx >> 16); + if (sx < src_len) + a1 = *(mask + sx); + a2 = a1; + if ((sx + 1) < src_len) + a2 = *(mask + sx + 1); + a = 1 + ((sxx - (sx << 16)) >> 8); + a1 += 1 + ((a * (a2 - a1)) >> 8); +#ifdef BUILD_MMX + MOV_A2R(a1, mm3) + MUL4_256_R2R(mm7, mm3) + MOV_R2P(mm3, *pdst, mm0) +#else + *pdst = MUL_256(a1, mul_col); +#endif + pdst += step; sxx += dsxx; + } + return; + } +} + +static void +evas_common_scale_clip_a8_span_(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir) +{ + int mul = 0, step = 1; + DATA32 *pdst = dst; + + if (!mask || !dst) return; + if ((src_len < 1) || (dst_len < 1)) return; + if ((src_len > 65535) || (dst_len > 65535)) return; + if (mul_col != 0xffffffff) + mul = 1; + if (dir < 0) + { + pdst += dst_len - 1; + step = -1; + } + +#ifdef BUILD_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) + if (mul) + { + MOV_P2R(mul_col, mm7, mm0) + } +#endif + if ((src_len == 1) || (dst_len == 1)) + { +#ifdef BUILD_MMX + MOV_A2R(*mask, mm3) +#else + DATA32 c = *mask; +#endif + if (mul) + { +#ifdef BUILD_MMX + MUL4_SYM_R2R(mm7, mm3, mm5) +#else + c = MUL_SYM(c, mul_col); +#endif + while (dst_len--) + { +#ifdef BUILD_MMX + MOV_P2R(*dst, mm1, mm0) + MUL4_SYM_R2R(mm3, mm1, mm5) + MOV_R2P(mm1, *dst, mm0) +#else + *dst = MUL4_SYM(c, *dst); +#endif + dst++; + } + return; + } + while (dst_len--) + { +#ifdef BUILD_MMX + MOV_P2R(*dst, mm1, mm0) + MUL4_SYM_R2R(mm3, mm1, mm5) + MOV_R2P(mm1, *dst, mm0) +#else + *dst = MUL_SYM(c, *dst); +#endif + dst++; + } + return; + } + + if (src_len == dst_len) + { + if (mul) + { + while (dst_len--) + { +#ifdef BUILD_MMX + MOV_A2R(*mask, mm3) + MUL4_SYM_R2R(mm7, mm3, mm5) + MOV_P2R(*pdst, mm1, mm0) + MUL4_SYM_R2R(mm3, mm1, mm5) + MOV_R2P(mm1, *pdst, mm0) +#else + DATA32 c = MUL_SYM(*mask, mul_col); + + *pdst = MUL4_SYM(c, *pdst); +#endif + mask++; pdst += step; + } + return; + } + while (dst_len--) + { +#ifdef BUILD_MMX + MOV_A2R(*mask, mm3) + MOV_P2R(*pdst, mm1, mm0) + MUL4_SYM_R2R(mm3, mm1, mm5) + MOV_R2P(mm1, *pdst, mm0) +#else + *pdst = MUL_SYM(*mask, *pdst); +#endif + mask++; pdst += step; + } + return; + } + + { + DATA32 dsxx = (((src_len - 1) << 16) / (dst_len - 1)); + DATA32 sxx = 0; + int sx = sxx >> 16; + + while (dst_len--) + { + int a, a2, a1 = 0; + + sx = (sxx >> 16); + if (sx < src_len) + a1 = *(mask + sx); + a2 = a1; + if ((sx + 1) < src_len) + a2 = *(mask + sx + 1); + a = 1 + ((sxx - (sx << 16)) >> 8); + a1 += 1 + ((a * (a2 - a1)) >> 8); +#ifdef BUILD_MMX + MOV_A2R(a1, mm3) + MOV_P2R(*pdst, mm1, mm0) + MUL4_256_R2R(mm3, mm1) + if (mul) + { + MUL4_SYM_R2R(mm7, mm1, mm5) + } + MOV_R2P(mm1, *pdst, mm0) +#else + *pdst = MUL_256(a1, *pdst); + if (mul) + *pdst = MUL4_SYM(mul_col, *pdst); +#endif + pdst += step; sxx += dsxx; + } + return; + } +} + +EAPI void +evas_common_scale_rgba_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir) +{ + evas_common_scale_rgba_span_(src, mask, src_len, mul_col, dst, dst_len, dir); + evas_common_cpu_end_opt(); +} + +EAPI void +evas_common_scale_rgba_a8_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir) +{ + evas_common_scale_rgba_a8_span_(src, mask, src_len, mul_col, dst, dst_len, dir); + evas_common_cpu_end_opt(); +} + +EAPI void +evas_common_scale_a8_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir) +{ + evas_common_scale_a8_span_(src, mask, src_len, mul_col, dst, dst_len, dir); + evas_common_cpu_end_opt(); +} + +EAPI void +evas_common_scale_clip_a8_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir) +{ + evas_common_scale_clip_a8_span_(src, mask, src_len, mul_col, dst, dst_len, dir); + evas_common_cpu_end_opt(); +} + +EAPI void +evas_common_scale_hsva_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir) +{ + int mul = 0, step = 1; + DATA32 *pdst = dst; + + if (!src || !dst) return; + if ((src_len < 1) || (dst_len < 1)) return; + if ((src_len > 65535) || (dst_len > 65535)) return; + if (mul_col != 0xffffffff) + mul = 1; + if (dir < 0) + { + pdst += dst_len - 1; + step = -1; + } + + if ((src_len == 1) || (dst_len == 1)) + { + DATA32 c = *src; + + if (mul) c = MUL4_SYM(mul_col, c); + while (dst_len--) + *dst++ = c; + return; + } + + if (src_len == dst_len) + { + if (mul) + { + while (dst_len--) + { + *pdst = MUL4_SYM(mul_col, *src); + src++; pdst += step; + } + return; + } + while (dst_len--) + { + *pdst = *src; + src++; pdst += step; + } + return; + } + + { + DATA32 dsxx = (((src_len - 1) << 16) / (dst_len - 1)); + DATA32 sxx = 0; + int sx = sxx >> 16; + + while (dst_len--) + { + DATA32 p2, p1 = 0; + int a, h1, s1, v1, h2, s2, v2; + + sx = (sxx >> 16); + if (sx < src_len) + p1 = *(src + sx); + evas_common_convert_color_rgb_to_hsv_int((p1 >> 16) & 0xff, (p1 >> 8) & 0xff, p1 & 0xff, + &h1, &s1, &v1); + p2 = p1; + if ((sx + 1) < src_len) + p2 = *(src + sx + 1); + evas_common_convert_color_rgb_to_hsv_int((p2 >> 16) & 0xff, (p2 >> 8) & 0xff, p2 & 0xff, + &h2, &s2, &v2); + a = 1 + ((sxx - (sx << 16)) >> 8); + h1 += (a * (h2 - h1)) >> 8; + s1 += (a * (s2 - s1)) >> 8; + v1 += (a * (v2 - v1)) >> 8; + a = (((((p2 >> 8) & 0xff0000) - ((p1 >> 8) & 0xff0000)) * a) + + (p1 & 0xff000000)) & 0xff000000; + evas_common_convert_color_hsv_to_rgb_int(h1, s1, v1, &h2, &s2, &v2); + p1 = a + RGB_JOIN(h2,s2,v2); + if (mul) + p1 = MUL4_SYM(mul_col, p1); + *pdst = p1; + pdst += step; sxx += dsxx; + } + return; + } +} + +EAPI void +evas_common_scale_hsva_a8_span(DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir) +{ + int mul = 0, step = 1; + DATA32 *pdst = dst; + + if (!src || !mask || !dst) return; + if ((src_len < 1) || (dst_len < 1)) return; + if ((src_len > 65535) || (dst_len > 65535)) return; + if (mul_col != 0xffffffff) + mul = 1; + if (dir < 0) + { + pdst += dst_len - 1; + step = -1; + } + + if ((src_len == 1) || (dst_len == 1)) + { + DATA32 c = MUL_SYM(*mask, *src); + + if (mul) c = MUL4_SYM(mul_col, c); + while (dst_len--) + *dst++ = c; + return; + } + + if (src_len == dst_len) + { + if (mul) + { + while (dst_len--) + { + DATA32 c = MUL_SYM(*mask, *src); + *pdst = MUL4_SYM(mul_col, c); + src++; mask++; pdst += step; + } + return; + } + while (dst_len--) + { + *pdst = MUL_SYM(*mask, *src); + src++; mask++; pdst += step; + } + return; + } + + { + DATA32 dsxx = (((src_len - 1) << 16) / (dst_len - 1)); + DATA32 sxx = 0; + int sx = sxx >> 16; + + while (dst_len--) + { + DATA32 p2, p1 = 0; + int a, a2, a1 = 0; + int h1, s1, v1, h2, s2, v2; + + sx = (sxx >> 16); + if (sx < src_len) + { + p1 = *(src + sx); + a1 = *(mask + sx); + } + p2 = p1; a2 = a1; + if ((sx + 1) < src_len) + { + p2 = *(src + sx + 1); + a2 = *(mask + sx + 1); + } + evas_common_convert_color_rgb_to_hsv_int((p1 >> 16) & 0xff, (p1 >> 8) & 0xff, p1 & 0xff, + &h1, &s1, &v1); + evas_common_convert_color_rgb_to_hsv_int((p2 >> 16) & 0xff, (p2 >> 8) & 0xff, p2 & 0xff, + &h2, &s2, &v2); + a = 1 + ((sxx - (sx << 16)) >> 8); + a1 += (a * (a2 - a1)) >> 8; + h1 += (a * (h2 - h1)) >> 8; + s1 += (a * (s2 - s1)) >> 8; + v1 += (a * (v2 - v1)) >> 8; + a = (((((p2 >> 8) & 0xff0000) - ((p1 >> 8) & 0xff0000)) * a) + + (p1 & 0xff000000)) & 0xff000000; + + evas_common_convert_color_hsv_to_rgb_int(h1, s1, v1, &h2, &s2, &v2); + p1 = a + RGB_JOIN(h2,s2,v2); + p1 = MUL_SYM(a1, p1); + if (mul) + p1 = MUL4_SYM(mul_col, p1); + *pdst = p1; + pdst += step; sxx += dsxx; + } + return; + } +} diff --git a/src/lib/engines/common/evas_scale_span.h b/src/lib/engines/common/evas_scale_span.h new file mode 100644 index 0000000..6c51619 --- /dev/null +++ b/src/lib/engines/common/evas_scale_span.h @@ -0,0 +1,18 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef _EVAS_SCALE_SPAN_H +#define _EVAS_SCALE_SPAN_H + + +EAPI void evas_common_scale_rgba_span (DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir); +EAPI void evas_common_scale_rgba_a8_span (DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir); +EAPI void evas_common_scale_a8_span (DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir); +EAPI void evas_common_scale_clip_a8_span (DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir); + +EAPI void evas_common_scale_hsva_span (DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir); +EAPI void evas_common_scale_hsva_a8_span (DATA32 *src, DATA8 *mask, int src_len, DATA32 mul_col, DATA32 *dst, int dst_len, int dir); + + +#endif /* _EVAS_SCALE_SPAN_H */ diff --git a/src/lib/engines/common/evas_tiler.c b/src/lib/engines/common/evas_tiler.c new file mode 100644 index 0000000..5cee207 --- /dev/null +++ b/src/lib/engines/common/evas_tiler.c @@ -0,0 +1,1328 @@ +#include "evas_common.h" + +#ifdef EVAS_RECT_SPLIT + +static const list_node_t list_node_zeroed = { NULL }; +static const list_t list_zeroed = { NULL, NULL }; + + +typedef struct list_node_pool +{ + list_node_t *node; + int len; + int max; +} list_node_pool_t; + +static list_node_pool_t list_node_pool = { NULL, 0, 1024 }; + +void +rect_list_node_pool_set_max(int max) +{ + int diff; + + diff = list_node_pool.len - max; + for (; diff > 0 && list_node_pool.node != NULL; diff--) + { + list_node_t *node; + + node = list_node_pool.node; + list_node_pool.node = node->next; + list_node_pool.len--; + + free(node); + } + + list_node_pool.max = max; +} + +void +rect_list_node_pool_flush(void) +{ + while (list_node_pool.node) + { + list_node_t *node; + + node = list_node_pool.node; + list_node_pool.node = node->next; + list_node_pool.len--; + + free(node); + } +} + +inline list_node_t * +rect_list_node_pool_get(void) +{ + if (list_node_pool.node) + { + list_node_t *node; + + node = list_node_pool.node; + list_node_pool.node = node->next; + list_node_pool.len--; + + return node; + } + else return malloc(sizeof(rect_node_t)); +} + +inline void +rect_list_node_pool_put(list_node_t *node) +{ + if (list_node_pool.len < list_node_pool.max) + { + node->next = list_node_pool.node; + list_node_pool.node = node; + list_node_pool.len++; + } + else free(node); +} + +inline void +rect_init(rect_t *r, int x, int y, int w, int h) +{ + r->area = w * h; + + r->left = x; + r->top = y; + + r->right = x + w; + r->bottom = y + h; + + r->width = w; + r->height = h; +} + +void +rect_print(const rect_t r) +{ + printf("", r.left, r.top, r.width, r.height); +} + +void +rect_list_print(const list_t rects) +{ + list_node_t *node; + int len; + + len = 0; + for (node = rects.head; node != NULL; node = node->next) len++; + + printf("["); + for (node = rects.head; node != NULL; node = node->next) + { + rect_print(((rect_node_t *)node)->rect); + if (node->next) + { + putchar(','); + if (len < 4) putchar(' '); + else + { + putchar('\n'); + putchar(' '); + } + } + } + printf("]\n"); +} + +inline void +rect_list_append_node(list_t *rects, list_node_t *node) +{ + if (rects->tail) + { + rects->tail->next = node; + rects->tail = node; + } + else + { + rects->head = node; + rects->tail = node; + } +} + +inline void +rect_list_append(list_t *rects, const rect_t r) +{ + rect_node_t *rect_node; + + rect_node = (rect_node_t *)rect_list_node_pool_get(); + rect_node->rect = r; + rect_node->_lst = list_node_zeroed; + + rect_list_append_node(rects, (list_node_t *)rect_node); +} + +inline void +rect_list_append_xywh(list_t *rects, int x, int y, int w, int h) +{ + rect_t r; + + rect_init(&r, x, y, w, h); + rect_list_append(rects, r); +} + +inline void +rect_list_concat(list_t *rects, list_t *other) +{ + if (!other->head) + return; + + if (rects->tail) + { + rects->tail->next = other->head; + rects->tail = other->tail; + } + else + { + rects->head = other->head; + rects->tail = other->tail; + } + *other = list_zeroed; +} + +inline list_node_t * +rect_list_unlink_next(list_t *rects, list_node_t *parent_node) +{ + list_node_t *node; + + if (parent_node) + { + node = parent_node->next; + parent_node->next = node->next; + } + else + { + node = rects->head; + rects->head = node->next; + } + + if (rects->tail == node) rects->tail = parent_node; + *node = list_node_zeroed; + return node; +} + +inline void +rect_list_del_next(list_t *rects, list_node_t *parent_node) +{ + list_node_t *node; + + node = rect_list_unlink_next(rects, parent_node); + rect_list_node_pool_put(node); +} + +void +rect_list_clear(list_t *rects) +{ + list_node_t *node; + + node = rects->head; + while (node) + { + list_node_t *aux; + + aux = node->next; + rect_list_node_pool_put(node); + node = aux; + } + *rects = list_zeroed; +} + +static inline void +_calc_intra_rect_area(const rect_t a, const rect_t b, int *width, int *height) +{ + int max_left, min_right, max_top, min_bottom; + + if (a.left < b.left) max_left = b.left; + else max_left = a.left; + + if (a.right < b.right) min_right = a.right; + else min_right = b.right; + + *width = min_right - max_left; + + if (a.top < b.top) max_top = b.top; + else max_top = a.top; + + if (a.bottom < b.bottom) min_bottom = a.bottom; + else min_bottom = b.bottom; + + *height = min_bottom - max_top; +} + +static inline void +_split_strict(list_t *dirty, const rect_t current, rect_t r) +{ + int h_1, h_2, w_1, w_2; + + h_1 = current.top - r.top; + h_2 = r.bottom - current.bottom; + w_1 = current.left - r.left; + w_2 = r.right - current.right; + + if (h_1 > 0) + { + /* .--.r (b) .---.r2 + * | | | | + * .-------.cur (a) .---.r '---' + * | | | | -> | | + + * | `--' | `---' + * `-------' + */ + rect_list_append_xywh(dirty, r.left, r.top, r.width, h_1); + r.height -= h_1; + r.top = current.top; + } + + if (h_2 > 0) + { + /* .-------.cur (a) + * | .---. | .---.r + * | | | | -> | | + * `-------' `---' + .---.r2 + * | | | | + * `---'r (b) `---' + */ + rect_list_append_xywh(dirty, r.left, current.bottom, r.width, h_2); + r.height -= h_2; + } + + if (w_1 > 0) + { + /* (b) r .----.cur (a) + * .--|-. | .--.r2 .-.r + * | | | | -> | | + | | + * `--|-' | `--' `-' + * `----' + */ + rect_list_append_xywh(dirty, r.left, r.top, w_1, r.height); + /* not necessary to keep these, r (b) will be destroyed */ + /* r.width -= w_1; */ + /* r.left = current.left; */ + } + + if (w_2 > 0) + { + /* .----.cur (a) + * | | + * | .-|--.r (b) .-.r .--.r2 + * | | | | -> | | + | | + * | `-|--' `-' `--' + * `----' + */ + rect_list_append_xywh(dirty, current.right, r.top, w_2, r.height); + /* not necessary to keep this, r (b) will be destroyed */ + /* r.width -= w_2; */ + } +} + +void +rect_list_del_split_strict(list_t *rects, const rect_t del_r) +{ + list_t modified = list_zeroed; + list_node_t *cur_node, *prev_node; + + prev_node = NULL; + cur_node = rects->head; + while (cur_node) + { + int intra_width, intra_height; + rect_t current; + + current = ((rect_node_t*)cur_node)->rect; + + _calc_intra_rect_area(del_r, current, &intra_width, &intra_height); + if ((intra_width <= 0) || (intra_height <= 0)) + { + /* .---.current .---.del_r + * | | | | + * `---+---.del_r `---+---.current + * | | | | + * `---' `---' + * no interception, nothing to do + */ + prev_node = cur_node; + cur_node = cur_node->next; + } + else if ((intra_width == current.width) && + (intra_height == current.height)) + { + /* .-------.del_r + * | .---. | + * | | | | + * | `---'current + * `-------' + * current is contained, remove from rects + */ + cur_node = cur_node->next; + rect_list_del_next(rects, prev_node); + } + else + { + _split_strict(&modified, del_r, current); + cur_node = cur_node->next; + rect_list_del_next(rects, prev_node); + } + } + + rect_list_concat(rects, &modified); +} + +void +rect_list_add_split_strict(list_t *rects, list_node_t *node) +{ + list_t dirty = list_zeroed; + list_t new_dirty = list_zeroed; + list_node_t *cur_node; + + if (!rects->head) + { + rect_list_append_node(rects, node); + return; + } + + rect_list_append_node(&dirty, node); + + cur_node = rects->head; + while (dirty.head) + { + rect_t current; + + if (!cur_node) + { + rect_list_concat(rects, &dirty); + break; + } + + current = ((rect_node_t*)cur_node)->rect; + + while (dirty.head) + { + int intra_width, intra_height; + rect_t r; + + r = ((rect_node_t *)dirty.head)->rect; + _calc_intra_rect_area(r, current, &intra_width, &intra_height); + if ((intra_width == r.width) && (intra_height == r.height)) + /* .-------.cur + * | .---.r| + * | | | | + * | `---' | + * `-------' + */ + rect_list_del_next(&dirty, NULL); + else if ((intra_width <= 0) || (intra_height <= 0)) + { + /* .---.cur .---.r + * | | | | + * `---+---.r `---+---.cur + * | | | | + * `---' `---' + */ + list_node_t *tmp; + tmp = rect_list_unlink_next(&dirty, NULL); + rect_list_append_node(&new_dirty, tmp); + } + else + { + _split_strict(&new_dirty, current, r); + rect_list_del_next(&dirty, NULL); + } + } + dirty = new_dirty; + new_dirty = list_zeroed; + + cur_node = cur_node->next; + } +} + +static inline void +_calc_intra_outer_rect_area(const rect_t a, const rect_t b, + rect_t *intra, rect_t *outer) +{ + int min_left, max_left, min_right, max_right; + int min_top, max_top, min_bottom, max_bottom; + + if (a.left < b.left) + { + max_left = b.left; + min_left = a.left; + } + else + { + max_left = a.left; + min_left = b.left; + } + + if (a.right < b.right) + { + min_right = a.right; + max_right = b.right; + } + else + { + min_right = b.right; + max_right = a.right; + } + + intra->left = max_left; + intra->right = min_right; + intra->width = min_right - max_left; + + outer->left = min_left; + outer->right = max_right; + outer->width = max_right - min_left; + + if (a.top < b.top) + { + max_top = b.top; + min_top = a.top; + } + else + { + max_top = a.top; + min_top = b.top; + } + + if (a.bottom < b.bottom) + { + min_bottom = a.bottom; + max_bottom = b.bottom; + } + else + { + min_bottom = b.bottom; + max_bottom = a.bottom; + } + + intra->top = max_top; + intra->bottom = min_bottom; + intra->height = min_bottom - max_top; + if ((intra->width > 0) && (intra->height > 0)) + intra->area = intra->width * intra->height; + else + intra->area = 0; + + outer->top = min_top; + outer->bottom = max_bottom; + outer->height = max_bottom - min_top; + outer->area = outer->width * outer->height; +} + +enum +{ + SPLIT_FUZZY_ACTION_NONE, + SPLIT_FUZZY_ACTION_SPLIT, + SPLIT_FUZZY_ACTION_MERGE +}; + +static inline int +_split_fuzzy(list_t *dirty, const rect_t a, rect_t *b) +{ + int h_1, h_2, w_1, w_2, action; + + h_1 = a.top - b->top; + h_2 = b->bottom - a.bottom; + w_1 = a.left - b->left; + w_2 = b->right - a.right; + + action = SPLIT_FUZZY_ACTION_NONE; + + if (h_1 > 0) + { + /* .--.r (b) .---.r2 + * | | | | + * .-------.cur (a) .---.r '---' + * | | | | -> | | + + * | `--' | `---' + * `-------' + */ + rect_list_append_xywh(dirty, b->left, b->top, b->width, h_1); + b->height -= h_1; + b->top = a.top; + action = SPLIT_FUZZY_ACTION_SPLIT; + } + + if (h_2 > 0) + { + /* .-------.cur (a) + * | .---. | .---.r + * | | | | -> | | + * `-------' `---' + .---.r2 + * | | | | + * `---'r (b) `---' + */ + rect_list_append_xywh(dirty, b->left, a.bottom, b->width, h_2); + b->height -= h_2; + action = SPLIT_FUZZY_ACTION_SPLIT; + } + + if (((w_1 > 0) || (w_2 > 0)) && (a.height == b->height)) + return SPLIT_FUZZY_ACTION_MERGE; + + if (w_1 > 0) + { + /* (b) r .----.cur (a) + * .--|-. | .--.r2 .-.r + * | | | | -> | | + | | + * `--|-' | `--' `-' + * `----' + */ + rect_list_append_xywh(dirty, b->left, b->top, w_1, b->height); + /* not necessary to keep these, r (b) will be destroyed */ + /* b->width -= w_1; */ + /* b->left = a.left; */ + action = SPLIT_FUZZY_ACTION_SPLIT; + } + + if (w_2 > 0) + { + /* .----.cur (a) + * | | + * | .-|--.r (b) .-.r .--.r2 + * | | | | -> | | + | | + * | `-|--' `-' `--' + * `----' + */ + rect_list_append_xywh(dirty, a.right, b->top, w_2, b->height); + /* not necessary to keep these, r (b) will be destroyed */ + /* b->width -= w_2; */ + action = SPLIT_FUZZY_ACTION_SPLIT; + } + + return action; +} + +list_node_t * +rect_list_add_split_fuzzy(list_t *rects, list_node_t *node, int accepted_error) +{ + list_t dirty = list_zeroed; + list_node_t *old_last; + + old_last = rects->tail; + + if (!rects->head) + { + rect_list_append_node(rects, node); + return old_last; + } + + rect_list_append_node(&dirty, node); + while (dirty.head) + { + list_node_t *d_node, *cur_node, *prev_cur_node; + int keep_dirty; + rect_t r; + + d_node = rect_list_unlink_next(&dirty, NULL); + r = ((rect_node_t *)d_node)->rect; + + prev_cur_node = NULL; + cur_node = rects->head; + keep_dirty = 1; + while (cur_node) + { + int area, action; + rect_t current, intra, outer; + + current = ((rect_node_t *)cur_node)->rect; + + _calc_intra_outer_rect_area(r, current, &intra, &outer); + area = current.area + r.area - intra.area; + + if ((intra.width == r.width) && (intra.height == r.height)) + { + /* .-------.cur + * | .---.r| + * | | | | + * | `---' | + * `-------' + */ + keep_dirty = 0; + break; + } + else if ((intra.width == current.width) && + (intra.height == current.height)) + { + /* .-------.r + * | .---.cur + * | | | | + * | `---' | + * `-------' + */ + if (old_last == cur_node) + old_last = prev_cur_node; + cur_node = cur_node->next; + rect_list_del_next(rects, prev_cur_node); + } + else if ((outer.area - area) <= accepted_error) + { + /* .-----------. bounding box (outer) + * |.---. .---.| + * ||cur| |r || + * || | | || + * |`---' `---'| + * `-----------' + * merge them, remove both and add merged + */ + rect_node_t *n; + + if (old_last == cur_node) + old_last = prev_cur_node; + + n = (rect_node_t *)rect_list_unlink_next(rects, prev_cur_node); + n->rect = outer; + rect_list_append_node(&dirty, (list_node_t *)n); + + keep_dirty = 0; + break; + } + else if (intra.area <= accepted_error) + { + /* .---.cur .---.r + * | | | | + * `---+---.r `---+---.cur + * | | | | + * `---' `---' + * no split, no merge + */ + prev_cur_node = cur_node; + cur_node = cur_node->next; + } + else + { + /* split is required */ + action = _split_fuzzy(&dirty, current, &r); + if (action == SPLIT_FUZZY_ACTION_MERGE) + { + /* horizontal merge is possible: remove both, add merged */ + rect_node_t *n; + + if (old_last == cur_node) + old_last = prev_cur_node; + + n = (rect_node_t *) + rect_list_unlink_next(rects, prev_cur_node); + + n->rect.left = outer.left; + n->rect.width = outer.width; + n->rect.right = outer.right; + n->rect.area = outer.width * r.height; + rect_list_append_node(&dirty, (list_node_t *)n); + } + else if (action == SPLIT_FUZZY_ACTION_NONE) + { + /* + * this rect check was totally useless, + * should never happen + */ + /* prev_cur_node = cur_node; */ + /* cur_node = cur_node->next; */ + printf("Should not get here!\n"); + abort(); + } + + keep_dirty = 0; + break; + } + } + + if (UNLIKELY(keep_dirty)) rect_list_append_node(rects, d_node); + else rect_list_node_pool_put(d_node); + } + + return old_last; +} + +static inline void +_calc_outer_rect_area(const rect_t a, const rect_t b, rect_t *outer) +{ + int min_left, max_right; + int min_top, max_bottom; + + if (a.left < b.left) min_left = a.left; + else min_left = b.left; + + if (a.right < b.right) max_right = b.right; + else max_right = a.right; + + outer->left = min_left; + outer->right = max_right; + outer->width = max_right - min_left; + + if (a.top < b.top) min_top = a.top; + else min_top = b.top; + + if (a.bottom < b.bottom) max_bottom = b.bottom; + else max_bottom = a.bottom; + + outer->top = min_top; + outer->bottom = max_bottom; + outer->height = max_bottom - min_top; + + outer->area = outer->width * outer->height; +} + +void +rect_list_merge_rects(list_t *rects, list_t *to_merge, int accepted_error) +{ + while (to_merge->head) + { + list_node_t *node, *parent_node; + rect_t r1; + int merged; + + r1 = ((rect_node_t *)to_merge->head)->rect; + + merged = 0; + parent_node = NULL; + node = rects->head; + while (node != NULL) + { + rect_t r2, outer; + int area; + + r2 = ((rect_node_t *)node)->rect; + + _calc_outer_rect_area(r1, r2, &outer); + area = r1.area + r2.area; /* intra area is taken as 0 */ + if (outer.area - area <= accepted_error) + { + /* + * remove both r1 and r2, create r3 + * actually r3 uses r2 instance, saves memory + */ + rect_node_t *n; + + n = (rect_node_t *)rect_list_unlink_next(rects, parent_node); + n->rect = outer; + rect_list_append_node(to_merge, (list_node_t *)n); + merged = 1; + break; + } + + parent_node = node; + node = node->next; + } + + if (!merged) + { + list_node_t *n; + n = rect_list_unlink_next(to_merge, NULL); + rect_list_append_node(rects, n); + } + else + rect_list_del_next(to_merge, NULL); + } +} + +void +rect_list_add_split_fuzzy_and_merge(list_t *rects, + list_node_t *node, + int split_accepted_error, + int merge_accepted_error) +{ + list_node_t *n; + + n = rect_list_add_split_fuzzy(rects, node, split_accepted_error); + if (n && n->next) + { + list_t to_merge; + + /* split list into 2 segments, already merged and to merge */ + to_merge.head = n->next; + to_merge.tail = rects->tail; + rects->tail = n; + n->next = NULL; + + rect_list_merge_rects(rects, &to_merge, merge_accepted_error); + } +} +#endif /* EVAS_RECT_SPLIT */ + +#define TILE(tb, x, y) ((tb)->tiles.tiles[((y) * (tb)->tiles.w) + (x)]) + +#ifdef RECTUPDATE +#elif defined(EVAS_RECT_SPLIT) +#else +static int tilebuf_x_intersect(Tilebuf *tb, int x, int w, int *x1, int *x2, int *x1_fill, int *x2_fill); +static int tilebuf_y_intersect(Tilebuf *tb, int y, int h, int *y1, int *y2, int *y1_fill, int *y2_fill); +static int tilebuf_intersect(int tsize, int tlen, int tnum, int x, int w, int *x1, int *x2, int *x1_fill, int *x2_fill); +#endif +static void tilebuf_setup(Tilebuf *tb); + +EAPI void +evas_common_tilebuf_init(void) +{ +} + +EAPI Tilebuf * +evas_common_tilebuf_new(int w, int h) +{ + Tilebuf *tb; + + tb = calloc(1, sizeof(Tilebuf)); + if (!tb) return NULL; + + tb->tile_size.w = 8; + tb->tile_size.h = 8; + tb->outbuf_w = w; + tb->outbuf_h = h; + + return tb; +} + +EAPI void +evas_common_tilebuf_free(Tilebuf *tb) +{ +#ifdef RECTUPDATE + evas_common_regionbuf_free(tb->rb); +#elif defined(EVAS_RECT_SPLIT) + rect_list_clear(&tb->rects); + rect_list_node_pool_flush(); +#else + if (tb->tiles.tiles) free(tb->tiles.tiles); +#endif + free(tb); +} + +EAPI void +evas_common_tilebuf_set_tile_size(Tilebuf *tb, int tw, int th) +{ + tb->tile_size.w = tw; + tb->tile_size.h = th; + tilebuf_setup(tb); +} + +EAPI void +evas_common_tilebuf_get_tile_size(Tilebuf *tb, int *tw, int *th) +{ + if (tw) *tw = tb->tile_size.w; + if (th) *th = tb->tile_size.h; +} + +#ifdef EVAS_RECT_SPLIT +static inline int +_add_redraw(list_t *rects, int max_w, int max_h, int x, int y, int w, int h) +{ + rect_node_t *rn; + + if ((w <= 0) || (h <= 0)) return 0; + RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, max_w, max_h); + if ((w <= 0) || (h <= 0)) return 0; + + x >>= 1; + y >>= 1; + w += 2; + w >>= 1; + h += 2; + h >>= 1; + + rn = (rect_node_t *)rect_list_node_pool_get(); + rn->_lst = list_node_zeroed; + rect_init(&rn->rect, x, y, w, h); + //fprintf(stderr, "ACCOUNTING: add_redraw: %4d,%4d %3dx%3d\n", x, y, w, h); + //testing on my core2 duo desktop - fuzz of 32 or 48 is best. +#define FUZZ 32 + rect_list_add_split_fuzzy_and_merge(rects, (list_node_t *)rn, + FUZZ * FUZZ, FUZZ * FUZZ); + return 1; +} +#endif + +EAPI int +evas_common_tilebuf_add_redraw(Tilebuf *tb, int x, int y, int w, int h) +{ +#ifdef RECTUPDATE + int i; + + if ((w <= 0) || (h <= 0)) return 0; + RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, tb->outbuf_w, tb->outbuf_h); + if ((w <= 0) || (h <= 0)) return 0; + for (i = 0; i < h; i++) + evas_common_regionbuf_span_add(tb->rb, x, x + w - 1, y + i); + return 1; +#elif defined(EVAS_RECT_SPLIT) + return _add_redraw(&tb->rects, tb->outbuf_w, tb->outbuf_h, x, y, w, h); +#else + int tx1, tx2, ty1, ty2, tfx1, tfx2, tfy1, tfy2, xx, yy; + int num; + + if ((w <= 0) || (h <= 0)) return 0; + RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, tb->outbuf_w, tb->outbuf_h); + if ((w <= 0) || (h <= 0)) return 0; + num = 0; + /* wipes out any motion vectors in tiles it touches into redraws */ + if (tilebuf_x_intersect(tb, x, w, &tx1, &tx2, &tfx1, &tfx2) && + tilebuf_y_intersect(tb, y, h, &ty1, &ty2, &tfy1, &tfy2)) + { + Tilebuf_Tile *tbt; + int delta_x; + int delta_y; + + tbt = &(TILE(tb, tx1, ty1)); + delta_x = tx2 - tx1 + 1; + delta_y = ty2 - ty1 + 1; + for (yy = delta_y; yy > 0; yy--) + { + Tilebuf_Tile *tbti; + + tbti = tbt; + for (xx = delta_x; xx > 0; xx--) + { + tbti->redraw = 1; + tbti++; + } + tbt += tb->tiles.w; + } + num = (tx2 - tx1 + 1) * (ty2 - ty1 + 1); + } + return num; +#endif +} + +EAPI int +evas_common_tilebuf_del_redraw(Tilebuf *tb, int x, int y, int w, int h) +{ +#ifdef RECTUPDATE + int i; + + for (i = 0; i < h; i++) + evas_common_regionbuf_span_del(tb->rb, x, x + w - 1, y + i); +#elif defined(EVAS_RECT_SPLIT) + rect_t r; + + if (!tb->rects.head) return 0; + if ((w <= 0) || (h <= 0)) return 0; + RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, tb->outbuf_w, tb->outbuf_h); + if ((w <= 0) || (h <= 0)) return 0; + + x += 1; + y += 1; + x >>= 1; + y >>= 1; + w -= 1; + w >>= 1; + h -= 1; + h >>= 1; + + if ((w <= 0) || (h <= 0)) return 0; + + rect_init(&r, x, y, w, h); + //fprintf(stderr, "ACCOUNTING: del_redraw: %4d,%4d %3dx%3d\n", x, y, w, h); + + rect_list_del_split_strict(&tb->rects, r); + tb->need_merge = 1; + return 0; +#else + int tx1, tx2, ty1, ty2, tfx1, tfx2, tfy1, tfy2, xx, yy; + int num; + + num = 0; + /* wipes out any motion vectors in tiles it touches into redraws */ + if (tilebuf_x_intersect(tb, x, w, &tx1, &tx2, &tfx1, &tfx2) && + tilebuf_y_intersect(tb, y, h, &ty1, &ty2, &tfy1, &tfy2)) + { + Tilebuf_Tile *tbt; + int delta_y; + int delta_x; + + if (!tfx1) tx1++; + if (!tfx2) tx2--; + if (!tfy1) ty1++; + if (!tfy2) ty2--; + + tbt = &(TILE(tb, tx1, ty1)); + delta_x = tx2 - tx1 + 1; + delta_y = ty2 - ty1 + 1; + for (yy = delta_y; yy > 0; yy--) + { + Tilebuf_Tile *tbti; + + tbti = tbt; + for (xx = delta_x; xx > 0; xx--) + { + tbti->redraw = 0; + tbti++; + } + tbt += tb->tiles.w; + } + num = (tx2 - tx1 + 1) * (ty2 - ty1 + 1); + } + return num; +#endif +} + +EAPI int +evas_common_tilebuf_add_motion_vector(Tilebuf *tb, int x, int y, int w, int h, int dx, int dy, int alpha) +{ +#ifdef EVAS_RECT_SPLIT + list_t lr = list_zeroed; + int num; + + num = _add_redraw(&lr, tb->outbuf_w, tb->outbuf_h, x, y, w, h); + num += _add_redraw(&lr, tb->outbuf_w, tb->outbuf_h, x + dx, y + dy, w, h); + while (lr.head != NULL) + { + list_node_t *node = rect_list_unlink_next(&lr, NULL); + rect_list_add_split_fuzzy_and_merge(&tb->rects, node, + FUZZ * FUZZ, FUZZ * FUZZ); + } + return num; +#else + /* FIXME: need to actually impliment motion vectors. for now it just */ + /* implements redraws */ + int num; + + num = evas_common_tilebuf_add_redraw(tb, x, y, w, h); + num += evas_common_tilebuf_add_redraw(tb, x + dx, y + dy, w, h); + return num; +#endif +} + +EAPI void +evas_common_tilebuf_clear(Tilebuf *tb) +{ +#ifdef RECTUPDATE + evas_common_regionbuf_clear(tb->rb); +#elif defined(EVAS_RECT_SPLIT) + rect_list_clear(&tb->rects); + tb->need_merge = 0; +#else + if (!tb->tiles.tiles) return; + memset(tb->tiles.tiles, 0, tb->tiles.w * tb->tiles.h * sizeof(Tilebuf_Tile)); +#endif +} + +EAPI Tilebuf_Rect * +evas_common_tilebuf_get_render_rects(Tilebuf *tb) +{ +#ifdef RECTUPDATE + return evas_common_regionbuf_rects_get(tb->rb); +#elif defined(EVAS_RECT_SPLIT) + list_node_t *n; + Tilebuf_Rect *rects = NULL; + + if (tb->need_merge) { + list_t to_merge; + to_merge = tb->rects; + tb->rects = list_zeroed; + rect_list_merge_rects(&tb->rects, &to_merge, FUZZ * FUZZ); + tb->need_merge = 0; + } + + for (n = tb->rects.head; n != NULL; n = n->next) { + rect_t cur; + + cur = ((rect_node_t *)n)->rect; + + cur.left <<= 1; + cur.top <<= 1; + cur.width <<= 1; + cur.height <<= 1; + + RECTS_CLIP_TO_RECT(cur.left, cur.top, cur.width, cur.height, + 0, 0, tb->outbuf_w, tb->outbuf_h); + if ((cur.width > 0) && (cur.height > 0)) + { + Tilebuf_Rect *r; + + r = malloc(sizeof(Tilebuf_Rect)); + r->_list_data.next = NULL; + r->_list_data.prev = NULL; + r->_list_data.last = NULL; + r->x = cur.left; + r->y = cur.top; + r->w = cur.width; + r->h = cur.height; + + rects = evas_object_list_append(rects, r); + } + } + return rects; + +#else + Tilebuf_Rect *rects = NULL; + Tilebuf_Tile *tbt; + int x, y; + + tbt = &(TILE(tb, 0, 0)); + for (y = 0; y < tb->tiles.h; y++) + { + for (x = 0; x < tb->tiles.w; x++, tbt++) + { + if (tbt->redraw) + { + Tilebuf_Tile *tbti; + int can_expand_x = 1, can_expand_y = 1; + Tilebuf_Rect *r = NULL; + int xx = 0, yy = 0; + r = malloc(sizeof(Tilebuf_Rect)); + r->_list_data.next = NULL; + r->_list_data.prev = NULL; + r->_list_data.last = NULL; + +/* amalgamate tiles */ +#if 1 + tbti = tbt; + while (can_expand_x) + { + tbti++; + xx++; + if ((x + xx) >= tb->tiles.w) + can_expand_x = 0; + else if (!(tbti->redraw)) + can_expand_x = 0; + if (can_expand_x) + tbti->redraw = 0; + } + tbti = tbt; + while (can_expand_y) + { + int i; + + tbti += tb->tiles.w; + yy++; + if ((y + yy) >= tb->tiles.h) + can_expand_y = 0; + if (can_expand_y) + { + Tilebuf_Tile *tbtj; + + tbtj = tbti; + for (i = x; i < x + xx; i++, tbtj++) + { + if (!(tbtj->redraw)) + { + can_expand_y = 0; + break; + } + } + } + if (can_expand_y) + { + Tilebuf_Tile *tbtj; + + tbtj = tbti; + for (i = x; i < x + xx; i++, tbtj++) + tbtj->redraw = 0; + } + } + tbt->redraw = 0; +#else + xx = 1; + yy = 1; +#endif + r->x = x * tb->tile_size.w; + r->y = y * tb->tile_size.h; + r->w = (xx) * tb->tile_size.w; + r->h = (yy) * tb->tile_size.h; + rects = evas_object_list_append(rects, r); + x = x + (xx - 1); + tbt += xx - 1; + } + } + } + return rects; +#endif +} + +EAPI void +evas_common_tilebuf_free_render_rects(Tilebuf_Rect *rects) +{ + while (rects) + { + Tilebuf_Rect *r; + + r = rects; + rects = evas_object_list_remove(rects, r); + free(r); + } +} + +/* need a way of getting rectangles to: blit, re-render */ + + + + + +/* internal usage */ + +static void +tilebuf_setup(Tilebuf *tb) +{ + if ((tb->outbuf_w <= 0) || (tb->outbuf_h <= 0)) return; +#ifdef RECTUPDATE + tb->rb = evas_common_regionbuf_new(tb->outbuf_w, tb->outbuf_h); +#elif defined(EVAS_RECT_SPLIT) + tb->rects = list_zeroed; +#else + if (tb->tiles.tiles) free(tb->tiles.tiles); + tb->tiles.tiles = NULL; + + tb->tiles.w = (tb->outbuf_w + (tb->tile_size.w - 1)) / tb->tile_size.w; + tb->tiles.h = (tb->outbuf_h + (tb->tile_size.h - 1)) / tb->tile_size.h; + + tb->tiles.tiles = malloc(tb->tiles.w * tb->tiles.h * sizeof(Tilebuf_Tile)); + + if (!tb->tiles.tiles) + { + tb->tiles.w = 0; + tb->tiles.h = 0; + return; + } + memset(tb->tiles.tiles, 0, tb->tiles.w * tb->tiles.h * sizeof(Tilebuf_Tile)); +#endif +} + +#ifdef RECTUPDATE +#elif defined(EVAS_RECT_SPLIT) +#else +static int +tilebuf_x_intersect(Tilebuf *tb, int x, int w, int *x1, int *x2, int *x1_fill, int *x2_fill) +{ + return tilebuf_intersect(tb->tile_size.w, tb->outbuf_w, tb->tiles.w, + x, w, x1, x2, x1_fill, x2_fill); +} + +static int +tilebuf_y_intersect(Tilebuf *tb, int y, int h, int *y1, int *y2, int *y1_fill, int *y2_fill) +{ + return tilebuf_intersect(tb->tile_size.h, tb->outbuf_h, tb->tiles.h, + y, h, y1, y2, y1_fill, y2_fill); +} + +static int +tilebuf_intersect(int tsize, int tlen, int tnum, int x, int w, int *x1, int *x2, int *x1_fill, int *x2_fill) +{ + int p1, p2; + + /* initial clip out of region */ + if ((x + w) <= 0) return 0; + if (x >= tlen) return 0; + + /* adjust x & w so it all fits in region */ + if (x < 0) + { + w += x; + x = 0; + } + if (w < 0) return 0; + if ((x + w) > tlen) w = tlen - x; + + /* now figure if the first edge is fully filling its tile */ + p1 = (x) / tsize; + if ((p1 * tsize) == (x)) *x1_fill = 1; + else *x1_fill = 0; + *x1 = p1; + + /* now figure if the last edge is fully filling its tile */ + p2 = (x + w - 1) / tsize; + if (((p2 + 1) * tsize) == (x + w)) *x2_fill = 1; + else *x2_fill = 0; + *x2 = p2; + + return 1; + tnum = 0; +} +#endif diff --git a/src/lib/engines/common_16/.cvsignore b/src/lib/engines/common_16/.cvsignore new file mode 100644 index 0000000..093d74e --- /dev/null +++ b/src/lib/engines/common_16/.cvsignore @@ -0,0 +1,6 @@ +Makefile.in +Makefile +.deps +.libs +libevas_engine_common_16.la +*.lo diff --git a/src/lib/engines/common_16/Makefile.am b/src/lib/engines/common_16/Makefile.am new file mode 100644 index 0000000..84321db --- /dev/null +++ b/src/lib/engines/common_16/Makefile.am @@ -0,0 +1,29 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +@FREETYPE_CFLAGS@ \ +@VALGRIND_CFLAGS@ \ +@EET_CFLAGS@ \ +@pthread_cflags@ + +noinst_LTLIBRARIES = libevas_engine_common_16.la + +libevas_engine_common_16_la_SOURCES = \ +evas_soft16_dither_mask.c \ +evas_soft16_font.c \ +evas_soft16_image_scaled_sampled.c \ +evas_soft16_image_unscaled.c \ +evas_soft16_main.c \ +evas_soft16_rectangle.c \ +evas_soft16_line.c \ +evas_soft16_polygon.c + +libevas_engine_common_16_la_DEPENDENCIES = $(top_builddir)/config.h + +EXTRA_DIST = \ +evas_soft16_scanline_blend.c \ +evas_soft16_scanline_fill.c diff --git a/src/lib/engines/common_16/evas_soft16_dither_mask.c b/src/lib/engines/common_16/evas_soft16_dither_mask.c new file mode 100644 index 0000000..9414e9a --- /dev/null +++ b/src/lib/engines/common_16/evas_soft16_dither_mask.c @@ -0,0 +1,294 @@ +#include "evas_common_soft16.h" + +#define S16_DM_SIZE 128 +#define S16_DM_BITS 6 +#define S16_DM_DIV 64 +#define S16_DM_MSK (S16_DM_SIZE - 1) +#define S16_DM_SHF(_b) (S16_DM_BITS - (8 - _b)) + +static const DATA8 dither_table[S16_DM_SIZE][S16_DM_SIZE] = +{ + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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, 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 } +}; + +static always_inline void +_soft16_convert_from_rgba_pt(const DATA32 *src, DATA16 *dst, DATA8 *alpha, + const int x, const int y) +{ + DATA8 orig_r, orig_g, orig_b, orig_a; + + orig_r = R_VAL(src); + orig_g = G_VAL(src); + orig_b = B_VAL(src); + orig_a = A_VAL(src); + + if (orig_a == 255) + { + DATA8 dith5, dith6, dith, r, g, b; + + dith = dither_table[x & S16_DM_MSK][y & S16_DM_MSK]; + dith5 = dith >> S16_DM_SHF(5); + dith6 = dith >> S16_DM_SHF(6); + + r = orig_r >> 3; + g = orig_g >> 2; + b = orig_b >> 3; + + if (((orig_r - (r << 3)) >= dith5) && (r < 0x1f)) r++; + if (((orig_g - (g << 2)) >= dith6) && (g < 0x3f)) g++; + if (((orig_b - (b << 3)) >= dith5) && (b < 0x1f)) b++; + + *dst = (r << 11) | (g << 5) | b; + *alpha = 31; + } + else if (orig_a == 0) + { + *dst = 0; + *alpha = 0; + } + else + { + DATA8 r, g, b, a; + r = orig_r >> 3; + g = orig_g >> 2; + b = orig_b >> 3; + a = (orig_a >> 3) + 1; + + *dst = (r << 11) | (g << 5) | b; + *alpha = a; + } +} + +static inline void +_soft16_convert_from_rgba_scanline(const DATA32 *src, DATA16 *dst, + DATA8 *alpha, const int y, const int w) +{ + int x, m; + + m = (w & ~7); + x = 0; + pld(src, 0); + + while (x < m) + { + pld(src, 32); + UNROLL8({ + _soft16_convert_from_rgba_pt(src, dst, alpha, x, y); + src++; + dst++; + alpha++; + x++; + }); + } + + for (; x < w; x++, src++, dst++, alpha++) + _soft16_convert_from_rgba_pt(src, dst, alpha, x, y); +} + +void +soft16_image_convert_from_rgba(Soft16_Image *im, const DATA32 *src) +{ + const DATA32 *sp; + DATA16 *dp; + DATA8 *ap; + int y; + + sp = src; + dp = im->pixels; + ap = im->alpha; + + for (y = 0; y < im->cache_entry.h; y++, sp += im->cache_entry.w, dp += im->stride, ap += im->stride) + _soft16_convert_from_rgba_scanline(sp, dp, ap, y, im->cache_entry.w); +} + +static always_inline void +_soft16_convert_from_rgb_pt(const DATA32 *src, DATA16 *dst, + const int x, const int y) +{ + DATA8 orig_r, orig_g, orig_b, r, g, b, dith5, dith6, dith; + + orig_r = R_VAL(src); + orig_g = G_VAL(src); + orig_b = B_VAL(src); + + r = orig_r >> 3; + g = orig_g >> 2; + b = orig_b >> 3; + + dith = dither_table[x & S16_DM_MSK][y & S16_DM_MSK]; + dith5 = dith >> S16_DM_SHF(5); + dith6 = dith >> S16_DM_SHF(6); + + if (((orig_r - (r << 3)) >= dith5) && (r < 0x1f)) r++; + if (((orig_g - (g << 2)) >= dith6) && (g < 0x3f)) g++; + if (((orig_b - (b << 3)) >= dith5) && (b < 0x1f)) b++; + + *dst = (r << 11) | (g << 5) | b; +} + +static inline void +_soft16_convert_from_rgb_scanline(const DATA32 *src, DATA16 *dst, const int y, + const int w) +{ + int x, m; + + m = (w & ~7); + x = 0; + pld(src, 0); + + while (x < m) + { + pld(src, 32); + UNROLL8({ + _soft16_convert_from_rgb_pt(src, dst, x, y); + src++; + dst++; + x++; + }); + } + + for (; x < w; x++, src++, dst++) + _soft16_convert_from_rgb_pt(src, dst, x, y); +} + +void +soft16_image_convert_from_rgb(Soft16_Image *im, const DATA32 *src) +{ + const DATA32 *sp; + DATA16 *dp; + int y, pad; + + sp = src; + dp = im->pixels; + pad = im->stride - im->cache_entry.w; + + for (y = 0; y < im->cache_entry.h; y++, sp += im->cache_entry.w, dp += im->stride) + _soft16_convert_from_rgb_scanline(sp, dp, y, im->cache_entry.w); +} diff --git a/src/lib/engines/common_16/evas_soft16_font.c b/src/lib/engines/common_16/evas_soft16_font.c new file mode 100644 index 0000000..0874332 --- /dev/null +++ b/src/lib/engines/common_16/evas_soft16_font.c @@ -0,0 +1,302 @@ +#include "evas_common_soft16.h" +#include "evas_soft16_scanline_blend.c" + +static always_inline void +_glyph_pt_mask_solid_solid(DATA16 *dst, + const DATA16 rgb565, + const DATA32 rgb565_unpack, + const DATA8 *mask) +{ + DATA8 alpha = *mask >> 3; + + if (alpha == 31) *dst = rgb565; + else if (alpha > 0) + { + DATA32 d; + + d = RGB_565_UNPACK(*dst); + d = RGB_565_UNPACKED_BLEND_UNMUL(rgb565_unpack, d, alpha); + *dst = RGB_565_PACK(d); + } +} + +static void +_glyph_scanline_mask_solid_solid(DATA16 *dst, + int size, + const DATA16 rgb565, + const DATA32 rgb565_unpack, + const DATA8 *mask) +{ + DATA16 *start, *end; + + start = dst; + pld(start, 0); + pld(mask, 0); + end = start + (size & ~3); + + while (start < end) + { + pld(start, 16); + pld(mask, 4); + UNROLL4({ + _glyph_pt_mask_solid_solid(start, rgb565, rgb565_unpack, mask); + start++; + mask++; + }); + } + + end = start + (size & 3); + for (; start < end; start++, mask++) + _glyph_pt_mask_solid_solid(start, rgb565, rgb565_unpack, mask); +} + +static always_inline void +_glyph_pt_mask_transp_solid(DATA16 *dst, + DATA32 rgb565_unpack, + DATA8 alpha, + const DATA8 *mask) +{ + DATA32 a, b; + int rel_alpha; + + rel_alpha = *mask >> 3; + alpha = (alpha * rel_alpha) >> 5; + if (alpha == 0) + return; + + alpha++; + + a = ((rgb565_unpack * rel_alpha) >> 5) & RGB_565_UNPACKED_MASK; + b = RGB_565_UNPACK(*dst); + b = RGB_565_UNPACKED_BLEND(a, b, alpha); + *dst = RGB_565_PACK(b); +} + +static void +_glyph_scanline_mask_transp_solid(DATA16 *dst, + int size, + const DATA32 rgb565_unpack, + const DATA8 rel_alpha, + const DATA8 *mask) +{ + DATA16 *start, *end; + + start = dst; + pld(start, 0); + pld(mask, 0); + end = start + (size & ~3); + + while (start < end) + { + pld(start, 16); + pld(mask, 4); + UNROLL4({ + _glyph_pt_mask_transp_solid(start, rgb565_unpack, rel_alpha, mask); + start++; + mask++; + }); + } + + end = start + (size & 3); + for (; start < end; start++, mask++) + _glyph_pt_mask_transp_solid(start, rgb565_unpack, rel_alpha, mask); +} + +static inline void +_calc_ext(const Soft16_Image *dst, const RGBA_Draw_Context *dc, + Evas_Rectangle *ext) +{ + ext->x = 0; + ext->y = 0; + ext->w = dst->cache_entry.w; + ext->h = dst->cache_entry.h; + + if (dc->clip.use) + { + int v; + + ext->x = dc->clip.x; + ext->y = dc->clip.y; + ext->w = dc->clip.w; + ext->h = dc->clip.h; + if (ext->x < 0) + { + ext->w += ext->x; + ext->x = 0; + } + if (ext->y < 0) + { + ext->h += ext->y; + ext->y = 0; + } + + v = dst->cache_entry.w - ext->x; + if (ext->w > v) ext->w = v; + + v = dst->cache_entry.h - ext->y; + if (ext->h > v) ext->h = v; + } +} + +static inline void +_glyph_scanline(Soft16_Image *dst, const DATA8 *p_mask, + const Evas_Rectangle ext, int dx, int dy, int max_x, int max_y, + int w, DATA8 alpha, const DATA16 rgb565, + const DATA32 rgb565_unpack) +{ + int size, in_x, in_w; + DATA16 *p_pixels; + + if ((dx >= max_x) || (dy < ext.y) || (dy >= max_y)) return; + + in_x = 0; + in_w = 0; + + if (dx + w > max_x) in_w += (dx + w) - max_x; + + if (dx < ext.x) + { + in_w += ext.x - dx; + in_x = ext.x - dx; + dx = ext.x; + } + + size = w - in_w; + p_pixels = dst->pixels + (dy * dst->stride) + dx; + p_mask += in_x; + + if (size > 1) + { + if (alpha == 31) + _glyph_scanline_mask_solid_solid + (p_pixels, size, rgb565, rgb565_unpack, p_mask); + else if (alpha != 0) + _glyph_scanline_mask_transp_solid + (p_pixels, size, rgb565_unpack, alpha, p_mask); + } + else if (size == 1) + { + if (alpha == 31) + _glyph_pt_mask_solid_solid(p_pixels, rgb565, rgb565_unpack, p_mask); + else if (alpha != 0) + _glyph_pt_mask_transp_solid(p_pixels, rgb565_unpack, alpha, p_mask); + } +} + +static void +_soft16_font_glyph_draw_grayscale(Soft16_Image *dst, + RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, + int x, int y, DATA8 alpha, DATA16 rgb565, + const Evas_Rectangle ext, int bw, int bh, + int bpitch, const DATA8 *bitmap) +{ + const DATA32 rgb565_unpack = RGB_565_UNPACK(rgb565); + int i, max_x, max_y; + + max_x = ext.x + ext.w; + max_y = ext.y + ext.h; + + for (i = 0; i < bh; i++, bitmap += bpitch) + _glyph_scanline(dst, bitmap, ext, x, y + i, max_x, max_y, bw, + alpha, rgb565, rgb565_unpack); +} + +static inline void +_glyph_create_mask_line(DATA8 *mask, const DATA8 *bitmap, int w) +{ + const DATA8 bitrepl[2] = {0x0, 0xff}; + int i; + + for (i = 0; i < w; i += 8, bitmap++) + { + int j, size; + DATA32 bits; + + if (i + 8 < w) size = 8; + else size = w - i; + + bits = *bitmap; + + for (j = size - 1; j >= 0; j--, mask++) + *mask = bitrepl[(bits >> j) & 0x1]; + } +} + +static void +_soft16_font_glyph_draw_mono(Soft16_Image *dst, + RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, + int x, int y, DATA8 alpha, DATA16 rgb565, + const Evas_Rectangle ext, int bw, int bh, + int bpitch, const DATA8 *bitmap) +{ + const DATA32 rgb565_unpack = RGB_565_UNPACK(rgb565); + DATA8 *mask; + int i, max_x, max_y; + + max_x = ext.x + ext.w; + max_y = ext.y + ext.h; + + mask = alloca(bpitch); + for (i = 0; i < bh; i++, bitmap += bpitch) + { + _glyph_create_mask_line(mask, bitmap, bw); + _glyph_scanline(dst, mask, ext, x, y + i, max_x, max_y, bw, + alpha, rgb565, rgb565_unpack); + } +} + +void +soft16_font_glyph_draw(void *data, void *dest, void *context, + RGBA_Font_Glyph *fg, int x, int y) +{ + Soft16_Image *dst; + RGBA_Draw_Context *dc; + const DATA8 *bitmap; + DATA8 alpha, r, g, b; + DATA16 rgb565; + Evas_Rectangle ext; + int bpitch, bw, bh; + + dst = data; + dc = context; + + alpha = A_VAL(&dc->col.col) >> 3; + if (alpha == 0) return; /* precision is 5 bits, 3 bits lost */ + + r = R_VAL(&dc->col.col) >> 3; + g = G_VAL(&dc->col.col) >> 2; + b = B_VAL(&dc->col.col) >> 3; + + if (r > alpha) r = alpha; + if (g > (alpha << 1)) g = (alpha << 1); + if (b > alpha) b = alpha; + + rgb565 = (r << 11) | (g << 5) | b; + + bitmap = fg->glyph_out->bitmap.buffer; + bh = fg->glyph_out->bitmap.rows; + bw = fg->glyph_out->bitmap.width; + bpitch = fg->glyph_out->bitmap.pitch; + if (bpitch < bw) bpitch = bw; + + _calc_ext(dst, dc, &ext); + + if ((fg->glyph_out->bitmap.num_grays == 256) && + (fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays)) + _soft16_font_glyph_draw_grayscale(dst, dc, fg, x, y, alpha, rgb565, + ext, bw, bh, bpitch, bitmap); + else + _soft16_font_glyph_draw_mono(dst, dc, fg, x, y, alpha, rgb565, + ext, bw, bh, bpitch, bitmap); +} + +void * +soft16_font_glyph_new(void *data, RGBA_Font_Glyph *fg) +{ + return (void *)1; /* core requires != NULL to work */ +} + +void +soft16_font_glyph_free(void *ext_dat) +{ +} diff --git a/src/lib/engines/common_16/evas_soft16_image_scaled_sampled.c b/src/lib/engines/common_16/evas_soft16_image_scaled_sampled.c new file mode 100644 index 0000000..1a8f5cc --- /dev/null +++ b/src/lib/engines/common_16/evas_soft16_image_scaled_sampled.c @@ -0,0 +1,474 @@ +#include "evas_common_soft16.h" +#include "evas_soft16_scanline_blend.c" + +static void +_soft16_image_draw_scaled_solid_solid(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + DATA16 *dst_itr; + int y, w_align; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + int x; + + s = src->pixels + offset_y[y]; + pld(s, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(offset_x + x, 32); + + UNROLL8({ + _soft16_pt_blend_solid_solid(d, s[offset_x[x]]); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_solid_solid(d, s[offset_x[x]]); + } +} +static void +_soft16_image_draw_scaled_transp_solid(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + DATA16 *dst_itr; + int y, w_align; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + DATA8 *a; + int x; + + s = src->pixels + offset_y[y]; + a = src->alpha + offset_y[y]; + pld(s, 0); + pld(a, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(a, 8); + pld(offset_x + x, 32); + + UNROLL8({ + int off_x = offset_x[x]; + _soft16_pt_blend_transp_solid(d, s[off_x], a[off_x]); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_transp_solid(d, s[offset_x[x]], a[offset_x[x]]); + } +} + +static inline void +_soft16_image_draw_scaled_no_mul(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + if ((src->cache_entry.flags.alpha && src->alpha) && + (!dst->cache_entry.flags.alpha)) + _soft16_image_draw_scaled_transp_solid + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + else if (!dst->cache_entry.flags.alpha) + _soft16_image_draw_scaled_solid_solid + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + else + fprintf(stderr, + "Unsupported draw of scaled images src->cache_entry.flags.alpha=%d, " + "dst->cache_entry.flags.alpha=%d, WITHOUT COLOR MUL\n", + src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha); +} + +static void +_soft16_image_draw_scaled_solid_solid_mul_alpha(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y, + DATA8 alpha) +{ + DATA16 *dst_itr; + int y, w_align; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + int x; + + s = src->pixels + offset_y[y]; + pld(s, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(offset_x + x, 32); + + UNROLL8({ + _soft16_pt_blend_solid_solid_mul_alpha + (d, s[offset_x[x]], alpha); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_solid_solid_mul_alpha + (d, s[offset_x[x]], alpha); + } +} + +static void +_soft16_image_draw_scaled_transp_solid_mul_alpha(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y, + DATA8 alpha) +{ + DATA16 *dst_itr; + int y, w_align; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + DATA8 *a; + int x; + + s = src->pixels + offset_y[y]; + a = src->alpha + offset_y[y]; + pld(s, 0); + pld(a, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(a, 8); + pld(offset_x + x, 32); + + UNROLL8({ + int off_x = offset_x[x]; + _soft16_pt_blend_transp_solid_mul_alpha + (d, s[off_x], a[off_x], alpha); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_transp_solid_mul_alpha + (d, s[offset_x[x]], a[offset_x[x]], alpha); + } +} + +static inline void +_soft16_image_draw_scaled_mul_alpha(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y, DATA8 a) +{ + if ((src->cache_entry.flags.alpha && src->alpha) && + (!dst->cache_entry.flags.alpha)) + _soft16_image_draw_scaled_transp_solid_mul_alpha + (src, dst, dc, dst_offset, w, h, offset_x, offset_y, a); + else if (!dst->cache_entry.flags.alpha) + _soft16_image_draw_scaled_solid_solid_mul_alpha + (src, dst, dc, dst_offset, w, h, offset_x, offset_y, a); + else + fprintf(stderr, + "Unsupported draw of scaled images src->cache_entry.flags.alpha=%d, " + "dst->cache_entry.flags.alpha=%d, WITH ALPHA MUL %d\n", + src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha, A_VAL(&dc->mul.col)); +} + +static void +_soft16_image_draw_scaled_solid_solid_mul_color(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y, + DATA8 r, DATA8 g, DATA8 b, + DATA8 alpha) +{ + DATA16 *dst_itr; + int y, w_align; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + + if (alpha == 31) + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + int x; + + s = src->pixels + offset_y[y]; + pld(s, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(offset_x + x, 32); + + UNROLL8({ + _soft16_pt_blend_solid_solid_mul_color_solid + (d, s[offset_x[x]], r, g, b); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_solid_solid_mul_color_solid + (d, s[offset_x[x]], r, g, b); + } + else + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + int x; + + s = src->pixels + offset_y[y]; + pld(s, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(offset_x + x, 32); + + UNROLL8({ + _soft16_pt_blend_solid_solid_mul_color_transp + (d, s[offset_x[x]], alpha, r, g, b); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_solid_solid_mul_color_transp + (d, s[offset_x[x]], alpha, r, g, b); + } +} + +static void +_soft16_image_draw_scaled_transp_solid_mul_color(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y, + DATA8 r, DATA8 g, DATA8 b, + DATA8 alpha) +{ + DATA16 *dst_itr; + int y, w_align; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + + if (alpha == 31) + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + DATA8 *a; + int x; + + s = src->pixels + offset_y[y]; + a = src->alpha + offset_y[y]; + pld(s, 0); + pld(a, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(a, 8); + pld(offset_x + x, 32); + + UNROLL8({ + int off_x = offset_x[x]; + _soft16_pt_blend_transp_solid_mul_color_solid + (d, s[off_x], a[off_x], r, g, b); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_transp_solid_mul_color_solid + (d, s[offset_x[x]], a[offset_x[x]], r, g, b); + } + else + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + DATA8 *a; + int x; + + s = src->pixels + offset_y[y]; + a = src->alpha + offset_y[y]; + pld(s, 0); + pld(a, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(a, 8); + pld(offset_x + x, 32); + + UNROLL8({ + int off_x = offset_x[x]; + _soft16_pt_blend_transp_solid_mul_color_transp + (d, s[off_x], a[off_x], alpha, r, g, b); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_transp_solid_mul_color_transp + (d, s[offset_x[x]], a[offset_x[x]], alpha, r, g, b); + } +} + +static inline void +_soft16_image_draw_scaled_mul_color(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y, + DATA8 r, DATA8 g, DATA8 b, DATA8 a) +{ + if ((src->cache_entry.flags.alpha && src->alpha) && + (!dst->cache_entry.flags.alpha)) + _soft16_image_draw_scaled_transp_solid_mul_color + (src, dst, dc, dst_offset, w, h, offset_x, offset_y, r, g, b, a); + else if (!dst->cache_entry.flags.alpha) + _soft16_image_draw_scaled_solid_solid_mul_color + (src, dst, dc, dst_offset, w, h, offset_x, offset_y, r, g, b, a); + else + fprintf(stderr, + "Unsupported draw of scaled images src->cache_entry.flags.alpha=%d, " + "dst->cache_entry.flags.alpha=%d, WITH COLOR MUL 0x%08x\n", + src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha, dc->mul.col); +} + +static inline void +_soft16_image_draw_scaled_mul(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y, DATA8 r, DATA8 g, + DATA8 b, DATA8 a) +{ + if ((a == r) && (a == (g >> 1)) && (a == b)) + _soft16_image_draw_scaled_mul_alpha + (src, dst, dc, dst_offset, w, h, offset_x, offset_y, a); + else + _soft16_image_draw_scaled_mul_color + (src, dst, dc, dst_offset, w, h, offset_x, offset_y, r, g, b, a); +} + +void +soft16_image_draw_scaled_sampled(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + const Evas_Rectangle sr, + const Evas_Rectangle dr, + const Evas_Rectangle cr) +{ + int x, y, dst_offset, *offset_x, *offset_y; + DATA16 mul_rgb565; + DATA8 r, g, b, a; + + if (!dc->mul.use) + { + r = b = a = 31; + g = 63; + mul_rgb565 = 0xffff; + } + else + { + a = A_VAL(&dc->mul.col) >> 3; + if (a == 0) + return; + + r = R_VAL(&dc->mul.col) >> 3; + g = G_VAL(&dc->mul.col) >> 2; + b = B_VAL(&dc->mul.col) >> 3; + + if (r > a) r = a; + if (g > (a << 1)) g = (a << 1); + if (b > a) b = a; + + mul_rgb565 = (r << 11) || (g << 5) | b; + } + + /* pre-calculated scale tables */ + offset_x = alloca(cr.w * sizeof(*offset_x)); + for (x = 0; x < cr.w; x++) + offset_x[x] = (((x + cr.x - dr.x) * sr.w) / dr.w) + sr.x; + + offset_y = alloca(cr.h * sizeof(*offset_y)); + for (y = 0; y < cr.h; y++) + offset_y[y] = (((((y + cr.y - dr.y) * sr.h) / dr.h) + sr.y) + * src->stride); + + dst_offset = cr.x + (cr.y * dst->stride); + + + if (mul_rgb565 == 0xffff) + _soft16_image_draw_scaled_no_mul + (src, dst, dc, dst_offset, cr.w, cr.h, offset_x, offset_y); + else + _soft16_image_draw_scaled_mul + (src, dst, dc, dst_offset, cr.w, cr.h, offset_x, offset_y, r, g, b, a); +} diff --git a/src/lib/engines/common_16/evas_soft16_image_unscaled.c b/src/lib/engines/common_16/evas_soft16_image_unscaled.c new file mode 100644 index 0000000..f22e269 --- /dev/null +++ b/src/lib/engines/common_16/evas_soft16_image_unscaled.c @@ -0,0 +1,290 @@ +#include "evas_common_soft16.h" +#include "evas_soft16_scanline_blend.c" + +static void +_soft16_image_draw_unscaled_solid_solid(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, int dst_offset, + int w, int h) +{ + DATA16 *src_itr, *dst_itr; + int y; + + src_itr = src->pixels + src_offset; + dst_itr = dst->pixels + dst_offset; + + for (y = 0; y < h; y++) + { + _soft16_scanline_blend_solid_solid(src_itr, dst_itr, w); + src_itr += src->stride; + dst_itr += dst->stride; + } +} + +static void +_soft16_image_draw_unscaled_transp_solid(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, int dst_offset, + int w, int h) + +{ + DATA16 *src_itr, *dst_itr; + DATA8 *alpha_itr; + int y; + + src_itr = src->pixels + src_offset; + alpha_itr = src->alpha + src_offset; + dst_itr = dst->pixels + dst_offset; + + for (y = 0; y < h; y++) + { + _soft16_scanline_blend_transp_solid(src_itr, alpha_itr, dst_itr, w); + src_itr += src->stride; + alpha_itr += src->stride; + dst_itr += dst->stride; + } +} + +static inline void +_soft16_image_draw_unscaled_no_mul(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, int dst_offset, + int width, int height) +{ + if (src->cache_entry.flags.alpha && (!dst->cache_entry.flags.alpha)) + _soft16_image_draw_unscaled_transp_solid(src, dst, dc, + src_offset, dst_offset, + width, height); + else if ((!src->cache_entry.flags.alpha) && (!dst->cache_entry.flags.alpha)) + _soft16_image_draw_unscaled_solid_solid(src, dst, dc, + src_offset, dst_offset, + width, height); + else + fprintf(stderr, + "Unsupported draw of unscaled images src->cache_entry.flags.alpha=%d, " + "dst->cache_entry.flags.alpha=%d, WITHOUT COLOR MUL\n", + src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha); +} + +static void +_soft16_image_draw_unscaled_solid_solid_mul_alpha(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, + int dst_offset, + int w, int h, DATA8 a) +{ + DATA16 *src_itr, *dst_itr; + int y; + + src_itr = src->pixels + src_offset; + dst_itr = dst->pixels + dst_offset; + + for (y = 0; y < h; y++) + { + _soft16_scanline_blend_solid_solid_mul_alpha(src_itr, dst_itr, w, a); + src_itr += src->stride; + dst_itr += dst->stride; + } +} + +static void +_soft16_image_draw_unscaled_transp_solid_mul_alpha(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, + int dst_offset, + int w, int h, DATA8 a) + +{ + DATA16 *src_itr, *dst_itr; + DATA8 *alpha_itr; + int y; + + src_itr = src->pixels + src_offset; + alpha_itr = src->alpha + src_offset; + dst_itr = dst->pixels + dst_offset; + + for (y = 0; y < h; y++) + { + _soft16_scanline_blend_transp_solid_mul_alpha(src_itr, alpha_itr, + dst_itr, w, a); + src_itr += src->stride; + alpha_itr += src->stride; + dst_itr += dst->stride; + } +} + +static inline void +_soft16_image_draw_unscaled_mul_alpha(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, int dst_offset, + int width, int height, DATA8 a) +{ + if (src->cache_entry.flags.alpha && (!dst->cache_entry.flags.alpha)) + _soft16_image_draw_unscaled_transp_solid_mul_alpha + (src, dst, dc, src_offset, dst_offset, width, height, a); + else if ((!src->cache_entry.flags.alpha) && (!dst->cache_entry.flags.alpha)) + _soft16_image_draw_unscaled_solid_solid_mul_alpha + (src, dst, dc, src_offset, dst_offset, width, height, a); + else + fprintf(stderr, + "Unsupported draw of unscaled images src->cache_entry.flags.alpha=%d, " + "dst->cache_entry.flags.alpha=%d, WITH ALPHA MUL %d\n", + src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha, A_VAL(&dc->mul.col)); +} + +static void +_soft16_image_draw_unscaled_solid_solid_mul_color(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, + int dst_offset, + int w, int h, DATA8 r, + DATA8 g, DATA8 b, DATA8 a) +{ + DATA16 *src_itr, *dst_itr; + int y; + + src_itr = src->pixels + src_offset; + dst_itr = dst->pixels + dst_offset; + + if (a == 31) + for (y = 0; y < h; y++) + { + _soft16_scanline_blend_solid_solid_mul_color_solid + (src_itr, dst_itr, w, r, g, b); + src_itr += src->stride; + dst_itr += dst->stride; + } + else + for (y = 0; y < h; y++) + { + _soft16_scanline_blend_solid_solid_mul_color_transp + (src_itr, dst_itr, w, a, r, g, b); + src_itr += src->stride; + dst_itr += dst->stride; + } +} + +static void +_soft16_image_draw_unscaled_transp_solid_mul_color(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, + int dst_offset, + int w, int h, DATA8 r, + DATA8 g, DATA8 b, DATA8 a) + +{ + DATA16 *src_itr, *dst_itr; + DATA8 *alpha_itr; + int y; + + src_itr = src->pixels + src_offset; + alpha_itr = src->alpha + src_offset; + dst_itr = dst->pixels + dst_offset; + + if (a == 31) + for (y = 0; y < h; y++) + { + _soft16_scanline_blend_transp_solid_mul_color_solid + (src_itr, alpha_itr, dst_itr, w, r, g, b); + src_itr += src->stride; + alpha_itr += src->stride; + dst_itr += dst->stride; + } + else + for (y = 0; y < h; y++) + { + _soft16_scanline_blend_transp_solid_mul_color_transp + (src_itr, alpha_itr, dst_itr, w, a, r, g, b); + src_itr += src->stride; + alpha_itr += src->stride; + dst_itr += dst->stride; + } +} + +static inline void +_soft16_image_draw_unscaled_mul_color(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, int dst_offset, + int width, int height, + DATA8 r, DATA8 g, DATA8 b, DATA8 a) +{ + if (src->cache_entry.flags.alpha && (!dst->cache_entry.flags.alpha)) + _soft16_image_draw_unscaled_transp_solid_mul_color + (src, dst, dc, src_offset, dst_offset, width, height, r, g, b, a); + else if ((!src->cache_entry.flags.alpha) && (!dst->cache_entry.flags.alpha)) + _soft16_image_draw_unscaled_solid_solid_mul_color + (src, dst, dc, src_offset, dst_offset, width, height, r, g, b, a); + else + fprintf(stderr, + "Unsupported draw of unscaled images src->cache_entry.flags.alpha=%d, " + "dst->cache_entry.flags.alpha=%d, WITH COLOR MUL 0x%08x\n", + src->cache_entry.flags.alpha, dst->cache_entry.flags.alpha, dc->mul.col); +} + +static inline void +_soft16_image_draw_unscaled_mul(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, int dst_offset, + int width, int height, DATA8 r, DATA8 g, + DATA8 b, DATA8 a) +{ + if ((a == r) && (a == (g >> 1)) && (a == b)) + _soft16_image_draw_unscaled_mul_alpha(src, dst, dc, src_offset, + dst_offset, width, height, a); + else + _soft16_image_draw_unscaled_mul_color(src, dst, dc, src_offset, + dst_offset, width, height, + r, g, b, a); +} + +void +soft16_image_draw_unscaled(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + const Evas_Rectangle sr, + const Evas_Rectangle dr, + const Evas_Rectangle cr) +{ + int src_offset_rows, src_offset, dst_offset; + DATA16 mul_rgb565; + DATA8 r, g, b, a; + + if (!dc->mul.use) + { + r = b = a = 31; + g = 63; + mul_rgb565 = 0xffff; + } + else + { + a = A_VAL(&dc->mul.col) >> 3; + if (a == 0) + return; + + r = R_VAL(&dc->mul.col) >> 3; + g = G_VAL(&dc->mul.col) >> 2; + b = B_VAL(&dc->mul.col) >> 3; + + if (r > a) r = a; + if (g > (a << 1)) g = (a << 1); + if (b > a) b = a; + + mul_rgb565 = (r << 11) || (g << 5) | b; + } + + + src_offset_rows = (cr.y - dr.y) + sr.y; + src_offset = (src_offset_rows * src->stride) + (cr.x - dr.x) + sr.x; + + dst_offset = cr.x + (cr.y * dst->stride); + + if (mul_rgb565 == 0xffff) + _soft16_image_draw_unscaled_no_mul(src, dst, dc, src_offset, dst_offset, + cr.w, cr.h); + else + _soft16_image_draw_unscaled_mul(src, dst, dc, src_offset, dst_offset, + cr.w, cr.h, r, g, b, a); +} diff --git a/src/lib/engines/common_16/evas_soft16_line.c b/src/lib/engines/common_16/evas_soft16_line.c new file mode 100644 index 0000000..dd80afa --- /dev/null +++ b/src/lib/engines/common_16/evas_soft16_line.c @@ -0,0 +1,444 @@ +#include "evas_common_soft16.h" +#include "evas_soft16_scanline_fill.c" + +/* + * All functions except by soft16_line_draw() expect x0 <= x1. + */ + +static inline int +_in_range(int value, int min, int max) +{ + return min <= value && value <= max; +} + +static inline int +_is_xy_inside_clip(int x, int y, const struct RGBA_Draw_Context_clip clip) +{ + if (!clip.use) + return 1; + + if (!_in_range(x, clip.x, clip.x + clip.w - 1)) + return 0; + + if (!_in_range(y, clip.y, clip.y + clip.h - 1)) + return 0; + + return 1; +} + +static inline int +_is_x_inside_clip(int x, const struct RGBA_Draw_Context_clip clip) +{ + if (!clip.use) + return 1; + + return _in_range(x, clip.x, clip.x + clip.w - 1); +} + +static inline int +_is_y_inside_clip(int y, const struct RGBA_Draw_Context_clip clip) +{ + if (!clip.use) + return 1; + + return _in_range(y, clip.y, clip.y + clip.h - 1); +} + +static inline int +_is_xy_inside_rect(int x, int y, int w, int h) +{ + return _in_range(x, 0, w - 1) && _in_range(y, 0, h - 1); +} + +static inline int +_is_empty_clip(const struct RGBA_Draw_Context_clip clip) +{ + return clip.w < 1 || clip.h < 1; +} + +static void +_soft16_line_point(Soft16_Image *dst, RGBA_Draw_Context *dc, int x, int y) +{ + DATA16 rgb565, *dst_itr; + DATA8 alpha; + + if (!_is_xy_inside_rect(x, y, dst->cache_entry.w, dst->cache_entry.h)) + return; + + if (!_is_xy_inside_clip(x, y, dc->clip)) + return; + + dst_itr = dst->pixels + (dst->stride * y) + x; + alpha = A_VAL(&dc->col.col) >> 3; + rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col), + G_VAL(&dc->col.col), + B_VAL(&dc->col.col)); + + if (alpha == 31) + _soft16_pt_fill_solid_solid(dst_itr, rgb565); + else if (alpha > 0) + { + DATA32 rgb565_unpack; + + rgb565_unpack = RGB_565_UNPACK(rgb565); + alpha++; + _soft16_pt_fill_transp_solid(dst_itr, rgb565_unpack, alpha); + } +} + +static void +_soft16_line_horiz(Soft16_Image *dst, RGBA_Draw_Context *dc, int x0, int x1, int y) +{ + DATA16 rgb565, *dst_itr; + DATA8 alpha; + int w; + + if (!_is_y_inside_clip(y, dc->clip)) + return; + + if (x0 < dc->clip.x) + x0 = dc->clip.x; + + if (x1 >= dc->clip.x + dc->clip.w) + x1 = dc->clip.x + dc->clip.w - 1; + + w = x1 - x0; + if (w < 1) + return; + + dst_itr = dst->pixels + (dst->stride * y) + x0; + alpha = A_VAL(&dc->col.col) >> 3; + rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col), + G_VAL(&dc->col.col), + B_VAL(&dc->col.col)); + + if (alpha == 31) + _soft16_scanline_fill_solid_solid(dst_itr, w, rgb565); + else if (alpha > 0) + { + DATA32 rgb565_unpack; + + rgb565_unpack = RGB_565_UNPACK(rgb565); + alpha++; + _soft16_scanline_fill_transp_solid(dst_itr, w, rgb565_unpack, alpha); + } +} + +static void +_soft16_line_vert(Soft16_Image *dst, RGBA_Draw_Context *dc, int x, int y0, int y1) +{ + DATA16 rgb565, *dst_itr; + DATA8 alpha; + int h; + + if (!_is_x_inside_clip(x, dc->clip)) + return; + + if (y1 < y0) + { + int t; + t = y0; + y0 = y1; + y1 = t; + } + + if (y0 < dc->clip.y) + y0 = dc->clip.y; + + if (y1 >= dc->clip.y + dc->clip.h) + y1 = dc->clip.y + dc->clip.h - 1; + + h = y1 - y0; + if (h < 1) + return; + + dst_itr = dst->pixels + (dst->stride * y0) + x; + alpha = A_VAL(&dc->col.col) >> 3; + rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col), + G_VAL(&dc->col.col), + B_VAL(&dc->col.col)); + + if (alpha == 31) + { + for (; h > 0; h--, dst_itr += dst->stride) + _soft16_pt_fill_solid_solid(dst_itr, rgb565); + } + else if (alpha > 0) + { + DATA32 rgb565_unpack; + + rgb565_unpack = RGB_565_UNPACK(rgb565); + alpha++; + + for (; h > 0; h--, dst_itr += dst->stride) + _soft16_pt_fill_transp_solid(dst_itr, rgb565_unpack, alpha); + } +} + +static inline void +_soft16_line_45deg_adjust_boundaries(const struct RGBA_Draw_Context_clip clip, int *p_x0, int *p_y0, int *p_x1, int *p_y1) +{ + int diff, dy, x0, y0, x1, y1; + + x0 = *p_x0; + y0 = *p_y0; + x1 = *p_x1; + y1 = *p_y1; + + dy = y1 - y0; + + diff = clip.x - x0; + if (diff > 0) + { + x0 = clip.x; + y0 += (dy > 0) ? diff : -diff; + } + + diff = x1 - (clip.x + clip.w); + if (diff > 0) + { + x1 = clip.x + clip.w; + y1 += (dy > 0) ? -diff : diff; + } + + if (dy > 0) + { + diff = clip.y - y0; + if (diff > 0) + { + y0 = clip.y; + x0 += diff; + } + + diff = y1 - (clip.y + clip.h); + if (diff > 0) + { + y1 = clip.y + clip.h; + x1 -= diff; + } + } + else + { + diff = clip.y - y1; + if (diff > 0) + { + y1 = clip.y; + x1 -= diff; + } + + diff = y0 - (clip.y + clip.h - 1); + if (diff > 0) + { + y0 = clip.y + clip.h - 1; + x0 += diff; + } + } + + *p_x0 = x0; + *p_y0 = y0; + *p_x1 = x1; + *p_y1 = y1; +} + +static void +_soft16_line_45deg(Soft16_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1) +{ + int dy, step_dst_itr, len; + DATA8 alpha; + DATA16 *dst_itr, rgb565; + + alpha = A_VAL(&dc->col.col) >> 3; + if (alpha < 1) + return; + + rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col), + G_VAL(&dc->col.col), + B_VAL(&dc->col.col)); + + dy = y1 - y0; + step_dst_itr = 1 + ((dy > 0) ? dst->stride : -dst->stride); + + _soft16_line_45deg_adjust_boundaries(dc->clip, &x0, &y0, &x1, &y1); + + len = (dy > 0) ? (y1 - y0) : (y0 - y1); + if (len < 1) + return; + + dst_itr = dst->pixels + dst->stride * y0 + x0; + if (alpha == 31) + { + for (; len > 0; len--, dst_itr += step_dst_itr) + _soft16_pt_fill_solid_solid(dst_itr, rgb565); + } + else + { + DATA32 rgb565_unpack; + + rgb565_unpack = RGB_565_UNPACK(rgb565); + alpha++; + for (; len > 0; len--, dst_itr += step_dst_itr) + _soft16_pt_fill_transp_solid(dst_itr, rgb565_unpack, alpha); + } +} + +static always_inline void +_soft16_line_aliased_pt(DATA16 *dst_itr, DATA16 rgb565, DATA32 rgb565_unpack, DATA8 alpha) +{ + if (alpha == 32) + _soft16_pt_fill_solid_solid(dst_itr, rgb565); + else + _soft16_pt_fill_transp_solid(dst_itr, rgb565_unpack, alpha); +} + +static void +_soft16_line_aliased(Soft16_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1) +{ + int dx, dy, step_y, step_dst_itr; + DATA32 rgb565_unpack; + DATA16 rgb565; + DATA8 alpha; + + alpha = A_VAL(&dc->col.col) >> 3; + if (alpha == 0) + return; + alpha++; + + rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col), + G_VAL(&dc->col.col), + B_VAL(&dc->col.col)); + rgb565_unpack = RGB_565_UNPACK(rgb565); + + dx = x1 - x0; + dy = y1 - y0; + + if (dy >= 0) + { + step_y = 1; + step_dst_itr = dst->stride; + } + else + { + dy = -dy; + step_y = -1; + step_dst_itr = -dst->stride; + } + + if (dx > dy) + { + DATA16 *dst_itr; + int e, x, y; + + e = - (dx / 2); + y = y0; + dst_itr = dst->pixels + dst->stride * y0 + x0; + for (x=x0; x <= x1; x++, dst_itr++) + { + if (_is_xy_inside_clip(x, y, dc->clip)) + _soft16_line_aliased_pt(dst_itr, rgb565, rgb565_unpack, alpha); + + e += dy; + if (e >= 0) + { + dst_itr += step_dst_itr; + y += step_y; + e -= dx; + } + } + } + else + { + DATA16 *dst_itr; + int e, x, y; + + e = - (dy / 2); + x = x0; + dst_itr = dst->pixels + dst->stride * y0 + x0; + for (y=y0; y != y1; y += step_y, dst_itr += step_dst_itr) + { + if (_is_xy_inside_clip(x, y, dc->clip)) + _soft16_line_aliased_pt(dst_itr, rgb565, rgb565_unpack, alpha); + + e += dx; + if (e >= 0) + { + dst_itr++; + x++; + e -= dy; + } + } + } +} + +void +soft16_line_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1) +{ + struct RGBA_Draw_Context_clip c_bkp, c_tmp; + int dx, dy; + int x, y, w, h; + + c_tmp.use = 1; + c_tmp.x = 0; + c_tmp.y = 0; + c_tmp.w = dst->cache_entry.w; + c_tmp.h = dst->cache_entry.h; + + /* save out clip info */ + c_bkp = dc->clip; + if (c_bkp.use) + { + RECTS_CLIP_TO_RECT(c_tmp.x, c_tmp.y, c_tmp.w, c_tmp.h, + c_bkp.x, c_bkp.y, c_bkp.w, c_bkp.h); + if (_is_empty_clip(c_tmp)) + return; + } + + x = MIN(x0, x1); + y = MIN(y0, y1); + w = MAX(x0, x1) - x + 1; + h = MAX(y0, y1) - y + 1; + + RECTS_CLIP_TO_RECT(c_tmp.x, c_tmp.y, c_tmp.w, c_tmp.h, x, y, w, h); + if (_is_empty_clip(c_tmp)) + return; + + /* Check if the line doesn't cross the clip area */ + if (x0 < c_tmp.x && x1 < c_tmp.x) + return; + if (x0 >= c_tmp.x + c_tmp.w && x1 >= c_tmp.x + c_tmp.w) + return; + if (y0 < c_tmp.y && y1 < c_tmp.y) + return; + if (y0 >= c_tmp.y + c_tmp.h && y1 >= c_tmp.y + c_tmp.h) + return; + + dc->clip = c_tmp; + dx = x1 - x0; + dy = y1 - y0; + + if (dx < 0) + { + int t; + + t = x0; + x0 = x1; + x1 = t; + + t = y0; + y0 = y1; + y1 = t; + } + + if (dx == 0 && dy == 0) + _soft16_line_point(dst, dc, x0, y0); + else if (dx == 0) + _soft16_line_vert(dst, dc, x0, y0, y1); + else if (dy == 0) + _soft16_line_horiz(dst, dc, x0, x1, y0); + else if (dy == dx || dy == -dx) + _soft16_line_45deg(dst, dc, x0, y0, x1, y1); + else + _soft16_line_aliased(dst, dc, x0, y0, x1, y1); + + /* restore clip info */ + dc->clip = c_bkp; +} diff --git a/src/lib/engines/common_16/evas_soft16_main.c b/src/lib/engines/common_16/evas_soft16_main.c new file mode 100644 index 0000000..cb93d16 --- /dev/null +++ b/src/lib/engines/common_16/evas_soft16_main.c @@ -0,0 +1,599 @@ +#include "evas_common_soft16.h" + +static Evas_Cache_Image *eci = NULL; +static int reference = 0; + +static Image_Entry *_evas_common_soft16_image_new(void); +static void _evas_common_soft16_image_delete(Image_Entry *ie); + +static int _evas_common_soft16_image_surface_alloc(Image_Entry *ie, int w, int h); +static void _evas_common_soft16_image_surface_delete(Image_Entry *ie); +static DATA32 *_evas_common_soft16_image_surface_pixels(Image_Entry *ie); + +static int _evas_common_load_soft16_image_from_file(Image_Entry *ie); +static void _evas_common_soft16_image_unload(Image_Entry *ie); + +static void _evas_common_soft16_image_dirty_region(Image_Entry *im, int x, int y, int w, int h); +static int _evas_common_soft16_image_dirty(Image_Entry *ie_dst, const Image_Entry *ie_src); + +static int _evas_common_soft16_image_ram_usage(Image_Entry *ie); + +static int _evas_common_soft16_image_size_set(Image_Entry *ie_dst, const Image_Entry *ie_im, int w, int h); +static int _evas_common_soft16_image_from_copied_data(Image_Entry* ie_dst, int w, int h, DATA32 *image_data, int alpha, int cspace); +static int _evas_common_soft16_image_from_data(Image_Entry* ie_dst, int w, int h, DATA32 *image_data, int alpha, int cspace); +static int _evas_common_soft16_image_colorspace_set(Image_Entry* ie_dst, int cspace); + +static int _evas_common_load_soft16_image_data_from_file(Image_Entry *ie); + +static void +_evas_common_soft16_image_debug(const char* context, Image_Entry *eim) +{ + fprintf(stderr, "[16] %p = [%s] {%s,%s} %i [%i|%i]\n", eim, context, eim->file, eim->key, eim->references, eim->w, eim->h); +} + +static const Evas_Cache_Image_Func _evas_common_soft16_image_func = +{ + _evas_common_soft16_image_new, + _evas_common_soft16_image_delete, + _evas_common_soft16_image_surface_alloc, + _evas_common_soft16_image_surface_delete, + _evas_common_soft16_image_surface_pixels, + _evas_common_load_soft16_image_from_file, + _evas_common_soft16_image_unload, + _evas_common_soft16_image_dirty_region, + _evas_common_soft16_image_dirty, + _evas_common_soft16_image_size_set, + _evas_common_soft16_image_from_copied_data, + _evas_common_soft16_image_from_data, + _evas_common_soft16_image_colorspace_set, + _evas_common_load_soft16_image_data_from_file, + _evas_common_soft16_image_ram_usage, +/* _evas_common_soft16_image_debug */ + NULL +}; + +EAPI void +evas_common_soft16_image_init(void) +{ + if (!eci) + eci = evas_cache_image_init(&_evas_common_soft16_image_func); + reference++; +} + +EAPI void +evas_common_soft16_image_shutdown(void) +{ + if (--reference == 0) + { +// DISABLE for now - something wrong with cache shutdown freeing things +// still in use - rage_thumb segv's now. +// +// actually - i think i see it. cache ref goes to 0 (and thus gets freed) +// because in eng_setup() when a buffer changes size it is FIRST freed +// THEN allocated again - thus brignhjing ref to 0 then back to 1 immediately +// where it should stay at 1. - see evas_engine.c in the buffer enigne for +// example. eng_output_free() is called BEFORE _output_setup(). although this +// is only a SIGNE of the problem. we can patch this up with either freeing +// after the setup (so we just pt a ref of 2 then back to 1), or just +// evas_common_image_init() at the start and evas_common_image_shutdown() +// after it all. really ref 0 should only be reached when no more canvases +// with no more objects exist anywhere. +// evas_cache_image_shutdown(eci); +// eci = NULL; + } +} + +EAPI Evas_Cache_Image * +evas_common_soft16_image_cache_get(void) +{ + return eci; +} + +static Image_Entry * +_evas_common_soft16_image_new(void) +{ + Soft16_Image *im; + + im = calloc(1, sizeof(Soft16_Image)); + if (!im) return NULL; + + im->stride = -1; + + return (Image_Entry *) im; +} + +static void +_evas_common_soft16_image_delete(Image_Entry *ie) +{ + memset(ie, 0xFF, sizeof (Soft16_Image)); + free(ie); +} + +static int +_evas_common_soft16_image_surface_alloc(Image_Entry *ie, int w, int h) +{ + Soft16_Image *im = (Soft16_Image *) ie; + + if (im->stride < 0) im->stride = _calc_stride(w); + + im->pixels = realloc(im->pixels, IMG_BYTE_SIZE(im->stride, h, ie->flags.alpha)); + if (!im->pixels) return -1; + + if (ie->flags.alpha) + { + im->alpha = (DATA8 *)(im->pixels + (im->stride * h)); + im->flags.free_alpha = 0; + } + im->flags.free_pixels = 1; + + return 0; +} + +static void +_evas_common_soft16_image_surface_delete(Image_Entry *ie) +{ + Soft16_Image *im = (Soft16_Image *) ie; + + if (im->flags.free_pixels) + free(im->pixels); + im->pixels = NULL; + im->flags.free_pixels = 0; + + if (im->flags.free_alpha) + free(im->alpha); + im->alpha = NULL; + im->flags.free_alpha = 0; +} + +static DATA32 * +_evas_common_soft16_image_surface_pixels(Image_Entry *ie) +{ + abort(); + + return NULL; +} + +static int +_evas_common_load_soft16_image_from_file(Image_Entry *ie) +{ + Soft16_Image *sim = (Soft16_Image *) ie; + RGBA_Image *im; + int error = 0; + + 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); + sim->source = im; + if (!sim->source) return -1; + + sim->cache_entry.w = sim->source->cache_entry.w; + sim->cache_entry.h = sim->source->cache_entry.h; + ie->flags.alpha = im->cache_entry.flags.alpha; + if (sim->stride < 0) sim->stride = _calc_stride(sim->cache_entry.w); + + return 0; +} + +static void +_evas_common_soft16_image_unload(Image_Entry *ie) +{ +} + +static void +_evas_common_soft16_image_dirty_region(Image_Entry *im, int x, int y, int w, int h) +{ +} + +static int +_evas_common_soft16_image_dirty(Image_Entry *ie_dst, const Image_Entry *ie_src) +{ + Soft16_Image *dst = (Soft16_Image *) ie_dst; + Soft16_Image *src = (Soft16_Image *) ie_src; + + evas_cache_image_load_data(&src->cache_entry); + evas_cache_image_surface_alloc(&dst->cache_entry, + src->cache_entry.w, src->cache_entry.h); + +/* evas_common_blit_rectangle(src, dst, 0, 0, src->cache_entry.w, src->cache_entry.h, 0, 0); */ + + return 0; +} + +static int +_evas_common_soft16_image_ram_usage(Image_Entry *ie) +{ + Soft16_Image *im = (Soft16_Image *) ie; + + if (im->pixels && im->flags.free_pixels) + return IMG_BYTE_SIZE(im->stride, im->cache_entry.h, ie->flags.alpha); + return 0; +} + +static int +_evas_common_soft16_image_size_set(Image_Entry *ie_dst, const Image_Entry *ie_im, int w, int h) +{ + Soft16_Image *dst = (Soft16_Image *) ie_dst; + Soft16_Image *im = (Soft16_Image *) ie_im; + + dst->flags = im->flags; + + return 0; +} + +static int +_evas_common_soft16_image_from_data(Image_Entry* ie_dst, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + Soft16_Image *im = (Soft16_Image *) ie_dst; + + /* FIXME: handle colorspace */ + ie_dst->w = w; + ie_dst->h = h; + ie_dst->flags.alpha = alpha; + + im->flags.free_pixels = 0; + im->flags.free_alpha = 0; + + /* FIXME: That's bad, the application must be aware of the engine internal. */ + im->pixels = (DATA16 *) image_data; + if (ie_dst->flags.alpha) + im->alpha = (DATA8 *)(im->pixels + (im->stride * h)); + + return 0; +} + +static int +_evas_common_soft16_image_from_copied_data(Image_Entry* ie_dst, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + Soft16_Image *im = (Soft16_Image *) ie_dst; + + /* FIXME: handle colorspace */ + if (image_data) + memcpy(im->pixels, image_data, IMG_BYTE_SIZE(im->stride, h, ie_dst->flags.alpha)); + else + memset(im->pixels, 0, IMG_BYTE_SIZE(im->stride, h, ie_dst->flags.alpha)); + + return 0; +} + +static int +_evas_common_soft16_image_colorspace_set(Image_Entry* ie_dst, int cspace) +{ + /* FIXME: handle colorspace */ + return 0; +} + +static int +_evas_common_load_soft16_image_data_from_file(Image_Entry *ie) +{ + Soft16_Image *im = (Soft16_Image *) ie; + + if (im->pixels) return 0; + if (!im->source) return -1; + + evas_cache_image_load_data(&im->source->cache_entry); + if (im->source->image.data) + { + DATA32 *sp; + + evas_cache_image_surface_alloc(&im->cache_entry, + im->source->cache_entry.w, + im->source->cache_entry.h); + + sp = im->source->image.data; + if (im->alpha) + soft16_image_convert_from_rgba(im, sp); + else + soft16_image_convert_from_rgb(im, sp); + } + evas_cache_image_drop(&im->source->cache_entry); + im->source = NULL; + + return 0; +} + +/* Soft16_Image * */ +/* soft16_image_new(int w, int h, int stride, int have_alpha, DATA16 *pixels, */ +/* int copy) */ +/* { */ +/* Soft16_Image *im; */ + +/* if (stride < 0) stride = _calc_stride(w); */ + +/* im = soft16_image_alloc(w, h, stride, have_alpha, copy); */ +/* if (!im) return NULL; */ + +/* if (pixels) */ +/* { */ +/* if (copy) */ +/* memcpy(im->pixels, pixels, IMG_BYTE_SIZE(stride, h, have_alpha)); */ +/* else */ +/* { */ +/* im->pixels = pixels; */ +/* if (have_alpha) im->alpha = (DATA8 *)(im->pixels + (stride * h)); */ +/* } */ +/* } */ +/* return im; */ +/* } */ + +static inline void +_get_clip(const RGBA_Draw_Context *dc, const Soft16_Image *im, + Evas_Rectangle *clip) +{ + if (dc->clip.use) + { + clip->x = dc->clip.x; + clip->y = dc->clip.y; + clip->w = dc->clip.w; + clip->h = dc->clip.h; + if (clip->x < 0) + { + clip->w += clip->x; + clip->x = 0; + } + if (clip->y < 0) + { + clip->h += clip->y; + clip->y = 0; + } + if ((clip->x + clip->w) > im->cache_entry.w) clip->w = im->cache_entry.w - clip->x; + if ((clip->y + clip->h) > im->cache_entry.h) clip->h = im->cache_entry.h - clip->y; + } + else + { + clip->x = 0; + clip->y = 0; + clip->w = im->cache_entry.w; + clip->h = im->cache_entry.h; + } +} + +static inline int +_is_empty_rectangle(const Evas_Rectangle *r) +{ + return (r->w < 1) || (r->h < 1); +} + +static inline void +_shrink(int *s_pos, int *s_size, int pos, int size) +{ + int d; + + d = (*s_pos) - pos; + if (d < 0) + { + (*s_size) += d; + (*s_pos) = pos; + } + + d = size + pos - (*s_pos); + if ((*s_size) > d) + (*s_size) = d; +} + +static int +_soft16_adjust_areas(Evas_Rectangle *src, + int src_max_x, int src_max_y, + Evas_Rectangle *dst, + int dst_max_x, int dst_max_y, + Evas_Rectangle *dst_clip) +{ + if (_is_empty_rectangle(src) || + _is_empty_rectangle(dst) || + _is_empty_rectangle(dst_clip)) + return 0; + + /* shrink clip */ + _shrink(&dst_clip->x, &dst_clip->w, dst->x, dst->w); + _shrink(&dst_clip->y, &dst_clip->h, dst->y, dst->h); + if (_is_empty_rectangle(dst_clip)) return 0; + + /* sanitise x */ + if (src->x < 0) + { + dst->x -= (src->x * dst->w) / src->w; + dst->w += (src->x * dst->w) / src->w; + src->w += src->x; + src->x = 0; + } + if (src->x >= src_max_x) return 0; + if ((src->x + src->w) > src_max_x) + { + dst->w = (dst->w * (src_max_x - src->x)) / (src->w); + src->w = src_max_x - src->x; + } + if (dst->w <= 0) return 0; + if (src->w <= 0) return 0; + if (dst_clip->x < 0) + { + dst_clip->w += dst_clip->x; + dst_clip->x = 0; + } + if (dst_clip->w <= 0) return 0; + if (dst_clip->x >= dst_max_x) return 0; + + _shrink(&dst_clip->x, &dst_clip->w, 0, dst_max_x); + if (dst_clip->w <= 0) return 0; + + /* sanitise y */ + if (src->y < 0) + { + dst->y -= (src->y * dst->h) / src->h; + dst->h += (src->y * dst->h) / src->h; + src->h += src->y; + src->y = 0; + } + if (src->y >= src_max_y) return 0; + if ((src->y + src->h) > src_max_y) + { + dst->h = (dst->h * (src_max_y - src->y)) / (src->h); + src->h = src_max_y - src->y; + } + if (dst->h <= 0) return 0; + if (src->h <= 0) return 0; + if (dst_clip->y < 0) + { + dst_clip->h += dst_clip->y; + dst_clip->y = 0; + } + if (dst_clip->h <= 0) return 0; + if (dst_clip->y >= dst_max_y) return 0; + + _shrink(&dst_clip->y, &dst_clip->h, 0, dst_max_y); + if (dst_clip->h <= 0) return 0; + + return 1; +} + +static void +_soft16_image_draw_sampled_int(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + Evas_Rectangle sr, Evas_Rectangle dr) +{ + Evas_Rectangle cr; + + if (!(RECTS_INTERSECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->cache_entry.w, dst->cache_entry.h))) + return; + if (!(RECTS_INTERSECT(sr.x, sr.y, sr.w, sr.h, 0, 0, src->cache_entry.w, src->cache_entry.h))) + return; + + _get_clip(dc, dst, &cr); + if (!_soft16_adjust_areas(&sr, src->cache_entry.w, src->cache_entry.h, &dr, dst->cache_entry.w, dst->cache_entry.h, &cr)) + return; + + if ((dr.w == sr.w) && (dr.h == sr.h)) + soft16_image_draw_unscaled(src, dst, dc, sr, dr, cr); + else + soft16_image_draw_scaled_sampled(src, dst, dc, sr, dr, cr); +} + +EAPI void +soft16_image_draw(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_region_x, int src_region_y, + int src_region_w, int src_region_h, + int dst_region_x, int dst_region_y, + int dst_region_w, int dst_region_h, + int smooth) +{ + Evas_Rectangle sr, dr; + Cutout_Rects *rects; + Cutout_Rect *r; + struct RGBA_Draw_Context_clip clip_bkp; + int i; + + /* handle cutouts here! */ + dr.x = dst_region_x; + dr.y = dst_region_y; + dr.w = dst_region_w; + dr.h = dst_region_h; + + if (_is_empty_rectangle(&dr)) return; + if (!(RECTS_INTERSECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->cache_entry.w, dst->cache_entry.h))) + return; + + sr.x = src_region_x; + sr.y = src_region_y; + sr.w = src_region_w; + sr.h = src_region_h; + + if (_is_empty_rectangle(&sr)) return; + if (!(RECTS_INTERSECT(sr.x, sr.y, sr.w, sr.h, 0, 0, src->cache_entry.w, src->cache_entry.h))) + return; + + /* no cutouts - cut right to the chase */ + if (!dc->cutout.rects) + { + _soft16_image_draw_sampled_int(src, dst, dc, sr, dr); + return; + } + + /* save out clip info */ + clip_bkp = dc->clip; + evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h); + evas_common_draw_context_clip_clip(dc, dst_region_x, dst_region_y, dst_region_w, dst_region_h); + /* our clip is 0 size.. abort */ + if ((dc->clip.w <= 0) || (dc->clip.h <= 0)) + { + dc->clip = clip_bkp; + return; + } + rects = evas_common_draw_context_apply_cutouts(dc); + for (i = 0; i < rects->active; i++) + { + r = rects->rects + i; + evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h); + _soft16_image_draw_sampled_int(src, dst, dc, sr, dr); + } + evas_common_draw_context_apply_clear_cutouts(rects); + dc->clip = clip_bkp; +} + +EAPI Soft16_Image * +soft16_image_alpha_set(Soft16_Image *im, int have_alpha) +{ + Soft16_Image *new_im; + + if (im->cache_entry.flags.alpha == have_alpha) return im; + + new_im = (Soft16_Image *) evas_cache_image_alone(&im->cache_entry); + + new_im->cache_entry.flags.alpha = have_alpha; + + if (im->cache_entry.w > 0 + && im->cache_entry.h) + new_im = (Soft16_Image *) evas_cache_image_size_set(&new_im->cache_entry, im->cache_entry.w, im->cache_entry.h); + + return new_im; +} + +/* Soft16_Image * */ +/* soft16_image_size_set(Soft16_Image *old_im, int w, int h) */ +/* { */ +/* Soft16_Image *new_im; */ +/* DATA16 *dp, *sp; */ +/* int i, cw, ch, ew; */ + +/* if ((old_im->cache_entry.w == w) && (old_im->cache_entry.h == h)) return old_im; */ + +/* new_im = soft16_image_new(w, h, -1, old_im->flags.have_alpha, NULL, 1); */ + +/* if (old_im->cache_entry.w < new_im->cache_entry.w) */ +/* cw = old_im->cache_entry.w; */ +/* else */ +/* cw = new_im->cache_entry.w; */ + +/* ew = new_im->cache_entry.w - cw; */ + +/* if (old_im->cache_entry.h < new_im->cache_entry.h) */ +/* ch = old_im->cache_entry.h; */ +/* else */ +/* ch = new_im->cache_entry.h; */ + +/* dp = new_im->pixels; */ +/* sp = old_im->pixels; */ +/* for (i = 0; i < ch; i++) */ +/* { */ +/* memcpy(dp, sp, cw * sizeof(DATA16)); */ +/* if (ew > 0) memset(dp, 0, ew * sizeof(DATA16)); */ + +/* dp += new_im->stride; */ +/* sp += old_im->stride; */ +/* } */ + +/* if (old_im->flags.have_alpha) */ +/* { */ +/* DATA8 *dp, *sp; */ + +/* dp = new_im->alpha; */ +/* sp = old_im->alpha; */ +/* for (i = 0; i < ch; i++) */ +/* { */ +/* memcpy(dp, sp, cw * sizeof(DATA8)); */ +/* if (ew > 0) memset(dp, 0, ew * sizeof(DATA8)); */ + +/* dp += new_im->stride; */ +/* sp += old_im->stride; */ +/* } */ +/* } */ + +/* evas_cache_image_drop(&old_im->cache_entry); */ +/* return new_im; */ +/* } */ diff --git a/src/lib/engines/common_16/evas_soft16_polygon.c b/src/lib/engines/common_16/evas_soft16_polygon.c new file mode 100644 index 0000000..1a60995 --- /dev/null +++ b/src/lib/engines/common_16/evas_soft16_polygon.c @@ -0,0 +1,231 @@ +#include +#include "evas_soft16_scanline_fill.c" +#include + +typedef struct _RGBA_Edge RGBA_Edge; +typedef struct _RGBA_Vertex RGBA_Vertex; + +struct _RGBA_Edge +{ + float x, dx; + int i; +}; + +struct _RGBA_Vertex +{ + float x, y; + int i; +}; + +#define POLY_EDGE_DEL(_i) \ +{ \ + int _j; \ + \ + for (_j = 0; (_j < num_active_edges) && (edges[_j].i != _i); _j++); \ + if (_j < num_active_edges) \ + { \ + num_active_edges--; \ + memmove(&(edges[_j]), &(edges[_j + 1]), \ + (num_active_edges - _j) * sizeof(RGBA_Edge)); \ + } \ +} + +#define POLY_EDGE_ADD(_i, _y) \ +{ \ + int _j; \ + float _dx; \ + RGBA_Vertex *_p, *_q; \ + if (_i < (n - 1)) _j = _i + 1; \ + else _j = 0; \ + if (point[_i].y < point[_j].y) \ + { \ + _p = &(point[_i]); \ + _q = &(point[_j]); \ + } \ + else \ + { \ + _p = &(point[_j]); \ + _q = &(point[_i]); \ + } \ + edges[num_active_edges].dx = _dx = (_q->x - _p->x) / (_q->y - _p->y); \ + edges[num_active_edges].x = (_dx * ((float)_y + 0.5 - _p->y)) + _p->x; \ + edges[num_active_edges].i = _i; \ + num_active_edges++; \ +} + +static int +polygon_point_sorter(const void *a, const void *b) +{ + RGBA_Vertex *p, *q; + + p = (RGBA_Vertex *)a; + q = (RGBA_Vertex *)b; + if (p->y <= q->y) return -1; + return 1; +} + +static int +polygon_edge_sorter(const void *a, const void *b) +{ + RGBA_Edge *p, *q; + + p = (RGBA_Edge *)a; + q = (RGBA_Edge *)b; + if (p->x <= q->x) return -1; + return 1; +} + +void +soft16_polygon_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points) +{ + RGBA_Polygon_Point *pt; + RGBA_Vertex *point; + RGBA_Edge *edges; + Evas_Object_List *l; + int num_active_edges; + int n; + int i, j, k; + int y0, y1, y; + int ext_x, ext_y, ext_w, ext_h; + int *sorted_index; + DATA8 alpha; + DATA16 rgb565; + DATA32 rgb565_unpack; + + alpha = A_VAL(&dc->col.col) >> 3; + if (alpha == 0) + return; + alpha++; + + rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col), + G_VAL(&dc->col.col), + B_VAL(&dc->col.col)); + rgb565_unpack = RGB_565_UNPACK(rgb565); + + ext_x = 0; + ext_y = 0; + ext_w = dst->cache_entry.w; + ext_h = dst->cache_entry.h; + if (dc->clip.use) + RECTS_CLIP_TO_RECT(ext_x, ext_y, ext_w, ext_h, + dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h); + + if ((ext_w <= 0) || (ext_h <= 0)) + return; + + n = 0; + for (l = (Evas_Object_List *)points; l; l = l->next) + n++; + + if (n < 3) + return; + + edges = malloc(sizeof(RGBA_Edge) * n); + if (!edges) + return; + + point = malloc(sizeof(RGBA_Vertex) * n); + if (!point) + { + free(edges); + return; + } + + sorted_index = malloc(sizeof(int) * n); + if (!sorted_index) + { + free(edges); + free(point); + return; + } + + for (k = 0, l = (Evas_Object_List *)points; l; k++, l = l->next) + { + pt = (RGBA_Polygon_Point *)l; + point[k].x = pt->x; + point[k].y = pt->y; + point[k].i = k; + } + qsort(point, n, sizeof(RGBA_Vertex), polygon_point_sorter); + + for (k = 0; k < n; k++) + sorted_index[k] = point[k].i; + + for (k = 0, l = (Evas_Object_List *)points; l; k++, l = l->next) + { + pt = (RGBA_Polygon_Point *)l; + point[k].x = pt->x; + point[k].y = pt->y; + point[k].i = k; + } + + y0 = MAX(ext_y, ceil(point[sorted_index[0]].y - 0.5)); + y1 = MIN(ext_y + ext_h - 1, floor(point[sorted_index[n - 1]].y - 0.5)); + + k = 0; + num_active_edges = 0; + + for (y = y0; y <= y1; y++) + { + for (; (k < n) && (point[sorted_index[k]].y <= ((float)y + 0.5)); k++) + { + i = sorted_index[k]; + + if (i > 0) j = i - 1; + else j = n - 1; + if (point[j].y <= ((float)y - 0.5)) + { + POLY_EDGE_DEL(j) + } + else if (point[j].y > ((float)y + 0.5)) + { + POLY_EDGE_ADD(j, y) + } + if (i < (n - 1)) j = i + 1; + else j = 0; + if (point[j].y <= ((float)y - 0.5)) + { + POLY_EDGE_DEL(i) + } + else if (point[j].y > ((float)y + 0.5)) + { + POLY_EDGE_ADD(i, y) + } + } + + qsort(edges, num_active_edges, sizeof(RGBA_Edge), polygon_edge_sorter); + + for (j = 0; j < num_active_edges; j += 2) + { + int x0, x1; + + x0 = ceil(edges[j].x - 0.5); + if (j < (num_active_edges - 1)) + x1 = floor(edges[j + 1].x - 0.5); + else + x1 = x0; + if ((x1 >= ext_x) && (x0 < (ext_x + ext_w)) && (x0 <= x1)) + { + DATA16 *dst_itr; + int w; + + if (x0 < ext_x) x0 = ext_x; + if (x1 >= (ext_x + ext_w)) x1 = ext_x + ext_w - 1; + + w = (x1 - x0) + 1; + dst_itr = dst->pixels + (y * dst->stride) + x0; + + if (alpha == 32) + _soft16_scanline_fill_solid_solid(dst_itr, w, rgb565); + else + _soft16_scanline_fill_transp_solid(dst_itr, w, rgb565_unpack, alpha); + } + edges[j].x += edges[j].dx; + edges[j + 1].x += edges[j + 1].dx; + } + } + + free(edges); + free(point); + free(sorted_index); +} diff --git a/src/lib/engines/common_16/evas_soft16_rectangle.c b/src/lib/engines/common_16/evas_soft16_rectangle.c new file mode 100644 index 0000000..eb6ae92 --- /dev/null +++ b/src/lib/engines/common_16/evas_soft16_rectangle.c @@ -0,0 +1,126 @@ +#include "evas_common_soft16.h" +#include "evas_soft16_scanline_fill.c" + +static inline int +_is_empty_rectangle(const Evas_Rectangle *r) +{ + return (r->w < 1) || (r->h < 1); +} + +static inline void +_soft16_rectangle_draw_solid_solid(Soft16_Image *dst, int offset, int w, int h, + DATA16 rgb565) +{ + DATA16 *dst_itr; + int i; + + dst_itr = dst->pixels + offset; + + for (i = 0; i < h; i++, dst_itr += dst->stride) + _soft16_scanline_fill_solid_solid(dst_itr, w, rgb565); +} + +static inline void +_soft16_rectangle_draw_transp_solid(Soft16_Image *dst, int offset, int w, int h, + DATA16 rgb565, DATA8 alpha) +{ + DATA16 *dst_itr; + DATA32 rgb565_unpack; + int i; + + dst_itr = dst->pixels + offset; + rgb565_unpack = RGB_565_UNPACK(rgb565); + alpha++; + + for (i = 0; i < h; i++, dst_itr += dst->stride) + _soft16_scanline_fill_transp_solid(dst_itr, w, rgb565_unpack, alpha); +} + +static void +_soft16_rectangle_draw_int(Soft16_Image *dst, RGBA_Draw_Context *dc, + Evas_Rectangle dr) +{ + int dst_offset; + + if (_is_empty_rectangle(&dr)) return; + RECTS_CLIP_TO_RECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->cache_entry.w, dst->cache_entry.h); + if (_is_empty_rectangle(&dr)) return; + + if (dc->clip.use) + RECTS_CLIP_TO_RECT(dr.x, dr.y, dr.w, dr.h, dc->clip.x, + dc->clip.y, dc->clip.w, dc->clip.h); + if (_is_empty_rectangle(&dr)) return; + if (A_VAL(&dc->col.col) == 0) return; + + dst_offset = dr.x + (dr.y * dst->cache_entry.w); + + if (!dst->cache_entry.flags.alpha) + { + DATA16 rgb565; + DATA8 alpha; + + alpha = A_VAL(&dc->col.col) >> 3; + rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col), + G_VAL(&dc->col.col), + B_VAL(&dc->col.col)); + if (alpha == 31) + _soft16_rectangle_draw_solid_solid + (dst, dst_offset, dr.w, dr.h, rgb565); + else if (alpha > 0) + _soft16_rectangle_draw_transp_solid + (dst, dst_offset, dr.w, dr.h, rgb565, alpha); + } + else + fprintf(stderr, + "Unsupported feature: drawing rectangle to non-opaque " + "destination.\n"); +} + +void +soft16_rectangle_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, + int x, int y, int w, int h) +{ + Evas_Rectangle dr; + Cutout_Rects *rects; + Cutout_Rect *r; + struct RGBA_Draw_Context_clip c_bkp; + int i; + + /* handle cutouts here! */ + dr.x = x; + dr.y = y; + dr.w = w; + dr.h = h; + + if (_is_empty_rectangle(&dr)) return; + if (!(RECTS_INTERSECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->cache_entry.w, dst->cache_entry.h))) + return; + + /* no cutouts - cut right to the chase */ + if (!dc->cutout.rects) + { + _soft16_rectangle_draw_int(dst, dc, dr); + return; + } + + c_bkp = dc->clip; + + evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w, dst->cache_entry.h); + evas_common_draw_context_clip_clip(dc, x, y, w, h); + /* our clip is 0 size.. abort */ + if ((dc->clip.w <= 0) || (dc->clip.h <= 0)) + { + dc->clip = c_bkp; + return; + } + rects = evas_common_draw_context_apply_cutouts(dc); + for (i = 0; i < rects->active; ++i) + { + r = rects->rects + i; + evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h); + _soft16_rectangle_draw_int(dst, dc, dr); + } + evas_common_draw_context_apply_clear_cutouts(rects); + dc->clip = c_bkp; +} + diff --git a/src/lib/engines/common_16/evas_soft16_scanline_blend.c b/src/lib/engines/common_16/evas_soft16_scanline_blend.c new file mode 100644 index 0000000..409eb10 --- /dev/null +++ b/src/lib/engines/common_16/evas_soft16_scanline_blend.c @@ -0,0 +1,471 @@ +/** NOTE: This file is meant to be included by users **/ + +/** NOTE2: r, g, b parameters are 16bits, so you can pass 0 to 256 inclusive. + ** this is due our division by 256 when multiplying the color. + **/ + +/***************************************************************************** + * Scanline processing + * + * _soft16_scanline___[_]() + * + ****************************************************************************/ + +static always_inline void +_soft16_pt_blend_transp_solid(DATA16 *p_dst, DATA16 src, DATA8 alpha) +{ + if (alpha == 31) *p_dst = src; + else if (alpha != 0) + { + DATA32 a, b; + + a = RGB_565_UNPACK(src); + b = RGB_565_UNPACK(*p_dst); + b = RGB_565_UNPACKED_BLEND(a, b, alpha); + *p_dst = RGB_565_PACK(b); + } +} + +/*********************************************************************** + * Regular blend operations + */ +static void +_soft16_scanline_blend_transp_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size) +{ + DATA16 *start, *end; + + start = dst; + end = start + (size & ~7); + + pld(alpha, 0); + pld(src, 0); + + /* work on 8 pixels per time, do data preload */ + while (start < end) + { + DATA8 alpha1, alpha2; + + alpha1 = alpha[0]; + alpha += 8; + + /* empirical tests show these give the best performance */ + pld(alpha, 8); + pld(src, 32); + + src += 8; + start += 8; + + alpha2 = alpha[-7]; + _soft16_pt_blend_transp_solid(start - 8, src[-8], alpha1); + + alpha1 = alpha[-6]; + _soft16_pt_blend_transp_solid(start - 7, src[-7], alpha2); + + alpha2 = alpha[-5]; + _soft16_pt_blend_transp_solid(start - 6, src[-6], alpha1); + + alpha1 = alpha[-4]; + _soft16_pt_blend_transp_solid(start - 5, src[-5], alpha2); + + alpha2 = alpha[-3]; + _soft16_pt_blend_transp_solid(start - 4, src[-4], alpha1); + + alpha1 = alpha[-2]; + _soft16_pt_blend_transp_solid(start - 3, src[-3], alpha2); + + alpha2 = alpha[-1]; + _soft16_pt_blend_transp_solid(start - 2, src[-2], alpha1); + + _soft16_pt_blend_transp_solid(start - 1, src[-1], alpha2); + } + + /* remaining pixels (up to 7) */ + end = start + (size & 7); + for (; start < end; start++, src++, alpha++) + _soft16_pt_blend_transp_solid(start, *src, *alpha); +} + +static always_inline void +_soft16_pt_blend_solid_solid(DATA16 *p_dst, DATA16 src) +{ + *p_dst = src; +} + +static inline void +_soft16_scanline_blend_solid_solid(DATA16 *src, DATA16 *dst, int size) +{ + memcpy(dst, src, size * sizeof(DATA16)); +} + +/*********************************************************************** + * Blend operations taking an extra alpha (fade in, out) + */ + +static inline void +_soft16_pt_blend_transp_solid_mul_alpha(DATA16 *p_dst, DATA16 src, DATA8 alpha, DATA8 rel_alpha) +{ + DATA32 a, b; + + alpha = (alpha * rel_alpha) >> 5; + if (alpha == 0) + return; + + alpha++; + + a = ((RGB_565_UNPACK(src) * rel_alpha) >> 5) & RGB_565_UNPACKED_MASK; + b = RGB_565_UNPACK(*p_dst); + b = RGB_565_UNPACKED_BLEND(a, b, alpha); + *p_dst = RGB_565_PACK(b); +} + +static void +_soft16_scanline_blend_transp_solid_mul_alpha(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, const DATA8 rel_alpha) +{ + DATA16 *start, *end; + + start = dst; + end = start + (size & ~7); + + pld(alpha, 0); + pld(src, 0); + + while (start < end) + { + DATA8 alpha1, alpha2; + + alpha1 = alpha[0]; + alpha += 8; + + pld(alpha, 8); + pld(src, 32); + + src += 8; + start += 8; + + alpha2 = alpha[-7]; + _soft16_pt_blend_transp_solid_mul_alpha + (start - 8, src[-8], alpha1, rel_alpha); + + alpha1 = alpha[-6]; + _soft16_pt_blend_transp_solid_mul_alpha + (start - 7, src[-7], alpha2, rel_alpha); + + alpha2 = alpha[-5]; + _soft16_pt_blend_transp_solid_mul_alpha + (start - 6, src[-6], alpha1, rel_alpha); + + alpha1 = alpha[-4]; + _soft16_pt_blend_transp_solid_mul_alpha + (start - 5, src[-5], alpha2, rel_alpha); + + alpha2 = alpha[-3]; + _soft16_pt_blend_transp_solid_mul_alpha + (start - 4, src[-4], alpha1, rel_alpha); + + alpha1 = alpha[-2]; + _soft16_pt_blend_transp_solid_mul_alpha + (start - 3, src[-3], alpha2, rel_alpha); + + alpha2 = alpha[-1]; + _soft16_pt_blend_transp_solid_mul_alpha + (start - 2, src[-2], alpha1, rel_alpha); + + _soft16_pt_blend_transp_solid_mul_alpha + (start - 1, src[-1], alpha2, rel_alpha); + } + + end = start + (size & 7); + for (; start < end; start++, src++, alpha++) + _soft16_pt_blend_transp_solid_mul_alpha(start, *src, *alpha, rel_alpha); +} + +static always_inline void +_soft16_pt_blend_solid_solid_mul_alpha(DATA16 *p_dst, DATA16 src, DATA8 rel_alpha) +{ + DATA32 a, b; + a = RGB_565_UNPACK(src); + b = RGB_565_UNPACK(*p_dst); + b = RGB_565_UNPACKED_BLEND_UNMUL(a, b, rel_alpha); + *p_dst = RGB_565_PACK(b); +} + +static void +_soft16_scanline_blend_solid_solid_mul_alpha(DATA16 *src, DATA16 *dst, int size, DATA8 rel_alpha) +{ + DATA16 *start, *end; + + start = dst; + end = start + (size & ~7); + + pld(src, 0); + + while (start < end) + { + pld(src, 32); + UNROLL8({ + _soft16_pt_blend_solid_solid_mul_alpha(start, *src, rel_alpha); + start++; + src++; + }); + } + + end = start + (size & 7); + for (; start < end; start++, src++) + _soft16_pt_blend_solid_solid_mul_alpha(start, *src, rel_alpha); +} + +/*********************************************************************** + * Blend operations with extra alpha and multiply color + */ + +static always_inline void +_soft16_pt_blend_transp_solid_mul_color_transp(DATA16 *p_dst, DATA16 src, DATA8 alpha, DATA8 rel_alpha, DATA16 r, DATA16 g, DATA16 b) +{ + DATA32 rgb, d; + int r1, g1, b1; + + alpha = (alpha * rel_alpha) >> 5; + if (alpha == 0) + return; + + alpha++; + + r1 = ((((src) >> 11) & 0x1f) * r) >> 5; + g1 = ((((src) >> 5) & 0x3f) * g) >> 6; + b1 = (((src) & 0x1f) * b) >> 5; + rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; + d = RGB_565_UNPACK(*p_dst); + d = RGB_565_UNPACKED_BLEND(rgb, d, alpha); + + *p_dst = RGB_565_PACK(d); +} + +static void +_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) +{ + DATA16 *start, *end; + + start = dst; + end = start + (size & ~7); + + pld(alpha, 0); + pld(src, 0); + + while (start < end) + { + DATA8 alpha1, alpha2; + + alpha1 = alpha[0]; + alpha += 8; + + pld(src, 32); + pld(start, 32); + + src += 8; + start += 8; + + alpha2 = alpha[-7]; + _soft16_pt_blend_transp_solid_mul_color_transp + (start - 8, src[-8], alpha1, rel_alpha, r, g, b); + + alpha1 = alpha[-6]; + _soft16_pt_blend_transp_solid_mul_color_transp + (start - 7, src[-7], alpha2, rel_alpha, r, g, b); + + alpha2 = alpha[-5]; + _soft16_pt_blend_transp_solid_mul_color_transp + (start - 6, src[-6], alpha1, rel_alpha, r, g, b); + + alpha1 = alpha[-4]; + _soft16_pt_blend_transp_solid_mul_color_transp + (start - 5, src[-5], alpha2, rel_alpha, r, g, b); + + alpha2 = alpha[-3]; + _soft16_pt_blend_transp_solid_mul_color_transp + (start - 4, src[-4], alpha1, rel_alpha, r, g, b); + + alpha1 = alpha[-2]; + _soft16_pt_blend_transp_solid_mul_color_transp + (start - 3, src[-3], alpha2, rel_alpha, r, g, b); + + alpha2 = alpha[-1]; + _soft16_pt_blend_transp_solid_mul_color_transp + (start - 2, src[-2], alpha1, rel_alpha, r, g, b); + + _soft16_pt_blend_transp_solid_mul_color_transp + (start - 1, src[-1], alpha2, rel_alpha, r, g, b); + } + + end = start + (size & 7); + for (; start < end; start++, src++, alpha++) + _soft16_pt_blend_transp_solid_mul_color_transp + (start, *src, *alpha, rel_alpha, r, g, b); +} + +static always_inline void +_soft16_pt_blend_solid_solid_mul_color_transp(DATA16 *p_dst, DATA16 src, DATA8 rel_alpha, DATA16 r, DATA16 g, DATA16 b) +{ + int r1, g1, b1; + DATA32 rgb, d; + + r1 = ((((src) >> 11) & 0x1f) * r) >> 5; + g1 = ((((src) >> 5) & 0x3f) * g) >> 6; + b1 = (((src) & 0x1f) * b) >> 5; + + rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; + d = RGB_565_UNPACK(*p_dst); + d = RGB_565_UNPACKED_BLEND(rgb, d, rel_alpha); + *p_dst = RGB_565_PACK(d); +} + +static void +_soft16_scanline_blend_solid_solid_mul_color_transp(DATA16 *src, DATA16 *dst, int size, DATA8 rel_alpha, DATA16 r, DATA16 g, DATA16 b) +{ + DATA16 *start, *end; + + start = dst; + end = start + (size & ~7); + + pld(src, 0); + + while (start < end) + { + pld(src, 32); + UNROLL8({ + _soft16_pt_blend_solid_solid_mul_color_transp + (start, *src, rel_alpha, r, g, b); + start++; + src++; + }); + } + + end = start + (size & 7); + for (; start < end; start++, src++) + _soft16_pt_blend_solid_solid_mul_color_transp + (start, *src, rel_alpha, r, g, b); +} + +/*********************************************************************** + * Blend operations with extra multiply color + */ +static always_inline void +_soft16_pt_blend_transp_solid_mul_color_solid(DATA16 *p_dst, DATA16 src, DATA8 alpha, DATA8 r, DATA8 g, DATA8 b) +{ + int r1, g1, b1; + + if (alpha == 0) return; + + r1 = ((((src >> 11) & 0x1f) * r) >> 5) & 0x1f; + g1 = ((((src >> 5) & 0x3f) * g) >> 6) & 0x3f; + b1 = (((src & 0x1f) * b) >> 5) & 0x1f; + + if (alpha == 31) *p_dst = (r1 << 11) | (g1 << 5) | b1; + else + { + DATA32 rgb_unpack, d; + + rgb_unpack = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; + d = RGB_565_UNPACK(*p_dst); + d = RGB_565_UNPACKED_BLEND(rgb_unpack, d, alpha); + *p_dst = RGB_565_PACK(d); + } +} + +static void +_soft16_scanline_blend_transp_solid_mul_color_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, DATA16 r, DATA16 g, DATA16 b) +{ + DATA16 *start, *end; + + start = dst; + end = start + (size & ~7); + + pld(alpha, 0); + pld(src, 0); + + while (start < end) + { + DATA8 alpha1, alpha2; + + alpha1 = alpha[0]; + alpha += 8; + + pld(alpha, 8); + pld(src, 32); + + src += 8; + start += 8; + + alpha2 = alpha[-7]; + _soft16_pt_blend_transp_solid_mul_color_solid + (start - 8, src[-8], alpha1, r, g, b); + + alpha1 = alpha[-6]; + _soft16_pt_blend_transp_solid_mul_color_solid + (start - 7, src[-7], alpha2, r, g, b); + + alpha2 = alpha[-5]; + _soft16_pt_blend_transp_solid_mul_color_solid + (start - 6, src[-6], alpha1, r, g, b); + + alpha1 = alpha[-4]; + _soft16_pt_blend_transp_solid_mul_color_solid + (start - 5, src[-5], alpha2, r, g, b); + + alpha2 = alpha[-3]; + _soft16_pt_blend_transp_solid_mul_color_solid + (start - 4, src[-4], alpha1, r, g, b); + + alpha1 = alpha[-2]; + _soft16_pt_blend_transp_solid_mul_color_solid + (start - 3, src[-3], alpha2, r, g, b); + + alpha2 = alpha[-1]; + _soft16_pt_blend_transp_solid_mul_color_solid + (start - 2, src[-2], alpha1, r, g, b); + + _soft16_pt_blend_transp_solid_mul_color_solid + (start - 1, src[-1], alpha2, r, g, b); + } + + end = start + (size & 7); + for (; start < end; start++, src++, alpha++) + _soft16_pt_blend_transp_solid_mul_color_solid + (start, *src, *alpha, r, g, b); +} + +static always_inline void +_soft16_pt_blend_solid_solid_mul_color_solid(DATA16 *p_dst, DATA16 src, DATA16 r, DATA16 g, DATA16 b) +{ + int r1, g1, b1; + + r1 = ((((src >> 11) & 0x1f) * r) >> 5) & 0x1f; + g1 = ((((src >> 5) & 0x3f) * g) >> 6) & 0x3f; + b1 = (((src & 0x1f) * b) >> 5) & 0x1f; + + *p_dst = (r1 << 11) | (g1 << 5) | b1; +} + +static void +_soft16_scanline_blend_solid_solid_mul_color_solid(DATA16 *src, DATA16 *dst, int size, DATA8 r, DATA8 g, DATA8 b) +{ + DATA16 *start, *end; + + start = dst; + end = start + (size & ~7); + + pld(src, 0); + + while (start < end) + { + pld(src, 32); + UNROLL8({ + _soft16_pt_blend_solid_solid_mul_color_solid(start, *src, r, g, b); + start++; + src++; + }); + } + + end = start + (size & 7); + for (; start < end; start++, src++) + _soft16_pt_blend_solid_solid_mul_color_solid(start, *src, r, g, b); +} diff --git a/src/lib/engines/common_16/evas_soft16_scanline_fill.c b/src/lib/engines/common_16/evas_soft16_scanline_fill.c new file mode 100644 index 0000000..b4ab630 --- /dev/null +++ b/src/lib/engines/common_16/evas_soft16_scanline_fill.c @@ -0,0 +1,86 @@ +/** NOTE: This file is meant to be included by users **/ + +/***************************************************************************** + * Point processing + * + * _soft16_pt___[_]() + * + * Scanline processing + * + * _soft16_scanline___[_]() + * + ****************************************************************************/ +static always_inline void +_soft16_pt_fill_solid_solid(DATA16 *dst, DATA16 rgb565) +{ + *dst = rgb565; +} + +static void +_soft16_scanline_fill_solid_solid(DATA16 *dst, int size, DATA16 rgb565) +{ + DATA16 *start, *end; + DATA32 rgb565_double; + + start = dst; + + if ((long)start & 0x2) + { + *start = rgb565; + start++; + size--; + } + + end = start + (size & ~7); + + rgb565_double = (rgb565 << 16) | rgb565; + + while (start < end) + { + DATA32 *p = (DATA32 *)start; + + p[0] = rgb565_double; + p[1] = rgb565_double; + p[2] = rgb565_double; + p[3] = rgb565_double; + + start += 8; + } + + end = start + (size & 7); + for (; start < end; start++) + *start = rgb565; +} + +static always_inline void +_soft16_pt_fill_transp_solid(DATA16 *dst, DATA32 rgb565_unpack, DATA8 alpha) +{ + DATA32 d; + + d = RGB_565_UNPACK(*dst); + d = RGB_565_UNPACKED_BLEND(rgb565_unpack, d, alpha); + *dst = RGB_565_PACK(d); +} + +static void +_soft16_scanline_fill_transp_solid(DATA16 *dst, int size, DATA32 rgb565_unpack, DATA8 alpha) +{ + DATA16 *start, *end; + + start = dst; + pld(start, 0); + end = start + (size & ~7); + + while (start < end) + { + pld(start, 32); + UNROLL8({ + _soft16_pt_fill_transp_solid(start, rgb565_unpack, alpha); + start++; + }); + } + + end = start + (size & 7); + for (; start < end; start++) + _soft16_pt_fill_transp_solid(start, rgb565_unpack, alpha); +} diff --git a/src/lib/file/.cvsignore b/src/lib/file/.cvsignore new file mode 100644 index 0000000..e62a1b3 --- /dev/null +++ b/src/lib/file/.cvsignore @@ -0,0 +1,7 @@ +Makefile.in +Makefile +.deps +.libs +libevas_file.la +evas_path.lo +evas_module.lo diff --git a/src/lib/file/Makefile.am b/src/lib/file/Makefile.am new file mode 100644 index 0000000..686dd83 --- /dev/null +++ b/src/lib/file/Makefile.am @@ -0,0 +1,23 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-DPACKAGE_BIN_DIR=\"$(bindir)\" \ +-DPACKAGE_LIB_DIR=\"$(libdir)\" \ +-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ +@FREETYPE_CFLAGS@ \ +@EVIL_CFLAGS@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +noinst_LTLIBRARIES = libevas_file.la +libevas_file_la_SOURCES = \ +evas_path.c \ +evas_module.c +libevas_file_la_LIBADD = @EVIL_LIBS@ +libevas_file_la_DEPENDENCIES = $(top_builddir)/config.h + +EXTRA_DIST = evas_module.h evas_path.h diff --git a/src/lib/file/evas_module.c b/src/lib/file/evas_module.c new file mode 100644 index 0000000..2123350 --- /dev/null +++ b/src/lib/file/evas_module.c @@ -0,0 +1,443 @@ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + +#include /* DIR, dirent */ +#include /* dlopen,dlclose,etc */ + +#include +#include + +Evas_List *evas_modules = NULL; +static Evas_List *evas_module_paths = NULL; + +static void +_evas_module_path_append(Evas_Module_Type type, char *path, const char *subdir) +{ + Evas_Module_Path *mp; + char *buf; + + buf = evas_file_path_join(path, subdir); + if (!buf) return; + if (evas_file_path_exists(buf)) + { + mp = malloc(sizeof(Evas_Module_Path)); + mp->type = type; + mp->path = buf; + evas_module_paths = evas_list_append(evas_module_paths, mp); + } + else + free(buf); +} + + +/* this will alloc a list of paths to search for the modules */ +/* by now these are: */ +/* 1. ~/.evas/modules/ */ +/* 2. $(EVAS_MODULE_DIR)/evas/modules/ */ +/* 3. dladdr/evas/modules/ */ +/* 4. PREFIX/evas/modules/ */ +void +evas_module_paths_init(void) +{ + + char *prefix; + char *path; + Evas_List *paths = NULL; + + /* 1. ~/.evas/modules/ */ + prefix = getenv("HOME"); + if (prefix) + { + path = malloc(strlen(prefix) + 1 + strlen("/.evas/modules")); + if (path) + { + path[0] = 0; + strcpy(path, prefix); + strcat(path, "/.evas/modules"); + if (evas_file_path_exists(path)) + paths = evas_list_append(paths, path); + else + free(path); + } + } + + /* 2. $(EVAS_MODULE_DIR)/evas/modules/ */ + prefix = getenv("EVAS_MODULES_DIR"); + if (prefix) + { + path = malloc(strlen(prefix) + 1 + strlen("/evas/modules")); + if (path) + { + path[0] = 0; + strcpy(path, prefix); + strcat(path, "/evas/modules"); + if (evas_file_path_exists(path)) + paths = evas_list_append(paths, path); + else + free(path); + } + } + +#ifdef HAVE_DLADDR + { + Dl_info evas_dl; + /* 3. libevas.so/../evas/modules/ */ + if (dladdr(evas_module_paths_init, &evas_dl)) + { + int length; + + if (strrchr(evas_dl.dli_fname, '/')) + { + length = strlen(strrchr(evas_dl.dli_fname, '/')); + path = malloc(strlen(evas_dl.dli_fname) - length + + strlen("/evas/modules") + 1); + if (path) + { + strncpy(path, evas_dl.dli_fname, + strlen(evas_dl.dli_fname) - length); + path[strlen(evas_dl.dli_fname) - length] = 0; + strcat(path, "/evas/modules"); + if (evas_file_path_exists(path)) + paths = evas_list_append(paths, path); + else + free(path); + } + } + } + } +#else + /* 4. PREFIX/evas/modules/ */ + prefix = PACKAGE_LIB_DIR; + path = malloc(strlen(prefix) + 1 + strlen("/evas/modules")); + if (path) + { + strcpy(path, prefix); + strcat(path, "/evas/modules"); + if (evas_file_path_exists(path)) + paths = evas_list_append(paths, path); + else + free(path); + } +#endif + + /* append all the module types subdirs */ + while (paths) + { + /* here must be added all the types of modules and their subdirectory */ + /* do this on a separate function */ + /* 1. engines */ + _evas_module_path_append(EVAS_MODULE_TYPE_ENGINE, paths->data, "engines"); + _evas_module_path_append(EVAS_MODULE_TYPE_IMAGE_LOADER, paths->data, "loaders"); + _evas_module_path_append(EVAS_MODULE_TYPE_IMAGE_SAVER, paths->data, "savers"); + _evas_module_path_append(EVAS_MODULE_TYPE_OBJECT, paths->data, "objects"); + free(paths->data); + paths = evas_list_remove_list(paths, paths); + } +} + +/* this will alloc an Evas_Module struct for each module + * it finds on the paths */ +void +evas_module_init(void) +{ + Evas_List *l; + int new_id_engine = 1; + +/* printf("[init modules]\n"); */ + evas_module_paths_init(); + for (l = evas_module_paths; l; l = l->next) + { + Evas_Module_Path *mp; + DIR *dir; + struct dirent *de; + + mp = l->data; + + if (!(dir = opendir(mp->path))) break; +/* printf("[evas module] searching modules on %s\n", mp->path); */ + while ((de = readdir(dir))) + { + char *buf; + + if ((!strcmp(de->d_name, ".")) || (!strcmp(de->d_name, ".."))) + continue; + buf = malloc(strlen(mp->path) + 1 + strlen(de->d_name) + 1); + sprintf(buf, "%s/%s", mp->path, de->d_name); + if (evas_file_path_is_dir(buf)) + { + Evas_Module *em; + + em = calloc(1, sizeof(Evas_Module)); + if (!em) continue; + em->name = strdup(de->d_name); + em->path = strdup(mp->path); + em->type = mp->type; + em->handle = NULL; + em->data = NULL; + em->loaded = 0; + if (em->type == EVAS_MODULE_TYPE_ENGINE) + { + Evas_Module_Engine *eme; + + eme = malloc(sizeof(Evas_Module_Engine)); + if (eme) + { + eme->id = new_id_engine; + em->data = eme; + new_id_engine++; + } + } + else if (em->type == EVAS_MODULE_TYPE_IMAGE_LOADER) + { + } + else if (em->type == EVAS_MODULE_TYPE_IMAGE_SAVER) + { + } +/* printf("[evas module] including module path %s/%s of type %d\n",em->path, em->name, em->type); */ + evas_modules = evas_list_append(evas_modules, em); + } + free(buf); + } + closedir(dir); + } +} + +Evas_Module * +evas_module_find_type(Evas_Module_Type type, const char *name) +{ + Evas_List *l; + + for (l = evas_modules; l; l = l->next) + { + Evas_Module *em; + + em = (Evas_Module*)l->data; + if ((type == em->type) && (!strcmp(name,em->name))) + { + if (evas_modules != l) + { + evas_modules = evas_list_promote_list(evas_modules, l); + } + return em; + } + } + return NULL; +} + +int +evas_module_load(Evas_Module *em) +{ + char buf[4096]; + void *handle; + + if (em->loaded) return 1; + +/* printf("LOAD %s\n", em->name); */ +#if defined(__CEGCC__) || defined(__MINGW32CE__) + switch (em->type) { + case EVAS_MODULE_TYPE_IMAGE_SAVER: + snprintf(buf, sizeof(buf), "%s/%s/%s/saver_%s.dll", em->path, em->name, MODULE_ARCH, em->name); + break; + case EVAS_MODULE_TYPE_IMAGE_LOADER: + snprintf(buf, sizeof(buf), "%s/%s/%s/loader_%s.dll", em->path, em->name, MODULE_ARCH, em->name); + break; + case EVAS_MODULE_TYPE_ENGINE: + snprintf(buf, sizeof(buf), "%s/%s/%s/engine_%s.dll", em->path, em->name, MODULE_ARCH, em->name); + break; + default: + snprintf(buf, sizeof(buf), "%s/%s/%s/object_%s.dll", em->path, em->name, MODULE_ARCH, em->name); + } +#elif _WIN32 + snprintf(buf, sizeof(buf), "%s/%s/%s/module.dll", em->path, em->name, MODULE_ARCH); +#else + snprintf(buf, sizeof(buf), "%s/%s/%s/module.so", em->path, em->name, MODULE_ARCH); +#endif + if (!evas_file_path_exists(buf)) + { + printf("[evas module] error loading the module %s. It doesnt exists\n", buf); + return 0; + } + + handle = dlopen(buf, RTLD_LAZY); + if (handle) + { + em->handle = handle; + em->func.open = dlsym(em->handle, "module_open"); + em->func.close = dlsym(em->handle, "module_close"); + em->api = dlsym(em->handle, "evas_modapi"); + + if ((!em->func.open) || (!em->api) || (!em->func.close)) + goto error_dl; + /* check the api */ + if (em->api->version != EVAS_MODULE_API_VERSION) + { + printf("[evas module] error loading the modules %s. The version doesnt match\n", buf); + goto error_dl; + } + em->func.open(em); + em->loaded = 1; + return 1; + } + error_dl: + { + const char *err; + + err = dlerror(); + printf("[evas module] error loading the module %s. %s\n", buf, err); + if (handle) + dlclose(handle); + em->handle = NULL; + em->func.open = NULL; + em->func.close = NULL; + em->api = NULL; + } + return 0; +} + +void +evas_module_unload(Evas_Module *em) +{ + if (!em->loaded) + return; + if (em->handle) + { + em->func.close(em); + dlclose(em->handle); + } + em->handle = NULL; + em->func.open = NULL; + em->func.close = NULL; + em->api = NULL; + em->loaded = 0; +} + +void +evas_module_ref(Evas_Module *em) +{ + em->ref++; +/* printf("M: %s ref++ = %i\n", em->name, em->ref); */ +} + +void +evas_module_unref(Evas_Module *em) +{ + em->ref--; +/* printf("M: %s ref-- = %i\n", em->name, em->ref); */ +} + +static int use_count = 0; + +void +evas_module_use(Evas_Module *em) +{ + em->last_used = use_count; +} + +void +evas_module_clean(void) +{ + static int call_count = 0; + int ago; + int noclean = -1; + Evas_List *l; + Evas_Module *em; + + /* only clean modules every 256 calls */ + call_count++; + if (call_count <= 256) return; + call_count = 0; + + if (noclean == -1) + { + if (getenv("EVAS_NOCLEAN")) + { + noclean = 1; + } + noclean = 0; + } + if (noclean == 1) return; + + /* disable module cleaning for now - may cause instability with some modules */ + return; + + /* incriment use counter = 28bits */ + use_count++; + if (use_count > 0x0fffffff) use_count = 0; + + /* printf("CLEAN!\n"); */ + /* go through all modules */ + for (l = evas_modules; l; l = l->next) + { + em = l->data; + /* printf("M %s %i %i\n", em->name, em->ref, em->loaded); */ + /* if the module is refernced - skip */ + if ((em->ref > 0) || (!em->loaded)) continue; + /* how many clean cycles ago was this module last used */ + ago = use_count - em->last_used; + if (em->last_used > use_count) ago += 0x10000000; + /* if it was used last more than N clean cycles ago - unload */ + if (ago > 5) + { + /* printf(" UNLOAD %s\n", em->name); */ + evas_module_unload(em); + } + } +} + +/* will dlclose all the modules loaded and free all the structs */ +void +evas_module_shutdown(void) +{ + Evas_Module *em; + +/* printf("[shutdown modules]\n"); */ + while (evas_modules) + { + em = (Evas_Module *)evas_modules->data; + evas_module_unload(em); + if (em->name) free(em->name); + if (em->path) free(em->path); + if (em->type == EVAS_MODULE_TYPE_ENGINE) + { + if (em->data) free(em->data); + } + else if (em->type == EVAS_MODULE_TYPE_IMAGE_LOADER) + { + } + else if (em->type == EVAS_MODULE_TYPE_IMAGE_SAVER) + { + } + free(evas_modules->data); + evas_modules = evas_list_remove_list(evas_modules, evas_modules); + } + while (evas_module_paths) + { + Evas_Module_Path *mp; + + mp = evas_module_paths->data; + evas_module_paths = evas_list_remove_list(evas_module_paths, evas_module_paths); + free(mp->path); + free(mp); + } +} + +EAPI int +_evas_module_engine_inherit(Evas_Func *funcs, char *name) +{ + Evas_Module *em; + + em = evas_module_find_type(EVAS_MODULE_TYPE_ENGINE, name); + if (em) + { + if (evas_module_load(em)) + { + /* FIXME: no way to unref */ + evas_module_ref(em); + evas_module_use(em); + *funcs = *((Evas_Func *)(em->functions)); + return 1; + } + } + return 0; +} diff --git a/src/lib/file/evas_module.h b/src/lib/file/evas_module.h new file mode 100644 index 0000000..06765df --- /dev/null +++ b/src/lib/file/evas_module.h @@ -0,0 +1,83 @@ +#ifndef _EVAS_MODULE_H +#define _EVAS_MODULE_H + + +/* the module api version */ +#define EVAS_MODULE_API_VERSION 1 + + +/* the module types */ +typedef enum _Evas_Module_Type +{ + EVAS_MODULE_TYPE_ENGINE, + EVAS_MODULE_TYPE_IMAGE_LOADER, + EVAS_MODULE_TYPE_IMAGE_SAVER, + EVAS_MODULE_TYPE_OBJECT +} Evas_Module_Type; + + +typedef struct _Evas_Module_Api Evas_Module_Api; +typedef struct _Evas_Module Evas_Module; +typedef struct _Evas_Module_Path Evas_Module_Path; +typedef struct _Evas_Module_Engine Evas_Module_Engine; + +/* the module api structure, all modules should define this struct */ +struct _Evas_Module_Api +{ + int version; + Evas_Module_Type type; + const char *name; + const char *author; +}; + +/* the module structure */ +struct _Evas_Module +{ + Evas_Module_Api *api; + void *handle; /* the dlopen handle */ + char *path; /* the path where this modules is */ + char *name; /* the name of the dir where this module is */ + struct + { + int (*open)(Evas_Module *); + void (*close)(Evas_Module *); + } func; + void *functions; /* this are the functions exported by the module */ + void *data; /* some internal data for the module i.e the id for engines */ + + Evas_Module_Type type; /* the type detected by the path */ + + int ref; /* how many refs */ + int last_used; /* the cycle count when it was last used */ + + unsigned char loaded : 1; +}; + + +/* the internals of the module api use this struct to reference a path with a module type + * instead of deduce the type from the path. + * */ +struct _Evas_Module_Path +{ + Evas_Module_Type type; + char *path; +}; + +struct _Evas_Module_Engine +{ + int id; +}; + +void evas_module_paths_init (void); +void evas_module_init (void); +Evas_Module *evas_module_find_type (Evas_Module_Type type, const char *name); +int evas_module_load (Evas_Module *em); +void evas_module_unload (Evas_Module *em); +void evas_module_ref (Evas_Module *em); +void evas_module_unref (Evas_Module *em); +void evas_module_use (Evas_Module *em); +void evas_module_clean (void); +void evas_module_shutdown (void); + + +#endif /* _EVAS_MODULE_H */ diff --git a/src/lib/file/evas_path.c b/src/lib/file/evas_path.c new file mode 100644 index 0000000..0394e16 --- /dev/null +++ b/src/lib/file/evas_path.c @@ -0,0 +1,379 @@ +/* os dependant file code. for unix-y like fs's only for now */ +/* if your os doesn't use unix-like fs starting with "/" for the root and */ +/* the file path separator isn't "/" then you may need to help out by */ +/* adding in a new set of functions here */ + +#ifndef _WIN32_WCE +/* UNIX compatability functions */ + +#include "evas_common.h" +#include "evas_private.h" + +#include +#include +#include +#include +#include +#include +/* get the casefold feature! */ +#include +#include + +int +evas_file_path_is_full_path(const char *path) +{ + if (!path) return 0; + if (path[0] == '/') return 1; + return 0; +} + +char * +evas_file_path_join(const char *path, const char *end) +{ + char *res = NULL; + int len; + + if ((!path) && (!end)) return NULL; + if (!path) return strdup(end); + if (!end) return strdup(path); + len = strlen(path); + len += strlen(end); + len += strlen("/"); + res = malloc(len + 1); + if (!res) return NULL; + strcpy(res, path); + strcat(res, "/"); + strcat(res, end); + return res; +} + +int +evas_file_path_exists(const char *path) +{ + struct stat st; + + if (!stat(path, &st)) return 1; + return 0; +} + +int +evas_file_path_is_file(const char *path) +{ + struct stat st; + + if (stat(path, &st) == -1) return 0; + if (S_ISREG(st.st_mode)) return 1; + return 0; +} + +int +evas_file_path_is_dir(const char *path) +{ + struct stat st; + + if (stat(path, &st) == -1) return 0; + if (S_ISDIR(st.st_mode)) return 1; + return 0; +} + +Evas_List * +evas_file_path_list(char *path, const char *match, int match_case) +{ + Evas_List *files = NULL; + DIR *dir; + + dir = opendir(path); + if (!dir) return NULL; + { + struct dirent *dp; + int flags; + + flags = FNM_PATHNAME; +#ifdef FNM_CASEFOLD + if (!match_case) + flags |= FNM_CASEFOLD; +#else +/*#warning "Your libc does not provide case-insensitive matching!"*/ +#endif + while ((dp = readdir(dir))) + { + if ((!strcmp(dp->d_name, ".")) || (!strcmp(dp->d_name, ".."))) + continue; + if (match) + { + if (fnmatch(match, dp->d_name, flags) == 0) + files = evas_list_append(files, strdup(dp->d_name)); + } + else + files = evas_list_append(files, strdup(dp->d_name)); + } + closedir(dir); + } + return files; +} + +DATA64 +evas_file_modified_time(const char *file) +{ + struct stat st; + + if (stat(file, &st) < 0) return 0; + if (st.st_ctime > st.st_mtime) return (DATA64)st.st_ctime; + else return (DATA64)st.st_mtime; + return 0; +} + +char * +evas_file_path_resolve(const char *file) +{ +#if 0 + char buf[PATH_MAX], *buf2; +#endif + + return strdup(file); +#if 0 + if (!realpath(file, buf)) return NULL; + buf2 = strdup(buf); + return buf2; +#endif +} + +#else +/* WIN32 WINCE compatability functions */ + +/* Forward declarations */ + +static DWORD winstat(char *path); +static wchar_t *convert_utf_unicode(const char* putf); +static char *convert_unicode_utf(const wchar_t* punicode); + + +/* Unicode to utf and utf to unicode conversion functions */ +static wchar_t * +convert_utf_unicode(const char *putf) +{ + int len; + wchar_t *punicode; + + len = strlen(putf)+ 1; //add one for safety + + punicode = (wchar_t *)malloc(len * sizeof(wchar_t)); + + if (punicode == NULL) return NULL; + +#ifdef UNICODE + strcpy(punicode,putf); +#else + if (mbstowcs(punicode,putf,len) < 0) + { + free(punicode); + return NULL; + } +#endif + return punicode; +} + +static char * +convert_unicode_utf(const wchar_t *punicode) +{ + int len; + char *putf; + + /* add one for safety */ + len = wcslen(punicode) + 1; + + /* this will alloc too many bytes */ + putf = (char *)malloc(len * sizeof(wchar_t)); + + if (putf == NULL) return NULL; + +#ifdef UNICODE + strcpy(putf,punicode); +#else + if (wcstombs(putf,punicode,len) < 0) + { + free(putf); + return NULL; + } +#endif + return putf; +} + +/* + * win"stat" + * This is like the stat function except that it reurns a bitmask (DWORD) + * Since this library is complied using MBCS then the path is multibyte + */ +static DWORD +winstat(char *path) +{ + DWORD fa; + wchar_t *pwpath; /* A wide character type */ + + pwpath = convert_utf_unicode(path); + /* 0xFFFFFFFF is the error return val for the GetFile Attributes Function */ + /* so I am usin this as an error return up here */ + if (pwpath == NULL) return 0xFFFFFFFF; + /* this function needed the wide string"*/ + /* I dont think that WinCe has mbcs equiv functions and only provides UNICODE*/ + fa = GetFileAttributesW(pwpath); + free(pwpath); + return fa; +} + +int +evas_file_path_is_full_path(char *path) +{ + if (!path) return 0; + if (path[0] == '\\') return 1; + return 0; +} + +char * +evas_file_path_join(char *path, char *end) +{ + char *res = NULL; + int len; + + if ((!path) && (!end)) return NULL; + if (!path) return strdup(end); + if (!end) return strdup(path); + len = strlen(path); + len += strlen(end); + len += strlen("\\"); + res = malloc(len + 1); + if (!res) return NULL; + strcpy(res, path); + strcat(res, "\\"); + strcat(res, end); + return res; +} + +int +evas_file_path_exists(char *path) +{ + DWORD fa; + + fa = winstat(path); + if (fa == 0xFFFFFFFF) return 0; + return 1; +} + +int +evas_file_path_is_file(char *path) +{ + DWORD fa; + + fa = winstat(path); + if (fa == 0xFFFFFFFF) return 0; + if (fa & FILE_ATTRIBUTE_DIRECTORY) return 0; + return 1; +} + +int +evas_file_path_is_dir(char *path) +{ + DWORD fa; + + fa = winstat(path); + if (fa == 0xFFFFFFFF) return 0; + if (fa & FILE_ATTRIBUTE_DIRECTORY) return 1; + return 0; +} + +Evas_List * +evas_file_path_list(char *path, char *match, int match_case) +{ + Evas_List *files = NULL; + WIN32_FIND_DATAW find; + HANDLE fh; + int fullpathlen; + char *pfp; /* full path pointer */ + wchar_t *pfup; /* full unicode path pointer */ + + /* + * work out the full path length of the combined patch and match + * if we are looking for a specific match eg *.txt then we will will add + * the length of *.txt and \\ to the string + * if we are not looking for a match then we want to list the whole + * directory and we find the length of \\*.* + */ + fullpathlen = strlen(path); + if (match) + { + fullpathlen += strlen("\\"); + fullpathlen += strlen(match); + } + else + fullpathlen += strlen("\\*.*"); + + /* Create the full search path */ + + pfp = (char *)malloc(fullpathlen + 1); /* add one for safety*/ + if (pfp == NULL) return NULL; + + /* construct the full path */ + strcpy(pfp, path); + if (match) + { + strcat(pfp,"\\"); + strcat(pfp,match); + } + else + strcat(pfp,"\\*.*"); + + /* pfp now contains the fully constructed path*/ + + pfup = convert_utf_unicode(pfp); + free(pfp); /* chuck it away now as we don't need it, we have a unicode version */ + if (pfup == NULL) return NULL; + + fh = FindFirstFileW(pfup,&find); + free(pfup); /* chuck it away now as we don't need it, we have a handle */ + if (fh == INVALID_HANDLE_VALUE) return NULL; + + /* OK now go through the directory picking up filenames */ + do + { + if (!(find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + files = evas_list_append(files,convert_unicode_utf(find.cFileName)); + + } + while (FindNextFileW(fh,&find)); + FindClose(fh); + + return files; +} + +DATA64 +evas_file_modified_time(const char *file) +{ + WIN32_FIND_DATAW find; + HANDLE fh; + ULARGE_INTEGER modtime; + wchar_t *pufile; + + pufile = convert_utf_unicode(file); + if (pufile == NULL) return 0; + + fh = FindFirstFileW(pufile,&find); + if (fh == INVALID_HANDLE_VALUE) + { + free(pufile); + return 0; + } + FindClose(fh); + free(pufile); + + modtime.u.HighPart = find.ftCreationTime.dwHighDateTime; + modtime.u.LowPart = find.ftCreationTime.dwLowDateTime; + + return modtime.QuadPart; +} + +char * +evas_file_path_resolve(const char *file) +{ + return strdup(file); +} +#endif diff --git a/src/lib/file/evas_path.h b/src/lib/file/evas_path.h new file mode 100644 index 0000000..9874675 --- /dev/null +++ b/src/lib/file/evas_path.h @@ -0,0 +1,15 @@ +#ifndef _EVAS_PATH_H +#define _EVAS_PATH_H + + +int evas_file_path_is_full_path (const char *path); +char *evas_file_path_join (const char *path, const char *end); +int evas_file_path_exists (const char *path); +int evas_file_path_is_file (const char *path); +int evas_file_path_is_dir (const char *path); +Evas_List *evas_file_path_list (char *path, const char *match, int match_case); +DATA64 evas_file_modified_time (const char *file); +char *evas_file_path_resolve (const char *file); + + +#endif /* _EVAS_PATH_H */ diff --git a/src/lib/imaging/.cvsignore b/src/lib/imaging/.cvsignore new file mode 100644 index 0000000..7b51b3c --- /dev/null +++ b/src/lib/imaging/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +evas_imaging.lo +libevas_imaging.la diff --git a/src/lib/imaging/Makefile.am b/src/lib/imaging/Makefile.am new file mode 100644 index 0000000..cd6528d --- /dev/null +++ b/src/lib/imaging/Makefile.am @@ -0,0 +1,17 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = -I. \ + -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/lib/include \ + -DPACKAGE_BIN_DIR=\"$(bindir)\" \ + -DPACKAGE_LIB_DIR=\"$(libdir)\" \ + -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ + @FREETYPE_CFLAGS@ \ + @EET_CFLAGS@ + +noinst_LTLIBRARIES = libevas_imaging.la +libevas_imaging_la_SOURCES = \ +evas_imaging.c + +libevas_imaging_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/lib/imaging/evas_imaging.c b/src/lib/imaging/evas_imaging.c new file mode 100644 index 0000000..3befdce --- /dev/null +++ b/src/lib/imaging/evas_imaging.c @@ -0,0 +1,220 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" /* so that EAPI in Eet.h is correctly defined */ +#endif + +#ifdef BUILD_FONT_LOADER_EET +#include +#endif + +#include "evas_common.h" +#include "evas_private.h" + +EAPI Evas_Imaging_Image * +evas_imaging_image_load(const char *file, const char *key) +{ + Evas_Imaging_Image *im; + RGBA_Image *image; + + if (!file) file = ""; + if (!key) key = ""; + evas_common_cpu_init(); + evas_common_image_init(); + image = evas_common_load_image_from_file(file, key, NULL); + if (!image) return NULL; + im = calloc(1, sizeof(Evas_Imaging_Image)); + if (!im) + { + evas_cache_image_drop(&image->cache_entry); + return NULL; + } + im->image = image; + return im; +} + +EAPI void +evas_imaging_image_free(Evas_Imaging_Image *im) +{ + if (!im) return; + evas_cache_image_drop(&im->image->cache_entry); + free(im); +} + +EAPI void +evas_imaging_image_size_get(const Evas_Imaging_Image *im, int *w, int *h) +{ + if (!im) return; + if (w) *w = im->image->cache_entry.w; + if (h) *h = im->image->cache_entry.h; +} + +EAPI Evas_Bool +evas_imaging_image_alpha_get(const Evas_Imaging_Image *im) +{ + if (!im) return 0; + if (im->image->cache_entry.flags.alpha) return 1; + return 0; +} + +EAPI void +evas_imaging_image_cache_set(int bytes) +{ + evas_common_image_set_cache(bytes); +} + +EAPI int +evas_imaging_image_cache_get(void) +{ + return evas_common_image_get_cache(); +} + +static Evas_Font_Hinting_Flags _evas_hinting = EVAS_FONT_HINTING_BYTECODE; + +EAPI void +evas_imaging_font_hinting_set(Evas_Font_Hinting_Flags hinting) +{ + _evas_hinting = hinting; +} + +EAPI Evas_Font_Hinting_Flags +evas_imaging_font_hinting_get(void) +{ + return _evas_hinting; +} + +EAPI Evas_Bool +evas_imaging_font_hinting_can_hint(Evas_Font_Hinting_Flags hinting) +{ + return evas_common_hinting_available(hinting); +} + +EAPI Evas_Imaging_Font * +evas_imaging_font_load(const char *file, const char *key, int size) +{ + Evas_Imaging_Font *fn; + RGBA_Font *font; + + evas_common_cpu_init(); + evas_common_font_init(); + if (!file) file = ""; + if ((key) && (key[0] == 0)) key = NULL; +#ifdef BUILD_FONT_LOADER_EET + if (key) + { + char *tmp; + + tmp = evas_file_path_join(file, key); + if (tmp) + { + font = evas_common_font_hinting_load(tmp, size, _evas_hinting); + if (!font) + { + Eet_File *ef; + + ef = eet_open((char *)file, EET_FILE_MODE_READ); + if (ef) + { + void *fdata; + int fsize = 0; + + fdata = eet_read(ef, (char *)key, &fsize); + if ((fdata) && (fsize > 0)) + { + font = evas_common_font_memory_hinting_load(tmp, size, fdata, fsize, _evas_hinting); + free(fdata); + } + eet_close(ef); + } + } + free(tmp); + } + } + else +#endif + { + font = evas_common_font_hinting_load((char *)file, size, _evas_hinting); + } + fn = calloc(1, sizeof(RGBA_Font)); + if (!fn) return NULL; + fn->font = font; + return fn; +} + +EAPI void +evas_imaging_font_free(Evas_Imaging_Font *fn) +{ + evas_common_font_free(fn->font); + free(fn); +} + +EAPI int +evas_imaging_font_ascent_get(const Evas_Imaging_Font *fn) +{ + return evas_common_font_ascent_get(fn->font); +} + +EAPI int +evas_imaging_font_descent_get(const Evas_Imaging_Font *fn) +{ + return evas_common_font_descent_get(fn->font); +} + +EAPI int +evas_imaging_font_max_ascent_get(const Evas_Imaging_Font *fn) +{ + return evas_common_font_max_ascent_get(fn->font); +} + +EAPI int +evas_imaging_font_max_descent_get(const Evas_Imaging_Font *fn) +{ + return evas_common_font_max_descent_get(fn->font); +} + +EAPI int +evas_imaging_font_line_advance_get(const Evas_Imaging_Font *fn) +{ + return evas_common_font_get_line_advance(fn->font); +} + +EAPI void +evas_imaging_font_string_advance_get(const Evas_Imaging_Font *fn, char *str, int *x, int *y) +{ + evas_common_font_query_advance(fn->font, str, x, y); +} + +EAPI void +evas_imaging_font_string_size_query(const Evas_Imaging_Font *fn, char *str, int *w, int *h) +{ + evas_common_font_query_size(fn->font, str, w, h); +} + +EAPI int +evas_imaging_font_string_inset_get(const Evas_Imaging_Font *fn, char *str) +{ + return evas_common_font_query_inset(fn->font, str); +} + +EAPI int +evas_imaging_font_string_char_coords_get(const Evas_Imaging_Font *fn, char *str, int pos, int *cx, int *cy, int *cw, int *ch) +{ + return evas_common_font_query_char_coords(fn->font, str, pos, cx, cy, cw, ch); +} + +EAPI int +evas_imaging_font_string_char_at_coords_get(const Evas_Imaging_Font *fn, char *str, int x, int y, int *cx, int *cy, int *cw, int *ch) +{ + return evas_common_font_query_text_at_pos(fn->font, str, x, y, cx, cy, cw, ch); +} + +EAPI void +evas_imaging_font_cache_set(int bytes) +{ + evas_common_font_cache_set(bytes); +} + +EAPI int +evas_imaging_font_cache_get(void) +{ + return evas_common_font_cache_get(); +} + diff --git a/src/lib/include/.cvsignore b/src/lib/include/.cvsignore new file mode 100644 index 0000000..3dda729 --- /dev/null +++ b/src/lib/include/.cvsignore @@ -0,0 +1,2 @@ +Makefile.in +Makefile diff --git a/src/lib/include/Makefile.am b/src/lib/include/Makefile.am new file mode 100644 index 0000000..1570bf4 --- /dev/null +++ b/src/lib/include/Makefile.am @@ -0,0 +1,12 @@ + +MAINTAINERCLEANFILES = Makefile.in + +EXTRA_DIST = \ +evas_inline.x \ +evas_private.h \ +evas_options.h \ +evas_macros.h \ +evas_mmx.h \ +evas_common.h \ +evas_common_soft16.h \ +evas_blend_ops.h diff --git a/src/lib/include/evas_blend_ops.h b/src/lib/include/evas_blend_ops.h new file mode 100644 index 0000000..30588a4 --- /dev/null +++ b/src/lib/include/evas_blend_ops.h @@ -0,0 +1,177 @@ +#ifndef EVAS_BLEND_OPS_H +#define EVAS_BLEND_OPS_H + +#if defined BUILD_MMX || defined BUILD_SSE +#include "evas_mmx.h" +#endif + +/* src pixel flags: */ + +/* pixels none */ +#define SP_N 0 +/* pixels (argb default) */ +#define SP 1 +/* pixels are rgb (ie. alphas == 255) */ +#define SP_AN 2 +/* pixels alpha are sparse */ +#define SP_AS 3 +/* src pixels flags count */ +#define SP_LAST 4 + +/* src mask flags: */ + +/* mask none */ +#define SM_N 0 +/* mask (alpha) */ +#define SM 1 +/* mask alphas are 'trivial - ie. only 0 or 255 */ +#define SM_AT 2 +/* mask alphas are sparse */ +#define SM_AS 3 +/* src mask flags count */ +#define SM_LAST 4 + +/* src color flags: */ + +/* color is 0xffffffff */ +#define SC_N 0 +/* color (argb default) */ +#define SC 1 +/* color is rgb (ie. 0xffrrggbb) */ +#define SC_AN 2 +/* color is 'alpha' (ie. 0xaaaaaaaa) */ +#define SC_AA 3 +/* src color flags count */ +#define SC_LAST 4 + +/* dst pixels flags: */ + +/* pixels (argb default) */ +#define DP 0 +/* pixels are rgb (ie. alphas == 255) */ +#define DP_AN 1 +/* dst pixels flags count */ +#define DP_LAST 2 + +/* cpu types flags */ + +/* none, bad news */ +#define CPU_N 0 +/* cpu C */ +#define CPU_C 1 +/* cpu MMX */ +#define CPU_MMX 2 +/* cpu SSE */ +#define CPU_SSE 3 +/* cpu SSE2 */ +#define CPU_SSE2 4 +/* cpu flags count */ +#define CPU_LAST 5 + + +/* some useful constants */ + +extern const DATA32 ALPHA_255; +extern const DATA32 ALPHA_256; + +/* some useful C macros */ + +#define MUL4_256(a, r, g, b, c) \ + ( (((((c) >> 8) & 0xff0000) * (a)) & 0xff000000) + \ + (((((c) & 0xff0000) * (r)) >> 8) & 0xff0000) + \ + (((((c) & 0xff00) * (g)) >> 8) & 0xff00) + \ + ((((c) & 0xff) * (b)) >> 8) ) + +#define MUL3_256(r, g, b, c) \ + ( (((((c) & 0xff0000) * (r)) >> 8) & 0xff0000) + \ + (((((c) & 0xff00) * (g)) >> 8) & 0xff00) + \ + ((((c) & 0xff) * (b)) >> 8) ) + +#define MUL_256(a, c) \ + ( (((((c) >> 8) & 0x00ff00ff) * (a)) & 0xff00ff00) + \ + (((((c) & 0x00ff00ff) * (a)) >> 8) & 0x00ff00ff) ) + +#define MUL4_SYM(x, y) \ + ( ((((((x) >> 16) & 0xff00) * (((y) >> 16) & 0xff00)) + 0xff0000) & 0xff000000) + \ + ((((((x) >> 8) & 0xff00) * (((y) >> 16) & 0xff)) + 0xff00) & 0xff0000) + \ + ((((((x) & 0xff00) * ((y) & 0xff00)) + 0xff00) >> 16) & 0xff00) + \ + (((((x) & 0xff) * ((y) & 0xff)) + 0xff) >> 8) ) + +#define MUL3_SYM(x, y) \ + ( ((((((x) >> 8) & 0xff00) * (((y) >> 16) & 0xff)) + 0xff00) & 0xff0000) + \ + ((((((x) & 0xff00) * ((y) & 0xff00)) + 0xff00) >> 16) & 0xff00) + \ + (((((x) & 0xff) * ((y) & 0xff)) + 0xff) >> 8) ) + +#define MUL_SYM(a, x) \ + ( (((((x) >> 8) & 0x00ff00ff) * (a) + 0xff00ff) & 0xff00ff00) + \ + (((((x) & 0x00ff00ff) * (a) + 0xff00ff) >> 8) & 0x00ff00ff) ) + +#define MUL_A_256(a, c) \ + ( ((((c) >> 8) & 0x00ff0000) * (a)) & 0xff000000 ) + +#define MUL_A_SYM(a, c) \ + ( (((((c) >> 8) & 0x00ff0000) * (a)) + 0x00ff0000) & 0xff000000 ) + +#define INTERP_256(a, c0, c1) \ + ( (((((((c0) >> 8) & 0xff00ff) - (((c1) >> 8) & 0xff00ff)) * (a)) \ + + ((c1) & 0xff00ff00)) & 0xff00ff00) + \ + (((((((c0) & 0xff00ff) - ((c1) & 0xff00ff)) * (a)) >> 8) \ + + ((c1) & 0xff00ff)) & 0xff00ff) ) + +#define INTERP_RGB_256(a, c0, c1) \ + ( (((((((c0) >> 8) & 0xff) - (((c1) >> 8) & 0xff)) * (a)) \ + + ((c1) & 0xff00)) & 0xff00) + \ + (((((((c0) & 0xff00ff) - ((c1) & 0xff00ff)) * (a)) >> 8) \ + + ((c1) & 0xff00ff)) & 0xff00ff) ) + +#define INTERP_A_256(a, c0, c1) \ + ( (((((((c0) >> 8) & 0xff0000) - (((c1) >> 8) & 0xff0000)) * (a)) \ + + ((c1) & 0xff000000)) & 0xff000000) ) + + +/* some useful MMX macros */ + +#ifdef BUILD_MMX +#define MOV_A2R(a, mma) \ + movd_m2r(a, mma); \ + punpcklwd_r2r(mma, mma); \ + punpckldq_r2r(mma, mma); + +#define MOV_P2R(c, mmc, mmz) \ + movd_m2r(c, mmc); \ + punpcklbw_r2r(mmz, mmc); + +#define MOV_R2P(mmc, c, mmz) \ + packuswb_r2r(mmz, mmc); \ + movd_r2m(mmc, c); + +#define MUL4_256_R2R(mmx, mmy) \ + pmullw_r2r(mmx, mmy); \ + psrlw_i2r(8, mmy); + +#define MUL4_SYM_R2R(mmx, mmy, mm255) \ + pmullw_r2r(mmx, mmy); \ + paddw_r2r(mm255, mmy); \ + psrlw_i2r(8, mmy); + +#define MOV_RA2R(mmx, mma) \ + movq_r2r(mmx, mma); \ + punpckhwd_r2r(mma, mma); \ + punpckhdq_r2r(mma, mma); + +#define MOV_PA2R(c, mma) \ + movd_m2r(c, mma); \ + punpcklbw_r2r(mma, mma); \ + punpckhwd_r2r(mma, mma); \ + punpckhdq_r2r(mma, mma); + +#define INTERP_256_R2R(mma, mmx, mmy, mm255) \ + psubw_r2r(mmy, mmx); \ + pmullw_r2r(mma, mmx); \ + psrlw_i2r(8, mmx); \ + paddw_r2r(mmx, mmy); \ + pand_r2r(mm255, mmy); + +#endif + +#endif diff --git a/src/lib/include/evas_cairo_common.h b/src/lib/include/evas_cairo_common.h new file mode 100644 index 0000000..693e459 --- /dev/null +++ b/src/lib/include/evas_cairo_common.h @@ -0,0 +1,169 @@ +#ifndef EVAS_CAIRO_COMMON_H +#define EVAS_CAIRO_COMMON_H + +#include "evas_common.h" +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +typedef struct _Evas_Cairo_Context Evas_Cairo_Context; +typedef struct _Evas_Cairo_Image Evas_Cairo_Image; +typedef struct _Evas_Cairo_Polygon Evas_Cairo_Polygon; +typedef struct _Evas_Cairo_Polygon_Point Evas_Cairo_Polygon_Point; +typedef struct _Evas_Cairo_Gradient Evas_Cairo_Gradient; + +struct _Evas_Cairo_Context +{ + cairo_t *cairo; + + struct { + double r, g, b, a; + } col; + struct { + unsigned int set : 1; + double r, g, b, a; + } mul; +}; + +struct _Evas_Cairo_Image +{ + RGBA_Image *im; + int references; + DATA32 *mulpix; + cairo_surface_t *surface; + cairo_pattern_t *pattern; +#if 0 + Evas_Cairo_Context *cc; + char dirty : 1; + char cached : 1; +#endif +}; + +struct _Evas_Cairo_Polygon +{ + Evas_List *points; +}; + +struct _Evas_Cairo_Polygon_Point +{ + int x, y; +}; + +#if 0 +struct _Evas_Cairo_Context +{ + unsigned char r, g, b, a; + + struct { + char size : 1; + char dither : 1; + char blend : 1; + char color : 1; + char texture : 1; + char clip : 1; + char buf : 1; + char other : 1; + } change; + + struct { + char active : 1; + int x, y, w, h; + } clip; + + struct { + int checked : 1; + int sgis_generate_mipmap : 1; + int nv_texture_rectangle : 1; + } ext; + + int references; + + Evas_List *images; +}; + +struct _Evas_Cairo_Image +{ + Evas_Cairo_Context *cc; + RGBA_Image *im; + cairo_surface_t *surf; + DATA32 *mulpix; + int references; + char dirty : 1; + char cached : 1; +}; + +struct _Evas_Cairo_Polygon +{ + Evas_List *points; +}; + +struct _Evas_Cairo_Polygon_Point +{ + int x, y; +}; + +struct _Evas_Cairo_Gradient +{ + RGBA_Gradient *grad; +}; +#endif + +/* +Evas_GL_Context *evas_gl_common_context_new(void); +void evas_gl_common_context_free(Evas_GL_Context *gc); +void evas_gl_common_context_use(Evas_GL_Context *gc); +void evas_gl_common_context_resize(Evas_GL_Context *gc, int w, int h); +void evas_gl_common_context_color_set(Evas_GL_Context *gc, int r, int g, int b, int a); +void evas_gl_common_context_blend_set(Evas_GL_Context *gc, int blend); +void evas_gl_common_context_dither_set(Evas_GL_Context *gc, int dither); +void evas_gl_common_context_texture_set(Evas_GL_Context *gc, Evas_GL_Texture *tex, int smooth, int w, int h); +void evas_gl_common_context_font_texture_set(Evas_GL_Context *gc, Evas_GL_Font_Texture *ft); +void evas_gl_common_context_clip_set(Evas_GL_Context *gc, int on, int x, int y, int w, int h); +void evas_gl_common_context_read_buf_set(Evas_GL_Context *gc, GLenum buf); +void evas_gl_common_context_write_buf_set(Evas_GL_Context *gc, GLenum buf); + +Evas_GL_Texture *evas_gl_common_texture_new(Evas_GL_Context *gc, RGBA_Image *im, int smooth); +void evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im, int smooth); +void evas_gl_common_texture_free(Evas_GL_Texture *tex); +void evas_gl_common_texture_mipmaps_build(Evas_GL_Texture *tex, RGBA_Image *im, int smooth); + +Evas_GL_Image *evas_gl_common_image_load(Evas_GL_Context *gc, char *file, char *key); +Evas_GL_Image *evas_gl_common_image_new_from_data(Evas_GL_Context *gc, int w, int h, int *data); +Evas_GL_Image *evas_gl_common_image_new_from_copied_data(Evas_GL_Context *gc, int w, int h, int *data); +Evas_GL_Image *evas_gl_common_image_new(Evas_GL_Context *gc, int w, int h); +void evas_gl_common_image_free(Evas_GL_Image *im); +void evas_gl_common_image_dirty(Evas_GL_Image *im); + +Evas_GL_Polygon *evas_gl_common_poly_point_add(Evas_GL_Polygon *poly, int x, int y); +Evas_GL_Polygon *evas_gl_common_poly_points_clear(Evas_GL_Polygon *poly); + +Evas_GL_Gradient *evas_gl_common_gradient_color_add(Evas_GL_Gradient *gr, int r, int g, int b, int a, int distance); +Evas_GL_Gradient *evas_gl_common_gradient_colors_clear(Evas_GL_Gradient *gr); + +void evas_gl_common_swap_rect(Evas_GL_Context *gc, int x, int y, int w, int h); + +void evas_gl_common_rect_draw(Evas_GL_Context *gc, RGBA_Draw_Context *dc, int x, int y, int w, int h); +void evas_gl_common_image_draw(Evas_GL_Context *gc, RGBA_Draw_Context *dc, Evas_GL_Image *im, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, int smooth); +void evas_gl_common_line_draw(Evas_GL_Context *gc, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2); +void evas_gl_common_poly_draw(Evas_GL_Context *gc, RGBA_Draw_Context *dc, Evas_GL_Polygon *poly); +void evas_gl_common_gradient_draw(Evas_GL_Context *gc, RGBA_Draw_Context *dc, Evas_GL_Gradient *gr, int x, int y, int w, int h, double angle); + +Evas_GL_Font_Texture *evas_gl_font_texture_new(Evas_GL_Context *gc, RGBA_Font_Glyph *fg); +void evas_gl_font_texture_free(Evas_GL_Font_Texture *ft); +void evas_gl_font_texture_draw(Evas_GL_Context *gc, void *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y); +*/ + +#endif diff --git a/src/lib/include/evas_common.h b/src/lib/include/evas_common.h new file mode 100644 index 0000000..9d71e3c --- /dev/null +++ b/src/lib/include/evas_common.h @@ -0,0 +1,868 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#ifndef EVAS_COMMON_H +#define EVAS_COMMON_H + +#ifdef HAVE_CONFIG_H +# include "config.h" /* so that EAPI in Evas.h is correctly defined */ +#endif + +#include "Evas.h" + +/*****************************************************************************/ + +#include "evas_options.h" + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#ifdef BUILD_PTHREAD +# include +# include +# define LK(x) pthread_mutex_t x +# define LKI(x) pthread_mutex_init(&(x), NULL); +# define LKD(x) pthread_mutex_destroy(&(x)); +# define LKL(x) pthread_mutex_lock(&(x)); +# define LKU(x) pthread_mutex_unlock(&(x)); +# define TH(x) pthread_t x +# define THI(x) int x +# define TH_MAX 8 + +// even though in theory having every Nth rendered line done by a different +// thread might even out load across threads - it actually slows things down. +//#define EVAS_SLI 1 + +#else +# define LK(x) +# define LKI(x) +# define LKD(x) +# define LKL(x) +# define LKU(x) +# define TH(x) +# define THI(x) +# define TH_MAX 0 +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_ALLOCA_H +# include +#elif defined __GNUC__ +# define alloca __builtin_alloca +#elif defined _AIX +# define alloca __alloca +#elif defined _MSC_VER +# include +# define alloca _alloca +#else +# include +# ifdef __cplusplus +extern "C" +# endif +void *alloca (size_t); +#endif + +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H +#include FT_SIZES_H +#include FT_MODULE_H + +#ifdef __GNUC__ +# if __GNUC__ >= 4 +// BROKEN in gcc 4 on amd64 +//# pragma GCC visibility push(hidden) +# endif +#define LIKELY(x) __builtin_expect(!!(x), 1) +#define UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define LIKELY(x) (x) +#define UNLIKELY(x) (x) +#endif + +/*****************************************************************************/ + +/* use exact rects for updates not tiles */ +/* #define RECTUPDATE */ +#define TILESIZE 8 + +#ifdef BUILD_SMALL_DITHER_MASK +# define DM_TABLE _evas_dither_44 +# define DM_SIZE 4 +# define DM_BITS 4 +# define DM_DIV 16 +# define USE_DITHER_44 1 +# define DM_MSK (DM_SIZE - 1) +# define DM_SHF(_b) (DM_BITS - (8 - _b)) +#else +# define DM_TABLE _evas_dither_128128 +# define DM_SIZE 128 +# define DM_BITS 6 +# define DM_DIV 64 +# define USE_DITHER_128128 1 +# define DM_MSK (DM_SIZE - 1) +# define DM_SHF(_b) (DM_BITS - (8 - _b)) +#endif + +/* if more than 1/ALPHA_SPARSE_INV_FRACTION is "alpha" (1-254) then sparse + * alpha flag gets set */ +#define ALPHA_SPARSE_INV_FRACTION 3 + +/*****************************************************************************/ + +/*****************************************************************************/ + +typedef unsigned long long DATA64; +typedef unsigned int DATA32; +typedef unsigned short DATA16; +typedef unsigned char DATA8; + +typedef struct _Image_Entry Image_Entry; +typedef struct _Image_Entry_Flags Image_Entry_Flags; +typedef struct _Engine_Image_Entry Engine_Image_Entry; + +typedef struct _RGBA_Image_Loadopts RGBA_Image_Loadopts; +typedef struct _RGBA_Pipe_Op RGBA_Pipe_Op; +typedef struct _RGBA_Pipe RGBA_Pipe; +typedef struct _RGBA_Pipe_Thread_Info RGBA_Pipe_Thread_Info; +typedef struct _RGBA_Image RGBA_Image; +typedef struct _RGBA_Image_Span RGBA_Image_Span; +typedef struct _RGBA_Draw_Context RGBA_Draw_Context; +typedef struct _RGBA_Gradient RGBA_Gradient; +typedef struct _RGBA_Gradient_Color_Stop RGBA_Gradient_Color_Stop; +typedef struct _RGBA_Gradient_Alpha_Stop RGBA_Gradient_Alpha_Stop; +typedef struct _RGBA_Gradient_Type RGBA_Gradient_Type; +typedef struct _RGBA_Polygon_Point RGBA_Polygon_Point; +typedef struct _RGBA_Font RGBA_Font; +typedef struct _RGBA_Font_Int RGBA_Font_Int; +typedef struct _RGBA_Font_Source RGBA_Font_Source; +typedef struct _RGBA_Font_Glyph RGBA_Font_Glyph; +typedef struct _RGBA_Gfx_Compositor RGBA_Gfx_Compositor; + +typedef struct _Cutout_Rect Cutout_Rect; +typedef struct _Cutout_Rects Cutout_Rects; + +typedef struct _Convert_Pal Convert_Pal; + +typedef struct _Tilebuf Tilebuf; +typedef struct _Tilebuf_Tile Tilebuf_Tile; +typedef struct _Tilebuf_Rect Tilebuf_Rect; + +/* +typedef struct _Regionbuf Regionbuf; +typedef struct _Regionspan Regionspan; +*/ + +typedef void (*RGBA_Gfx_Func) (DATA32 *src, DATA8 *mask, DATA32 col, DATA32 *dst, int len); +typedef void (*RGBA_Gfx_Pt_Func) (DATA32 src, DATA8 mask, DATA32 col, DATA32 *dst); +typedef void (*Gfx_Func_Copy) (DATA32 *src, DATA32 *dst, int len); + +typedef void (*Gfx_Func_Convert) (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal); + +typedef void (*Gfx_Func_Gradient_Fill)(DATA32 *src, int src_len, + DATA32 *dst, DATA8 *mask, int len, + int x, int y, int axx, int axy, int ayx, int ayy, + void *geom_data); + +#include "../cache/evas_cache.h" + +/*****************************************************************************/ + +typedef enum _RGBA_Image_Flags +{ + RGBA_IMAGE_NOTHING = (0), +/* RGBA_IMAGE_HAS_ALPHA = (1 << 0), */ + RGBA_IMAGE_IS_DIRTY = (1 << 1), + RGBA_IMAGE_INDEXED = (1 << 2), + RGBA_IMAGE_ALPHA_ONLY = (1 << 3), + RGBA_IMAGE_ALPHA_TILES = (1 << 4), +/* RGBA_IMAGE_ALPHA_SPARSE = (1 << 5), */ +/* RGBA_IMAGE_LOADED = (1 << 6), */ +/* RGBA_IMAGE_NEED_DATA = (1 << 7) */ +} RGBA_Image_Flags; + +typedef enum _Convert_Pal_Mode +{ + PAL_MODE_NONE, + PAL_MODE_MONO, + PAL_MODE_GRAY4, + PAL_MODE_GRAY16, + PAL_MODE_GRAY64, + PAL_MODE_GRAY256, + PAL_MODE_RGB111, + PAL_MODE_RGB121, + PAL_MODE_RGB221, + PAL_MODE_RGB222, + PAL_MODE_RGB232, + PAL_MODE_RGB332, + PAL_MODE_RGB666, + PAL_MODE_LAST +} Convert_Pal_Mode; + +typedef enum _CPU_Features +{ + CPU_FEATURE_C = 0, + CPU_FEATURE_MMX = (1 << 0), + CPU_FEATURE_MMX2 = (1 << 1), + CPU_FEATURE_SSE = (1 << 2), + CPU_FEATURE_ALTIVEC = (1 << 3), + CPU_FEATURE_VIS = (1 << 4), + CPU_FEATURE_VIS2 = (1 << 5) +} CPU_Features; + +typedef enum _Font_Hint_Flags +{ + FONT_NO_HINT, + FONT_AUTO_HINT, + FONT_BYTECODE_HINT +} Font_Hint_Flags; + +/*****************************************************************************/ + +struct _RGBA_Image_Loadopts +{ + int scale_down_by; // if > 1 then use this + double dpi; // if > 0.0 use this + int w, h; // if > 0 use this +}; + +struct _Image_Entry_Flags +{ + Evas_Bool loaded : 1; + Evas_Bool dirty : 1; + Evas_Bool activ : 1; + Evas_Bool need_data : 1; + Evas_Bool lru_nodata : 1; + Evas_Bool cached : 1; + Evas_Bool alpha : 1; + Evas_Bool alpha_sparse : 1; +}; + +struct _Image_Entry +{ + Evas_Object_List _list_data; + + Evas_Cache_Image *cache; + + const char *cache_key; + + const char *file; + const char *key; + + time_t timestamp; + time_t laststat; + + int references; + + unsigned char scale; + + RGBA_Image_Loadopts load_opts; + int space; + int w; + int h; + + struct + { + int w; + int h; + } allocated; + + struct + { + void *module; + void *loader; + } info; + + Image_Entry_Flags flags; +}; + +struct _Engine_Image_Entry +{ + Evas_Object_List _list_data; + + /* Upper Engine data. */ + Image_Entry *src; + + /* Cache stuff. */ + Evas_Cache_Engine_Image *cache; + const char *cache_key; + + struct + { + Evas_Bool cached : 1; + Evas_Bool activ : 1; + Evas_Bool dirty : 1; + Evas_Bool loaded : 1; + Evas_Bool need_parent : 1; + } flags; + + int references; + int w; + int h; +}; + +struct _Cutout_Rect +{ + int x, y, w, h; +}; + +struct _Cutout_Rects +{ + Cutout_Rect* rects; + int active; + int max; +}; + +struct _RGBA_Draw_Context +{ + struct { + Evas_Bool use : 1; + DATA32 col; + } mul; + struct { + DATA32 col; + } col; + struct RGBA_Draw_Context_clip { + int x, y, w, h; + Evas_Bool use : 1; + } clip; + Cutout_Rects cutout; + struct { + struct { + void *(*gl_new) (void *data, RGBA_Font_Glyph *fg); + void (*gl_free) (void *ext_dat); + void (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y); + } func; + void *data; + } font_ext; + struct { + int color_space; + } interpolation; + struct { + int y, h; + } sli; + int render_op; + Evas_Bool anti_alias : 1; +}; + +struct _RGBA_Pipe_Op +{ + RGBA_Draw_Context context; + void (*op_func) (RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thread_Info *info); + void (*free_func) (RGBA_Pipe_Op *op); + + union { + struct { + int x, y, w, h; + } rect; + struct { + int x0, y0, x1, y1; + } line; + struct { + RGBA_Polygon_Point *points; + } poly; + struct { + RGBA_Gradient *grad; + int x, y, w, h; + } grad; + struct { + RGBA_Font *font; + int x, y; + char *text; + } text; + struct { + RGBA_Image *src; + int sx, sy, sw, sh, dx, dy, dw, dh; + int smooth; + char *text; + } image; + } op; +}; + +#define PIPE_LEN 256 + +struct _RGBA_Pipe +{ + Evas_Object_List _list_data; + int op_num; + RGBA_Pipe_Op op[PIPE_LEN]; +}; + +struct _RGBA_Pipe_Thread_Info +{ + RGBA_Image *im; + int x, y, w, h; +}; + +struct _RGBA_Image +{ + Image_Entry cache_entry; + + RGBA_Image_Flags flags; + struct + { +/* void *module; */ +/* void *loader; */ +/* char *real_file; */ + char *comment; +// int format; + } info; + + void *extended_info; + RGBA_Pipe *pipe; + int ref; + +/* unsigned char scale; */ + + /* Colorspace stuff. */ + struct { + void *data; + Evas_Bool no_free : 1; + Evas_Bool dirty : 1; + } cs; + + /* RGBA stuff */ + struct + { + DATA32 *data; + Evas_Bool no_free : 1; + } image; +}; + +struct _RGBA_Gradient_Color_Stop +{ + Evas_Object_List _list_data; + int r, g, b, a; + int dist; +}; + +struct _RGBA_Gradient_Alpha_Stop +{ + Evas_Object_List _list_data; + int a; + int dist; +}; + +struct _RGBA_Gradient +{ + struct + { + DATA32 *data; + int len; + float angle; + int direction; + float offset; + Evas_Bool has_alpha : 1; + } map; + + struct { + Evas_Object_List *stops; + DATA32 *data; + int nstops; + int len; + } color; + struct { + Evas_Object_List *stops; + DATA8 *data; + int nstops; + int len; + } alpha; + + struct + { + int x, y, w, h; + int spread; + float angle; + } fill; + struct + { + char *name; + char *params; + RGBA_Gradient_Type *geometer; + void *gdata; + } type; + + int references; + + Evas_Bool imported_data : 1; + Evas_Bool has_alpha : 1; +}; + +struct _RGBA_Gradient_Type +{ + const char *name; + void (*init)(void); + void (*shutdown)(void); + void (*geom_init)(RGBA_Gradient *gr); + void (*geom_set)(RGBA_Gradient *gr); + void (*geom_free)(void *gdata); + int (*has_alpha)(RGBA_Gradient *gr, int render_op); + int (*has_mask)(RGBA_Gradient *gr, int render_op); + int (*get_map_len)(RGBA_Gradient *gr); + Gfx_Func_Gradient_Fill (*get_fill_func)(RGBA_Gradient *gr, int render_op, unsigned char aa); +}; + +struct _RGBA_Polygon_Point +{ + Evas_Object_List _list_data; + int x, y; +}; + +struct _RGBA_Font +{ + Evas_List *fonts; + Font_Hint_Flags hinting; + int references; + LK(lock); +}; + +struct _RGBA_Font_Int +{ + Evas_Object_List _list_data; + + RGBA_Font_Source *src; + + int size; + int real_size; + + struct { + FT_Size size; + } ft; + + Evas_Hash *glyphs; + + int usage; + Font_Hint_Flags hinting; + + int references; +}; + +struct _RGBA_Font_Source +{ + Evas_Object_List _list_data; + + const char *name; + const char *file; + + void *data; + int data_size; + int current_size; + Evas_Array_Hash *charmap; + + struct { + int orig_upem; + FT_Face face; + } ft; + + int references; +}; + +struct _RGBA_Font_Glyph +{ + FT_Glyph glyph; + FT_BitmapGlyph glyph_out; + /* this is a problem - only 1 engine at a time can extend such a font... grrr */ + void *ext_dat; + void (*ext_dat_free) (void *ext_dat); +}; + +struct _RGBA_Gfx_Compositor +{ + const char *name; + + void (*init)(void); + void (*shutdown)(void); + + RGBA_Gfx_Func (*composite_pixel_span_get)(RGBA_Image *src, RGBA_Image *dst, int pixels); + RGBA_Gfx_Func (*composite_color_span_get)(DATA32 col, RGBA_Image *dst, int pixels); + RGBA_Gfx_Func (*composite_pixel_color_span_get)(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels); + RGBA_Gfx_Func (*composite_mask_color_span_get)(DATA32 col, RGBA_Image *dst, int pixels); + RGBA_Gfx_Func (*composite_pixel_mask_span_get)(RGBA_Image *src, RGBA_Image *dst, int pixels); + + RGBA_Gfx_Pt_Func (*composite_pixel_pt_get)(Image_Entry_Flags src_flags, RGBA_Image *dst); + RGBA_Gfx_Pt_Func (*composite_color_pt_get)(DATA32 col, RGBA_Image *dst); + RGBA_Gfx_Pt_Func (*composite_pixel_color_pt_get)(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst); + RGBA_Gfx_Pt_Func (*composite_mask_color_pt_get)(DATA32 col, RGBA_Image *dst); + RGBA_Gfx_Pt_Func (*composite_pixel_mask_pt_get)(Image_Entry_Flags src_flags, RGBA_Image *dst); +}; + +#define EVAS_RECT_SPLIT 1 +#ifdef EVAS_RECT_SPLIT +typedef struct list_node list_node_t; +typedef struct list list_t; +typedef struct rect rect_t; +typedef struct rect_node rect_node_t; + +struct list_node +{ + struct list_node *next; +}; + +struct list +{ + struct list_node *head; + struct list_node *tail; +}; + +struct rect +{ + short left; + short top; + short right; + short bottom; + short width; + short height; + int area; +}; + +struct rect_node +{ + struct list_node _lst; + struct rect rect; +}; + +void rect_list_node_pool_set_max(int max); +void rect_list_node_pool_flush(void); +list_node_t *rect_list_node_pool_get(void); +void rect_list_node_pool_put(list_node_t *node); + +void rect_init(rect_t *r, int x, int y, int w, int h); +void rect_list_append_node(list_t *rects, list_node_t *node); +void rect_list_append(list_t *rects, const rect_t r); +void rect_list_append_xywh(list_t *rects, int x, int y, int w, int h); +void rect_list_concat(list_t *rects, list_t *other); +list_node_t *rect_list_unlink_next(list_t *rects, list_node_t *parent_node); +void rect_list_del_next(list_t *rects, list_node_t *parent_node); +void rect_list_clear(list_t *rects); +void rect_list_del_split_strict(list_t *rects, const rect_t del_r); +void rect_list_add_split_strict(list_t *rects, list_node_t *node); +list_node_t *rect_list_add_split_fuzzy(list_t *rects, list_node_t *node, int accepted_error); +void rect_list_merge_rects(list_t *rects, list_t *to_merge, int accepted_error);void rect_list_add_split_fuzzy_and_merge(list_t *rects, list_node_t *node, int split_accepted_error, int merge_accepted_error); + +void rect_print(const rect_t r); +void rect_list_print(const list_t rects); +#endif /* EVAS_RECT_SPLIT */ + +struct _Tilebuf +{ + int outbuf_w; + int outbuf_h; + + struct { + int w, h; + } tile_size; + +#ifdef RECTUPDATE + Regionbuf *rb; +#elif defined(EVAS_RECT_SPLIT) + int need_merge; + list_t rects; +#else + struct { + int w, h; + Tilebuf_Tile *tiles; + } tiles; +#endif +}; + +struct _Tilebuf_Tile +{ + Evas_Bool redraw : 1; +/* FIXME: need these flags later - but not now */ +/* + Evas_Bool done : 1; + Evas_Bool edge : 1; + Evas_Bool from : 1; + + struct { + int dx, dy; + } vector; + */ +}; + +struct _Tilebuf_Rect +{ + Evas_Object_List _list_data; + int x, y, w, h; +}; +/* +struct _Regionbuf +{ + int w, h; + Regionspan **spans; +}; + +struct _Regionspan +{ + Evas_Object_List _list_data; + int x1, x2; +}; +*/ + +struct _Convert_Pal +{ + int references; + int count; + Convert_Pal_Mode colors; + DATA8 *lookup; + void *data; +}; + +/****/ + +/*****************************************************************************/ +#include "evas_macros.h" + +#ifndef WORDS_BIGENDIAN +/* x86 */ +#define A_VAL(p) ((DATA8 *)(p))[3] +#define R_VAL(p) ((DATA8 *)(p))[2] +#define G_VAL(p) ((DATA8 *)(p))[1] +#define B_VAL(p) ((DATA8 *)(p))[0] +#define AR_VAL(p) ((DATA16 *)(p)[1]) +#define GB_VAL(p) ((DATA16 *)(p)[0]) +#else +/* ppc */ +#define A_VAL(p) ((DATA8 *)(p))[0] +#define R_VAL(p) ((DATA8 *)(p))[1] +#define G_VAL(p) ((DATA8 *)(p))[2] +#define B_VAL(p) ((DATA8 *)(p))[3] +#define AR_VAL(p) ((DATA16 *)(p)[0]) +#define GB_VAL(p) ((DATA16 *)(p)[1]) +#endif + +#define RGB_JOIN(r,g,b) \ + (((r) << 16) + ((g) << 8) + (b)) + +#define ARGB_JOIN(a,r,g,b) \ + (((a) << 24) + ((r) << 16) + ((g) << 8) + (b)) + +#include "evas_blend_ops.h" + +#define _EVAS_RENDER_FILL -1 +#define _EVAS_RENDER_BLEND 0 +#define _EVAS_RENDER_BLEND_REL 1 +#define _EVAS_RENDER_COPY 2 +#define _EVAS_RENDER_COPY_REL 3 +#define _EVAS_RENDER_ADD 4 +#define _EVAS_RENDER_ADD_REL 5 +#define _EVAS_RENDER_SUB 6 +#define _EVAS_RENDER_SUB_REL 7 +#define _EVAS_RENDER_TINT 8 +#define _EVAS_RENDER_TINT_REL 9 +#define _EVAS_RENDER_MASK 10 +#define _EVAS_RENDER_MUL 11 +#define _EVAS_RENDER_CLIP 12 + +#define _EVAS_TEXTURE_REFLECT 0 +#define _EVAS_TEXTURE_REPEAT 1 +#define _EVAS_TEXTURE_RESTRICT 2 +#define _EVAS_TEXTURE_RESTRICT_REFLECT 3 +#define _EVAS_TEXTURE_RESTRICT_REPEAT 4 +#define _EVAS_TEXTURE_PAD 5 + +#define _EVAS_COLOR_SPACE_ARGB 0 +#define _EVAS_COLOR_SPACE_AHSV 1 + +/*****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +/****/ +void evas_common_init (void); +void evas_common_shutdown (void); + +EAPI void evas_common_cpu_init (void); + +int evas_common_cpu_have_cpuid (void); +int evas_common_cpu_has_feature (unsigned int feature); +EAPI void evas_common_cpu_can_do (int *mmx, int *sse, int *sse2); +EAPI void evas_common_cpu_end_opt (void); +EAPI int evas_common_cpu_count (void); + +/****/ +#include "../engines/common/evas_blend.h" + +EAPI Gfx_Func_Copy evas_common_draw_func_copy_get (int pixels, int reverse); + +/****/ +#include "../engines/common/evas_convert_color.h" +#include "../engines/common/evas_convert_colorspace.h" +#include "../engines/common/evas_convert_main.h" +#include "../engines/common/evas_convert_yuv.h" +#include "../engines/common/evas_scale_main.h" +#include "../engines/common/evas_scale_smooth.h" +#include "../engines/common/evas_scale_span.h" + +/****/ +#include "../engines/common/evas_image.h" + +/****/ +#include "../engines/common/evas_line.h" +#include "../engines/common/evas_polygon.h" +#include "../engines/common/evas_rectangle.h" + +/****/ +EAPI void evas_common_blit_init (void); + +EAPI void evas_common_blit_rectangle (const RGBA_Image *src, RGBA_Image *dst, int src_x, int src_y, int w, int h, int dst_x, int dst_y); + +/****/ +#include "../engines/common/evas_gradient.h" +#include "../engines/common/evas_font.h" + +/****/ +EAPI void evas_common_tilebuf_init (void); + +EAPI Tilebuf *evas_common_tilebuf_new (int w, int h); +EAPI void evas_common_tilebuf_free (Tilebuf *tb); +EAPI void evas_common_tilebuf_set_tile_size (Tilebuf *tb, int tw, int th); +EAPI void evas_common_tilebuf_get_tile_size (Tilebuf *tb, int *tw, int *th); +EAPI int evas_common_tilebuf_add_redraw (Tilebuf *tb, int x, int y, int w, int h); +EAPI int evas_common_tilebuf_del_redraw (Tilebuf *tb, int x, int y, int w, int h); +EAPI int evas_common_tilebuf_add_motion_vector (Tilebuf *tb, int x, int y, int w, int h, int dx, int dy, int alpha); +EAPI void evas_common_tilebuf_clear (Tilebuf *tb); +EAPI Tilebuf_Rect *evas_common_tilebuf_get_render_rects (Tilebuf *tb); +EAPI void evas_common_tilebuf_free_render_rects (Tilebuf_Rect *rects); + +/* +Regionbuf *evas_common_regionbuf_new (int w, int h); +void evas_common_regionbuf_free (Regionbuf *rb); +void evas_common_regionbuf_clear (Regionbuf *rb); +void evas_common_regionbuf_span_add (Regionbuf *rb, int x1, int x2, int y); +void evas_common_regionbuf_span_del (Regionbuf *rb, int x1, int x2, int y); +Tilebuf_Rect *evas_common_regionbuf_rects_get (Regionbuf *rb); +*/ + +/****/ +#include "../engines/common/evas_draw.h" + +/****/ +#include "../engines/common/evas_pipe.h" + +void evas_font_dir_cache_free(void); + +/****/ + +/*****************************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/lib/include/evas_common_soft16.h b/src/lib/include/evas_common_soft16.h new file mode 100644 index 0000000..dd63ba3 --- /dev/null +++ b/src/lib/include/evas_common_soft16.h @@ -0,0 +1,147 @@ +#ifndef EVAS_COMMON_SOFT16_H +#define EVAS_COMMON_SOFT16_H + +#include "evas_common.h" +#include "evas_private.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef always_inline +#if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0) +# define always_inline __attribute__((always_inline)) inline +#else +# define always_inline inline +#endif +#endif + +#define RGB_565_UNPACKED_MASK 0x07e0f81f +#define RGB_565_UNPACK(rgb) \ + (((rgb) | ((rgb) << 16)) & RGB_565_UNPACKED_MASK) +#define RGB_565_PACK(rgb) \ + ((((rgb) & RGB_565_UNPACKED_MASK) | \ + ((rgb) & RGB_565_UNPACKED_MASK) >> 16) & 0xffff) +#define RGB_565_UNPACKED_BLEND(a, b, alpha) \ + ((b) + (a) - ((((b) * (alpha)) >> 5) & RGB_565_UNPACKED_MASK)) +#define RGB_565_UNPACKED_BLEND_UNMUL(a, b, alpha) \ + ((b) + ((((a) - (b)) * (alpha)) >> 5)) + +#define RGB_565_FROM_COMPONENTS(r, g, b) \ + (((((r) >> 3) & 0x1f) << 11) | \ + ((((g) >> 2) & 0x3f) << 5) | \ + (((b) >> 3) & 0x1f)) + +#define UNROLL2(op...) op op +#define UNROLL4(op...) UNROLL2(op) UNROLL2(op) +#define UNROLL8(op...) UNROLL4(op) UNROLL4(op) +#define UNROLL16(op...) UNROLL8(op) UNROLL8(op) + +#if defined(__ARM_ARCH_3M__) || defined(__ARM_ARCH_4__) || \ + defined(__ARM_ARCH_4T__) +# define __ARM_ARCH__ 4 +#endif + +#if defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || \ + defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || \ + defined(__ARM_ARCH_5TEJ__) +# define __ARM_ARCH__ 5 +#endif + +#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || \ + defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || \ + defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) +# define __ARM_ARCH__ 6 +#endif + +#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || \ + defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) +# define __ARM_ARCH__ 7 +#endif + + +#if defined(__ARM_ARCH__) && (__ARM_ARCH__ >= 5) +/* tested on ARMv6 (arm1136j-s), Nokia N800 CPU */ +#define pld(addr, off) \ + __asm__("pld [%[address], %[offset]]":: \ + [address] "r" (addr), [offset] "i" (off)) +#else +#define pld(addr, off) +#endif /* __ARMEL__ */ + +static inline int +_calc_stride(int w) +{ + int pad; + + pad = w % 4; + if (!pad) return w; + else return w + 4 - pad; +} + +#define IMG_BYTE_SIZE(stride, height, has_alpha) \ + ((stride) * (height) * (!(has_alpha) ? 2 : 3)) + +typedef struct _Soft16_Image Soft16_Image; +struct _Soft16_Image +{ + Image_Entry cache_entry; + + RGBA_Image *source; + + int stride; // pixel stride - likely a multiple of 2 + DATA16 *pixels; // 16bpp pixels rgb565 + DATA8 *alpha; // 8bit alpha mask - optional. points into pixels + + struct + { +/* unsigned char have_alpha : 1; // 1 if we have halpha */ + unsigned char free_pixels : 1; // 1 if pixels should be freed + unsigned char free_alpha : 1; // 1 if alpha mask should be freed + } flags; +}; + +/** + * Image (evas_soft16_main.c) + */ +EAPI void evas_common_soft16_image_init(void); +EAPI void evas_common_soft16_image_shutdown(void); +EAPI Evas_Cache_Image *evas_common_soft16_image_cache_get(void); + +EAPI void soft16_image_draw(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h, int smooth); +EAPI Soft16_Image *soft16_image_alpha_set(Soft16_Image *im, int have_alpha); + +void soft16_image_draw_unscaled(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, const Evas_Rectangle sr, const Evas_Rectangle dr, const Evas_Rectangle cr); +void soft16_image_draw_scaled_sampled(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, const Evas_Rectangle sr, const Evas_Rectangle dr, const Evas_Rectangle cr); + +/* convert/dither functions */ +void soft16_image_convert_from_rgb(Soft16_Image *im, const DATA32 *src); +void soft16_image_convert_from_rgba(Soft16_Image *im, const DATA32 *src); + +/** + * Rectangle (evas_soft16_rectangle.c) + */ +EAPI void soft16_rectangle_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h); + +/** + * Polygon (evas_soft16_polygon.c) + */ +EAPI void soft16_polygon_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points); + +/** + * Line (evas_soft16_line.c) + */ +EAPI void soft16_line_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1, int y1); + +/** + * Font (evas_soft16_font.c) + */ +EAPI void *soft16_font_glyph_new(void *data, RGBA_Font_Glyph *fg); +EAPI void soft16_font_glyph_free(void *ext_dat); +EAPI void soft16_font_glyph_draw(void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/lib/include/evas_inline.x b/src/lib/include/evas_inline.x new file mode 100644 index 0000000..b60cccd --- /dev/null +++ b/src/lib/include/evas_inline.x @@ -0,0 +1,207 @@ +#ifndef EVAS_INLINE_H +#define EVAS_INLINE_H + +static inline void +evas_add_rect(Evas_Rectangles *rects, int x, int y, int w, int h) +{ + if ((rects->count + 1) > rects->total) + { + Evas_Rectangle *_add_rect; + unsigned int _tmp_total; + + _tmp_total = rects->total + 32; + _add_rect = (Evas_Rectangle *)realloc(rects->array, sizeof(Evas_Rectangle) * _tmp_total); + if (!_add_rect) return ; + + rects->total = _tmp_total; + rects->array = _add_rect; + } + rects->array[rects->count].x = x; + rects->array[rects->count].y = y; + rects->array[rects->count].w = w; + rects->array[rects->count].h = h; + rects->count += 1; +} + +static inline Cutout_Rect* +evas_common_draw_context_cutouts_add(Cutout_Rects* rects, + int x, int y, int w, int h) +{ + Cutout_Rect* rect; + + if (rects->max < (rects->active + 1)) + { + rects->max += 32; + rects->rects = (Cutout_Rect *)realloc(rects->rects, sizeof(Cutout_Rect) * rects->max); + } + + rect = rects->rects + rects->active; + rect->x = x; + rect->y = y; + rect->w = w; + rect->h = h; + rects->active++; + + return rect; +} + +static inline int +evas_object_is_opaque(Evas_Object *obj) +{ + if (obj->smart.smart) return 0; + if (obj->cur.cache.clip.a == 255) + { + if (obj->func->is_opaque) + return obj->func->is_opaque(obj); + return 1; + } + return 0; +} + +static inline int +evas_event_passes_through(Evas_Object *obj) +{ + if (obj->layer->evas->events_frozen > 0) return 1; + if (obj->pass_events) return 1; + if (obj->parent_cache_valid) return obj->parent_pass_events; + if (obj->smart.parent) + { + int par_pass; + + par_pass = evas_event_passes_through(obj->smart.parent); + obj->parent_cache_valid = 1; + obj->parent_pass_events = par_pass; + return par_pass; + } + return 0; +} + +static inline int +evas_object_is_visible(Evas_Object *obj) +{ + if (obj->smart.smart) return 0; + if ((obj->cur.visible) && + (obj->cur.cache.clip.visible) && + (obj->cur.cache.clip.a > 0)) + { + if (obj->func->is_visible) + return obj->func->is_visible(obj); + return 1; + } + return 0; +} + +static inline int +evas_object_clippers_is_visible(Evas_Object *obj) +{ + if (obj->cur.visible) + { + if (obj->cur.clipper) + return evas_object_clippers_is_visible(obj->cur.clipper); + return 1; + } + return 0; +} + +static inline int +evas_object_is_in_output_rect(Evas_Object *obj, int x, int y, int w, int h) +{ + if (obj->smart.smart) return 0; + /* assumes coords have been recalced */ + if ((RECTS_INTERSECT(x, y, w, h, + obj->cur.cache.clip.x, + obj->cur.cache.clip.y, + obj->cur.cache.clip.w, + obj->cur.cache.clip.h))) + return 1; + return 0; +} + +static inline int +evas_object_is_active(Evas_Object *obj) +{ + if (obj->smart.smart) return 0; + if ((evas_object_is_visible(obj) || evas_object_was_visible(obj)) && + (evas_object_is_in_output_rect(obj, 0, 0, obj->layer->evas->output.w, + obj->layer->evas->output.h) || + evas_object_was_in_output_rect(obj, 0, 0, obj->layer->evas->output.w, + obj->layer->evas->output.h))) + return 1; + return 0; +} + +static inline void +evas_object_coords_recalc(Evas_Object *obj) +{ + if (obj->smart.smart) return; +//// if (obj->cur.cache.geometry.validity == obj->layer->evas->output_validity) +//// return; +//// obj->cur.cache.geometry.x = +//// evas_coord_world_x_to_screen(obj->layer->evas, obj->cur.geometry.x); +//// obj->cur.cache.geometry.y = +//// evas_coord_world_y_to_screen(obj->layer->evas, obj->cur.geometry.y); +//// obj->cur.cache.geometry.w = +//// evas_coord_world_x_to_screen(obj->layer->evas, obj->cur.geometry.w) - +//// evas_coord_world_x_to_screen(obj->layer->evas, 0); +//// obj->cur.cache.geometry.h = +//// evas_coord_world_y_to_screen(obj->layer->evas, obj->cur.geometry.h) - +//// evas_coord_world_y_to_screen(obj->layer->evas, 0); + if (obj->func->coords_recalc) obj->func->coords_recalc(obj); +//// obj->cur.cache.geometry.validity = obj->layer->evas->output_validity; +} + +static inline void +evas_object_clip_recalc(Evas_Object *obj) +{ + int cx, cy, cw, ch, cvis, cr, cg, cb, ca; + int nx, ny, nw, nh, nvis, nr, ng, nb, na; + + if (obj->layer->evas->events_frozen > 0) return; +// if (!obj->cur.clipper->cur.cache.clip.dirty) return; + evas_object_coords_recalc(obj); + cx = obj->cur.geometry.x; cy = obj->cur.geometry.y; + cw = obj->cur.geometry.w; ch = obj->cur.geometry.h; +//// cx = obj->cur.cache.geometry.x; cy = obj->cur.cache.geometry.y; +//// cw = obj->cur.cache.geometry.w; ch = obj->cur.cache.geometry.h; + if (obj->cur.color.a == 0) cvis = 0; + else cvis = obj->cur.visible; + cr = obj->cur.color.r; cg = obj->cur.color.g; + cb = obj->cur.color.b; ca = obj->cur.color.a; + if (obj->cur.clipper) + { +// this causes problems... hmmm +// if (obj->cur.clipper->cur.cache.clip.dirty) + evas_object_clip_recalc(obj->cur.clipper); + nx = obj->cur.clipper->cur.cache.clip.x; + ny = obj->cur.clipper->cur.cache.clip.y; + nw = obj->cur.clipper->cur.cache.clip.w; + nh = obj->cur.clipper->cur.cache.clip.h; + RECTS_CLIP_TO_RECT(cx, cy, cw, ch, nx, ny, nw, nh); + + nvis = obj->cur.clipper->cur.cache.clip.visible; + nr = obj->cur.clipper->cur.cache.clip.r; + ng = obj->cur.clipper->cur.cache.clip.g; + nb = obj->cur.clipper->cur.cache.clip.b; + na = obj->cur.clipper->cur.cache.clip.a; + cvis = cvis * nvis; + cr = (cr * (nr + 1)) >> 8; + cg = (cg * (ng + 1)) >> 8; + cb = (cb * (nb + 1)) >> 8; + ca = (ca * (na + 1)) >> 8; + } + if ((ca == 0) || (cw <= 0) || (ch <= 0)) cvis = 0; + obj->cur.cache.clip.x = cx; + obj->cur.cache.clip.y = cy; + obj->cur.cache.clip.w = cw; + obj->cur.cache.clip.h = ch; + obj->cur.cache.clip.visible = cvis; + obj->cur.cache.clip.r = cr; + obj->cur.cache.clip.g = cg; + obj->cur.cache.clip.b = cb; + obj->cur.cache.clip.a = ca; + obj->cur.cache.clip.dirty = 0; +} + +#include "data/evas_inline_array.x" + +#endif diff --git a/src/lib/include/evas_macros.h b/src/lib/include/evas_macros.h new file mode 100644 index 0000000..56d8351 --- /dev/null +++ b/src/lib/include/evas_macros.h @@ -0,0 +1,218 @@ +#ifndef EVAS_MACROS_H +#define EVAS_MACROS_H + +#undef ABS +#define ABS(x) (((x) < 0) ? -(x) : (x)) + +#undef SGN +#define SGN(x) (((x) < 0) ? -1 : 1) + +#undef MIN +#define MIN(x, y) (((x) < (y)) ? (x) : (y)) + +#undef MAX +#define MAX(x, y) (((x) > (y)) ? (x) : (y)) + +#define SWAP32(x) (x) = \ + ((((x) & 0x000000ff ) << 24) | \ + (((x) & 0x0000ff00 ) << 8) | \ + (((x) & 0x00ff0000 ) >> 8) | \ + (((x) & 0xff000000 ) >> 24)) + +#define SWAP16(x) (x) = \ + ((((x) & 0x00ff ) << 8) | \ + (((x) & 0xff00 ) >> 8)) + + +#define SPANS_COMMON(x1, w1, x2, w2) \ +(!((((x2) + (w2)) <= (x1)) || ((x2) >= ((x1) + (w1))))) + +#define RECTS_INTERSECT(x, y, w, h, xx, yy, ww, hh) \ +((SPANS_COMMON((x), (w), (xx), (ww))) && (SPANS_COMMON((y), (h), (yy), (hh)))) + +#define RECTS_CLIP_TO_RECT(_x, _y, _w, _h, _cx, _cy, _cw, _ch) \ +{ \ + if (RECTS_INTERSECT(_x, _y, _w, _h, _cx, _cy, _cw, _ch)) \ + { \ + if (_x < (_cx)) \ + { \ + _w += _x - (_cx); \ + _x = (_cx); \ + if (_w < 0) _w = 0; \ + } \ + if ((_x + _w) > ((_cx) + (_cw))) \ + _w = (_cx) + (_cw) - _x; \ + if (_y < (_cy)) \ + { \ + _h += _y - (_cy); \ + _y = (_cy); \ + if (_h < 0) _h = 0; \ + } \ + if ((_y + _h) > ((_cy) + (_ch))) \ + _h = (_cy) + (_ch) - _y; \ + } \ + else \ + { \ + _w = 0; _h = 0; \ + } \ +} + + +#define INTERP_VAL(out, in1, in2, in3, in4, interp_x, interp_y) \ + { \ + int _v, _vv; \ + \ + _v = (256 - (interp_x)) * (in1); \ + if ((interp_x) > 0) _v += (interp_x) * (in2); \ + _v *= (256 - (interp_y)); \ + if ((interp_y) > 0) \ + { \ + _vv = (256 - (interp_x)) * (in3); \ + if ((interp_x) > 0) _vv += (interp_x) * (in4); \ + _vv *= (interp_y); \ + (out) = ((_v + _vv) >> 16); \ + } \ + else (out) = (_v >> 16); \ + } + +#define INTERP_2(in1, in2, interp, interp_inv) \ + ((in1 * interp_inv) + (in2 * interp)) >> 8 + + +#define CONVERT_LOOP_START_ROT_0() \ + src_ptr = src; \ + for (y = 0; y < h; y++) \ + { \ + for (x = 0; x < w; x++) \ + { + +#define CONVERT_LOOP_END_ROT_0() \ + dst_ptr++; \ + src_ptr++; \ + } \ + src_ptr += src_jump; \ + dst_ptr += dst_jump; \ + } + +#define CONVERT_LOOP_START_ROT_180() \ + src_ptr = src + (w - 1) + ((h - 1) * (w + src_jump)); \ + for (y = 0; y < h; y++) \ + { \ + for (x = 0; x < w; x++) \ + { + +#define CONVERT_LOOP_END_ROT_180() \ + dst_ptr++; \ + src_ptr--; \ + } \ + src_ptr = src + (w - 1) + ((h - y - 2) * (w + src_jump)); \ + dst_ptr += dst_jump; \ + } + +#define CONVERT_LOOP_START_ROT_270() \ + src_ptr = src + ((w - 1) * (h + src_jump)); \ + for (y = 0; y < h; y++) \ + { \ + for (x = 0; x < w; x++) \ + { + +#define CONVERT_LOOP_END_ROT_270() \ + dst_ptr++; \ + src_ptr -= (h + src_jump); \ + } \ + src_ptr = src + ((w - 1) * (h + src_jump)) + (y + 1); \ + dst_ptr += dst_jump; \ + } + +#define CONVERT_LOOP_START_ROT_90() \ + src_ptr = src + (h - 1); \ + for (y = 0; y < h; y++) \ + { \ + for (x = 0; x < w; x++) \ + { + +#define CONVERT_LOOP_END_ROT_90() \ + dst_ptr++; \ + src_ptr += (h + src_jump); \ + } \ + src_ptr = src + (h - 1) - y - 1; \ + dst_ptr += dst_jump; \ + } + +#define CONVERT_LOOP2_START_ROT_0() \ + src_ptr = src; \ + for (y = 0; y < h; y++) \ + { \ + for (x = 0; x < w; x++) \ + { + +#define CONVERT_LOOP2_INC_ROT_0() \ +src_ptr++; \ +x++; + +#define CONVERT_LOOP2_END_ROT_0() \ + dst_ptr+=2; \ + src_ptr++; \ + } \ + src_ptr += src_jump; \ + dst_ptr += dst_jump; \ + } + +#define CONVERT_LOOP2_START_ROT_180() \ + src_ptr = src + (w - 1) + ((h - 1) * (w + src_jump)); \ + for (y = 0; y < h; y++) \ + { \ + for (x = 0; x < w; x++) \ + { + +#define CONVERT_LOOP2_INC_ROT_180() \ +src_ptr--; \ +x++; + +#define CONVERT_LOOP2_END_ROT_180() \ + dst_ptr+=2; \ + src_ptr--; \ + } \ + src_ptr = src + (w - 1) + ((h - y - 2) * (w + src_jump)); \ + dst_ptr += dst_jump; \ + } + +#define CONVERT_LOOP2_START_ROT_270() \ + src_ptr = src + ((w - 1) * (h + src_jump)); \ + for (y = 0; y < h; y++) \ + { \ + for (x = 0; x < w; x++) \ + { + +#define CONVERT_LOOP2_INC_ROT_270() \ +src_ptr -= (h + src_jump); \ +x++; + +#define CONVERT_LOOP2_END_ROT_270() \ + dst_ptr+=2; \ + src_ptr -= (h + src_jump); \ + } \ + src_ptr = src + ((w - 1) * (h + src_jump)) + (y + 1); \ + dst_ptr += dst_jump; \ + } + +#define CONVERT_LOOP2_START_ROT_90() \ + src_ptr = src + (h - 1); \ + for (y = 0; y < h; y++) \ + { \ + for (x = 0; x < w; x++) \ + { + +#define CONVERT_LOOP2_INC_ROT_90() \ +src_ptr += (h + src_jump); \ +x++; + +#define CONVERT_LOOP2_END_ROT_90() \ + dst_ptr+=2; \ + src_ptr += (h + src_jump); \ + } \ + src_ptr = src + (h - 1) - y - 1; \ + dst_ptr += dst_jump; \ + } + +#endif diff --git a/src/lib/include/evas_mmx.h b/src/lib/include/evas_mmx.h new file mode 100644 index 0000000..e1095e1 --- /dev/null +++ b/src/lib/include/evas_mmx.h @@ -0,0 +1,735 @@ +/* mmx.h + + MultiMedia eXtensions GCC interface library for IA32. + + To use this library, simply include this header file + and compile with GCC. You MUST have inlining enabled + in order for mmx_ok() to work; this can be done by + simply using -O on the GCC command line. + + Compiling with -DMMX_TRACE will cause detailed trace + output to be sent to stderr for each mmx operation. + This adds lots of code, and obviously slows execution to + a crawl, but can be very useful for debugging. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR ANY PARTICULAR PURPOSE. + + 1997-98 by H. Dietz and R. Fisher + + History: + 97-98* R.Fisher Early versions + 980501 R.Fisher Original Release + 980611* H.Dietz Rewrite, correctly implementing inlines, and + R.Fisher including direct register accesses. + 980616 R.Fisher Release of 980611 as 980616. + 980714 R.Fisher Minor corrections to Makefile, etc. + 980715 R.Fisher mmx_ok() now prevents optimizer from using + clobbered values. + mmx_ok() now checks if cpuid instruction is + available before trying to use it. + 980726* R.Fisher mm_support() searches for AMD 3DNow, Cyrix + Extended MMX, and standard MMX. It returns a + value which is positive if any of these are + supported, and can be masked with constants to + see which. mmx_ok() is now a call to this + 980726* R.Fisher Added i2r support for shift functions + 980919 R.Fisher Fixed AMD extended feature recognition bug. + 980921 R.Fisher Added definition/check for _MMX_H. + Added "float s[2]" to mmx_t for use with + 3DNow and EMMX. So same mmx_t can be used. + 981013 R.Fisher Fixed cpuid function 1 bug (looked at wrong reg) + Fixed psllq_i2r error in mmxtest.c + + * Unreleased (internal or interim) versions + + Notes: + It appears that the latest gas has the pand problem fixed, therefore + I'll undefine BROKEN_PAND by default. + String compares may be quicker than the multiple test/jumps in vendor + test sequence in mmx_ok(), but I'm not concerned with that right now. + + Acknowledgments: + Jussi Laako for pointing out the errors ultimately found to be + connected to the failure to notify the optimizer of clobbered values. + Roger Hardiman for reminding us that CPUID isn't everywhere, and that + someone may actually try to use this on a machine without CPUID. + Also for suggesting code for checking this. + Robert Dale for pointing out the AMD recognition bug. + Jimmy Mayfield and Carl Witty for pointing out the Intel recognition + bug. + Carl Witty for pointing out the psllq_i2r test bug. +*/ + +#ifndef _MMX_H +#define _MMX_H + +/* Warning: at this writing, the version of GAS packaged + with most Linux distributions does not handle the + parallel AND operation mnemonic correctly. If the + symbol BROKEN_PAND is defined, a slower alternative + coding will be used. If execution of mmxtest results + in an illegal instruction fault, define this symbol. +*/ +#undef BROKEN_PAND + + +/* The type of an value that fits in an MMX register + (note that long long constant values MUST be suffixed + by LL and unsigned long long values by ULL, lest + they be truncated by the compiler) +*/ +typedef union { + long long q; /* Quadword (64-bit) value */ + unsigned long long uq; /* Unsigned Quadword */ + int d[2]; /* 2 Doubleword (32-bit) values */ + unsigned int ud[2]; /* 2 Unsigned Doubleword */ + short w[4]; /* 4 Word (16-bit) values */ + unsigned short uw[4]; /* 4 Unsigned Word */ + char b[8]; /* 8 Byte (8-bit) values */ + unsigned char ub[8]; /* 8 Unsigned Byte */ + float s[2]; /* Single-precision (32-bit) value */ +} __attribute__ ((aligned (8))) mmx_t; + +/* Helper functions for the instruction macros that follow... + (note that memory-to-register, m2r, instructions are nearly + as efficient as register-to-register, r2r, instructions; + however, memory-to-memory instructions are really simulated + as a convenience, and are only 1/3 as efficient) +*/ + +/* These macros are a lot simpler without the tracing... +*/ + +#define mmx_i2r(op, imm, reg) \ + __asm__ __volatile__ (#op " $" #imm ", %%" #reg \ + : /* nothing */ \ + : /* nothing */); + +#define mmx_m2r(op, mem, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "m" (mem)) + +#define mmx_r2m(op, reg, mem) \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=m" (mem) \ + : /* nothing */ ) + +#define mmx_a2r(op, mem, reg) \ + __asm__ __volatile__ (#op " %0, %%" #reg \ + : /* nothing */ \ + : "m" (mem)) + +#define mmx_r2a(op, reg, mem) \ + __asm__ __volatile__ (#op " %%" #reg ", %0" \ + : "=m" (mem) \ + : /* nothing */ ) + +#define mmx_r2r(op, regs, regd) \ + __asm__ __volatile__ (#op " %" #regs ", %" #regd) + +#define mmx_m2m(op, mems, memd) \ + __asm__ __volatile__ ("movq %0, %%mm0\n\t" \ + #op " %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (memd) \ + : "X" (mems)) + +/* 1x64 MOVE Quadword + (this is both a load and a store... + in fact, it is the only way to store) +*/ +#define movq_m2r(var, reg) mmx_m2r(movq, var, reg) +#define movq_r2m(reg, var) mmx_r2m(movq, reg, var) +#define movq_r2r(regs, regd) mmx_r2r(movq, regs, regd) +#define movq(vars, vard) \ + __asm__ __volatile__ ("movq %1, %%mm0\n\t" \ + "movq %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) +#define movntq_r2m(reg, var) mmx_r2m(movntq, reg, var) + + +/* 1x32 MOVE Doubleword + (like movq, this is both load and store... + but is most useful for moving things between + mmx registers and ordinary registers) +*/ +#define movd_m2r(var, reg) mmx_a2r(movd, var, reg) +#define movd_r2m(reg, var) mmx_r2a(movd, reg, var) +#define movd_r2r(regs, regd) mmx_r2r(movd, regs, regd) +#define movd(vars, vard) \ + __asm__ __volatile__ ("movd %1, %%mm0\n\t" \ + "movd %%mm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) + + +/* 2x32, 4x16, and 8x8 Parallel ADDs +*/ +#define paddd_m2r(var, reg) mmx_m2r(paddd, var, reg) +#define paddd_r2r(regs, regd) mmx_r2r(paddd, regs, regd) +#define paddd(vars, vard) mmx_m2m(paddd, vars, vard) + +#define paddw_m2r(var, reg) mmx_m2r(paddw, var, reg) +#define paddw_r2r(regs, regd) mmx_r2r(paddw, regs, regd) +#define paddw(vars, vard) mmx_m2m(paddw, vars, vard) + +#define paddb_m2r(var, reg) mmx_m2r(paddb, var, reg) +#define paddb_r2r(regs, regd) mmx_r2r(paddb, regs, regd) +#define paddb(vars, vard) mmx_m2m(paddb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Saturation arithmetic +*/ +#define paddsw_m2r(var, reg) mmx_m2r(paddsw, var, reg) +#define paddsw_r2r(regs, regd) mmx_r2r(paddsw, regs, regd) +#define paddsw(vars, vard) mmx_m2m(paddsw, vars, vard) + +#define paddsb_m2r(var, reg) mmx_m2r(paddsb, var, reg) +#define paddsb_r2r(regs, regd) mmx_r2r(paddsb, regs, regd) +#define paddsb(vars, vard) mmx_m2m(paddsb, vars, vard) + + +/* 4x16 and 8x8 Parallel ADDs using Unsigned Saturation arithmetic +*/ +#define paddusw_m2r(var, reg) mmx_m2r(paddusw, var, reg) +#define paddusw_r2r(regs, regd) mmx_r2r(paddusw, regs, regd) +#define paddusw(vars, vard) mmx_m2m(paddusw, vars, vard) + +#define paddusb_m2r(var, reg) mmx_m2r(paddusb, var, reg) +#define paddusb_r2r(regs, regd) mmx_r2r(paddusb, regs, regd) +#define paddusb(vars, vard) mmx_m2m(paddusb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel SUBs +*/ +#define psubd_m2r(var, reg) mmx_m2r(psubd, var, reg) +#define psubd_r2r(regs, regd) mmx_r2r(psubd, regs, regd) +#define psubd(vars, vard) mmx_m2m(psubd, vars, vard) + +#define psubw_m2r(var, reg) mmx_m2r(psubw, var, reg) +#define psubw_r2r(regs, regd) mmx_r2r(psubw, regs, regd) +#define psubw(vars, vard) mmx_m2m(psubw, vars, vard) + +#define psubb_m2r(var, reg) mmx_m2r(psubb, var, reg) +#define psubb_r2r(regs, regd) mmx_r2r(psubb, regs, regd) +#define psubb(vars, vard) mmx_m2m(psubb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Saturation arithmetic +*/ +#define psubsw_m2r(var, reg) mmx_m2r(psubsw, var, reg) +#define psubsw_r2r(regs, regd) mmx_r2r(psubsw, regs, regd) +#define psubsw(vars, vard) mmx_m2m(psubsw, vars, vard) + +#define psubsb_m2r(var, reg) mmx_m2r(psubsb, var, reg) +#define psubsb_r2r(regs, regd) mmx_r2r(psubsb, regs, regd) +#define psubsb(vars, vard) mmx_m2m(psubsb, vars, vard) + + +/* 4x16 and 8x8 Parallel SUBs using Unsigned Saturation arithmetic +*/ +#define psubusw_m2r(var, reg) mmx_m2r(psubusw, var, reg) +#define psubusw_r2r(regs, regd) mmx_r2r(psubusw, regs, regd) +#define psubusw(vars, vard) mmx_m2m(psubusw, vars, vard) + +#define psubusb_m2r(var, reg) mmx_m2r(psubusb, var, reg) +#define psubusb_r2r(regs, regd) mmx_r2r(psubusb, regs, regd) +#define psubusb(vars, vard) mmx_m2m(psubusb, vars, vard) + + +/* 4x16 Parallel MULs giving Low 4x16 portions of results +*/ +#define pmullw_m2r(var, reg) mmx_m2r(pmullw, var, reg) +#define pmullw_r2r(regs, regd) mmx_r2r(pmullw, regs, regd) +#define pmullw(vars, vard) mmx_m2m(pmullw, vars, vard) + + +/* 4x16 Parallel MULs giving High 4x16 portions of results +*/ +#define pmulhw_m2r(var, reg) mmx_m2r(pmulhw, var, reg) +#define pmulhw_r2r(regs, regd) mmx_r2r(pmulhw, regs, regd) +#define pmulhw(vars, vard) mmx_m2m(pmulhw, vars, vard) + + +/* 4x16->2x32 Parallel Mul-ADD + (muls like pmullw, then adds adjacent 16-bit fields + in the multiply result to make the final 2x32 result) +*/ +#define pmaddwd_m2r(var, reg) mmx_m2r(pmaddwd, var, reg) +#define pmaddwd_r2r(regs, regd) mmx_r2r(pmaddwd, regs, regd) +#define pmaddwd(vars, vard) mmx_m2m(pmaddwd, vars, vard) + + +/* 1x64 bitwise AND +*/ +#ifdef BROKEN_PAND +#define pand_m2r(var, reg) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, reg); \ + mmx_m2r(pandn, var, reg); \ + } +#define pand_r2r(regs, regd) \ + { \ + mmx_m2r(pandn, (mmx_t) -1LL, regd); \ + mmx_r2r(pandn, regs, regd) \ + } +#define pand(vars, vard) \ + { \ + movq_m2r(vard, mm0); \ + mmx_m2r(pandn, (mmx_t) -1LL, mm0); \ + mmx_m2r(pandn, vars, mm0); \ + movq_r2m(mm0, vard); \ + } +#else +#define pand_m2r(var, reg) mmx_m2r(pand, var, reg) +#define pand_r2r(regs, regd) mmx_r2r(pand, regs, regd) +#define pand(vars, vard) mmx_m2m(pand, vars, vard) +#endif + + +/* 1x64 bitwise AND with Not the destination +*/ +#define pandn_m2r(var, reg) mmx_m2r(pandn, var, reg) +#define pandn_r2r(regs, regd) mmx_r2r(pandn, regs, regd) +#define pandn(vars, vard) mmx_m2m(pandn, vars, vard) + + +/* 1x64 bitwise OR +*/ +#define por_m2r(var, reg) mmx_m2r(por, var, reg) +#define por_r2r(regs, regd) mmx_r2r(por, regs, regd) +#define por(vars, vard) mmx_m2m(por, vars, vard) + + +/* 1x64 bitwise eXclusive OR +*/ +#define pxor_m2r(var, reg) mmx_m2r(pxor, var, reg) +#define pxor_r2r(regs, regd) mmx_r2r(pxor, regs, regd) +#define pxor(vars, vard) mmx_m2m(pxor, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for EQuality + (resulting fields are either 0 or -1) +*/ +#define pcmpeqd_m2r(var, reg) mmx_m2r(pcmpeqd, var, reg) +#define pcmpeqd_r2r(regs, regd) mmx_r2r(pcmpeqd, regs, regd) +#define pcmpeqd(vars, vard) mmx_m2m(pcmpeqd, vars, vard) + +#define pcmpeqw_m2r(var, reg) mmx_m2r(pcmpeqw, var, reg) +#define pcmpeqw_r2r(regs, regd) mmx_r2r(pcmpeqw, regs, regd) +#define pcmpeqw(vars, vard) mmx_m2m(pcmpeqw, vars, vard) + +#define pcmpeqb_m2r(var, reg) mmx_m2r(pcmpeqb, var, reg) +#define pcmpeqb_r2r(regs, regd) mmx_r2r(pcmpeqb, regs, regd) +#define pcmpeqb(vars, vard) mmx_m2m(pcmpeqb, vars, vard) + + +/* 2x32, 4x16, and 8x8 Parallel CoMPare for Greater Than + (resulting fields are either 0 or -1) +*/ +#define pcmpgtd_m2r(var, reg) mmx_m2r(pcmpgtd, var, reg) +#define pcmpgtd_r2r(regs, regd) mmx_r2r(pcmpgtd, regs, regd) +#define pcmpgtd(vars, vard) mmx_m2m(pcmpgtd, vars, vard) + +#define pcmpgtw_m2r(var, reg) mmx_m2r(pcmpgtw, var, reg) +#define pcmpgtw_r2r(regs, regd) mmx_r2r(pcmpgtw, regs, regd) +#define pcmpgtw(vars, vard) mmx_m2m(pcmpgtw, vars, vard) + +#define pcmpgtb_m2r(var, reg) mmx_m2r(pcmpgtb, var, reg) +#define pcmpgtb_r2r(regs, regd) mmx_r2r(pcmpgtb, regs, regd) +#define pcmpgtb(vars, vard) mmx_m2m(pcmpgtb, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Left Logical +*/ +#define psllq_i2r(imm, reg) mmx_i2r(psllq, imm, reg) +#define psllq_m2r(var, reg) mmx_m2r(psllq, var, reg) +#define psllq_r2r(regs, regd) mmx_r2r(psllq, regs, regd) +#define psllq(vars, vard) mmx_m2m(psllq, vars, vard) + +#define pslld_i2r(imm, reg) mmx_i2r(pslld, imm, reg) +#define pslld_m2r(var, reg) mmx_m2r(pslld, var, reg) +#define pslld_r2r(regs, regd) mmx_r2r(pslld, regs, regd) +#define pslld(vars, vard) mmx_m2m(pslld, vars, vard) + +#define psllw_i2r(imm, reg) mmx_i2r(psllw, imm, reg) +#define psllw_m2r(var, reg) mmx_m2r(psllw, var, reg) +#define psllw_r2r(regs, regd) mmx_r2r(psllw, regs, regd) +#define psllw(vars, vard) mmx_m2m(psllw, vars, vard) + + +/* 1x64, 2x32, and 4x16 Parallel Shift Right Logical +*/ +#define psrlq_i2r(imm, reg) mmx_i2r(psrlq, imm, reg) +#define psrlq_m2r(var, reg) mmx_m2r(psrlq, var, reg) +#define psrlq_r2r(regs, regd) mmx_r2r(psrlq, regs, regd) +#define psrlq(vars, vard) mmx_m2m(psrlq, vars, vard) + +#define psrld_i2r(imm, reg) mmx_i2r(psrld, imm, reg) +#define psrld_m2r(var, reg) mmx_m2r(psrld, var, reg) +#define psrld_r2r(regs, regd) mmx_r2r(psrld, regs, regd) +#define psrld(vars, vard) mmx_m2m(psrld, vars, vard) + +#define psrlw_i2r(imm, reg) mmx_i2r(psrlw, imm, reg) +#define psrlw_m2r(var, reg) mmx_m2r(psrlw, var, reg) +#define psrlw_r2r(regs, regd) mmx_r2r(psrlw, regs, regd) +#define psrlw(vars, vard) mmx_m2m(psrlw, vars, vard) + + +/* 2x32 and 4x16 Parallel Shift Right Arithmetic +*/ +#define psrad_i2r(imm, reg) mmx_i2r(psrad, imm, reg) +#define psrad_m2r(var, reg) mmx_m2r(psrad, var, reg) +#define psrad_r2r(regs, regd) mmx_r2r(psrad, regs, regd) +#define psrad(vars, vard) mmx_m2m(psrad, vars, vard) + +#define psraw_i2r(imm, reg) mmx_i2r(psraw, imm, reg) +#define psraw_m2r(var, reg) mmx_m2r(psraw, var, reg) +#define psraw_r2r(regs, regd) mmx_r2r(psraw, regs, regd) +#define psraw(vars, vard) mmx_m2m(psraw, vars, vard) + + +/* 2x32->4x16 and 4x16->8x8 PACK and Signed Saturate + (packs source and dest fields into dest in that order) +*/ +#define packssdw_m2r(var, reg) mmx_m2r(packssdw, var, reg) +#define packssdw_r2r(regs, regd) mmx_r2r(packssdw, regs, regd) +#define packssdw(vars, vard) mmx_m2m(packssdw, vars, vard) + +#define packsswb_m2r(var, reg) mmx_m2r(packsswb, var, reg) +#define packsswb_r2r(regs, regd) mmx_r2r(packsswb, regs, regd) +#define packsswb(vars, vard) mmx_m2m(packsswb, vars, vard) + + +/* 4x16->8x8 PACK and Unsigned Saturate + (packs source and dest fields into dest in that order) +*/ +#define packuswb_m2r(var, reg) mmx_m2r(packuswb, var, reg) +#define packuswb_r2r(regs, regd) mmx_r2r(packuswb, regs, regd) +#define packuswb(vars, vard) mmx_m2m(packuswb, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK Low + (interleaves low half of dest with low half of source + as padding in each result field) +*/ +#define punpckldq_m2r(var, reg) mmx_m2r(punpckldq, var, reg) +#define punpckldq_r2r(regs, regd) mmx_r2r(punpckldq, regs, regd) +#define punpckldq(vars, vard) mmx_m2m(punpckldq, vars, vard) + +#define punpcklwd_m2r(var, reg) mmx_m2r(punpcklwd, var, reg) +#define punpcklwd_r2r(regs, regd) mmx_r2r(punpcklwd, regs, regd) +#define punpcklwd(vars, vard) mmx_m2m(punpcklwd, vars, vard) + +#define punpcklbw_m2r(var, reg) mmx_m2r(punpcklbw, var, reg) +#define punpcklbw_r2r(regs, regd) mmx_r2r(punpcklbw, regs, regd) +#define punpcklbw(vars, vard) mmx_m2m(punpcklbw, vars, vard) + + +/* 2x32->1x64, 4x16->2x32, and 8x8->4x16 UNPaCK High + (interleaves high half of dest with high half of source + as padding in each result field) +*/ +#define punpckhdq_m2r(var, reg) mmx_m2r(punpckhdq, var, reg) +#define punpckhdq_r2r(regs, regd) mmx_r2r(punpckhdq, regs, regd) +#define punpckhdq(vars, vard) mmx_m2m(punpckhdq, vars, vard) + +#define punpckhwd_m2r(var, reg) mmx_m2r(punpckhwd, var, reg) +#define punpckhwd_r2r(regs, regd) mmx_r2r(punpckhwd, regs, regd) +#define punpckhwd(vars, vard) mmx_m2m(punpckhwd, vars, vard) + +#define punpckhbw_m2r(var, reg) mmx_m2r(punpckhbw, var, reg) +#define punpckhbw_r2r(regs, regd) mmx_r2r(punpckhbw, regs, regd) +#define punpckhbw(vars, vard) mmx_m2m(punpckhbw, vars, vard) + +#define MOVE_8DWORDS_MMX(src,dst) \ + __asm__ ( \ + "movq (%1), %%mm0 \n" \ + "movq 0x8(%1), %%mm1 \n" \ + "movq 0x10(%1), %%mm2 \n" \ + "movq 0x18(%1), %%mm3 \n" \ + "movq %%mm0, (%0) \n" \ + "movq %%mm1, 0x8(%0) \n" \ + "movq %%mm2, 0x10(%0) \n" \ + "movq %%mm3, 0x18(%0) \n" \ + : \ + : "q" (dst), "r" (src) \ + : "memory", "st"); + +#define MOVE_10DWORDS_MMX(src,dst) \ + __asm__ ( \ + "movq (%1), %%mm0 \n" \ + "movq 0x8(%1), %%mm1 \n" \ + "movq 0x10(%1), %%mm2 \n" \ + "movq 0x18(%1), %%mm3 \n" \ + "movq 0x20(%1), %%mm4 \n" \ + "movq %%mm0, (%0) \n" \ + "movq %%mm1, 0x8(%0) \n" \ + "movq %%mm2, 0x10(%0) \n" \ + "movq %%mm3, 0x18(%0) \n" \ + "movq %%mm4, 0x20(%0) \n" \ + : \ + : "q" (dst), "r" (src) \ + : "memory", "st"); + +#define MOVE_16DWORDS_MMX(src,dst) \ + __asm__ ( \ + "movq (%1), %%mm0 \n" \ + "movq 0x8(%1), %%mm1 \n" \ + "movq 0x10(%1), %%mm2 \n" \ + "movq 0x18(%1), %%mm3 \n" \ + "movq 0x20(%1), %%mm4 \n" \ + "movq 0x28(%1), %%mm5 \n" \ + "movq 0x30(%1), %%mm6 \n" \ + "movq 0x38(%1), %%mm7 \n" \ + "movq %%mm0, (%0) \n" \ + "movq %%mm1, 0x8(%0) \n" \ + "movq %%mm2, 0x10(%0) \n" \ + "movq %%mm3, 0x18(%0) \n" \ + "movq %%mm4, 0x20(%0) \n" \ + "movq %%mm5, 0x28(%0) \n" \ + "movq %%mm6, 0x30(%0) \n" \ + "movq %%mm7, 0x38(%0) \n" \ + : \ + : "q" (dst), "r" (src) \ + : "memory", "st"); + +#define MOVE_16DWORDS_MMX2(src,dst) \ + __asm__ ( \ + "movq (%1), %%mm0 \n" \ + "movq 0x8(%1), %%mm1 \n" \ + "movq 0x10(%1), %%mm2 \n" \ + "movq 0x18(%1), %%mm3 \n" \ + "movq 0x20(%1), %%mm4 \n" \ + "movq 0x28(%1), %%mm5 \n" \ + "movq 0x30(%1), %%mm6 \n" \ + "movq 0x38(%1), %%mm7 \n" \ + "movntq %%mm0, (%0) \n" \ + "movntq %%mm1, 0x8(%0) \n" \ + "movntq %%mm2, 0x10(%0) \n" \ + "movntq %%mm3, 0x18(%0) \n" \ + "movntq %%mm4, 0x20(%0) \n" \ + "movntq %%mm5, 0x28(%0) \n" \ + "movntq %%mm6, 0x30(%0) \n" \ + "movntq %%mm7, 0x38(%0) \n" \ + : \ + : "q" (dst), "r" (src) \ + : "memory", "st"); + +#define MOVE_32DWORDS_SSE2(src,dst) \ + __asm__ ( \ + "movdqu (%1), %%xmm0 \n" \ + "movdqu 0x10(%1), %%xmm1 \n" \ + "movdqu 0x20(%1), %%xmm2 \n" \ + "movdqu 0x30(%1), %%xmm3 \n" \ + "movdqu 0x40(%1), %%xmm4 \n" \ + "movdqu 0x50(%1), %%xmm5 \n" \ + "movdqu 0x60(%1), %%xmm6 \n" \ + "movdqu 0x70(%1), %%xmm7 \n" \ + "movntdq %%xmm0, (%0) \n" \ + "movntdq %%xmm1, 0x10(%0) \n" \ + "movntdq %%xmm2, 0x20(%0) \n" \ + "movntdq %%xmm3, 0x30(%0) \n" \ + "movntdq %%xmm4, 0x40(%0) \n" \ + "movntdq %%xmm5, 0x50(%0) \n" \ + "movntdq %%xmm6, 0x60(%0) \n" \ + "movntdq %%xmm7, 0x70(%0) \n" \ + : \ + : "q" (dst), "r" (src) \ + : "memory", "st"); + +#define MOVE_32DWORDS_ALIGNED_SSE2(src,dst) \ + __asm__ ( \ + "movdqa (%1), %%xmm0 \n" \ + "movdqa 0x10(%1), %%xmm1 \n" \ + "movdqa 0x20(%1), %%xmm2 \n" \ + "movdqa 0x30(%1), %%xmm3 \n" \ + "movdqa 0x40(%1), %%xmm4 \n" \ + "movdqa 0x50(%1), %%xmm5 \n" \ + "movdqa 0x60(%1), %%xmm6 \n" \ + "movdqa 0x70(%1), %%xmm7 \n" \ + "movntdq %%xmm0, (%0) \n" \ + "movntdq %%xmm1, 0x10(%0) \n" \ + "movntdq %%xmm2, 0x20(%0) \n" \ + "movntdq %%xmm3, 0x30(%0) \n" \ + "movntdq %%xmm4, 0x40(%0) \n" \ + "movntdq %%xmm5, 0x50(%0) \n" \ + "movntdq %%xmm6, 0x60(%0) \n" \ + "movntdq %%xmm7, 0x70(%0) \n" \ + : \ + : "q" (dst), "r" (src) \ + : "memory", "st"); + +/* Empty MMx State + (used to clean-up when going from mmx to float use + of the registers that are shared by both; note that + there is no float-to-mmx operation needed, because + only the float tag word info is corruptible) +*/ + +#define emms() __asm__ __volatile__ ("emms":::"memory") +#define sfence() __asm__ __volatile__ ("sfence":::"memory") + +/* additions to detect mmx - */ +/* Raster */ + +#define CPUID_MMX (1 << 23) /* flags: mmx */ +#define CPUID_SSE (1 << 25) /* flags: xmm */ +#define CPUID_SSE2 (1 << 26) /* flags: ? */ + +/* +#ifdef __amd64 +#define have_cpuid(cpuid_ret) \ + __asm__ __volatile__ ( \ + ".align 32 \n" \ + " pushq %%rbx \n" \ + " pushfq \n" \ + " popq %%rax \n" \ + " movq %%rax, %%rbx \n" \ + " xorq $0x200000, %%rax \n" \ + " pushq %%rax \n" \ + " popfq \n" \ + " pushfq \n" \ + " popq %%rax \n" \ + " cmpq %%rax, %%rbx \n" \ + " je 1f \n" \ + " movl $1, %0 \n" \ + " jmp 2f \n" \ + "1: \n" \ + " movl $0, %0 \n" \ + "2: \n" \ + " popq %%rbx \n" \ + : "=m" (cpuid_ret) \ + ); + +#define get_cpuid(cpuid_ret) \ + __asm__ __volatile__ ( \ + ".align 32 \n" \ + " pushq %%rax \n" \ + " movl $1, %%eax \n" \ + " cpuid \n" \ + " test $0x00800000, %%edx\n" \ + "1: \n" \ + " movl %%edx, %0 \n" \ + " jmp 2f \n" \ + "2: \n" \ + " movl $0, %0 \n" \ + " popq %%rax \n" \ + : "=m" (cpuid_ret) \ + ); +#else +#define have_cpuid(cpuid_ret) \ + __asm__ __volatile__ ( \ + ".align 32 \n" \ + " pushl %%ebx \n" \ + " pushfl \n" \ + " popl %%eax \n" \ + " movl %%eax, %%ebx \n" \ + " xorl $0x200000, %%eax \n" \ + " pushl %%eax \n" \ + " popfl \n" \ + " pushfl \n" \ + " popl %%eax \n" \ + " cmpl %%eax, %%ebx \n" \ + " je 1f \n" \ + " movl $1, %0 \n" \ + " jmp 2f \n" \ + "1: \n" \ + " movl $0, %0 \n" \ + "2: \n" \ + " popl %%ebx \n" \ + : "=m" (cpuid_ret) \ + ); + +#define get_cpuid(cpuid_ret) \ + __asm__ __volatile__ ( \ + ".align 32 \n" \ + " pushl %%eax \n" \ + " movl $1, %%eax \n" \ + " cpuid \n" \ + " test $0x00800000, %%edx\n" \ + "1: \n" \ + " movl %%edx, %0 \n" \ + " jmp 2f \n" \ + "2: \n" \ + " movl $0, %0 \n" \ + " popl %%eax \n" \ + : "=m" (cpuid_ret) \ + ); +#endif + */ + +#define prefetch(var) \ + __asm__ __volatile__ ( \ + "prefetchnta (%0) \n" \ + : \ + : "r" (var) \ + ); +#define prefetch0(var) \ + __asm__ __volatile__ ( \ + "prefetcht0 (%0) \n" \ + : \ + : "r" (var) \ + ); +#define prefetch1(var) \ + __asm__ __volatile__ ( \ + "prefetcht1 (%0) \n" \ + : \ + : "r" (var) \ + ); +#define prefetch2(var) \ + __asm__ __volatile__ ( \ + "prefetcht2 (%0) \n" \ + : \ + : "r" (var) \ + ); +#define pshufw(r1, r2, imm) \ + __asm__ __volatile__ ( \ + "pshufw $" #imm ", %" #r1 ", %" #r2 " \n" \ + ); + +#define pshufhw(r1, r2, imm) \ + __asm__ __volatile__ ( \ + "pshufhw $" #imm ", %" #r1 ", %" #r2 " \n" \ + ); + +#define pshuflw(r1, r2, imm) \ + __asm__ __volatile__ ( \ + "pshuflw $" #imm ", %" #r1 ", %" #r2 " \n" \ + ); +#define pshufd(r1, r2, imm) \ + __asm__ __volatile__ ( \ + "pshufd $" #imm ", %" #r1 ", %" #r2 " \n" \ + ); + +/* 1x238 MOVE Doouble Quadword + (this is both a load and a store... + in fact, it is the only way to store) +*/ +#define movdqu_m2r(var, reg) mmx_m2r(movdqu, var, reg) +#define movdqu_r2m(reg, var) mmx_r2m(movdqu, reg, var) +#define movdqu_r2r(regs, regd) mmx_r2r(movdqu, regs, regd) +#define movdqu(vars, vard) \ + __asm__ __volatile__ ("movdqu %1, %%xmm0\n\t" \ + "movdqu %%xmm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) +#define movdqa_m2r(var, reg) mmx_m2r(movdqa, var, reg) +#define movdqa_r2m(reg, var) mmx_r2m(movdqa, reg, var) +#define movdqa_r2r(regs, regd) mmx_r2r(movdqa, regs, regd) +#define movdqa(vars, vard) \ + __asm__ __volatile__ ("movdqa %1, %%xmm0\n\t" \ + "movdqa %%xmm0, %0" \ + : "=X" (vard) \ + : "X" (vars)) +#define movntdq_r2m(reg, var) mmx_r2m(movntdq, reg, var) + + +/* end additions */ + +#endif diff --git a/src/lib/include/evas_options.h b/src/lib/include/evas_options.h new file mode 100644 index 0000000..4de3833 --- /dev/null +++ b/src/lib/include/evas_options.h @@ -0,0 +1,70 @@ +#ifndef EVAS_OPTIONS_H +#define EVAS_OPTIONS_H 1 + +/* these may vary per OS */ + +/* what to build *//* small dither table is MUCH faster on ipaq */ +/*#define BUILD_SMALL_DITHER_MASK*/ + +/*#define HARD_CODED_P3*/ +/*#define HARD_CODED_P2*/ + +/*#define BUILD_CONVERT_1_GRY_1*/ +/*#define BUILD_CONVERT_4_GRY_1*/ +/*#define BUILD_CONVERT_4_GRY_4*/ +/*#define BUILD_CONVERT_8_GRY_1*/ +/*#define BUILD_CONVERT_8_GRY_4*/ +/*#define BUILD_CONVERT_8_GRY_16*/ +/*#define BUILD_CONVERT_8_GRY_64*/ +/*#define BUILD_CONVERT_8_GRY_256*/ +/*#define BUILD_CONVERT_8_RGB_332*/ +/*#define BUILD_CONVERT_8_RGB_666*/ +/*#define BUILD_CONVERT_8_RGB_232*/ +/*#define BUILD_CONVERT_8_RGB_222*/ +/*#define BUILD_CONVERT_8_RGB_221*/ +/*#define BUILD_CONVERT_8_RGB_121*/ +/*#define BUILD_CONVERT_8_RGB_111*/ +/*#define BUILD_CONVERT_16_RGB_565*/ +/*#define BUILD_CONVERT_16_RGB_555*/ +/*#define BUILD_CONVERT_16_RGB_444*/ +/*#define BUILD_CONVERT_16_RGB_454645*/ +/*#define BUILD_CONVERT_16_RGB_ROT0*/ +/*#define BUILD_CONVERT_16_RGB_ROT270*/ +/*#define BUILD_CONVERT_24_RGB_888*/ +/*#define BUILD_CONVERT_24_BGR_888*/ +/*#define BUILD_CONVERT_32_RGB_8888*/ +/*#define BUILD_CONVERT_32_BGR_8888*/ +/*#define BUILD_CONVERT_32_RGB_ROT0*/ +/*#define BUILD_CONVERT_32_RGB_ROT270*/ + +/*#define BUILD_SCALE_SAMPLE*/ +/*#define BUILD_SCALE_SMOOTH*/ +/*#define BUILD_SCALE_TRILINEAR*/ + +/*#define BUILD_MMX*/ +/*#define BUILD_SSE*/ +/*#define BUILD_C*/ + +/*#define BUILD_LOADER_PNG*/ +/*#define BUILD_LOADER_JPEG*/ +/*#define BUILD_LOADER_EET*/ +/*#define BUILD_LOADER_EDB*/ + +/*#define BUILD_FMEMOPEN*/ + +/* check in that the user configured it right */ +#ifndef BUILD_MMX +# ifndef BUILD_SSE +# ifndef BUILD_C +# error "Please Read the README" +# endif +# endif +#endif + +#ifdef BUILD_FMEMOPEN +# define _GNU_SOURCE +#endif + +#define DIRECT_SCALE + +#endif diff --git a/src/lib/include/evas_private.h b/src/lib/include/evas_private.h new file mode 100644 index 0000000..3ca0962 --- /dev/null +++ b/src/lib/include/evas_private.h @@ -0,0 +1,751 @@ +#ifndef EVAS_PRIVATE_H +#define EVAS_PRIVATE_H + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include "Evas.h" + +#include "../file/evas_module.h" +#include "../file/evas_path.h" + + +/* complain when peole pass in wrong object types etc. */ +#define MAGIC_DEBUG + +#define RENDER_METHOD_INVALID 0x00000000 + +typedef struct _Evas_Layer Evas_Layer; +typedef struct _Evas_Size Evas_Size; +typedef struct _Evas_Aspect Evas_Aspect; +typedef struct _Evas_Size_Hints Evas_Size_Hints; +typedef struct _Evas_Font_Dir Evas_Font_Dir; +typedef struct _Evas_Font Evas_Font; +typedef struct _Evas_Font_Alias Evas_Font_Alias; +typedef struct _Evas_Data_Node Evas_Data_Node; +typedef struct _Evas_Func_Node Evas_Func_Node; +typedef RGBA_Image_Loadopts Evas_Image_Load_Opts; +typedef struct _Evas_Func Evas_Func; +typedef struct _Evas_Image_Load_Func Evas_Image_Load_Func; +typedef struct _Evas_Image_Save_Func Evas_Image_Save_Func; +typedef struct _Evas_Object_Func Evas_Object_Func; +typedef struct _Evas_Intercept_Func Evas_Intercept_Func; +typedef struct _Evas_Intercept_Func_Basic Evas_Intercept_Func_Basic; +typedef struct _Evas_Intercept_Func_SizePos Evas_Intercept_Func_SizePos; +typedef struct _Evas_Intercept_Func_Obj Evas_Intercept_Func_Obj; +typedef struct _Evas_Intercept_Func_Int Evas_Intercept_Func_Int; +typedef struct _Evas_Intercept_Func_Color Evas_Intercept_Func_Color; +typedef struct _Evas_Key_Grab Evas_Key_Grab; +typedef struct _Evas_Callbacks Evas_Callbacks; +typedef struct _Evas_Format Evas_Format; +typedef struct _Evas_Rectangles Evas_Rectangles; + +#define MAGIC_EVAS 0x70777770 +#define MAGIC_OBJ 0x71777770 +#define MAGIC_OBJ_RECTANGLE 0x71777771 +#define MAGIC_OBJ_LINE 0x71777772 +#define MAGIC_OBJ_GRADIENT 0x71777773 +#define MAGIC_OBJ_POLYGON 0x71777774 +#define MAGIC_OBJ_IMAGE 0x71777775 +#define MAGIC_OBJ_TEXT 0x71777776 +#define MAGIC_OBJ_SMART 0x71777777 +#define MAGIC_OBJ_TEXTBLOCK 0x71777778 +#define MAGIC_SMART 0x72777770 + +#ifdef MAGIC_DEBUG +#define MAGIC_CHECK_FAILED(o, t, m) \ +{evas_debug_error(); \ + if (!o) evas_debug_input_null(); \ + else if (((t *)o)->magic == 0) evas_debug_magic_null(); \ + else evas_debug_magic_wrong((m), ((t *)o)->magic); \ +} +#else +#define MAGIC_CHECK_FAILED(o, t, m) +#endif +#define MAGIC_CHECK(o, t, m) \ +{if ((!o) || (!(((t *)o)->magic == (m)))) { \ +MAGIC_CHECK_FAILED(o, t, m) +#define MAGIC_CHECK_END() \ +}} + +#define NEW_RECT(_r, _x, _y, _w, _h) \ +{(_r) = malloc(sizeof(Evas_Rectangle)); \ +if (_r) \ +{ \ + (_r)->x = (_x); (_r)->y = (_y); \ + (_r)->w = (_w); (_r)->h = (_h); \ +}} + +#define MERR_NONE() _evas_alloc_error = EVAS_ALLOC_ERROR_NONE +#define MERR_FATAL() _evas_alloc_error = EVAS_ALLOC_ERROR_FATAL +#define MERR_BAD() _evas_alloc_error = EVAS_ALLOC_ERROR_RECOVERED + +#define EVAS_OBJECT_IMAGE_FREE_FILE_AND_KEY(o) \ + if ((o)->cur.file) \ + { \ + evas_stringshare_del((o)->cur.file); \ + if ((o)->prev.file == (o)->cur.file) \ + (o)->prev.file = NULL; \ + (o)->cur.file = NULL; \ + } \ + if ((o)->cur.key) \ + { \ + evas_stringshare_del((o)->cur.key); \ + if ((o)->prev.key == (o)->cur.key) \ + (o)->prev.key = NULL; \ + (o)->cur.key = NULL; \ + } \ + if ((o)->prev.file) \ + { \ + evas_stringshare_del((o)->prev.file); \ + (o)->prev.file = NULL; \ + } \ + if ((o)->prev.key) \ + { \ + evas_stringshare_del((o)->prev.key); \ + (o)->prev.key = NULL; \ + } + +struct _Evas_Intercept_Func_Basic +{ + void (*func) (void *data, Evas_Object *obj); + void *data; +}; + +struct _Evas_Intercept_Func_SizePos +{ + void (*func) (void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y); + void *data; +}; + +struct _Evas_Intercept_Func_Obj +{ + void (*func) (void *data, Evas_Object *obj, Evas_Object *obj2); + void *data; +}; + +struct _Evas_Intercept_Func_Int +{ + void (*func) (void *data, Evas_Object *obj, int n); + void *data; +}; + +struct _Evas_Intercept_Func_Color +{ + void (*func) (void *data, Evas_Object *obj, int r, int g, int b, int a); + void *data; +}; + +struct _Evas_Key_Grab +{ + char *keyname; + Evas_Modifier_Mask modifiers; + Evas_Modifier_Mask not_modifiers; + Evas_Object *object; + unsigned char exclusive : 1; + unsigned char just_added : 1; + unsigned char delete_me : 1; +}; + +struct _Evas_Intercept_Func +{ + Evas_Intercept_Func_Basic show; + Evas_Intercept_Func_Basic hide; + Evas_Intercept_Func_SizePos move; + Evas_Intercept_Func_SizePos resize; + Evas_Intercept_Func_Basic raise; + Evas_Intercept_Func_Basic lower; + Evas_Intercept_Func_Obj stack_above; + Evas_Intercept_Func_Obj stack_below; + Evas_Intercept_Func_Int layer_set; + Evas_Intercept_Func_Color color_set; + Evas_Intercept_Func_Obj clip_set; + Evas_Intercept_Func_Basic clip_unset; +}; + +struct _Evas_Smart +{ + DATA32 magic; + + int usage; + + const Evas_Smart_Class *smart_class; + + unsigned char delete_me : 1; + unsigned char class_allocated : 1; + +}; + +struct _Evas_Modifier +{ + struct { + int count; + char **list; + } mod; + Evas_Modifier_Mask mask; /* ok we have a max of 64 modifiers */ +}; + +struct _Evas_Lock +{ + struct { + int count; + char **list; + } lock; + Evas_Modifier_Mask mask; /* we have a max of 64 locks */ +}; + +struct _Evas_Callbacks +{ + Evas_Object_List *callbacks; + int walking_list; + unsigned char deletions_waiting : 1; +/* + Evas_Object_List *down; + Evas_Object_List *up; + Evas_Object_List *move; + Evas_Object_List *in; + Evas_Object_List *out; + Evas_Object_List *wheel; + Evas_Object_List *key_down; + Evas_Object_List *key_up; + Evas_Object_List *free; + Evas_Object_List *obj_focus_in; + Evas_Object_List *obj_focus_out; + Evas_Object_List *obj_show; + Evas_Object_List *obj_hide; + Evas_Object_List *obj_move; + Evas_Object_List *obj_resize; + Evas_Object_List *obj_restack; + */ +}; + +struct _Evas +{ + Evas_Object_List _list_data; + + DATA32 magic; + + struct { + unsigned char inside : 1; + int mouse_grabbed; + DATA32 button; + Evas_Coord x, y; + +//// Evas_Coord canvas_x, canvas_y; + + struct { + Evas_List *in; + } object; + + } pointer; + + struct { + Evas_Coord x, y, w, h; + unsigned char changed : 1; + } viewport; + + struct { + int w, h; + DATA32 render_method; + unsigned char changed : 1; + } output; + + Evas_List *damages; + Evas_List *obscures; + + Evas_Layer *layers; + + Evas_Hash *name_hash; + + int output_validity; + + int walking_list; + int events_frozen; + + struct { + Evas_Module *module; + Evas_Func *func; + struct { + void *output; + + void *context; + } data; + + void *info; + int info_magic; + } engine; + + Evas_Array delete_objects; + Evas_Array active_objects; + Evas_Array restack_objects; + Evas_Array render_objects; + Evas_Array pending_objects; + Evas_Array obscuring_objects; + Evas_Array temporary_objects; + + int delete_grabs; + int walking_grabs; + Evas_List *grabs; + + Evas_List *font_path; + + Evas_Object *focused; + void *attach_data; + Evas_Modifier modifiers; + Evas_Lock locks; + unsigned int last_timestamp; + int last_mouse_down_counter; + int last_mouse_up_counter; + Evas_Font_Hinting_Flags hinting; + unsigned char changed : 1; + unsigned char delete_me : 1; + unsigned char invalidate : 1; + unsigned char cleanup : 1; +}; + +struct _Evas_Layer +{ + Evas_Object_List _list_data; + + short layer; + Evas_Object *objects; + + Evas *evas; + + void *engine_data; + int usage; + unsigned char delete_me : 1; +}; + +struct _Evas_Rectangles +{ + unsigned int total; + unsigned int count; + Evas_Rectangle *array; +}; + +struct _Evas_Size +{ + Evas_Coord w, h; +}; + +struct _Evas_Aspect +{ + Evas_Aspect_Control mode; + Evas_Size size; +}; + +struct _Evas_Size_Hints +{ + Evas_Size min, max, request; + Evas_Aspect aspect; +}; + +struct _Evas_Object +{ + Evas_Object_List _list_data; + + DATA32 magic; + + const char *type; + Evas_Layer *layer; + + struct { + struct { +/* + struct { + int x, y, w, h; + int validity; + } geometry; + */ + struct { + int x, y, w, h; + unsigned char r, g, b, a; + Evas_Bool visible : 1; + Evas_Bool dirty : 1; + } clip; + } cache; + Evas_Coord_Rectangle geometry; + struct { + unsigned char r, g, b, a; + } color; + Evas_Object *clipper; + short layer; + Evas_Bool visible : 1; + Evas_Bool have_clipees : 1; + Evas_Bool anti_alias : 1; + unsigned char interpolation_color_space : 1; + Evas_Render_Op render_op : 4; + } cur, prev; + + char *name; + + Evas_Intercept_Func *interceptors; + + struct { + Evas_List *elements; + } data; + + Evas_List *grabs; + + Evas_Callbacks *callbacks; + + struct { + Evas_List *clipees; + Evas_List *changes; + } clip; + + const Evas_Object_Func *func; + + void *object_data; + + struct { + Evas_Smart *smart; + Evas_Object *parent; + } smart; + + Evas_Size_Hints *size_hints; + + int last_mouse_down_counter; + int last_mouse_up_counter; + int mouse_grabbed; + + Evas_Object_Pointer_Mode pointer_mode : 1; + + Evas_Bool store : 1; + Evas_Bool pass_events : 1; + Evas_Bool parent_pass_events : 1; + Evas_Bool parent_cache_valid : 1; + Evas_Bool repeat_events : 1; + Evas_Bool restack : 1; + Evas_Bool changed : 1; + Evas_Bool is_active : 1; + Evas_Bool render_pre : 1; + Evas_Bool rect_del : 1; + Evas_Bool mouse_in : 1; + Evas_Bool pre_render_done : 1; + Evas_Bool intercepted : 1; + Evas_Bool focused : 1; + Evas_Bool in_layer : 1; + Evas_Bool no_propagate : 1; + Evas_Bool precise_is_inside : 1; + + unsigned char delete_me; +}; + +struct _Evas_Func_Node +{ + Evas_Object_List _list_data; + void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info); + void *data; + Evas_Callback_Type type; + unsigned char delete_me : 1; +}; + +struct _Evas_Data_Node +{ + char *key; + void *data; +}; + +struct _Evas_Font_Dir +{ + Evas_Hash *lookup; + Evas_List *fonts; + Evas_List *aliases; + DATA64 dir_mod_time; + DATA64 fonts_dir_mod_time; + DATA64 fonts_alias_mod_time; +}; + +struct _Evas_Font +{ + struct { + const char *prop[14]; + } x; + struct { + const char *name; + } simple; + const char *path; + char type; +}; + +struct _Evas_Font_Alias +{ + const char *alias; + Evas_Font *fn; +}; + +struct _Evas_Object_Func +{ + void (*free) (Evas_Object *obj); + void (*render) (Evas_Object *obj, void *output, void *context, void *surface, int x, int y); + void (*render_pre) (Evas_Object *obj); + void (*render_post) (Evas_Object *obj); + + void (*store) (Evas_Object *obj); + void (*unstore) (Evas_Object *obj); + + int (*is_visible) (Evas_Object *obj); + int (*was_visible) (Evas_Object *obj); + + int (*is_opaque) (Evas_Object *obj); + int (*was_opaque) (Evas_Object *obj); + + int (*is_inside) (Evas_Object *obj, Evas_Coord x, Evas_Coord y); + int (*was_inside) (Evas_Object *obj, Evas_Coord x, Evas_Coord y); + + void (*coords_recalc) (Evas_Object *obj); +}; + +struct _Evas_Func +{ + void *(*info) (Evas *e); + void (*info_free) (Evas *e, void *info); + void (*setup) (Evas *e, void *info); + + void (*output_free) (void *data); + void (*output_resize) (void *data, int w, int h); + void (*output_tile_size_set) (void *data, int w, int h); + void (*output_redraws_rect_add) (void *data, int x, int y, int w, int h); + void (*output_redraws_rect_del) (void *data, int x, int y, int w, int h); + void (*output_redraws_clear) (void *data); + void *(*output_redraws_next_update_get) (void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch); + void (*output_redraws_next_update_push) (void *data, void *surface, int x, int y, int w, int h); + void (*output_flush) (void *data); + void (*output_idle_flush) (void *data); + + void *(*context_new) (void *data); + void (*context_free) (void *data, void *context); + void (*context_clip_set) (void *data, void *context, int x, int y, int w, int h); + void (*context_clip_clip) (void *data, void *context, int x, int y, int w, int h); + void (*context_clip_unset) (void *data, void *context); + int (*context_clip_get) (void *data, void *context, int *x, int *y, int *w, int *h); + void (*context_color_set) (void *data, void *context, int r, int g, int b, int a); + int (*context_color_get) (void *data, void *context, int *r, int *g, int *b, int *a); + void (*context_multiplier_set) (void *data, void *context, int r, int g, int b, int a); + void (*context_multiplier_unset) (void *data, void *context); + int (*context_multiplier_get) (void *data, void *context, int *r, int *g, int *b, int *a); + void (*context_cutout_add) (void *data, void *context, int x, int y, int w, int h); + void (*context_cutout_clear) (void *data, void *context); + void (*context_anti_alias_set) (void *data, void *context, unsigned char aa); + unsigned char (*context_anti_alias_get) (void *data, void *context); + void (*context_color_interpolation_set) (void *data, void *context, int color_space); + int (*context_color_interpolation_get) (void *data, void *context); + void (*context_render_op_set) (void *data, void *context, int render_op); + int (*context_render_op_get) (void *data, void *context); + + void (*rectangle_draw) (void *data, void *context, void *surface, int x, int y, int w, int h); + + void (*line_draw) (void *data, void *context, void *surface, int x1, int y1, int x2, int y2); + + void *(*polygon_point_add) (void *data, void *context, void *polygon, int x, int y); + void *(*polygon_points_clear) (void *data, void *context, void *polygon); + void (*polygon_draw) (void *data, void *context, void *surface, void *polygon); + + void *(*gradient_new) (void *data); + void (*gradient_free) (void *data, void *gradient); + void (*gradient_color_stop_add) (void *data, void *gradient, int r, int g, int b, int a, int delta); + void (*gradient_alpha_stop_add) (void *data, void *gradient, int a, int delta); + void (*gradient_color_data_set) (void *data, void *gradient, void *map, int len, int alpha_flag); + void (*gradient_alpha_data_set) (void *data, void *gradient, void *alpha_map, int len); + void (*gradient_clear) (void *data, void *gradient); + void (*gradient_fill_set) (void *data, void *gradient, int x, int y, int w, int h); + void (*gradient_fill_angle_set) (void *data, void *gradient, double fill_angle); + void (*gradient_fill_spread_set) (void *data, void *gradient, int spread); + void (*gradient_angle_set) (void *data, void *gradient, double angle); + void (*gradient_offset_set) (void *data, void *gradient, float offset); + void (*gradient_direction_set) (void *data, void *gradient, int direction); + void (*gradient_type_set) (void *data, void *gradient, char *name, char *params); + int (*gradient_is_opaque) (void *data, void *context, void *gradient, int x, int y, int w, int h); + int (*gradient_is_visible) (void *data, void *context, void *gradient, int x, int y, int w, int h); + void (*gradient_render_pre) (void *data, void *context, void *gradient); + void (*gradient_render_post) (void *data, void *gradient); + void (*gradient_draw) (void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h); + + void *(*image_load) (void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo); + void *(*image_new_from_data) (void *data, int w, int h, DATA32 *image_data, int alpha, int cspace); + void *(*image_new_from_copied_data) (void *data, int w, int h, DATA32 *image_data, int alpha, int cspace); + void (*image_free) (void *data, void *image); + void (*image_size_get) (void *data, void *image, int *w, int *h); + void *(*image_size_set) (void *data, void *image, int w, int h); + void (*image_stride_get) (void *data, void *image, int *stride); + void *(*image_dirty_region) (void *data, void *image, int x, int y, int w, int h); + void *(*image_data_get) (void *data, void *image, int to_write, DATA32 **image_data); + void *(*image_data_put) (void *data, void *image, DATA32 *image_data); + void *(*image_alpha_set) (void *data, void *image, int has_alpha); + int (*image_alpha_get) (void *data, void *image); + void *(*image_border_set) (void *data, void *image, int l, int r, int t, int b); + void (*image_border_get) (void *data, void *image, int *l, int *r, int *t, int *b); + void (*image_draw) (void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth); + char *(*image_comment_get) (void *data, void *image, char *key); + char *(*image_format_get) (void *data, void *image); + void (*image_colorspace_set) (void *data, void *image, int cspace); + int (*image_colorspace_get) (void *data, void *image); + void (*image_native_set) (void *data, void *image, void *native); + void *(*image_native_get) (void *data, void *image); + + void (*image_cache_flush) (void *data); + void (*image_cache_set) (void *data, int bytes); + int (*image_cache_get) (void *data); + + void *(*font_load) (void *data, const char *name, int size); + void *(*font_memory_load) (void *data, char *name, int size, const void *fdata, int fdata_size); + void *(*font_add) (void *data, void *font, const char *name, int size); + void *(*font_memory_add) (void *data, void *font, char *name, int size, const void *fdata, int fdata_size); + void (*font_free) (void *data, void *font); + int (*font_ascent_get) (void *data, void *font); + int (*font_descent_get) (void *data, void *font); + int (*font_max_ascent_get) (void *data, void *font); + int (*font_max_descent_get) (void *data, void *font); + void (*font_string_size_get) (void *data, void *font, const char *text, int *w, int *h); + int (*font_inset_get) (void *data, void *font, const char *text); + int (*font_h_advance_get) (void *data, void *font, const char *text); + int (*font_v_advance_get) (void *data, void *font, const char *text); + int (*font_char_coords_get) (void *data, void *font, const char *text, int pos, int *cx, int *cy, int *cw, int *ch); + int (*font_char_at_coords_get) (void *data, void *font, const char *text, int x, int y, int *cx, int *cy, int *cw, int *ch); + void (*font_draw) (void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text); + + void (*font_cache_flush) (void *data); + void (*font_cache_set) (void *data, int bytes); + int (*font_cache_get) (void *data); + + /* Engine functions will over time expand from here */ + + void (*font_hinting_set) (void *data, void *font, int hinting); + int (*font_hinting_can_hint) (void *data, int hinting); + +/* void (*image_rotation_set) (void *data, void *image); */ + +}; + +struct _Evas_Image_Load_Func +{ + int (*file_head) (Image_Entry *ie, const char *file, const char *key); + int (*file_data) (Image_Entry *ie, const char *file, const char *key); +}; + +struct _Evas_Image_Save_Func +{ + int (*image_save) (RGBA_Image *im, const char *file, const char *key, int quality, int compress); +}; + +#ifdef __cplusplus +extern "C" { +#endif + +Evas_Object *evas_object_new(void); +void evas_object_free(Evas_Object *obj, int clean_layer); +void evas_object_inject(Evas_Object *obj, Evas *e); +void evas_object_release(Evas_Object *obj, int clean_layer); +void evas_object_change(Evas_Object *obj); +void evas_object_render_pre_visible_change(Evas_Rectangles *rects, Evas_Object *obj, int is_v, int was_v); +void evas_object_render_pre_clipper_change(Evas_Rectangles *rects, Evas_Object *obj); +void evas_object_render_pre_prev_cur_add(Evas_Rectangles *rects, Evas_Object *obj); +void evas_object_render_pre_effect_updates(Evas_Rectangles *rects, Evas_Object *obj, int is_v, int was_v); +void evas_rects_return_difference_rects(Evas_Rectangles *rects, int x, int y, int w, int h, int xx, int yy, int ww, int hh); + +void evas_object_clip_dirty(Evas_Object *obj); +void evas_object_recalc_clippees(Evas_Object *obj); +Evas_Layer *evas_layer_new(Evas *e); +void evas_layer_pre_free(Evas_Layer *lay); +void evas_layer_free(Evas_Layer *lay); +Evas_Layer *evas_layer_find(Evas *e, short layer_num); +void evas_layer_add(Evas_Layer *lay); +void evas_layer_del(Evas_Layer *lay); + +int evas_object_was_visible(Evas_Object *obj); +int evas_object_was_in_output_rect(Evas_Object *obj, int x, int y, int w, int h); + +int evas_object_was_opaque(Evas_Object *obj); +int evas_object_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y); +int evas_object_was_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y); +int evas_object_clippers_was_visible(Evas_Object *obj); +void evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void *event_info); +Evas_List *evas_event_objects_event_list(Evas *e, Evas_Object *stop, int x, int y); +int evas_mem_free(int mem_required); +int evas_mem_degrade(int mem_required); +void evas_debug_error(void); +void evas_debug_input_null(void); +void evas_debug_magic_null(void); +void evas_debug_magic_wrong(DATA32 expected, DATA32 supplied); +void evas_debug_generic(const char *str); +const char *evas_debug_magic_string_get(DATA32 magic); +void evas_object_smart_use(Evas_Smart *s); +void evas_object_smart_unuse(Evas_Smart *s); +void evas_object_smart_del(Evas_Object *obj); +void evas_object_smart_cleanup(Evas_Object *obj); +void evas_object_smart_member_raise(Evas_Object *member); +void evas_object_smart_member_lower(Evas_Object *member); +void evas_object_smart_member_stack_above(Evas_Object *member, Evas_Object *other); +void evas_object_smart_member_stack_below(Evas_Object *member, Evas_Object *other); +const Evas_Object_List *evas_object_smart_members_get_direct(const Evas_Object *obj); +void *evas_mem_calloc(int size); +void evas_object_event_callback_all_del(Evas_Object *obj); +void evas_object_event_callback_cleanup(Evas_Object *obj); +void evas_object_inform_call_show(Evas_Object *obj); +void evas_object_inform_call_hide(Evas_Object *obj); +void evas_object_inform_call_move(Evas_Object *obj); +void evas_object_inform_call_resize(Evas_Object *obj); +void evas_object_inform_call_restack(Evas_Object *obj); +void evas_object_inform_call_changed_size_hints(Evas_Object *obj); +void evas_object_intercept_cleanup(Evas_Object *obj); +int evas_object_intercept_call_show(Evas_Object *obj); +int evas_object_intercept_call_hide(Evas_Object *obj); +int evas_object_intercept_call_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y); +int evas_object_intercept_call_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h); +int evas_object_intercept_call_raise(Evas_Object *obj); +int evas_object_intercept_call_lower(Evas_Object *obj); +int evas_object_intercept_call_stack_above(Evas_Object *obj, Evas_Object *above); +int evas_object_intercept_call_stack_below(Evas_Object *obj, Evas_Object *below); +int evas_object_intercept_call_layer_set(Evas_Object *obj, int l); +int evas_object_intercept_call_color_set(Evas_Object *obj, int r, int g, int b, int a); +int evas_object_intercept_call_clip_set(Evas_Object *obj, Evas_Object *clip); +int evas_object_intercept_call_clip_unset(Evas_Object *obj); +void evas_object_grabs_cleanup(Evas_Object *obj); +void evas_key_grab_free(Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers); +void evas_font_dir_cache_free(void); +const char *evas_font_dir_cache_find(char *dir, char *font); +Evas_List *evas_font_dir_available_list(const Evas* evas); +void evas_font_dir_available_list_free(Evas_List *available); +void evas_font_free(Evas *evas, void *font); +void *evas_font_load(Evas *evas, const char *name, const char *source, int size); +void evas_font_load_hinting_set(Evas *evas, void *font, int hinting); +void evas_object_smart_member_cache_invalidate(Evas_Object *obj); +void evas_text_style_pad_get(Evas_Text_Style_Type style, int *l, int *r, int *t, int *b); +void _evas_object_text_rehint(Evas_Object *obj); +void _evas_object_textblock_rehint(Evas_Object *obj); + +extern int _evas_alloc_error; + +struct _Evas_Imaging_Image +{ + RGBA_Image *image; +}; + +struct _Evas_Imaging_Font +{ + RGBA_Font *font; +}; + +int evas_async_events_init(void); +int evas_async_events_shutdown(void); + +void _evas_walk(Evas *e); +void _evas_unwalk(Evas *e); + +EAPI int _evas_module_engine_inherit(Evas_Func *funcs, char *name); + +void evas_render_invalidate(Evas *e); +void evas_render_object_recalc(Evas_Object *obj); + +#define EVAS_API_OVERRIDE(func, api, prefix) \ + (api)->func = prefix##func + +#include "evas_inline.x" + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/lib/main.c b/src/lib/main.c new file mode 100644 index 0000000..3578cc4 --- /dev/null +++ b/src/lib/main.c @@ -0,0 +1,209 @@ +#include "evas_common.h" +#include "evas_private.h" + +int _evas_alloc_error = 0; +static int _evas_debug_init = 0; +static int _evas_debug_show = 0; +static int _evas_debug_abort = 0; + +/** + * Return if any allocation errors have occured during the prior function + * @return The allocation error flag + * + * This function will return if any memory allocation errors occured during, + * and what kind they were. The return value will be one of + * EVAS_ALLOC_ERROR_NONE, EVAS_ALLOC_ERROR_FATAL or EVAS_ALLOC_ERROR_RECOVERED + * with each meaning something different. + * + * EVAS_ALLOC_ERROR_NONE means that no errors occured at all and the function + * worked as expected. + * + * EVAS_ALLOC_ERROR_FATAL means the function was completely unable to perform + * its job and will have exited as cleanly as possible. The programmer + * should consider this as a sign of very low memory and should try and safely + * recover from the prior functions failure (or try free up memory elsewhere + * and try again after more memory is freed). + * + * EVAS_ALLOC_ERROR_RECOVERED means that an allocation error occured, but was + * recovered from by evas finding memory of its own it has allocated and + * freeing what it sees as not really usefully allocated memory. What is freed + * may vary. Evas may reduce the resolution of images, free cached images or + * fonts, trhow out pre-rendered data, reduce the complexity of change lists + * etc. Evas and the program will function as per normal after this, but this + * is a sign of low memory, and it is suggested that the program try and + * identify memory it doesn't need, and free it. + * + * Example: + * @code + * extern Evas_Object *object; + * void callback (void *data, Evas *e, Evas_Object *obj, void *event_info); + * + * evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_DOWN, callback, NULL); + * if (evas_alloc_error() == EVAS_ALLOC_ERROR_FATAL) + * { + * fprintf(stderr, "ERROR: Completely unable to attach callabck. Must\n"); + * fprintf(stderr, " destroy object now as it cannot be used.\n"); + * evas_object_del(object); + * object = NULL; + * fprintf(stderr, "WARNING: Memory is really low. Cleaning out RAM.\n"); + * my_memory_cleanup(); + * } + * if (evas_alloc_error() == EVAS_ALLOC_ERROR_RECOVERED) + * { + * fprintf(stderr, "WARNING: Memory is really low. Cleaning out RAM.\n"); + * my_memory_cleanup(); + * } + * @endcode + */ +EAPI int +evas_alloc_error(void) +{ + return _evas_alloc_error; +} + +/* free cached items only in ram for speed reasons. return 0 if cant free */ +int +evas_mem_free(int mem_required) +{ + return 0; +} + +/* start reducing quality of images etc. return 0 if cant free anything */ +int +evas_mem_degrade(int mem_required) +{ + return 0; +} + +void * +evas_mem_calloc(int size) +{ + void *ptr; + + ptr = calloc(1, size); + if (ptr) return ptr; + MERR_BAD(); + while ((!ptr) && (evas_mem_free(size))) ptr = calloc(1, size); + if (ptr) return ptr; + while ((!ptr) && (evas_mem_degrade(size))) ptr = calloc(1, size); + if (ptr) return ptr; + MERR_FATAL(); + return NULL; +} + +void +evas_debug_error(void) +{ + if (!_evas_debug_init) + { + if (getenv("EVAS_DEBUG_SHOW")) _evas_debug_show = 1; + if (getenv("EVAS_DEBUG_ABORT")) _evas_debug_abort = 1; + _evas_debug_init = 1; + } + if (_evas_debug_show) + fprintf(stderr, + "*** EVAS ERROR: Evas Magic Check Failed!!!\n"); +} + +void +evas_debug_input_null(void) +{ + if (!_evas_debug_init) + { + if (getenv("EVAS_DEBUG_SHOW")) _evas_debug_show = 1; + if (getenv("EVAS_DEBUG_ABORT")) _evas_debug_abort = 1; + _evas_debug_init = 1; + } + if (_evas_debug_show) + fprintf(stderr, + " Input object pointer is NULL!\n"); + if (_evas_debug_abort) abort(); +} + +void +evas_debug_magic_null(void) +{ + if (!_evas_debug_init) + { + if (getenv("EVAS_DEBUG_SHOW")) _evas_debug_show = 1; + if (getenv("EVAS_DEBUG_ABORT")) _evas_debug_abort = 1; + _evas_debug_init = 1; + } + if (_evas_debug_show) + fprintf(stderr, + " Input object is zero'ed out (maybe a freed object or zero-filled RAM)!\n"); + if (_evas_debug_abort) abort(); +} + +void +evas_debug_magic_wrong(DATA32 expected, DATA32 supplied) +{ + if (!_evas_debug_init) + { + if (getenv("EVAS_DEBUG_SHOW")) _evas_debug_show = 1; + if (getenv("EVAS_DEBUG_ABORT")) _evas_debug_abort = 1; + _evas_debug_init = 1; + } + if (_evas_debug_show) + fprintf(stderr, + " Input object is wrong type\n" + " Expected: %08x - %s\n" + " Supplied: %08x - %s\n", + expected, evas_debug_magic_string_get(expected), + supplied, evas_debug_magic_string_get(supplied)); + if (_evas_debug_abort) abort(); +} + +void +evas_debug_generic(const char *str) +{ + if (!_evas_debug_init) + { + if (getenv("EVAS_DEBUG_SHOW")) _evas_debug_show = 1; + if (getenv("EVAS_DEBUG_ABORT")) _evas_debug_abort = 1; + _evas_debug_init = 1; + } + if (_evas_debug_show) + fprintf(stderr, + "*** EVAS ERROR:\n" + "%s", (char *)str); + if (_evas_debug_abort) abort(); +} + +const char * +evas_debug_magic_string_get(DATA32 magic) +{ + switch (magic) + { + case MAGIC_EVAS: + return "Evas"; + break; + case MAGIC_OBJ: + return "Evas_Object"; + break; + case MAGIC_OBJ_RECTANGLE: + return "Evas_Object (Rectangle)"; + break; + case MAGIC_OBJ_LINE: + return "Evas_Object (Line)"; + break; + case MAGIC_OBJ_GRADIENT: + return "Evas_Object (Gradient)"; + break; + case MAGIC_OBJ_POLYGON: + return "Evas_Object (Polygon)"; + break; + case MAGIC_OBJ_IMAGE: + return "Evas_Object (Image)"; + break; + case MAGIC_OBJ_TEXT: + return "Evas_Object (Text)"; + break; + case MAGIC_OBJ_SMART: + return "Evas_Object (Smart)"; + break; + default: + return ""; + }; + return ""; +} diff --git a/src/modules/.cvsignore b/src/modules/.cvsignore new file mode 100644 index 0000000..282522d --- /dev/null +++ b/src/modules/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/src/modules/Makefile.am b/src/modules/Makefile.am new file mode 100644 index 0000000..af10cbc --- /dev/null +++ b/src/modules/Makefile.am @@ -0,0 +1,3 @@ +MAINTAINERCLEANFILES = Makefile.in + +SUBDIRS = engines loaders savers diff --git a/src/modules/engines/.cvsignore b/src/modules/engines/.cvsignore new file mode 100644 index 0000000..282522d --- /dev/null +++ b/src/modules/engines/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/src/modules/engines/Makefile.am b/src/modules/engines/Makefile.am new file mode 100644 index 0000000..22e311b --- /dev/null +++ b/src/modules/engines/Makefile.am @@ -0,0 +1,27 @@ +MAINTAINERCLEANFILES = Makefile.in + +SUBDIRS = \ +software_generic \ +buffer \ +cairo_common \ +cairo_x11 \ +fb \ +gl_common \ +gl_x11 \ +gl_glew \ +software_qtopia \ +software_win32_gdi \ +software_ddraw \ +software_x11 \ +software_xcb \ +xrender_x11 \ +xrender_xcb \ +software_sdl \ +glitz_x11 \ +software_16 \ +software_16_x11 \ +direct3d \ +software_16_ddraw \ +software_16_wince \ +software_16_sdl + diff --git a/src/modules/engines/buffer/.cvsignore b/src/modules/engines/buffer/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/buffer/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/buffer/Evas_Engine_Buffer.h b/src/modules/engines/buffer/Evas_Engine_Buffer.h new file mode 100644 index 0000000..02dea14 --- /dev/null +++ b/src/modules/engines/buffer/Evas_Engine_Buffer.h @@ -0,0 +1,37 @@ +#ifndef _EVAS_ENGINE_BUFFER_H +#define _EVAS_ENGINE_BUFFER_H + +#define EVAS_ENGINE_BUFFER_DEPTH_ARGB32 0 +#define EVAS_ENGINE_BUFFER_DEPTH_BGRA32 1 +#define EVAS_ENGINE_BUFFER_DEPTH_RGB24 2 +#define EVAS_ENGINE_BUFFER_DEPTH_BGR24 3 +#define EVAS_ENGINE_BUFFER_DEPTH_RGB32 4 + +typedef struct _Evas_Engine_Info_Buffer Evas_Engine_Info_Buffer; + +struct _Evas_Engine_Info_Buffer +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + struct { + int depth_type; + + void *dest_buffer; + int dest_buffer_row_bytes; + + char use_color_key : 1; + int alpha_threshold; + int color_key_r; + int color_key_g; + int color_key_b; + struct { + void * (*new_update_region) (int x, int y, int w, int h, int *row_bytes); + void (*free_update_region) (int x, int y, int w, int h, void *data); + } func; + } info; +}; +#endif + + diff --git a/src/modules/engines/buffer/Makefile.am b/src/modules/engines/buffer/Makefile.am new file mode 100644 index 0000000..34a25b5 --- /dev/null +++ b/src/modules/engines/buffer/Makefile.am @@ -0,0 +1,32 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +@FREETYPE_CFLAGS@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +if BUILD_ENGINE_BUFFER + +pkgdir = $(libdir)/evas/modules/engines/buffer/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = \ +evas_engine.c \ +evas_outbuf.c + +module_la_LIBADD = $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_Buffer.h + +endif + +EXTRA_DIST = evas_engine.h diff --git a/src/modules/engines/buffer/evas_engine.c b/src/modules/engines/buffer/evas_engine.c new file mode 100644 index 0000000..501f601 --- /dev/null +++ b/src/modules/engines/buffer/evas_engine.c @@ -0,0 +1,360 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Buffer.h" + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func, pfunc; + +/* engine struct data */ +typedef struct _Render_Engine Render_Engine; + +struct _Render_Engine +{ + Tilebuf *tb; + Outbuf *ob; + Tilebuf_Rect *rects; + Evas_Object_List *cur_rect; + int end : 1; +}; + +/* prototypes we will use here */ +static void *_output_setup(int w, int h, void *dest_buffer, int dest_buffer_row_bytes, int depth_type, int use_color_key, int alpha_threshold, int color_key_r, int color_key_g, int color_key_b, void *(*new_update_region) (int x, int y, int w, int h, int *row_bytes), void (*free_update_region) (int x, int y, int w, int h, void *data)); + +static void *eng_info(Evas *e); +static void eng_info_free(Evas *e, void *info); +static void eng_setup(Evas *e, void *info); +static void eng_output_free(void *data); +static void eng_output_resize(void *data, int w, int h); +static void eng_output_tile_size_set(void *data, int w, int h); +static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h); +static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h); +static void eng_output_redraws_clear(void *data); +static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch); +static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h); +static void eng_output_flush(void *data); +static void eng_output_idle_flush(void *data); + +/* internal engine routines */ +static void * +_output_setup(int w, + int h, + void *dest_buffer, + int dest_buffer_row_bytes, + int depth_type, + int use_color_key, + int alpha_threshold, + int color_key_r, + int color_key_g, + int color_key_b, + void *(*new_update_region) (int x, int y, int w, int h, int *row_bytes), + void (*free_update_region) (int x, int y, int w, int h, void *data) + ) +{ + Render_Engine *re; + + re = calloc(1, sizeof(Render_Engine)); + /* if we haven't initialized - init (automatic abort if already done) */ + evas_common_cpu_init(); + + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + + evas_buffer_outbuf_buf_init(); + + { + Outbuf_Depth dep; + DATA32 color_key; + + dep = OUTBUF_DEPTH_BGR_24BPP_888_888; + if (depth_type == EVAS_ENGINE_BUFFER_DEPTH_ARGB32) + dep = OUTBUF_DEPTH_ARGB_32BPP_8888_8888; + else if (depth_type == EVAS_ENGINE_BUFFER_DEPTH_RGB32) + dep = OUTBUF_DEPTH_RGB_32BPP_888_8888; + else if (depth_type == EVAS_ENGINE_BUFFER_DEPTH_BGRA32) + dep = OUTBUF_DEPTH_BGRA_32BPP_8888_8888; + else if (depth_type == EVAS_ENGINE_BUFFER_DEPTH_RGB24) + dep = OUTBUF_DEPTH_RGB_24BPP_888_888; + else if (depth_type == EVAS_ENGINE_BUFFER_DEPTH_BGR24) + dep = OUTBUF_DEPTH_BGR_24BPP_888_888; + R_VAL(&color_key) = color_key_r; + G_VAL(&color_key) = color_key_g; + B_VAL(&color_key) = color_key_b; + A_VAL(&color_key) = 0; + re->ob = evas_buffer_outbuf_buf_setup_fb(w, + h, + dep, + dest_buffer, + dest_buffer_row_bytes, + use_color_key, + color_key, + alpha_threshold, + new_update_region, + free_update_region); + } + re->tb = evas_common_tilebuf_new(w, h); + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + return re; +} + +/* engine api this module provides */ +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_Buffer *info; + + info = calloc(1, sizeof(Evas_Engine_Info_Buffer)); + if (!info) return NULL; + info->magic.magic = rand(); + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_Buffer *in; + + in = (Evas_Engine_Info_Buffer *)info; + free(in); +} + +static void +eng_setup(Evas *e, void *in) +{ + Render_Engine *re; + Evas_Engine_Info_Buffer *info; + + info = (Evas_Engine_Info_Buffer *)in; + if (e->engine.data.output) + eng_output_free(e->engine.data.output); + re = _output_setup(e->output.w, + e->output.h, + info->info.dest_buffer, + info->info.dest_buffer_row_bytes, + info->info.depth_type, + info->info.use_color_key, + info->info.alpha_threshold, + info->info.color_key_r, + info->info.color_key_g, + info->info.color_key_b, + info->info.func.new_update_region, + info->info.func.free_update_region); + e->engine.data.output = re; + if (!e->engine.data.output) return; + if (!e->engine.data.context) + e->engine.data.context = e->engine.func->context_new(e->engine.data.output); +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_buffer_outbuf_buf_free(re->ob); + evas_common_tilebuf_free(re->tb); + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + free(re); + + evas_common_font_shutdown(); + evas_common_image_shutdown(); +} + +static void +eng_output_resize(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + { + int depth; + void *dest; + int dest_row_bytes; + int alpha_level; + DATA32 color_key; + char use_color_key; + void * (*new_update_region) (int x, int y, int w, int h, int *row_bytes); + void (*free_update_region) (int x, int y, int w, int h, void *data); + + depth = re->ob->depth; + dest = re->ob->dest; + dest_row_bytes = re->ob->dest_row_bytes; + alpha_level = re->ob->alpha_level; + color_key = re->ob->color_key; + use_color_key = re->ob->use_color_key; + new_update_region = re->ob->func.new_update_region; + free_update_region = re->ob->func.free_update_region; + evas_buffer_outbuf_buf_free(re->ob); + re->ob = evas_buffer_outbuf_buf_setup_fb(w, + h, + depth, + dest, + dest_row_bytes, + use_color_key, + color_key, + alpha_level, + new_update_region, + free_update_region); + } + evas_common_tilebuf_free(re->tb); + re->tb = evas_common_tilebuf_new(w, h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); +} + +static void +eng_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_set_tile_size(re->tb, w, h); +} + +static void +eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_clear(re->tb); +} + +static void * +eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + RGBA_Image *surface; + Tilebuf_Rect *rect; + int ux, uy, uw, uh; + + re = (Render_Engine *)data; + if (re->end) + { + re->end = 0; + return NULL; + } + if (!re->rects) + { + re->rects = evas_common_tilebuf_get_render_rects(re->tb); + re->cur_rect = (Evas_Object_List *)re->rects; + } + if (!re->cur_rect) return NULL; + rect = (Tilebuf_Rect *)re->cur_rect; + ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h; + re->cur_rect = re->cur_rect->next; + if (!re->cur_rect) + { + evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + re->end = 1; + } + + if ((ux + uw) > re->ob->w) uw = re->ob->w - ux; + if ((uy + uh) > re->ob->h) uh = re->ob->h - uy; + if ((uw <= 0) || (uh <= 0)) return NULL; + surface = evas_buffer_outbuf_buf_new_region_for_update(re->ob, + ux, uy, uw, uh, + cx, cy, cw, ch); + *x = ux; *y = uy; *w = uw; *h = uh; + return surface; +} + +static void +eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_pipe_begin(surface); + evas_common_pipe_flush(surface); + evas_buffer_outbuf_buf_push_updated_region(re->ob, surface, x, y, w, h); + evas_buffer_outbuf_buf_free_region_for_update(re->ob, surface); + evas_common_cpu_end_opt(); +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static void +eng_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +/* module advertising code */ +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ +#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(output_flush); + ORD(output_idle_flush); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "buffer", + "none" +}; diff --git a/src/modules/engines/buffer/evas_engine.h b/src/modules/engines/buffer/evas_engine.h new file mode 100644 index 0000000..ac28620 --- /dev/null +++ b/src/modules/engines/buffer/evas_engine.h @@ -0,0 +1,57 @@ +#ifndef EVAS_ENGINE_H +#define EVAS_ENGINE_H + +typedef struct _Outbuf Outbuf; + +typedef enum _Outbuf_Depth Outbuf_Depth; + +enum _Outbuf_Depth +{ + OUTBUF_DEPTH_NONE, + OUTBUF_DEPTH_ARGB_32BPP_8888_8888, + OUTBUF_DEPTH_BGRA_32BPP_8888_8888, + OUTBUF_DEPTH_RGB_32BPP_888_8888, + OUTBUF_DEPTH_BGR_32BPP_888_8888, + OUTBUF_DEPTH_RGB_24BPP_888_888, + OUTBUF_DEPTH_BGR_24BPP_888_888, + OUTBUF_DEPTH_LAST +}; + +struct _Outbuf +{ + int w, h; + Outbuf_Depth depth; + + void *dest; + int dest_row_bytes; + + int alpha_level; + DATA32 color_key; + char use_color_key : 1; + + struct { + void * (*new_update_region) (int x, int y, int w, int h, int *row_bytes); + void (*free_update_region) (int x, int y, int w, int h, void *data); + } func; + + struct { + RGBA_Image *back_buf; + } priv; +}; + +/****/ + +void evas_buffer_outbuf_buf_init (void); +void evas_buffer_outbuf_buf_free (Outbuf *buf); + +Outbuf *evas_buffer_outbuf_buf_setup_fb (int w, int h, Outbuf_Depth depth, void *dest, int dest_row_bytes, int use_color_key, DATA32 color_key, int alpha_level, + void * (*new_update_region) (int x, int y, int w, int h, int *row_bytes), + void (*free_update_region) (int x, int y, int w, int h, void *data)); + + +RGBA_Image *evas_buffer_outbuf_buf_new_region_for_update (Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch); +void evas_buffer_outbuf_buf_free_region_for_update (Outbuf *buf, RGBA_Image *update); +void evas_buffer_outbuf_buf_push_updated_region (Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h); + +#endif + diff --git a/src/modules/engines/buffer/evas_outbuf.c b/src/modules/engines/buffer/evas_outbuf.c new file mode 100644 index 0000000..27c7ed7 --- /dev/null +++ b/src/modules/engines/buffer/evas_outbuf.c @@ -0,0 +1,361 @@ +#include "evas_common.h" +#include "evas_engine.h" +#include + +void +evas_buffer_outbuf_buf_init(void) +{ +} + +void +evas_buffer_outbuf_buf_free(Outbuf *buf) +{ + if (buf->priv.back_buf) + { + evas_cache_image_drop(&buf->priv.back_buf->cache_entry); + } + free(buf); +} + +Outbuf * +evas_buffer_outbuf_buf_setup_fb(int w, int h, Outbuf_Depth depth, void *dest, int dest_row_bytes, int use_color_key, DATA32 color_key, int alpha_level, + void * (*new_update_region) (int x, int y, int w, int h, int *row_bytes), + void (*free_update_region) (int x, int y, int w, int h, void *data) + ) +{ + Outbuf *buf; + int y; + int bpp; + + buf = calloc(1, sizeof(Outbuf)); + if (!buf) return NULL; + + buf->w = w; + buf->h = h; + buf->depth = depth; + + buf->dest = dest; + buf->dest_row_bytes = dest_row_bytes; + + buf->alpha_level = alpha_level; + buf->color_key = color_key; + buf->use_color_key = use_color_key; + + buf->func.new_update_region = new_update_region; + buf->func.free_update_region = free_update_region; + + bpp = sizeof(DATA32); + if ((buf->depth == OUTBUF_DEPTH_RGB_24BPP_888_888) || + (buf->depth == OUTBUF_DEPTH_BGR_24BPP_888_888)) + bpp = 3; + + if ((buf->depth == OUTBUF_DEPTH_ARGB_32BPP_8888_8888) && + (buf->dest) && (buf->dest_row_bytes == (buf->w * sizeof(DATA32)))) + { + for (y = 0; y < h; y++) + memset(((unsigned char *)(buf->dest)) + (y * buf->dest_row_bytes), + 0, w * bpp); + buf->priv.back_buf = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), + w, h, + buf->dest, + 1, EVAS_COLORSPACE_ARGB8888); + } + else if ((buf->depth == OUTBUF_DEPTH_RGB_32BPP_888_8888) && + (buf->dest) && (buf->dest_row_bytes == (buf->w * sizeof(DATA32)))) + { + buf->priv.back_buf = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), + w, h, + buf->dest, + 0, EVAS_COLORSPACE_ARGB8888); + } + + return buf; +} + +RGBA_Image * +evas_buffer_outbuf_buf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) +{ + RGBA_Image *im; + DATA32 *ptr; + + if (buf->priv.back_buf) + { + *cx = x; *cy = y; *cw = w; *ch = h; + if (buf->priv.back_buf->cache_entry.flags.alpha) + { + int ww = w; + ptr = buf->priv.back_buf->image.data + (y * buf->priv.back_buf->cache_entry.w) + x; + while (h--) + { + while (w--) + *ptr++ = 0; + w = ww; + ptr += (buf->priv.back_buf->cache_entry.w - w); + } + } + return buf->priv.back_buf; + } + else + { + *cx = 0; *cy = 0; *cw = w; *ch = h; + im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); + if (im) + { + if (((buf->depth == OUTBUF_DEPTH_ARGB_32BPP_8888_8888)) || + ((buf->depth == OUTBUF_DEPTH_BGRA_32BPP_8888_8888))) + { + im->cache_entry.flags.alpha = 1; + im = (RGBA_Image *) evas_cache_image_size_set(&im->cache_entry, w, h); + if (im) + { + memset(im->image.data, 0, w * h * sizeof(DATA32)); + } + } + } + } + return im; +} + +void +evas_buffer_outbuf_buf_free_region_for_update(Outbuf *buf, RGBA_Image *update) +{ + if (update != buf->priv.back_buf) evas_cache_image_drop(&update->cache_entry); +} + +void +evas_buffer_outbuf_buf_push_updated_region(Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h) +{ + /* copy update image to out buf & convert */ + switch (buf->depth) + { + case OUTBUF_DEPTH_RGB_24BPP_888_888: + /* copy & pack into 24bpp - if colorkey is enabled... etc. */ + { + DATA8 thresh; + int xx, yy; + int row_bytes; + DATA8 *dest; + DATA32 colorkey; + DATA32 *src; + DATA8 *dst; + + colorkey = buf->color_key; + thresh = buf->alpha_level; + row_bytes = buf->dest_row_bytes; + dest = (DATA8 *)(buf->dest) + (y * row_bytes) + (x * 3); + if (buf->func.new_update_region) + { + dest = buf->func.new_update_region(x, y, w, h, &row_bytes); + } + if (!dest) break; + if (buf->use_color_key) + { + for (yy = 0; yy < h; yy++) + { + dst = dest + (yy * row_bytes); + src = update->image.data + (yy * update->cache_entry.w); + for (xx = 0; xx < w; xx++) + { + if (A_VAL(src) > thresh) + { + *dst++ = R_VAL(src); + *dst++ = G_VAL(src); + *dst++ = B_VAL(src); + } + else + { + *dst++ = R_VAL(&colorkey); + *dst++ = G_VAL(&colorkey); + *dst++ = B_VAL(&colorkey); + } + src++; + } + } + } + else + { + for (yy = 0; yy < h; yy++) + { + dst = dest + (yy * row_bytes); + src = update->image.data + (yy * update->cache_entry.w); + for (xx = 0; xx < w; xx++) + { + *dst++ = R_VAL(src); + *dst++ = G_VAL(src); + *dst++ = B_VAL(src); + src++; + } + } + } + if (buf->func.free_update_region) + { + buf->func.free_update_region(x, y, w, h, dest); + } + } + break; + case OUTBUF_DEPTH_BGR_24BPP_888_888: + /* copy & pack into 24bpp - if colorkey is enabled... etc. */ + { + DATA8 thresh; + int xx, yy; + int row_bytes; + DATA8 *dest; + DATA32 colorkey; + DATA32 *src; + DATA8 *dst; + + colorkey = buf->color_key; + thresh = buf->alpha_level; + row_bytes = buf->dest_row_bytes; + dest = (DATA8 *)(buf->dest) + (y * row_bytes) + (x * 3); + if (buf->func.new_update_region) + { + dest = buf->func.new_update_region(x, y, w, h, &row_bytes); + } + if (!dest) break; + if (buf->use_color_key) + { + for (yy = 0; yy < h; yy++) + { + dst = dest + (yy * row_bytes); + src = update->image.data + (yy * update->cache_entry.w); + for (xx = 0; xx < w; xx++) + { + if (A_VAL(src) > thresh) + { + *dst++ = B_VAL(src); + *dst++ = G_VAL(src); + *dst++ = R_VAL(src); + } + else + { + *dst++ = B_VAL(&colorkey); + *dst++ = G_VAL(&colorkey); + *dst++ = R_VAL(&colorkey); + } + src++; + } + } + } + else + { + for (yy = 0; yy < h; yy++) + { + dst = dest + (yy * row_bytes); + src = update->image.data + (yy * update->cache_entry.w); + for (xx = 0; xx < w; xx++) + { + *dst++ = B_VAL(src); + *dst++ = G_VAL(src); + *dst++ = R_VAL(src); + src++; + } + } + } + if (buf->func.free_update_region) + { + buf->func.free_update_region(x, y, w, h, dest); + } + } + break; + case OUTBUF_DEPTH_RGB_32BPP_888_8888: + case OUTBUF_DEPTH_ARGB_32BPP_8888_8888: + { + DATA32 *dest, *src, *dst; + int yy, row_bytes; + + row_bytes = buf->dest_row_bytes; + dest = (DATA8 *)(buf->dest) + (y * row_bytes) + (x * 4); + if (buf->func.new_update_region) + { + dest = buf->func.new_update_region(x, y, w, h, &row_bytes); + } + /* no need src == dest */ + if (!buf->priv.back_buf) + { + Gfx_Func_Copy func; + + func = evas_common_draw_func_copy_get(w, 0); + if (func) + { + for (yy = 0; yy < h; yy++) + { + src = update->image.data + (yy * update->cache_entry.w); + dst = (DATA8 *)(buf->dest) + ((y + yy) * row_bytes); + func(src, dst, w); + } + + } + } + if (buf->func.free_update_region) + { + buf->func.free_update_region(x, y, w, h, dest); + } + } + break; + case OUTBUF_DEPTH_BGR_32BPP_888_8888: + { + DATA32 *src, *dst; + DATA8 *dest; + int xx, yy, row_bytes; + + row_bytes = buf->dest_row_bytes; + dest = (DATA8 *)(buf->dest) + (y * row_bytes) + (x * 4); + if (buf->func.new_update_region) + { + dest = buf->func.new_update_region(x, y, w, h, &row_bytes); + } + for (yy = 0; yy < h; yy++) + { + dst = dest + (yy * row_bytes); + src = update->image.data + (yy * update->cache_entry.w); + for (xx = 0; xx < w; xx++) + { + A_VAL(dst) = B_VAL(src); + R_VAL(dst) = G_VAL(src); + G_VAL(dst) = R_VAL(src); + dst++; + src++; + } + } + if (buf->func.free_update_region) + { + buf->func.free_update_region(x, y, w, h, dest); + } + } + break; + case OUTBUF_DEPTH_BGRA_32BPP_8888_8888: + { + DATA32 *src, *dst; + DATA8 *dest; + int xx, yy, row_bytes; + + row_bytes = buf->dest_row_bytes; + dest = (DATA8 *)(buf->dest) + (y * row_bytes) + (x * 4); + if (buf->func.new_update_region) + { + dest = buf->func.new_update_region(x, y, w, h, &row_bytes); + } + for (yy = 0; yy < h; yy++) + { + dst = dest + (yy * row_bytes); + src = update->image.data + (yy * update->cache_entry.w); + for (xx = 0; xx < w; xx++) + { + A_VAL(dst) = B_VAL(src); + R_VAL(dst) = G_VAL(src); + G_VAL(dst) = R_VAL(src); + dst++; + src++; + } + } + if (buf->func.free_update_region) + { + buf->func.free_update_region(x, y, w, h, dest); + } + } + break; + default: + break; + } +} diff --git a/src/modules/engines/cairo_common/.cvsignore b/src/modules/engines/cairo_common/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/cairo_common/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/cairo_common/Makefile.am b/src/modules/engines/cairo_common/Makefile.am new file mode 100644 index 0000000..ce0d0cb --- /dev/null +++ b/src/modules/engines/cairo_common/Makefile.am @@ -0,0 +1,22 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = -I. \ + -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/lib/include \ + @FREETYPE_CFLAGS@ @CAIRO_CFLAGS@ + +if BUILD_ENGINE_CAIRO_COMMON + +noinst_LTLIBRARIES = libevas_engine_cairo_common.la +libevas_engine_cairo_common_la_SOURCES = \ +evas_cairo_private.h \ +evas_cairo_common.h \ +evas_cairo_main.c + +libevas_engine_cairo_common_la_LIBADD = @CAIRO_LIBS@ $(top_builddir)/src/lib/libevas.la + +libevas_engine_cairo_common_la_DEPENDENCIES = \ +$(top_builddir)/config.h + +endif diff --git a/src/modules/engines/cairo_common/evas_cairo_common.h b/src/modules/engines/cairo_common/evas_cairo_common.h new file mode 100644 index 0000000..35d504f --- /dev/null +++ b/src/modules/engines/cairo_common/evas_cairo_common.h @@ -0,0 +1,59 @@ +#ifndef EVAS_CAIRO_COMMON_H +#define EVAS_CAIRO_COMMON_H + +#include "evas_common.h" +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +typedef struct _Evas_Cairo_Context Evas_Cairo_Context; +typedef struct _Evas_Cairo_Image Evas_Cairo_Image; +typedef struct _Evas_Cairo_Polygon Evas_Cairo_Polygon; +typedef struct _Evas_Cairo_Polygon_Point Evas_Cairo_Polygon_Point; + +struct _Evas_Cairo_Context +{ + cairo_t *cairo; + + struct { + double r, g, b, a; + } col; + struct { + unsigned int set : 1; + double r, g, b, a; + } mul; +}; + +struct _Evas_Cairo_Image +{ + RGBA_Image *im; + int references; + DATA32 *mulpix; + cairo_surface_t *surface; + cairo_pattern_t *pattern; +}; + +struct _Evas_Cairo_Polygon +{ + Evas_List *points; +}; + +struct _Evas_Cairo_Polygon_Point +{ + int x, y; +}; + +#endif diff --git a/src/modules/engines/cairo_common/evas_cairo_main.c b/src/modules/engines/cairo_common/evas_cairo_main.c new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/engines/cairo_common/evas_cairo_private.h b/src/modules/engines/cairo_common/evas_cairo_private.h new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/engines/cairo_x11/.cvsignore b/src/modules/engines/cairo_x11/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/cairo_x11/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/cairo_x11/Evas_Engine_Cairo_X11.h b/src/modules/engines/cairo_x11/Evas_Engine_Cairo_X11.h new file mode 100644 index 0000000..3a7d64a --- /dev/null +++ b/src/modules/engines/cairo_x11/Evas_Engine_Cairo_X11.h @@ -0,0 +1,27 @@ +#ifndef _EVAS_ENGINE_CAIRO_X11_H +#define _EVAS_ENGINE_CAIRO_X11_H + +#include + +typedef struct _Evas_Engine_Info_Cairo_X11 Evas_Engine_Info_Cairo_X11; + +struct _Evas_Engine_Info_Cairo_X11 +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + /* engine specific data & parameters it needs to set up */ + struct { + Display *display; + Drawable drawable; + Visual *visual; + Colormap colormap; + int depth; + } info; + /* engine specific function calls to query stuff about the destination */ + /* engine (what visual & colormap & depth to use, performance info etc. */ +}; +#endif + + diff --git a/src/modules/engines/cairo_x11/Makefile.am b/src/modules/engines/cairo_x11/Makefile.am new file mode 100644 index 0000000..aea46d7 --- /dev/null +++ b/src/modules/engines/cairo_x11/Makefile.am @@ -0,0 +1,30 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = -I. -I$(top_srcdir)/src/lib -I$(top_srcdir)/src/lib/include -I$(top_srcdir)/src/modules/engines/cairo_common @FREETYPE_CFLAGS@ @x_cflags@ @CAIRO_CFLAGS@ + +if BUILD_ENGINE_CAIRO_X11 + +pkgdir = $(libdir)/evas/modules/engines/cairo_x11/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = \ +evas_engine.h \ +evas_engine.c \ +evas_x_main.c + +module_la_LIBADD = @CAIRO_LIBS@ @x_libs@ $(top_builddir)/src/modules/engines/cairo_common/libevas_engine_cairo_common.la $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_Cairo_X11.h + +endif + +EXTRA_DIST = \ +evas_engine.h \ +evas_engine.c \ +evas_x_main.c \ +Evas_Engine_Cairo_X11.h diff --git a/src/modules/engines/cairo_x11/evas_engine.c b/src/modules/engines/cairo_x11/evas_engine.c new file mode 100644 index 0000000..c100d21 --- /dev/null +++ b/src/modules/engines/cairo_x11/evas_engine.c @@ -0,0 +1,1460 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ +#include +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Cairo_X11.h" +#include "evas_cairo_common.h" + +static void *eng_info(Evas *e); +static void eng_info_free(Evas *e, void *info); +static void eng_setup(Evas *e, void *info); +static void *eng_output_setup(int w, int h, Display *disp, Drawable draw, Visual *vis, Colormap cmap, int depth); +static void eng_output_free(void *data); +static void eng_output_resize(void *data, int w, int h); +static void eng_output_tile_size_set(void *data, int w, int h); +static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h); +static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h); +static void eng_output_redraws_clear(void *data); +static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch); +static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h); +static void eng_output_flush(void *data); + +static void *eng_context_new(void *data); +static void eng_context_free(void *data, void *context); +static void eng_context_clip_set(void *data, void *context, int x, int y, int w, int h); +static void eng_context_clip_clip(void *data, void *context, int x, int y, int w, int h); +static void eng_context_clip_unset(void *data, void *context); +static int eng_context_clip_get(void *data, void *context, int *x, int *y, int *w, int *h); +static void eng_context_color_set(void *data, void *context, int r, int g, int b, int a); +static int eng_context_color_get(void *data, void *context, int *r, int *g, int *b, int *a); +static void eng_context_multiplier_set(void *data, void *context, int r, int g, int b, int a); +static void eng_context_multiplier_unset(void *data, void *context); +static int eng_context_multiplier_get(void *data, void *context, int *r, int *g, int *b, int *a); +static void eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h); +static void eng_context_cutout_clear(void *data, void *context); +static void eng_context_anti_alias_set(void *data, void *context, unsigned char aa); +static unsigned char eng_context_anti_alias_get(void *data, void *context); +static void eng_context_color_interpolation_set(void *data, void *context, int color_space); +static int eng_context_color_interpolation_get(void *data, void *context); +static void eng_context_render_op_set(void *data, void *context, int op); +static int eng_context_render_op_get(void *data, void *context); + +static void eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h); + +static void eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2); + +static void *eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y); +static void *eng_polygon_points_clear(void *data, void *context, void *polygon); +static void eng_polygon_draw(void *data, void *context, void *surface, void *polygon); + +static void *eng_gradient_new(void *data); +static void eng_gradient_free(void *data, void *gradient); +static void eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta); +static void eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta); +static void eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha); +static void eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len); +static void eng_gradient_clear(void *data, void *gradient); +static void eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h); +static void eng_gradient_fill_angle_set(void *data, void *gradient, double angle); +static void eng_gradient_fill_spread_set(void *data, void *gradient, int spread); +static void eng_gradient_angle_set(void *data, void *gradient, double angle); +static void eng_gradient_offset_set(void *data, void *gradient, float offset); +static void eng_gradient_direction_set(void *data, void *gradient, int direction); +static void eng_gradient_type_set(void *data, void *gradient, char *name, char *params); +static int eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h); +static int eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h); +static void eng_gradient_render_pre(void *data, void *context, void *gradient); +static void eng_gradient_render_post(void *data, void *gradient); +static void eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h); + +static void *eng_image_load(void *data, char *file, char *key, int *error, Evas_Image_Load_Opts *lo); +static void *eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace); +static void *eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace); +static void eng_image_free(void *data, void *image); +static void eng_image_size_get(void *data, void *image, int *w, int *h); +static void *eng_image_size_set(void *data, void *image, int w, int h); +static void *eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h); +static void *eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data); +static void *eng_image_data_put(void *data, void *image, DATA32 *image_data); +static void *eng_image_alpha_set(void *data, void *image, int has_alpha); +static int eng_image_alpha_get(void *data, void *image); +static void *eng_image_border_set(void *data, void *image, int l, int r, int t, int b); +static void eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b); +static void eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth); +static char *eng_image_comment_get(void *data, void *image, char *key); +static char *eng_image_format_get(void *data, void *image); +static void eng_image_colorspace_set(void *data, void *image, int cspace); +static int eng_image_colorspace_get(void *data, void *image); +static void eng_image_native_set(void *data, void *image, void *native); +static void *eng_image_native_get(void *data, void *image); +static void eng_image_cache_flush(void *data); +static void eng_image_cache_set(void *data, int bytes); +static int eng_image_cache_get(void *data); + +static void *eng_font_load(void *data, char *name, int size); +static void *eng_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size); +static void *eng_font_add(void *data, void *font, char *name, int size); +static void *eng_font_memory_add(void *data, void *font, char *name, int size, const void *fdata, int fdata_size); +static void eng_font_free(void *data, void *font); +static int eng_font_ascent_get(void *data, void *font); +static int eng_font_descent_get(void *data, void *font); +static int eng_font_max_ascent_get(void *data, void *font); +static int eng_font_max_descent_get(void *data, void *font); +static void eng_font_string_size_get(void *data, void *font, char *text, int *w, int *h); +static int eng_font_inset_get(void *data, void *font, char *text); +static int eng_font_h_advance_get(void *data, void *font, char *text); +static int eng_font_v_advance_get(void *data, void *font, char *text); +static int eng_font_char_coords_get(void *data, void *font, char *text, int pos, int *cx, int *cy, int *cw, int *ch); +static int eng_font_char_at_coords_get(void *data, void *font, char *text, int x, int y, int *cx, int *cy, int *cw, int *ch); +static void eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, char *text); +static void eng_font_cache_flush(void *data); +static void eng_font_cache_set(void *data, int bytes); +static int eng_font_cache_get(void *data); + +static void eng_font_hinting_set(void *data, void *font, int hinting); +static int eng_font_hinting_can_hint(void *data, int hinting); + +typedef struct _Render_Engine Render_Engine; + +struct _Render_Engine +{ + Evas_Cairo_X11_Window *win; +}; + +static Evas_Func eng_func = +{ + eng_info, + eng_info_free, + eng_setup, + eng_output_free, + eng_output_resize, + eng_output_tile_size_set, + eng_output_redraws_rect_add, + eng_output_redraws_rect_del, + eng_output_redraws_clear, + eng_output_redraws_next_update_get, + eng_output_redraws_next_update_push, + eng_output_flush, + /* draw context virtual methods */ + eng_context_new, + eng_context_free, + eng_context_clip_set, + eng_context_clip_clip, + eng_context_clip_unset, + eng_context_clip_get, + eng_context_color_set, + eng_context_color_get, + eng_context_multiplier_set, + eng_context_multiplier_unset, + eng_context_multiplier_get, + eng_context_cutout_add, + eng_context_cutout_clear, + eng_context_anti_alias_set, + eng_context_anti_alias_get, + eng_context_color_interpolation_set, + eng_context_color_interpolation_get, + eng_context_render_op_set, + eng_context_render_op_get, + /* rectangle draw funcs */ + eng_rectangle_draw, + /* line draw funcs */ + eng_line_draw, + /* polygon draw funcs */ + eng_polygon_point_add, + eng_polygon_points_clear, + eng_polygon_draw, + /* gradient draw funcs */ + eng_gradient_new, + eng_gradient_free, + eng_gradient_color_stop_add, + eng_gradient_alpha_stop_add, + eng_gradient_color_data_set, + eng_gradient_alpha_data_set, + eng_gradient_clear, + eng_gradient_fill_set, + eng_gradient_fill_angle_set, + eng_gradient_fill_spread_set, + eng_gradient_angle_set, + eng_gradient_offset_set, + eng_gradient_direction_set, + eng_gradient_type_set, + eng_gradient_is_opaque, + eng_gradient_is_visible, + eng_gradient_render_pre, + eng_gradient_render_post, + eng_gradient_draw, + /* image draw funcs */ + eng_image_load, + eng_image_new_from_data, + eng_image_new_from_copied_data, + eng_image_free, + eng_image_size_get, + eng_image_size_set, + NULL, + eng_image_dirty_region, + eng_image_data_get, + eng_image_data_put, + eng_image_alpha_set, + eng_image_alpha_get, + eng_image_border_set, + eng_image_border_get, + eng_image_draw, + eng_image_comment_get, + eng_image_format_get, + eng_image_colorspace_set, + eng_image_colorspace_get, + eng_image_native_set, + eng_image_native_get, + /* image cache funcs */ + eng_image_cache_flush, + eng_image_cache_set, + eng_image_cache_get, + /* font draw functions */ + eng_font_load, + eng_font_memory_load, + eng_font_add, + eng_font_memory_add, + eng_font_free, + eng_font_ascent_get, + eng_font_descent_get, + eng_font_max_ascent_get, + eng_font_max_descent_get, + eng_font_string_size_get, + eng_font_inset_get, + eng_font_h_advance_get, + eng_font_v_advance_get, + eng_font_char_coords_get, + eng_font_char_at_coords_get, + eng_font_draw, + /* font cache functions */ + eng_font_cache_flush, + eng_font_cache_set, + eng_font_cache_get, + + eng_font_hinting_set, + eng_font_hinting_can_hint +}; + +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_Cairo_X11 *info; + + info = calloc(1, sizeof(Evas_Engine_Info_Cairo_X11)); + if (!info) return NULL; + info->magic.magic = rand(); + printf("CAIRO: create info...\n"); + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_Cairo_X11 *in; + + in = (Evas_Engine_Info_Cairo_X11 *)info; + free(in); +} + +static void +eng_setup(Evas *e, void *in) +{ + Render_Engine *re; + Evas_Engine_Info_Cairo_X11 *info; + + info = (Evas_Engine_Info_Cairo_X11 *)in; + printf("CAIRO: setup info...\n"); + if (!e->engine.data.output) + e->engine.data.output = + eng_output_setup(e->output.w, + e->output.h, + info->info.display, + info->info.drawable, + info->info.visual, + info->info.colormap, + info->info.depth); + if (!e->engine.data.output) return; + + if (!e->engine.data.context) + e->engine.data.context = + e->engine.func->context_new(e->engine.data.output); + re = e->engine.data.output; +} + +static void * +eng_output_setup(int w, int h, Display *disp, Drawable draw, Visual *vis, Colormap cmap, int depth) +{ + Render_Engine *re; + + re = calloc(1, sizeof(Render_Engine)); + re->win = eng_window_new(disp, draw, + 0 /* FIXME: screen 0 assumption */, + vis, cmap, depth, w, h); + if (!re->win) + { + free(re); + return NULL; + } + printf("CAIRO: cairo window setup done.\n"); + evas_common_cpu_init(); + + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + + return re; +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + + eng_window_free(re->win); + + free(re); + + evas_common_font_shutdown(); + evas_common_image_shutdown(); +} + +static void +eng_output_resize(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + re->win->w = w; + re->win->h = h; + + eng_window_size_set(re->win, w, h); +} + +static void +eng_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + /* not used in cairo engine */ +} + +static void +eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + /* FIXME? cairo_surface_mark_dirty_rectangle */ + + re = (Render_Engine *)data; + if (!re->win->draw.redraw) + { + re->win->draw.x1 = 0; + re->win->draw.y1 = 0; + re->win->draw.x2 = re->win->w - 1; + re->win->draw.y2 = re->win->h - 1; + } + else + { + if (x < re->win->draw.x1) re->win->draw.x1 = x; + if (y < re->win->draw.y1) re->win->draw.y1 = y; + if ((x + w - 1) > re->win->draw.x2) re->win->draw.x2 = x + w - 1; + if ((y + h - 1) > re->win->draw.y2) re->win->draw.y2 = y + h - 1; + } + re->win->draw.redraw = 1; +} + +static void +eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + /* not used in cairo engine */ +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + re->win->draw.redraw = 0; +} + +static void * +eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (!re->win->draw.redraw) return NULL; + + if (x) *x = re->win->draw.x1; + if (y) *y = re->win->draw.y1; + if (w) *w = re->win->draw.x2 - re->win->draw.x1 + 1; + if (h) *h = re->win->draw.y2 - re->win->draw.y1 + 1; + if (cx) *cx = re->win->draw.x1; + if (cy) *cy = re->win->draw.y1; + if (cw) *cw = re->win->draw.x2 - re->win->draw.x1 + 1; + if (ch) *ch = re->win->draw.y2 - re->win->draw.y1 + 1; + return re; +} + +static void +eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + re->win->draw.redraw = 0; +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + Evas_Cairo_Context *ctxt; + Evas_List *l; + + re = (Render_Engine *)data; +} + +static void * +eng_context_new(void *data) +{ + Render_Engine *re; + Evas_Cairo_Context *ctxt; + + re = (Render_Engine *)data; + ctxt = calloc(1, sizeof(Evas_Cairo_Context)); + if (!ctxt) return NULL; + + ctxt->cairo = cairo_create(re->win->surface); + + return ctxt; +} + +static void +eng_context_free(void *data, void *context) +{ + Render_Engine *re; + Evas_Cairo_Context *ctxt; + + re = (Render_Engine *)data; + ctxt = context; + + cairo_destroy(ctxt->cairo); + free(ctxt); +} + +static void +eng_context_clip_set(void *data, void *context, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + /* not used in cairo engine */ +} + +static void +eng_context_clip_clip(void *data, void *context, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + /* not used in cairo engine */ +} + +static void +eng_context_clip_unset(void *data, void *context) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + /* not used in cairo engine */ +} + +static int +eng_context_clip_get(void *data, void *context, int *x, int *y, int *w, int *h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + /* not used in cairo engine */ + return 0; +} + +static void +eng_context_color_set(void *data, void *context, int r, int g, int b, int a) +{ + Render_Engine *re; + Evas_Cairo_Context *ctxt; + + re = (Render_Engine *)data; + ctxt = (Evas_Cairo_Context *)context; + + ctxt->col.r = (double)r / 255.0; + ctxt->col.g = (double)g / 255.0; + ctxt->col.b = (double)b / 255.0; + ctxt->col.a = (double)a / 255.0; +} + +static int +eng_context_color_get(void *data, void *context, int *r, int *g, int *b, int *a) +{ + Render_Engine *re; + Evas_Cairo_Context *ctxt; + + re = (Render_Engine *)data; + ctxt = (Evas_Cairo_Context *)context; + + if (r) *r = ctxt->col.r * 255; + if (g) *g = ctxt->col.g * 255; + if (b) *b = ctxt->col.b * 255; + if (a) *a = ctxt->col.a * 255; + return 1; +} + +static void +eng_context_multiplier_set(void *data, void *context, int r, int g, int b, int a) +{ + Render_Engine *re; + Evas_Cairo_Context *ctxt; + + re = (Render_Engine *)data; + ctxt = (Evas_Cairo_Context *)context; + + ctxt->mul.r = (double)r / 255.0; + ctxt->mul.g = (double)g / 255.0; + ctxt->mul.b = (double)b / 255.0; + ctxt->mul.a = (double)a / 255.0; + ctxt->mul.set = 1; +} + +static void +eng_context_multiplier_unset(void *data, void *context) +{ + Render_Engine *re; + Evas_Cairo_Context *ctxt; + + re = (Render_Engine *)data; + ctxt = (Evas_Cairo_Context *)context; + ctxt->mul.set = 0; +} + +static int +eng_context_multiplier_get(void *data, void *context, int *r, int *g, int *b, int *a) +{ + Render_Engine *re; + Evas_Cairo_Context *ctxt; + + re = (Render_Engine *)data; + ctxt = (Evas_Cairo_Context *)context; + + if (r) *r = ctxt->mul.r * 255; + if (g) *g = ctxt->mul.g * 255; + if (b) *b = ctxt->mul.b * 255; + if (a) *a = ctxt->mul.a * 255; + return ctxt->mul.set; +} + +static void +eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + /* not used in cairo engine */ +} + +static void +eng_context_cutout_clear(void *data, void *context) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + /* not used in cairo engine */ +} + +static void +eng_context_anti_alias_set(void *data, void *context, unsigned char aa) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static unsigned char +eng_context_anti_alias_get(void *data, void *context) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return 1; +} + +static void +eng_context_color_interpolation_set(void *data, void *context, int color_space) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static int +eng_context_color_interpolation_get(void *data, void *context) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return 0; +} + +static void +eng_context_render_op_set(void *data, void *context, int op) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static int +eng_context_render_op_get(void *data, void *context) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return 0; +} + + +static void +eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + Evas_Cairo_Context *ctxt; + double r, g, b, a; + + re = (Render_Engine *)data; + ctxt = (Evas_Cairo_Context *)context; + + cairo_rectangle(ctxt->cairo, x, y, w, h); + r = ctxt->col.r; + g = ctxt->col.g; + b = ctxt->col.b; + a = ctxt->col.a; + if (ctxt->mul.set) + { + r *= ctxt->mul.r; + g *= ctxt->mul.g; + b *= ctxt->mul.b; + a *= ctxt->mul.a; + } + cairo_set_source_rgba(ctxt->cairo, r, g, b, a); + cairo_fill(ctxt->cairo); +} + +static void +eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2) +{ + Render_Engine *re; + Evas_Cairo_Context *ctxt; + double r, g, b, a; + + re = (Render_Engine *)data; + ctxt = (Evas_Cairo_Context *)context; + + cairo_move_to(ctxt->cairo, x1, y1); + cairo_line_to(ctxt->cairo, x2, y2); + r = ctxt->col.r; + g = ctxt->col.g; + b = ctxt->col.b; + a = ctxt->col.a; + if (ctxt->mul.set) + { + r *= ctxt->mul.r; + g *= ctxt->mul.g; + b *= ctxt->mul.b; + a *= ctxt->mul.a; + } + cairo_set_source_rgba(ctxt->cairo, r, g, b, a); + cairo_stroke(ctxt->cairo); +} + +static void * +eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y) +{ + Render_Engine *re; + Evas_Cairo_Context *ctxt; + Evas_Cairo_Polygon *poly; + Evas_Cairo_Polygon_Point *pt; + + re = (Render_Engine *)data; + ctxt = (Evas_Cairo_Context *)context; + poly = (Evas_Cairo_Polygon *)polygon; + if (!poly) poly = calloc(1, sizeof(Evas_Cairo_Polygon)); + + pt = malloc(sizeof(Evas_Cairo_Polygon_Point)); + if (pt) + { + pt->x = x; + pt->y = y; + poly->points = evas_list_append(poly->points, pt); + } + return poly; +} + +static void * +eng_polygon_points_clear(void *data, void *context, void *polygon) +{ + Render_Engine *re; + Evas_Cairo_Context *ctxt; + Evas_Cairo_Polygon *poly; + + re = (Render_Engine *)data; + ctxt = (Evas_Cairo_Context *)context; + poly = (Evas_Cairo_Polygon *)polygon; + if (!poly) return NULL; + + while (poly->points) + { + free(poly->points->data); + poly->points = evas_list_remove_list(poly->points, poly->points); + } + free(poly); + + return NULL; +} + +static void +eng_polygon_draw(void *data, void *context, void *surface, void *polygon) +{ + Render_Engine *re; + Evas_Cairo_Context *ctxt; + Evas_Cairo_Polygon *poly; + Evas_Cairo_Polygon_Point *pt; + double r, g, b, a; + + re = (Render_Engine *)data; + ctxt = (Evas_Cairo_Context *)context; + poly = (Evas_Cairo_Polygon *)polygon; + + pt = poly->points->data; + if (pt) + { + Evas_List *l; + cairo_move_to(ctxt->cairo, pt->x, pt->y); + for (l = poly->points->next; l; l = l->next) + { + pt = l->data; + cairo_line_to(ctxt->cairo, pt->x, pt->y); + } + } + r = ctxt->col.r; + g = ctxt->col.g; + b = ctxt->col.b; + a = ctxt->col.a; + if (ctxt->mul.set) + { + r *= ctxt->mul.r; + g *= ctxt->mul.g; + b *= ctxt->mul.b; + a *= ctxt->mul.a; + } + cairo_set_source_rgba(ctxt->cairo, r, g, b, a); + cairo_stroke(ctxt->cairo); +} + +static void * +eng_gradient_new(void *data) +{ + return evas_common_gradient_new(); +} + +static void +eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta) +{ + evas_common_gradient_color_stop_add(gradient, r, g, b, a, delta); +} + +static void +eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta) +{ + evas_common_gradient_alpha_stop_add(gradient, a, delta); +} + +static void +eng_gradient_clear(void *data, void *gradient) +{ + evas_common_gradient_clear(gradient); +} + +static void +eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha) +{ + evas_common_gradient_color_data_set(gradient, map, len, has_alpha); +} + +static void +eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len) +{ + evas_common_gradient_alpha_data_set(gradient, alpha_map, len); +} + +static void +eng_gradient_free(void *data, void *gradient) +{ + evas_common_gradient_free(gradient); +} + +static void +eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h) +{ + evas_common_gradient_fill_set(gradient, x, y, w, h); +} + +static void +eng_gradient_fill_angle_set(void *data, void *gradient, double angle) +{ + evas_common_gradient_fill_angle_set(gradient, angle); +} + +static void +eng_gradient_fill_spread_set(void *data, void *gradient, int spread) +{ + evas_common_gradient_fill_spread_set(gradient, spread); +} + +static void +eng_gradient_angle_set(void *data, void *gradient, double angle) +{ + evas_common_gradient_map_angle_set(gradient, angle); +} + +static void +eng_gradient_offset_set(void *data, void *gradient, float offset) +{ + evas_common_gradient_map_offset_set(gradient, offset); +} + +static void +eng_gradient_direction_set(void *data, void *gradient, int direction) +{ + evas_common_gradient_map_direction_set(gradient, direction); +} + +static void +eng_gradient_type_set(void *data, void *gradient, char *name, char *params) +{ + evas_common_gradient_type_set(gradient, name, params); +} + +static int +eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h) +{ + return 0; +} + +static int +eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h) +{ + return 0; +} + +static void +eng_gradient_render_pre(void *data, void *context, void *gradient) +{ +} + +static void +eng_gradient_render_post(void *data, void *gradient) +{ +} + +static void +eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h) +{ +} + +static void * +eng_image_load(void *data, char *file, char *key, int *error, Evas_Image_Load_Opts *lo) +{ + Render_Engine *re; + Evas_Cairo_Image *im; + + re = (Render_Engine *)data; + if (error) *error = 0; + + im = calloc(1, sizeof(Evas_Cairo_Image)); + if (!im) return NULL; + + im->im = evas_common_load_image_from_file(file, key, lo); + if (!im->im) + { + free(im); + return NULL; + } + im->references = 1; + return im; +} + +static void * +eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + Render_Engine *re; + Evas_Cairo_Image *im; + + re = (Render_Engine *)data; + + /* FIXME, cache! */ + im = calloc(1, sizeof(Evas_Cairo_Image)); + if (!im) return NULL; + + im->im = evas_common_image_new(); + if (!im->im) + { + free(im); + return NULL; + } + im->im->image = evas_common_image_surface_new(im->im); + if (!im->im->image) + { + evas_common_image_free(im->im); + free(im); + return NULL; + } + + im->im->image->w = w; + im->im->image->h = h; + im->im->image->data = image_data; + im->im->image->no_free = 1; + im->references = 1; + return im; +} + +static void * +eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + Render_Engine *re; + Evas_Cairo_Image *im; + + re = (Render_Engine *)data; + + /* FIXME, cache! */ + im = calloc(1, sizeof(Evas_Cairo_Image)); + if (!im) return NULL; + im->references = 1; + im->im = evas_common_image_create(w, h); + if (!im->im) + { + free(im); + return NULL; + } + if (image_data) + memcpy(im->im->image->data, image_data, w * h * sizeof(DATA32)); + return im; +} + +static void +eng_image_free(void *data, void *image) +{ + Render_Engine *re; + Evas_Cairo_Image *im; + + re = (Render_Engine *)data; + im = (Evas_Cairo_Image *)image; + evas_common_image_unref(im->im); + if (im->surface) cairo_surface_destroy(im->surface); + if (im->pattern) cairo_pattern_destroy(im->pattern); + free(im); +} + +static void +eng_image_size_get(void *data, void *image, int *w, int *h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (!image) + { + if (w) *w = 0; + if (h) *h = 0; + } + else + { + Evas_Cairo_Image *im; + + im = image; + if (w) *w = im->im->image->w; + if (h) *h = im->im->image->h; + } +} + +static void * +eng_image_size_set(void *data, void *image, int w, int h) +{ + Render_Engine *re; + + /* FIXME */ + re = (Render_Engine *)data; + return image; +} + +static void * +eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h) +{ + Render_Engine *re; + + /* FIXME */ + re = (Render_Engine *)data; + return image; +} + +static void * +eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data) +{ + Render_Engine *re; + + /* FIXME */ + re = (Render_Engine *)data; + *image_data = NULL; + return image; +} + +static void * +eng_image_data_put(void *data, void *image, DATA32 *image_data) +{ + Render_Engine *re; + + /* FIXME */ + re = (Render_Engine *)data; + return image; +} + +static void * +eng_image_alpha_set(void *data, void *image, int has_alpha) +{ + Render_Engine *re; + + /* FIXME */ + re = (Render_Engine *)data; + return image; +} + +static int +eng_image_alpha_get(void *data, void *image) +{ + Render_Engine *re; + Evas_Cairo_Image *im; + + re = (Render_Engine *)data; + if (!image) return 0; + + im = image; + if (im->im->cache_entry.flags.alpha) return 1; + return 0; +} + +static void * +eng_image_border_set(void *data, void *image, int l, int r, int t, int b) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return image; +} + +static void +eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return; +} + +static void +eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth) +{ + Render_Engine *re; + Evas_Cairo_Context *ctxt; + Evas_Cairo_Image *im; + DATA32 *pix; + + re = (Render_Engine *)data; + ctxt = (Evas_Cairo_Context *)context; + if (!image) return; + + im = image; + evas_common_load_image_data_from_file(im->im); + pix = im->im->image->data; + if (pix) + { + if (!im->surface) + { + im->mulpix = malloc(im->im->image->w * im->im->image->h * sizeof(DATA32)); + if (im->mulpix) + { + int i, n; + DATA32 *p; + + n = im->im->image->w * im->im->image->h; + p = im->mulpix; + for (i = 0; i < n; i++) + { + int a; + + a = A_VAL(pix); + R_VAL(p) = (R_VAL(pix) * a) / 255; + G_VAL(p) = (G_VAL(pix) * a) / 255; + B_VAL(p) = (B_VAL(pix) * a) / 255; + A_VAL(p) = a; + p++; + pix++; + } + im->surface = cairo_image_surface_create_for_data(im->mulpix, + CAIRO_FORMAT_ARGB32, + im->im->image->w, + im->im->image->h, + 0); + im->pattern = cairo_pattern_create_for_surface(im->surface); + } + } + + if (smooth) + cairo_pattern_set_filter(im->pattern, CAIRO_FILTER_BILINEAR); + else + cairo_pattern_set_filter(im->pattern, CAIRO_FILTER_NEAREST); + cairo_save(ctxt->cairo); + cairo_translate(ctxt->cairo, dst_x, dst_y); + cairo_scale(ctxt->cairo, + (double)src_w / (double)dst_w, + (double)src_h / (double)dst_h); + cairo_move_to(ctxt->cairo, 0, 0); + // cairo_set_rgb_color(re->win->cairo, + // (double)(R_VAL(((RGBA_Draw_Context *)context)->col.col)) / 255.0, + // (double)(R_VAL(((RGBA_Draw_Context *)context)->col.col)) / 255.0, + // (double)(R_VAL(((RGBA_Draw_Context *)context)->col.col)) / 255.0); + // cairo_set_alpha(re->win->cairo, + // (double)(A_VAL(((RGBA_Draw_Context *)context)->col.col)) / 255.0); + cairo_set_source_surface(ctxt->cairo, + im->surface, + im->im->image->w, + im->im->image->h); + cairo_paint(ctxt->cairo); + cairo_restore(ctxt->cairo); + } +} + +static char * +eng_image_comment_get(void *data, void *image, char *key) +{ + Render_Engine *re; + + /* FIXME */ + re = (Render_Engine *)data; + return NULL; +} + +static char * +eng_image_format_get(void *data, void *image) +{ + Render_Engine *re; + + /* FIXME */ + re = (Render_Engine *)data; + return NULL; +} + +static void +eng_image_colorspace_set(void *data, void *image, int cspace) +{ +} + +static int +eng_image_colorspace_get(void *data, void *image) +{ + return EVAS_COLORSPACE_ARGB8888; +} + +static void +eng_image_native_set(void *data, void *image, void *native) +{ +} + +static void * +eng_image_native_get(void *data, void *image) +{ + return NULL; +} + +static void +eng_image_cache_flush(void *data) +{ + Render_Engine *re; + int tmp_size; + + re = (Render_Engine *)data; + tmp_size = evas_common_image_get_cache(); + evas_common_image_set_cache(0); + evas_common_image_set_cache(tmp_size); +} + +static void +eng_image_cache_set(void *data, int bytes) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_image_set_cache(bytes); +} + +static int +eng_image_cache_get(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return evas_common_image_get_cache(); +} + +static void * +eng_font_load(void *data, char *name, int size) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; + return NULL; +} + +static void * +eng_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; + return NULL; +} + +static void * +eng_font_add(void *data, void *font, char *name, int size) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; + return NULL; +} + +static void * +eng_font_memory_add(void *data, void *font, char *name, int size, const void *fdata, int fdata_size) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; + return NULL; +} + +static void +eng_font_free(void *data, void *font) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; +} + +static int +eng_font_ascent_get(void *data, void *font) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; + return 0; +} + +static int +eng_font_descent_get(void *data, void *font) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; + return 0; +} + +static int +eng_font_max_ascent_get(void *data, void *font) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; + return 0; +} + +static int +eng_font_max_descent_get(void *data, void *font) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; + return 0; +} + +static void +eng_font_string_size_get(void *data, void *font, char *text, int *w, int *h) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; +} + +static int +eng_font_inset_get(void *data, void *font, char *text) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; + return 0; +} + +static int +eng_font_h_advance_get(void *data, void *font, char *text) +{ + Render_Engine *re; + int h, v; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; + return 0; +} + +static int +eng_font_v_advance_get(void *data, void *font, char *text) +{ + Render_Engine *re; + int h, v; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; + return 0; +} + +static int +eng_font_char_coords_get(void *data, void *font, char *text, int pos, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; + return 0; +} + +static int +eng_font_char_at_coords_get(void *data, void *font, char *text, int x, int y, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; + return 0; +} + +static void +eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, char *text) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; +} + +static void +eng_font_cache_flush(void *data) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; +} + +static void +eng_font_cache_set(void *data, int bytes) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; +} + +static int +eng_font_cache_get(void *data) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; + return 0; +} + +static void +eng_font_hinting_set(void *data, void *font, int hinting) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; +} + +static int +eng_font_hinting_can_hint(void *data, int hinting) +{ + Render_Engine *re; + + /* FIXME, use cairo font subsystem */ + re = (Render_Engine *)data; +} + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + em->functions = (void *)(&eng_func); + return 1; +} + +EAPI void +module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "cairo_x11", + "none" +}; diff --git a/src/modules/engines/cairo_x11/evas_engine.h b/src/modules/engines/cairo_x11/evas_engine.h new file mode 100644 index 0000000..7d52241 --- /dev/null +++ b/src/modules/engines/cairo_x11/evas_engine.h @@ -0,0 +1,41 @@ +#ifndef EVAS_ENGINE_H +#define EVAS_ENGINE_H + +#include "evas_cairo_common.h" + +typedef struct _Evas_Cairo_X11_Window Evas_Cairo_X11_Window; + +struct _Evas_Cairo_X11_Window +{ + Display *disp; + Window win; + int w, h; + int screen; + Visual *visual; + Colormap colormap; + int depth; + cairo_surface_t *surface; + + struct { + int redraw : 1; + int x1, y1, x2, y2; + } draw; +}; + +Evas_Cairo_X11_Window * + evas_engine_cairo_x11_window_new(Display *disp, + Window win, + int screen, + Visual *vis, + Colormap cmap, + int depth, + int w, + int h); +void + evas_engine_cairo_x11_window_free(Evas_Cairo_X11_Window *cw); +void + evas_engine_cairo_x11_window_use(Evas_Cairo_X11_Window *cw); +void + evas_engine_cairo_x11_window_size_set(Evas_Cairo_X11_Window *cw, int w, int h); + +#endif diff --git a/src/modules/engines/cairo_x11/evas_x_main.c b/src/modules/engines/cairo_x11/evas_x_main.c new file mode 100644 index 0000000..ae2cd82 --- /dev/null +++ b/src/modules/engines/cairo_x11/evas_x_main.c @@ -0,0 +1,55 @@ +#include +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Cairo_X11.h" +#include "evas_cairo_common.h" + +static Evas_Cairo_X11_Window *_evas_cairo_x11_window = NULL; + +Evas_Cairo_X11_Window * +evas_engine_cairo_x11_window_new(Display *disp, + Window win, + int screen, + Visual *vis, + Colormap cmap, + int depth, + int w, + int h) +{ + Evas_Cairo_X11_Window *cw; + + cw = calloc(1, sizeof(Evas_Cairo_X11_Window)); + if (!cw) return NULL; + cw->disp = disp; + cw->win = win; + cw->screen = screen; + cw->visual = vis; + cw->colormap = cmap; + cw->depth = depth; + cw->surface = cairo_xlib_surface_create(disp, win, vis, w, h); + return cw; +} + +void +evas_engine_cairo_x11_window_free(Evas_Cairo_X11_Window *cw) +{ + if (cw == _evas_cairo_x11_window) _evas_cairo_x11_window = NULL; + cairo_surface_destroy(cw->surface); + free(cw); +} + +void +evas_engine_cairo_x11_window_use(Evas_Cairo_X11_Window *cw) +{ + if (_evas_cairo_x11_window != cw) + { + _evas_cairo_x11_window = cw; + } +} + +void +evas_engine_cairo_x11_window_size_set(Evas_Cairo_X11_Window *cw, int w, int h) +{ + cairo_xlib_surface_set_size(cw->surface, w, h); +} diff --git a/src/modules/engines/direct3d/.cvsignore b/src/modules/engines/direct3d/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/direct3d/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/direct3d/Evas_Engine_Direct3D.h b/src/modules/engines/direct3d/Evas_Engine_Direct3D.h new file mode 100644 index 0000000..753f523 --- /dev/null +++ b/src/modules/engines/direct3d/Evas_Engine_Direct3D.h @@ -0,0 +1,30 @@ +#ifndef __EVAS_ENGINE_DIRECT3D_H__ +#define __EVAS_ENGINE_DIRECT3D_H__ + + +#include +#include +#include + +typedef struct _Evas_Engine_Info_Direct3D Evas_Engine_Info_Direct3D; + +struct _Evas_Engine_Info_Direct3D +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + struct { + HWND window; + LPDIRECT3D9 object; /* Direct3D object */ + LPDIRECT3DDEVICE9 device; /* Direct3D device */ + LPD3DXSPRITE sprite; /* Direct3D sprite */ + LPDIRECT3DTEXTURE9 texture; /* Direct3D texture */ + + int depth; + int rotation; + } info; +}; + + +#endif /* __EVAS_ENGINE_DIRECT3D_H__ */ diff --git a/src/modules/engines/direct3d/Makefile.am b/src/modules/engines/direct3d/Makefile.am new file mode 100644 index 0000000..b3c14e7 --- /dev/null +++ b/src/modules/engines/direct3d/Makefile.am @@ -0,0 +1,38 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +@FREETYPE_CFLAGS@ + +if BUILD_ENGINE_DIRECT3D + +pkgdir = $(libdir)/evas/modules/engines/direct3d/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la +module_la_SOURCES = \ +evas_engine.h \ +evas_engine.c \ +evas_outbuf.c \ +evas_direct3d_buffer.c \ +evas_direct3d_main.cpp + +module_la_LIBADD = $(top_builddir)/src/lib/libevas.la @direct3d_libs@ +module_la_LDFLAGS = @lt_no_undefined@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_Direct3D.h + +endif + +EXTRA_DIST = \ +evas_engine.h \ +evas_engine.c \ +evas_outbuf.c \ +evas_direct3d_buffer.c \ +evas_direct3d_main.cpp \ +Evas_Engine_Direct3D.h diff --git a/src/modules/engines/direct3d/evas_direct3d_buffer.c b/src/modules/engines/direct3d/evas_direct3d_buffer.c new file mode 100644 index 0000000..cfa44e9 --- /dev/null +++ b/src/modules/engines/direct3d/evas_direct3d_buffer.c @@ -0,0 +1,88 @@ +#include + +#include "evas_engine.h" + + +Direct3D_Output_Buffer * +evas_direct3d_output_buffer_new(int depth, + int width, + int height, + void *data) +{ + Direct3D_Output_Buffer *d3dob; + + d3dob = calloc(1, sizeof(Direct3D_Output_Buffer)); + if (!d3dob) return NULL; + + d3dob->image = data; + d3dob->depth = depth; + d3dob->width = width; + d3dob->height = height; + d3dob->pitch = width * (depth >> 3); + + if (!d3dob->image) + { + d3dob->image = malloc(d3dob->pitch * height); + if (!d3dob->image) + { + free(d3dob); + return NULL; + } + } + + return d3dob; +} + +void +evas_direct3d_output_buffer_free(Direct3D_Output_Buffer *d3dob) +{ + if (d3dob->image) free(d3dob->image); + free(d3dob); +} + +void +evas_direct3d_output_buffer_paste(Direct3D_Output_Buffer *d3dob, + DATA8 *d3d_data, + int d3d_width, + int d3d_height, + int d3d_pitch, + int x, + int y) +{ + DATA8 *evas_data; + int width; + int height; + int pitch; + int j; + + if ((x >= d3d_width) || (y >= d3d_height)) + return; + + /* compute the size of the data to copy on the back surface */ + width = ((x + d3dob->width) > d3d_width) + ? d3d_width - x + : d3dob->width; + height = ((y + d3dob->height) > d3d_height) + ? d3d_height - y + : d3dob->height; + pitch = width * (d3dob->depth >> 3); + + d3d_data += y * d3d_pitch + x * (d3dob->depth >> 3); + evas_data = (unsigned char *)d3dob->image; + for (j = 0; j < height; j++, evas_data += d3dob->pitch, d3d_data += d3d_pitch) + memcpy(d3d_data, evas_data, pitch); +} + +DATA8 * +evas_direct3d_output_buffer_data(Direct3D_Output_Buffer *d3dob, + int *bytes_per_line_ret) +{ + if (bytes_per_line_ret) *bytes_per_line_ret = d3dob->pitch; + return d3dob->image; +} + +int +evas_direct3d_output_buffer_depth(Direct3D_Output_Buffer *d3dob) +{ + return d3dob->depth; +} diff --git a/src/modules/engines/direct3d/evas_direct3d_main.cpp b/src/modules/engines/direct3d/evas_direct3d_main.cpp new file mode 100644 index 0000000..c58c6eb --- /dev/null +++ b/src/modules/engines/direct3d/evas_direct3d_main.cpp @@ -0,0 +1,84 @@ +#include "evas_engine.h" + + +extern "C" { + +int +evas_direct3d_masks_get(Outbuf *buf) +{ + D3DSURFACE_DESC sd; + + if (FAILED(buf->priv.d3d.texture->GetLevelDesc(0, &sd))) + return 0; + + switch (sd.Format) + { + case D3DFMT_A8R8G8B8: + case D3DFMT_X8R8G8B8: + buf->priv.mask.r = 0x00ff0000; + buf->priv.mask.g = 0x0000ff00; + buf->priv.mask.b = 0x000000ff; + break; + case D3DFMT_R5G6B5: + buf->priv.mask.r = 0xf800; + buf->priv.mask.g = 0x07e0; + buf->priv.mask.b = 0x001f; + break; + default: + return 0; + } + + return 1; +} + +void * +evas_direct3d_lock(Outbuf *buf, int *d3d_width, int *d3d_height, int *d3d_pitch) +{ + D3DSURFACE_DESC sd; + D3DLOCKED_RECT d3d_rect; + + /* is that call needed / overkill ? */ + if (FAILED(buf->priv.d3d.texture->GetLevelDesc(0, &sd))) + return NULL; + + if (FAILED(buf->priv.d3d.device->BeginScene())) + return NULL; + if (FAILED(buf->priv.d3d.sprite->Begin(D3DXSPRITE_DO_NOT_ADDREF_TEXTURE))) + { + buf->priv.d3d.device->EndScene(); + return NULL; + } + if (FAILED(buf->priv.d3d.texture->LockRect(0, &d3d_rect, NULL, D3DLOCK_DISCARD))) + { + buf->priv.d3d.sprite->End(); + buf->priv.d3d.device->EndScene(); + return NULL; + } + + *d3d_width = sd.Width; + *d3d_height = sd.Height; + *d3d_pitch = d3d_rect.Pitch; + + return d3d_rect.pBits; +} + +void +evas_direct3d_unlock(Outbuf *buf) +{ + if (FAILED(buf->priv.d3d.texture->UnlockRect(0))) + return; + + if (FAILED(buf->priv.d3d.sprite->Draw(buf->priv.d3d.texture, + NULL, NULL, NULL, + D3DCOLOR_ARGB (255, 255, 255, 255)))) + return; + if (FAILED(buf->priv.d3d.sprite->End())) + return; + + if (FAILED(buf->priv.d3d.device->EndScene())) + return; + if (FAILED(buf->priv.d3d.device->Present(NULL, NULL, NULL, NULL))) + return; +} + +} diff --git a/src/modules/engines/direct3d/evas_engine.c b/src/modules/engines/direct3d/evas_engine.c new file mode 100644 index 0000000..d63ba77 --- /dev/null +++ b/src/modules/engines/direct3d/evas_engine.c @@ -0,0 +1,369 @@ +#include "evas_engine.h" +#include "evas_private.h" +#include "Evas_Engine_Direct3D.h" + +/* engine struct data */ +typedef struct _Render_Engine Render_Engine; + +struct _Render_Engine +{ + Tilebuf *tb; + Outbuf *ob; + Tilebuf_Rect *rects; + Evas_Object_List *cur_rect; + int end : 1; +}; + + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func, pfunc; + +/* prototypes we will use here */ +static void *_output_setup(int width, + int height, + int rotation, + HWND window, + LPDIRECT3D9 object, + LPDIRECT3DDEVICE9 device, + LPD3DXSPRITE sprite, + LPDIRECT3DTEXTURE9 texture, + int w_depth); + +static void *eng_info(Evas *e); +static void eng_info_free(Evas *e, + void *info); +static void eng_setup(Evas *e, + void *info); +static void eng_output_free(void *data); +static void eng_output_resize(void *data, + int width, + int height); +static void eng_output_tile_size_set(void *data, + int width, + int height); +static void eng_output_redraws_rect_add(void *data, + int x, + int y, + int width, + int height); +static void eng_output_redraws_rect_del(void *data, + int x, + int y, + int width, + int height); +static void eng_output_redraws_clear(void *data); + +/* internal engine routines */ +static void * +_output_setup(int width, + int height, + int rotation, + HWND window, + LPDIRECT3D9 object, + LPDIRECT3DDEVICE9 device, + LPD3DXSPRITE sprite, + LPDIRECT3DTEXTURE9 texture, + int w_depth) +{ + Render_Engine *re; + + re = (Render_Engine *)calloc(1, sizeof(Render_Engine)); + if (!re) return NULL; + + /* if we haven't initialized - init (automatic abort if already done) */ + evas_common_cpu_init(); + + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + + evas_direct3d_outbuf_init(); + + /* get any stored performance metrics from device */ + re->ob = evas_direct3d_outbuf_setup_d3d(width, height, rotation, OUTBUF_DEPTH_INHERIT, window, object, device, sprite, texture, w_depth); + if (!re->ob) + { + free(re); + return NULL; + } + + re->tb = evas_common_tilebuf_new(width, height); + if (!re->tb) + { + evas_direct3d_outbuf_free(re->ob); + free(re); + return NULL; + } + + /* FIXME: that comment :) */ + /* in preliminary tests 16x16 gave highest framerates */ + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + + return re; +} + +/* engine api this module provides */ +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_Direct3D *info; + + info = (Evas_Engine_Info_Direct3D *)calloc(1, sizeof(Evas_Engine_Info_Direct3D)); + if (!info) return NULL; + info->magic.magic = rand(); + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, + void *info) +{ + Evas_Engine_Info_Direct3D *in; + + in = (Evas_Engine_Info_Direct3D *)info; + free(in); +} + +static void +eng_setup(Evas *e, + void *info) +{ + Render_Engine *re; + Evas_Engine_Info_Direct3D *in; + + in = (Evas_Engine_Info_Direct3D *)info; + if (!e->engine.data.output) + e->engine.data.output = + _output_setup(e->output.w, + e->output.h, + in->info.rotation, + in->info.window, + in->info.object, + in->info.device, + in->info.sprite, + in->info.texture, + in->info.depth); + if (!e->engine.data.output) return; + if (!e->engine.data.context) + e->engine.data.context = + e->engine.func->context_new(e->engine.data.output); + + re = (Render_Engine *)e->engine.data.output; +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_direct3d_outbuf_free(re->ob); + evas_common_tilebuf_free(re->tb); + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + free(re); + + evas_common_font_shutdown(); + evas_common_image_shutdown(); +} + +static void +eng_output_resize(void *data, + int width, + int height) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_direct3d_outbuf_reconfigure(re->ob, + width, + height, + evas_direct3d_outbuf_rot_get(re->ob), + OUTBUF_DEPTH_INHERIT); + evas_common_tilebuf_free(re->tb); + re->tb = evas_common_tilebuf_new(width, height); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); +} + +static void +eng_output_tile_size_set(void *data, + int width, + int height) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_set_tile_size(re->tb, width, height); +} + +static void +eng_output_redraws_rect_add(void *data, + int x, + int y, + int width, + int height) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_add_redraw(re->tb, x, y, width, height); +} + +static void +eng_output_redraws_rect_del(void *data, + int x, + int y, + int width, + int height) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_del_redraw(re->tb, x, y, width, height); +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_clear(re->tb); +} + +static void * +eng_output_redraws_next_update_get(void *data, + int *x, + int *y, + int *w, + int *h, + int *cx, + int *cy, + int *cw, + int *ch) +{ + Render_Engine *re; + RGBA_Image *surface; + Tilebuf_Rect *rect; + int ux; + int uy; + int uw; + int uh; + + re = (Render_Engine *)data; + if (re->end) + { + re->end = 0; + return NULL; + } + if (!re->rects) + { + re->rects = evas_common_tilebuf_get_render_rects(re->tb); + re->cur_rect = (Evas_Object_List *)re->rects; + } + if (!re->cur_rect) return NULL; + rect = (Tilebuf_Rect *)re->cur_rect; + ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h; + re->cur_rect = re->cur_rect->next; + if (!re->cur_rect) + { + evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + re->end = 1; + } + + surface = evas_direct3d_outbuf_new_region_for_update(re->ob, + ux, uy, + uw, uh, + cx, cy, + cw, ch); + *x = ux; *y = uy; *w = uw; *h = uh; + + return surface; +} + +static void +eng_output_redraws_next_update_push(void *data, + void *surface, + int x, + int y, + int w, + int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_pipe_begin((RGBA_Image *)surface); + evas_common_pipe_flush((RGBA_Image *)surface); + evas_direct3d_outbuf_push_updated_region(re->ob, (RGBA_Image *)surface, x, y, w, h); + evas_direct3d_outbuf_free_region_for_update(re->ob, (RGBA_Image *)surface); + evas_common_cpu_end_opt(); +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_direct3d_outbuf_flush(re->ob); +} + +static void +eng_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +/* module advertising code */ +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ +#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(output_flush); + ORD(output_idle_flush); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "direct3d", + "none" +}; diff --git a/src/modules/engines/direct3d/evas_engine.h b/src/modules/engines/direct3d/evas_engine.h new file mode 100644 index 0000000..6be498f --- /dev/null +++ b/src/modules/engines/direct3d/evas_engine.h @@ -0,0 +1,141 @@ +#ifndef __EVAS_ENGINE_H__ +#define __EVAS_ENGINE_H__ + + +#include +#include +#include + +#include "evas_common.h" + + +typedef struct _Outbuf Outbuf; +typedef struct _Direct3D_Output_Buffer Direct3D_Output_Buffer; + + +enum _Outbuf_Depth +{ + OUTBUF_DEPTH_NONE, + OUTBUF_DEPTH_INHERIT, + OUTBUF_DEPTH_RGB_16BPP_565_565_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_555_555_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_444_444_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_565_444_DITHERED, + OUTBUF_DEPTH_RGB_32BPP_888_8888, + OUTBUF_DEPTH_LAST +}; +typedef enum _Outbuf_Depth Outbuf_Depth; + + +struct _Outbuf +{ + int width; + int height; + int rot; + Outbuf_Depth depth; + + struct { + struct { + HWND window; + LPDIRECT3D9 object; + LPDIRECT3DDEVICE9 device; + LPD3DXSPRITE sprite; + LPDIRECT3DTEXTURE9 texture; + int depth; + } d3d; + struct { + DATA32 r, g, b; + } mask; + + /* a list of pending regions to write to the target */ + Evas_List *pending_writes; + } priv; +}; + +struct _Direct3D_Output_Buffer +{ + void *image; + int x; + int y; + int width; + int height; + int depth; + int pitch; +}; + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Outbuf functions */ +void evas_direct3d_outbuf_init(void); +void evas_direct3d_outbuf_free(Outbuf *buf); +Outbuf *evas_direct3d_outbuf_setup_d3d(int width, + int height, + int rotation, + Outbuf_Depth depth, + HWND window, + LPDIRECT3D9 object, + LPDIRECT3DDEVICE9 device, + LPD3DXSPRITE sprite, + LPDIRECT3DTEXTURE9 texture, + int w_depth); +RGBA_Image *evas_direct3d_outbuf_new_region_for_update(Outbuf *buf, + int x, + int y, + int width, + int height, + int *cx, + int *cy, + int *cw, + int *ch); +void evas_direct3d_outbuf_free_region_for_update(Outbuf *buf, + RGBA_Image *update); +void evas_direct3d_outbuf_flush(Outbuf *buf); +void evas_direct3d_outbuf_push_updated_region(Outbuf *buf, + RGBA_Image *update, + int x, + int y, + int width, + int height); +void evas_direct3d_outbuf_reconfigure(Outbuf *buf, + int width, + int height, + int rotation, + Outbuf_Depth depth); +int evas_direct3d_outbuf_width_get(Outbuf *buf); +int evas_direct3d_outbuf_height_get(Outbuf *buf); +Outbuf_Depth evas_direct3d_outbuf_depth_get(Outbuf *buf); +int evas_direct3d_outbuf_rot_get(Outbuf *buf); + +/* Output Buffer functions */ +Direct3D_Output_Buffer *evas_direct3d_output_buffer_new(int depth, + int width, + int height, + void *data); +void evas_direct3d_output_buffer_free(Direct3D_Output_Buffer *d3dob); +void evas_direct3d_output_buffer_paste(Direct3D_Output_Buffer *d3dob, + DATA8 *d3d_data, + int d3d_width, + int d3d_height, + int d3d_pitch, + int x, + int y); +DATA8 *evas_direct3d_output_buffer_data(Direct3D_Output_Buffer *d3dob, + int *bytes_per_line_ret); +int evas_direct3d_output_buffer_depth(Direct3D_Output_Buffer *d3dob); + + +int evas_direct3d_masks_get(Outbuf *buf); +void *evas_direct3d_lock(Outbuf *buf, int *d3d_width, int *d3d_height, int *d3d_pitch); +void evas_direct3d_unlock(Outbuf *buf); + + +#ifdef __cplusplus +} +#endif + + +#endif /* __EVAS_ENGINE_H__ */ diff --git a/src/modules/engines/direct3d/evas_outbuf.c b/src/modules/engines/direct3d/evas_outbuf.c new file mode 100644 index 0000000..3db76db --- /dev/null +++ b/src/modules/engines/direct3d/evas_outbuf.c @@ -0,0 +1,333 @@ +#include "evas_engine.h" + + +void +evas_direct3d_outbuf_init(void) +{ +} + +void +evas_direct3d_outbuf_free(Outbuf *buf) +{ + free(buf); +} + +Outbuf * +evas_direct3d_outbuf_setup_d3d(int width, + int height, + int rotation, + Outbuf_Depth depth, + HWND window, + LPDIRECT3D9 object, + LPDIRECT3DDEVICE9 device, + LPD3DXSPRITE sprite, + LPDIRECT3DTEXTURE9 texture, + int w_depth) +{ + Outbuf *buf; + + buf = (Outbuf *)calloc(1, sizeof(Outbuf)); + if (!buf) + return NULL; + + buf->width = width; + buf->height = height; + buf->depth = depth; + buf->rot = rotation; + + buf->priv.d3d.window = window; + buf->priv.d3d.object = object; + buf->priv.d3d.device = device; + buf->priv.d3d.sprite = sprite; + buf->priv.d3d.texture = texture; + buf->priv.d3d.depth = w_depth; + + { + Gfx_Func_Convert conv_func; + Direct3D_Output_Buffer *d3dob; + + d3dob = evas_direct3d_output_buffer_new(buf->priv.d3d.depth, 1, 1, NULL); + + conv_func = NULL; + if (d3dob) + { + if (evas_direct3d_masks_get(buf)) + { + if ((rotation == 0) || (rotation == 180)) + conv_func = evas_common_convert_func_get(0, + width, + height, + evas_direct3d_output_buffer_depth (d3dob), + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + PAL_MODE_NONE, + rotation); + else if ((rotation == 90) || (rotation == 270)) + conv_func = evas_common_convert_func_get(0, + height, + width, + evas_direct3d_output_buffer_depth (d3dob), + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + PAL_MODE_NONE, + rotation); + } + evas_direct3d_output_buffer_free(d3dob); + if (!conv_func) + { + printf(".[ Evas Error ].\n" + " {\n" + " At depth %i:\n" + " RGB format mask: %08x, %08x, %08x\n" + " Not supported by and compiled in converters!\n" + " }\n", + buf->priv.d3d.depth, + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b); + } + } + } + + return buf; +} + +RGBA_Image * +evas_direct3d_outbuf_new_region_for_update(Outbuf *buf, + int x, + int y, + int width, + int height, + int *cx, + int *cy, + int *cw, + int *ch) +{ + RGBA_Image *im; + Direct3D_Output_Buffer *d3dob = NULL; + int bpl = 0; + + *cx = 0; + *cy = 0; + *cw = width; + *ch = height; + + if ((buf->rot == 0) && + (buf->priv.mask.r == 0xff0000) && + (buf->priv.mask.g == 0x00ff00) && + (buf->priv.mask.b == 0x0000ff)) + { + im = evas_cache_image_empty(evas_common_image_cache_get()); + im->image->w = width; + im->image->h = height; + im->image->data = NULL; + im->image->no_free = 1; + d3dob = evas_direct3d_output_buffer_new(buf->priv.d3d.depth, + width, + height, + NULL); + im->extended_info = d3dob; + im->image->data = (DATA32 *)evas_direct3d_output_buffer_data(d3dob, &bpl); + } + else + { + im = (RGBA_Image*) evas_cache_image_empty(evas_common_image_cache_get()); + evas_cache_image_surface_alloc(&im->cache_entry, width, height); + im->extended_info = d3dob; + if ((buf->rot == 0) || (buf->rot == 180)) + d3dob = evas_direct3d_output_buffer_new(buf->priv.d3d.depth, + width, + height, + NULL); + else if ((buf->rot == 90) || (buf->rot == 270)) + d3dob = evas_direct3d_output_buffer_new(buf->priv.d3d.depth, + width, + height, + NULL); + im->extended_info = d3dob; + } + + buf->priv.pending_writes = evas_list_append(buf->priv.pending_writes, im); + + return im; +} + +void +evas_direct3d_outbuf_free_region_for_update(Outbuf *buf, + RGBA_Image *update) +{ + /* no need to do anything - they are cleaned up on flush */ +} + +void +evas_direct3d_outbuf_flush(Outbuf *buf) +{ + Evas_List *l; + void *d3d_data; + int d3d_width; + int d3d_height; + int d3d_pitch; + + /* lock the texture */ + if (!(d3d_data = evas_direct3d_lock(buf, + &d3d_width, &d3d_height, &d3d_pitch))) + goto free_images; + + /* copy safely the images that need to be drawn onto the back surface */ + for (l = buf->priv.pending_writes; l; l = l->next) + { + RGBA_Image *im; + Direct3D_Output_Buffer *d3dob; + + im = l->data; + d3dob = im->extended_info; + /* paste now */ + evas_direct3d_output_buffer_paste(d3dob, + d3d_data, + d3d_width, + d3d_height, + d3d_pitch, + d3dob->x, + d3dob->y); + } + + /* unlock the texture */ + evas_direct3d_unlock(buf); + + free_images: + while (buf->priv.pending_writes) + { + RGBA_Image *im; + Direct3D_Output_Buffer *d3dob; + + im = buf->priv.pending_writes->data; + buf->priv.pending_writes = evas_list_remove_list(buf->priv.pending_writes, + buf->priv.pending_writes); + d3dob = im->extended_info; + evas_cache_image_drop(im); + if (d3dob) evas_direct3d_output_buffer_free(d3dob); + } + evas_common_cpu_end_opt(); +} + +void +evas_direct3d_outbuf_push_updated_region(Outbuf *buf, + RGBA_Image *update, + int x, + int y, + int width, + int height) +{ + Gfx_Func_Convert conv_func; + Direct3D_Output_Buffer *d3dob; + DATA32 *src_data; + void *data; + int bpl = 0; + + conv_func = NULL; + d3dob = update->extended_info; + + if ((buf->rot == 0) || (buf->rot == 180)) + conv_func = evas_common_convert_func_get(NULL, + width, + height, + evas_direct3d_output_buffer_depth(d3dob), + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + PAL_MODE_NONE, + buf->rot); + else if ((buf->rot == 90) || (buf->rot == 270)) + conv_func = evas_common_convert_func_get(NULL, + height, + width, + evas_direct3d_output_buffer_depth(d3dob), + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + PAL_MODE_NONE, + buf->rot); + + if (!conv_func) return; + + data = evas_direct3d_output_buffer_data(d3dob, &bpl); + src_data = update->image->data; + if (buf->rot == 0) + { + d3dob->x = x; + d3dob->y = y; + } + else if (buf->rot == 90) + { + d3dob->x = y; + d3dob->y = buf->width - x - width; + } + else if (buf->rot == 180) + { + d3dob->x = buf->width - x - width; + d3dob->y = buf->height - y - height; + } + else if (buf->rot == 270) + { + d3dob->x = buf->height - y - height; + d3dob->y = x; + } + if ((buf->rot == 0) || (buf->rot == 180)) + { + d3dob->width = width; + d3dob->height = height; + } + else if ((buf->rot == 90) || (buf->rot == 270)) + { + d3dob->width = height; + d3dob->height = width; + } + + if (data != src_data) + conv_func(src_data, data, + 0, + bpl / + ((evas_direct3d_output_buffer_depth(d3dob))) - d3dob->width, + d3dob->width, d3dob->height, x, y, NULL); +} + +void +evas_direct3d_outbuf_reconfigure(Outbuf *buf, + int width, + int height, + int rotation, + Outbuf_Depth depth) +{ + if ((width == buf->width) && (height == buf->height) && + (rotation == buf->rot) && (depth == buf->depth)) + return; + buf->width = width; + buf->height = height; + buf->rot = rotation; +} + +int +evas_direct3d_outbuf_width_get(Outbuf *buf) +{ + return buf->width; +} + +int +evas_direct3d_outbuf_height_get(Outbuf *buf) +{ + return buf->height; +} + +Outbuf_Depth +evas_direct3d_outbuf_depth_get(Outbuf *buf) +{ + return buf->depth; +} + +int +evas_direct3d_outbuf_rot_get(Outbuf *buf) +{ + return buf->rot; +} diff --git a/src/modules/engines/fb/.cvsignore b/src/modules/engines/fb/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/fb/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/fb/Evas_Engine_FB.h b/src/modules/engines/fb/Evas_Engine_FB.h new file mode 100644 index 0000000..7166e42 --- /dev/null +++ b/src/modules/engines/fb/Evas_Engine_FB.h @@ -0,0 +1,22 @@ +#ifndef _EVAS_ENGINE_FB_H +#define _EVAS_ENGINE_FB_H + +typedef struct _Evas_Engine_Info_FB Evas_Engine_Info_FB; + +struct _Evas_Engine_Info_FB +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + struct { + + int virtual_terminal; + int device_number; + int refresh; + int rotation; + } info; +}; +#endif + + diff --git a/src/modules/engines/fb/Makefile.am b/src/modules/engines/fb/Makefile.am new file mode 100644 index 0000000..0b0ac04 --- /dev/null +++ b/src/modules/engines/fb/Makefile.am @@ -0,0 +1,38 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +@FREETYPE_CFLAGS@ + +if BUILD_ENGINE_FB + +pkgdir = $(libdir)/evas/modules/engines/fb/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la +module_la_SOURCES = \ +evas_engine.h \ +evas_fb.h \ +evas_engine.c \ +evas_fb_main.c \ +evas_outbuf.c + +module_la_LIBADD = $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_FB.h + +endif + +EXTRA_DIST = \ +evas_engine.h \ +evas_fb.h \ +evas_engine.c \ +evas_fb_main.c \ +evas_outbuf.c \ +Evas_Engine_FB.h diff --git a/src/modules/engines/fb/evas_engine.c b/src/modules/engines/fb/evas_engine.c new file mode 100644 index 0000000..797413c --- /dev/null +++ b/src/modules/engines/fb/evas_engine.c @@ -0,0 +1,284 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_FB.h" + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func, pfunc; + +/* engine struct data */ +typedef struct _Render_Engine Render_Engine; + +struct _Render_Engine +{ + Tilebuf *tb; + Outbuf *ob; + Tilebuf_Rect *rects; + Evas_Object_List *cur_rect; + int end : 1; +}; + +/* prototypes we will use here */ +static void *_output_setup(int w, int h, int rot, int vt, int dev, int refresh); + +static void *eng_info(Evas *e); +static void eng_info_free(Evas *e, void *info); +static void eng_setup(Evas *e, void *info); +static void eng_output_free(void *data); +static void eng_output_resize(void *data, int w, int h); +static void eng_output_tile_size_set(void *data, int w, int h); +static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h); +static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h); +static void eng_output_redraws_clear(void *data); +static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch); +static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h); +static void eng_output_flush(void *data); +static void eng_output_idle_flush(void *data); + +/* internal engine routines */ +static void * +_output_setup(int w, int h, int rot, int vt, int dev, int refresh) +{ + Render_Engine *re; + + re = calloc(1, sizeof(Render_Engine)); + /* if we haven't initialized - init (automatic abort if already done) */ + evas_common_cpu_init(); + + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + + evas_fb_outbuf_fb_init(); + + /* get any stored performance metrics from device (xserver) */ + re->ob = evas_fb_outbuf_fb_setup_fb(w, h, rot, OUTBUF_DEPTH_INHERIT, vt, dev, refresh); + re->tb = evas_common_tilebuf_new(evas_fb_outbuf_fb_get_width(re->ob), evas_fb_outbuf_fb_get_height(re->ob)); + /* no backbuf! */ + evas_fb_outbuf_fb_set_have_backbuf(re->ob, 0); + /* in preliminary tests 16x16 gave highest framerates */ + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + return re; +} + +/* engine api this module provides */ +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_FB *info; + + info = calloc(1, sizeof(Evas_Engine_Info_FB)); + if (!info) return NULL; + info->magic.magic = rand(); + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_FB *in; + + in = (Evas_Engine_Info_FB *)info; + free(in); +} + +static void +eng_setup(Evas *e, void *in) +{ + Render_Engine *re; + Evas_Engine_Info_FB *info; + + info = (Evas_Engine_Info_FB *)in; + re = _output_setup(e->output.w, + e->output.h, + info->info.rotation, + info->info.virtual_terminal, + info->info.device_number, + info->info.refresh); + e->engine.data.output = re; + if (!e->engine.data.output) return; + e->engine.data.context = e->engine.func->context_new(e->engine.data.output); +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_fb_outbuf_fb_free(re->ob); + evas_common_tilebuf_free(re->tb); + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + free(re); + + evas_common_font_shutdown(); + evas_common_image_shutdown(); +} + +static void +eng_output_resize(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_fb_outbuf_fb_reconfigure(re->ob, w, h, + evas_fb_outbuf_fb_get_rot(re->ob), + OUTBUF_DEPTH_INHERIT); + evas_common_tilebuf_free(re->tb); + re->tb = evas_common_tilebuf_new(w, h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); +} + +static void +eng_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_set_tile_size(re->tb, w, h); +} + +static void +eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_clear(re->tb); +} + +static void * +eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + RGBA_Image *surface; + Tilebuf_Rect *rect; + int ux, uy, uw, uh; + + re = (Render_Engine *)data; + if (re->end) + { + re->end = 0; + return NULL; + } + if (!re->rects) + { + re->rects = evas_common_tilebuf_get_render_rects(re->tb); + re->cur_rect = (Evas_Object_List *)re->rects; + } + if (!re->cur_rect) return NULL; + rect = (Tilebuf_Rect *)re->cur_rect; + ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h; + re->cur_rect = re->cur_rect->next; + if (!re->cur_rect) + { + evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + re->end = 1; + } + + surface = evas_fb_outbuf_fb_new_region_for_update(re->ob, + ux, uy, uw, uh, + cx, cy, cw, ch); + *x = ux; *y = uy; *w = uw; *h = uh; + return surface; +} + +static void +eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_pipe_begin(surface); + evas_common_pipe_flush(surface); + evas_fb_outbuf_fb_push_updated_region(re->ob, surface, x, y, w, h); + evas_fb_outbuf_fb_free_region_for_update(re->ob, surface); + evas_common_cpu_end_opt(); +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static void +eng_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +/* module advertising code */ +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ +#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(output_flush); + ORD(output_idle_flush); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "fb", + "none" +}; diff --git a/src/modules/engines/fb/evas_engine.h b/src/modules/engines/fb/evas_engine.h new file mode 100644 index 0000000..d514582 --- /dev/null +++ b/src/modules/engines/fb/evas_engine.h @@ -0,0 +1,59 @@ +#ifndef EVAS_ENGINE_H +#define EVAS_ENGINE_H + +#include "evas_fb.h" + +typedef struct _Outbuf Outbuf; + +typedef enum _Outbuf_Depth Outbuf_Depth; + +enum _Outbuf_Depth +{ + OUTBUF_DEPTH_NONE, + OUTBUF_DEPTH_INHERIT, + OUTBUF_DEPTH_RGB_16BPP_565_565_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_555_555_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_444_444_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_565_444_DITHERED, + OUTBUF_DEPTH_RGB_32BPP_888_8888, + OUTBUF_DEPTH_LAST +}; + +struct _Outbuf +{ + Outbuf_Depth depth; + int w, h; + int rot; + + struct { + struct { + FB_Mode *fb; + } fb; + struct { + DATA32 r, g, b; + } mask; + RGBA_Image *back_buf; + } priv; +}; + +/****/ + +void evas_fb_outbuf_fb_init (void); +void evas_fb_outbuf_fb_free (Outbuf *buf); + +Outbuf *evas_fb_outbuf_fb_setup_fb (int w, int h, int rot, Outbuf_Depth depth, int vt_no, int dev_no, int refresh); + +void evas_fb_outbuf_fb_blit (Outbuf *buf, int src_x, int src_y, int w, int h, int dst_x, int dst_y); +void evas_fb_outbuf_fb_update (Outbuf *buf, int x, int y, int w, int h); +RGBA_Image *evas_fb_outbuf_fb_new_region_for_update (Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch); +void evas_fb_outbuf_fb_free_region_for_update (Outbuf *buf, RGBA_Image *update); +void evas_fb_outbuf_fb_push_updated_region (Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h); +void evas_fb_outbuf_fb_reconfigure (Outbuf *buf, int w, int h, int rot, Outbuf_Depth depth); +int evas_fb_outbuf_fb_get_width (Outbuf *buf); +int evas_fb_outbuf_fb_get_height (Outbuf *buf); +Outbuf_Depth evas_fb_outbuf_fb_get_depth (Outbuf *buf); +int evas_fb_outbuf_fb_get_rot (Outbuf *buf); +int evas_fb_outbuf_fb_get_have_backbuf (Outbuf *buf); +void evas_fb_outbuf_fb_set_have_backbuf (Outbuf *buf, int have_backbuf); + +#endif diff --git a/src/modules/engines/fb/evas_fb.h b/src/modules/engines/fb/evas_fb.h new file mode 100644 index 0000000..0289102 --- /dev/null +++ b/src/modules/engines/fb/evas_fb.h @@ -0,0 +1,95 @@ +#ifndef _EVAS_FB_H +#define _EVAS_FB_H 1 + +/* -------------------------------------------------------------------- */ +/* LINUX FBCON FRAMEBUFFER UTILITY CODE */ +/* makes setting up the framebuffer easy. Also makes it eays to port to */ +/* some other system if needed. */ +/* Copyright (c) 1999 - Carsten Haitzler (The Rasterman) */ +/* -------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct _fb_mode FB_Mode; + +struct _fb_mode +{ + int width; + int height; + int refresh; + int depth; + int bpp; + int fb_fd; + void *mem; + int mem_offset; + struct fb_var_screeninfo fb_var; +}; + +/* init a framebuffer (and switch to) vt number vt. If vt == 0 use current */ +/* vt */ +void fb_init(int vt, int device); +/* call this afetr setting or getting the fb mode (whichever) to complete */ +/* the dsetup */ +int fb_postinit(FB_Mode *mode); +/* console switching - if a switch was requested this with block if block */ +/* is 1, otherwise it will return 1 if current console is active or 0 if */ +/* the user has switched away in the meantime */ +int fb_await_switch(int block); +/* list all current possible video modes listed in /etc/fb.modes */ +/* returns pointer to an aray of FB_Mode, and sets num_return to the number */ +/* of elements int he returned array */ +FB_Mode *fb_list_modes(int *num_return); +/* sets the fb mode to the resolution width x height and the depth to depth. */ +/* and if refresh > 0 attempts to use a mode with a refresh rate (in Hz) of */ +/* that. If this fails it will return NULL - if it succeeds it will return */ +/* a pointer to the FB_Mode thatwas set. only modes in /etc/fb.modes will */ +/* be used. If refresh is 0 it uses the DEFAULT mode (the one with no */ +/* refresh rate at the end of its name (WIDTHxHEIGHT-REFRESH) */ +/* NB: in 8bpp you get a 332 palette. This is fixed so all modes are */ +/* "truecolor" - the onyl difference is how many bits bep red, green and */ +/* blue channel. This is for speed reasons */ +FB_Mode *fb_setmode(int width, int height, int depth, int refresh); +/* returns the current fb mode being used in FB_Mode */ +FB_Mode *fb_getmode(void); +/* changes the bit depth of the current fb mode to depth and returns a new */ +/* handle to a new fb mode with updated parameters. frees cur_mode for you. */ +FB_Mode *fb_changedepth(FB_Mode *cur_mode, int depth); +/* changes resolution - retaining current depth of the current mode, */ +/* returning a handle to the new mode once done. frees cur_mode for you. */ +FB_Mode *fb_changeres(FB_Mode *cur_mode, int width, int height, int refresh); +/* chnages both resolution and depth and returns a handle to the new mode */ +/* when done. frees cur_mode for you */ +FB_Mode *fb_changemode(FB_Mode *cur_mode, int width, int height, int depth, int refresh); + +/* ------------------------------------------------------------------------- */ +/* How to init: */ +/* (Example) */ + +/* FB_Mode *mode; */ +/* int fb_fd = -1; */ +/* fb_init(0); */ +/* mode = fb_setmode(640, 480, 8, 0); */ +/* if (mode) */ +/* fb_fd = fb_postinit(mode); */ +/* if (fb_fd == -1) */ +/* { */ +/* fprintf(stderr, "Frambuffer init failed\n"); */ +/* exit(1); */ +/* } */ +/* .... code to play with the FB */ +#endif diff --git a/src/modules/engines/fb/evas_fb_main.c b/src/modules/engines/fb/evas_fb_main.c new file mode 100644 index 0000000..ce6946a --- /dev/null +++ b/src/modules/engines/fb/evas_fb_main.c @@ -0,0 +1,601 @@ +/* -------------------------------------------------------------------- */ +/* LINUX FBCON FRAMEBUFFER UTILITY CODE */ +/* makes setting up the framebuffer easy. Also makes it eays to port to */ +/* some other system if needed. */ +/* Copyright (c) 1999 - Carsten Haitzler (The Rasterman) */ +/* -------------------------------------------------------------------- */ +#include "evas_common.h" +#include "evas_fb.h" + +#include +#include +#include +#include +#include +#include + +#define FB_ACTIVE 0 +#define FB_REL_REQ 1 +#define FB_INACTIVE 2 +#define FB_ACQ_REQ 3 + +/* -------------------------------------------------------------------- */ +/* internal variables */ + +static struct fb_fix_screeninfo fb_fix; +static int fb, tty; +static int bpp, depth; +static int orig_vt_no = 0; +static int kd_mode; +static struct vt_mode vt_omode; +static struct fb_var_screeninfo fb_ovar; +static unsigned short ored[256], ogreen[256], oblue[256]; +static unsigned short red[256], green[256], blue[256]; +static struct fb_cmap ocmap = { 0, 256, ored, ogreen, oblue, NULL }; +static struct fb_cmap cmap = { 0, 256, red, green, blue, NULL }; + +/* -------------------------------------------------------------------- */ +/* internal function prototypes */ + +static void fb_cleanup(void); +//static void fb_cleanup_fork(void); +static void fb_setvt(int vtno); +static void fb_init_palette_332(FB_Mode *mode); +static void fb_init_palette_linear(FB_Mode *mode); + +/* -------------------------------------------------------------------- */ +/* palette setting */ + +static void +fb_init_palette_332(FB_Mode *mode) +{ + int r, g, b, i; + + if (mode->fb_var.bits_per_pixel != 8) + return; + i = 0; + + if (ioctl(fb, FBIOGETCMAP, &cmap) == -1) + perror("ioctl FBIOGETCMAP"); + + /* generate the palette */ + for (r = 0; r < 8; r++) + { + for (g = 0; g < 8; g++) + { + for (b = 0; b < 4; b++) + { + int val; + + val = (r << 5) | (r << 2) | (r >> 1); + red[i] = (val << 8) | val; + val = (g << 5) | (g << 2) | (g >> 1); + green[i] = (val << 8) | val; + val = (b << 6) | (b << 4) | (b << 2) | (b); + blue[i] = (val << 8) | val; + i++; + } + } + } + + /* set colormap */ + if (ioctl(fb, FBIOPUTCMAP, &cmap) == -1) + perror("ioctl FBIOPUTCMAP"); + +} + +static void +fb_init_palette_linear(FB_Mode *mode) +{ + int i; + + if (mode->fb_var.bits_per_pixel != 8) + return; + + if (ioctl(fb, FBIOGETCMAP, &cmap) == -1) + perror("ioctl FBIOGETCMAP"); + + /* generate the palette */ + for (i = 0; i < 256; i++) + red[i] = (i << 8) | i; + for (i = 0; i < 256; i++) + green[i] = (i << 8) | i; + for (i = 0; i < 256; i++) + blue[i] = (i << 8) | i; + + /* set colormap */ + if (ioctl(fb, FBIOPUTCMAP, &cmap) == -1) + perror("ioctl FBIOPUTCMAP"); + +} + +/* -------------------------------------------------------------------- */ +/* initialisation & cleanup */ + +FB_Mode * +fb_list_modes(int *num_return) +{ + FILE *f; + char line[256], label[256], value[256]; + FB_Mode *modes = NULL; + int num; + + num = 0; + f = fopen("/etc/fb.modes","r"); + if (!f) + { + *num_return = 0; + return NULL; + } + while (fgets(line, sizeof(line) - 1, f)) + { + if (sscanf(line, "mode \"%250[^\"]\"", label) == 1) + { + char f1[32], f2[32], f3[32], f4[32]; + + f1[0] = 0; f2[0] = 0; f3[0] = 0; f4[0] = 0; + sscanf(label, "%30[^x]x%30[^-]-%30[^-]-%30s", f1, f2, f3, f4); + if ((f1[0]) && (f2[0])) + { + int geometry = 0; + int timings = 0; + + num++; + modes = realloc(modes, num * sizeof(FB_Mode)); + modes[num - 1].width = atoi(f1); + modes[num - 1].height = atoi(f2); + if (f3[0]) + modes[num - 1].refresh = atoi(f3); + else + modes[num - 1].refresh = 0; + modes[num - 1].fb_var.sync = 0; + while ((fgets(line, sizeof(line) - 1, f)) && + (!strstr(line, "endmode"))) + { + + if (sscanf(line," geometry %i %i %i %i %i", + &modes[num - 1].fb_var.xres, + &modes[num - 1].fb_var.yres, + &modes[num - 1].fb_var.xres_virtual, + &modes[num - 1].fb_var.yres_virtual, + &modes[num - 1].fb_var.bits_per_pixel) == 5) + geometry = 1; + if (sscanf(line," timings %i %i %i %i %i %i %i", + &modes[num - 1].fb_var.pixclock, + &modes[num - 1].fb_var.left_margin, + &modes[num - 1].fb_var.right_margin, + &modes[num - 1].fb_var.upper_margin, + &modes[num - 1].fb_var.lower_margin, + &modes[num - 1].fb_var.hsync_len, + &modes[num - 1].fb_var.vsync_len) == 7) + timings = 1; + if ((sscanf(line, " hsync %15s", value) == 1) && + (!strcmp(value,"high"))) + modes[num - 1].fb_var.sync |= FB_SYNC_HOR_HIGH_ACT; + if ((sscanf(line, " vsync %15s", value) == 1) && + (!strcmp(value,"high"))) + modes[num - 1].fb_var.sync |= FB_SYNC_VERT_HIGH_ACT; + if ((sscanf(line, " csync %15s", value) == 1) && + (!strcmp(value,"high"))) + modes[num - 1].fb_var.sync |= FB_SYNC_COMP_HIGH_ACT; + if ((sscanf(line, " extsync %15s", value) == 1) && + (!strcmp(value,"true"))) + modes[num - 1].fb_var.sync |= FB_SYNC_EXT; + if ((sscanf(line, " laced %15s", value) == 1) && + (!strcmp(value,"true"))) + modes[num - 1].fb_var.vmode |= FB_VMODE_INTERLACED; + if ((sscanf(line, " double %15s",value) == 1) && + (!strcmp(value,"true"))) + modes[num - 1].fb_var.vmode |= FB_VMODE_DOUBLE; + } + if ((!geometry) || (!timings)) + { + num--; + if (num == 0) + { + free(modes); + modes = NULL; + } + } + else + { + modes[num - 1].fb_var.xoffset = 0; + modes[num - 1].fb_var.yoffset = 0; + } + } + + } + } + fclose(f); + *num_return = num; + return modes; +} + +FB_Mode * +fb_setmode(int width, int height, int depth, int refresh) +{ + FB_Mode *modes, *mode = NULL; + int i, num_modes; + + modes = fb_list_modes(&num_modes); + if (modes) + { + for (i = 0; i < num_modes; i++) + { + if ((modes[i].width == width) && + (modes[i].height == height) && + (!depth || modes[i].fb_var.bits_per_pixel == depth) && + (modes[i].refresh == refresh)) + { + if (depth) modes[i].fb_var.bits_per_pixel = depth; + + if (ioctl(fb, FBIOPUT_VSCREENINFO, &modes[i].fb_var) == -1) + perror("ioctl FBIOPUT_VSCREENINFO"); + + free(modes); + return fb_getmode(); + } + } + free(modes); + } + return mode; +} + +FB_Mode * +fb_changedepth(FB_Mode *cur_mode, int depth) +{ + cur_mode->fb_var.bits_per_pixel = depth; + + if (ioctl(fb, FBIOPUT_VSCREENINFO, &cur_mode->fb_var) == -1) + perror("ioctl FBIOPUT_VSCREENINFO"); + + free(cur_mode); + return fb_getmode(); +} + +FB_Mode * +fb_changeres(FB_Mode *cur_mode, int width, int height, int refresh) +{ + FB_Mode *modes; + int i, num_modes; + + modes = fb_list_modes(&num_modes); + if (modes) + { + for (i = 0; i < num_modes; i++) + { + if ((modes[i].width == width) && + (modes[i].height == height) && + (modes[i].refresh == refresh)) + { + modes[i].fb_var.bits_per_pixel = cur_mode->depth; + + if (ioctl(fb, FBIOPUT_VSCREENINFO, &modes[i].fb_var) == -1) + perror("ioctl FBIOPUT_VSCREENINFO"); + + free(modes); + free(cur_mode); + return fb_getmode(); + } + } + free(modes); + } + return cur_mode; +} + +FB_Mode * +fb_changemode(FB_Mode *cur_mode, int width, int height, int depth, int refresh) +{ + FB_Mode *modes; + int i, num_modes; + + modes = fb_list_modes(&num_modes); + if (modes) + { + for (i = 0; i < num_modes; i++) + { + if ((modes[i].width == width) && + (modes[i].height == height) && + (!depth || modes[i].fb_var.bits_per_pixel == depth) && + (modes[i].refresh == refresh)) + { + if (depth) modes[i].fb_var.bits_per_pixel = depth; + + if (ioctl(fb, FBIOPUT_VSCREENINFO, &modes[i].fb_var) == -1) + perror("ioctl FBIOPUT_VSCREENINFO"); + + free(modes); + free(cur_mode); + return fb_getmode(); + } + } + free(modes); + } + return cur_mode; +} + +FB_Mode * +fb_getmode(void) +{ + FB_Mode *mode = NULL; + int hpix, lines, clockrate; + + mode = malloc(sizeof(FB_Mode)); + /* look what we have now ... */ + + if (ioctl(fb, FBIOGET_VSCREENINFO, &mode->fb_var) == -1) + { + perror("ioctl FBIOGET_VSCREENINFO"); + exit(1); + } + + mode->width = mode->fb_var.xres; + mode->height = mode->fb_var.yres; + hpix = + mode->fb_var.left_margin + + mode->fb_var.xres + + mode->fb_var.right_margin + + mode->fb_var.hsync_len; + lines = + mode->fb_var.upper_margin + + mode->fb_var.yres + + mode->fb_var.lower_margin + + mode->fb_var.vsync_len; + if (mode->fb_var.pixclock > 0) + clockrate = 1000000 / mode->fb_var.pixclock; + else + clockrate = 0; + if ((lines > 0) && (hpix > 0)) + mode->refresh = clockrate * 1000000 / (lines * hpix); + switch (mode->fb_var.bits_per_pixel) + { + case 1: + bpp = 1; + depth = 1; + break; + case 4: + bpp = 1; + depth = 4; + break; + case 8: + bpp = 1; + depth = 8; + break; + case 15: + case 16: + if (mode->fb_var.green.length == 6) + depth = 16; + else + depth = 15; + bpp = 2; + break; + case 24: + depth = 24; + bpp = mode->fb_var.bits_per_pixel / 8; + break; + case 32: + depth = 32; + bpp = mode->fb_var.bits_per_pixel / 8; + break; + default: + fprintf(stderr, "Cannot handle framebuffer of depth %i\n", + mode->fb_var.bits_per_pixel); + fb_cleanup(); + free(mode); + return NULL; + } + mode->depth = depth; + mode->bpp = bpp; + if (mode->depth == 8) + fb_init_palette_332(mode); + else + fb_init_palette_linear(mode); + return mode; +} + +static void +fb_setvt(int vtno) +{ + struct vt_stat vts; + char vtname[32]; + + if (vtno < 0) + { + + if ((ioctl(tty,VT_OPENQRY, &vtno) == -1)) + { + perror("ioctl VT_OPENQRY"); + exit(1); + } + if (vtno <= 0 ) + { + perror("ioctl VT_OPENQRY vtno <= 0"); + exit(1); + } + + } + vtno &= 0xff; + sprintf(vtname, "/dev/tty%i", vtno); + chown(vtname, getuid(), getgid()); + if (access(vtname,R_OK | W_OK) == -1) + { + fprintf(stderr,"access %s: %s\n",vtname,strerror(errno)); + exit(1); + } + open(vtname,O_RDWR); + + if (ioctl(tty, VT_GETSTATE, &vts) == -1) + { + perror("ioctl VT_GETSTATE"); + exit(1); + } + + orig_vt_no = vts.v_active; +/* + if (ioctl(tty, VT_ACTIVATE, vtno) == -1) + { + perror("ioctl VT_ACTIVATE"); + exit(1); + } + if (ioctl(tty, VT_WAITACTIVE, vtno) == -1) + { + perror("ioctl VT_WAITACTIVE"); + exit(1); + } +*/ + +} + +void +fb_init(int vt, int device) +{ + char dev[32]; + + tty = 0; +#if 0 + if (vt != 0) fb_setvt(vt); +#endif + sprintf(dev, "/dev/fb/%i", device); + fb = open(dev, O_RDWR); + if ( fb == -1 ) + { + sprintf(dev, "/dev/fb%i", device); + fb = open(dev, O_RDWR); + } + if (fb == -1) + { + fprintf(stderr,"open %s: %s\n", dev, strerror(errno)); + fb_cleanup(); + exit(1); + } + + if (ioctl(fb, FBIOGET_VSCREENINFO, &fb_ovar) == -1) + { + perror("ioctl FBIOGET_VSCREENINFO"); + exit(1); + } + if (ioctl(fb, FBIOGET_FSCREENINFO, &fb_fix) == -1) + { + perror("ioctl FBIOGET_FSCREENINFO"); + exit(1); + } + + if ((fb_ovar.bits_per_pixel == 8) || + (fb_fix.visual == FB_VISUAL_DIRECTCOLOR)) + { + + if (ioctl(fb,FBIOGETCMAP , &ocmap) == -1) + { + perror("ioctl FBIOGETCMAP"); + exit(1); + } + + } +#if 0 + if (isatty(0)) + tty = 0; + else if ((tty = open("/dev/tty",O_RDWR)) == -1) + { + fprintf(stderr,"open %s: %s\n", "/dev/tty", strerror(errno)); + exit(1); + } + if (tty) + { + if (ioctl(tty, KDGETMODE, &kd_mode) == -1) + { + perror("ioctl KDGETMODE"); + exit(1); + } + if (ioctl(tty, VT_GETMODE, &vt_omode) == -1) + { + perror("ioctl VT_GETMODE"); + exit(1); + } + } +#endif +} + +int +fb_postinit(FB_Mode *mode) +{ + + if (ioctl(fb,FBIOGET_FSCREENINFO, &fb_fix) == -1) + { + perror("ioctl FBIOGET_FSCREENINFO"); + fb_cleanup(); + exit(1); + } + + if (fb_fix.type != FB_TYPE_PACKED_PIXELS) + { + fprintf(stderr,"can handle only packed pixel frame buffers\n"); + fb_cleanup(); + exit(1); + } + mode->mem_offset = (unsigned)(fb_fix.smem_start) & (getpagesize()-1); + mode->mem = (unsigned char *)mmap(NULL, fb_fix.smem_len + mode->mem_offset, + PROT_WRITE | PROT_READ, MAP_SHARED, fb, 0); + if (mode->mem == MAP_FAILED) + { + perror("mmap"); + fb_cleanup(); + } + /* move viewport to upper left corner */ + if ((mode->fb_var.xoffset != 0) || (mode->fb_var.yoffset != 0)) + { + mode->fb_var.xoffset = 0; + mode->fb_var.yoffset = 0; + + if (ioctl(fb, FBIOPAN_DISPLAY, &(mode->fb_var)) == -1) + { + perror("ioctl FBIOPAN_DISPLAY"); + fb_cleanup(); + } + } +#if 0 + if (tty) + { + if (ioctl(tty,KDSETMODE, KD_GRAPHICS) == -1) + { + perror("ioctl KDSETMODE"); + fb_cleanup(); + } + } +#endif + mode->fb_fd = fb; + return fb; +} + +static void +fb_cleanup(void) +{ + /* restore console */ + + if (ioctl(fb, FBIOPUT_VSCREENINFO, &fb_ovar) == -1) + perror("ioctl FBIOPUT_VSCREENINFO"); + if (ioctl(fb, FBIOGET_FSCREENINFO, &fb_fix) == -1) + perror("ioctl FBIOGET_FSCREENINFO"); + + if ((fb_ovar.bits_per_pixel == 8) || + (fb_fix.visual == FB_VISUAL_DIRECTCOLOR)) + { + + if (ioctl(fb, FBIOPUTCMAP, &ocmap) == -1) + perror("ioctl FBIOPUTCMAP"); + + } + close(fb); + + + if (tty) + { + if (ioctl(tty, KDSETMODE, kd_mode) == -1) + perror("ioctl KDSETMODE"); + if (ioctl(tty, VT_SETMODE, &vt_omode) == -1) + perror("ioctl VT_SETMODE"); +/* if ((ioctl(tty, VT_ACTIVATE, orig_vt_no) == -1) && (orig_vt_no)) + perror("ioctl VT_ACTIVATE"); +*/ } + + close(tty); +} diff --git a/src/modules/engines/fb/evas_outbuf.c b/src/modules/engines/fb/evas_outbuf.c new file mode 100644 index 0000000..4a85b94 --- /dev/null +++ b/src/modules/engines/fb/evas_outbuf.c @@ -0,0 +1,401 @@ +#include "evas_common.h" +#include "evas_engine.h" +#include +#include + +void +evas_fb_outbuf_fb_init(void) +{ +} + +void +evas_fb_outbuf_fb_free(Outbuf *buf) +{ + /* FIXME: impliment */ + printf("destroying fb info.. not implemented!!!! WARNING. LEAK!\n"); + if (buf->priv.back_buf) + evas_cache_image_drop(&buf->priv.back_buf->cache_entry); + free(buf); +} + +Outbuf * +evas_fb_outbuf_fb_setup_fb(int w, int h, int rot, Outbuf_Depth depth, int vt_no, int dev_no, int refresh) +{ + /* create outbuf struct */ + /* setup window and/or fb */ + /* if (dithered) create backbuf */ + Outbuf *buf; + int fb_fd = -1; + int fb_depth; + + fb_depth = -1; + if (depth == OUTBUF_DEPTH_RGB_16BPP_565_565_DITHERED) fb_depth = 16; + else if (depth == OUTBUF_DEPTH_RGB_16BPP_555_555_DITHERED) fb_depth = 15; + else if (depth == OUTBUF_DEPTH_RGB_16BPP_565_444_DITHERED) fb_depth = 16; + else if (depth == OUTBUF_DEPTH_RGB_16BPP_444_444_DITHERED) fb_depth = 12; + else if (depth == OUTBUF_DEPTH_RGB_32BPP_888_8888) fb_depth = 32; + else if (depth == OUTBUF_DEPTH_INHERIT) fb_depth = 0; + buf = calloc(1, sizeof(Outbuf)); + if (!buf) + return NULL; + + fb_init(vt_no, dev_no); + if (rot == 0 || rot == 180) + buf->priv.fb.fb = fb_setmode(w, h, fb_depth, refresh); + else if (rot == 90 || rot == 270) + buf->priv.fb.fb = fb_setmode(h, w, fb_depth, refresh); + if (!buf->priv.fb.fb) buf->priv.fb.fb = fb_getmode(); + if (!buf->priv.fb.fb) + { + free(buf); + return NULL; + } + fb_fd = fb_postinit(buf->priv.fb.fb); + + if (rot == 0 || rot == 180) + { + buf->w = buf->priv.fb.fb->width; + buf->h = buf->priv.fb.fb->height; + } + else if (rot == 90 || rot == 270) + { + buf->w = buf->priv.fb.fb->height; + buf->h = buf->priv.fb.fb->width; + } + + buf->depth = depth; + buf->rot = rot; + + { + Gfx_Func_Convert conv_func; + int i; + + buf->priv.mask.r = 0; + for (i = 0; i < (int)buf->priv.fb.fb->fb_var.red.length; i++) + buf->priv.mask.r |= (1 << (buf->priv.fb.fb->fb_var.red.offset + i)); + buf->priv.mask.g = 0; + for (i = 0; i < (int)buf->priv.fb.fb->fb_var.green.length; i++) + buf->priv.mask.g |= (1 << (buf->priv.fb.fb->fb_var.green.offset + i)); + buf->priv.mask.b = 0; + for (i = 0; i < (int)buf->priv.fb.fb->fb_var.blue.length; i++) + buf->priv.mask.b |= (1 << (buf->priv.fb.fb->fb_var.blue.offset + i)); + + conv_func = NULL; + if (buf->rot == 0 || buf->rot == 180) + conv_func = evas_common_convert_func_get(0, buf->w, buf->h, + buf->priv.fb.fb->fb_var.bits_per_pixel, + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + PAL_MODE_NONE, + buf->rot); + else if (buf->rot == 90 || buf->rot == 270) + conv_func = evas_common_convert_func_get(0, buf->h, buf->w, + buf->priv.fb.fb->fb_var.bits_per_pixel, + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + PAL_MODE_NONE, + buf->rot); + if (!conv_func) + { + free(buf); + return NULL; + } + } +// if (buf->priv.fb.fb->fb_var.bits_per_pixel < 24) +// buf->priv.back_buf = evas_common_image_create(buf->w, buf->h); + + return buf; +} + +void +evas_fb_outbuf_fb_blit(Outbuf *buf, int src_x, int src_y, int w, int h, int dst_x, int dst_y) +{ + if (buf->priv.back_buf) + { + evas_common_blit_rectangle(buf->priv.back_buf, buf->priv.back_buf, + src_x, src_y, w, h, dst_x, dst_y); + evas_fb_outbuf_fb_update(buf, dst_x, dst_y, w, h); + } + else + { + if (buf->priv.fb.fb) + { + /* FIXME: need to impliment an fb call for "copy area" */ + } + } +} + +void +evas_fb_outbuf_fb_update(Outbuf *buf, int x, int y, int w, int h) +{ + if (!(buf->priv.back_buf)) return; + if (buf->priv.fb.fb) + { + Gfx_Func_Convert conv_func; + DATA8 *data; + + data = NULL; + conv_func = NULL; + if (buf->rot == 0) + { + data = (DATA8 *)buf->priv.fb.fb->mem + buf->priv.fb.fb->mem_offset + + buf->priv.fb.fb->bpp * + (x + (y * buf->priv.fb.fb->width)); + conv_func = evas_common_convert_func_get(data, w, h, buf->priv.fb.fb->fb_var.bits_per_pixel, + buf->priv.mask.r, buf->priv.mask.g, + buf->priv.mask.b, PAL_MODE_NONE, + buf->rot); + } + else if (buf->rot == 180) + { + data = (DATA8 *)buf->priv.fb.fb->mem + buf->priv.fb.fb->mem_offset + + buf->priv.fb.fb->bpp * + (buf->w - x - w + ((buf->h - y - h) * buf->priv.fb.fb->width)); + conv_func = evas_common_convert_func_get(data, w, h, buf->priv.fb.fb->fb_var.bits_per_pixel, + buf->priv.mask.r, buf->priv.mask.g, + buf->priv.mask.b, PAL_MODE_NONE, + buf->rot); + } + else if (buf->rot == 270) + { + data = (DATA8 *)buf->priv.fb.fb->mem + buf->priv.fb.fb->mem_offset + + buf->priv.fb.fb->bpp * + (buf->h - y - h + (x * buf->priv.fb.fb->width)); + conv_func = evas_common_convert_func_get(data, h, w, buf->priv.fb.fb->fb_var.bits_per_pixel, + buf->priv.mask.r, buf->priv.mask.g, + buf->priv.mask.b, PAL_MODE_NONE, + buf->rot); + } + else if (buf->rot == 90) + { + data = (DATA8 *)buf->priv.fb.fb->mem + buf->priv.fb.fb->mem_offset + + buf->priv.fb.fb->bpp * + (y + ((buf->w - x - w) * buf->priv.fb.fb->width)); + conv_func = evas_common_convert_func_get(data, h, w, buf->priv.fb.fb->fb_var.bits_per_pixel, + buf->priv.mask.r, buf->priv.mask.g, + buf->priv.mask.b, PAL_MODE_NONE, + buf->rot); + } + if (conv_func) + { + DATA32 *src_data; + + src_data = buf->priv.back_buf->image.data + (y * buf->w) + x; + if (buf->rot == 0 || buf->rot == 180) + { + conv_func(src_data, data, + buf->w - w, + buf->priv.fb.fb->width - w, + w, h, + x, y, NULL); + } + else if (buf->rot == 90 || buf->rot == 270) + { + conv_func(src_data, data, + buf->w - w, + buf->priv.fb.fb->width - h, + h, w, + x, y, NULL); + } + } + } +} + +RGBA_Image * +evas_fb_outbuf_fb_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) +{ + if (buf->priv.back_buf) + { + *cx = x; *cy = y; *cw = w; *ch = h; + return buf->priv.back_buf; + } + else + { + RGBA_Image *im; + + *cx = 0; *cy = 0; *cw = w; *ch = h; + im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); + im->cache_entry.flags.alpha = 1; + im = (RGBA_Image *) evas_cache_image_size_set(&im->cache_entry, w, h); + + /* handle framebuffers with alpha channel */ + if (buf->priv.fb.fb->fb_var.transp.length > 0) { + memset(im->image.data, 0, w * h * sizeof(DATA32)); + } + return im; + } + return NULL; +} + +void +evas_fb_outbuf_fb_free_region_for_update(Outbuf *buf, RGBA_Image *update) +{ + if (update != buf->priv.back_buf) evas_cache_image_drop(&update->cache_entry); +} + +void +evas_fb_outbuf_fb_push_updated_region(Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h) +{ + if (!buf->priv.fb.fb) return; + if (buf->priv.back_buf) + { + if (update != buf->priv.back_buf) + evas_common_blit_rectangle(update, buf->priv.back_buf, + 0, 0, w, h, x, y); + evas_fb_outbuf_fb_update(buf, x, y, w, h); + } + else + { + Gfx_Func_Convert conv_func; + DATA8 *data; + + data = NULL; + conv_func = NULL; + if (buf->rot == 0) + { + data = (DATA8 *)buf->priv.fb.fb->mem + + buf->priv.fb.fb->mem_offset + + buf->priv.fb.fb->bpp * + (x + (y * buf->priv.fb.fb->width)); + conv_func = evas_common_convert_func_get(data, w, h, + buf->priv.fb.fb->fb_var.bits_per_pixel, + buf->priv.mask.r, buf->priv.mask.g, + buf->priv.mask.b, PAL_MODE_NONE, + buf->rot); + } + else if (buf->rot == 180) + { + data = (DATA8 *)buf->priv.fb.fb->mem + + buf->priv.fb.fb->mem_offset + + buf->priv.fb.fb->bpp * + (buf->w - x - w + ((buf->h - y - h) * buf->priv.fb.fb->width)); + conv_func = evas_common_convert_func_get(data, w, h, + buf->priv.fb.fb->fb_var.bits_per_pixel, + buf->priv.mask.r, buf->priv.mask.g, + buf->priv.mask.b, PAL_MODE_NONE, + buf->rot); + } + else if (buf->rot == 270) + { + data = (DATA8 *)buf->priv.fb.fb->mem + + buf->priv.fb.fb->mem_offset + + buf->priv.fb.fb->bpp * + (buf->h - y - h + (x * buf->priv.fb.fb->width)); + conv_func = evas_common_convert_func_get(data, h, w, + buf->priv.fb.fb->fb_var.bits_per_pixel, + buf->priv.mask.r, buf->priv.mask.g, + buf->priv.mask.b, PAL_MODE_NONE, + buf->rot); + } + else if (buf->rot == 90) + { + data = (DATA8 *)buf->priv.fb.fb->mem + + buf->priv.fb.fb->mem_offset + + buf->priv.fb.fb->bpp * + (y + ((buf->w - x - w) * buf->priv.fb.fb->width)); + conv_func = evas_common_convert_func_get(data, h, w, + buf->priv.fb.fb->fb_var.bits_per_pixel, + buf->priv.mask.r, buf->priv.mask.g, + buf->priv.mask.b, PAL_MODE_NONE, + buf->rot); + } + if (conv_func) + { + DATA32 *src_data; + + src_data = update->image.data; + if (buf->rot == 0 || buf->rot == 180) + { + conv_func(src_data, data, + 0, + buf->priv.fb.fb->width - w, + w, h, + x, y, NULL); + } + else if (buf->rot == 90 || buf->rot == 270) + { + conv_func(src_data, data, + 0, + buf->priv.fb.fb->width - h, + h, w, + x, y, NULL); + } + } + } +} + +void +evas_fb_outbuf_fb_reconfigure(Outbuf *buf, int w, int h, int rot, Outbuf_Depth depth) +{ + if ((w == buf->w) && (h == buf->h) && + (rot == buf->rot) && (depth == buf->depth)) + return; + if (buf->priv.back_buf) + { + evas_cache_image_drop(&buf->priv.back_buf->cache_entry); + buf->priv.back_buf = NULL; + } + if (buf->priv.fb.fb) + { + /* FIXME: impliment this */ + } + /* if backbuf delet it */ + /* resize window or reset fb mode */ + /* if (dithered) create new backbuf */ +} + +int +evas_fb_outbuf_fb_get_width(Outbuf *buf) +{ + return buf->w; +} + +int +evas_fb_outbuf_fb_get_height(Outbuf *buf) +{ + return buf->h; +} + +Outbuf_Depth +evas_fb_outbuf_fb_get_depth(Outbuf *buf) +{ + return buf->depth; +} + +int +evas_fb_outbuf_fb_get_rot(Outbuf *buf) +{ + return buf->rot; +} + +int +evas_fb_outbuf_fb_get_have_backbuf(Outbuf *buf) +{ + if (buf->priv.back_buf) return 1; + return 0; +} + +void +evas_fb_outbuf_fb_set_have_backbuf(Outbuf *buf, int have_backbuf) +{ + if (buf->priv.back_buf) + { + if (have_backbuf) return; + evas_cache_image_drop(&buf->priv.back_buf->cache_entry); + buf->priv.back_buf = NULL; + } + else + { + if (!have_backbuf) return; + if (buf->priv.fb.fb) + { + if (buf->priv.fb.fb->fb_var.bits_per_pixel < 24) + { + buf->priv.back_buf = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); + buf->priv.back_buf = (RGBA_Image *) evas_cache_image_size_set(&buf->priv.back_buf->cache_entry, buf->w, buf->h); + } + } + } +} diff --git a/src/modules/engines/gl_common/.cvsignore b/src/modules/engines/gl_common/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/gl_common/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/gl_common/Makefile.am b/src/modules/engines/gl_common/Makefile.am new file mode 100644 index 0000000..172403f --- /dev/null +++ b/src/modules/engines/gl_common/Makefile.am @@ -0,0 +1,42 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +@FREETYPE_CFLAGS@ \ +@gl_cflags@ + +if BUILD_ENGINE_GL_COMMON + +noinst_LTLIBRARIES = libevas_engine_gl_common.la +libevas_engine_gl_common_la_SOURCES = \ +evas_gl_private.h \ +evas_gl_common.h \ +evas_gl_context.c \ +evas_gl_font.c \ +evas_gl_gradient.c \ +evas_gl_image.c \ +evas_gl_line.c \ +evas_gl_misc.c \ +evas_gl_polygon.c \ +evas_gl_rectangle.c \ +evas_gl_texture.c + +libevas_engine_gl_common_la_LIBADD = @gl_libs@ $(top_builddir)/src/lib/libevas.la +libevas_engine_gl_common_la_DEPENDENCIES = $(top_builddir)/config.h + +endif + +EXTRA_DIST = \ +evas_gl_private.h \ +evas_gl_context.c \ +evas_gl_font.c \ +evas_gl_gradient.c \ +evas_gl_image.c \ +evas_gl_line.c \ +evas_gl_misc.c \ +evas_gl_polygon.c \ +evas_gl_rectangle.c \ +evas_gl_texture.c diff --git a/src/modules/engines/gl_common/evas_gl_common.h b/src/modules/engines/gl_common/evas_gl_common.h new file mode 100644 index 0000000..0af1d35 --- /dev/null +++ b/src/modules/engines/gl_common/evas_gl_common.h @@ -0,0 +1,253 @@ +#ifndef EVAS_GL_COMMON_H +#define EVAS_GL_COMMON_H + +/* FIXME: need to handle memory errors */ +/* FIXME: need to handle list errors */ +/* FIXME: need to handle gl errors */ +/* FIXME: need to free textures is texture ream runs out */ +/* FIXME: need to break image textures into meshes if too big */ +/* FIXME: need to page mesh textures if texture alloc fails */ + +#include "evas_common.h" +#include "evas_private.h" +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include + +#ifdef BUILD_ENGINE_GL_GLEW +#include +#endif /* BUILD_ENGINE_GL_GLEW */ + +#include +#include + +typedef struct _Evas_GL_Context Evas_GL_Context; +typedef struct _Evas_GL_Texture Evas_GL_Texture; +typedef struct _Evas_GL_Image Evas_GL_Image; +typedef struct _Evas_GL_Polygon Evas_GL_Polygon; +typedef struct _Evas_GL_Polygon_Point Evas_GL_Polygon_Point; +typedef struct _Evas_GL_Gradient Evas_GL_Gradient; +typedef struct _Evas_GL_Font_Texture Evas_GL_Font_Texture; +typedef struct _Evas_GL_Font_Texture_Pool Evas_GL_Font_Texture_Pool; +typedef struct _Evas_GL_Font_Texture_Pool_Allocation Evas_GL_Font_Texture_Pool_Allocation; + +struct _Evas_GL_Context +{ + int w, h; + + unsigned char dither : 1; + unsigned char blend : 1; + unsigned char blend_alpha : 1; + unsigned char r, g, b, a; + + struct { + unsigned char size : 1; + unsigned char dither : 1; + unsigned char blend : 1; + unsigned char color : 1; + unsigned char texture : 1; + unsigned char clip : 1; + unsigned char buf : 1; + unsigned char other : 1; + } change; + + struct { + unsigned char active : 1; + int x, y, w, h; + } clip; + + struct { + int checked : 1; + int sgis_generate_mipmap : 1; + int nv_texture_rectangle : 1; + int arb_texture_non_power_of_two : 1; + int arb_program : 1; + } ext; + + GLenum read_buf; + GLenum write_buf; + + Evas_GL_Texture *texture; + GLuint font_texture; + unsigned char font_texture_rectangle : 1; + unsigned char texture_program : 1; + + int max_texture_depth; + int max_texture_size; + + int references; + + Evas_List *images; + Evas_List *tex_pool; + + RGBA_Draw_Context *dc; + + struct { + GLhandleARB prog, fshad; + } yuv422p; +}; + +struct _Evas_GL_Texture +{ + Evas_GL_Context *gc; + int w, h; + int tw, th; + int uw, uh; + + GLuint texture, texture2, texture3; + + unsigned char smooth : 1; + unsigned char changed : 1; + unsigned char have_mipmaps : 1; + unsigned char rectangle : 1; + unsigned char not_power_of_two : 1; + unsigned char opt : 1; + + int references; + GLhandleARB prog; +}; + +struct _Evas_GL_Image +{ + Evas_GL_Context *gc; + RGBA_Image *im; + Evas_GL_Texture *tex; + RGBA_Image_Loadopts load_opts; + int putcount; + int references; + struct { + int space; + void *data; + unsigned char no_free : 1; + } cs; + unsigned char dirty : 1; + unsigned char cached : 1; +}; + +struct _Evas_GL_Polygon +{ + Evas_List *points; + GLuint dl; + Evas_Bool changed : 1; +}; + +struct _Evas_GL_Polygon_Point +{ + int x, y; +}; + +struct _Evas_GL_Gradient +{ + RGBA_Gradient *grad; + Evas_GL_Texture *tex; + int tw, th; + unsigned char changed : 1; +}; + +struct _Evas_GL_Font_Texture +{ + Evas_GL_Context *gc; + int x, y, w, h; + double tx1, ty1, tx2, ty2; + int aw, ah; + GLuint texture; + Evas_GL_Font_Texture_Pool *pool; + Evas_GL_Font_Texture_Pool_Allocation *alloc; +}; + +struct _Evas_GL_Font_Texture_Pool +{ + Evas_GL_Context *gc; + int w, h; + GLuint texture; + int references; + unsigned char rectangle : 1; + Evas_List *allocations; +}; + +struct _Evas_GL_Font_Texture_Pool_Allocation +{ + Evas_GL_Font_Texture_Pool *pool; + int x, y, w, h; +}; + +Evas_GL_Context *evas_gl_common_context_new(void); +void evas_gl_common_context_free(Evas_GL_Context *gc); +void evas_gl_common_context_use(Evas_GL_Context *gc); +void evas_gl_common_context_resize(Evas_GL_Context *gc, int w, int h); +void evas_gl_common_context_color_set(Evas_GL_Context *gc, int r, int g, int b, int a); +void evas_gl_common_context_blend_set(Evas_GL_Context *gc, int blend); +void evas_gl_common_context_dither_set(Evas_GL_Context *gc, int dither); +void evas_gl_common_context_texture_set(Evas_GL_Context *gc, Evas_GL_Texture *tex, int smooth, int w, int h); +void evas_gl_common_context_font_texture_set(Evas_GL_Context *gc, Evas_GL_Font_Texture *ft); +void evas_gl_common_context_clip_set(Evas_GL_Context *gc, int on, int x, int y, int w, int h); +void evas_gl_common_context_read_buf_set(Evas_GL_Context *gc, GLenum buf); +void evas_gl_common_context_write_buf_set(Evas_GL_Context *gc, GLenum buf); + +Evas_GL_Texture *evas_gl_common_texture_new(Evas_GL_Context *gc, RGBA_Image *im, int smooth); +void evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im, int smooth); +void evas_gl_common_texture_free(Evas_GL_Texture *tex); +void evas_gl_common_texture_mipmaps_build(Evas_GL_Texture *tex, RGBA_Image *im, int smooth); +Evas_GL_Texture *evas_gl_common_ycbcr601pl_texture_new(Evas_GL_Context *gc, unsigned char **rows, int w, int h, int smooth); +void evas_gl_common_ycbcr601pl_texture_update(Evas_GL_Texture *tex, unsigned char **rows, int w, int h, int smooth); + +Evas_GL_Image *evas_gl_common_image_load(Evas_GL_Context *gc, const char *file, const char *key, Evas_Image_Load_Opts *lo); +Evas_GL_Image *evas_gl_common_image_new_from_data(Evas_GL_Context *gc, int w, int h, DATA32 *data, int alpha, int cspace); +Evas_GL_Image *evas_gl_common_image_new_from_copied_data(Evas_GL_Context *gc, int w, int h, DATA32 *data, int alpha, int cspace); +Evas_GL_Image *evas_gl_common_image_new(Evas_GL_Context *gc, int w, int h, int alpha, int cspace); +void evas_gl_common_image_free(Evas_GL_Image *im); +void evas_gl_common_image_dirty(Evas_GL_Image *im); + +Evas_GL_Polygon *evas_gl_common_poly_point_add(Evas_GL_Polygon *poly, int x, int y); +Evas_GL_Polygon *evas_gl_common_poly_points_clear(Evas_GL_Polygon *poly); + +Evas_GL_Gradient *evas_gl_common_gradient_new(void); +void evas_gl_common_gradient_free(Evas_GL_Gradient *gr); +void evas_gl_common_gradient_color_stop_add(Evas_GL_Gradient *gr, int r, int g, int b, int a, int delta); +void evas_gl_common_gradient_alpha_stop_add(Evas_GL_Gradient *gr, int a, int delta); +void evas_gl_common_gradient_color_data_set(Evas_GL_Gradient *gr, void *data, int len, int has_alpha); +void evas_gl_common_gradient_alpha_data_set(Evas_GL_Gradient *gr, void *alpha_data, int len); +void evas_gl_common_gradient_clear(Evas_GL_Gradient *gr); +void evas_gl_common_gradient_fill_set(Evas_GL_Gradient *gr, int x, int y, int w, int h); +void evas_gl_common_gradient_fill_angle_set(Evas_GL_Gradient *gr, double angle); +void evas_gl_common_gradient_fill_spread_set(Evas_GL_Gradient *gr, int spread); +void evas_gl_common_gradient_map_angle_set(Evas_GL_Gradient *gr, double angle); +void evas_gl_common_gradient_map_offset_set(Evas_GL_Gradient *gr, float offset); +void evas_gl_common_gradient_map_direction_set(Evas_GL_Gradient *gr, int direction); +void evas_gl_common_gradient_type_set(Evas_GL_Gradient *gr, char *name, char *params); +int evas_gl_common_gradient_is_opaque(Evas_GL_Context *gc, Evas_GL_Gradient *gr, int x, int y, int w, int h); +int evas_gl_common_gradient_is_visible(Evas_GL_Context *gc, Evas_GL_Gradient *gr, int x, int y, int w, int h); +void evas_gl_common_gradient_render_pre(Evas_GL_Context *gc, Evas_GL_Gradient *gr); +void evas_gl_common_gradient_render_post(Evas_GL_Gradient *gr); +void evas_gl_common_gradient_draw(Evas_GL_Context *gc, Evas_GL_Gradient *gr, + int x, int y, int w, int h); + +void evas_gl_common_swap_rect(Evas_GL_Context *gc, int x, int y, int w, int h); + +void evas_gl_common_rect_draw(Evas_GL_Context *gc, int x, int y, int w, int h); +void evas_gl_common_image_draw(Evas_GL_Context *gc, Evas_GL_Image *im, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, int smooth); +void evas_gl_common_line_draw(Evas_GL_Context *gc, int x1, int y1, int x2, int y2); +void evas_gl_common_poly_draw(Evas_GL_Context *gc, Evas_GL_Polygon *poly); + +Evas_GL_Font_Texture *evas_gl_font_texture_new(Evas_GL_Context *gc, RGBA_Font_Glyph *fg); +void evas_gl_font_texture_free(Evas_GL_Font_Texture *ft); +void evas_gl_font_texture_draw(Evas_GL_Context *gc, void *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y); + +/* FIXME: + * + * for images: + * speculative cache for textures too + * texture mesh support + * + * for text/fonts: + * need to not render to a texture each time.... this is sloooooow. + * but its a "bootstrap" for just right now. + */ + +#endif diff --git a/src/modules/engines/gl_common/evas_gl_context.c b/src/modules/engines/gl_common/evas_gl_context.c new file mode 100644 index 0000000..cca8fd8 --- /dev/null +++ b/src/modules/engines/gl_common/evas_gl_context.c @@ -0,0 +1,536 @@ +#include "evas_gl_private.h" + +static void _evas_gl_common_viewport_set(Evas_GL_Context *gc); +static void _evas_gl_common_dither_set(Evas_GL_Context *gc); +static void _evas_gl_common_blend_set(Evas_GL_Context *gc); +static void _evas_gl_common_color_set(Evas_GL_Context *gc); +static void _evas_gl_common_texture_set(Evas_GL_Context *gc); +static void _evas_gl_common_clip_set(Evas_GL_Context *gc); +static void _evas_gl_common_buf_set(Evas_GL_Context *gc); +static void _evas_gl_common_other_set(Evas_GL_Context *gc); + +static Evas_GL_Context *_evas_gl_common_context = NULL; + +Evas_GL_Context * +evas_gl_common_context_new(void) +{ + Evas_GL_Context *gc; + + if (_evas_gl_common_context) + { + _evas_gl_common_context->references++; + return _evas_gl_common_context; + } + gc = calloc(1, sizeof(Evas_GL_Context)); + if (!gc) return NULL; + gc->max_texture_depth = 32; + gc->max_texture_size = 2048; + gc->read_buf = GL_BACK; + gc->write_buf = GL_BACK; + gc->dither = 1; + gc->blend = 0; + gc->references = 1; + + gc->change.size = 1; + gc->change.dither = 1; + gc->change.blend = 1; + gc->change.color = 1; + gc->change.texture = 1; + gc->change.clip = 1; + gc->change.buf = 1; + gc->change.other = 1; + + return gc; +} + +void +evas_gl_common_context_free(Evas_GL_Context *gc) +{ + gc->references--; + if (gc->references > 0) return; + if (gc->yuv422p.fshad) + { + glDeleteObjectARB(gc->yuv422p.fshad); + } + if (gc->yuv422p.prog) + { + glDeleteObjectARB(gc->yuv422p.prog); + } + + if (gc == _evas_gl_common_context) _evas_gl_common_context = NULL; + free(gc); +} + +void +evas_gl_common_context_use(Evas_GL_Context *gc) +{ + if (_evas_gl_common_context == gc) return; + if (!gc->ext.checked) + { + const GLubyte *ext; + + ext = glGetString(GL_EXTENSIONS); + if (ext) + { +// if (strstr(ext, "GL_SGIS_generate_mipmap")) gc->ext.sgis_generate_mipmap = 1; +// if (strstr(ext, "GL_NV_texture_rectangle")) gc->ext.nv_texture_rectangle = 1; +// if (strstr(ext, "GL_EXT_texture_rectangle")) gc->ext.nv_texture_rectangle = 1; + if (strstr(ext, "GL_ARB_texture_non_power_of_two")) gc->ext.arb_texture_non_power_of_two = 1; + if (strstr(ext, "GL_ARB_shader_objects") && strstr(ext, "GL_ARB_vertex_shader") + && strstr(ext, "GL_ARB_fragment_shader") && strstr(ext, "GL_ARB_shading_language")) + gc->ext.arb_program = 1; +// printf("GL EXT supported: GL_SGIS_generate_mipmap = %x\n", gc->ext.sgis_generate_mipmap); +// printf("GL EXT supported: GL_NV_texture_rectangle = %x\n", gc->ext.nv_texture_rectangle); +// printf("GL EXT supported: GL_ARB_texture_non_power_of_two = %x\n", gc->ext.arb_texture_non_power_of_two); +// this causes at least nvidia's drivers to go into pathological pain when +// changing textures a lot (doing video). so we wont do anything with this +// for now, but it does work. +// gc->ext.arb_texture_non_power_of_two = 0; printf("DISABLE GL_ARB_texture_non_power_of_two\n"); +// gc->ext.nv_texture_rectangle = 0; printf("DISABLE GL_NV_texture_rectangle\n"); + } + else + { +// printf("GL EXT supported: No extensions!!!!!\n"); + } + + if (gc->ext.arb_program) + { + gc->yuv422p.prog = glCreateProgramObjectARB(); + // on an nv 6600gt this is fast - but on a 5500fx its DEAD SLOW!!!!! + // if (!gc->ext.arb_texture_non_power_of_two) return NULL; + /* BEGIN LEAK */ + gc->yuv422p.fshad = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); + { + const char *code = + "uniform sampler2D ytex, utex, vtex;\n" + "void main(void) {\n" + " float r, g, b, y, u, v;\n" + " y = texture2D(ytex, gl_TexCoord[0].st).r;\n" + " u = texture2D(utex, gl_TexCoord[0].st).r;\n" + " v = texture2D(vtex, gl_TexCoord[0].st).r;\n" + " y = (y - 0.0625) * 1.164;\n" + " u = u - 0.5;\n" + " v = v - 0.5;\n" + " r = y + (1.402 * v);\n" + " g = y - (0.34414 * u) - (0.71414 * v);\n" + " b = y + (1.772 * u);\n" + " gl_FragColor = vec4(r * gl_Color.r * gl_Color.a, g * gl_Color.g * gl_Color.a, b * gl_Color.b * gl_Color.a, gl_Color.a);\n" + "}\n"; + glShaderSourceARB(gc->yuv422p.fshad, 1, &code, NULL); + } + glCompileShaderARB(gc->yuv422p.fshad); + glAttachObjectARB(gc->yuv422p.prog, gc->yuv422p.fshad); + /* END LEAK - something in the above leaks... beats me what. */ + glLinkProgramARB(gc->yuv422p.prog); + + glUseProgramObjectARB(gc->yuv422p.prog); + glUniform1iARB(glGetUniformLocationARB(gc->yuv422p.prog, "ytex"), 0); + glUniform1iARB(glGetUniformLocationARB(gc->yuv422p.prog, "utex"), 1); + glUniform1iARB(glGetUniformLocationARB(gc->yuv422p.prog, "vtex"), 2); + glUseProgramObjectARB(0); + } + + gc->ext.checked = 1; + } + _evas_gl_common_context = gc; + _evas_gl_common_viewport_set(gc); + _evas_gl_common_dither_set(gc); + _evas_gl_common_blend_set(gc); + _evas_gl_common_color_set(gc); + _evas_gl_common_texture_set(gc); + _evas_gl_common_texture_set(gc); + _evas_gl_common_clip_set(gc); + _evas_gl_common_buf_set(gc); + _evas_gl_common_other_set(gc); +} + +void +evas_gl_common_context_resize(Evas_GL_Context *gc, int w, int h) +{ + //if ((gc->w == w) && (gc->h == h)) return; + gc->change.size = 1; + gc->w = w; + gc->h = h; + if (_evas_gl_common_context == gc) _evas_gl_common_viewport_set(gc); +} + +void +evas_gl_common_context_color_set(Evas_GL_Context *gc, int r, int g, int b, int a) +{ + if (r < 0) r = 0; + else if (r > 255) r = 255; + if (g < 0) g = 0; + else if (g > 255) g = 255; + if (b < 0) b = 0; + else if (b > 255) b = 255; + if (a < 0) a = 0; + else if (a > 255) a = 255; + if ((gc->r == r) && (gc->g == g) && (gc->b == b) && (gc->a == a)) return; + gc->change.color = 1; + gc->r = r; + gc->g = g; + gc->b = b; + gc->a = a; + if (_evas_gl_common_context == gc) _evas_gl_common_color_set(gc); +} + +void +evas_gl_common_context_blend_set(Evas_GL_Context *gc, int blend) +{ + if (blend == 1) + { + if (gc->blend) return; + gc->change.blend = 1; + gc->blend = 1; + gc->blend_alpha = 0; + } + else if (blend == 2) + { + if (gc->blend_alpha) return; + gc->change.blend = 1; + gc->blend = 0; + gc->blend_alpha = 1; + } + else + { + if ((!gc->blend) && (!gc->blend_alpha)) return; + gc->change.blend = 1; + gc->blend = 0; + gc->blend_alpha = 0; + } + if (_evas_gl_common_context == gc) _evas_gl_common_blend_set(gc); +} + +void +evas_gl_common_context_dither_set(Evas_GL_Context *gc, int dither) +{ + if (((dither) && (gc->dither)) || ((!dither) && (!gc->dither))) return; + gc->change.dither = 1; + gc->dither = dither; + if (_evas_gl_common_context == gc) _evas_gl_common_dither_set(gc); +} + +void +evas_gl_common_context_texture_set(Evas_GL_Context *gc, Evas_GL_Texture *tex, int smooth, int w, int h) +{ + if (gc->font_texture > 0) + { + gc->font_texture = 0; + gc->change.texture = 1; + } + if (gc->texture != tex) + { + if (gc->texture) gc->texture->references--; + gc->texture = tex; + gc->change.texture = 1; + if (tex) tex->references++; + } + if (tex) + { + if (((smooth) && (!tex->smooth)) || + ((!smooth) && (tex->smooth))) + { + tex->smooth = smooth; + tex->changed = 1; + } + tex->uw = w; + tex->uh = h; + } + if (_evas_gl_common_context == gc) _evas_gl_common_texture_set(gc); +} + +void +evas_gl_common_context_font_texture_set(Evas_GL_Context *gc, Evas_GL_Font_Texture *ft) +{ + if (gc->texture) + { + if (gc->texture) gc->texture->references--; + gc->texture = NULL; + gc->change.texture = 1; + } + if (gc->font_texture != ft->texture) + { + gc->font_texture = ft->texture; + gc->font_texture_rectangle = ft->pool->rectangle; + gc->change.texture = 1; + } + if (!gc->change.texture) return; + if (_evas_gl_common_context == gc) _evas_gl_common_texture_set(gc); +} + +void +evas_gl_common_context_clip_set(Evas_GL_Context *gc, int on, int x, int y, int w, int h) +{ + if (x < 0) + { + w += x; + x = 0; + } + if (y < 0) + { + h += y; + y = 0; + } + if (w < 0) w = 0; + if (h < 0) h = 0; + if (((!on) && (!gc->clip.active)) || + ((on) && (gc->clip.active) && + (x == gc->clip.x) && (y == gc->clip.y) && + (w == gc->clip.w) && (h == gc->clip.h))) + return; + gc->change.clip = 1; + gc->clip.active = on; + gc->clip.x = x; + gc->clip.y = y; + gc->clip.w = w; + gc->clip.h = h; + if (_evas_gl_common_context == gc) _evas_gl_common_clip_set(gc); +} + +void +evas_gl_common_context_read_buf_set(Evas_GL_Context *gc, GLenum buf) +{ + if (gc->read_buf == buf) return; + gc->change.buf = 1; + gc->read_buf = buf; + if (_evas_gl_common_context == gc) _evas_gl_common_buf_set(gc); +} + +void +evas_gl_common_context_write_buf_set(Evas_GL_Context *gc, GLenum buf) +{ + if (gc->write_buf == buf) return; + gc->change.buf = 1; + gc->write_buf = buf; + if (_evas_gl_common_context == gc) _evas_gl_common_buf_set(gc); +} + +static void +_evas_gl_common_viewport_set(Evas_GL_Context *gc) +{ + if (!gc->change.size) return; + glViewport(0, 0, gc->w, gc->h); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, gc->w, 0, gc->h, -1, 1); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glScalef(1, -1, 1); + glTranslatef(0, - gc->h, 0); + gc->change.size = 0; +} + +static void +_evas_gl_common_dither_set(Evas_GL_Context *gc) +{ + if (!gc->change.dither) return; + if (gc->dither) + glEnable(GL_DITHER); + else + glDisable(GL_DITHER); + gc->change.dither = 0; +} + +static void +_evas_gl_common_blend_set(Evas_GL_Context *gc) +{ + if (!gc->change.blend) return; + if (gc->blend_alpha) + { + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + else if (gc->blend) + { + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + } + else + glDisable(GL_BLEND); + gc->change.blend = 0; +} + +static void +_evas_gl_common_color_set(Evas_GL_Context *gc) +{ + if (!gc->change.color) return; + glColor4d((double)gc->r / 255.0, + (double)gc->g / 255.0, + (double)gc->b / 255.0, + (double)gc->a / 255.0); + gc->change.color = 0; +} + +static void +_evas_gl_common_texture_set(Evas_GL_Context *gc) +{ + if (!gc->change.texture) return; + if (gc->font_texture > 0) + { + glUseProgramObjectARB(0); + if (gc->texture_program) + { + glUseProgramObjectARB(0); + + glActiveTexture(GL_TEXTURE1); + glDisable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE2); + glDisable(GL_TEXTURE_2D); + gc->texture_program = 0; + } + if (gc->font_texture_rectangle) + { + glActiveTexture(GL_TEXTURE0); + glEnable(GL_TEXTURE_2D); + glEnable(GL_TEXTURE_RECTANGLE_NV); + glBindTexture(GL_TEXTURE_RECTANGLE_NV, gc->font_texture); + } + else + { + glActiveTexture(GL_TEXTURE0); + if (gc->ext.nv_texture_rectangle) + glDisable(GL_TEXTURE_RECTANGLE_NV); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, gc->font_texture); + } + } + else if (gc->texture) + { + if (gc->texture->rectangle) + { + glActiveTexture(GL_TEXTURE0); + glEnable(GL_TEXTURE_2D); + glEnable(GL_TEXTURE_RECTANGLE_NV); + glBindTexture(GL_TEXTURE_RECTANGLE_NV, gc->texture->texture); + } + else + { + if (gc->ext.nv_texture_rectangle) glDisable(GL_TEXTURE_RECTANGLE_NV); + if ((gc->texture->prog) && + (gc->texture->texture2) && (gc->texture->texture3)) + { + gc->texture_program = 1; + glActiveTexture(GL_TEXTURE0); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, gc->texture->texture); + + glActiveTexture(GL_TEXTURE1); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, gc->texture->texture2); + + glActiveTexture(GL_TEXTURE2); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, gc->texture->texture3); + glUseProgramObjectARB(gc->texture->prog); + } + else + { + if (gc->texture_program) + { + glUseProgramObjectARB(0); + + glActiveTexture(GL_TEXTURE1); + glDisable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE2); + glDisable(GL_TEXTURE_2D); + gc->texture_program = 0; + } + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, gc->texture->texture); + glEnable(GL_TEXTURE_2D); + } + } + if (gc->texture->rectangle) + { + if (gc->texture->changed) + { + gc->texture->changed = 0; + } + } + else + { + if (gc->texture->changed) + { + if (gc->texture->rectangle) + { + if (gc->texture->smooth) + { + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + else + { + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + } + else + { + if (gc->texture->smooth) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); +// if (gc->texture->have_mipmaps) +// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); +// else + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + } + gc->texture->changed = 0; + } + } + } + else if (gc->font_texture == 0) + { + glDisable(GL_TEXTURE_2D); + if (gc->ext.nv_texture_rectangle) glDisable(GL_TEXTURE_RECTANGLE_NV); + } + gc->change.texture = 0; +} + +static void +_evas_gl_common_clip_set(Evas_GL_Context *gc) +{ + if (!gc->change.clip) return; + /* might be faster using clip planes ??? glClipPlane() */ + if (gc->clip.active) + { + glEnable(GL_SCISSOR_TEST); + glScissor(gc->clip.x, + gc->h - gc->clip.y - gc->clip.h, + gc->clip.w, + gc->clip.h); + } + else + glDisable(GL_SCISSOR_TEST); + gc->change.clip = 0; +} + +static void +_evas_gl_common_buf_set(Evas_GL_Context *gc) +{ + if (!gc->change.buf) return; + glDrawBuffer(gc->write_buf); + glReadBuffer(gc->read_buf); + gc->change.buf = 0; +} + +static void +_evas_gl_common_other_set(Evas_GL_Context *gc) +{ + if (!gc->change.other) return; + glShadeModel(GL_FLAT); + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); +// glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + glDisable(GL_LINE_SMOOTH); + glDisable(GL_CULL_FACE); + glDepthMask(GL_FALSE); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + gc->change.other = 0; +} diff --git a/src/modules/engines/gl_common/evas_gl_font.c b/src/modules/engines/gl_common/evas_gl_font.c new file mode 100644 index 0000000..b1bc82b --- /dev/null +++ b/src/modules/engines/gl_common/evas_gl_font.c @@ -0,0 +1,468 @@ +#include "evas_gl_private.h" + +static Evas_GL_Font_Texture_Pool_Allocation *_evas_gl_font_texture_pool_request(Evas_GL_Context *gc, int w, int h); +static void _evas_gl_font_texture_pool_relinquish(Evas_GL_Font_Texture_Pool_Allocation *fa); +static int _evas_gl_font_texture_pool_rect_find(Evas_GL_Font_Texture_Pool *fp, int w, int h, int *x, int *y); + +Evas_GL_Font_Texture * +evas_gl_font_texture_new(Evas_GL_Context *gc, RGBA_Font_Glyph *fg) +{ + Evas_GL_Font_Texture *ft; + DATA8 *data; + int w, h, j; + + int nw; + DATA8 *ndata; + + if (fg->ext_dat) return fg->ext_dat; + + w = fg->glyph_out->bitmap.width; + h = fg->glyph_out->bitmap.rows; + + if ((w == 0) || (h == 0)) return NULL; + ft = calloc(1, sizeof(Evas_GL_Font_Texture)); + if (!ft) return NULL; + + data = fg->glyph_out->bitmap.buffer; + j = fg->glyph_out->bitmap.pitch; + if (j < w) j = w; + + ft->gc = gc; + + /* bug bug! glTexSubImage2D need a multiple of 4 pixels horizontally! :( */ + nw = ((w + 3) / 4 ) * 4; + ndata = malloc(nw *h); + if (!ndata) + { + free(ft); + return NULL; + } + if (fg->glyph_out->bitmap.num_grays == 256) + { + int x, y; + DATA8 *p1, *p2; + + for (y = 0; y < h; y++) + { + p1 = data + (j * y); + p2 = ndata + (nw * y); + for (x = 0; x < w; x++) + { + *p2 = *p1; + p1++; + p2++; + } + } + } + else if (fg->glyph_out->bitmap.num_grays == 0) + { + DATA8 *tmpbuf = NULL, *dp, *tp, bits; + int bi, bj, end; + const DATA8 bitrepl[2] = {0x0, 0xff}; + + tmpbuf = malloc(w); + if (tmpbuf) + { + int x, y; + DATA8 *p1, *p2; + + for (y = 0; y < h; y++) + { + p1 = tmpbuf; + p2 = ndata + (nw * y); + tp = tmpbuf; + dp = data + (y * fg->glyph_out->bitmap.pitch); + for (bi = 0; bi < w; bi += 8) + { + bits = *dp; + if ((w - bi) < 8) end = w - bi; + else end = 8; + for (bj = 0; bj < end; bj++) + { + *tp = bitrepl[(bits >> (7 - bj)) & 0x1]; + tp++; + } + dp++; + } + for (x = 0; x < w; x++) + { + *p2 = *p1; + p1++; + p2++; + } + } + free(tmpbuf); + } + } + + /* where in pool texture does this live */ + ft->w = w; + ft->h = h; + ft->aw = nw; + ft->ah = h; + + ft->alloc = _evas_gl_font_texture_pool_request(gc, ft->aw, ft->ah); + if (!ft->alloc) + { + free(ndata); + free(ft); + return NULL; + } + ft->x = ft->alloc->x; + ft->y = ft->alloc->y; + ft->pool = ft->alloc->pool; + ft->texture = ft->pool->texture; + if (ft->pool->rectangle) + { + glEnable(GL_TEXTURE_RECTANGLE_NV); + glBindTexture(GL_TEXTURE_RECTANGLE_NV, ft->texture); + glTexSubImage2D(GL_TEXTURE_RECTANGLE_NV, 0, + ft->x, ft->y, nw, ft->h, + GL_ALPHA, GL_UNSIGNED_BYTE, ndata); + } + else + { + glBindTexture(GL_TEXTURE_2D, ft->texture); + glTexSubImage2D(GL_TEXTURE_2D, 0, + ft->x, ft->y, nw, ft->h, + GL_ALPHA, GL_UNSIGNED_BYTE, ndata); + } + if (ndata) free(ndata); + if (gc->texture) + { + if (gc->texture) gc->texture->references--; + gc->texture = NULL; + } + gc->font_texture = ft->texture; + gc->font_texture_rectangle = ft->pool->rectangle; + gc->change.texture = 1; + if (ft->pool->rectangle) + { + ft->tx1 = ft->x; + ft->ty1 = ft->y; + ft->tx2 = ft->x + ft->w; + ft->ty2 = ft->y + ft->h; + } + else + { + ft->tx1 = (double)(ft->x ) / (double)(ft->pool->w); + ft->ty1 = (double)(ft->y ) / (double)(ft->pool->h); + ft->tx2 = (double)(ft->x + ft->w) / (double)(ft->pool->w); + ft->ty2 = (double)(ft->y + ft->h) / (double)(ft->pool->h); + } + + return ft; +} + +void +evas_gl_font_texture_free(Evas_GL_Font_Texture *ft) +{ + if (!ft) return; + if (ft->gc->font_texture == ft->texture) + { + ft->gc->font_texture = 0; + ft->gc->change.texture = 1; + } + _evas_gl_font_texture_pool_relinquish(ft->alloc); + free(ft); +} + +void +evas_gl_font_texture_draw(Evas_GL_Context *gc, void *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y) +{ + Evas_GL_Font_Texture *ft; + + if (dc != gc->dc) + return; + + /* 35 */ + ft = fg->ext_dat; + if (!ft) return; +// if (surface == 0) + { + int r, g, b, a; + + a = (dc->col.col >> 24) & 0xff; + if (a == 0) return; + r = (dc->col.col >> 16) & 0xff; + g = (dc->col.col >> 8 ) & 0xff; + b = (dc->col.col ) & 0xff; + /* have to un-premul the color - as we are using blend mode 2 (non-premul blend) */ + r = (r * 255) / a; + g = (g * 255) / a; + b = (b * 255) / a; + evas_gl_common_context_color_set(gc, r, g, b, a); + if (dc->clip.use) + evas_gl_common_context_clip_set(gc, 1, + dc->clip.x, dc->clip.y, + dc->clip.w, dc->clip.h); + else + evas_gl_common_context_clip_set(gc, 0, + 0, 0, 0, 0); + evas_gl_common_context_blend_set(gc, 2); + evas_gl_common_context_read_buf_set(gc, GL_BACK); + evas_gl_common_context_write_buf_set(gc, GL_BACK); + } + /* 32 */ + evas_gl_common_context_font_texture_set(gc, ft); + /* 32 */ + glBegin(GL_QUADS); + glTexCoord2d(ft->tx1, ft->ty1); glVertex2i(x , y ); + glTexCoord2d(ft->tx2, ft->ty1); glVertex2i(x + ft->w, y ); + glTexCoord2d(ft->tx2, ft->ty2); glVertex2i(x + ft->w, y + ft->h); + glTexCoord2d(ft->tx1, ft->ty2); glVertex2i(x , y + ft->h); + glEnd(); + /* 28 */ +} + +static Evas_GL_Font_Texture_Pool_Allocation * +_evas_gl_font_texture_pool_request(Evas_GL_Context *gc, int w, int h) +{ + Evas_List *l; + Evas_GL_Font_Texture_Pool_Allocation *fa; + Evas_GL_Font_Texture_Pool *fp; + int minw = 256; + int minh = 256; + int shift; + + for (l = gc->tex_pool; l; l = l->next) + { + int x, y; + + fp = l->data; + if (_evas_gl_font_texture_pool_rect_find(fp, w, h, &x, &y)) + { + fa = calloc(1, sizeof(Evas_GL_Font_Texture_Pool_Allocation)); + if (!fa) return NULL; + fa->pool = fp; + fa->x = x; + fa->y = y; + fa->w = w; + fa->h = h; + fp->allocations = evas_list_prepend(fp->allocations, fa); + if (evas_list_alloc_error()) + { + free(fa); + return NULL; + } + fp->references++; + return fa; + } + } + /* need new font texture pool entry */ + /* minimum size either minw x minh OR the size of glyph up to power 2 */ + if (w > minw) + { + minw = w; + shift = 1; while (minw > shift) shift = shift << 1; minw = shift; + } + if (h > minh) + { + minh = h; + shift = 1; while (minh > shift) shift = shift << 1; minh = shift; + } + + fp = calloc(1, sizeof(Evas_GL_Font_Texture_Pool)); + if (!fp) return NULL; + gc->tex_pool = evas_list_append(gc->tex_pool, fp); + if (evas_list_alloc_error()) + { + free(fp); + return NULL; + } + fp->gc = gc; + fp->w = minw; + fp->h = minh; + if (gc->ext.nv_texture_rectangle) fp->rectangle = 1; + + /* we dont want this mipmapped if sgis_generate_mipmap will mipmap it */ + if (gc->ext.sgis_generate_mipmap) + glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_FALSE); +// glEnable(GL_TEXTURE_2D); + if (fp->rectangle) + { + glEnable(GL_TEXTURE_RECTANGLE_NV); + glGenTextures(1, &(fp->texture)); + /* FIXME check gl error */ + + glBindTexture(GL_TEXTURE_RECTANGLE_NV, fp->texture); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, + GL_ALPHA4, fp->w, fp->h, 0, + GL_ALPHA, GL_UNSIGNED_BYTE, NULL); + /* FIXME check gl error */ + } + else + { + glEnable(GL_TEXTURE_2D); + glGenTextures(1, &(fp->texture)); + /* FIXME check gl error */ + + glBindTexture(GL_TEXTURE_2D, fp->texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, + GL_ALPHA4, fp->w, fp->h, 0, + GL_ALPHA, GL_UNSIGNED_BYTE, NULL); + /* FIXME check gl error */ + } + + /* new allocation entirely */ + fa = calloc(1, sizeof(Evas_GL_Font_Texture_Pool_Allocation)); + if (!fa) + { + gc->tex_pool = evas_list_remove(gc->tex_pool, fp); + glDeleteTextures(1, &(fp->texture)); + free(fp); + return NULL; + } + fa->pool = fp; + fa->x = 0; + fa->y = 0; + fa->w = w; + fa->h = h; + fp->allocations = evas_list_prepend(fp->allocations, fa); + if (evas_list_alloc_error()) + { + printf("alloc prob\n"); + gc->tex_pool = evas_list_remove(gc->tex_pool, fp); + glDeleteTextures(1, &(fp->texture)); + free(fa); + free(fp); + return NULL; + } + fp->references++; + return fa; +} + +static void +_evas_gl_font_texture_pool_relinquish(Evas_GL_Font_Texture_Pool_Allocation *fa) +{ + fa->pool->allocations = evas_list_remove(fa->pool->allocations, fa); + fa->pool->references--; + if (fa->pool->references <= 0) + { + fa->pool->gc->tex_pool = + evas_list_remove(fa->pool->gc->tex_pool, fa->pool); + glDeleteTextures(1, &(fa->pool->texture)); + free(fa->pool); + } + free(fa); +} + +static int +_evas_gl_font_texture_pool_rect_find(Evas_GL_Font_Texture_Pool *fp, + int w, int h, + int *x, int *y) +{ + Evas_List *l; + + if ((w > fp->w) || (h > fp->h)) return 0; + for (l = fp->allocations; l; l = l->next) + { + Evas_GL_Font_Texture_Pool_Allocation *fa; + Evas_List *l2; + int tx, ty, tw, th; + int t1, t2; + int intersects; + + fa = l->data; + t1 = t2 = 1; + if ((fa->x + fa->w + w) > fp->w) t1 = 0; + if ((fa->y + h) > fp->h) t1 = 0; + if ((fa->y + fa->h + h) > fp->h) t2 = 0; + if ((fa->x + w) > fp->w) t2 = 0; + intersects = 0; + if (t1) + { + /* 1. try here: + * +----++--+ + * |AAAA||??| + * |AAAA|+--+ + * |AAAA| + * +----+ + */ + tx = fa->x + fa->w; + ty = fa->y; + tw = w; + th = h; + for (l2 = fp->allocations; l2; l2 = l2->next) + { + Evas_GL_Font_Texture_Pool_Allocation *fa2; + int rx, ry, rw, rh; + + /* dont do the rect we are just using as our offset */ + if (l2 == l) continue; + fa2 = l2->data; + rx = fa2->x; + ry = fa2->y; + rw = fa2->w; + rh = fa2->h; + if (RECTS_INTERSECT(tx, ty, tw, th, rx, ry, rw, rh)) + { + intersects = 1; + break; + } + } + if (!intersects) + { + *x = tx; + *y = ty; + return 1; + } + } + intersects = 0; + if (t2) + { + /* 2. try here: + * +----+ + * |AAAA| + * |AAAA| + * |AAAA| + * +----+ + * +--+ + * |??| + * +--+ + */ + tx = fa->x; + ty = fa->y + fa->h; + tw = w; + th = h; + for (l2 = fp->allocations; l2; l2 = l2->next) + { + Evas_GL_Font_Texture_Pool_Allocation *fa2; + int rx, ry, rw, rh; + + /* dont do the rect we are just using as our offset */ + if (l2 == l) continue; + /* hmmm crash here on mga... l2->data seems broken */ + /* so far it looks like memory corruption, but i can't */ + /* use valgrind to inspect any further due to the dri */ + /* hardware stuff :( */ + fa2 = l2->data; + + rx = fa2->x; + ry = fa2->y; + rw = fa2->w; + rh = fa2->h; + if (RECTS_INTERSECT(tx, ty, tw, th, rx, ry, rw, rh)) + { + intersects = 1; + break; + } + } + if (!intersects) + { + *x = tx; + *y = ty; + return 1; + } + } + } + return 0; +} diff --git a/src/modules/engines/gl_common/evas_gl_gradient.c b/src/modules/engines/gl_common/evas_gl_gradient.c new file mode 100644 index 0000000..7c34f74 --- /dev/null +++ b/src/modules/engines/gl_common/evas_gl_gradient.c @@ -0,0 +1,256 @@ +#include "evas_gl_private.h" + +Evas_GL_Gradient * +evas_gl_common_gradient_new(void) +{ + Evas_GL_Gradient *gr; + + gr = calloc(1, sizeof(Evas_GL_Gradient)); + if (!gr) return NULL; + gr->grad = evas_common_gradient_new(); + if (!gr->grad) { free(gr); return NULL; } + gr->changed = 1; + return gr; +} + +void +evas_gl_common_gradient_free(Evas_GL_Gradient *gr) +{ + if (!gr) return; + if (gr->grad) evas_common_gradient_free(gr->grad); + if (gr->tex) evas_gl_common_texture_free(gr->tex); + free(gr); +} + +void +evas_gl_common_gradient_color_stop_add(Evas_GL_Gradient *gr, int r, int g, int b, int a, int delta) +{ + if (!gr) return; + evas_common_gradient_color_stop_add(gr->grad, r, g, b, a, delta); + gr->changed = 1; +} + +void +evas_gl_common_gradient_alpha_stop_add(Evas_GL_Gradient *gr, int a, int delta) +{ + if (!gr) return; + evas_common_gradient_alpha_stop_add(gr->grad, a, delta); + gr->changed = 1; +} + +void +evas_gl_common_gradient_color_data_set(Evas_GL_Gradient *gr, void * map, int len, int has_alpha) +{ + if (!gr) return; + evas_common_gradient_color_data_set(gr->grad, map, len, has_alpha); + gr->changed = 1; +} + +void +evas_gl_common_gradient_alpha_data_set(Evas_GL_Gradient *gr, void * alpha_map, int len) +{ + if (!gr) return; + evas_common_gradient_alpha_data_set(gr->grad, alpha_map, len); + gr->changed = 1; +} + +void +evas_gl_common_gradient_clear(Evas_GL_Gradient *gr) +{ + if (!gr) return; + evas_common_gradient_clear(gr->grad); + gr->changed = 1; +} + +void +evas_gl_common_gradient_fill_set(Evas_GL_Gradient *gr, int x, int y, int w, int h) +{ + if (!gr) return; + evas_common_gradient_fill_set(gr->grad, x, y, w, h); + gr->changed = 1; +} + +void +evas_gl_common_gradient_fill_angle_set(Evas_GL_Gradient *gr, double angle) +{ + if (!gr) return; + evas_common_gradient_fill_angle_set(gr->grad, angle); + gr->changed = 1; +} + +void +evas_gl_common_gradient_fill_spread_set(Evas_GL_Gradient *gr, int spread) +{ + if (!gr) return; + evas_common_gradient_fill_spread_set(gr->grad, spread); + gr->changed = 1; +} + +void +evas_gl_common_gradient_map_angle_set(Evas_GL_Gradient *gr, double angle) +{ + if (!gr) return; + evas_common_gradient_map_angle_set(gr->grad, angle); + gr->changed = 1; +} + +void +evas_gl_common_gradient_map_offset_set(Evas_GL_Gradient *gr, float offset) +{ + if (!gr) return; + evas_common_gradient_map_offset_set(gr->grad, offset); + gr->changed = 1; +} + +void +evas_gl_common_gradient_map_direction_set(Evas_GL_Gradient *gr, int direction) +{ + if (!gr) return; + evas_common_gradient_map_direction_set(gr->grad, direction); + gr->changed = 1; +} + +void +evas_gl_common_gradient_type_set(Evas_GL_Gradient *gr, char *name, char *params) +{ + if (!gr) return; + evas_common_gradient_type_set(gr->grad, name, params); + gr->changed = 1; +} + +int +evas_gl_common_gradient_is_opaque(Evas_GL_Context *gc, Evas_GL_Gradient *gr, + int x, int y, int w, int h) +{ + RGBA_Draw_Context *dc; + + if (!gc || !gc->dc || !gr || !gr->grad || !gr->grad->type.geometer) return 0; + dc = gc->dc; + return !(gr->grad->type.geometer->has_alpha(gr->grad, dc->render_op) | + gr->grad->type.geometer->has_mask(gr->grad, dc->render_op)); +} + +int +evas_gl_common_gradient_is_visible(Evas_GL_Context *gc, Evas_GL_Gradient *gr, + int x, int y, int w, int h) +{ + if (!gc || !gr) return 0; + return 1; +} + +void +evas_gl_common_gradient_render_pre(Evas_GL_Context *gc, Evas_GL_Gradient *gr) +{ + int len; + RGBA_Draw_Context *dc; + RGBA_Gradient *grad; + + if (!gr || !gc || !gr->grad || !gc->dc) return; + grad = gr->grad; + dc = gc->dc; + if (!grad->type.geometer) return; + grad->type.geometer->geom_set(grad); + len = grad->type.geometer->get_map_len(grad); + evas_common_gradient_map(dc, grad, len); + gr->changed = 1; +} + +void +evas_gl_common_gradient_render_post(Evas_GL_Gradient *gr) +{ +} + +void +evas_gl_common_gradient_draw(Evas_GL_Context *gc, + Evas_GL_Gradient *gr, + int x, int y, int w, int h) +{ + int r, g, b, a; + RGBA_Draw_Context *dc; + double tx2, ty2; + + if ((w < 1) || (h < 1)) return; + if (!gr || !gc || !gc->dc) return; + if (!gr->grad || !gr->grad->type.geometer) return; + + dc = gc->dc; + if (dc->mul.use) + { + a = (dc->mul.col >> 24) & 0xff; + r = (dc->mul.col >> 16) & 0xff; + g = (dc->mul.col >> 8 ) & 0xff; + b = (dc->mul.col ) & 0xff; + } + else + { + r = g = b = a = 255; + } + evas_gl_common_context_color_set(gc, r, g, b, a); + + a = !evas_gl_common_gradient_is_opaque(gc, gr, x, y, w, h); + evas_gl_common_context_blend_set(gc, a); + + if (dc->clip.use) + evas_gl_common_context_clip_set(gc, 1, + dc->clip.x, dc->clip.y, + dc->clip.w, dc->clip.h); + else + evas_gl_common_context_clip_set(gc, 0, + 0, 0, 0, 0); + + if (!gr->tex) gr->changed = 1; + if (((w != gr->tw) || (h != gr->th)) && gr->tex) + { + evas_gl_common_texture_free(gr->tex); + gr->tex = NULL; + gr->changed = 1; + } + if (gr->changed) + { + RGBA_Image *im; + int op = dc->render_op, cuse = dc->clip.use; + + im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); + if (!im) return; + im = (RGBA_Image *) evas_cache_image_size_set(&im->cache_entry, w, h); + dc->render_op = _EVAS_RENDER_FILL; + dc->clip.use = 0; + evas_common_gradient_draw(im, dc, 0, 0, w, h, gr->grad); + if (!gr->tex) + gr->tex = evas_gl_common_texture_new(gc, im, 0); + else + evas_gl_common_texture_update(gr->tex, im, 0); + + evas_cache_image_drop(&im->cache_entry); + + dc->render_op = op; + dc->clip.use = cuse; + if (!gr->tex) return; + } + + if (gr->tex->rectangle) + { + tx2 = w; + ty2 = h; + } + else + { + tx2 = (double)w / (double)(gr->tex->w); + ty2 = (double)h / (double)(gr->tex->h); + } + + evas_gl_common_context_texture_set(gc, gr->tex, 0, + gr->tex->tw, gr->tex->th); + + evas_gl_common_context_read_buf_set(gc, GL_BACK); + evas_gl_common_context_write_buf_set(gc, GL_BACK); + + glBegin(GL_QUADS); + glTexCoord2d(0.0, 0.0); glVertex2i(x, y); + glTexCoord2d(tx2, 0.0); glVertex2i(x + w, y); + glTexCoord2d(tx2, ty2); glVertex2i(x + w, y + h); + glTexCoord2d(0.0, ty2); glVertex2i(x, y + h); + glEnd(); + gr->changed = 0; + gr->tw = w; gr->th = h; +} diff --git a/src/modules/engines/gl_common/evas_gl_image.c b/src/modules/engines/gl_common/evas_gl_image.c new file mode 100644 index 0000000..a5069e9 --- /dev/null +++ b/src/modules/engines/gl_common/evas_gl_image.c @@ -0,0 +1,330 @@ +#include "evas_gl_private.h" + +Evas_GL_Image * +evas_gl_common_image_load(Evas_GL_Context *gc, const char *file, const char *key, Evas_Image_Load_Opts *lo) +{ + Evas_GL_Image *im; + RGBA_Image *im_im; + Evas_List *l; + + im_im = evas_common_load_image_from_file(file, key, lo); + if (!im_im) return NULL; + + for (l = gc->images; l; l = l->next) + { + im = l->data; + if (im->im == im_im) + { + evas_cache_image_drop(&im_im->cache_entry); + gc->images = evas_list_remove_list(gc->images, l); + gc->images = evas_list_prepend(gc->images, im); + im->references++; + return im; + } + } + + im = calloc(1, sizeof(Evas_GL_Image)); + if (!im) return NULL; + im->references = 1; + im->im = im_im; + if (!im->im) + { + free(im); + return NULL; + } + im->gc = gc; + im->references = 1; + im->cached = 1; + im->cs.space = EVAS_COLORSPACE_ARGB8888; + if (lo) im->load_opts = *lo; + gc->images = evas_list_prepend(gc->images, im); + return im; +} + +Evas_GL_Image * +evas_gl_common_image_new_from_data(Evas_GL_Context *gc, int w, int h, DATA32 *data, int alpha, int cspace) +{ + Evas_GL_Image *im; + Evas_List *l; + + for (l = gc->images; l; l = l->next) + { + im = l->data; + if (((void *)(im->im->image.data) == (void *)data) && + (im->im->cache_entry.w == w) && + (im->im->cache_entry.h == h)) + { + gc->images = evas_list_remove_list(gc->images, l); + gc->images = evas_list_prepend(gc->images, im); + im->references++; + return im; + } + } + im = calloc(1, sizeof(Evas_GL_Image)); + if (!im) return NULL; + im->references = 1; + im->im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), + w, h, data, alpha, cspace); + if (!im->im) + { + free(im); + return NULL; + } + im->gc = gc; + im->cs.space = cspace; + switch (cspace) + { + case EVAS_COLORSPACE_ARGB8888: + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if (im->tex) evas_gl_common_texture_free(im->tex); + im->tex = NULL; + im->cs.data = data; + im->cs.no_free = 1; + break; + default: + abort(); + break; + } + /* + im->cached = 1; + gc->images = evas_list_prepend(gc->images, im); + */ + printf("new im cs = %i\n", im->cs.space); + return im; +} + +Evas_GL_Image * +evas_gl_common_image_new_from_copied_data(Evas_GL_Context *gc, int w, int h, DATA32 *data, int alpha, int cspace) +{ + Evas_GL_Image *im; + + im = calloc(1, sizeof(Evas_GL_Image)); + if (!im) return NULL; + im->references = 1; + im->im = (RGBA_Image *) evas_cache_image_copied_data(evas_common_image_cache_get(), + w, h, data, alpha, cspace); + if (!im->im) + { + free(im); + return NULL; + } + im->gc = gc; + im->cs.space = cspace; + switch (cspace) + { + case EVAS_COLORSPACE_ARGB8888: + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if (im->tex) evas_gl_common_texture_free(im->tex); + im->tex = NULL; + im->cs.no_free = 0; + im->cs.data = calloc(1, im->im->cache_entry.h * sizeof(unsigned char *) * 2); + if ((data) && (im->cs.data)) + memcpy(im->cs.data, data, im->im->cache_entry.h * sizeof(unsigned char *) * 2); + break; + default: + abort(); + break; + } + return im; +} + +Evas_GL_Image * +evas_gl_common_image_new(Evas_GL_Context *gc, int w, int h, int alpha, int cspace) +{ + Evas_GL_Image *im; + + im = calloc(1, sizeof(Evas_GL_Image)); + if (!im) return NULL; + im->references = 1; + im->im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); + if (!im->im) + { + free(im); + return NULL; + } + im->gc = gc; + im->cs.space = cspace; + im->im->cache_entry.flags.alpha = alpha ? 1 : 0; + evas_cache_image_colorspace(&im->im->cache_entry, cspace); + im->im = (RGBA_Image *) evas_cache_image_size_set(&im->im->cache_entry, w, h); + switch (cspace) + { + case EVAS_COLORSPACE_ARGB8888: + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: +// if (im->tex) evas_gl_common_texture_free(im->tex); + im->tex = NULL; + im->cs.no_free = 0; + im->cs.data = calloc(1, im->im->cache_entry.h * sizeof(unsigned char *) * 2); + break; + default: + abort(); + break; + } + return im; +} + +void +evas_gl_common_image_free(Evas_GL_Image *im) +{ + im->references--; + if (im->references > 0) return; + + if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + } + if (im->cached) im->gc->images = evas_list_remove(im->gc->images, im); + if (im->im) evas_cache_image_drop(&im->im->cache_entry); + if (im->tex) evas_gl_common_texture_free(im->tex); + free(im); +} + +void +evas_gl_common_image_dirty(Evas_GL_Image *im) +{ + im->im = (RGBA_Image *) evas_cache_image_dirty(&im->im->cache_entry, 0, 0, im->im->cache_entry.w, im->im->cache_entry.h); + im->dirty = 1; +} + +void +evas_gl_common_image_draw(Evas_GL_Context *gc, Evas_GL_Image *im, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, int smooth) +{ + RGBA_Draw_Context *dc; + int r, g, b, a; + double tx1, ty1, tx2, ty2; + int ow, oh; + int space; + + if (sw < 1) sw = 1; + if (sh < 1) sh = 1; + dc = gc->dc; + if (dc->mul.use) + { + a = (dc->mul.col >> 24) & 0xff; + r = (dc->mul.col >> 16) & 0xff; + g = (dc->mul.col >> 8 ) & 0xff; + b = (dc->mul.col ) & 0xff; + } + else + { + r = g = b = a = 255; + } + + if (!gc->ext.arb_program && (im->cs.space == EVAS_COLORSPACE_YCBCR422P601_PL + || im->cs.space == EVAS_COLORSPACE_YCBCR422P709_PL)) + { + if ((im->cs.data) && (*((unsigned char **)im->cs.data))) + { + if (im->dirty || !im->im->image.data) + { + free(im->im->image.data); + im->im->image.data = malloc(im->im->cache_entry.w * im->im->cache_entry.h * sizeof(DATA32)); + if (im->im->image.data) + evas_common_convert_yuv_420p_601_rgba(im->cs.data, + (void *)im->im->image.data, + im->im->cache_entry.w, im->im->cache_entry.h); + } + } + space = EVAS_COLORSPACE_ARGB8888; + } + else + space = im->cs.space; + +/* leak in this switch */ + switch (space) + { + case EVAS_COLORSPACE_ARGB8888: + evas_cache_image_load_data(&im->im->cache_entry); + if ((im->tex) && (im->dirty)) + { + evas_gl_common_texture_update(im->tex, im->im, im->tex->smooth); + im->dirty = 0; + } + if (!im->tex) + im->tex = evas_gl_common_texture_new(gc, im->im, smooth); + ow = (dw * im->tex->tw) / sw; + oh = (dh * im->tex->th) / sh; + if (im->tex->rectangle) + { + tx1 = sx; + ty1 = sy; + tx2 = sx + sw; + ty2 = sy + sh; + } + else + { + tx1 = (double)(sx ) / (double)(im->tex->w); + ty1 = (double)(sy ) / (double)(im->tex->h); + tx2 = (double)(sx + sw) / (double)(im->tex->w); + ty2 = (double)(sy + sh) / (double)(im->tex->h); + } + evas_gl_common_context_texture_set(gc, im->tex, smooth, ow, oh); + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if ((im->tex) && (im->dirty)) + { + evas_gl_common_ycbcr601pl_texture_update(im->tex, im->cs.data, im->im->cache_entry.w, im->im->cache_entry.h, smooth); + im->dirty = 0; + } + if ((!im->tex) && (im->cs.data) && (*((unsigned char **)im->cs.data))) + { + im->tex = evas_gl_common_ycbcr601pl_texture_new(gc, im->cs.data, im->im->cache_entry.w, im->im->cache_entry.h, smooth); + } + if (!im->tex) return; + ow = (dw * im->tex->tw) / sw; + oh = (dh * im->tex->th) / sh; + if (im->tex->rectangle) + { + tx1 = sx; + ty1 = sy; + tx2 = sx + sw; + ty2 = sy + sh; + } + else + { + tx1 = (double)(sx ) / (double)(im->tex->w); + ty1 = (double)(sy ) / (double)(im->tex->h); + tx2 = (double)(sx + sw) / (double)(im->tex->w); + ty2 = (double)(sy + sh) / (double)(im->tex->h); + } + evas_gl_common_context_texture_set(gc, im->tex, smooth, ow, oh); + + break; + default: + abort(); + break; + } + +// if ((!im->tex->have_mipmaps) && (smooth) && +// ((im->tex->uw < im->tex->tw) || (im->tex->uh < im->tex->th)) && +// (!gc->ext.sgis_generate_mipmap)) +// evas_gl_common_texture_mipmaps_build(im->tex, im->im, smooth); + + evas_gl_common_context_color_set(gc, r, g, b, a); + if ((a < 255) || im->im->cache_entry.flags.alpha) + evas_gl_common_context_blend_set(gc, 1); + else evas_gl_common_context_blend_set(gc, 0); + if (dc->clip.use) + evas_gl_common_context_clip_set(gc, 1, + dc->clip.x, dc->clip.y, + dc->clip.w, dc->clip.h); + else + evas_gl_common_context_clip_set(gc, 0, + 0, 0, 0, 0); + evas_gl_common_context_read_buf_set(gc, GL_BACK); + evas_gl_common_context_write_buf_set(gc, GL_BACK); + + glBegin(GL_QUADS); + glTexCoord2d(tx1, ty1); glVertex2i(dx , dy ); + glTexCoord2d(tx2, ty1); glVertex2i(dx + dw, dy ); + glTexCoord2d(tx2, ty2); glVertex2i(dx + dw, dy + dh); + glTexCoord2d(tx1, ty2); glVertex2i(dx , dy + dh); + glEnd(); +} diff --git a/src/modules/engines/gl_common/evas_gl_line.c b/src/modules/engines/gl_common/evas_gl_line.c new file mode 100644 index 0000000..238892a --- /dev/null +++ b/src/modules/engines/gl_common/evas_gl_line.c @@ -0,0 +1,30 @@ +#include "evas_gl_private.h" + +void +evas_gl_common_line_draw(Evas_GL_Context *gc, int x1, int y1, int x2, int y2) +{ + int r, g, b, a; + RGBA_Draw_Context *dc = gc->dc; + + a = (dc->col.col >> 24) & 0xff; + r = (dc->col.col >> 16) & 0xff; + g = (dc->col.col >> 8 ) & 0xff; + b = (dc->col.col ) & 0xff; + evas_gl_common_context_color_set(gc, r, g, b, a); + if (a < 255) evas_gl_common_context_blend_set(gc, 1); + else evas_gl_common_context_blend_set(gc, 0); + if (dc->clip.use) + evas_gl_common_context_clip_set(gc, 1, + dc->clip.x, dc->clip.y, + dc->clip.w, dc->clip.h); + else + evas_gl_common_context_clip_set(gc, 0, + 0, 0, 0, 0); + evas_gl_common_context_texture_set(gc, NULL, 0, 0, 0); + evas_gl_common_context_read_buf_set(gc, GL_BACK); + evas_gl_common_context_write_buf_set(gc, GL_BACK); + glBegin(GL_LINES); + glVertex2i(x1, y1); + glVertex2i(x2, y2); + glEnd(); +} diff --git a/src/modules/engines/gl_common/evas_gl_misc.c b/src/modules/engines/gl_common/evas_gl_misc.c new file mode 100644 index 0000000..66483c7 --- /dev/null +++ b/src/modules/engines/gl_common/evas_gl_misc.c @@ -0,0 +1,14 @@ +#include "evas_gl_private.h" + +void +evas_gl_common_swap_rect(Evas_GL_Context *gc, int x, int y, int w, int h) +{ + evas_gl_common_context_read_buf_set(gc, GL_BACK); + evas_gl_common_context_write_buf_set(gc, GL_FRONT); + evas_gl_common_context_blend_set(gc, 0); + evas_gl_common_context_clip_set(gc, 0, 0, 0, 0, 0); + evas_gl_common_context_dither_set(gc, 0); + y = gc->h - y - h; + glRasterPos2i(x, gc->h - y); + glCopyPixels(x, y, w, h, GL_COLOR); +} diff --git a/src/modules/engines/gl_common/evas_gl_polygon.c b/src/modules/engines/gl_common/evas_gl_polygon.c new file mode 100644 index 0000000..43bf0b3 --- /dev/null +++ b/src/modules/engines/gl_common/evas_gl_polygon.c @@ -0,0 +1,169 @@ +#include "evas_gl_private.h" + +#define GLU_TESS + +Evas_GL_Polygon * +evas_gl_common_poly_point_add(Evas_GL_Polygon *poly, int x, int y) +{ + Evas_GL_Polygon_Point *pt; + + if (!poly) poly = calloc(1, sizeof(Evas_GL_Polygon)); + if (!poly) return NULL; + pt = calloc(1, sizeof(Evas_GL_Polygon_Point)); + if (!pt) return NULL; + pt->x = x; + pt->y = y; + poly->points = evas_list_append(poly->points, pt); + poly->changed = 1; + return poly; +} + +Evas_GL_Polygon * +evas_gl_common_poly_points_clear(Evas_GL_Polygon *poly) +{ + if (!poly) return NULL; + while (poly->points) + { + Evas_GL_Polygon_Point *pt; + + pt = poly->points->data; + poly->points = evas_list_remove(poly->points, pt); + free(pt); + } + if (poly->dl > 0) glDeleteLists(poly->dl, 1); + free(poly); + return NULL; +} + +#ifdef GLU_TESS +static void _evas_gl_tess_begin_cb(GLenum which); +static void _evas_gl_tess_end_cb(void); +static void _evas_gl_tess_error_cb(GLenum errorcode); +static void _evas_gl_tess_vertex_cb(GLvoid *vertex); +static void _evas_gl_tess_combine_cb(GLdouble coords[3], GLdouble *vertex_data[4], GLfloat weight[4], GLdouble **data_out); + +static void +_evas_gl_tess_begin_cb(GLenum which) +{ + glBegin(which); +} + +static void +_evas_gl_tess_end_cb(void) +{ + glEnd(); +} + +static void +_evas_gl_tess_error_cb(GLenum errorcode) +{ +} + +static void +_evas_gl_tess_vertex_cb(GLvoid *vertex) +{ + GLdouble *v; + + v = vertex; + glVertex2d(v[0], v[1]); +} + +static void +_evas_gl_tess_combine_cb(GLdouble coords[3], GLdouble *vertex_data[4], GLfloat weight[4], GLdouble **data_out) +{ + GLdouble *vertex; + + vertex = (GLdouble *) malloc(6 * sizeof(GLdouble)); + vertex[0] = coords[0]; + vertex[1] = coords[1]; + *data_out = vertex; +} +#endif + +void +evas_gl_common_poly_draw(Evas_GL_Context *gc, Evas_GL_Polygon *poly) +{ + int r, g, b, a; + Evas_List *l; + static void *tess = NULL; + GLdouble *glp = NULL; + int i, num; + RGBA_Draw_Context *dc = gc->dc; + + a = (dc->col.col >> 24) & 0xff; + r = (dc->col.col >> 16) & 0xff; + g = (dc->col.col >> 8 ) & 0xff; + b = (dc->col.col ) & 0xff; + evas_gl_common_context_color_set(gc, r, g, b, a); + if (a < 255) evas_gl_common_context_blend_set(gc, 1); + else evas_gl_common_context_blend_set(gc, 0); + if (dc->clip.use) + evas_gl_common_context_clip_set(gc, 1, + dc->clip.x, dc->clip.y, + dc->clip.w, dc->clip.h); + else + evas_gl_common_context_clip_set(gc, 0, + 0, 0, 0, 0); + evas_gl_common_context_texture_set(gc, NULL, 0, 0, 0); + evas_gl_common_context_read_buf_set(gc, GL_BACK); + evas_gl_common_context_write_buf_set(gc, GL_BACK); + + if (poly->changed || poly->dl <= 0) + { + if (poly->dl > 0) glDeleteLists(poly->dl, 1); + poly->dl = glGenLists(1); + + glNewList(poly->dl, GL_COMPILE_AND_EXECUTE); +#ifdef GLU_TESS + if (!tess) + { + tess = gluNewTess(); + + gluTessCallback(tess, GLU_TESS_BEGIN, _evas_gl_tess_begin_cb); + gluTessCallback(tess, GLU_TESS_END, _evas_gl_tess_end_cb); + gluTessCallback(tess, GLU_TESS_ERROR, _evas_gl_tess_error_cb); + gluTessCallback(tess, GLU_TESS_VERTEX, _evas_gl_tess_vertex_cb); + gluTessCallback(tess, GLU_TESS_COMBINE, _evas_gl_tess_combine_cb); + } + num = 0; + num = evas_list_count(poly->points); + i = 0; + glp = malloc(num * 6 * sizeof(GLdouble)); + gluTessNormal(tess, 0, 0, 1); + gluTessProperty(tess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD); + gluTessBeginPolygon(tess, NULL); + gluTessBeginContour(tess); + for (l = poly->points; l; l = l->next) + { + Evas_GL_Polygon_Point *p; + + p = l->data; + glp[i++] = p->x; + glp[i++] = p->y; + glp[i++] = 0; + gluTessVertex(tess, &(glp[i - 3]), &(glp[i - 3])); + i += 3; + } + gluTessEndContour(tess); + gluTessEndPolygon(tess); + free(glp); +#else + glBegin(GL_POLYGON); + for (l = poly->points; l; l = l->next) + { + Evas_GL_Polygon_Point *p; + + p = l->data; + glVertex2i(p->x, p->y); + } + glEnd(); +#endif + glEndList(); + + poly->changed = 0; + + return ; + } + + glCallList(poly->dl); +} diff --git a/src/modules/engines/gl_common/evas_gl_private.h b/src/modules/engines/gl_common/evas_gl_private.h new file mode 100644 index 0000000..8ad9f81 --- /dev/null +++ b/src/modules/engines/gl_common/evas_gl_private.h @@ -0,0 +1,90 @@ +#ifndef _EVAS_GL_PRIVATE_H +#define _EVAS_GL_PRIVATE_H + +#include "evas_gl_common.h" + +#ifndef GL_TEXTURE_RECTANGLE_NV +#define GL_TEXTURE_RECTANGLE_NV 0x84f5 +#endif + +#if 0 +#ifndef GL_WRITE_PIXEL_DATA_RANGE_NV +/* nvidia extensions */ +extern void *glXAllocateMemoryNV(GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority); +extern void glPixelDataRangeNV(GLenum target, GLsizei length, void *pointer); +extern void glFlushPixelDataRangeNV(GLenum target); +# define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#endif + +/* arb extensions */ +void glBindBufferARB(GLenum target, uint buffer); +void glDeleteBuffersARB(GLsizei n, const uint *buffers); +void glGenBuffersARB(GLsizei n, GLuint *buffers); +GLboolean glIsBufferARB(GLuint buffer); + +void glBufferDataARB(GLenum target, GLsizei size, const void *data, + GLenum usage); +void glBufferSubDataARB(GLenum target, int offset, GLsizei size, + const void *data); +void glGetBufferSubDataARB(GLenum target, int offset, + GLsizei size, void *data); + +void *glMapBufferARB(GLenum target, GLenum access); +GLboolean glUnmapBufferARB(GLenum target); + +void glGetBufferParameterivARB(GLenum target, GLenum pname, int *params); +void glGetBufferPointervARB(GLenum target, GLenum pname, void **params); + +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_BNORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#endif + + + + + + +/* evas ARGB pixel config */ +#define NATIVE_PIX_FORMAT GL_BGRA + +/* Big endian systems require the texture know the byte order is reversed */ +#ifdef WORDS_BIGENDIAN +#define NATIVE_PIX_UNIT GL_UNSIGNED_INT_8_8_8_8_REV +#else +/* fast on vidia */ +/*#define NATIVE_PIX_UNIT GL_UNSIGNED_INT_8_8_8_8_REV*/ +/* fast on ati compared to GL_UNSIGNED_INT_8_8_8_8_REV */ +#define NATIVE_PIX_UNIT GL_UNSIGNED_BYTE +#endif + +#endif diff --git a/src/modules/engines/gl_common/evas_gl_rectangle.c b/src/modules/engines/gl_common/evas_gl_rectangle.c new file mode 100644 index 0000000..e429b66 --- /dev/null +++ b/src/modules/engines/gl_common/evas_gl_rectangle.c @@ -0,0 +1,32 @@ +#include "evas_gl_private.h" + +void +evas_gl_common_rect_draw(Evas_GL_Context *gc, int x, int y, int w, int h) +{ + int r, g, b, a; + RGBA_Draw_Context *dc = gc->dc; + + a = (dc->col.col >> 24) & 0xff; + r = (dc->col.col >> 16) & 0xff; + g = (dc->col.col >> 8 ) & 0xff; + b = (dc->col.col ) & 0xff; + evas_gl_common_context_color_set(gc, r, g, b, a); + if (a < 255) evas_gl_common_context_blend_set(gc, 1); + else evas_gl_common_context_blend_set(gc, 0); + if (dc->clip.use) + evas_gl_common_context_clip_set(gc, 1, + dc->clip.x, dc->clip.y, + dc->clip.w, dc->clip.h); + else + evas_gl_common_context_clip_set(gc, 0, + 0, 0, 0, 0); + evas_gl_common_context_texture_set(gc, NULL, 0, 0, 0); + evas_gl_common_context_read_buf_set(gc, GL_BACK); + evas_gl_common_context_write_buf_set(gc, GL_BACK); + glBegin(GL_QUADS); + glVertex2i(x, y); + glVertex2i(x + w, y); + glVertex2i(x + w, y + h); + glVertex2i(x, y + h); + glEnd(); +} diff --git a/src/modules/engines/gl_common/evas_gl_texture.c b/src/modules/engines/gl_common/evas_gl_texture.c new file mode 100644 index 0000000..0962fc3 --- /dev/null +++ b/src/modules/engines/gl_common/evas_gl_texture.c @@ -0,0 +1,620 @@ +#include "evas_gl_private.h" + +Evas_GL_Texture * +evas_gl_common_texture_new(Evas_GL_Context *gc, RGBA_Image *im, int smooth) +{ + Evas_GL_Texture *tex; + DATA32 *im_data; + int im_w, im_h; + int tw, th; + int shift; + GLenum pixfmt, texfmt; + + tex = calloc(1, sizeof(Evas_GL_Texture)); + if (!tex) return NULL; + + if ((gc->ext.nv_texture_rectangle) && + (!(gc->ext.arb_texture_non_power_of_two && + gc->ext.sgis_generate_mipmap))) + { + tex->gc = gc; + tex->w = im->cache_entry.w; + tex->h = im->cache_entry.h; + tex->rectangle = 1; + tex->tw = im->cache_entry.w; + tex->th = im->cache_entry.h; + tex->references = 0; + tex->smooth = smooth; + tex->changed = 1; + + glEnable(GL_TEXTURE_2D); + glEnable(GL_TEXTURE_RECTANGLE_NV); + glGenTextures(1, &(tex->texture)); + glBindTexture(GL_TEXTURE_RECTANGLE_NV, tex->texture); + if (smooth) + { + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + else + { + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + + if (gc->texture) gc->texture->references--; + gc->texture = tex; + gc->change.texture = 1; + tex->references++; + + if (im->cache_entry.flags.alpha) texfmt = GL_RGBA8; + else texfmt = GL_RGB8; + pixfmt = NATIVE_PIX_FORMAT; + + glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, + texfmt, tex->w, tex->h, 0, + pixfmt, NATIVE_PIX_UNIT, im->image.data); + return tex; + } + + if ((gc->ext.arb_texture_non_power_of_two) && (gc->ext.sgis_generate_mipmap)) + { + tw = im->cache_entry.w; + th = im->cache_entry.h; + } + else + { + shift = 1; while (im->cache_entry.w > shift) shift = shift << 1; tw = shift; + shift = 1; while (im->cache_entry.h > shift) shift = shift << 1; th = shift; + } + tex->gc = gc; + tex->w = tw; + tex->h = th; + tex->tw = im->cache_entry.w; + tex->th = im->cache_entry.h; + tex->references = 0; + tex->smooth = 0; + tex->changed = 1; + glEnable(GL_TEXTURE_2D); + glGenTextures(1, &(tex->texture)); + glBindTexture(GL_TEXTURE_2D, tex->texture); + if (gc->texture) gc->texture->references--; + gc->texture = tex; + gc->change.texture = 1; + tex->references++; + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + im_data = im->image.data; + im_w = im->cache_entry.w; + im_h = im->cache_entry.h; + + if (im->cache_entry.flags.alpha) texfmt = GL_RGBA8; + else texfmt = GL_RGB8; + pixfmt = NATIVE_PIX_FORMAT; + + glTexImage2D(GL_TEXTURE_2D, 0, + texfmt, tw, th, 0, + pixfmt, NATIVE_PIX_UNIT, NULL); +/* + { + int ttw, tth; + int l; + + ttw = tw; + tth = th; + l = 0; + while ((ttw > 1) || (tth > 1)) + { + l++; + ttw /= 2; + tth /= 2; + if (ttw < 1) ttw = 1; + if (tth < 1) tth = 1; + glTexImage2D(GL_TEXTURE_2D, l, + texfmt, ttw, tth, 0, + pixfmt, NATIVE_PIX_UNIT, NULL); + } + } + */ + if (gc->ext.sgis_generate_mipmap) + { + glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE); + tex->have_mipmaps = 1; + } + glTexSubImage2D(GL_TEXTURE_2D, 0, + 0, 0, im_w, im_h, + pixfmt, NATIVE_PIX_UNIT, + im_data); + if (im_w < tw) + glTexSubImage2D(GL_TEXTURE_2D, 0, + im_w, 0, 1, im_h, + pixfmt, NATIVE_PIX_UNIT, + im_data + im_w - 1); + if (im_h < th) + glTexSubImage2D(GL_TEXTURE_2D, 0, + 0, im_h, im_w, 1, + pixfmt, NATIVE_PIX_UNIT, + im_data + (im_w * (im_h - 1))); + if ((im_w < tw) && (im_h < th)) + glTexSubImage2D(GL_TEXTURE_2D, 0, + im_w, im_h, 1, 1, + pixfmt, NATIVE_PIX_UNIT, + im_data + (im_w * (im_h - 1)) + im_w - 1); + return tex; +} + +void +evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im, int smooth) +{ + DATA32 *im_data; + int im_w, im_h; + int tw, th; + GLenum pixfmt, texfmt, target; + + if (tex->rectangle) + { + void *data; + + glEnable(GL_TEXTURE_2D); + glEnable(GL_TEXTURE_RECTANGLE_NV); + glBindTexture(GL_TEXTURE_RECTANGLE_NV, tex->texture); + + data = im->image.data; +#if 0 // trying the glXAllocateMemoryNV() thing but its abysmally slow + tmp = glXAllocateMemoryNV(tex->w * tex->h * sizeof(DATA32), + 0.0, 1.0, 1.0); + if (tmp) + { + glEnableClientState(GL_WRITE_PIXEL_DATA_RANGE_NV); + glPixelDataRangeNV(GL_WRITE_PIXEL_DATA_RANGE_NV, + tex->w * tex->h * sizeof(DATA32), + tmp); +// evas_common_copy_pixels_rgba_to_rgba_mmx2(im->image->data, tmp, +// tex->w * tex->h); + memcpy(tmp, im->image.data, + tex->w * tex->h * sizeof(DATA32)); + data = tmp; + } +#endif + if (tex->gc->texture) tex->gc->texture->references--; + tex->gc->texture = tex; + tex->gc->change.texture = 1; + tex->references++; + + if (im->cache_entry.flags.alpha) texfmt = GL_RGBA8; + else texfmt = GL_RGB8; + pixfmt = NATIVE_PIX_FORMAT; + + glTexSubImage2D(GL_TEXTURE_RECTANGLE_NV, 0, + 0, 0, tex->w, tex->h, + pixfmt, NATIVE_PIX_UNIT, + data); +#if 0 // trying the glXAllocateMemoryNV() thing but its abysmally slow + if (tmp) + { + glFlushPixelDataRangeNV(GL_WRITE_PIXEL_DATA_RANGE_NV); + glXFreeMemoryNV(tmp); + } +#endif + return; + } + tw = tex->w; + th = tex->h; + tex->changed = 1; + tex->have_mipmaps = 0; +// if (tex->gc->ext.nv_texture_rectangle) glDisable(GL_TEXTURE_RECTANGLE_NV); + glEnable(GL_TEXTURE_2D); + if (tex->rectangle) + { + glEnable(GL_TEXTURE_RECTANGLE_NV); + target = GL_TEXTURE_RECTANGLE_NV; + } + else + { +// glDisable(GL_TEXTURE_RECTANGLE_NV); + glEnable(GL_TEXTURE_2D);// + target = GL_TEXTURE_2D; + } + + glBindTexture(GL_TEXTURE_2D, tex->texture); + + if (tex->gc->texture) tex->gc->texture->references--; + tex->gc->texture = tex; + tex->gc->change.texture = 1; + tex->references++; + + /* + if (!tex->opt) + { + glPixelDataRangeNV(GL_WRITE_PIXEL_DATA_RANGE_NV, + im->image->w * im->image->h * 4, + im->image->data); + tex->opt = 1; + } + */ + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + tex->smooth = 0; + + im_data = im->image.data; + im_w = im->cache_entry.w; + im_h = im->cache_entry.h; + + if (im->cache_entry.flags.alpha) texfmt = GL_RGBA8; + else texfmt = GL_RGB8; + pixfmt = NATIVE_PIX_FORMAT; + + if (tex->gc->ext.sgis_generate_mipmap) + { + glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE); + tex->have_mipmaps = 1; + } + glTexSubImage2D(GL_TEXTURE_2D, 0, + 0, 0, im_w, im_h, + pixfmt, NATIVE_PIX_UNIT, + im_data); +#if 1 // this is sloooow... well slower than just the above... + if (im_w < tw) + glTexSubImage2D(GL_TEXTURE_2D, 0, + im_w, 0, 1, im_h, + pixfmt, NATIVE_PIX_UNIT, + im_data + im_w - 1); + if (im_h < th) + glTexSubImage2D(GL_TEXTURE_2D, 0, + 0, im_h, im_w, 1, + pixfmt, NATIVE_PIX_UNIT, + im_data + (im_w * (im_h - 1))); + if ((im_w < tw) && (im_h < th)) + glTexSubImage2D(GL_TEXTURE_2D, 0, + im_w, im_h, 1, 1, + pixfmt, NATIVE_PIX_UNIT, + im_data + (im_w * (im_h - 1)) + im_w - 1); +#endif +} + +void +evas_gl_common_texture_free(Evas_GL_Texture *tex) +{ + if (tex->references > 0) + { + /* FIXME: could be in more gc's */ + } + if (tex->gc->texture == tex) + { + tex->gc->texture = NULL; + tex->gc->change.texture = 1; + } + glDeleteTextures(1, &tex->texture); + if (tex->texture2) glDeleteTextures(1, &tex->texture2); + if (tex->texture3) glDeleteTextures(1, &tex->texture3); +/* + if (tex->fshad) + { + glDeleteObjectARB(tex->fshad); + } + if (tex->prog) + { + glDeleteObjectARB(tex->prog); + } + */ + free(tex); +} + +void +evas_gl_common_texture_mipmaps_build(Evas_GL_Texture *tex, RGBA_Image *im, int smooth) +{ + DATA32 *im_data; + int tw, th; + int im_w, im_h, w, h; + GLenum pixfmt, texfmt; + int level; + RGBA_Image *im1 = NULL, *im2 = NULL; +#ifdef BUILD_MMX + int mmx, sse, sse2; +#endif + + if (!smooth) return; + if (tex->rectangle) return; +#ifdef BUILD_MMX + evas_common_cpu_can_do(&mmx, &sse, &sse2); +#endif + tw = tex->w; + th = tex->h; + w = im->cache_entry.w; + h = im->cache_entry.h; + level = 0; + im1 = im; + + if (tex->gc->texture != tex) + { + if (tex->gc->texture) tex->gc->texture->references--; + tex->gc->texture = tex; + tex->gc->change.texture = 1; + if (tex) tex->references++; + } + + if (im->cache_entry.flags.alpha) texfmt = GL_RGBA8; + else texfmt = GL_RGB8; + pixfmt = NATIVE_PIX_FORMAT; + + if (tex->gc->ext.nv_texture_rectangle) glDisable(GL_TEXTURE_RECTANGLE_NV); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, tex->texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + while ((w > 1) || (h > 1)) + { + int pw, ph; + + pw = w; + ph = h; + w /= 2; + h /= 2; + if (w < 1) w = 1; + if (h < 1) h = 1; + tw /= 2; + th /= 2; + + level++; + im2 = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); + im2 = (RGBA_Image *) evas_cache_image_size_set(&im2->cache_entry, w, h); +#ifdef BUILD_MMX + if (mmx) + { + evas_common_scale_rgba_mipmap_down_2x2_mmx(im1->image.data, + im2->image.data, + pw, ph); + } + else +#endif + { + if (im->cache_entry.flags.alpha) + evas_common_scale_rgba_mipmap_down_2x2_c(im1->image.data, + im2->image.data, + pw, ph); + else + evas_common_scale_rgb_mipmap_down_2x2_c(im1->image.data, + im2->image.data, + pw, ph); + } + if (im1 != im) evas_cache_image_drop(&im1->cache_entry); + im1 = NULL; + + im_data = im2->image.data; + im_w = w; + im_h = h; + glTexSubImage2D(GL_TEXTURE_2D, level, + 0, 0, im_w, im_h, + pixfmt, NATIVE_PIX_UNIT, + im_data); + if (im_w < tw) + glTexSubImage2D(GL_TEXTURE_2D, level, + im_w, 0, 1, im_h, + pixfmt, NATIVE_PIX_UNIT, + im_data + im_w - 1); + if (im_h < th) + glTexSubImage2D(GL_TEXTURE_2D, level, + 0, im_h, im_w, 1, + pixfmt, NATIVE_PIX_UNIT, + im_data + (im_w * (im_h - 1))); + if ((im_w < tw) && (im_h < th)) + glTexSubImage2D(GL_TEXTURE_2D, level, + im_w, im_h, 1, 1, + pixfmt, NATIVE_PIX_UNIT, + im_data + (im_w * (im_h - 1)) + im_w - 1); + im1 = im2; + im2 = NULL; + } + if ((im1 != im) && (im1)) evas_cache_image_drop(&im1->cache_entry); + tex->have_mipmaps = 1; +#ifdef BUILD_MMX + if (mmx) evas_common_cpu_end_opt(); +#endif +} + +Evas_GL_Texture * +evas_gl_common_ycbcr601pl_texture_new(Evas_GL_Context *gc, unsigned char **rows, int w, int h, int smooth) +{ + Evas_GL_Texture *tex; + int im_w, im_h, tw, th, y; + GLenum texfmt; + +// on an nv 6600gt this is fast - but on a 5500fx its DEAD SLOW!!!!! +// if (!gc->ext.arb_texture_non_power_of_two) return NULL; + + tex = calloc(1, sizeof(Evas_GL_Texture)); + if (!tex) return NULL; + + tw = w; + th = h; + tex->gc = gc; + tex->w = tw; + tex->h = th; + tex->tw = w; + tex->th = h; + tex->references = 0; + tex->smooth = 0; + tex->changed = 1; + + tex->prog = gc->yuv422p.prog; + + glEnable(GL_TEXTURE_2D); + texfmt = GL_LUMINANCE; + + glUseProgramObjectARB(tex->prog); + + glGenTextures(1, &(tex->texture)); + glBindTexture(GL_TEXTURE_2D, tex->texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + if (smooth) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + glTexImage2D(GL_TEXTURE_2D, 0, texfmt, tex->w, tex->h, 0, + texfmt, GL_UNSIGNED_BYTE, NULL); + if (tex->h >= 2) + glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[1] - rows[0]); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tex->w, tex->h, + texfmt, GL_UNSIGNED_BYTE, rows[0]); +// for (y = 0; y < tex->h; y++) +// glTexSubImage2D(GL_TEXTURE_2D, 0, +// 0, y, tex->w, 1, +// texfmt, GL_UNSIGNED_BYTE, rows[y]); + + glGenTextures(1, &(tex->texture2)); + glBindTexture(GL_TEXTURE_2D, tex->texture2); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + if (smooth) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + glTexImage2D(GL_TEXTURE_2D, 0, texfmt, tex->w / 2, tex->h / 2, 0, + texfmt, GL_UNSIGNED_BYTE, NULL); + if (tex->h >= 4) + glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[tex->h + 1] - rows[tex->h]); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tex->w / 2, tex->h / 2, + texfmt, GL_UNSIGNED_BYTE, rows[tex->h]); +// for (y = 0; y < (tex->h / 2); y++) +// glTexSubImage2D(GL_TEXTURE_2D, 0, +// 0, y, tex->w / 2, 1, +// texfmt, GL_UNSIGNED_BYTE, rows[tex->h + y]); + + glGenTextures(1, &(tex->texture3)); + glBindTexture(GL_TEXTURE_2D, tex->texture3); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + if (smooth) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + glTexImage2D(GL_TEXTURE_2D, 0, + texfmt, tex->w / 2, tex->h / 2, 0, + texfmt, GL_UNSIGNED_BYTE, NULL); + if (tex->h >= 4) + glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[tex->h + (tex->h / 2) + 1] - rows[tex->h + (tex->h / 2)]); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tex->w / 2, tex->h / 2, + texfmt, GL_UNSIGNED_BYTE, rows[tex->h + (tex->h / 2)]); +// for (y = 0; y < (tex->h / 2); y++) +// glTexSubImage2D(GL_TEXTURE_2D, 0, +// 0, y, tex->w / 2, 1, +// texfmt, GL_UNSIGNED_BYTE, rows[tex->h + (tex->h / 2) + y]); + + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glUseProgramObjectARB(0); + + if (gc->texture) gc->texture->references--; + gc->texture = tex; + gc->change.texture = 1; + tex->references++; + + return tex; +} + +void +evas_gl_common_ycbcr601pl_texture_update(Evas_GL_Texture *tex, unsigned char **rows, int w, int h, int smooth) +{ + int texfmt; + int y; + + /* FIXME: should use subimage */ + glEnable(GL_TEXTURE_2D); + texfmt = GL_LUMINANCE; + + glBindTexture(GL_TEXTURE_2D, tex->texture); + if (smooth) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + if (tex->h >= 2) + glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[1] - rows[0]); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tex->w, tex->h, + texfmt, GL_UNSIGNED_BYTE, rows[0]); +// for (y = 0; y < tex->h; y++) +// glTexSubImage2D(GL_TEXTURE_2D, 0, +// 0, y, tex->w, 1, +// texfmt, GL_UNSIGNED_BYTE, rows[y]); + + glBindTexture(GL_TEXTURE_2D, tex->texture2); + if (smooth) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + if (tex->h >= 4) + glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[tex->h + 1] - rows[tex->h]); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tex->w / 2, tex->h / 2, + texfmt, GL_UNSIGNED_BYTE, rows[tex->h]); +// for (y = 0; y < (tex->h / 2); y++) +// glTexSubImage2D(GL_TEXTURE_2D, 0, +// 0, y, tex->w / 2, 1, +// texfmt, GL_UNSIGNED_BYTE, rows[tex->h + y]); + + glBindTexture(GL_TEXTURE_2D, tex->texture3); + if (smooth) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + if (tex->h >= 4) + glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[tex->h + (tex->h / 2) + 1] - rows[tex->h + (tex->h / 2)]); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tex->w / 2, tex->h / 2, + texfmt, GL_UNSIGNED_BYTE, rows[tex->h + (tex->h / 2)]); +// for (y = 0; y < (tex->h / 2); y++) +// glTexSubImage2D(GL_TEXTURE_2D, 0, +// 0, y, tex->w / 2, 1, +// texfmt, GL_UNSIGNED_BYTE, rows[tex->h + (tex->h / 2) + y]); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + + if (tex->gc->texture) tex->gc->texture->references--; + tex->gc->texture = tex; + tex->gc->change.texture = 1; + tex->references++; +} diff --git a/src/modules/engines/gl_glew/.cvsignore b/src/modules/engines/gl_glew/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/gl_glew/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/gl_glew/Evas_Engine_GL_Glew.h b/src/modules/engines/gl_glew/Evas_Engine_GL_Glew.h new file mode 100644 index 0000000..c254fd0 --- /dev/null +++ b/src/modules/engines/gl_glew/Evas_Engine_GL_Glew.h @@ -0,0 +1,26 @@ +#ifndef __EVAS_ENGINE_GL_GLEW_H__ +#define __EVAS_ENGINE_GL_GLEW_H__ + + +#define WIN32_LEAN_AND_MEAN +#include +#undef WIN32_LEAN_AND_MEAN + + +typedef struct _Evas_Engine_Info_GL_Glew Evas_Engine_Info_GL_Glew; + +struct _Evas_Engine_Info_GL_Glew +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + /* engine specific data & parameters it needs to set up */ + struct { + HWND window; + int depth; + } info; +}; + + +#endif /* __EVAS_ENGINE_GL_GLEW_H__ */ diff --git a/src/modules/engines/gl_glew/Makefile.am b/src/modules/engines/gl_glew/Makefile.am new file mode 100644 index 0000000..aad714f --- /dev/null +++ b/src/modules/engines/gl_glew/Makefile.am @@ -0,0 +1,35 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines/gl_common \ +@FREETYPE_CFLAGS@ + +if BUILD_ENGINE_GL_GLEW + +pkgdir = $(libdir)/evas/modules/engines/gl_glew/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = \ +evas_engine.h \ +evas_engine.c \ +evas_glew_main.c + +module_la_LIBADD = $(top_builddir)/src/modules/engines/gl_common/libevas_engine_gl_common.la $(top_builddir)/src/lib/libevas.la @gl_libs@ @glew_libs@ +module_la_LDFLAGS = @lt_no_undefined@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_GL_Glew.h + +endif + +EXTRA_DIST = \ +evas_engine.h \ +evas_engine.c \ +evas_glew_main.c \ +Evas_Engine_GL_Glew.h diff --git a/src/modules/engines/gl_glew/evas_engine.c b/src/modules/engines/gl_glew/evas_engine.c new file mode 100644 index 0000000..33f790e --- /dev/null +++ b/src/modules/engines/gl_glew/evas_engine.c @@ -0,0 +1,970 @@ +#include "evas_engine.h" +#include "Evas_Engine_GL_Glew.h" + + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func, pfunc; + +typedef struct _Render_Engine Render_Engine; + +struct _Render_Engine +{ + HWND win; + HDC dc; + HGLRC context; + Evas_GL_Glew_Window *window; + int end; +}; + +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_GL_Glew *info; + + info = calloc(1, sizeof(Evas_Engine_Info_GL_Glew)); + if (!info) return NULL; + + info->magic.magic = rand(); + + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_GL_Glew *in; + + in = (Evas_Engine_Info_GL_Glew *)info; + free(in); +} + +static void +eng_setup(Evas *e, void *in) +{ + Render_Engine *re; + Evas_Engine_Info_GL_Glew *info; + + info = (Evas_Engine_Info_GL_Glew *)in; + if (!e->engine.data.output) + { + re = calloc(1, sizeof(Render_Engine)); + if (!re) return; + + if (!evas_glew_init(info->info.window, &re->dc, &re->context)) + { + free(re); + e->engine.data.output = NULL; + return; + } + + re->win = info->info.window; + e->engine.data.output = re; + re->window = eng_window_new(info->info.window, + re->dc, + re->context, + info->info.depth, + e->output.w, + e->output.h); + if (!re->window) + { + free(re); + e->engine.data.output = NULL; + return; + } + + evas_common_cpu_init(); + + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + } + else + { + + if (!evas_glew_init(info->info.window, &re->dc, &re->context)) + { + free(re); + e->engine.data.output = NULL; + return; + } + + re->win = info->info.window; + re = e->engine.data.output; + eng_window_free(re->window); + re->window = eng_window_new(info->info.window, + re->dc, + re->context, + info->info.depth, + e->output.w, + e->output.h); + } + if (!e->engine.data.output) return; + + if (!e->engine.data.context) + e->engine.data.context = + e->engine.func->context_new(e->engine.data.output); +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + eng_window_free(re->window); + evas_glew_shutdown(re->win, re->dc, re->context); + free(re); + + evas_common_font_shutdown(); + evas_common_image_shutdown(); +} + +static void +eng_output_resize(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + re->window->width = w; + re->window->height = h; + evas_gl_common_context_resize(re->window->gl_context, w, h); +} + +static void +eng_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static void +eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_gl_common_context_resize(re->window->gl_context, re->window->width, re->window->height); + /* simple bounding box */ + if (!re->window->draw.redraw) + { +#if 0 + re->window->draw.x1 = x; + re->window->draw.y1 = y; + re->window->draw.x2 = x + w - 1; + re->window->draw.y2 = y + h - 1; +#else + re->window->draw.x1 = 0; + re->window->draw.y1 = 0; + re->window->draw.x2 = re->window->width - 1; + re->window->draw.y2 = re->window->height - 1; +#endif + } + else + { + if (x < re->window->draw.x1) re->window->draw.x1 = x; + if (y < re->window->draw.y1) re->window->draw.y1 = y; + if ((x + w - 1) > re->window->draw.x2) re->window->draw.x2 = x + w - 1; + if ((y + h - 1) > re->window->draw.y2) re->window->draw.y2 = y + h - 1; + } + re->window->draw.redraw = 1; +} + +static void +eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + re->window->draw.redraw = 0; +} + +#define SLOW_GL_COPY_RECT 1 + +static void * +eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + /* get the upate rect surface - return engine data as dummy */ + if (!re->window->draw.redraw) + { +// printf("GL: NO updates!\n"); + return NULL; + } +// printf("GL: update....!\n"); +#ifdef SLOW_GL_COPY_RECT + /* if any update - just return the whole canvas - works with swap + * buffers then */ + if (x) *x = 0; + if (y) *y = 0; + if (w) *w = re->window->width; + if (h) *h = re->window->height; + if (cx) *cx = 0; + if (cy) *cy = 0; + if (cw) *cw = re->window->width; + if (ch) *ch = re->window->height; +#else + /* 1 update - INCREDIBLY SLOW if combined with swap_rect in flush. a gl + * problem where there just is no hardware path for somethnig that + * obviously SHOULD be there */ + /* only 1 update to minimise gl context games and rendering multiple update + * regions as evas does with other engines + */ + if (x) *x = re->window->draw.x1; + if (y) *y = re->window->draw.y1; + if (w) *w = re->window->draw.x2 - re->window->draw.x1 + 1; + if (h) *h = re->window->draw.y2 - re->window->draw.y1 + 1; + if (cx) *cx = re->window->draw.x1; + if (cy) *cy = re->window->draw.y1; + if (cw) *cw = re->window->draw.x2 - re->window->draw.x1 + 1; + if (ch) *ch = re->window->draw.y2 - re->window->draw.y1 + 1; +#endif + return re; +} + +static void +eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + /* put back update surface.. in this case just unflag redraw */ + re->window->draw.redraw = 0; + re->window->draw.drew = 1; +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (!re->window->draw.drew) return; + + re->window->draw.drew = 0; + eng_window_use(re->window); + +#ifdef SLOW_GL_COPY_RECT + SwapBuffers(re->dc); +#else + /* SLOW AS ALL HELL */ + evas_gl_common_swap_rect(re->window->gl_context, + re->window->draw.x1, re->window->draw.y1, + re->window->draw.x2 - re->window->draw.x1 + 1, + re->window->draw.y2 - re->window->draw.y1 + 1); +#endif +} + +static void +eng_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static void +eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + /* not used in gl engine */ +} + +static void +eng_context_cutout_clear(void *data, void *context) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + /* not used in gl engine */ +} + +static void +eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + eng_window_use(re->window); + re->window->gl_context->dc = context; + evas_gl_common_rect_draw(re->window->gl_context, x, y, w, h); +} + +static void +eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + re->window->gl_context->dc = context; + evas_gl_common_line_draw(re->window->gl_context, x1, y1, x2, y2); +} + +static void * +eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return evas_gl_common_poly_point_add(polygon, x, y); + +} + +static void * +eng_polygon_points_clear(void *data, void *context, void *polygon) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return evas_gl_common_poly_points_clear(polygon); +} + +static void +eng_polygon_draw(void *data, void *context, void *surface, void *polygon) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + re->window->gl_context->dc = context; + evas_gl_common_poly_draw(re->window->gl_context, polygon); +} + +static void * +eng_gradient_new(void *data) +{ + return evas_gl_common_gradient_new(); +} + +static void +eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta) +{ + evas_gl_common_gradient_color_stop_add(gradient, r, g, b, a, delta); +} + +static void +eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta) +{ + evas_gl_common_gradient_alpha_stop_add(gradient, a, delta); +} + +static void +eng_gradient_clear(void *data, void *gradient) +{ + evas_gl_common_gradient_clear(gradient); +} + +static void +eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha) +{ + evas_gl_common_gradient_color_data_set(gradient, map, len, has_alpha); +} + +static void +eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len) +{ + evas_gl_common_gradient_alpha_data_set(gradient, alpha_map, len); +} + +static void +eng_gradient_free(void *data, void *gradient) +{ + evas_gl_common_gradient_free(gradient); +} + +static void +eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h) +{ + evas_gl_common_gradient_fill_set(gradient, x, y, w, h); +} + +static void +eng_gradient_fill_angle_set(void *data, void *gradient, double angle) +{ + evas_gl_common_gradient_fill_angle_set(gradient, angle); +} + +static void +eng_gradient_fill_spread_set(void *data, void *gradient, int spread) +{ + evas_gl_common_gradient_fill_spread_set(gradient, spread); +} + +static void +eng_gradient_angle_set(void *data, void *gradient, double angle) +{ + evas_gl_common_gradient_map_angle_set(gradient, angle); +} + +static void +eng_gradient_offset_set(void *data, void *gradient, float offset) +{ + evas_gl_common_gradient_map_offset_set(gradient, offset); +} + +static void +eng_gradient_direction_set(void *data, void *gradient, int direction) +{ + evas_gl_common_gradient_map_direction_set(gradient, direction); +} + +static void +eng_gradient_type_set(void *data, void *gradient, char *name, char *params) +{ + evas_gl_common_gradient_type_set(gradient, name, params); +} + +static int +eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h) +{ + Render_Engine *re = (Render_Engine *)data; + + re->window->gl_context->dc = context; + return evas_gl_common_gradient_is_opaque(re->window->gl_context, gradient, x, y, w, h); +} + +static int +eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h) +{ + Render_Engine *re = (Render_Engine *)data; + + re->window->gl_context->dc = context; + return evas_gl_common_gradient_is_visible(re->window->gl_context, gradient, x, y, w, h); +} + +static void +eng_gradient_render_pre(void *data, void *context, void *gradient) +{ + Render_Engine *re = (Render_Engine *)data; + + re->window->gl_context->dc = context; + evas_gl_common_gradient_render_pre(re->window->gl_context, gradient); +} + +static void +eng_gradient_render_post(void *data, void *gradient) +{ + evas_gl_common_gradient_render_post(gradient); +} + +static void +eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + eng_window_use(re->window); + re->window->gl_context->dc = context; + evas_gl_common_gradient_draw(re->window->gl_context, gradient, x, y, w, h); +} + +static int +eng_image_alpha_get(void *data, void *image) +{ + Render_Engine *re; + Evas_GL_Image *im; + + re = (Render_Engine *)data; + if (!image) return 1; + im = image; + /* FIXME: can move to gl_common */ + switch (im->cs.space) + { + case EVAS_COLORSPACE_ARGB8888: + if (im->im->cache_entry.flags.alpha) return 1; + default: + break; + } + return 0; +} + +static int +eng_image_colorspace_get(void *data, void *image) +{ + Render_Engine *re; + Evas_GL_Image *im; + + re = (Render_Engine *)data; + if (!image) return EVAS_COLORSPACE_ARGB8888; + im = image; + return im->cs.space; +} + +static void * +eng_image_alpha_set(void *data, void *image, int has_alpha) +{ + Render_Engine *re; + Evas_GL_Image *im; + + re = (Render_Engine *)data; + if (!image) return NULL; + eng_window_use(re->window); + im = image; + /* FIXME: can move to gl_common */ + if (im->cs.space != EVAS_COLORSPACE_ARGB8888) return im; + if ((has_alpha) && (im->im->cache_entry.flags.alpha)) return image; + else if ((!has_alpha) && (!im->im->cache_entry.flags.alpha)) return image; + if (im->references > 1) + { + Evas_GL_Image *im_new; + + im_new = evas_gl_common_image_new_from_copied_data(im->gc, im->im->cache_entry.w, im->im->cache_entry.h, im->im->image.data, + eng_image_alpha_get(data, image), + eng_image_colorspace_get(data, image)); + if (!im_new) return im; + evas_gl_common_image_free(im); + im = im_new; + } + else + evas_gl_common_image_dirty(im); + im->im->cache_entry.flags.alpha = has_alpha ? 1 : 0; + return image; +} + +static void * +eng_image_border_set(void *data, void *image, int l, int r, int t, int b) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return image; +} + +static void +eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static char * +eng_image_comment_get(void *data, void *image, char *key) +{ + Render_Engine *re; + Evas_GL_Image *im; + + re = (Render_Engine *)data; + if (!image) return NULL; + im = image; + return im->im->info.comment; +} + +static char * +eng_image_format_get(void *data, void *image) +{ + Render_Engine *re; + Evas_GL_Image *im; + + re = (Render_Engine *)data; + im = image; + return NULL; +} + +static void +eng_image_colorspace_set(void *data, void *image, int cspace) +{ + Render_Engine *re; + Evas_GL_Image *im; + + re = (Render_Engine *)data; + if (!image) return; + im = image; + /* FIXME: can move to gl_common */ + if (im->cs.space == cspace) return; + evas_cache_image_colorspace(&im->im->cache_entry, cspace); + switch (cspace) + { + case EVAS_COLORSPACE_ARGB8888: + if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + im->cs.data = NULL; + im->cs.no_free = 0; + } + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if (im->tex) evas_gl_common_texture_free(im->tex); + im->tex = NULL; + if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + } + im->cs.data = calloc(1, im->im->cache_entry.h * sizeof(unsigned char *) * 2); + im->cs.no_free = 0; + break; + default: + abort(); + break; + } + im->cs.space = cspace; +} + +static void +eng_image_native_set(void *data, void *image, void *native) +{ +} + +static void * +eng_image_native_get(void *data, void *image) +{ + return NULL; +} + +static void * +eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + *error = 0; + eng_window_use(re->window); + return evas_gl_common_image_load(re->window->gl_context, file, key, lo); +} + +static void * +eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + eng_window_use(re->window); + return evas_gl_common_image_new_from_data(re->window->gl_context, w, h, image_data, alpha, cspace); +} + +static void * +eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + eng_window_use(re->window); + return evas_gl_common_image_new_from_copied_data(re->window->gl_context, w, h, image_data, alpha, cspace); +} + +static void +eng_image_free(void *data, void *image) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (!image) return; + eng_window_use(re->window); + evas_gl_common_image_free(image); +} + +static void +eng_image_size_get(void *data, void *image, int *w, int *h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (!image) + { + *w = 0; + *h = 0; + return; + } + if (w) *w = ((Evas_GL_Image *)image)->im->cache_entry.w; + if (h) *h = ((Evas_GL_Image *)image)->im->cache_entry.h; + +} + +static void * +eng_image_size_set(void *data, void *image, int w, int h) +{ + Render_Engine *re; + Evas_GL_Image *im, *im_old; + + re = (Render_Engine *)data; + if (!image) return NULL; + eng_window_use(re->window); + im_old = image; + if ((eng_image_colorspace_get(data, image) == EVAS_COLORSPACE_YCBCR422P601_PL) || + (eng_image_colorspace_get(data, image) == EVAS_COLORSPACE_YCBCR422P709_PL)) + w &= ~0x1; + if ((im_old) && (im_old->im->cache_entry.w == w) && (im_old->im->cache_entry.h == h)) + + return image; + if (im_old) + { + im = evas_gl_common_image_new(re->window->gl_context, w, h, + eng_image_alpha_get(data, image), + eng_image_colorspace_get(data, image)); +/* + evas_common_load_image_data_from_file(im_old->im); + if (im_old->im->image->data) + { + evas_common_blit_rectangle(im_old->im, im->im, 0, 0, w, h, 0, 0); + evas_common_cpu_end_opt(); + } + */ + evas_gl_common_image_free(im_old); + } + else + im = evas_gl_common_image_new(re->window->gl_context, w, h, 1, EVAS_COLORSPACE_ARGB8888); + return im; +} + +static void * +eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (!image) return NULL; + evas_gl_common_image_dirty(image); + return image; +} + +static void * +eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data) +{ + Render_Engine *re; + Evas_GL_Image *im; + + re = (Render_Engine *)data; + if (!image) + { + *image_data = NULL; + return NULL; + } + im = image; + eng_window_use(re->window); + evas_cache_image_load_data(&im->im->cache_entry); + switch (im->cs.space) + { + case EVAS_COLORSPACE_ARGB8888: + if (to_write) + { + if (im->references > 1) + { + Evas_GL_Image *im_new; + + im_new = evas_gl_common_image_new_from_copied_data(im->gc, im->im->cache_entry.w, im->im->cache_entry.h, im->im->image.data, + eng_image_alpha_get(data, image), + eng_image_colorspace_get(data, image)); + if (!im_new) + { + *image_data = NULL; + return im; + } + evas_gl_common_image_free(im); + im = im_new; + } + else + evas_gl_common_image_dirty(im); + } + *image_data = im->im->image.data; + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + *image_data = im->cs.data; + break; + default: + abort(); + break; + } + return im; +} + +static void * +eng_image_data_put(void *data, void *image, DATA32 *image_data) +{ + Render_Engine *re; + Evas_GL_Image *im, *im2; + + re = (Render_Engine *)data; + if (!image) return NULL; + im = image; + eng_window_use(re->window); + switch (im->cs.space) + { + case EVAS_COLORSPACE_ARGB8888: + if (image_data != im->im->image.data) + { + int w, h; + + w = im->im->cache_entry.w; + h = im->im->cache_entry.h; + im2 = eng_image_new_from_data(data, w, h, image_data, + eng_image_alpha_get(data, image), + eng_image_colorspace_get(data, image)); + if (!im2) return im; + evas_gl_common_image_free(im); + im = im2; + } + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if (image_data != im->cs.data) + { + if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + } + im->cs.data = image_data; + } + break; + default: + abort(); + break; + } + /* hmmm - but if we wrote... why bother? */ + evas_gl_common_image_dirty(im); + return im; +} + +static void +eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (!image) return; + eng_window_use(re->window); + re->window->gl_context->dc = context; + evas_gl_common_image_draw(re->window->gl_context, image, + src_x, src_y, src_w, src_h, + dst_x, dst_y, dst_w, dst_h, + smooth); +} + +static void +eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + { + static RGBA_Image *im = NULL; + + if (!im) + im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); + if (!im) return ; + evas_cache_image_surface_alloc(&im->cache_entry, re->window->width, re->window->height); + + evas_common_draw_context_font_ext_set(context, + re->window->gl_context, + evas_gl_font_texture_new, + evas_gl_font_texture_free, + evas_gl_font_texture_draw); + evas_common_font_draw(im, context, font, x, y, text); + evas_common_draw_context_font_ext_set(context, + NULL, + NULL, + NULL, + NULL); + } +} + + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ + #define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(context_cutout_add); + ORD(context_cutout_clear); + ORD(output_flush); + ORD(output_idle_flush); + ORD(rectangle_draw); + ORD(line_draw); + ORD(polygon_point_add); + ORD(polygon_points_clear); + ORD(polygon_draw); + ORD(gradient_new); + ORD(gradient_free); + ORD(gradient_color_stop_add); + ORD(gradient_alpha_stop_add); + ORD(gradient_color_data_set); + ORD(gradient_alpha_data_set); + ORD(gradient_clear); + ORD(gradient_fill_set); + ORD(gradient_fill_angle_set); + ORD(gradient_fill_spread_set); + ORD(gradient_angle_set); + ORD(gradient_offset_set); + ORD(gradient_direction_set); + ORD(gradient_type_set); + ORD(gradient_is_opaque); + ORD(gradient_is_visible); + ORD(gradient_render_pre); + ORD(gradient_render_post); + ORD(gradient_draw); + ORD(image_load); + ORD(image_new_from_data); + ORD(image_new_from_copied_data); + ORD(image_free); + ORD(image_size_get); + ORD(image_size_set); + ORD(image_dirty_region); + ORD(image_data_get); + ORD(image_data_put); + ORD(image_alpha_set); + ORD(image_alpha_get); + ORD(image_border_set); + ORD(image_border_get); + ORD(image_draw); + ORD(image_comment_get); + ORD(image_format_get); + ORD(image_colorspace_set); + ORD(image_colorspace_get); + ORD(image_native_set); + ORD(image_native_get); + ORD(font_draw); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "gl_glew", + "none" +}; diff --git a/src/modules/engines/gl_glew/evas_engine.h b/src/modules/engines/gl_glew/evas_engine.h new file mode 100644 index 0000000..8df1782 --- /dev/null +++ b/src/modules/engines/gl_glew/evas_engine.h @@ -0,0 +1,47 @@ +#ifndef __EVAS_ENGINE_H__ +#define __EVAS_ENGINE_H__ + +#include + +#include "evas_gl_common.h" + + +typedef struct _Evas_GL_Glew_Window Evas_GL_Glew_Window; + +struct _Evas_GL_Glew_Window +{ + HWND window; + HDC dc; + HGLRC context; + int width; + int height; + int depth; + Evas_GL_Context *gl_context; + struct { + int x1; + int y1; + int x2; + int y2; + int redraw : 1; + int drew : 1; + } draw; +}; + +int evas_glew_init(HWND window, HDC *dc, HGLRC *context); + +void evas_glew_shutdown(HWND window, + HDC dc, + HGLRC context); + +Evas_GL_Glew_Window *eng_window_new(HWND window, + HDC dc, + HGLRC context, + int depth, + int width, + int height); + +void eng_window_free(Evas_GL_Glew_Window *gw); +void eng_window_use(Evas_GL_Glew_Window *gw); + + +#endif /* __EVAS_ENGINE_H__ */ diff --git a/src/modules/engines/gl_glew/evas_glew_main.c b/src/modules/engines/gl_glew/evas_glew_main.c new file mode 100644 index 0000000..1981719 --- /dev/null +++ b/src/modules/engines/gl_glew/evas_glew_main.c @@ -0,0 +1,118 @@ +#include "evas_common.h" +#include "evas_engine.h" +#include "Evas_Engine_GL_Glew.h" + + +static Evas_GL_Glew_Window *_evas_gl_glew_window = NULL; + +int +evas_glew_init(HWND window, HDC *dc, HGLRC *context) +{ + PIXELFORMATDESCRIPTOR pfd; + int format; + + *dc = GetDC(window); + if (!*dc) + goto no_dc; + + ZeroMemory(&pfd, sizeof (pfd)); + pfd.nSize = sizeof (pfd); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = 24; + pfd.cDepthBits = 32; + pfd.iLayerType = PFD_MAIN_PLANE; + + format = ChoosePixelFormat(*dc, &pfd); + if (!format) + goto no_format; + + SetPixelFormat(*dc, format, &pfd); + + if (pfd.iPixelType != PFD_TYPE_RGBA) + goto no_format; + + *context = wglCreateContext(*dc); + if (!*context) + goto no_format; + + wglMakeCurrent(*dc, *context); + + if (glewInit() != GLEW_OK) + goto glew_init_failed; + + if (GLEW_VERSION_2_0) + { + printf ("2.0\n"); + } + + return 1; + + glew_init_failed: + wglMakeCurrent(NULL, NULL); + wglDeleteContext(*context); + no_format: + ReleaseDC(window, *dc); + no_dc: + + return 0; +} + +void +evas_glew_shutdown(HWND window, + HDC dc, + HGLRC context) +{ + wglMakeCurrent(NULL, NULL); + wglDeleteContext(context); + ReleaseDC(window, dc); +} + +Evas_GL_Glew_Window * +eng_window_new(HWND window, + HDC dc, + HGLRC context, + int depth, + int width, + int height) +{ + Evas_GL_Glew_Window *gw; + + gw = calloc(1, sizeof(Evas_GL_Glew_Window)); + if (!gw) return NULL; + + gw->window = window; + gw->dc = dc; + gw->context = context; + gw->depth = depth; + + gw->gl_context = evas_gl_common_context_new(); + if (!gw->gl_context) + { + free(gw); + return NULL; + } + evas_gl_common_context_resize(gw->gl_context, width, height); + + return gw; +} + +void +eng_window_free(Evas_GL_Glew_Window *gw) +{ + if (gw == _evas_gl_glew_window) _evas_gl_glew_window = NULL; + evas_gl_common_context_free(gw->gl_context); + free(gw); +} + +void +eng_window_use(Evas_GL_Glew_Window *gw) +{ + if (_evas_gl_glew_window != gw) + { + _evas_gl_glew_window = gw; + wglMakeCurrent(gw->dc, gw->context); + } + evas_gl_common_context_use(gw->gl_context); +} diff --git a/src/modules/engines/gl_x11/.cvsignore b/src/modules/engines/gl_x11/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/gl_x11/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/gl_x11/Evas_Engine_GL_X11.h b/src/modules/engines/gl_x11/Evas_Engine_GL_X11.h new file mode 100644 index 0000000..853c2d9 --- /dev/null +++ b/src/modules/engines/gl_x11/Evas_Engine_GL_X11.h @@ -0,0 +1,32 @@ +#ifndef _EVAS_ENGINE_GL_X11_H +#define _EVAS_ENGINE_GL_X11_H + +#include + +typedef struct _Evas_Engine_Info_GL_X11 Evas_Engine_Info_GL_X11; + +struct _Evas_Engine_Info_GL_X11 +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + /* engine specific data & parameters it needs to set up */ + struct { + Display *display; + Drawable drawable; + Visual *visual; + Colormap colormap; + int depth; + } info; + /* engine specific function calls to query stuff about the destination */ + /* engine (what visual & colormap & depth to use, performance info etc. */ + struct { + Visual * (*best_visual_get) (Display *disp, int screen); + Colormap (*best_colormap_get) (Display *disp, int screen); + int (*best_depth_get) (Display *disp, int screen); + } func; +}; +#endif + + diff --git a/src/modules/engines/gl_x11/Makefile.am b/src/modules/engines/gl_x11/Makefile.am new file mode 100644 index 0000000..c058220 --- /dev/null +++ b/src/modules/engines/gl_x11/Makefile.am @@ -0,0 +1,37 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines/gl_common \ +@FREETYPE_CFLAGS@ \ +@x_cflags@ \ +@gl_cflags@ + +if BUILD_ENGINE_GL_X11 + +pkgdir = $(libdir)/evas/modules/engines/gl_x11/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = \ +evas_engine.h \ +evas_engine.c \ +evas_x_main.c + +module_la_LIBADD = @gl_libs@ @x_libs@ $(top_builddir)/src/modules/engines/gl_common/libevas_engine_gl_common.la $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_GL_X11.h + +endif + +EXTRA_DIST = \ +evas_engine.h \ +evas_engine.c \ +evas_x_main.c \ +Evas_Engine_GL_X11.h diff --git a/src/modules/engines/gl_x11/evas_engine.c b/src/modules/engines/gl_x11/evas_engine.c new file mode 100644 index 0000000..a236a53 --- /dev/null +++ b/src/modules/engines/gl_x11/evas_engine.c @@ -0,0 +1,1026 @@ +#ifdef HAVE_GL_GLEW_H +# include +#else +# include +#endif + +#include "evas_gl_common.h" + +#include +#include +#include + +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_GL_X11.h" + + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func, pfunc; + +static Visual *eng_best_visual_get(Display *disp, int screen); +static Colormap eng_best_colormap_get(Display *disp, int screen); +static int eng_best_depth_get(Display *disp, int screen); + +typedef struct _Render_Engine Render_Engine; + +struct _Render_Engine +{ + Evas_GL_X11_Window *win; + int end; +}; + +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_GL_X11 *info; + + info = calloc(1, sizeof(Evas_Engine_Info_GL_X11)); + if (!info) return NULL; + info->magic.magic = rand(); + info->func.best_visual_get = eng_best_visual_get; + info->func.best_colormap_get = eng_best_colormap_get; + info->func.best_depth_get = eng_best_depth_get; + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_GL_X11 *in; + + in = (Evas_Engine_Info_GL_X11 *)info; + free(in); +} + +static void +eng_setup(Evas *e, void *in) +{ + Render_Engine *re; + Evas_Engine_Info_GL_X11 *info; + int eb, evb; + + info = (Evas_Engine_Info_GL_X11 *)in; + if (!e->engine.data.output) + { + if (!glXQueryExtension(info->info.display, &eb, &evb)) return; + re = calloc(1, sizeof(Render_Engine)); + if (!re) return; + e->engine.data.output = re; + re->win = eng_window_new(info->info.display, + info->info.drawable, + 0 /* FIXME: screen 0 assumption */, + info->info.visual, + info->info.colormap, + info->info.depth, + e->output.w, + e->output.h); + if (!re->win) + { + free(re); + e->engine.data.output = NULL; + return; + } + + evas_common_cpu_init(); + + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + } + else + { + re = e->engine.data.output; + eng_window_free(re->win); + re->win = eng_window_new(info->info.display, + info->info.drawable, + 0,/* FIXME: screen 0 assumption */ + info->info.visual, + info->info.colormap, + info->info.depth, + e->output.w, + e->output.h); + } + if (!e->engine.data.output) return; + if (!e->engine.data.context) + e->engine.data.context = + e->engine.func->context_new(e->engine.data.output); +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + eng_window_free(re->win); + free(re); + + evas_common_font_shutdown(); + evas_common_image_shutdown(); +} + +static void +eng_output_resize(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + re->win->w = w; + re->win->h = h; + evas_gl_common_context_resize(re->win->gl_context, w, h); +} + +static void +eng_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static void +eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_gl_common_context_resize(re->win->gl_context, re->win->w, re->win->h); + /* smple bounding box */ + if (!re->win->draw.redraw) + { +#if 0 + re->win->draw.x1 = x; + re->win->draw.y1 = y; + re->win->draw.x2 = x + w - 1; + re->win->draw.y2 = y + h - 1; +#else + re->win->draw.x1 = 0; + re->win->draw.y1 = 0; + re->win->draw.x2 = re->win->w - 1; + re->win->draw.y2 = re->win->h - 1; +#endif + } + else + { + if (x < re->win->draw.x1) re->win->draw.x1 = x; + if (y < re->win->draw.y1) re->win->draw.y1 = y; + if ((x + w - 1) > re->win->draw.x2) re->win->draw.x2 = x + w - 1; + if ((y + h - 1) > re->win->draw.y2) re->win->draw.y2 = y + h - 1; + } + re->win->draw.redraw = 1; +} + +static void +eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + re->win->draw.redraw = 0; +// printf("GL: finish update cycle!\n"); +} + +/* at least the nvidia drivers are so abysmal that copying from the backbuffer + * to the front using glCopyPixels() that you literally can WATCH it draw the + * pixels slowly across the screen with a window update taking multiple + * seconds - so workaround by doing a full buffer render as frankly GL isn't + * up to doing anything that isn't done by quake (etc.) + */ +#define SLOW_GL_COPY_RECT 1 +/* vsync games - not for now though */ +//#define VSYNC_TO_SCREEN 1 + +static void * +eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + /* get the upate rect surface - return engine data as dummy */ + if (!re->win->draw.redraw) + { +// printf("GL: NO updates!\n"); + return NULL; + } +// printf("GL: update....!\n"); +#ifdef SLOW_GL_COPY_RECT + /* if any update - just return the whole canvas - works with swap + * buffers then */ + if (x) *x = 0; + if (y) *y = 0; + if (w) *w = re->win->w; + if (h) *h = re->win->h; + if (cx) *cx = 0; + if (cy) *cy = 0; + if (cw) *cw = re->win->w; + if (ch) *ch = re->win->h; +#else + /* 1 update - INCREDIBLY SLOW if combined with swap_rect in flush. a gl + * problem where there just is no hardware path for somethnig that + * obviously SHOULD be there */ + /* only 1 update to minimise gl context games and rendering multiple update + * regions as evas does with other engines + */ + if (x) *x = re->win->draw.x1; + if (y) *y = re->win->draw.y1; + if (w) *w = re->win->draw.x2 - re->win->draw.x1 + 1; + if (h) *h = re->win->draw.y2 - re->win->draw.y1 + 1; + if (cx) *cx = re->win->draw.x1; + if (cy) *cy = re->win->draw.y1; + if (cw) *cw = re->win->draw.x2 - re->win->draw.x1 + 1; + if (ch) *ch = re->win->draw.y2 - re->win->draw.y1 + 1; +#endif + return re; +} + +static void +eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + /* put back update surface.. in this case just unflag redraw */ +// printf("GL: update done.\n"); + re->win->draw.redraw = 0; + re->win->draw.drew = 1; +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (!re->win->draw.drew) return; + re->win->draw.drew = 0; +// printf("GL: flush your mush!\n"); + eng_window_use(re->win); + +#ifdef VSYNC_TO_SCREEN + glFlush(); + { + unsigned int rc; + + glXGetVideoSyncSGI(&rc); + glXWaitVideoSyncSGI(2, (rc + 1) % 2, &rc); + } +#endif +#ifdef SLOW_GL_COPY_RECT + glXSwapBuffers(re->win->disp, re->win->win); +#else + /* SLOW AS ALL HELL! */ + evas_gl_common_swap_rect(re->win->gl_context, + re->win->draw.x1, re->win->draw.y1, + re->win->draw.x2 - re->win->draw.x1 + 1, + re->win->draw.y2 - re->win->draw.y1 + 1); +#endif +// glFlush(); +// glXWaitGL(); +// XSync(re->win->disp, False); +// printf("SYNC! %i\n", fr++); +} + +static void +eng_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static void +eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + /* not used in gl engine */ +} + +static void +eng_context_cutout_clear(void *data, void *context) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + /* not used in gl engine */ +} + +static void +eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + eng_window_use(re->win); + re->win->gl_context->dc = context; + evas_gl_common_rect_draw(re->win->gl_context, x, y, w, h); +} + +static void +eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + re->win->gl_context->dc = context; + evas_gl_common_line_draw(re->win->gl_context, x1, y1, x2, y2); +} + +static void * +eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return evas_gl_common_poly_point_add(polygon, x, y); + +} + +static void * +eng_polygon_points_clear(void *data, void *context, void *polygon) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return evas_gl_common_poly_points_clear(polygon); +} + +static void +eng_polygon_draw(void *data, void *context, void *surface, void *polygon) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + re->win->gl_context->dc = context; + evas_gl_common_poly_draw(re->win->gl_context, polygon); +} + +static void * +eng_gradient_new(void *data) +{ + return evas_gl_common_gradient_new(); +} + +static void +eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta) +{ + evas_gl_common_gradient_color_stop_add(gradient, r, g, b, a, delta); +} + +static void +eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta) +{ + evas_gl_common_gradient_alpha_stop_add(gradient, a, delta); +} + +static void +eng_gradient_clear(void *data, void *gradient) +{ + evas_gl_common_gradient_clear(gradient); +} + +static void +eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha) +{ + evas_gl_common_gradient_color_data_set(gradient, map, len, has_alpha); +} + +static void +eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len) +{ + evas_gl_common_gradient_alpha_data_set(gradient, alpha_map, len); +} + +static void +eng_gradient_free(void *data, void *gradient) +{ + evas_gl_common_gradient_free(gradient); +} + +static void +eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h) +{ + evas_gl_common_gradient_fill_set(gradient, x, y, w, h); +} + +static void +eng_gradient_fill_angle_set(void *data, void *gradient, double angle) +{ + evas_gl_common_gradient_fill_angle_set(gradient, angle); +} + +static void +eng_gradient_fill_spread_set(void *data, void *gradient, int spread) +{ + evas_gl_common_gradient_fill_spread_set(gradient, spread); +} + +static void +eng_gradient_angle_set(void *data, void *gradient, double angle) +{ + evas_gl_common_gradient_map_angle_set(gradient, angle); +} + +static void +eng_gradient_offset_set(void *data, void *gradient, float offset) +{ + evas_gl_common_gradient_map_offset_set(gradient, offset); +} + +static void +eng_gradient_direction_set(void *data, void *gradient, int direction) +{ + evas_gl_common_gradient_map_direction_set(gradient, direction); +} + +static void +eng_gradient_type_set(void *data, void *gradient, char *name, char *params) +{ + evas_gl_common_gradient_type_set(gradient, name, params); +} + +static int +eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h) +{ + Render_Engine *re = (Render_Engine *)data; + + re->win->gl_context->dc = context; + return evas_gl_common_gradient_is_opaque(re->win->gl_context, gradient, x, y, w, h); +} + +static int +eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h) +{ + Render_Engine *re = (Render_Engine *)data; + + re->win->gl_context->dc = context; + return evas_gl_common_gradient_is_visible(re->win->gl_context, gradient, x, y, w, h); +} + +static void +eng_gradient_render_pre(void *data, void *context, void *gradient) +{ + Render_Engine *re = (Render_Engine *)data; + + re->win->gl_context->dc = context; + evas_gl_common_gradient_render_pre(re->win->gl_context, gradient); +} + +static void +eng_gradient_render_post(void *data, void *gradient) +{ + evas_gl_common_gradient_render_post(gradient); +} + +static void +eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + eng_window_use(re->win); + re->win->gl_context->dc = context; + evas_gl_common_gradient_draw(re->win->gl_context, gradient, x, y, w, h); +} + +static int +eng_image_alpha_get(void *data, void *image) +{ + Render_Engine *re; + Evas_GL_Image *im; + + re = (Render_Engine *)data; + if (!image) return 1; + im = image; + /* FIXME: can move to gl_common */ + switch (im->cs.space) + { + case EVAS_COLORSPACE_ARGB8888: + if (im->im->cache_entry.flags.alpha) return 1; + default: + break; + } + return 0; +} + +static int +eng_image_colorspace_get(void *data, void *image) +{ + Render_Engine *re; + Evas_GL_Image *im; + + re = (Render_Engine *)data; + if (!image) return EVAS_COLORSPACE_ARGB8888; + im = image; + return im->cs.space; +} + +static void * +eng_image_alpha_set(void *data, void *image, int has_alpha) +{ + Render_Engine *re; + Evas_GL_Image *im; + + re = (Render_Engine *)data; + if (!image) return NULL; + eng_window_use(re->win); + im = image; + /* FIXME: can move to gl_common */ + if (im->cs.space != EVAS_COLORSPACE_ARGB8888) return im; + if ((has_alpha) && (im->im->cache_entry.flags.alpha)) return image; + else if ((!has_alpha) && (!im->im->cache_entry.flags.alpha)) return image; + if (im->references > 1) + { + Evas_GL_Image *im_new; + + im_new = evas_gl_common_image_new_from_copied_data(im->gc, im->im->cache_entry.w, im->im->cache_entry.h, im->im->image.data, + eng_image_alpha_get(data, image), + eng_image_colorspace_get(data, image)); + if (!im_new) return im; + evas_gl_common_image_free(im); + im = im_new; + } + else + evas_gl_common_image_dirty(im); + im->im->cache_entry.flags.alpha = has_alpha ? 1 : 0; + return image; +} + +static void * +eng_image_border_set(void *data, void *image, int l, int r, int t, int b) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return image; +} + +static void +eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static char * +eng_image_comment_get(void *data, void *image, char *key) +{ + Render_Engine *re; + Evas_GL_Image *im; + + re = (Render_Engine *)data; + if (!image) return NULL; + im = image; + return im->im->info.comment; +} + +static char * +eng_image_format_get(void *data, void *image) +{ + Render_Engine *re; + Evas_GL_Image *im; + + re = (Render_Engine *)data; + im = image; + return NULL; +} + +static void +eng_image_colorspace_set(void *data, void *image, int cspace) +{ + Render_Engine *re; + Evas_GL_Image *im; + + re = (Render_Engine *)data; + if (!image) return; + im = image; + /* FIXME: can move to gl_common */ + if (im->cs.space == cspace) return; + evas_cache_image_colorspace(&im->im->cache_entry, cspace); + switch (cspace) + { + case EVAS_COLORSPACE_ARGB8888: + if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + im->cs.data = NULL; + im->cs.no_free = 0; + } + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if (im->tex) evas_gl_common_texture_free(im->tex); + im->tex = NULL; + if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + } + im->cs.data = calloc(1, im->im->cache_entry.h * sizeof(unsigned char *) * 2); + im->cs.no_free = 0; + break; + default: + abort(); + break; + } + im->cs.space = cspace; +} + +static void +eng_image_native_set(void *data, void *image, void *native) +{ +} + +static void * +eng_image_native_get(void *data, void *image) +{ + return NULL; +} + +static void * +eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + *error = 0; + eng_window_use(re->win); + return evas_gl_common_image_load(re->win->gl_context, file, key, lo); +} + +static void * +eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + eng_window_use(re->win); + return evas_gl_common_image_new_from_data(re->win->gl_context, w, h, image_data, alpha, cspace); +} + +static void * +eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + eng_window_use(re->win); + return evas_gl_common_image_new_from_copied_data(re->win->gl_context, w, h, image_data, alpha, cspace); +} + +static void +eng_image_free(void *data, void *image) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (!image) return; + eng_window_use(re->win); + evas_gl_common_image_free(image); +} + +static void +eng_image_size_get(void *data, void *image, int *w, int *h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (!image) + { + *w = 0; + *h = 0; + return; + } + if (w) *w = ((Evas_GL_Image *)image)->im->cache_entry.w; + if (h) *h = ((Evas_GL_Image *)image)->im->cache_entry.h; +} + +static void * +eng_image_size_set(void *data, void *image, int w, int h) +{ + Render_Engine *re; + Evas_GL_Image *im, *im_old; + + re = (Render_Engine *)data; + if (!image) return NULL; + eng_window_use(re->win); + im_old = image; + if ((eng_image_colorspace_get(data, image) == EVAS_COLORSPACE_YCBCR422P601_PL) || + (eng_image_colorspace_get(data, image) == EVAS_COLORSPACE_YCBCR422P709_PL)) + w &= ~0x1; + if ((im_old) && (im_old->im->cache_entry.w == w) && (im_old->im->cache_entry.h == h)) + return image; + if (im_old) + { + im = evas_gl_common_image_new(re->win->gl_context, w, h, + eng_image_alpha_get(data, image), + eng_image_colorspace_get(data, image)); +/* + evas_common_load_image_data_from_file(im_old->im); + if (im_old->im->image->data) + { + evas_common_blit_rectangle(im_old->im, im->im, 0, 0, w, h, 0, 0); + evas_common_cpu_end_opt(); + } + */ + evas_gl_common_image_free(im_old); + } + else + im = evas_gl_common_image_new(re->win->gl_context, w, h, 1, EVAS_COLORSPACE_ARGB8888); + return im; +} + +static void * +eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (!image) return NULL; + evas_gl_common_image_dirty(image); + return image; +} + +static void * +eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data) +{ + Render_Engine *re; + Evas_GL_Image *im; + + re = (Render_Engine *)data; + if (!image) + { + *image_data = NULL; + return NULL; + } + im = image; + eng_window_use(re->win); + evas_cache_image_load_data(&im->im->cache_entry); + switch (im->cs.space) + { + case EVAS_COLORSPACE_ARGB8888: + if (to_write) + { + if (im->references > 1) + { + Evas_GL_Image *im_new; + + im_new = evas_gl_common_image_new_from_copied_data(im->gc, im->im->cache_entry.w, im->im->cache_entry.h, im->im->image.data, + eng_image_alpha_get(data, image), + eng_image_colorspace_get(data, image)); + if (!im_new) + { + *image_data = NULL; + return im; + } + evas_gl_common_image_free(im); + im = im_new; + } + else + evas_gl_common_image_dirty(im); + } + *image_data = im->im->image.data; + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + *image_data = im->cs.data; + break; + default: + abort(); + break; + } + return im; +} + +static void * +eng_image_data_put(void *data, void *image, DATA32 *image_data) +{ + Render_Engine *re; + Evas_GL_Image *im, *im2; + + re = (Render_Engine *)data; + if (!image) return NULL; + im = image; + eng_window_use(re->win); + switch (im->cs.space) + { + case EVAS_COLORSPACE_ARGB8888: + if (image_data != im->im->image.data) + { + int w, h; + + w = im->im->cache_entry.w; + h = im->im->cache_entry.h; + im2 = eng_image_new_from_data(data, w, h, image_data, + eng_image_alpha_get(data, image), + eng_image_colorspace_get(data, image)); + if (!im2) return im; + evas_gl_common_image_free(im); + im = im2; + } + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if (image_data != im->cs.data) + { + if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + } + im->cs.data = image_data; + } + break; + default: + abort(); + break; + } + /* hmmm - but if we wrote... why bother? */ + evas_gl_common_image_dirty(im); + return im; +} + +static void +eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (!image) return; + eng_window_use(re->win); + re->win->gl_context->dc = context; + evas_gl_common_image_draw(re->win->gl_context, image, + src_x, src_y, src_w, src_h, + dst_x, dst_y, dst_w, dst_h, + smooth); +} + +static void +eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + { + static RGBA_Image *im = NULL; + + if (!im) + im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); + evas_cache_image_surface_alloc(&im->cache_entry, re->win->w, re->win->h); + + evas_common_draw_context_font_ext_set(context, + re->win->gl_context, + evas_gl_font_texture_new, + evas_gl_font_texture_free, + evas_gl_font_texture_draw); + evas_common_font_draw(im, context, font, x, y, text); + evas_common_draw_context_font_ext_set(context, + NULL, + NULL, + NULL, + NULL); + } +} + +/* private engine functions the calling prog can use */ + +static Visual * +eng_best_visual_get(Display *disp, int screen) +{ + if (!disp) return NULL; + if (!_evas_gl_x11_vi) + _evas_gl_x11_vi = glXChooseVisual(disp, screen, + _evas_gl_x11_configuration); + if (!_evas_gl_x11_vi) return NULL; + return _evas_gl_x11_vi->visual; +} + +static Colormap +eng_best_colormap_get(Display *disp, int screen) +{ + if (!disp) return 0; + if (!_evas_gl_x11_vi) + eng_best_visual_get(disp, screen); + if (!_evas_gl_x11_vi) return 0; + _evas_gl_x11_cmap = XCreateColormap(disp, RootWindow(disp, screen), + _evas_gl_x11_vi->visual, 0); + return _evas_gl_x11_cmap; +} + +static int +eng_best_depth_get(Display *disp, int screen) +{ + if (!disp) return 0; + if (!_evas_gl_x11_vi) + eng_best_visual_get(disp, screen); + if (!_evas_gl_x11_vi) return 0; + return _evas_gl_x11_vi->depth; +} + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ + #define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(context_cutout_add); + ORD(context_cutout_clear); + ORD(output_flush); + ORD(output_idle_flush); + ORD(rectangle_draw); + ORD(line_draw); + ORD(polygon_point_add); + ORD(polygon_points_clear); + ORD(polygon_draw); + ORD(gradient_new); + ORD(gradient_free); + ORD(gradient_color_stop_add); + ORD(gradient_alpha_stop_add); + ORD(gradient_color_data_set); + ORD(gradient_alpha_data_set); + ORD(gradient_clear); + ORD(gradient_fill_set); + ORD(gradient_fill_angle_set); + ORD(gradient_fill_spread_set); + ORD(gradient_angle_set); + ORD(gradient_offset_set); + ORD(gradient_direction_set); + ORD(gradient_type_set); + ORD(gradient_is_opaque); + ORD(gradient_is_visible); + ORD(gradient_render_pre); + ORD(gradient_render_post); + ORD(gradient_draw); + ORD(image_load); + ORD(image_new_from_data); + ORD(image_new_from_copied_data); + ORD(image_free); + ORD(image_size_get); + ORD(image_size_set); + ORD(image_dirty_region); + ORD(image_data_get); + ORD(image_data_put); + ORD(image_alpha_set); + ORD(image_alpha_get); + ORD(image_border_set); + ORD(image_border_get); + ORD(image_draw); + ORD(image_comment_get); + ORD(image_format_get); + ORD(image_colorspace_set); + ORD(image_colorspace_get); + ORD(image_native_set); + ORD(image_native_get); + ORD(font_draw); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "gl_x11", + "none" +}; diff --git a/src/modules/engines/gl_x11/evas_engine.h b/src/modules/engines/gl_x11/evas_engine.h new file mode 100644 index 0000000..6968ddb --- /dev/null +++ b/src/modules/engines/gl_x11/evas_engine.h @@ -0,0 +1,49 @@ +#ifndef EVAS_ENGINE_H +#define EVAS_ENGINE_H + +#include +#include +#include + +#include "evas_gl_common.h" + +typedef struct _Evas_GL_X11_Window Evas_GL_X11_Window; + +struct _Evas_GL_X11_Window +{ + Display *disp; + Window win; + int w, h; + int screen; + XVisualInfo *visualinfo; + Visual *visual; + Colormap colormap; + int depth; + GLXContext context; + Evas_GL_Context *gl_context; + struct { + int redraw : 1; + int drew : 1; + int x1, y1, x2, y2; + } draw; +}; + +extern int _evas_gl_x11_configuration[9]; +extern XVisualInfo *_evas_gl_x11_vi; +extern Colormap _evas_gl_x11_cmap; + +Evas_GL_X11_Window * + eng_window_new(Display *disp, + Window win, + int screen, + Visual *vis, + Colormap cmap, + int depth, + int w, + int h); +void + eng_window_free(Evas_GL_X11_Window *gw); +void + eng_window_use(Evas_GL_X11_Window *gw); + +#endif diff --git a/src/modules/engines/gl_x11/evas_x_main.c b/src/modules/engines/gl_x11/evas_x_main.c new file mode 100644 index 0000000..bccd783 --- /dev/null +++ b/src/modules/engines/gl_x11/evas_x_main.c @@ -0,0 +1,87 @@ +#include "evas_gl_common.h" + +#include +#include +#include +#include + +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_GL_X11.h" + +static Evas_GL_X11_Window *_evas_gl_x11_window = NULL; + +/* FIXME: this will only work for 1 display connection... :( */ +static GLXContext context = 0; + +int _evas_gl_x11_configuration[9] = +{ + GLX_DOUBLEBUFFER, + GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + None +}; + +XVisualInfo *_evas_gl_x11_vi = NULL; +Colormap _evas_gl_x11_cmap = 0; + +Evas_GL_X11_Window * +eng_window_new(Display *disp, + Window win, + int screen, + Visual *vis, + Colormap cmap, + int depth, + int w, + int h) +{ + Evas_GL_X11_Window *gw; + + if (!_evas_gl_x11_vi) return NULL; + gw = calloc(1, sizeof(Evas_GL_X11_Window)); + if (!gw) return NULL; + gw->disp = disp; + gw->win = win; + gw->screen = screen; + gw->visual = vis; + gw->colormap = cmap; + gw->depth = depth; + + gw->visualinfo = _evas_gl_x11_vi; + if (!context) + context = glXCreateContext(disp, gw->visualinfo, NULL, GL_TRUE); + gw->context = context; + glXMakeCurrent(gw->disp, gw->win, gw->context); + gw->gl_context = evas_gl_common_context_new(); + if (!gw->gl_context) + { + glXDestroyContext(gw->disp, gw->context); + free(gw); + return NULL; + } + evas_gl_common_context_resize(gw->gl_context, w, h); + return gw; +} + +void +eng_window_free(Evas_GL_X11_Window *gw) +{ + if (gw == _evas_gl_x11_window) _evas_gl_x11_window = NULL; + evas_gl_common_context_free(gw->gl_context); +// glXDestroyContext(gw->disp, gw->context); + free(gw); +} + +void +eng_window_use(Evas_GL_X11_Window *gw) +{ + if (_evas_gl_x11_window != gw) + { + _evas_gl_x11_window = gw; + glXMakeCurrent(gw->disp, gw->win, gw->context); + } + evas_gl_common_context_use(gw->gl_context); +} diff --git a/src/modules/engines/glitz_x11/.cvsignore b/src/modules/engines/glitz_x11/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/glitz_x11/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/glitz_x11/Evas_Engine_Glitz_X11.h b/src/modules/engines/glitz_x11/Evas_Engine_Glitz_X11.h new file mode 100644 index 0000000..1593f8e --- /dev/null +++ b/src/modules/engines/glitz_x11/Evas_Engine_Glitz_X11.h @@ -0,0 +1,25 @@ +#ifndef _EVAS_ENGINE_GLITZ_X11_H +#define _EVAS_ENGINE_GLITZ_X11_H + +#include + +typedef struct _Evas_Engine_Info_Glitz_X11 Evas_Engine_Info_Glitz_X11; + +struct _Evas_Engine_Info_Glitz_X11 +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + /* engine specific data & parameters it needs to set up */ + struct { + Display *display; + Drawable drawable; + Pixmap mask; + Visual *visual; + unsigned char destination_alpha : 1; + } info; +}; +#endif + + diff --git a/src/modules/engines/glitz_x11/Makefile.am b/src/modules/engines/glitz_x11/Makefile.am new file mode 100644 index 0000000..c3ffa61 --- /dev/null +++ b/src/modules/engines/glitz_x11/Makefile.am @@ -0,0 +1,44 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +@FREETYPE_CFLAGS@ \ +@x_cflags@ \ +@GLITZ_CFLAGS@ + +if BUILD_ENGINE_GLITZ_X11 + +pkgdir = $(libdir)/evas/modules/engines/glitz_x11/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la +module_la_SOURCES = \ +evas_engine.h \ +evas_engine.c \ +evas_engine_ximage.c \ +evas_engine_glitz.c \ +evas_engine_image.c \ +evas_engine_font.c \ +evas_engine_gradient.c + +module_la_LIBADD = @x_libs@ @GLITZ_LIBS@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_Glitz_X11.h + +endif + +EXTRA_DIST = \ +evas_engine.h \ +evas_engine.c \ +evas_engine_ximage.c \ +evas_engine_glitz.c \ +evas_engine_image.c \ +evas_engine_font.c \ +evas_engine_gradient.c \ +Evas_Engine_Glitz_X11.h diff --git a/src/modules/engines/glitz_x11/evas_engine.c b/src/modules/engines/glitz_x11/evas_engine.c new file mode 100644 index 0000000..3cc5097 --- /dev/null +++ b/src/modules/engines/glitz_x11/evas_engine.c @@ -0,0 +1,671 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Glitz_X11.h" + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func, pfunc; + +/* engine struct data */ +typedef struct _Render_Engine Render_Engine; +typedef struct _Render_Engine_Update Render_Engine_Update; + +struct _Render_Engine_Update +{ + int x, y, w, h; +// void *surface; +}; + +struct _Render_Engine +{ + Display *disp; + Visual *vis; + Drawable win; + Pixmap mask; + unsigned char destination_alpha : 1; + + Tilebuf *tb; + Tilebuf_Rect *rects; + Evas_Object_List *cur_rect; + int end : 1; + + Evas_List *updates; +}; + +/* prototypes we will use here */ +static void *eng_info(Evas *e); +static void eng_info_free(Evas *e, void *info); +static void eng_setup(Evas *e, void *info); +static void eng_output_free(void *data); +static void eng_output_resize(void *data, int w, int h); +static void eng_output_tile_size_set(void *data, int w, int h); +static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h); +static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h); +static void eng_output_redraws_clear(void *data); +static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch); +static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h); +static void eng_output_flush(void *data); +static void eng_output_idle_flush(void *data); + +static void eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h); + +static void eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2); + +static void eng_polygon_draw(void *data, void *context, void *surface, void *polygon); + +static void *eng_gradient_new(void *data); +static void eng_gradient_free(void *data, void *gradient); +static void eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta); +static void eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta); +static void eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha); +static void eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len); +static void eng_gradient_clear(void *data, void *gradient); +static void eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h); +static void eng_gradient_fill_angle_set(void *data, void *gradient, double angle); +static void eng_gradient_fill_spread_set(void *data, void *gradient, int spread); +static void eng_gradient_angle_set(void *data, void *gradient, double angle); +static void eng_gradient_offset_set(void *data, void *gradient, float offset); +static void eng_gradient_direction_set(void *data, void *gradient, int direction); +static void eng_gradient_type_set(void *data, void *gradient, char *name, char *params); +static int eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h); +static int eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h); +static void eng_gradient_render_pre(void *data, void *context, void *gradient); +static void eng_gradient_render_post(void *data, void *gradient); +static void eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h); + +static void *eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo); +static void *eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data); +static void *eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data); +static void eng_image_free(void *data, void *image); +static void eng_image_size_get(void *data, void *image, int *w, int *h); +static void *eng_image_size_set(void *data, void *image, int w, int h); +static void *eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h); +static void *eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data); +static void *eng_image_data_put(void *data, void *image, DATA32 *image_data); +static void *eng_image_alpha_set(void *data, void *image, int has_alpha); +static int eng_image_alpha_get(void *data, void *image); +static void *eng_image_border_set(void *data, void *image, int l, int r, int t, int b); +static void eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b); +static void eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth); +static const char *eng_image_comment_get(void *data, void *image, char *key); +static char *eng_image_format_get(void *data, void *image); +static void eng_image_cache_flush(void *data); +static void eng_image_cache_set(void *data, int bytes); +static int eng_image_cache_get(void *data); + +static void eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text); + +/* internal engine routines */ + +/* engine api this module provides */ +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_Glitz_X11 *info; + + info = calloc(1, sizeof(Evas_Engine_Info_Glitz_X11)); + if (!info) return NULL; + info->magic.magic = rand(); + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_Glitz_X11 *in; + + in = (Evas_Engine_Info_Glitz_X11 *)info; + free(in); +} + +static void +eng_setup(Evas *e, void *in) +{ + Render_Engine *re; + Evas_Engine_Info_Glitz_X11 *info; + int resize = 1; + + info = (Evas_Engine_Info_Glitz_X11 *)in; + if (!e->engine.data.output) + { + re = calloc(1, sizeof(Render_Engine)); + evas_common_cpu_init(); + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + e->engine.data.output = re; + resize = 0; + } + re = e->engine.data.output; + if (!re) return; + + if (!e->engine.data.context) e->engine.data.context = e->engine.func->context_new(e->engine.data.output); + + re->disp = info->info.display; + re->vis = info->info.visual; + re->win = info->info.drawable; + re->mask = info->info.mask; + re->destination_alpha = info->info.destination_alpha; + + if (resize) + { + if (re->tb) evas_common_tilebuf_free(re->tb); + if ((e->output.w > 0) && (e->output.h > 0)) + re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); + else + re->tb = evas_common_tilebuf_new(1, 1); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + } +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_font_shutdown(); + evas_common_image_shutdown(); + while (re->updates) + { + Render_Engine_Update *reu; + + reu = re->updates->data; + re->updates = evas_list_remove_list(re->updates, re->updates); +// surface_free(reu->surface); + free(reu); + } + if (re->tb) evas_common_tilebuf_free(re->tb); + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + free(re); +} + +static void +eng_output_resize(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_free(re->tb); + re->tb = evas_common_tilebuf_new(w, h); + if (re->tb) evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); +} + +static void +eng_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_set_tile_size(re->tb, w, h); +} + +static void +eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_clear(re->tb); +} + +static void * +eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + Tilebuf_Rect *rect; + int ux, uy, uw, uh; + + re = (Render_Engine *)data; + if (re->end) + { + re->end = 0; + return NULL; + } + if (!re->rects) + { + re->rects = evas_common_tilebuf_get_render_rects(re->tb); + re->cur_rect = (Evas_Object_List *)re->rects; + } + if (!re->cur_rect) return NULL; + rect = (Tilebuf_Rect *)re->cur_rect; + ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h; + re->cur_rect = re->cur_rect->next; + if (!re->cur_rect) + { + evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + re->end = 1; + } + + *x = ux; *y = uy; *w = uw; *h = uh; + *cx = 0; *cy = 0; *cw = uw; *ch = uh; + return NULL; + if ((re->destination_alpha) || (re->mask)) + { +// Xrender_Surface *surface; +// +// surface = _xr_render_surface_new(re->xinf, uw, uh, re->xinf->fmt32, 1); +// _xr_render_surface_solid_rectangle_set(surface, 0, 0, 0, 0, 0, 0, uw, uh); +// return surface; + } +// return _xr_render_surface_new(re->xinf, uw, uh, re->xinf->fmt24, 0); +} + +static void +eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + Render_Engine_Update *reu; + + re = (Render_Engine *)data; + reu = malloc(sizeof(Render_Engine_Update)); + if (!reu) return; + reu->x = x; + reu->y = y; + reu->w = w; + reu->h = h; +// reu->surface = surface; + re->updates = evas_list_append(re->updates, reu); +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + while (re->updates) + { + Render_Engine_Update *reu; + + reu = re->updates->data; + re->updates = evas_list_remove_list(re->updates, re->updates); +// if (re->mask_output) +// { +// Xrender_Surface *tsurf; +// +// _xr_render_surface_copy(reu->surface, re->output, 0, 0, +// reu->x, reu->y, reu->w, reu->h); +// tsurf = _xr_render_surface_new(re->xinf, reu->w, reu->h, re->xinf->fmt1, 1); +// if (tsurf) +// { +// _xr_render_surface_copy(reu->surface, tsurf, 0, 0, +// 0, 0, reu->w, reu->h); +// _xr_render_surface_copy(tsurf, re->mask_output, 0, 0, +// reu->x, reu->y, reu->w, reu->h); +// _xr_render_surface_free(tsurf); +// } +// } +// else +// { +// _xr_render_surface_copy(reu->surface, re->output, 0, 0, +// reu->x, reu->y, reu->w, reu->h); +// } +// _xr_render_surface_free(reu->surface); + free(reu); + } + XSync(re->disp, False); +// _xr_image_info_pool_flush(re->xinf, 0, 0); +} + +static void +eng_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static void +eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h) +{ +} + +static void +eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2) +{ +} + +static void +eng_polygon_draw(void *data, void *context, void *surface, void *polygon) +{ +} + +static void * +eng_gradient_new(void *data) +{ + Render_Engine *re = (Render_Engine *)data; + + return NULL; +} + +static void +eng_gradient_free(void *data, void *gradient) +{ +} + +static void +eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta) +{ +} + +static void +eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta) +{ +} + +static void +eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha) +{ +} + +static void +eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len) +{ +} + +static void +eng_gradient_clear(void *data, void *gradient) +{ +} + +static void +eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h) +{ +} + +static void +eng_gradient_fill_angle_set(void *data, void *gradient, double angle) +{ +} + +static void +eng_gradient_fill_spread_set(void *data, void *gradient, int spread) +{ +} + +static void +eng_gradient_angle_set(void *data, void *gradient, double angle) +{ +} + +static void +eng_gradient_offset_set(void *data, void *gradient, float offset) +{ +} + +static void +eng_gradient_direction_set(void *data, void *gradient, int direction) +{ +} + +static void +eng_gradient_type_set(void *data, void *gradient, char *name, char *params) +{ +} + +static int +eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h) +{ + return 0; +} + +static int +eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h) +{ + if (!context || !gradient) return 0; + return 1; +} + +static void +eng_gradient_render_pre(void *data, void *context, void *gradient) +{ +} + +static void +eng_gradient_render_post(void *data, void *gradient) +{ +} + +static void +eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h) +{ +} + +static void * +eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo) +{ + return NULL; +} + +static void * +eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data) +{ + return NULL; +} + +static void * +eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data) +{ + return NULL; +} + +static void +eng_image_free(void *data, void *image) +{ +} + +static void +eng_image_size_get(void *data, void *image, int *w, int *h) +{ +} + +static void * +eng_image_size_set(void *data, void *image, int w, int h) +{ + return image; +} + +static void * +eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h) +{ + return image; +} + +static void * +eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data) +{ + return image; +} + +static void * +eng_image_data_put(void *data, void *image, DATA32 *image_data) +{ + return image; +} + +static void * +eng_image_alpha_set(void *data, void *image, int has_alpha) +{ + return image; +} + +static int +eng_image_alpha_get(void *data, void *image) +{ + return 0; +} + +static void * +eng_image_border_set(void *data, void *image, int l, int r, int t, int b) +{ + return image; +} + +static void +eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b) +{ +} + +static void +eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth) +{ +} + +static const char * +eng_image_comment_get(void *data, void *image, char *key) +{ + return NULL; +} + +static char * +eng_image_format_get(void *data, void *image) +{ + return NULL; +} + +static void +eng_image_cache_flush(void *data) +{ + int tmp_size; + +// tmp_size = _xre_image_cache_get(); + pfunc.image_cache_flush(data); +// _xre_image_cache_set(0); +// _xre_image_cache_set(tmp_size); +} + +static void +eng_image_cache_set(void *data, int bytes) +{ + pfunc.image_cache_set(data, bytes); +// _xre_image_cache_set(bytes); +} + +static int +eng_image_cache_get(void *data) +{ + return pfunc.image_cache_get(data); +} + +static void +eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text) +{ +} + +/* module advertising code */ +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ +#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(output_flush); + ORD(output_idle_flush); + ORD(rectangle_draw); + ORD(line_draw); + ORD(polygon_draw); + ORD(gradient_new); + ORD(gradient_free); + ORD(gradient_color_stop_add); + ORD(gradient_alpha_stop_add); + ORD(gradient_color_data_set); + ORD(gradient_alpha_data_set); + ORD(gradient_clear); + ORD(gradient_fill_set); + ORD(gradient_fill_angle_set); + ORD(gradient_fill_spread_set); + ORD(gradient_angle_set); + ORD(gradient_offset_set); + ORD(gradient_direction_set); + ORD(gradient_type_set); + ORD(gradient_is_opaque); + ORD(gradient_is_visible); + ORD(gradient_render_pre); + ORD(gradient_render_post); + ORD(gradient_draw); + ORD(image_load); + ORD(image_new_from_data); + ORD(image_new_from_copied_data); + ORD(image_free); + ORD(image_size_get); + ORD(image_size_set); + ORD(image_dirty_region); + ORD(image_data_get); + ORD(image_data_put); + ORD(image_alpha_set); + ORD(image_alpha_get); + ORD(image_border_set); + ORD(image_border_get); + ORD(image_draw); + ORD(image_comment_get); + ORD(image_format_get); + ORD(image_cache_flush); + ORD(image_cache_set); + ORD(image_cache_get); + ORD(font_draw); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "glitz_x11", + "none" +}; + diff --git a/src/modules/engines/glitz_x11/evas_engine.h b/src/modules/engines/glitz_x11/evas_engine.h new file mode 100644 index 0000000..b0a08bb --- /dev/null +++ b/src/modules/engines/glitz_x11/evas_engine.h @@ -0,0 +1,12 @@ +#ifndef EVAS_ENGINE_H +#define EVAS_ENGINE_H + +#include +#include +#include +#include + +#include +#include + +#endif diff --git a/src/modules/engines/glitz_x11/evas_engine_font.c b/src/modules/engines/glitz_x11/evas_engine_font.c new file mode 100644 index 0000000..12b0c14 --- /dev/null +++ b/src/modules/engines/glitz_x11/evas_engine_font.c @@ -0,0 +1,4 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Glitz_X11.h" diff --git a/src/modules/engines/glitz_x11/evas_engine_glitz.c b/src/modules/engines/glitz_x11/evas_engine_glitz.c new file mode 100644 index 0000000..9e4c852 --- /dev/null +++ b/src/modules/engines/glitz_x11/evas_engine_glitz.c @@ -0,0 +1,9 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ +#include "evas_common.h" +//#include "evas_macros.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Glitz_X11.h" +#include diff --git a/src/modules/engines/glitz_x11/evas_engine_gradient.c b/src/modules/engines/glitz_x11/evas_engine_gradient.c new file mode 100644 index 0000000..2d579cd --- /dev/null +++ b/src/modules/engines/glitz_x11/evas_engine_gradient.c @@ -0,0 +1,5 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Glitz_X11.h" +#include diff --git a/src/modules/engines/glitz_x11/evas_engine_image.c b/src/modules/engines/glitz_x11/evas_engine_image.c new file mode 100644 index 0000000..12b0c14 --- /dev/null +++ b/src/modules/engines/glitz_x11/evas_engine_image.c @@ -0,0 +1,4 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Glitz_X11.h" diff --git a/src/modules/engines/glitz_x11/evas_engine_ximage.c b/src/modules/engines/glitz_x11/evas_engine_ximage.c new file mode 100644 index 0000000..12b0c14 --- /dev/null +++ b/src/modules/engines/glitz_x11/evas_engine_ximage.c @@ -0,0 +1,4 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Glitz_X11.h" diff --git a/src/modules/engines/software_16/.cvsignore b/src/modules/engines/software_16/.cvsignore new file mode 100644 index 0000000..09980ae --- /dev/null +++ b/src/modules/engines/software_16/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la diff --git a/src/modules/engines/software_16/Makefile.am b/src/modules/engines/software_16/Makefile.am new file mode 100644 index 0000000..63ad485 --- /dev/null +++ b/src/modules/engines/software_16/Makefile.am @@ -0,0 +1,26 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +@FREETYPE_CFLAGS@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +if BUILD_ENGINE_SOFTWARE_16 + +pkgdir = $(libdir)/evas/modules/engines/software_16/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la +module_la_SOURCES = \ +evas_engine.c + +module_la_LIBADD = $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +endif diff --git a/src/modules/engines/software_16/evas_engine.c b/src/modules/engines/software_16/evas_engine.c new file mode 100644 index 0000000..76b591b --- /dev/null +++ b/src/modules/engines/software_16/evas_engine.c @@ -0,0 +1,845 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_common_soft16.h" + +/* + ***** + ** + ** ENGINE ROUTINES + ** + ***** + */ + +#define NOT_IMPLEMENTED() \ + fprintf(stderr, "NOT_IMPLEMENTED: %s() at %s:%d\n", \ + __FUNCTION__, __FILE__, __LINE__) + +static void * +eng_context_new(void *data) +{ + return evas_common_draw_context_new(); +} + +static void +eng_context_free(void *data, void *context) +{ + evas_common_draw_context_free(context); +} + +static void +eng_context_clip_set(void *data, void *context, int x, int y, int w, int h) +{ + evas_common_draw_context_set_clip(context, x, y, w, h); +} + +static void +eng_context_clip_clip(void *data, void *context, int x, int y, int w, int h) +{ + evas_common_draw_context_clip_clip(context, x, y, w, h); +} + +static void +eng_context_clip_unset(void *data, void *context) +{ + evas_common_draw_context_unset_clip(context); +} + +static int +eng_context_clip_get(void *data, void *context, int *x, int *y, int *w, int *h) +{ + *x = ((RGBA_Draw_Context *)context)->clip.x; + *y = ((RGBA_Draw_Context *)context)->clip.y; + *w = ((RGBA_Draw_Context *)context)->clip.w; + *h = ((RGBA_Draw_Context *)context)->clip.h; + return ((RGBA_Draw_Context *)context)->clip.use; +} + +static void +eng_context_color_set(void *data, void *context, int r, int g, int b, int a) +{ + evas_common_draw_context_set_color(context, r, g, b, a); +} + +static int +eng_context_color_get(void *data, void *context, int *r, int *g, int *b, int *a) +{ + *r = (int)(R_VAL(&((RGBA_Draw_Context *)context)->col.col)); + *g = (int)(G_VAL(&((RGBA_Draw_Context *)context)->col.col)); + *b = (int)(B_VAL(&((RGBA_Draw_Context *)context)->col.col)); + *a = (int)(A_VAL(&((RGBA_Draw_Context *)context)->col.col)); + return 1; +} + +static void +eng_context_multiplier_set(void *data, void *context, int r, int g, int b, int a) +{ + evas_common_draw_context_set_multiplier(context, r, g, b, a); +} + +static void +eng_context_multiplier_unset(void *data, void *context) +{ + evas_common_draw_context_unset_multiplier(context); +} + +static int +eng_context_multiplier_get(void *data, void *context, int *r, int *g, int *b, int *a) +{ + *r = (int)(R_VAL(&((RGBA_Draw_Context *)context)->mul.col)); + *g = (int)(G_VAL(&((RGBA_Draw_Context *)context)->mul.col)); + *b = (int)(B_VAL(&((RGBA_Draw_Context *)context)->mul.col)); + *a = (int)(A_VAL(&((RGBA_Draw_Context *)context)->mul.col)); + return ((RGBA_Draw_Context *)context)->mul.use; +} + +static void +eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h) +{ + evas_common_draw_context_add_cutout(context, x, y, w, h); +} + +static void +eng_context_cutout_clear(void *data, void *context) +{ + evas_common_draw_context_clear_cutouts(context); +} + +static void +eng_context_anti_alias_set(void *data, void *context, unsigned char aa) +{ + evas_common_draw_context_set_anti_alias(context, aa); +} + +static unsigned char +eng_context_anti_alias_get(void *data, void *context) +{ + return ((RGBA_Draw_Context *)context)->anti_alias; +} + +static void +eng_context_color_interpolation_set(void *data, void *context, int color_space) +{ + evas_common_draw_context_set_color_interpolation(context, color_space); +} + +static int +eng_context_color_interpolation_get(void *data, void *context) +{ + return ((RGBA_Draw_Context *)context)->interpolation.color_space; +} + +static void +eng_context_render_op_set(void *data, void *context, int op) +{ + evas_common_draw_context_set_render_op(context, op); +} + +static int +eng_context_render_op_get(void *data, void *context) +{ + return ((RGBA_Draw_Context *)context)->render_op; +} + + + +static void +eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h) +{ + soft16_rectangle_draw(surface, context, x, y, w, h); +} + +static void +eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2) +{ + soft16_line_draw(surface, context, x1, y1, x2, y2); +} + +static void * +eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y) +{ + return evas_common_polygon_point_add(polygon, x, y); +} + +static void * +eng_polygon_points_clear(void *data, void *context, void *polygon) +{ + return evas_common_polygon_points_clear(polygon); +} + +static void +eng_polygon_draw(void *data, void *context, void *surface, void *polygon) +{ + soft16_polygon_draw(surface, context, polygon); +} + +static void * +eng_gradient_new(void *data) +{ + NOT_IMPLEMENTED(); + return NULL; +// return evas_common_gradient_new(); +} + +static void +eng_gradient_free(void *data, void *gradient) +{ + NOT_IMPLEMENTED(); +// evas_common_gradient_free(gradient); +} + +static void +eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta) +{ + NOT_IMPLEMENTED(); +// evas_common_gradient_color_stop_add(gradient, r, g, b, a, delta); +} + +static void +eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta) +{ + NOT_IMPLEMENTED(); +// evas_common_gradient_alpha_stop_add(gradient, a, delta); +} + +static void +eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha) +{ + NOT_IMPLEMENTED(); +// evas_common_gradient_color_data_set(gradient, map, len, has_alpha); +} + +static void +eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len) +{ + NOT_IMPLEMENTED(); +// evas_common_gradient_alpha_data_set(gradient, alpha_map, len); +} + +static void +eng_gradient_clear(void *data, void *gradient) +{ + NOT_IMPLEMENTED(); +// evas_common_gradient_clear(gradient); +} + +static void +eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h) +{ + NOT_IMPLEMENTED(); +// evas_common_gradient_fill_set(gradient, x, y, w, h); +} + +static void +eng_gradient_fill_angle_set(void *data, void *gradient, double angle) +{ + NOT_IMPLEMENTED(); +// evas_common_gradient_fill_angle_set(gradient, angle); +} + +static void +eng_gradient_fill_spread_set(void *data, void *gradient, int spread) +{ + NOT_IMPLEMENTED(); +// evas_common_gradient_fill_spread_set(gradient, spread); +} + +static void +eng_gradient_angle_set(void *data, void *gradient, double angle) +{ + NOT_IMPLEMENTED(); +// evas_common_gradient_map_angle_set(gradient, angle); +} + +static void +eng_gradient_offset_set(void *data, void *gradient, float offset) +{ + NOT_IMPLEMENTED(); +// evas_common_gradient_map_offset_set(gradient, offset); +} + +static void +eng_gradient_direction_set(void *data, void *gradient, int direction) +{ + NOT_IMPLEMENTED(); +// evas_common_gradient_map_direction_set(gradient, direction); +} + +static void +eng_gradient_type_set(void *data, void *gradient, char *name, char *params) +{ + NOT_IMPLEMENTED(); +// evas_common_gradient_type_set(gradient, name, params); +} + +static int +eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h) +{ + NOT_IMPLEMENTED(); + return 0; +// RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context; +// RGBA_Gradient *gr = (RGBA_Gradient *)gradient; +// +// if (!dc || !gr || !gr->type.geometer) return 0; +// return !(gr->type.geometer->has_alpha(gr, dc->render_op) | +// gr->type.geometer->has_mask(gr, dc->render_op)); +} + +static int +eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h) +{ + NOT_IMPLEMENTED(); + return 0; +// RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context; +// +// if (!dc || !gradient) return 0; +// return 1; +} + +static void +eng_gradient_render_pre(void *data, void *context, void *gradient) +{ +// RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context; +// RGBA_Gradient *gr = (RGBA_Gradient *)gradient; +// int len; +// +// if (!dc || !gr || !gr->type.geometer) return; +// gr->type.geometer->geom_set(gr); +// len = gr->type.geometer->get_map_len(gr); +// evas_common_gradient_map(dc, gr, len); + NOT_IMPLEMENTED(); +} + +static void +eng_gradient_render_post(void *data, void *gradient) +{ + NOT_IMPLEMENTED(); +} + +static void +eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h) +{ +// evas_common_gradient_draw(surface, context, x, y, w, h, gradient); +// evas_common_cpu_end_opt(); + NOT_IMPLEMENTED(); +} + +static int +eng_image_alpha_get(void *data, void *image) +{ + Soft16_Image *im; + + if (!image) return 0; + im = image; + return im->cache_entry.flags.alpha; +} + +static int +eng_image_colorspace_get(void *data, void *image) +{ + return EVAS_COLORSPACE_RGB565_A5P; +} + +static void * +eng_image_alpha_set(void *data, void *image, int have_alpha) +{ + if (!image) return NULL; + have_alpha = !!have_alpha; + image = soft16_image_alpha_set(image, have_alpha); + return image; +} + +static void * +eng_image_border_set(void *data, void *image, int l, int r, int t, int b) +{ + return image; +} + +static void +eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b) +{ +} + +static char * +eng_image_comment_get(void *data, void *image, char *key) +{ + return NULL; +} + +static char * +eng_image_format_get(void *data, void *image) +{ + NOT_IMPLEMENTED(); + return NULL; +} + +static void +eng_image_colorspace_set(void *data, void *image, int cspace) +{ + NOT_IMPLEMENTED(); +} + +static void +eng_image_native_set(void *data, void *image, void *native) +{ + NOT_IMPLEMENTED(); +} + +static void * +eng_image_native_get(void *data, void *image) +{ + NOT_IMPLEMENTED(); + return NULL; +} + +static void * +eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo) +{ + return evas_cache_image_request(evas_common_soft16_image_cache_get(), file, key, lo, error); +} + +static void * +eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + if ((image_data) && (cspace != EVAS_COLORSPACE_RGB565_A5P)) + { + fprintf(stderr, "Unsupported colorspace %d in %s() (%s:%d)\n", + cspace, __FUNCTION__, __FILE__, __LINE__); + return NULL; + } + return evas_cache_image_data(evas_common_soft16_image_cache_get(), w, h, image_data, alpha, EVAS_COLORSPACE_RGB565_A5P); +} + +static void * +eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + if ((image_data) && (cspace != EVAS_COLORSPACE_RGB565_A5P)) + { + fprintf(stderr, "Unsupported colorspace %d in %s() (%s:%d)\n", + cspace, __FUNCTION__, __FILE__, __LINE__); + return NULL; + } + return evas_cache_image_copied_data(evas_common_soft16_image_cache_get(), w, h, image_data, alpha, EVAS_COLORSPACE_RGB565_A5P); +} + +static void +eng_image_free(void *data, void *image) +{ + evas_cache_image_drop((Image_Entry *) image); +} + +static void +eng_image_size_get(void *data, void *image, int *w, int *h) +{ + Soft16_Image *im; + + if (w) *w = 0; + if (h) *h = 0; + if (!image) return; + im = image; + if (w) *w = im->cache_entry.w; + if (h) *h = im->cache_entry.h; +} + +static void * +eng_image_size_set(void *data, void *image, int w, int h) +{ + if (!image) return NULL; + if ((w <= 0) || (h <= 0)) + { + evas_cache_image_drop((Image_Entry *) image); + return NULL; + } + return evas_cache_image_size_set((Image_Entry *) image, w, h); +} + +static void +eng_image_stride_get(void *data, void *image, int *stride) +{ + Soft16_Image *im; + + if (stride) *stride = 0; + if (!image) return; + im = image; + if (stride) *stride = im->stride; +} + +static void * +eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h) +{ + /* FIXME: is this required? */ + //NOT_IMPLEMENTED(); + return image; +} + +static void * +eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data) +{ + Soft16_Image *im; + + if (!image) + { + *image_data = NULL; + return NULL; + } + + im = image; + evas_cache_image_load_data(&im->cache_entry); + + if (to_write) + im = (Soft16_Image *) evas_cache_image_alone(&im->cache_entry); + + if (image_data) *image_data = (DATA32 *) im->pixels; + + return im; +} + +static void * +eng_image_data_put(void *data, void *image, DATA32 *image_data) +{ + Soft16_Image *old_im, *new_im; + + if (!image) return NULL; + + old_im = image; + if ((DATA16 *)image_data == old_im->pixels) return old_im; + + new_im = (Soft16_Image *) evas_cache_image_copied_data(evas_common_soft16_image_cache_get(), old_im->cache_entry.w, old_im->cache_entry.h, image_data, old_im->cache_entry.flags.alpha, EVAS_COLORSPACE_RGB565_A5P); + evas_cache_image_drop(&old_im->cache_entry); + return new_im; +} + +#include + +static void +eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth) +{ + Soft16_Image *im; + + im = (Soft16_Image *) image; + + evas_cache_image_load_data(&im->cache_entry); + soft16_image_draw(im, surface, context, + src_x, src_y, src_w, src_h, + dst_x, dst_y, dst_w, dst_h, + smooth); +} + +static void +eng_image_cache_flush(void *data) +{ + evas_cache_image_flush(evas_common_soft16_image_cache_get()); +} + +static void +eng_image_cache_set(void *data, int bytes) +{ + evas_cache_image_set(evas_common_soft16_image_cache_get(), bytes); +} + +static int +eng_image_cache_get(void *data) +{ + return evas_cache_image_get(evas_common_soft16_image_cache_get()); +} + +static void * +eng_font_load(void *data, const char *name, int size) +{ + return evas_common_font_load(name, size); +} + +static void * +eng_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size) +{ + return evas_common_font_memory_load(name, size, fdata, fdata_size); +} + +static void * +eng_font_add(void *data, void *font, const char *name, int size) +{ + return evas_common_font_add(font, name, size); +} + +static void * +eng_font_memory_add(void *data, void *font, char *name, int size, const void *fdata, int fdata_size) +{ + return evas_common_font_memory_add(font, name, size, fdata, fdata_size); +} + +static void +eng_font_free(void *data, void *font) +{ + evas_common_font_free(font); +} + +static int +eng_font_ascent_get(void *data, void *font) +{ + return evas_common_font_ascent_get(font); +} + +static int +eng_font_descent_get(void *data, void *font) +{ + return evas_common_font_descent_get(font); +} + +static int +eng_font_max_ascent_get(void *data, void *font) +{ + return evas_common_font_max_ascent_get(font); +} + +static int +eng_font_max_descent_get(void *data, void *font) +{ + return evas_common_font_max_descent_get(font); +} + +static void +eng_font_string_size_get(void *data, void *font, const char *text, int *w, int *h) +{ + evas_common_font_query_size(font, text, w, h); +} + +static int +eng_font_inset_get(void *data, void *font, const char *text) +{ + return evas_common_font_query_inset(font, text); +} + +static int +eng_font_h_advance_get(void *data, void *font, const char *text) +{ + int h, v; + + evas_common_font_query_advance(font, text, &h, &v); + return h; +} + +static int +eng_font_v_advance_get(void *data, void *font, const char *text) +{ + int h, v; + + evas_common_font_query_advance(font, text, &h, &v); + return v; +} + +static int +eng_font_char_coords_get(void *data, void *font, const char *text, int pos, int *cx, int *cy, int *cw, int *ch) +{ + return evas_common_font_query_char_coords(font, text, pos, cx, cy, cw, ch); +} + +static int +eng_font_char_at_coords_get(void *data, void *font, const char *text, int x, int y, int *cx, int *cy, int *cw, int *ch) +{ + return evas_common_font_query_text_at_pos(font, text, x, y, cx, cy, cw, ch); +} + +static void +eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text) +{ + static RGBA_Image *im = NULL; + Soft16_Image *dst = surface; + + if (!im) + im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); + evas_cache_image_surface_alloc(&im->cache_entry, dst->cache_entry.w, dst->cache_entry.h); + evas_common_draw_context_font_ext_set(context, + surface, + soft16_font_glyph_new, + soft16_font_glyph_free, + soft16_font_glyph_draw); + evas_common_font_draw(im, context, font, x, y, text); + evas_common_draw_context_font_ext_set(context, + NULL, + NULL, + NULL, + NULL); +} + +static void +eng_font_cache_flush(void *data) +{ + evas_common_font_flush(); +} + +static void +eng_font_cache_set(void *data, int bytes) +{ + evas_common_font_cache_set(bytes); +} + +static int +eng_font_cache_get(void *data) +{ + return evas_common_font_cache_get(); +} + +static void +eng_font_hinting_set(void *data, void *font, int hinting) +{ + evas_common_font_hinting_set(font, hinting); +} + +static int +eng_font_hinting_can_hint(void *data, int hinting) +{ + return evas_common_hinting_available(hinting); +} + + +/* + ***** + ** + ** ENGINE API + ** + ***** + */ + +static Evas_Func func = +{ + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + /* draw context virtual methods */ + eng_context_new, + eng_context_free, + eng_context_clip_set, + eng_context_clip_clip, + eng_context_clip_unset, + eng_context_clip_get, + eng_context_color_set, + eng_context_color_get, + eng_context_multiplier_set, + eng_context_multiplier_unset, + eng_context_multiplier_get, + eng_context_cutout_add, + eng_context_cutout_clear, + eng_context_anti_alias_set, + eng_context_anti_alias_get, + eng_context_color_interpolation_set, + eng_context_color_interpolation_get, + eng_context_render_op_set, + eng_context_render_op_get, + /* rect draw funcs */ + eng_rectangle_draw, + /* line draw funcs */ + eng_line_draw, + /* polygon draw funcs */ + eng_polygon_point_add, + eng_polygon_points_clear, + eng_polygon_draw, + /* gradient draw funcs */ + eng_gradient_new, + eng_gradient_free, + eng_gradient_color_stop_add, + eng_gradient_alpha_stop_add, + eng_gradient_color_data_set, + eng_gradient_alpha_data_set, + eng_gradient_clear, + eng_gradient_fill_set, + eng_gradient_fill_angle_set, + eng_gradient_fill_spread_set, + eng_gradient_angle_set, + eng_gradient_offset_set, + eng_gradient_direction_set, + eng_gradient_type_set, + eng_gradient_is_opaque, + eng_gradient_is_visible, + eng_gradient_render_pre, + eng_gradient_render_post, + eng_gradient_draw, + /* image draw funcs */ + eng_image_load, + eng_image_new_from_data, + eng_image_new_from_copied_data, + eng_image_free, + eng_image_size_get, + eng_image_size_set, + eng_image_stride_get, + eng_image_dirty_region, + eng_image_data_get, + eng_image_data_put, + eng_image_alpha_set, + eng_image_alpha_get, + eng_image_border_set, + eng_image_border_get, + eng_image_draw, + eng_image_comment_get, + eng_image_format_get, + eng_image_colorspace_set, + eng_image_colorspace_get, + eng_image_native_set, + eng_image_native_get, + /* image cache funcs */ + eng_image_cache_flush, + eng_image_cache_set, + eng_image_cache_get, + /* font draw functions */ + eng_font_load, + eng_font_memory_load, + eng_font_add, + eng_font_memory_add, + eng_font_free, + eng_font_ascent_get, + eng_font_descent_get, + eng_font_max_ascent_get, + eng_font_max_descent_get, + eng_font_string_size_get, + eng_font_inset_get, + eng_font_h_advance_get, + eng_font_v_advance_get, + eng_font_char_coords_get, + eng_font_char_at_coords_get, + eng_font_draw, + /* font cache functions */ + eng_font_cache_flush, + eng_font_cache_set, + eng_font_cache_get, + /* font hinting functions */ + eng_font_hinting_set, + eng_font_hinting_can_hint + /* FUTURE software generic calls go here */ +}; + +/* + ***** + ** + ** MODULE ACCESSIBLE API API + ** + ***** + */ + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "software_16", + "none" +}; diff --git a/src/modules/engines/software_16_ddraw/.cvsignore b/src/modules/engines/software_16_ddraw/.cvsignore new file mode 100644 index 0000000..8cb5c05 --- /dev/null +++ b/src/modules/engines/software_16_ddraw/.cvsignore @@ -0,0 +1,4 @@ +Makefile.in +Makefile +.deps +.libs diff --git a/src/modules/engines/software_16_ddraw/Evas_Engine_Software_16_DDraw.h b/src/modules/engines/software_16_ddraw/Evas_Engine_Software_16_DDraw.h new file mode 100644 index 0000000..7c3d888 --- /dev/null +++ b/src/modules/engines/software_16_ddraw/Evas_Engine_Software_16_DDraw.h @@ -0,0 +1,29 @@ +#ifndef __EVAS_ENGINE_SOFTWARE_16_DDRAW_H__ +#define __EVAS_ENGINE_SOFTWARE_16_DDRAW_H__ + + +#include +#include + +typedef struct _Evas_Engine_Info_Software_16_DDraw Evas_Engine_Info_Software_16_DDraw; + +struct _Evas_Engine_Info_Software_16_DDraw +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + struct { + HWND window; + LPDIRECTDRAW object; /* DirectDraw object */ + LPDIRECTDRAWSURFACE surface_primary; /* DirectDraw primary surface */ + LPDIRECTDRAWSURFACE surface_back; /* DirectDraw back surface */ + LPDIRECTDRAWSURFACE surface_source; /* DirectDraw source surface */ + int depth; + + int rotation; + } info; +}; + + +#endif /* __EVAS_ENGINE_SOFTWARE_16_DDRAW_H__ */ diff --git a/src/modules/engines/software_16_ddraw/Makefile.am b/src/modules/engines/software_16_ddraw/Makefile.am new file mode 100644 index 0000000..9c1fb4f --- /dev/null +++ b/src/modules/engines/software_16_ddraw/Makefile.am @@ -0,0 +1,38 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +-I$(top_srcdir)/src/modules/engines/software_16 \ +@FREETYPE_CFLAGS@ + +if BUILD_ENGINE_SOFTWARE_16_DDRAW + +pkgdir = $(libdir)/evas/modules/engines/software_16_ddraw/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = \ +evas_engine.h \ +evas_engine.c \ +evas_ddraw_buffer.cpp \ +evas_ddraw_main.cpp + +module_la_LIBADD = @ddraw_16_libs@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_Software_16_DDraw.h + +endif + +EXTRA_DIST = \ +evas_engine.h \ +evas_engine.c \ +evas_ddraw_buffer.cpp \ +evas_ddraw_main.cpp \ +Evas_Engine_Software_16_DDraw.h diff --git a/src/modules/engines/software_16_ddraw/evas_ddraw_buffer.cpp b/src/modules/engines/software_16_ddraw/evas_ddraw_buffer.cpp new file mode 100644 index 0000000..a78507a --- /dev/null +++ b/src/modules/engines/software_16_ddraw/evas_ddraw_buffer.cpp @@ -0,0 +1,85 @@ +#include "evas_common.h" +#include "evas_engine.h" + + +DDraw_Output_Buffer * +evas_software_ddraw_output_buffer_new(HWND window, + LPDIRECTDRAW object, + LPDIRECTDRAWSURFACE surface_primary, + LPDIRECTDRAWSURFACE surface_back, + LPDIRECTDRAWSURFACE surface_source, + int width, + int height) +{ + DDSURFACEDESC surface_desc; + DDraw_Output_Buffer *ddob; + + ddob = (DDraw_Output_Buffer *)calloc(1, sizeof(DDraw_Output_Buffer)); + if (!ddob) return NULL; + + ddob->dd.window = window; + ddob->dd.object = object; + ddob->dd.surface_primary = surface_primary; + ddob->dd.surface_back = surface_back; + ddob->dd.surface_source = surface_source; + ddob->width = width; + ddob->height = height; + ddob->pitch = width * 2; + + ZeroMemory(&surface_desc, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + + if (FAILED(ddob->dd.surface_source->Lock(NULL, + &surface_desc, + DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, + NULL))) + { + free(ddob); + return NULL; + } + + ddob->im.pixels = (DATA16 *)surface_desc.lpSurface; + ddob->im.w = width; + ddob->im.h = height; + ddob->im.stride = width; + ddob->im.references = 1; + + if (FAILED(ddob->dd.surface_source->Unlock(NULL))) + { + free(ddob); + return NULL; + } + + return ddob; +} + +void +evas_software_ddraw_output_buffer_free(DDraw_Output_Buffer *ddob, int sync) +{ + free(ddob); +} + +void +evas_software_ddraw_output_buffer_paste(DDraw_Output_Buffer *ddob) +{ + RECT dst_rect; + RECT src_rect; + POINT p; + + SetRect(&src_rect, 0, 0, ddob->width, ddob->height); + + if (FAILED(ddob->dd.surface_back->BltFast(0, 0, + ddob->dd.surface_source, + &src_rect, + DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT))) + return; + + p.x = 0; + p.y = 0; + ClientToScreen(ddob->dd.window, &p); + GetClientRect(ddob->dd.window, &dst_rect); + OffsetRect(&dst_rect, p.x, p.y); + ddob->dd.surface_primary->Blt(&dst_rect, + ddob->dd.surface_back, &src_rect, + DDBLT_WAIT, NULL); +} diff --git a/src/modules/engines/software_16_ddraw/evas_ddraw_main.cpp b/src/modules/engines/software_16_ddraw/evas_ddraw_main.cpp new file mode 100644 index 0000000..7a2eb7f --- /dev/null +++ b/src/modules/engines/software_16_ddraw/evas_ddraw_main.cpp @@ -0,0 +1,71 @@ +#include "evas_engine.h" + + +void * +evas_software_ddraw_lock(DDraw_Output_Buffer *ddob, int *ddraw_width, int *ddraw_height, int *ddraw_pitch, int *ddraw_depth) +{ + DDSURFACEDESC surface_desc; + + ZeroMemory(&surface_desc, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + + if (FAILED(ddob->dd.surface_back->Lock(NULL, + &surface_desc, + DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR | DDLOCK_WRITEONLY, + NULL))) + return NULL; + + *ddraw_width = surface_desc.dwWidth; + *ddraw_height = surface_desc.dwHeight; + *ddraw_pitch = surface_desc.lPitch; + *ddraw_depth = surface_desc.ddpfPixelFormat.dwRGBBitCount >> 3; + + return surface_desc.lpSurface; +} + +void +evas_software_ddraw_unlock_and_flip(DDraw_Output_Buffer *ddob) +{ + RECT dst_rect; + RECT src_rect; + POINT p; + + if (FAILED(ddob->dd.surface_back->Unlock(NULL))) + return; + + /* we figure out where on the primary surface our window lives */ + p.x = 0; + p.y = 0; + ClientToScreen(ddob->dd.window, &p); + GetClientRect(ddob->dd.window, &dst_rect); + OffsetRect(&dst_rect, p.x, p.y); + SetRect(&src_rect, 0, 0, ddob->width, ddob->height); + + /* nothing to do if the function fails, so we don't check the result */ + ddob->dd.surface_primary->BltFast(0, 0, + ddob->dd.surface_back, &dst_rect, + DDBLTFAST_WAIT || DDBLTFAST_NOCOLORKEY); +} + +void +evas_software_ddraw_surface_resize(DDraw_Output_Buffer *ddob) +{ + DDSURFACEDESC surface_desc; + + ddob->dd.surface_back->Release(); + memset (&surface_desc, 0, sizeof (surface_desc)); + surface_desc.dwSize = sizeof (surface_desc); + /* FIXME: that code does not compile. Must know why */ +#if 0 + surface_desc.dwFlags = DDSD_HEIGHT | DDSD_WIDTH; + surface_desc.dwWidth = width; + surface_desc.dwHeight = height; + IDirectDrawSurface7_SetSurfaceDesc(ddob->dd.surface_back, &surface_desc, NULL); +#else + surface_desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; + surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; + surface_desc.dwWidth = ddob->width; + surface_desc.dwHeight = ddob->height; + ddob->dd.object->CreateSurface(&surface_desc, &ddob->dd.surface_back, NULL); +#endif +} diff --git a/src/modules/engines/software_16_ddraw/evas_engine.c b/src/modules/engines/software_16_ddraw/evas_engine.c new file mode 100644 index 0000000..3da0d7d --- /dev/null +++ b/src/modules/engines/software_16_ddraw/evas_engine.c @@ -0,0 +1,616 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Software_16_DDraw.h" +#include "evas_common_soft16.h" + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func, pfunc; + +/* engine struct data */ +typedef struct _Render_Engine Render_Engine; + +struct _Render_Engine +{ + HWND window; + LPDIRECTDRAW object; + LPDIRECTDRAWSURFACE surface_primary; + LPDIRECTDRAWSURFACE surface_back; + LPDIRECTDRAWSURFACE surface_source; + int width; + int height; + int rotation; + Tilebuf *tb; + Tilebuf_Rect *rects; + Tilebuf_Rect *cur_rect; + DDraw_Output_Buffer *ddob; + Soft16_Image *tmp_out; /* used by indirect render, like rotation */ + HRGN clip_rects; + unsigned char end : 1; +}; + +/* prototypes we will use here */ + +static void *eng_info(Evas *e); +static void eng_info_free(Evas *e, void *info); +static void eng_setup(Evas *e, void *info); +static void eng_output_free(void *data); +static void eng_output_resize(void *data, int w, int h); +static void eng_output_tile_size_set(void *data, int w, int h); +static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h); +static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h); +static void eng_output_redraws_clear(void *data); +static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch); +static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h); +static void eng_output_flush(void *data); +static void eng_output_idle_flush(void *data); + +/* engine api this module provides */ +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_Software_16_DDraw *info; + + info = calloc(1, sizeof(Evas_Engine_Info_Software_16_DDraw)); + if (!info) return NULL; + info->magic.magic = rand(); + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_Software_16_DDraw *in; + + in = (Evas_Engine_Info_Software_16_DDraw *)info; + free(in); +} + +static void +_tmp_out_free(Soft16_Image *tmp_out) +{ + free(tmp_out->pixels); + free(tmp_out); +} + +static void +_tmp_out_alloc(Render_Engine *re) +{ + Tilebuf_Rect *r; + int w = 0, h = 0; + + for (r = re->rects; r; r = (Tilebuf_Rect *)(r->_list_data.next)) + { + if (r->w > w) w = r->w; + if (r->h > h) h = r->h; + } + + if (re->tmp_out) + { + if ((re->tmp_out->w < w) || (re->tmp_out->h < h)) + { + _tmp_out_free(re->tmp_out); + re->tmp_out = NULL; + } + } + + if (!re->tmp_out) + { + Soft16_Image *im; + + im = calloc(1, sizeof(Soft16_Image)); + im->w = w; + im->h = h; + im->stride = w + ((w % 4) ? (4 - (w % 4)) : 0); + im->have_alpha = 0; + im->references = 1; + im->free_pixels = 1; + im->pixels = malloc(h * im->stride * sizeof(DATA16)); + + re->tmp_out = im; + } +} + + +static void +eng_setup(Evas *e, void *in) +{ + Render_Engine *re; + Evas_Engine_Info_Software_16_DDraw *info; + + info = (Evas_Engine_Info_Software_16_DDraw *)in; + if (!e->engine.data.output) + { + /* the only check - simplistic, i know, but enough for this + * "special purpose" engine. Remember it is meant to be used + * for limited power devices that have a 16bit display mode + * and no real other acceleration, and high resolution so we + * can pre-dither into 16bpp. */ + if (info->info.depth != 16) + return; + /* do common routine init - we wil at least use it for core + * image loading and font loading/glyph rendering & placement */ + evas_common_cpu_init(); + + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + evas_common_soft16_image_init(); + + /* render engine specific data */ + re = calloc(1, sizeof(Render_Engine)); + if (!re) + return; + e->engine.data.output = re; + re->window = info->info.window; + re->object = info->info.object; + re->surface_primary = info->info.surface_primary; + re->surface_back = info->info.surface_back; + re->surface_source = info->info.surface_source; + re->width = e->output.w; + re->height = e->output.h; + re->rotation = info->info.rotation; + re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + } + else + { + /* we changed the info after first init - do a re-eval where + * appropriate */ + if (info->info.depth != 16) + return; + re = e->engine.data.output; + if (re->tb) evas_common_tilebuf_free(re->tb); + re->window = info->info.window; + re->object = info->info.object; + re->surface_primary = info->info.surface_primary; + re->surface_back = info->info.surface_back; + re->surface_source = info->info.surface_source; + re->width = e->output.w; + re->height = e->output.h; + re->rotation = info->info.rotation; + re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + if (re->tmp_out) + { + _tmp_out_free(re->tmp_out); + re->tmp_out = NULL; + } + } + if (!e->engine.data.output) return; + /* add a draw context if we dont have one */ + if (!e->engine.data.context) + e->engine.data.context = + e->engine.func->context_new(e->engine.data.output); +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (re->ddob) evas_software_ddraw_output_buffer_free(re->ddob, 0); + if (re->clip_rects) DeleteObject(re->clip_rects); + if (re->tb) evas_common_tilebuf_free(re->tb); + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + if (re->tmp_out) _tmp_out_free(re->tmp_out); + free(re); + + evas_common_font_shutdown(); + evas_common_image_shutdown(); + evas_common_soft16_image_shutdown(); +} + +static void +eng_output_resize(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + + if ((re->width == w) && (re->height == h)) return; + + if (re->ddob) + evas_software_ddraw_surface_resize(re->ddob); + + evas_common_tilebuf_free(re->tb); + re->width = w; + re->height = h; + re->tb = evas_common_tilebuf_new(w, h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + if (re->ddob) + { + evas_software_ddraw_output_buffer_free(re->ddob, 0); + re->ddob = NULL; + } + if (re->clip_rects) + { + DeleteObject(re->clip_rects); + re->clip_rects = NULL; + } + if (re->tmp_out) + { + _tmp_out_free(re->tmp_out); + re->tmp_out = NULL; + } +} + +static void +eng_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_set_tile_size(re->tb, w, h); +} + +static void +eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_clear(re->tb); +} + +static inline void +_output_buffer_alloc(Render_Engine *re) +{ + int width; + int height; + + if (re->ddob) return; + + if ((re->rotation == 0) || (re->rotation == 180)) + { + width = re->width; + height = re->height; + } + else + { + width = re->height; + height = re->width; + } + + re->ddob = evas_software_ddraw_output_buffer_new(re->window, + re->object, + re->surface_primary, + re->surface_back, + re->surface_source, + width, + height); +} + +static void * +eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + Tilebuf_Rect *rect; + int ux, uy, uw, uh; + + re = (Render_Engine *)data; + if (re->end) + { + re->end = 0; + return NULL; + } + if (!re->rects) + { + re->rects = evas_common_tilebuf_get_render_rects(re->tb); + if (!re->rects) return NULL; + + re->cur_rect = re->rects; + _output_buffer_alloc(re); + if (re->rotation != 0) _tmp_out_alloc(re); /* grows if required */ + } + if (!re->cur_rect) + { + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + return NULL; + } + rect = re->cur_rect; + ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h; + re->cur_rect = (Tilebuf_Rect *)(re->cur_rect->_list_data.next); + if (!re->cur_rect) + { + evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + re->end = 1; + } + + *x = ux; *y = uy; *w = uw; *h = uh; + if (re->rotation == 0) + { + *cx = ux; *cy = uy; *cw = uw; *ch = uh; + return &re->ddob->im; + } + else + { + *cx = 0; *cy = 0; *cw = uw; *ch = uh; + return re->tmp_out; + } +} + +static void +_blit_rot_90(Soft16_Image *dst, const Soft16_Image *src, + int out_x, int out_y, int w, int h) +{ + DATA16 *dp, *sp; + int x, y; + + sp = src->pixels; + dp = dst->pixels + (out_x + + (w + out_y - 1) * dst->stride); + + for (y = 0; y < h; y++) + { + DATA16 *dp_itr, *sp_itr; + + sp_itr = sp; + dp_itr = dp; + + for (x = 0; x < w; x++) + { + *dp_itr = *sp_itr; + + sp_itr++; + dp_itr -= dst->stride; + } + sp += src->stride; + dp++; + } +} + +static void +_blit_rot_180(Soft16_Image *dst, const Soft16_Image *src, + int out_x, int out_y, int w, int h) +{ + DATA16 *dp, *sp; + int x, y; + + sp = src->pixels; + dp = dst->pixels + ((w + out_x - 1) + + (h + out_y - 1) * dst->stride); + + for (y = 0; y < h; y++) + { + DATA16 *dp_itr, *sp_itr; + + sp_itr = sp; + dp_itr = dp; + + for (x = 0; x < w; x++) + { + *dp_itr = *sp_itr; + + sp_itr++; + dp_itr--; + } + sp += src->stride; + dp -= dst->stride; + } +} + +static void +_blit_rot_270(Soft16_Image *dst, const Soft16_Image *src, + int out_x, int out_y, int w, int h) +{ + DATA16 *dp, *sp; + int x, y; + + sp = src->pixels; + dp = dst->pixels + ((h + out_x - 1) + + out_y * dst->stride); + + for (y = 0; y < h; y++) + { + DATA16 *dp_itr, *sp_itr; + + sp_itr = sp; + dp_itr = dp; + + for (x = 0; x < w; x++) + { + *dp_itr = *sp_itr; + + sp_itr++; + dp_itr += dst->stride; + } + sp += src->stride; + dp--; + } +} + +static void +_tmp_out_process(Render_Engine *re, int out_x, int out_y, int w, int h) +{ + Soft16_Image *d, *s; + + d = &re->ddob->im; + s = re->tmp_out; + + if ((w < 1) || (h < 1) || (out_x >= d->w) || (out_y >= d->h)) + return; + + if (re->rotation == 90) + _blit_rot_90(d, s, out_x, out_y, w, h); + else if (re->rotation == 180) + _blit_rot_180(d, s, out_x, out_y, w, h); + else if (re->rotation == 270) + _blit_rot_270(d, s, out_x, out_y, w, h); +} + +static void +eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + HRGN region; + int xx; + int yy; + int width; + int height; + + re = (Render_Engine *)data; + + if (!re->clip_rects) + re->clip_rects = CreateRectRgn(0, 0, 0, 0); + + if (re->rotation == 0) + { + xx = x; + yy = y; + width = w; + height = h; + } + else if (re->rotation == 90) + { + xx = y; + yy = re->width - w - x; + width = h; + height = w; + } + else if (re->rotation == 180) + { + xx = re->width - w - x; + yy = re->height - h - y; + width = w; + height = h; + } + else if (re->rotation == 270) + { + xx = re->height - h - y; + yy = x; + width = h; + height = w; + } + + region = CreateRectRgn(xx, yy, xx + width, yy + height); + + if (re->rotation != 0) + _tmp_out_process(re, xx, yy, w, h); + CombineRgn(re->clip_rects, re->clip_rects, region, RGN_OR); +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + void *ddraw_data; + int ddraw_width; + int ddraw_height; + int ddraw_pitch; + int ddraw_depth; + + re = (Render_Engine *)data; + if (re->clip_rects) + { + /* FIXME : i have to manage that */ +/* XSetRegion(re->disp, re->gc, re->clip_rects); */ + DeleteObject(re->clip_rects); + re->clip_rects = NULL; + } + else return; + + evas_software_ddraw_output_buffer_paste(re->ddob); + + /* FIXME : i have to manage that */ +/* XSetClipMask(re->disp, re->gc, None); */ +} + +static void +eng_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (re->ddob) + { + evas_software_ddraw_output_buffer_free(re->ddob, 0); + re->ddob = NULL; + } + if (re->clip_rects) + { + DeleteObject(re->clip_rects); + re->clip_rects = NULL; + } + if (re->tmp_out) + { + _tmp_out_free(re->tmp_out); + re->tmp_out = NULL; + } +} + + +/* module advertising code */ +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_16")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ +#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(output_flush); + ORD(output_idle_flush); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "software_16_ddraw", + "none" +}; diff --git a/src/modules/engines/software_16_ddraw/evas_engine.h b/src/modules/engines/software_16_ddraw/evas_engine.h new file mode 100644 index 0000000..a8e3eba --- /dev/null +++ b/src/modules/engines/software_16_ddraw/evas_engine.h @@ -0,0 +1,59 @@ +#ifndef __EVAS_ENGINE_H__ +#define __EVAS_ENGINE_H__ + + +#include +#include + +#include "evas_common_soft16.h" + +typedef struct _DDraw_Output_Buffer DDraw_Output_Buffer; + +struct _DDraw_Output_Buffer +{ + Soft16_Image im; + struct { + HWND window; + LPDIRECTDRAW object; + LPDIRECTDRAWSURFACE surface_primary; + LPDIRECTDRAWSURFACE surface_back; + LPDIRECTDRAWSURFACE surface_source; + } dd; + int x; + int y; + int width; + int height; + int depth; + int pitch; +}; + +/****/ + +#ifdef __cplusplus +extern "C" { +#endif + + +DDraw_Output_Buffer *evas_software_ddraw_output_buffer_new (HWND window, + LPDIRECTDRAW object, + LPDIRECTDRAWSURFACE surface_primary, + LPDIRECTDRAWSURFACE surface_back, + LPDIRECTDRAWSURFACE surface_source, + int width, + int height); +void evas_software_ddraw_output_buffer_free (DDraw_Output_Buffer *ddob, int sync); +void evas_software_ddraw_output_buffer_paste (DDraw_Output_Buffer *ddob); + + +void *evas_software_ddraw_lock(DDraw_Output_Buffer *ddob, int *ddraw_width, int *ddraw_height, int *ddraw_pitch, int *ddraw_depth); + +void evas_software_ddraw_unlock_and_flip(DDraw_Output_Buffer *ddob); + +void evas_software_ddraw_surface_resize(DDraw_Output_Buffer *ddob); + + +#ifdef __cplusplus +} +#endif + +#endif /* __EVAS_ENGINE_H__ */ diff --git a/src/modules/engines/software_16_sdl/.cvsignore b/src/modules/engines/software_16_sdl/.cvsignore new file mode 100644 index 0000000..09980ae --- /dev/null +++ b/src/modules/engines/software_16_sdl/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la diff --git a/src/modules/engines/software_16_sdl/Evas_Engine_SDL_16.h b/src/modules/engines/software_16_sdl/Evas_Engine_SDL_16.h new file mode 100644 index 0000000..20adccf --- /dev/null +++ b/src/modules/engines/software_16_sdl/Evas_Engine_SDL_16.h @@ -0,0 +1,22 @@ +#ifndef _EVAS_ENGINE_SDL_16_H +# define _EVAS_ENGINE_SDL_16_H + +#include + +typedef struct _Evas_Engine_Info_SDL_16 Evas_Engine_Info_SDL_16; +struct _Evas_Engine_Info_SDL_16 +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + struct { + int rotation; + int fullscreen : 1; + int hwsurface : 1; + int noframe : 1; + int alpha : 1; + } info; +}; + +#endif diff --git a/src/modules/engines/software_16_sdl/Makefile.am b/src/modules/engines/software_16_sdl/Makefile.am new file mode 100644 index 0000000..679d599 --- /dev/null +++ b/src/modules/engines/software_16_sdl/Makefile.am @@ -0,0 +1,28 @@ +AUTOMAKE_OPTIONS = 1.4 foreign + +MAINTAINERCLEANFILES = Makefile.in + +INCLUDES = -I. -I$(top_srcdir)/src/lib -I$(top_srcdir)/src/lib/include @FREETYPE_CFLAGS@ @SDL_CFLAGS@ + +if BUILD_ENGINE_SDL + +pkgdir = $(libdir)/evas/modules/engines/software_16_sdl/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = \ +evas_engine.c \ +evas_engine.h + +module_la_LIBADD = @SDL_LIBS@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ -module -avoid-version -L$(top_builddir)/src/lib -L$(top_builddir)/src/lib/.libs +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_SDL_16.h + +endif + +EXTRA_DIST = \ +evas_engine.c \ +evas_engine.h \ +Evas_Engine_SDL_16.h diff --git a/src/modules/engines/software_16_sdl/evas_engine.c b/src/modules/engines/software_16_sdl/evas_engine.c new file mode 100644 index 0000000..ea4911e --- /dev/null +++ b/src/modules/engines/software_16_sdl/evas_engine.c @@ -0,0 +1,1257 @@ +#include +#include +#include +#include +#include +#include + +#include "evas_engine.h" + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func = {}; +static Evas_Func pfunc = {}; + +static Engine_Image_Entry *_sdl16_image_alloc (void); +static void _sdl16_image_delete (Engine_Image_Entry *eim); + +static int _sdl16_image_constructor (Engine_Image_Entry *ie, void* data); +static void _sdl16_image_destructor (Engine_Image_Entry *eim); + +static void _sdl16_image_dirty_region(Engine_Image_Entry *eim, int x, int y, int w, int h); + +static int _sdl16_image_dirty (Engine_Image_Entry *dst, const Engine_Image_Entry *src); + +static int _sdl16_image_size_set (Engine_Image_Entry *dst, const Engine_Image_Entry *src); + +static int _sdl16_image_update_data (Engine_Image_Entry* dst, void* engine_data); + +static void _sdl16_image_load (Engine_Image_Entry *eim, const Image_Entry* im); +static int _sdl16_image_mem_size_get(Engine_Image_Entry *eim); + +#ifdef DEBUG_SDL +static void _sdl16_image_debug (const char* context, Engine_Image_Entry* im); +#endif + +static const Evas_Cache_Engine_Image_Func _sdl16_cache_engine_image_cb = { + NULL /* key */, + _sdl16_image_alloc /* alloc */, + _sdl16_image_delete /* dealloc */, + _sdl16_image_constructor /* constructor */, + _sdl16_image_destructor /* destructor */, + _sdl16_image_dirty_region /* dirty_region */, + _sdl16_image_dirty /* dirty */, + _sdl16_image_size_set /* size_set */, + _sdl16_image_update_data /* update_data */, + _sdl16_image_load /* load */, + _sdl16_image_mem_size_get /* mem_size_get */, +#ifdef DEBUG_SDL /* debug */ + _sdl16_image_debug +#else + NULL +#endif +}; + +#define _SDL_UPDATE_PIXELS(EIM) \ + ((Soft16_Image *) EIM->cache_entry.src)->pixels = EIM->surface->pixels; + +#define RMASK565 0xf800 +#define GMASK565 0x07e0 +#define BMASK565 0x001f +#define AMASK565 0x0000 + +/* engine api this module provides */ +static void * +evas_engine_sdl16_info(Evas *e) +{ + Evas_Engine_Info_SDL_16 *info; + + (void) e; + + info = calloc(1, sizeof(Evas_Engine_Info_SDL_16)); + if (!info) return NULL; + info->magic.magic = rand(); + return info; +} + +static void +evas_engine_sdl16_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_SDL_16 *in; + + in = (Evas_Engine_Info_SDL_16 *)info; + free(in); +} + +static void +_tmp_out_alloc(Render_Engine *re) +{ + Tilebuf_Rect *r; + int w = 0, h = 0; + + for (r = re->rects; r; r = (Tilebuf_Rect *)(r->_list_data.next)) + { + if (r->w > w) w = r->w; + if (r->h > h) h = r->h; + } + + if (re->tmp_out) + { + if ((re->tmp_out->cache_entry.w < w) || (re->tmp_out->cache_entry.h < h)) + { + evas_cache_image_drop(&re->tmp_out->cache_entry); + re->tmp_out = NULL; + } + } + + if (!re->tmp_out) + { + Soft16_Image *im; + + im = (Soft16_Image *) evas_cache_image_empty(evas_common_soft16_image_cache_get()); + im->cache_entry.flags.alpha = 0; + evas_cache_image_surface_alloc(&im->cache_entry, w, h); + + re->tmp_out = im; + } +} + +static void* +_sdl16_output_setup(int w, int h, int rotation, int fullscreen, int noframe, int hwsurface) +{ + Render_Engine *re = calloc(1, sizeof(Render_Engine)); + SDL_Surface *surface; + + /* if we haven't initialized - init (automatic abort if already done) */ + evas_common_cpu_init(); + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + evas_common_soft16_image_init(); + + if (w <= 0) w = 640; + if (h <= 0) h = 480; + + re->cache = evas_cache_engine_image_init(&_sdl16_cache_engine_image_cb, evas_common_soft16_image_cache_get()); + if (!re->cache) + { + fprintf(stderr, "Evas_Cache_Engine_Image allocation failed!\n"); + exit(-1); + } + + re->tb = evas_common_tilebuf_new(w, h); + /* in preliminary tests 16x16 gave highest framerates */ + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + re->w = w; + re->h = h; + re->rot = rotation; + re->flags.hwsurface = hwsurface; + re->flags.fullscreen = fullscreen; + re->flags.noframe = noframe; + re->flags.end = 0; + + re->update_rects_count = 0; + re->update_rects_limit = 0; + re->update_rects = NULL; + + surface = SDL_SetVideoMode(w, h, 16, + (hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE) + | (fullscreen ? SDL_FULLSCREEN : 0) + | (noframe ? SDL_NOFRAME : 0)); + if (!surface) + { + fprintf(stderr, "SDL_SetVideoMode [ %i x %i x 16 ] failed\n", w, h); + exit(-1); + } + + SDL_SetAlpha(surface, SDL_RLEACCEL, 0); + SDL_FillRect(surface, NULL, 0); + + re->soft16_engine_image = (SDL_Engine_Image_Entry *) evas_cache_engine_image_engine(re->cache, surface); + if (!re->soft16_engine_image) + { + fprintf(stderr, "Soft16_Image allocation from SDL failed\n"); + exit(-1); + } + + return re; +} + + +static void +evas_engine_sdl16_setup(Evas *e, void *in) +{ + Evas_Engine_Info_SDL_16 *info = (Evas_Engine_Info_SDL_16 *) in; + + if (evas_output_method_get(e) != evas_render_method_lookup("software_16_sdl")) + return ; + + SDL_Init(SDL_INIT_NOPARACHUTE); + + if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) + { + fprintf(stderr, "SDL_Init failed with %s\n", SDL_GetError()); + exit(-1); + } + + e->engine.data.output = _sdl16_output_setup(e->output.w, e->output.h, + info->info.rotation, + info->info.fullscreen, + info->info.noframe, + info->info.hwsurface); + if (!e->engine.data.output) + return; + + e->engine.func = &func; + e->engine.data.context = e->engine.func->context_new(e->engine.data.output); +} + +static void +evas_engine_sdl16_output_free(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (re->tb) evas_common_tilebuf_free(re->tb); + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + if (re->tmp_out) evas_cache_image_drop(&re->tmp_out->cache_entry); + if (re->soft16_engine_image) evas_cache_engine_image_drop(&re->soft16_engine_image->cache_entry); + free(re); + +/* evas_common_font_shutdown(); */ + evas_common_image_shutdown(); + evas_common_soft16_image_shutdown(); +} + +static void +evas_engine_sdl16_output_resize(void *data, int w, int h) +{ + Render_Engine *re = data; + SDL_Surface *surface; + + if ((re->w == w) && (re->h == h)) return; + + evas_cache_engine_image_drop(&re->soft16_engine_image->cache_entry); + + evas_common_tilebuf_free(re->tb); + re->w = w; + re->h = h; + re->tb = evas_common_tilebuf_new(w, h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + + surface = SDL_SetVideoMode(w, h, 16, + (re->flags.hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE) + | (re->flags.fullscreen ? SDL_FULLSCREEN : 0) + | (re->flags.noframe ? SDL_NOFRAME : 0)); + if (!surface) + { + fprintf(stderr, "Unable to change the resolution to : %ix%i\n", w, h); + exit(-1); + } + re->soft16_engine_image = (SDL_Engine_Image_Entry *) evas_cache_engine_image_engine(re->cache, surface); + if (!re->soft16_engine_image) + { + fprintf(stderr, "RGBA_Image allocation from SDL failed\n"); + exit(-1); + } + + SDL_FillRect(surface, NULL, 0); + + if (re->tmp_out) + { + evas_cache_image_drop(&re->tmp_out->cache_entry); + re->tmp_out = NULL; + } +} + +static void +evas_engine_sdl16_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_set_tile_size(re->tb, w, h); +} + +static void +evas_engine_sdl16_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); +} + +static void +evas_engine_sdl16_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); +} + +static void +evas_engine_sdl16_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_clear(re->tb); +} + +static void * +evas_engine_sdl16_output_redraws_next_update_get(void *data, + int *x, int *y, int *w, int *h, + int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re = data; + Tilebuf_Rect *tb_rect; + SDL_Rect rect; + + if (re->flags.end) + { + re->flags.end = 0; + return NULL; + } + if (!re->rects) + { + re->rects = evas_common_tilebuf_get_render_rects(re->tb); + re->cur_rect = re->rects; + if (re->rot != 0) _tmp_out_alloc(re); /* grows if required */ + } + if (!re->cur_rect) + { + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + return NULL; + } + + tb_rect = re->cur_rect; + *cx = *x = tb_rect->x; + *cy = *y = tb_rect->y; + *cw = *w = tb_rect->w; + *ch = *h = tb_rect->h; + re->cur_rect = (Tilebuf_Rect *)(re->cur_rect->_list_data.next); + if (!re->cur_rect) + { + evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + re->flags.end = 1; + } + + if (re->rot != 0) + { + *cx = 0; + *cy = 0; + } + + rect.x = *x; + rect.y = *y; + rect.w = *w; + rect.h = *h; + + SDL_FillRect(re->soft16_engine_image->surface, &rect, 0); + + /* Return the "fake" surface so it is passed to the drawing routines. */ + return re->soft16_engine_image; +} + +static void +_blit_rot_90(Soft16_Image *dst, const Soft16_Image *src, + int out_x, int out_y, int w, int h) +{ + DATA16 *dp, *sp; + int x, y; + + sp = src->pixels; + dp = dst->pixels + (out_x + + (w + out_y - 1) * dst->stride); + + for (y = 0; y < h; y++) + { + DATA16 *dp_itr, *sp_itr; + + sp_itr = sp; + dp_itr = dp; + + for (x = 0; x < w; x++) + { + *dp_itr = *sp_itr; + + sp_itr++; + dp_itr -= dst->stride; + } + sp += src->stride; + dp++; + } +} + +static void +_blit_rot_180(Soft16_Image *dst, const Soft16_Image *src, + int out_x, int out_y, int w, int h) +{ + DATA16 *dp, *sp; + int x, y; + + sp = src->pixels; + dp = dst->pixels + ((w + out_x - 1) + + (h + out_y - 1) * dst->stride); + + for (y = 0; y < h; y++) + { + DATA16 *dp_itr, *sp_itr; + + sp_itr = sp; + dp_itr = dp; + + for (x = 0; x < w; x++) + { + *dp_itr = *sp_itr; + + sp_itr++; + dp_itr--; + } + sp += src->stride; + dp -= dst->stride; + } +} + +static void +_blit_rot_270(Soft16_Image *dst, const Soft16_Image *src, + int out_x, int out_y, int w, int h) +{ + DATA16 *dp, *sp; + int x, y; + + sp = src->pixels; + dp = dst->pixels + ((h + out_x - 1) + + out_y * dst->stride); + + for (y = 0; y < h; y++) + { + DATA16 *dp_itr, *sp_itr; + + sp_itr = sp; + dp_itr = dp; + + for (x = 0; x < w; x++) + { + *dp_itr = *sp_itr; + + sp_itr++; + dp_itr += dst->stride; + } + sp += src->stride; + dp--; + } +} + +static void +_tmp_out_process(Render_Engine *re, int out_x, int out_y, int w, int h) +{ + Soft16_Image *d, *s; + DATA16 *dp, *sp; + int y, x, d_dir; + + d = (Soft16_Image *) re->soft16_engine_image->cache_entry.src; + s = re->tmp_out; + + if ((w < 1) || (h < 1) + || (out_x >= d->cache_entry.w) || (out_y >= d->cache_entry.h)) + return; + + if (re->rot == 90) + _blit_rot_90(d, s, out_x, out_y, w, h); + else if (re->rot == 180) + _blit_rot_180(d, s, out_x, out_y, w, h); + else if (re->rot == 270) + _blit_rot_270(d, s, out_x, out_y, w, h); +} + +static void +evas_engine_sdl16_output_redraws_next_update_push(void *data, void *surface, + int x, int y, int w, int h) +{ + Render_Engine *re = data; + SDL_Rect rect; + + if (re->update_rects_count + 1 > re->update_rects_limit) + { + re->update_rects_limit += 8; + re->update_rects = realloc(re->update_rects, sizeof (SDL_Rect) * re->update_rects_limit); + } + + rect.x = x; + rect.y = y; + rect.w = w; + rect.h = h; + + switch (re->rot) + { + case 0: + break; + case 90: + rect.x = y; + rect.y = re->w - w - x; + rect.w = h; + rect.h = w; + break; + case 180: + rect.x = re->w - w - x; + rect.y = re->h - h - y; + break; + case 270: + rect.x = re->h - h - y; + rect.y = x; + rect.w = h; + rect.h = w; + break; + default: + abort(); + } + + re->update_rects[re->update_rects_count] = rect; + + if (re->rot != 0) + _tmp_out_process(re, rect.x, rect.y, w, h); + + ++re->update_rects_count; +} + +static void +evas_engine_sdl16_output_flush(void *data) +{ + Render_Engine *re = data; + + if (re->update_rects_count > 0) + SDL_UpdateRects(re->soft16_engine_image->surface, re->update_rects_count, re->update_rects); + + re->update_rects_count = 0; +} + +static void +evas_engine_sdl16_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (re->tmp_out) + { + evas_cache_image_drop(&re->tmp_out->cache_entry); + re->tmp_out = NULL; + } +} + +static void* +evas_engine_sdl16_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo) +{ + Render_Engine* re = (Render_Engine*) data;; + + *error = 0; + return evas_cache_engine_image_request(re->cache, file, key, lo, NULL, error); +} + +static int +evas_engine_sdl16_image_alpha_get(void *data, void *image) +{ + SDL_Engine_Image_Entry *eim = image; + Soft16_Image *im; + + (void) data; + + if (!eim) return 1; + im = (Soft16_Image *) eim->cache_entry.src; + if (im->cache_entry.flags.alpha) return 1; + return 0; +} + +static void +evas_engine_sdl16_image_size_get(void *data, void *image, int *w, int *h) +{ + SDL_Engine_Image_Entry *eim; + + (void) data; + + eim = image; + if (w) *w = eim->cache_entry.w; + if (h) *h = eim->cache_entry.h; +} + +static int +evas_engine_sdl16_image_colorspace_get(void *data, void *image) +{ + (void) data; + (void) image; + + return EVAS_COLORSPACE_RGB565_A5P; +} + +static void +evas_engine_sdl16_image_colorspace_set(void *data, void *image, int cspace) +{ + (void) data; + (void) image; + + /* FIXME: Not implemented. */ +} + +static void* +evas_engine_sdl16_image_new_from_copied_data(void *data, + int w, int h, + DATA32* image_data, + int alpha, int cspace) +{ + Render_Engine *re = data; + + if (cspace != EVAS_COLORSPACE_RGB565_A5P) + { + fprintf(stderr, "Unsupported colorspace %d in %s() (%s:%d)\n", + cspace, __FUNCTION__, __FILE__, __LINE__); + return NULL; + } + + fprintf(stderr, "s image_data: %p\n", image_data); + + return evas_cache_engine_image_copied_data(re->cache, + w, h, + image_data, + alpha, cspace, NULL); +} + +static void* +evas_engine_sdl16_image_new_from_data(void *data, int w, int h, DATA32* image_data, int alpha, int cspace) +{ + Render_Engine *re = data; + + if (cspace != EVAS_COLORSPACE_RGB565_A5P) + { + fprintf(stderr, "Unsupported colorspace %d in %s() (%s:%d)\n", + cspace, __FUNCTION__, __FILE__, __LINE__); + return NULL; + } + + return evas_cache_engine_image_data(re->cache, + w, h, + image_data, + alpha, cspace, NULL); +} + +static void +evas_engine_sdl16_image_free(void *data, void *image) +{ + SDL_Engine_Image_Entry *eim = image; + + (void) data; + + evas_cache_engine_image_drop(&eim->cache_entry); +} + +static void* +evas_engine_sdl16_image_size_set(void *data, void *image, int w, int h) +{ + SDL_Engine_Image_Entry *eim = image; + + (void) data; + + return evas_cache_engine_image_size_set(&eim->cache_entry, w, h); +} + +static void* +evas_engine_sdl16_image_dirty_region(void *data, + void *image, + int x, int y, int w, int h) +{ + SDL_Engine_Image_Entry *eim = image; + + (void) data; + + return evas_cache_engine_image_dirty(&eim->cache_entry, x, y, w, h); +} + +static void* +evas_engine_sdl16_image_data_get(void *data, void *image, + int to_write, DATA32** image_data) +{ + SDL_Engine_Image_Entry *eim = image; + Soft16_Image *im; + + (void) data; + + if (!eim) + { + *image_data = NULL; + return NULL; + } + im = (Soft16_Image *) eim->cache_entry.src; + evas_cache_image_load_data(&im->cache_entry); + + if (to_write) + eim = (SDL_Engine_Image_Entry *) evas_cache_engine_image_alone(&eim->cache_entry, + NULL); + + /* FIXME: Handle colorspace convertion correctly. */ + if (image_data) *image_data = (DATA32 *) im->pixels; + + return eim; +} + +static void* +evas_engine_sdl16_image_data_put(void *data, void *image, DATA32* image_data) +{ + SDL_Engine_Image_Entry *eim = image; + SDL_Engine_Image_Entry *eim_new; + Render_Engine *re = data; + Soft16_Image *im; + + if (!eim) return NULL; + im = (Soft16_Image *) eim->cache_entry.src; + + /* FIXME: Handle colorspace convertion correctly. */ + if ((DATA16 *) image_data == im->pixels) return eim; + + eim_new = (SDL_Engine_Image_Entry *) evas_cache_engine_image_data(re->cache, + eim->cache_entry.w, eim->cache_entry.h, + image_data, + func.image_alpha_get(data, eim), + func.image_colorspace_get(data, eim), + NULL); + evas_cache_engine_image_drop(&eim->cache_entry); + + return eim_new; +} + +static void* +evas_engine_sdl16_image_alpha_set(void *data, void *image, int has_alpha) +{ + SDL_Engine_Image_Entry *eim = image; + Soft16_Image *im; + + (void) data; + + if (!eim) return NULL; + + im = (Soft16_Image *) eim->cache_entry.src; + + if (im->cache_entry.flags.alpha == has_alpha) return eim; + + eim = (SDL_Engine_Image_Entry *) evas_cache_engine_image_alone(&eim->cache_entry, + NULL); + + im = (Soft16_Image *) eim->cache_entry.src; + + im->cache_entry.flags.alpha = has_alpha; + eim = (SDL_Engine_Image_Entry *) evas_cache_engine_image_dirty(&eim->cache_entry, 0, 0, eim->cache_entry.w, eim->cache_entry.h); + + return eim; +} + +static void* +evas_engine_sdl16_image_border_set(void *data, void *image, int l, int r, int t, int b) +{ + return image; +} + +static void +evas_engine_sdl16_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b) +{ + /* FIXME: need to know what evas expect from this call */ +} + +static void +evas_engine_sdl16_image_draw(void *data, void *context, void *surface, void *image, + int src_region_x, int src_region_y, int src_region_w, int src_region_h, + int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h, + int smooth) +{ + SDL_Engine_Image_Entry *eim = image; + SDL_Engine_Image_Entry *dst = surface; + int mustlock_im = 0; + int mustlock_dst = 0; + + (void) data; + + evas_cache_engine_image_load_data(&eim->cache_entry); + + /* Fallback to software method */ + if (SDL_MUSTLOCK(dst->surface)) + { + mustlock_dst = 1; + SDL_LockSurface(dst->surface); + _SDL_UPDATE_PIXELS(dst); + } + + if (eim->surface && SDL_MUSTLOCK(eim->surface)) + { + mustlock_im = 1; + SDL_LockSurface(eim->surface); + _SDL_UPDATE_PIXELS(eim); + } + + soft16_image_draw((Soft16_Image *) eim->cache_entry.src, + (Soft16_Image *) dst->cache_entry.src, + context, + src_region_x, src_region_y, src_region_w, src_region_h, + dst_region_x, dst_region_y, dst_region_w, dst_region_h, + smooth); + + if (mustlock_im) + SDL_UnlockSurface(eim->surface); + + if (mustlock_dst) + SDL_UnlockSurface(dst->surface); +} + +static void +evas_engine_sdl16_image_cache_flush(void *data) +{ + Render_Engine *re = (Render_Engine*) data; + int size; + + size = evas_cache_engine_image_get(re->cache); + evas_cache_engine_image_set(re->cache, 0); + evas_cache_engine_image_set(re->cache, size); +} + +static void +evas_engine_sdl16_image_cache_set(void *data, int bytes) +{ + Render_Engine *re = (Render_Engine*) data; + + evas_cache_engine_image_set(re->cache, bytes); +} + +static int +evas_engine_sdl16_image_cache_get(void *data) +{ + Render_Engine *re = (Render_Engine*) data; + + return evas_cache_engine_image_get(re->cache); +} + +static char* +evas_engine_sdl16_image_comment_get(void *data, void *image, char *key) +{ + (void) data; + (void) image; + (void) key; + + return NULL; +} + +static char* +evas_engine_sdl16_image_format_get(void *data, void *image) +{ + /* FIXME: need to know what evas expect from this call */ + return NULL; +} + +static void +evas_engine_sdl16_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text) +{ + static RGBA_Image *im = NULL; + SDL_Engine_Image_Entry *eim = surface; + Soft16_Image *dst = (Soft16_Image *) eim->cache_entry.src; + int mustlock_im = 0; + + if (!im) + im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); + evas_cache_image_surface_alloc(&im->cache_entry, dst->cache_entry.w, dst->cache_entry.h); + + if (eim->surface && SDL_MUSTLOCK(eim->surface)) + { + mustlock_im = 1; + SDL_LockSurface(eim->surface); + _SDL_UPDATE_PIXELS(eim); + } + evas_common_draw_context_font_ext_set(context, + dst, + soft16_font_glyph_new, + soft16_font_glyph_free, + soft16_font_glyph_draw); + evas_common_font_draw(im, context, font, x, y, text); + evas_common_draw_context_font_ext_set(context, + NULL, + NULL, + NULL, + NULL); + + if (mustlock_im) + SDL_UnlockSurface(eim->surface); +} + +static void +evas_engine_sdl16_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2) +{ + SDL_Engine_Image_Entry *eim = surface; + int mustlock_im = 0; + + if (eim->surface && SDL_MUSTLOCK(eim->surface)) + { + mustlock_im = 1; + SDL_LockSurface(eim->surface); + _SDL_UPDATE_PIXELS(eim); + } + + soft16_line_draw((Soft16_Image *) eim->cache_entry.src, + context, + x1, y1, x2, y2); + + if (mustlock_im) + SDL_UnlockSurface(eim->surface); +} + +static void +evas_engine_sdl16_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h) +{ + SDL_Engine_Image_Entry *eim = surface; +#if ENGINE_SDL_PRIMITIVE + RGBA_Draw_Context *dc = context; +#endif + Soft16_Image *im; + int mustlock_im = 0; + +#if ENGINE_SDL_PRIMITIVE + if (A_VAL(&dc->col.col) != 0x00) + { + if (A_VAL(&dc->col.col) != 0xFF) + { +#endif + if (eim->surface && SDL_MUSTLOCK(eim->surface)) + { + mustlock_im = 1; + SDL_LockSurface(eim->surface); + _SDL_UPDATE_PIXELS(eim); + } + + im = (Soft16_Image *) eim->cache_entry.src; + + soft16_rectangle_draw(im, context, x, y, w, h); + + if (mustlock_im) + SDL_UnlockSurface(eim->surface); +#if ENGINE_SDL_PRIMITIVE + } + else + { + SDL_Rect dstrect; + + if (dc->clip.use) + { + SDL_Rect cliprect; + + cliprect.x = dc->clip.x; + cliprect.y = dc->clip.y; + cliprect.w = dc->clip.w; + cliprect.h = dc->clip.h; + + SDL_SetClipRect(eim->surface, &cliprect); + } + + dstrect.x = x; + dstrect.y = y; + dstrect.w = w; + dstrect.h = h; + + SDL_FillRect(eim->surface, &dstrect, SDL_MapRGBA(eim->surface->format, R_VAL(&dc->col.col), G_VAL(&dc->col.col), B_VAL(&dc->col.col), 0xFF)); + + if (dc->clip.use) + SDL_SetClipRect(eim->surface, NULL); + } + } +#endif +} + +static void +evas_engine_sdl16_polygon_draw(void *data, void *context, void *surface, void *polygon) +{ + SDL_Engine_Image_Entry *eim = surface; + int mustlock_im = 0; + + if (eim->surface && SDL_MUSTLOCK(eim->surface)) + { + mustlock_im = 1; + SDL_LockSurface(eim->surface); + _SDL_UPDATE_PIXELS(eim); + } + + soft16_polygon_draw((Soft16_Image *) eim->cache_entry.src, context, polygon); + + if (mustlock_im) + SDL_UnlockSurface(eim->surface); +} + +static void +evas_engine_sdl16_image_stride_get(void *data, void *image, int *stride) +{ + SDL_Engine_Image_Entry *eim = image; + + if (stride) *stride = 0; + if (!image) return; + if (stride) *stride = ((Soft16_Image*) eim->cache_entry.src)->stride; +} + +/* module advertising code */ +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_16")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ +#define ORD(f) EVAS_API_OVERRIDE(f, &func, evas_engine_sdl16_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(output_flush); + ORD(output_idle_flush); + ORD(image_load); + ORD(image_alpha_get); + ORD(image_size_get); + ORD(image_colorspace_get); + ORD(image_colorspace_set); + ORD(image_new_from_copied_data); + ORD(image_new_from_data); + ORD(image_free); + ORD(image_size_set); + ORD(image_dirty_region); + ORD(image_data_get); + ORD(image_data_put); + ORD(image_alpha_set); + ORD(image_border_set); + ORD(image_border_get); + ORD(image_draw); + ORD(image_cache_flush); + ORD(image_cache_set); + ORD(image_cache_get); + ORD(image_comment_get); + ORD(image_format_get); + ORD(image_stride_get); + ORD(font_draw); + ORD(line_draw); + ORD(rectangle_draw); + ORD(polygon_draw); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "software_16_sdl", + "none" +}; + +static Engine_Image_Entry* +_sdl16_image_alloc(void) +{ + SDL_Engine_Image_Entry *new; + + new = calloc(1, sizeof (SDL_Engine_Image_Entry)); + + return (Engine_Image_Entry *) new; +} + +static void +_sdl16_image_delete(Engine_Image_Entry *eim) +{ + free(eim); +} + +static int +_sdl16_image_constructor(Engine_Image_Entry *ie, void* data) +{ + SDL_Surface *sdl = NULL; + SDL_Engine_Image_Entry *eim = (SDL_Engine_Image_Entry *) ie; + Soft16_Image *im; + + im = (Soft16_Image *) ie->src; + + if (im->pixels) + { + /* FIXME: Take care of CSPACE */ + sdl = SDL_CreateRGBSurfaceFrom(im->pixels, + ie->w, ie->h, + 16, ie->w * 2, + RMASK565, GMASK565, BMASK565, AMASK565); + eim->surface = sdl; + eim->flags.engine_surface = 0; + } + + return 0; +} + +static void +_sdl16_image_destructor(Engine_Image_Entry *eim) +{ + SDL_Engine_Image_Entry *seie = (SDL_Engine_Image_Entry *) eim; + + if (seie->surface && !seie->flags.engine_surface) + SDL_FreeSurface(seie->surface); + seie->surface = NULL; +} + +static void +_sdl16_image_dirty_region(Engine_Image_Entry *eim, int x, int y, int w, int h) +{ + SDL_Engine_Image_Entry *dst; + RGBA_Image *im; + + dst = (SDL_Engine_Image_Entry *) eim; + + SDL_UpdateRect(dst->surface, x, y, w, h); + + im = (RGBA_Image *)eim->src; + im->flags |= RGBA_IMAGE_IS_DIRTY; +} + +static int +_sdl16_image_dirty(Engine_Image_Entry *dst, const Engine_Image_Entry *src) +{ + SDL_Engine_Image_Entry *eim = (SDL_Engine_Image_Entry *) dst; + SDL_Surface *sdl = NULL; + Soft16_Image *im; + + im = (Soft16_Image *) dst->src; + + /* FIXME: Take care of CSPACE */ + sdl = SDL_CreateRGBSurfaceFrom(im->pixels, + dst->w, dst->h, + 16, dst->w * 2, + RMASK565, GMASK565, BMASK565, AMASK565); + eim->surface = sdl; + eim->flags.engine_surface = 0; + + return 0; +} + +static int +_sdl16_image_size_set(Engine_Image_Entry *dst, const Engine_Image_Entry *src) +{ + SDL_Engine_Image_Entry *eim = (SDL_Engine_Image_Entry *) dst; + SDL_Surface *sdl; + Soft16_Image *im; + + im = (Soft16_Image *) dst->src; + + /* FIXME: handle im == NULL */ + sdl = SDL_CreateRGBSurfaceFrom(im->pixels, + dst->w, dst->h, + 16, dst->w * 2, + RMASK565, GMASK565, BMASK565, AMASK565); + + eim->surface = sdl; + + return 0; +} + +static int +_sdl16_image_update_data(Engine_Image_Entry* dst, void* engine_data) +{ + SDL_Engine_Image_Entry *eim = (SDL_Engine_Image_Entry *) dst; + SDL_Surface *sdl = NULL; + Soft16_Image *im; + + im = (Soft16_Image *) dst->src; + + if (engine_data) + { + sdl = engine_data; + + if (im) + { + im->pixels = sdl->pixels; + im->stride = sdl->pitch / 2; + im->flags.free_pixels = 0; +/* im->alpha = calloc(1, sizeof (DATA8) * _calc_stride(sdl->w) * sdl->h); */ +/* im->flags.free_alpha = 0; */ +/* im->flags.have_alpha = 1; */ + im->alpha = NULL; + im->flags.free_alpha = 0; + im->cache_entry.flags.alpha = 0; + + dst->src->w = sdl->w; + dst->src->h = sdl->h; + } + dst->w = sdl->w; + dst->h = sdl->h; + } + else + { + SDL_FreeSurface(eim->surface); + /* FIXME: Take care of CSPACE */ + sdl = SDL_CreateRGBSurfaceFrom(im->pixels, + dst->w, dst->h, + 16, dst->w * 2, + RMASK565, GMASK565, BMASK565, AMASK565); + } + + eim->surface = sdl; + + return 0; +} + +static void +_sdl16_image_load(Engine_Image_Entry *eim, const Image_Entry* ie_im) +{ + SDL_Engine_Image_Entry *load = (SDL_Engine_Image_Entry *) eim; + SDL_Surface *sdl; + + if (!load->surface) + { + Soft16_Image *im; + + im = (Soft16_Image *) ie_im; + + sdl = SDL_CreateRGBSurfaceFrom(im->pixels, + eim->w, eim->h, + 16, eim->w * 2, + RMASK565, GMASK565, BMASK565, AMASK565); + load->surface = sdl; + } +} + +static int +_sdl16_image_mem_size_get(Engine_Image_Entry *eim) +{ + SDL_Engine_Image_Entry *seie = (SDL_Engine_Image_Entry *) eim; + int size = 0; + + /* FIXME: Count surface size. */ + if (seie->surface) + size = sizeof (SDL_Surface) + sizeof (SDL_PixelFormat); + + return size; +} + +#ifdef DEBUG_SDL +static void +_sdl16_image_debug(const char* context, Engine_Image_Entry* im) +{ +} +#endif diff --git a/src/modules/engines/software_16_sdl/evas_engine.h b/src/modules/engines/software_16_sdl/evas_engine.h new file mode 100644 index 0000000..03a1e36 --- /dev/null +++ b/src/modules/engines/software_16_sdl/evas_engine.h @@ -0,0 +1,54 @@ +#ifndef EVAS_ENGINE_SDL_16_H +#define EVAS_ENGINE_SDL_16_H + +#include "evas_common.h" +#include "evas_private.h" +#include "evas_common_soft16.h" +#include "Evas_Engine_SDL_16.h" + +typedef struct _SDL_Engine_Image_Entry SDL_Engine_Image_Entry; +struct _SDL_Engine_Image_Entry +{ + Engine_Image_Entry cache_entry; + + SDL_Surface *surface; + + struct + { + unsigned int engine_surface : 1; + } flags; +}; + + +typedef struct _Render_Engine Render_Engine; +struct _Render_Engine +{ + SDL_Engine_Image_Entry *soft16_engine_image; + + Evas_Cache_Engine_Image *cache; + + Soft16_Image *tmp_out; + + int w; + int h; + int rot; + + Tilebuf *tb; + Tilebuf_Rect *rects; + Tilebuf_Rect *cur_rect; + + SDL_Rect *update_rects; + int update_rects_count; + int update_rects_limit; + + struct + { + unsigned int fullscreen : 1; + unsigned int noframe : 1; + unsigned int alpha : 1; + unsigned int hwsurface : 1; + unsigned int end : 1; + } flags; +}; + +#endif diff --git a/src/modules/engines/software_16_wince/.cvsignore b/src/modules/engines/software_16_wince/.cvsignore new file mode 100644 index 0000000..9730646 --- /dev/null +++ b/src/modules/engines/software_16_wince/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.la +*.lo diff --git a/src/modules/engines/software_16_wince/Evas_Engine_Software_16_WinCE.h b/src/modules/engines/software_16_wince/Evas_Engine_Software_16_WinCE.h new file mode 100644 index 0000000..1624607 --- /dev/null +++ b/src/modules/engines/software_16_wince/Evas_Engine_Software_16_WinCE.h @@ -0,0 +1,31 @@ +#ifndef __EVAS_ENGINE_SOFTWARE_16_WINCE_H__ +#define __EVAS_ENGINE_SOFTWARE_16_WINCE_H__ + + +#include + + +typedef struct _Evas_Engine_Info_Software_16_WinCE Evas_Engine_Info_Software_16_WinCE; + +struct _Evas_Engine_Info_Software_16_WinCE +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + struct { + HWND window; + int width; + int height; + int backend; /* 0: auto, 1: raw, 2: gapi, 3: ddraw */ + int rotation; + } info; + /* engine specific function calls to query stuff about messages */ + struct { + int (*suspend) (int backend); + int (*resume) (int backend); + } func; +}; + + +#endif /* __EVAS_ENGINE_SOFTWARE_16_WINCE_H__ */ diff --git a/src/modules/engines/software_16_wince/Makefile.am b/src/modules/engines/software_16_wince/Makefile.am new file mode 100644 index 0000000..d02e9af --- /dev/null +++ b/src/modules/engines/software_16_wince/Makefile.am @@ -0,0 +1,37 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +-I$(top_srcdir)/src/modules/engines/software_16 \ +@FREETYPE_CFLAGS@ + +.rc.lo: + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --tag=RC --mode=compile $(RC) $(RCFLAGS) $< -o $@ + +if BUILD_ENGINE_SOFTWARE_16_WINCE + +pkgdir = $(libdir)/evas/modules/engines/software_16_wince/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = \ +evas_engine.h \ +evas_engine.c \ +evas_wince_fb_buffer.c \ +evas_wince_gapi_buffer.c \ +evas_wince_ddraw_buffer.cpp \ +evas_wince_gapi.rc + +module_la_CFLAGS = @WIN32_CFLAGS@ +module_la_LIBADD = $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_Software_16_WinCE.h + +endif diff --git a/src/modules/engines/software_16_wince/evas_engine.c b/src/modules/engines/software_16_wince/evas_engine.c new file mode 100644 index 0000000..210ba6b --- /dev/null +++ b/src/modules/engines/software_16_wince/evas_engine.c @@ -0,0 +1,716 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Software_16_WinCE.h" +#include "evas_common_soft16.h" + + +typedef enum +{ + EVAS_ENGINE_WINCE_FB, + EVAS_ENGINE_WINCE_GAPI, + EVAS_ENGINE_WINCE_DDRAW +} Evas_Engine_WinCE_Backend; + + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func, pfunc; + +/* engine struct data */ +typedef struct _Render_Engine Render_Engine; + +struct _Render_Engine +{ + Evas_Engine_WinCE_Backend backend; /* 1: raw, 2: gapi, 3: ddraw */ + void *backend_priv; + void (*backend_shutdown)(void *priv); + FB_Output_Buffer *(*backend_output_buffer_new)(void *priv, + int width, + int height); + void (*backend_output_buffer_free)(FB_Output_Buffer *fbob); + void (*backend_output_buffer_paste)(FB_Output_Buffer *fbob); + void (*backend_surface_resize)(FB_Output_Buffer *fbob); + + int width; + int height; + int rotation; + Tilebuf *tb; + Tilebuf_Rect *rects; + Tilebuf_Rect *cur_rect; + FB_Output_Buffer *fbob; + Soft16_Image *tmp_out; /* used by indirect render, like rotation */ + HRGN clip_rects; + unsigned char end : 1; +}; + +/* prototypes we will use here */ + +static void *eng_info(Evas *e); +static void eng_info_free(Evas *e, void *info); +static void eng_setup(Evas *e, void *info); +static void eng_output_free(void *data); +static void eng_output_resize(void *data, int w, int h); +static void eng_output_tile_size_set(void *data, int w, int h); +static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h); +static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h); +static void eng_output_redraws_clear(void *data); +static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch); +static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h); +static void eng_output_flush(void *data); +static void eng_output_idle_flush(void *data); + +static int +_suspend(int backend) +{ + switch (backend) + { + case 2: /* gapi */ + return evas_software_wince_gapi_suspend(); + default: /* other engines do not need it */ + return 0; + } +} + +static int +_resume(int backend) +{ + switch (backend) + { + case 2: /* gapi */ + return evas_software_wince_gapi_resume(); + default: /* other engines do not need it */ + return 0; + } +} + +/* engine api this module provides */ +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_Software_16_WinCE *info; + + info = calloc(1, sizeof(Evas_Engine_Info_Software_16_WinCE)); + if (!info) return NULL; + info->magic.magic = rand(); + info->func.suspend = _suspend; + info->func.resume = _resume; + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_Software_16_WinCE *in; + + in = (Evas_Engine_Info_Software_16_WinCE *)info; + free(in); +} + +static void +_tmp_out_alloc(Render_Engine *re) +{ + Tilebuf_Rect *r; + int w = 0, h = 0; + + for (r = re->rects; r; r = (Tilebuf_Rect *)(r->_list_data.next)) + { + if (r->w > w) w = r->w; + if (r->h > h) h = r->h; + } + + if (re->tmp_out) + { + if ((re->tmp_out->cache_entry.w < w) || (re->tmp_out->cache_entry.h < h)) + { + evas_cache_image_drop(&re->tmp_out->cache_entry); + re->tmp_out = NULL; + } + } + + if (!re->tmp_out) + { + Soft16_Image *im; + + im = (Soft16_Image *) evas_cache_image_empty(evas_common_soft16_image_cache_get()); + im->cache_entry.flags.alpha = 0; + evas_cache_image_surface_alloc(&im->cache_entry, w, h); + + re->tmp_out = im; + } +} + + +static void +eng_setup(Evas *e, void *in) +{ + Render_Engine *re; + Evas_Engine_Info_Software_16_WinCE *info; + + info = (Evas_Engine_Info_Software_16_WinCE *)in; + if (!e->engine.data.output) + { + /* do common routine init - we wil at least use it for core + * image loading and font loading/glyph rendering & placement */ + evas_common_cpu_init(); + + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + evas_common_soft16_image_init(); + + /* render engine specific data */ + re = calloc(1, sizeof(Render_Engine)); + if (!re) + return; + e->engine.data.output = re; + + switch(info->info.backend) + { + case 1: /* FB */ + re->backend = EVAS_ENGINE_WINCE_FB; + re->backend_priv = evas_software_wince_fb_init(info->info.window, info->info.width, info->info.height); + if (!re->backend_priv) + { + free(re); + return; + } + re->backend_shutdown = evas_software_wince_fb_shutdown; + re->backend_output_buffer_new = evas_software_wince_fb_output_buffer_new; + re->backend_output_buffer_free = evas_software_wince_fb_output_buffer_free; + re->backend_output_buffer_paste = evas_software_wince_fb_output_buffer_paste; + re->backend_surface_resize = evas_software_wince_fb_surface_resize; + break; + case 2: /* GAPI */ + re->backend = EVAS_ENGINE_WINCE_GAPI; + re->backend_priv = evas_software_wince_gapi_init(info->info.window, info->info.width, info->info.height); + if (!re->backend_priv) + { + free(re); + return; + } + re->backend_shutdown = evas_software_wince_gapi_shutdown; + re->backend_output_buffer_new = evas_software_wince_gapi_output_buffer_new; + re->backend_output_buffer_free = evas_software_wince_gapi_output_buffer_free; + re->backend_output_buffer_paste = evas_software_wince_gapi_output_buffer_paste; + re->backend_surface_resize = evas_software_wince_gapi_surface_resize; + break; + case 3: /* DirectDraw */ + re->backend = EVAS_ENGINE_WINCE_DDRAW; + re->backend_priv = evas_software_wince_ddraw_init(info->info.window, info->info.width, info->info.height); + if (!re->backend_priv) + { + free(re); + return; + } + re->backend_shutdown = evas_software_wince_ddraw_shutdown; + re->backend_output_buffer_new = evas_software_wince_ddraw_output_buffer_new; + re->backend_output_buffer_free = evas_software_wince_ddraw_output_buffer_free; + re->backend_output_buffer_paste = evas_software_wince_ddraw_output_buffer_paste; + re->backend_surface_resize = evas_software_wince_ddraw_surface_resize; + break; + default: + free(re); + return; + } + + re->width = e->output.w; + re->height = e->output.h; + re->rotation = info->info.rotation; + re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + } + else + { + re = e->engine.data.output; + if (re->tb) evas_common_tilebuf_free(re->tb); + + switch(info->info.backend) + { + case 1: /* FB */ + re->backend = EVAS_ENGINE_WINCE_FB; + re->backend_priv = evas_software_wince_fb_init(info->info.window, info->info.width, info->info.height); + if (!re->backend_priv) + { + free(re); + return; + } + re->backend_shutdown = evas_software_wince_fb_shutdown; + re->backend_output_buffer_new = evas_software_wince_fb_output_buffer_new; + re->backend_output_buffer_free = evas_software_wince_fb_output_buffer_free; + re->backend_output_buffer_paste = evas_software_wince_fb_output_buffer_paste; + re->backend_surface_resize = evas_software_wince_fb_surface_resize; + break; + case 2: /* GAPI */ + re->backend = EVAS_ENGINE_WINCE_GAPI; + re->backend_priv = evas_software_wince_gapi_init(info->info.window, info->info.width, info->info.height); + if (!re->backend_priv) + { + free(re); + return; + } + re->backend_shutdown = evas_software_wince_gapi_shutdown; + re->backend_output_buffer_new = evas_software_wince_gapi_output_buffer_new; + re->backend_output_buffer_free = evas_software_wince_gapi_output_buffer_free; + re->backend_output_buffer_paste = evas_software_wince_gapi_output_buffer_paste; + re->backend_surface_resize = evas_software_wince_gapi_surface_resize; + break; + case 3: /* DirectDraw */ + re->backend = EVAS_ENGINE_WINCE_DDRAW; + re->backend_priv = evas_software_wince_ddraw_init(info->info.window, info->info.width, info->info.height); + if (!re->backend_priv) + { + free(re); + return; + } + re->backend_shutdown = evas_software_wince_ddraw_shutdown; + re->backend_output_buffer_new = evas_software_wince_ddraw_output_buffer_new; + re->backend_output_buffer_free = evas_software_wince_ddraw_output_buffer_free; + re->backend_output_buffer_paste = evas_software_wince_ddraw_output_buffer_paste; + re->backend_surface_resize = evas_software_wince_ddraw_surface_resize; + break; + default: + free(re); + return; + } + + re->width = e->output.w; + re->height = e->output.h; + re->rotation = info->info.rotation; + re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + if (re->tmp_out) + { + evas_cache_image_drop(&re->tmp_out->cache_entry); + re->tmp_out = NULL; + } + } + if (!e->engine.data.output) return; + /* add a draw context if we dont have one */ + if (!e->engine.data.context) + e->engine.data.context = + e->engine.func->context_new(e->engine.data.output); +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (re->fbob) re->backend_output_buffer_free(re->backend_priv); + re->backend_shutdown(re->backend_priv); + if (re->clip_rects) DeleteObject(re->clip_rects); + if (re->tb) evas_common_tilebuf_free(re->tb); + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + if (re->tmp_out) evas_cache_image_drop(&re->tmp_out->cache_entry); + free(re); + + evas_common_font_shutdown(); + evas_common_image_shutdown(); + evas_common_soft16_image_shutdown(); +} + +static void +eng_output_resize(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + + if ((re->width == w) && (re->height == h)) return; + + /* FIXME: is it needed ?? */ + if (re->fbob) + re->backend_surface_resize(re->fbob); + + evas_common_tilebuf_free(re->tb); + re->width = w; + re->height = h; + re->tb = evas_common_tilebuf_new(w, h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + if (re->fbob) + { + re->backend_output_buffer_free(re->fbob); + re->fbob = NULL; + } + if (re->clip_rects) + { + DeleteObject(re->clip_rects); + re->clip_rects = NULL; + } + if (re->tmp_out) + { + evas_cache_image_drop(&re->tmp_out->cache_entry); + re->tmp_out = NULL; + } +} + +static void +eng_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_set_tile_size(re->tb, w, h); +} + +static void +eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_clear(re->tb); +} + +static inline void +_output_buffer_alloc(Render_Engine *re) +{ + int width; + int height; + + if (re->fbob) return; + + if ((re->rotation == 0) || (re->rotation == 180)) + { + width = re->width; + height = re->height; + } + else + { + width = re->height; + height = re->width; + } + + re->fbob = re->backend_output_buffer_new(re->backend_priv, + width, + height); +} + +static void * +eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + Tilebuf_Rect *rect; + int ux, uy, uw, uh; + + re = (Render_Engine *)data; + if (re->end) + { + re->end = 0; + return NULL; + } + if (!re->rects) + { + re->rects = evas_common_tilebuf_get_render_rects(re->tb); + if (!re->rects) return NULL; + + re->cur_rect = re->rects; + _output_buffer_alloc(re); + if (re->rotation != 0) _tmp_out_alloc(re); /* grows if required */ + } + if (!re->cur_rect) + { + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + return NULL; + } + rect = re->cur_rect; + ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h; + re->cur_rect = (Tilebuf_Rect *)(re->cur_rect->_list_data.next); + if (!re->cur_rect) + { + evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + re->end = 1; + } + + *x = ux; *y = uy; *w = uw; *h = uh; + if (re->rotation == 0) + { + *cx = ux; *cy = uy; *cw = uw; *ch = uh; + return re->fbob->im; + } + else + { + *cx = 0; *cy = 0; *cw = uw; *ch = uh; + return re->tmp_out; + } +} + +static void +_blit_rot_90(Soft16_Image *dst, const Soft16_Image *src, + int out_x, int out_y, int w, int h) +{ + DATA16 *dp, *sp; + int x, y; + + sp = src->pixels; + dp = dst->pixels + (out_x + + (w + out_y - 1) * dst->stride); + + for (y = 0; y < h; y++) + { + DATA16 *dp_itr, *sp_itr; + + sp_itr = sp; + dp_itr = dp; + + for (x = 0; x < w; x++) + { + *dp_itr = *sp_itr; + + sp_itr++; + dp_itr -= dst->stride; + } + sp += src->stride; + dp++; + } +} + +static void +_blit_rot_180(Soft16_Image *dst, const Soft16_Image *src, + int out_x, int out_y, int w, int h) +{ + DATA16 *dp, *sp; + int x, y; + + sp = src->pixels; + dp = dst->pixels + ((w + out_x - 1) + + (h + out_y - 1) * dst->stride); + + for (y = 0; y < h; y++) + { + DATA16 *dp_itr, *sp_itr; + + sp_itr = sp; + dp_itr = dp; + + for (x = 0; x < w; x++) + { + *dp_itr = *sp_itr; + + sp_itr++; + dp_itr--; + } + sp += src->stride; + dp -= dst->stride; + } +} + +static void +_blit_rot_270(Soft16_Image *dst, const Soft16_Image *src, + int out_x, int out_y, int w, int h) +{ + DATA16 *dp, *sp; + int x, y; + + sp = src->pixels; + dp = dst->pixels + ((h + out_x - 1) + + out_y * dst->stride); + + for (y = 0; y < h; y++) + { + DATA16 *dp_itr, *sp_itr; + + sp_itr = sp; + dp_itr = dp; + + for (x = 0; x < w; x++) + { + *dp_itr = *sp_itr; + + sp_itr++; + dp_itr += dst->stride; + } + sp += src->stride; + dp--; + } +} + +static void +_tmp_out_process(Render_Engine *re, int out_x, int out_y, int w, int h) +{ + Soft16_Image *d, *s; + + d = re->fbob->im; + s = re->tmp_out; + + if ((w < 1) || (h < 1) || (out_x >= d->cache_entry.w) || (out_y >= d->cache_entry.h)) + return; + + if (re->rotation == 90) + _blit_rot_90(d, s, out_x, out_y, w, h); + else if (re->rotation == 180) + _blit_rot_180(d, s, out_x, out_y, w, h); + else if (re->rotation == 270) + _blit_rot_270(d, s, out_x, out_y, w, h); +} + +static void +eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + HRGN region; + int xx; + int yy; + int width; + int height; + + re = (Render_Engine *)data; + + if (!re->clip_rects) + re->clip_rects = CreateRectRgn(0, 0, 0, 0); + + if (re->rotation == 0) + { + xx = x; + yy = y; + width = w; + height = h; + } + else if (re->rotation == 90) + { + xx = y; + yy = re->width - w - x; + width = h; + height = w; + } + else if (re->rotation == 180) + { + xx = re->width - w - x; + yy = re->height - h - y; + width = w; + height = h; + } + else if (re->rotation == 270) + { + xx = re->height - h - y; + yy = x; + width = h; + height = w; + } + + region = CreateRectRgn(xx, yy, xx + width, yy + height); + + if (re->rotation != 0) + _tmp_out_process(re, xx, yy, w, h); + CombineRgn(re->clip_rects, re->clip_rects, region, RGN_OR); +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (re->clip_rects) + { + /* FIXME : i have to manage that */ +/* XSetRegion(re->disp, re->gc, re->clip_rects); */ + DeleteObject(re->clip_rects); + re->clip_rects = NULL; + } + else return; + + re->backend_output_buffer_paste(re->fbob); + + /* FIXME : i have to manage that */ +/* XSetClipMask(re->disp, re->gc, None); */ +} + +static void +eng_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (re->fbob) + { + re->backend_output_buffer_free(re->fbob); + re->fbob = NULL; + } + if (re->clip_rects) + { + DeleteObject(re->clip_rects); + re->clip_rects = NULL; + } + if (re->tmp_out) + { + evas_cache_image_drop(&re->tmp_out->cache_entry); + re->tmp_out = NULL; + } +} + + +/* module advertising code */ +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_16")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ +#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(output_flush); + ORD(output_idle_flush); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "software_16_wince_fb", + "none" +}; diff --git a/src/modules/engines/software_16_wince/evas_engine.h b/src/modules/engines/software_16_wince/evas_engine.h new file mode 100644 index 0000000..da762c4 --- /dev/null +++ b/src/modules/engines/software_16_wince/evas_engine.h @@ -0,0 +1,80 @@ +#ifndef __EVAS_ENGINE_H__ +#define __EVAS_ENGINE_H__ + + +#define WIN32_LEAN_AND_MEAN +#include +#undef WIN32_LEAN_AND_MEAN + +#include "evas_common_soft16.h" + + +typedef struct _FB_Output_Buffer FB_Output_Buffer; + +struct _FB_Output_Buffer +{ + Soft16_Image *im; + void *priv; +}; + + +/* Raw FrameBuffer */ + +void *evas_software_wince_fb_init (HWND window, + int width, + int height); +FB_Output_Buffer *evas_software_wince_fb_output_buffer_new (void *priv, + int width, + int height); +void evas_software_wince_fb_shutdown(void *priv); +void evas_software_wince_fb_output_buffer_free (FB_Output_Buffer *fbob); +void evas_software_wince_fb_output_buffer_paste (FB_Output_Buffer *fbob); + +void evas_software_wince_fb_surface_resize(FB_Output_Buffer *fbob); + + +/* GAPI */ + +void *evas_software_wince_gapi_init (HWND window, + int width, + int height); +FB_Output_Buffer *evas_software_wince_gapi_output_buffer_new (void *priv, + int width, + int height); +void evas_software_wince_gapi_shutdown(void *priv); +void evas_software_wince_gapi_output_buffer_free (FB_Output_Buffer *fbob); +void evas_software_wince_gapi_output_buffer_paste (FB_Output_Buffer *fbob); + +void evas_software_wince_gapi_surface_resize(FB_Output_Buffer *fbob); + +void *evas_software_wince_gapi_default_keys(void); +int evas_software_wince_gapi_suspend(void); +int evas_software_wince_gapi_resume(void); + + +/* DirectDraw */ + +#ifdef __cplusplus +extern "C" { +#endif + + +void *evas_software_wince_ddraw_init (HWND window, + int width, + int height); +FB_Output_Buffer *evas_software_wince_ddraw_output_buffer_new (void *priv, + int width, + int height); +void evas_software_wince_ddraw_shutdown(void *priv); +void evas_software_wince_ddraw_output_buffer_free (FB_Output_Buffer *fbob); +void evas_software_wince_ddraw_output_buffer_paste (FB_Output_Buffer *fbob); + +void evas_software_wince_ddraw_surface_resize(FB_Output_Buffer *fbob); + + +#ifdef __cplusplus +} +#endif + + +#endif /* __EVAS_ENGINE_H__ */ diff --git a/src/modules/engines/software_16_wince/evas_wince_ddraw_buffer.cpp b/src/modules/engines/software_16_wince/evas_wince_ddraw_buffer.cpp new file mode 100644 index 0000000..a895bc0 --- /dev/null +++ b/src/modules/engines/software_16_wince/evas_wince_ddraw_buffer.cpp @@ -0,0 +1,195 @@ + +#include + +#define WIN32_LEAN_AND_MEAN +#include +#undef WIN32_LEAN_AND_MEAN +#include + +#include "evas_common.h" +#include "evas_engine.h" + + +typedef LONG (*fct_DirectDrawCreate)(LPGUID, LPUNKNOWN *, LPUNKNOWN *); + +fct_DirectDrawCreate lib_DirectDrawCreate; + +typedef struct Evas_Engine_WinCE_DDraw_Priv Evas_Engine_WinCE_DDraw_Priv; + +struct Evas_Engine_WinCE_DDraw_Priv +{ + HMODULE module; + LPDIRECTDRAW object; + LPDIRECTDRAWSURFACE surface; + int width; + int height; + int stride; +}; + +void * +evas_software_wince_ddraw_init(HWND window, + int width, + int height) +{ + DDSURFACEDESC surface_desc; + Evas_Engine_WinCE_DDraw_Priv *priv; + HRESULT res; + + priv = (Evas_Engine_WinCE_DDraw_Priv *)malloc(sizeof(Evas_Engine_WinCE_DDraw_Priv)); + if (!priv) + return NULL; + + priv->module = LoadLibrary(L"ddraw.dll"); + if (!priv->module) + { + std::cerr << "[Evas] [Engine] [WinCE DDraw] Can not load ddraw.dll" << std::endl; + goto free_priv; + } + + lib_DirectDrawCreate = (fct_DirectDrawCreate)GetProcAddress(priv->module, L"DirectDrawCreate"); + if (!lib_DirectDrawCreate) + { + std::cerr << "[Evas] [Engine] [WinCE DDraw] Can not initialize DirectDraw" << std::endl; + goto free_lib; + } + + res = lib_DirectDrawCreate(NULL, (IUnknown**)&priv->object, NULL); + if (FAILED(res)) + { + std::cerr << "[Evas] [Engine] [WinCE DDraw] Can not create DirectDraw object" << std::endl; + goto free_lib; + } + + res = priv->object->SetCooperativeLevel(window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + if (FAILED(res)) + { + std::cerr<< "[Evas] [Engine] [WinCE DDraw] Can not set window to fullscreen" << std::endl; + goto release_object; + } + + memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + surface_desc.dwFlags = DDSD_CAPS; + surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + + res = priv->object->CreateSurface(&surface_desc, &priv->surface, NULL); + if (FAILED(res)) + { + std::cerr << "[Evas] [Engine] [WinCE DDraw] Can not create surface" << std::endl; + goto release_object; + } + + memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + res = priv->surface->Lock(NULL, &surface_desc, DDLOCK_READONLY, NULL); + if (FAILED(res)) + { + std::cerr << "[Evas] [Engine] [WinCE DDraw] Can not lock surface" << std::endl; + goto release_surface; + } + + priv->width = surface_desc.dwWidth; + priv->height = surface_desc.dwHeight; + priv->stride = surface_desc.lPitch / 2; + + if ((priv->width != width) || + (priv->height != height)) + { + std::cerr << "[Evas] [Engine] [WinCE DDraw] Size mismatch" << std::endl; + std::cerr << "[Evas] [Engine] [WinCE DDraw] asked: " << width << "x" << height << std::endl; + std::cerr << "[Evas] [Engine] [WinCE DDraw] got : " << priv->width << "x" << priv->height << std::endl; + goto release_surface; + } + + res = priv->surface->Unlock(NULL); + if (FAILED(res)) + { + std::cerr << "[Evas] [Engine] [WinCE DDraw] Can not unlock surface" << std::endl; + goto release_surface; + } + + return priv; + + release_surface: + priv->surface->Release(); + release_object: + priv->object->Release(); + free_lib: + FreeLibrary(priv->module); + free_priv: + free(priv); + + return 0; +} + +void +evas_software_wince_ddraw_shutdown(void *priv) +{ + ((Evas_Engine_WinCE_DDraw_Priv *)priv)->surface->Release(); + ((Evas_Engine_WinCE_DDraw_Priv *)priv)->object->Release(); + FreeLibrary(((Evas_Engine_WinCE_DDraw_Priv *)priv)->module); + free(priv); +} + + +FB_Output_Buffer * +evas_software_wince_ddraw_output_buffer_new(void *priv, + int width, + int height) +{ + FB_Output_Buffer *fbob; + void *buffer; + + fbob = (FB_Output_Buffer *)calloc(1, sizeof(FB_Output_Buffer)); + if (!fbob) return NULL; + + buffer = malloc (width * height * 2); /* we are sure to have 16bpp */ + if (!buffer) + { + free(fbob); + return NULL; + } + + fbob->priv = priv; + + fbob->im = (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), width, height, (DATA32 *)buffer, 0, EVAS_COLORSPACE_RGB565_A5P); + if (fbob->im) + fbob->im->stride = ((Evas_Engine_WinCE_DDraw_Priv *)priv)->stride; + + return fbob; +} + +void +evas_software_wince_ddraw_output_buffer_free(FB_Output_Buffer *fbob) +{ + free(fbob->im->pixels); + free(fbob); +} + +void +evas_software_wince_ddraw_output_buffer_paste(FB_Output_Buffer *fbob) +{ + DDSURFACEDESC surface_desc; + Evas_Engine_WinCE_DDraw_Priv *priv; + HRESULT res; + + priv = (Evas_Engine_WinCE_DDraw_Priv *)fbob->priv; + + memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + res = priv->surface->Lock(NULL, &surface_desc, DDLOCK_WRITEONLY, NULL); + if (FAILED(res)) + return; + + if ((fbob->im->cache_entry.w == surface_desc.dwWidth) && + (fbob->im->cache_entry.h == surface_desc.dwHeight)) + memcpy(surface_desc.lpSurface, fbob->im->pixels, + surface_desc.dwWidth * surface_desc.dwHeight * 2); + + priv->surface->Unlock(NULL); +} + +void +evas_software_wince_ddraw_surface_resize(FB_Output_Buffer *fbob) +{ +} diff --git a/src/modules/engines/software_16_wince/evas_wince_fb_buffer.c b/src/modules/engines/software_16_wince/evas_wince_fb_buffer.c new file mode 100644 index 0000000..165e752 --- /dev/null +++ b/src/modules/engines/software_16_wince/evas_wince_fb_buffer.c @@ -0,0 +1,212 @@ +#include "evas_common.h" +#include "evas_engine.h" + + +#define GETGXINFO 0x00020000 + +typedef struct GXDeviceInfo +{ + long Version; //00 (should filled with 100 before calling ExtEscape) + void *pvFrameBuffer; //04 + unsigned long cbStride; //08 + unsigned long cxWidth; //0c + unsigned long cyHeight; //10 + unsigned long cBPP; //14 + unsigned long ffFormat; //18 + char Unused[0x84 - 7 * 4]; +} GXDeviceInfo; + + +#define GETRAWFRAMEBUFFER 0x00020001 + +typedef struct _RawFrameBufferInfo +{ + WORD wFormat; + WORD wBPP; + VOID *pFramePointer; + int cxStride; + int cyStride; + int cxPixels; + int cyPixels; +} RawFrameBufferInfo; + + +typedef struct Evas_Engine_WinCE_FB_Priv Evas_Engine_WinCE_FB_Priv; + +struct Evas_Engine_WinCE_FB_Priv +{ + int width; + int height; + void *buffer; +}; + +static int +_evas_software_wince_gxinfo_init(HDC dc, int *width, int *height, void **buffer) +{ + GXDeviceInfo gxInfo = { 0 }; + int result; + + gxInfo.Version = 100; + result = ExtEscape(dc, GETGXINFO, 0, NULL, sizeof(gxInfo), + (char *) &gxInfo); + if (result <= 0) + { + fprintf (stderr, "[Evas] [Engine] [WinCE FB] ExtEscape() with GETGXINFO failed\n"); + return 0; + } + + *width = gxInfo.cyHeight; + *height = gxInfo.cxWidth; + *buffer = gxInfo.pvFrameBuffer; + + return 1; +} + +void * +evas_software_wince_fb_init(HWND window, + int width, + int height) +{ + WCHAR oemstr[100]; + RawFrameBufferInfo rfbi; + HDC dc; + Evas_Engine_WinCE_FB_Priv *priv; + + priv = (Evas_Engine_WinCE_FB_Priv *)malloc(sizeof(Evas_Engine_WinCE_FB_Priv)); + if (!priv) + return NULL; + + dc = GetDC (window); + if (!dc) + { + fprintf (stderr, "[Evas] [Engine] [WinCE FB] Can not get DC\n"); + free(priv); + return NULL; + } + + SystemParametersInfo (SPI_GETOEMINFO, sizeof (oemstr), oemstr, 0); + if (((oemstr[12] == 'H') && + (oemstr[13] == '3') && + (oemstr[14] == '8')) || + ((oemstr[12] == 'H') && + (oemstr[13] == '3') && + (oemstr[14] == '9'))) + { + if (!_evas_software_wince_gxinfo_init(dc, &priv->width, &priv->height, &priv->buffer)) + { + ReleaseDC(window, dc); + free(priv); + return NULL; + } + + if ((priv->width != width) || + (priv->height != height)) + { + fprintf (stderr, "[Evas] [Engine] [WinCE FB] Size mismatch\n"); + fprintf (stderr, "[Evas] [Engine] [WinCE FB] asked: %dx%d\n", width, height); + fprintf (stderr, "[Evas] [Engine] [WinCE FB] got : %dx%d\n", priv->width, priv->height); + ReleaseDC(window, dc); + free(priv); + return NULL; + } + + ReleaseDC(window, dc); + + return priv; + } + + if (!ExtEscape(dc, GETRAWFRAMEBUFFER, 0, 0, sizeof(rfbi), (char *) &rfbi)|| + (rfbi.wBPP != 16) || + (rfbi.wFormat != 1)) + { + fprintf (stderr, "[Evas] [Engine] [WinCE FB] ExtEscape() with GETRAWFRAMEBUFFER failed\n"); + fprintf (stderr, "[Evas] [Engine] [WinCE FB] trying ExtEscape() with GETGXINFO\n"); + if (!_evas_software_wince_gxinfo_init(dc, &priv->width, &priv->height, &priv->buffer)) + { + ReleaseDC(window, dc); + free(priv); + return NULL; + } + + ReleaseDC(window, dc); + return priv; + } + + priv->width = rfbi.cxPixels; + priv->height = rfbi.cyPixels; + priv->buffer = rfbi.pFramePointer; + + if ((priv->width != width) || + (priv->height != height)) + { + fprintf (stderr, "[Evas] [Engine] [WinCE FB] Size mismatch\n"); + fprintf (stderr, "[Evas] [Engine] [WinCE FB] asked: %dx%d\n", width, height); + fprintf (stderr, "[Evas] [Engine] [WinCE FB] got : %dx%d\n", priv->width, priv->height); + ReleaseDC(window, dc); + free(priv); + return NULL; + } + + ReleaseDC(window, dc); + + return priv; +} + +void +evas_software_wince_fb_shutdown(void *priv) +{ + free(priv); +} + + +FB_Output_Buffer * +evas_software_wince_fb_output_buffer_new(void *priv, + int width, + int height) +{ + FB_Output_Buffer *fbob; + void *buffer; + + fbob = calloc(1, sizeof(FB_Output_Buffer)); + if (!fbob) return NULL; + + buffer = malloc (width * height * 2); /* we are sure to have 16bpp */ + if (!buffer) + { + free(fbob); + return NULL; + } + + fbob->priv = priv; + + fbob->im = (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), width, height, (DATA32 *)buffer, 0, EVAS_COLORSPACE_RGB565_A5P); + if (fbob->im) + fbob->im->stride = width; + + return fbob; +} + +void +evas_software_wince_fb_output_buffer_free(FB_Output_Buffer *fbob) +{ + free(fbob->im->pixels); + free(fbob); +} + +void +evas_software_wince_fb_output_buffer_paste(FB_Output_Buffer *fbob) +{ + Evas_Engine_WinCE_FB_Priv *priv; + + priv = (Evas_Engine_WinCE_FB_Priv *)fbob->priv; + + if ((fbob->im->cache_entry.w == priv->width) && + (fbob->im->cache_entry.h == priv->height)) + memcpy(priv->buffer, fbob->im->pixels, + priv->width * priv->height * 2); +} + +void +evas_software_wince_fb_surface_resize(FB_Output_Buffer *fbob) +{ +} diff --git a/src/modules/engines/software_16_wince/evas_wince_gapi.rc b/src/modules/engines/software_16_wince/evas_wince_gapi.rc new file mode 100644 index 0000000..2a185cd --- /dev/null +++ b/src/modules/engines/software_16_wince/evas_wince_gapi.rc @@ -0,0 +1 @@ +HI_RES_AWARE CEUX {1} diff --git a/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c b/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c new file mode 100644 index 0000000..486b095 --- /dev/null +++ b/src/modules/engines/software_16_wince/evas_wince_gapi_buffer.c @@ -0,0 +1,342 @@ +#include "evas_common.h" +#include "evas_engine.h" + + +typedef int (*evas_engine_wince_close_display)(); + +typedef struct Evas_Engine_WinCE_GAPI_Priv Evas_Engine_WinCE_GAPI_Priv; + + +#define GETGXINFO 0x00020000 + +typedef struct +{ + long Version; //00 (should filled with 100 before calling ExtEscape) + void *pvFrameBuffer; //04 + unsigned long cbStride; //08 + unsigned long cxWidth; //0c + unsigned long cyHeight; //10 + unsigned long cBPP; //14 + unsigned long ffFormat; //18 + char Unused[0x84 - 7 * 4]; +} _GXDeviceInfo; + + +#define LINK(type,name,import) \ + name = (gapi_##type)GetProcAddress (gapi_lib, import) + +#define GX_FULLSCREEN 0x01 +#define GX_NORMALKEYS 0x02 + +#define kfDirect555 0x40 +#define kfDirect565 0x80 + + +typedef struct +{ + DWORD cxWidth; + DWORD cyHeight; + LONG cbxPitch; + LONG cbyPitch; + LONG cBPP; + DWORD ffFormat; +} _GAPI_Display_Properties; + +typedef int (*gapi_display_open)(HWND hWnd, DWORD dwFlags); +typedef int (*gapi_display_close)(); +typedef _GAPI_Display_Properties (*gapi_display_properties_get)(void); +typedef void* (*gapi_draw_begin)(void); +typedef int (*gapi_draw_end)(void); +typedef int (*gapi_suspend)(void); +typedef int (*gapi_resume)(void); + +gapi_suspend suspend = NULL; +gapi_resume resume = NULL; + +int +evas_software_wince_gapi_suspend(void) +{ + if (suspend) + return suspend(); + else + return 0; +} + +int +evas_software_wince_gapi_resume(void) +{ + if (resume) + return resume(); + else + return 0; +} + + +struct Evas_Engine_WinCE_GAPI_Priv +{ + HMODULE lib; + gapi_display_close close_display; + gapi_draw_begin draw_begin; + gapi_draw_end draw_end; + void *buffer; + int width; + int height; + int stride; +}; + +void * +evas_software_wince_gapi_init(HWND window, + int width, + int height) +{ + WCHAR oemstr[100]; + _GAPI_Display_Properties prop; + HMODULE gapi_lib; + Evas_Engine_WinCE_GAPI_Priv *priv; + + gapi_display_open display_open = NULL; + gapi_display_close display_close = NULL; + gapi_display_properties_get display_properties_get = NULL; + gapi_draw_begin draw_begin = NULL; + gapi_draw_end draw_end = NULL; + + priv = (Evas_Engine_WinCE_GAPI_Priv *)malloc(sizeof(Evas_Engine_WinCE_GAPI_Priv)); + if (!priv) + return NULL; + + gapi_lib = LoadLibrary(L"\\Windows\\gx.dll"); + if (!gapi_lib) + { + gapi_lib = LoadLibrary(L"gx.dll"); + if (!gapi_lib) + { + fprintf (stderr, "[Evas] [Engine] [WinCE GAPI] Can not load gx.dll\n"); + goto free_priv; + } + } + + LINK(display_open, display_open, L"?GXOpenDisplay@@YAHPAUHWND__@@K@Z"); + LINK(display_close, display_close, L"?GXCloseDisplay@@YAHXZ"); + LINK(display_properties_get, display_properties_get, L"?GXGetDisplayProperties@@YA?AUGXDisplayProperties@@XZ"); + LINK(draw_begin, draw_begin, L"?GXBeginDraw@@YAPAXXZ"); + LINK(draw_end, draw_end, L"?GXEndDraw@@YAHXZ"); + LINK(suspend, suspend, L"?GXSuspend@@YAHXZ" ); + LINK(resume, resume, L"?GXResume@@YAHXZ" ); + + if (!display_open || + !display_close || + !display_properties_get || + !draw_begin || + !draw_end || + !suspend || + !resume) + { + fprintf (stderr, "[Evas] [Engine] [WinCE GAPI] Can not find valid symbols\n"); + goto free_lib; + } + + if (!display_open(window, GX_FULLSCREEN)) + { + fprintf (stderr, "[Evas] [Engine] [WinCE GAPI] Can not open display\n"); + goto free_lib; + } + + prop = display_properties_get(); + + // verify pixel format + if(!(prop.ffFormat & kfDirect565) || (prop.cBPP != 16)) + { + fprintf (stderr, "[Evas] [Engine] [WinCE GAPI] display format mismatch\n"); + goto close_display; + } + + // verify we have a vga device + if ((GetSystemMetrics(SM_CXSCREEN) != (int)prop.cxWidth) || + (GetSystemMetrics(SM_CYSCREEN) != (int)prop.cyHeight)) + { + fprintf (stderr, "[Evas] [Engine] [WinCE GAPI] display size mismatch\n"); + goto close_display; + } + + priv->lib = gapi_lib; + priv->close_display = display_close; + priv->draw_begin = draw_begin; + priv->draw_end = draw_end; + + /* GAPI on Ipaq H38** and H39** is completely buggy */ + /* They are detected as portrait device (width = 240 and height = 320) */ + /* but the framebuffer is managed like a landscape device : */ + /* + 240 + +---------+ + | | + | | + | | + | | + | | 320 + | ^^^ | + | ||| | + | ||| | + | ||| | + +---------+ + ----> + + */ + /* So these devices are considered as landscape devices */ + /* and width and height are switched. */ + /* Other devices are managed normally : */ + /* + 240 + +---------+ +| |---> | +| |---> | +| |---> | +v | | + | | 320 + | | + | | + | | + | | + +---------+ + + */ + + SystemParametersInfo (SPI_GETOEMINFO, sizeof (oemstr), oemstr, 0); + + if (((oemstr[12] == 'H') && + (oemstr[13] == '3') && + (oemstr[14] == '8')) || + ((oemstr[12] == 'H') && + (oemstr[13] == '3') && + (oemstr[14] == '9'))) + { + _GXDeviceInfo gxInfo = { 0 }; + HDC dc; + int result; + + priv->width = prop.cyHeight; + priv->height = prop.cxWidth; + priv->stride = prop.cbxPitch; + + dc = GetDC (window); + if (!dc) + { + fprintf (stderr, "[Evas] [Engine] [WinCE GAPI] Can not get device\n"); + goto close_display; + } + + gxInfo.Version = 100; + result = ExtEscape(dc, GETGXINFO, 0, NULL, sizeof(gxInfo), + (char *) &gxInfo); + if (result <= 0) + { + fprintf (stderr, "[Evas] [Engine] [WinCE GAPI] ExtEscape failed\n"); + ReleaseDC(window, dc); + goto close_display; + } + + priv->buffer = gxInfo.pvFrameBuffer; + ReleaseDC(window, dc); + } + else + { + priv->width = prop.cxWidth; + priv->height = prop.cyHeight; + priv->stride = prop.cbyPitch; + priv->buffer = NULL; + } + + if ((priv->width != width) || + (priv->height != height)) + { + fprintf (stderr, "[Evas] [Engine] [WinCE GAPI] Size mismatch\n"); + fprintf (stderr, "[Evas] [Engine] [WinCE GAPI] asked: %dx%d\n", width, height); + fprintf (stderr, "[Evas] [Engine] [WinCE GAPI] got : %dx%d\n", priv->width, priv->height); + goto close_display; + } + + return priv; + + close_display: + display_close(); + free_lib: + FreeLibrary(gapi_lib); + free_priv: + free(priv); + return NULL; +} + +void +evas_software_wince_gapi_shutdown(void *priv) +{ + Evas_Engine_WinCE_GAPI_Priv *p; + + p = (Evas_Engine_WinCE_GAPI_Priv *)priv; + p->close_display(); + suspend = NULL; + resume = NULL; + FreeLibrary(p->lib); + free(p); +} + + +FB_Output_Buffer * +evas_software_wince_gapi_output_buffer_new(void *priv, + int width, + int height) +{ + FB_Output_Buffer *fbob; + void *buffer; + + fbob = calloc(1, sizeof(FB_Output_Buffer)); + if (!fbob) return NULL; + + buffer = malloc (width * height * 2); /* we are sure to have 16bpp */ + if (!buffer) + { + free(fbob); + return NULL; + } + + fbob->priv = priv; + + fbob->im = (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), width, height, (DATA32 *)buffer, 0, EVAS_COLORSPACE_RGB565_A5P); + if (fbob->im) + fbob->im->stride = ((Evas_Engine_WinCE_GAPI_Priv *)priv)->stride >> 1; + + return fbob; +} + +void +evas_software_wince_gapi_output_buffer_free(FB_Output_Buffer *fbob) +{ + free(fbob->im->pixels); + free(fbob); +} + +void +evas_software_wince_gapi_output_buffer_paste(FB_Output_Buffer *fbob) +{ + Evas_Engine_WinCE_GAPI_Priv *priv; + void *buffer; + + priv = (Evas_Engine_WinCE_GAPI_Priv *)fbob->priv; + + buffer = priv->draw_begin(); + if (!buffer) + return; + + if (priv->buffer) buffer = priv->buffer; + + if ((fbob->im->cache_entry.w == priv->width) && + (fbob->im->cache_entry.h == priv->height)) + memcpy(buffer, fbob->im->pixels, + priv->width * priv->height * 2); + + priv->draw_end(); +} + +void +evas_software_wince_gapi_surface_resize(FB_Output_Buffer *fbob) +{ +} diff --git a/src/modules/engines/software_16_x11/.cvsignore b/src/modules/engines/software_16_x11/.cvsignore new file mode 100644 index 0000000..09980ae --- /dev/null +++ b/src/modules/engines/software_16_x11/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la diff --git a/src/modules/engines/software_16_x11/Evas_Engine_Software_16_X11.h b/src/modules/engines/software_16_x11/Evas_Engine_Software_16_X11.h new file mode 100644 index 0000000..47885fa --- /dev/null +++ b/src/modules/engines/software_16_x11/Evas_Engine_Software_16_X11.h @@ -0,0 +1,23 @@ +#ifndef _EVAS_ENGINE_SOFTWARE_16_X11_H +#define _EVAS_ENGINE_SOFTWARE_16_X11_H + +#include + +typedef struct _Evas_Engine_Info_Software_16_X11 Evas_Engine_Info_Software_16_X11; + +struct _Evas_Engine_Info_Software_16_X11 +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + /* engine specific data & parameters it needs to set up */ + struct { + Display *display; + Drawable drawable; + int rotation; + } info; +}; +#endif + + diff --git a/src/modules/engines/software_16_x11/Makefile.am b/src/modules/engines/software_16_x11/Makefile.am new file mode 100644 index 0000000..628e459 --- /dev/null +++ b/src/modules/engines/software_16_x11/Makefile.am @@ -0,0 +1,37 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +-I$(top_srcdir)/src/modules/engines/software_16 \ +@FREETYPE_CFLAGS@ \ +@x_cflags@ + +if BUILD_ENGINE_SOFTWARE_16_X11 + +pkgdir = $(libdir)/evas/modules/engines/software_16_x11/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = \ +evas_engine.h \ +evas_engine.c \ +evas_x_buffer.c + +module_la_LIBADD = @x_libs@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_Software_16_X11.h + +endif + +EXTRA_DIST = \ +evas_engine.h \ +evas_engine.c \ +evas_x_buffer.c \ +Evas_Engine_Software_16_X11.h diff --git a/src/modules/engines/software_16_x11/evas_engine.c b/src/modules/engines/software_16_x11/evas_engine.c new file mode 100644 index 0000000..5eca87a --- /dev/null +++ b/src/modules/engines/software_16_x11/evas_engine.c @@ -0,0 +1,585 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Software_16_X11.h" +#include "evas_common_soft16.h" + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func, pfunc; + +/* engine struct data */ +typedef struct _Render_Engine Render_Engine; + +struct _Render_Engine +{ + Display *disp; + Drawable draw; + GC gc; + int w, h, rot; + Tilebuf *tb; + Tilebuf_Rect *rects; + Tilebuf_Rect *cur_rect; + X_Output_Buffer *shbuf; + Soft16_Image *tmp_out; /* used by indirect render, like rotation */ + Region clip_rects; + unsigned char end : 1; + unsigned char shm : 1; +}; + +/* prototypes we will use here */ + +static void *eng_info(Evas *e); +static void eng_info_free(Evas *e, void *info); +static void eng_setup(Evas *e, void *info); +static void eng_output_free(void *data); +static void eng_output_resize(void *data, int w, int h); +static void eng_output_tile_size_set(void *data, int w, int h); +static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h); +static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h); +static void eng_output_redraws_clear(void *data); +static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch); +static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h); +static void eng_output_flush(void *data); +static void eng_output_idle_flush(void *data); + +/* engine api this module provides */ +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_Software_16_X11 *info; + + info = calloc(1, sizeof(Evas_Engine_Info_Software_16_X11)); + if (!info) return NULL; + info->magic.magic = rand(); + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_Software_16_X11 *in; + + in = (Evas_Engine_Info_Software_16_X11 *)info; + free(in); +} + +static void +_tmp_out_alloc(Render_Engine *re) +{ + Tilebuf_Rect *r; + int w = 0, h = 0; + + for (r = re->rects; r; r = (Tilebuf_Rect *)(r->_list_data.next)) + { + if (r->w > w) w = r->w; + if (r->h > h) h = r->h; + } + + if (re->tmp_out) + { + if ((re->tmp_out->cache_entry.w < w) || (re->tmp_out->cache_entry.h < h)) + { + evas_cache_image_drop(&re->tmp_out->cache_entry); + re->tmp_out = NULL; + } + } + + if (!re->tmp_out) + { + Soft16_Image *im; + + im = (Soft16_Image *) evas_cache_image_empty(evas_common_soft16_image_cache_get()); + im->cache_entry.flags.alpha = 0; + evas_cache_image_surface_alloc(&im->cache_entry, w, h); + + re->tmp_out = im; + } +} + + +static void +eng_setup(Evas *e, void *in) +{ + Render_Engine *re; + Evas_Engine_Info_Software_16_X11 *info; +/* X_Output_Buffer *xob; */ + XGCValues gcv; + + info = (Evas_Engine_Info_Software_16_X11 *)in; + if (!e->engine.data.output) + { + /* the only check - simplistic, i know, but enough for this + * "special purpose" engine. Remember it is meant to be used + * for limited power devices that have a 16bit display mode + * and no real other acceleration, and high resolution so we + * can pre-dither into 16bpp. */ +// if (DefaultDepth(info->info.display, +// DefaultScreen(info->info.display)) != 16) +// return; + /* do common routine init - we wil at least use it for core + * image loading and font loading/glyph rendering & placement */ + evas_common_cpu_init(); + + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + evas_common_soft16_image_init(); + + /* render engine specific data */ + re = calloc(1, sizeof(Render_Engine)); + e->engine.data.output = re; + re->disp = info->info.display; + re->draw = info->info.drawable; + re->gc = XCreateGC(re->disp, re->draw, 0, &gcv); + re->w = e->output.w; + re->h = e->output.h; + re->rot = info->info.rotation; + re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + } + else + { + /* we changed the info after first init - do a re-eval where + * appropriate */ +// if (DefaultDepth(info->info.display, +// DefaultScreen(info->info.display)) != 16) +// return; + re = e->engine.data.output; + if (re->tb) evas_common_tilebuf_free(re->tb); + re->disp = info->info.display; + re->draw = info->info.drawable; + XFreeGC(re->disp, re->gc); + re->gc = XCreateGC(re->disp, re->draw, 0, &gcv); + re->w = e->output.w; + re->h = e->output.h; + re->rot = info->info.rotation; + re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + if (re->tmp_out) + { + evas_cache_image_drop(&re->tmp_out->cache_entry); + re->tmp_out = NULL; + } + } + if (!e->engine.data.output) return; + /* add a draw context if we dont have one */ + if (!e->engine.data.context) + e->engine.data.context = + e->engine.func->context_new(e->engine.data.output); + /* check if the display can do shm */ + re->shm = evas_software_x11_x_can_do_shm(re->disp); +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (re->shbuf) evas_software_x11_x_output_buffer_free(re->shbuf, 0); + if (re->clip_rects) XDestroyRegion(re->clip_rects); + if (re->gc) XFreeGC(re->disp, re->gc); + if (re->tb) evas_common_tilebuf_free(re->tb); + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + if (re->tmp_out) evas_cache_image_drop(&re->tmp_out->cache_entry); + free(re); + + evas_common_font_shutdown(); + evas_common_image_shutdown(); + evas_common_soft16_image_shutdown(); +} + +static void +eng_output_resize(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + + if ((re->w == w) && (re->h == h)) return; + + evas_common_tilebuf_free(re->tb); + re->w = w; + re->h = h; + re->tb = evas_common_tilebuf_new(w, h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + if (re->shbuf) + { + evas_software_x11_x_output_buffer_free(re->shbuf, 0); + re->shbuf = NULL; + } + if (re->clip_rects) + { + XDestroyRegion(re->clip_rects); + re->clip_rects = NULL; + } + if (re->tmp_out) + { + evas_cache_image_drop(&re->tmp_out->cache_entry); + re->tmp_out = NULL; + } +} + +static void +eng_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_set_tile_size(re->tb, w, h); +} + +static void +eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_clear(re->tb); +} + +static inline void +_output_buffer_alloc(Render_Engine *re) +{ + int w, h; + if (re->shbuf) return; + + if ((re->rot == 0) || (re->rot == 180)) + { + w = re->w; + h = re->h; + } + else + { + w = re->h; + h = re->w; + } + + re->shbuf = evas_software_x11_x_output_buffer_new + (re->disp, DefaultVisual(re->disp, DefaultScreen(re->disp)), + DefaultDepth(re->disp, DefaultScreen(re->disp)), + w, h, 1, NULL); +} + +static void * +eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + Tilebuf_Rect *rect; + int ux, uy, uw, uh; + + re = (Render_Engine *)data; + if (re->end) + { + re->end = 0; + return NULL; + } + if (!re->rects) + { + re->rects = evas_common_tilebuf_get_render_rects(re->tb); + if (!re->rects) return NULL; + + re->cur_rect = re->rects; + _output_buffer_alloc(re); + if (re->rot != 0) _tmp_out_alloc(re); /* grows if required */ + } + if (!re->cur_rect) + { + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + return NULL; + } + rect = re->cur_rect; + ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h; + re->cur_rect = (Tilebuf_Rect *)(re->cur_rect->_list_data.next); + if (!re->cur_rect) + { + evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + re->end = 1; + } + + *x = ux; *y = uy; *w = uw; *h = uh; + if (re->rot == 0) + { + *cx = ux; *cy = uy; *cw = uw; *ch = uh; + return re->shbuf->im; + } + else + { + *cx = 0; *cy = 0; *cw = uw; *ch = uh; + return re->tmp_out; + } +} + +static void +_blit_rot_90(Soft16_Image *dst, const Soft16_Image *src, + int out_x, int out_y, int w, int h) +{ + DATA16 *dp, *sp; + int x, y; + + sp = src->pixels; + dp = dst->pixels + (out_x + + (w + out_y - 1) * dst->stride); + + for (y = 0; y < h; y++) + { + DATA16 *dp_itr, *sp_itr; + + sp_itr = sp; + dp_itr = dp; + + for (x = 0; x < w; x++) + { + *dp_itr = *sp_itr; + + sp_itr++; + dp_itr -= dst->stride; + } + sp += src->stride; + dp++; + } +} + +static void +_blit_rot_180(Soft16_Image *dst, const Soft16_Image *src, + int out_x, int out_y, int w, int h) +{ + DATA16 *dp, *sp; + int x, y; + + sp = src->pixels; + dp = dst->pixels + ((w + out_x - 1) + + (h + out_y - 1) * dst->stride); + + for (y = 0; y < h; y++) + { + DATA16 *dp_itr, *sp_itr; + + sp_itr = sp; + dp_itr = dp; + + for (x = 0; x < w; x++) + { + *dp_itr = *sp_itr; + + sp_itr++; + dp_itr--; + } + sp += src->stride; + dp -= dst->stride; + } +} + +static void +_blit_rot_270(Soft16_Image *dst, const Soft16_Image *src, + int out_x, int out_y, int w, int h) +{ + DATA16 *dp, *sp; + int x, y; + + sp = src->pixels; + dp = dst->pixels + ((h + out_x - 1) + + out_y * dst->stride); + + for (y = 0; y < h; y++) + { + DATA16 *dp_itr, *sp_itr; + + sp_itr = sp; + dp_itr = dp; + + for (x = 0; x < w; x++) + { + *dp_itr = *sp_itr; + + sp_itr++; + dp_itr += dst->stride; + } + sp += src->stride; + dp--; + } +} + +static void +_tmp_out_process(Render_Engine *re, int out_x, int out_y, int w, int h) +{ + Soft16_Image *d, *s; + DATA16 *dp, *sp; + int y, x, d_dir; + + d = re->shbuf->im; + s = re->tmp_out; + + if ((w < 1) || (h < 1) || (out_x >= d->cache_entry.w) || (out_y >= d->cache_entry.h)) + return; + + if (re->rot == 90) + _blit_rot_90(d, s, out_x, out_y, w, h); + else if (re->rot == 180) + _blit_rot_180(d, s, out_x, out_y, w, h); + else if (re->rot == 270) + _blit_rot_270(d, s, out_x, out_y, w, h); +} + +static void +eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + XRectangle r; + + re = (Render_Engine *)data; + + if (!re->clip_rects) + re->clip_rects = XCreateRegion(); + + if (re->rot == 0) + { + r.x = x; + r.y = y; + r.width = w; + r.height = h; + } + else if (re->rot == 90) + { + r.x = y; + r.y = re->w - w - x; + r.width = h; + r.height = w; + } + else if (re->rot == 180) + { + r.x = re->w - w - x; + r.y = re->h - h - y; + r.width = w; + r.height = h; + } + else if (re->rot == 270) + { + r.x = re->h - h - y; + r.y = x; + r.width = h; + r.height = w; + } + + if (re->rot != 0) + _tmp_out_process(re, r.x, r.y, w, h); + XUnionRectWithRegion(&r, re->clip_rects, re->clip_rects); +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + int w, h; + + re = (Render_Engine *)data; + if (re->clip_rects) + { + XSetRegion(re->disp, re->gc, re->clip_rects); + XDestroyRegion(re->clip_rects); + re->clip_rects = NULL; + } + else return; + + evas_software_x11_x_output_buffer_paste + (re->shbuf, re->draw, re->gc, 0, 0, re->shbuf->im->cache_entry.w, re->shbuf->im->cache_entry.h, 1); + XSetClipMask(re->disp, re->gc, None); +} + +static void +eng_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (re->shbuf) + { + evas_software_x11_x_output_buffer_free(re->shbuf, 0); + re->shbuf = NULL; + } + if (re->clip_rects) + { + XDestroyRegion(re->clip_rects); + re->clip_rects = NULL; + } + if (re->tmp_out) + { + evas_cache_image_drop(&re->tmp_out->cache_entry); + re->tmp_out = NULL; + } +} + + +/* module advertising code */ +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_16")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ +#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(output_flush); + ORD(output_idle_flush); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "software_16_x11", + "none" +}; diff --git a/src/modules/engines/software_16_x11/evas_engine.h b/src/modules/engines/software_16_x11/evas_engine.h new file mode 100644 index 0000000..7150126 --- /dev/null +++ b/src/modules/engines/software_16_x11/evas_engine.h @@ -0,0 +1,36 @@ +#ifndef EVAS_ENGINE_H +#define EVAS_ENGINE_H + +#include +#include +#include +#include +#include +#include + +#include "evas_common_soft16.h" + +typedef struct _X_Output_Buffer X_Output_Buffer; + +struct _X_Output_Buffer +{ + Soft16_Image *im; + Display *display; + XImage *xim; + XShmSegmentInfo *shm_info; + void *data; +}; + +/****/ +void evas_software_x11_x_init (void); + +int evas_software_x11_x_can_do_shm (Display *d); +X_Output_Buffer *evas_software_x11_x_output_buffer_new (Display *d, Visual *v, int depth, int w, int h, int try_shm, void *data); +void evas_software_x11_x_output_buffer_free (X_Output_Buffer *xob, int sync); +void evas_software_x11_x_output_buffer_paste (X_Output_Buffer *xob, Drawable d, GC gc, int x, int y, int w, int h, int sync); +DATA8 *evas_software_x11_x_output_buffer_data (X_Output_Buffer *xob, int *bytes_per_line_ret); +int evas_software_x11_x_output_buffer_depth (X_Output_Buffer *xob); +int evas_software_x11_x_output_buffer_byte_order (X_Output_Buffer *xob); +int evas_software_x11_x_output_buffer_bit_order (X_Output_Buffer *xob); + +#endif diff --git a/src/modules/engines/software_16_x11/evas_x_buffer.c b/src/modules/engines/software_16_x11/evas_x_buffer.c new file mode 100644 index 0000000..d5d78f2 --- /dev/null +++ b/src/modules/engines/software_16_x11/evas_x_buffer.c @@ -0,0 +1,186 @@ +#include "evas_common.h" +#include "evas_engine.h" + +static int _x_err = 0; + +int +evas_software_x11_x_can_do_shm(Display *d) +{ + static Display *cached_d = NULL; + static int cached_result = 0; + + if (d == cached_d) return cached_result; + cached_d = d; + if (XShmQueryExtension(d)) + { + X_Output_Buffer *xob; + + xob = evas_software_x11_x_output_buffer_new + (d, DefaultVisual(d, DefaultScreen(d)), + DefaultDepth(d, DefaultScreen(d)), 16, 16, 2, NULL); + if (!xob) + { + cached_result = 0; + return 0; + } + evas_software_x11_x_output_buffer_free(xob, 1); + cached_result = 1; + return 1; + } + cached_result = 0; + return 0; +} + +static void +x_output_tmp_x_err(Display * d, XErrorEvent * ev) +{ + _x_err = 1; + return; +} + +X_Output_Buffer * +evas_software_x11_x_output_buffer_new(Display *d, Visual *v, int depth, int w, int h, int try_shm, void *data) +{ + X_Output_Buffer *xob; + + xob = calloc(1, sizeof(X_Output_Buffer)); + if (!xob) return NULL; + + xob->display = d; + xob->xim = NULL; + xob->shm_info = NULL; + + if (try_shm > 0) + { + xob->shm_info = malloc(sizeof(XShmSegmentInfo)); + if (xob->shm_info) + { + xob->xim = XShmCreateImage(d, v, depth, ZPixmap, NULL, + xob->shm_info, w, h); + if (xob->xim) + { + xob->shm_info->shmid = shmget(IPC_PRIVATE, + xob->xim->bytes_per_line * + xob->xim->height, + IPC_CREAT | 0777); + if (xob->shm_info->shmid >= 0) + { + xob->shm_info->readOnly = False; + xob->shm_info->shmaddr = xob->xim->data = + shmat(xob->shm_info->shmid, 0, 0); + if (xob->shm_info->shmaddr != NULL) + { + XErrorHandler ph; + + XSync(d, False); + _x_err = 0; + ph = XSetErrorHandler((XErrorHandler) + x_output_tmp_x_err); + XShmAttach(d, xob->shm_info); + XSync(d, False); + XSetErrorHandler((XErrorHandler)ph); + if (!_x_err) + { + xob->im = (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), w, h, (DATA32 *) xob->xim->data, 0, EVAS_COLORSPACE_RGB565_A5P); + if (xob->im) + xob->im->stride = xob->xim->bytes_per_line / sizeof(DATA16); + return xob; + } + } + shmdt(xob->shm_info->shmaddr); + shmctl(xob->shm_info->shmid, IPC_RMID, 0); + } + if (xob->xim) XDestroyImage(xob->xim); + xob->xim = NULL; + } + if (xob->shm_info) free(xob->shm_info); + xob->shm_info = NULL; + } + } + + if (try_shm > 1) return NULL; + + xob->xim = XCreateImage(d, v, depth, ZPixmap, 0, data, w, h, 32, 0); + if (!xob->xim) + { + free(xob); + return NULL; + } + + xob->data = data; + + if (!xob->xim->data) + { + xob->xim->data = malloc(xob->xim->bytes_per_line * xob->xim->height); + if (!xob->xim->data) + { + XDestroyImage(xob->xim); + free(xob); + return NULL; + } + } + if (xob->im) + evas_cache_image_drop(&xob->im->cache_entry); + + xob->im = (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), w, h, (DATA32 *) xob->xim->data, 0, EVAS_COLORSPACE_RGB565_A5P); + if (xob->im) + xob->im->stride = xob->xim->bytes_per_line / sizeof(DATA16); + return xob; +} + +void +evas_software_x11_x_output_buffer_free(X_Output_Buffer *xob, int sync) +{ + if (xob->shm_info) + { + if (sync) XSync(xob->display, False); + XShmDetach(xob->display, xob->shm_info); + XDestroyImage(xob->xim); + shmdt(xob->shm_info->shmaddr); + shmctl(xob->shm_info->shmid, IPC_RMID, 0); + free(xob->shm_info); + } + else + { + if (xob->data) xob->xim->data = NULL; + XDestroyImage(xob->xim); + } + free(xob); +} + +void +evas_software_x11_x_output_buffer_paste(X_Output_Buffer *xob, Drawable d, GC gc, int x, int y, int w, int h, int sync) +{ + if (xob->shm_info) + { + XShmPutImage(xob->display, d, gc, xob->xim, 0, 0, x, y, w, h, False); + if (sync) XSync(xob->display, False); + } + else + XPutImage(xob->display, d, gc, xob->xim, 0, 0, x, y, w, h); +} + +DATA8 * +evas_software_x11_x_output_buffer_data(X_Output_Buffer *xob, int *bytes_per_line_ret) +{ + if (bytes_per_line_ret) *bytes_per_line_ret = xob->xim->bytes_per_line; + return xob->xim->data; +} + +int +evas_software_x11_x_output_buffer_depth(X_Output_Buffer *xob) +{ + return xob->xim->bits_per_pixel; +} + +int +evas_software_x11_x_output_buffer_byte_order(X_Output_Buffer *xob) +{ + return xob->xim->byte_order; +} + +int +evas_software_x11_x_output_buffer_bit_order(X_Output_Buffer *xob) +{ + return xob->xim->bitmap_bit_order; +} diff --git a/src/modules/engines/software_ddraw/.cvsignore b/src/modules/engines/software_ddraw/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/software_ddraw/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/software_ddraw/Evas_Engine_Software_DDraw.h b/src/modules/engines/software_ddraw/Evas_Engine_Software_DDraw.h new file mode 100644 index 0000000..f0628d6 --- /dev/null +++ b/src/modules/engines/software_ddraw/Evas_Engine_Software_DDraw.h @@ -0,0 +1,26 @@ +#ifndef __EVAS_ENGINE_SOFTWARE_DDRAW_H__ +#define __EVAS_ENGINE_SOFTWARE_DDRAW_H__ + + +#define WIN32_LEAN_AND_MEAN +#include +#undef WIN32_LEAN_AND_MEAN + + +typedef struct _Evas_Engine_Info_Software_DDraw Evas_Engine_Info_Software_DDraw; + +struct _Evas_Engine_Info_Software_DDraw +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + struct { + HWND window; + int depth; + int rotation; + } info; +}; + + +#endif /* __EVAS_ENGINE_SOFTWARE_DDRAW_H__ */ diff --git a/src/modules/engines/software_ddraw/Makefile.am b/src/modules/engines/software_ddraw/Makefile.am new file mode 100644 index 0000000..aa817b7 --- /dev/null +++ b/src/modules/engines/software_ddraw/Makefile.am @@ -0,0 +1,38 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +@FREETYPE_CFLAGS@ + +if BUILD_ENGINE_SOFTWARE_DDRAW + +pkgdir = $(libdir)/evas/modules/engines/software_ddraw/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la +module_la_SOURCES = \ +evas_engine.h \ +evas_engine.c \ +evas_outbuf.c \ +evas_ddraw_buffer.c \ +evas_ddraw_main.cpp + +module_la_LIBADD = @ddraw_libs@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_Software_DDraw.h + +endif + +EXTRA_DIST = \ +evas_engine.h \ +evas_engine.c \ +evas_outbuf.c \ +evas_ddraw_buffer.c \ +evas_ddraw_main.cpp \ +Evas_Engine_Software_DDraw.h diff --git a/src/modules/engines/software_ddraw/evas_ddraw_buffer.c b/src/modules/engines/software_ddraw/evas_ddraw_buffer.c new file mode 100644 index 0000000..870bcb2 --- /dev/null +++ b/src/modules/engines/software_ddraw/evas_ddraw_buffer.c @@ -0,0 +1,91 @@ +#include + +#include "evas_common.h" +#include "evas_engine.h" + + +DD_Output_Buffer * +evas_software_ddraw_output_buffer_new(int depth, + int width, + int height, + void *data) +{ + DD_Output_Buffer *ddob; + + ddob = calloc(1, sizeof(DD_Output_Buffer)); + if (!ddob) return NULL; + + ddob->data = data; + ddob->depth = depth; + ddob->width = width; + ddob->height = height; + ddob->pitch = width * depth / 8; + + if (!ddob->data) + { + ddob->data = malloc(ddob->pitch * height); + if (!ddob->data) + { + free(ddob); + return NULL; + } + } + + return ddob; +} + +void +evas_software_ddraw_output_buffer_free(DD_Output_Buffer *ddob) +{ + if (ddob->data) free(ddob->data); + free(ddob); +} + +void +evas_software_ddraw_output_buffer_paste(DD_Output_Buffer *ddob, + void *ddraw_data, + int ddraw_width, + int ddraw_height, + int ddraw_pitch, + int ddraw_depth, + int x, + int y) +{ + DATA8 *dd_data; + DATA8 *evas_data; + int width; + int height; + int pitch; + int j; + + if ((x >= ddraw_width) || (y >= ddraw_height)) + return; + + /* compute the size of the data to copy on the back surface */ + width = ((x + ddob->width) > ddraw_width) + ? ddraw_width - x + : ddob->width; + height = ((y + ddob->height) > ddraw_height) + ? ddraw_height - y + : ddob->height; + pitch = width * ddob->depth / 8; + + dd_data = (DATA8 *)ddraw_data + y * ddraw_pitch + x * ddraw_depth; + evas_data = (unsigned char *)ddob->data; + for (j = 0; j < height; j++, evas_data += ddob->pitch, dd_data += ddraw_pitch) + memcpy(dd_data, evas_data, pitch); +} + +DATA8 * +evas_software_ddraw_output_buffer_data(DD_Output_Buffer *ddob, + int *bytes_per_line_ret) +{ + if (bytes_per_line_ret) *bytes_per_line_ret = ddob->pitch; + return ddob->data; +} + +int +evas_software_ddraw_output_buffer_depth(DD_Output_Buffer *ddob) +{ + return ddob->depth; +} diff --git a/src/modules/engines/software_ddraw/evas_ddraw_main.cpp b/src/modules/engines/software_ddraw/evas_ddraw_main.cpp new file mode 100644 index 0000000..ec5c606 --- /dev/null +++ b/src/modules/engines/software_ddraw/evas_ddraw_main.cpp @@ -0,0 +1,195 @@ +#include "evas_common.h" +#include "evas_engine.h" + +int +evas_software_ddraw_init (HWND window, + int depth, + Outbuf *buf) +{ + DDSURFACEDESC surface_desc; + DDPIXELFORMAT pixel_format; + RECT rect; + LPDIRECTDRAW o; + HRESULT res; + int width; + int height; + + if (!buf) + return 0; + + if (!GetClientRect(window, &rect)) + return 0; + + width = rect.right - rect.left; + height = rect.bottom - rect.top; + + buf->priv.dd.window = window; + + res = DirectDrawCreate(NULL, &buf->priv.dd.object, NULL); + if (FAILED(res)) + return 0; + + res = buf->priv.dd.object->SetCooperativeLevel(window, DDSCL_NORMAL); + if (FAILED(res)) + goto release_object; + + res = buf->priv.dd.object->CreateClipper (0, &buf->priv.dd.clipper, NULL); + if (FAILED(res)) + goto release_object; + + res = buf->priv.dd.clipper->SetHWnd (0, window); + if (FAILED(res)) + goto release_clipper; + + memset(&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + surface_desc.dwFlags = DDSD_CAPS; + surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + + res = buf->priv.dd.object->CreateSurface (&surface_desc, &buf->priv.dd.surface_primary, NULL); + if (FAILED(res)) + goto release_clipper; + + res = buf->priv.dd.surface_primary->SetClipper (buf->priv.dd.clipper); + if (FAILED(res)) + goto release_surface_primary; + + memset (&surface_desc, 0, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + surface_desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; + surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; + surface_desc.dwWidth = width; + surface_desc.dwHeight = height; + + res = buf->priv.dd.object->CreateSurface (&surface_desc, &buf->priv.dd.surface_back, NULL); + if (FAILED(res)) + goto release_surface_primary; + + ZeroMemory(&pixel_format, sizeof(pixel_format)); + pixel_format.dwSize = sizeof(pixel_format); + buf->priv.dd.surface_primary->GetPixelFormat(&pixel_format); + + if (pixel_format.dwRGBBitCount != depth) + goto release_surface_back; + + buf->priv.dd.depth = depth; + + return 1; + + release_surface_back: + buf->priv.dd.surface_back->Release(); + release_surface_primary: + buf->priv.dd.surface_primary->Release(); + release_clipper: + buf->priv.dd.clipper->Release(); + release_object: + buf->priv.dd.object->Release(); + + return 0; +} + +void +evas_software_ddraw_shutdown(Outbuf *buf) +{ + if (!buf) + return; + + buf->priv.dd.surface_back->Release(); + buf->priv.dd.surface_primary->Release(); + buf->priv.dd.clipper->Release(); + buf->priv.dd.object->Release(); +} + +int +evas_software_ddraw_masks_get(Outbuf *buf) +{ + DDPIXELFORMAT pixel_format; + + ZeroMemory(&pixel_format, sizeof(pixel_format)); + pixel_format.dwSize = sizeof(pixel_format); + + if (FAILED(buf->priv.dd.surface_primary->GetPixelFormat(&pixel_format))) + return 0; + + buf->priv.mask.r = pixel_format.dwRBitMask; + buf->priv.mask.g = pixel_format.dwGBitMask; + buf->priv.mask.b = pixel_format.dwBBitMask; + + return 1; +} + +void * +evas_software_ddraw_lock(Outbuf *buf, + int *ddraw_width, + int *ddraw_height, + int *ddraw_pitch, + int *ddraw_depth) +{ + DDSURFACEDESC surface_desc; + + ZeroMemory(&surface_desc, sizeof(surface_desc)); + surface_desc.dwSize = sizeof(surface_desc); + + if (FAILED(buf->priv.dd.surface_back->Lock(NULL, + &surface_desc, + DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, + NULL))) + return NULL; + + *ddraw_width = surface_desc.dwWidth; + *ddraw_height = surface_desc.dwHeight; + *ddraw_pitch = surface_desc.lPitch; + *ddraw_depth = surface_desc.ddpfPixelFormat.dwRGBBitCount >> 3; + + return surface_desc.lpSurface; +} + +void +evas_software_ddraw_unlock_and_flip(Outbuf *buf) +{ + RECT dst_rect; + RECT src_rect; + POINT p; + + if (FAILED(buf->priv.dd.surface_back->Unlock(NULL))) + return; + + /* we figure out where on the primary surface our window lives */ + p.x = 0; + p.y = 0; + ClientToScreen(buf->priv.dd.window, &p); + GetClientRect(buf->priv.dd.window, &dst_rect); + OffsetRect(&dst_rect, p.x, p.y); + SetRect(&src_rect, 0, 0, buf->width, buf->height); + + /* nothing to do if the function fails, so we don't check the result */ + buf->priv.dd.surface_primary->Blt(&dst_rect, + buf->priv.dd.surface_back, + &src_rect, + DDBLT_WAIT, NULL); +} + +void +evas_software_ddraw_surface_resize(Outbuf *buf) +{ + DDSURFACEDESC surface_desc; + + buf->priv.dd.surface_back->Release(); + memset (&surface_desc, 0, sizeof (surface_desc)); + surface_desc.dwSize = sizeof (surface_desc); + /* FIXME: that code does not compile. Must know why */ +#if 0 + surface_desc.dwFlags = DDSD_HEIGHT | DDSD_WIDTH; + surface_desc.dwWidth = width; + surface_desc.dwHeight = height; + buf->priv.dd.surface_back->SetSurfaceDesc(&surface_desc, NULL); +#else + surface_desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; + surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; + surface_desc.dwWidth = buf->width; + surface_desc.dwHeight = buf->height; + buf->priv.dd.object->CreateSurface(&surface_desc, + &buf->priv.dd.surface_back, + NULL); +#endif +} diff --git a/src/modules/engines/software_ddraw/evas_engine.c b/src/modules/engines/software_ddraw/evas_engine.c new file mode 100644 index 0000000..0772021 --- /dev/null +++ b/src/modules/engines/software_ddraw/evas_engine.c @@ -0,0 +1,346 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Software_DDraw.h" + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func, pfunc; + +/* engine struct data */ +typedef struct _Render_Engine Render_Engine; + +struct _Render_Engine +{ + Tilebuf *tb; + Outbuf *ob; + Tilebuf_Rect *rects; + Evas_Object_List *cur_rect; + int end : 1; +}; + + +static void * +_output_setup(int width, + int height, + int rot, + HWND window, + int depth) +{ + Render_Engine *re; + + re = calloc(1, sizeof(Render_Engine)); + if (!re) + return NULL; + + /* if we haven't initialized - init (automatic abort if already done) */ + evas_common_cpu_init(); + + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + + evas_software_ddraw_outbuf_init(); + + re->ob = evas_software_ddraw_outbuf_setup(width, height, rot, + OUTBUF_DEPTH_INHERIT, + window, depth); + if (!re->ob) + { + free(re); + return NULL; + } + + /* for updates return 1 big buffer, but only use portions of it, also cache + it and keepit around until an idle_flush */ + /* disable for now - i am hunting down why some expedite tests are slower, + * as well as shaped stuff is broken and probable non-32bpp is broken as + * convert funcs dont do the right thing + * + re->ob->onebuf = 1; + */ + + re->tb = evas_common_tilebuf_new(width, height); + if (!re->tb) + { + evas_software_ddraw_outbuf_free(re->ob); + free(re); + return NULL; + } + /* in preliminary tests 16x16 gave highest framerates */ + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + + return re; +} + + +/* engine api this module provides */ + +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_Software_DDraw *info; + + info = calloc(1, sizeof(Evas_Engine_Info_Software_DDraw)); + if (!info) return NULL; + info->magic.magic = rand(); + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_Software_DDraw *in; + + in = (Evas_Engine_Info_Software_DDraw *)info; + free(in); +} + +static void +eng_setup(Evas *e, void *in) +{ + Render_Engine *re; + Evas_Engine_Info_Software_DDraw *info; + + info = (Evas_Engine_Info_Software_DDraw *)in; + if (!e->engine.data.output) + e->engine.data.output = _output_setup(e->output.w, + e->output.h, + info->info.rotation, + info->info.window, + info->info.depth); + else + { + int ponebuf = 0; + + re = e->engine.data.output; + ponebuf = re->ob->onebuf; + evas_software_ddraw_outbuf_free(re->ob); + re->ob = evas_software_ddraw_outbuf_setup(e->output.w, + e->output.h, + info->info.rotation, + OUTBUF_DEPTH_INHERIT, + info->info.window, + info->info.depth); + re->ob->onebuf = ponebuf; + } + if (!e->engine.data.output) return; + if (!e->engine.data.context) + e->engine.data.context = e->engine.func->context_new(e->engine.data.output); + + re = e->engine.data.output; +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + if (!data) return; + + re = (Render_Engine *)data; + evas_software_ddraw_outbuf_free(re->ob); + evas_common_tilebuf_free(re->tb); + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + free(re); + + evas_common_font_shutdown(); + evas_common_image_shutdown(); +} + +static void +eng_output_resize(void *data, int width, int height) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_software_ddraw_outbuf_reconfigure(re->ob, + width, + height, + evas_software_ddraw_outbuf_rot_get(re->ob), + OUTBUF_DEPTH_INHERIT); + evas_common_tilebuf_free(re->tb); + re->tb = evas_common_tilebuf_new(width, height); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); +} + +static void +eng_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_set_tile_size(re->tb, w, h); +} + +static void +eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_clear(re->tb); +} + +static void * +eng_output_redraws_next_update_get(void *data, + int *x, + int *y, + int *w, + int *h, + int *cx, + int *cy, + int *cw, + int *ch) +{ + Render_Engine *re; + RGBA_Image *surface; + Tilebuf_Rect *rect; + int ux; + int uy; + int uw; + int uh; + + re = (Render_Engine *)data; + if (re->end) + { + re->end = 0; + return NULL; + } + if (!re->rects) + { + re->rects = evas_common_tilebuf_get_render_rects(re->tb); + re->cur_rect = (Evas_Object_List *)re->rects; + } + if (!re->cur_rect) return NULL; + rect = (Tilebuf_Rect *)re->cur_rect; + ux = rect->x; + uy = rect->y; + uw = rect->w; + uh = rect->h; + re->cur_rect = re->cur_rect->next; + if (!re->cur_rect) + { + evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + re->end = 1; + } + + surface = evas_software_ddraw_outbuf_new_region_for_update(re->ob, + ux, + uy, + uw, + uh, + cx, + cy, + cw, + ch); + + *x = ux; + *y = uy; + *w = uw; + *h = uh; + + return surface; +} + +static void +eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_pipe_begin(surface); + evas_common_pipe_flush(surface); + evas_software_ddraw_outbuf_push_updated_region(re->ob, surface, x, y, w, h); + evas_software_ddraw_outbuf_free_region_for_update(re->ob, surface); + evas_common_cpu_end_opt(); +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_software_ddraw_outbuf_flush(re->ob); +} + +static void +eng_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_software_ddraw_outbuf_idle_flush(re->ob); +} + + +/* module advertising code */ +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ +#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(output_flush); + ORD(output_idle_flush); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "software_ddraw", + "none" +}; diff --git a/src/modules/engines/software_ddraw/evas_engine.h b/src/modules/engines/software_ddraw/evas_engine.h new file mode 100644 index 0000000..b880b25 --- /dev/null +++ b/src/modules/engines/software_ddraw/evas_engine.h @@ -0,0 +1,192 @@ +#ifndef __EVAS_ENGINE_H__ +#define __EVAS_ENGINE_H__ + + +#define WIN32_LEAN_AND_MEAN +#include +#undef WIN32_LEAN_AND_MEAN +#include + +typedef struct _Outbuf Outbuf; +typedef struct _Outbuf_Region Outbuf_Region; +typedef struct _DD_Output_Buffer DD_Output_Buffer; + +enum _Outbuf_Depth +{ + OUTBUF_DEPTH_NONE, + OUTBUF_DEPTH_INHERIT, + OUTBUF_DEPTH_RGB_16BPP_565_565_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_555_555_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_444_444_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_565_444_DITHERED, + OUTBUF_DEPTH_RGB_32BPP_888_8888, + OUTBUF_DEPTH_LAST +}; + +typedef enum _Outbuf_Depth Outbuf_Depth; + +struct _Outbuf +{ + Outbuf_Depth depth; + int width; + int height; + int rot; + int onebuf; + + struct { + Convert_Pal *pal; + struct { + HWND window; + LPDIRECTDRAW object; + LPDIRECTDRAWSURFACE surface_primary; + LPDIRECTDRAWSURFACE surface_back; + LPDIRECTDRAWCLIPPER clipper; + int depth; + unsigned char swap : 1; + unsigned char bit_swap : 1; + } dd; + struct { + DATA32 r, g, b; + } mask; + + /* 1 big buffer for updates - flush on idle_flush */ + RGBA_Image *onebuf; + Evas_List *onebuf_regions; + + /* a list of pending regions to write to the target */ + Evas_List *pending_writes; + /* a list of previous frame pending regions to write to the target */ + Evas_List *prev_pending_writes; + + unsigned char mask_dither : 1; + unsigned char destination_alpha : 1; + unsigned char debug : 1; + unsigned char synced : 1; + } priv; +}; + +struct _Outbuf_Region +{ + DD_Output_Buffer *ddob; + int x; + int y; + int width; + int height; +}; + +struct _DD_Output_Buffer +{ + void *data; + int width; + int height; + int depth; + int pitch; +/* int w, h, bpl; */ + int psize; +}; + + +/* evas_outbuf.c */ + +void evas_software_ddraw_outbuf_init(void); + +void evas_software_ddraw_outbuf_free(Outbuf *buf); + +Outbuf *evas_software_ddraw_outbuf_setup(int width, + int height, + int rotation, + Outbuf_Depth depth, + HWND window, + int w_depth); + +void evas_software_ddraw_outbuf_reconfigure(Outbuf *buf, + int width, + int height, + int rotation, + Outbuf_Depth depth); + +RGBA_Image *evas_software_ddraw_outbuf_new_region_for_update(Outbuf *buf, + int x, + int y, + int w, + int h, + int *cx, + int *cy, + int *cw, + int *ch); + +void evas_software_ddraw_outbuf_push_updated_region(Outbuf *buf, + RGBA_Image *update, + int x, + int y, + int w, + int h); + +void evas_software_ddraw_outbuf_free_region_for_update(Outbuf *buf, + RGBA_Image *update); + +void evas_software_ddraw_outbuf_flush(Outbuf *buf); + +void evas_software_ddraw_outbuf_idle_flush(Outbuf *buf); + +int evas_software_ddraw_outbuf_width_get(Outbuf *buf); + +int evas_software_ddraw_outbuf_height_get(Outbuf *buf); + +Outbuf_Depth evas_software_ddraw_outbuf_depth_get(Outbuf *buf); + +int evas_software_ddraw_outbuf_rot_get(Outbuf *buf); + +/* evas_ddraw_buffer.c */ + +DD_Output_Buffer *evas_software_ddraw_output_buffer_new(int depth, + int width, + int height, + void *data); + +void evas_software_ddraw_output_buffer_free(DD_Output_Buffer *ddob); + +void evas_software_ddraw_output_buffer_paste(DD_Output_Buffer *ddob, + void *ddraw_data, + int ddraw_width, + int ddraw_height, + int ddraw_pitch, + int ddraw_depth, + int x, + int y); + +DATA8 *evas_software_ddraw_output_buffer_data(DD_Output_Buffer *ddob, + int *bytes_per_line_ret); + +int evas_software_ddraw_output_buffer_depth(DD_Output_Buffer *ddob); + +/* evas_ddraw_main.cpp */ + +#ifdef __cplusplus +extern "C" { +#endif + +int evas_software_ddraw_init (HWND window, + int depth, + Outbuf *buf); + +void evas_software_ddraw_shutdown(Outbuf *buf); + +int evas_software_ddraw_masks_get(Outbuf *buf); + +void *evas_software_ddraw_lock(Outbuf *buf, + int *ddraw_width, + int *ddraw_height, + int *ddraw_pitch, + int *ddraw_depth); + +void evas_software_ddraw_unlock_and_flip(Outbuf *buf); + +void evas_software_ddraw_surface_resize(Outbuf *buf); + +#ifdef __cplusplus +} +#endif + + +#endif /* __EVAS_ENGINE_H__ */ diff --git a/src/modules/engines/software_ddraw/evas_outbuf.c b/src/modules/engines/software_ddraw/evas_outbuf.c new file mode 100644 index 0000000..5a6f783 --- /dev/null +++ b/src/modules/engines/software_ddraw/evas_outbuf.c @@ -0,0 +1,465 @@ +#include "evas_common.h" +#include "evas_engine.h" + + +static Evas_List *ddpool = NULL; +static int ddsize = 0; +static int ddmemlimit = 10 * 1024 * 1024; +static int ddcountlimit = 32; + +static DD_Output_Buffer * +_find_ddob(int depth, int w, int h, void *data) +{ + Evas_List *l; + Evas_List *ddl; + DD_Output_Buffer *ddob = NULL; + int sz; + int lbytes; + int bpp; + + bpp = depth / 8; + if (bpp == 3) bpp = 4; + lbytes = (((w * bpp) + 3) / 4) * 4; + sz = lbytes * h; + for (l = ddpool; l; l = l->next) + { + DD_Output_Buffer *ddob2; + + ddob2 = l->data; + if (ddob2->depth != depth) + continue; + if (ddob2->psize == sz) + { + ddob = ddob2; + ddl = l; + goto have_ddob; + } + } + if (!ddob) + return evas_software_ddraw_output_buffer_new(depth, w, h, data); + + have_ddob: + ddpool = evas_list_remove_list(ddpool, ddl); + ddob->width = w; + ddob->height = h; + ddob->pitch = lbytes; + ddsize -= ddob->psize * (ddob->depth / 8); + + return ddob; +} + +static void +_unfind_ddob(DD_Output_Buffer *ddob) +{ + ddpool = evas_list_prepend(ddpool, ddob); + ddsize += ddob->psize * ddob->depth / 8; + while ((ddsize > (ddmemlimit)) || + (evas_list_count(ddpool) > ddcountlimit)) + { + Evas_List *xl; + + xl = evas_list_last(ddpool); + if (!xl) + { + ddsize = 0; + break; + } + ddob = xl->data; + ddpool = evas_list_remove_list(ddpool, xl); + evas_software_ddraw_output_buffer_free(ddob); + } +} + +static void +_clear_ddob(int sync) +{ + while (ddpool) + { + DD_Output_Buffer *ddob; + + ddob = ddpool->data; + ddpool = evas_list_remove_list(ddpool, ddpool); + evas_software_ddraw_output_buffer_free(ddob); + } + ddsize = 0; +} + +void +evas_software_ddraw_outbuf_init(void) +{ +} + +void +evas_software_ddraw_outbuf_free(Outbuf *buf) +{ + if (!buf) + return; + + evas_software_ddraw_shutdown(buf); + free(buf); +} + +Outbuf * +evas_software_ddraw_outbuf_setup(int width, + int height, + int rotation, + Outbuf_Depth depth, + HWND window, + int w_depth) +{ + Outbuf *buf; + + buf = (Outbuf *)calloc(1, sizeof(Outbuf)); + if (!buf) + return NULL; + + buf->width = width; + buf->height = height; + buf->depth = depth; + buf->rot = rotation; + + if (!evas_software_ddraw_init(window, w_depth, buf)) + { + free(buf); + return NULL; + } + + { + Gfx_Func_Convert conv_func; + DD_Output_Buffer *ddob; + + ddob = evas_software_ddraw_output_buffer_new(w_depth, 1, 1, NULL); + + conv_func = NULL; + if (ddob) + { + if (evas_software_ddraw_masks_get(buf)) + { + if ((rotation == 0) || (rotation == 180)) + conv_func = evas_common_convert_func_get(0, + width, + height, + evas_software_ddraw_output_buffer_depth (ddob), + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + PAL_MODE_NONE, + rotation); + else if ((rotation == 90) || (rotation == 270)) + conv_func = evas_common_convert_func_get(0, + height, + width, + evas_software_ddraw_output_buffer_depth (ddob), + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + PAL_MODE_NONE, + rotation); + } + + evas_software_ddraw_output_buffer_free(ddob); + + if (!conv_func) + { + fprintf(stderr, ".[ Evas Error ].\n" + " {\n" + " At depth %i:\n" + " RGB format mask: %08x, %08x, %08x\n" + " Not supported by and compiled in converters!\n" + " }\n", + buf->priv.dd.depth, + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b); + } + } + } + + return buf; +} + +void +evas_software_ddraw_outbuf_reconfigure(Outbuf *buf, + int width, + int height, + int rotation, + Outbuf_Depth depth) +{ + if ((width == buf->width) && (height == buf->height) && + (rotation == buf->rot) && (depth == buf->depth)) + return; + buf->width = width; + buf->height = height; + buf->rot = rotation; + evas_software_ddraw_surface_resize(buf); +} + +RGBA_Image * +evas_software_ddraw_outbuf_new_region_for_update(Outbuf *buf, + int x, + int y, + int w, + int h, + int *cx, + int *cy, + int *cw, + int *ch) +{ + RGBA_Image *im; + Outbuf_Region *obr; + int bpl = 0; + int alpha = 0; + + obr = calloc(1, sizeof(Outbuf_Region)); + obr->x = x; + obr->y = y; + obr->width = w; + obr->height = h; + *cx = 0; + *cy = 0; + *cw = w; + *ch = h; + + if ((buf->rot == 0) && + (buf->priv.mask.r == 0xff0000) && + (buf->priv.mask.g == 0x00ff00) && + (buf->priv.mask.b == 0x0000ff)) + { + obr->ddob = _find_ddob(buf->priv.dd.depth, w, h, NULL); +/* obr->ddob = evas_software_x11_x_output_buffer_new(buf->priv.dd.disp, */ +/* buf->priv.dd.vis, */ +/* buf->priv.dd.depth, */ +/* w, h, */ +/* use_shm, */ +/* NULL); */ + im = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), + w, h, + (DATA32 *) evas_software_ddraw_output_buffer_data(obr->ddob, &bpl), + alpha, EVAS_COLORSPACE_ARGB8888); + im->extended_info = obr; + } + else + { + im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); + im->cache_entry.flags.alpha |= alpha ? 1 : 0; + evas_cache_image_surface_alloc(&im->cache_entry, w, h); + im->extended_info = obr; + if ((buf->rot == 0) || (buf->rot == 180)) + obr->ddob = _find_ddob(buf->priv.dd.depth, w, h, NULL); +/* + obr->ddob = evas_software_x11_x_output_buffer_new(buf->priv.dd.disp, + buf->priv.dd.vis, + buf->priv.dd.depth, + w, h, + use_shm, + NULL); + */ + else if ((buf->rot == 90) || (buf->rot == 270)) + obr->ddob = _find_ddob(buf->priv.dd.depth, h, w, NULL); +/* + obr->ddob = evas_software_x11_x_output_buffer_new(buf->priv.dd.disp, + buf->priv.dd.vis, + buf->priv.dd.depth, + h, w, + use_shm, + NULL); + */ + } + + buf->priv.pending_writes = evas_list_append(buf->priv.pending_writes, im); + return im; +} + +void +evas_software_ddraw_outbuf_push_updated_region(Outbuf *buf, + RGBA_Image *update, + int x, + int y, + int w, + int h) +{ + Gfx_Func_Convert conv_func; + Outbuf_Region *obr; + DATA32 *src_data; + void *data; + int bpl = 0, yy; + + conv_func = NULL; + obr = update->extended_info; + + if ((buf->rot == 0) || (buf->rot == 180)) + conv_func = evas_common_convert_func_get(0, w, h, + evas_software_ddraw_output_buffer_depth(obr->ddob), + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + PAL_MODE_NONE, + buf->rot); + else if ((buf->rot == 90) || (buf->rot == 270)) + conv_func = evas_common_convert_func_get(0, h, w, + evas_software_ddraw_output_buffer_depth(obr->ddob), + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + PAL_MODE_NONE, buf->rot); + if (!conv_func) return; + + data = evas_software_ddraw_output_buffer_data(obr->ddob, &bpl); + src_data = update->image.data; + if (buf->rot == 0) + { + obr->x = x; + obr->y = y; + } + else if (buf->rot == 90) + { + obr->x = y; + obr->y = buf->width - x - w; + } + else if (buf->rot == 180) + { + obr->x = buf->width - x - w; + obr->y = buf->height - y - h; + } + else if (buf->rot == 270) + { + obr->x = buf->height - y - h; + obr->y = x; + } + if ((buf->rot == 0) || (buf->rot == 180)) + { + obr->width = w; + obr->height = h; + } + else if ((buf->rot == 90) || (buf->rot == 270)) + { + obr->width = h; + obr->height = w; + } + + if (data != src_data) + conv_func(src_data, data, + 0, + bpl / ((evas_software_ddraw_output_buffer_depth(obr->ddob) / 8)) - obr->width, + obr->width, + obr->height, + x, + y, + NULL); +} + +void +evas_software_ddraw_outbuf_free_region_for_update(Outbuf *buf, + RGBA_Image *update) +{ + /* no need to do anything - they are cleaned up on flush */ +} + +void +evas_software_ddraw_outbuf_flush(Outbuf *buf) +{ + Evas_List *l; + void *ddraw_data; + int ddraw_width; + int ddraw_height; + int ddraw_pitch; + int ddraw_depth; + + /* lock the back surface */ + if (!(ddraw_data = evas_software_ddraw_lock(buf, + &ddraw_width, + &ddraw_height, + &ddraw_pitch, + &ddraw_depth))) + goto free_images; + + /* copy safely the images that need to be drawn onto the back surface */ + for (l = buf->priv.pending_writes; l; l = l->next) + { + RGBA_Image *im; + Outbuf_Region *obr; + DD_Output_Buffer *ddob; + + im = l->data; + obr = im->extended_info; + ddob = obr->ddob; + evas_software_ddraw_output_buffer_paste(ddob, + ddraw_data, + ddraw_width, + ddraw_height, + ddraw_pitch, + ddraw_depth, + obr->x, + obr->y); + } + + /* unlock the back surface and flip the surface */ + evas_software_ddraw_unlock_and_flip(buf); + + free_images: + while (buf->priv.prev_pending_writes) + { + RGBA_Image *im; + Outbuf_Region *obr; + + im = buf->priv.prev_pending_writes->data; + buf->priv.prev_pending_writes = + evas_list_remove_list(buf->priv.prev_pending_writes, + buf->priv.prev_pending_writes); + obr = im->extended_info; + evas_cache_image_drop((Image_Entry *)im); + if (obr->ddob) _unfind_ddob(obr->ddob); +/* + if (obr->ddob) evas_software_x11_x_output_buffer_free(obr->ddob); + */ + free(obr); + } + buf->priv.prev_pending_writes = buf->priv.pending_writes; + buf->priv.pending_writes = NULL; + + evas_common_cpu_end_opt(); +} + +void +evas_software_ddraw_outbuf_idle_flush(Outbuf *buf) +{ + while (buf->priv.prev_pending_writes) + { + RGBA_Image *im; + Outbuf_Region *obr; + + im = buf->priv.prev_pending_writes->data; + buf->priv.prev_pending_writes = + evas_list_remove_list(buf->priv.prev_pending_writes, + buf->priv.prev_pending_writes); + obr = im->extended_info; + evas_cache_image_drop((Image_Entry *)im); + if (obr->ddob) _unfind_ddob(obr->ddob); + free(obr); + } + _clear_ddob(0); +} + +int +evas_software_ddraw_outbuf_width_get(Outbuf *buf) +{ + return buf->width; +} + +int +evas_software_ddraw_outbuf_height_get(Outbuf *buf) +{ + return buf->height; +} + +Outbuf_Depth +evas_software_ddraw_outbuf_depth_get(Outbuf *buf) +{ + return buf->depth; +} + +int +evas_software_ddraw_outbuf_rot_get(Outbuf *buf) +{ + return buf->rot; +} diff --git a/src/modules/engines/software_generic/.cvsignore b/src/modules/engines/software_generic/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/software_generic/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/software_generic/Makefile.am b/src/modules/engines/software_generic/Makefile.am new file mode 100644 index 0000000..5e1e0fa --- /dev/null +++ b/src/modules/engines/software_generic/Makefile.am @@ -0,0 +1,22 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +@FREETYPE_CFLAGS@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +pkgdir = $(libdir)/evas/modules/engines/software_generic/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = evas_engine.c + +module_la_LIBADD = $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/engines/software_generic/evas_engine.c b/src/modules/engines/software_generic/evas_engine.c new file mode 100644 index 0000000..49749b8 --- /dev/null +++ b/src/modules/engines/software_generic/evas_engine.c @@ -0,0 +1,902 @@ +#include "evas_common.h" +#include "evas_private.h" + +/* + ***** + ** + ** ENGINE ROUTINES + ** + ***** + */ + +static int cpunum = 0; + +static void * +eng_context_new(void *data) +{ + return evas_common_draw_context_new(); +} + +static void +eng_context_free(void *data, void *context) +{ + evas_common_draw_context_free(context); +} + +static void +eng_context_clip_set(void *data, void *context, int x, int y, int w, int h) +{ + evas_common_draw_context_set_clip(context, x, y, w, h); +} + +static void +eng_context_clip_clip(void *data, void *context, int x, int y, int w, int h) +{ + evas_common_draw_context_clip_clip(context, x, y, w, h); +} + +static void +eng_context_clip_unset(void *data, void *context) +{ + evas_common_draw_context_unset_clip(context); +} + +static int +eng_context_clip_get(void *data, void *context, int *x, int *y, int *w, int *h) +{ + *x = ((RGBA_Draw_Context *)context)->clip.x; + *y = ((RGBA_Draw_Context *)context)->clip.y; + *w = ((RGBA_Draw_Context *)context)->clip.w; + *h = ((RGBA_Draw_Context *)context)->clip.h; + return ((RGBA_Draw_Context *)context)->clip.use; +} + +static void +eng_context_color_set(void *data, void *context, int r, int g, int b, int a) +{ + evas_common_draw_context_set_color(context, r, g, b, a); +} + +static int +eng_context_color_get(void *data, void *context, int *r, int *g, int *b, int *a) +{ + *r = (int)(R_VAL(&((RGBA_Draw_Context *)context)->col.col)); + *g = (int)(G_VAL(&((RGBA_Draw_Context *)context)->col.col)); + *b = (int)(B_VAL(&((RGBA_Draw_Context *)context)->col.col)); + *a = (int)(A_VAL(&((RGBA_Draw_Context *)context)->col.col)); + return 1; +} + +static void +eng_context_multiplier_set(void *data, void *context, int r, int g, int b, int a) +{ + evas_common_draw_context_set_multiplier(context, r, g, b, a); +} + +static void +eng_context_multiplier_unset(void *data, void *context) +{ + evas_common_draw_context_unset_multiplier(context); +} + +static int +eng_context_multiplier_get(void *data, void *context, int *r, int *g, int *b, int *a) +{ + *r = (int)(R_VAL(&((RGBA_Draw_Context *)context)->mul.col)); + *g = (int)(G_VAL(&((RGBA_Draw_Context *)context)->mul.col)); + *b = (int)(B_VAL(&((RGBA_Draw_Context *)context)->mul.col)); + *a = (int)(A_VAL(&((RGBA_Draw_Context *)context)->mul.col)); + return ((RGBA_Draw_Context *)context)->mul.use; +} + +static void +eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h) +{ + evas_common_draw_context_add_cutout(context, x, y, w, h); +} + +static void +eng_context_cutout_clear(void *data, void *context) +{ + evas_common_draw_context_clear_cutouts(context); +} + +static void +eng_context_anti_alias_set(void *data, void *context, unsigned char aa) +{ + evas_common_draw_context_set_anti_alias(context, aa); +} + +static unsigned char +eng_context_anti_alias_get(void *data, void *context) +{ + return ((RGBA_Draw_Context *)context)->anti_alias; +} + +static void +eng_context_color_interpolation_set(void *data, void *context, int color_space) +{ + evas_common_draw_context_set_color_interpolation(context, color_space); +} + +static int +eng_context_color_interpolation_get(void *data, void *context) +{ + return ((RGBA_Draw_Context *)context)->interpolation.color_space; +} + +static void +eng_context_render_op_set(void *data, void *context, int op) +{ + evas_common_draw_context_set_render_op(context, op); +} + +static int +eng_context_render_op_get(void *data, void *context) +{ + return ((RGBA_Draw_Context *)context)->render_op; +} + + + +static void +eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h) +{ +#ifdef BUILD_PTHREAD + if (cpunum > 1) + evas_common_pipe_rectangle_draw(surface, context, x, y, w, h); + else +#endif + { + evas_common_rectangle_draw(surface, context, x, y, w, h); + evas_common_cpu_end_opt(); + } +} + +static void +eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2) +{ +#ifdef BUILD_PTHREAD + if (cpunum > 1) + evas_common_pipe_line_draw(surface, context, x1, y1, x2, y2); + else +#endif + { + evas_common_line_draw(surface, context, x1, y1, x2, y2); + evas_common_cpu_end_opt(); + } +} + +static void * +eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y) +{ + return evas_common_polygon_point_add(polygon, x, y); +} + +static void * +eng_polygon_points_clear(void *data, void *context, void *polygon) +{ + return evas_common_polygon_points_clear(polygon); +} + +static void +eng_polygon_draw(void *data, void *context, void *surface, void *polygon) +{ +#ifdef BUILD_PTHREAD + if (cpunum > 1) + evas_common_pipe_poly_draw(surface, context, polygon); + else +#endif + { + evas_common_polygon_draw(surface, context, polygon); + evas_common_cpu_end_opt(); + } +} + +static void * +eng_gradient_new(void *data) +{ + return evas_common_gradient_new(); +} + +static void +eng_gradient_free(void *data, void *gradient) +{ + evas_common_gradient_free(gradient); +} + +static void +eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta) +{ + evas_common_gradient_color_stop_add(gradient, r, g, b, a, delta); +} + +static void +eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta) +{ + evas_common_gradient_alpha_stop_add(gradient, a, delta); +} + +static void +eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha) +{ + evas_common_gradient_color_data_set(gradient, map, len, has_alpha); +} + +static void +eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len) +{ + evas_common_gradient_alpha_data_set(gradient, alpha_map, len); +} + +static void +eng_gradient_clear(void *data, void *gradient) +{ + evas_common_gradient_clear(gradient); +} + +static void +eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h) +{ + evas_common_gradient_fill_set(gradient, x, y, w, h); +} + +static void +eng_gradient_fill_angle_set(void *data, void *gradient, double angle) +{ + evas_common_gradient_fill_angle_set(gradient, angle); +} + +static void +eng_gradient_fill_spread_set(void *data, void *gradient, int spread) +{ + evas_common_gradient_fill_spread_set(gradient, spread); +} + +static void +eng_gradient_angle_set(void *data, void *gradient, double angle) +{ + evas_common_gradient_map_angle_set(gradient, angle); +} + +static void +eng_gradient_offset_set(void *data, void *gradient, float offset) +{ + evas_common_gradient_map_offset_set(gradient, offset); +} + +static void +eng_gradient_direction_set(void *data, void *gradient, int direction) +{ + evas_common_gradient_map_direction_set(gradient, direction); +} + +static void +eng_gradient_type_set(void *data, void *gradient, char *name, char *params) +{ + evas_common_gradient_type_set(gradient, name, params); +} + +static int +eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h) +{ + RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context; + RGBA_Gradient *gr = (RGBA_Gradient *)gradient; + + if (!dc || !gr || !gr->type.geometer) return 0; + return !(gr->type.geometer->has_alpha(gr, dc->render_op) | + gr->type.geometer->has_mask(gr, dc->render_op)); +} + +static int +eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h) +{ + RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context; + + if (!dc || !gradient) return 0; + return 1; +} + +static void +eng_gradient_render_pre(void *data, void *context, void *gradient) +{ + RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context; + RGBA_Gradient *gr = (RGBA_Gradient *)gradient; + int len; + + if (!dc || !gr || !gr->type.geometer) return; + gr->type.geometer->geom_set(gr); + len = gr->type.geometer->get_map_len(gr); + evas_common_gradient_map(dc, gr, len); +} + +static void +eng_gradient_render_post(void *data, void *gradient) +{ +} + +static void +eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h) +{ +#ifdef BUILD_PTHREAD + if (cpunum > 1) + evas_common_pipe_grad_draw(surface, context, x, y, w, h, gradient); + else +#endif + { + evas_common_gradient_draw(surface, context, x, y, w, h, gradient); + evas_common_cpu_end_opt(); + } +} + +static int +eng_image_alpha_get(void *data, void *image) +{ + Image_Entry *im; + + if (!image) return 1; + im = image; + switch (im->space) + { + case EVAS_COLORSPACE_ARGB8888: + if (im->flags.alpha) return 1; + default: + break; + } + return 0; +} + +static int +eng_image_colorspace_get(void *data, void *image) +{ + Image_Entry *im; + + if (!image) return EVAS_COLORSPACE_ARGB8888; + im = image; + return im->space; +} + +static void * +eng_image_alpha_set(void *data, void *image, int has_alpha) +{ + RGBA_Image *im; + + if (!image) return NULL; + im = image; + if (im->cache_entry.space != EVAS_COLORSPACE_ARGB8888) + { + im->cache_entry.flags.alpha = 0; + return im; + } + im = (RGBA_Image *) evas_cache_image_alone(&im->cache_entry); + evas_common_image_colorspace_dirty(im); + + im->cache_entry.flags.alpha = has_alpha ? 1 : 0; + return im; +} + +static void * +eng_image_border_set(void *data, void *image, int l, int r, int t, int b) +{ + RGBA_Image *im; + + im = image; + return im; +} + +static void +eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b) +{ + RGBA_Image *im; + + im = image; +} + +static char * +eng_image_comment_get(void *data, void *image, char *key) +{ + RGBA_Image *im; + + if (!image) return NULL; + im = image; + return im->info.comment; +} + +static char * +eng_image_format_get(void *data, void *image) +{ + return NULL; +} + +static void +eng_image_colorspace_set(void *data, void *image, int cspace) +{ + Image_Entry *im; + + if (!image) return; + im = image; + evas_cache_image_colorspace(im, cspace); +} + +static void +eng_image_native_set(void *data, void *image, void *native) +{ +} + +static void * +eng_image_native_get(void *data, void *image) +{ + return NULL; +} + +static void * +eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo) +{ + *error = 0; + return evas_common_load_image_from_file(file, key, lo); +} + +static void * +eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + return evas_cache_image_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace); +} + +static void * +eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + return evas_cache_image_copied_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace); +} + +static void +eng_image_free(void *data, void *image) +{ + evas_cache_image_drop(image); +} + +static void +eng_image_size_get(void *data, void *image, int *w, int *h) +{ + Image_Entry *im; + + im = image; + if (w) *w = im->w; + if (h) *h = im->h; +} + +static void * +eng_image_size_set(void *data, void *image, int w, int h) +{ + Image_Entry *im; + + im = image; + return evas_cache_image_size_set(image, w, h); +} + +static void * +eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h) +{ + Image_Entry *im = image; + + if (!image) return NULL; + return evas_cache_image_dirty(im, x, y, w, h); +} + +static void * +eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data) +{ + RGBA_Image *im; + + if (!image) + { + *image_data = NULL; + return NULL; + } + im = image; + evas_cache_image_load_data(&im->cache_entry); + switch (im->cache_entry.space) + { + case EVAS_COLORSPACE_ARGB8888: + if (to_write) + im = (RGBA_Image *) evas_cache_image_alone(&im->cache_entry); + *image_data = im->image.data; + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + *image_data = im->cs.data; + break; + default: + abort(); + break; + } + return im; +} + +static void * +eng_image_data_put(void *data, void *image, DATA32 *image_data) +{ + RGBA_Image *im, *im2; + + if (!image) return NULL; + im = image; + switch (im->cache_entry.space) + { + case EVAS_COLORSPACE_ARGB8888: + if (image_data != im->image.data) + { + int w, h; + + w = im->cache_entry.w; + h = im->cache_entry.h; + im2 = eng_image_new_from_data(data, w, h, image_data, + eng_image_alpha_get(data, image), + eng_image_colorspace_get(data, image)); + evas_cache_image_drop(&im->cache_entry); + im = im2; + } + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if (image_data != im->cs.data) + { + if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + } + im->cs.data = image_data; + evas_common_image_colorspace_dirty(im); + } + break; + default: + abort(); + break; + } + return im; +} + +static void +eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth) +{ + RGBA_Image *im; + + if (!image) return; + im = image; + if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888) + evas_cache_image_load_data(&im->cache_entry); + evas_common_image_colorspace_normalize(im); +#ifdef BUILD_PTHREAD + if (cpunum > 1) + evas_common_pipe_image_draw(im, surface, context, smooth, + src_x, src_y, src_w, src_h, + dst_x, dst_y, dst_w, dst_h); + else +#endif + { + if (smooth) + evas_common_scale_rgba_in_to_out_clip_smooth(im, surface, context, + src_x, src_y, src_w, src_h, + dst_x, dst_y, dst_w, dst_h); + else + evas_common_scale_rgba_in_to_out_clip_sample(im, surface, context, + src_x, src_y, src_w, src_h, + dst_x, dst_y, dst_w, dst_h); + evas_common_cpu_end_opt(); + } +} + +static void +eng_image_cache_flush(void *data) +{ + int tmp_size; + + tmp_size = evas_common_image_get_cache(); + evas_common_image_set_cache(0); + evas_common_image_set_cache(tmp_size); +} + +static void +eng_image_cache_set(void *data, int bytes) +{ + evas_common_image_set_cache(bytes); +} + +static int +eng_image_cache_get(void *data) +{ + return evas_common_image_get_cache(); +} + +static void * +eng_font_load(void *data, const char *name, int size) +{ + return evas_common_font_load(name, size); +} + +static void * +eng_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size) +{ + return evas_common_font_memory_load(name, size, fdata, fdata_size); +} + +static void * +eng_font_add(void *data, void *font, const char *name, int size) +{ + return evas_common_font_add(font, name, size); +} + +static void * +eng_font_memory_add(void *data, void *font, char *name, int size, const void *fdata, int fdata_size) +{ + return evas_common_font_memory_add(font, name, size, fdata, fdata_size); +} + +static void +eng_font_free(void *data, void *font) +{ + evas_common_font_free(font); +} + +static int +eng_font_ascent_get(void *data, void *font) +{ + return evas_common_font_ascent_get(font); +} + +static int +eng_font_descent_get(void *data, void *font) +{ + return evas_common_font_descent_get(font); +} + +static int +eng_font_max_ascent_get(void *data, void *font) +{ + return evas_common_font_max_ascent_get(font); +} + +static int +eng_font_max_descent_get(void *data, void *font) +{ + return evas_common_font_max_descent_get(font); +} + +static void +eng_font_string_size_get(void *data, void *font, const char *text, int *w, int *h) +{ + evas_common_font_query_size(font, text, w, h); +} + +static int +eng_font_inset_get(void *data, void *font, const char *text) +{ + return evas_common_font_query_inset(font, text); +} + +static int +eng_font_h_advance_get(void *data, void *font, const char *text) +{ + int h, v; + + evas_common_font_query_advance(font, text, &h, &v); + return h; +} + +static int +eng_font_v_advance_get(void *data, void *font, const char *text) +{ + int h, v; + + evas_common_font_query_advance(font, text, &h, &v); + return v; +} + +static int +eng_font_char_coords_get(void *data, void *font, const char *text, int pos, int *cx, int *cy, int *cw, int *ch) +{ + return evas_common_font_query_char_coords(font, text, pos, cx, cy, cw, ch); +} + +static int +eng_font_char_at_coords_get(void *data, void *font, const char *text, int x, int y, int *cx, int *cy, int *cw, int *ch) +{ + return evas_common_font_query_text_at_pos(font, text, x, y, cx, cy, cw, ch); +} + +static void +eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text) +{ +#ifdef BUILD_PTHREAD + if (cpunum > 1) + evas_common_pipe_text_draw(surface, context, font, x, y, text); + else +#endif + { + evas_common_font_draw(surface, context, font, x, y, text); + evas_common_cpu_end_opt(); + } +} + +static void +eng_font_cache_flush(void *data) +{ + evas_common_font_flush(); +} + +static void +eng_font_cache_set(void *data, int bytes) +{ + evas_common_font_cache_set(bytes); +} + +static int +eng_font_cache_get(void *data) +{ + return evas_common_font_cache_get(); +} + +static void +eng_font_hinting_set(void *data, void *font, int hinting) +{ + evas_common_font_hinting_set(font, hinting); +} + +static int +eng_font_hinting_can_hint(void *data, int hinting) +{ + return evas_common_hinting_available(hinting); +} + + +/* + ***** + ** + ** ENGINE API + ** + ***** + */ + +static Evas_Func func = +{ + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + /* draw context virtual methods */ + eng_context_new, + eng_context_free, + eng_context_clip_set, + eng_context_clip_clip, + eng_context_clip_unset, + eng_context_clip_get, + eng_context_color_set, + eng_context_color_get, + eng_context_multiplier_set, + eng_context_multiplier_unset, + eng_context_multiplier_get, + eng_context_cutout_add, + eng_context_cutout_clear, + eng_context_anti_alias_set, + eng_context_anti_alias_get, + eng_context_color_interpolation_set, + eng_context_color_interpolation_get, + eng_context_render_op_set, + eng_context_render_op_get, + /* rect draw funcs */ + eng_rectangle_draw, + /* line draw funcs */ + eng_line_draw, + /* polygon draw funcs */ + eng_polygon_point_add, + eng_polygon_points_clear, + eng_polygon_draw, + /* gradient draw funcs */ + eng_gradient_new, + eng_gradient_free, + eng_gradient_color_stop_add, + eng_gradient_alpha_stop_add, + eng_gradient_color_data_set, + eng_gradient_alpha_data_set, + eng_gradient_clear, + eng_gradient_fill_set, + eng_gradient_fill_angle_set, + eng_gradient_fill_spread_set, + eng_gradient_angle_set, + eng_gradient_offset_set, + eng_gradient_direction_set, + eng_gradient_type_set, + eng_gradient_is_opaque, + eng_gradient_is_visible, + eng_gradient_render_pre, + eng_gradient_render_post, + eng_gradient_draw, + /* image draw funcs */ + eng_image_load, + eng_image_new_from_data, + eng_image_new_from_copied_data, + eng_image_free, + eng_image_size_get, + eng_image_size_set, + NULL, + eng_image_dirty_region, + eng_image_data_get, + eng_image_data_put, + eng_image_alpha_set, + eng_image_alpha_get, + eng_image_border_set, + eng_image_border_get, + eng_image_draw, + eng_image_comment_get, + eng_image_format_get, + eng_image_colorspace_set, + eng_image_colorspace_get, + eng_image_native_set, + eng_image_native_get, + /* image cache funcs */ + eng_image_cache_flush, + eng_image_cache_set, + eng_image_cache_get, + /* font draw functions */ + eng_font_load, + eng_font_memory_load, + eng_font_add, + eng_font_memory_add, + eng_font_free, + eng_font_ascent_get, + eng_font_descent_get, + eng_font_max_ascent_get, + eng_font_max_descent_get, + eng_font_string_size_get, + eng_font_inset_get, + eng_font_h_advance_get, + eng_font_v_advance_get, + eng_font_char_coords_get, + eng_font_char_at_coords_get, + eng_font_draw, + /* font cache functions */ + eng_font_cache_flush, + eng_font_cache_set, + eng_font_cache_get, + /* font hinting functions */ + eng_font_hinting_set, + eng_font_hinting_can_hint + /* FUTURE software generic calls go here */ +}; + +/* + ***** + ** + ** MODULE ACCESSIBLE API API + ** + ***** + */ + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + em->functions = (void *)(&func); + cpunum = evas_common_cpu_count(); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "software_generic", + "none" +}; diff --git a/src/modules/engines/software_qtopia/.cvsignore b/src/modules/engines/software_qtopia/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/software_qtopia/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/software_qtopia/Evas_Engine_Software_Qtopia.h b/src/modules/engines/software_qtopia/Evas_Engine_Software_Qtopia.h new file mode 100644 index 0000000..5b863b0 --- /dev/null +++ b/src/modules/engines/software_qtopia/Evas_Engine_Software_Qtopia.h @@ -0,0 +1,31 @@ +#ifndef _EVAS_ENGINE_SOFTWARE_QTOPIA_H +#define _EVAS_ENGINE_SOFTWARE_QTOPIA_H + +#ifdef EVAS_COMMON_H +#ifdef EVAS_PRIVATE_H +typedef void QWidget; +#endif +#endif + +#ifndef EVAS_COMMON_H +#ifndef EVAS_PRIVATE_H +#include +#endif +#endif + +typedef struct _Evas_Engine_Info_Software_Qtopia Evas_Engine_Info_Software_Qtopia; + +struct _Evas_Engine_Info_Software_Qtopia +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + struct { + QWidget *target; + int rotation; + } info; +}; +#endif + + diff --git a/src/modules/engines/software_qtopia/Makefile.am b/src/modules/engines/software_qtopia/Makefile.am new file mode 100644 index 0000000..2911f2d --- /dev/null +++ b/src/modules/engines/software_qtopia/Makefile.am @@ -0,0 +1,39 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +@FREETYPE_CFLAGS@ \ +@qt_cflags@ + +AM_CXXFLAGS = $(CFLAGS) -DQT_QWS_EBX -DQT_QWS_CUSTOM -DQWS -DNO_DEBUG + +if BUILD_ENGINE_SOFTWARE_QTOPIA + +pkgdir = $(libdir)/evas/modules/engines/software_qtopia/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la +module_la_SOURCES = \ +evas_engine.h \ +evas_engine.c \ +evas_outbuf.c \ +evas_qt_main.cpp + +module_la_LIBADD = @qt_libs@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_Software_Qtopia.h + +endif + +EXTRA_DIST = \ +evas_engine.h \ +evas_engine.c \ +evas_outbuf.c \ +evas_qt_main.cpp \ +Evas_Engine_Software_Qtopia.h diff --git a/src/modules/engines/software_qtopia/evas_engine.c b/src/modules/engines/software_qtopia/evas_engine.c new file mode 100644 index 0000000..4c07949 --- /dev/null +++ b/src/modules/engines/software_qtopia/evas_engine.c @@ -0,0 +1,299 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Software_Qtopia.h" + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func, pfunc; + +/* engine struct data */ +typedef struct _Render_Engine Render_Engine; + +struct _Render_Engine +{ + Tilebuf *tb; + Outbuf *ob; + Tilebuf_Rect *rects; + Evas_Object_List *cur_rect; + int end : 1; +}; + +/* prototypes we will use here */ +static void *_output_setup(int w, int h, int rot, QWidget *target); + +static void *eng_info(Evas *e); +static void eng_info_free(Evas *e, void *info); +static void eng_setup(Evas *e, void *info); +static void eng_output_free(void *data); +static void eng_output_resize(void *data, int w, int h); +static void eng_output_tile_size_set(void *data, int w, int h); +static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h); +static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h); +static void eng_output_redraws_clear(void *data); +static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch); +static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h); +static void eng_output_flush(void *data); +static void eng_output_idle_flush(void *data); + +/* internal engine routines */ +static void * +_output_setup(int w, int h, int rot, QWidget *target) +{ + Render_Engine *re; + + re = calloc(1, sizeof(Render_Engine)); + /* if we haven't initialized - init (automatic abort if already done) */ + evas_common_cpu_init(); + + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + + evas_qtopia_outbuf_software_qtopia_init(); + + /* get any stored performance metrics from device (xserver) */ + re->ob = evas_qtopia_outbuf_software_qtopia_setup_q(w, h, rot, OUTBUF_DEPTH_INHERIT, target); + if (!re->ob) + { + free(re); + return NULL; + } + evas_qtopia_outbuf_software_qtopia_set_have_backbuf(re->ob, 0); + re->tb = evas_common_tilebuf_new(w, h); + if (!re->tb) + { + evas_qtopia_outbuf_software_qtopia_free(re->ob); + free(re); + return NULL; + } + /* in preliminary tests 16x16 gave highest framerates */ + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + return re; +} + +/* engine api this module provides */ +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_Software_Qtopia *info; + + info = calloc(1, sizeof(Evas_Engine_Info_Software_Qtopia)); + if (!info) return NULL; + info->magic.magic = rand(); + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_Software_Qtopia *in; + + in = (Evas_Engine_Info_Software_Qtopia *)info; + free(in); +} + +static void +eng_setup(Evas *e, void *in) +{ + Render_Engine *re; + Evas_Engine_Info_Software_Qtopia *info; + + info = (Evas_Engine_Info_Software_Qtopia *)in; + if (!e->engine.data.output) + e->engine.data.output = + _output_setup(e->output.w, + e->output.h, + info->info.rotation, + info->info.target); + if (!e->engine.data.output) return; + if (!e->engine.data.context) + e->engine.data.context = + e->engine.func->context_new(e->engine.data.output); + + re = e->engine.data.output; +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_qtopia_outbuf_software_qtopia_free(re->ob); + evas_common_tilebuf_free(re->tb); + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + free(re); + + evas_common_font_shutdown(); + evas_common_image_shutdown(); +} + +static void +eng_output_resize(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_qtopia_outbuf_software_qtopia_reconfigure(re->ob, w, h, + evas_qtopia_outbuf_software_qtopia_get_rot(re->ob), + OUTBUF_DEPTH_INHERIT); + evas_qtopia_outbuf_software_qtopia_set_have_backbuf(re->ob, 0); + evas_common_tilebuf_free(re->tb); + re->tb = evas_common_tilebuf_new(w, h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); +} + +static void +eng_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_set_tile_size(re->tb, w, h); +} + +static void +eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_clear(re->tb); +} + +static void * +eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + RGBA_Image *surface; + Tilebuf_Rect *rect; + int ux, uy, uw, uh; + + re = (Render_Engine *)data; + if (re->end) + { + re->end = 0; + return NULL; + } + if (!re->rects) + { + re->rects = evas_common_tilebuf_get_render_rects(re->tb); + re->cur_rect = (Evas_Object_List *)re->rects; + } + if (!re->cur_rect) return NULL; + rect = (Tilebuf_Rect *)re->cur_rect; + ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h; + re->cur_rect = re->cur_rect->next; + if (!re->cur_rect) + { + evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + re->end = 1; + } + + surface = evas_qtopia_outbuf_software_qtopia_new_region_for_update(re->ob, + ux, uy, uw, uh, + cx, cy, cw, ch); + *x = ux; *y = uy; *w = uw; *h = uh; + return surface; +} + +static void +eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + Evas_Engine_Info_Software_Qtopia *info; + + re = (Render_Engine *)data; + evas_common_pipe_begin(surface); + evas_common_pipe_flush(surface); + evas_qtopia_outbuf_software_qtopia_push_updated_region(re->ob, surface, x, y, w, h); + evas_qtopia_outbuf_software_qtopia_free_region_for_update(re->ob, surface); + evas_common_cpu_end_opt(); +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static void +eng_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +/* module advertising code */ +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ +#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(output_flush); + ORD(output_idle_flush); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "software_qtopia", + "none" +}; diff --git a/src/modules/engines/software_qtopia/evas_engine.h b/src/modules/engines/software_qtopia/evas_engine.h new file mode 100644 index 0000000..574d61a --- /dev/null +++ b/src/modules/engines/software_qtopia/evas_engine.h @@ -0,0 +1,103 @@ +#ifndef EVAS_ENGINE_H +#define EVAS_ENGINE_H + +typedef struct _Outbuf Outbuf; +typedef struct _QT_Direct QT_Direct; +typedef struct _QT_Direct_Rect QT_Direct_Rect; + +enum _Outbuf_Depth +{ + OUTBUF_DEPTH_NONE, + OUTBUF_DEPTH_INHERIT, + OUTBUF_DEPTH_RGB_16BPP_565_565_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_555_555_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_444_444_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_565_444_DITHERED, + OUTBUF_DEPTH_RGB_32BPP_888_8888, + OUTBUF_DEPTH_LAST +}; + +typedef enum _Outbuf_Depth Outbuf_Depth; + + +struct _Outbuf +{ + Outbuf_Depth depth; + int w, h; + int rot; + + struct { + void *target; + + struct { + DATA32 r, g, b; + } mask; + RGBA_Image *back_buf; + } priv; +}; + +struct _QT_Direct_Rect +{ + int x, y, w, h; +}; + +struct _QT_Direct +{ + /* our target widget */ + void *target; + /* our direct painter object */ + void *direct; + /* The fb */ + struct + { + DATA8 *data; + int bpp; + int rotation; + int width; + struct { + DATA32 r, g, b; + } mask; + } fb; + /* Relative to fb coords */ + struct { + int count; + QT_Direct_Rect *r; + } rects; + /* Relative to fb coords */ + QT_Direct_Rect location; + QT_Direct_Rect updated; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +/****/ +void x_software_qtopia_init (void); + +void evas_qtopia_outbuf_software_qtopia_init (void); +void evas_qtopia_outbuf_software_qtopia_free (Outbuf *buf); + +Outbuf *evas_qtopia_outbuf_software_qtopia_setup_q (int w, int h, int rot, Outbuf_Depth depth, void *target); + +void evas_qtopia_outbuf_software_qtopia_blit (Outbuf *buf, int src_x, int src_y, int w, int h, int dst_x, int dst_y); +void evas_qtopia_outbuf_software_qtopia_update (Outbuf *buf, int x, int y, int w, int h); +RGBA_Image *evas_qtopia_outbuf_software_qtopia_new_region_for_update (Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch); +void evas_qtopia_outbuf_software_qtopia_free_region_for_update (Outbuf *buf, RGBA_Image *update); +void evas_qtopia_outbuf_software_qtopia_push_updated_region (Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h); +void evas_qtopia_outbuf_software_qtopia_reconfigure (Outbuf *buf, int w, int h, int rot, Outbuf_Depth depth); +int evas_qtopia_outbuf_software_qtopia_get_width (Outbuf *buf); +int evas_qtopia_outbuf_software_qtopia_get_height (Outbuf *buf); +Outbuf_Depth evas_qtopia_outbuf_software_qtopia_get_depth (Outbuf *buf); +int evas_qtopia_outbuf_software_qtopia_get_rot (Outbuf *buf); +int evas_qtopia_outbuf_software_qtopia_get_have_backbuf (Outbuf *buf); +void evas_qtopia_outbuf_software_qtopia_set_have_backbuf (Outbuf *buf, int have_backbuf); + +QT_Direct *evas_qt_main_direct_start (void *target); +void evas_qt_main_direct_stop (QT_Direct *d); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/modules/engines/software_qtopia/evas_outbuf.c b/src/modules/engines/software_qtopia/evas_outbuf.c new file mode 100644 index 0000000..3e6790e --- /dev/null +++ b/src/modules/engines/software_qtopia/evas_outbuf.c @@ -0,0 +1,245 @@ +#include "evas_common.h" +#include "evas_engine.h" +#include "evas_private.h" +#include "Evas_Engine_Software_Qtopia.h" +#include +#include + +void +evas_qtopia_outbuf_software_qtopia_init(void) +{ +} + +void +evas_qtopia_outbuf_software_qtopia_free(Outbuf *buf) +{ + free(buf); +} + +Outbuf * +evas_qtopia_outbuf_software_qtopia_setup_q(int w, int h, int rot, Outbuf_Depth depth, QWidget *target) +{ + Outbuf *buf; + + buf = calloc(1, sizeof(Outbuf)); + if (!buf) + { + free(buf); + return NULL; + } + + buf->w = w; + buf->h = h; + buf->rot = rot; + buf->priv.target = target; + { + QT_Direct *direct; + + direct = evas_qt_main_direct_start(buf->priv.target); + if (direct) + { + buf->w = direct->location.w; + buf->h = direct->location.h; + buf->rot = direct->fb.rotation; + evas_qt_main_direct_stop(direct); + } + } + return buf; +} + +void +evas_qtopia_outbuf_software_qtopia_blit(Outbuf *buf, int src_x, int src_y, int w, int h, int dst_x, int dst_y) +{ +} + +void +evas_qtopia_outbuf_software_qtopia_update(Outbuf *buf, int x, int y, int w, int h) +{ +} + +RGBA_Image * +evas_qtopia_outbuf_software_qtopia_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) +{ + RGBA_Image *im; + + *cx = 0; *cy = 0; *cw = w; *ch = h; + im = evas_common_image_create(w, h); + return im; +} + +void +evas_qtopia_outbuf_software_qtopia_free_region_for_update(Outbuf *buf, RGBA_Image *update) +{ + evas_common_image_free(update); +} + +void +evas_qtopia_outbuf_software_qtopia_push_updated_region(Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h) +{ + Gfx_Func_Convert conv_func; + DATA8 *data; + QT_Direct *d; + + data = NULL; + conv_func = NULL; + + d = evas_qt_main_direct_start(buf->priv.target); + if (d) + { + int i; + + for (i = 0; i < d->rects.count; i++) + { + int fb_bytes; + DATA8 *fb_mem; + int ox, oy, ow, oh; + int rx, ry, rw, rh; + + ox = x; oy = y; ow = w; oh = h; + rx = d->rects.r[i].x - d->location.x; + ry = d->rects.r[i].y - d->location.y; + rw = d->rects.r[i].w; + rh = d->rects.r[i].h; + if (x < rx) + { + w += (x - rx); + x = rx; + } + if (y < ry) + { + h += (y - ry); + y = ry; + } + if ((w <= 0) || (h <= 0)) goto nope; + if ((x + w) > (rx + rw)) w = (rx + rw - x); + if ((y + h) > (ry + rh)) h = (ry + rh - y); + if ((w <= 0) || (h <= 0)) goto nope; + fb_bytes = d->fb.bpp / 8; + if (buf->rot == 0) + { + fb_mem = d->fb.data + + ((d->location.y * d->fb.width * fb_bytes) + + (d->location.x * fb_bytes)); + data = fb_mem + (fb_bytes * (x + (y * d->fb.width))); + conv_func = evas_common_convert_func_get(data, w, h, d->fb.bpp, + d->fb.mask.r, d->fb.mask.g, d->fb.mask.b, + PAL_MODE_NONE, buf->rot); + } + else if (buf->rot == 180) + { + // FIXME + } + else if (buf->rot == 270) + { + fb_mem = d->fb.data + + (fb_bytes * + ((d->location.x * d->fb.width) + + (d->fb.width - d->location.y - d->location.h))); + data = fb_mem + (fb_bytes * (buf->h - y - h + (x * d->fb.width))); + conv_func = evas_common_convert_func_get(data, h, w, d->fb.bpp, + d->fb.mask.r, d->fb.mask.g, d->fb.mask.b, + PAL_MODE_NONE, buf->rot); + } + else if (buf->rot == 90) + { + // FIXME: wrong fb_mem + fb_mem = d->fb.data + + ((d->location.y * d->fb.width * fb_bytes) + + (d->location.x * fb_bytes)); + data = fb_mem + (fb_bytes * (y + ((buf->w - x - w) * d->fb.width))); + conv_func = evas_common_convert_func_get(data, h, w, d->fb.bpp, + d->fb.mask.r, d->fb.mask.g, d->fb.mask.b, + PAL_MODE_NONE, buf->rot); + } + if (conv_func) + { + DATA32 *src_data; + + if (buf->rot == 0) + { + src_data = update->image->data + + (ow * (y - oy)) + (x - ox); + conv_func(src_data, data, + ow - w, + d->fb.width - w, + w, h, + x, y, NULL); + } + else if (buf->rot == 180) + { + // FIXME + } + else if (buf->rot == 270) + { + src_data = update->image->data + + (ow * (y - oy)) + (x - ox); + conv_func(src_data, data, + ow - w, + d->fb.width - h, + h, w, + x, y, NULL); + } + else if (buf->rot == 90) + { + src_data = update->image->data + + (ow * (y - oy)) + (x - ox); + conv_func(src_data, data, + ow - w, + d->fb.width - h, + h, w, + x, y, NULL); + } + } + nope:; + x = ox; y = oy; w = ow; h = oh; + } + d->updated.x = x; d->updated.y = y; d->updated.w = w; d->updated.h = h; + evas_qt_main_direct_stop(d); + } +} + +void +evas_qtopia_outbuf_software_qtopia_reconfigure(Outbuf *buf, int w, int h, int rot, Outbuf_Depth depth) +{ + if ((w == buf->w) && (h == buf->h) && + (rot == buf->rot) && (depth == buf->depth)) + return; + buf->w = w; + buf->h = h; + buf->rot = rot; +} + +int +evas_qtopia_outbuf_software_qtopia_get_width(Outbuf *buf) +{ + return buf->w; +} + +int +evas_qtopia_outbuf_software_qtopia_get_height(Outbuf *buf) +{ + return buf->h; +} + +Outbuf_Depth +evas_qtopia_outbuf_software_qtopia_get_depth(Outbuf *buf) +{ + return buf->depth; +} + +int +evas_qtopia_outbuf_software_qtopia_get_rot(Outbuf *buf) +{ + return buf->rot; +} + +int +evas_qtopia_outbuf_software_qtopia_get_have_backbuf(Outbuf *buf) +{ + return 0; +} + +void +evas_qtopia_outbuf_software_qtopia_set_have_backbuf(Outbuf *buf, int have_backbuf) +{ +} diff --git a/src/modules/engines/software_qtopia/evas_qt_main.cpp b/src/modules/engines/software_qtopia/evas_qt_main.cpp new file mode 100644 index 0000000..bca95ba --- /dev/null +++ b/src/modules/engines/software_qtopia/evas_qt_main.cpp @@ -0,0 +1,109 @@ +#include "evas_common.h" +#include "evas_engine.h" +#include +#include +#include +#include +#include + +//#define QVFB_BUG + +extern "C" { + QT_Direct * + evas_qt_main_direct_start(void *target) + { + QT_Direct *d; + QDirectPainter *dp; + QWidget *widget; + int i; + + widget = (QWidget *)target; + dp = new QDirectPainter(widget); + if (!dp) return NULL; + d = (QT_Direct *)calloc(1, sizeof(QT_Direct)); + if (!d) return NULL; + d->target = target; + d->direct = (void *)dp; + d->fb.data = dp->frameBuffer(); + d->fb.bpp = dp->depth(); + d->fb.width = dp->lineStep() / (d->fb.bpp / 8); + if (dp->depth() == 16) + { + d->fb.mask.r = 0xf800; + d->fb.mask.g = 0x07e0; + d->fb.mask.b = 0x001f; + } + else if (dp->depth() == 32) + { + d->fb.mask.r = 0x00ff0000; + d->fb.mask.g = 0x0000ff00; + d->fb.mask.b = 0x000000ff; + } + else + { + delete dp; + free(d); + return NULL; + } + d->fb.rotation = dp->transformOrientation() * 90; + d->rects.count = dp->numRects(); + if (d->rects.count > 0) + { + d->rects.r = (QT_Direct_Rect *)calloc(d->rects.count, sizeof(QT_Direct_Rect)); + if (d->rects.r) + { + for (i = 0; i < d->rects.count; i++) + { + QRect r; + + r = dp->rect(i); + if (d->fb.rotation == 0) + { + d->rects.r[i].x = r.x(); + d->rects.r[i].y = r.y(); + d->rects.r[i].w = r.width(); + d->rects.r[i].h = r.height(); + } + else if (d->fb.rotation == 270) + { + d->rects.r[i].x = r.y(); + d->rects.r[i].y = d->fb.width - r.x() - r.width(); + d->rects.r[i].w = r.height(); + d->rects.r[i].h = r.width(); + } + else if (d->fb.rotation == 90) + { + // FIXME: do + } + } + } + else + d->rects.count = 0; + } + d->location.x = dp->xOffset(); + d->location.y = dp->yOffset(); + d->location.w = dp->width(); + d->location.h = dp->height(); + return d; + } + void + evas_qt_main_direct_stop(QT_Direct *d) + { + QDirectPainter *dp; + +#ifdef QVFB_BUG + { + QWidget *target = (QWidget *)d->target; + QRect rect(d->updated.x, d->updated.y, + d->updated.w, d->updated.h); + QPainter p(target); + + p.fillRect(rect, QBrush::NoBrush); + } +#endif + dp = (QDirectPainter *)d->direct; + delete dp; + if (d->rects.r) free(d->rects.r); + free(d); + } +} diff --git a/src/modules/engines/software_sdl/.cvsignore b/src/modules/engines/software_sdl/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/software_sdl/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/software_sdl/Evas_Engine_SDL.h b/src/modules/engines/software_sdl/Evas_Engine_SDL.h new file mode 100644 index 0000000..71efa8a --- /dev/null +++ b/src/modules/engines/software_sdl/Evas_Engine_SDL.h @@ -0,0 +1,24 @@ +#ifndef _EVAS_ENGINE_SDL_H +#define _EVAS_ENGINE_SDL_H + +#include + +typedef struct _Evas_Engine_Info_SDL Evas_Engine_Info_SDL; + +struct _Evas_Engine_Info_SDL +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + struct { + int rotation; + int fullscreen : 1; + int hwsurface : 1; + int noframe : 1; + int alpha : 1; + } info; +}; +#endif + + diff --git a/src/modules/engines/software_sdl/Makefile.am b/src/modules/engines/software_sdl/Makefile.am new file mode 100644 index 0000000..4c4c123 --- /dev/null +++ b/src/modules/engines/software_sdl/Makefile.am @@ -0,0 +1,31 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +@FREETYPE_CFLAGS@ \ +@SDL_CFLAGS@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +if BUILD_ENGINE_SDL + +pkgdir = $(libdir)/evas/modules/engines/software_sdl/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = evas_engine.c + +module_la_LIBADD = @SDL_LIBS@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_SDL.h + +endif + +EXTRA_DIST = evas_engine.h diff --git a/src/modules/engines/software_sdl/evas_engine.c b/src/modules/engines/software_sdl/evas_engine.c new file mode 100644 index 0000000..69d47ad --- /dev/null +++ b/src/modules/engines/software_sdl/evas_engine.c @@ -0,0 +1,1101 @@ +#include +#include +#include +#include +#include +#include + +#include "evas_engine.h" + +/* #define DEBUG_SDL */ + +static Evas_Func func = {}; +static Evas_Func pfunc = {}; + +static void* _sdl_output_setup (int w, int h, int fullscreen, int noframe, int alpha, int hwsurface); + +static Engine_Image_Entry *_sdl_image_alloc (void); +static void _sdl_image_delete (Engine_Image_Entry *eim); + +static int _sdl_image_constructor (Engine_Image_Entry*, void* data); +static void _sdl_image_destructor (Engine_Image_Entry *eim); + +static void _sdl_image_dirty_region(Engine_Image_Entry *eim, int x, int y, int w, int h); + +static int _sdl_image_dirty (Engine_Image_Entry *dst, const Engine_Image_Entry *src); + +static int _sdl_image_size_set (Engine_Image_Entry *dst, const Engine_Image_Entry *src); + +static int _sdl_image_update_data (Engine_Image_Entry* dst, void* engine_data); + +static void _sdl_image_load (Engine_Image_Entry *eim, const Image_Entry* im); +static int _sdl_image_mem_size_get(Engine_Image_Entry *eim); + +#ifdef DEBUG_SDL +static void _sdl_image_debug (const char* context, Engine_Image_Entry* im); +#endif + +static const Evas_Cache_Engine_Image_Func _sdl_cache_engine_image_cb = { + NULL /* key */, + _sdl_image_alloc /* alloc */, + _sdl_image_delete /* dealloc */, + _sdl_image_constructor /* constructor */, + _sdl_image_destructor /* destructor */, + _sdl_image_dirty_region /* dirty_region */, + _sdl_image_dirty /* dirty */, + _sdl_image_size_set /* size_set */, + _sdl_image_update_data /* update_data */, + _sdl_image_load /* load */, + _sdl_image_mem_size_get /* mem_size_get */, +#ifdef DEBUG_SDL /* debug */ + _sdl_image_debug +#else + NULL +#endif +}; + +#define _SDL_UPDATE_PIXELS(EIM) \ + ((RGBA_Image *) EIM->cache_entry.src)->image.data = EIM->surface->pixels; + +#define RMASK 0x00ff0000 +#define GMASK 0x0000ff00 +#define BMASK 0x000000ff +#define AMASK 0xff000000 + +/* SDL engine info function */ +static void* +evas_engine_sdl_info (Evas* e) +{ + Evas_Engine_Info_SDL* info = calloc(1, sizeof (Evas_Engine_Info_SDL)); + + if (!info) + return NULL; + + info->magic.magic = rand(); + + return info; +} + +static void +evas_engine_sdl_info_free (Evas* e, void* info) +{ + Evas_Engine_Info_SDL* in = (Evas_Engine_Info_SDL*) info; + + free(in); + in = NULL; +} + +/* SDL engine output manipulation function */ +static void +evas_engine_sdl_setup (Evas* e, void* in) +{ + Evas_Engine_Info_SDL* info = (Evas_Engine_Info_SDL*) in; + + /* if we arent set to sdl, why the hell do we get called?! */ + if (evas_output_method_get(e) != evas_render_method_lookup("software_sdl")) + return ; + + SDL_Init(SDL_INIT_NOPARACHUTE); + + if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) + { + fprintf(stderr, "SDL_Init failed with %s\n", SDL_GetError()); + exit(-1); + } + + /* lets just set up */ + e->engine.data.output = _sdl_output_setup(e->output.w, e->output.h, + info->info.fullscreen, + info->info.noframe, + info->info.alpha, + info->info.hwsurface); + + if (!e->engine.data.output) + return; + + e->engine.func = &func; + e->engine.data.context = e->engine.func->context_new(e->engine.data.output); +} + +static void +evas_engine_sdl_output_free (void *data) +{ + Render_Engine* re = data; + + if (re->cache) + evas_cache_engine_image_shutdown(re->cache); + + evas_common_tilebuf_free(re->tb); + if (re->rects) + evas_common_tilebuf_free_render_rects(re->rects); + + if (re->update_rects) + free(re->update_rects); + free(re); + +/* evas_common_font_shutdown(); */ + evas_common_image_shutdown(); + + SDL_QuitSubSystem(SDL_INIT_VIDEO); +} + +static void +evas_engine_sdl_output_resize (void *data, int w, int h) +{ + /* FIXME */ + Render_Engine *re = data; + SDL_Surface *surface; + + if (w == re->tb->outbuf_w && h == re->tb->outbuf_h) + return; + + /* Destroy the current screen */ + evas_cache_engine_image_drop(&re->rgba_engine_image->cache_entry); + + /* Rebuil tilebuf */ + evas_common_tilebuf_free(re->tb); + re->tb = evas_common_tilebuf_new(w, h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + + /* Build the new screen */ + surface = SDL_SetVideoMode(w, h, 32, + (re->flags.hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE) + | (re->flags.fullscreen ? SDL_FULLSCREEN : 0) + | (re->flags.noframe ? SDL_NOFRAME : 0) + | (re->flags.alpha ? SDL_SRCALPHA : 0)); + + if (!surface) + { + fprintf(stderr, "Unable to change the resolution to : %ix%i\n", w, h); + exit(-1); + } + re->rgba_engine_image = (SDL_Engine_Image_Entry *) evas_cache_engine_image_engine(re->cache, surface); + if (!re->rgba_engine_image) + { + fprintf(stderr, "RGBA_Image allocation from SDL failed\n"); + exit(-1); + } + + SDL_FillRect(surface, NULL, 0); +} + +static void +evas_engine_sdl_output_tile_size_set (void *data, int w, int h) +{ + Render_Engine* re = (Render_Engine*) data; + + evas_common_tilebuf_set_tile_size(re->tb, w, h); +} + +static void +evas_engine_sdl_output_redraws_rect_add (void *data, int x, int y, int w, int h) +{ + Render_Engine* re = (Render_Engine*) data; + + evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); +} + +static void +evas_engine_sdl_output_redraws_rect_del (void *data, int x, int y, int w, int h) +{ + Render_Engine* re = (Render_Engine*) data; + + evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); +} + +static void +evas_engine_sdl_output_redraws_clear (void *data) +{ + Render_Engine* re = (Render_Engine*) data; + + evas_common_tilebuf_clear(re->tb); +} + +static void* +evas_engine_sdl_output_redraws_next_update_get (void *data, + int *x, int *y, int *w, int *h, + int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re = data; + Tilebuf_Rect *tb_rect; + SDL_Rect rect; + + if (re->flags.end) + { + re->flags.end = 0; + return NULL; + } + if (!re->rects) + { + re->rects = evas_common_tilebuf_get_render_rects(re->tb); + re->cur_rect = (Evas_Object_List *) re->rects; + } + if (!re->cur_rect) + return NULL; + + tb_rect = (Tilebuf_Rect*) re->cur_rect; + *cx = *x = tb_rect->x; + *cy = *y = tb_rect->y; + *cw = *w = tb_rect->w; + *ch = *h = tb_rect->h; + re->cur_rect = re->cur_rect->next; + if (!re->cur_rect) + { + evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + re->flags.end = 1; + } + + rect.x = *x; + rect.y = *y; + rect.w = *w; + rect.h = *h; + + SDL_FillRect(re->rgba_engine_image->surface, &rect, 0); + + /* Return the "fake" surface so it is passed to the drawing routines. */ + return re->rgba_engine_image; +} + +static void +evas_engine_sdl_output_redraws_next_update_push (void *data, void *surface, + int x, int y, int w, int h) +{ + Render_Engine *re = (Render_Engine *) data; + + if (re->update_rects_count + 1 > re->update_rects_limit) + { + re->update_rects_limit += 8; + re->update_rects = realloc(re->update_rects, sizeof (SDL_Rect) * re->update_rects_limit); + } + + re->update_rects[re->update_rects_count].x = x; + re->update_rects[re->update_rects_count].y = y; + re->update_rects[re->update_rects_count].w = w; + re->update_rects[re->update_rects_count].h = h; + + ++re->update_rects_count; + + evas_common_cpu_end_opt(); +} + +static void +_sdl_image_dirty_region(Engine_Image_Entry *eim, int x, int y, int w, int h) +{ + SDL_Engine_Image_Entry *dst; + RGBA_Image *im; + + dst = (SDL_Engine_Image_Entry *) eim; + + SDL_UpdateRect(dst->surface, x, y, w, h); + + im = (RGBA_Image *)eim->src; + im->flags |= RGBA_IMAGE_IS_DIRTY; +} + +static void +evas_engine_sdl_output_flush(void *data) +{ + Render_Engine *re = (Render_Engine *) data; + + if (re->update_rects_count > 0) + SDL_UpdateRects(re->rgba_engine_image->surface, re->update_rects_count, re->update_rects); + + re->update_rects_count = 0; +} + + +static void +evas_engine_sdl_output_idle_flush(void *data) +{ + (void) data; +} + +/* + * Image objects + */ + +static void* +evas_engine_sdl_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo) +{ + Render_Engine* re = (Render_Engine*) data;; + + *error = 0; + return evas_cache_engine_image_request(re->cache, file, key, lo, NULL, error); +} + +static int +evas_engine_sdl_image_alpha_get(void *data, void *image) +{ + SDL_Engine_Image_Entry *eim = image; + RGBA_Image *im; + + if (!eim) return 1; + im = (RGBA_Image *) eim->cache_entry.src; + switch (eim->cache_entry.src->space) + { + case EVAS_COLORSPACE_ARGB8888: + if (im->cache_entry.flags.alpha) return 1; + default: + break; + } + return 0; +} + +static void +evas_engine_sdl_image_size_get(void *data, void *image, int *w, int *h) +{ + SDL_Engine_Image_Entry *eim; + + eim = image; + if (w) *w = eim->cache_entry.src->w; + if (h) *h = eim->cache_entry.src->h; +} + +static int +evas_engine_sdl_image_colorspace_get(void *data, void *image) +{ + SDL_Engine_Image_Entry *eim = image; + + if (!eim) return EVAS_COLORSPACE_ARGB8888; + return eim->cache_entry.src->space; +} + +static void +evas_engine_sdl_image_colorspace_set(void *data, void *image, int cspace) +{ + SDL_Engine_Image_Entry *eim = image; + + if (!eim) return; + if (eim->cache_entry.src->space == cspace) return; + + evas_cache_engine_image_colorspace(&eim->cache_entry, cspace, NULL); +} + +static void* +evas_engine_sdl_image_new_from_copied_data(void *data, + int w, int h, + DATA32* image_data, + int alpha, int cspace) +{ + Render_Engine *re = (Render_Engine*) data; + + return evas_cache_engine_image_copied_data(re->cache, w, h, image_data, alpha, cspace, NULL); +} + +static void* +evas_engine_sdl_image_new_from_data(void *data, int w, int h, DATA32* image_data, int alpha, int cspace) +{ + Render_Engine *re = (Render_Engine*) data; + + return evas_cache_engine_image_data(re->cache, w, h, image_data, alpha, cspace, NULL); +} + +static void +evas_engine_sdl_image_free(void *data, void *image) +{ + SDL_Engine_Image_Entry *eim = image; + + (void) data; + + evas_cache_engine_image_drop(&eim->cache_entry); +} + +static void* +evas_engine_sdl_image_size_set(void *data, void *image, int w, int h) +{ + SDL_Engine_Image_Entry *eim = image; + + (void) data; + + return evas_cache_engine_image_size_set(&eim->cache_entry, w, h); +} + +static void* +evas_engine_sdl_image_dirty_region(void *data, + void *image, + int x, int y, int w, int h) +{ + SDL_Engine_Image_Entry *eim = image; + + (void) data; + + return evas_cache_engine_image_dirty(&eim->cache_entry, x, y, w, h); +} + +static void* +evas_engine_sdl_image_data_get(void *data, void *image, + int to_write, DATA32** image_data) +{ + SDL_Engine_Image_Entry *eim = image; + RGBA_Image *im; + + (void) data; + + if (!eim) + { + *image_data = NULL; + return NULL; + } + im = (RGBA_Image *) eim->cache_entry.src; + + switch (eim->cache_entry.src->space) + { + case EVAS_COLORSPACE_ARGB8888: + if (to_write) + eim = (SDL_Engine_Image_Entry *) evas_cache_engine_image_dirty(&eim->cache_entry, 0, 0, eim->cache_entry.src->w, eim->cache_entry.src->h); + + evas_cache_engine_image_load_data(&eim->cache_entry); + *image_data = im->image.data; + break; + case EVAS_COLORSPACE_YCBCR422P709_PL: + case EVAS_COLORSPACE_YCBCR422P601_PL: + *image_data = im->cs.data; + break; + default: + abort(); + break; + } + return eim; +} + +static void* +evas_engine_sdl_image_data_put(void *data, void *image, DATA32* image_data) +{ + SDL_Engine_Image_Entry *eim = image; + Render_Engine *re = data; + RGBA_Image *im; + + if (!eim) return NULL; + im = (RGBA_Image*) eim->cache_entry.src; + + switch (eim->cache_entry.src->space) + { + case EVAS_COLORSPACE_ARGB8888: + if (image_data != im->image.data) + { + evas_cache_engine_image_drop(&eim->cache_entry); + eim = (SDL_Engine_Image_Entry *) evas_cache_engine_image_data(re->cache, + eim->cache_entry.w, eim->cache_entry.h, + image_data, + func.image_alpha_get(data, eim), + func.image_colorspace_get(data, eim), + NULL); + } + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if (image_data != im->cs.data) + { + if (im->cs.data) + if (!im->cs.no_free) + free(im->cs.data); + im->cs.data = image_data; + evas_common_image_colorspace_dirty(im); + } + break; + default: + abort(); + break; + } + return eim; +} + +static void* +evas_engine_sdl_image_alpha_set(void *data, void *image, int has_alpha) +{ + SDL_Engine_Image_Entry *eim = image; + RGBA_Image *im; + + (void) data; + + if (!eim) return NULL; + + im = (RGBA_Image *) eim->cache_entry.src; + + if (eim->cache_entry.src->space != EVAS_COLORSPACE_ARGB8888) + { + im->cache_entry.flags.alpha = 0; + return eim; + } + + eim = (SDL_Engine_Image_Entry *) evas_cache_engine_image_dirty(&eim->cache_entry, 0, 0, eim->cache_entry.w, eim->cache_entry.h); + + /* FIXME: update SDL_Surface flags */ + im->cache_entry.flags.alpha = has_alpha ? 1 : 0; + return eim; +} + +static void* +evas_engine_sdl_image_border_set(void *data, void *image, int l, int r, int t, int b) +{ + return image; +} + +static void +evas_engine_sdl_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b) +{ + /* FIXME: need to know what evas expect from this call */ +} + +static void +evas_engine_sdl_image_draw(void *data, void *context, void *surface, void *image, + int src_region_x, int src_region_y, int src_region_w, int src_region_h, + int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h, + int smooth) +{ + SDL_Engine_Image_Entry *eim = image; + SDL_Engine_Image_Entry *dst = surface; + RGBA_Draw_Context *dc = (RGBA_Draw_Context*) context; + int mustlock_im = 0; + int mustlock_dst = 0; + + (void) data; + + if (eim->cache_entry.src->space == EVAS_COLORSPACE_ARGB8888) + evas_cache_engine_image_load_data(&eim->cache_entry); + + /* Fallback to software method */ + if (SDL_MUSTLOCK(dst->surface)) + { + mustlock_dst = 1; + SDL_LockSurface(dst->surface); + _SDL_UPDATE_PIXELS(dst); + } + + if (eim->surface && SDL_MUSTLOCK(eim->surface)) + { + mustlock_im = 1; + SDL_LockSurface(eim->surface); + _SDL_UPDATE_PIXELS(eim); + } + + evas_common_image_colorspace_normalize((RGBA_Image *) eim->cache_entry.src); + + if (smooth) + evas_common_scale_rgba_in_to_out_clip_smooth((RGBA_Image *) eim->cache_entry.src, + (RGBA_Image *) dst->cache_entry.src, + dc, + src_region_x, src_region_y, src_region_w, src_region_h, + dst_region_x, dst_region_y, dst_region_w, dst_region_h); + else + evas_common_scale_rgba_in_to_out_clip_sample((RGBA_Image *) eim->cache_entry.src, + (RGBA_Image *) dst->cache_entry.src, + dc, + src_region_x, src_region_y, src_region_w, src_region_h, + dst_region_x, dst_region_y, dst_region_w, dst_region_h); + evas_common_cpu_end_opt (); + + if (mustlock_im) + SDL_UnlockSurface(eim->surface); + + if (mustlock_dst) + SDL_UnlockSurface(dst->surface); +} + +static void +evas_engine_sdl_image_cache_flush(void *data) +{ + Render_Engine *re = (Render_Engine*) data; + int size; + + size = evas_cache_engine_image_get(re->cache); + evas_cache_engine_image_set(re->cache, 0); + evas_cache_engine_image_set(re->cache, size); +} + +static void +evas_engine_sdl_image_cache_set(void *data, int bytes) +{ + Render_Engine *re = (Render_Engine*) data; + + evas_cache_engine_image_set(re->cache, bytes); +} + +static int +evas_engine_sdl_image_cache_get(void *data) +{ + Render_Engine *re = (Render_Engine*) data; + + return evas_cache_engine_image_get(re->cache); +} + +static char* +evas_engine_sdl_image_comment_get(void *data, void *image, char *key) +{ + SDL_Engine_Image_Entry *eim = image; + RGBA_Image *im; + + if (!eim) return NULL; + im = (RGBA_Image *) eim->cache_entry.src; + + return im->info.comment; +} + +static char* +evas_engine_sdl_image_format_get(void *data, void *image) +{ + /* FIXME: need to know what evas expect from this call */ + return NULL; +} + +static void +evas_engine_sdl_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text) +{ + SDL_Engine_Image_Entry *eim = surface; + int mustlock_im = 0; + + if (eim->surface && SDL_MUSTLOCK(eim->surface)) + { + mustlock_im = 1; + SDL_LockSurface(eim->surface); + _SDL_UPDATE_PIXELS(eim); + } + + evas_common_font_draw((RGBA_Image *) eim->cache_entry.src, context, font, x, y, text); + evas_common_cpu_end_opt(); + + if (mustlock_im) + SDL_UnlockSurface(eim->surface); +} + +static void +evas_engine_sdl_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2) +{ + SDL_Engine_Image_Entry *eim = surface; + int mustlock_im = 0; + + if (eim->surface && SDL_MUSTLOCK(eim->surface)) + { + mustlock_im = 1; + SDL_LockSurface(eim->surface); + _SDL_UPDATE_PIXELS(eim); + } + + evas_common_line_draw((RGBA_Image *) eim->cache_entry.src, context, x1, y1, x2, y2); + evas_common_cpu_end_opt(); + + if (mustlock_im) + SDL_UnlockSurface(eim->surface); +} + +static void +evas_engine_sdl_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h) +{ + SDL_Engine_Image_Entry *eim = surface; +#if ENGINE_SDL_PRIMITIVE + RGBA_Draw_Context *dc = context; +#endif + int mustlock_im = 0; + +#if ENGINE_SDL_PRIMITIVE + if (A_VAL(&dc->col.col) != 0x00) + { + if (A_VAL(&dc->col.col) != 0xFF) + { +#endif + if (eim->surface && SDL_MUSTLOCK(eim->surface)) + { + mustlock_im = 1; + SDL_LockSurface(eim->surface); + _SDL_UPDATE_PIXELS(eim); + } + + evas_common_rectangle_draw((RGBA_Image *) eim->cache_entry.src, context, x, y, w, h); + evas_common_cpu_end_opt(); + + if (mustlock_im) + SDL_UnlockSurface(eim->surface); +#if ENGINE_SDL_PRIMITIVE + } + else + { + SDL_Rect dstrect; + + if (dc->clip.use) + { + SDL_Rect cliprect; + + cliprect.x = dc->clip.x; + cliprect.y = dc->clip.y; + cliprect.w = dc->clip.w; + cliprect.h = dc->clip.h; + + SDL_SetClipRect(eim->surface, &cliprect); + } + + dstrect.x = x; + dstrect.y = y; + dstrect.w = w; + dstrect.h = h; + + SDL_FillRect(eim->surface, &dstrect, SDL_MapRGBA(eim->surface->format, R_VAL(&dc->col.col), G_VAL(&dc->col.col), B_VAL(&dc->col.col), 0xFF)); + + if (dc->clip.use) + SDL_SetClipRect(eim->surface, NULL); + } + } +#endif +} + +static void +evas_engine_sdl_polygon_draw(void *data, void *context, void *surface, void *polygon) +{ + SDL_Engine_Image_Entry *eim = surface; + int mustlock_im = 0; + + if (eim->surface && SDL_MUSTLOCK(eim->surface)) + { + mustlock_im = 1; + SDL_LockSurface(eim->surface); + _SDL_UPDATE_PIXELS(eim); + } + + evas_common_polygon_draw((RGBA_Image *) eim->cache_entry.src, context, polygon); + evas_common_cpu_end_opt(); + + if (mustlock_im) + SDL_UnlockSurface(eim->surface); +} + +static void +evas_engine_sdl_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h) +{ + SDL_Engine_Image_Entry *eim = surface; + int mustlock_im = 0; + + if (eim->surface && SDL_MUSTLOCK(eim->surface)) + { + mustlock_im = 1; + SDL_LockSurface(eim->surface); + _SDL_UPDATE_PIXELS(eim); + } + + evas_common_gradient_draw((RGBA_Image *) eim->cache_entry.src, context, x, y, w, h, gradient); + evas_common_cpu_end_opt(); + + if (mustlock_im) + SDL_UnlockSurface(eim->surface); +} + +EAPI int module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ +#define ORD(f) EVAS_API_OVERRIDE(f, &func, evas_engine_sdl_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(output_flush); + ORD(output_idle_flush); + ORD(image_load); + ORD(image_new_from_data); + ORD(image_new_from_copied_data); + ORD(image_colorspace_set); + ORD(image_colorspace_get); + ORD(image_free); + ORD(image_size_set); + ORD(image_size_get); + ORD(image_dirty_region); + ORD(image_data_get); + ORD(image_data_put); + ORD(image_alpha_set); + ORD(image_alpha_get); + ORD(image_border_set); + ORD(image_border_get); + ORD(image_draw); + ORD(image_comment_get); + ORD(image_format_get); + ORD(image_cache_flush); + ORD(image_cache_set); + ORD(image_cache_get); + ORD(font_draw); + ORD(line_draw); + ORD(rectangle_draw); + ORD(polygon_draw); + ORD(gradient_draw); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "software_sdl", + "none" +}; + +/* Private routines. */ + +static void* +_sdl_output_setup (int w, int h, int fullscreen, int noframe, int alpha, int hwsurface) +{ + Render_Engine *re = calloc(1, sizeof(Render_Engine)); + SDL_Surface *surface; + + /* if we haven't initialized - init (automatic abort if already done) */ + evas_common_cpu_init(); + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + + if (w <= 0) w = 640; + if (h <= 0) h = 480; + + re->cache = evas_cache_engine_image_init(&_sdl_cache_engine_image_cb, evas_common_image_cache_get()); + if (!re->cache) + { + fprintf(stderr, "Evas_Cache_Engine_Image allocation failed!\n"); + exit(-1); + } + + re->tb = evas_common_tilebuf_new(w, h); + /* in preliminary tests 16x16 gave highest framerates */ + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + surface = SDL_SetVideoMode(w, h, 32, + (hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE) + | (fullscreen ? SDL_FULLSCREEN : 0) + | (noframe ? SDL_NOFRAME : 0) + | (alpha ? SDL_SRCALPHA : 0)); + + if (!surface) + { + fprintf(stderr, "SDL_SetVideoMode [ %i x %i x 32 ] failed.\n", w, h); + exit(-1); + } + + SDL_SetAlpha(surface, SDL_SRCALPHA | SDL_RLEACCEL, 0); + + /* We create a "fake" RGBA_Image which points to the SDL surface. Each access + * to that surface is wrapped in Lock / Unlock calls whenever the data is + * manipulated directly. */ + re->rgba_engine_image = (SDL_Engine_Image_Entry *) evas_cache_engine_image_engine(re->cache, surface); + if (!re->rgba_engine_image) + { + fprintf(stderr, "RGBA_Image allocation from SDL failed\n"); + exit(-1); + } + + SDL_FillRect(surface, NULL, 0); + + re->flags.alpha = alpha; + re->flags.hwsurface = hwsurface; + re->flags.fullscreen = fullscreen; + re->flags.noframe = noframe; + return re; +} + +static Engine_Image_Entry* +_sdl_image_alloc(void) +{ + SDL_Engine_Image_Entry *new; + + new = calloc(1, sizeof (SDL_Engine_Image_Entry)); + + return (Engine_Image_Entry *) new; +} + +static void +_sdl_image_delete(Engine_Image_Entry *eim) +{ + free(eim); +} + +static int +_sdl_image_constructor(Engine_Image_Entry *ie, void *data) +{ + SDL_Surface *sdl = NULL; + SDL_Engine_Image_Entry *eim = (SDL_Engine_Image_Entry *) ie; + RGBA_Image *im; + + im = (RGBA_Image *) ie->src; + + if (im) + { + evas_cache_image_load_data(&im->cache_entry); + + if (im->image.data) + { + /* FIXME: Take care of CSPACE */ + sdl = SDL_CreateRGBSurfaceFrom(im->image.data, + ie->w, ie->h, + 32, ie->w * 4, + RMASK, GMASK, BMASK, AMASK); + eim->surface = sdl; + eim->flags.engine_surface = 0; + } + } + + return 0; +} + +static void +_sdl_image_destructor(Engine_Image_Entry *eie) +{ + SDL_Engine_Image_Entry *seie = (SDL_Engine_Image_Entry *) eie; + + if (seie->surface && !seie->flags.engine_surface) + SDL_FreeSurface(seie->surface); + seie->surface = NULL; +} + +static int +_sdl_image_dirty(Engine_Image_Entry *dst, const Engine_Image_Entry *src) +{ + SDL_Engine_Image_Entry *eim = (SDL_Engine_Image_Entry *) dst; + SDL_Surface *sdl = NULL; + RGBA_Image *im; + + im = (RGBA_Image *) dst->src; + + /* FIXME: Take care of CSPACE */ + sdl = SDL_CreateRGBSurfaceFrom(im->image.data, + dst->w, dst->h, + 32, dst->w * 4, + 0xff0000, 0xff00, 0xff, 0xff000000); + eim->surface = sdl; + eim->flags.engine_surface = 0; + + return 0; +} + +static int +_sdl_image_update_data(Engine_Image_Entry *dst, void* engine_data) +{ + SDL_Engine_Image_Entry *eim = (SDL_Engine_Image_Entry *) dst; + SDL_Surface *sdl = NULL; + RGBA_Image *im; + + im = (RGBA_Image *) dst->src; + + if (engine_data) + { + sdl = engine_data; + + if (im) + { + im->image.data = sdl->pixels; + im->image.no_free = 1; + im->cache_entry.flags.alpha = 0; + dst->src->w = sdl->w; + dst->src->h = sdl->h; + } + dst->w = sdl->w; + dst->h = sdl->h; + } + else + { + /* FIXME: Take care of CSPACE */ + SDL_FreeSurface(eim->surface); + sdl = SDL_CreateRGBSurfaceFrom(im->image.data, + dst->w, dst->h, + 32, dst->w * 4, + RMASK, GMASK, BMASK, AMASK); + } + + eim->surface = sdl; + + return 0; +} + +static int +_sdl_image_size_set(Engine_Image_Entry *dst, const Engine_Image_Entry *src) +{ + SDL_Engine_Image_Entry *eim = (SDL_Engine_Image_Entry *) dst; + SDL_Surface *sdl; + RGBA_Image *im; + + im = (RGBA_Image *) dst->src; + + /* FIXME: handle im == NULL */ + sdl = SDL_CreateRGBSurfaceFrom(im->image.data, + dst->w, dst->h, + 32, dst->w * 4, + RMASK, GMASK, BMASK, AMASK); + + eim->surface = sdl; + + return 0; +} + +static void +_sdl_image_load(Engine_Image_Entry *eim, const Image_Entry *ie_im) +{ + SDL_Engine_Image_Entry *load = (SDL_Engine_Image_Entry *) eim; + SDL_Surface *sdl; + + if (!load->surface) + { + RGBA_Image *im; + + im = (RGBA_Image *) ie_im; + + sdl = SDL_CreateRGBSurfaceFrom(im->image.data, + eim->w, eim->h, + 32, eim->w * 4, + RMASK, GMASK, BMASK, AMASK); + load->surface = sdl; + } +} + +static int +_sdl_image_mem_size_get(Engine_Image_Entry *eim) +{ + SDL_Engine_Image_Entry *seie = (SDL_Engine_Image_Entry *) eim; + int size = 0; + + /* FIXME: Count surface size. */ + if (seie->surface) + size = sizeof (SDL_Surface) + sizeof (SDL_PixelFormat); + + return size; +} + +#ifdef DEBUG_SDL +static void +_sdl_image_debug(const char* context, Engine_Image_Entry* eie) +{ + SDL_Engine_Image_Entry *eim = (SDL_Engine_Image_Entry *) eie; + + printf ("*** %s image (%p) ***\n", context, eim); + if (eim) + { + printf ("* W: %i\n* H: %i\n* R: %i\n", eim->cache_entry.w, eim->cache_entry.h, eim->cache_entry.references); + if (eim->cache_entry.src) + printf ("* Pixels: %p\n* SDL Surface: %p\n",((RGBA_Image*) eim->cache_entry.src)->image.data, eim->surface); + if (eim->surface) + printf ("* Surface->pixels: %p\n", eim->surface->pixels); + printf ("* Key: %s\n", eim->cache_entry.cache_key); + printf ("* Reference: %i\n", eim->cache_entry.references); + } + printf ("*** ***\n"); +} +#endif diff --git a/src/modules/engines/software_sdl/evas_engine.h b/src/modules/engines/software_sdl/evas_engine.h new file mode 100644 index 0000000..1481139 --- /dev/null +++ b/src/modules/engines/software_sdl/evas_engine.h @@ -0,0 +1,46 @@ +#ifndef EVAS_ENGINE_SDL_H +#define EVAS_ENGINE_SDL_H + +#include "evas_common.h" +#include "evas_private.h" +#include "Evas_Engine_SDL.h" + +typedef struct _SDL_Engine_Image_Entry SDL_Engine_Image_Entry; +struct _SDL_Engine_Image_Entry +{ + Engine_Image_Entry cache_entry; + + SDL_Surface *surface; + + struct + { + unsigned int engine_surface : 1; + } flags; +}; + +typedef struct _Render_Engine Render_Engine; +struct _Render_Engine +{ + SDL_Engine_Image_Entry *rgba_engine_image; + + Tilebuf *tb; + Tilebuf_Rect *rects; + Evas_Object_List *cur_rect; + + Evas_Cache_Engine_Image *cache; + + SDL_Rect *update_rects; + int update_rects_count; + int update_rects_limit; + + struct + { + unsigned int fullscreen : 1; + unsigned int noframe : 1; + unsigned int alpha : 1; + unsigned int hwsurface : 1; + unsigned int end : 1; + } flags; +}; + +#endif diff --git a/src/modules/engines/software_win32_gdi/.cvsignore b/src/modules/engines/software_win32_gdi/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/software_win32_gdi/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/software_win32_gdi/Evas_Engine_Software_Win32_GDI.h b/src/modules/engines/software_win32_gdi/Evas_Engine_Software_Win32_GDI.h new file mode 100644 index 0000000..22129b2 --- /dev/null +++ b/src/modules/engines/software_win32_gdi/Evas_Engine_Software_Win32_GDI.h @@ -0,0 +1,28 @@ +#ifndef _EVAS_ENGINE_SOFTWARE_WIN32_GDI_H +#define _EVAS_ENGINE_SOFTWARE_WIN32_GDI_H + +typedef struct _Evas_Engine_Info_Software_Win32_GDI Evas_Engine_Info_Software_Win32_GDI; + +struct _Evas_Engine_Info_Software_Win32_GDI +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + /* engine specific data & parameters it needs to set up */ + struct { + HWND hwnd; +/* + Colormap colormap; +*/ + + int depth; + int rotation; + + } info; + /* engine specific function calls to query stuff about the destination */ + /* engine (what visual & colormap & depth to use, performance info etc. */ +}; +#endif + + diff --git a/src/modules/engines/software_win32_gdi/Makefile.am b/src/modules/engines/software_win32_gdi/Makefile.am new file mode 100644 index 0000000..86ba3d0 --- /dev/null +++ b/src/modules/engines/software_win32_gdi/Makefile.am @@ -0,0 +1,9 @@ +MAINTAINERCLEANFILES = Makefile.in + +EXTRA_DIST = \ +evas_engine.h \ +evas_engine.c \ +evas_outbuf.c \ +evas_win32_buffer.c \ +evas_win32_main.c \ +Evas_Engine_Software_Win32_GDI.h diff --git a/src/modules/engines/software_win32_gdi/evas_engine.c b/src/modules/engines/software_win32_gdi/evas_engine.c new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/engines/software_win32_gdi/evas_engine.h b/src/modules/engines/software_win32_gdi/evas_engine.h new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/engines/software_win32_gdi/evas_outbuf.c b/src/modules/engines/software_win32_gdi/evas_outbuf.c new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/engines/software_win32_gdi/evas_win32_buffer.c b/src/modules/engines/software_win32_gdi/evas_win32_buffer.c new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/engines/software_win32_gdi/evas_win32_main.c b/src/modules/engines/software_win32_gdi/evas_win32_main.c new file mode 100644 index 0000000..e69de29 diff --git a/src/modules/engines/software_x11/.cvsignore b/src/modules/engines/software_x11/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/software_x11/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/software_x11/Evas_Engine_Software_X11.h b/src/modules/engines/software_x11/Evas_Engine_Software_X11.h new file mode 100644 index 0000000..1f1df60 --- /dev/null +++ b/src/modules/engines/software_x11/Evas_Engine_Software_X11.h @@ -0,0 +1,43 @@ +#ifndef _EVAS_ENGINE_SOFTWARE_X11_H +#define _EVAS_ENGINE_SOFTWARE_X11_H + +#include + +typedef struct _Evas_Engine_Info_Software_X11 Evas_Engine_Info_Software_X11; + +struct _Evas_Engine_Info_Software_X11 +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + /* engine specific data & parameters it needs to set up */ + struct { + Display *display; + Drawable drawable; + Pixmap mask; + Visual *visual; + Colormap colormap; + int depth; + int rotation; + + int alloc_grayscale : 1; + int debug : 1; + int shape_dither : 1; + int destination_alpha : 1; + int track_mask_changes : 1; + + int alloc_colors_max; + } info; + /* engine specific function calls to query stuff about the destination */ + struct { + Visual * (*best_visual_get) (Display *disp, int screen); + Colormap (*best_colormap_get) (Display *disp, int screen); + int (*best_depth_get) (Display *disp, int screen); + } func; + + int mask_changed; +}; +#endif + + diff --git a/src/modules/engines/software_x11/Makefile.am b/src/modules/engines/software_x11/Makefile.am new file mode 100644 index 0000000..f6e96d8 --- /dev/null +++ b/src/modules/engines/software_x11/Makefile.am @@ -0,0 +1,42 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +@FREETYPE_CFLAGS@ \ +@x_cflags@ + +if BUILD_ENGINE_SOFTWARE_X11 + +pkgdir = $(libdir)/evas/modules/engines/software_x11/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = \ +evas_engine.h \ +evas_engine.c \ +evas_outbuf.c \ +evas_x_buffer.c \ +evas_x_color.c \ +evas_x_main.c + +module_la_LIBADD = @x_libs@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_Software_X11.h + +endif + +EXTRA_DIST = \ +evas_engine.h \ +evas_engine.c \ +evas_outbuf.c \ +evas_x_buffer.c \ +evas_x_color.c \ +evas_x_main.c \ +Evas_Engine_Software_X11.h diff --git a/src/modules/engines/software_x11/evas_engine.c b/src/modules/engines/software_x11/evas_engine.c new file mode 100644 index 0000000..7fc96f4 --- /dev/null +++ b/src/modules/engines/software_x11/evas_engine.c @@ -0,0 +1,382 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Software_X11.h" + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func, pfunc; + +/* engine struct data */ +typedef struct _Render_Engine Render_Engine; + +struct _Render_Engine +{ + Tilebuf *tb; + Outbuf *ob; + Tilebuf_Rect *rects; + Evas_Object_List *cur_rect; + int end : 1; +}; + +/* prototypes we will use here */ +static void *_output_setup(int w, int h, int rot, Display *disp, Drawable draw, Visual *vis, Colormap cmap, int depth, int debug, int grayscale, int max_colors, Pixmap mask, int shape_dither, int destination_alpha); +static Visual *_best_visual_get(Display *disp, int screen); +static Colormap _best_colormap_get(Display *disp, int screen); +static int _best_depth_get(Display *disp, int screen); + +static void *eng_info(Evas *e); +static void eng_info_free(Evas *e, void *info); +static void eng_setup(Evas *e, void *info); +static void eng_output_free(void *data); +static void eng_output_resize(void *data, int w, int h); +static void eng_output_tile_size_set(void *data, int w, int h); +static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h); +static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h); +static void eng_output_redraws_clear(void *data); +static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch); +static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h); +static void eng_output_flush(void *data); +static void eng_output_idle_flush(void *data); + +/* internal engine routines */ +static void * +_output_setup(int w, int h, int rot, Display *disp, Drawable draw, Visual *vis, Colormap cmap, int depth, int debug, int grayscale, int max_colors, Pixmap mask, int shape_dither, int destination_alpha) +{ + Render_Engine *re; + + re = calloc(1, sizeof(Render_Engine)); + /* if we haven't initialized - init (automatic abort if already done) */ + evas_common_cpu_init(); + + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + + evas_software_x11_x_init(); + evas_software_x11_x_color_init(); + evas_software_x11_outbuf_init(); + + re->ob = evas_software_x11_outbuf_setup_x(w, h, rot, OUTBUF_DEPTH_INHERIT, + disp, draw, vis, cmap, depth, + grayscale, max_colors, mask, + shape_dither, destination_alpha); + if (!re->ob) + { + free(re); + return NULL; + } + + /* for updates return 1 big buffer, but only use portions of it, also cache + it and keepit around until an idle_flush */ + /* disable for now - i am hunting down why some expedite tests are slower, + * as well as shaped stuff is broken and probable non-32bpp is broken as + * convert funcs dont do the right thing + * + re->ob->onebuf = 1; + */ + + evas_software_x11_outbuf_debug_set(re->ob, debug); + re->tb = evas_common_tilebuf_new(w, h); + if (!re->tb) + { + evas_software_x11_outbuf_free(re->ob); + free(re); + return NULL; + } + /* in preliminary tests 16x16 gave highest framerates */ + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + return re; +} + +static Visual * +_best_visual_get(Display *disp, int screen) +{ + if (!disp) return NULL; + return DefaultVisual(disp, screen); +} + +static Colormap +_best_colormap_get(Display *disp, int screen) +{ + if (!disp) return 0; + return DefaultColormap(disp, screen); +} + +static int +_best_depth_get(Display *disp, int screen) +{ + if (!disp) return 0; + return DefaultDepth(disp, screen); +} + +/* engine api this module provides */ +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_Software_X11 *info; + + info = calloc(1, sizeof(Evas_Engine_Info_Software_X11)); + if (!info) return NULL; + info->magic.magic = rand(); + info->info.debug = 0; + info->info.alloc_grayscale = 0; + info->info.alloc_colors_max = 216; + info->func.best_visual_get = _best_visual_get; + info->func.best_colormap_get = _best_colormap_get; + info->func.best_depth_get = _best_depth_get; + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_Software_X11 *in; + + in = (Evas_Engine_Info_Software_X11 *)info; + free(in); +} + +static void +eng_setup(Evas *e, void *in) +{ + Render_Engine *re; + Evas_Engine_Info_Software_X11 *info; + + info = (Evas_Engine_Info_Software_X11 *)in; + if (!e->engine.data.output) + e->engine.data.output = + _output_setup(e->output.w, + e->output.h, + info->info.rotation, + info->info.display, + info->info.drawable, + info->info.visual, + info->info.colormap, + info->info.depth, + info->info.debug, + info->info.alloc_grayscale, + info->info.alloc_colors_max, + info->info.mask, + info->info.shape_dither, + info->info.destination_alpha); + else + { + int ponebuf = 0; + + re = e->engine.data.output; + ponebuf = re->ob->onebuf; + evas_software_x11_outbuf_free(re->ob); + re->ob = evas_software_x11_outbuf_setup_x(e->output.w, + e->output.h, + info->info.rotation, + OUTBUF_DEPTH_INHERIT, + info->info.display, + info->info.drawable, + info->info.visual, + info->info.colormap, + info->info.depth, + info->info.alloc_grayscale, + info->info.alloc_colors_max, + info->info.mask, + info->info.shape_dither, + info->info.destination_alpha); + evas_software_x11_outbuf_debug_set(re->ob, info->info.debug); + re->ob->onebuf = ponebuf; + } + if (!e->engine.data.output) return; + if (!e->engine.data.context) + e->engine.data.context = + e->engine.func->context_new(e->engine.data.output); + + re = e->engine.data.output; + evas_software_x11_outbuf_drawable_set(re->ob, info->info.drawable); + evas_software_x11_outbuf_mask_set(re->ob, info->info.mask); + evas_software_x11_outbuf_rotation_set(re->ob, info->info.rotation); +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + if (!data) return; + + re = (Render_Engine *)data; + evas_software_x11_outbuf_free(re->ob); + evas_common_tilebuf_free(re->tb); + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + free(re); + + evas_common_font_shutdown(); + evas_common_image_shutdown(); +} + +static void +eng_output_resize(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_software_x11_outbuf_reconfigure(re->ob, w, h, + evas_software_x11_outbuf_get_rot(re->ob), + OUTBUF_DEPTH_INHERIT); + evas_common_tilebuf_free(re->tb); + re->tb = evas_common_tilebuf_new(w, h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); +} + +static void +eng_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_set_tile_size(re->tb, w, h); +} + +static void +eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_clear(re->tb); +} + +static void * +eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + RGBA_Image *surface; + Tilebuf_Rect *rect; + int ux, uy, uw, uh; + + re = (Render_Engine *)data; + if (re->end) + { + re->end = 0; + return NULL; + } + if (!re->rects) + { + re->rects = evas_common_tilebuf_get_render_rects(re->tb); + re->cur_rect = (Evas_Object_List *)re->rects; + } + if (!re->cur_rect) return NULL; + rect = (Tilebuf_Rect *)re->cur_rect; + ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h; + re->cur_rect = re->cur_rect->next; + if (!re->cur_rect) + { + evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + re->end = 1; + } + + surface = evas_software_x11_outbuf_new_region_for_update + (re->ob, ux, uy, uw, uh, cx, cy, cw, ch); + *x = ux; *y = uy; *w = uw; *h = uh; + return surface; +} + +static void +eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_pipe_begin(surface); + evas_common_pipe_flush(surface); + evas_software_x11_outbuf_push_updated_region(re->ob, surface, x, y, w, h); + evas_software_x11_outbuf_free_region_for_update(re->ob, surface); + evas_common_cpu_end_opt(); +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_software_x11_outbuf_flush(re->ob); +} + +static void +eng_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_software_x11_outbuf_idle_flush(re->ob); +} + + +/* module advertising code */ +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ +#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(output_flush); + ORD(output_idle_flush); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "software_x11", + "none" +}; diff --git a/src/modules/engines/software_x11/evas_engine.h b/src/modules/engines/software_x11/evas_engine.h new file mode 100644 index 0000000..ec49e97 --- /dev/null +++ b/src/modules/engines/software_x11/evas_engine.h @@ -0,0 +1,127 @@ +#ifndef EVAS_ENGINE_H +#define EVAS_ENGINE_H + +#include +#include +#include +#include +#include +#include + +typedef struct _Outbuf Outbuf; +typedef struct _Outbuf_Region Outbuf_Region; +typedef struct _X_Output_Buffer X_Output_Buffer; + +typedef enum _Outbuf_Depth Outbuf_Depth; + +enum _Outbuf_Depth +{ + OUTBUF_DEPTH_NONE, + OUTBUF_DEPTH_INHERIT, + OUTBUF_DEPTH_RGB_16BPP_565_565_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_555_555_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_444_444_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_565_444_DITHERED, + OUTBUF_DEPTH_RGB_32BPP_888_8888, + OUTBUF_DEPTH_LAST +}; + +struct _Outbuf +{ + Outbuf_Depth depth; + int w, h; + int rot; + int onebuf; + + struct { + Convert_Pal *pal; + struct { + Display *disp; + Window win; + Pixmap mask; + Visual *vis; + Colormap cmap; + int depth; + int shm; + GC gc; + GC gcm; + unsigned char swap : 1; + unsigned char bit_swap : 1; + } x; + struct { + DATA32 r, g, b; + } mask; + + /* 1 big buffer for updates - flush on idle_flush */ + RGBA_Image *onebuf; + Evas_List *onebuf_regions; + + /* a list of pending regions to write to the target */ + Evas_List *pending_writes; + /* a list of previous frame pending regions to write to the target */ + Evas_List *prev_pending_writes; + + unsigned char mask_dither : 1; + unsigned char destination_alpha : 1; + unsigned char debug : 1; + unsigned char synced : 1; + } priv; +}; + +struct _Outbuf_Region +{ + X_Output_Buffer *xob, *mxob; + int x, y, w, h; +}; + +struct _X_Output_Buffer +{ + Display *display; + XImage *xim; + XShmSegmentInfo *shm_info; + Visual *visual; + void *data; + int w, h, bpl; + int psize; +}; + +/****/ +void evas_software_x11_x_init (void); + +void evas_software_x11_x_write_mask_line (Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int w, int y); +int evas_software_x11_x_can_do_shm (Display *d); +X_Output_Buffer *evas_software_x11_x_output_buffer_new (Display *d, Visual *v, int depth, int w, int h, int try_shm, void *data); +void evas_software_x11_x_output_buffer_free (X_Output_Buffer *xob, int sync); +void evas_software_x11_x_output_buffer_paste (X_Output_Buffer *xob, Drawable d, GC gc, int x, int y, int sync); +DATA8 *evas_software_x11_x_output_buffer_data (X_Output_Buffer *xob, int *bytes_per_line_ret); +int evas_software_x11_x_output_buffer_depth (X_Output_Buffer *xob); +int evas_software_x11_x_output_buffer_byte_order (X_Output_Buffer *xob); +int evas_software_x11_x_output_buffer_bit_order (X_Output_Buffer *xob); + +void evas_software_x11_x_color_init (void); +Convert_Pal *evas_software_x11_x_color_allocate (Display *disp, Colormap cmap, Visual *vis, Convert_Pal_Mode colors); +void evas_software_x11_x_color_deallocate (Display *disp, Colormap cmap, Visual *vis, Convert_Pal *pal); + +void evas_software_x11_outbuf_init (void); +void evas_software_x11_outbuf_free (Outbuf *buf); + +Outbuf *evas_software_x11_outbuf_setup_x (int w, int h, int rot, Outbuf_Depth depth, Display *disp, Drawable draw, Visual *vis, Colormap cmap, int x_depth, int grayscale, int max_colors, Pixmap mask, int shape_dither, int destination_alpha); + +RGBA_Image *evas_software_x11_outbuf_new_region_for_update (Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch); +void evas_software_x11_outbuf_free_region_for_update (Outbuf *buf, RGBA_Image *update); +void evas_software_x11_outbuf_flush (Outbuf *buf); +void evas_software_x11_outbuf_idle_flush (Outbuf *buf); +void evas_software_x11_outbuf_push_updated_region (Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h); +void evas_software_x11_outbuf_reconfigure (Outbuf *buf, int w, int h, int rot, Outbuf_Depth depth); +int evas_software_x11_outbuf_get_width (Outbuf *buf); +int evas_software_x11_outbuf_get_height (Outbuf *buf); +Outbuf_Depth evas_software_x11_outbuf_get_depth (Outbuf *buf); +int evas_software_x11_outbuf_get_rot (Outbuf *buf); +void evas_software_x11_outbuf_drawable_set (Outbuf *buf, Drawable draw); +void evas_software_x11_outbuf_mask_set (Outbuf *buf, Pixmap mask); +void evas_software_x11_outbuf_rotation_set (Outbuf *buf, int rot); + +void evas_software_x11_outbuf_debug_set (Outbuf *buf, int debug); +void evas_software_x11_outbuf_debug_show (Outbuf *buf, Drawable draw, int x, int y, int w, int h); + +#endif diff --git a/src/modules/engines/software_x11/evas_outbuf.c b/src/modules/engines/software_x11/evas_outbuf.c new file mode 100644 index 0000000..1a3dc2e --- /dev/null +++ b/src/modules/engines/software_x11/evas_outbuf.c @@ -0,0 +1,982 @@ +#include "evas_common.h" +#include "evas_engine.h" +#include "evas_macros.h" +#include +#include + +static Evas_List *shmpool = NULL; +static int shmsize = 0; +static int shmmemlimit = 10 * 1024 * 1024; +static int shmcountlimit = 32; +static X_Output_Buffer * +_find_xob(Display *d, Visual *v, int depth, int w, int h, int shm, void *data) +{ + Evas_List *l, *xl; + X_Output_Buffer *xob = NULL; + int fitness = 0x7fffffff; + int sz, lbytes, bpp; + +// return evas_software_x11_x_output_buffer_new(d, v, depth, w, h, shm, data); + if (!shm) + return evas_software_x11_x_output_buffer_new(d, v, depth, w, h, shm, data); + if (depth > 1) + { + bpp = depth / 8; + if (bpp == 3) bpp = 4; + lbytes = (((w * bpp) + 3) / 4) * 4; + } + else + lbytes = ((w + 31) / 32) * 4; + sz = lbytes * h; + for (l = shmpool; l; l = l->next) + { + X_Output_Buffer *xob2; + int szdif; + + xob2 = l->data; + if ((xob2->xim->depth != depth) || (xob2->visual != v) || + (xob2->display != d)) + continue; + szdif = xob2->psize - sz; + if (szdif < 0) continue; + if (szdif == 0) + { + xob = xob2; + xl = l; + goto have_xob; + } + if (szdif < fitness) + { + fitness = szdif; + xob = xob2; + xl = l; + } + } + if ((fitness > (100 * 100)) || (!xob)) + return evas_software_x11_x_output_buffer_new(d, v, depth, w, h, shm, data); + + have_xob: + shmpool = evas_list_remove_list(shmpool, xl); + xob->w = w; + xob->h = h; + xob->bpl = lbytes; + xob->xim->width = xob->w; + xob->xim->height = xob->h; + xob->xim->bytes_per_line = xob->bpl; + shmsize -= xob->psize * (xob->xim->depth / 8); + return xob; +} + +static void +_unfind_xob(X_Output_Buffer *xob, int sync) +{ +// evas_software_x11_x_output_buffer_free(xob, sync); return; + if (xob->shm_info) + { + shmpool = evas_list_prepend(shmpool, xob); + shmsize += xob->psize * xob->xim->depth / 8; + while ((shmsize > (shmmemlimit)) || + (evas_list_count(shmpool) > shmcountlimit)) + { + Evas_List *xl; + + xl = evas_list_last(shmpool); + if (!xl) + { + shmsize = 0; + break; + } + xob = xl->data; + shmpool = evas_list_remove_list(shmpool, xl); + evas_software_x11_x_output_buffer_free(xob, sync); + } + } + else + evas_software_x11_x_output_buffer_free(xob, sync); +} + +static void +_clear_xob(int sync) +{ + while (shmpool) + { + X_Output_Buffer *xob; + + xob = shmpool->data; + shmpool = evas_list_remove_list(shmpool, shmpool); + evas_software_x11_x_output_buffer_free(xob, sync); + } + shmsize = 0; +} + +void +evas_software_x11_outbuf_init(void) +{ +} + +void +evas_software_x11_outbuf_free(Outbuf *buf) +{ + while (buf->priv.pending_writes) + { + RGBA_Image *im; + Outbuf_Region *obr; + + im = buf->priv.pending_writes->data; + buf->priv.pending_writes = evas_list_remove_list(buf->priv.pending_writes, buf->priv.pending_writes); + obr = im->extended_info; + evas_cache_image_drop(&im->cache_entry); + if (obr->xob) _unfind_xob(obr->xob, 0); + if (obr->mxob) _unfind_xob(obr->mxob, 0); + free(obr); + } + evas_software_x11_outbuf_idle_flush(buf); + evas_software_x11_outbuf_flush(buf); + if (buf->priv.x.gc) + XFreeGC(buf->priv.x.disp, buf->priv.x.gc); + if (buf->priv.x.gcm) + XFreeGC(buf->priv.x.disp, buf->priv.x.gcm); + if (buf->priv.pal) + evas_software_x11_x_color_deallocate(buf->priv.x.disp, buf->priv.x.cmap, + buf->priv.x.vis, buf->priv.pal); + free(buf); + _clear_xob(0); +} + +void +evas_software_x11_outbuf_rotation_set(Outbuf *buf, int rot) +{ + buf->rot = rot; +} + +Outbuf * +evas_software_x11_outbuf_setup_x(int w, int h, int rot, Outbuf_Depth depth, + Display *disp, Drawable draw, Visual *vis, + Colormap cmap, int x_depth, + int grayscale, int max_colors, Pixmap mask, + int shape_dither, int destination_alpha) +{ + Outbuf *buf; + + buf = calloc(1, sizeof(Outbuf)); + if (!buf) + return NULL; + + buf->w = w; + buf->h = h; + buf->depth = depth; + buf->rot = rot; + + buf->priv.x.disp = disp; + buf->priv.x.vis = vis; + buf->priv.x.cmap = cmap; + buf->priv.x.depth = x_depth; + + buf->priv.mask_dither = shape_dither; + buf->priv.destination_alpha = destination_alpha; + + { + Gfx_Func_Convert conv_func; + X_Output_Buffer *xob; + + buf->priv.x.shm = evas_software_x11_x_can_do_shm(buf->priv.x.disp); + xob = evas_software_x11_x_output_buffer_new(buf->priv.x.disp, + buf->priv.x.vis, + buf->priv.x.depth, + 1, 1, buf->priv.x.shm, NULL); + + conv_func = NULL; + if (xob) + { +#ifdef WORDS_BIGENDIAN + if (evas_software_x11_x_output_buffer_byte_order(xob) == LSBFirst) + buf->priv.x.swap = 1; + if (evas_software_x11_x_output_buffer_bit_order(xob) == MSBFirst) + buf->priv.x.bit_swap = 1; +#else + if (evas_software_x11_x_output_buffer_byte_order(xob) == MSBFirst) + buf->priv.x.swap = 1; + if (evas_software_x11_x_output_buffer_bit_order(xob) == MSBFirst) + buf->priv.x.bit_swap = 1; +#endif + if (((vis->class == TrueColor) || (vis->class == DirectColor)) && + (x_depth > 8)) + { + buf->priv.mask.r = (DATA32) vis->red_mask; + buf->priv.mask.g = (DATA32) vis->green_mask; + buf->priv.mask.b = (DATA32) vis->blue_mask; + if (buf->priv.x.swap) + { + SWAP32(buf->priv.mask.r); + SWAP32(buf->priv.mask.g); + SWAP32(buf->priv.mask.b); + } + } + else if ((vis->class == PseudoColor) || + (vis->class == StaticColor) || + (vis->class == GrayScale) || + (vis->class == StaticGray) || + (x_depth <= 8)) + { + Convert_Pal_Mode pm = PAL_MODE_RGB332; + + if ((vis->class == GrayScale) || (vis->class == StaticGray)) + grayscale = 1; + if (grayscale) + { + if (max_colors >= 256) + pm = PAL_MODE_GRAY256; + else if (max_colors >= 64) + pm = PAL_MODE_GRAY64; + else if (max_colors >= 16) + pm = PAL_MODE_GRAY16; + else if (max_colors >= 4) + pm = PAL_MODE_GRAY4; + else + pm = PAL_MODE_MONO; + } + else + { + if (max_colors >= 256) + pm = PAL_MODE_RGB332; + else if (max_colors >= 216) + pm = PAL_MODE_RGB666; + else if (max_colors >= 128) + pm = PAL_MODE_RGB232; + else if (max_colors >= 64) + pm = PAL_MODE_RGB222; + else if (max_colors >= 32) + pm = PAL_MODE_RGB221; + else if (max_colors >= 16) + pm = PAL_MODE_RGB121; + else if (max_colors >= 8) + pm = PAL_MODE_RGB111; + else if (max_colors >= 4) + pm = PAL_MODE_GRAY4; + else + pm = PAL_MODE_MONO; + } + /* FIXME: only alloc once per display+cmap */ + buf->priv.pal = evas_software_x11_x_color_allocate(disp, cmap, vis, + PAL_MODE_RGB666); + if (!buf->priv.pal) + { + free(buf); + return NULL; + } + } + if (buf->priv.pal) + { + if (buf->rot == 0 || buf->rot == 180) + conv_func = evas_common_convert_func_get(0, buf->w, buf->h, + evas_software_x11_x_output_buffer_depth + (xob), buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + buf->priv.pal->colors, + buf->rot); + else if (buf->rot == 90 || buf->rot == 270) + conv_func = evas_common_convert_func_get(0, buf->h, buf->w, + evas_software_x11_x_output_buffer_depth + (xob), buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + buf->priv.pal->colors, + buf->rot); + } + else + { + if (buf->rot == 0 || buf->rot == 180) + conv_func = evas_common_convert_func_get(0, buf->w, buf->h, + evas_software_x11_x_output_buffer_depth + (xob), buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, PAL_MODE_NONE, + buf->rot); + else if (buf->rot == 90 || buf->rot == 270) + conv_func = evas_common_convert_func_get(0, buf->h, buf->w, + evas_software_x11_x_output_buffer_depth + (xob), buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, PAL_MODE_NONE, + buf->rot); + } + evas_software_x11_x_output_buffer_free(xob, 1); + if (!conv_func) + { + printf(".[ Evas Error ].\n" + " {\n" + " At depth %i:\n" + " RGB format mask: %08x, %08x, %08x\n" + " Palette mode: %i\n" + " Not supported by compiled in converters!\n" + " }\n", + buf->priv.x.depth, + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, buf->priv.pal->colors); + } + } + evas_software_x11_outbuf_drawable_set(buf, draw); + evas_software_x11_outbuf_mask_set(buf, mask); + } + return buf; +} + +RGBA_Image * +evas_software_x11_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) +{ + RGBA_Image *im; + Outbuf_Region *obr; + int bpl = 0; + int use_shm = 1; + int alpha; + + if ((buf->onebuf) && (buf->priv.x.shm)) + { + Evas_Rectangle *rect; + + rect = malloc(sizeof(Evas_Rectangle)); + RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, buf->w, buf->h); + rect->x = x; + rect->y = y; + rect->w = w; + rect->h = h; + buf->priv.onebuf_regions = evas_list_append(buf->priv.onebuf_regions, rect); + if (buf->priv.onebuf) + { + *cx = x; + *cy = y; + *cw = w; + *ch = h; + if (!buf->priv.synced) + { + XSync(buf->priv.x.disp, False); + buf->priv.synced = 1; + } + if ((buf->priv.x.mask) || (buf->priv.destination_alpha)) + { + int yy; + + im = buf->priv.onebuf; + for (yy = y; yy < (y + h); yy++) + { + memset(im->image.data + (im->cache_entry.w * yy) + x, + 0, w * sizeof(DATA32)); + } + } + return buf->priv.onebuf; + } + obr = calloc(1, sizeof(Outbuf_Region)); + obr->x = 0; + obr->y = 0; + obr->w = buf->w; + obr->h = buf->h; + *cx = x; + *cy = y; + *cw = w; + *ch = h; + + alpha = ((buf->priv.x.mask) || (buf->priv.destination_alpha)); + + use_shm = buf->priv.x.shm; + if ((buf->rot == 0) && + (buf->priv.mask.r == 0xff0000) && + (buf->priv.mask.g == 0x00ff00) && + (buf->priv.mask.b == 0x0000ff)) + { + obr->xob = evas_software_x11_x_output_buffer_new(buf->priv.x.disp, + buf->priv.x.vis, + buf->priv.x.depth, + buf->w, buf->h, + use_shm, + NULL); + im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), + buf->w, buf->h, + (DATA32 *) evas_software_x11_x_output_buffer_data(obr->xob, &bpl), + alpha, EVAS_COLORSPACE_ARGB8888); + im->extended_info = obr; + if (buf->priv.x.mask) + obr->mxob = evas_software_x11_x_output_buffer_new(buf->priv.x.disp, + buf->priv.x.vis, + 1, + buf->w, buf->h, + use_shm, + NULL); + } + else + { + im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); + im->cache_entry.flags.alpha |= alpha ? 1 : 0; + evas_cache_image_surface_alloc(&im->cache_entry, buf->w, buf->h); + im->extended_info = obr; + if ((buf->rot == 0) || (buf->rot == 180)) + obr->xob = evas_software_x11_x_output_buffer_new(buf->priv.x.disp, + buf->priv.x.vis, + buf->priv.x.depth, + buf->w, buf->h, + use_shm, + NULL); + else if ((buf->rot == 90) || (buf->rot == 270)) + obr->xob = evas_software_x11_x_output_buffer_new(buf->priv.x.disp, + buf->priv.x.vis, + buf->priv.x.depth, + buf->h, buf->w, + use_shm, + NULL); + if (buf->priv.x.mask) + obr->mxob = evas_software_x11_x_output_buffer_new(buf->priv.x.disp, + buf->priv.x.vis, + 1, buf->w, buf->h, + use_shm, + NULL); + } + if (alpha) + /* FIXME: faster memset! */ + memset(im->image.data, 0, w * h * sizeof(DATA32)); + + buf->priv.onebuf = im; + return im; + } + + obr = calloc(1, sizeof(Outbuf_Region)); + obr->x = x; + obr->y = y; + obr->w = w; + obr->h = h; + *cx = 0; + *cy = 0; + *cw = w; + *ch = h; + + use_shm = buf->priv.x.shm; + /* FIXME: magic - i found if shm regions are smaller than 200x200 its + * faster to use ximages over unix sockets - trial and error + */ +// use_shm = 0; /* 630 -> 1006 fps */ +// if ((w * h) < (200 * 200)) use_shm = 0; /* 630 -> 962 fps */ + + alpha = ((buf->priv.x.mask) || (buf->priv.destination_alpha)); + + if ((buf->rot == 0) && + (buf->priv.mask.r == 0xff0000) && + (buf->priv.mask.g == 0x00ff00) && + (buf->priv.mask.b == 0x0000ff)) + { + obr->xob = _find_xob(buf->priv.x.disp, + buf->priv.x.vis, + buf->priv.x.depth, + w, h, + use_shm, + NULL); +/* obr->xob = evas_software_x11_x_output_buffer_new(buf->priv.x.disp, */ +/* buf->priv.x.vis, */ +/* buf->priv.x.depth, */ +/* w, h, */ +/* use_shm, */ +/* NULL); */ + im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), + w, h, + (DATA32 *) evas_software_x11_x_output_buffer_data(obr->xob, &bpl), + alpha, EVAS_COLORSPACE_ARGB8888); + im->extended_info = obr; + if (buf->priv.x.mask) + obr->mxob = _find_xob(buf->priv.x.disp, + buf->priv.x.vis, + 1, w, h, + use_shm, + NULL); +/* + obr->mxob = evas_software_x11_x_output_buffer_new(buf->priv.x.disp, + buf->priv.x.vis, + 1, w, h, + use_shm, + NULL); + */ + } + else + { + im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); + im->cache_entry.flags.alpha |= alpha ? 1 : 0; + evas_cache_image_surface_alloc(&im->cache_entry, w, h); + im->extended_info = obr; + if ((buf->rot == 0) || (buf->rot == 180)) + obr->xob = _find_xob(buf->priv.x.disp, + buf->priv.x.vis, + buf->priv.x.depth, + w, h, + use_shm, + NULL); +/* + obr->xob = evas_software_x11_x_output_buffer_new(buf->priv.x.disp, + buf->priv.x.vis, + buf->priv.x.depth, + w, h, + use_shm, + NULL); + */ + else if ((buf->rot == 90) || (buf->rot == 270)) + obr->xob = _find_xob(buf->priv.x.disp, + buf->priv.x.vis, + buf->priv.x.depth, + h, w, + use_shm, + NULL); +/* + obr->xob = evas_software_x11_x_output_buffer_new(buf->priv.x.disp, + buf->priv.x.vis, + buf->priv.x.depth, + h, w, + use_shm, + NULL); + */ + if (buf->priv.x.mask) + obr->mxob = _find_xob(buf->priv.x.disp, + buf->priv.x.vis, + 1, w, h, + use_shm, + NULL); +/* + obr->mxob = evas_software_x11_x_output_buffer_new(buf->priv.x.disp, + buf->priv.x.vis, + 1, w, h, + use_shm, + NULL); + */ + } + if ((buf->priv.x.mask) || (buf->priv.destination_alpha)) + /* FIXME: faster memset! */ + memset(im->image.data, 0, w * h * sizeof(DATA32)); + + buf->priv.pending_writes = evas_list_append(buf->priv.pending_writes, im); + return im; +} + +void +evas_software_x11_outbuf_free_region_for_update(Outbuf *buf, RGBA_Image *update) +{ + /* no need to do anything - they are cleaned up on flush */ +} + +void +evas_software_x11_outbuf_flush(Outbuf *buf) +{ + Evas_List *l; + + if ((buf->priv.onebuf) && (buf->priv.onebuf_regions)) + { + RGBA_Image *im; + Outbuf_Region *obr; + Region tmpr; + + im = buf->priv.onebuf; + obr = im->extended_info; + tmpr = XCreateRegion(); + while (buf->priv.onebuf_regions) + { + Evas_Rectangle *rect; + XRectangle xr; + + rect = buf->priv.onebuf_regions->data; + buf->priv.onebuf_regions = evas_list_remove_list(buf->priv.onebuf_regions, buf->priv.onebuf_regions); + xr.x = rect->x; + xr.y = rect->y; + xr.width = rect->w; + xr.height = rect->h; + XUnionRectWithRegion(&xr, tmpr, tmpr); + if (buf->priv.debug) + evas_software_x11_outbuf_debug_show(buf, buf->priv.x.win, + rect->x, rect->y, rect->w, rect->h); + free(rect); + } + XSetRegion(buf->priv.x.disp, buf->priv.x.gc, tmpr); + evas_software_x11_x_output_buffer_paste(obr->xob, buf->priv.x.win, + buf->priv.x.gc, + 0, 0, 0); + if (obr->mxob) + { + XSetRegion(buf->priv.x.disp, buf->priv.x.gcm, tmpr); + evas_software_x11_x_output_buffer_paste(obr->mxob, + buf->priv.x.mask, + buf->priv.x.gcm, + 0, 0, 0); + } + XDestroyRegion(tmpr); + buf->priv.synced = 0; + } + else + { +#if 1 + XSync(buf->priv.x.disp, False); + for (l = buf->priv.pending_writes; l; l = l->next) + { + RGBA_Image *im; + Outbuf_Region *obr; + + im = l->data; + obr = im->extended_info; + if (buf->priv.debug) + evas_software_x11_outbuf_debug_show(buf, buf->priv.x.win, + obr->x, obr->y, obr->w, obr->h); + evas_software_x11_x_output_buffer_paste(obr->xob, buf->priv.x.win, + buf->priv.x.gc, + obr->x, obr->y, 0); + if (obr->mxob) + evas_software_x11_x_output_buffer_paste(obr->mxob, + buf->priv.x.mask, + buf->priv.x.gcm, + obr->x, obr->y, 0); + } + while (buf->priv.prev_pending_writes) + { + RGBA_Image *im; + Outbuf_Region *obr; + + im = buf->priv.prev_pending_writes->data; + buf->priv.prev_pending_writes = + evas_list_remove_list(buf->priv.prev_pending_writes, + buf->priv.prev_pending_writes); + obr = im->extended_info; + evas_cache_image_drop(&im->cache_entry); + if (obr->xob) _unfind_xob(obr->xob, 0); + if (obr->mxob) _unfind_xob(obr->mxob, 0); +/* + if (obr->xob) evas_software_x11_x_output_buffer_free(obr->xob, 0); + if (obr->mxob) evas_software_x11_x_output_buffer_free(obr->mxob, 0); + */ + free(obr); + } + buf->priv.prev_pending_writes = buf->priv.pending_writes; + buf->priv.pending_writes = NULL; + XFlush(buf->priv.x.disp); +#else + /* XX async push - disable */ + /* + for (l = buf->priv.pending_writes; l; l = l->next) + { + RGBA_Image *im; + Outbuf_Region *obr; + + im = l->data; + obr = im->extended_info; + if (buf->priv.debug) + evas_software_x11_outbuf_debug_show(buf, buf->priv.x.win, + obr->x, obr->y, obr->w, obr->h); + evas_software_x11_x_output_buffer_paste(obr->xob, buf->priv.x.win, + buf->priv.x.gc, + obr->x, obr->y, 0); + if (obr->mxob) + evas_software_x11_x_output_buffer_paste(obr->mxob, + buf->priv.x.mask, + buf->priv.x.gcm, + obr->x, obr->y, 0); + } + */ + XSync(buf->priv.x.disp, False); + + while (buf->priv.pending_writes) + { + RGBA_Image *im; + Outbuf_Region *obr; + + im = evas_list_data(buf->priv.pending_writes); + buf->priv.pending_writes = evas_list_remove_list(buf->priv.pending_writes, buf->priv.pending_writes); + obr = im->extended_info; + evas_cache_image_drop(&im->cache_entry); + if (obr->xob) _unfind_xob(obr->xob, 0); + if (obr->mxob) _unfind_xob(obr->mxob, 0); +/* + if (obr->xob) evas_software_x11_x_output_buffer_free(obr->xob, 0); + if (obr->mxob) evas_software_x11_x_output_buffer_free(obr->mxob, 0); + */ + free(obr); + evas_cache_image_drop(&im->cache_entry); + } +#endif + } + evas_common_cpu_end_opt(); +} + +void +evas_software_x11_outbuf_idle_flush(Outbuf *buf) +{ + if (buf->priv.onebuf) + { + RGBA_Image *im; + Outbuf_Region *obr; + + im = buf->priv.onebuf; + buf->priv.onebuf = NULL; + obr = im->extended_info; + if (obr->xob) evas_software_x11_x_output_buffer_free(obr->xob, 0); + if (obr->mxob) evas_software_x11_x_output_buffer_free(obr->mxob, 0); + free(obr); + evas_cache_image_drop(&im->cache_entry); + } + else + { + if (buf->priv.prev_pending_writes) XSync(buf->priv.x.disp, False); + while (buf->priv.prev_pending_writes) + { + RGBA_Image *im; + Outbuf_Region *obr; + + im = buf->priv.prev_pending_writes->data; + buf->priv.prev_pending_writes = + evas_list_remove_list(buf->priv.prev_pending_writes, + buf->priv.prev_pending_writes); + obr = im->extended_info; + evas_cache_image_drop(&im->cache_entry); + if (obr->xob) _unfind_xob(obr->xob, 0); + if (obr->mxob) _unfind_xob(obr->mxob, 0); + free(obr); + } + _clear_xob(0); + } +} + +void +evas_software_x11_outbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h) +{ + Gfx_Func_Convert conv_func = NULL; + Outbuf_Region *obr; + DATA32 *src_data; + void *data; + int bpl = 0, yy; + + obr = update->extended_info; + if (buf->priv.pal) + { + if ((buf->rot == 0) || (buf->rot == 180)) + conv_func = evas_common_convert_func_get(0, w, h, + evas_software_x11_x_output_buffer_depth + (obr->xob), buf->priv.mask.r, + buf->priv.mask.g, buf->priv.mask.b, + buf->priv.pal->colors, buf->rot); + else if ((buf->rot == 90) || (buf->rot == 270)) + conv_func = evas_common_convert_func_get(0, h, w, + evas_software_x11_x_output_buffer_depth + (obr->xob), buf->priv.mask.r, + buf->priv.mask.g, buf->priv.mask.b, + buf->priv.pal->colors, buf->rot); + } + else + { + if ((buf->rot == 0) || (buf->rot == 180)) + conv_func = evas_common_convert_func_get(0, w, h, + evas_software_x11_x_output_buffer_depth + (obr->xob), buf->priv.mask.r, + buf->priv.mask.g, buf->priv.mask.b, + PAL_MODE_NONE, buf->rot); + else if ((buf->rot == 90) || (buf->rot == 270)) + conv_func = evas_common_convert_func_get(0, h, w, + evas_software_x11_x_output_buffer_depth + (obr->xob), buf->priv.mask.r, + buf->priv.mask.g, buf->priv.mask.b, + PAL_MODE_NONE, buf->rot); + } + if (!conv_func) return; + + data = evas_software_x11_x_output_buffer_data(obr->xob, &bpl); + src_data = update->image.data; + if (buf->rot == 0) + { + obr->x = x; + obr->y = y; + } + else if (buf->rot == 90) + { + obr->x = y; + obr->y = buf->w - x - w; + } + else if (buf->rot == 180) + { + obr->x = buf->w - x - w; + obr->y = buf->h - y - h; + } + else if (buf->rot == 270) + { + obr->x = buf->h - y - h; + obr->y = x; + } + if ((buf->rot == 0) || (buf->rot == 180)) + { + obr->w = w; + obr->h = h; + } + else if ((buf->rot == 90) || (buf->rot == 270)) + { + obr->w = h; + obr->h = w; + } + if (buf->priv.pal) + { + if (data != src_data) + conv_func(src_data, data, + 0, + bpl / + ((evas_software_x11_x_output_buffer_depth(obr->xob) / + 8)) - obr->w, obr->w, obr->h, x, y, + buf->priv.pal->lookup); + } + else + { + if (data != src_data) + conv_func(src_data, data, + 0, + bpl / + ((evas_software_x11_x_output_buffer_depth(obr->xob) / + 8)) - obr->w, obr->w, obr->h, x, y, NULL); + } +#if 1 +#else + /* XX async push */ + if (!((buf->priv.onebuf) && (buf->priv.onebuf_regions))) + { + if (buf->priv.debug) + evas_software_x11_outbuf_debug_show(buf, buf->priv.x.win, + obr->x, obr->y, obr->w, obr->h); + evas_software_x11_x_output_buffer_paste(obr->xob, buf->priv.x.win, + buf->priv.x.gc, + obr->x, obr->y, 0); + } +#endif + if (obr->mxob) + { + for (yy = 0; yy < obr->h; yy++) + evas_software_x11_x_write_mask_line(buf, obr->mxob, + src_data + + (yy * obr->w), obr->w, yy); +#if 1 +#else + /* XX async push */ + if (!((buf->priv.onebuf) && (buf->priv.onebuf_regions))) + evas_software_x11_x_output_buffer_paste(obr->mxob, + buf->priv.x.mask, + buf->priv.x.gcm, + obr->x, obr->y, 0); +#endif + } +#if 1 +#else + XFlush(buf->priv.x.disp); +#endif +} + +void +evas_software_x11_outbuf_reconfigure(Outbuf * buf, int w, int h, int rot, + Outbuf_Depth depth) +{ + if ((w == buf->w) && + (h == buf->h) && + (rot == buf->rot) && + (depth == buf->depth)) return; + buf->w = w; + buf->h = h; + buf->rot = rot; + evas_software_x11_outbuf_idle_flush(buf); +} + +int +evas_software_x11_outbuf_get_width(Outbuf * buf) +{ + return buf->w; +} + +int +evas_software_x11_outbuf_get_height(Outbuf * buf) +{ + return buf->h; +} + +Outbuf_Depth +evas_software_x11_outbuf_get_depth(Outbuf * buf) +{ + return buf->depth; +} + +int +evas_software_x11_outbuf_get_rot(Outbuf * buf) +{ + return buf->rot; +} + +void +evas_software_x11_outbuf_drawable_set(Outbuf * buf, Drawable draw) +{ + XGCValues gcv; + + if (buf->priv.x.win == draw) return; + if (buf->priv.x.gc) + { + XFreeGC(buf->priv.x.disp, buf->priv.x.gc); + buf->priv.x.gc = NULL; + } + buf->priv.x.win = draw; + buf->priv.x.gc = XCreateGC(buf->priv.x.disp, buf->priv.x.win, 0, &gcv); +} + +void +evas_software_x11_outbuf_mask_set(Outbuf * buf, Pixmap mask) +{ + XGCValues gcv; + + if (buf->priv.x.mask == mask) return; + if (buf->priv.x.gcm) + { + XFreeGC(buf->priv.x.disp, buf->priv.x.gcm); + buf->priv.x.gcm = NULL; + } + buf->priv.x.mask = mask; + if (buf->priv.x.mask) + buf->priv.x.gcm = XCreateGC(buf->priv.x.disp, buf->priv.x.mask, 0, &gcv); +} + +void +evas_software_x11_outbuf_debug_set(Outbuf * buf, int debug) +{ + buf->priv.debug = debug; +} + +void +evas_software_x11_outbuf_debug_show(Outbuf * buf, Drawable draw, int x, int y, int w, + int h) +{ + int i; + int screen_num = 0; + + { + int wx, wy; + unsigned int ww, wh, bd, dp; + Window wdum, root; + XWindowAttributes wattr; + + XGetGeometry(buf->priv.x.disp, draw, &root, &wx, &wy, &ww, &wh, &bd, &dp); + XGetGeometry(buf->priv.x.disp, root, &wdum, &wx, &wy, &ww, &wh, &bd, &dp); + XGetWindowAttributes(buf->priv.x.disp, root, &wattr); + screen_num = XScreenNumberOfScreen(wattr.screen); + } + for (i = 0; i < 20; i++) + { +// XImage *xim; + + XSetForeground(buf->priv.x.disp, buf->priv.x.gc, + BlackPixel(buf->priv.x.disp, screen_num)); + XFillRectangle(buf->priv.x.disp, draw, buf->priv.x.gc, x, y, w, h); + XSync(buf->priv.x.disp, False); +// xim = +// XGetImage(buf->priv.x.disp, draw, x, y, w, h, 0xffffffff, ZPixmap); +// if (xim) +// XDestroyImage(xim); + XSync(buf->priv.x.disp, False); + XSetForeground(buf->priv.x.disp, buf->priv.x.gc, + WhitePixel(buf->priv.x.disp, screen_num)); + XFillRectangle(buf->priv.x.disp, draw, buf->priv.x.gc, x, y, w, h); + XSync(buf->priv.x.disp, False); +// xim = +// XGetImage(buf->priv.x.disp, draw, x, y, w, h, 0xffffffff, ZPixmap); +// if (xim) +// XDestroyImage(xim); + XSync(buf->priv.x.disp, False); + } +} diff --git a/src/modules/engines/software_x11/evas_x_buffer.c b/src/modules/engines/software_x11/evas_x_buffer.c new file mode 100644 index 0000000..3597469 --- /dev/null +++ b/src/modules/engines/software_x11/evas_x_buffer.c @@ -0,0 +1,255 @@ +#include "evas_common.h" +#include "evas_engine.h" + +static int _x_err = 0; + +void +evas_software_x11_x_write_mask_line(Outbuf *buf, X_Output_Buffer *xob, DATA32 *src, int w, int y) +{ + int x; + DATA32 *src_ptr; + DATA8 *dst_ptr; + int bpl = 0; + + src_ptr = src; + dst_ptr = evas_software_x11_x_output_buffer_data(xob, &bpl); + dst_ptr = dst_ptr + (bpl * y); + w -= 7; + if (buf->priv.x.bit_swap) + { + for (x = 0; x < w; x += 8) + { + *dst_ptr = + ((A_VAL(&(src_ptr[0])) >> 7) << 7) | + ((A_VAL(&(src_ptr[1])) >> 7) << 6) | + ((A_VAL(&(src_ptr[2])) >> 7) << 5) | + ((A_VAL(&(src_ptr[3])) >> 7) << 4) | + ((A_VAL(&(src_ptr[4])) >> 7) << 3) | + ((A_VAL(&(src_ptr[5])) >> 7) << 2) | + ((A_VAL(&(src_ptr[6])) >> 7) << 1) | + ((A_VAL(&(src_ptr[7])) >> 7) << 0); + src_ptr += 8; + dst_ptr++; + } + } + else + { + for (x = 0; x < w; x += 8) + { + *dst_ptr = + ((A_VAL(&(src_ptr[0])) >> 7) << 0) | + ((A_VAL(&(src_ptr[1])) >> 7) << 1) | + ((A_VAL(&(src_ptr[2])) >> 7) << 2) | + ((A_VAL(&(src_ptr[3])) >> 7) << 3) | + ((A_VAL(&(src_ptr[4])) >> 7) << 4) | + ((A_VAL(&(src_ptr[5])) >> 7) << 5) | + ((A_VAL(&(src_ptr[6])) >> 7) << 6) | + ((A_VAL(&(src_ptr[7])) >> 7) << 7); + src_ptr += 8; + dst_ptr++; + } + } + w += 7; + for (; x < w; x ++) + { + XPutPixel(xob->xim, x, y, A_VAL(src_ptr) >> 7); + src_ptr++; + } +} + +int +evas_software_x11_x_can_do_shm(Display *d) +{ + static Display *cached_d = NULL; + static int cached_result = 0; + + if (d == cached_d) return cached_result; + cached_d = d; + if (XShmQueryExtension(d)) + { + X_Output_Buffer *xob; + + xob = evas_software_x11_x_output_buffer_new + (d, DefaultVisual(d, DefaultScreen(d)), + DefaultDepth(d, DefaultScreen(d)), 16, 16, 2, NULL); + if (!xob) + { + cached_result = 0; + return 0; + } + evas_software_x11_x_output_buffer_free(xob, 1); + cached_result = 1; + return 1; + } + cached_result = 0; + return 0; +} + +static void +x_output_tmp_x_err(Display * d, XErrorEvent * ev) +{ + _x_err = 1; + return; +} + +//static int creates = 0; + +X_Output_Buffer * +evas_software_x11_x_output_buffer_new(Display *d, Visual *v, int depth, int w, int h, int try_shm, void *data) +{ + X_Output_Buffer *xob; + + xob = calloc(1, sizeof(X_Output_Buffer)); + if (!xob) return NULL; + + xob->display = d; + xob->visual = v; + xob->xim = NULL; + xob->shm_info = NULL; + xob->w = w; + xob->h = h; + + if (try_shm > 0) + { + xob->shm_info = malloc(sizeof(XShmSegmentInfo)); + if (xob->shm_info) + { + xob->xim = XShmCreateImage(d, v, depth, ZPixmap, NULL, + xob->shm_info, w, h); + if (xob->xim) + { + xob->shm_info->shmid = shmget(IPC_PRIVATE, + xob->xim->bytes_per_line * + xob->xim->height, + IPC_CREAT | 0777); + if (xob->shm_info->shmid >= 0) + { + xob->shm_info->readOnly = False; + xob->shm_info->shmaddr = xob->xim->data = + shmat(xob->shm_info->shmid, 0, 0); + if (xob->shm_info->shmaddr != NULL) + { + XErrorHandler ph; + + XSync(d, False); + _x_err = 0; + ph = XSetErrorHandler((XErrorHandler) + x_output_tmp_x_err); + XShmAttach(d, xob->shm_info); + XSync(d, False); + XSetErrorHandler((XErrorHandler)ph); + if (!_x_err) + { +// printf("SHM++ ID=%i -> %i bytes [%i creates]\n", +// xob->shm_info->shmid, +// xob->xim->bytes_per_line * xob->xim->height, +// creates); +// creates++; + xob->bpl = xob->xim->bytes_per_line; + xob->psize = xob->bpl * xob->h; + return xob; + } + } + shmdt(xob->shm_info->shmaddr); + shmctl(xob->shm_info->shmid, IPC_RMID, 0); + } + if (xob->xim) XDestroyImage(xob->xim); + xob->xim = NULL; + } + if (xob->shm_info) free(xob->shm_info); + xob->shm_info = NULL; + } + } + + if (try_shm > 1) return NULL; + + xob->xim = XCreateImage(d, v, depth, ZPixmap, 0, data, w, h, 32, 0); + if (!xob->xim) + { + free(xob); + return NULL; + } + + xob->data = data; + + if (!xob->xim->data) + { + xob->xim->data = malloc(xob->xim->bytes_per_line * xob->xim->height); + if (!xob->xim->data) + { + XDestroyImage(xob->xim); + free(xob); + return NULL; + } + } + xob->bpl = xob->xim->bytes_per_line; + xob->psize = xob->bpl * xob->h; + return xob; +} + +void +evas_software_x11_x_output_buffer_free(X_Output_Buffer *xob, int sync) +{ + if (xob->shm_info) + { +// printf("SHM-- ID=%i -> %i bytes, [sync=%i]\n", +// xob->shm_info->shmid, +// xob->xim->bytes_per_line * xob->xim->height, +// sync); + if (sync) XSync(xob->display, False); + XShmDetach(xob->display, xob->shm_info); + XDestroyImage(xob->xim); + shmdt(xob->shm_info->shmaddr); + shmctl(xob->shm_info->shmid, IPC_RMID, 0); + free(xob->shm_info); + } + else + { + if (xob->data) xob->xim->data = NULL; + XDestroyImage(xob->xim); + } + free(xob); +} + +void +evas_software_x11_x_output_buffer_paste(X_Output_Buffer *xob, Drawable d, GC gc, int x, int y, int sync) +{ + if (xob->shm_info) + { +// printf("shm\n"); + XShmPutImage(xob->display, d, gc, xob->xim, 0, 0, x, y, + xob->w, xob->h, False); + if (sync) XSync(xob->display, False); + } + else + { +// printf("NO! shm\n"); + XPutImage(xob->display, d, gc, xob->xim, 0, 0, x, y, + xob->w, xob->h); + } +} + +DATA8 * +evas_software_x11_x_output_buffer_data(X_Output_Buffer *xob, int *bytes_per_line_ret) +{ + if (bytes_per_line_ret) *bytes_per_line_ret = xob->xim->bytes_per_line; + return xob->xim->data; +} + +int +evas_software_x11_x_output_buffer_depth(X_Output_Buffer *xob) +{ + return xob->xim->bits_per_pixel; +} + +int +evas_software_x11_x_output_buffer_byte_order(X_Output_Buffer *xob) +{ + return xob->xim->byte_order; +} + +int +evas_software_x11_x_output_buffer_bit_order(X_Output_Buffer *xob) +{ + return xob->xim->bitmap_bit_order; +} diff --git a/src/modules/engines/software_x11/evas_x_color.c b/src/modules/engines/software_x11/evas_x_color.c new file mode 100644 index 0000000..fdc748b --- /dev/null +++ b/src/modules/engines/software_x11/evas_x_color.c @@ -0,0 +1,362 @@ +#include "evas_common.h" +#include "evas_engine.h" + +#include +#include + +typedef struct _Convert_Pal_Priv Convert_Pal_Priv; + +struct _Convert_Pal_Priv +{ + Display *disp; + Colormap cmap; + Visual *vis; +}; + +typedef DATA8 * (*X_Func_Alloc_Colors) (Display *d, Colormap cmap, Visual *v); + +static X_Func_Alloc_Colors x_color_alloc[PAL_MODE_LAST + 1]; +static int x_color_count[PAL_MODE_LAST + 1]; +static Evas_List *palettes = NULL; + +static DATA8 * x_color_alloc_rgb(int nr, int ng, int nb, Display *d, Colormap cmap, Visual *v); +static DATA8 * x_color_alloc_gray(int ng, Display *d, Colormap cmap, Visual *v); + +static DATA8 * x_color_alloc_rgb_332(Display *d, Colormap cmap, Visual *v); +static DATA8 * x_color_alloc_rgb_666(Display *d, Colormap cmap, Visual *v); +static DATA8 * x_color_alloc_rgb_232(Display *d, Colormap cmap, Visual *v); +static DATA8 * x_color_alloc_rgb_222(Display *d, Colormap cmap, Visual *v); +static DATA8 * x_color_alloc_rgb_221(Display *d, Colormap cmap, Visual *v); +static DATA8 * x_color_alloc_rgb_121(Display *d, Colormap cmap, Visual *v); +static DATA8 * x_color_alloc_rgb_111(Display *d, Colormap cmap, Visual *v); +static DATA8 * x_color_alloc_gray_256(Display *d, Colormap cmap, Visual *v); +static DATA8 * x_color_alloc_gray_64(Display *d, Colormap cmap, Visual *v); +static DATA8 * x_color_alloc_gray_16(Display *d, Colormap cmap, Visual *v); +static DATA8 * x_color_alloc_gray_4(Display *d, Colormap cmap, Visual *v); +static DATA8 * x_color_alloc_mono(Display *d, Colormap cmap, Visual *v); + +static DATA8 * +x_color_alloc_rgb(int nr, int ng, int nb, Display *d, Colormap cmap, Visual *v) +{ + int r, g, b, i; + DATA8 *color_lut; + int sig_mask = 0, delt = 0; + + for (i = 0; i < v->bits_per_rgb; i++) sig_mask |= (0x1 << i); + sig_mask <<= (16 - v->bits_per_rgb); + i = 0; + color_lut = malloc((nr) * (ng) * (nb)); + if (!color_lut) return NULL; + delt = 0x0101 * 3; + for (r = 0; r < (nr); r++) + { + for (g = 0; g < (ng); g++) + { + for (b = 0; b < (nb); b++) + { + XColor xcl; + XColor xcl_in; + int val; + Status ret; + int dr, dg, db; + + val = (int)((((double)r) / ((nr) - 1)) * 255); + val = (val << 8) | val; + xcl.red = (unsigned short)(val); + val = (int)((((double)g) / ((ng) - 1)) * 255); + val = (val << 8) | val; + xcl.green = (unsigned short)(val); + val = (int)((((double)b) / ((nb) - 1)) * 255); + val = (val << 8) | val; + xcl.blue = (unsigned short)(val); + xcl_in = xcl; + ret = XAllocColor(d, cmap, &xcl); + dr = (int)xcl_in.red - (int)xcl.red; + if (dr < 0) dr = -dr; + dg = (int)xcl_in.green - (int)xcl.green; + if (dg < 0) dg = -dg; + db = (int)xcl_in.blue - (int)xcl.blue; + if (db < 0) db = -db; +/* + printf("ASK [%i]: %04x %04x %04x = %04x %04x %04x | dif = %04x / %04x\n", + ret, + xcl_in.red, xcl_in.green, xcl_in.blue, + xcl.red, xcl.green, xcl.blue, + (dr + dg +db), delt); + */ + if ((ret == 0) || + ((dr + dg + db) > delt) +/* + || + ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) || + ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) || + ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)) + */ + ) + { + unsigned long pixels[256]; + int j; + + if (i > 0) + { + for (j = 0; j < i; j++) + pixels[j] = (unsigned long) color_lut[j]; + XFreeColors(d, cmap, pixels, i, 0); + } + free(color_lut); + return NULL; + } + color_lut[i] = xcl.pixel; + i++; + } + } + } + return color_lut; +} + +static DATA8 * +x_color_alloc_gray(int ng, Display *d, Colormap cmap, Visual *v) +{ + int g, i; + DATA8 *color_lut; + int sig_mask = 0; + + for (i = 0; i < v->bits_per_rgb; i++) sig_mask |= (0x1 << i); + sig_mask <<= (16 - v->bits_per_rgb); + i = 0; + color_lut = malloc(ng); + if (!color_lut) return NULL; + for (g = 0; g < (ng); g++) + { + XColor xcl; + XColor xcl_in; + int val; + Status ret; + + val = (int)((((double)g) / ((ng) - 1)) * 255); + val = (val << 8) | val; + xcl.red = (unsigned short)(val); + xcl.green = (unsigned short)(val); + xcl.blue = (unsigned short)(val); + xcl_in = xcl; + ret = XAllocColor(d, cmap, &xcl); + if ((ret == 0) || + ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) || + ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) || + ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask))) + { + unsigned long pixels[256]; + int j; + + if (i > 0) + { + for (j = 0; j < i; j++) + pixels[j] = (unsigned long) color_lut[j]; + XFreeColors(d, cmap, pixels, i, 0); + } + free(color_lut); + return NULL; + } + color_lut[i] = xcl.pixel; + i++; + } + return color_lut; +} + +static DATA8 * +x_color_alloc_rgb_332(Display *d, Colormap cmap, Visual *v) +{ + return x_color_alloc_rgb(8, 8, 4, d, cmap, v); +} + +static DATA8 * +x_color_alloc_rgb_666(Display *d, Colormap cmap, Visual *v) +{ + return x_color_alloc_rgb(6, 6, 6, d, cmap, v); +} + +static DATA8 * +x_color_alloc_rgb_232(Display *d, Colormap cmap, Visual *v) +{ + return x_color_alloc_rgb(4, 8, 4, d, cmap, v); +} + +static DATA8 * +x_color_alloc_rgb_222(Display *d, Colormap cmap, Visual *v) +{ + return x_color_alloc_rgb(4, 4, 4, d, cmap, v); +} + +static DATA8 * +x_color_alloc_rgb_221(Display *d, Colormap cmap, Visual *v) +{ + return x_color_alloc_rgb(4, 4, 2, d, cmap, v); +} + +static DATA8 * +x_color_alloc_rgb_121(Display *d, Colormap cmap, Visual *v) +{ + return x_color_alloc_rgb(2, 4, 2, d, cmap, v); +} + +static DATA8 * +x_color_alloc_rgb_111(Display *d, Colormap cmap, Visual *v) +{ + return x_color_alloc_rgb(2, 2, 2, d, cmap, v); +} + +static DATA8 * +x_color_alloc_gray_256(Display *d, Colormap cmap, Visual *v) +{ + return x_color_alloc_gray(256, d, cmap, v); +} + +static DATA8 * +x_color_alloc_gray_64(Display *d, Colormap cmap, Visual *v) +{ + return x_color_alloc_gray(64, d, cmap, v); +} + +static DATA8 * +x_color_alloc_gray_16(Display *d, Colormap cmap, Visual *v) +{ + return x_color_alloc_gray(32, d, cmap, v); +} + +static DATA8 * +x_color_alloc_gray_4(Display *d, Colormap cmap, Visual *v) +{ + return x_color_alloc_gray(16, d, cmap, v); +} + +static DATA8 * +x_color_alloc_mono(Display *d, Colormap cmap, Visual *v) +{ + return x_color_alloc_gray(2, d, cmap, v); +} + +void +evas_software_x11_x_color_init(void) +{ + static int initialised = 0; + + if (initialised) return; + x_color_alloc[PAL_MODE_NONE] = NULL; + x_color_count[PAL_MODE_NONE] = 0; + + x_color_alloc[PAL_MODE_MONO] = x_color_alloc_mono; + x_color_count[PAL_MODE_MONO] = 2; + + x_color_alloc[PAL_MODE_GRAY4] = x_color_alloc_gray_4; + x_color_count[PAL_MODE_GRAY4] = 4; + + x_color_alloc[PAL_MODE_GRAY16] = x_color_alloc_gray_16; + x_color_count[PAL_MODE_GRAY16] = 16; + + x_color_alloc[PAL_MODE_GRAY64] = x_color_alloc_gray_64; + x_color_count[PAL_MODE_GRAY64] = 64; + + x_color_alloc[PAL_MODE_GRAY256] = x_color_alloc_gray_256; + x_color_count[PAL_MODE_GRAY256] = 256; + + x_color_alloc[PAL_MODE_RGB111] = x_color_alloc_rgb_111; + x_color_count[PAL_MODE_RGB111] = 2 * 2 * 2; + + x_color_alloc[PAL_MODE_RGB121] = x_color_alloc_rgb_121; + x_color_count[PAL_MODE_RGB121] = 2 * 4 * 2; + + x_color_alloc[PAL_MODE_RGB221] = x_color_alloc_rgb_221; + x_color_count[PAL_MODE_RGB221] = 4 * 4 * 2; + + x_color_alloc[PAL_MODE_RGB222] = x_color_alloc_rgb_222; + x_color_count[PAL_MODE_RGB222] = 4 * 4 * 4; + + x_color_alloc[PAL_MODE_RGB232] = x_color_alloc_rgb_232; + x_color_count[PAL_MODE_RGB232] = 4 * 8 * 4; + + x_color_alloc[PAL_MODE_RGB666] = x_color_alloc_rgb_666; + x_color_count[PAL_MODE_RGB666] = 6 * 6 * 6; + + x_color_alloc[PAL_MODE_RGB332] = x_color_alloc_rgb_332; + x_color_count[PAL_MODE_RGB332] = 8 * 8 * 4; + + x_color_alloc[PAL_MODE_LAST] = NULL; + x_color_count[PAL_MODE_LAST] = 0; + initialised = 1; +} + +Convert_Pal * +evas_software_x11_x_color_allocate(Display *disp, Colormap cmap, Visual *vis, Convert_Pal_Mode colors) +{ + Convert_Pal_Priv *palpriv; + Convert_Pal *pal; + Convert_Pal_Mode c; + Evas_List *l; + +/* printf("ALLOC cmap=%i vis=%p\n", cmap, vis);*/ + for (l = palettes; l; l = l->next) + { + pal = l->data; + palpriv = pal->data; + if ((disp == palpriv->disp) && + (vis == palpriv->vis) && + (cmap == palpriv->cmap)) + { + pal->references++; + return pal; + } + } + pal = calloc(1, sizeof(struct _Convert_Pal)); + if (!pal) return NULL; + for (c = colors; c > PAL_MODE_NONE; c--) + { + if (x_color_alloc[c]) + { +/* printf("TRY PAL %i\n", c);*/ + pal->lookup = (x_color_alloc[c])(disp, cmap, vis); + if (pal->lookup) break; + } + } + pal->references = 1; + pal->colors = c; + pal->count = x_color_count[c]; + palpriv = calloc(1, sizeof(Convert_Pal_Priv)); + pal->data = palpriv; + if (!palpriv) + { + if (pal->lookup) free(pal->lookup); + free(pal); + return NULL; + } + palpriv->disp = disp; + palpriv->vis = vis; + palpriv->cmap = cmap; + if (pal->colors == PAL_MODE_NONE) + { + if (pal->lookup) free(pal->lookup); + free(pal); + return NULL; + } + palettes = evas_list_append(palettes, pal); + return pal; +} + +void +evas_software_x11_x_color_deallocate(Display *disp, Colormap cmap, Visual *vis, Convert_Pal *pal) +{ + unsigned long pixels[256]; + int j; + + pal->references--; + if (pal->references > 0) return; + if (pal->lookup) + { + for(j = 0; j < pal->count; j++) + pixels[j] = (unsigned long) pal->lookup[j]; + XFreeColors(disp, cmap, pixels, pal->count, 0); + free(pal->lookup); + } + free(pal->data); + palettes = evas_list_remove(palettes, pal); + free(pal); +} diff --git a/src/modules/engines/software_x11/evas_x_main.c b/src/modules/engines/software_x11/evas_x_main.c new file mode 100644 index 0000000..e1ec13f --- /dev/null +++ b/src/modules/engines/software_x11/evas_x_main.c @@ -0,0 +1,10 @@ +#include "evas_common.h" +#include "evas_engine.h" + +#include +#include + +void +evas_software_x11_x_init(void) +{ +} diff --git a/src/modules/engines/software_xcb/.cvsignore b/src/modules/engines/software_xcb/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/software_xcb/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/software_xcb/Evas_Engine_Software_Xcb.h b/src/modules/engines/software_xcb/Evas_Engine_Software_Xcb.h new file mode 100644 index 0000000..80688a4 --- /dev/null +++ b/src/modules/engines/software_xcb/Evas_Engine_Software_Xcb.h @@ -0,0 +1,43 @@ +#ifndef _EVAS_ENGINE_SOFTWARE_XCB_H +#define _EVAS_ENGINE_SOFTWARE_XCB_H + +#include + +typedef struct _Evas_Engine_Info_Software_Xcb Evas_Engine_Info_Software_Xcb; + +struct _Evas_Engine_Info_Software_Xcb +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + /* engine specific data & parameters it needs to set up */ + struct { + xcb_connection_t *conn; + xcb_screen_t *screen; + xcb_drawable_t drawable; + xcb_drawable_t mask; + xcb_visualtype_t *visual; + xcb_colormap_t colormap; + int depth; + int rotation; + + int alloc_grayscale : 1; + int debug : 1; + int shape_dither : 1; + int destination_alpha : 1; + int track_mask_changes : 1; + + int alloc_colors_max; + } info; + /* engine specific function calls to query stuff about the destination */ + struct { + xcb_visualtype_t * (*best_visual_get) (xcb_screen_t *screen); + xcb_colormap_t (*best_colormap_get) (xcb_screen_t *screen); + int (*best_depth_get) (xcb_screen_t *screen); + } func; + + int mask_changed; +}; + +#endif /* _EVAS_ENGINE_SOFTWARE_XCB_H */ diff --git a/src/modules/engines/software_xcb/Makefile.am b/src/modules/engines/software_xcb/Makefile.am new file mode 100644 index 0000000..1b78bfa --- /dev/null +++ b/src/modules/engines/software_xcb/Makefile.am @@ -0,0 +1,42 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +@FREETYPE_CFLAGS@ \ +@XCB_CFLAGS@ + +if BUILD_ENGINE_SOFTWARE_XCB + +pkgdir = $(libdir)/evas/modules/engines/software_xcb/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = \ +evas_engine.h \ +evas_engine.c \ +evas_outbuf.c \ +evas_xcb_buffer.c \ +evas_xcb_color.c \ +evas_xcb_main.c + +module_la_LIBADD = @XCB_LIBS@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_Software_Xcb.h + +endif + +EXTRA_DIST = \ +evas_engine.h \ +evas_engine.c \ +evas_outbuf.c \ +evas_xcb_buffer.c \ +evas_xcb_color.c \ +evas_xcb_main.c \ +Evas_Engine_Software_Xcb.h diff --git a/src/modules/engines/software_xcb/evas_engine.c b/src/modules/engines/software_xcb/evas_engine.c new file mode 100644 index 0000000..a5ba8c5 --- /dev/null +++ b/src/modules/engines/software_xcb/evas_engine.c @@ -0,0 +1,428 @@ +#include +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_Software_Xcb.h" + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func, pfunc; + +/* engine struct data */ +typedef struct _Render_Engine Render_Engine; + +struct _Render_Engine +{ + Tilebuf *tb; + Outbuf *ob; + Tilebuf_Rect *rects; + Evas_Object_List *cur_rect; + int end : 1; +}; + +/* prototypes we will use here */ +static void *_output_setup(int w, int h, int rot, xcb_connection_t *conn, xcb_screen_t *screen, xcb_drawable_t draw, xcb_visualtype_t *vis, xcb_colormap_t cmap, int depth, int debug, int grayscale, int max_colors, xcb_drawable_t mask, int shape_dither, int destination_alpha); +static xcb_visualtype_t *_best_visual_get(xcb_screen_t *screen); +static xcb_colormap_t _best_colormap_get(xcb_screen_t *screen); +static int _best_depth_get(xcb_screen_t *screen); + +static void *eng_info(Evas *e); +static void eng_info_free(Evas *e, void *info); +static void eng_setup(Evas *e, void *info); +static void eng_output_free(void *data); +static void eng_output_resize(void *data, int w, int h); +static void eng_output_tile_size_set(void *data, int w, int h); +static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h); +static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h); +static void eng_output_redraws_clear(void *data); +static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch); +static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h); +static void eng_output_flush(void *data); +static void eng_output_idle_flush(void *data); + +static void * +_output_setup(int w, + int h, + int rot, + xcb_connection_t *conn, + xcb_screen_t *screen, + xcb_drawable_t draw, + xcb_visualtype_t *vis, + xcb_colormap_t cmap, + int depth, + int debug, + int grayscale, + int max_colors, + xcb_drawable_t mask, + int shape_dither, + int destination_alpha) +{ + Render_Engine *re; + + re = calloc(1, sizeof(Render_Engine)); + /* if we haven't initialized - init (automatic abort if already done) */ + evas_common_cpu_init(); + + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + + evas_software_xcb_x_init(); + evas_software_xcb_x_color_init(); + evas_software_xcb_outbuf_init(); + + re->ob = evas_software_xcb_outbuf_setup_x(w, h, rot, + OUTBUF_DEPTH_INHERIT, + conn, + screen, + draw, + vis, + cmap, + depth, + grayscale, + max_colors, + mask, + shape_dither, + destination_alpha); + if (!re->ob) + { + free(re); + return NULL; + } + + /* for updates return 1 big buffer, but only use portions of it, also cache + it and keepit around until an idle_flush */ + /* disable for now - i am hunting down why some expedite tests are slower, + * as well as shaped stuff is broken and probable non-32bpp is broken as + * convert funcs dont do the right thing + * + re->ob->onebuf = 1; + */ + + evas_software_xcb_outbuf_debug_set(re->ob, debug); + re->tb = evas_common_tilebuf_new(w, h); + if (!re->tb) + { + evas_software_xcb_outbuf_free(re->ob); + free(re); + return NULL; + } + /* in preliminary tests 16x16 gave highest framerates */ + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + return re; +} + +static xcb_visualtype_t * +_best_visual_get(xcb_screen_t *screen) +{ + xcb_depth_iterator_t iter_depth; + + if (!screen) return NULL; + + iter_depth = xcb_screen_allowed_depths_iterator(screen); + for (; iter_depth.rem; xcb_depth_next (&iter_depth)) + { + xcb_visualtype_iterator_t iter_vis; + + iter_vis = xcb_depth_visuals_iterator(iter_depth.data); + for (; iter_vis.rem; xcb_visualtype_next (&iter_vis)) + { + if (screen->root_visual == iter_vis.data->visual_id) + return iter_vis.data; + } + } + + return NULL; +} + +static xcb_colormap_t +_best_colormap_get(xcb_screen_t *screen) +{ + if (!screen) + return 0; + + return screen->default_colormap; +} + +static int +_best_depth_get(xcb_screen_t *screen) +{ + if (!screen) + return 0; + + return screen->root_depth; +} + +/* engine api this module provides */ +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_Software_Xcb *info; + + info = calloc(1, sizeof(Evas_Engine_Info_Software_Xcb)); + if (!info) return NULL; + info->magic.magic = rand(); + info->info.debug = 0; + info->info.alloc_grayscale = 0; + info->info.alloc_colors_max = 216; + info->func.best_visual_get = _best_visual_get; + info->func.best_colormap_get = _best_colormap_get; + info->func.best_depth_get = _best_depth_get; + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_Software_Xcb *in; + + in = (Evas_Engine_Info_Software_Xcb *)info; + free(in); +} + +static void +eng_setup(Evas *e, void *in) +{ + Render_Engine *re; + Evas_Engine_Info_Software_Xcb *info; + + info = (Evas_Engine_Info_Software_Xcb *)in; + if (!e->engine.data.output) + e->engine.data.output = + _output_setup(e->output.w, + e->output.h, + info->info.rotation, + info->info.conn, + info->info.screen, + info->info.drawable, + info->info.visual, + info->info.colormap, + info->info.depth, + info->info.debug, + info->info.alloc_grayscale, + info->info.alloc_colors_max, + info->info.mask, + info->info.shape_dither, + info->info.destination_alpha); + else + { + int ponebuf = 0; + + re = e->engine.data.output; + ponebuf = re->ob->onebuf; + evas_software_xcb_outbuf_free(re->ob); + re->ob = evas_software_xcb_outbuf_setup_x(e->output.w, + e->output.h, + info->info.rotation, + OUTBUF_DEPTH_INHERIT, + info->info.conn, + info->info.screen, + info->info.drawable, + info->info.visual, + info->info.colormap, + info->info.depth, + info->info.alloc_grayscale, + info->info.alloc_colors_max, + info->info.mask, + info->info.shape_dither, + info->info.destination_alpha); + evas_software_xcb_outbuf_debug_set(re->ob, info->info.debug); + re->ob->onebuf = ponebuf; + } + + if (!e->engine.data.output) return; + if (!e->engine.data.context) + e->engine.data.context = + e->engine.func->context_new(e->engine.data.output); + + re = e->engine.data.output; + evas_software_xcb_outbuf_drawable_set(re->ob, info->info.drawable); + evas_software_xcb_outbuf_mask_set(re->ob, info->info.mask); + evas_software_xcb_outbuf_rotation_set(re->ob, info->info.rotation); +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + if (!data) return; + + re = (Render_Engine *)data; + evas_software_xcb_outbuf_free(re->ob); + evas_common_tilebuf_free(re->tb); + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + free(re); + + evas_common_font_shutdown(); + evas_common_image_shutdown(); +} + +static void +eng_output_resize(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_software_xcb_outbuf_reconfigure(re->ob, w, h, + evas_software_xcb_outbuf_get_rot(re->ob), + OUTBUF_DEPTH_INHERIT); + evas_common_tilebuf_free(re->tb); + re->tb = evas_common_tilebuf_new(w, h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); +} + +static void +eng_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_set_tile_size(re->tb, w, h); +} + +static void +eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_clear(re->tb); +} + +static void * +eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + RGBA_Image *surface; + Tilebuf_Rect *rect; + int ux, uy, uw, uh; + + re = (Render_Engine *)data; + if (re->end) + { + re->end = 0; + return NULL; + } + if (!re->rects) + { + re->rects = evas_common_tilebuf_get_render_rects(re->tb); + re->cur_rect = (Evas_Object_List *)re->rects; + } + if (!re->cur_rect) return NULL; + rect = (Tilebuf_Rect *)re->cur_rect; + ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h; + re->cur_rect = re->cur_rect->next; + if (!re->cur_rect) + { + evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + re->end = 1; + } + + surface = evas_software_xcb_outbuf_new_region_for_update(re->ob, + ux, uy, uw, uh, + cx, cy, cw, ch); + *x = ux; *y = uy; *w = uw; *h = uh; + return surface; +} + +static void +eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_pipe_begin(surface); + evas_common_pipe_flush(surface); + evas_software_xcb_outbuf_push_updated_region(re->ob, surface, x, y, w, h); + evas_software_xcb_outbuf_free_region_for_update(re->ob, surface); + evas_common_cpu_end_opt(); +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_software_xcb_outbuf_flush(re->ob); +} + +static void +eng_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_software_xcb_outbuf_idle_flush(re->ob); +} + +/* module advertising code */ +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ +#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(output_flush); + ORD(output_idle_flush); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "software_xcb", + "none" +}; diff --git a/src/modules/engines/software_xcb/evas_engine.h b/src/modules/engines/software_xcb/evas_engine.h new file mode 100644 index 0000000..969c0e5 --- /dev/null +++ b/src/modules/engines/software_xcb/evas_engine.h @@ -0,0 +1,196 @@ +#ifndef EVAS_ENGINE_H +#define EVAS_ENGINE_H + +#include +#include + +#include +#include + +typedef struct _Outbuf Outbuf; +typedef struct _Outbuf_Region Outbuf_Region; +typedef struct _Xcb_Output_Buffer Xcb_Output_Buffer; + +typedef enum _Outbuf_Depth Outbuf_Depth; + +enum _Outbuf_Depth +{ + OUTBUF_DEPTH_NONE, + OUTBUF_DEPTH_INHERIT, + OUTBUF_DEPTH_RGB_16BPP_565_565_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_555_555_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_444_444_DITHERED, + OUTBUF_DEPTH_RGB_16BPP_565_444_DITHERED, + OUTBUF_DEPTH_RGB_32BPP_888_8888, + OUTBUF_DEPTH_LAST +}; + +struct _Outbuf +{ + Outbuf_Depth depth; + int w, h; + int rot; + int onebuf; + + struct { + Convert_Pal *pal; + struct { + xcb_connection_t *conn; + xcb_screen_t *screen; + xcb_drawable_t win; + xcb_drawable_t mask; + xcb_visualtype_t *vis; + xcb_colormap_t cmap; + int depth; + int shm; + xcb_gcontext_t gc; + xcb_gcontext_t gcm; + unsigned char swap : 1; + unsigned char bit_swap : 1; + } x; + struct { + DATA32 r, g, b; + } mask; + + /* 1 big buffer for updates - flush on idle_flush */ + RGBA_Image *onebuf; + Evas_List *onebuf_regions; + + /* a list of pending regions to write to the target */ + Evas_List *pending_writes; + /* a list of previous frame pending regions to write to the target */ + Evas_List *prev_pending_writes; + + unsigned char mask_dither : 1; + unsigned char destination_alpha : 1; + unsigned char debug : 1; + unsigned char synced : 1; + } priv; +}; + +struct _Outbuf_Region +{ + Xcb_Output_Buffer *xcbob; + Xcb_Output_Buffer *mxcbob; + int x; + int y; + int w; + int h; +}; + +struct _Xcb_Output_Buffer +{ + xcb_connection_t *connection; + xcb_image_t *image; + xcb_shm_segment_info_t *shm_info; + void *data; + int w; + int h; + int bpl; + int psize; +}; + + +/****/ +/* main */ +void evas_software_xcb_x_init (void); + +/* buffer */ +void evas_software_xcb_x_write_mask_line (Outbuf *buf, + Xcb_Output_Buffer *xcbob, + DATA32 *src, + int w, + int y); +int evas_software_xcb_x_can_do_shm (xcb_connection_t *c, + xcb_screen_t *screen); +Xcb_Output_Buffer *evas_software_xcb_x_output_buffer_new (xcb_connection_t *c, + int depth, + int w, + int h, + int try_shm, + void *data); +void evas_software_xcb_x_output_buffer_free (Xcb_Output_Buffer *xcbob, + int sync); +void evas_software_xcb_x_output_buffer_paste (Xcb_Output_Buffer *xcbob, + xcb_drawable_t d, + xcb_gcontext_t gc, + int x, + int y, + int sync); +DATA8 *evas_software_xcb_x_output_buffer_data (Xcb_Output_Buffer *xcbob, + int *bytes_per_line_ret); +int evas_software_xcb_x_output_buffer_depth (Xcb_Output_Buffer *xcbob); +int evas_software_xcb_x_output_buffer_byte_order(Xcb_Output_Buffer *xcbob); +int evas_software_xcb_x_output_buffer_bit_order (Xcb_Output_Buffer *xcbob); + + +/* color */ +void evas_software_xcb_x_color_init (void); +Convert_Pal *evas_software_xcb_x_color_allocate (xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *vis, + Convert_Pal_Mode colors); +void evas_software_xcb_x_color_deallocate (xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *vis, + Convert_Pal *pal); + +/* outbuf */ +void evas_software_xcb_outbuf_init (void); +void evas_software_xcb_outbuf_free (Outbuf *buf); +Outbuf *evas_software_xcb_outbuf_setup_x (int w, + int h, + int rot, + Outbuf_Depth depth, + xcb_connection_t *conn, + xcb_screen_t *screen, + xcb_drawable_t draw, + xcb_visualtype_t *vis, + xcb_colormap_t cmap, + int x_depth, + int grayscale, + int max_colors, + xcb_drawable_t mask, + int shape_dither, + int destination_alpha); +RGBA_Image *evas_software_xcb_outbuf_new_region_for_update (Outbuf *buf, + int x, + int y, + int w, + int h, + int *cx, + int *cy, + int *cw, + int *ch); +void evas_software_xcb_outbuf_free_region_for_update (Outbuf *buf, + RGBA_Image *update); +void evas_software_xcb_outbuf_flush (Outbuf *buf); +void evas_software_xcb_outbuf_idle_flush (Outbuf *buf); +void evas_software_xcb_outbuf_push_updated_region (Outbuf *buf, + RGBA_Image *update, + int x, + int y, + int w, + int h); +void evas_software_xcb_outbuf_reconfigure (Outbuf *buf, + int w, + int h, + int rot, + Outbuf_Depth depth); +int evas_software_xcb_outbuf_get_width (Outbuf *buf); +int evas_software_xcb_outbuf_get_height (Outbuf *buf); +Outbuf_Depth evas_software_xcb_outbuf_get_depth (Outbuf *buf); +int evas_software_xcb_outbuf_get_rot (Outbuf *buf); +void evas_software_xcb_outbuf_drawable_set (Outbuf *buf, xcb_drawable_t draw); +void evas_software_xcb_outbuf_mask_set (Outbuf *buf, xcb_drawable_t mask); +void evas_software_xcb_outbuf_rotation_set (Outbuf *buf, int rot); + +void evas_software_xcb_outbuf_debug_set (Outbuf *buf, int debug); +void evas_software_xcb_outbuf_debug_show (Outbuf *buf, + xcb_drawable_t draw, + int x, + int y, + int w, + int h); + +#endif /* EVAS_ENGINE_H */ diff --git a/src/modules/engines/software_xcb/evas_outbuf.c b/src/modules/engines/software_xcb/evas_outbuf.c new file mode 100644 index 0000000..ba2609e --- /dev/null +++ b/src/modules/engines/software_xcb/evas_outbuf.c @@ -0,0 +1,1052 @@ +#include "evas_common.h" +#include "evas_engine.h" +#include "evas_macros.h" +#include +#include +#include +#include +#include + + +static Evas_List *shmpool = NULL; +static int shmsize = 0; +static int shmmemlimit = 10 * 1024 * 1024; +static int shmcountlimit = 32; + +static Xcb_Output_Buffer * +_find_xcbob(xcb_connection_t *conn, int depth, int w, int h, int shm, void *data) +{ + Evas_List *l; + Evas_List *xl; + Xcb_Output_Buffer *xcbob = NULL; + int fitness = 0x7fffffff; + int sz; + int lbytes; + int bpp; + +// return evas_software_xcb_x_output_buffer_new(d, v, depth, w, h, shm, data); + if (!shm) + return evas_software_xcb_x_output_buffer_new(conn, depth, w, h, shm, data); + if (depth > 1) + { + bpp = depth / 8; + if (bpp == 3) bpp = 4; + lbytes = (((w * bpp) + 3) / 4) * 4; + } + else + lbytes = ((w + 31) / 32) * 4; + sz = lbytes * h; + for (l = shmpool; l; l = l->next) + { + Xcb_Output_Buffer *xcbob2; + int szdif; + + xcbob2 = l->data; + if ((xcbob2->image->depth != depth) || + (xcbob2->connection != conn)) + continue; + szdif = xcbob2->psize - sz; + if (szdif < 0) continue; + if (szdif == 0) + { + xcbob = xcbob2; + xl = l; + goto have_xcbob; + } + if (szdif < fitness) + { + fitness = szdif; + xcbob = xcbob2; + xl = l; + } + } + if ((fitness > (100 * 100)) || (!xcbob)) + return evas_software_xcb_x_output_buffer_new(conn, depth, w, h, shm, data); + + have_xcbob: + shmpool = evas_list_remove_list(shmpool, xl); + xcbob->w = w; + xcbob->h = h; + xcbob->bpl = lbytes; + xcbob->image->width = xcbob->w; + xcbob->image->height = xcbob->h; + xcbob->image->stride = xcbob->bpl; + shmsize -= xcbob->psize * (xcbob->image->depth / 8); + return xcbob; +} + +static void +_unfind_xcbob(Xcb_Output_Buffer *xcbob, int sync) +{ +// evas_software_xcb_x_output_buffer_free(xcbob, sync); return; + if (xcbob->shm_info) + { + shmpool = evas_list_prepend(shmpool, xcbob); + shmsize += xcbob->psize * xcbob->image->depth / 8; + while ((shmsize > (shmmemlimit)) || + (evas_list_count(shmpool) > shmcountlimit)) + { + Evas_List *xl; + + xl = evas_list_last(shmpool); + if (!xl) + { + shmsize = 0; + break; + } + xcbob = xl->data; + shmpool = evas_list_remove_list(shmpool, xl); + evas_software_xcb_x_output_buffer_free(xcbob, sync); + } + } + else + evas_software_xcb_x_output_buffer_free(xcbob, sync); +} + +static void +_clear_xcbob(int sync) +{ + while (shmpool) + { + Xcb_Output_Buffer *xcbob; + + xcbob = shmpool->data; + shmpool = evas_list_remove_list(shmpool, shmpool); + evas_software_xcb_x_output_buffer_free(xcbob, sync); + } + shmsize = 0; +} + +void +evas_software_xcb_outbuf_init(void) +{ +} + +void +evas_software_xcb_outbuf_free(Outbuf * buf) +{ + while (buf->priv.pending_writes) + { + RGBA_Image *im; + Outbuf_Region *obr; + + im = buf->priv.pending_writes->data; + buf->priv.pending_writes = evas_list_remove_list(buf->priv.pending_writes, buf->priv.pending_writes); + obr = im->extended_info; + evas_cache_image_drop(&im->cache_entry); + if (obr->xcbob) _unfind_xcbob(obr->xcbob, 0); + if (obr->mxcbob) _unfind_xcbob(obr->mxcbob, 0); + free(obr); + } + evas_software_xcb_outbuf_idle_flush(buf); + evas_software_xcb_outbuf_flush(buf); + if (buf->priv.x.gc) + xcb_free_gc(buf->priv.x.conn, buf->priv.x.gc); + if (buf->priv.x.gcm) + xcb_free_gc(buf->priv.x.conn, buf->priv.x.gcm); + if (buf->priv.pal) + evas_software_xcb_x_color_deallocate(buf->priv.x.conn, + buf->priv.x.cmap, + buf->priv.x.vis, + buf->priv.pal); + free(buf); + _clear_xcbob(0); +} + +void +evas_software_xcb_outbuf_rotation_set(Outbuf *buf, int rot) +{ + buf->rot = rot; +} + +Outbuf * +evas_software_xcb_outbuf_setup_x(int w, + int h, + int rot, + Outbuf_Depth depth, + xcb_connection_t *conn, + xcb_screen_t *screen, + xcb_drawable_t draw, + xcb_visualtype_t *vis, + xcb_colormap_t cmap, + int x_depth, + int grayscale, + int max_colors, + xcb_drawable_t mask, + int shape_dither, + int destination_alpha) +{ + Outbuf *buf; + + buf = calloc(1, sizeof(Outbuf)); + if (!buf) + return NULL; + + buf->w = w; + buf->h = h; + buf->depth = depth; + buf->rot = rot; + + buf->priv.x.conn = conn; + buf->priv.x.screen = screen; + buf->priv.x.vis = vis; + buf->priv.x.cmap = cmap; + buf->priv.x.depth = x_depth; + + buf->priv.mask_dither = shape_dither; + buf->priv.destination_alpha = destination_alpha; + + { + Gfx_Func_Convert conv_func; + Xcb_Output_Buffer *xcbob; + + buf->priv.x.shm = evas_software_xcb_x_can_do_shm(buf->priv.x.conn, buf->priv.x.screen); + xcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x.conn, + buf->priv.x.depth, + 1, 1, + buf->priv.x.shm, NULL); + + conv_func = NULL; + if (xcbob) + { +#ifdef WORDS_BIGENDIAN + if (evas_software_xcb_x_output_buffer_byte_order(xcbob) == XCB_IMAGE_ORDER_LSB_FIRST) + buf->priv.x.swap = 1; + if (evas_software_xcb_x_output_buffer_bit_order(xcbob) == XCB_IMAGE_ORDER_MSB_FIRST) + buf->priv.x.bit_swap = 1; +#else + if (evas_software_xcb_x_output_buffer_byte_order(xcbob) == XCB_IMAGE_ORDER_MSB_FIRST) + buf->priv.x.swap = 1; + if (evas_software_xcb_x_output_buffer_bit_order(xcbob) == XCB_IMAGE_ORDER_MSB_FIRST) + buf->priv.x.bit_swap = 1; +#endif + if (((vis->_class == XCB_VISUAL_CLASS_TRUE_COLOR) || + (vis->_class == XCB_VISUAL_CLASS_DIRECT_COLOR)) && + (x_depth > 8)) + + { + buf->priv.mask.r = (DATA32) vis->red_mask; + buf->priv.mask.g = (DATA32) vis->green_mask; + buf->priv.mask.b = (DATA32) vis->blue_mask; + if (buf->priv.x.swap) + { + SWAP32(buf->priv.mask.r); + SWAP32(buf->priv.mask.g); + SWAP32(buf->priv.mask.b); + } + } + else if ((vis->_class == XCB_VISUAL_CLASS_STATIC_GRAY) || + (vis->_class == XCB_VISUAL_CLASS_GRAY_SCALE) || + (vis->_class == XCB_VISUAL_CLASS_STATIC_COLOR) || + (vis->_class == XCB_VISUAL_CLASS_PSEUDO_COLOR) || + (x_depth <= 8)) + { + Convert_Pal_Mode pm = PAL_MODE_RGB332; + + if ((vis->_class == XCB_VISUAL_CLASS_GRAY_SCALE) || + (vis->_class == XCB_VISUAL_CLASS_STATIC_GRAY)) + grayscale = 1; + if (grayscale) + { + if (max_colors >= 256) + pm = PAL_MODE_GRAY256; + else if (max_colors >= 64) + pm = PAL_MODE_GRAY64; + else if (max_colors >= 16) + pm = PAL_MODE_GRAY16; + else if (max_colors >= 4) + pm = PAL_MODE_GRAY4; + else + pm = PAL_MODE_MONO; + } + else + { + if (max_colors >= 256) + pm = PAL_MODE_RGB332; + else if (max_colors >= 216) + pm = PAL_MODE_RGB666; + else if (max_colors >= 128) + pm = PAL_MODE_RGB232; + else if (max_colors >= 64) + pm = PAL_MODE_RGB222; + else if (max_colors >= 32) + pm = PAL_MODE_RGB221; + else if (max_colors >= 16) + pm = PAL_MODE_RGB121; + else if (max_colors >= 8) + pm = PAL_MODE_RGB111; + else if (max_colors >= 4) + pm = PAL_MODE_GRAY4; + else + pm = PAL_MODE_MONO; + } + /* FIXME: only alloc once per display+cmap */ + buf->priv.pal = + evas_software_xcb_x_color_allocate(conn, + cmap, + vis, + PAL_MODE_RGB666); + if (!buf->priv.pal) + { + free(buf); + return NULL; + } + } + if (buf->priv.pal) + { + if (buf->rot == 0 || buf->rot == 180) + conv_func = evas_common_convert_func_get(0, + buf->w, + buf->h, + evas_software_xcb_x_output_buffer_depth (xcbob), + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + buf->priv.pal->colors, + buf->rot); + else if (buf->rot == 90 || buf->rot == 270) + conv_func = evas_common_convert_func_get(0, + buf->h, + buf->w, + evas_software_xcb_x_output_buffer_depth (xcbob), + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + buf->priv.pal->colors, + buf->rot); + } + else + { + if (buf->rot == 0 || buf->rot == 180) + conv_func = evas_common_convert_func_get(0, + buf->w, + buf->h, + evas_software_xcb_x_output_buffer_depth(xcbob), + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + PAL_MODE_NONE, + buf->rot); + else if (buf->rot == 90 || buf->rot == 270) + conv_func = evas_common_convert_func_get(0, + buf->h, + buf->w, + evas_software_xcb_x_output_buffer_depth(xcbob), + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + PAL_MODE_NONE, + buf->rot); + } + evas_software_xcb_x_output_buffer_free(xcbob, 1); + if (!conv_func) + { + printf(".[ Evas Error ].\n" + " {\n" + " At depth %i:\n" + " RGB format mask: %08x, %08x, %08x\n" + " Palette mode: %i\n" + " Not supported by and compiled in converters!\n" + " }\n", + buf->priv.x.depth, + buf->priv.mask.r, + buf->priv.mask.g, + buf->priv.mask.b, + buf->priv.pal->colors); + } + } + evas_software_xcb_outbuf_drawable_set(buf, draw); + evas_software_xcb_outbuf_mask_set(buf, mask); + } + + return buf; +} + +RGBA_Image * +evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, + int x, + int y, + int w, + int h, + int *cx, + int *cy, + int *cw, + int *ch) +{ + RGBA_Image *im; + Outbuf_Region *obr; + int bpl = 0; + int use_shm = 1; + int alpha; + + if ((buf->onebuf) && (buf->priv.x.shm)) + { + Evas_Rectangle *rect; + + rect = malloc(sizeof(Evas_Rectangle)); + RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, buf->w, buf->h); + rect->x = x; + rect->y = y; + rect->w = w; + rect->h = h; + buf->priv.onebuf_regions = evas_list_append(buf->priv.onebuf_regions, rect); + if (buf->priv.onebuf) + { + *cx = x; + *cy = y; + *cw = w; + *ch = h; + if (!buf->priv.synced) + { + /* we sync */ + free(xcb_get_input_focus_reply(buf->priv.x.conn, xcb_get_input_focus_unchecked(buf->priv.x.conn), NULL)); + buf->priv.synced = 1; + } + if ((buf->priv.x.mask) || (buf->priv.destination_alpha)) + { + int yy; + + im = buf->priv.onebuf; + for (yy = y; yy < (y + h); yy++) + { + memset(im->image.data + (im->cache_entry.w * yy) + x, + 0, w * sizeof(DATA32)); + } + } + return buf->priv.onebuf; + } + obr = calloc(1, sizeof(Outbuf_Region)); + obr->x = 0; + obr->y = 0; + obr->w = buf->w; + obr->h = buf->h; + *cx = x; + *cy = y; + *cw = w; + *ch = h; + + alpha = ((buf->priv.x.mask) || (buf->priv.destination_alpha)); + + use_shm = buf->priv.x.shm; + if ((buf->rot == 0) && + (buf->priv.mask.r == 0xff0000) && + (buf->priv.mask.g == 0x00ff00) && + (buf->priv.mask.b == 0x0000ff)) + { + obr->xcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x.conn, + buf->priv.x.depth, + buf->w, buf->h, + use_shm, + NULL); + im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), + buf->w, buf->h, + (DATA32 *) evas_software_xcb_x_output_buffer_data(obr->xcbob, &bpl), + alpha, EVAS_COLORSPACE_ARGB8888); + im->extended_info = obr; + if (buf->priv.x.mask) + obr->mxcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x.conn, + 1, + buf->w, buf->h, + use_shm, + NULL); + } + else + { + im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); + im->cache_entry.flags.alpha |= alpha ? 1 : 0; + evas_cache_image_surface_alloc(&im->cache_entry, buf->w, buf->h); + im->extended_info = obr; + if ((buf->rot == 0) || (buf->rot == 180)) + obr->xcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x.conn, + buf->priv.x.depth, + buf->w, buf->h, + use_shm, + NULL); + else if ((buf->rot == 90) || (buf->rot == 270)) + obr->xcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x.conn, + buf->priv.x.depth, + buf->h, buf->w, + use_shm, + NULL); + if (buf->priv.x.mask) + obr->mxcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x.conn, + 1, buf->w, buf->h, + use_shm, + NULL); + } + if (alpha) + /* FIXME: faster memset! */ + memset(im->image.data, 0, w * h * sizeof(DATA32)); + + buf->priv.onebuf = im; + return im; + } + + + obr = calloc(1, sizeof(Outbuf_Region)); + obr->x = x; + obr->y = y; + obr->w = w; + obr->h = h; + *cx = 0; + *cy = 0; + *cw = w; + *ch = h; + + use_shm = buf->priv.x.shm; + /* FIXME: magic - i found if shm regions are smaller than 200x200 its + * faster to use ximages over unix sockets - trial and error + */ +// use_shm = 0; /* 630 -> 1006 fps */ +// if ((w * h) < (200 * 200)) use_shm = 0; /* 630 -> 962 fps */ + + alpha = ((buf->priv.x.mask) || (buf->priv.destination_alpha)); + + if ((buf->rot == 0) && + (buf->priv.mask.r == 0xff0000) && + (buf->priv.mask.g == 0x00ff00) && + (buf->priv.mask.b == 0x0000ff)) + { + obr->xcbob = _find_xcbob(buf->priv.x.conn, + buf->priv.x.depth, + w, h, + use_shm, + NULL); + im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), + w, h, + (DATA32 *) evas_software_xcb_x_output_buffer_data(obr->xcbob, &bpl), + alpha, EVAS_COLORSPACE_ARGB8888); + im->extended_info = obr; + if (buf->priv.x.mask) + obr->mxcbob = _find_xcbob(buf->priv.x.conn, + 1, w, h, + use_shm, + NULL); +/* obr->mxcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x.conn, */ +/* 1, */ +/* w, */ +/* h, */ +/* use_shm, */ +/* NULL); */ + } + else + { + im = (RGBA_Image *) evas_cache_image_empty(evas_common_image_cache_get()); + im->cache_entry.flags.alpha |= alpha ? 1 : 0; + evas_cache_image_surface_alloc(&im->cache_entry, w, h); + im->extended_info = obr; + if ((buf->rot == 0) || (buf->rot == 180)) + obr->xcbob = _find_xcbob(buf->priv.x.conn, + buf->priv.x.depth, + w, h, + use_shm, + NULL); +/* obr->xcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x.conn, */ +/* buf->priv.x.depth, */ +/* w, */ +/* h, */ +/* use_shm, */ +/* NULL); */ + else if ((buf->rot == 90) || (buf->rot == 270)) + obr->xcbob = _find_xcbob(buf->priv.x.conn, + buf->priv.x.depth, + h, w, + use_shm, + NULL); +/* obr->xcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x.conn, */ +/* buf->priv.x.depth, */ +/* h, */ +/* w, */ +/* use_shm, */ +/* NULL); */ + if (buf->priv.x.mask) + obr->mxcbob = _find_xcbob(buf->priv.x.conn, + 1, w, h, + use_shm, + NULL); +/* obr->mxcbob = evas_software_xcb_x_output_buffer_new(buf->priv.x.conn, */ +/* 1, */ +/* w, */ +/* h, */ +/* use_shm, */ +/* NULL); */ + } + if ((buf->priv.x.mask) || (buf->priv.destination_alpha)) + /* FIXME: faster memset! */ + memset(im->image.data, 0, w * h * sizeof(DATA32)); + + buf->priv.pending_writes = evas_list_append(buf->priv.pending_writes, im); + return im; +} + +void +evas_software_xcb_outbuf_free_region_for_update(Outbuf *buf, + RGBA_Image *update) +{ + /* no need to do anything - they are cleaned up on flush */ +} + +void +evas_software_xcb_outbuf_flush(Outbuf *buf) +{ + Evas_List *l; + + if ((buf->priv.onebuf) && (buf->priv.onebuf_regions)) + { + RGBA_Image *im; + Outbuf_Region *obr; + pixman_region16_t tmpr; + + im = buf->priv.onebuf; + obr = im->extended_info; + pixman_region_init(&tmpr); + while (buf->priv.onebuf_regions) + { + Evas_Rectangle *rect; + + rect = buf->priv.onebuf_regions->data; + buf->priv.onebuf_regions = evas_list_remove_list(buf->priv.onebuf_regions, buf->priv.onebuf_regions); + pixman_region_union_rect(&tmpr, &tmpr, + rect->x, rect->y, + rect->w, rect->h); + if (buf->priv.debug) + evas_software_xcb_outbuf_debug_show(buf, buf->priv.x.win, + rect->x, rect->y, rect->w, rect->h); + free(rect); + } + xcb_set_clip_rectangles(buf->priv.x.conn, XCB_CLIP_ORDERING_YX_BANDED, + buf->priv.x.gc, + 0, 0, pixman_region_n_rects(&tmpr), + (const xcb_rectangle_t *)pixman_region_rectangles(&tmpr, NULL)); + evas_software_xcb_x_output_buffer_paste(obr->xcbob, buf->priv.x.win, + buf->priv.x.gc, + 0, 0, 0); + if (obr->mxcbob) + { + xcb_set_clip_rectangles(buf->priv.x.conn, XCB_CLIP_ORDERING_YX_BANDED, + buf->priv.x.gcm, + 0, 0, pixman_region_n_rects(&tmpr), + (const xcb_rectangle_t *)pixman_region_rectangles(&tmpr, NULL)); + evas_software_xcb_x_output_buffer_paste(obr->mxcbob, + buf->priv.x.mask, + buf->priv.x.gcm, + 0, 0, 0); + } + buf->priv.synced = 0; + } + else + { +#if 1 + /* we sync */ + free(xcb_get_input_focus_reply(buf->priv.x.conn, xcb_get_input_focus_unchecked(buf->priv.x.conn), NULL)); + for (l = buf->priv.pending_writes; l; l = l->next) + { + RGBA_Image *im; + Outbuf_Region *obr; + + im = l->data; + obr = im->extended_info; + if (buf->priv.debug) + evas_software_xcb_outbuf_debug_show(buf, + buf->priv.x.win, + obr->x, + obr->y, + obr->w, + obr->h); + evas_software_xcb_x_output_buffer_paste(obr->xcbob, + buf->priv.x.win, + buf->priv.x.gc, + obr->x, + obr->y, 0); + if (obr->mxcbob) + evas_software_xcb_x_output_buffer_paste(obr->mxcbob, + buf->priv.x.mask, + buf->priv.x.gcm, + obr->x, + obr->y, 0); + } + while (buf->priv.pending_writes) + { + RGBA_Image *im; + Outbuf_Region *obr; + + im = buf->priv.pending_writes->data; + buf->priv.pending_writes = evas_list_remove_list(buf->priv.pending_writes, + buf->priv.pending_writes); + obr = im->extended_info; + evas_cache_image_drop(&im->cache_entry); + if (obr->xcbob) _unfind_xcbob(obr->xcbob, 0); + if (obr->mxcbob) _unfind_xcbob(obr->mxcbob, 0); +/* if (obr->xcbob) evas_software_xcb_x_output_buffer_free(obr->xcbob, 0); */ +/* if (obr->mxcbob) evas_software_xcb_x_output_buffer_free(obr->mxcbob, 0); */ + free(obr); + } + buf->priv.prev_pending_writes = buf->priv.pending_writes; + buf->priv.pending_writes = NULL; + xcb_flush(buf->priv.x.conn); +#else + /* XX async push - disable */ + /* + for (l = buf->priv.pending_writes; l; l = l->next) + { + RGBA_Image *im; + Outbuf_Region *obr; + + im = l->data; + obr = im->extended_info; + if (buf->priv.debug) + evas_software_x11_outbuf_debug_show(buf, buf->priv.x.win, + obr->x, obr->y, obr->w, obr->h); + evas_software_x11_x_output_buffer_paste(obr->xcbob, buf->priv.x.win, + buf->priv.x.gc, + obr->x, obr->y, 0); + if (obr->mxcbob) + evas_software_x11_x_output_buffer_paste(obr->mxcbob, + buf->priv.x.mask, + buf->priv.x.gcm, + obr->x, obr->y, 0); + } + */ + /* we sync */ + free(xcb_get_input_focus_reply(buf->priv.x.conn, xcb_get_input_focus_unchecked(buf->priv.x.conn), NULL)); + + while (buf->priv.pending_writes) + { + RGBA_Image *im; + Outbuf_Region *obr; + + im = evas_list_data(buf->priv.pending_writes); + buf->priv.pending_writes = evas_list_remove_list(buf->priv.pending_writes, buf->priv.pending_writes); + obr = im->extended_info; + evas_cache_image_drop(&im->cache_entry); + if (obr->xcbob) _unfind_xcbob(obr->xcbob, 0); + if (obr->mxcbob) _unfind_xcbob(obr->mxcbob, 0); +/* + if (obr->xcbob) evas_software_x11_x_output_buffer_free(obr->xcbob, 0); + if (obr->mxcbob) evas_software_x11_x_output_buffer_free(obr->mxcbob, 0); + */ + free(obr); + evas_cache_image_drop(&im->cache_entry); + } +#endif + } + evas_common_cpu_end_opt(); +} + +void +evas_software_xcb_outbuf_idle_flush(Outbuf *buf) +{ + if (buf->priv.onebuf) + { + RGBA_Image *im; + Outbuf_Region *obr; + + im = buf->priv.onebuf; + buf->priv.onebuf = NULL; + obr = im->extended_info; + if (obr->xcbob) evas_software_xcb_x_output_buffer_free(obr->xcbob, 0); + if (obr->mxcbob) evas_software_xcb_x_output_buffer_free(obr->mxcbob, 0); + free(obr); + evas_cache_image_drop(&im->cache_entry); + } + else + { + if (buf->priv.prev_pending_writes) + free(xcb_get_input_focus_reply(buf->priv.x.conn, xcb_get_input_focus_unchecked(buf->priv.x.conn), NULL)); + while (buf->priv.prev_pending_writes) + { + RGBA_Image *im; + Outbuf_Region *obr; + + im = buf->priv.prev_pending_writes->data; + buf->priv.prev_pending_writes = + evas_list_remove_list(buf->priv.prev_pending_writes, + buf->priv.prev_pending_writes); + obr = im->extended_info; + evas_cache_image_drop(&im->cache_entry); + if (obr->xcbob) _unfind_xcbob(obr->xcbob, 0); + if (obr->mxcbob) _unfind_xcbob(obr->mxcbob, 0); + free(obr); + } + _clear_xcbob(0); + } +} + +void +evas_software_xcb_outbuf_push_updated_region(Outbuf *buf, + RGBA_Image *update, + int x, + int y, + int w, + int h) +{ + Gfx_Func_Convert conv_func = NULL; + Outbuf_Region *obr; + DATA32 *src_data; + void *data; + int bpl = 0; + int yy; + + obr = update->extended_info; + if (buf->priv.pal) + { + if ((buf->rot == 0) || (buf->rot == 180)) + conv_func = evas_common_convert_func_get(0, w, h, + evas_software_xcb_x_output_buffer_depth + (obr->xcbob), buf->priv.mask.r, + buf->priv.mask.g, buf->priv.mask.b, + buf->priv.pal->colors, buf->rot); + else if ((buf->rot == 90) || (buf->rot == 270)) + conv_func = evas_common_convert_func_get(0, h, w, + evas_software_xcb_x_output_buffer_depth + (obr->xcbob), buf->priv.mask.r, + buf->priv.mask.g, buf->priv.mask.b, + buf->priv.pal->colors, buf->rot); + } + else + { + if ((buf->rot == 0) || (buf->rot == 180)) + conv_func = evas_common_convert_func_get(0, w, h, + evas_software_xcb_x_output_buffer_depth + (obr->xcbob), buf->priv.mask.r, + buf->priv.mask.g, buf->priv.mask.b, + PAL_MODE_NONE, buf->rot); + else if ((buf->rot == 90) || (buf->rot == 270)) + conv_func = evas_common_convert_func_get(0, h, w, + evas_software_xcb_x_output_buffer_depth + (obr->xcbob), buf->priv.mask.r, + buf->priv.mask.g, buf->priv.mask.b, + PAL_MODE_NONE, buf->rot); + } + if (!conv_func) return; + + data = evas_software_xcb_x_output_buffer_data(obr->xcbob, &bpl); + src_data = update->image.data; + if (buf->rot == 0) + { + obr->x = x; + obr->y = y; + } + else if (buf->rot == 90) + { + obr->x = y; + obr->y = buf->w - x - w; + } + else if (buf->rot == 180) + { + obr->x = buf->w - x - w; + obr->y = buf->h - y - h; + } + else if (buf->rot == 270) + { + obr->x = buf->h - y - h; + obr->y = x; + } + if ((buf->rot == 0) || (buf->rot == 180)) + { + obr->w = w; + obr->h = h; + } + else if ((buf->rot == 90) || (buf->rot == 270)) + { + obr->w = h; + obr->h = w; + } + if (buf->priv.pal) + { + if (data != src_data) + conv_func(src_data, data, + 0, + bpl / + ((evas_software_xcb_x_output_buffer_depth(obr->xcbob) / 8)) - obr->w, + obr->w, obr->h, x, y, + buf->priv.pal->lookup); + } + else + { + if (data != src_data) + conv_func(src_data, data, + 0, + bpl / + ((evas_software_xcb_x_output_buffer_depth(obr->xcbob) / 8)) - obr->w, + obr->w, obr->h, x, y, NULL); + } +#if 1 +#else + /* XX async push */ + if (!((buf->priv.onebuf) && (buf->priv.onebuf_regions))) + { + if (buf->priv.debug) + evas_software_xcb_outbuf_debug_show(buf, buf->priv.x.win, + obr->x, obr->y, obr->w, obr->h); + evas_software_xcb_x_output_buffer_paste(obr->xcbob, buf->priv.x.win, + buf->priv.x.gc, + obr->x, obr->y, 0); + } +#endif + if (obr->mxcbob) + { + for (yy = 0; yy < obr->h; yy++) + evas_software_xcb_x_write_mask_line(buf, obr->mxcbob, + src_data + (yy * obr->w), + obr->w, + yy); +#if 1 +#else + /* XX async push */ + if (!((buf->priv.onebuf) && (buf->priv.onebuf_regions))) + evas_software_xcb_x_output_buffer_paste(obr->mxcbob, + buf->priv.x.mask, + buf->priv.x.gcm, + obr->x, obr->y, 0); +#endif + } +#if 1 +#else + xcb_flush(buf->priv.x.conn); +#endif +} + +void +evas_software_xcb_outbuf_reconfigure(Outbuf *buf, + int w, + int h, + int rot, + Outbuf_Depth depth) +{ + if ((w == buf->w) && + (h == buf->h) && + (rot == buf->rot) && + (depth == buf->depth)) return; + buf->w = w; + buf->h = h; + buf->rot = rot; + evas_software_xcb_outbuf_idle_flush(buf); +} + +int +evas_software_xcb_outbuf_get_width(Outbuf * buf) +{ + return buf->w; +} + +int +evas_software_xcb_outbuf_get_height(Outbuf * buf) +{ + return buf->h; +} + +Outbuf_Depth +evas_software_xcb_outbuf_get_depth(Outbuf * buf) +{ + return buf->depth; +} + +int +evas_software_xcb_outbuf_get_rot(Outbuf * buf) +{ + return buf->rot; +} + +void +evas_software_xcb_outbuf_drawable_set(Outbuf *buf, + xcb_drawable_t draw) +{ + if (buf->priv.x.win == draw) return; + if (buf->priv.x.gc) + { + xcb_free_gc(buf->priv.x.conn, buf->priv.x.gc); + buf->priv.x.gc = 0; + } + buf->priv.x.win = draw; + buf->priv.x.gc = xcb_generate_id(buf->priv.x.conn); + xcb_create_gc(buf->priv.x.conn, buf->priv.x.gc, buf->priv.x.win, 0, NULL); +} + +void +evas_software_xcb_outbuf_mask_set(Outbuf *buf, + xcb_drawable_t mask) +{ + if (buf->priv.x.mask == mask) return; + if (buf->priv.x.gcm) + { + xcb_free_gc(buf->priv.x.conn, buf->priv.x.gcm); + buf->priv.x.gcm = 0; + } + buf->priv.x.mask = mask; + if (buf->priv.x.mask) + { + buf->priv.x.gcm = xcb_generate_id(buf->priv.x.conn); + xcb_create_gc(buf->priv.x.conn, buf->priv.x.gcm, buf->priv.x.win, 0, NULL); + } +} + +void +evas_software_xcb_outbuf_debug_set(Outbuf *buf, + int debug) +{ + buf->priv.debug = debug; +} +void +evas_software_xcb_outbuf_debug_show(Outbuf *buf, + xcb_drawable_t draw, + int x, + int y, + int w, + int h) +{ + int i; + xcb_screen_t *screen = NULL; + + { + xcb_get_geometry_reply_t *geom; + xcb_drawable_t root; + xcb_screen_iterator_t i; + + geom = xcb_get_geometry_reply (buf->priv.x.conn, xcb_get_geometry_unchecked(buf->priv.x.conn, draw), 0); + root = geom->root; + free (geom); + geom = xcb_get_geometry_reply (buf->priv.x.conn, xcb_get_geometry_unchecked(buf->priv.x.conn, root), 0); + + i = xcb_setup_roots_iterator((xcb_setup_t *)xcb_get_setup(buf->priv.x.conn)); + for (; i.rem; xcb_screen_next(&i)) + if (i.data->root == geom->root) + { + screen = i.data; + break; + } + free (geom); + } + for (i = 0; i < 20; i++) + { +/* xcb_image_t *image; */ + xcb_rectangle_t rect = { x, y, w, h}; + uint32_t mask; + uint32_t value[2]; + + mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES; + value[0] = screen->black_pixel; + value[1] = XCB_EXPOSURES_NOT_ALLOWED; /* no graphics exposures allowed */ + xcb_change_gc(buf->priv.x.conn, buf->priv.x.gc, mask, value); + xcb_poly_fill_rectangle (buf->priv.x.conn, draw, buf->priv.x.gc, 1, &rect); + /* we sync */ + free(xcb_get_input_focus_reply(buf->priv.x.conn, xcb_get_input_focus_unchecked(buf->priv.x.conn), NULL)); +// image = xcb_image_get(buf->priv.x.conn, draw, x, y, w, h, XCB_ALL_PLANES, XCB_IMAGE_FORMAT_Z_PIXMAP); +// if (image) +// xcb_image_destroy(image); + /* we sync */ + free(xcb_get_input_focus_reply(buf->priv.x.conn, xcb_get_input_focus_unchecked(buf->priv.x.conn), NULL)); + mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES; + value[0] = screen->white_pixel; + value[1] = XCB_EXPOSURES_NOT_ALLOWED; /* no graphics exposures allowed */ + xcb_change_gc(buf->priv.x.conn, buf->priv.x.gc, mask, value); + xcb_poly_fill_rectangle (buf->priv.x.conn, draw, buf->priv.x.gc, 1, &rect); + /* we sync */ + free(xcb_get_input_focus_reply(buf->priv.x.conn, xcb_get_input_focus_unchecked(buf->priv.x.conn), NULL)); +// image = xcb_image_get(buf->priv.x.conn, draw, x, y, w, h, XCB_ALL_PLANES, XCB_IMAGE_FORMAT_Z_PIXMAP); +// if (image) +// xcb_image_destroy(image); + /* we sync */ + free(xcb_get_input_focus_reply(buf->priv.x.conn, xcb_get_input_focus_unchecked(buf->priv.x.conn), NULL)); + } +} diff --git a/src/modules/engines/software_xcb/evas_xcb_buffer.c b/src/modules/engines/software_xcb/evas_xcb_buffer.c new file mode 100644 index 0000000..dba56a0 --- /dev/null +++ b/src/modules/engines/software_xcb/evas_xcb_buffer.c @@ -0,0 +1,287 @@ +#include "evas_common.h" +#include "evas_engine.h" + +static int _xcb_err = 0; + +void +evas_software_xcb_x_write_mask_line(Outbuf *buf, + Xcb_Output_Buffer *xcbob, + DATA32 *src, + int w, + int y) +{ + int x; + DATA32 *src_ptr; + DATA8 *dst_ptr; + int bpl = 0; + + src_ptr = src; + dst_ptr = evas_software_xcb_x_output_buffer_data(xcbob, &bpl); + dst_ptr = dst_ptr + (bpl * y); + w -= 7; + if (buf->priv.x.bit_swap) + { + for (x = 0; x < w; x += 8) + { + *dst_ptr = + ((A_VAL(&(src_ptr[0])) >> 7) << 7) | + ((A_VAL(&(src_ptr[1])) >> 7) << 6) | + ((A_VAL(&(src_ptr[2])) >> 7) << 5) | + ((A_VAL(&(src_ptr[3])) >> 7) << 4) | + ((A_VAL(&(src_ptr[4])) >> 7) << 3) | + ((A_VAL(&(src_ptr[5])) >> 7) << 2) | + ((A_VAL(&(src_ptr[6])) >> 7) << 1) | + ((A_VAL(&(src_ptr[7])) >> 7) << 0); + src_ptr += 8; + dst_ptr++; + } + } + else + { + for (x = 0; x < w; x += 8) + { + *dst_ptr = + ((A_VAL(&(src_ptr[0])) >> 7) << 0) | + ((A_VAL(&(src_ptr[1])) >> 7) << 1) | + ((A_VAL(&(src_ptr[2])) >> 7) << 2) | + ((A_VAL(&(src_ptr[3])) >> 7) << 3) | + ((A_VAL(&(src_ptr[4])) >> 7) << 4) | + ((A_VAL(&(src_ptr[5])) >> 7) << 5) | + ((A_VAL(&(src_ptr[6])) >> 7) << 6) | + ((A_VAL(&(src_ptr[7])) >> 7) << 7); + src_ptr += 8; + dst_ptr++; + } + } + w += 7; + for (; x < w; x ++) + { + xcb_image_put_pixel(xcbob->image, x, y, A_VAL(src_ptr) >> 7); + src_ptr++; + } +} + +int +evas_software_xcb_x_can_do_shm(xcb_connection_t *c, + xcb_screen_t *screen) +{ + static xcb_connection_t *cached_c = NULL; + static int cached_result = 0; + + if (c == cached_c) return cached_result; + cached_c = c; + + if (xcb_get_extension_data(c, &xcb_shm_id)) + { + Xcb_Output_Buffer *xcbob; + + xcbob = evas_software_xcb_x_output_buffer_new(c, + screen->root_depth, + 16, + 16, + 2, + NULL); + if (!xcbob) + { + cached_result = 0; + return 0; + } + evas_software_xcb_x_output_buffer_free(xcbob, 1); + cached_result = 1; + return 1; + } + cached_result = 0; + return 0; +} + +/* + * FIXME: no error mechanism + */ + +/* static void */ +/* x_output_tmp_xcb_err(xcb_connection_t *c, XErrorEvent * ev) */ +/* { */ +/* _xcb_err = 1; */ +/* return; */ +/* } */ + +Xcb_Output_Buffer * +evas_software_xcb_x_output_buffer_new(xcb_connection_t *c, + int depth, + int w, + int h, + int try_shm, + void *data) +{ + Xcb_Output_Buffer *xcbob; + + xcbob = calloc(1, sizeof(Xcb_Output_Buffer)); + if (!xcbob) return NULL; + + xcbob->connection = c; + xcbob->image = NULL; + xcbob->shm_info = NULL; + xcbob->w = w; + xcbob->h = h; + + try_shm = 0; + + if (try_shm > 0) + { + xcbob->shm_info = malloc(sizeof(xcb_shm_segment_info_t)); + if (xcbob->shm_info) + { + xcbob->shm_info->shmseg = xcb_generate_id(c); + xcbob->image = xcb_image_create_native(c, w, h, + XCB_IMAGE_FORMAT_Z_PIXMAP, + depth, NULL, ~0, NULL); + if (xcbob->image) + { + xcbob->shm_info->shmid = shmget(IPC_PRIVATE, + xcbob->image->size, + IPC_CREAT | 0777); + if (xcbob->shm_info->shmid >= 0) + { + xcbob->shm_info->shmaddr = xcbob->image->data = + shmat(xcbob->shm_info->shmid, 0, 0); + if (xcbob->shm_info->shmaddr != NULL) + { + /* + * FIXME: no error mechanism + */ + + /* XErrorHandler ph; */ + /* EventHandlers eh; */ + + // free(xcb_get_input_focus_reply(c, xcb_get_input_focus_unchecked(c), NULL)); + _xcb_err = 0; + /* ph = XSetErrorHandler((XErrorHandler) */ + /* x_output_tmp_x_err); */ + xcb_shm_attach(c, + xcbob->shm_info->shmseg, + xcbob->shm_info->shmid, 0); + // free(xcb_get_input_focus_reply(c, xcb_get_input_focus_unchecked(c), NULL)); + /* XSetErrorHandler((XErrorHandler)ph); */ + if (!_xcb_err) + { + xcbob->bpl = xcbob->image->stride; + xcbob->psize = xcbob->bpl * xcbob->h; + return xcbob; + } + } + shmdt(xcbob->shm_info->shmaddr); + shmctl(xcbob->shm_info->shmid, IPC_RMID, 0); + } + if (xcbob->image) xcb_image_destroy(xcbob->image); + xcbob->image = NULL; + } + if (xcbob->shm_info) free(xcbob->shm_info); + xcbob->shm_info = NULL; + } + } + + if (try_shm > 1) return NULL; + + xcbob->image = xcb_image_create_native(c, w, h, XCB_IMAGE_FORMAT_Z_PIXMAP, + depth, NULL, ~0, NULL); + if (!xcbob->image) + { + free(xcbob); + return NULL; + } + + xcbob->data = data; + + if (!xcbob->image->data) + { + xcbob->image->data = malloc(xcbob->image->size); + if (!xcbob->image->data) + { + xcb_image_destroy(xcbob->image); + free(xcbob); + return NULL; + } + } + + xcbob->bpl = xcbob->image->stride; + xcbob->psize = xcbob->image->size; + + return xcbob; +} + +void +evas_software_xcb_x_output_buffer_free(Xcb_Output_Buffer *xcbob, + int sync) +{ + if (xcbob->shm_info) + { + if (sync) + free(xcb_get_input_focus_reply(xcbob->connection, + xcb_get_input_focus_unchecked(xcbob->connection), + NULL)); + xcb_shm_detach(xcbob->connection, xcbob->shm_info->shmseg); + xcb_image_destroy(xcbob->image); + shmdt(xcbob->shm_info->shmaddr); + shmctl(xcbob->shm_info->shmid, IPC_RMID, 0); + free(xcbob->shm_info); + } + else + { + if (xcbob->data) xcbob->image->data = NULL; + xcb_image_destroy(xcbob->image); + } + free(xcbob); +} + +void +evas_software_xcb_x_output_buffer_paste(Xcb_Output_Buffer *xcbob, + xcb_drawable_t d, + xcb_gcontext_t gc, + int x, + int y, + int sync) +{ + if (xcbob->shm_info) + { + xcb_image_shm_put(xcbob->connection, d, gc, + xcbob->image, *xcbob->shm_info, + 0, 0, + x, y, + xcbob->image->width, xcbob->image->height, + 0); + if (sync) + free(xcb_get_input_focus_reply(xcbob->connection, + xcb_get_input_focus_unchecked(xcbob->connection), + NULL)); + } + else + xcb_image_put(xcbob->connection, d, gc, + xcbob->image, + x, y, 0); +} + +DATA8 * +evas_software_xcb_x_output_buffer_data(Xcb_Output_Buffer *xcbob, + int *bytes_per_line_ret) +{ + if (bytes_per_line_ret) *bytes_per_line_ret = xcbob->image->stride; + return xcbob->image->data; +} + +int +evas_software_xcb_x_output_buffer_depth(Xcb_Output_Buffer *xcbob) +{ + return xcbob->image->bpp; +} + +int +evas_software_xcb_x_output_buffer_byte_order(Xcb_Output_Buffer *xcbob) +{ + return xcbob->image->byte_order; +} + +int +evas_software_xcb_x_output_buffer_bit_order(Xcb_Output_Buffer *xcbob) +{ + return xcbob->image->bit_order; +} diff --git a/src/modules/engines/software_xcb/evas_xcb_color.c b/src/modules/engines/software_xcb/evas_xcb_color.c new file mode 100644 index 0000000..4ed32cd --- /dev/null +++ b/src/modules/engines/software_xcb/evas_xcb_color.c @@ -0,0 +1,426 @@ +#include "evas_common.h" +#include "evas_engine.h" + +#include + +typedef struct _Convert_Pal_Priv Convert_Pal_Priv; + +struct _Convert_Pal_Priv +{ + xcb_connection_t *conn; + xcb_colormap_t cmap; + xcb_visualtype_t *vis; +}; + +typedef DATA8 * (*Xcb_Func_Alloc_Colors) (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v); + +static Xcb_Func_Alloc_Colors x_color_alloc[PAL_MODE_LAST + 1]; +static int x_color_count[PAL_MODE_LAST + 1]; +static Evas_List *palettes = NULL; + +static DATA8 * x_color_alloc_rgb(int nr, int ng, int nb, xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v); +static DATA8 * x_color_alloc_gray(int ng, xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v); + +static DATA8 * x_color_alloc_rgb_332 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v); +static DATA8 * x_color_alloc_rgb_666 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v); +static DATA8 * x_color_alloc_rgb_232 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v); +static DATA8 * x_color_alloc_rgb_222 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v); +static DATA8 * x_color_alloc_rgb_221 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v); +static DATA8 * x_color_alloc_rgb_121 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v); +static DATA8 * x_color_alloc_rgb_111 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v); +static DATA8 * x_color_alloc_gray_256 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v); +static DATA8 * x_color_alloc_gray_64 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v); +static DATA8 * x_color_alloc_gray_16 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v); +static DATA8 * x_color_alloc_gray_4 (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v); +static DATA8 * x_color_alloc_mono (xcb_connection_t *conn, xcb_colormap_t cmap, xcb_visualtype_t *v); + +static DATA8 * +x_color_alloc_rgb(int nr, + int ng, + int nb, + xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *v) +{ + int r, g, b, i; + DATA8 *color_lut; + int sig_mask = 0; + int delt = 0; + + for (i = 0; i < v->bits_per_rgb_value; i++) sig_mask |= (0x1 << i); + sig_mask <<= (16 - v->bits_per_rgb_value); + i = 0; + color_lut = malloc((nr) * (ng) * (nb)); + if (!color_lut) return NULL; + delt = 0x0101 * 3; + /* FIXME: remove the round-trip ? */ + for (r = 0; r < (nr); r++) + { + for (g = 0; g < (ng); g++) + { + for (b = 0; b < (nb); b++) + { + xcb_coloritem_t xcl; + xcb_coloritem_t xcl_in; + xcb_alloc_color_reply_t *rep; + int val; + int dr, dg, db; + + val = (int)((((double)r) / ((nr) - 1)) * 255); + val = (val << 8) | val; + xcl.red = (uint16_t)(val); + val = (int)((((double)g) / ((ng) - 1)) * 255); + val = (val << 8) | val; + xcl.green = (uint16_t)(val); + val = (int)((((double)b) / ((nb) - 1)) * 255); + val = (val << 8) | val; + xcl.blue = (uint16_t)(val); + xcl_in = xcl; + rep = xcb_alloc_color_reply(conn, + xcb_alloc_color_unchecked(conn, + cmap, + xcl.red, + xcl.green, + xcl.blue), + 0); + dr = (int)xcl_in.red - (int)xcl.red; + if (dr < 0) dr = -dr; + dg = (int)xcl_in.green - (int)xcl.green; + if (dg < 0) dg = -dg; + db = (int)xcl_in.blue - (int)xcl.blue; + if (db < 0) db = -db; +/* + printf("ASK [%i]: %04x %04x %04x = %04x %04x %04x | dif = %04x / %04x\n", + ret, + xcl_in.red, xcl_in.green, xcl_in.blue, + xcl.red, xcl.green, xcl.blue, + (dr + dg +db), delt); + */ + + /* TODO: XAllocColor tries to approach the color */ + /* in case the allocation fails */ + /* XCB does not that (i think). It should be done */ + /* So if rep == NULL, the other following tests */ + /* should be always satisfied */ + if ((!rep) || + ((dr + dg + db) > delt) + /* + ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) || + ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) || + ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask)) + */ + ) + { + uint32_t pixels[256]; + int j; + + if (i > 0) + { + for (j = 0; j < i; j++) + pixels[j] = (uint32_t)color_lut[j]; + xcb_free_colors(conn, cmap, 0, i, pixels); + } + free(color_lut); + return NULL; + } + color_lut[i] = rep->pixel; + i++; + free(rep); + } + } + } + return color_lut; +} + +static DATA8 * +x_color_alloc_gray(int ng, + xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *v) +{ + int g, i; + DATA8 *color_lut; + int sig_mask = 0; + + for (i = 0; i < v->bits_per_rgb_value; i++) sig_mask |= (0x1 << i); + sig_mask <<= (16 - v->bits_per_rgb_value); + i = 0; + color_lut = malloc(ng); + if (!color_lut) return NULL; + /* FIXME: remove the round-trip ? */ + for (g = 0; g < (ng); g++) + { + xcb_coloritem_t xcl; + xcb_coloritem_t xcl_in; + int val; + xcb_alloc_color_reply_t *rep; + + val = (int)((((double)g) / ((ng) - 1)) * 255); + val = (val << 8) | val; + xcl.red = (uint16_t)(val); + xcl.green = (uint16_t)(val); + xcl.blue = (uint16_t)(val); + xcl_in = xcl; + rep = xcb_alloc_color_reply(conn, + xcb_alloc_color_unchecked(conn, + cmap, + xcl.red, + xcl.green, + xcl.blue), + 0); + /* FIXME: XAllocColor tries to approach the color */ + /* in case the allocation fails */ + /* XCB does not that (i think). It should be done */ + /* So if rep == NULL, the other following tests */ + /* should be always satisfied */ + if ((!rep) || + ((xcl_in.red & sig_mask) != (xcl.red & sig_mask)) || + ((xcl_in.green & sig_mask) != (xcl.green & sig_mask)) || + ((xcl_in.blue & sig_mask) != (xcl.blue & sig_mask))) + { + uint32_t pixels[256]; + int j; + + if (i > 0) + { + for (j = 0; j < i; j++) + pixels[j] = (uint32_t) color_lut[j]; + xcb_free_colors(conn, cmap, 0, i, pixels); + } + free(color_lut); + return NULL; + } + color_lut[i] = rep->pixel; + i++; + free(rep); + } + return color_lut; +} + +static DATA8 * +x_color_alloc_rgb_332(xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *v) +{ + return x_color_alloc_rgb(8, 8, 4, conn, cmap, v); +} + +static DATA8 * +x_color_alloc_rgb_666(xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *v) +{ + return x_color_alloc_rgb(6, 6, 6, conn, cmap, v); +} + +static DATA8 * +x_color_alloc_rgb_232(xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *v) +{ + return x_color_alloc_rgb(4, 8, 4, conn, cmap, v); +} + +static DATA8 * +x_color_alloc_rgb_222(xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *v) +{ + return x_color_alloc_rgb(4, 4, 4, conn, cmap, v); +} + +static DATA8 * +x_color_alloc_rgb_221(xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *v) +{ + return x_color_alloc_rgb(4, 4, 2, conn, cmap, v); +} + +static DATA8 * +x_color_alloc_rgb_121(xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *v) +{ + return x_color_alloc_rgb(2, 4, 2, conn, cmap, v); +} + +static DATA8 * +x_color_alloc_rgb_111(xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *v) +{ + return x_color_alloc_rgb(2, 2, 2, conn, cmap, v); +} + +static DATA8 * +x_color_alloc_gray_256(xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *v) +{ + return x_color_alloc_gray(256, conn, cmap, v); +} + +static DATA8 * +x_color_alloc_gray_64(xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *v) +{ + return x_color_alloc_gray(64, conn, cmap, v); +} + +static DATA8 * +x_color_alloc_gray_16(xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *v) +{ + return x_color_alloc_gray(32, conn, cmap, v); +} + +static DATA8 * +x_color_alloc_gray_4(xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *v) +{ + return x_color_alloc_gray(16, conn, cmap, v); +} + +static DATA8 * +x_color_alloc_mono(xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *v) +{ + return x_color_alloc_gray(2, conn, cmap, v); +} + +void +evas_software_xcb_x_color_init(void) +{ + static int initialised = 0; + + if (initialised) return; + x_color_alloc[PAL_MODE_NONE] = NULL; + x_color_count[PAL_MODE_NONE] = 0; + + x_color_alloc[PAL_MODE_MONO] = x_color_alloc_mono; + x_color_count[PAL_MODE_MONO] = 2; + + x_color_alloc[PAL_MODE_GRAY4] = x_color_alloc_gray_4; + x_color_count[PAL_MODE_GRAY4] = 4; + + x_color_alloc[PAL_MODE_GRAY16] = x_color_alloc_gray_16; + x_color_count[PAL_MODE_GRAY16] = 16; + + x_color_alloc[PAL_MODE_GRAY64] = x_color_alloc_gray_64; + x_color_count[PAL_MODE_GRAY64] = 64; + + x_color_alloc[PAL_MODE_GRAY256] = x_color_alloc_gray_256; + x_color_count[PAL_MODE_GRAY256] = 256; + + x_color_alloc[PAL_MODE_RGB111] = x_color_alloc_rgb_111; + x_color_count[PAL_MODE_RGB111] = 2 * 2 * 2; + + x_color_alloc[PAL_MODE_RGB121] = x_color_alloc_rgb_121; + x_color_count[PAL_MODE_RGB121] = 2 * 4 * 2; + + x_color_alloc[PAL_MODE_RGB221] = x_color_alloc_rgb_221; + x_color_count[PAL_MODE_RGB221] = 4 * 4 * 2; + + x_color_alloc[PAL_MODE_RGB222] = x_color_alloc_rgb_222; + x_color_count[PAL_MODE_RGB222] = 4 * 4 * 4; + + x_color_alloc[PAL_MODE_RGB232] = x_color_alloc_rgb_232; + x_color_count[PAL_MODE_RGB232] = 4 * 8 * 4; + + x_color_alloc[PAL_MODE_RGB666] = x_color_alloc_rgb_666; + x_color_count[PAL_MODE_RGB666] = 6 * 6 * 6; + + x_color_alloc[PAL_MODE_RGB332] = x_color_alloc_rgb_332; + x_color_count[PAL_MODE_RGB332] = 8 * 8 * 4; + + x_color_alloc[PAL_MODE_LAST] = NULL; + x_color_count[PAL_MODE_LAST] = 0; + initialised = 1; +} + +Convert_Pal * +evas_software_xcb_x_color_allocate(xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *vis, + Convert_Pal_Mode colors) +{ + Convert_Pal_Priv *palpriv; + Convert_Pal *pal; + Convert_Pal_Mode c; + Evas_List *l; + +/* printf("ALLOC cmap=%i vis=%p\n", cmap, vis);*/ + for (l = palettes; l; l = l->next) + { + pal = l->data; + palpriv = pal->data; + if ((conn == palpriv->conn) && + (vis == palpriv->vis) && + (cmap == palpriv->cmap)) + { + pal->references++; + return pal; + } + } + pal = calloc(1, sizeof(struct _Convert_Pal)); + if (!pal) return NULL; + for (c = colors; c > PAL_MODE_NONE; c--) + { + if (x_color_alloc[c]) + { +/* printf("TRY PAL %i\n", c);*/ + pal->lookup = (x_color_alloc[c])(conn, cmap, vis); + if (pal->lookup) break; + } + } + pal->references = 1; + pal->colors = c; + pal->count = x_color_count[c]; + palpriv = calloc(1, sizeof(Convert_Pal_Priv)); + pal->data = palpriv; + if (!palpriv) + { + if (pal->lookup) free(pal->lookup); + free(pal); + return NULL; + } + palpriv->conn = conn; + palpriv->vis = vis; + palpriv->cmap = cmap; + if (pal->colors == PAL_MODE_NONE) + { + if (pal->lookup) free(pal->lookup); + free(pal); + return NULL; + } + palettes = evas_list_append(palettes, pal); + return pal; +} + +void +evas_software_xcb_x_color_deallocate(xcb_connection_t *conn, + xcb_colormap_t cmap, + xcb_visualtype_t *vis, + Convert_Pal *pal) +{ + uint32_t pixels[256]; + int j; + + pal->references--; + if (pal->references > 0) return; + if (pal->lookup) + { + for(j = 0; j < pal->count; j++) + pixels[j] = (uint32_t) pal->lookup[j]; + xcb_free_colors(conn, cmap, 0, pal->count, pixels); + free(pal->lookup); + } + free(pal->data); + palettes = evas_list_remove(palettes, pal); + free(pal); +} diff --git a/src/modules/engines/software_xcb/evas_xcb_main.c b/src/modules/engines/software_xcb/evas_xcb_main.c new file mode 100644 index 0000000..c8d3b94 --- /dev/null +++ b/src/modules/engines/software_xcb/evas_xcb_main.c @@ -0,0 +1,9 @@ +#include "evas_common.h" +#include "evas_engine.h" + +#include + +void +evas_software_xcb_x_init(void) +{ +} diff --git a/src/modules/engines/xrender_x11/.cvsignore b/src/modules/engines/xrender_x11/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/engines/xrender_x11/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/engines/xrender_x11/Evas_Engine_XRender_X11.h b/src/modules/engines/xrender_x11/Evas_Engine_XRender_X11.h new file mode 100644 index 0000000..3ce7744 --- /dev/null +++ b/src/modules/engines/xrender_x11/Evas_Engine_XRender_X11.h @@ -0,0 +1,25 @@ +#ifndef _EVAS_ENGINE_XRENDER_X11_H +#define _EVAS_ENGINE_XRENDER_X11_H + +#include + +typedef struct _Evas_Engine_Info_XRender_X11 Evas_Engine_Info_XRender_X11; + +struct _Evas_Engine_Info_XRender_X11 +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + /* engine specific data & parameters it needs to set up */ + struct { + Display *display; + Drawable drawable; + Pixmap mask; + Visual *visual; + unsigned char destination_alpha : 1; + } info; +}; +#endif + + diff --git a/src/modules/engines/xrender_x11/Makefile.am b/src/modules/engines/xrender_x11/Makefile.am new file mode 100644 index 0000000..1928a5c --- /dev/null +++ b/src/modules/engines/xrender_x11/Makefile.am @@ -0,0 +1,44 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +@FREETYPE_CFLAGS@ \ +@x_cflags@ + +if BUILD_ENGINE_XRENDER_X11 + +pkgdir = $(libdir)/evas/modules/engines/xrender_x11/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = \ +evas_engine.h \ +evas_engine.c \ +evas_engine_ximage.c \ +evas_engine_xrender.c \ +evas_engine_image.c \ +evas_engine_font.c \ +evas_engine_gradient.c + +module_la_LIBADD = @x_libs@ -lXrender $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_XRender_X11.h + +endif + +EXTRA_DIST = \ +evas_engine.h \ +evas_engine.c \ +evas_engine_ximage.c \ +evas_engine_xrender.c \ +evas_engine_image.c \ +evas_engine_font.c \ +evas_engine_gradient.c \ +Evas_Engine_XRender_X11.h diff --git a/src/modules/engines/xrender_x11/evas_engine.c b/src/modules/engines/xrender_x11/evas_engine.c new file mode 100644 index 0000000..9c50db3 --- /dev/null +++ b/src/modules/engines/xrender_x11/evas_engine.c @@ -0,0 +1,950 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_XRender_X11.h" + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func, pfunc; + +/* engine struct data */ +typedef struct _Render_Engine Render_Engine; +typedef struct _Render_Engine_Update Render_Engine_Update; + +struct _Render_Engine_Update +{ + int x, y, w, h; + Xrender_Surface *surface; +}; + +struct _Render_Engine +{ + Display *disp; + Visual *vis; + Drawable win; + Pixmap mask; + unsigned char destination_alpha : 1; + + Ximage_Info *xinf; + Xrender_Surface *output; + Xrender_Surface *mask_output; + + Tilebuf *tb; + Tilebuf_Rect *rects; + Evas_Object_List *cur_rect; + int end : 1; + + Evas_List *updates; +}; + +/* internal engine routines */ + +/* engine api this module provides */ +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_XRender_X11 *info; + + info = calloc(1, sizeof(Evas_Engine_Info_XRender_X11)); + if (!info) return NULL; + info->magic.magic = rand(); + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_XRender_X11 *in; + + in = (Evas_Engine_Info_XRender_X11 *)info; + free(in); +} + +static void +eng_setup(Evas *e, void *in) +{ + Render_Engine *re; + Evas_Engine_Info_XRender_X11 *info; + int resize = 1; + + info = (Evas_Engine_Info_XRender_X11 *)in; + if (!e->engine.data.output) + { + re = calloc(1, sizeof(Render_Engine)); + evas_common_cpu_init(); + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + e->engine.data.output = re; + resize = 0; + } + re = e->engine.data.output; + if (!re) return; + + if (!e->engine.data.context) e->engine.data.context = e->engine.func->context_new(e->engine.data.output); + + re->disp = info->info.display; + re->vis = info->info.visual; + re->win = info->info.drawable; + re->mask = info->info.mask; + re->destination_alpha = info->info.destination_alpha; + + if (re->xinf) _xr_image_info_free(re->xinf); + re->xinf = _xr_image_info_get(re->disp, re->win, re->vis); + + if (re->output) _xr_render_surface_free(re->output); + if (re->mask_output) _xr_render_surface_free(re->mask_output); + if (!re->mask) + re->output = _xr_render_surface_adopt(re->xinf, re->win, e->output.w, e->output.h, re->destination_alpha); + else + re->output = _xr_render_surface_adopt(re->xinf, re->win, e->output.w, e->output.h, 0); + if (re->mask) + re->mask_output = _xr_render_surface_format_adopt(re->xinf, re->mask, + e->output.w, e->output.h, + re->xinf->fmt1, 1); + else + re->mask_output = NULL; + if (resize) + { + if (re->tb) evas_common_tilebuf_free(re->tb); + if ((e->output.w > 0) && (e->output.h > 0)) + re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); + else + re->tb = evas_common_tilebuf_new(1, 1); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + } +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_font_shutdown(); + evas_common_image_shutdown(); + while (re->updates) + { + Render_Engine_Update *reu; + + reu = re->updates->data; + re->updates = evas_list_remove_list(re->updates, re->updates); + _xr_render_surface_free(reu->surface); + free(reu); + } + if (re->tb) evas_common_tilebuf_free(re->tb); + if (re->output) _xr_render_surface_free(re->output); + if (re->mask_output) _xr_render_surface_free(re->mask_output); + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + if (re->xinf) _xr_image_info_free(re->xinf); + free(re); +} + +static void +eng_output_resize(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (re->output) + { + if ((re->output->w == w) && (re->output->h ==h)) return; + if (re->output) _xr_render_surface_free(re->output); + } + re->output = _xr_render_surface_adopt(re->xinf, re->win, w, h, 0); + if (re->mask_output) + { + if (re->mask_output) _xr_render_surface_free(re->mask_output); + re->mask_output = _xr_render_surface_format_adopt(re->xinf, re->mask, + w, h, + re->xinf->fmt1, 1); + } + evas_common_tilebuf_free(re->tb); + re->tb = evas_common_tilebuf_new(w, h); + if (re->tb) evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); +} + +static void +eng_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_set_tile_size(re->tb, w, h); +} + +static void +eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_clear(re->tb); +} + +static void * +eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + Tilebuf_Rect *rect; + int ux, uy, uw, uh; + + re = (Render_Engine *)data; + if (re->end) + { + re->end = 0; + return NULL; + } + if (!re->rects) + { + re->rects = evas_common_tilebuf_get_render_rects(re->tb); + re->cur_rect = (Evas_Object_List *)re->rects; + } + if (!re->cur_rect) return NULL; + rect = (Tilebuf_Rect *)re->cur_rect; + ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h; + re->cur_rect = re->cur_rect->next; + if (!re->cur_rect) + { + evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + re->end = 1; + } + + *x = ux; *y = uy; *w = uw; *h = uh; + *cx = 0; *cy = 0; *cw = uw; *ch = uh; + if ((re->destination_alpha) || (re->mask)) + { + Xrender_Surface *surface; + + surface = _xr_render_surface_new(re->xinf, uw, uh, re->xinf->fmt32, 1); + _xr_render_surface_solid_rectangle_set(surface, 0, 0, 0, 0, 0, 0, uw, uh); + return surface; + } + return _xr_render_surface_new(re->xinf, uw, uh, re->xinf->fmtdef, 0); +} + +static void +eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + Render_Engine_Update *reu; + + re = (Render_Engine *)data; + reu = malloc(sizeof(Render_Engine_Update)); + if (!reu) return; + reu->x = x; + reu->y = y; + reu->w = w; + reu->h = h; + reu->surface = (Xrender_Surface *)surface; + re->updates = evas_list_append(re->updates, reu); +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + while (re->updates) + { + Render_Engine_Update *reu; + + reu = re->updates->data; + re->updates = evas_list_remove_list(re->updates, re->updates); + if (re->mask_output) + { + Xrender_Surface *tsurf; + + _xr_render_surface_copy(reu->surface, re->output, 0, 0, + reu->x, reu->y, reu->w, reu->h); + tsurf = _xr_render_surface_new(re->xinf, reu->w, reu->h, re->xinf->fmt1, 1); + if (tsurf) + { + _xr_render_surface_copy(reu->surface, tsurf, 0, 0, + 0, 0, reu->w, reu->h); + _xr_render_surface_copy(tsurf, re->mask_output, 0, 0, + reu->x, reu->y, reu->w, reu->h); + _xr_render_surface_free(tsurf); + } + } + else + { + _xr_render_surface_copy(reu->surface, re->output, 0, 0, + reu->x, reu->y, reu->w, reu->h); + } + _xr_render_surface_free(reu->surface); + free(reu); + } + XSync(re->disp, False); + _xr_image_info_pool_flush(re->xinf, 0, 0); +} + +static void +eng_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static void +eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h) +{ + _xr_render_surface_rectangle_draw((Xrender_Surface *)surface, + (RGBA_Draw_Context *)context, + x, y, w, h); +} + +static void +eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2) +{ + _xr_render_surface_line_draw((Xrender_Surface *)surface, (RGBA_Draw_Context *)context, x1, y1, x2, y2); +} + +static void +eng_polygon_draw(void *data, void *context, void *surface, void *polygon) +{ + _xre_poly_draw((Xrender_Surface *)surface, (RGBA_Draw_Context *)context, (RGBA_Polygon_Point *)polygon); +} + +static void * +eng_gradient_new(void *data) +{ + Render_Engine *re = (Render_Engine *)data; + + return _xre_gradient_new(re->xinf); +} + +static void +eng_gradient_free(void *data, void *gradient) +{ + _xre_gradient_free(gradient); +} + +static void +eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta) +{ + _xre_gradient_color_stop_add(gradient, r, g, b, a, delta); +} + +static void +eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta) +{ + _xre_gradient_alpha_stop_add(gradient, a, delta); +} + +static void +eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha) +{ + _xre_gradient_color_data_set(gradient, map, len, has_alpha); +} + +static void +eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len) +{ + _xre_gradient_alpha_data_set(gradient, alpha_map, len); +} + +static void +eng_gradient_clear(void *data, void *gradient) +{ + _xre_gradient_clear(gradient); +} + +static void +eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h) +{ + _xre_gradient_fill_set(gradient, x, y, w, h); +} + +static void +eng_gradient_fill_angle_set(void *data, void *gradient, double angle) +{ + _xre_gradient_fill_angle_set(gradient, angle); +} + +static void +eng_gradient_fill_spread_set(void *data, void *gradient, int spread) +{ + _xre_gradient_fill_spread_set(gradient, spread); +} + +static void +eng_gradient_angle_set(void *data, void *gradient, double angle) +{ + _xre_gradient_angle_set(gradient, angle); +} + +static void +eng_gradient_offset_set(void *data, void *gradient, float offset) +{ + _xre_gradient_offset_set(gradient, offset); +} + +static void +eng_gradient_direction_set(void *data, void *gradient, int direction) +{ + _xre_gradient_direction_set(gradient, direction); +} + +static void +eng_gradient_type_set(void *data, void *gradient, char *name, char *params) +{ + _xre_gradient_type_set(gradient, name, params); +} + +static int +eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h) +{ + RGBA_Gradient *grad; + RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context; + + if (!dc || !gradient) return 0; + grad = ((XR_Gradient *)gradient)->grad; + if(!grad || !grad->type.geometer) return 0; + return !(grad->type.geometer->has_alpha(grad, dc->render_op) | + grad->type.geometer->has_mask(grad, dc->render_op)); +} + +static int +eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h) +{ + if (!context || !gradient) return 0; + return 1; +} + +static void +eng_gradient_render_pre(void *data, void *context, void *gradient) +{ + int len; + RGBA_Gradient *grad; + + if (!context || !gradient) return; + grad = ((XR_Gradient *)gradient)->grad; + if(!grad || !grad->type.geometer) return; + grad->type.geometer->geom_set(grad); + len = grad->type.geometer->get_map_len(grad); + evas_common_gradient_map(context, grad, len); +} + +static void +eng_gradient_render_post(void *data, void *gradient) +{ +} + +static void +eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h) +{ + _xre_gradient_draw(surface, context, gradient, x, y, w, h); +} + +static int +eng_image_alpha_get(void *data, void *image) +{ + if (!image) return 0; + return _xre_image_alpha_get((XR_Image *)image); +} + +static int +eng_image_colorspace_get(void *data, void *image) +{ + if (!image) return EVAS_COLORSPACE_ARGB8888; + return ((XR_Image *)image)->cs.space; +} + +static void * +eng_image_alpha_set(void *data, void *image, int has_alpha) +{ + XR_Image *im; + + im = (XR_Image *)image; + if (!im) return im; + if (im->cs.space != EVAS_COLORSPACE_ARGB8888) return im; + if (((im->alpha) && (has_alpha)) || ((!im->alpha) && (!has_alpha))) + return im; + if (im->references > 1) + { + XR_Image *old_im; + + old_im = im; + im = _xre_image_copy(old_im); + if (im) + { + im->alpha = old_im->alpha; + _xre_image_free(old_im); + } + else + im = old_im; + } + else + _xre_image_dirty(im); + _xre_image_alpha_set(im, has_alpha); + return im; +} + +static void * +eng_image_border_set(void *data, void *image, int l, int r, int t, int b) +{ + if (!image) return image; + _xre_image_border_set((XR_Image *)image, l, r, t, b); + return image; +} + +static void +eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b) +{ + if (!image) return; + _xre_image_border_get((XR_Image *)image, l, r, t, b); +} + +static char * +eng_image_comment_get(void *data, void *image, char *key) +{ + if (!image) return NULL; + return strdup(((XR_Image *)image)->comment); +} + +static char * +eng_image_format_get(void *data, void *image) +{ + if (!image) return NULL; + return ((XR_Image *)image)->format; +} + +static void +eng_image_colorspace_set(void *data, void *image, int cspace) +{ + XR_Image *im; + + if (!image) return; + im = (XR_Image *)image; + if (im->cs.space == cspace) return; + + if (im->im) evas_cache_image_drop(&im->im->cache_entry); + im->im = NULL; + + switch (cspace) + { + case EVAS_COLORSPACE_ARGB8888: + if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + im->cs.data = NULL; + im->cs.no_free = 0; + } + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if ((im->free_data) && (im->data)) free(im->data); + im->data = NULL; + if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + } + if (im->h > 0) + im->cs.data = calloc(1, im->h * sizeof(unsigned char *) * 2); + im->cs.no_free = 0; + break; + default: + abort(); + break; + } + im->cs.space = cspace; + _xre_image_dirty(im); + _xre_image_region_dirty(im, 0, 0, im->w, im->h); +} + +static void +eng_image_native_set(void *data, void *image, void *native) +{ +} + +static void * +eng_image_native_get(void *data, void *image) +{ + return NULL; +} + +static void * +eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo) +{ + Render_Engine *re; + XR_Image *im; + + re = (Render_Engine *)data; + *error = 0; + im = _xre_image_load(re->xinf, file, key, lo); + return im; +} + +static void * +eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + Render_Engine *re; + XR_Image *im; + + re = (Render_Engine *)data; + im = _xre_image_new_from_data(re->xinf, w, h, image_data, alpha, cspace); + return im; +} + +static void * +eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + Render_Engine *re; + XR_Image *im; + + re = (Render_Engine *)data; + im = _xre_image_new_from_copied_data(re->xinf, w, h, image_data, alpha, cspace); + return im; +} + +static void +eng_image_free(void *data, void *image) +{ + if (!image) return; + _xre_image_free((XR_Image *)image); +} + +static void +eng_image_size_get(void *data, void *image, int *w, int *h) +{ + if (!image) return; + if (w) *w = ((XR_Image *)image)->w; + if (h) *h = ((XR_Image *)image)->h; +} + +static void * +eng_image_size_set(void *data, void *image, int w, int h) +{ + XR_Image *im, *im_old; + + if (!image) return NULL; + im_old = image; + if ((im_old->cs.space == EVAS_COLORSPACE_YCBCR422P601_PL) || + (im_old->cs.space == EVAS_COLORSPACE_YCBCR422P709_PL)) + w &= ~0x1; + if ((im_old) && (im_old->w == w) && (im_old->h == h)) + return image; + if ((w <= 0) || (h <= 0)) + { + _xre_image_free(im_old); + return NULL; + } + if (im_old) + { + im = _xre_image_new_from_copied_data(im_old->xinf, w, h, NULL, im_old->alpha, im_old->cs.space); + _xre_image_free(im_old); + return im; + } + return image; +} + +static void * +eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h) +{ + if (!image) return image; + _xre_image_dirty((XR_Image *)image); + _xre_image_region_dirty((XR_Image *)image, x, y, w, h); + return image; +} + +static void * +eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data) +{ + XR_Image *im; + + if (!image) + { + *image_data = NULL; + return NULL; + } + im = (XR_Image *)image; + if (im->im) + evas_cache_image_load_data(&im->im->cache_entry); + switch (im->cs.space) + { + case EVAS_COLORSPACE_ARGB8888: + if (to_write) + { + if (im->references > 1) + { + XR_Image *im_old; + + im_old = im; + im = _xre_image_copy(im_old); + if (im) + _xre_image_free(im_old); + else + im = im_old; + } + else + _xre_image_dirty(im); + } + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + break; + default: + abort(); + break; + } + if (image_data) *image_data = _xre_image_data_get(im); + return im; +} + +static void * +eng_image_data_put(void *data, void *image, DATA32 *image_data) +{ + XR_Image *im; + + if (!image) return image; + im = (XR_Image *)image; + + switch (im->cs.space) + { + case EVAS_COLORSPACE_ARGB8888: + if (_xre_image_data_get(im) != image_data) + { + XR_Image *im_old; + + im_old = im; + image = _xre_image_data_find(image_data); + if (image != im_old) + { + if (!image) + { + image = _xre_image_new_from_data(im_old->xinf, im_old->w, im_old->h, image_data, im_old->alpha, EVAS_COLORSPACE_ARGB8888); + if (image) + { + ((XR_Image *)image)->alpha = im_old->alpha; + _xre_image_free(im_old); + } + else + image = im_old; + } + else + { + _xre_image_free(im_old); + } + } + else + { + _xre_image_free(image); + image = im_old; + } + } + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if (_xre_image_data_get(im) != image_data) + { + if (im->data) + { + if (im->free_data) free(im->data); + im->data = NULL; + } + if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + } + im->cs.data = image_data; + _xre_image_dirty(im); + } + break; + default: + abort(); + break; + } + return image; +} + +static void +eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth) +{ + if ((!image) || (!surface)) return; + _xre_image_surface_gen((XR_Image *)image); + if (((XR_Image *)image)->surface) + _xr_render_surface_composite(((XR_Image *)image)->surface, + (Xrender_Surface *)surface, + (RGBA_Draw_Context *)context, + src_x, src_y, src_w, src_h, + dst_x, dst_y, dst_w, dst_h, + smooth); +} + +static void +eng_image_cache_flush(void *data) +{ + int tmp_size; + + tmp_size = _xre_image_cache_get(); + pfunc.image_cache_flush(data); + _xre_image_cache_set(0); + _xre_image_cache_set(tmp_size); +} + +static void +eng_image_cache_set(void *data, int bytes) +{ + pfunc.image_cache_set(data, bytes); + _xre_image_cache_set(bytes); +} + +static int +eng_image_cache_get(void *data) +{ + return pfunc.image_cache_get(data); +} + +static void +eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text) +{ + Render_Engine *re; + RGBA_Image *im; + + re = (Render_Engine *)data; + + _xr_render_surface_clips_set((Xrender_Surface *)surface, (RGBA_Draw_Context *)context, x, y, w, h); + + im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), + ((Xrender_Surface *)surface)->w, + ((Xrender_Surface *)surface)->h, + surface, + 0, EVAS_COLORSPACE_ARGB8888); + evas_common_draw_context_font_ext_set(context, + re->xinf, + _xre_font_surface_new, + _xre_font_surface_free, + _xre_font_surface_draw); + evas_common_font_draw(im, context, font, x, y, text); + evas_common_draw_context_font_ext_set(context, + NULL, + NULL, + NULL, + NULL); + evas_common_cpu_end_opt(); + + evas_cache_image_drop(&im->cache_entry); +} + +/* module advertising code */ +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ +#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(output_flush); + ORD(output_idle_flush); + ORD(rectangle_draw); + ORD(line_draw); + ORD(polygon_draw); + ORD(gradient_new); + ORD(gradient_free); + ORD(gradient_color_stop_add); + ORD(gradient_alpha_stop_add); + ORD(gradient_color_data_set); + ORD(gradient_alpha_data_set); + ORD(gradient_clear); + ORD(gradient_fill_set); + ORD(gradient_fill_angle_set); + ORD(gradient_fill_spread_set); + ORD(gradient_angle_set); + ORD(gradient_offset_set); + ORD(gradient_direction_set); + ORD(gradient_type_set); + ORD(gradient_is_opaque); + ORD(gradient_is_visible); + ORD(gradient_render_pre); + ORD(gradient_render_post); + ORD(gradient_draw); + ORD(image_load); + ORD(image_new_from_data); + ORD(image_new_from_copied_data); + ORD(image_free); + ORD(image_size_get); + ORD(image_size_set); + ORD(image_dirty_region); + ORD(image_data_get); + ORD(image_data_put); + ORD(image_alpha_set); + ORD(image_alpha_get); + ORD(image_border_set); + ORD(image_border_get); + ORD(image_draw); + ORD(image_comment_get); + ORD(image_format_get); + ORD(image_colorspace_set); + ORD(image_colorspace_get); + ORD(image_native_set); + ORD(image_native_get); + ORD(image_cache_flush); + ORD(image_cache_set); + ORD(image_cache_get); + ORD(font_draw); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "xrender_x11", + "none" +}; + diff --git a/src/modules/engines/xrender_x11/evas_engine.h b/src/modules/engines/xrender_x11/evas_engine.h new file mode 100644 index 0000000..08be334 --- /dev/null +++ b/src/modules/engines/xrender_x11/evas_engine.h @@ -0,0 +1,176 @@ +#ifndef EVAS_ENGINE_H +#define EVAS_ENGINE_H + +#include +#include +#include +#include +#include +#include +#include + +typedef struct _Ximage_Info Ximage_Info; +typedef struct _Ximage_Image Ximage_Image; +typedef struct _Xrender_Surface Xrender_Surface; + +struct _Ximage_Info +{ + Display *disp; + Drawable root; + Drawable draw; + int depth; + Visual *vis; + int pool_mem; + Evas_List *pool; + unsigned char can_do_shm; + XRenderPictFormat *fmt32; + XRenderPictFormat *fmt24; + XRenderPictFormat *fmt8; + XRenderPictFormat *fmt4; + XRenderPictFormat *fmt1; + XRenderPictFormat *fmtdef; + unsigned char mul_r, mul_g, mul_b, mul_a; + Xrender_Surface *mul; + int references; +}; + +struct _Ximage_Image +{ + Ximage_Info *xinf; + XImage *xim; + XShmSegmentInfo *shm_info; + int w, h; + int depth; + int line_bytes; + unsigned char *data; + unsigned char available : 1; +}; + +struct _Xrender_Surface +{ + Ximage_Info *xinf; + int w, h; + int depth; + XRenderPictFormat *fmt; + Drawable draw; + Picture pic; + unsigned char alpha : 1; + unsigned char allocated : 1; + unsigned char bordered : 1; +}; + +/* ximage support calls (ximage vs xshmimage, cache etc.) */ +Ximage_Info *_xr_image_info_get(Display *disp, Drawable draw, Visual *vis); +void _xr_image_info_free(Ximage_Info *xinf); +void _xr_image_info_pool_flush(Ximage_Info *xinf, int max_num, int max_mem); +Ximage_Image *_xr_image_new(Ximage_Info *xinf, int w, int h, int depth); +void _xr_image_free(Ximage_Image *xim); +void _xr_image_put(Ximage_Image *xim, Drawable draw, int x, int y, int w, int h); + +/* xrender support calls */ +Xrender_Surface *_xr_render_surface_new(Ximage_Info *xinf, int w, int h, XRenderPictFormat *fmt, int alpha); +Xrender_Surface *_xr_render_surface_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, int alpha); +Xrender_Surface *_xr_render_surface_format_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, XRenderPictFormat *fmt, int alpha); +void _xr_render_surface_free(Xrender_Surface *rs); +void _xr_render_surface_repeat_set(Xrender_Surface *rs, int repeat); +void _xr_render_surface_solid_rectangle_set(Xrender_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h); +void _xr_render_surface_argb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy); +void _xr_render_surface_rgb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy); +void _xr_render_surface_clips_set(Xrender_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh); +void _xr_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth); +void _xr_render_surface_copy(Xrender_Surface *srs, Xrender_Surface *drs, int sx, int sy, int x, int y, int w, int h); +void _xr_render_surface_rectangle_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h); +void _xr_render_surface_line_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2); +void _xre_poly_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points); + + +typedef struct _XR_Image XR_Image; + +struct _XR_Image +{ + Ximage_Info *xinf; + const char *file; + const char *key; + char *fkey; + RGBA_Image *im; + void *data; + int w, h; + Xrender_Surface *surface; + int references; + char *format; + const char *comment; + Tilebuf *updates; + RGBA_Image_Loadopts load_opts; + struct { + int space; + void *data; + unsigned char no_free : 1; + } cs; + unsigned char alpha : 1; + unsigned char dirty : 1; + unsigned char free_data : 1; +}; + +XR_Image *_xre_image_load(Ximage_Info *xinf, const char *file, const char *key, Evas_Image_Load_Opts *lo); +XR_Image *_xre_image_new_from_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace); +XR_Image *_xre_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace); +XR_Image *_xre_image_new(Ximage_Info *xinf, int w, int h); +void _xre_image_resize(XR_Image *im, int w, int h); +void _xre_image_free(XR_Image *im); +void _xre_image_region_dirty(XR_Image *im, int x, int y, int w, int h); +void _xre_image_dirty(XR_Image *im); +XR_Image *_xre_image_copy(XR_Image *im); +void *_xre_image_data_get(XR_Image *im); +XR_Image *_xre_image_data_find(void *data); +void _xre_image_data_put(XR_Image *im, void *data); +void _xre_image_alpha_set(XR_Image *im, int alpha); +int _xre_image_alpha_get(XR_Image *im); +void _xre_image_border_set(XR_Image *im, int l, int r, int t, int b); +void _xre_image_border_get(XR_Image *im, int *l, int *r, int *t, int *b); +void _xre_image_surface_gen(XR_Image *im); +void _xre_image_cache_set(int size); +int _xre_image_cache_get(void); + +typedef struct _XR_Font_Surface XR_Font_Surface; + +struct _XR_Font_Surface +{ + Ximage_Info *xinf; + RGBA_Font_Glyph *fg; + int w, h; + Drawable draw; + Picture pic; +}; + +XR_Font_Surface *_xre_font_surface_new(Ximage_Info *xinf, RGBA_Font_Glyph *fg); +void _xre_font_surface_free(XR_Font_Surface *fs); +void _xre_font_surface_draw(Ximage_Info *xinf, RGBA_Image *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y); + +typedef struct _XR_Gradient XR_Gradient; + +struct _XR_Gradient +{ + Ximage_Info *xinf; + Xrender_Surface *surface; + RGBA_Gradient *grad; + unsigned char changed : 1; + int sw, sh; +}; + +XR_Gradient *_xre_gradient_new(Ximage_Info *xinf); +void _xre_gradient_free(XR_Gradient *gr); +void _xre_gradient_color_stop_add(XR_Gradient *gr, int r, int g, int b, int a, int delta); +void _xre_gradient_alpha_stop_add(XR_Gradient *gr, int a, int delta); +void _xre_gradient_color_data_set(XR_Gradient *gr, void *map, int len, int has_alpha); +void _xre_gradient_alpha_data_set(XR_Gradient *gr, void *alpha_map, int len); +void _xre_gradient_clear(XR_Gradient *gr); +void _xre_gradient_fill_set(XR_Gradient *gr, int x, int y, int w, int h); +void _xre_gradient_fill_angle_set(XR_Gradient *gr, double angle); +void _xre_gradient_fill_spread_set(XR_Gradient *gr, int spread); +void _xre_gradient_angle_set(XR_Gradient *gr, double angle); +void _xre_gradient_offset_set(XR_Gradient *gr, float offset); +void _xre_gradient_direction_set(XR_Gradient *gr, int direction); +void _xre_gradient_type_set(XR_Gradient *gr, char *name, char *params); +void _xre_gradient_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, XR_Gradient *gr, int x, int y, int w, int h); + +#endif diff --git a/src/modules/engines/xrender_x11/evas_engine_font.c b/src/modules/engines/xrender_x11/evas_engine_font.c new file mode 100644 index 0000000..3f191d2 --- /dev/null +++ b/src/modules/engines/xrender_x11/evas_engine_font.c @@ -0,0 +1,191 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_XRender_X11.h" + +static Evas_Hash *_xr_fg_pool = NULL; + +XR_Font_Surface * +_xre_font_surface_new(Ximage_Info *xinf, RGBA_Font_Glyph *fg) +{ + XR_Font_Surface *fs; + DATA8 *data; + int w, h, j; + XRenderPictureAttributes att; + XRenderPictFormat *fmt; + Ximage_Image *xim; + Evas_Hash *pool; + char buf[256], buf2[256]; + + data = fg->glyph_out->bitmap.buffer; + w = fg->glyph_out->bitmap.width; + h = fg->glyph_out->bitmap.rows; + j = fg->glyph_out->bitmap.pitch; + if (j < w) j = w; + if ((w <= 0) || (h <= 0)) return NULL; + + if (fg->ext_dat) + { + fs = fg->ext_dat; + if ((fs->xinf->disp == xinf->disp) && (fs->xinf->root == xinf->root)) + return fs; + snprintf(buf, sizeof(buf), "@%p@/@%lx@", fs->xinf->disp, fs->xinf->root); + pool = evas_hash_find(_xr_fg_pool, buf); + if (pool) + { + snprintf(buf, sizeof(buf), "%p", fg); + fs = evas_hash_find(pool, buf); + if (fs) return fs; + } + } + + fs = calloc(1, sizeof(XR_Font_Surface)); + if (!fs) return NULL; + + fs->xinf = xinf; + fs->fg = fg; + fs->xinf->references++; + fs->w = w; + fs->h = h; + + snprintf(buf, sizeof(buf), "@%p@/@%lx@", fs->xinf->disp, fs->xinf->root); + pool = evas_hash_find(_xr_fg_pool, buf); + snprintf(buf2, sizeof(buf2), "%p", fg); + pool = evas_hash_add(pool, buf2, fs); + _xr_fg_pool = evas_hash_add(_xr_fg_pool, buf, pool); + + /* FIXME: maybe use fmt4? */ + fmt = xinf->fmt8; + fs->draw = XCreatePixmap(xinf->disp, xinf->root, w, h,fmt->depth); + att.dither = 0; + att.component_alpha = 0; + att.repeat = 0; + fs->pic = XRenderCreatePicture(xinf->disp, fs->draw,fmt, + CPRepeat | CPDither | CPComponentAlpha, &att); + + /* FIXME: handle if fmt->depth != 8 */ + xim = _xr_image_new(fs->xinf, w, h,fmt->depth); + if ((fg->glyph_out->bitmap.num_grays == 256) && + (fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays)) + { + int x, y; + DATA8 *p1, *p2; + + for (y = 0; y < h; y++) + { + p1 = data + (j * y); + p2 = ((DATA8 *)xim->data) + (xim->line_bytes * y); + for (x = 0; x < w; x++) + { + *p2 = *p1; + p1++; + p2++; + } + } + + } + else + { + DATA8 *tmpbuf = NULL, *dp, *tp, bits; + int bi, bj, end; + const DATA8 bitrepl[2] = {0x0, 0xff}; + + tmpbuf = alloca(w); + { + int x, y; + DATA8 *p1, *p2; + + for (y = 0; y < h; y++) + { + p1 = tmpbuf; + p2 = ((DATA8 *)xim->data) + (xim->line_bytes * y); + tp = tmpbuf; + dp = data + (y * fg->glyph_out->bitmap.pitch); + for (bi = 0; bi < w; bi += 8) + { + bits = *dp; + if ((w - bi) < 8) end = w - bi; + else end = 8; + for (bj = 0; bj < end; bj++) + { + *tp = bitrepl[(bits >> (7 - bj)) & 0x1]; + tp++; + } + dp++; + } + for (x = 0; x < w; x++) + { + *p2 = *p1; + p1++; + p2++; + } + } + } + } + _xr_image_put(xim, fs->draw, 0, 0, w, h); + return fs; +} + +static Evas_Bool +_xre_font_pool_cb(const Evas_Hash *hash, const char *key, void *data, void *fdata) +{ + Evas_Hash *pool; + XR_Font_Surface *fs; + char buf[256]; + + fs = fdata; + pool = data; + snprintf(buf, sizeof(buf), "@%p@/@%lx@", fs->xinf->disp, fs->xinf->root); + pool = evas_hash_del(pool, buf, fs); + hash = evas_hash_modify(hash, key, pool); + return 1; +} + +void +_xre_font_surface_free(XR_Font_Surface *fs) +{ + if (!fs) return; + evas_hash_foreach(_xr_fg_pool, _xre_font_pool_cb, fs); + XFreePixmap(fs->xinf->disp, fs->draw); + XRenderFreePicture(fs->xinf->disp, fs->pic); + _xr_image_info_free(fs->xinf); + free(fs); +} + +void +_xre_font_surface_draw(Ximage_Info *xinf, RGBA_Image *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y) +{ + XR_Font_Surface *fs; + Xrender_Surface *target_surface; + XRectangle rect; + int r, g, b, a; + + fs = fg->ext_dat; + if (!fs || !fs->xinf || !dc || !dc->col.col) return; + if (!surface || !surface->image.data) return; + target_surface = (Xrender_Surface *)(surface->image.data); + a = (dc->col.col >> 24) & 0xff; + r = (dc->col.col >> 16) & 0xff; + g = (dc->col.col >> 8 ) & 0xff; + b = (dc->col.col ) & 0xff; + if ((fs->xinf->mul_r != r) || (fs->xinf->mul_g != g) || + (fs->xinf->mul_b != b) || (fs->xinf->mul_a != a)) + { + fs->xinf->mul_r = r; + fs->xinf->mul_g = g; + fs->xinf->mul_b = b; + fs->xinf->mul_a = a; + _xr_render_surface_solid_rectangle_set(fs->xinf->mul, r, g, b, a, 0, 0, 1, 1); + } + rect.x = x; rect.y = y; rect.width = fs->w; rect.height = fs->h; + if (dc->clip.use) + { + RECTS_CLIP_TO_RECT(rect.x, rect.y, rect.width, rect.height, + dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h); + } + XRenderSetPictureClipRectangles(target_surface->xinf->disp, + target_surface->pic, 0, 0, &rect, 1); + XRenderComposite(fs->xinf->disp, PictOpOver, fs->xinf->mul->pic, + fs->pic, target_surface->pic, + 0, 0, 0, 0, x, y, fs->w, fs->h); +} diff --git a/src/modules/engines/xrender_x11/evas_engine_gradient.c b/src/modules/engines/xrender_x11/evas_engine_gradient.c new file mode 100644 index 0000000..30515b5 --- /dev/null +++ b/src/modules/engines/xrender_x11/evas_engine_gradient.c @@ -0,0 +1,209 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_XRender_X11.h" +#include + +XR_Gradient * +_xre_gradient_new(Ximage_Info *xinf) +{ + XR_Gradient *gr; + + if (!xinf) return NULL; + gr = calloc(1, sizeof(XR_Gradient)); + if (!gr) return NULL; + gr->grad = evas_common_gradient_new(); + if (!gr->grad) + { + free(gr); + return NULL; + } + gr->xinf = xinf; + gr->xinf->references++; + gr->changed = 1; + return gr; +} + +void +_xre_gradient_free(XR_Gradient *gr) +{ + if (!gr) return; + if (gr->grad) + evas_common_gradient_free(gr->grad); + if (gr->surface) + _xr_render_surface_free(gr->surface); + _xr_image_info_free(gr->xinf); + free(gr); +} + +void +_xre_gradient_color_stop_add(XR_Gradient *gr, int r, int g, int b, int a, int delta) +{ + if (!gr) return; + evas_common_gradient_color_stop_add(gr->grad, r, g, b, a, delta); + gr->changed = 1; +} + +void +_xre_gradient_alpha_stop_add(XR_Gradient *gr, int a, int delta) +{ + if (!gr) return; + evas_common_gradient_alpha_stop_add(gr->grad, a, delta); + gr->changed = 1; +} + +void +_xre_gradient_clear(XR_Gradient *gr) +{ + if (!gr) return; + evas_common_gradient_clear(gr->grad); + gr->changed = 1; +} + +void +_xre_gradient_color_data_set(XR_Gradient *gr, void *map, int len, int has_alpha) +{ + evas_common_gradient_color_data_set(gr->grad, map, len, has_alpha); + gr->changed = 1; +} + +void +_xre_gradient_alpha_data_set(XR_Gradient *gr, void *amap, int len) +{ + evas_common_gradient_alpha_data_set(gr->grad, amap, len); + gr->changed = 1; +} + +void +_xre_gradient_fill_set(XR_Gradient *gr, int x, int y, int w, int h) +{ + if (!gr) return; + evas_common_gradient_fill_set(gr->grad, x, y, w, h); + gr->changed = 1; +} + +void +_xre_gradient_fill_angle_set(XR_Gradient *gr, double angle) +{ + if (!gr) return; + evas_common_gradient_fill_angle_set(gr->grad, angle); + gr->changed = 1; +} + +void +_xre_gradient_fill_spread_set(XR_Gradient *gr, int spread) +{ + if (!gr) return; + evas_common_gradient_fill_spread_set(gr->grad, spread); + gr->changed = 1; +} + +void +_xre_gradient_angle_set(XR_Gradient *gr, double angle) +{ + if (!gr) return; + evas_common_gradient_map_angle_set(gr->grad, angle); + gr->changed = 1; +} + +void +_xre_gradient_offset_set(XR_Gradient *gr, float offset) +{ + if (!gr) return; + evas_common_gradient_map_offset_set(gr->grad, offset); + gr->changed = 1; +} + +void +_xre_gradient_direction_set(XR_Gradient *gr, int direction) +{ + if (!gr) return; + evas_common_gradient_map_direction_set(gr->grad, direction); + gr->changed = 1; +} + +void +_xre_gradient_type_set(XR_Gradient *gr, char *name, char *params) +{ + if (!gr) return; + evas_common_gradient_type_set(gr->grad, name, params); + gr->changed = 1; +} + +void +_xre_gradient_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, XR_Gradient *gr, int x, int y, int w, int h) +{ + int alpha = 0; + + if ((w < 1) || (h < 1)) return; + if (!rs || !dc || !gr) return; + if (!gr->xinf || !gr->grad || !gr->grad->type.geometer) return; + + if (gr->grad->type.geometer->has_alpha(gr->grad, dc->render_op) || + gr->grad->type.geometer->has_mask(gr->grad, dc->render_op)) + alpha = 1; + if (((gr->sw != w) || (gr->sh != h)) && gr->surface) + { + _xr_render_surface_free(gr->surface); + gr->surface = NULL; + gr->changed = 1; + } + if (!gr->surface) + { + gr->surface = _xr_render_surface_new(gr->xinf, w, h, gr->xinf->fmt32, 1); + if (!gr->surface) return; + gr->changed = 1; + } + if (gr->changed) + { + int op = dc->render_op, cuse = dc->clip.use; + RGBA_Image *im; + Ximage_Image *xim; + + xim = _xr_image_new(gr->xinf, w, h, gr->surface->depth); + if (!xim) + { + _xr_render_surface_free(gr->surface); + gr->surface = NULL; + return; + } + + im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), + w, h, + (DATA32 *)xim->data, + 1, EVAS_COLORSPACE_ARGB8888); + if (!im) + { + /* FIXME: xim is leaking. */ + _xr_render_surface_free(gr->surface); + gr->surface = NULL; + return; + } + + dc->render_op = _EVAS_RENDER_FILL; + dc->clip.use = 0; + evas_common_gradient_draw(im, dc, 0, 0, w, h, gr->grad); + if +#ifdef WORDS_BIGENDIAN + (xim->xim->byte_order == LSBFirst) +#else + (xim->xim->byte_order == MSBFirst) +#endif + { + DATA32 *p = im->image.data, *pe = p + (w * h); + while (p < pe) + { + *p = (*p << 24) + ((*p << 8) & 0xff0000) + ((*p >> 8) & 0xff00) + (*p >> 24); + p++; + } + } + _xr_image_put(xim, gr->surface->draw, 0, 0, w, h); + evas_cache_image_drop(&im->cache_entry); + dc->render_op = op; + dc->clip.use = cuse; + } + gr->surface->alpha = alpha; + _xr_render_surface_composite(gr->surface, rs, dc, 0, 0, gr->surface->w, gr->surface->h, x, y, w, h, 0); + gr->changed = 0; + gr->sw = w; gr->sh = h; +} diff --git a/src/modules/engines/xrender_x11/evas_engine_image.c b/src/modules/engines/xrender_x11/evas_engine_image.c new file mode 100644 index 0000000..1fa20c5 --- /dev/null +++ b/src/modules/engines/xrender_x11/evas_engine_image.c @@ -0,0 +1,690 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_XRender_X11.h" + +static Evas_Hash *_xr_image_hash = NULL; +static int _xr_image_cache_size = 0; +static int _xr_image_cache_usage = 0; +static Evas_List *_xr_image_cache = NULL; +static Evas_Hash *_xr_image_dirty_hash = NULL; + +static void +__xre_image_dirty_hash_add(XR_Image *im) +{ + char buf[64]; + + if (!im->data) return; + snprintf(buf, sizeof(buf), "%p", im->data); + _xr_image_dirty_hash = evas_hash_add(_xr_image_dirty_hash, buf, im); +} + +static void +__xre_image_dirty_hash_del(XR_Image *im) +{ + char buf[64]; + + if (!im->data) return; + snprintf(buf, sizeof(buf), "%p", im->data); + _xr_image_dirty_hash = evas_hash_del(_xr_image_dirty_hash, buf, im); +} + +static XR_Image * +__xre_image_dirty_hash_find(void *data) +{ + char buf[64]; + + snprintf(buf, sizeof(buf), "%p", data); + return evas_hash_find(_xr_image_dirty_hash, buf); +} + +static XR_Image * +__xre_image_find(char *fkey) +{ + XR_Image *im; + + im = evas_hash_find(_xr_image_hash, fkey); + if (!im) + { + Evas_List *l; + + for (l = _xr_image_cache; l; l = l->next) + { + im = l->data; + if (!strcmp(im->fkey, fkey)) + { + _xr_image_cache = evas_list_remove_list(_xr_image_cache, l); + _xr_image_hash = evas_hash_add(_xr_image_hash, im->fkey, im); + _xr_image_cache_usage -= (im->w * im->h * 4); + break; + } + im = NULL; + } + } + if (im) im->references++; + return im; +} + +XR_Image * +_xre_image_load(Ximage_Info *xinf, const char *file, const char *key, Evas_Image_Load_Opts *lo) +{ + XR_Image *im; + char buf[4096]; + + if (!file) return NULL; + if (!lo) + { + if (key) + snprintf(buf, sizeof(buf), "/@%p@%lx@/%s//://%s", xinf->disp, xinf->root, file, key); + else + snprintf(buf, sizeof(buf), "/@%p@%lx@/%s", xinf->disp, xinf->root, file); + } + else + { + if (key) + snprintf(buf, sizeof(buf), "//@/%i/%1.5f/%ix%i//@%p@%lx@/%s//://%s", lo->scale_down_by, lo->dpi, lo->w, lo->h, xinf->disp, xinf->root, file, key); + else + snprintf(buf, sizeof(buf), "//@/%i/%1.5f/%ix%i//@%p@%lx@/%s", lo->scale_down_by, lo->dpi, lo->w, lo->h, xinf->disp, xinf->root, file); + } + im = __xre_image_find(buf); + if (im) + { + return im; + } + + im = calloc(1, sizeof(XR_Image)); + if (!im) return NULL; + im->im = evas_common_load_image_from_file(file, key, lo); + if (!im->im) + { + free(im); + return NULL; + } + im->xinf = xinf; + im->xinf->references++; + im->cs.space = EVAS_COLORSPACE_ARGB8888; + im->fkey = strdup(buf); + im->file = evas_stringshare_add(file); + if (key) im->key = evas_stringshare_add(key); + im->w = im->im->cache_entry.w; + im->h = im->im->cache_entry.h; + im->references = 1; + if (lo) im->load_opts = *lo; + if (im->im->info.comment) im->comment = evas_stringshare_add(im->im->info.comment); +// if (im->im->info.format == 1) im->format = evas_stringshare_add("png"); + if (im->im->cache_entry.flags.alpha) im->alpha = 1; + _xr_image_hash = evas_hash_direct_add(_xr_image_hash, im->fkey, im); + return im; +} + +XR_Image * +_xre_image_new_from_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace) +{ + XR_Image *im; + + im = calloc(1, sizeof(XR_Image)); + if (!im) return NULL; + im->xinf = xinf; + im->xinf->references++; + im->cs.space = cspace; + im->w = w; + im->h = h; + im->references = 1; + switch (im->cs.space) + { + case EVAS_COLORSPACE_ARGB8888: + im->data = data; + im->alpha = alpha; + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + im->cs.data = data; + im->cs.no_free = 1; + break; + default: + abort(); + break; + } + im->dirty = 1; + __xre_image_dirty_hash_add(im); + return im; +} + +XR_Image * +_xre_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, int cspace) +{ + XR_Image *im; + + im = calloc(1, sizeof(XR_Image)); + if (!im) return NULL; + im->cs.space = cspace; + switch (im->cs.space) + { + case EVAS_COLORSPACE_ARGB8888: + im->data = malloc(w * h * 4); + if (!im->data) + { + free(im); + return NULL; + } + if (data) + { + Gfx_Func_Copy func; + + func = evas_common_draw_func_copy_get(w * h, 0); + if (func) func(data, im->data, w * h); + evas_common_cpu_end_opt(); + } + im->alpha = alpha; + im->free_data = 1; + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + im->cs.no_free = 0; + im->cs.data = calloc(1, h * sizeof(unsigned char *) * 2); + if ((data) && (im->cs.data)) + memcpy(im->cs.data, data, h * sizeof(unsigned char *) * 2); + break; + default: + abort(); + break; + } + im->w = w; + im->h = h; + im->references = 1; + im->xinf = xinf; + im->xinf->references++; + im->dirty = 1; + __xre_image_dirty_hash_add(im); + return im; +} + +XR_Image * +_xre_image_new(Ximage_Info *xinf, int w, int h) +{ + XR_Image *im; + + im = calloc(1, sizeof(XR_Image)); + if (!im) return NULL; + im->data = malloc(w * h * 4); + if (!im->data) + { + free(im); + return NULL; + } + im->w = w; + im->h = h; + im->references = 1; + im->cs.space = EVAS_COLORSPACE_ARGB8888; + im->xinf = xinf; + im->xinf->references++; + im->free_data = 1; + im->alpha = 1; + im->dirty = 1; + __xre_image_dirty_hash_add(im); + return im; +} + +static void +__xre_image_real_free(XR_Image *im) +{ + if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + } + if (im->file) evas_stringshare_del(im->file); + if (im->key) evas_stringshare_del(im->key); + if (im->fkey) free(im->fkey); + if (im->im) evas_cache_image_drop(&im->im->cache_entry); + if ((im->data) && (im->dirty)) __xre_image_dirty_hash_del(im); + if ((im->free_data) && (im->data)) free(im->data); + if (im->surface) _xr_render_surface_free(im->surface); + if (im->format) evas_stringshare_del(im->format); + if (im->comment) evas_stringshare_del(im->comment); + if (im->updates) evas_common_tilebuf_free(im->updates); + _xr_image_info_free(im->xinf); + free(im); +} + +void +_xre_image_free(XR_Image *im) +{ + im->references--; + if (im->references != 0) return; + if (!im->dirty) + { + if (im->fkey) + _xr_image_hash = evas_hash_del(_xr_image_hash, im->fkey, im); + _xr_image_cache = evas_list_prepend(_xr_image_cache, im); + _xr_image_cache_usage += (im->w * im->h * 4); + _xre_image_cache_set(_xr_image_cache_size); + } + else + { + __xre_image_real_free(im); + } +} + +void +_xre_image_region_dirty(XR_Image *im, int x, int y, int w, int h) +{ + if (!im->updates) + { + im->updates = evas_common_tilebuf_new(im->w, im->h); + if (im->updates) evas_common_tilebuf_set_tile_size(im->updates, 8, 8); + } + if (im->updates) + evas_common_tilebuf_add_redraw(im->updates, x, y, w, h); +} + +void +_xre_image_dirty(XR_Image *im) +{ + if (im->dirty) return; + if (im->fkey) + _xr_image_hash = evas_hash_del(_xr_image_hash, im->fkey, im); + im->dirty = 1; + __xre_image_dirty_hash_add(im); +} + +XR_Image * +_xre_image_copy(XR_Image *im) +{ + XR_Image *im2; + void *data = NULL; + + if (im->data) data = im->data; + else if (im->cs.data) data = im->cs.data; + else + { + if (!im->im) + im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts)); + if (im->im) + { + evas_cache_image_load_data(&im->im->cache_entry); + data = im->im->image.data; + } + } + if (!data) return NULL; + im2 = _xre_image_new_from_copied_data(im->xinf, im->w, im->h, data, im->alpha, im->cs.space); + return im2; +} + +void +_xre_image_resize(XR_Image *im, int w, int h) +{ + if ((w == im->w) && (h == im->h)) return; + if (im->surface) + { + Xrender_Surface *old_surface; + old_surface = im->surface; + im->surface = _xr_render_surface_new(old_surface->xinf, w + 2, h + 2, old_surface->fmt, old_surface->alpha); + _xr_render_surface_free(old_surface); + } + switch (im->cs.space) + { + case EVAS_COLORSPACE_ARGB8888: + if (im->data) + { + if (im->free_data) + { + if (im->data) free(im->data); + im->data = malloc(w * h * 4); + } + } + else if (im->im) + { + evas_cache_image_drop(&im->im->cache_entry); + im->im = NULL; + if (im->free_data) + { + if (im->data) free(im->data); + im->data = malloc(w * h * 4); + } + } + else + { + im->data = malloc(w * h * 4); + im->free_data = 1; + } + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if (im->data) + { + if (im->free_data) + { + if (im->data) free(im->data); + } + im->data = NULL; + } + if (im->im) + { + evas_cache_image_drop(&im->im->cache_entry); + im->im = NULL; + } + if (!im->cs.no_free) + { + if (im->cs.data) free(im->cs.data); + im->cs.data = calloc(1, h * sizeof(unsigned char *) * 2); + } + break; + default: + abort(); + break; + } + __xre_image_dirty_hash_del(im); + __xre_image_dirty_hash_add(im); + im->w = w; + im->h = h; +} + +void * +_xre_image_data_get(XR_Image *im) +{ + void *data = NULL; + + if (im->data) data = im->data; + else if (im->cs.data) data = im->cs.data; + else + { + if (!im->im) im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts)); + if (im->im) + { + evas_cache_image_load_data(&im->im->cache_entry); + data = im->im->image.data; + } + } + return data; +} + +XR_Image * +_xre_image_data_find(void *data) +{ + XR_Image *im; + + im = __xre_image_dirty_hash_find(data); + if (im) + { + im->references++; + } + return im; +} + +void +_xre_image_data_put(XR_Image *im, void *data) +{ + if (!data) return; + switch (im->cs.space) + { + case EVAS_COLORSPACE_ARGB8888: + if (im->im) + { + if (data == im->im->image.data) return; + evas_cache_image_drop(&im->im->cache_entry); + im->im = NULL; + } + if (im->cs.data == data) return; + if (im->data) + { + if (im->data == data) return; + if (im->free_data) free(im->data); + im->free_data = 0; + } + im->data = data; + im->free_data = 0; + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if (im->data) + { + if (im->free_data) free(im->data); + im->data = NULL; + } + im->free_data = 0; + if (data == im->cs.data) return; + if (!im->cs.no_free) + { + if (im->cs.data) free(im->cs.data); + } + im->cs.data = data; + break; + default: + abort(); + break; + } + __xre_image_dirty_hash_del(im); + __xre_image_dirty_hash_add(im); + if (im->surface) + { + _xr_render_surface_free(im->surface); + im->surface = NULL; + } + if (!im->dirty) + { + if (im->fkey) + _xr_image_hash = evas_hash_del(_xr_image_hash, im->fkey, im); + im->dirty = 1; + } + if (im->updates) + { + evas_common_tilebuf_free(im->updates); + im->updates = NULL; + } +} + +void +_xre_image_alpha_set(XR_Image *im, int alpha) +{ + if (im->alpha == alpha) return; + switch (im->cs.space) + { + case EVAS_COLORSPACE_ARGB8888: + im->alpha = alpha; + if (im->surface) + { + Xrender_Surface *old_surface; + + old_surface = im->surface; + im->surface = NULL; + if (im->alpha) + im->surface = _xr_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->fmt32, 1); + else + { + /* FIXME: if im->depth == 16, use xinf->fmtdef */ + if ((im->xinf->depth == 16) && + (im->xinf->vis->red_mask == 0xf800) && + (im->xinf->vis->green_mask == 0x07e0) && + (im->xinf->vis->blue_mask == 0x001f)) + im->surface = _xr_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->fmtdef, 0); + else + im->surface = _xr_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->fmt24, 0); + } + if (im->surface) + _xr_render_surface_copy(old_surface, im->surface, 0, 0, 0, 0, im->w + 2, im->h + 2); + _xr_render_surface_free(old_surface); + } + if (im->updates) + { + evas_common_tilebuf_free(im->updates); + im->updates = NULL; + } + default: + break; + } +} + +int +_xre_image_alpha_get(XR_Image *im) +{ + if (im->im) + { + if (im->im->cache_entry.space != EVAS_COLORSPACE_ARGB8888) return 0; + } + return im->alpha; +} + +void +_xre_image_border_set(XR_Image *im, int l, int r, int t, int b) +{ + if (!im) return; + _xre_image_surface_gen(im); + if (l < 1) l = 0; + if (r < 1) r = 0; + if (t < 1) t = 0; + if (b < 1) b = 0; + if (im->surface) + { + if (l | r | t | b) + im->surface->bordered = 1; + else + im->surface->bordered = 0; + } +} + +void +_xre_image_border_get(XR_Image *im, int *l, int *r, int *t, int *b) +{ +} + +void +_xre_image_surface_gen(XR_Image *im) +{ + void *data = NULL, *tdata = NULL; + + if ((im->surface) && (!im->updates)) return; + if (im->data) data = im->data; + else + { + if (!im->im) im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts)); + if (im->im) + { + evas_cache_image_load_data(&im->im->cache_entry); + data = im->im->image.data; + } + } + if (!data) + { + switch (im->cs.space) + { + case EVAS_COLORSPACE_ARGB8888: + return; + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if ((im->cs.data) && (*((unsigned char **)im->cs.data))) + { + tdata = malloc(im->w * im->h * sizeof(DATA32)); + if (tdata) + evas_common_convert_yuv_420p_601_rgba(im->cs.data, + tdata, + im->w, im->h); + data = tdata; + } + break; + default: + abort(); + break; + } + if (!data) return; + } + if (im->surface) + { + if (im->updates) + { + Tilebuf_Rect *rects, *r; + + rects = evas_common_tilebuf_get_render_rects(im->updates); + if (rects) + { + for (r = rects; r; r = (Tilebuf_Rect *)((Evas_Object_List *)r)->next) + { + int rx, ry, rw, rh; + + rx = r->x; ry = r->y; rw = r->w, rh = r->h; + RECTS_CLIP_TO_RECT(rx, ry, rw, rh, 0, 0, im->w, im->h); + if (im->alpha) + _xr_render_surface_argb_pixels_fill(im->surface, im->w, im->h, data, rx, ry, rw, rh, 1, 1); + else + /* FIXME: if im->depth == 16 - convert to 16bpp then + * upload */ + _xr_render_surface_rgb_pixels_fill(im->surface, im->w, im->h, data, rx, ry, rw, rh, 1, 1); + } + evas_common_tilebuf_free_render_rects(rects); + } + evas_common_tilebuf_free(im->updates); + im->updates = NULL; + } + if (tdata) free(tdata); + return; + } + if (im->alpha) + { + im->surface = _xr_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->fmt32, 1); + _xr_render_surface_argb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h, 1, 1); + } + else + { + /* FIXME: if im->xinf->depth == 16, use xinf->fmtdef */ + if ((im->xinf->depth == 16) && + (im->xinf->vis->red_mask == 0xf800) && + (im->xinf->vis->green_mask == 0x07e0) && + (im->xinf->vis->blue_mask == 0x001f)) + im->surface = _xr_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->fmtdef, 0); + else + im->surface = _xr_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->fmt24, 0); + /* FIXME: if im->depth == 16 - convert to 16bpp then + * upload */ + _xr_render_surface_rgb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h, 1, 1); + } + /* fill borders */ + _xr_render_surface_copy(im->surface, im->surface, + 1, 1, + 0, 1, + 1, im->h); + _xr_render_surface_copy(im->surface, im->surface, + 0, 1, + 0, 0, + im->w + 2, 1); + _xr_render_surface_copy(im->surface, im->surface, + im->w, 1, + im->w + 1, 1, + 1, im->h); + _xr_render_surface_copy(im->surface, im->surface, + 0, im->h, + 0, im->h + 1, + im->w + 2, 1); + if ((im->im) && (!im->dirty)) + { + evas_cache_image_drop(&im->im->cache_entry); + im->im = NULL; + } + if (tdata) free(tdata); +} + +void +_xre_image_cache_set(int size) +{ + _xr_image_cache_size = size; + while (_xr_image_cache_usage > _xr_image_cache_size) + { + Evas_List *l; + + l = evas_list_last(_xr_image_cache); + if (l) + { + XR_Image *im; + + im = l->data; + _xr_image_cache = evas_list_remove_list(_xr_image_cache, l); + _xr_image_cache_usage -= (im->w * im->h * 4); + __xre_image_real_free(im); + } + } +} + +int +_xre_image_cache_get(void) +{ + return _xr_image_cache_size; +} diff --git a/src/modules/engines/xrender_x11/evas_engine_ximage.c b/src/modules/engines/xrender_x11/evas_engine_ximage.c new file mode 100644 index 0000000..81470bb --- /dev/null +++ b/src/modules/engines/xrender_x11/evas_engine_ximage.c @@ -0,0 +1,258 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_XRender_X11.h" + +static Evas_List *_image_info_list = NULL; + +static int _x_err = 0; +static void +_tmp_x_err(Display *d, XErrorEvent *ev) +{ + _x_err = 1; + return; +} + +Ximage_Info * +_xr_image_info_get(Display *disp, Drawable draw, Visual *vis) +{ + Ximage_Info *xinf, *xinf2; + Evas_List *l; + int di; + unsigned int dui; + + xinf2 = NULL; + for (l = _image_info_list; l; l = l->next) + { + xinf = l->data; + if (xinf->disp == disp) + { + xinf2 = xinf; + break; + } + } + xinf = calloc(1, sizeof(Ximage_Info)); + if (!xinf) return NULL; + + xinf->references = 1; + xinf->disp = disp; + xinf->draw = draw; + XGetGeometry(xinf->disp, xinf->draw, &(xinf->root), + &di, &di, &dui, &dui, &dui, &dui); + xinf->vis = vis; + xinf->fmt32 = XRenderFindStandardFormat(xinf->disp, PictStandardARGB32); + xinf->fmt24 = XRenderFindStandardFormat(xinf->disp, PictStandardRGB24); + xinf->fmt8 = XRenderFindStandardFormat(xinf->disp, PictStandardA8); + xinf->fmt4 = XRenderFindStandardFormat(xinf->disp, PictStandardA4); + xinf->fmt1 = XRenderFindStandardFormat(xinf->disp, PictStandardA1); + + /* find fmt for default visual */ + xinf->fmtdef = XRenderFindVisualFormat(xinf->disp, xinf->vis); + + xinf->mul = _xr_render_surface_new(xinf, 1, 1, xinf->fmt32, 1); + _xr_render_surface_repeat_set(xinf->mul, 1); + xinf->mul_r = xinf->mul_g = xinf->mul_b = xinf->mul_a = 0xff; + _xr_render_surface_solid_rectangle_set(xinf->mul, xinf->mul_r, xinf->mul_g, xinf->mul_b, xinf->mul_a, 0, 0, 1, 1); + if (xinf2) + { + xinf->can_do_shm = xinf2->can_do_shm; + xinf->depth = xinf2->depth; + } + else + { + XVisualInfo *vi, vit; + XShmSegmentInfo shm_info; + XImage *xim; + int num = 0; + + vit.visualid = XVisualIDFromVisual(xinf->vis); + vi = XGetVisualInfo(xinf->disp, VisualIDMask, &vit, &num); + if (!vi) xinf->depth = 32; + else + { + xinf->depth = vi->depth; + XFree(vi); + } + xinf->can_do_shm = 0; + xim = XShmCreateImage(xinf->disp, xinf->vis, xinf->depth, ZPixmap, NULL, &shm_info, 1, 1); + if (xim) + { + shm_info.shmid = shmget(IPC_PRIVATE, xim->bytes_per_line * xim->height, IPC_CREAT | 0777); + if (shm_info.shmid >= 0) + { + shm_info.shmaddr = xim->data = shmat(shm_info.shmid, 0, 0); + if ((shm_info.shmaddr) && (shm_info.shmaddr != (void *) -1)) + { + XErrorHandler ph; + + XSync(xinf->disp, False); + _x_err = 0; + ph = XSetErrorHandler((XErrorHandler)_tmp_x_err); + XShmAttach(xinf->disp, &shm_info); + XSync(xinf->disp, False); + XSetErrorHandler((XErrorHandler)ph); + if (!_x_err) xinf->can_do_shm = 1; + shmdt(shm_info.shmaddr); + } + shmctl(shm_info.shmid, IPC_RMID, 0); + } + XDestroyImage(xim); + } + } + _image_info_list = evas_list_prepend(_image_info_list, xinf); + return xinf; +} + +void +_xr_image_info_free(Ximage_Info *xinf) +{ + if (xinf->pool) XSync(xinf->disp, False); + _xr_image_info_pool_flush(xinf, 0, 0); + xinf->references--; + if (xinf->references != 0) return; + _xr_render_surface_free(xinf->mul); + free(xinf); + _image_info_list = evas_list_remove(_image_info_list, xinf); +} + +void +_xr_image_info_pool_flush(Ximage_Info *xinf, int max_num, int max_mem) +{ + if ((xinf->pool_mem <= max_mem) && (evas_list_count(xinf->pool) <= max_num)) return; + while ((xinf->pool_mem > max_mem) || (evas_list_count(xinf->pool) > max_num)) + { + Ximage_Image *xim; + + if (!xinf->pool) break; + xim = xinf->pool->data; + _xr_image_free(xim); + } +} + +Ximage_Image * +_xr_image_new(Ximage_Info *xinf, int w, int h, int depth) +{ + Ximage_Image *xim, *xim2; + Evas_List *l; + + xim2 = NULL; + for (l = xinf->pool; l; l = l->next) + { + xim = l->data; + if ((xim->w >= w) && (xim->h >= h) && (xim->depth == depth) && (xim->available)) + { + if (!xim2) xim2 = xim; + else if ((xim->w * xim->h) < (xim2->w * xim2->h)) xim2 = xim; + } + } + if (xim2) + { + xim2->available = 0; + return xim2; + } + xim = calloc(1, sizeof(Ximage_Image)); + if (xim) + { + xim->xinf = xinf; + xim->w = w; + xim->h = h; + xim->depth = depth; + xim->available = 0; + if (xim->xinf->can_do_shm) + { + xim->shm_info = calloc(1, sizeof(XShmSegmentInfo)); + if (xim->shm_info) + { + xim->xim = XShmCreateImage(xim->xinf->disp, xim->xinf->vis, xim->depth, ZPixmap, NULL, xim->shm_info, xim->w, xim->h); + if (xim->xim) + { + xim->shm_info->shmid = shmget(IPC_PRIVATE, xim->xim->bytes_per_line * xim->xim->height, IPC_CREAT | 0777); + if (xim->shm_info->shmid >= 0) + { + xim->shm_info->shmaddr = xim->xim->data = shmat(xim->shm_info->shmid, 0, 0); + if ((xim->shm_info->shmaddr) && (xim->shm_info->shmaddr != (void *) -1)) + { + XErrorHandler ph; + + XSync(xim->xinf->disp, False); + _x_err = 0; + ph = XSetErrorHandler((XErrorHandler)_tmp_x_err); + XShmAttach(xim->xinf->disp, xim->shm_info); + XSync(xim->xinf->disp, False); + XSetErrorHandler((XErrorHandler)ph); + if (!_x_err) goto xim_ok; + shmdt(xim->shm_info->shmaddr); + } + shmctl(xim->shm_info->shmid, IPC_RMID, 0); + } + XDestroyImage(xim->xim); + } + free(xim->shm_info); + xim->shm_info = NULL; + } + } + xim->xim = XCreateImage(xim->xinf->disp, xim->xinf->vis, xim->depth, ZPixmap, 0, NULL, xim->w, xim->h, 32, 0); + if (!xim->xim) + { + free(xim); + return NULL; + } + xim->xim->data = malloc(xim->xim->bytes_per_line * xim->xim->height); + if (!xim->xim->data) + { + XDestroyImage(xim->xim); + free(xim); + return NULL; + } + } + + xim_ok: + _xr_image_info_pool_flush(xinf, 32, (1600 * 1200 * 32 * 2)); + + xim->line_bytes = xim->xim->bytes_per_line; + xim->data = (void *)(xim->xim->data); + xinf->pool_mem += (xim->w * xim->h * xim->depth); + xinf->pool = evas_list_append(xinf->pool, xim); + return xim; +} + +void +_xr_image_free(Ximage_Image *xim) +{ + if (xim->shm_info) + { + if (!xim->available) XSync(xim->xinf->disp, False); + XShmDetach(xim->xinf->disp, xim->shm_info); + XDestroyImage(xim->xim); + shmdt(xim->shm_info->shmaddr); + shmctl(xim->shm_info->shmid, IPC_RMID, 0); + free(xim->shm_info); + } + else + { + free(xim->xim->data); + xim->xim->data = NULL; + XDestroyImage(xim->xim); + } + xim->xinf->pool_mem -= (xim->w * xim->h * xim->depth); + xim->xinf->pool = evas_list_remove(xim->xinf->pool, xim); + free(xim); +} + +void +_xr_image_put(Ximage_Image *xim, Drawable draw, int x, int y, int w, int h) +{ + XGCValues gcv; + GC gc; + + gc = XCreateGC(xim->xinf->disp, draw, 0, &gcv); + if (xim->shm_info) + { + XShmPutImage(xim->xinf->disp, draw, gc, xim->xim, 0, 0, x, y, w, h, False); + XSync(xim->xinf->disp, False); + } + else + XPutImage(xim->xinf->disp, draw, gc, xim->xim, 0, 0, x, y, w, h); + xim->available = 1; + XFreeGC(xim->xinf->disp, gc); +} diff --git a/src/modules/engines/xrender_x11/evas_engine_xrender.c b/src/modules/engines/xrender_x11/evas_engine_xrender.c new file mode 100644 index 0000000..edb3d66 --- /dev/null +++ b/src/modules/engines/xrender_x11/evas_engine_xrender.c @@ -0,0 +1,748 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ +#include "evas_common.h" +//#include "evas_macros.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_XRender_X11.h" +#include + +/* this is a work around broken xrender - when/if this ever gets fixed in xorg + * we can comment this out and one day remove it - for now keep it until such + * a fix is spotted in the wild + */ +#define BROKEN_XORG_XRENDER 1 + +/* should be const char*, but the prototype for XRenderSetPictureFilter + * is silly + */ +static inline char * +get_filter(int smooth) +{ + return smooth ? FilterBest : FilterNearest; +} + +Xrender_Surface * +_xr_render_surface_new(Ximage_Info *xinf, int w, int h, XRenderPictFormat *fmt, int alpha) +{ + Xrender_Surface *rs; + XRenderPictureAttributes att; + + if ((!xinf) || (!fmt) || (w < 1) || (h < 1)) return NULL; + rs = calloc(1, sizeof(Xrender_Surface)); + if (!rs) return NULL; + rs->xinf = xinf; + rs->w = w; + rs->h = h; + rs->fmt = fmt; + rs->alpha = alpha; + rs->depth = fmt->depth; + rs->allocated = 1; + rs->draw = XCreatePixmap(xinf->disp, xinf->root, w, h, fmt->depth); + if (rs->draw == None) + { + free(rs); + return NULL; + } + rs->xinf->references++; + att.dither = 1; + att.component_alpha = 0; + att.repeat = 0; + rs->pic = XRenderCreatePicture(xinf->disp, rs->draw, fmt, + CPRepeat | CPDither | CPComponentAlpha, &att); + if (rs->pic == None) + { + XFreePixmap(rs->xinf->disp, rs->draw); + rs->xinf->references--; + free(rs); + return NULL; + } + return rs; +} + +Xrender_Surface * +_xr_render_surface_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, int alpha) +{ + Xrender_Surface *rs; + XRenderPictFormat *fmt; + XRenderPictureAttributes att; + + if ((!xinf) || (draw == None) || (w < 1) || (h < 1)) return NULL; + fmt = XRenderFindVisualFormat(xinf->disp, xinf->vis); + if (!fmt) return NULL; + rs = calloc(1, sizeof(Xrender_Surface)); + if (!rs) return NULL; + rs->xinf = xinf; + rs->w = w; + rs->h = h; + rs->fmt = fmt; + rs->alpha = alpha; + rs->depth = fmt->depth; + if (fmt->depth == 32) rs->alpha = 1; + rs->allocated = 0; + rs->draw = draw; + rs->xinf->references++; + att.dither = 1; + att.component_alpha = 0; + att.repeat = 0; + rs->pic = XRenderCreatePicture(xinf->disp, rs->draw, fmt, + CPRepeat | CPDither | CPComponentAlpha, &att); + if (rs->pic == None) + { + rs->xinf->references--; + free(rs); + return NULL; + } + return rs; +} + +Xrender_Surface * +_xr_render_surface_format_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, XRenderPictFormat *fmt, int alpha) +{ + Xrender_Surface *rs; + XRenderPictureAttributes att; + + if ((!xinf) || (!fmt) || (draw == None) || (w < 1) || (h < 1)) return NULL; + rs = calloc(1, sizeof(Xrender_Surface)); + if (!rs) return NULL; + rs->xinf = xinf; + rs->w = w; + rs->h = h; + rs->fmt = fmt; + rs->alpha = alpha; + rs->depth = fmt->depth; + if (fmt->depth == 32) rs->alpha = 1; + rs->xinf->references++; + rs->allocated = 0; + rs->draw = draw; + att.dither = 0; + att.component_alpha = 0; + att.repeat = 0; + rs->pic = XRenderCreatePicture(xinf->disp, rs->draw, fmt, CPRepeat | CPDither | CPComponentAlpha, &att); + if (rs->pic == None) + { + rs->xinf->references--; + free(rs); + return NULL; + } + return rs; +} + +void +_xr_render_surface_free(Xrender_Surface *rs) +{ + if (!rs) return; + if (rs->xinf) + { + if ((rs->allocated) && (rs->draw != None)) + XFreePixmap(rs->xinf->disp, rs->draw); + if (rs->pic != None) + XRenderFreePicture(rs->xinf->disp, rs->pic); + _xr_image_info_free(rs->xinf); + rs->xinf = NULL; + } + free(rs); +} + +void +_xr_render_surface_repeat_set(Xrender_Surface *rs, int repeat) +{ + XRenderPictureAttributes att; + + att.repeat = repeat; + XRenderChangePicture(rs->xinf->disp, rs->pic, CPRepeat, &att); +} + +void +_xr_render_surface_solid_rectangle_set(Xrender_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h) +{ + XRenderColor col; + + col.red = (r << 8) | r; + col.green = (g << 8) | g; + col.blue = (b << 8) | b; + col.alpha = (a << 8) | a; + XRenderFillRectangle(rs->xinf->disp, PictOpSrc, rs->pic, &col, x, y, w, h); +} + +void +_xr_render_surface_argb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy) +{ + Ximage_Image *xim; + unsigned int *p, *sp, *sple, *spe; + unsigned int jump, sjump; + + xim = _xr_image_new(rs->xinf, w, h, rs->depth); + if (!xim) return; + p = (unsigned int *)xim->data; + sp = ((unsigned int *)pixels) + (y * sw) + x; + jump = ((xim->line_bytes / 4) - w); + sjump = sw - w; + spe = sp + ((h - 1) * sw) + w; + if +#ifdef WORDS_BIGENDIAN + (xim->xim->byte_order == LSBFirst) +#else + (xim->xim->byte_order == MSBFirst) +#endif + { + while (sp < spe) + { + sple = sp + w; + while (sp < sple) + { + *p++ = (*sp << 24) + ((*sp << 8) & 0xff0000) + ((*sp >> 8) & 0xff00) + (*sp >> 24); +// *p++ = (B_VAL(sp) << 24) | (G_VAL(sp) << 16) | (R_VAL(sp) << 8) | A_VAL(sp); + sp++; + } + p += jump; + sp += sjump; + } + } + else + { + while (sp < spe) + { + sple = sp + w; + while (sp < sple) + *p++ = *sp++; + p += jump; + sp += sjump; + } + } + _xr_image_put(xim, rs->draw, x + ox, y + oy, w, h); +} + +void +_xr_render_surface_rgb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h, int ox, int oy) +{ + Ximage_Image *xim; + unsigned int *p, *sp, *sple, *spe; + unsigned int jump, sjump; + + xim = _xr_image_new(rs->xinf, w, h, rs->depth); + if (!xim) return; + p = (unsigned int *)xim->data; + sp = ((unsigned int *)pixels) + (y * sw) + x; + sjump = sw - w; + spe = sp + ((h - 1) * sw) + w; + if (rs->depth == 16) + { + jump = ((xim->line_bytes / 2) - w); + /* FIXME: if rs->depth == 16 - convert */ + Gfx_Func_Convert conv_func; + int swap; + +#ifdef WORDS_BIGENDIAN + swap = (int)(xim->xim->byte_order == LSBFirst); +#else + swap = (int)(xim->xim->byte_order == MSBFirst); +#endif + /* FIXME: swap not handled */ + conv_func = evas_common_convert_func_get(sp, w, h, rs->depth, + rs->xinf->vis->red_mask, + rs->xinf->vis->green_mask, + rs->xinf->vis->blue_mask, + PAL_MODE_NONE, 0); + if (conv_func) + conv_func(sp, p, sjump, jump, w, h, x, y, NULL); + } + else + { + jump = ((xim->line_bytes / 4) - w); + if +#ifdef WORDS_BIGENDIAN + (xim->xim->byte_order == LSBFirst) +#else + (xim->xim->byte_order == MSBFirst) +#endif + { + while (sp < spe) + { + sple = sp + w; + while (sp < sple) + { + *p++ = (*sp << 24) + ((*sp << 8) & 0xff0000) + ((*sp >> 8) & 0xff00) + 0xff; +// *p++ = ((B_VAL(sp)) << 24) | ((G_VAL(sp)) << 16) | ((R_VAL(sp)) << 8) | 0x000000ff; + sp++; + } + p += jump; + sp += sjump; + } + } + else + { + while (sp < spe) + { + sple = sp + w; + while (sp < sple) + *p++ = 0xff000000 | *sp++; + p += jump; + sp += sjump; + } + } + } + _xr_image_put(xim, rs->draw, x + ox, y + oy, w, h); +} + +void +_xr_render_surface_clips_set(Xrender_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh) +{ + int num = 0; + XRectangle *rect = NULL; + + if ((dc) && (dc->clip.use)) + { + RECTS_CLIP_TO_RECT(rx, ry, rw, rh, + dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h); + } + if ((!dc) || (!dc->cutout.rects)) + { + rect = malloc(sizeof(XRectangle)); + if (!rect) return; + rect->x = rx; + rect->y = ry; + rect->width = rw; + rect->height = rh; + num = 1; + } + else + { + Cutout_Rects *rects; + Cutout_Rect *r; + int i; + + rects = evas_common_draw_context_apply_cutouts(dc); + num = rects->active; + rect = malloc(num * sizeof(XRectangle)); + if (!rect) return; + for (i = 0; i < num; i++) + { + r = rects->rects + i; + rect[i].x = r->x; + rect[i].y = r->y; + rect[i].width = r->w; + rect[i].height = r->h; + } + evas_common_draw_context_apply_clear_cutouts(rects); + } + if (!rect) return; + XRenderSetPictureClipRectangles(rs->xinf->disp, rs->pic, 0, 0, rect, num); + free(rect); +} + +/* initialized the transform to the identity */ +static void +init_xtransform(XTransform *t) +{ + int i, j; + + for (i = 0; i < 3; i++) + for (j = 0; j < 3; j++) + t->matrix[i][j] = XDoubleToFixed((i == j) ? 1 : 0); +} + +static void +set_xtransform_scale(XTransform *t, int sw, int sh, int w, int h, int tx, int ty) +{ +// if ((sw > 1) && (w > 1)) +// { sw--; w--; } +// if ((sh > 1) && (h > 1)) +// { sh--; h--; } + t->matrix[0][0] = XDoubleToFixed((double)(sw) / (double)(w)); + t->matrix[1][1] = XDoubleToFixed((double)(sh) / (double)(h)); + t->matrix[2][0] = (tx * sw) / w; + t->matrix[2][1] = (ty * sh) / h; +} + +// when color multiplier is used want: instead +// CA src IN mask SRC temp; non-CA temp OVER dst. - i think. need to check. +void +_xr_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth) +{ + Xrender_Surface *trs = NULL; + XTransform xf; + XRenderPictureAttributes att; + Picture mask = None; + int e, is_scaling, op; + + if ((sw <= 0) || (sh <= 0) || (w <= 0) || (h <= 0)) return; + + is_scaling = e = ((sw != w) || (sh != h)); + + att.clip_mask = None; + XRenderChangePicture(srs->xinf->disp, srs->pic, CPClipMask, &att); + XRenderChangePicture(drs->xinf->disp, drs->pic, CPClipMask, &att); + + init_xtransform(&xf); + + op = PictOpOver; + if (dc->render_op == _EVAS_RENDER_BLEND) + { + if (!srs->alpha) op = PictOpSrc; + } + else if (dc->render_op == _EVAS_RENDER_BLEND_REL) + op = PictOpAtop; + else if (dc->render_op == _EVAS_RENDER_MUL) + op = PictOpIn; + else if (dc->render_op == _EVAS_RENDER_COPY) + op = PictOpSrc; + else if (dc->render_op == _EVAS_RENDER_COPY_REL) + op = PictOpIn; + else if (dc->render_op == _EVAS_RENDER_MASK) + op = PictOpInReverse; + + if ((dc) && (dc->mul.use)) + { + int r, g, b, a; + + if ((op == PictOpOver) && (!dc->mul.col)) return; + a = dc->mul.col >> 24; + r = (dc->mul.col >> 16) & 0xff; + g = (dc->mul.col >> 8) & 0xff; + b = dc->mul.col & 0xff; + if (a < 255) op = PictOpOver; + if (dc->mul.col != 0xffffffff) + { + if ((srs->xinf->mul_r != r) || (srs->xinf->mul_g != g) || + (srs->xinf->mul_b != b) || (srs->xinf->mul_a != a)) + { + srs->xinf->mul_r = r; + srs->xinf->mul_g = g; + srs->xinf->mul_b = b; + srs->xinf->mul_a = a; + _xr_render_surface_solid_rectangle_set(srs->xinf->mul, + r, g, b, a, + 0, 0, 1, 1); + } + mask = srs->xinf->mul->pic; + if (dc->mul.col == (a * 0x01010101)) + { + att.component_alpha = 0; + XRenderChangePicture(srs->xinf->disp, mask, CPComponentAlpha, &att); + } + else + { + if ((srs->alpha) || (a != 0xff)) + trs = _xr_render_surface_new(srs->xinf, sw + 2, sh + 2, + srs->xinf->fmt32, 1); + else + trs = _xr_render_surface_new(srs->xinf, sw + 2, sh + 2, + srs->fmt, srs->alpha); + if (!trs) return; + + att.component_alpha = 1; + XRenderChangePicture(srs->xinf->disp, mask, CPComponentAlpha, &att); + XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf); + XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, mask, + trs->pic, + sx, sy, + sx, sy, + 0, 0, sw + 2, sh + 2); + mask = None; + } + } + } + +//#define HFW + (sw / 2) +//#define HFH + (sh / 2) +#define HFW +#define HFH + + _xr_render_surface_clips_set(drs, dc, x, y, w, h); + if (trs) + { + XRenderSetPictureFilter(trs->xinf->disp, trs->pic, get_filter(smooth), NULL, 0); + + set_xtransform_scale(&xf, sw, sh, w, h, -1, -1); + XRenderSetPictureTransform(trs->xinf->disp, trs->pic, &xf); + + att.component_alpha = 0; + if (dc->render_op == _EVAS_RENDER_MUL) att.component_alpha = 1; + XRenderChangePicture(trs->xinf->disp, trs->pic, CPComponentAlpha, &att); + + XRenderComposite(trs->xinf->disp, op, trs->pic, mask, drs->pic, + (w HFW) / sw, (h HFH) / sh, + (w HFW) / sw, (h HFH) / sh, + x, y, w, h); + _xr_render_surface_free(trs); + } + else + { + if (srs->bordered && is_scaling) + { + trs = _xr_render_surface_new(srs->xinf, sw + 2, sh + 2, + srs->fmt, srs->alpha); + if (!trs) return; + + att.component_alpha = 0; + XRenderChangePicture(srs->xinf->disp, srs->pic, CPComponentAlpha, &att); + XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf); + + XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, None, + trs->pic, sx, sy, sx, sy, 0, 0, sw + 2, sh + 2); + + XRenderSetPictureFilter(trs->xinf->disp, trs->pic, get_filter(smooth), NULL, 0); + + set_xtransform_scale(&xf, sw, sh, w, h, -1, -1); + XRenderSetPictureTransform(trs->xinf->disp, trs->pic, &xf); + + if (dc->render_op == _EVAS_RENDER_MUL) + { + att.component_alpha = 1; + XRenderChangePicture(trs->xinf->disp, trs->pic, CPComponentAlpha, &att); + } + + XRenderComposite(trs->xinf->disp, op, trs->pic, mask, drs->pic, + (w HFW) / sw, (h HFH) / sh, + (w HFW) / sw, (h HFH) / sh, +// 1, 1, 1, 1, + x, y, w, h); + _xr_render_surface_free(trs); + } + else + { + XRenderSetPictureFilter(srs->xinf->disp, srs->pic, get_filter(smooth), NULL, 0); + + set_xtransform_scale(&xf, sw, sh, w, h, 0, 0); + XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf); + + att.component_alpha = 0; + if (dc->render_op == _EVAS_RENDER_MUL) + att.component_alpha = 1; + XRenderChangePicture(srs->xinf->disp, srs->pic, CPComponentAlpha, &att); + + XRenderComposite(srs->xinf->disp, op, srs->pic, mask, drs->pic, + ((((sx + 1) * w) HFW) / sw), + ((((sy + 1) * h) HFH) / sh), + ((((sx + 1) * w) HFW) / sw), + ((((sy + 1) * h) HFH) / sh), + x, y, w, h); + } + } +} + +void +_xr_render_surface_copy(Xrender_Surface *srs, Xrender_Surface *drs, int sx, int sy, int x, int y, int w, int h) +{ + XTransform xf; + XRenderPictureAttributes att; + + if ((w <= 0) || (h <= 0) || (!srs) || (!drs)) return; + + init_xtransform(&xf); +#ifdef BROKEN_XORG_XRENDER + /* FIXME: why do we need to change the identity matrix ifthe src surface + * is 1 bit deep? + */ + if (srs->depth == 1) + { + xf.matrix[0][0] = xf.matrix[1][1] = xf.matrix[2][2] = 1; + } +#endif + XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf); +// XRenderSetPictureFilter(srs->xinf->disp, srs->pic, FilterNearest, NULL, 0); + + att.clip_mask = None; + XRenderChangePicture(srs->xinf->disp, srs->pic, CPClipMask, &att); + XRenderChangePicture(drs->xinf->disp, drs->pic, CPClipMask, &att); + + XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, None, drs->pic, + sx, sy, 0, 0, x, y, w, h); +} + +void +_xr_render_surface_rectangle_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h) +{ + XRenderColor col; + XRenderPictureAttributes att; + int r, g, b, a, op; + + if ((!rs) || (!dc)) return; + if ((w <= 0) || (h <= 0)) return; + a = dc->col.col >> 24; + r = (dc->col.col >> 16) & 0xff; + g = (dc->col.col >> 8 ) & 0xff; + b = (dc->col.col ) & 0xff; + col.red = (r << 8) | r; + col.green = (g << 8) | g; + col.blue = (b << 8) | b; + col.alpha = (a << 8) | a; + op = PictOpOver; + if (dc->render_op == _EVAS_RENDER_BLEND) + { + if (!dc->col.col) return; + if (a == 0xff) op = PictOpSrc; + } + else if (dc->render_op == _EVAS_RENDER_BLEND_REL) + { + if (!dc->col.col) return; + op = PictOpAtop; + } + else if (dc->render_op == _EVAS_RENDER_MUL) + { + if (dc->col.col == 0xffffffff) return; + op = PictOpIn; + } + else if (dc->render_op == _EVAS_RENDER_COPY) + op = PictOpSrc; + else if (dc->render_op == _EVAS_RENDER_COPY_REL) + op = PictOpIn; + else if (dc->render_op == _EVAS_RENDER_MASK) + op = PictOpInReverse; + + att.clip_mask = None; + XRenderChangePicture(rs->xinf->disp, rs->pic, CPClipMask, &att); + + _xr_render_surface_clips_set(rs, dc, x, y, w, h); + XRenderFillRectangle(rs->xinf->disp, op, rs->pic, &col, x, y, w, h); +} + +void +_xr_render_surface_line_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2) +{ + XRenderPictureAttributes att; + int op; + + if ((!rs) || (!dc) || (!dc->col.col)) return; + op = PictOpOver; + if (dc->render_op == _EVAS_RENDER_BLEND) + { + if (!dc->col.col) return; + } + else if (dc->render_op == _EVAS_RENDER_BLEND_REL) + { + if (!dc->col.col) return; + op = PictOpAtop; + } + else if (dc->render_op == _EVAS_RENDER_MUL) + { + if (dc->col.col == 0xffffffff) return; + op = PictOpIn; + } + else if (dc->render_op == _EVAS_RENDER_COPY) + op = PictOpSrc; + else if (dc->render_op == _EVAS_RENDER_COPY_REL) + op = PictOpIn; + else if (dc->render_op == _EVAS_RENDER_MASK) + op = PictOpInReverse; + att.clip_mask = None; + XRenderChangePicture(rs->xinf->disp, rs->pic, CPClipMask, &att); + _xr_render_surface_clips_set(rs, dc, 0, 0, rs->w, rs->h); + + { + int r, g, b, a; + XPointDouble poly[4]; + int dx, dy; + double len, ddx, ddy; + + dx = x2 - x1; + dy = y2 - y1; + len = sqrt((double)(dx * dx) + (double)(dy * dy)); + ddx = (0.5 * dx) / len; + ddy = (0.5 * dy) / len; + if (ddx < 0) ddx = -0.5 - ddx; + else ddx = 0.5 - ddx; + if (ddy < 0) ddy = -0.5 - ddy; + else ddy = 0.5 - ddy; + poly[0].x = (x1 + ddx); + poly[0].y = (y1 - ddy); + poly[1].x = (x2 + ddx); + poly[1].y = (y2 - ddy); + poly[2].x = (x2 - ddx); + poly[2].y = (y2 + ddy); + poly[3].x = (x1 - ddx); + poly[3].y = (y1 + ddy); + + a = (dc->col.col >> 24) & 0xff; + r = (dc->col.col >> 16) & 0xff; + g = (dc->col.col >> 8 ) & 0xff; + b = (dc->col.col ) & 0xff; + if ((rs->xinf->mul_r != r) || (rs->xinf->mul_g != g) || + (rs->xinf->mul_b != b) || (rs->xinf->mul_a != a)) + { + rs->xinf->mul_r = r; + rs->xinf->mul_g = g; + rs->xinf->mul_b = b; + rs->xinf->mul_a = a; + _xr_render_surface_solid_rectangle_set(rs->xinf->mul, r, g, b, a, 0, 0, 1, 1); + } + XRenderCompositeDoublePoly(rs->xinf->disp, op, + rs->xinf->mul->pic, rs->pic, + rs->xinf->fmt8, 0, 0, 0, 0, + poly, 4, EvenOddRule); + } +} + +void +_xre_poly_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points) +{ + RGBA_Polygon_Point *pt; + int i, num; + XPointDouble *pts; + int r, g, b, a; + XRenderPictureAttributes att; + int op; + + if ((!rs) || (!dc)) return; + num = 0; + for (pt = points; pt; pt = (RGBA_Polygon_Point *)(((Evas_Object_List *)pt)->next)) num++; + if (num < 3) return; + op = PictOpOver; + if (dc->render_op == _EVAS_RENDER_BLEND) + { + if (!dc->col.col) return; + } + else if (dc->render_op == _EVAS_RENDER_BLEND_REL) + { + if (!dc->col.col) return; + op = PictOpAtop; + } + else if (dc->render_op == _EVAS_RENDER_MUL) + { + if (dc->col.col == 0xffffffff) return; + op = PictOpIn; + } + else if (dc->render_op == _EVAS_RENDER_COPY) + op = PictOpSrc; + else if (dc->render_op == _EVAS_RENDER_COPY_REL) + op = PictOpIn; + else if (dc->render_op == _EVAS_RENDER_MASK) + op = PictOpInReverse; + a = (dc->col.col >> 24) & 0xff; + r = (dc->col.col >> 16) & 0xff; + g = (dc->col.col >> 8 ) & 0xff; + b = (dc->col.col ) & 0xff; + if ((rs->xinf->mul_r != r) || (rs->xinf->mul_g != g) || + (rs->xinf->mul_b != b) || (rs->xinf->mul_a != a)) + { + rs->xinf->mul_r = r; + rs->xinf->mul_g = g; + rs->xinf->mul_b = b; + rs->xinf->mul_a = a; + _xr_render_surface_solid_rectangle_set(rs->xinf->mul, r, g, b, a, 0, 0, 1, 1); + } + pts = malloc(num * sizeof(XPointDouble)); + if (!pts) return; + i = 0; + for (pt = points; pt; pt = (RGBA_Polygon_Point *)(((Evas_Object_List *)pt)->next)) + { + if (i < num) + { + pts[i].x = pt->x; + pts[i].y = pt->y; + i++; + } + } + att.clip_mask = None; + XRenderChangePicture(rs->xinf->disp, rs->pic, CPClipMask, &att); + + _xr_render_surface_clips_set(rs, dc, 0, 0, rs->w, rs->h); + XRenderCompositeDoublePoly(rs->xinf->disp, op, + rs->xinf->mul->pic, rs->pic, + rs->xinf->fmt8, 0, 0, 0, 0, + pts, num, Complex); + free(pts); +} + diff --git a/src/modules/engines/xrender_xcb/.cvsignore b/src/modules/engines/xrender_xcb/.cvsignore new file mode 100644 index 0000000..09980ae --- /dev/null +++ b/src/modules/engines/xrender_xcb/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la diff --git a/src/modules/engines/xrender_xcb/Evas_Engine_XRender_Xcb.h b/src/modules/engines/xrender_xcb/Evas_Engine_XRender_Xcb.h new file mode 100644 index 0000000..6e4d774 --- /dev/null +++ b/src/modules/engines/xrender_xcb/Evas_Engine_XRender_Xcb.h @@ -0,0 +1,24 @@ +#ifndef __EVAS_ENGINE_XRENDER_XCB_H__ +#define __EVAS_ENGINE_XRENDER_XCB_H__ + +#include + +typedef struct _Evas_Engine_Info_XRender_Xcb Evas_Engine_Info_XRender_Xcb; + +struct _Evas_Engine_Info_XRender_Xcb +{ + /* PRIVATE - don't mess with this baby or evas will poke its tongue out */ + /* at you and make nasty noises */ + Evas_Engine_Info magic; + + /* engine specific data & parameters it needs to set up */ + struct { + xcb_connection_t *conn; + xcb_drawable_t drawable; + xcb_pixmap_t mask; + xcb_visualid_t visual; + unsigned char destination_alpha : 1; + } info; +}; + +#endif /* __EVAS_ENGINE_XRENDER_XCB_H__ */ diff --git a/src/modules/engines/xrender_xcb/Makefile.am b/src/modules/engines/xrender_xcb/Makefile.am new file mode 100644 index 0000000..7650066 --- /dev/null +++ b/src/modules/engines/xrender_xcb/Makefile.am @@ -0,0 +1,44 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-I$(top_srcdir)/src/modules/engines \ +@FREETYPE_CFLAGS@ \ +@XCBRENDER_CFLAGS@ + +if BUILD_ENGINE_XRENDER_XCB + +pkgdir = $(libdir)/evas/modules/engines/xrender_xcb/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = \ +evas_engine.h \ +evas_engine.c \ +evas_engine_ximage.c \ +evas_engine_xrender.c \ +evas_engine_image.c \ +evas_engine_font.c \ +evas_engine_gradient.c + +module_la_LIBADD = @XCBRENDER_LIBS@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +include_HEADERS = Evas_Engine_XRender_Xcb.h + +endif + +EXTRA_DIST = \ +evas_engine.h \ +evas_engine.c \ +evas_engine_ximage.c \ +evas_engine_xrender.c \ +evas_engine_image.c \ +evas_engine_font.c \ +evas_engine_gradient.c \ +Evas_Engine_XRender_Xcb.h diff --git a/src/modules/engines/xrender_xcb/evas_engine.c b/src/modules/engines/xrender_xcb/evas_engine.c new file mode 100644 index 0000000..84049bf --- /dev/null +++ b/src/modules/engines/xrender_xcb/evas_engine.c @@ -0,0 +1,877 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_XRender_Xcb.h" + +/* function tables - filled in later (func and parent func) */ +static Evas_Func func, pfunc; + +/* engine struct data */ +typedef struct _Render_Engine Render_Engine; +typedef struct _Render_Engine_Update Render_Engine_Update; + +struct _Render_Engine_Update +{ + int x; + int y; + int w; + int h; + Xcb_Render_Surface *surface; +}; + +struct _Render_Engine +{ + xcb_connection_t *conn; + xcb_visualid_t vis; + xcb_drawable_t win; + xcb_pixmap_t mask; + unsigned char destination_alpha : 1; + + Xcb_Image_Info *xcbinf; + Xcb_Render_Surface *output; + Xcb_Render_Surface *mask_output; + + Tilebuf *tb; + Tilebuf_Rect *rects; + Evas_Object_List *cur_rect; + int end : 1; + + Evas_List *updates; +}; + +/* internal engine routines */ + +/* engine api this module provides */ + +static void * +eng_info(Evas *e) +{ + Evas_Engine_Info_XRender_Xcb *info; + + info = calloc(1, sizeof(Evas_Engine_Info_XRender_Xcb)); + if (!info) return NULL; + info->magic.magic = rand(); + return info; + e = NULL; +} + +static void +eng_info_free(Evas *e, void *info) +{ + Evas_Engine_Info_XRender_Xcb *in; + + in = (Evas_Engine_Info_XRender_Xcb *)info; + free(in); +} +static void +eng_setup(Evas *e, void *in) +{ + Render_Engine *re; + Evas_Engine_Info_XRender_Xcb *info; + int resize = 1; + + info = (Evas_Engine_Info_XRender_Xcb *)in; + if (!e->engine.data.output) + { + re = calloc(1, sizeof(Render_Engine)); + evas_common_cpu_init(); + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + e->engine.data.output = re; + resize = 0; + } + re = e->engine.data.output; + if (!re) return; + + if (!e->engine.data.context) e->engine.data.context = e->engine.func->context_new(e->engine.data.output); + + re->conn = info->info.conn; + re->vis = info->info.visual; + re->win = info->info.drawable; + re->mask = info->info.mask; + re->destination_alpha = info->info.destination_alpha; + + if (re->xcbinf) _xr_image_info_free(re->xcbinf); + re->xcbinf = _xr_image_info_get(re->conn, re->win, re->vis); + + if (re->output) _xr_render_surface_free(re->output); + if (re->mask_output) _xr_render_surface_free(re->mask_output); + if (!re->mask) + re->output = _xr_render_surface_adopt(re->xcbinf, re->win, e->output.w, e->output.h, re->destination_alpha); + else + re->output = _xr_render_surface_adopt(re->xcbinf, re->win, e->output.w, e->output.h, 0); + if (re->mask) { + xcb_drawable_t draw; + + draw = re->mask; + re->mask_output = _xr_render_surface_format_adopt(re->xcbinf, draw, + e->output.w, e->output.h, + re->xcbinf->fmt1, 1); + } + else + re->mask_output = NULL; + if (resize) + { + if (re->tb) evas_common_tilebuf_free(re->tb); + if ((e->output.w > 0) && (e->output.h > 0)) + re->tb = evas_common_tilebuf_new(e->output.w, e->output.h); + else + re->tb = evas_common_tilebuf_new(1, 1); + if (re->tb) + evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + } +} + +static void +eng_output_free(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_font_shutdown(); + evas_common_image_shutdown(); + while (re->updates) + { + Render_Engine_Update *reu; + + reu = re->updates->data; + re->updates = evas_list_remove_list(re->updates, re->updates); + _xr_render_surface_free(reu->surface); + free(reu); + } + if (re->tb) evas_common_tilebuf_free(re->tb); + if (re->output) _xr_render_surface_free(re->output); + if (re->mask_output) _xr_render_surface_free(re->mask_output); + if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); + if (re->xcbinf) _xr_image_info_free(re->xcbinf); + free(re); +} + +static void +eng_output_resize(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + if (re->output) + { + if ((re->output->w == w) && (re->output->h ==h)) return; + if (re->output) _xr_render_surface_free(re->output); + } + re->output = _xr_render_surface_adopt(re->xcbinf, re->win, w, h, 0); + if (re->mask_output) + { + xcb_drawable_t draw; + + if (re->mask_output) _xr_render_surface_free(re->mask_output); + draw = re->mask; + re->mask_output = _xr_render_surface_format_adopt(re->xcbinf, draw, + w, h, + re->xcbinf->fmt1, 1); + } + evas_common_tilebuf_free(re->tb); + re->tb = evas_common_tilebuf_new(w, h); + if (re->tb) evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); +} + +static void +eng_output_tile_size_set(void *data, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_set_tile_size(re->tb, w, h); +} + +static void +eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_add_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_rect_del(void *data, int x, int y, int w, int h) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_del_redraw(re->tb, x, y, w, h); +} + +static void +eng_output_redraws_clear(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + evas_common_tilebuf_clear(re->tb); +} + +static void * +eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) +{ + Render_Engine *re; + Tilebuf_Rect *rect; + int ux, uy, uw, uh; + + re = (Render_Engine *)data; + if (re->end) + { + re->end = 0; + return NULL; + } + if (!re->rects) + { + re->rects = evas_common_tilebuf_get_render_rects(re->tb); + re->cur_rect = (Evas_Object_List *)re->rects; + } + if (!re->cur_rect) return NULL; + rect = (Tilebuf_Rect *)re->cur_rect; + ux = rect->x; uy = rect->y; uw = rect->w; uh = rect->h; + re->cur_rect = re->cur_rect->next; + if (!re->cur_rect) + { + evas_common_tilebuf_free_render_rects(re->rects); + re->rects = NULL; + re->end = 1; + } + + *x = ux; *y = uy; *w = uw; *h = uh; + *cx = 0; *cy = 0; *cw = uw; *ch = uh; + if ((re->destination_alpha) || (re->mask)) + { + Xcb_Render_Surface *surface; + + surface = _xr_render_surface_new(re->xcbinf, uw, uh, re->xcbinf->fmt32, 1); + _xr_render_surface_solid_rectangle_set(surface, 0, 0, 0, 0, 0, 0, uw, uh); + return surface; + } + return _xr_render_surface_new(re->xcbinf, uw, uh, re->xcbinf->fmt24, 0); +} + +static void +eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) +{ + Render_Engine *re; + Render_Engine_Update *reu; + + re = (Render_Engine *)data; + reu = malloc(sizeof(Render_Engine_Update)); + if (!reu) return; + reu->x = x; + reu->y = y; + reu->w = w; + reu->h = h; + reu->surface = (Xcb_Render_Surface *)surface; + re->updates = evas_list_append(re->updates, reu); +} + +static void +eng_output_flush(void *data) +{ + Render_Engine *re; + xcb_get_input_focus_reply_t *reply; + + re = (Render_Engine *)data; + while (re->updates) + { + Render_Engine_Update *reu; + + reu = re->updates->data; + re->updates = evas_list_remove_list(re->updates, re->updates); + if (re->mask_output) + { + Xcb_Render_Surface *tsurf; + + _xr_render_surface_copy(reu->surface, re->output, 0, 0, + reu->x, reu->y, reu->w, reu->h); + tsurf = _xr_render_surface_new(re->xcbinf, reu->w, reu->h, re->xcbinf->fmt1, 1); + if (tsurf) + { + _xr_render_surface_copy(reu->surface, tsurf, 0, 0, + 0, 0, reu->w, reu->h); + _xr_render_surface_copy(tsurf, re->mask_output, 0, 0, + reu->x, reu->y, reu->w, reu->h); + _xr_render_surface_free(tsurf); + } + } + else + { + _xr_render_surface_copy(reu->surface, re->output, 0, 0, + reu->x, reu->y, reu->w, reu->h); + } + _xr_render_surface_free(reu->surface); + free(reu); + } + /* we sync */ + reply = xcb_get_input_focus_reply(re->conn, + xcb_get_input_focus_unchecked(re->conn), + NULL); + free(reply); + _xr_image_info_pool_flush(re->xcbinf, 0, 0); +} + +static void +eng_output_idle_flush(void *data) +{ + Render_Engine *re; + + re = (Render_Engine *)data; +} + +static void +eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h) +{ + _xr_render_surface_rectangle_draw((Xcb_Render_Surface *)surface, + (RGBA_Draw_Context *)context, + x, y, w, h); +} + +static void +eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2) +{ + _xr_render_surface_line_draw((Xcb_Render_Surface *)surface, (RGBA_Draw_Context *)context, x1, y1, x2, y2); +} + +static void +eng_polygon_draw(void *data, void *context, void *surface, void *polygon) +{ + _xre_poly_draw((Xcb_Render_Surface *)surface, (RGBA_Draw_Context *)context, (RGBA_Polygon_Point *)polygon); +} + +static void * +eng_gradient_new(void *data) +{ + Render_Engine *re = (Render_Engine *)data; + + return _xre_gradient_new(re->xcbinf); +} + +static void +eng_gradient_free(void *data, void *gradient) +{ + _xre_gradient_free(gradient); +} + +static void +eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta) +{ + _xre_gradient_color_stop_add(gradient, r, g, b, a, delta); +} + +static void +eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta) +{ + _xre_gradient_alpha_stop_add(gradient, a, delta); +} + +static void +eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha) +{ + _xre_gradient_color_data_set(gradient, map, len, has_alpha); +} + +static void +eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len) +{ + _xre_gradient_alpha_data_set(gradient, alpha_map, len); +} + +static void +eng_gradient_clear(void *data, void *gradient) +{ + _xre_gradient_clear(gradient); +} + +static void +eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h) +{ + _xre_gradient_fill_set(gradient, x, y, w, h); +} + +static void +eng_gradient_fill_angle_set(void *data, void *gradient, double angle) +{ + _xre_gradient_fill_angle_set(gradient, angle); +} + +static void +eng_gradient_fill_spread_set(void *data, void *gradient, int spread) +{ + _xre_gradient_fill_spread_set(gradient, spread); +} + +static void +eng_gradient_angle_set(void *data, void *gradient, double angle) +{ + _xre_gradient_angle_set(gradient, angle); +} + +static void +eng_gradient_offset_set(void *data, void *gradient, float offset) +{ + _xre_gradient_offset_set(gradient, offset); +} + +static void +eng_gradient_direction_set(void *data, void *gradient, int direction) +{ + _xre_gradient_direction_set(gradient, direction); +} + +static void +eng_gradient_type_set(void *data, void *gradient, char *name, char *params) +{ + _xre_gradient_type_set(gradient, name, params); +} + +static int +eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h) +{ + RGBA_Gradient *grad; + RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context; + + if (!dc || !gradient) return 0; + grad = ((XR_Gradient *)gradient)->grad; + if(!grad || !grad->type.geometer) return 0; + return !(grad->type.geometer->has_alpha(grad, dc->render_op) | + grad->type.geometer->has_mask(grad, dc->render_op)); +} + +static int +eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h) +{ + if (!context || !gradient) return 0; + return 1; +} + +static void +eng_gradient_render_pre(void *data, void *context, void *gradient) +{ + int len; + RGBA_Gradient *grad; + + if (!context || !gradient) return; + grad = ((XR_Gradient *)gradient)->grad; + if(!grad || !grad->type.geometer) return; + grad->type.geometer->geom_set(grad); + len = grad->type.geometer->get_map_len(grad); + evas_common_gradient_map(context, grad, len); +} + +static void +eng_gradient_render_post(void *data, void *gradient) +{ +} + +static void +eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h) +{ + _xre_gradient_draw(surface, context, gradient, x, y, w, h); +} + +static void * +eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo) +{ + Render_Engine *re; + XR_Image *im; + + re = (Render_Engine *)data; + *error = 0; + im = _xre_image_load(re->xcbinf, file, key, lo); + return im; +} + +static void * +eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + Render_Engine *re; + XR_Image *im; + + re = (Render_Engine *)data; + im = _xre_image_new_from_data(re->xcbinf, w, h, image_data); + return im; +} + +static void * +eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + Render_Engine *re; + XR_Image *im; + + re = (Render_Engine *)data; + im = _xre_image_new_from_copied_data(re->xcbinf, w, h, image_data); + return im; +} + +static void +eng_image_free(void *data, void *image) +{ + if (!image) return; + _xre_image_free((XR_Image *)image); +} + +static void +eng_image_size_get(void *data, void *image, int *w, int *h) +{ + if (!image) return; + if (w) *w = ((XR_Image *)image)->w; + if (h) *h = ((XR_Image *)image)->h; +} + +static void * +eng_image_size_set(void *data, void *image, int w, int h) +{ + if (!image) return image; + if ((w <= 0) || (h <= 0)) + { + _xre_image_free((XR_Image *)image); + return NULL; + } + if (((XR_Image *)image)->references > 1) + { + XR_Image *old_image; + + old_image = (XR_Image *)image; + image = _xre_image_copy((XR_Image *)old_image); + if (image) + { + ((XR_Image *)image)->alpha = old_image->alpha; + _xre_image_free(old_image); + } + else + image = old_image; + } + else + _xre_image_dirty((XR_Image *)image); + _xre_image_resize((XR_Image *)image, w, h); + return image; +} + +static void * +eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h) +{ + if (!image) return image; + _xre_image_dirty((XR_Image *)image); + _xre_image_region_dirty((XR_Image *)image, x, y, w, h); + return image; +} + +static void * +eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data) +{ + if (!image) return image; + if (to_write) + { + if (((XR_Image *)image)->references > 1) + { + XR_Image *old_image; + + old_image = (XR_Image *)image; + image = _xre_image_copy((XR_Image *)old_image); + if (image) + { + ((XR_Image *)image)->alpha = old_image->alpha; + _xre_image_free(old_image); + } + else + image = old_image; + } + else + _xre_image_dirty((XR_Image *)image); + } + if (image_data) *image_data = _xre_image_data_get((XR_Image *)image); + return image; +} + +static void * +eng_image_data_put(void *data, void *image, DATA32 *image_data) +{ + if (!image) return image; + if (_xre_image_data_get((XR_Image *)image) != image_data) + { + XR_Image *old_image; + + old_image = (XR_Image *)image; + image = _xre_image_data_find(image_data); + if (image != old_image) + { + if (!image) + { + image = _xre_image_new_from_data(old_image->xcbinf, old_image->w, old_image->h, image_data); + if (image) + { + ((XR_Image *)image)->alpha = old_image->alpha; + _xre_image_free(old_image); + } + else + image = old_image; + } + else + { + _xre_image_free(old_image); + } + } + else + { + _xre_image_free(image); + } + } + return image; +} + +static void * +eng_image_alpha_set(void *data, void *image, int has_alpha) +{ + if (!image) return image; + if (((((XR_Image *)image)->alpha) && (has_alpha)) || + ((!((XR_Image *)image)->alpha) && (!has_alpha))) + return image; + if (((XR_Image *)image)->references > 1) + { + XR_Image *old_image; + + old_image = (XR_Image *)image; + image = _xre_image_copy((XR_Image *)old_image); + if (image) + { + ((XR_Image *)image)->alpha = old_image->alpha; + _xre_image_free(old_image); + } + else + image = old_image; + } + else + _xre_image_dirty((XR_Image *)image); + _xre_image_alpha_set((XR_Image *)image, has_alpha); + return image; +} + +static int +eng_image_alpha_get(void *data, void *image) +{ + if (!image) return 0; + return _xre_image_alpha_get((XR_Image *)image); +} + +static void * +eng_image_border_set(void *data, void *image, int l, int r, int t, int b) +{ + if (!image) return image; + _xre_image_border_set((XR_Image *)image, l, r, t, b); + return image; +} + +static void +eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b) +{ + if (!image) return; + _xre_image_border_get((XR_Image *)image, l, r, t, b); +} + +static void +eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth) +{ + if ((!image) || (!surface)) return; + _xre_image_surface_gen((XR_Image *)image); + if (((XR_Image *)image)->surface) + _xr_render_surface_composite(((XR_Image *)image)->surface, + (Xcb_Render_Surface *)surface, + (RGBA_Draw_Context *)context, + src_x, src_y, src_w, src_h, + dst_x, dst_y, dst_w, dst_h, + smooth); +} + +static const char * +eng_image_comment_get(void *data, void *image, char *key) +{ + if (!image) return NULL; + return ((XR_Image *)image)->comment; +} + +static char * +eng_image_format_get(void *data, void *image) +{ + if (!image) return NULL; + return ((XR_Image *)image)->format; +} + +static void +eng_image_colorspace_set(void *data, void *image, int cspace) +{ +} + +static int +eng_image_colorspace_get(void *data, void *image) +{ + return EVAS_COLORSPACE_ARGB8888; +} + +static void +eng_image_native_set(void *data, void *image, void *native) +{ +} + +static void * +eng_image_native_get(void *data, void *image) +{ + return NULL; +} + +static void +eng_image_cache_flush(void *data) +{ + int tmp_size; + + tmp_size = _xre_image_cache_get(); + pfunc.image_cache_flush(data); + _xre_image_cache_set(0); + _xre_image_cache_set(tmp_size); +} + +static void +eng_image_cache_set(void *data, int bytes) +{ + pfunc.image_cache_set(data, bytes); + _xre_image_cache_set(bytes); +} + +static int +eng_image_cache_get(void *data) +{ + return pfunc.image_cache_get(data); +} + +static void +eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text) +{ + Render_Engine *re; + RGBA_Image *im; + + re = (Render_Engine *)data; + + im = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), + ((Xcb_Render_Surface *)surface)->w, + ((Xcb_Render_Surface *)surface)->h, + surface, + 0, EVAS_COLORSPACE_ARGB8888); + + _xr_render_surface_clips_set((Xcb_Render_Surface *)surface, (RGBA_Draw_Context *)context, x, y, w, h); + + evas_common_draw_context_font_ext_set(context, + re->xcbinf, + _xre_font_surface_new, + _xre_font_surface_free, + _xre_font_surface_draw); + evas_common_font_draw(im, context, font, x, y, text); + evas_common_draw_context_font_ext_set(context, + NULL, + NULL, + NULL, + NULL); + evas_common_cpu_end_opt(); +} + +/* module advertising code */ +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + /* get whatever engine module we inherit from */ + if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0; + /* store it for later use */ + func = pfunc; + /* now to override methods */ +#define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_) + ORD(info); + ORD(info_free); + ORD(setup); + ORD(output_free); + ORD(output_resize); + ORD(output_tile_size_set); + ORD(output_redraws_rect_add); + ORD(output_redraws_rect_del); + ORD(output_redraws_clear); + ORD(output_redraws_next_update_get); + ORD(output_redraws_next_update_push); + ORD(output_flush); + ORD(output_idle_flush); + ORD(rectangle_draw); + ORD(line_draw); + ORD(polygon_draw); + ORD(gradient_new); + ORD(gradient_free); + ORD(gradient_color_stop_add); + ORD(gradient_alpha_stop_add); + ORD(gradient_color_data_set); + ORD(gradient_alpha_data_set); + ORD(gradient_clear); + ORD(gradient_fill_set); + ORD(gradient_fill_angle_set); + ORD(gradient_fill_spread_set); + ORD(gradient_angle_set); + ORD(gradient_offset_set); + ORD(gradient_direction_set); + ORD(gradient_type_set); + ORD(gradient_is_opaque); + ORD(gradient_is_visible); + ORD(gradient_render_pre); + ORD(gradient_render_post); + ORD(gradient_draw); + ORD(image_load); + ORD(image_new_from_data); + ORD(image_new_from_copied_data); + ORD(image_free); + ORD(image_size_get); + ORD(image_size_set); + ORD(image_dirty_region); + ORD(image_data_get); + ORD(image_data_put); + ORD(image_alpha_set); + ORD(image_alpha_get); + ORD(image_border_set); + ORD(image_border_get); + ORD(image_draw); + ORD(image_comment_get); + ORD(image_format_get); + ORD(image_colorspace_set); + ORD(image_colorspace_get); + ORD(image_native_set); + ORD(image_native_get); + ORD(image_cache_flush); + ORD(image_cache_set); + ORD(image_cache_get); + ORD(font_draw); + /* now advertise out own api */ + em->functions = (void *)(&func); + return 1; +} + +EAPI void +module_close(void) +{ +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_ENGINE, + "xrender_xcb", + "none" +}; diff --git a/src/modules/engines/xrender_xcb/evas_engine.h b/src/modules/engines/xrender_xcb/evas_engine.h new file mode 100644 index 0000000..88db2b6 --- /dev/null +++ b/src/modules/engines/xrender_xcb/evas_engine.h @@ -0,0 +1,184 @@ +#ifndef EVAS_ENGINE_H +#define EVAS_ENGINE_H + +#include +#include + +#include +#include +#include + +typedef struct _Xcb_Image_Info Xcb_Image_Info; +typedef struct _Xcb_Image_Image Xcb_Image_Image; +typedef struct _Xcb_Render_Surface Xcb_Render_Surface; + +struct _Xcb_Image_Info +{ + xcb_connection_t *conn; + xcb_drawable_t root; + xcb_drawable_t draw; + int depth; + xcb_visualid_t vis; + int pool_mem; + Evas_List *pool; + unsigned char can_do_shm; + xcb_render_pictforminfo_t *fmt32; + xcb_render_pictforminfo_t *fmt24; + xcb_render_pictforminfo_t *fmt8; + xcb_render_pictforminfo_t *fmt4; + xcb_render_pictforminfo_t *fmt1; + unsigned char mul_r; + unsigned char mul_g; + unsigned char mul_b; + unsigned char mul_a; + Xcb_Render_Surface *mul; + int references; +}; + +struct _Xcb_Image_Image +{ + Xcb_Image_Info *xcbinf; + xcb_image_t *xcbim; + xcb_shm_segment_info_t *shm_info; + int w; + int h; + int depth; + int line_bytes; + unsigned char *data; + unsigned char available : 1; +}; + +struct _Xcb_Render_Surface +{ + Xcb_Image_Info *xcbinf; + int w; + int h; + int depth; + xcb_render_pictforminfo_t *fmt; + xcb_drawable_t draw; + xcb_render_picture_t pic; + unsigned char alpha : 1; + unsigned char allocated : 1; + unsigned char bordered : 1; +}; + +/* ximage support calls (ximage vs xshmimage, cache etc.) */ +Xcb_Image_Info *_xr_image_info_get(xcb_connection_t *conn, xcb_drawable_t draw, xcb_visualid_t vis); +void _xr_image_info_free(Xcb_Image_Info *xcbinf); +void _xr_image_info_pool_flush(Xcb_Image_Info *xcbinf, int max_num, int max_mem); +Xcb_Image_Image *_xr_image_new(Xcb_Image_Info *xcbinf, int w, int h, int depth); +void _xr_image_free(Xcb_Image_Image *xim); +void _xr_image_put(Xcb_Image_Image *xim, xcb_drawable_t draw, int x, int y, int w, int h); + +/* xrender support calls */ +Xcb_Render_Surface *_xr_render_surface_new(Xcb_Image_Info *xcbinf, int w, int h, xcb_render_pictforminfo_t *fmt, int alpha); +Xcb_Render_Surface *_xr_render_surface_adopt(Xcb_Image_Info *xcbinf, xcb_drawable_t draw, int w, int h, int alpha); +Xcb_Render_Surface *_xr_render_surface_format_adopt(Xcb_Image_Info *xcbinf, xcb_drawable_t draw, int w, int h, xcb_render_pictforminfo_t *fmt, int alpha); +void _xr_render_surface_free(Xcb_Render_Surface *rs); +void _xr_render_surface_repeat_set(Xcb_Render_Surface *rs, int repeat); +void _xr_render_surface_solid_rectangle_set(Xcb_Render_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h); +void _xr_render_surface_argb_pixels_fill(Xcb_Render_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h); +void _xr_render_surface_rgb_pixels_fill(Xcb_Render_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h); +void _xr_render_surface_clips_set(Xcb_Render_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh); +void _xr_render_surface_composite(Xcb_Render_Surface *srs, Xcb_Render_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth); +void _xr_render_surface_copy(Xcb_Render_Surface *srs, Xcb_Render_Surface *drs, int sx, int sy, int x, int y, int w, int h); +void _xr_render_surface_rectangle_draw(Xcb_Render_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h); +void _xr_render_surface_line_draw(Xcb_Render_Surface *rs, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2); +void _xre_poly_draw(Xcb_Render_Surface *rs, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points); + + +typedef struct _XR_Image XR_Image; + +struct _XR_Image +{ + Xcb_Image_Info *xcbinf; + const char *file; + const char *key; + char *fkey; + RGBA_Image *im; + void *data; + int w, h; + Xcb_Render_Surface *surface; + int references; + char *format; + const char *comment; + Tilebuf *updates; + RGBA_Image_Loadopts load_opts; + unsigned char alpha : 1; + unsigned char dirty : 1; + unsigned char free_data : 1; +}; + +XR_Image *_xre_image_load(Xcb_Image_Info *xcbinf, const char *file, const char *key, Evas_Image_Load_Opts *lo); +XR_Image *_xre_image_new_from_data(Xcb_Image_Info *xcbinf, int w, int h, void *data); +XR_Image *_xre_image_new_from_copied_data(Xcb_Image_Info *xcbinf, int w, int h, void *data); +XR_Image *_xre_image_new(Xcb_Image_Info *xcbinf, int w, int h); +void _xre_image_resize(XR_Image *im, int w, int h); +void _xre_image_free(XR_Image *im); +void _xre_image_region_dirty(XR_Image *im, int x, int y, int w, int h); +void _xre_image_dirty(XR_Image *im); +XR_Image *_xre_image_copy(XR_Image *im); +void *_xre_image_data_get(XR_Image *im); +XR_Image *_xre_image_data_find(void *data); +void _xre_image_data_put(XR_Image *im, void *data); +void _xre_image_alpha_set(XR_Image *im, int alpha); +int _xre_image_alpha_get(XR_Image *im); +void _xre_image_border_set(XR_Image *im, int l, int r, int t, int b); +void _xre_image_border_get(XR_Image *im, int *l, int *r, int *t, int *b); +void _xre_image_surface_gen(XR_Image *im); +void _xre_image_cache_set(int size); +int _xre_image_cache_get(void); + +typedef struct _XR_Font_Surface XR_Font_Surface; + +struct _XR_Font_Surface +{ + Xcb_Image_Info *xcbinf; + RGBA_Font_Glyph *fg; + int w; + int h; + xcb_drawable_t draw; + xcb_render_picture_t pic; +}; + +XR_Font_Surface *_xre_font_surface_new (Xcb_Image_Info *xcbinf, + RGBA_Font_Glyph *fg); + +void _xre_font_surface_free (XR_Font_Surface *fs); + +void _xre_font_surface_draw (Xcb_Image_Info *xcbinf, + RGBA_Image *surface, + RGBA_Draw_Context *dc, + RGBA_Font_Glyph *fg, + int x, + int y); + +typedef struct _XR_Gradient XR_Gradient; + +struct _XR_Gradient +{ + Xcb_Image_Info *xcbinf; + Xcb_Render_Surface *surface; + RGBA_Gradient *grad; + unsigned char changed; + int sw, sh; +}; + +/* gradient */ +XR_Gradient *_xre_gradient_new(Xcb_Image_Info *xcbinf); +void _xre_gradient_free(XR_Gradient *gr); +void _xre_gradient_color_stop_add(XR_Gradient *gr, int r, int g, int b, int a, int delta); +void _xre_gradient_alpha_stop_add(XR_Gradient *gr, int a, int delta); +void _xre_gradient_color_data_set(XR_Gradient *gr, void *map, int len, int has_alpha); +void _xre_gradient_alpha_data_set(XR_Gradient *gr, void *alpha_map, int len); +void _xre_gradient_clear(XR_Gradient *gr); +void _xre_gradient_fill_set(XR_Gradient *gr, int x, int y, int w, int h); +void _xre_gradient_fill_angle_set(XR_Gradient *gr, double angle); +void _xre_gradient_fill_spread_set(XR_Gradient *gr, int spread); +void _xre_gradient_angle_set(XR_Gradient *gr, double angle); +void _xre_gradient_offset_set(XR_Gradient *gr, float offset); +void _xre_gradient_direction_set(XR_Gradient *gr, int direction); +void _xre_gradient_type_set(XR_Gradient *gr, char *name, char *params); +void _xre_gradient_draw(Xcb_Render_Surface *rs, RGBA_Draw_Context *dc, XR_Gradient *gr, int x, int y, int w, int h); + +#endif diff --git a/src/modules/engines/xrender_xcb/evas_engine_font.c b/src/modules/engines/xrender_xcb/evas_engine_font.c new file mode 100644 index 0000000..5c9aeae --- /dev/null +++ b/src/modules/engines/xrender_xcb/evas_engine_font.c @@ -0,0 +1,203 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_XRender_Xcb.h" + +static Evas_Hash *_xr_fg_pool = NULL; + +XR_Font_Surface * +_xre_font_surface_new(Xcb_Image_Info *xcbinf, RGBA_Font_Glyph *fg) +{ + char buf[256]; + char buf2[256]; + XR_Font_Surface *fs; + DATA8 *data; + int w, h, j; + Xcb_Image_Image *xcim; + Evas_Hash *pool; + uint32_t mask; + uint32_t values[3]; + + data = fg->glyph_out->bitmap.buffer; + w = fg->glyph_out->bitmap.width; + h = fg->glyph_out->bitmap.rows; + j = fg->glyph_out->bitmap.pitch; + if (j < w) j = w; + if ((w <= 0) || (h <= 0)) return NULL; + + if (fg->ext_dat) + { + fs = fg->ext_dat; + if ((fs->xcbinf->conn == xcbinf->conn) && + (fs->xcbinf->root == xcbinf->root)) + return fs; + snprintf(buf, sizeof(buf), "@%p@/@%x@", fs->xcbinf->conn, fs->xcbinf->root); + pool = evas_hash_find(_xr_fg_pool, buf); + if (pool) + { + snprintf(buf, sizeof(buf), "%p", fg); + fs = evas_hash_find(pool, buf); + if (fs) return fs; + } + } + + fs = calloc(1, sizeof(XR_Font_Surface)); + if (!fs) return NULL; + + fs->xcbinf = xcbinf; + fs->fg = fg; + fs->xcbinf->references++; + fs->w = w; + fs->h = h; + + snprintf(buf, sizeof(buf), "@%p@/@%x@", fs->xcbinf->conn, fs->xcbinf->root); + pool = evas_hash_find(_xr_fg_pool, buf); + snprintf(buf2, sizeof(buf2), "%p", fg); + pool = evas_hash_add(pool, buf2, fs); + _xr_fg_pool = evas_hash_add(_xr_fg_pool, buf, pool); + + fs->draw = xcb_generate_id(xcbinf->conn); + xcb_create_pixmap(xcbinf->conn, xcbinf->fmt8->depth, fs->draw, xcbinf->root, w, h); + + mask = XCB_RENDER_CP_REPEAT | XCB_RENDER_CP_DITHER | XCB_RENDER_CP_COMPONENT_ALPHA; + values[0] = 0; + values[1] = 0; + values[2] = 0; + fs->pic = xcb_generate_id(xcbinf->conn); + xcb_render_create_picture(xcbinf->conn, fs->pic, fs->draw, xcbinf->fmt8->id, mask, values); + + xcim = _xr_image_new(fs->xcbinf, w, h, xcbinf->fmt8->depth); + if ((fg->glyph_out->bitmap.num_grays == 256) && + (fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays)) + { + int x, y; + DATA8 *p1, *p2; + + for (y = 0; y < h; y++) + { + p1 = data + (j * y); + p2 = ((DATA8 *)xcim->data) + (xcim->line_bytes * y); + for (x = 0; x < w; x++) + { + *p2 = *p1; + p1++; + p2++; + } + } + + } + else + { + DATA8 *tmpbuf = NULL, *dp, *tp, bits; + int bi, bj, end; + const DATA8 bitrepl[2] = {0x0, 0xff}; + + tmpbuf = alloca(w); + { + int x, y; + DATA8 *p1, *p2; + + for (y = 0; y < h; y++) + { + p1 = tmpbuf; + p2 = ((DATA8 *)xcim->data) + (xcim->line_bytes * y); + tp = tmpbuf; + dp = data + (y * fg->glyph_out->bitmap.pitch); + for (bi = 0; bi < w; bi += 8) + { + bits = *dp; + if ((w - bi) < 8) end = w - bi; + else end = 8; + for (bj = 0; bj < end; bj++) + { + *tp = bitrepl[(bits >> (7 - bj)) & 0x1]; + tp++; + } + dp++; + } + for (x = 0; x < w; x++) + { + *p2 = *p1; + p1++; + p2++; + } + } + } + } + _xr_image_put(xcim, fs->draw, 0, 0, w, h); + return fs; +} + +static Evas_Bool +_xre_font_pool_cb(const Evas_Hash *hash, const char *key, void *data, void *fdata) +{ + char buf[256]; + Evas_Hash *pool; + XR_Font_Surface *fs; + + fs = fdata; + pool = data; + snprintf(buf, sizeof(buf), "@%p@/@%x@", fs->xcbinf->conn, fs->xcbinf->root); + pool = evas_hash_del(pool, buf, fs); + hash = evas_hash_modify(hash, key, pool); + return 1; +} + +void +_xre_font_surface_free(XR_Font_Surface *fs) +{ + if (!fs) return; + evas_hash_foreach(_xr_fg_pool, _xre_font_pool_cb, fs); + xcb_free_pixmap(fs->xcbinf->conn, fs->draw); + xcb_render_free_picture(fs->xcbinf->conn, fs->pic); + _xr_image_info_free(fs->xcbinf); + free(fs); +} + +void +_xre_font_surface_draw(Xcb_Image_Info *xcbinf, RGBA_Image *surface, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y) +{ + XR_Font_Surface *fs; + Xcb_Render_Surface *target_surface; + xcb_rectangle_t rect; + int r; + int g; + int b; + int a; + + fs = fg->ext_dat; + if (!fs) return; + target_surface = (Xcb_Render_Surface *)(surface->image.data); + a = (dc->col.col >> 24) & 0xff; + r = (dc->col.col >> 16) & 0xff; + g = (dc->col.col >> 8 ) & 0xff; + b = (dc->col.col ) & 0xff; + if ((fs->xcbinf->mul_r != r) || (fs->xcbinf->mul_g != g) || + (fs->xcbinf->mul_b != b) || (fs->xcbinf->mul_a != a)) + { + fs->xcbinf->mul_r = r; + fs->xcbinf->mul_g = g; + fs->xcbinf->mul_b = b; + fs->xcbinf->mul_a = a; + _xr_render_surface_solid_rectangle_set(fs->xcbinf->mul, r, g, b, a, 0, 0, 1, 1); + } + rect.x = x; + rect.y = y; + rect.width = fs->w; + rect.height = fs->h; + if ((dc) && (dc->clip.use)) + { + RECTS_CLIP_TO_RECT(rect.x, rect.y, rect.width, rect.height, + dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h); + } + xcb_render_set_picture_clip_rectangles(target_surface->xcbinf->conn, + target_surface->pic, 0, 0, 1, &rect); + xcb_render_composite(fs->xcbinf->conn, XCB_RENDER_PICT_OP_OVER, + fs->xcbinf->mul->pic, + fs->pic, + target_surface->pic, + 0, 0, + 0, 0, + x, y, + fs->w, fs->h); +} diff --git a/src/modules/engines/xrender_xcb/evas_engine_gradient.c b/src/modules/engines/xrender_xcb/evas_engine_gradient.c new file mode 100644 index 0000000..6f9f292 --- /dev/null +++ b/src/modules/engines/xrender_xcb/evas_engine_gradient.c @@ -0,0 +1,182 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_XRender_Xcb.h" +#include + +XR_Gradient * +_xre_gradient_new(Xcb_Image_Info *xcbinf) +{ + XR_Gradient *gr; + + if (!xcbinf) return NULL; + gr = calloc(1, sizeof(XR_Gradient)); + if (!gr) return NULL; + gr->grad = evas_common_gradient_new(); + if (!gr->grad) + { + free(gr); + return NULL; + } + gr->xcbinf = xcbinf; + gr->xcbinf->references++; + gr->changed = 1; + return gr; +} + +void +_xre_gradient_free(XR_Gradient *gr) +{ + if (!gr) return; + if (gr->grad) + evas_common_gradient_free(gr->grad); + if (gr->surface) + _xr_render_surface_free(gr->surface); + _xr_image_info_free(gr->xcbinf); + free(gr); +} + +void +_xre_gradient_color_stop_add(XR_Gradient *gr, int r, int g, int b, int a, int delta) +{ + if (!gr) return; + evas_common_gradient_color_stop_add(gr->grad, r, g, b, a, delta); + gr->changed = 1; +} + +void +_xre_gradient_alpha_stop_add(XR_Gradient *gr, int a, int delta) +{ + if (!gr) return; + evas_common_gradient_alpha_stop_add(gr->grad, a, delta); + gr->changed = 1; +} + +void +_xre_gradient_clear(XR_Gradient *gr) +{ + if (!gr) return; + evas_common_gradient_clear(gr->grad); + gr->changed = 1; +} + +void +_xre_gradient_color_data_set(XR_Gradient *gr, void *map, int len, int has_alpha) +{ + evas_common_gradient_color_data_set(gr->grad, map, len, has_alpha); + gr->changed = 1; +} + +void +_xre_gradient_alpha_data_set(XR_Gradient *gr, void *amap, int len) +{ + evas_common_gradient_alpha_data_set(gr->grad, amap, len); + gr->changed = 1; +} + +void +_xre_gradient_fill_set(XR_Gradient *gr, int x, int y, int w, int h) +{ + if (!gr) return; + evas_common_gradient_fill_set(gr->grad, x, y, w, h); + gr->changed = 1; +} + +void +_xre_gradient_fill_angle_set(XR_Gradient *gr, double angle) +{ + if (!gr) return; + evas_common_gradient_fill_angle_set(gr->grad, angle); + gr->changed = 1; +} + +void +_xre_gradient_fill_spread_set(XR_Gradient *gr, int spread) +{ + if (!gr) return; + evas_common_gradient_fill_spread_set(gr->grad, spread); + gr->changed = 1; +} + +void +_xre_gradient_angle_set(XR_Gradient *gr, double angle) +{ + if (!gr) return; + evas_common_gradient_map_angle_set(gr->grad, angle); + gr->changed = 1; +} + +void +_xre_gradient_offset_set(XR_Gradient *gr, float offset) +{ + if (!gr) return; + evas_common_gradient_map_offset_set(gr->grad, offset); + gr->changed = 1; +} + +void +_xre_gradient_direction_set(XR_Gradient *gr, int direction) +{ + if (!gr) return; + evas_common_gradient_map_direction_set(gr->grad, direction); + gr->changed = 1; +} + +void +_xre_gradient_type_set(XR_Gradient *gr, char *name, char *params) +{ + if (!gr) return; + evas_common_gradient_type_set(gr->grad, name, params); + gr->changed = 1; +} + +void +_xre_gradient_draw(Xcb_Render_Surface *rs, RGBA_Draw_Context *dc, XR_Gradient *gr, int x, int y, int w, int h) +{ + int alpha = 0; + + if ((w < 1) || (h < 1)) return; + if (!rs || !dc || !gr) return; + if (!gr->xcbinf || !gr->grad || !gr->grad->type.geometer) return; + + if (gr->grad->type.geometer->has_alpha(gr->grad, dc->render_op) || + gr->grad->type.geometer->has_mask(gr->grad, dc->render_op)) + alpha = 1; + if (((gr->sw != w) || (gr->sh != h)) && gr->surface) + { + _xr_render_surface_free(gr->surface); + gr->surface = NULL; + gr->changed = 1; + } + if (!gr->surface) + { + gr->surface = _xr_render_surface_new(gr->xcbinf, w, h, gr->xcbinf->fmt32, 1); + if (!gr->surface) return; + gr->changed = 1; + } + if (gr->changed) + { + int op = dc->render_op, cuse = dc->clip.use; + RGBA_Image *im; + + im = (RGBA_Image*) evas_cache_image_empty(evas_common_image_cache_get()); + if (!im) + { + _xr_render_surface_free(gr->surface); + gr->surface = NULL; + return; + } + evas_cache_image_surface_alloc(&im->cache_entry, w, h); + dc->render_op = _EVAS_RENDER_FILL; + dc->clip.use = 0; + evas_common_gradient_draw(im, dc, 0, 0, w, h, gr->grad); + _xr_render_surface_argb_pixels_fill(gr->surface, w, h, im->image.data, 0, 0, w, h); + evas_cache_image_drop(&im->cache_entry); + dc->render_op = op; + dc->clip.use = cuse; + } + gr->surface->alpha = alpha; + _xr_render_surface_composite(gr->surface, rs, dc, 0, 0, gr->surface->w, gr->surface->h, x, y, w, h, 0); + gr->changed = 0; + gr->sw = w; gr->sh = h; +} diff --git a/src/modules/engines/xrender_xcb/evas_engine_image.c b/src/modules/engines/xrender_xcb/evas_engine_image.c new file mode 100644 index 0000000..f7b37b1 --- /dev/null +++ b/src/modules/engines/xrender_xcb/evas_engine_image.c @@ -0,0 +1,614 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_XRender_Xcb.h" + +static Evas_Hash *_xr_image_hash = NULL; +static int _xr_image_cache_size = 0; +static int _xr_image_cache_usage = 0; +static Evas_List *_xr_image_cache = NULL; +static Evas_Hash *_xr_image_dirty_hash = NULL; + +static void +__xre_image_dirty_hash_add(XR_Image *im) +{ + char buf[64]; + + if (!im->data) return; + snprintf(buf, sizeof(buf), "%p", im->data); + _xr_image_dirty_hash = evas_hash_add(_xr_image_dirty_hash, buf, im); +} + +static void +__xre_image_dirty_hash_del(XR_Image *im) +{ + char buf[64]; + + if (!im->data) return; + snprintf(buf, sizeof(buf), "%p", im->data); + _xr_image_dirty_hash = evas_hash_del(_xr_image_dirty_hash, buf, im); +} + +static XR_Image * +__xre_image_dirty_hash_find(void *data) +{ + char buf[64]; + + snprintf(buf, sizeof(buf), "%p", data); + return evas_hash_find(_xr_image_dirty_hash, buf); +} + +static XR_Image * +__xre_image_find(char *fkey) +{ + XR_Image *im; + + im = evas_hash_find(_xr_image_hash, fkey); + if (!im) + { + Evas_List *l; + + for (l = _xr_image_cache; l; l = l->next) + { + im = l->data; + if (!strcmp(im->fkey, fkey)) + { + _xr_image_cache = evas_list_remove_list(_xr_image_cache, l); + _xr_image_hash = evas_hash_add(_xr_image_hash, im->fkey, im); + _xr_image_cache_usage -= (im->w * im->h * 4); + break; + } + im = NULL; + } + } + if (im) im->references++; + return im; +} + +XR_Image * +_xre_image_load(Xcb_Image_Info *xcbinf, const char *file, const char *key, Evas_Image_Load_Opts *lo) +{ + char buf[4096]; + XR_Image *im; + + if (!file) return NULL; + if (!lo) + { + if (key) + snprintf(buf, sizeof(buf), "/@%p@%x@/%s//://%s", xcbinf->conn, xcbinf->root, file, key); + else + snprintf(buf, sizeof(buf), "/@%p@%x@/%s", xcbinf->conn, xcbinf->root, file); + } + else + { + if (key) + snprintf(buf, sizeof(buf), "//@/%i/%1.5f/%ix%i//@%p@%x@/%s//://%s", lo->scale_down_by, lo->dpi, lo->w, lo->h, xcbinf->conn, xcbinf->root, file, key); + else + snprintf(buf, sizeof(buf), "//@/%i/%1.5f/%ix%i//@%p@%x@/%s", lo->scale_down_by, lo->dpi, lo->w, lo->h, xcbinf->conn, xcbinf->root, file); + } + im = __xre_image_find(buf); + if (im) + { + return im; + } + + im = calloc(1, sizeof(XR_Image)); + if (!im) return NULL; + im->im = evas_common_load_image_from_file(file, key, lo); + if (!im->im) + { + free(im); + return NULL; + } + im->xcbinf = xcbinf; + im->xcbinf->references++; + im->fkey = strdup(buf); + im->file = (char *)evas_stringshare_add(file); + if (key) im->key = (char *)evas_stringshare_add(key); + im->w = im->im->cache_entry.w; + im->h = im->im->cache_entry.h; + im->references = 1; + if (lo) im->load_opts = *lo; + if (im->im->info.comment) im->comment = (char *)evas_stringshare_add(im->im->info.comment); +/* if (im->im->info.format == 1) im->format = evas_stringshare_add("png"); */ + if (im->im->cache_entry.flags.alpha) im->alpha = 1; + _xr_image_hash = evas_hash_direct_add(_xr_image_hash, im->fkey, im); + return im; +} + +XR_Image * +_xre_image_new_from_data(Xcb_Image_Info *xcbinf, int w, int h, void *data) +{ + XR_Image *im; + + im = calloc(1, sizeof(XR_Image)); + if (!im) return NULL; + im->xcbinf = xcbinf; + im->xcbinf->references++; + im->w = w; + im->h = h; + im->references = 1; + im->data = data; + im->alpha = 1; + im->dirty = 1; + __xre_image_dirty_hash_add(im); + return im; +} + +XR_Image * +_xre_image_new_from_copied_data(Xcb_Image_Info *xcbinf, int w, int h, void *data) +{ + XR_Image *im; + + im = calloc(1, sizeof(XR_Image)); + if (!im) return NULL; + im->data = malloc(w * h * 4); + if (!im->data) + { + free(im); + return NULL; + } + if (data) + { + Gfx_Func_Copy func; + + func = evas_common_draw_func_copy_get(w * h, 0); + if (func) func(data, im->data, w * h); + evas_common_cpu_end_opt(); + } + im->w = w; + im->h = h; + im->references = 1; + im->xcbinf = xcbinf; + im->xcbinf->references++; + im->free_data = 1; + im->alpha = 1; + im->dirty = 1; + __xre_image_dirty_hash_add(im); + return im; +} + +XR_Image * +_xre_image_new(Xcb_Image_Info *xcbinf, int w, int h) +{ + XR_Image *im; + + im = calloc(1, sizeof(XR_Image)); + if (!im) return NULL; + im->data = malloc(w * h * 4); + if (!im->data) + { + free(im); + return NULL; + } + im->w = w; + im->h = h; + im->references = 1; + im->xcbinf = xcbinf; + im->xcbinf->references++; + im->free_data = 1; + im->alpha = 1; + im->dirty = 1; + __xre_image_dirty_hash_add(im); + return im; +} + +static void +__xre_image_real_free(XR_Image *im) +{ + if (im->file) evas_stringshare_del(im->file); + if (im->key) evas_stringshare_del(im->key); + if (im->fkey) free(im->fkey); + if (im->im) evas_cache_image_drop(&im->im->cache_entry); + if ((im->data) && (im->dirty)) __xre_image_dirty_hash_del(im); + if ((im->free_data) && (im->data)) free(im->data); + if (im->surface) _xr_render_surface_free(im->surface); + if (im->format) evas_stringshare_del(im->format); + if (im->comment) evas_stringshare_del(im->comment); + if (im->updates) evas_common_tilebuf_free(im->updates); + _xr_image_info_free(im->xcbinf); + free(im); +} + +void +_xre_image_free(XR_Image *im) +{ + im->references--; + if (im->references != 0) return; + if (!im->dirty) + { + if (im->fkey) + _xr_image_hash = evas_hash_del(_xr_image_hash, im->fkey, im); + _xr_image_cache = evas_list_prepend(_xr_image_cache, im); + _xr_image_cache_usage += (im->w * im->h * 4); + _xre_image_cache_set(_xr_image_cache_size); + } + else + { + __xre_image_real_free(im); + } +} + +void +_xre_image_region_dirty(XR_Image *im, int x, int y, int w, int h) +{ + if (!im->updates) + { + im->updates = evas_common_tilebuf_new(im->w, im->h); + if (im->updates) evas_common_tilebuf_set_tile_size(im->updates, 8, 8); + } + if (im->updates) + evas_common_tilebuf_add_redraw(im->updates, x, y, w, h); +} + +void +_xre_image_dirty(XR_Image *im) +{ + if (im->dirty) return; + if (im->fkey) + _xr_image_hash = evas_hash_del(_xr_image_hash, im->fkey, im); + im->dirty = 1; + __xre_image_dirty_hash_add(im); +} + +XR_Image * +_xre_image_copy(XR_Image *im) +{ + XR_Image *im2; + void *data = NULL; + + if (im->data) data = im->data; + else + { + if (!im->im) im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts)); + if (im->im) + { + evas_cache_image_load_data(&im->im->cache_entry); + data = im->im->image.data; + } + } + if (!data) return NULL; + im2 = _xre_image_new_from_copied_data(im->xcbinf, im->w, im->h, data); + if (im2) im2->alpha = im->alpha; + if ((im->im) && (!im->dirty)) + { + evas_cache_image_drop(&im->im->cache_entry); + im->im = NULL; + } + return im2; +} + +void +_xre_image_resize(XR_Image *im, int w, int h) +{ + if ((w == im->w) && (h == im->h)) return; + if (im->surface) + { + Xcb_Render_Surface *old_surface; + int x = 0, y = 0, ww, hh; + + ww = w; hh = h; + RECTS_CLIP_TO_RECT(x, y, ww, hh, 0, 0, im->w, im->h); + old_surface = im->surface; + im->surface = _xr_render_surface_new(old_surface->xcbinf, + w + 1, h + 1, old_surface->fmt, old_surface->alpha); + if (im->surface) + _xr_render_surface_copy(old_surface, im->surface, 0, 0, 0, 0, ww, hh); + _xr_render_surface_free(old_surface); + } + if (im->data) + { + Gfx_Func_Copy func; + int x = 0, y = 0, ww, hh; + unsigned int *sp, *dp; + void *data; + + data = malloc(w * h * 4); + if (!data) + { + if (im->surface) + { + _xr_render_surface_free(im->surface); + im->surface = NULL; + } + return; + } + ww = w; hh = h; + + RECTS_CLIP_TO_RECT(x, y, ww, hh, 0, 0, im->w, im->h); + func = evas_common_draw_func_copy_get(w * h, 0); + if (func) + { + for (y = 0; y < hh; y++) + { + sp = ((unsigned int *)im->data) + (y * im->w); + dp = ((unsigned int *)data) + (y * w); + func(sp, dp, ww); + } + evas_common_cpu_end_opt(); + } + __xre_image_dirty_hash_del(im); + free(im->data); + im->data = data; + __xre_image_dirty_hash_add(im); + } + else if (im->im) + { + RGBA_Image *im_old; + + im_old = im->im; + im->im = (RGBA_Image*) evas_cache_image_empty(evas_common_image_cache_get()); + if (!im->im) + { + im->im = im_old; + if (im->surface) + { + _xr_render_surface_free(im->surface); + im->surface = NULL; + } + return; + } + evas_cache_image_load_data(&im->im->cache_entry); + if (im_old->image.data) + { + int x = 0, y = 0, ww, hh; + + ww = w; hh = h; + RECTS_CLIP_TO_RECT(x, y, ww, hh, 0, 0, im->w, im->h); + evas_common_blit_rectangle(im_old, im->im, 0, 0, ww, hh, 0, 0); + evas_common_cpu_end_opt(); + } + im->free_data = 1; + /* FIXME: Hum ? */ + im->data = im->im->image.data; + im->im->image.data = NULL; + evas_cache_image_drop(&im->im->cache_entry); + im->im = NULL; + evas_cache_image_drop(&im_old->cache_entry); + __xre_image_dirty_hash_add(im); + } + else + { + im->data = malloc(w * h * 4); + im->free_data = 1; + __xre_image_dirty_hash_add(im); + } + im->w = w; + im->h = h; +} + +void * +_xre_image_data_get(XR_Image *im) +{ + void *data = NULL; + + if (im->data) data = im->data; + else + { + if (!im->im) im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts)); + if (im->im) + { + evas_cache_image_load_data(&im->im->cache_entry); + data = im->im->image.data; + } + } + return data; +} + +XR_Image * +_xre_image_data_find(void *data) +{ + XR_Image *im; + + im = __xre_image_dirty_hash_find(data); + if (im) + { + im->references++; + } + return im; +} + +void +_xre_image_data_put(XR_Image *im, void *data) +{ + void *imdata = NULL; + + if (!data) return; + if (im->data) + { + imdata = im->data; + if (data == imdata) return; + __xre_image_dirty_hash_del(im); + if (im->free_data) free(im->data); + } + else + { + if (im->im) imdata = im->im->image.data; + if (data == imdata) return; + if (im->im) + { + evas_cache_image_drop(&im->im->cache_entry); + im->im = NULL; + } + } + im->data = data; + __xre_image_dirty_hash_add(im); + im->free_data = 0; + if (im->surface) + { + _xr_render_surface_free(im->surface); + im->surface = NULL; + } + if (!im->dirty) + { + if (im->fkey) + _xr_image_hash = evas_hash_del(_xr_image_hash, im->fkey, im); + im->dirty = 1; + } + if (im->updates) + { + evas_common_tilebuf_free(im->updates); + im->updates = NULL; + } +} + +void +_xre_image_alpha_set(XR_Image *im, int alpha) +{ + if (im->alpha == alpha) return; + im->alpha = alpha; + if (im->surface) + { + Xcb_Render_Surface *old_surface; + + old_surface = im->surface; + im->surface = NULL; + if (im->alpha) + im->surface = _xr_render_surface_new(im->xcbinf, + im->w + 1, im->h + 1, im->xcbinf->fmt32, 1); + else + im->surface = _xr_render_surface_new(im->xcbinf, + im->w + 1, im->h + 1, im->xcbinf->fmt24, 0); + if (im->surface) + _xr_render_surface_copy(old_surface, + im->surface, 0, 0, 0, 0, im->w + 1, im->h + 1); + _xr_render_surface_free(old_surface); + } + if (im->updates) + { + evas_common_tilebuf_free(im->updates); + im->updates = NULL; + } +} + +int +_xre_image_alpha_get(XR_Image *im) +{ + return im->alpha; +} + +void +_xre_image_border_set(XR_Image *im, int l, int r, int t, int b) +{ + if (!im) return; + _xre_image_surface_gen(im); + if (l < 1) l = 0; + if (r < 1) r = 0; + if (t < 1) t = 0; + if (b < 1) b = 0; + if (im->surface) + { + if (l | r | t | b) + im->surface->bordered = 1; + else + im->surface->bordered = 0; + } +} + +void +_xre_image_border_get(XR_Image *im, int *l, int *r, int *t, int *b) +{ +} + +void +_xre_image_surface_gen(XR_Image *im) +{ + void *data = NULL; + + if ((im->surface) && (!im->updates)) return; + if (im->data) data = im->data; + else + { + if (!im->im) im->im = evas_common_load_image_from_file(im->file, im->key, &(im->load_opts)); + if (im->im) + { + evas_cache_image_load_data(&im->im->cache_entry); + data = im->im->image.data; + } + } + if (!data) return; + if (im->surface) + { + if (im->updates) + { + Tilebuf_Rect *rects, *r; + + rects = evas_common_tilebuf_get_render_rects(im->updates); + if (rects) + { + for (r = rects; r; r = (Tilebuf_Rect *)((Evas_Object_List *)r)->next) + { + int rx, ry, rw, rh; + + rx = r->x; ry = r->y; rw = r->w, rh = r->h; + RECTS_CLIP_TO_RECT(rx, ry, rw, rh, 0, 0, im->w, im->h); + if (im->alpha) + _xr_render_surface_argb_pixels_fill(im->surface, im->w, im->h, data, rx, ry, rw, rh); + else + _xr_render_surface_rgb_pixels_fill(im->surface, im->w, im->h, data, rx, ry, rw, rh); + } + evas_common_tilebuf_free_render_rects(rects); + } + evas_common_tilebuf_free(im->updates); + im->updates = NULL; + } + return; + } + if (im->alpha) + { + im->surface = _xr_render_surface_new(im->xcbinf, + im->w + 1, im->h + 1, im->xcbinf->fmt32, 1); + _xr_render_surface_argb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h); + } + else + { + im->surface = _xr_render_surface_new(im->xcbinf, + im->w + 1, im->h + 1, im->xcbinf->fmt24, 0); + _xr_render_surface_rgb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h); + } + /* fill right and bottom pixel so interpolation works right */ + _xr_render_surface_copy(im->surface, im->surface, + im->w - 1, 0, + im->w, 0, + 1, im->h); + _xr_render_surface_copy(im->surface, im->surface, + 0, im->h - 1, + 0, im->h, + im->w, 1); + _xr_render_surface_copy(im->surface, im->surface, + im->w - 1, im->h - 1, + im->w, im->h, + 1, 1); + if ((im->im) && (!im->dirty)) + { + evas_cache_image_drop(&im->im->cache_entry); + im->im = NULL; + } +} + +void +_xre_image_cache_set(int size) +{ + _xr_image_cache_size = size; + while (_xr_image_cache_usage > _xr_image_cache_size) + { + Evas_List *l; + + l = evas_list_last(_xr_image_cache); + if (l) + { + XR_Image *im; + + im = l->data; + _xr_image_cache = evas_list_remove_list(_xr_image_cache, l); + _xr_image_cache_usage -= (im->w * im->h * 4); + __xre_image_real_free(im); + } + } +} + +int +_xre_image_cache_get(void) +{ + return _xr_image_cache_size; +} diff --git a/src/modules/engines/xrender_xcb/evas_engine_ximage.c b/src/modules/engines/xrender_xcb/evas_engine_ximage.c new file mode 100644 index 0000000..da86c7f --- /dev/null +++ b/src/modules/engines/xrender_xcb/evas_engine_ximage.c @@ -0,0 +1,580 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_XRender_Xcb.h" + +static Evas_List *_image_info_list = NULL; + +static int _xcb_err = 0; + +enum +{ + xcb_render_pictforminfo_id = 1 << 0, + xcb_render_pictforminfo_type_t = 1 << 1, + xcb_render_pictforminfo_depth_t = 1 << 2, + xcb_render_pictforminfo_red_shift_t = 1 << 3, + xcb_render_pictforminfo_red_mask_t = 1 << 4, + xcb_render_pictforminfo_green_shift_t = 1 << 5, + xcb_render_pictforminfo_green_mask_t = 1 << 6, + xcb_render_pictforminfo_blue_shift_t = 1 << 7, + xcb_render_pictforminfo_blue_mask_t = 1 << 8, + xcb_render_pictforminfo_alpha_shift_t = 1 << 9, + xcb_render_pictforminfo_alpha_mask_t = 1 << 10, + xcb_render_pictforminfo_colormap_t = 1 << 11, +}; + +enum +{ + xcb_render_standard_pictforminfoargb_32_t, + xcb_render_standard_pictforminforgb_24_t, + xcb_render_standard_pictforminfoa_8_t, + xcb_render_standard_pictforminfoa_4_t, + xcb_render_standard_pictforminfoa_1_t, + xcb_render_standard_pictforminfo_count_t +}; + +static xcb_render_pictforminfo_t * +xcb_render_find_pictforminfo (xcb_connection_t *conn, uint32_t mask, const xcb_render_pictforminfo_t *template, int count) +{ + xcb_render_query_pict_formats_cookie_t cookie; + xcb_render_query_pict_formats_reply_t *rep; + xcb_render_pictforminfo_iterator_t iter_forminfo; + + cookie = xcb_render_query_pict_formats_unchecked (conn); + rep = xcb_render_query_pict_formats_reply (conn, cookie, NULL); + iter_forminfo = xcb_render_query_pict_formats_formats_iterator (rep); + for (; iter_forminfo.rem; xcb_render_pictforminfo_next (&iter_forminfo)) { + if (mask & xcb_render_pictforminfo_id) + if (template->id != iter_forminfo.data->id) + continue; + if (mask & xcb_render_pictforminfo_type_t) + if (template->type != iter_forminfo.data->type) + continue; + if (mask & xcb_render_pictforminfo_depth_t) + if (template->depth != iter_forminfo.data->depth) + continue; + if (mask & xcb_render_pictforminfo_red_shift_t) + if (template->direct.red_shift != iter_forminfo.data->direct.red_shift) + continue; + if (mask & xcb_render_pictforminfo_red_mask_t) + if (template->direct.red_mask != iter_forminfo.data->direct.red_mask) + continue; + if (mask & xcb_render_pictforminfo_green_shift_t) + if (template->direct.green_shift != iter_forminfo.data->direct.green_shift) + continue; + if (mask & xcb_render_pictforminfo_green_mask_t) + if (template->direct.green_mask != iter_forminfo.data->direct.green_mask) + continue; + if (mask & xcb_render_pictforminfo_blue_shift_t) + if (template->direct.blue_shift != iter_forminfo.data->direct.blue_shift) + continue; + if (mask & xcb_render_pictforminfo_blue_mask_t) + if (template->direct.blue_mask != iter_forminfo.data->direct.blue_mask) + continue; + if (mask & xcb_render_pictforminfo_alpha_shift_t) + if (template->direct.alpha_shift != iter_forminfo.data->direct.alpha_shift) + continue; + if (mask & xcb_render_pictforminfo_alpha_mask_t) + if (template->direct.alpha_mask != iter_forminfo.data->direct.alpha_mask) + continue; + if (mask & xcb_render_pictforminfo_colormap_t) + if (template->colormap != iter_forminfo.data->colormap) + continue; + if (count-- == 0) { + xcb_render_pictforminfo_t *forminfo; + + forminfo = (xcb_render_pictforminfo_t *)malloc (sizeof (xcb_render_pictforminfo_t)); + memcpy (forminfo, iter_forminfo.data, sizeof (xcb_render_pictforminfo_t)); + + free (rep); + return forminfo; + } + } + free (rep); + return NULL; +} + +static xcb_render_pictforminfo_t * +xcb_render_find_standard_pictforminfo (xcb_connection_t *conn, int format) +{ + xcb_render_pictforminfo_t *forminfo = NULL; + struct { + xcb_render_pictforminfo_t template; + uint32_t mask; + } standardFormats[xcb_render_standard_pictforminfo_count_t] = { + /* StandardPICTFORMINFOARGB32 */ + { + { + 0, /* id */ + XCB_RENDER_PICT_TYPE_DIRECT, /* type */ + 32, /* depth */ + { 0, 0 }, /* pad */ + { /* direct */ + 16, /* direct.red_shift */ + 0xff, /* direct.red_mask */ + 8, /* direct.green_shift */ + 0xff, /* direct.green_mask */ + 0, /* direct.blue_shift */ + 0xff, /* direct.blue_mask */ + 24, /* direct.alpha_shift */ + 0xff /* direct.alpha_mask */ + }, + 0 /* colormap */ + }, + xcb_render_pictforminfo_type_t | + xcb_render_pictforminfo_depth_t | + xcb_render_pictforminfo_red_shift_t | + xcb_render_pictforminfo_red_mask_t | + xcb_render_pictforminfo_green_shift_t | + xcb_render_pictforminfo_green_mask_t | + xcb_render_pictforminfo_blue_shift_t | + xcb_render_pictforminfo_blue_mask_t | + xcb_render_pictforminfo_alpha_shift_t | + xcb_render_pictforminfo_alpha_mask_t + }, + /* StandardPICTFORMINFORGB24 */ + { + { + 0, /* id */ + XCB_RENDER_PICT_TYPE_DIRECT, /* type */ + 24, /* depth */ + { 0, 0 }, /* pad */ + { /* direct */ + 16, /* direct.red_shift */ + 0xff, /* direct.red_mask */ + 8, /* direct.green_shift */ + 0xff, /* direct.green_mask */ + 0, /* direct.blue_shift */ + 0xff, /* direct.blue_mask */ + 0, /* direct.alpha_shift */ + 0x00 /* direct.alpha_mask */ + }, + 0 /* colormap */ + }, + xcb_render_pictforminfo_type_t | + xcb_render_pictforminfo_depth_t | + xcb_render_pictforminfo_red_shift_t | + xcb_render_pictforminfo_red_mask_t | + xcb_render_pictforminfo_green_shift_t | + xcb_render_pictforminfo_green_mask_t | + xcb_render_pictforminfo_blue_shift_t | + xcb_render_pictforminfo_blue_mask_t | + xcb_render_pictforminfo_alpha_mask_t + }, + /* StandardPICTFORMINFOA8 */ + { + { + 0, /* id */ + XCB_RENDER_PICT_TYPE_DIRECT, /* type */ + 8, /* depth */ + { 0, 0 }, /* pad */ + { /* direct */ + 0, /* direct.red_shift */ + 0x00, /* direct.red_mask */ + 0, /* direct.green_shift */ + 0x00, /* direct.green_mask */ + 0, /* direct.blue_shift */ + 0x00, /* direct.blue_mask */ + 0, /* direct.alpha_shift */ + 0xff /* direct.alpha_mask */ + }, + 0 /* colormap */ + }, + xcb_render_pictforminfo_type_t | + xcb_render_pictforminfo_depth_t | + xcb_render_pictforminfo_red_mask_t | + xcb_render_pictforminfo_green_mask_t | + xcb_render_pictforminfo_blue_mask_t | + xcb_render_pictforminfo_alpha_shift_t | + xcb_render_pictforminfo_alpha_mask_t + }, + /* StandardPICTFORMINFOA4 */ + { + { + 0, /* id */ + XCB_RENDER_PICT_TYPE_DIRECT, /* type */ + 4, /* depth */ + { 0, 0 }, /* pad */ + { /* direct */ + 0, /* direct.red_shift */ + 0x00, /* direct.red_mask */ + 0, /* direct.green_shift */ + 0x00, /* direct.green_mask */ + 0, /* direct.blue_shift */ + 0x00, /* direct.blue_mask */ + 0, /* direct.alpha_shift */ + 0x0f /* direct.alpha_mask */ + }, + 0 /* colormap */ + }, + xcb_render_pictforminfo_type_t | + xcb_render_pictforminfo_depth_t | + xcb_render_pictforminfo_red_mask_t | + xcb_render_pictforminfo_green_mask_t | + xcb_render_pictforminfo_blue_mask_t | + xcb_render_pictforminfo_alpha_shift_t | + xcb_render_pictforminfo_alpha_mask_t + }, + /* StandardPICTFORMINFOA1 */ + { + { + 0, /* id */ + XCB_RENDER_PICT_TYPE_DIRECT, /* type */ + 1, /* depth */ + { 0, 0 }, /* pad */ + { /* direct */ + 0, /* direct.red_shift */ + 0x00, /* direct.red_mask */ + 0, /* direct.green_shift */ + 0x00, /* direct.green_mask */ + 0, /* direct.blue_shift */ + 0x00, /* direct.blue_mask */ + 0, /* direct.alpha_shift */ + 0x01 /* direct.alpha_mask */ + }, + 0 /* colormap */ + }, + xcb_render_pictforminfo_type_t | + xcb_render_pictforminfo_depth_t | + xcb_render_pictforminfo_red_mask_t | + xcb_render_pictforminfo_green_mask_t | + xcb_render_pictforminfo_blue_mask_t | + xcb_render_pictforminfo_alpha_shift_t | + xcb_render_pictforminfo_alpha_mask_t + }, + }; + if ((format >= 0) && (format < xcb_render_standard_pictforminfo_count_t)) + forminfo = xcb_render_find_pictforminfo (conn, + standardFormats[format].mask, + &standardFormats[format].template, + 0); + return forminfo; +} + +static void +_tmp_xcb_err(xcb_connection_t *conn/* , XErrorEvent *ev */) +{ + _xcb_err = 1; + return; +} + +Xcb_Image_Info * +_xr_image_info_get(xcb_connection_t *conn, xcb_drawable_t draw, xcb_visualid_t vis) +{ + xcb_get_geometry_cookie_t cookie; + xcb_get_geometry_reply_t *rep; + Xcb_Image_Info *xcbinf; + Xcb_Image_Info *xcbinf2; + Evas_List *l; + + xcbinf2 = NULL; + for (l = _image_info_list; l; l = l->next) + { + xcbinf = l->data; + if (xcbinf->conn == conn) + { + xcbinf2 = xcbinf; + break; + } + } + xcbinf = calloc(1, sizeof(Xcb_Image_Info)); + if (!xcbinf) return NULL; + + xcbinf->references = 1; + xcbinf->conn = conn; + xcbinf->draw = draw; + cookie = xcb_get_geometry_unchecked(xcbinf->conn, xcbinf->draw); + rep = xcb_get_geometry_reply(xcbinf->conn, cookie, NULL); + xcbinf->root = rep->root; + free(rep); + xcbinf->vis = vis; + xcbinf->fmt32 = xcb_render_find_standard_pictforminfo(xcbinf->conn, xcb_render_standard_pictforminfoargb_32_t); + xcbinf->fmt24 = xcb_render_find_standard_pictforminfo(xcbinf->conn, xcb_render_standard_pictforminforgb_24_t); + xcbinf->fmt8 = xcb_render_find_standard_pictforminfo(xcbinf->conn, xcb_render_standard_pictforminfoa_8_t); + xcbinf->fmt4 = xcb_render_find_standard_pictforminfo(xcbinf->conn, xcb_render_standard_pictforminfoa_4_t); + xcbinf->fmt1 = xcb_render_find_standard_pictforminfo(xcbinf->conn, xcb_render_standard_pictforminfoa_1_t); + xcbinf->mul = _xr_render_surface_new(xcbinf, 1, 1, xcbinf->fmt32, 1); + _xr_render_surface_repeat_set(xcbinf->mul, 1); + xcbinf->mul_r = xcbinf->mul_g = xcbinf->mul_b = xcbinf->mul_a = 0xff; + _xr_render_surface_solid_rectangle_set(xcbinf->mul, xcbinf->mul_r, xcbinf->mul_g, xcbinf->mul_b, xcbinf->mul_a, 0, 0, 1, 1); + if (xcbinf2) + { + xcbinf->can_do_shm = xcbinf2->can_do_shm; + xcbinf->depth = xcbinf2->depth; + } + else + { + xcb_shm_segment_info_t shm_info; + xcb_image_t *xcbim; + + xcbinf->depth = 32; + { + xcb_setup_t *rep; + xcb_screen_iterator_t iter_screen; + + rep = (xcb_setup_t *)xcb_get_setup(xcbinf->conn); + iter_screen = xcb_setup_roots_iterator(rep); + for (; iter_screen.rem ; xcb_screen_next (&iter_screen)) { + xcb_depth_iterator_t iter_depth; + + iter_depth = xcb_screen_allowed_depths_iterator (iter_screen.data); + for (; iter_depth.rem ; xcb_depth_next (&iter_depth)) { + xcb_visualtype_iterator_t iter_visual; + + iter_visual = xcb_depth_visuals_iterator (iter_depth.data); + for (; iter_visual.rem ; xcb_visualtype_next (&iter_visual)) { + if (iter_visual.data->visual_id == vis) + xcbinf->depth = iter_depth.data->depth; + } + } + } + } + + xcbinf->can_do_shm = 0; + + + shm_info.shmseg = xcb_generate_id(xcbinf->conn); + xcbim = xcb_image_shm_create(xcbinf->conn, xcbinf->depth, XCB_IMAGE_FORMAT_Z_PIXMAP, NULL, 1, 1); + if (xcbim) { + shm_info.shmid = shmget(IPC_PRIVATE, xcbim->bytes_per_line * xcbim->height, IPC_CREAT | 0777); + if (shm_info.shmid >= 0) { + shm_info.shmaddr = xcbim->data = shmat(shm_info.shmid, 0, 0); + if ((shm_info.shmaddr != NULL) && (shm_info.shmaddr != (void *) -1)) { + xcb_get_input_focus_reply_t *reply; + /* + * FIXME: no error mechanism + */ + /* XErrorHandler ph; */ + + /* we sync */ + reply = xcb_get_input_focus_reply(xcbinf->conn, + xcb_get_input_focus_unchecked(xcbinf->conn), + NULL); + free(reply); + _xcb_err = 0; + /* ph = XSetErrorHandler((XErrorHandler)_tmp_xcb_err); */ + xcb_shm_attach(xcbinf->conn, shm_info.shmseg, shm_info.shmid, 0); + /* we sync */ + reply = xcb_get_input_focus_reply(xcbinf->conn, + xcb_get_input_focus_unchecked(xcbinf->conn), + NULL); + free(reply); + /* XSetErrorHandler((XErrorHandler)ph); */ + if (!_xcb_err) xcbinf->can_do_shm = 1; + shmdt(shm_info.shmaddr); + } + shmctl(shm_info.shmid, IPC_RMID, 0); + } + xcb_image_shm_destroy(xcbim); + } + } + _image_info_list = evas_list_prepend(_image_info_list, xcbinf); + return xcbinf; +} + +void +_xr_image_info_free(Xcb_Image_Info *xcbinf) +{ + if (!xcbinf) return; + if (xcbinf->pool) + { + xcb_get_input_focus_reply_t *reply; + + reply = xcb_get_input_focus_reply(xcbinf->conn, + xcb_get_input_focus_unchecked(xcbinf->conn), + NULL); + free(reply); + } + _xr_image_info_pool_flush(xcbinf, 0, 0); + xcbinf->references--; + if (xcbinf->references != 0) return; + _xr_render_surface_free(xcbinf->mul); + if (xcbinf->fmt1) + free(xcbinf->fmt1); + if (xcbinf->fmt4) + free(xcbinf->fmt4); + if (xcbinf->fmt8) + free(xcbinf->fmt8); + if (xcbinf->fmt24) + free(xcbinf->fmt24); + if (xcbinf->fmt32) + free(xcbinf->fmt32); + free(xcbinf); + _image_info_list = evas_list_remove(_image_info_list, xcbinf); +} + +void +_xr_image_info_pool_flush(Xcb_Image_Info *xcbinf, int max_num, int max_mem) +{ + if ((xcbinf->pool_mem <= max_mem) && (evas_list_count(xcbinf->pool) <= max_num)) return; + while ((xcbinf->pool_mem > max_mem) || (evas_list_count(xcbinf->pool) > max_num)) + { + Xcb_Image_Image *xcbim; + + if (!xcbinf->pool) break; + xcbim = xcbinf->pool->data; + _xr_image_free(xcbim); + } +} + +Xcb_Image_Image * +_xr_image_new(Xcb_Image_Info *xcbinf, int w, int h, int depth) +{ + Xcb_Image_Image *xcbim, *xcbim2; + Evas_List *l; + + xcbim2 = NULL; + for (l = xcbinf->pool; l; l = l->next) + { + xcbim = l->data; + if ((xcbim->w >= w) && (xcbim->h >= h) && (xcbim->depth == depth) && (xcbim->available)) + { + if (!xcbim2) xcbim2 = xcbim; + else if ((xcbim->w * xcbim->h) < (xcbim2->w * xcbim2->h)) xcbim2 = xcbim; + } + } + if (xcbim2) + { + xcbim2->available = 0; + return xcbim2; + } + xcbim = calloc(1, sizeof(Xcb_Image_Image)); + if (xcbim) + { + xcbim->xcbinf = xcbinf; + xcbim->w = w; + xcbim->h = h; + xcbim->depth = depth; + xcbim->available = 0; + if (xcbim->xcbinf->can_do_shm) + { + xcbim->shm_info = calloc(1, sizeof(xcb_shm_segment_info_t)); + if (xcbim->shm_info) + { + xcbim->shm_info->shmseg = xcb_generate_id(xcbinf->conn); + xcbim->xcbim = xcb_image_shm_create(xcbim->xcbinf->conn, xcbim->depth, XCB_IMAGE_FORMAT_Z_PIXMAP, NULL, xcbim->w, xcbim->h); + if (xcbim->xcbim) + { + xcbim->shm_info->shmid = shmget(IPC_PRIVATE, xcbim->xcbim->bytes_per_line * xcbim->xcbim->height, IPC_CREAT | 0777); + if (xcbim->shm_info->shmid >= 0) + { + xcbim->shm_info->shmaddr = xcbim->xcbim->data = shmat(xcbim->shm_info->shmid, 0, 0); + if ((xcbim->shm_info->shmaddr) && (xcbim->shm_info->shmaddr != (void *) -1)) + { + xcb_get_input_focus_reply_t *reply; + /* + * FIXME: no error mechanism + */ + /* XErrorHandler ph; */ + + /* we sync */ + reply = xcb_get_input_focus_reply(xcbim->xcbinf->conn, + xcb_get_input_focus_unchecked(xcbim->xcbinf->conn), + NULL); + free(reply); + _xcb_err = 0; +/* ph = XSetErrorHandler((XErrorHandler)_tmp_xcb_err); */ + xcb_shm_attach(xcbim->xcbinf->conn, xcbim->shm_info->shmseg, xcbim->shm_info->shmid, 0); + /* we sync */ + reply = xcb_get_input_focus_reply(xcbim->xcbinf->conn, + xcb_get_input_focus_unchecked(xcbim->xcbinf->conn), + NULL); + free(reply); +/* XSetErrorHandler((XErrorHandler)ph); */ + if (!_xcb_err) goto xcbim_ok; + shmdt(xcbim->shm_info->shmaddr); + } + shmctl(xcbim->shm_info->shmid, IPC_RMID, 0); + } + xcb_image_shm_destroy(xcbim->xcbim); + } + free(xcbim->shm_info); + xcbim->shm_info = NULL; + } + } + xcbim->xcbim = xcb_image_create(xcbim->xcbinf->conn, xcbim->depth, XCB_IMAGE_FORMAT_Z_PIXMAP, 0, NULL, xcbim->w, xcbim->h, 32, 0); + if (!xcbim->xcbim) + { + free(xcbim); + return NULL; + } + xcbim->xcbim->data = malloc(xcbim->xcbim->bytes_per_line * xcbim->xcbim->height); + if (!xcbim->xcbim->data) + { + xcb_image_destroy(xcbim->xcbim); + free(xcbim); + return NULL; + } + } + + xcbim_ok: + _xr_image_info_pool_flush(xcbinf, 32, (1600 * 1200 * 32 * 2)); + + xcbim->line_bytes = xcbim->xcbim->bytes_per_line; + xcbim->data = (void *)(xcbim->xcbim->data); + xcbinf->pool_mem += (xcbim->w * xcbim->h * xcbim->depth); + xcbinf->pool = evas_list_append(xcbinf->pool, xcbim); + return xcbim; +} + +void +_xr_image_free(Xcb_Image_Image *xcbim) +{ + if (xcbim->shm_info) + { + if (!xcbim->available) + { + xcb_get_input_focus_reply_t *reply; + + reply = xcb_get_input_focus_reply(xcbim->xcbinf->conn, + xcb_get_input_focus_unchecked(xcbim->xcbinf->conn), + NULL); + free(reply); + } + xcb_shm_detach(xcbim->xcbinf->conn, xcbim->shm_info->shmseg); + xcb_image_shm_destroy(xcbim->xcbim); + shmdt(xcbim->shm_info->shmaddr); + shmctl(xcbim->shm_info->shmid, IPC_RMID, 0); + free(xcbim->shm_info); + } + else + { + free(xcbim->xcbim->data); + xcbim->xcbim->data = NULL; + xcb_image_destroy(xcbim->xcbim); + } + xcbim->xcbinf->pool_mem -= (xcbim->w * xcbim->h * xcbim->depth); + xcbim->xcbinf->pool = evas_list_remove(xcbim->xcbinf->pool, xcbim); + free(xcbim); +} + +void +_xr_image_put(Xcb_Image_Image *xcbim, xcb_drawable_t draw, int x, int y, int w, int h) +{ + xcb_get_input_focus_reply_t *reply; + xcb_gcontext_t gc; + + gc = xcb_generate_id(xcbim->xcbinf->conn); + xcb_create_gc(xcbim->xcbinf->conn, gc, draw, 0, NULL); + if (xcbim->shm_info) + { + xcb_shm_put_image(xcbim->xcbinf->conn, draw, gc, + xcbim->xcbim->width, xcbim->xcbim->height, + 0, 0, + w, h, + x, y, + xcbim->xcbim->depth, xcbim->xcbim->format, + 0, + xcbim->shm_info->shmseg, + xcbim->xcbim->data - xcbim->shm_info->shmaddr); + /* we sync */ + reply = xcb_get_input_focus_reply(xcbim->xcbinf->conn, + xcb_get_input_focus_unchecked(xcbim->xcbinf->conn), + NULL); + free(reply); + } + else + xcb_image_put(xcbim->xcbinf->conn, draw, gc, xcbim->xcbim, 0, 0, x, y, w, h); + xcbim->available = 1; + xcb_free_gc(xcbim->xcbinf->conn, gc); +} diff --git a/src/modules/engines/xrender_xcb/evas_engine_xrender.c b/src/modules/engines/xrender_xcb/evas_engine_xrender.c new file mode 100644 index 0000000..bfdba0c --- /dev/null +++ b/src/modules/engines/xrender_xcb/evas_engine_xrender.c @@ -0,0 +1,863 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ +#include "evas_common.h" +/* #include "evas_macros.h" */ +#include "evas_private.h" +#include "evas_engine.h" +#include "Evas_Engine_XRender_Xcb.h" +#include + +/* As opposed to libXRender, we don't have + * XDoubleToFixed in XCB :/ + */ +#define DOUBLE_TO_FIXED(d) ((xcb_render_fixed_t) ((d) * 65536)) + +/* this is a work around broken xrender - when/if this ever gets fixed in xorg + * we can comment this out and one day remove it - for now keep it until such + * a fix is spotted in the wild + */ +#define BROKEN_XORG_XRENDER 1 + +static inline void +set_filter(Xcb_Render_Surface *s, int smooth) +{ + const char *f = smooth ? "best": "nearest"; + + xcb_render_set_picture_filter (s->xcbinf->conn, s->pic, strlen (f), f, 0, NULL); +} + +xcb_render_pictforminfo_t * +xcb_render_find_visual_format (xcb_connection_t *c, xcb_visualid_t visual) +{ + xcb_render_query_pict_formats_cookie_t cookie; + xcb_render_query_pict_formats_reply_t *rep; + xcb_render_pictscreen_iterator_t screen_iter; + xcb_render_pictformat_t format = { 0 }; + + cookie = xcb_render_query_pict_formats (c); + rep = xcb_render_query_pict_formats_reply (c, cookie, NULL); + if (!rep) + return NULL; + + screen_iter = xcb_render_query_pict_formats_screens_iterator (rep); + for (; screen_iter.rem; xcb_render_pictscreen_next (&screen_iter)) { + xcb_render_pictdepth_iterator_t depth_iter; + + depth_iter = xcb_render_pictscreen_depths_iterator (screen_iter.data); + for (; depth_iter.rem; xcb_render_pictdepth_next (&depth_iter)) { + xcb_render_pictvisual_iterator_t visual_iter; + + visual_iter = xcb_render_pictdepth_visuals_iterator (depth_iter.data); + for (; visual_iter.rem; xcb_render_pictvisual_next (&visual_iter)) { + if (visual == visual_iter.data->visual) { + format = visual_iter.data->format; + } + } + } + } + if (format != 0) { + xcb_render_pictforminfo_iterator_t forminfo_iter; + + forminfo_iter = xcb_render_query_pict_formats_formats_iterator (rep); + for (; forminfo_iter.rem; xcb_render_pictforminfo_next (&forminfo_iter)) { + if (forminfo_iter.data->id == format) { + xcb_render_pictforminfo_t *forminfo; + + forminfo = (xcb_render_pictforminfo_t *)malloc (sizeof (xcb_render_pictforminfo_t)); + memcpy (forminfo, forminfo_iter.data, sizeof (xcb_render_pictforminfo_t)); + free (rep); + + return forminfo; + } + } + } + free (rep); + + return NULL; +} + +Xcb_Render_Surface * +_xr_render_surface_new(Xcb_Image_Info *xcbinf, int w, int h, xcb_render_pictforminfo_t *fmt, int alpha) +{ + Xcb_Render_Surface *rs; + uint32_t mask; + uint32_t values[3]; + + if ((!xcbinf) || (!fmt) || (w < 1) || (h < 1)) return NULL; + + rs = calloc(1, sizeof(Xcb_Render_Surface)); + if (!rs) return NULL; + rs->xcbinf = xcbinf; + rs->w = w; + rs->h = h; + rs->fmt = (xcb_render_pictforminfo_t *)malloc (sizeof (xcb_render_pictforminfo_t)); + if (!rs->fmt) + { + free(rs); + return NULL; + } + memcpy (rs->fmt, fmt, sizeof (xcb_render_pictforminfo_t)); + rs->alpha = alpha; + rs->depth = fmt->depth; + rs->allocated = 1; + rs->draw = xcb_generate_id(xcbinf->conn); + xcb_create_pixmap(xcbinf->conn, fmt->depth, rs->draw, xcbinf->root, w, h); + if (rs->draw == 0) + { + free(rs->fmt); + free(rs); + return NULL; + } + rs->xcbinf->references++; + mask = XCB_RENDER_CP_REPEAT | XCB_RENDER_CP_DITHER | XCB_RENDER_CP_COMPONENT_ALPHA; + values[0] = 0; + values[1] = 0; + values[2] = 0; + rs->pic = xcb_generate_id(xcbinf->conn); + xcb_render_create_picture(xcbinf->conn, rs->pic, rs->draw, fmt->id, mask, values); + if (rs->pic == 0) + { + xcb_free_pixmap(rs->xcbinf->conn, rs->draw); + rs->xcbinf->references--; + free(rs->fmt); + free(rs); + return NULL; + } + + return rs; +} + +Xcb_Render_Surface * +_xr_render_surface_adopt(Xcb_Image_Info *xcbinf, xcb_drawable_t draw, int w, int h, int alpha) +{ + Xcb_Render_Surface *rs; + uint32_t mask; + uint32_t values[3]; + + if ((!xcbinf) || (draw == 0) || (w < 1) || (h < 1)) return NULL; + rs = calloc(1, sizeof(Xcb_Render_Surface)); + if (!rs) return NULL; + rs->xcbinf = xcbinf; + rs->w = w; + rs->h = h; +/* if (fmt->depth == xcbinf->fmt32->depth) */ +/* rs->fmt = xcbinf->fmt32; */ +/* else if (fmt->depth == xcbinf->fmt24->depth) */ +/* rs->fmt = xcbinf->fmt24; */ +/* else if (fmt->depth == xcbinf->fmt8->depth) */ +/* rs->fmt = xcbinf->fmt8; */ +/* else if (fmt->depth == xcbinf->fmt4->depth) */ +/* rs->fmt = xcbinf->fmt4; */ +/* else */ +/* rs->fmt = xcbinf->fmt1; */ +/* free(fmt); */ + + rs->fmt = xcb_render_find_visual_format(xcbinf->conn, xcbinf->vis); + if (!rs->fmt) + { + free(rs); + return NULL; + } + rs->alpha = alpha; + rs->depth = rs->fmt->depth; + if (rs->fmt->depth == 32) rs->alpha = 1; + rs->allocated = 0; + rs->draw = draw; + rs->xcbinf->references++; + mask = XCB_RENDER_CP_REPEAT | XCB_RENDER_CP_DITHER | XCB_RENDER_CP_COMPONENT_ALPHA; + values[0] = 0; + values[1] = 0; + values[2] = 0; + rs->pic = xcb_generate_id(xcbinf->conn); + xcb_render_create_picture(xcbinf->conn, rs->pic, rs->draw, rs->fmt->id, mask, values); + if (rs->pic == 0) + { + rs->xcbinf->references--; + free(rs->fmt); + free(rs); + return NULL; + } + + return rs; +} + +Xcb_Render_Surface * +_xr_render_surface_format_adopt(Xcb_Image_Info *xcbinf, xcb_drawable_t draw, int w, int h, xcb_render_pictforminfo_t *fmt, int alpha) +{ + Xcb_Render_Surface *rs; + uint32_t mask; + uint32_t values[3]; + + if ((!xcbinf) || (!fmt) || (draw == 0) || (w < 1) || (h < 1)) return NULL; + rs = calloc(1, sizeof(Xcb_Render_Surface)); + if (!rs) return NULL; + rs->xcbinf = xcbinf; + rs->w = w; + rs->h = h; + rs->fmt = (xcb_render_pictforminfo_t *)malloc (sizeof (xcb_render_pictforminfo_t)); + memcpy (rs->fmt, fmt, sizeof (xcb_render_pictforminfo_t)); + rs->alpha = alpha; + rs->depth = fmt->depth; + if (fmt->depth == 32) rs->alpha = 1; + rs->xcbinf->references++; + rs->allocated = 0; + rs->draw = draw; + mask = XCB_RENDER_CP_REPEAT | XCB_RENDER_CP_DITHER | XCB_RENDER_CP_COMPONENT_ALPHA; + values[0] = 0; + values[1] = 0; + values[2] = 0; + rs->pic = xcb_generate_id(xcbinf->conn); + xcb_render_create_picture(xcbinf->conn, rs->pic, rs->draw, fmt->id, mask, values); + if (rs->pic == 0) + { + rs->xcbinf->references--; + free(rs->fmt); + free(rs); + return NULL; + } + + return rs; +} + +void +_xr_render_surface_free(Xcb_Render_Surface *rs) +{ + if (!rs) return; + if (rs->xcbinf) + { + if ((rs->allocated) && (rs->draw != 0)) + xcb_free_pixmap(rs->xcbinf->conn, rs->draw); + if (rs->pic != 0) + xcb_render_free_picture(rs->xcbinf->conn, rs->pic); + _xr_image_info_free(rs->xcbinf); + rs->xcbinf = NULL; + } + free(rs->fmt); + free(rs); +} + +void +_xr_render_surface_repeat_set(Xcb_Render_Surface *rs, int repeat) +{ + uint32_t mask; + uint32_t value[1]; + + mask = XCB_RENDER_CP_REPEAT; + value[0] = repeat; + xcb_render_change_picture(rs->xcbinf->conn, rs->pic, mask, value); +} + +void +_xr_render_surface_solid_rectangle_set(Xcb_Render_Surface *rs, int r, int g, int b, int a, int x, int y, int w, int h) +{ + xcb_render_color_t col; + xcb_rectangle_t rect; + int aa; + + aa = a + 1; + r = (r * aa) >> 8; + g = (g * aa) >> 8; + b = (b * aa) >> 8; + col.red = (r << 8) | r; + col.green = (g << 8) | g; + col.blue = (b << 8) | b; + col.alpha = (a << 8) | a; + rect.x = x; + rect.y = y; + rect.width = w; + rect.height = h; + xcb_render_fill_rectangles(rs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, rs->pic, col, 1, &rect); +} + +void +_xr_render_surface_argb_pixels_fill(Xcb_Render_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h) +{ + Xcb_Image_Image *xcbim; + unsigned int *p, *sp, *sple, *spe; + unsigned int jump, sjump; + unsigned int a, r, g, b, aa; + + xcbim = _xr_image_new(rs->xcbinf, w, h, rs->depth); + if (!xcbim) return; + p = (unsigned int *)xcbim->data; + sp = ((unsigned int *)pixels) + (y * sw) + x; + jump = ((xcbim->line_bytes / 4) - w); + sjump = sw - w; + spe = sp + ((h - 1) * sw) + w; + if +#ifdef WORDS_BIGENDIAN + (xcbim->xcbim->image_byte_order == XCB_IMAGE_ORDER_LSB_FIRST) +#else + (xcbim->xcbim->image_byte_order == XCB_IMAGE_ORDER_MSB_FIRST) +#endif + { + while (sp < spe) + { + sple = sp + w; + while (sp < sple) + { + switch (a = A_VAL(sp)) + { + case 0: + *p = 0; + break; + case 255: + *p = (B_VAL(sp) << 24) | (G_VAL(sp) << 16) | (R_VAL(sp) << 8) | 0xff; + break; + default: + aa = a + 1; + r = ((R_VAL(sp)) * aa) >> 8; + g = ((G_VAL(sp)) * aa) >> 8; + b = ((B_VAL(sp)) * aa) >> 8; + *p = (b << 24) | (g << 16) | (r << 8) | a; + break; + } + p++; + sp++; + } + p += jump; + sp += sjump; + } + } + else + { + while (sp < spe) + { + sple = sp + w; + while (sp < sple) + { + switch (a = (*sp & 0xff000000)) + { + case 0: + *p = 0; + break; + case 0xff000000: + *p = *sp; + break; + default: + aa = (a >> 24) + 1; + *p = a + (((((*sp) >> 8) & 0xff) * aa) & 0xff00) + + (((((*sp) & 0x00ff00ff) * aa) >> 8) & 0x00ff00ff); + break; + } + p++; + sp++; + } + p += jump; + sp += sjump; + } + } + _xr_image_put(xcbim, rs->draw, x, y, w, h); +} + +void +_xr_render_surface_rgb_pixels_fill(Xcb_Render_Surface *rs, int sw, int sh, void *pixels, int x, int y, int w, int h) +{ + Xcb_Image_Image *xcbim; + unsigned int *p, *sp, *sple, *spe; + unsigned int jump, sjump; + + xcbim = _xr_image_new(rs->xcbinf, w, h, rs->depth); + if (!xcbim) return; + p = (unsigned int *)xcbim->data; + sp = ((unsigned int *)pixels) + (y * sw) + x; + jump = ((xcbim->line_bytes / 4) - w); + sjump = sw - w; + spe = sp + ((h - 1) * sw) + w; + if +#ifdef WORDS_BIGENDIAN + (xcbim->xcbim->image_byte_order == XCB_IMAGE_ORDER_LSB_FIRST) +#else + (xcbim->xcbim->image_byte_order == XCB_IMAGE_ORDER_MSB_FIRST) +#endif + { + while (sp < spe) + { + sple = sp + w; + while (sp < sple) + { + *p = ((B_VAL(sp)) << 24) | ((G_VAL(sp)) << 16) | ((R_VAL(sp)) << 8) | 0x000000ff; + p++; + sp++; + } + p += jump; + sp += sjump; + } + } + else + { + while (sp < spe) + { + sple = sp + w; + while (sp < sple) + { + *p = 0xff000000 | *sp; + p++; + sp++; + } + p += jump; + sp += sjump; + } + } + _xr_image_put(xcbim, rs->draw, x, y, w, h); +} + +void +_xr_render_surface_clips_set(Xcb_Render_Surface *rs, RGBA_Draw_Context *dc, int rx, int ry, int rw, int rh) +{ + int num = 0; + xcb_rectangle_t *rect = NULL; + + if ((dc) && (dc->clip.use)) + { + RECTS_CLIP_TO_RECT(rx, ry, rw, rh, + dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h); + } + if ((!dc) || (!dc->cutout.rects)) + { + rect = malloc(sizeof(xcb_rectangle_t)); + if (!rect) return; + rect->x = rx; + rect->y = ry; + rect->width = rw; + rect->height = rh; + num = 1; + } + else + { + Cutout_Rects *rects; + Cutout_Rect *r; + int i; + + rects = evas_common_draw_context_apply_cutouts(dc); + num = rects->active; + rect = malloc(num * sizeof(xcb_rectangle_t)); + if (!rect) return; + for (i = 0; i < num; i++) + { + r = rects->rects + i; + rect[i].x = r->x; + rect[i].y = r->y; + rect[i].width = r->w; + rect[i].height = r->h; + } + evas_common_draw_context_apply_clear_cutouts(rects); + } + if (!rect) return; + xcb_render_set_picture_clip_rectangles(rs->xcbinf->conn, rs->pic, 0, 0, num, rect); + free(rect); +} + +/* initialized the transform to the identity */ +static void +init_transform (xcb_render_transform_t *t) +{ + t->matrix11 = t->matrix22 = t->matrix33 = DOUBLE_TO_FIXED(1); + + t->matrix12 = t->matrix13 = t->matrix21 = t->matrix23 = + t->matrix31 = t->matrix32 = 0; +} + +static void +set_transform_scale(xcb_render_transform_t *t, + int sw, + int sh, + int w, + int h) +{ + if ((sw > 1) && (w > 1)) + { sw--; w--; } + if ((sh > 1) && (h > 1)) + { sh--; h--; } + t->matrix11 = DOUBLE_TO_FIXED((double)sw / (double)w); + t->matrix22 = DOUBLE_TO_FIXED((double)sh / (double)h); +} + +// when color multiplier is used want: instead +// CA src IN mask SRC temp; non-CA temp OVER dst. - i think. need to check. +void +_xr_render_surface_composite(Xcb_Render_Surface *srs, + Xcb_Render_Surface *drs, + RGBA_Draw_Context *dc, + int sx, + int sy, + int sw, + int sh, + int x, + int y, + int w, + int h, + int smooth) +{ + Xcb_Render_Surface *trs = NULL; + xcb_render_transform_t xf; + xcb_render_picture_t mask = XCB_NONE; + uint32_t value_mask; + uint32_t value_list[1]; + int e, is_scaling; + xcb_render_pict_op_t op; + + if ((sw < 1) || (sh < 1) || (w < 1) || (h < 1)) return; + + is_scaling = e = (sw != w) || (sh != h); + + value_mask = XCB_RENDER_CP_CLIP_MASK; + value_list[0] = 0; + xcb_render_change_picture(srs->xcbinf->conn, srs->pic, value_mask, value_list); + xcb_render_change_picture(drs->xcbinf->conn, drs->pic, value_mask, value_list); + + init_transform(&xf); + + op = XCB_RENDER_PICT_OP_OVER; + if (dc->render_op == _EVAS_RENDER_BLEND) + { + if (!srs->alpha) op = XCB_RENDER_PICT_OP_SRC; + } + else if (dc->render_op == _EVAS_RENDER_BLEND_REL) + op = XCB_RENDER_PICT_OP_ATOP; + else if (dc->render_op == _EVAS_RENDER_MUL) + op = XCB_RENDER_PICT_OP_IN; + else if (dc->render_op == _EVAS_RENDER_COPY) + op = XCB_RENDER_PICT_OP_SRC; + else if (dc->render_op == _EVAS_RENDER_COPY_REL) + op = XCB_RENDER_PICT_OP_IN; + else if (dc->render_op == _EVAS_RENDER_MASK) + op = XCB_RENDER_PICT_OP_IN_REVERSE; + + if ((dc) && (dc->mul.use)) + { + int r, g, b, a; + + if ((op == XCB_RENDER_PICT_OP_OVER) && (!dc->mul.col)) return; + a = dc->mul.col >> 24; + r = (dc->mul.col >> 16) & 0xff; + g = (dc->mul.col >> 8) & 0xff; + b = dc->mul.col & 0xff; + if (dc->mul.col != 0xffffffff) + { + if ((srs->xcbinf->mul_r != r) || (srs->xcbinf->mul_g != g) || + (srs->xcbinf->mul_b != b) || (srs->xcbinf->mul_a != a)) + { + srs->xcbinf->mul_r = r; + srs->xcbinf->mul_g = g; + srs->xcbinf->mul_b = b; + srs->xcbinf->mul_a = a; + _xr_render_surface_solid_rectangle_set(srs->xcbinf->mul, + r, + g, + b, + a, + 0, 0, 1, 1); + } + mask = srs->xcbinf->mul->pic; + if (dc->mul.col == (a * 0x01010101)) + { + value_mask = XCB_RENDER_CP_COMPONENT_ALPHA; + value_list[0] = 0; + xcb_render_change_picture(srs->xcbinf->conn, mask, value_mask, value_list); + } + else + { + if ((srs->alpha) || (a != 0xff)) + trs = _xr_render_surface_new(srs->xcbinf, sw + e, sh + e, + srs->xcbinf->fmt32, 1); + else + trs = _xr_render_surface_new(srs->xcbinf, sw + e, sh + e, + srs->fmt, srs->alpha); + if (!trs) return; + + value_mask = XCB_RENDER_CP_COMPONENT_ALPHA; + value_list[0] = 0; + xcb_render_change_picture(srs->xcbinf->conn, mask, value_mask, value_list); + xcb_render_set_picture_transform(trs->xcbinf->conn, srs->pic, xf); + xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, mask, trs->pic, + sx, sy, 0, 0, 0, 0, sw, sh); + /* fill right and bottom pixel so interpolation works right */ + if (e) + { + xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, mask, trs->pic, + sx + sw - 1, sy, 0, 0, sw, 0, 1, sh); + xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, mask, trs->pic, + sx, sy + sh - 1, 0, 0, 0, sh, sw, 1); + xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, mask, trs->pic, + sx + sw - 1, sy + sh - 1, 0, 0, sw, sh, 1, 1); + } + mask = XCB_NONE; + } + } + } + + _xr_render_surface_clips_set(drs, dc, x, y, w, h); + if (trs) + { + set_filter(trs, smooth); + + set_transform_scale(&xf, sw, sh, w, h); + xcb_render_set_picture_transform(trs->xcbinf->conn, trs->pic, xf); + + value_mask = XCB_RENDER_CP_COMPONENT_ALPHA; + value_list[0] = 0; + if (dc->render_op == _EVAS_RENDER_MUL) + value_list[0] = 1; + xcb_render_change_picture(trs->xcbinf->conn, trs->pic, value_mask, value_list); + + xcb_render_composite(trs->xcbinf->conn, op, trs->pic, mask, drs->pic, + 0, 0, 0, 0, x, y, w, h); + _xr_render_surface_free(trs); + } + else + { + if (srs->bordered && is_scaling) + { + trs = _xr_render_surface_new(srs->xcbinf, sw + 1, sh + 1, + srs->fmt, srs->alpha); + if (!trs) return; + + value_mask = XCB_RENDER_CP_COMPONENT_ALPHA; + value_list[0] = 0; + xcb_render_change_picture(srs->xcbinf->conn, srs->pic, value_mask, value_list); + xcb_render_set_picture_transform(srs->xcbinf->conn, srs->pic, xf); + xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, XCB_NONE, trs->pic, + sx, sy, 0, 0, 0, 0, sw, sh); + + xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, XCB_NONE, trs->pic, + sx + sw - 1, sy, 0, 0, sw, 0, 1, sh); + xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, XCB_NONE, trs->pic, + sx, sy + sh - 1, 0, 0, 0, sh, sw, 1); + xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, XCB_NONE, trs->pic, + sx + sw - 1, sy + sh - 1, 0, 0, sw, sh, 1, 1); + + set_filter(trs, smooth); + + set_transform_scale(&xf, sw, sh, w, h); + xcb_render_set_picture_transform(trs->xcbinf->conn, trs->pic, xf); + + if (dc->render_op == _EVAS_RENDER_MUL) + { + value_mask = XCB_RENDER_CP_COMPONENT_ALPHA; + value_list[0] = 1; + xcb_render_change_picture(trs->xcbinf->conn, trs->pic, value_mask, value_list); + } + + xcb_render_composite(trs->xcbinf->conn, op, trs->pic, mask, drs->pic, + 0, 0, 0, 0, x, y, w, h); + _xr_render_surface_free(trs); + } + else + { + set_filter(srs, smooth); + + set_transform_scale(&xf, sw, sh, w, h); + xcb_render_set_picture_transform(srs->xcbinf->conn, srs->pic, xf); + + value_mask = XCB_RENDER_CP_COMPONENT_ALPHA; + value_list[0] = 0; + if (dc->render_op == _EVAS_RENDER_MUL) + value_list[0] = 1; + xcb_render_change_picture(srs->xcbinf->conn, srs->pic, value_mask, value_list); + + xcb_render_composite(srs->xcbinf->conn, op, srs->pic, mask, drs->pic, + ((sx * w) + (sw / 2)) / sw, + ((sy * h) + (sh / 2)) / sh, + 0, 0, x, y, w, h); + } + } +} + +void +_xr_render_surface_copy(Xcb_Render_Surface *srs, Xcb_Render_Surface *drs, int sx, int sy, int x, int y, int w, int h) +{ + xcb_render_transform_t xf; + uint32_t value_mask; + uint32_t value_list[1]; + + if ((w < 1) || (h < 1) || (!srs) || (!drs)) return; + + init_transform(&xf); +#ifdef BROKEN_XORG_XRENDER + /* FIXME: why do we need to change the identity matrix if the src surface + * is 1 bit deep? + */ + if (srs->depth == 1) + { + xf.matrix11 = xf.matrix22 = xf.matrix33 = 1; + } +#endif + xcb_render_set_picture_transform(srs->xcbinf->conn, srs->pic, xf); +/* set_filter(srs, 0); */ + + value_mask = XCB_RENDER_CP_CLIP_MASK; + value_list[0] = 0; + xcb_render_change_picture(srs->xcbinf->conn, srs->pic, value_mask, value_list); + xcb_render_change_picture(drs->xcbinf->conn, drs->pic, value_mask, value_list); + + xcb_render_composite(srs->xcbinf->conn, XCB_RENDER_PICT_OP_SRC, srs->pic, XCB_NONE, drs->pic, + sx, sy, 0, 0, x, y, w, h); +} + +void +_xr_render_surface_rectangle_draw(Xcb_Render_Surface *rs, RGBA_Draw_Context *dc, int x, int y, int w, int h) +{ + xcb_render_color_t col; + xcb_rectangle_t rect; + uint32_t value_mask; + uint32_t value_list; + int r, g, b, a; + xcb_render_pict_op_t op; + + if ((!rs) || (!dc)) return; + if ((w < 1) || (h < 1)) return; + a = dc->col.col >> 24; + r = (dc->col.col >> 16) & 0xff; + g = (dc->col.col >> 8 ) & 0xff; + b = (dc->col.col ) & 0xff; + col.red = (r << 8) | r; + col.green = (g << 8) | g; + col.blue = (b << 8) | b; + col.alpha = (a << 8) | a; + + op = XCB_RENDER_PICT_OP_SRC; + if (dc->render_op == _EVAS_RENDER_BLEND) + { + if (!dc->col.col) return; + if (a == 0xff) op = XCB_RENDER_PICT_OP_SRC; + } + else if (dc->render_op == _EVAS_RENDER_BLEND_REL) + { + if (!dc->col.col) return; + op = XCB_RENDER_PICT_OP_ATOP; + } + else if (dc->render_op == _EVAS_RENDER_MUL) + { + if (dc->col.col == 0xffffffff) return; + op = XCB_RENDER_PICT_OP_IN; + } + else if (dc->render_op == _EVAS_RENDER_COPY) + op = XCB_RENDER_PICT_OP_SRC; + else if (dc->render_op == _EVAS_RENDER_COPY_REL) + op = XCB_RENDER_PICT_OP_IN; + else if (dc->render_op == _EVAS_RENDER_MASK) + op = XCB_RENDER_PICT_OP_IN_REVERSE; + + value_mask = XCB_RENDER_CP_CLIP_MASK; + value_list = 0; + xcb_render_change_picture(rs->xcbinf->conn, rs->pic, value_mask, &value_list); + + _xr_render_surface_clips_set(rs, dc, x, y, w, h); + rect.x = x; + rect.y = y; + rect.width = w; + rect.height = h; + xcb_render_fill_rectangles(rs->xcbinf->conn, op, rs->pic, col, 1, &rect); +} + +void +_xr_render_surface_line_draw(Xcb_Render_Surface *rs, RGBA_Draw_Context *dc, int x1, int y1, int x2, int y2) +{ +/* uint32_t value_mask; */ +/* uint32_t value_list[1]; */ +/* int op; */ + +/* if ((!rs) || (!dc)) return; */ +/* op = XCB_RENDER_PICT_OP_SRC; */ +/* value_mask = XCB_RENDER_CP_CLIP_MASK; */ +/* value_list[0] = 0; */ +/* xcb_render_change_picture(rs->xcbinf->conn, rs->pic, value_mask, value_list); */ +/* _xr_render_surface_clips_set(rs, dc, 0, 0, rs->w, rs->h); */ + +/* { */ +/* int r, g, b, a; */ +/* XPointDouble poly[4]; */ +/* int dx, dy; */ +/* double len, ddx, ddy; */ + +/* dx = x2 - x1; */ +/* dy = y2 - y1; */ +/* len = sqrt((double)(dx * dx) + (double)(dy * dy)); */ +/* ddx = (0.5 * dx) / len; */ +/* ddy = (0.5 * dy) / len; */ +/* poly[0].x = (x1 + ddx); */ +/* poly[0].y = (y1 - ddy); */ +/* poly[1].x = (x2 + ddx); */ +/* poly[1].y = (y2 - ddy); */ +/* poly[2].x = (x2 - ddx); */ +/* poly[2].y = (y2 + ddy); */ +/* poly[3].x = (x1 - ddx); */ +/* poly[3].y = (y1 + ddy); */ + +/* a = (dc->col.col >> 24) & 0xff; */ +/* if (a == 0) return; */ +/* if (a < 0xff) op = XCB_RENDER_PICT_OP_OVER; */ +/* r = (dc->col.col >> 16) & 0xff; */ +/* g = (dc->col.col >> 8 ) & 0xff; */ +/* b = (dc->col.col ) & 0xff; */ +/* if ((rs->xcbinf->mul_r != r) || (rs->xcbinf->mul_g != g) || */ +/* (rs->xcbinf->mul_b != b) || (rs->xcbinf->mul_a != a)) */ +/* { */ +/* rs->xcbinf->mul_r = r; */ +/* rs->xcbinf->mul_g = g; */ +/* rs->xcbinf->mul_b = b; */ +/* rs->xcbinf->mul_a = a; */ +/* _xr_render_surface_solid_rectangle_set(rs->xcbinf->mul, r, g, b, a, 0, 0, 1, 1); */ +/* } */ +/* XRenderCompositeDoublePoly(rs->xcbinf->conn, op, */ +/* rs->xcbinf->mul->pic, rs->pic, */ +/* rs->xcbinf->fmt8, 0, 0, 0, 0, */ +/* poly, 4, EvenOddRule); */ +/* } */ +} + +void +_xre_poly_draw(Xcb_Render_Surface *rs, RGBA_Draw_Context *dc, RGBA_Polygon_Point *points) +{ +/* RGBA_Polygon_Point *pt; */ +/* int i, num; */ +/* XPointDouble *pts; */ +/* int r, g, b, a; */ +/* uint32_t value_mask; */ +/* uint32_t value_list[1]; */ +/* int op; */ + +/* if ((!rs) || (!dc)) return; */ +/* num = 0; */ +/* for (pt = points; pt; pt = (RGBA_Polygon_Point *)(((Evas_Object_List *)pt)->next)) num++; */ +/* if (num < 3) return; */ +/* a = (dc->col.col >> 24) & 0xff; */ +/* if (a == 0) return; */ +/* op = XCB_RENDER_PICT_OP_OVER; */ +/* r = (dc->col.col >> 16) & 0xff; */ +/* g = (dc->col.col >> 8 ) & 0xff; */ +/* b = (dc->col.col ) & 0xff; */ +/* if ((rs->xcbinf->mul_r != r) || (rs->xcbinf->mul_g != g) || */ +/* (rs->xcbinf->mul_b != b) || (rs->xcbinf->mul_a != a)) */ +/* { */ +/* rs->xcbinf->mul_r = r; */ +/* rs->xcbinf->mul_g = g; */ +/* rs->xcbinf->mul_b = b; */ +/* rs->xcbinf->mul_a = a; */ +/* _xr_render_surface_solid_rectangle_set(rs->xcbinf->mul, r, g, b, a, 0, 0, 1, 1); */ +/* } */ +/* pts = malloc(num * sizeof(XPointDouble)); */ +/* if (!pts) return; */ +/* i = 0; */ +/* for (pt = points; pt; pt = (RGBA_Polygon_Point *)(((Evas_Object_List *)pt)->next)) */ +/* { */ +/* if (i < num) */ +/* { */ +/* pts[i].x = pt->x; */ +/* pts[i].y = pt->y; */ +/* i++; */ +/* } */ +/* } */ +/* value_mask = XCB_RENDER_CP_CLIP_MASK; */ +/* value_list[0] = 0; */ +/* xcb_render_change_picture(rs->xcbinf->conn, rs->pic, value_mask, value_list); */ + +/* _xr_render_surface_clips_set(rs, dc, 0, 0, rs->w, rs->h); */ +/* XRenderCompositeDoublePoly(rs->xcbinf->conn, op, */ +/* rs->xcbinf->mul->pic, rs->pic, */ +/* rs->xcbinf->fmt8, 0, 0, 0, 0, */ +/* pts, num, Complex); */ +/* free(pts); */ +} diff --git a/src/modules/loaders/.cvsignore b/src/modules/loaders/.cvsignore new file mode 100644 index 0000000..282522d --- /dev/null +++ b/src/modules/loaders/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/src/modules/loaders/Makefile.am b/src/modules/loaders/Makefile.am new file mode 100644 index 0000000..fceae72 --- /dev/null +++ b/src/modules/loaders/Makefile.am @@ -0,0 +1,40 @@ +MAINTAINERCLEANFILES = Makefile.in + +if BUILD_LOADER_EDB +edb_subdir = edb +endif + +if BUILD_LOADER_EET +eet_subdir = eet +endif + +if BUILD_LOADER_GIF +gif_subdir = gif +endif + +if BUILD_LOADER_JPEG +jpeg_subdir = jpeg +endif + +if BUILD_LOADER_PNG +png_subdir = png +endif + +if BUILD_LOADER_TIFF +tiff_subdir = tiff +endif + +if BUILD_LOADER_XPM +xpm_subdir = xpm +endif + +if BUILD_LOADER_SVG +svg_subdir = svg +endif + +if BUILD_LOADER_PMAPS +pmaps_subdir = pmaps +endif + + +SUBDIRS = $(edb_subdir) $(eet_subdir) $(gif_subdir) $(jpeg_subdir) $(png_subdir) $(tiff_subdir) $(xpm_subdir) $(svg_subdir) $(pmaps_subdir) diff --git a/src/modules/loaders/edb/.cvsignore b/src/modules/loaders/edb/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/loaders/edb/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/loaders/edb/Makefile.am b/src/modules/loaders/edb/Makefile.am new file mode 100644 index 0000000..81f29c4 --- /dev/null +++ b/src/modules/loaders/edb/Makefile.am @@ -0,0 +1,20 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = -I. \ + -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/lib/include \ + @FREETYPE_CFLAGS@ @EDB_CFLAGS@ + +pkgdir = $(libdir)/evas/modules/loaders/edb/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = evas_image_load_edb.c + +module_la_LIBADD = @EDB_LIBS@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +EXTRA_DIST = evas_image_load_edb.c diff --git a/src/modules/loaders/edb/evas_image_load_edb.c b/src/modules/loaders/edb/evas_image_load_edb.c new file mode 100644 index 0000000..2b3ba05 --- /dev/null +++ b/src/modules/loaders/edb/evas_image_load_edb.c @@ -0,0 +1,204 @@ +#include "evas_common.h" +#include "evas_private.h" + +#include +#include + + +#define SWAP32(x) (x) = ((((x) & 0x000000ff ) << 24) | (((x) & 0x0000ff00 ) << 8) | (((x) & 0x00ff0000 ) >> 8) | (((x) & 0xff000000 ) >> 24)) + + +int evas_image_load_file_head_edb(Image_Entry *ie, const char *file, const char *key); +int evas_image_load_file_data_edb(Image_Entry *ie, const char *file, const char *key); + +Evas_Image_Load_Func evas_image_load_edb_func = +{ + evas_image_load_file_head_edb, + evas_image_load_file_data_edb +}; + + +int +evas_image_load_file_head_edb(Image_Entry *ie, const char *file, const char *key) +{ + int w, h, alpha, compression, size; + E_DB_File *db; + DATA32 *ret; + DATA32 header[8]; + + if ((!file) || (!key)) return 0; + db = e_db_open_read((char *)file); + if (!db) return 0; + ret = e_db_data_get(db, (char *)key, &size); + if (!ret) + { + e_db_close(db); + return 0; + } + if (size < 32) + { + free(ret); + e_db_close(db); + return 0; + } + memcpy(header, ret, 32); +#ifdef WORDS_BIGENDIAN + { + int i; + + for (i = 0; i < 8; i++) SWAP32(header[i]); + } +#endif + if (header[0] != 0xac1dfeed) + { + free(ret); + e_db_close(db); + return 0; + } + w = header[1]; + h = header[2]; + if ((w < 1) || (h < 1) || (w > 8192) || (h > 8192)) + { + free(ret); + e_db_close(db); + return 0; + } + alpha = header[3]; + compression = header[4]; + + if ((compression == 0) && (size < ((w * h * 4) + 32))) + { + free(ret); + e_db_close(db); + return 0; + } + if (alpha) ie->flags.alpha = 1; + ie->w = w; + ie->h = h; + free(ret); + e_db_close(db); + return 1; +} + +int +evas_image_load_file_data_edb(Image_Entry *ie, const char *file, const char *key) +{ + int w, h, alpha, compression, size; + E_DB_File *db; + DATA32 *ret; + DATA32 *body; + DATA32 *surface; + DATA32 header[8]; + + if ((!file) || (!key)) return 0; + db = e_db_open_read((char *)file); + if (!db) return 0; + ret = e_db_data_get(db, (char *)key, &size); + if (!ret) + { + e_db_close(db); + return 0; + } + if (size < 32) + { + free(ret); + e_db_close(db); + return 0; + } + memcpy(header, ret, 32); +#ifdef WORDS_BIGENDIAN + { + int i; + + for (i = 0; i < 8; i++) SWAP32(header[i]); + } +#endif + if (header[0] != 0xac1dfeed) + { + free(ret); + e_db_close(db); + return 0; + } + w = header[1]; + h = header[2]; + if ((w < 1) || (h < 1) || (w > 8192) || (h > 8192)) + { + free(ret); + e_db_close(db); + return 0; + } + + alpha = header[3]; + compression = header[4]; + + if ((compression == 0) && (size < ((w * h * 4) + 32))) + { + free(ret); + e_db_close(db); + return 0; + } + if (alpha) ie->flags.alpha = 1; + body = &(ret[8]); + evas_cache_image_surface_alloc(ie, w, h); + surface = evas_cache_image_pixels(ie); + if (!surface) + { + free(ret); + e_db_close(db); + return 0; + } + if (!compression) + { +#ifdef WORDS_BIGENDIAN + { + int x; + + memcpy(surface, body, w * h * sizeof(DATA32)); + for (x = 0; x < (w * h); x++) SWAP32(surface[x]); + } +#else + memcpy(surface, body, w * h * sizeof(DATA32)); +#endif + } + else + { + uLongf dlen; + + dlen = w * h * sizeof(DATA32); + uncompress((Bytef *)surface, &dlen, (Bytef *)body, + (uLongf)(size - 32)); +#ifdef WORDS_BIGENDIAN + { + int x; + + for (x = 0; x < (w * h); x++) SWAP32(surface[x]); + } +#endif + } + evas_common_image_premul(ie); + free(ret); + e_db_close(db); + return 1; +} + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + em->functions = (void *)(&evas_image_load_edb_func); + return 1; +} + +EAPI void +module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_IMAGE_LOADER, + "edb", + "none" +}; diff --git a/src/modules/loaders/eet/.cvsignore b/src/modules/loaders/eet/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/loaders/eet/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/loaders/eet/Makefile.am b/src/modules/loaders/eet/Makefile.am new file mode 100644 index 0000000..4f186ce --- /dev/null +++ b/src/modules/loaders/eet/Makefile.am @@ -0,0 +1,22 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +@FREETYPE_CFLAGS@ \ +@EET_CFLAGS@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +pkgdir = $(libdir)/evas/modules/loaders/eet/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = evas_image_load_eet.c + +module_la_LIBADD = @EET_LIBS@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/loaders/eet/evas_image_load_eet.c b/src/modules/loaders/eet/evas_image_load_eet.c new file mode 100644 index 0000000..0247bf7 --- /dev/null +++ b/src/modules/loaders/eet/evas_image_load_eet.c @@ -0,0 +1,121 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" /* so that EAPI in Eet.h is correctly defined */ +#endif + +#include + +#include "evas_common.h" +#include "evas_private.h" + + +int evas_image_load_file_head_eet(Image_Entry *ie, const char *file, const char *key); +int evas_image_load_file_data_eet(Image_Entry *ie, const char *file, const char *key); + +Evas_Image_Load_Func evas_image_load_eet_func = +{ + evas_image_load_file_head_eet, + evas_image_load_file_data_eet +}; + + +int +evas_image_load_file_head_eet(Image_Entry *ie, const char *file, const char *key) +{ + int alpha, compression, quality, lossy; + unsigned int w, h; + Eet_File *ef; + int ok; + int res = 0; + + if ((!file) || (!key)) return 0; + ef = eet_open((char *)file, EET_FILE_MODE_READ); + if (!ef) return 0; + ok = eet_data_image_header_read(ef, key, + &w, &h, &alpha, &compression, &quality, &lossy); + if (!ok) goto on_error; + if (alpha) ie->flags.alpha = 1; + ie->w = w; + ie->h = h; + res = 1; + + on_error: + eet_close(ef); + return res; +} + +int +evas_image_load_file_data_eet(Image_Entry *ie, const char *file, const char *key) +{ + unsigned int w, h; + int alpha, compression, quality, lossy, ok; + Eet_File *ef; + DATA32 *body, *p, *end; + DATA32 nas = 0; + int res = 0; + + if ((!file) || (!key)) return 0; + if (ie->flags.loaded) return 1; + ef = eet_open(file, EET_FILE_MODE_READ); + if (!ef) return 0; + ok = eet_data_image_header_read(ef, key, + &w, &h, &alpha, &compression, &quality, &lossy); + if (!ok) goto on_error; + evas_cache_image_surface_alloc(ie, w, h); + ok = eet_data_image_read_to_surface(ef, key, 0, 0, + evas_cache_image_pixels(ie), w, h, w * 4, + &alpha, &compression, &quality, &lossy); + if (!ok) goto on_error; + if (alpha) + { + ie->flags.alpha = 1; + + body = evas_cache_image_pixels(ie); + + end = body +(w * h); + for (p = body; p < end; p++) + { + DATA32 r, g, b, a; + + a = A_VAL(p); + r = R_VAL(p); + g = G_VAL(p); + b = B_VAL(p); + if ((a == 0) || (a == 255)) nas++; + if (r > a) r = a; + if (g > a) g = a; + if (b > a) b = a; + *p = ARGB_JOIN(a, r, g, b); + } + if ((ALPHA_SPARSE_INV_FRACTION * nas) >= (ie->w * ie->h)) + ie->flags.alpha_sparse = 1; + } +// result is already premultiplied now if u compile with edje +// evas_common_image_premul(im); + res = 1; + + on_error: + eet_close(ef); + return res; +} + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + em->functions = (void *)(&evas_image_load_eet_func); + return 1; +} + +EAPI void +module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_IMAGE_LOADER, + "eet", + "none" +}; diff --git a/src/modules/loaders/gif/.cvsignore b/src/modules/loaders/gif/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/loaders/gif/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/loaders/gif/Makefile.am b/src/modules/loaders/gif/Makefile.am new file mode 100644 index 0000000..f28fc27 --- /dev/null +++ b/src/modules/loaders/gif/Makefile.am @@ -0,0 +1,21 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +@FREETYPE_CFLAGS@ @gif_cflags@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +pkgdir = $(libdir)/evas/modules/loaders/gif/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = evas_image_load_gif.c + +module_la_LIBADD = @gif_libs@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/loaders/gif/evas_image_load_gif.c b/src/modules/loaders/gif/evas_image_load_gif.c new file mode 100644 index 0000000..65ca74b --- /dev/null +++ b/src/modules/loaders/gif/evas_image_load_gif.c @@ -0,0 +1,307 @@ +#include "evas_common.h" +#include "evas_private.h" + +#include +#include +#include + +#include + + +int evas_image_load_file_head_gif(Image_Entry *ie, const char *file, const char *key); +int evas_image_load_file_data_gif(Image_Entry *ie, const char *file, const char *key); + +Evas_Image_Load_Func evas_image_load_gif_func = +{ + evas_image_load_file_head_gif, + evas_image_load_file_data_gif +}; + + +int +evas_image_load_file_head_gif(Image_Entry *ie, const char *file, const char *key) +{ + int fd; + GifFileType *gif; + GifRecordType rec; + int done; + int w; + int h; + int alpha; + + done = 0; + w = 0; + h = 0; + alpha = -1; + + if (!file) return 0; + +#ifndef __EMX__ + fd = open(file, O_RDONLY); +#else + fd = open(file, O_RDONLY | O_BINARY); +#endif + if (fd < 0) + return 0; + + gif = DGifOpenFileHandle(fd); + if (!gif) + { + close(fd); + return 0; + } + + do + { + if (DGifGetRecordType(gif, &rec) == GIF_ERROR) + { + /* PrintGifError(); */ + rec = TERMINATE_RECORD_TYPE; + } + if ((rec == IMAGE_DESC_RECORD_TYPE) && (!done)) + { + if (DGifGetImageDesc(gif) == GIF_ERROR) + { + /* PrintGifError(); */ + rec = TERMINATE_RECORD_TYPE; + } + w = gif->Image.Width; + h = gif->Image.Height; + if ((w < 1) || (h < 1) || (w > 8192) || (h > 8192)) + { + DGifCloseFile(gif); + return 0; + } + done = 1; + } + else if (rec == EXTENSION_RECORD_TYPE) + { + int ext_code; + GifByteType *ext; + + ext = NULL; + DGifGetExtension(gif, &ext_code, &ext); + while (ext) + { + if ((ext_code == 0xf9) && (ext[1] & 1) && (alpha < 0)) + { + alpha = (int)ext[4]; + } + ext = NULL; + DGifGetExtensionNext(gif, &ext); + } + } + } while (rec != TERMINATE_RECORD_TYPE); + + if (alpha >= 0) ie->flags.alpha = 1; + ie->w = w; + ie->h = h; + + DGifCloseFile(gif); + return 1; +} + +int +evas_image_load_file_data_gif(Image_Entry *ie, const char *file, const char *key) +{ + int intoffset[] = { 0, 4, 2, 1 }; + int intjump[] = { 8, 8, 4, 2 }; + double per; + double per_inc; + int fd; + GifFileType *gif; + GifRecordType rec; + GifRowType *rows; + ColorMapObject *cmap; + DATA32 *ptr; + int done; + int last_y; + int last_per; + int w; + int h; + int alpha; + int i; + int j; + int bg; + int r; + int g; + int b; + + rows = NULL; + per = 0.0; + done = 0; + last_y = 0; + last_per = 0; + w = 0; + h = 0; + alpha = -1; + + if (!file) return 0; + +#ifndef __EMX__ + fd = open(file, O_RDONLY); +#else + fd = open(file, O_RDONLY | O_BINARY); +#endif + if (fd < 0) + return 0; + + gif = DGifOpenFileHandle(fd); + if (!gif) + { + close(fd); + return 0; + } + do + { + if (DGifGetRecordType(gif, &rec) == GIF_ERROR) + { + /* PrintGifError(); */ + rec = TERMINATE_RECORD_TYPE; + } + if ((rec == IMAGE_DESC_RECORD_TYPE) && (!done)) + { + if (DGifGetImageDesc(gif) == GIF_ERROR) + { + /* PrintGifError(); */ + rec = TERMINATE_RECORD_TYPE; + } + w = gif->Image.Width; + h = gif->Image.Height; + rows = malloc(h * sizeof(GifRowType *)); + if (!rows) + { + DGifCloseFile(gif); + return 0; + } + for (i = 0; i < h; i++) + { + rows[i] = NULL; + } + for (i = 0; i < h; i++) + { + rows[i] = malloc(w * sizeof(GifPixelType)); + if (!rows[i]) + { + DGifCloseFile(gif); + for (i = 0; i < h; i++) + { + if (rows[i]) + { + free(rows[i]); + } + } + free(rows); + return 0; + } + } + if (gif->Image.Interlace) + { + for (i = 0; i < 4; i++) + { + for (j = intoffset[i]; j < h; j += intjump[i]) + { + DGifGetLine(gif, rows[j], w); + } + } + } + else + { + for (i = 0; i < h; i++) + { + DGifGetLine(gif, rows[i], w); + } + } + done = 1; + } + else if (rec == EXTENSION_RECORD_TYPE) + { + int ext_code; + GifByteType *ext; + + ext = NULL; + DGifGetExtension(gif, &ext_code, &ext); + while (ext) + { + if ((ext_code == 0xf9) && (ext[1] & 1) && (alpha < 0)) + { + alpha = (int)ext[4]; + } + ext = NULL; + DGifGetExtensionNext(gif, &ext); + } + } + } while (rec != TERMINATE_RECORD_TYPE); + + if (alpha >= 0) ie->flags.alpha = 1; + evas_cache_image_surface_alloc(ie, w, h); + if (!evas_cache_image_pixels(ie)) + { + DGifCloseFile(gif); + for (i = 0; i < h; i++) + { + free(rows[i]); + } + free(rows); + return 0; + } + + bg = gif->SBackGroundColor; + cmap = (gif->Image.ColorMap ? gif->Image.ColorMap : gif->SColorMap); + + ptr = evas_cache_image_pixels(ie); + per_inc = 100.0 / (((double)w) * h); + + for (i = 0; i < h; i++) + { + for (j = 0; j < w; j++) + { + if (rows[i][j] == alpha) + { + r = cmap->Colors[bg].Red; + g = cmap->Colors[bg].Green; + b = cmap->Colors[bg].Blue; + *ptr++ = 0x00ffffff & ((r << 16) | (g << 8) | b); + } + else + { + r = cmap->Colors[rows[i][j]].Red; + g = cmap->Colors[rows[i][j]].Green; + b = cmap->Colors[rows[i][j]].Blue; + *ptr++ = (0xff << 24) | (r << 16) | (g << 8) | b; + } + per += per_inc; + } + } + evas_common_image_premul(ie); + DGifCloseFile(gif); + for (i = 0; i < h; i++) + { + free(rows[i]); + } + free(rows); + + return 1; +} + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + em->functions = (void *)(&evas_image_load_gif_func); + return 1; +} + +EAPI void +module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_IMAGE_LOADER, + "gif", + "none" +}; diff --git a/src/modules/loaders/jpeg/.cvsignore b/src/modules/loaders/jpeg/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/loaders/jpeg/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/loaders/jpeg/Makefile.am b/src/modules/loaders/jpeg/Makefile.am new file mode 100644 index 0000000..c8cb9f6 --- /dev/null +++ b/src/modules/loaders/jpeg/Makefile.am @@ -0,0 +1,22 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +@FREETYPE_CFLAGS@ \ +@jpeg_cflags@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +pkgdir = $(libdir)/evas/modules/loaders/jpeg/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = evas_image_load_jpeg.c + +module_la_LIBADD = @jpeg_libs@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/loaders/jpeg/evas_image_load_jpeg.c b/src/modules/loaders/jpeg/evas_image_load_jpeg.c new file mode 100644 index 0000000..46ea4c5 --- /dev/null +++ b/src/modules/loaders/jpeg/evas_image_load_jpeg.c @@ -0,0 +1,437 @@ +#include "evas_common.h" +#include "evas_private.h" + +#include +#include +#include + + +typedef struct _JPEG_error_mgr *emptr; +struct _JPEG_error_mgr +{ + struct jpeg_error_mgr pub; + jmp_buf setjmp_buffer; +}; + +static void _JPEGFatalErrorHandler(j_common_ptr cinfo); +static void _JPEGErrorHandler(j_common_ptr cinfo); +static void _JPEGErrorHandler2(j_common_ptr cinfo, int msg_level); + +static int evas_image_load_file_head_jpeg_internal(Image_Entry *ie, FILE *f); +static int evas_image_load_file_data_jpeg_internal(Image_Entry *ie, FILE *f); +#if 0 /* not used at the moment */ +static int evas_image_load_file_data_jpeg_alpha_internal(Image_Entry *ie, FILE *f); +#endif + +int evas_image_load_file_head_jpeg(Image_Entry *ie, const char *file, const char *key); +int evas_image_load_file_data_jpeg(Image_Entry *ie, const char *file, const char *key); + +Evas_Image_Load_Func evas_image_load_jpeg_func = +{ + evas_image_load_file_head_jpeg, + evas_image_load_file_data_jpeg +}; + + +static void +_JPEGFatalErrorHandler(j_common_ptr cinfo) +{ + emptr errmgr; + + errmgr = (emptr) cinfo->err; + /* cinfo->err->output_message(cinfo);*/ + longjmp(errmgr->setjmp_buffer, 1); + return; +} + +static void +_JPEGErrorHandler(j_common_ptr cinfo) +{ + emptr errmgr; + + errmgr = (emptr) cinfo->err; + /* cinfo->err->output_message(cinfo);*/ + /* longjmp(errmgr->setjmp_buffer, 1);*/ + return; +} + +static void +_JPEGErrorHandler2(j_common_ptr cinfo, int msg_level) +{ + emptr errmgr; + + errmgr = (emptr) cinfo->err; + /* cinfo->err->output_message(cinfo);*/ + /* longjmp(errmgr->setjmp_buffer, 1);*/ + return; + msg_level = 0; +} + +static int +evas_image_load_file_head_jpeg_internal(Image_Entry *ie, FILE *f) +{ + int w, h, scalew, scaleh; + struct jpeg_decompress_struct cinfo; + struct _JPEG_error_mgr jerr; + + if (!f) return 0; + cinfo.err = jpeg_std_error(&(jerr.pub)); + jerr.pub.error_exit = _JPEGFatalErrorHandler; + jerr.pub.emit_message = _JPEGErrorHandler2; + jerr.pub.output_message = _JPEGErrorHandler; + if (setjmp(jerr.setjmp_buffer)) + { + jpeg_destroy_decompress(&cinfo); + return 0; + } + jpeg_create_decompress(&cinfo); + jpeg_stdio_src(&cinfo, f); + jpeg_read_header(&cinfo, TRUE); + cinfo.do_fancy_upsampling = FALSE; + cinfo.do_block_smoothing = FALSE; + cinfo.dct_method = JDCT_IFAST; + cinfo.dither_mode = JDITHER_ORDERED; + jpeg_start_decompress(&cinfo); + +/* head decoding */ + w = cinfo.output_width; + h = cinfo.output_height; + if ((w < 1) || (h < 1) || (w > 8192) || (h > 8192)) + { + jpeg_destroy_decompress(&cinfo); + return 0; + } + if (ie->load_opts.scale_down_by > 1) + { + w /= ie->load_opts.scale_down_by; + h /= ie->load_opts.scale_down_by; + } + else if (ie->load_opts.dpi > 0.0) + { + w = (w * ie->load_opts.dpi) / 90.0; + h = (h * ie->load_opts.dpi) / 90.0; + } + else if ((ie->load_opts.w > 0) && + (ie->load_opts.h > 0)) + { + int w2, h2; + + w2 = ie->load_opts.w; + h2 = (ie->load_opts.w * h) / w; + if (h2 > ie->load_opts.h) + { + h2 = ie->load_opts.h; + w2 = (ie->load_opts.h * w) / h; + } + w = w2; + h = h2; + } + if (w < 1) w = 1; + if (h < 1) h = 1; + + if ((w != cinfo.output_width) || (h != cinfo.output_height)) + { + scalew = cinfo.output_width / w; + scaleh = cinfo.output_height / h; + + ie->scale = scalew; + if (scaleh < scalew) ie->scale = scaleh; + + if (ie->scale > 8) ie->scale = 8; + else if (ie->scale < 1) ie->scale = 1; + + if (ie->scale == 3) ie->scale = 2; + else if (ie->scale == 5) ie->scale = 4; + else if (ie->scale == 6) ie->scale = 4; + else if (ie->scale == 7) ie->scale = 4; + } + + if (ie->scale > 1) + { + jpeg_destroy_decompress(&cinfo); + + rewind(f); + jpeg_create_decompress(&cinfo); + jpeg_stdio_src(&cinfo, f); + jpeg_read_header(&cinfo, TRUE); + cinfo.do_fancy_upsampling = FALSE; + cinfo.do_block_smoothing = FALSE; + cinfo.scale_num = 1; + cinfo.scale_denom = ie->scale; + jpeg_calc_output_dimensions(&(cinfo)); + jpeg_start_decompress(&cinfo); + } + + ie->w = cinfo.output_width; + ie->h = cinfo.output_height; +/* end head decoding */ + + jpeg_destroy_decompress(&cinfo); + return 1; +} + +static int +evas_image_load_file_data_jpeg_internal(Image_Entry *ie, FILE *f) +{ + int w, h; + struct jpeg_decompress_struct cinfo; + struct _JPEG_error_mgr jerr; + DATA8 *ptr, *line[16], *data; + DATA32 *ptr2; + int x, y, l, i, scans, count, prevy; + + if (!f) return 0; + cinfo.err = jpeg_std_error(&(jerr.pub)); + jerr.pub.error_exit = _JPEGFatalErrorHandler; + jerr.pub.emit_message = _JPEGErrorHandler2; + jerr.pub.output_message = _JPEGErrorHandler; + if (setjmp(jerr.setjmp_buffer)) + { + jpeg_destroy_decompress(&cinfo); + return 0; + } + jpeg_create_decompress(&cinfo); + jpeg_stdio_src(&cinfo, f); + jpeg_read_header(&cinfo, TRUE); + cinfo.do_fancy_upsampling = FALSE; + cinfo.do_block_smoothing = FALSE; + cinfo.dct_method = JDCT_IFAST; + cinfo.dither_mode = JDITHER_ORDERED; + + if (ie->scale > 1) + { + cinfo.scale_num = 1; + cinfo.scale_denom = ie->scale; + } + +/* head decoding */ + jpeg_calc_output_dimensions(&(cinfo)); + jpeg_start_decompress(&cinfo); + + w = cinfo.output_width; + h = cinfo.output_height; + + if ((w != ie->w) || (h != ie->h)) + { + jpeg_destroy_decompress(&cinfo); + return 0; + } + +/* end head decoding */ +/* data decoding */ + if (cinfo.rec_outbuf_height > 16) + { + jpeg_destroy_decompress(&cinfo); + return 0; + } + data = alloca(w * 16 * 3); + evas_cache_image_surface_alloc(ie, w, h); + if (ie->flags.loaded) + { + jpeg_destroy_decompress(&cinfo); + return 0; + } + ptr2 = evas_cache_image_pixels(ie); + count = 0; + prevy = 0; + if (cinfo.output_components == 3) + { + for (i = 0; i < cinfo.rec_outbuf_height; i++) + line[i] = data + (i * w * 3); + for (l = 0; l < h; l += cinfo.rec_outbuf_height) + { + jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height); + scans = cinfo.rec_outbuf_height; + if ((h - l) < scans) scans = h - l; + ptr = data; + for (y = 0; y < scans; y++) + { + for (x = 0; x < w; x++) + { + *ptr2 = + (0xff000000) | ((ptr[0]) << 16) | ((ptr[1]) << 8) | (ptr[2]); + ptr += 3; + ptr2++; + } + } + } + } + else if (cinfo.output_components == 1) + { + for (i = 0; i < cinfo.rec_outbuf_height; i++) + line[i] = data + (i * w); + for (l = 0; l < h; l += cinfo.rec_outbuf_height) + { + jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height); + scans = cinfo.rec_outbuf_height; + if ((h - l) < scans) scans = h - l; + ptr = data; + for (y = 0; y < scans; y++) + { + for (x = 0; x < w; x++) + { + *ptr2 = + (0xff000000) | ((ptr[0]) << 16) | ((ptr[0]) << 8) | (ptr[0]); + ptr++; + ptr2++; + } + } + } + } +/* end data decoding */ + jpeg_finish_decompress(&cinfo); + jpeg_destroy_decompress(&cinfo); + return 1; +} + +#if 0 /* not used at the moment */ +static int +evas_image_load_file_data_jpeg_alpha_internal(Image_Entry *ie, FILE *f) +{ + int w, h; + struct jpeg_decompress_struct cinfo; + struct _JPEG_error_mgr jerr; + DATA8 *ptr, *line[16], *data; + DATA32 *ptr2; + int x, y, l, i, scans, count, prevy; + + if (!f) return 0; + cinfo.err = jpeg_std_error(&(jerr.pub)); + jerr.pub.error_exit = _JPEGFatalErrorHandler; + jerr.pub.emit_message = _JPEGErrorHandler2; + jerr.pub.output_message = _JPEGErrorHandler; + if (setjmp(jerr.setjmp_buffer)) + { + jpeg_destroy_decompress(&cinfo); + return 0; + } + jpeg_create_decompress(&cinfo); + jpeg_stdio_src(&cinfo, f); + jpeg_read_header(&cinfo, TRUE); + cinfo.do_fancy_upsampling = FALSE; + cinfo.do_block_smoothing = FALSE; + jpeg_start_decompress(&cinfo); + +/* head decoding */ + ie->w = w = cinfo.output_width; + ie->h = h = cinfo.output_height; +/* end head decoding */ +/* data decoding */ + if (cinfo.rec_outbuf_height > 16) + { + jpeg_destroy_decompress(&cinfo); + return 0; + } + data = alloca(w * 16 * 3); + if (!ie->flags.loaded) + { + jpeg_destroy_decompress(&cinfo); + return 0; + } + ptr2 = evas_cache_image_pixels(ie); + count = 0; + prevy = 0; + if (cinfo.output_components == 3) + { + for (i = 0; i < cinfo.rec_outbuf_height; i++) + line[i] = data + (i * w * 3); + for (l = 0; l < h; l += cinfo.rec_outbuf_height) + { + jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height); + scans = cinfo.rec_outbuf_height; + if ((h - l) < scans) scans = h - l; + ptr = data; + for (y = 0; y < scans; y++) + { + for (x = 0; x < w; x++) + { + *ptr2 = + ((*ptr2) & 0x00ffffff) | + (((ptr[0] + ptr[1] + ptr[2]) / 3) << 24); + ptr += 3; + ptr2++; + } + } + } + } + else if (cinfo.output_components == 1) + { + for (i = 0; i < cinfo.rec_outbuf_height; i++) + line[i] = data + (i * w); + for (l = 0; l < h; l += cinfo.rec_outbuf_height) + { + jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height); + scans = cinfo.rec_outbuf_height; + if ((h - l) < scans) scans = h - l; + ptr = data; + for (y = 0; y < scans; y++) + { + for (x = 0; x < w; x++) + { + *ptr2 = + ((*ptr2) & 0x00ffffff) | + ((ptr[0]) << 24); + ptr++; + ptr2++; + } + } + } + } +/* end data decoding */ + jpeg_finish_decompress(&cinfo); + jpeg_destroy_decompress(&cinfo); + return 1; +} +#endif + +int +evas_image_load_file_head_jpeg(Image_Entry *ie, const char *file, const char *key) +{ + int val; + FILE *f; + + if ((!file)) return 0; + f = fopen(file, "rb"); + if (!f) return 0; + val = evas_image_load_file_head_jpeg_internal(ie, f); + fclose(f); + return val; + key = 0; +} + +int +evas_image_load_file_data_jpeg(Image_Entry *ie, const char *file, const char *key) +{ + int val; + FILE *f; + + if ((!file)) return 0; + f = fopen(file, "rb"); + if (!f) return 0; + val = evas_image_load_file_data_jpeg_internal(ie, f); + fclose(f); + return val; + key = 0; +} + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + em->functions = (void *)(&evas_image_load_jpeg_func); + return 1; +} + +EAPI void +module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_IMAGE_LOADER, + "jpeg", + "none" +}; diff --git a/src/modules/loaders/pmaps/.cvsignore b/src/modules/loaders/pmaps/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/loaders/pmaps/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/loaders/pmaps/Makefile.am b/src/modules/loaders/pmaps/Makefile.am new file mode 100644 index 0000000..0a0748d --- /dev/null +++ b/src/modules/loaders/pmaps/Makefile.am @@ -0,0 +1,23 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +@FREETYPE_CFLAGS@ \ +@pmaps_cflags@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +pkgdir = $(libdir)/evas/modules/loaders/pmaps/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = evas_image_load_pmaps.c + +module_la_LIBADD = $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -module -avoid-version + +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/loaders/pmaps/evas_image_load_pmaps.c b/src/modules/loaders/pmaps/evas_image_load_pmaps.c new file mode 100644 index 0000000..35b0a59 --- /dev/null +++ b/src/modules/loaders/pmaps/evas_image_load_pmaps.c @@ -0,0 +1,554 @@ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include "evas_common.h" +#include "evas_private.h" + +#define FILE_BUFFER_SIZE 1024 +#define FILE_BUFFER_UNREAD_SIZE 16 + +static int evas_image_load_file_head_pmaps(Image_Entry *ie, + const char *file, const char *key); +static int evas_image_load_file_data_pmaps(Image_Entry *ie, + const char *file, const char *key); + +Evas_Image_Load_Func evas_image_load_pmaps_func = { + evas_image_load_file_head_pmaps, + evas_image_load_file_data_pmaps +}; + +/* The buffer to load pmaps images */ +typedef struct Pmaps_Buffer Pmaps_Buffer; + +struct Pmaps_Buffer +{ + FILE *file; + + /* the buffer */ + DATA8 buffer[FILE_BUFFER_SIZE]; + DATA8 unread[FILE_BUFFER_UNREAD_SIZE]; + DATA8 *current; + DATA8 *end; + char type[3]; + unsigned char unread_len:7; + unsigned char last_buffer:1; + + /* image properties */ + int w; + int h; + int max; + + /* interface */ + int (*int_get) (Pmaps_Buffer *b, int *val); + int (*color_get) (Pmaps_Buffer *b, DATA32 *color); +}; + +/* internal used functions */ +static int pmaps_buffer_open(Pmaps_Buffer *b, const char *filename); +static void pmaps_buffer_close(Pmaps_Buffer *b); +static int pmaps_buffer_header_parse(Pmaps_Buffer *b); +static int pmaps_buffer_plain_int_get(Pmaps_Buffer *b, int *val); +static int pmaps_buffer_1byte_int_get(Pmaps_Buffer *b, int *val); +static int pmaps_buffer_2byte_int_get(Pmaps_Buffer *b, int *val); +static int pmaps_buffer_gray_get(Pmaps_Buffer *b, DATA32 *color); +static int pmaps_buffer_rgb_get(Pmaps_Buffer *b, DATA32 *color); +static int pmaps_buffer_plain_bw_get(Pmaps_Buffer *b, DATA32 *color); + +static size_t pmaps_buffer_plain_update(Pmaps_Buffer *b); +static size_t pmaps_buffer_raw_update(Pmaps_Buffer *b); +static int pmaps_buffer_comment_skip(Pmaps_Buffer *b); + +static int +evas_image_load_file_head_pmaps(Image_Entry *ie, const char *file, + const char *key) +{ + Pmaps_Buffer b; + + if ((!file)) + return 0; + + if (!pmaps_buffer_open(&b, file)) + { + pmaps_buffer_close(&b); + return 0; + } + + if (!pmaps_buffer_header_parse(&b)) + { + pmaps_buffer_close(&b); + return 0; + } + + ie->w = b.w; + ie->h = b.h; + + pmaps_buffer_close(&b); + return 1; + /* we don't have a use for key, skip warnings */ + key = NULL; +} + +static int +evas_image_load_file_data_pmaps(Image_Entry *ie, const char *file, + const char *key) +{ + Pmaps_Buffer b; + int pixels; + DATA32 *ptr; + + if ((!file)) + return 0; + + if (!pmaps_buffer_open(&b, file)) + { + pmaps_buffer_close(&b); + return 0; + } + + if (!pmaps_buffer_header_parse(&b)) + { + pmaps_buffer_close(&b); + return 0; + } + + pixels = b.w * b.h; + + evas_cache_image_surface_alloc(ie, b.w, b.h); + if (!evas_cache_image_pixels(ie)) + { + pmaps_buffer_close(&b); + return 0; + } + + ptr = evas_cache_image_pixels(ie); + + if (b.type[1] != '4') + { + while (pixels > 0 && b.color_get(&b, ptr)) + { + pixels--; + ptr++; + } + } + else + { + while (pixels > 0 + && (b.current != b.end || pmaps_buffer_raw_update(&b))) + { + int i; + + for (i = 7; i >= 0 && pixels > 0; i--) + { + if (*b.current & (1 << i)) + *ptr = 0xff000000; + else + *ptr = 0xffffffff; + ptr++; + pixels--; + } + b.current++; + } + } + + /* if there are some pix missing, give them a proper default */ + memset(ptr, 0xff, 4 * pixels); + pmaps_buffer_close(&b); + + return 1; + /* we don't have a use for key, skip warnings */ + key = NULL; +} + +/* internal used functions */ +static int +pmaps_buffer_open(Pmaps_Buffer *b, const char *filename) +{ + size_t len; + + b->file = fopen(filename, "r"); + if (!b->file) + return 0; + + *b->buffer = 0; + *b->unread = 0; + b->last_buffer = 0; + b->unread_len = 0; + + len = pmaps_buffer_plain_update(b); + + if (len < 3) + return 0; + + /* copy the type */ + b->type[0] = b->buffer[0]; + b->type[1] = b->buffer[1]; + b->type[2] = 0; + /* skip the PX */ + b->current = b->buffer + 2; + + return 1; +} + +static void +pmaps_buffer_close(Pmaps_Buffer *b) +{ + if (b->file) + fclose(b->file); +} + +static int +pmaps_buffer_header_parse(Pmaps_Buffer *b) +{ + /* if there is no P at the beginning it is not a file we can parse */ + if (b->type[0] != 'P') + return 0; + + /* get the width */ + if (!pmaps_buffer_plain_int_get(b, &(b->w)) || b->w < 1) + return 0; + + /* get the height */ + if (!pmaps_buffer_plain_int_get(b, &(b->h)) || b->h < 1) + return 0; + + /* get the maximum value. P1 and P4 don't have a maximum value. */ + if (!(b->type[1] == '1' || b->type[1] == '4') + && (!pmaps_buffer_plain_int_get(b, &(b->max)) || b->max < 1)) + return 0; + + /* set up the color get callback */ + switch (b->type[1]) + { + /* Black and White */ + case '1': + b->color_get = pmaps_buffer_plain_bw_get; + break; + case '4': + /* Binary black and white use another format */ + b->color_get = NULL; + break; + case '2': + case '5': + b->color_get = pmaps_buffer_gray_get; + break; + case '3': + case '6': + b->color_get = pmaps_buffer_rgb_get; + break; + case '7': + /* XXX write me */ + return 0; + break; + default: + return 0; + } + /* set up the int get callback */ + switch (b->type[1]) + { + /* RAW */ + case '5': + case '6': + if (b->max < 256) + b->int_get = pmaps_buffer_1byte_int_get; + else + b->int_get = pmaps_buffer_2byte_int_get; + + if (b->current == b->end && !pmaps_buffer_raw_update(b)) + return 0; + + b->current++; + break; + /* Plain */ + case '2': + case '3': + b->int_get = pmaps_buffer_plain_int_get; + break; + /* Black and White Bitmaps don't use that callback */ + case '1': + case '4': + b->int_get = NULL; + /* we need to skip the next character fpr P4 it + * doesn't hurt if we do it for the P1 as well */ + b->current++; + break; + } + return 1; +} + +static size_t +pmaps_buffer_plain_update(Pmaps_Buffer *b) +{ + size_t r; + size_t steps = 0; + + /* if we already are in the last buffer we can not update it */ + if (b->last_buffer) + return 0; + + /* if we have unread bytes we need to put them before the new read + * stuff */ + if (b->unread_len) + memcpy(b->buffer, b->unread, b->unread_len); + + r = fread(&b->buffer[b->unread_len], 1, + FILE_BUFFER_SIZE - b->unread_len - 1, b->file) + b->unread_len; + + /* we haven't read anything nor have we bytes in the unread buffer */ + if (r == 0) + { + b->buffer[0] = '\0'; + b->end = b->buffer; + b->last_buffer = 1; + return 0; + } + + if (r < FILE_BUFFER_SIZE - 1) + { + /*we reached eof */ ; + b->last_buffer = 1; + } + + b->buffer[r] = 0; + r--; + + while (steps < (FILE_BUFFER_UNREAD_SIZE - 2) + && r > 1 && !isspace(b->buffer[r])) + { + steps++; + r--; + } + + if (steps != 0) + { + memcpy(b->unread, &b->buffer[r], steps + 1); + b->unread_len = steps + 1; + } + else + { + b->unread[0] = '\0'; + b->unread_len = 0; + } + + b->buffer[r] = '\0'; + b->current = b->buffer; + b->end = b->buffer + r; + + return r; +} + +static size_t +pmaps_buffer_raw_update(Pmaps_Buffer *b) +{ + size_t r; + + if (b->last_buffer) + return 0; + + if (b->unread_len) + memcpy(b->buffer, b->unread, b->unread_len); + + r = fread(&b->buffer[b->unread_len], 1, + FILE_BUFFER_SIZE - b->unread_len - 1, b->file) + b->unread_len; + + if (r < FILE_BUFFER_SIZE - 1) + { + /*we reached eof */ ; + b->last_buffer = 1; + } + + b->buffer[r] = 0; + b->end = b->buffer + r; + b->current = b->buffer; + + if (b->unread_len) + { + /* the buffer is now read */ + *b->unread = '\0'; + b->unread_len = 0; + } + + return r; +} + +static int +pmaps_buffer_plain_int_get(Pmaps_Buffer *b, int *val) +{ + char *start; + DATA8 lastc; + + /* first skip all white space + * Note: we are skipping here actually every character than is not + * a digit */ + while (!isdigit(*b->current)) + { + if (*b->current == '\0') + { + if (!pmaps_buffer_plain_update(b)) + return 0; + + continue; + } + if (*b->current == '#' && !pmaps_buffer_comment_skip(b)) + return 0; + b->current++; + } + + start = (char *)b->current; + /* now find the end of the number */ + while (isdigit(*b->current)) + b->current++; + + lastc = *b->current; + *b->current = '\0'; + *val = atoi(start); + *b->current = lastc; + + return 1; +} + +static int +pmaps_buffer_1byte_int_get(Pmaps_Buffer *b, int *val) +{ + /* are we at the end of the buffer? */ + if (b->current == b->end && !pmaps_buffer_raw_update(b)) + return 0; + + *val = *b->current; + b->current++; + + return 1; +} +static int +pmaps_buffer_2byte_int_get(Pmaps_Buffer *b, int *val) +{ + /* are we at the end of the buffer? */ + if (b->current == b->end && !pmaps_buffer_raw_update(b)) + return 0; + + *val = (int)(*b->current << 8); + b->current++; + + /* are we at the end of the buffer? */ + if (b->current == b->end && !pmaps_buffer_raw_update(b)) + return 0; + + *val |= *b->current; + b->current++; + + return 1; +} + +static int +pmaps_buffer_comment_skip(Pmaps_Buffer *b) +{ + while (*b->current != '\n') + { + if (*b->current == '\0') + { + if (!pmaps_buffer_plain_update(b)) + return 0; + + continue; + } + b->current++; + } + return 1; +} + +static int +pmaps_buffer_rgb_get(Pmaps_Buffer *b, DATA32 *color) +{ + int vr, vg, vb; + + if (!b->int_get(b, &vr) || !b->int_get(b, &vg) || !b->int_get(b, &vb)) + return 0; + + if (b->max != 255) + { + vr = (vr * 255) / b->max; + vg = (vg * 255) / b->max; + vb = (vb * 255) / b->max; + } + if (vr > 255) + vr = 255; + if (vg > 255) + vg = 255; + if (vb > 255) + vb = 255; + + *color = 0xff000000 | (vr << 16) | (vg << 8) | vb; + + return 1; +} + +static int +pmaps_buffer_gray_get(Pmaps_Buffer *b, DATA32 *color) +{ + int val; + + if (!b->int_get(b, &val)) + return 0; + + if (b->max != 255) + val = (val * 255) / b->max; + if (val > 255) + val = 255; + *color = 0xff000000 | (val << 16) | (val << 8) | val; + + return 1; +} + +static int +pmaps_buffer_plain_bw_get(Pmaps_Buffer *b, DATA32 *val) +{ + /* first skip all white space + * Note: we are skipping here actually every character than is not + * a digit */ + while (!isdigit(*b->current)) + { + if (*b->current == '\0') + { + if (!pmaps_buffer_raw_update(b)) + return 0; + + continue; + } + if (*b->current == '#' && !pmaps_buffer_comment_skip(b)) + return 0; + b->current++; + } + + if (*b->current == '0') + *val = 0xffffffff; + else + *val = 0xff000000; + + b->current++; + + return 1; +} + +/* external functions */ +EAPI int +module_open(Evas_Module *em) +{ + if (!em) + return 0; + em->functions = (void *)(&evas_image_load_pmaps_func); + return 1; +} + +EAPI void +module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = { + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_IMAGE_LOADER, + "pmaps", + "none" +}; + diff --git a/src/modules/loaders/png/.cvsignore b/src/modules/loaders/png/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/loaders/png/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/loaders/png/Makefile.am b/src/modules/loaders/png/Makefile.am new file mode 100644 index 0000000..6e00dcf --- /dev/null +++ b/src/modules/loaders/png/Makefile.am @@ -0,0 +1,20 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +@FREETYPE_CFLAGS@ \ +@PNG_CFLAGS@ + +pkgdir = $(libdir)/evas/modules/loaders/png/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = evas_image_load_png.c + +module_la_LIBADD = @PNG_LIBS@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/loaders/png/evas_image_load_png.c b/src/modules/loaders/png/evas_image_load_png.c new file mode 100644 index 0000000..57a5525 --- /dev/null +++ b/src/modules/loaders/png/evas_image_load_png.c @@ -0,0 +1,228 @@ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include +#include + +#include "evas_common.h" +#include "evas_private.h" + + +#define PNG_BYTES_TO_CHECK 4 + + +int evas_image_load_file_head_png(Image_Entry *ie, const char *file, const char *key); +int evas_image_load_file_data_png(Image_Entry *ie, const char *file, const char *key); + +Evas_Image_Load_Func evas_image_load_png_func = +{ + evas_image_load_file_head_png, + evas_image_load_file_data_png +}; + + +int +evas_image_load_file_head_png(Image_Entry *ie, const char *file, const char *key) +{ + png_uint_32 w32, h32; + FILE *f; + png_structp png_ptr = NULL; + png_infop info_ptr = NULL; + int bit_depth, color_type, interlace_type; + unsigned char buf[PNG_BYTES_TO_CHECK]; + char hasa; + + if ((!file)) return 0; + hasa = 0; + f = fopen(file, "rb"); + if (!f) return 0; + + /* if we havent read the header before, set the header data */ + if (fread(buf, PNG_BYTES_TO_CHECK, 1, f) != 1) + { + fclose(f); + return 0; + } + if (!png_check_sig(buf, PNG_BYTES_TO_CHECK)) + { + fclose(f); + return 0; + } + rewind(f); + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png_ptr) + { + fclose(f); + return 0; + } + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + png_destroy_read_struct(&png_ptr, NULL, NULL); + fclose(f); + return 0; + } + if (setjmp(png_ptr->jmpbuf)) + { + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + fclose(f); + return 0; + } + png_init_io(png_ptr, f); + png_read_info(png_ptr, info_ptr); + png_get_IHDR(png_ptr, info_ptr, (png_uint_32 *) (&w32), + (png_uint_32 *) (&h32), &bit_depth, &color_type, + &interlace_type, NULL, NULL); + if ((w32 < 1) || (h32 < 1) || (w32 > 8192) || (h32 > 8192)) + { + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL); + fclose(f); + return 0; + } + ie->w = (int) w32; + ie->h = (int) h32; + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) hasa = 1; + if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) hasa = 1; + if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) hasa = 1; + if (hasa) ie->flags.alpha = 1; + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL); + fclose(f); + return 1; + key = 0; +} + +int +evas_image_load_file_data_png(Image_Entry *ie, const char *file, const char *key) +{ + unsigned char *surface; + png_uint_32 w32, h32; + int w, h; + FILE *f; + png_structp png_ptr = NULL; + png_infop info_ptr = NULL; + int bit_depth, color_type, interlace_type; + unsigned char buf[PNG_BYTES_TO_CHECK]; + unsigned char **lines; + char hasa; + int i; + + if ((!file)) return 0; + hasa = 0; + f = fopen(file, "rb"); + if (!f) return 0; + + /* if we havent read the header before, set the header data */ + fread(buf, 1, PNG_BYTES_TO_CHECK, f); + if (!png_check_sig(buf, PNG_BYTES_TO_CHECK)) + { + fclose(f); + return 0; + } + rewind(f); + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png_ptr) + { + fclose(f); + return 0; + } + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + png_destroy_read_struct(&png_ptr, NULL, NULL); + fclose(f); + return 0; + } + if (setjmp(png_ptr->jmpbuf)) + { + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + fclose(f); + return 0; + } + png_init_io(png_ptr, f); + png_read_info(png_ptr, info_ptr); + png_get_IHDR(png_ptr, info_ptr, (png_uint_32 *) (&w32), + (png_uint_32 *) (&h32), &bit_depth, &color_type, + &interlace_type, NULL, NULL); + evas_cache_image_surface_alloc(ie, w32, h32); + surface = (unsigned char *) evas_cache_image_pixels(ie); + if (!surface) + { + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL); + fclose(f); + return 0; + } + if ((w32 != ie->w) || (h32 != ie->h)) + { + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL); + fclose(f); + return 0; + } + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) hasa = 1; + if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) hasa = 1; + if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) hasa = 1; + if (hasa) ie->flags.alpha = 1; + + /* Prep for transformations... ultimately we want ARGB */ + /* expand palette -> RGB if necessary */ + if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr); + /* expand gray (w/reduced bits) -> 8-bit RGB if necessary */ + if ((color_type == PNG_COLOR_TYPE_GRAY) || + (color_type == PNG_COLOR_TYPE_GRAY_ALPHA)) + { + png_set_gray_to_rgb(png_ptr); + if (bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr); + } + /* expand transparency entry -> alpha channel if present */ + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) + png_set_tRNS_to_alpha(png_ptr); + /* reduce 16bit color -> 8bit color if necessary */ + if (bit_depth > 8) png_set_strip_16(png_ptr); + /* pack all pixels to byte boundaries */ + png_set_packing(png_ptr); + + w = ie->w; + h = ie->h; + /* we want ARGB */ +#ifdef WORDS_BIGENDIAN + png_set_swap_alpha(png_ptr); + if (!hasa) png_set_filler(png_ptr, 0xff, PNG_FILLER_BEFORE); +#else + png_set_bgr(png_ptr); + if (!hasa) png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER); +#endif + lines = (unsigned char **) alloca(h * sizeof(unsigned char *)); + + for (i = 0; i < h; i++) + lines[i] = surface + (i * w * sizeof(DATA32)); + png_read_image(png_ptr, lines); + png_read_end(png_ptr, info_ptr); + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp) NULL); + fclose(f); + evas_common_image_premul(ie); + + return 1; + key = 0; +} + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + em->functions = (void *)(&evas_image_load_png_func); + return 1; +} + +EAPI void +module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_IMAGE_LOADER, + "png", + "none" +}; diff --git a/src/modules/loaders/svg/.cvsignore b/src/modules/loaders/svg/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/loaders/svg/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/loaders/svg/Makefile.am b/src/modules/loaders/svg/Makefile.am new file mode 100644 index 0000000..235c15b --- /dev/null +++ b/src/modules/loaders/svg/Makefile.am @@ -0,0 +1,22 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +@FREETYPE_CFLAGS@ \ +@svg_cflags@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +pkgdir = $(libdir)/evas/modules/loaders/svg/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = evas_image_load_svg.c + +module_la_LIBADD = @svg_libs@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/loaders/svg/evas_image_load_svg.c b/src/modules/loaders/svg/evas_image_load_svg.c new file mode 100644 index 0000000..465a62f --- /dev/null +++ b/src/modules/loaders/svg/evas_image_load_svg.c @@ -0,0 +1,296 @@ +#include "evas_common.h" +#include "evas_private.h" + +#include +#include + +int evas_image_load_file_head_svg(Image_Entry *ie, const char *file, const char *key); +int evas_image_load_file_data_svg(Image_Entry *ie, const char *file, const char *key); + +Evas_Image_Load_Func evas_image_load_svg_func = +{ + evas_image_load_file_head_svg, + evas_image_load_file_data_svg +}; + +static int rsvg_initialized = 0; +static void svg_loader_unpremul_data(DATA32 *data, unsigned int len); + +static void +svg_loader_unpremul_data(DATA32 *data, unsigned int len) +{ + DATA32 *de = data + len; + + while (data < de) + { + DATA32 a = A_VAL(data); + + if (a && (a < 255)) + { + R_VAL(data) = (R_VAL(data) * 255) / a; + G_VAL(data) = (G_VAL(data) * 255) / a; + B_VAL(data) = (B_VAL(data) * 255) / a; + } + data++; + } +} + +int +evas_image_load_file_head_svg(Image_Entry *ie, const char *file, const char *key) +{ + char cwd[PATH_MAX], pcwd[PATH_MAX], *p; + + RsvgHandle *rsvg; + RsvgDimensionData dim; + int w, h; + char *ext; + + if (!file) return 0; + + /* ignore all files not called .svg or .svg.gz - because rsvg has a leak + * where closing the handle doesn't free mem */ + ext = strrchr(file, '.'); + if (!ext) return 0; + if (!strcasecmp(ext, ".gz")) + { + if (p > file) + { + ext = p - 1; + while ((*p != '.') && (p > file)) + { + p--; + } + if (p <= file) return 0; + if (strcasecmp(p, ".svg.gz")) return 0; + } + else + return 0; + } + else if (strcasecmp(ext, ".svg")) return 0; + + getcwd(pcwd, sizeof(pcwd)); + strncpy(cwd, file, sizeof(cwd) - 1); + cwd[sizeof(cwd) - 1] = 0; + p = strrchr(cwd, '/'); + if (p) *p = 0; + chdir(cwd); + + rsvg = rsvg_handle_new_from_file(file, NULL); + if (!rsvg) + { + chdir(pcwd); + return 0; + } + + rsvg_handle_get_dimensions(rsvg, &dim); + w = dim.width; + h = dim.height; + if ((w < 1) || (h < 1) || (w > 8192) || (h > 8192)) + { +// rsvg_handle_close(rsvg, NULL); + g_object_unref(rsvg); +// rsvg_handle_free(rsvg); + chdir(pcwd); + return 0; + } + if (ie->load_opts.scale_down_by > 1) + { + w /= ie->load_opts.scale_down_by; + h /= ie->load_opts.scale_down_by; + } + else if (ie->load_opts.dpi > 0.0) + { + w = (w * ie->load_opts.dpi) / 90.0; + h = (h * ie->load_opts.dpi) / 90.0; + } + else if ((ie->load_opts.w > 0) && + (ie->load_opts.h > 0)) + { + int w2, h2; + + w2 = ie->load_opts.w; + h2 = (ie->load_opts.w * h) / w; + if (h2 > ie->load_opts.h) + { + h2 = ie->load_opts.h; + w2 = (ie->load_opts.h * w) / h; + } + w = w2; + h = h2; + } + if (w < 1) w = 1; + if (h < 1) h = 1; + ie->w = w; + ie->h = h; + ie->flags.alpha = 1; +// rsvg_handle_close(rsvg, NULL); + g_object_unref(rsvg); +// rsvg_handle_free(rsvg); + chdir(pcwd); + return 1; +} + +/** FIXME: All evas loaders need to be tightened up **/ +int +evas_image_load_file_data_svg(Image_Entry *ie, const char *file, const char *key) +{ + DATA32 *pixels; + char cwd[PATH_MAX], pcwd[PATH_MAX], *p; + RsvgHandle *rsvg; + RsvgDimensionData dim; + int w, h; + cairo_surface_t *surface; + cairo_t *cr; + char *ext; + + if (!file) return 0; + + /* ignore all files not called .svg or .svg.gz - because rsvg has a leak + * where closing the handle doesn't free mem */ + ext = strrchr(file, '.'); + if (!ext) return 0; + if (!strcasecmp(ext, ".gz")) + { + if (p > file) + { + ext = p - 1; + while ((*p != '.') && (p > file)) + { + p--; + } + if (p <= file) return 0; + if (strcasecmp(p, ".svg.gz")) return 0; + } + else + return 0; + } + else if (strcasecmp(ext, ".svg")) return 0; + + getcwd(pcwd, sizeof(pcwd)); + strncpy(cwd, file, sizeof(cwd) - 1); + cwd[sizeof(cwd) - 1] = 0; + p = strrchr(cwd, '/'); + if (p) *p = 0; + chdir(cwd); + + rsvg = rsvg_handle_new_from_file(file, NULL); + if (!rsvg) + { + chdir(pcwd); + return 0; + } + + rsvg_handle_get_dimensions(rsvg, &dim); + w = dim.width; + h = dim.height; + if ((w < 1) || (h < 1) || (w > 8192) || (h > 8192)) + { +// rsvg_handle_close(rsvg, NULL); + g_object_unref(rsvg); +// rsvg_handle_free(rsvg); + chdir(pcwd); + return 0; + } + if (ie->load_opts.scale_down_by > 1) + { + w /= ie->load_opts.scale_down_by; + h /= ie->load_opts.scale_down_by; + } + else if (ie->load_opts.dpi > 0.0) + { + w = (w * ie->load_opts.dpi) / 90.0; + h = (h * ie->load_opts.dpi) / 90.0; + } + else if ((ie->load_opts.w > 0) && + (ie->load_opts.h > 0)) + { + int w2, h2; + + w2 = ie->load_opts.w; + h2 = (ie->load_opts.w * h) / w; + if (h2 > ie->load_opts.h) + { + h2 = ie->load_opts.h; + w2 = (ie->load_opts.h * w) / h; + } + w = w2; + h = h2; + } + if (w < 1) w = 1; + if (h < 1) h = 1; + ie->flags.alpha = 1; + evas_cache_image_surface_alloc(ie, w, h); + pixels = evas_cache_image_pixels(ie); + if (!pixels) + { +// rsvg_handle_close(rsvg, NULL); + g_object_unref(rsvg); +// rsvg_handle_free(rsvg); + chdir(pcwd); + return 0; + } + + memset(pixels, 0, w * h * sizeof(DATA32)); + + surface = cairo_image_surface_create_for_data((unsigned char *)pixels, CAIRO_FORMAT_ARGB32, + w, h, w * sizeof(DATA32)); + if (!surface) + { +// rsvg_handle_close(rsvg, NULL); + g_object_unref(rsvg); +// rsvg_handle_free(rsvg); + chdir(pcwd); + return 0; + } + cr = cairo_create(surface); + if (!cr) + { + cairo_surface_destroy(surface); +// rsvg_handle_close(rsvg, NULL); + g_object_unref(rsvg); +// rsvg_handle_free(rsvg); + chdir(pcwd); + return 0; + } + + cairo_scale(cr, + (double)ie->w / dim.em, + (double)ie->h / dim.ex); + rsvg_handle_render_cairo(rsvg, cr); + cairo_surface_destroy(surface); + /* need to check if this is required... */ + cairo_destroy(cr); +// rsvg_handle_close(rsvg, NULL); + g_object_unref(rsvg); +// rsvg_handle_free(rsvg); + chdir(pcwd); + evas_common_image_set_alpha_sparse(ie); + return 1; +} + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + em->functions = (void *)(&evas_image_load_svg_func); + if (!rsvg_initialized) rsvg_init(); + rsvg_initialized = 1; + return 1; +} + +EAPI void +module_close(void) +{ + if (!rsvg_initialized) return; + rsvg_term(); + rsvg_initialized = 0; +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_IMAGE_LOADER, + "svg", + "none" +}; + diff --git a/src/modules/loaders/tiff/.cvsignore b/src/modules/loaders/tiff/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/loaders/tiff/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/loaders/tiff/Makefile.am b/src/modules/loaders/tiff/Makefile.am new file mode 100644 index 0000000..6306aed --- /dev/null +++ b/src/modules/loaders/tiff/Makefile.am @@ -0,0 +1,22 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +@FREETYPE_CFLAGS@ \ +@tiff_cflags@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +pkgdir = $(libdir)/evas/modules/loaders/tiff/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = evas_image_load_tiff.c + +module_la_LIBADD = @tiff_libs@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/loaders/tiff/evas_image_load_tiff.c b/src/modules/loaders/tiff/evas_image_load_tiff.c new file mode 100644 index 0000000..21036b4 --- /dev/null +++ b/src/modules/loaders/tiff/evas_image_load_tiff.c @@ -0,0 +1,338 @@ +#include "evas_common.h" +#include "evas_private.h" + +#include +#include + + +int evas_image_load_file_head_tiff(Image_Entry *ie, const char *file, const char *key); +int evas_image_load_file_data_tiff(Image_Entry *ie, const char *file, const char *key); + +Evas_Image_Load_Func evas_image_load_tiff_func = +{ + evas_image_load_file_head_tiff, + evas_image_load_file_data_tiff +}; + +typedef struct TIFFRGBAImage_Extra TIFFRGBAImage_Extra; + +struct TIFFRGBAImage_Extra { + TIFFRGBAImage rgba; + tileContigRoutine put_contig; + tileSeparateRoutine put_separate; + Image_Entry *image; + char pper; + uint32 num_pixels; + uint32 py; +}; + +static void put_contig_and_raster(TIFFRGBAImage *, uint32 *, + uint32, uint32, uint32, uint32, int32, + int32, unsigned char *); +static void put_separate_and_raster(TIFFRGBAImage *, uint32 *, uint32, + uint32, uint32, uint32, int32, + int32, unsigned char *, + unsigned char *, unsigned char *, + unsigned char *); +static void raster(TIFFRGBAImage_Extra * img, uint32 * raster, uint32 x, + uint32 y, uint32 w, uint32 h); + + +static void +put_contig_and_raster(TIFFRGBAImage * img, uint32 * rast, + uint32 x, uint32 y, uint32 w, uint32 h, + int32 fromskew, int32 toskew, unsigned char *cp) +{ + (*(((TIFFRGBAImage_Extra *) img)->put_contig)) (img, rast, x, y, w, h, + fromskew, toskew, cp); + raster((TIFFRGBAImage_Extra *) img, rast, x, y, w, h); +} + +static void +put_separate_and_raster(TIFFRGBAImage * img, uint32 * rast, + uint32 x, uint32 y, uint32 w, uint32 h, + int32 fromskew, int32 toskew, + unsigned char *r, unsigned char *g, unsigned char *b, + unsigned char *a) +{ + (*(((TIFFRGBAImage_Extra *) img)->put_separate)) + (img, rast, x, y, w, h, fromskew, toskew, r, g, b, a); + raster((TIFFRGBAImage_Extra *) img, rast, x, y, w, h); +} + +/* needs orientation code */ + +static void +raster(TIFFRGBAImage_Extra * img, uint32 * rast, + uint32 x, uint32 y, uint32 w, uint32 h) +{ + int image_width, image_height; + uint32 *pixel, pixel_value; + int i, j, dy, rast_offset; + DATA32 *buffer_pixel, *buffer = evas_cache_image_pixels(img->image); + int alpha_premult; + + image_width = img->image->w; + image_height = img->image->h; + + dy = h > y ? -1 : y - h; + + /* rast seems to point to the beginning of the last strip processed */ + /* so you need use negative offsets. Bizzare. Someone please check this */ + /* I don't understand why, but that seems to be what's going on. */ + /* libtiff needs better docs! */ + + if (img->rgba.alpha == EXTRASAMPLE_UNASSALPHA) + alpha_premult = 1; + for (i = y, rast_offset = 0; i > dy; i--, rast_offset--) + { + pixel = rast + (rast_offset * image_width); + buffer_pixel = buffer + ((((image_height - 1) - i) * image_width) + x); + + for (j = 0; j < w; j++) + { + int a, r, g, b; + + pixel_value = (*(pixel++)); + a = TIFFGetA(pixel_value); + r = TIFFGetR(pixel_value); + g = TIFFGetG(pixel_value); + b = TIFFGetB(pixel_value); + if (!alpha_premult && (a < 255)) + { + r = (r * (a + 1)) >> 8; + g = (g * (a + 1)) >> 8; + b = (b * (a + 1)) >> 8; + } + (*(buffer_pixel++)) = (a << 24) | (r << 16) | (g << 8) | b; + } + } +} + +int +evas_image_load_file_head_tiff(Image_Entry *ie, const char *file, const char *key) +{ + char txt[1024]; + TIFFRGBAImage tiff_image; + TIFF *tif = NULL; + FILE *ffile; + int fd; + uint16 magic_number; + + if (!file) + return 0; + + ffile = fopen(file, "rb"); + if (!ffile) + return 0; + + if (fread(&magic_number, sizeof(uint16), 1, ffile) != 1) + { + fclose(ffile); + return 0; + } + /* Apparently rewind(f) isn't sufficient */ + fseek(ffile, (long)0, SEEK_SET); + + if ((magic_number != TIFF_BIGENDIAN) /* Checks if actually tiff file */ + && (magic_number != TIFF_LITTLEENDIAN)) + { + fclose(ffile); + return 0; + } + + fd = fileno(ffile); + fd = dup(fd); + lseek(fd, (long)0, SEEK_SET); + fclose(ffile); + + tif = TIFFFdOpen(fd, file, "r"); + if (!tif) + return 0; + + strcpy(txt, "Evas Tiff loader: cannot be processed by libtiff"); + if (!TIFFRGBAImageOK(tif, txt)) + { + TIFFClose(tif); + return 0; + } + strcpy(txt, "Evas Tiff loader: cannot begin reading tiff"); + if (!TIFFRGBAImageBegin(& tiff_image, tif, 1, txt)) + { + TIFFClose(tif); + return 0; + } + + if (tiff_image.alpha != EXTRASAMPLE_UNSPECIFIED) + ie->flags.alpha = 1; + if ((tiff_image.width < 1) || (tiff_image.height < 1) || + (tiff_image.width > 8192) || (tiff_image.height > 8192)) + { + TIFFClose(tif); + return 0; + } + ie->w = tiff_image.width; + ie->h = tiff_image.height; + + TIFFClose(tif); + return 1; +} + +int +evas_image_load_file_data_tiff(Image_Entry *ie, const char *file, const char *key) +{ + char txt[1024]; + TIFFRGBAImage_Extra rgba_image; + TIFF *tif = NULL; + FILE *ffile; + uint32 *rast = NULL; + uint32 num_pixels; + int fd; + uint16 magic_number; + + if (!file) + return 0; + + ffile = fopen(file, "rb"); + if (!ffile) + return 0; + + fread(&magic_number, sizeof(uint16), 1, ffile); + /* Apparently rewind(f) isn't sufficient */ + fseek(ffile, (long)0, SEEK_SET); + + if ((magic_number != TIFF_BIGENDIAN) /* Checks if actually tiff file */ + && (magic_number != TIFF_LITTLEENDIAN)) + { + fclose(ffile); + return 0; + } + + fd = fileno(ffile); + fd = dup(fd); + lseek(fd, (long)0, SEEK_SET); + fclose(ffile); + + tif = TIFFFdOpen(fd, file, "r"); + if (!tif) + return 0; + + strcpy(txt, "Evas Tiff loader: cannot be processed by libtiff"); + if (!TIFFRGBAImageOK(tif, txt)) + { + TIFFClose(tif); + return 0; + } + strcpy(txt, "Evas Tiff loader: cannot begin reading tiff"); + if (!TIFFRGBAImageBegin((TIFFRGBAImage *) & rgba_image, tif, 0, txt)) + { + TIFFClose(tif); + return 0; + } + rgba_image.image = ie; + + if (rgba_image.rgba.alpha != EXTRASAMPLE_UNSPECIFIED) + ie->flags.alpha = 1; + if ((rgba_image.rgba.width != ie->w) || + (rgba_image.rgba.height != ie->h)) + { + TIFFClose(tif); + return 0; + } + + evas_cache_image_surface_alloc(ie, rgba_image.rgba.width, rgba_image.rgba.height); + if (!evas_cache_image_pixels(ie)) + { + TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image); + TIFFClose(tif); + + return 0; + } + + rgba_image.num_pixels = num_pixels = ie->w * ie->h; + + rgba_image.pper = rgba_image.py = 0; + rast = (uint32 *) _TIFFmalloc(sizeof(uint32) * num_pixels); + + if (!rast) + { + fprintf(stderr, "Evas Tiff loader: out of memory\n"); + + TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image); + TIFFClose(tif); + + return 0; + } + + if (rgba_image.rgba.put.any == NULL) + { + fprintf(stderr, "Evas Tiff loader: no put function"); + + _TIFFfree(rast); + TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image); + TIFFClose(tif); + + return 0; + } + else + { + if (rgba_image.rgba.isContig) + { + rgba_image.put_contig = rgba_image.rgba.put.contig; + rgba_image.rgba.put.contig = put_contig_and_raster; + } + else + { + rgba_image.put_separate = rgba_image.rgba.put.separate; + rgba_image.rgba.put.separate = put_separate_and_raster; + } + } + + /* if (rgba_image.rgba.samplesperpixel == 8)*/ + if (rgba_image.rgba.bitspersample == 8) + { + if (!TIFFRGBAImageGet((TIFFRGBAImage *) &rgba_image, rast, + rgba_image.rgba.width, rgba_image.rgba.height)) + { + _TIFFfree(rast); + TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image); + TIFFClose(tif); + return 0; + } + } + else + { + printf("channel bits == %i\n", (int)rgba_image.rgba.samplesperpixel); + } + + _TIFFfree(rast); + + TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image); + + TIFFClose(tif); + + evas_common_image_set_alpha_sparse(ie); + return 1; +} + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + em->functions = (void *)(&evas_image_load_tiff_func); + return 1; +} + +EAPI void +module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_IMAGE_LOADER, + "tiff", + "none" +}; diff --git a/src/modules/loaders/xpm/.cvsignore b/src/modules/loaders/xpm/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/loaders/xpm/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/loaders/xpm/Makefile.am b/src/modules/loaders/xpm/Makefile.am new file mode 100644 index 0000000..3698983 --- /dev/null +++ b/src/modules/loaders/xpm/Makefile.am @@ -0,0 +1,22 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +@FREETYPE_CFLAGS@ \ +@xpm_cflags@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +pkgdir = $(libdir)/evas/modules/loaders/xpm/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = evas_image_load_xpm.c + +module_la_LIBADD = $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/loaders/xpm/evas_image_load_xpm.c b/src/modules/loaders/xpm/evas_image_load_xpm.c new file mode 100644 index 0000000..d4c1f50 --- /dev/null +++ b/src/modules/loaders/xpm/evas_image_load_xpm.c @@ -0,0 +1,646 @@ +#include "evas_common.h" +#include "evas_private.h" + +int evas_image_load_file_head_xpm(Image_Entry *ie, const char *file, const char *key); +int evas_image_load_file_data_xpm(Image_Entry *ie, const char *file, const char *key); + +Evas_Image_Load_Func evas_image_load_xpm_func = +{ + evas_image_load_file_head_xpm, + evas_image_load_file_data_xpm +}; + + +static FILE *rgb_txt = NULL; + +static void +xpm_parse_color(char *color, int *r, int *g, int *b) +{ + char buf[4096]; + + /* is a #ff00ff like color */ + if (color[0] == '#') + { + int len; + char val[32]; + + len = strlen(color) - 1; + if (len < 96) + { + int i; + + len /= 3; + for (i = 0; i < len; i++) + val[i] = color[1 + i + (0 * len)]; + val[i] = 0; + sscanf(val, "%x", r); + for (i = 0; i < len; i++) + val[i] = color[1 + i + (1 * len)]; + val[i] = 0; + sscanf(val, "%x", g); + for (i = 0; i < len; i++) + val[i] = color[1 + i + (2 * len)]; + val[i] = 0; + sscanf(val, "%x", b); + if (len == 1) + { + *r = (*r << 4) | *r; + *g = (*g << 4) | *g; + *b = (*b << 4) | *b; + } + else if (len > 2) + { + *r >>= (len - 2) * 4; + *g >>= (len - 2) * 4; + *b >>= (len - 2) * 4; + } + } + return; + } + /* look in rgb txt database */ + if (!rgb_txt) rgb_txt = fopen("/usr/lib/X11/rgb.txt", "r"); + if (!rgb_txt) rgb_txt = fopen("/usr/X11/lib/X11/rgb.txt", "r"); + if (!rgb_txt) rgb_txt = fopen("/usr/X11R6/lib/X11/rgb.txt", "r"); + if (!rgb_txt) rgb_txt = fopen("/usr/openwin/lib/X11/rgb.txt", "r"); + if (!rgb_txt) return; + fseek(rgb_txt, 0, SEEK_SET); + while (fgets(buf, sizeof(buf), rgb_txt)) + { + buf[sizeof(buf) - 1] = 0; + if (buf[0] != '!') + { + int rr, gg, bb; + char name[4096]; + + if (sscanf(buf, "%i %i %i %[^\n]", &rr, &gg, &bb, name) == 4) + { + if (!strcasecmp(name, color)) + { + *r = rr; + *g = gg; + *b = bb; + return; + } + } + } + } +} + +static void +xpm_parse_done(void) +{ + if (rgb_txt) fclose(rgb_txt); + rgb_txt = NULL; +} + + +/** FIXME: clean this up and make more efficient **/ +static int +evas_image_load_file_xpm(Image_Entry *ie, const char *file, const char *key, int load_data) +{ + DATA32 *ptr, *end; + FILE *f; + + int pc, c, i, j, k, w, h, ncolors, cpp, comment, transp, + quote, context, len, done, r, g, b, backslash, lu1, lu2; + char *line, s[256], tok[128], col[256], *tl; + int lsz = 256; + struct _cmap { + unsigned char str[6]; + unsigned char transp; + short r, g, b; + } *cmap; + + short lookup[128 - 32][128 - 32]; + int count, pixels; + + if (!file) return 0; + done = 0; +// transp = -1; + transp = 1; + + /* if immediate_load is 1, then dont delay image laoding as below, or */ + /* already data in this image - dont load it again */ + + f = fopen(file, "rb"); + if (!f) + { + xpm_parse_done(); + return 0; + } + if (fread(s, 9, 1, f) != 1) + { + fclose(f); + xpm_parse_done(); + return 0; + } + rewind(f); + s[9] = 0; + if (strcmp("/* XPM */", s)) + { + fclose(f); + xpm_parse_done(); + return 0; + } + + i = 0; + j = 0; + cmap = NULL; + w = 10; + h = 10; + ptr = NULL; + end = NULL; + c = ' '; + comment = 0; + quote = 0; + context = 0; + pixels = 0; + count = 0; + line = malloc(lsz); + if (!line) + { + fclose(f); + xpm_parse_done(); + return 0; + } + + backslash = 0; + memset(lookup, 0, sizeof(lookup)); + while (!done) + { + pc = c; + c = fgetc(f); + if (c == EOF) break; + if (!quote) + { + if ((pc == '/') && (c == '*')) + comment = 1; + else if ((pc == '*') && (c == '/') && (comment)) + comment = 0; + } + if (!comment) + { + if ((!quote) && (c == '"')) + { + quote = 1; + i = 0; + } + else if ((quote) && (c == '"')) + { + line[i] = 0; + quote = 0; + if (context == 0) + { + /* Header */ + if (sscanf(line, "%i %i %i %i", &w, &h, &ncolors, &cpp) != 4) + { + fprintf(stderr, + "XPM ERROR: XPM file malformed header\n"); + free(line); + fclose(f); + xpm_parse_done(); + return 0; + } + if ((ncolors > 32766) || (ncolors < 1)) + { + fprintf(stderr, + "XPM ERROR: XPM files with colors > 32766 or < 1 not supported\n"); + free(line); + fclose(f); + xpm_parse_done(); + return 0; + } + if ((cpp > 5) || (cpp < 1)) + { + fprintf(stderr, + "XPM ERROR: XPM files with characters per pixel > 5 or < 1not supported\n"); + free(line); + fclose(f); + xpm_parse_done(); + return 0; + } + if ((w > 8192) || (w < 1)) + { + fprintf(stderr, + "XPM ERROR: Image width > 8192 or < 1 pixels for file\n"); + free(line); + fclose(f); + xpm_parse_done(); + return 0; + } + if ((h > 8192) || (h < 1)) + { + fprintf(stderr, + "XPM ERROR: Image height > 8192 or < 1 pixels for file\n"); + free(line); + fclose(f); + xpm_parse_done(); + return 0; + } + + if (!cmap) + { + cmap = malloc(sizeof(struct _cmap) * ncolors); + if (!cmap) + { + free(line); + fclose(f); + xpm_parse_done(); + return 0; + } + } + ie->w = w; + ie->h = h; + + j = 0; + context++; + } + else if (context == 1) + { + /* Color Table */ + if (j < ncolors) + { + int slen; + int hascolor, iscolor; + + iscolor = 0; + hascolor = 0; + tok[0] = 0; + col[0] = 0; + s[0] = 0; + len = strlen(line); + strncpy(cmap[j].str, line, cpp); + cmap[j].str[cpp] = 0; + for (slen = 0; slen < cpp; slen++) + { + /* fix the ascii of the color string - if its < 32 - just limit to 32 */ + if (cmap[j].str[slen] < 32) cmap[j].str[slen] = 0; + } + cmap[j].r = -1; + cmap[j].transp = 0; + for (k = cpp; k < len; k++) + { + if (line[k] != ' ') + { + s[0] = 0; + sscanf(&line[k], "%255s", s); + slen = strlen(s); + k += slen; + if (!strcmp(s, "c")) iscolor = 1; + if ((!strcmp(s, "m")) || (!strcmp(s, "s")) + || (!strcmp(s, "g4")) || (!strcmp(s, "g")) + || (!strcmp(s, "c")) || (k >= len)) + { + if (k >= len) + { + if (col[0]) + { + if (strlen(col) < (sizeof(col) - 2)) + strcat(col, " "); + else + done = 1; + } + if ((strlen(col) + strlen(s)) < (sizeof(col) - 1)) + strcat(col, s); + } + if (col[0]) + { + if (!strcasecmp(col, "none")) + { + transp = 1; + cmap[j].transp = 1; + cmap[j].r = 0; + cmap[j].g = 0; + cmap[j].b = 0; + } + else + { + if ((((cmap[j].r < 0) || (!strcmp(tok, "c"))) && (!hascolor))) + { + r = g = b = 0; + xpm_parse_color(col, &r, &g, &b); + cmap[j].r = r; + cmap[j].g = g; + cmap[j].b = b; + if (iscolor) hascolor = 1; + } + } + } + strcpy(tok, s); + col[0] = 0; + } + else + { + if (col[0]) + { + if (strlen(col) < ( sizeof(col) - 2)) + strcat(col, " "); + else + done = 1; + } + if ((strlen(col) + strlen(s)) < (sizeof(col) - 1)) + strcat(col, s); + } + } + } + } + j++; + if (j >= ncolors) + { + if (cpp == 1) + { + for (i = 0; i < ncolors; i++) + lookup[(int)cmap[i].str[0] - 32][0] = i; + } + if (cpp == 2) + { + for (i = 0; i < ncolors; i++) + lookup[(int)cmap[i].str[0] - 32][(int)cmap[i].str[1] - 32] = i; + } + context++; + } + + if (transp) ie->flags.alpha = 1; + + if (load_data) + { + evas_cache_image_surface_alloc(ie, w, h); + ptr = evas_cache_image_pixels(ie); + if (!ptr) + { + free(cmap); + free(line); + fclose(f); + xpm_parse_done(); + return 0; + } + end = ptr + (w * h); + pixels = w * h; + } + else + { + free(cmap); + free(line); + fclose(f); + xpm_parse_done(); + return 1; + } + } + else + { + /* Image Data */ + i = 0; + if (cpp == 0) + { + /* Chars per pixel = 0? well u never know */ + } + /* it's xpm - don't care about speed too much. still faster + * that most xpm loaders anyway */ + else if (cpp == 1) + { + if (transp) + { + for (i = 0; + ((i < 65536) && (ptr < end) && (line[i])); + i++) + { + lu1 = (int)line[i] - 32; + if (lu1 < 0) continue; + if (cmap[lookup[lu1][0]].transp) + { + r = (unsigned char)cmap[lookup[lu1][0]].r; + g = (unsigned char)cmap[lookup[lu1][0]].g; + b = (unsigned char)cmap[lookup[lu1][0]].b; + *ptr = (r << 16) | (g << 8) | b; + ptr++; + count++; + } + else + { + r = (unsigned char)cmap[lookup[lu1][0]].r; + g = (unsigned char)cmap[lookup[lu1][0]].g; + b = (unsigned char)cmap[lookup[lu1][0]].b; + *ptr = (0xff << 24) | (r << 16) | (g << 8) | b; + ptr++; + count++; + } + } + } + else + { + for (i = 0; + ((i < 65536) && (ptr < end) && (line[i])); + i++) + { + lu1 = (int)line[i] - 32; + if (lu1 < 0) continue; + r = (unsigned char)cmap[lookup[lu1][0]].r; + g = (unsigned char)cmap[lookup[lu1][0]].g; + b = (unsigned char)cmap[lookup[lu1][0]].b; + *ptr = (0xff << 24) | (r << 16) | (g << 8) | b; + ptr++; + count++; + } + } + } + else if (cpp == 2) + { + if (transp) + { + for (i = 0; + ((i < 65536) && (ptr < end) && (line[i])); + i++) + { + lu1 = (int)line[i] - 32; + i++; + lu2 = (int)line[i] - 32; + if (lu1 < 0) continue; + if (lu2 < 0) continue; + if (cmap[lookup[lu1][lu2]].transp) + { + r = (unsigned char)cmap[lookup[lu1][lu2]].r; + g = (unsigned char)cmap[lookup[lu1][lu2]].g; + b = (unsigned char)cmap[lookup[lu1][lu2]].b; + *ptr = (r << 16) | (g << 8) | b; + ptr++; + count++; + } + else + { + r = (unsigned char)cmap[lookup[lu1][lu2]].r; + g = (unsigned char)cmap[lookup[lu1][lu2]].g; + b = (unsigned char)cmap[lookup[lu1][lu2]].b; + *ptr = (0xff << 24) | (r << 16) | (g << 8) | b; + ptr++; + count++; + } + } + } + else + { + for (i = 0; + ((i < 65536) && (ptr < end) && (line[i])); + i++) + { + lu1 = (int)line[i] - 32; + i++; + lu2 = (int)line[i] - 32; + if (lu1 < 0) continue; + if (lu2 < 0) continue; + r = (unsigned char)cmap[lookup[lu1][lu2]].r; + g = (unsigned char)cmap[lookup[lu1][lu2]].g; + b = (unsigned char)cmap[lookup[lu1][lu2]].b; + *ptr = (0xff << 24) | (r << 16) | (g << 8) | b; + ptr++; + count++; + } + } + } + else + { + if (transp) + { + for (i = 0; + ((i < 65536) && (ptr < end) && (line[i])); + i++) + { + for (j = 0; j < cpp; j++, i++) + { + col[j] = line[i]; + if (col[j] < 32) col[j] = 32; + } + col[j] = 0; + i--; + for (j = 0; j < ncolors; j++) + { + if (!strcmp(col, cmap[j].str)) + { + if (cmap[j].transp) + { + r = (unsigned char)cmap[j].r; + g = (unsigned char)cmap[j].g; + b = (unsigned char)cmap[j].b; + *ptr = (r << 16) | (g << 8) | b; + ptr++; + count++; + } + else + { + r = (unsigned char)cmap[j].r; + g = (unsigned char)cmap[j].g; + b = (unsigned char)cmap[j].b; + *ptr = (0xff << 24) | (r << 16) | (g << 8) | b; + ptr++; + count++; + } + break; + } + } + } + } + else + { + for (i = 0; + ((i < 65536) && (ptr < end) && (line[i])); + i++) + { + for (j = 0; j < cpp; j++, i++) + { + col[j] = line[i]; + } + col[j] = 0; + i--; + for (j = 0; j < ncolors; j++) + { + if (!strcmp(col, cmap[j].str)) + { + r = (unsigned char)cmap[j].r; + g = (unsigned char)cmap[j].g; + b = (unsigned char)cmap[j].b; + *ptr = (0xff << 24) | (r << 16) | (g << 8) | b; + ptr++; + count++; + break; + } + } + } + } + } + } + } + } + /* Scan in line from XPM file */ + if ((!comment) && (quote) && (c != '"')) + { + if (c < 32) c = 32; + else if (c > 127) c = 127; + if (c =='\\') + { + if (++backslash < 2) + line[i++] = c; + else + backslash = 0; + } + else + { + backslash = 0; + line[i++] = c; + } + } + if (i >= lsz) + { + lsz += 256; + tl = realloc(line, lsz); + if (!tl) break; + line = tl; + } + if (((ptr) && ((ptr - evas_cache_image_pixels(ie)) >= (w * h * sizeof(DATA32)))) || + ((context > 1) && (count >= pixels))) + break; + } + + if (cmap) free(cmap); + if (line) free(line); + if (f) fclose(f); + + xpm_parse_done(); + + return 1; +} + + +int +evas_image_load_file_head_xpm(Image_Entry *ie, const char *file, const char *key) +{ + return evas_image_load_file_xpm(ie, file, key, 0); +} + +int +evas_image_load_file_data_xpm(Image_Entry *ie, const char *file, const char *key) +{ + return evas_image_load_file_xpm(ie, file, key, 1); +} + + + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + em->functions = (void *)(&evas_image_load_xpm_func); + return 1; +} + +EAPI void +module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_IMAGE_LOADER, + "xpm", + "none" +}; diff --git a/src/modules/savers/.cvsignore b/src/modules/savers/.cvsignore new file mode 100644 index 0000000..282522d --- /dev/null +++ b/src/modules/savers/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/src/modules/savers/Makefile.am b/src/modules/savers/Makefile.am new file mode 100644 index 0000000..f1fdb88 --- /dev/null +++ b/src/modules/savers/Makefile.am @@ -0,0 +1,23 @@ +MAINTAINERCLEANFILES = Makefile.in + +if BUILD_LOADER_EDB +edb_subdir = edb +endif + +if BUILD_LOADER_EET +eet_subdir = eet +endif + +if BUILD_SAVER_JPEG +jpeg_subdir = jpeg +endif + +if BUILD_LOADER_PNG +png_subdir = png +endif + +if BUILD_LOADER_TIFF +tiff_subdir = tiff +endif + +SUBDIRS = $(edb_subdir) $(eet_subdir) $(jpeg_subdir) $(png_subdir) $(tiff_subdir) diff --git a/src/modules/savers/edb/.cvsignore b/src/modules/savers/edb/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/savers/edb/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/savers/edb/Makefile.am b/src/modules/savers/edb/Makefile.am new file mode 100644 index 0000000..f3a6509 --- /dev/null +++ b/src/modules/savers/edb/Makefile.am @@ -0,0 +1,20 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = -I. \ + -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/lib/include \ + @FREETYPE_CFLAGS@ @EDB_CFLAGS@ + +pkgdir = $(libdir)/evas/modules/savers/edb/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = evas_image_save_edb.c + +module_la_LIBADD = @EDB_LIBS@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h + +EXTRA_DIST = evas_image_save_edb.c diff --git a/src/modules/savers/edb/evas_image_save_edb.c b/src/modules/savers/edb/evas_image_save_edb.c new file mode 100644 index 0000000..d2e8c9a --- /dev/null +++ b/src/modules/savers/edb/evas_image_save_edb.c @@ -0,0 +1,40 @@ +#include "evas_common.h" +#include "evas_private.h" + +#include +#include + +int evas_image_save_file_edb(RGBA_Image *im, const char *file, const char *key, int quality, int compress); + +Evas_Image_Save_Func evas_image_save_edb_func = +{ + evas_image_save_file_edb +}; + +int +evas_image_save_file_edb(RGBA_Image *im, const char *file, const char *key, int quality, int compress) +{ + return 0; +} + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + em->functions = (void *)(&evas_image_save_edb_func); + return 1; +} + +EAPI void +module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_IMAGE_SAVER, + "edb", + "none" +}; diff --git a/src/modules/savers/eet/.cvsignore b/src/modules/savers/eet/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/savers/eet/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/savers/eet/Makefile.am b/src/modules/savers/eet/Makefile.am new file mode 100644 index 0000000..f7cf97f --- /dev/null +++ b/src/modules/savers/eet/Makefile.am @@ -0,0 +1,22 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +@FREETYPE_CFLAGS@ \ +@EET_CFLAGS@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +pkgdir = $(libdir)/evas/modules/savers/eet/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = evas_image_save_eet.c + +module_la_LIBADD = @EET_LIBS@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/savers/eet/evas_image_save_eet.c b/src/modules/savers/eet/evas_image_save_eet.c new file mode 100644 index 0000000..5c672b1 --- /dev/null +++ b/src/modules/savers/eet/evas_image_save_eet.c @@ -0,0 +1,74 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" /* so that EAPI in Eet.h is correctly defined */ +#endif + +#include + +#include "evas_common.h" +#include "evas_private.h" + +int evas_image_save_file_eet(RGBA_Image *im, const char *file, const char *key, int quality, int compress); + +Evas_Image_Save_Func evas_image_save_eet_func = +{ + evas_image_save_file_eet +}; + +int +evas_image_save_file_eet(RGBA_Image *im, const char *file, const char *key, int quality, int compress) +{ + Eet_File *ef; + int alpha = 0, lossy = 0, ok = 0; + DATA32 *data; + + if (!im || !im->image.data || !file) + return 0; + + ef = eet_open((char *)file, EET_FILE_MODE_READ_WRITE); + if (!ef) ef = eet_open((char *)file, EET_FILE_MODE_WRITE); + if (!ef) return 0; + if ((quality <= 100) || (compress < 0)) lossy = 1; + if (im->cache_entry.flags.alpha) alpha = 1; +// if (alpha) +// { +// data = malloc(im->image->w * im->image->h * sizeof(DATA32)); +// if (!data) +// { +// eet_close(ef); +// return 0; +// } +// memcpy(data, im->image->data, im->image->w * im->image->h * sizeof(DATA32)); +// evas_common_convert_argb_unpremul(data, im->image->w * im->image->h); +// } +// else + data = im->image.data; + ok = eet_data_image_write(ef, (char *)key, data, + im->cache_entry.w, im->cache_entry.h, alpha, compress, + quality, lossy); +// if (alpha) +// free(data); + eet_close(ef); + return ok; +} + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + em->functions = (void *)(&evas_image_save_eet_func); + return 1; +} + +EAPI void +module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_IMAGE_SAVER, + "eet", + "none" +}; diff --git a/src/modules/savers/jpeg/.cvsignore b/src/modules/savers/jpeg/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/savers/jpeg/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/savers/jpeg/Makefile.am b/src/modules/savers/jpeg/Makefile.am new file mode 100644 index 0000000..640c1f7 --- /dev/null +++ b/src/modules/savers/jpeg/Makefile.am @@ -0,0 +1,22 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS= \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +@FREETYPE_CFLAGS@ \ +@jpeg_cflags@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +pkgdir = $(libdir)/evas/modules/savers/jpeg/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = evas_image_save_jpeg.c + +module_la_LIBADD = @jpeg_libs@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/savers/jpeg/evas_image_save_jpeg.c b/src/modules/savers/jpeg/evas_image_save_jpeg.c new file mode 100644 index 0000000..7ccb508 --- /dev/null +++ b/src/modules/savers/jpeg/evas_image_save_jpeg.c @@ -0,0 +1,139 @@ +#include "evas_common.h" +#include "evas_private.h" + +#include +#include +#include + +int evas_image_save_file_jpeg(RGBA_Image *im, const char *file, const char *key, int quality, int compress); + +Evas_Image_Save_Func evas_image_save_jpeg_func = +{ + evas_image_save_file_jpeg +}; + +struct _JPEG_error_mgr +{ + struct jpeg_error_mgr pub; + jmp_buf setjmp_buffer; +}; +typedef struct _JPEG_error_mgr *emptr; + +static void _JPEGFatalErrorHandler(j_common_ptr cinfo); +static void +_JPEGFatalErrorHandler(j_common_ptr cinfo) +{ + emptr errmgr; + + errmgr = (emptr) cinfo->err; + longjmp(errmgr->setjmp_buffer, 1); + return; +} + +static void _JPEGErrorHandler(j_common_ptr cinfo); +static void +_JPEGErrorHandler(j_common_ptr cinfo) +{ + emptr errmgr; + + errmgr = (emptr) cinfo->err; + return; +} + +static void _JPEGErrorHandler2(j_common_ptr cinfo, int msg_level); +static void +_JPEGErrorHandler2(j_common_ptr cinfo, int msg_level) +{ + emptr errmgr; + + errmgr = (emptr) cinfo->err; + return; + msg_level = 0; +} + +static int +save_image_jpeg(RGBA_Image *im, const char *file, int quality) +{ + struct _JPEG_error_mgr jerr; + struct jpeg_compress_struct cinfo; + FILE *f; + DATA8 *buf; + DATA32 *ptr; + JSAMPROW *jbuf; + int y = 0; + int i, j; + + if (!im || !im->image.data || !file) + return 0; + + buf = alloca(im->cache_entry.w * 3 * sizeof(DATA8)); + f = fopen(file, "wb"); + if (!f) + { + return 0; + } + jerr.pub.error_exit = _JPEGFatalErrorHandler; + jerr.pub.emit_message = _JPEGErrorHandler2; + jerr.pub.output_message = _JPEGErrorHandler; + cinfo.err = jpeg_std_error(&(jerr.pub)); + if (sigsetjmp(jerr.setjmp_buffer, 1)) + { + jpeg_destroy_compress(&cinfo); + fclose(f); + return 0; + } + jpeg_create_compress(&cinfo); + jpeg_stdio_dest(&cinfo, f); + cinfo.image_width = im->cache_entry.w; + cinfo.image_height = im->cache_entry.h; + cinfo.input_components = 3; + cinfo.in_color_space = JCS_RGB; + jpeg_set_defaults(&cinfo); + jpeg_set_quality(&cinfo, quality, TRUE); + jpeg_start_compress(&cinfo, TRUE); + ptr = im->image.data; + while (cinfo.next_scanline < cinfo.image_height) + { + for (j = 0, i = 0; i < im->cache_entry.w; i++) + { + buf[j++] = ((*ptr) >> 16) & 0xff; + buf[j++] = ((*ptr) >> 8) & 0xff; + buf[j++] = ((*ptr)) & 0xff; + ptr++; + } + jbuf = (JSAMPROW *) (&buf); + jpeg_write_scanlines(&cinfo, jbuf, 1); + y++; + } + jpeg_finish_compress(&cinfo); + jpeg_destroy_compress(&cinfo); + fclose(f); + return 1; +} + +int evas_image_save_file_jpeg(RGBA_Image *im, const char *file, const char *key, int quality, int compress) +{ + return save_image_jpeg(im, file, quality); +} + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + em->functions = (void *)(&evas_image_save_jpeg_func); + return 1; +} + +EAPI void +module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_IMAGE_SAVER, + "jpeg", + "none" +}; diff --git a/src/modules/savers/png/.cvsignore b/src/modules/savers/png/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/savers/png/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/savers/png/Makefile.am b/src/modules/savers/png/Makefile.am new file mode 100644 index 0000000..c8b4790 --- /dev/null +++ b/src/modules/savers/png/Makefile.am @@ -0,0 +1,22 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +@FREETYPE_CFLAGS@ \ +@PNG_CFLAGS@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +pkgdir = $(libdir)/evas/modules/savers/png/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = evas_image_save_png.c + +module_la_LIBADD = @PNG_LIBS@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/savers/png/evas_image_save_png.c b/src/modules/savers/png/evas_image_save_png.c new file mode 100644 index 0000000..67594cd --- /dev/null +++ b/src/modules/savers/png/evas_image_save_png.c @@ -0,0 +1,164 @@ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include +#include + +#include "evas_common.h" +#include "evas_private.h" + +int evas_image_save_file_png(RGBA_Image *im, const char *file, const char *key, int quality, int compress); + +Evas_Image_Save_Func evas_image_save_png_func = +{ + evas_image_save_file_png +}; + +static int +save_image_png(RGBA_Image *im, const char *file, int compress, int interlace) +{ + FILE *f; + png_structp png_ptr; + png_infop info_ptr; + DATA32 *ptr, *data = NULL; + int x, y, j; + png_bytep row_ptr, png_data = NULL; + png_color_8 sig_bit; + int num_passes = 1, pass; + + if (!im || !im->image.data || !file) + return 0; + + f = fopen(file, "wb"); + if (!f) return 0; + + png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png_ptr) + { + fclose(f); + return 0; + } + info_ptr = png_create_info_struct(png_ptr); + if (info_ptr == NULL) + { + fclose(f); + png_destroy_write_struct(&png_ptr, (png_infopp) NULL); + return 0; + } + if (setjmp(png_ptr->jmpbuf)) + { + fclose(f); + png_destroy_write_struct(&png_ptr, (png_infopp) & info_ptr); + png_destroy_info_struct(png_ptr, (png_infopp) & info_ptr); + return 0; + } + + if (interlace) + { +#ifdef PNG_WRITE_INTERLACING_SUPPORTED + png_ptr->interlaced = PNG_INTERLACE_ADAM7; + num_passes = png_set_interlace_handling(png_ptr); +#endif + } + + if (im->cache_entry.flags.alpha) + { + data = malloc(im->cache_entry.w * im->cache_entry.h * sizeof(DATA32)); + if (!data) + { + fclose(f); + png_destroy_write_struct(&png_ptr, (png_infopp) & info_ptr); + png_destroy_info_struct(png_ptr, (png_infopp) & info_ptr); + return 0; + } + memcpy(data, im->image.data, im->cache_entry.w * im->cache_entry.h * sizeof(DATA32)); + evas_common_convert_argb_unpremul(data, im->cache_entry.w * im->cache_entry.h); + png_init_io(png_ptr, f); + png_set_IHDR(png_ptr, info_ptr, im->cache_entry.w, im->cache_entry.h, 8, + PNG_COLOR_TYPE_RGB_ALPHA, png_ptr->interlaced, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); +#ifdef WORDS_BIGENDIAN + png_set_swap_alpha(png_ptr); +#else + png_set_bgr(png_ptr); +#endif + } + else + { + data = im->image.data; + png_init_io(png_ptr, f); + png_set_IHDR(png_ptr, info_ptr, im->cache_entry.w, im->cache_entry.h, 8, + PNG_COLOR_TYPE_RGB, png_ptr->interlaced, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + png_data = alloca(im->cache_entry.w * 3 * sizeof(char)); + } + sig_bit.red = 8; + sig_bit.green = 8; + sig_bit.blue = 8; + sig_bit.alpha = 8; + png_set_sBIT(png_ptr, info_ptr, &sig_bit); + + png_set_compression_level(png_ptr, compress); + png_write_info(png_ptr, info_ptr); + png_set_shift(png_ptr, &sig_bit); + png_set_packing(png_ptr); + + for (pass = 0; pass < num_passes; pass++) + { + ptr = data; + + for (y = 0; y < im->cache_entry.h; y++) + { + if (im->cache_entry.flags.alpha) + row_ptr = (png_bytep) ptr; + else + { + for (j = 0, x = 0; x < im->cache_entry.w; x++) + { + png_data[j++] = (ptr[x] >> 16) & 0xff; + png_data[j++] = (ptr[x] >> 8) & 0xff; + png_data[j++] = (ptr[x]) & 0xff; + } + row_ptr = (png_bytep) png_data; + } + png_write_rows(png_ptr, &row_ptr, 1); + ptr += im->cache_entry.w; + } + } + png_write_end(png_ptr, info_ptr); + png_destroy_write_struct(&png_ptr, (png_infopp) & info_ptr); + png_destroy_info_struct(png_ptr, (png_infopp) & info_ptr); + + if (im->cache_entry.flags.alpha) + free(data); + fclose(f); + return 1; +} + +int evas_image_save_file_png(RGBA_Image *im, const char *file, const char *key, int quality, int compress) +{ + return save_image_png(im, file, compress, 0); +} + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + em->functions = (void *)(&evas_image_save_png_func); + return 1; +} + +EAPI void +module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_IMAGE_SAVER, + "png", + "none" +}; diff --git a/src/modules/savers/tiff/.cvsignore b/src/modules/savers/tiff/.cvsignore new file mode 100644 index 0000000..a51c966 --- /dev/null +++ b/src/modules/savers/tiff/.cvsignore @@ -0,0 +1,6 @@ +.deps +.libs +Makefile +Makefile.in +*.lo +*.la \ No newline at end of file diff --git a/src/modules/savers/tiff/Makefile.am b/src/modules/savers/tiff/Makefile.am new file mode 100644 index 0000000..776d736 --- /dev/null +++ b/src/modules/savers/tiff/Makefile.am @@ -0,0 +1,22 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +@FREETYPE_CFLAGS@ \ +@tiff_cflags@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +pkgdir = $(libdir)/evas/modules/savers/tiff/$(MODULE_ARCH) + +pkg_LTLIBRARIES = module.la + +module_la_SOURCES = evas_image_save_tiff.c + +module_la_LIBADD = @tiff_libs@ $(top_builddir)/src/lib/libevas.la +module_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -module -avoid-version +module_la_LIBTOOLFLAGS = --tag=disable-static +module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/modules/savers/tiff/evas_image_save_tiff.c b/src/modules/savers/tiff/evas_image_save_tiff.c new file mode 100644 index 0000000..bacf7da --- /dev/null +++ b/src/modules/savers/tiff/evas_image_save_tiff.c @@ -0,0 +1,130 @@ +#include "evas_common.h" +#include "evas_private.h" + +#include + +int evas_image_save_file_tiff(RGBA_Image *im, const char *file, const char *key, int quality, int compress); + +Evas_Image_Save_Func evas_image_save_tiff_func = +{ + evas_image_save_file_tiff +}; + +static int +save_image_tiff(RGBA_Image *im, const char *file, int compress, int interlace) +{ + TIFF *tif = NULL; + uint8 *buf = NULL; + DATA32 pixel; + DATA32 *data; + uint32 x, y; + uint8 r, g, b, a = 0; + int i = 0; + int has_alpha; + + if (!im || !im->image.data || !file) + return 0; + + has_alpha = im->cache_entry.flags.alpha; + data = im->image.data; + + tif = TIFFOpen(file, "w"); + if (!tif) + return 0; + + /* None of the TIFFSetFields are checked for errors, but since they */ + /* shouldn't fail, this shouldn't be a problem */ + + TIFFSetField(tif, TIFFTAG_IMAGELENGTH, im->cache_entry.h); + TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, im->cache_entry.w); + TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); + TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); + TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_NONE); + + /* By default uses patent-free use COMPRESSION_DEFLATE, + * another lossless compression technique */ + TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE); + + if (has_alpha) + { + uint16 extras[] = { EXTRASAMPLE_ASSOCALPHA }; + TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 4); + TIFFSetField(tif, TIFFTAG_EXTRASAMPLES, 1, extras); + } + else + { + TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3); + } + + TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8); + TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, 0)); + + buf = (uint8 *) _TIFFmalloc(TIFFScanlineSize(tif)); + if (!buf) + { + TIFFClose(tif); + return 0; + } + + for (y = 0; y < im->cache_entry.h; y++) + { + i = 0; + for (x = 0; x < im->cache_entry.w; x++) + { + pixel = data[(y * im->cache_entry.w) + x]; + + r = (pixel >> 16) & 0xff; + g = (pixel >> 8) & 0xff; + b = pixel & 0xff; + if (has_alpha) + a = (pixel >> 24) & 0xff; + + /* This might be endian dependent */ + buf[i++] = r; + buf[i++] = g; + buf[i++] = b; + if (has_alpha) + buf[i++] = a; + } + + if (!TIFFWriteScanline(tif, buf, y, 0)) + { + _TIFFfree(buf); + TIFFClose(tif); + return 0; + } + } + + _TIFFfree(buf); + TIFFClose(tif); + + return 1; +} + +int evas_image_save_file_tiff(RGBA_Image *im, const char *file, const char *key, int quality, int compress) +{ + return save_image_tiff(im, file, compress, 0); +} + +EAPI int +module_open(Evas_Module *em) +{ + if (!em) return 0; + em->functions = (void *)(&evas_image_save_tiff_func); + return 1; +} + +EAPI void +module_close(void) +{ + +} + +EAPI Evas_Module_Api evas_modapi = +{ + EVAS_MODULE_API_VERSION, + EVAS_MODULE_TYPE_IMAGE_SAVER, + "tiff", + "none" +}; -- 2.7.4

      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
      6%{An(qUKm3|% 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�yt`M=DB>OoqqD|f| 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 WcwY_6_fR7JvzCUQI#%`3>;D4@Mn6UX literal 0 HcmV?d00001 diff --git a/doc/img/evas_mini.png b/doc/img/evas_mini.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f99f0fa3224a7319ef0d51e1f2235c5a4b7bf5 GIT binary patch literal 753 zcmV~${x~c#G0&Yn}K~#9!rIK4nlVKdjf8V!*n`dqFG;=|Cgi14(B}SSJqq49I z@kUajq@>V`8YG2~K?e~+2s5mUE+p!%3&kKRA`cm*mR_t@j3T!@yMwy#TUQ&)G>D$7 z_y4@l|KZ_zUkJs-*pvC-ptx%({r=H5od-ZmT~X5c(}(@QRuQ1*^{4#OP0}K;mo;&% zvCP|Y);tv?!Zpf{#aV|xNIbY$vUK%S;Tu3utlAcCUpTNm!w@ms|6$SxAOvpet9Er2 z=BC!9Zj3{hmOj6&*iy2*A`J%}!WDAvj*JbP6BM4-_U>VYfSCNvG21JI+5?Ax0>BD9 z0v7lu+-flEJ1yodq1nX1;Zj|3_fMbNVRwg(T&Xqn1w_h#&=9Yw)axTj%TD+DyppM@ zYw$M*O;(bY$35=`^Uaqv#+1w`Ko=@lb}g+)M~jS2wx{*B(J!t!zy%QK!Ea26I3BK6 zREr+3w!FUm#)?m#1e~EgBm>oe3U~?(0Dk@#!dhfo!~PVn#0jM+RCy#ZSs$embm4xx zV`{$ROxue)z|tQ*24+jm?q*r3wnu0b&8XB_KE&v^)@ipYHYT%gbUGJ^4_#2MHb{(% zIA)0SiEdfxG3DsA*=73#IV>+}eBdRW#RqF`N6tClTb<2-XRQQk$?IB9h>zyk(AUPC z%KN2aZ1v5Wlh=pj*n;`~zFyCW)fodst(U+p%F@HB1$Um=WN59}W0a${Vx&sFfami) zr)_fPxmKf`aC?2ydL;@#3Q)c?JFy}?H7Z%7RCvbibJka5KkUE^FbMPqK7#O<*HHs8 jfEJJeH!uhILWREo3h>l;^}Oio00000NkvXXu0mjfuFYE5 literal 0 HcmV?d00001 diff --git a/doc/img/evas_small.png b/doc/img/evas_small.png new file mode 100644 index 0000000000000000000000000000000000000000..8bea36784e16f39bd41b17e8bd6808964340a9d9 GIT binary patch literal 3755 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 Vol#~xH(US!002ovPDHLkV1j2X19AWW literal 0 HcmV?d00001 diff --git a/doc/img/hilite.png b/doc/img/hilite.png new file mode 100644 index 0000000000000000000000000000000000000000..88a43816ea0718f59d609b5301e22a140f4cfdcb GIT binary patch literal 6127 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 literal 0 HcmV?d00001 diff --git a/doc/img/t.gif b/doc/img/t.gif new file mode 100644 index 0000000000000000000000000000000000000000..cff30686d87744ca946c19fb7dc3f5f9c35bfdcc GIT binary patch literal 979 zcmWlYTS!|60ESaKwy`~pu?@OX>>dUMSz+zKG6sc>S|5ZB_OLySQKp-NZqQOFwA({F zXT4NyyrteX(HKokG#7I-nv2JnXznI4F*l9JBqzx^Cpq`r&a(gE=l{O$Pj~N&-j_YxzTTGueS_SAk-`3v;0x?=|{yL*7uwrjT@ zIIO#X{b0{-we9cO4{TP4%Wbzg_Fel4I?ew}lPKVd;_PTs-f57eX z_}tz@&ym;T_XT}^uO|>X4ETcnkUw}B_WJ@y{=-lt9E?PRfunFBbQ}yu;^9ar8jdHz zq2p*c5<3pZPonY2aUz+BoyHQ;WGoUtiA7Jr#AzH%#FHoB$yp)+rjy`FI(d4YOrM=6 zPg4+>I!l947CbvogJ+psDs!Goflw+3Lise5g43yNCZEZs&vS4Nf}vanfzqiwlFuS& zHj{;+42%|X5RxlENHLFO(R>lh=dvgUqxk}i;cz}zz>xx6L~sIu^F;zJA|#5y7>N~# z0)|or6fcrRynqlCfl(Myq_F}@(j-nZcoCD}*}AQ;49nJ4g)OsHw#HU) z9KTxo;OmF&_a3#kH9Y?PQAfk~9qkRxEv?^jt}<_2c!$Gs8aeg+f0o;C^Eg${KX1u? zYWg!Qymo^W2WNi6D=kxZ*ZJQ(g#+A+!Tw7(+bmC7uMtkZt%t6d-oJ}Z-Fg_)JW$;E zWGvZ={@8HvekA`0ka)rUuTJ{{gVv#^V40 literal 0 HcmV?d00001 diff --git a/doc/img/t.png b/doc/img/t.png new file mode 100644 index 0000000000000000000000000000000000000000..06b6079343d3b2297fbd3a4768d3e3084b655471 GIT binary patch literal 316 zcmeAS@N?&q;$mQ6;PUiv2?ElLK>Uk?4ag98mpuyPuqAoByD*#q!TSf}rGO%w1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP`vpAQYPVLF!8$h8`o-U3d7N@UXwDog#ih`dYj4E7Lh>i{O!eX0Ne literal 0 HcmV?d00001 diff --git a/doc/img/tl.gif b/doc/img/tl.gif new file mode 100644 index 0000000000000000000000000000000000000000..4455dbc60f750ba4e4f9fafcd27485867cec603a GIT binary patch literal 74209 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
      941{?^z%))`GGwq4 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 HOr!cg?IDM9 literal 0 HcmV?d00001 diff --git a/doc/img/tl.png b/doc/img/tl.png new file mode 100644 index 0000000000000000000000000000000000000000..95ae5b609d0a581741c86796fee966914eb27d67 GIT binary patch literal 88378 zcmXt<1yCGK*M%2{g~DZV*I&ou43cLiwr&=fp7l8V*I4 zlt0@NnH@SiV|{#jlG<8t?Wuv{%-%pyL9!C42#9DSH^gwX7@*KS0atRO@rck)JM$oK zLQ+0w!=K@W!LL+&P8**c+0nH>yc~swiW_2tzBLFU59S`-TY!;~;rl&AwH$c0SgiKl z{q{Wsu}klL7+&=wpxK#`G2;q`Fh+lKcih0hz)M4-`n`U6x?+}^H?mg|!nsJbSV+@p zr(3$cF*@$EA#29m!moq}bDUL2BQY7wJMBzGi+vr_DNNT>r- zQ>?K!H!I)mXj8|_#R+ig2^JWTB^=kCzlj{o!>4QHlZ!^zeQXPXM%lN3Y0XUi?Ma4) zhTd6U*GvG9 z<7PK;XQdf)$A@aIxuvDZXv!c6|E4dkzrTM8Hjm&(YnmL}Oe-jKfr?ciI{9!Hj<$-Q zMBx7Urv2dOM-XUlZ*Pp~T0JJL`q<8KrLm+=S^p%vun^Yaag?lBVG2RU*A9h8qNs2s zL&>xR-ZCA=}9ni}w3KN!0H;s}1=@jh#ZkC85A zPBoWC1trV&3-4K3 zjJRy*0p?m|HK>6;A$4wtlai8B*CsGE6uY!yH^PkM0?QJ=sjDjv zK)^wj6f$l>6r+h`cElT%DtV@KxWEk{`s){jfëpx&#VQs{!E) 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 +@author Till Adam +@author Steve Ireland +@author Brett Nash +@author Tilman Sauerbeck +@author Corey Donohoe +@author Yuri Hudobin +@author Nathan Ingersoll +@author Willem Monsuwe +@author Vincent Torri +@author Gustavo Barbieri +@author Cedric Bail +@date 2000-2008 + + +@section intro What is Evas? + +Evas is a clean display canvas API for several target display systems that +can draw anti-aliased text, smooth super and sub-sampled scaled images, +alpha-blend objects much and more. + +It abstracts any need to know much about what the characteristics of your +display system are or what graphics calls are used to draw them and how. It +deals on an object level where all you do is create and manipulate objects +in a canvas, set their properties, and the rest is done for you. + +Evas optimises the rendering pipeline to minimise effort in redrawing changes +made to the canvas and so takes this work out of the programmers hand, +saving a lot of time and energy. + +It's small and lean, designed to work on embedded systems all the way to +large and powerful multi-cpu workstations. It can be compiled to only have +the features you need for your target platform if you so wish, thus keeping +it small and lean. It has several display back-ends, letting it display on +several display systems, making it portable for cross-device and +cross-platform development. + + +@section work How does Evas work? + +Evas is a canvas display library. This is markedly different from most +display and windowing systems as a Canvas is structural and is also a state +engine, wheras most display and windowing systems are immediate mode display +targets. Evas handles the logic between a structural display via its' state +engine, and controls the target windowing system in order to produce +rendered results of the current canvases state on the display. + +Immediate mode display systems retain very little, or no state. A program +will execute a series of commands: + +@verbatim +bitmap_handle = create_new_bitmap(); +draw_line(0, 0, 100, 200); +draw_rectangle(10, 30, 50, 500); +draw_bitmap(10, 30, bitmap_handle); +etc. +@endverbatim + +The series of commands is executed by the windowing system and the results +are displayed on the screen (normally). Once the commands are executed the +display system has little or no idea of how to reproduce this image again, +and so has to be instructed by the application how to redraw sections of the +screen whenever needed. Each sucessive command will be executed as +instructed by the application and either emulated by software or sent to the +graphics hardware on the device to be performed. + +The advantage of such a system is that it is simple, and gives a program +tight control over how something looks and is drawn. Given the increasing +complexity of displays and demands by users to have better looking +interfaces, more and more work is needing to be done at this level by the +internals of widget sets, custom display widgets and other programs. This +means more and more logic and display rendering code needs to be written +time and time again, each time the application needs to figure out how to +minimise redraws so that display is fast and interactive, and keep track of +redraw logic. The power comes at a high-price, lots of extra code and work. +Programmers not very familiar with graphics programming will often make +mistakes at this level and produce code that is sub optimal. Those familiar +with this kind of programming will simply get bored by writing the same code +again and again. + +Evas is a structural system in which the programmer creates and manages +display objects and their properties, and as a result of this higher level +state management, the canvas is able to redraw the set of objects when +needed to represent the current state of the canvas. + +For example: + +@verbatim +bitmap_handle = create_bitmap(); +move(bitmap_handle, 10, 30); +show(bitmap_handle); +rectangle_handle = create_rectangle(); +move(rectangle_handle, 10, 30); +resize(rectangle_handle, 50, 500); +show(rectangle_handle); +line_handle = create_line(); +set_line_coords(line_handle, 0, 0, 100, 200); +show(line_handle); +etc. +@endverbatim + +This may look longer, but when the display needs to be refreshed or updated, +the programmer only moves, resizes, shows, hides etc. the objects that they +need to change. The programmer simply thinks at the object logic level, and +the canvas software does the rest of the work for them, figuring out what +actually changed in the canvas since it was last drawn, how to most +efficiently redraw he canvas and its contents to reflect the current state, +and then it can go off and do the actual drawing of the canvas. + +This lets the programmer think in a more natural way when dealing with a +display, and saves time and effort of working out how to load and display +images, render given the current display system etc. Since Evas also is +portable across different display systems, this also gives the programmer +the ability to have their code ported and display on different display +systems with very little work. + +Evas can be seen as a display system that stands somewhere between a widget +set and an immediate mode display system. It retains basic display logic, +but does very little high-level logic such as scrollbars, sliders, push +buttons etc. + + +@section compiling How to compile using Evas? + +Evas is a library your application links to. The proceedure for this is very +simple. You simply have to compile your application with the appropriate +compiler flags that the @p evas-config script outputs. For example: + +Compiling C or C++ files into object files: + +@verbatim +gcc -c -o main.o main.c `pkg-config --cflags evas` +@endverbatim + +Linking object files into a binary executable: + +@verbatim +gcc -o my_application main.o `pkg-config --libs evas` +@endverbatim + +You simply have to make sure that pkg-config is in your shell's PATH (see +the manual page for your appropriate shell) and evas.pc in /usr/lib/pkgconfig +or its path is in the PKG_CONFIG_PATH environment variable. It's that simple +to link and use Evas once you have written your code to use it. + +Since the program is linked to Evas, it is now able to use any advertised +API calls to display graphics in a canvas managed by Evas, as well as use +the API calls provided to manage data as well. + +You should make sure you add any extra compile and link flags to your +compile commands that your application may need as well. The above example +is only guaranteed to make Evas add it's own requirements. + + +@section install How is it installed? + +Simple: + +@verbatim +./configure +make +su - +... +make install +@endverbatim + + +@todo (1.0) Need a way ot scaling an image and just PRODUCING the output (scaling direct to target buffe r- no blend/copy etc.) +@todo (1.0) Could improve evas's scaling down code to limit multiple samples per output pixel to maybe 2x2? +@todo (1.0) Document API +@todo (1.0) Evas needs to check delete_me member for all object functions +@todo (1.0) Evas engine that renders to Evas_Objects +@todo (1.0) OpenGL engine needs to use texture meshes +@todo (1.0) OpenGL engine needs texture cache and size setting +@todo (1.0) OpenGL Engine needs YUV import API to YUV texture +@todo (1.0) All engines need pixel import API +@todo (1.0) Add parital render through composite layer api to engines +@todo (1.0) Move callback processing to a queue and do it asynchronously??? +@todo (1.0) Add button grabbing +@todo (1.0) Add generic object method call system +@todo (1.0) Add callbacks set for smart object parents to be set on all child smart objects too. +@todo (1.0) Define image load errors (and maybe have an error to string func) +@todo (1.0) Add text styles (outline etc.) +@todo (1.0) Add font load query calls (so we know if a font load failed) +@todo (1.0) Add font listing calls +@todo (1.0) Add ability to check image comments & disk format +@todo (1.0) Add group objects +@todo (1.0) Add fontset support +@todo (1.0) Export engine rendering API cleanly to Evas API +@todo (1.0) Add smart object ability to provide rendering callback +@todo (1.1) Make freetype optional and put in optional graymap font engine +@todo (1.1) Free images if object invisible (and put back in chache) +@todo (1.1) Check robustness of malloc/calloc/realloc failures. +@todo (1.1) Add memory use reduction code if any allocations fail +@todo (1.1) If image loads fails due to memory allocatue failure, load reduced res version +@todo (1.1) If image load fails due to memory allocation failure, try split it up into tiles and demand-load them +@todo (1.2) Add external image loaders (application provided callbacks to load) +@todo (1.2) Add loadable image loader module support (evas loads file.so) +@todo (1.2) Add external image loader modules (application provides path to file.so) +@todo (1.3) Add X11 primtive engine (ie pixmap) +@todo (1.3) Add immediate mode drawing commands to image objects +@todo (1.3) Fix FB engine to allocate vt and release properly +@todo (1.4) Add ellipse objects (circle, arc, ellipse etc.) +@todo (1.5) Make software engine draw lines & polys etc. with aa +@todo (1.5) Add radial gradients to gradient objects +@todo (1.5) Add Symbian Engine +@todo (1.6) Add PalmOS Engine +@todo (1.6) Add Apple OpenGL Engine +@todo (1.7) Document engine API and other internals +@todo (1.7) Allow any object to clip any other object, and not just rectangles +@todo (1.8) Add more evas demos +@todo (1.9) Write the error mechanism in evas_xcb_buffer.c +@todo (1.9) Rewrite the render xcb engine +@todo (1.10) Improve Win32 Direct3D Engine + +*/ diff --git a/evas.pc.in b/evas.pc.in new file mode 100644 index 0000000..b65486c --- /dev/null +++ b/evas.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: evas +Description: Evas canvas display library +Version: @VERSION@ +Libs: -L${libdir} -levas +Libs.private: @pthread_libs@ @dlopen_libs@ @EDB_LIBS@ @EET_LIBS@ @FREETYPE_LIBS@ @FONTCONFIG_LIBS@ +Cflags: -I${includedir} diff --git a/evas.spec.in b/evas.spec.in new file mode 100644 index 0000000..828cbb5 --- /dev/null +++ b/evas.spec.in @@ -0,0 +1,552 @@ +# Conditional build stuff; from rpm 4.4 /usr/lib/rpm/macros. +# bcond_without defaults to WITH, and vice versa. Yes, it's +# ass-backward. Blame PLD. +%if %{!?with:1}0 +%define with() %{expand:%%{?with_%{1}:1}%%{!?with_%{1}:0}} +%endif +%if %{!?without:1}0 +%define without() %{expand:%%{?with_%{1}:0}%%{!?with_%{1}:1}} +%endif +%if %{!?bcond_with:1}0 +%define bcond_with() %{expand:%%{?_with_%{1}:%%global with_%{1} 1}} +%endif +%if %{!?bcond_without:1}0 +%define bcond_without() %{expand:%%{!?_without_%{1}:%%global with_%{1} 1}} +%endif + +## disabled features +%bcond_with module_loader_edb +%bcond_with module_saver_edb +%bcond_with module_engine_directfb +%bcond_with module_engine_gl_x11 +%bcond_with module_engine_software_qtopia +%bcond_with module_engine_software_sdl +%bcond_with module_engine_software_xcb +%bcond_with module_engine_xrender_x11 +%bcond_with module_engine_xrender_xcb +%bcond_with module_loader_svg + +## enabled features +%bcond_without module_engine_software_x11 +%bcond_without module_engine_buffer +%bcond_without module_engine_fb +%bcond_without module_loader_pmaps +%bcond_without module_loader_png +%bcond_without module_saver_png +%bcond_without module_loader_jpeg +%bcond_without module_saver_jpeg +%bcond_without module_loader_gif +%bcond_without module_loader_tiff +%bcond_without module_saver_tiff +%bcond_without module_loader_eet +%bcond_without module_saver_eet +%bcond_without module_loader_xpm + +# This just keeps a missing doxygen from killing the build. +%define _missing_doc_files_terminate_build 0 + +# Macros for ./configure use +%define ac_with_module_loader_eet --%{?with_module_loader_eet:en}%{!?with_module_loader_eet:dis}able-image-loader-eet +%define ac_with_module_loader_jpeg --%{?with_module_loader_jpeg:en}%{!?with_module_loader_jpeg:dis}able-image-loader-jpeg +%define ac_with_module_loader_pmaps --%{?with_module_loader_pmaps:en}%{!?with_module_loader_pmaps:dis}able-image-loader-pmaps +%define ac_with_module_loader_png --%{?with_module_loader_png:en}%{!?with_module_loader_png:dis}able-image-loader-png +%define ac_with_module_loader_tiff --%{?with_module_loader_tiff:en}%{!?with_module_loader_tiff:dis}able-image-loader-tiff +%define ac_with_module_loader_gif --%{?with_module_loader_gif:en}%{!?with_module_loader_gif:dis}able-image-loader-gif +%define ac_with_module_loader_edb --%{?with_module_loader_edb:en}%{!?with_module_loader_edb:dis}able-image-loader-edb +%define ac_with_module_loader_xpm --%{?with_module_loader_xpm:en}%{!?with_module_loader_xpm:dis}able-image-loader-xpm +%define ac_with_module_loader_svg --%{?with_module_loader_svg:en}%{!?with_module_loader_svg:dis}able-image-loader-svg +%define ac_with_module_saver_eet --%{?with_module_saver_eet:en}%{!?with_module_saver_eet:dis}able-image-saver-eet +%define ac_with_module_saver_jpeg --%{?with_module_saver_jpeg:en}%{!?with_module_saver_jpeg:dis}able-image-saver-jpeg +%define ac_with_module_saver_png --%{?with_module_saver_png:en}%{!?with_module_saver_png:dis}able-image-saver-png +%define ac_with_module_saver_tiff --%{?with_module_saver_tiff:en}%{!?with_module_saver_tiff:dis}able-image-saver-tiff +%define ac_with_module_saver_gif --%{?with_module_saver_gif:en}%{!?with_module_saver_gif:dis}able-image-saver-gif +%define ac_with_module_saver_edb --%{?with_module_saver_edb:en}%{!?with_module_saver_edb:dis}able-image-saver-edb +%define ac_with_module_saver_xpm --%{?with_module_saver_xpm:en}%{!?with_module_saver_xpm:dis}able-image-saver-xpm +%define ac_with_module_engine_software-x11 --%{?with_module_engine_fb:en}%{!?with_module_engine_fb:dis}able-software-x11 +%define ac_with_module_engine_buffer --%{?with_module_engine_buffer:en}%{!?with_module_engine_buffer:dis}able-buffer +%define ac_with_module_engine_fb --%{?with_module_engine_fb:en}%{!?with_module_engine_fb:dis}able-fb +%define ac_with_module_engine_xrender_x11 --%{?with_module_engine_xrender_x11:en}%{!?with_module_engine_xrender_x11:dis}able-xrender-x11 +%define ac_with_module_engine_gl_x11 --%{?with_module_engine_gl_x11:en}%{!?with_module_engine_gl_x11:dis}able-gl-x11 +%define ac_with_module_engine_directfb --%{?with_module_engine_directfb:en}%{!?with_module_engine_directfb:dis}able-directfb +%define ac_with_module_engine_software_qtopia --%{?with_module_engine_software_qtopia:en}%{!?with_module_engine_software_qtopia:dis}able-software-qtopia +%define ac_with_module_engine_software_sdl --%{?with_module_engine_software_sdl:en}%{!?with_module_engine_software_sdl:dis}able-sdl +%define ac_with_module_engine_software_xcb --%{?with_module_engine_software_xcb:en}%{!?with_module_engine_software_xcb:dis}able-software-xcb +%define ac_with_module_engine_xrender_xcb --%{?with_module_engine_xrender_xcb:en}%{!?with_module_engine_xrender_xcb:dis}able-xrender-xcb + +Summary: Multi-platform Canvas Library +Name: @PACKAGE@ +Version: @VERSION@ +Release: 0.%(date '+%Y%m%d') +License: BSD +Group: System Environment/Libraries +URL: http://www.enlightenment.org/ +Source: %{name}-%{version}.tar.gz +Packager: %{?_packager:%{_packager}}%{!?_packager:Michael Jennings } +Vendor: %{?_vendorinfo:%{_vendorinfo}}%{!?_vendorinfo:The Enlightenment Project (http://www.enlightenment.org/)} +Distribution: %{?_distribution:%{_distribution}}%{!?_distribution:%{_vendor}} +BuildRequires: /usr/bin/freetype-config +Provides: evas +BuildRoot: %{_tmppath}/%{name}-%{version}-root + +%description +Evas is a clean display canvas API for several target display systems +that can draw anti-aliased text, smooth super and sub-sampled scaled +images, alpha-blend objects much and more. + +%package devel +Summary: Evas headers, static libraries, documentation and test programs +Group: System Environment/Libraries +Requires: %{name} = %{version} + +%description devel +Headers, static libraries, test programs and documentation for Evas. + +%if %{with module_loader_eet} +%package module_loader_eet +Summary: EET Image loader module for Evas +Group: System Environment/Libraries +BuildRequires: eet-devel +%description module_loader_eet +EET Image loader module for Evas +%endif + +%if %{with module_saver_eet} +%package module_saver_eet +Summary: EET Image saver module for Evas +Group: System Environment/Libraries +BuildRequires: eet-devel +%description module_saver_eet +EET Image saver module for Evas +%endif + +%if %{with module_loader_jpeg} +%package module_loader_jpeg +Summary: JPEG Image loader module for Evas +Group: System Environment/Libraries +BuildRequires: libjpeg-devel +%description module_loader_jpeg +JPEG Image loader module for Evas +%endif + +%if %{with module_saver_jpeg} +%package module_saver_jpeg +Summary: JPEG Image saver module for Evas +Group: System Environment/Libraries +BuildRequires: libjpeg-devel +%description module_saver_jpeg +JPEG Image saver module for Evas +%endif + +%if %{with module_loader_pmaps} +%package module_loader_pmaps +Summary: Pixmap Image loader module for Evas +Group: System Environment/Libraries +BuildRequires: libXpm-devel +%description module_loader_pmaps +Pixmap Image loader module for Evas +%endif + +%if %{with module_loader_png} +%package module_loader_png +Summary: PNG Image loader module for Evas +Group: System Environment/Libraries +BuildRequires: libpng-devel +%description module_loader_png +PNG Image loader module for Evas +%endif + +%if %{with module_saver_png} +%package module_saver_png +Summary: PNG Image saver module for Evas +Group: System Environment/Libraries +BuildRequires: libpng-devel +%description module_saver_png +PNG Image saver module for Evas +%endif + +%if %{with module_loader_tiff} +%package module_loader_tiff +Summary: TIFF Image loader module for Evas +Group: System Environment/Libraries +BuildRequires: libtiff-devel +%description module_loader_tiff +TIFF Image loader module for Evas +%endif + +%if %{with module_saver_tiff} +%package module_saver_tiff +Summary: TIFF Image saver module for Evas +Group: System Environment/Libraries +BuildRequires: libtiff-devel +%description module_saver_tiff +TIFF Image saver module for Evas +%endif + +%if %{with module_loader_gif} +%package module_loader_gif +Summary: GIF Image loader module for Evas +Group: System Environment/Libraries +#BuildSuggests: libungif-devel, giflib-devel +BuildRequires: /usr/include/gif_lib.h +%description module_loader_gif +GIF Image loader module for Evas +%endif + +%if %{with module_loader_edb} +%package module_loader_edb +Summary: EDB Image loader module for Evas +Group: System Environment/Libraries +BuildRequires: edb-devel +%description module_loader_edb +EDB Image loader module for Evas +%endif + +%if %{with module_saver_edb} +%package module_saver_edb +Summary: EDB Image saver module for Evas +Group: System Environment/Libraries +BuildRequires: edb-devel +%description module_saver_edb +EDB Image saver module for Evas +%endif + +%if %{with module_loader_xpm} +%package module_loader_xpm +Summary: XPM Image loader module for Evas +Group: System Environment/Libraries +##BuildRequires: (none, X?) +%description module_loader_xpm +XPM Image loader module for Evas +%endif + +%if %{with module_loader_svg} +%package module_loader_svg +Summary: SVG Image loader module for Evas +Group: System Environment/Libraries +BuildRequires: librsvg-devel >= 2.14 +%description module_loader_svg +svg Image loader module for Evas +%endif + +%package module_engine_software_generic +Summary: Software X11 rendering engine module for Evas +Group: System Environment/Libraries +Requires: evas +%description module_engine_software_generic +Software X11 rendering engine module for Evas + +%if %{with module_engine_software_x11} +%package module_engine_software_x11 +Summary: Software X11 rendering engine module for Evas +Group: System Environment/Libraries +Requires: evas-module_engine_software_generic +Requires: evas +%description module_engine_software_x11 +Software X11 rendering engine module for Evas +%endif + +%if %{with module_engine_buffer} +%package module_engine_buffer +Summary: Buffer rendering engine module for Evas +Group: System Environment/Libraries +Requires: evas-module_engine_software_generic +Requires: evas +%description module_engine_buffer +Memory Buffer rendering engine module for Evas +%endif + +%if %{with module_engine_fb} +%package module_engine_fb +Summary: Framebuffer rendering engine module for Evas +Group: System Environment/Libraries +Requires: evas-module_engine_software_generic +Requires: evas +%description module_engine_fb +Framebuffer rendering engine module for Evas +%endif + +%if %{with module_engine_xrender_x11} +%package module_engine_xrender_x11 +Summary: XRender rendering engine module for Evas +Group: System Environment/Libraries +#BuildSuggests: xorg-x11-devel, XFree86-devel +BuildRequires: xrender-devel +Requires: evas-module_engine_software_generic +Requires: evas +%description module_engine_xrender_x11 +XRender rendering engine module for Evas +%endif + +%if %{with module_engine_gl_x11} +%package module_engine_gl_x11 +Summary: OpenGL under X11 rendering engine module for Evas +Group: System Environment/Libraries +#BuildSuggests: xorg-x11-devel, xorg-x11-Mesa-libGL, XFree86-devel +Requires: evas +%description module_engine_gl_x11 +OpenGL under X11 rendering engine module for Evas +%endif + +%if %{with module_engine_directfb} +%package module_engine_directfb +Summary: Directfb rendering engine module for Evas +Group: System Environment/Libraries +#BuildSuggests: DirectFB, libdirectfb-devel, directfb-devel +BuildRequires: /usr/include/directfb/dfb_types.h +Requires: evas +%description module_engine_directfb +Directfb rendering engine module for Evas +%endif + +%if %{with module_engine_software_qtopia} +%package module_engine_software_qtopia +Summary: Qtopia rendering engine module for Evas +Group: System Environment/Libraries +BuildRequires: qtopia-devel +Requires: evas-module_engine_software_generic +Requires: evas +%description module_engine_software_qtopia +Qtopia rendering engine module for Evas +%endif + +%if %{with module_engine_software_sdl} +%package module_engine_software_sdl +Summary: Software SDL X11 rendering engine module for Evas +Group: System Environment/Libraries +BuildRequires: SDL-devel +Requires: evas-module_engine_software_generic +Requires: evas +%description module_engine_software_sdl +Software SDL X11 rendering engine module for Evas +%endif + +%if %{with module_engine_software_xcb} +%package module_engine_software_xcb +Summary: Software XCB X11 rendering engine module for Evas +Group: System Environment/Libraries +BuildRequires: xcb-devel +Requires: evas-module_engine_software_generic +Requires: evas +%description module_engine_software_xcb +Software XCB X11 rendering engine module for Evas +%endif + +%if %{with module_engine_xrender_xcb} +%package module_engine_xrender_xcb +Summary: Xrender XCB X11 rendering engine module for Evas +Group: System Environment/Libraries +BuildRequires: xcb-devel +Requires: evas-module_engine_xrender_x11 +Requires: evas +%description module_engine_xrender_xcb +Xrender XCB X11 rendering engine module for Evas +%endif + +%prep +%setup -q -n %{name}-%{version} + +%build +%{configure} --prefix=%{_prefix} --x-libraries=%{_prefix}/X11R6/%{_lib} \ + %{?ac_with_module_loader_eet} \ + %{?ac_with_module_saver_eet} \ + %{?ac_with_module_loader_jpeg} \ + %{?ac_with_module_saver_jpeg} \ + %{?ac_with_module_loader_pmaps} \ + %{?ac_with_module_loader_png} \ + %{?ac_with_module_saver_png} \ + %{?ac_with_module_loader_tiff} \ + %{?ac_with_module_saver_tiff} \ + %{?ac_with_module_loader_gif} \ + %{?ac_with_module_loader_edb} \ + %{?ac_with_module_saver_edb} \ + %{?ac_with_module_loader_xpm} \ + %{?ac_with_module_loader_svg} \ + %{?ac_with_module_engine_software_x11} \ + %{?ac_with_module_engine_buffer} \ + %{?ac_with_module_engine_fb} \ + %{?ac_with_module_engine_xrender_x11} \ + %{?ac_with_module_engine_gl_x11} \ + %{?ac_with_module_engine_directfb} \ + %{?ac_with_module_engine_software_qtopia} \ + %{?ac_with_module_engine_software_sdl} \ + %{?ac_with_module_engine_software_xcb} \ + %{?ac_with_module_engine_xrender_xcb} \ + $RPM_CONFIGURE_OPTS +%{__make} %{?_smp_mflags} %{?mflags} +test -x `which doxygen` && /bin/sh gendoc || : + +%install +%{__make} %{?mflags_install} DESTDIR=$RPM_BUILD_ROOT install +%{__rm} -f $RPM_BUILD_ROOT%{_libdir}/%{name}/modules/*/*/*/*a + +%clean +test "x$RPM_BUILD_ROOT" != "x/" && rm -rf $RPM_BUILD_ROOT + +%post +/sbin/ldconfig + +%postun +/sbin/ldconfig + +%files +%defattr(-, root, root) +%doc AUTHORS COPYING COPYING-PLAIN README +%{_libdir}/*.so.* + +%files devel +%defattr(-, root, root) +%{_libdir}/*.so +%{_libdir}/*.la +%{_libdir}/*.a +%{_libdir}/pkgconfig/* +%{_includedir}/*.h + +%files module_engine_software_generic +%defattr(-, root, root) +%{_libdir}/evas/modules/engines/software_generic/*/module.so + +%if %{with module_loader_eet} +%files module_loader_eet +%defattr(-, root, root) +%{_libdir}/evas/modules/loaders/eet/*/module.so +%endif + +%if %{with module_saver_eet} +%files module_saver_eet +%defattr(-, root, root) +%{_libdir}/evas/modules/savers/eet/*/module.so +%endif + +%if %{with module_loader_pmaps} +%files module_loader_pmaps +%defattr(-, root, root) +%{_libdir}/evas/modules/loaders/pmaps/*/module.so +%endif + +%if %{with module_loader_png} +%files module_loader_png +%defattr(-, root, root) +%{_libdir}/evas/modules/loaders/png/*/module.so +%endif + +%if %{with module_saver_png} +%files module_saver_png +%defattr(-, root, root) +%{_libdir}/evas/modules/savers/png/*/module.so +%endif + +%if %{with module_loader_jpeg} +%files module_loader_jpeg +%defattr(-, root, root) +%{_libdir}/evas/modules/loaders/jpeg/*/module.so +%endif + +%if %{with module_saver_jpeg} +%files module_saver_jpeg +%defattr(-, root, root) +%{_libdir}/evas/modules/savers/jpeg/*/module.so +%endif + +%if %{with module_loader_tiff} +%files module_loader_tiff +%defattr(-, root, root) +%{_libdir}/evas/modules/loaders/tiff/*/module.so +%endif + +%if %{with module_saver_tiff} +%files module_saver_tiff +%defattr(-, root, root) +%{_libdir}/evas/modules/savers/tiff/*/module.so +%endif + +%if %{with module_loader_gif} +%files module_loader_gif +%defattr(-, root, root) +%{_libdir}/evas/modules/loaders/gif/*/module.so +%endif + +%if %{with module_loader_edb} +%files module_loader_edb +%defattr(-, root, root) +%{_libdir}/evas/modules/loaders/edb/*/module.so +%endif + +%if %{with module_saver_edb} +%files module_saver_edb +%defattr(-, root, root) +%{_libdir}/evas/modules/savers/edb/*/module.so +%endif + +%if %{with module_loader_xpm} +%files module_loader_xpm +%defattr(-, root, root) +%{_libdir}/evas/modules/loaders/xpm/*/module.so +%endif + +%if %{with module_loader_svg} +%files module_loader_svg +%defattr(-, root, root) +%{_libdir}/evas/modules/loaders/svg/*/module.so +%endif + +%if %{with module_engine_software_x11} +%files module_engine_software_x11 +%defattr(-, root, root) +%{_libdir}/evas/modules/engines/software_x11/*/module.so +%endif + +%if %{with module_engine_buffer} +%files module_engine_buffer +%defattr(-, root, root) +%{_libdir}/evas/modules/engines/buffer/*/module.so +%endif + +%if %{with module_engine_fb} +%files module_engine_fb +%defattr(-, root, root) +%{_libdir}/evas/modules/engines/fb/*/module.so +%endif + +%if %{with module_engine_xrender_x11} +%files module_engine_xrender_x11 +%defattr(-, root, root) +%{_libdir}/evas/modules/engines/xrender_x11/*/module.so +%endif + +%if %{with module_engine_gl_x11} +%files module_engine_gl_x11 +%defattr(-, root, root) +%{_libdir}/evas/modules/engines/gl_x11/*/module.so +%endif + +%if %{with module_engine_directfb} +%files module_engine_directfb +%defattr(-, root, root) +%{_libdir}/evas/modules/engines/directfb/*/module.so +%endif + +%if %{with module_engine_software_qtopia} +%files module_engine_software_qtopia +%defattr(-, root, root) +%{_libdir}/evas/modules/engines/software_qtopia/*/module.so +%endif + +%if %{with module_engine_software_sdl} +%files module_engine_software_sdl +%defattr(-, root, root) +%{_libdir}/evas/modules/engines/software_sdl/*/module.so +%endif + +%if %{with module_engine_software_xcb} +%files module_engine_software_xcb +%defattr(-, root, root) +%{_libdir}/evas/modules/engines/software_xcb/*/module.so +%endif + +%if %{with module_engine_xrender_xcb} +%files module_engine_xrender_xcb +%defattr(-, root, root) +%{_libdir}/evas/modules/engines/xrender_xcb/*/module.so +%endif + +%changelog diff --git a/gendoc b/gendoc new file mode 100755 index 0000000..1b099ce --- /dev/null +++ b/gendoc @@ -0,0 +1,9 @@ +#!/bin/sh +rm -rf ./doc/html ./doc/latex ./doc/man +mkdir -p doc/html doc/man doc/latex +doxygen +cp doc/img/* doc/html/ +rm -f evas_docs.tar evas_docs.tar.gz +tar -cvf evas_docs.tar doc/html doc/man doc/latex +gzip -9 evas_docs.tar +exit 0 diff --git a/m4/evas_converter.m4 b/m4/evas_converter.m4 new file mode 100644 index 0000000..4a5a390 --- /dev/null +++ b/m4/evas_converter.m4 @@ -0,0 +1,83 @@ +dnl use: EVAS_CONVERT_COLOR(bpp, colorspace, components[, default-enabled]) +AC_DEFUN([EVAS_CONVERT_COLOR], +[ +pushdef([UP], translit([$1_$2_$3], [a-z], [A-Z]))dnl +pushdef([DOWN_D], translit([$1-$2-$3], [A-Z], [a-z]))dnl +pushdef([DOWN_U], translit([$1_$2_$3], [A-Z], [a-z]))dnl + +conv_[]DOWN_U="no" + +ifelse("x$4", "xno", +[ + AC_ARG_ENABLE(convert-[]DOWN_D, + AC_HELP_STRING( + [--enable-convert-[]DOWN_D], + [enable the $1bpp $2 $3 converter code] + ), + [ conv_[]DOWN_U=$enableval ], + [ conv_[]DOWN_U=no ] + ) +], [ + AC_ARG_ENABLE(convert-[]DOWN_D, + AC_HELP_STRING( + [--disable-convert-[]DOWN_D], + [disable the $1bpp $2 $3 converter code] + ), + [ conv_[]DOWN_U=$enableval ], + [ conv_[]DOWN_U=yes ] + ) +]) + +AC_MSG_CHECKING(whether to build $1bpp $2 $3 converter code) +AC_MSG_RESULT($conv_[]DOWN_U) + +if test "x$conv_[]DOWN_U" = "xyes" ; then + AC_DEFINE(BUILD_CONVERT_[]UP, 1, [$1bpp $2 $3 Converter Support]) +fi + +popdef([UP]) +popdef([DOWN_D]) +popdef([DOWN_U]) +]) + +dnl use: EVAS_CONVERT_ROT(bpp, colorspace, rot[, default-enabled]) +AC_DEFUN([EVAS_CONVERT_ROT], +[ +pushdef([UP], translit([$1_$2_ROT$3], [a-z], [A-Z]))dnl +pushdef([DOWN_D], translit([$1-$2-rot-$3], [A-Z], [a-z]))dnl +pushdef([DOWN_U], translit([$1_$2_rot_$3], [A-Z], [a-z]))dnl + +conv_[]DOWN_U="no" + +ifelse("x$4", "xno", +[ + AC_ARG_ENABLE(convert-[]DOWN_D, + AC_HELP_STRING( + [--enable-convert-[]DOWN_D], + [enable the $1bpp $2 rotation $3 converter code] + ), + [ conv_[]DOWN_U=$enableval ], + [ conv_[]DOWN_U=no ] + ) +], [ + AC_ARG_ENABLE(convert-[]DOWN_D, + AC_HELP_STRING( + [--disable-convert-[]DOWN_D], + [disable the $1bpp $2 rotation $3 converter code] + ), + [ conv_[]DOWN_U=$enableval ], + [ conv_[]DOWN_U=yes ] + ) +]) + +AC_MSG_CHECKING(whether to build $1bpp $2 rotation $3 converter code) +AC_MSG_RESULT($conv_[]DOWN_U) + +if test "x$conv_[]DOWN_U" = "xyes" ; then + AC_DEFINE(BUILD_CONVERT_[]UP, 1, [$1bpp $2 Rotation $3 Converter Support]) +fi + +popdef([UP]) +popdef([DOWN_D]) +popdef([DOWN_U]) +]) diff --git a/src/.cvsignore b/src/.cvsignore new file mode 100644 index 0000000..3dda729 --- /dev/null +++ b/src/.cvsignore @@ -0,0 +1,2 @@ +Makefile.in +Makefile diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..75f3f70 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,3 @@ +MAINTAINERCLEANFILES = Makefile.in + +SUBDIRS = lib modules diff --git a/src/lib/.cvsignore b/src/lib/.cvsignore new file mode 100644 index 0000000..84c11b0 --- /dev/null +++ b/src/lib/.cvsignore @@ -0,0 +1,6 @@ +Makefile.in +Makefile +.deps +.libs +libevas.la +main.lo diff --git a/src/lib/Evas.h b/src/lib/Evas.h new file mode 100644 index 0000000..1c45061 --- /dev/null +++ b/src/lib/Evas.h @@ -0,0 +1,881 @@ +#ifndef _EVAS_H +#define _EVAS_H + +#ifdef EAPI +# undef EAPI +#endif + +#ifdef _WIN32 +# ifdef EFL_EVAS_BUILD +# ifdef DLL_EXPORT +# define EAPI __declspec(dllexport) +# else +# define EAPI +# endif /* ! DLL_EXPORT */ +# else +# define EAPI __declspec(dllimport) +# endif /* ! EFL_EVAS_BUILD */ +#else +# ifdef __GNUC__ +# if __GNUC__ >= 4 +# define EAPI __attribute__ ((visibility("default"))) +# else +# define EAPI +# endif +# else +# define EAPI +# endif +#endif /* ! _WIN32 */ + +/** + * @file + * @brief These routines are used for Evas library interaction. + */ + +#include + +typedef enum _Evas_Callback_Type +{ + EVAS_CALLBACK_MOUSE_IN, /**< Mouse In Event */ + EVAS_CALLBACK_MOUSE_OUT, /**< Mouse Out Event */ + EVAS_CALLBACK_MOUSE_DOWN, /**< Mouse Button Down Event */ + EVAS_CALLBACK_MOUSE_UP, /**< Mouse Button Up Event */ + EVAS_CALLBACK_MOUSE_MOVE, /**< Mouse Move Event */ + EVAS_CALLBACK_MOUSE_WHEEL, /**< Mouse Wheel Event */ + EVAS_CALLBACK_FREE, /**< Object Being Freed (Called after Del) */ + EVAS_CALLBACK_KEY_DOWN, /**< Key Press Event */ + EVAS_CALLBACK_KEY_UP, /**< Key Release Event */ + EVAS_CALLBACK_FOCUS_IN, /**< Focus In Event */ + EVAS_CALLBACK_FOCUS_OUT, /**< Focus Out Event */ + EVAS_CALLBACK_SHOW, /**< Show Event */ + EVAS_CALLBACK_HIDE, /**< Hide Event */ + EVAS_CALLBACK_MOVE, /**< Move Event */ + EVAS_CALLBACK_RESIZE, /**< Resize Event */ + EVAS_CALLBACK_RESTACK, /**< Restack Event */ + EVAS_CALLBACK_DEL, /**< Object Being Deleted (called before Free) */ + EVAS_CALLBACK_HOLD, /**< Events go on/off hold */ + EVAS_CALLBACK_CHANGED_SIZE_HINTS /**< Size hints changed event */ +} Evas_Callback_Type; /**< The type of event to trigger the callback */ + +typedef enum _Evas_Button_Flags +{ + EVAS_BUTTON_NONE = 0, /**< No extra mouse button data */ + EVAS_BUTTON_DOUBLE_CLICK = (1 << 0), /**< This mouse button press was the 2nd press of a double click */ + EVAS_BUTTON_TRIPLE_CLICK = (1 << 1) /**< This mouse button press was the 3rd press of a triple click */ +} Evas_Button_Flags; /**< Flags for Mouse Button events */ + +typedef enum _Evas_Event_Flags +{ + EVAS_EVENT_FLAG_NONE = 0, /**< No fancy flags set */ + EVAS_EVENT_FLAG_ON_HOLD = (1 << 0) /**< This event is being delivered but should be put "on hold" until the on hold flag is unset. the event should be used for informational purposes and maybe some indications visually, but not actually perform anything */ +} Evas_Event_Flags; /**< Flags for Events */ + +typedef enum _Evas_Font_Hinting_Flags +{ + EVAS_FONT_HINTING_NONE, /**< No font hinting */ + EVAS_FONT_HINTING_AUTO, /**< Automatic font hinting */ + EVAS_FONT_HINTING_BYTECODE /**< Bytecode font hinting */ +} Evas_Font_Hinting_Flags; /**< Flags for Font Hinting */ + +typedef enum _Evas_Colorspace +{ + EVAS_COLORSPACE_ARGB8888, /**< ARGB 32 bits per pixel, high-byte is Alpha, accessed 1 32bit word at a time */ + /* these are not currently supported - but planned for the future */ + EVAS_COLORSPACE_YCBCR422P601_PL, /**< YCbCr 4:2:2 Planar, ITU.BT-601 specifications. The data poitned to is just an array of row pointer, pointing to the Y rows, then the Cb, then Cr rows */ + EVAS_COLORSPACE_YCBCR422P709_PL,/**< YCbCr 4:2:2 Planar, ITU.BT-709 specifications. The data poitned to is just an array of row pointer, pointing to the Y rows, then the Cb, then Cr rows */ + EVAS_COLORSPACE_RGB565_A5P /**< 16bit rgb565 + Alpha plane at end - 5 bits of the 8 being used per alpha byte */ +} Evas_Colorspace; /**< Colorspaces for pixel data supported by Evas */ + +typedef struct _Evas_Rectangle Evas_Rectangle; /**< A generic rectangle handle */ +typedef struct _Evas_Coord_Rectangle Evas_Coord_Rectangle; /**< A generic rectangle handle */ +typedef struct _Evas_Smart_Class Evas_Smart_Class; /**< A smart object base class */ + +typedef struct _Evas Evas; /**< An Evas canvas handle */ +typedef struct _Evas_Object Evas_Object; /**< An Evas Object handle */ +typedef void Evas_Performance; /**< An Evas Performance handle */ +typedef struct _Evas_Modifier Evas_Modifier; /**< An Evas Modifier */ +typedef struct _Evas_Lock Evas_Lock; /**< An Evas Lock */ +typedef struct _Evas_Smart Evas_Smart; /**< An Evas Smart Object handle */ +typedef struct _Evas_Native_Surface Evas_Native_Surface; /**< A generic datatype for engine specific native surface information */ +typedef unsigned long long Evas_Modifier_Mask; /**< An Evas modifier mask type */ + +typedef int Evas_Coord; +typedef int Evas_Font_Size; +typedef int Evas_Angle; + +struct _Evas_Rectangle /** A rectangle */ +{ + int x; /**< top-left x co-ordinate of rectangle */ + int y; /**< top-left y co-ordinate of rectangle */ + int w; /**< width of rectangle */ + int h; /**< height of rectangle */ +}; + +struct _Evas_Coord_Rectangle /** A rectangle in Evas_Coord */ +{ + Evas_Coord x; /**< top-left x co-ordinate of rectangle */ + Evas_Coord y; /**< top-left y co-ordinate of rectangle */ + Evas_Coord w; /**< width of rectangle */ + Evas_Coord h; /**< height of rectangle */ +}; + +typedef enum _Evas_Aspect_Control +{ + EVAS_ASPECT_CONTROL_NONE = 0, + EVAS_ASPECT_CONTROL_NEITHER = 1, + EVAS_ASPECT_CONTROL_HORIZONTAL = 2, + EVAS_ASPECT_CONTROL_VERTICAL = 3, + EVAS_ASPECT_CONTROL_BOTH = 4 +} Evas_Aspect_Control; + + +#define EVAS_SMART_CLASS_VERSION 1 /** the version you have to put into the version field in the smart class struct */ +struct _Evas_Smart_Class /** a smart object class */ +{ + const char *name; /** the string name of the class */ + + int version; + + void (*add) (Evas_Object *o); + void (*del) (Evas_Object *o); + void (*move) (Evas_Object *o, Evas_Coord x, Evas_Coord y); + void (*resize) (Evas_Object *o, Evas_Coord w, Evas_Coord h); + void (*show) (Evas_Object *o); // FIXME: DELETE ME + void (*hide) (Evas_Object *o); // FIXME: DELETE ME + void (*color_set) (Evas_Object *o, int r, int g, int b, int a); // FIXME: DELETE ME + void (*clip_set) (Evas_Object *o, Evas_Object *clip); // FIXME: DELETE ME + void (*clip_unset) (Evas_Object *o); // FIXME: DELETE ME + + const void *data; +}; + +typedef struct _Evas_Pixel_Import_Source Evas_Pixel_Import_Source; /**< A source description of pixels for importing pixels */ +typedef struct _Evas_Engine_Info Evas_Engine_Info; /**< A generic Evas Engine information structure */ +typedef struct _Evas_Event_Mouse_Down Evas_Event_Mouse_Down; /**< Event structure for #EVAS_CALLBACK_MOUSE_DOWN event callbacks */ +typedef struct _Evas_Event_Mouse_Up Evas_Event_Mouse_Up; /**< Event structure for #EVAS_CALLBACK_MOUSE_UP event callbacks */ +typedef struct _Evas_Event_Mouse_In Evas_Event_Mouse_In; /**< Event structure for #EVAS_CALLBACK_MOUSE_IN event callbacks */ +typedef struct _Evas_Event_Mouse_Out Evas_Event_Mouse_Out; /**< Event structure for #EVAS_CALLBACK_MOUSE_OUT event callbacks */ +typedef struct _Evas_Event_Mouse_Move Evas_Event_Mouse_Move; /**< Event structure for #EVAS_CALLBACK_MOUSE_MOVE event callbacks */ +typedef struct _Evas_Event_Mouse_Wheel Evas_Event_Mouse_Wheel; /**< Event structure for #EVAS_CALLBACK_MOUSE_WHEEL event callbacks */ +typedef struct _Evas_Event_Key_Down Evas_Event_Key_Down; /**< Event structure for #EVAS_CALLBACK_KEY_DOWN event callbacks */ +typedef struct _Evas_Event_Key_Up Evas_Event_Key_Up; /**< Event structure for #EVAS_CALLBACK_KEY_UP event callbacks */ +typedef struct _Evas_Event_Hold Evas_Event_Hold; /**< Event structure for #EVAS_CALLBACK_HOLD event callbacks */ + +#define EVAS_LOAD_ERROR_NONE 0 /**< No error on load */ +#define EVAS_LOAD_ERROR_GENERIC 1 /**< A non-specific error occured */ +#define EVAS_LOAD_ERROR_DOES_NOT_EXIST 2 /**< File (or file path) does not exist */ +#define EVAS_LOAD_ERROR_PERMISSION_DENIED 3 /**< Permission deinied to an existing file (or path) */ +#define EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED 4 /**< Allocation of resources failure prevented load */ +#define EVAS_LOAD_ERROR_CORRUPT_FILE 5 /**< File corrupt (but was detected as a known format) */ +#define EVAS_LOAD_ERROR_UNKNOWN_FORMAT 6 /**< File is not a known format */ + +#define EVAS_ALLOC_ERROR_NONE 0 /**< No allocation error */ +#define EVAS_ALLOC_ERROR_FATAL 1 /**< Allocation failed despite attempts to free up memory */ +#define EVAS_ALLOC_ERROR_RECOVERED 2 /**< Allocation succeeded, but extra memory had to be found by freeing up speculative resources */ + +#define EVAS_TEXT_INVALID -1 +#define EVAS_TEXT_SPECIAL -2 + +struct _Evas_Pixel_Import_Source +{ + int format; /**< pixel format type ie ARGB32, YUV420P_601 etc. */ + int w, h; /**< width and height of source in pixels */ + void **rows; /**< an array of pointers (size depends on format) pointing to left edge of each scanline */ +}; + +struct _Evas_Native_Surface +{ + union { + void *p; + unsigned short s; + unsigned int i; + unsigned long l; + } data; +}; + +#define EVAS_LAYER_MIN -32768 /**< bottom-most layer number */ +#define EVAS_LAYER_MAX 32767 /**< top-most layer number */ + +#define EVAS_PIXEL_FORMAT_NONE 0 /**< No pixel format */ +#define EVAS_PIXEL_FORMAT_ARGB32 1 /**< ARGB 32bit pixel format with A in the high byte per 32bit pixel word */ +#define EVAS_PIXEL_FORMAT_YUV420P_601 2 /**< YUV 420 Planar format with CCIR 601 color encoding wuth contiguous planes in the order Y, U and V */ + +#define EVAS_COLOR_SPACE_ARGB 0 /**< ARGB color space */ +#define EVAS_COLOR_SPACE_AHSV 1 /**< AHSV color space */ + +#define EVAS_TEXTURE_REFLECT 0 /**< Gradient and image fill tiling mode - tiling reflects */ +#define EVAS_TEXTURE_REPEAT 1 /**< tiling repeats */ +#define EVAS_TEXTURE_RESTRICT 2 /**< tiling clamps - range offset ignored */ +#define EVAS_TEXTURE_RESTRICT_REFLECT 3 /**< tiling clamps and any range offset reflects */ +#define EVAS_TEXTURE_RESTRICT_REPEAT 4 /**< tiling clamps and any range offset repeats */ +#define EVAS_TEXTURE_PAD 5 /**< tiling extends with end values */ + +typedef enum _Evas_Render_Op +{ + EVAS_RENDER_BLEND = 0, /**< default op: d = d*(1-sa) + s */ + EVAS_RENDER_BLEND_REL = 1, /**< d = d*(1 - sa) + s*da */ + EVAS_RENDER_COPY = 2, /**< d = s */ + EVAS_RENDER_COPY_REL = 3, /**< d = s*da */ + EVAS_RENDER_ADD = 4, /**< d = d + s */ + EVAS_RENDER_ADD_REL = 5, /**< d = d + s*da */ + EVAS_RENDER_SUB = 6, /**< d = d - s */ + EVAS_RENDER_SUB_REL = 7, /**< d = d - s*da */ + EVAS_RENDER_TINT = 8, /**< d = d*s + d*(1 - sa) + s*(1 - da) */ + EVAS_RENDER_TINT_REL = 9, /**< d = d*(1 - sa + s) */ + EVAS_RENDER_MASK = 10, /**< d = d*sa */ + EVAS_RENDER_MUL = 11 /**< d = d*s */ +} Evas_Render_Op; /**< */ + + +struct _Evas_Engine_Info /** Generic engine information. Generic info is useless */ +{ + int magic; /**< Magic number */ +}; + +struct _Evas_Event_Mouse_Down /** Mouse button press event */ +{ + int button; /**< Mouse button number that went down (1 - 32) */ + struct { + int x, y; + } output; + struct { + Evas_Coord x, y; + } canvas; + void *data; + Evas_Modifier *modifiers; + Evas_Lock *locks; + + Evas_Button_Flags flags; + unsigned int timestamp; + Evas_Event_Flags event_flags; +}; + +struct _Evas_Event_Mouse_Up /** Mouse button release event */ +{ + int button; /**< Mouse button number that was raised (1 - 32) */ + struct { + int x, y; + } output; + struct { + Evas_Coord x, y; + } canvas; + void *data; + Evas_Modifier *modifiers; + Evas_Lock *locks; + + Evas_Button_Flags flags; + unsigned int timestamp; + Evas_Event_Flags event_flags; +}; + +struct _Evas_Event_Mouse_In /** Mouse enter event */ +{ + int buttons; /**< Button pressed mask, Bits set to 1 are buttons currently pressed (bit 0 = mouse button 1, bit 1 = mouse button 2 etc.) */ + struct { + int x, y; + } output; + struct { + Evas_Coord x, y; + } canvas; + void *data; + Evas_Modifier *modifiers; + Evas_Lock *locks; + unsigned int timestamp; + Evas_Event_Flags event_flags; +}; + +struct _Evas_Event_Mouse_Out /** Mouse leave event */ +{ + int buttons; /**< Button pressed mask, Bits set to 1 are buttons currently pressed (bit 0 = mouse button 1, bit 1 = mouse button 2 etc.) */ + struct { + int x, y; + } output; + struct { + Evas_Coord x, y; + } canvas; + void *data; + Evas_Modifier *modifiers; + Evas_Lock *locks; + unsigned int timestamp; + Evas_Event_Flags event_flags; +}; + +struct _Evas_Event_Mouse_Move /** Mouse button down event */ +{ + int buttons; /**< Button pressed mask, Bits set to 1 are buttons currently pressed (bit 0 = mouse button 1, bit 1 = mouse button 2 etc.) */ + struct { + struct { + int x, y; + } output; + struct { + Evas_Coord x, y; + } canvas; + } cur, prev; + void *data; + Evas_Modifier *modifiers; + Evas_Lock *locks; + unsigned int timestamp; + Evas_Event_Flags event_flags; +}; + +struct _Evas_Event_Mouse_Wheel /** Wheel event */ +{ + int direction; /* 0 = default up/down wheel FIXME: more wheel types */ + int z; /* ...,-2,-1 = down, 1,2,... = up */ + + struct { + int x, y; + } output; + + struct { + Evas_Coord x, y; + } canvas; + + void *data; + Evas_Modifier *modifiers; + Evas_Lock *locks; + unsigned int timestamp; + Evas_Event_Flags event_flags; +}; + +struct _Evas_Event_Key_Down /** Key press event */ +{ + char *keyname; /**< The string name of the key pressed */ + void *data; + Evas_Modifier *modifiers; + Evas_Lock *locks; + + const char *key; /**< The logical key : (eg shift+1 == exclamation) */ + const char *string; /**< A UTF8 string if this keystroke has produced a visible string to be ADDED */ + const char *compose; /**< A UTF8 string if this keystroke has modified a string in the middle of being composed - this string replaces the previous one */ + unsigned int timestamp; + Evas_Event_Flags event_flags; +}; + +struct _Evas_Event_Key_Up /** Key release event */ +{ + char *keyname; /**< The string name of the key released */ + void *data; + Evas_Modifier *modifiers; + Evas_Lock *locks; + + const char *key; /**< The logical key : (eg shift+1 == exclamation) */ + const char *string; /**< A UTF8 string if this keystroke has produced a visible string to be ADDED */ + const char *compose; /**< A UTF8 string if this keystroke has modified a string in the middle of being composed - this string replaces the previous one */ + unsigned int timestamp; + Evas_Event_Flags event_flags; +}; + +struct _Evas_Event_Hold /** Hold change event */ +{ + int hold; /**< The hold flag */ + void *data; + + unsigned int timestamp; + Evas_Event_Flags event_flags; +}; + +typedef enum _Evas_Object_Pointer_Mode +{ + EVAS_OBJECT_POINTER_MODE_AUTOGRAB, /**< default, X11-like */ + EVAS_OBJECT_POINTER_MODE_NOGRAB +} Evas_Object_Pointer_Mode; + +#ifdef __cplusplus +extern "C" { +#endif + + EAPI int evas_alloc_error (void); + + EAPI int evas_init (void); + EAPI int evas_shutdown (void); + + EAPI Evas *evas_new (void); + EAPI void evas_free (Evas *e); + + EAPI int evas_render_method_lookup (const char *name); + EAPI Evas_List *evas_render_method_list (void); + EAPI void evas_render_method_list_free (Evas_List *list); + + EAPI void evas_output_method_set (Evas *e, int render_method); + EAPI int evas_output_method_get (const Evas *e); + + EAPI Evas_Engine_Info *evas_engine_info_get (const Evas *e); + EAPI void evas_engine_info_set (Evas *e, Evas_Engine_Info *info); + + EAPI void evas_output_size_set (Evas *e, int w, int h); + EAPI void evas_output_size_get (const Evas *e, int *w, int *h); + EAPI void evas_output_viewport_set (Evas *e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h); + EAPI void evas_output_viewport_get (const Evas *e, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h); + + EAPI Evas_Coord evas_coord_screen_x_to_world (const Evas *e, int x); + EAPI Evas_Coord evas_coord_screen_y_to_world (const Evas *e, int y); + EAPI int evas_coord_world_x_to_screen (const Evas *e, Evas_Coord x); + EAPI int evas_coord_world_y_to_screen (const Evas *e, Evas_Coord y); + + EAPI void evas_pointer_output_xy_get (const Evas *e, int *x, int *y); + EAPI void evas_pointer_canvas_xy_get (const Evas *e, Evas_Coord *x, Evas_Coord *y); + EAPI int evas_pointer_button_down_mask_get (const Evas *e); + EAPI Evas_Bool evas_pointer_inside_get (const Evas *e); + EAPI void evas_data_attach_set (Evas *e, void *data); + EAPI void *evas_data_attach_get (const Evas *e); + +/* DOC UP TO HERE */ + EAPI void evas_damage_rectangle_add (Evas *e, int x, int y, int w, int h); + EAPI void evas_obscured_rectangle_add (Evas *e, int x, int y, int w, int h); + EAPI void evas_obscured_clear (Evas *e); + EAPI Evas_List *evas_render_updates (Evas *e); + EAPI void evas_render_updates_free (Evas_List *updates); + EAPI void evas_render (Evas *e); + EAPI void evas_norender (Evas *e); + EAPI void evas_render_idle_flush (Evas *e); + +/* rectangle objects */ + EAPI Evas_Object *evas_object_rectangle_add (Evas *e); + +/* line objects */ + EAPI Evas_Object *evas_object_line_add (Evas *e); + EAPI void evas_object_line_xy_set (Evas_Object *obj, Evas_Coord x1, Evas_Coord y1, Evas_Coord x2, Evas_Coord y2); + EAPI void evas_object_line_xy_get (const Evas_Object *obj, Evas_Coord *x1, Evas_Coord *y1, Evas_Coord *x2, Evas_Coord *y2); + +/* gradient objects */ + EAPI Evas_Object *evas_object_gradient_add (Evas *e); + EAPI void evas_object_gradient_color_stop_add (Evas_Object *obj, int r, int g, int b, int a, int delta); + EAPI void evas_object_gradient_alpha_stop_add (Evas_Object *obj, int a, int delta); + EAPI void evas_object_gradient_color_data_set (Evas_Object *obj, void *color_data, int len, Evas_Bool has_alpha); + EAPI void evas_object_gradient_alpha_data_set (Evas_Object *obj, void *alpha_data, int len); + EAPI void evas_object_gradient_clear (Evas_Object *obj); + EAPI void evas_object_gradient_type_set (Evas_Object *obj, const char *type, const char *instance_params); + EAPI void evas_object_gradient_type_get (const Evas_Object *obj, char **type, char **instance_params); + EAPI void evas_object_gradient_fill_set (Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h); + EAPI void evas_object_gradient_fill_get (const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h); + EAPI void evas_object_gradient_fill_angle_set (Evas_Object *obj, Evas_Angle angle); + EAPI Evas_Angle evas_object_gradient_fill_angle_get (const Evas_Object *obj); + EAPI void evas_object_gradient_fill_spread_set (Evas_Object *obj, int tile_mode); + EAPI int evas_object_gradient_fill_spread_get (const Evas_Object *obj); + EAPI void evas_object_gradient_angle_set (Evas_Object *obj, Evas_Angle angle); + EAPI Evas_Angle evas_object_gradient_angle_get (const Evas_Object *obj); + EAPI void evas_object_gradient_direction_set (Evas_Object *obj, int direction); + EAPI int evas_object_gradient_direction_get (const Evas_Object *obj); + EAPI void evas_object_gradient_offset_set (Evas_Object *obj, float offset); + EAPI float evas_object_gradient_offset_get (const Evas_Object *obj); + +/* polygon objects */ + EAPI Evas_Object *evas_object_polygon_add (Evas *e); + EAPI void evas_object_polygon_point_add (Evas_Object *obj, Evas_Coord x, Evas_Coord y); + EAPI void evas_object_polygon_points_clear (Evas_Object *obj); + +/* image objects */ + EAPI Evas_Object *evas_object_image_add (Evas *e); + EAPI void evas_object_image_file_set (Evas_Object *obj, const char *file, const char *key); + EAPI void evas_object_image_file_get (const Evas_Object *obj, const char **file, const char **key); + EAPI void evas_object_image_border_set (Evas_Object *obj, int l, int r, int t, int b); + EAPI void evas_object_image_border_get (const Evas_Object *obj, int *l, int *r, int *t, int *b); + EAPI void evas_object_image_border_center_fill_set(Evas_Object *obj, Evas_Bool fill); + EAPI Evas_Bool evas_object_image_border_center_fill_get(const Evas_Object *obj); + EAPI void evas_object_image_fill_set (Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h); + EAPI void evas_object_image_fill_get (const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h); + EAPI void evas_object_image_size_set (Evas_Object *obj, int w, int h); + EAPI void evas_object_image_size_get (const Evas_Object *obj, int *w, int *h); + EAPI int evas_object_image_stride_get (const Evas_Object *obj); + EAPI int evas_object_image_load_error_get (const Evas_Object *obj); + EAPI void evas_object_image_data_set (Evas_Object *obj, void *data); + EAPI void *evas_object_image_data_convert (Evas_Object *obj, Evas_Colorspace to_cspace); + EAPI void *evas_object_image_data_get (const Evas_Object *obj, Evas_Bool for_writing); + EAPI void evas_object_image_data_copy_set (Evas_Object *obj, void *data); + EAPI void evas_object_image_data_update_add (Evas_Object *obj, int x, int y, int w, int h); + EAPI void evas_object_image_alpha_set (Evas_Object *obj, Evas_Bool has_alpha); + EAPI Evas_Bool evas_object_image_alpha_get (const Evas_Object *obj); + EAPI void evas_object_image_smooth_scale_set(Evas_Object *obj, Evas_Bool smooth_scale); + EAPI Evas_Bool evas_object_image_smooth_scale_get(const Evas_Object *obj); + EAPI void evas_object_image_reload (Evas_Object *obj); + EAPI Evas_Bool evas_object_image_save (const Evas_Object *obj, const char *file, const char *key, const char *flags); + EAPI Evas_Bool evas_object_image_pixels_import (Evas_Object *obj, Evas_Pixel_Import_Source *pixels); + EAPI void evas_object_image_pixels_get_callback_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *o), void *data); + EAPI void evas_object_image_pixels_dirty_set (Evas_Object *obj, Evas_Bool dirty); + EAPI Evas_Bool evas_object_image_pixels_dirty_get (const Evas_Object *obj); + EAPI void evas_object_image_load_dpi_set (Evas_Object *obj, double dpi); + EAPI double evas_object_image_load_dpi_get (const Evas_Object *obj); + EAPI void evas_object_image_load_size_set (Evas_Object *obj, int w, int h); + EAPI void evas_object_image_load_size_get (const Evas_Object *obj, int *w, int *h); + EAPI void evas_object_image_load_scale_down_set (Evas_Object *obj, int scale_down); + EAPI int evas_object_image_load_scale_down_get (const Evas_Object *obj); + EAPI void evas_object_image_colorspace_set (Evas_Object *obj, Evas_Colorspace cspace); + EAPI Evas_Colorspace evas_object_image_colorspace_get (const Evas_Object *obj); + EAPI void evas_object_image_native_surface_set (Evas_Object *obj, Evas_Native_Surface *surf); + EAPI Evas_Native_Surface *evas_object_image_native_surface_get (const Evas_Object *obj); + +/* image cache */ + EAPI void evas_image_cache_flush (Evas *e); + EAPI void evas_image_cache_reload (Evas *e); + EAPI void evas_image_cache_set (Evas *e, int size); + EAPI int evas_image_cache_get (const Evas *e); + +/* text objects */ + typedef enum _Evas_Text_Style_Type + { + EVAS_TEXT_STYLE_PLAIN, + EVAS_TEXT_STYLE_SHADOW, + EVAS_TEXT_STYLE_OUTLINE, + EVAS_TEXT_STYLE_SOFT_OUTLINE, + EVAS_TEXT_STYLE_GLOW, + EVAS_TEXT_STYLE_OUTLINE_SHADOW, + EVAS_TEXT_STYLE_FAR_SHADOW, + EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW, + EVAS_TEXT_STYLE_SOFT_SHADOW, + EVAS_TEXT_STYLE_FAR_SOFT_SHADOW + } Evas_Text_Style_Type; + + EAPI Evas_Object *evas_object_text_add (Evas *e); + EAPI void evas_object_text_font_source_set (Evas_Object *obj, const char *font); + EAPI const char *evas_object_text_font_source_get (const Evas_Object *obj); + EAPI void evas_object_text_font_set (Evas_Object *obj, const char *font, Evas_Font_Size size); + EAPI void evas_object_text_font_get (const Evas_Object *obj, const char **font, Evas_Font_Size *size); + EAPI void evas_object_text_text_set (Evas_Object *obj, const char *text); + EAPI const char *evas_object_text_text_get (const Evas_Object *obj); + EAPI Evas_Coord evas_object_text_ascent_get (const Evas_Object *obj); + EAPI Evas_Coord evas_object_text_descent_get (const Evas_Object *obj); + EAPI Evas_Coord evas_object_text_max_ascent_get (const Evas_Object *obj); + EAPI Evas_Coord evas_object_text_max_descent_get (const Evas_Object *obj); + EAPI Evas_Coord evas_object_text_horiz_advance_get(const Evas_Object *obj); + EAPI Evas_Coord evas_object_text_vert_advance_get (const Evas_Object *obj); + EAPI Evas_Coord evas_object_text_inset_get (const Evas_Object *obj); + EAPI int evas_object_text_char_pos_get (const Evas_Object *obj, int pos, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch); + EAPI int evas_object_text_char_coords_get (const Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch); + EAPI Evas_Text_Style_Type evas_object_text_style_get (const Evas_Object *obj); + EAPI void evas_object_text_style_set (Evas_Object *obj, Evas_Text_Style_Type type); + EAPI void evas_object_text_shadow_color_set (Evas_Object *obj, int r, int g, int b, int a); + EAPI void evas_object_text_shadow_color_get (const Evas_Object *obj, int *r, int *g, int *b, int *a); + EAPI void evas_object_text_glow_color_set (Evas_Object *obj, int r, int g, int b, int a); + EAPI void evas_object_text_glow_color_get (const Evas_Object *obj, int *r, int *g, int *b, int *a); + EAPI void evas_object_text_glow2_color_set (Evas_Object *obj, int r, int g, int b, int a); + EAPI void evas_object_text_glow2_color_get (const Evas_Object *obj, int *r, int *g, int *b, int *a); + EAPI void evas_object_text_outline_color_set(Evas_Object *obj, int r, int g, int b, int a); + EAPI void evas_object_text_outline_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a); + EAPI void evas_object_text_style_pad_get (const Evas_Object *obj, int *l, int *r, int *t, int *b); + +/* string and font handling */ + EAPI int evas_string_char_next_get (const char *str, int pos, int *decoded); + EAPI int evas_string_char_prev_get (const char *str, int pos, int *decoded); + + EAPI void evas_font_path_clear (Evas *e); + EAPI void evas_font_path_append (Evas *e, const char *path); + EAPI void evas_font_path_prepend (Evas *e, const char *path); + EAPI const Evas_List *evas_font_path_list (const Evas *e); + + EAPI void evas_font_hinting_set (Evas *e, Evas_Font_Hinting_Flags hinting); + EAPI Evas_Font_Hinting_Flags evas_font_hinting_get (const Evas *e); + EAPI Evas_Bool evas_font_hinting_can_hint (const Evas *e, Evas_Font_Hinting_Flags hinting); + + EAPI void evas_font_cache_flush (Evas *e); + EAPI void evas_font_cache_set (Evas *e, int size); + EAPI int evas_font_cache_get (const Evas *e); + + EAPI Evas_List *evas_font_available_list (const Evas *e); + EAPI void evas_font_available_list_free (Evas *e, Evas_List *available); + +/* textblock objects */ + typedef struct _Evas_Textblock_Style Evas_Textblock_Style; + typedef struct _Evas_Textblock_Cursor Evas_Textblock_Cursor; + typedef struct _Evas_Textblock_Rectangle Evas_Textblock_Rectangle; + + struct _Evas_Textblock_Rectangle + { + Evas_Coord x, y, w, h; + }; + + typedef enum _Evas_Textblock_Text_Type + { + EVAS_TEXTBLOCK_TEXT_RAW, + EVAS_TEXTBLOCK_TEXT_PLAIN + } Evas_Textblock_Text_Type; + + EAPI Evas_Object *evas_object_textblock_add(Evas *e); + + EAPI Evas_Textblock_Style *evas_textblock_style_new(void); + EAPI void evas_textblock_style_free(Evas_Textblock_Style *ts); + EAPI void evas_textblock_style_set(Evas_Textblock_Style *ts, const char *text); + EAPI const char *evas_textblock_style_get(const Evas_Textblock_Style *ts); + + EAPI void evas_object_textblock_style_set(Evas_Object *obj, Evas_Textblock_Style *ts); + EAPI const Evas_Textblock_Style *evas_object_textblock_style_get(const Evas_Object *obj); + + EAPI void evas_object_textblock_text_markup_set(Evas_Object *obj, const char *text); + EAPI const char *evas_object_textblock_text_markup_get(const Evas_Object *obj); + + EAPI const Evas_Textblock_Cursor *evas_object_textblock_cursor_get(const Evas_Object *obj); + EAPI Evas_Textblock_Cursor *evas_object_textblock_cursor_new(Evas_Object *obj); + + EAPI void evas_textblock_cursor_free(Evas_Textblock_Cursor *cur); + + EAPI void evas_textblock_cursor_node_first(Evas_Textblock_Cursor *cur); + EAPI void evas_textblock_cursor_node_last(Evas_Textblock_Cursor *cur); + EAPI Evas_Bool evas_textblock_cursor_node_next(Evas_Textblock_Cursor *cur); + EAPI Evas_Bool evas_textblock_cursor_node_prev(Evas_Textblock_Cursor *cur); + EAPI Evas_Bool evas_textblock_cursor_char_next(Evas_Textblock_Cursor *cur); + EAPI Evas_Bool evas_textblock_cursor_char_prev(Evas_Textblock_Cursor *cur); + EAPI void evas_textblock_cursor_char_first(Evas_Textblock_Cursor *cur); + EAPI void evas_textblock_cursor_char_last(Evas_Textblock_Cursor *cur); + EAPI void evas_textblock_cursor_line_first(Evas_Textblock_Cursor *cur); + EAPI void evas_textblock_cursor_line_last(Evas_Textblock_Cursor *cur); + EAPI int evas_textblock_cursor_pos_get(const Evas_Textblock_Cursor *cur); + EAPI void evas_textblock_cursor_pos_set(Evas_Textblock_Cursor *cur, int pos); + EAPI Evas_Bool evas_textblock_cursor_line_set(Evas_Textblock_Cursor *cur, int line); + EAPI int evas_textblock_cursor_compare(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *cur2); + EAPI void evas_textblock_cursor_copy(const Evas_Textblock_Cursor *cur, Evas_Textblock_Cursor *cur_dest); + + EAPI void evas_textblock_cursor_text_append(Evas_Textblock_Cursor *cur, const char *text); + EAPI void evas_textblock_cursor_text_prepend(Evas_Textblock_Cursor *cur, const char *text); + + EAPI void evas_textblock_cursor_format_append(Evas_Textblock_Cursor *cur, const char *format); + EAPI void evas_textblock_cursor_format_prepend(Evas_Textblock_Cursor *cur, const char *format); + EAPI void evas_textblock_cursor_node_delete(Evas_Textblock_Cursor *cur); + EAPI void evas_textblock_cursor_char_delete(Evas_Textblock_Cursor *cur); + EAPI void evas_textblock_cursor_range_delete(Evas_Textblock_Cursor *cur1, Evas_Textblock_Cursor *cur2); + + EAPI const char *evas_textblock_cursor_node_text_get(const Evas_Textblock_Cursor *cur); + EAPI int evas_textblock_cursor_node_text_length_get(const Evas_Textblock_Cursor *cur); + EAPI const char *evas_textblock_cursor_node_format_get(const Evas_Textblock_Cursor *cur); + EAPI char *evas_textblock_cursor_range_text_get(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *cur2, Evas_Textblock_Text_Type format); + + EAPI int evas_textblock_cursor_char_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch); + EAPI int evas_textblock_cursor_line_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch); + EAPI Evas_Bool evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, Evas_Coord y); + EAPI int evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord y); + EAPI Evas_List *evas_textblock_cursor_range_geometry_get(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *cur2); + + EAPI Evas_Bool evas_object_textblock_line_number_geometry_get(const Evas_Object *obj, int line, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch); + EAPI void evas_object_textblock_clear(Evas_Object *obj); + EAPI void evas_object_textblock_size_formatted_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h); + EAPI void evas_object_textblock_size_native_get(const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h); + EAPI void evas_object_textblock_style_insets_get(const Evas_Object *obj, Evas_Coord *l, Evas_Coord *r, Evas_Coord *t, Evas_Coord *b); + + +/* general objects */ + EAPI void evas_object_del (Evas_Object *obj); + + EAPI const char *evas_object_type_get (const Evas_Object *obj); + + EAPI void evas_object_layer_set (Evas_Object *obj, short l); + EAPI short evas_object_layer_get (const Evas_Object *obj); + + EAPI void evas_object_raise (Evas_Object *obj); + EAPI void evas_object_lower (Evas_Object *obj); + EAPI void evas_object_stack_above (Evas_Object *obj, Evas_Object *above); + EAPI void evas_object_stack_below (Evas_Object *obj, Evas_Object *below); + EAPI Evas_Object *evas_object_above_get (const Evas_Object *obj); + EAPI Evas_Object *evas_object_below_get (const Evas_Object *obj); + EAPI Evas_Object *evas_object_bottom_get (const Evas *e); + EAPI Evas_Object *evas_object_top_get (const Evas *e); + + EAPI void evas_object_move (Evas_Object *obj, Evas_Coord x, Evas_Coord y); + EAPI void evas_object_resize (Evas_Object *obj, Evas_Coord w, Evas_Coord h); + EAPI void evas_object_geometry_get (const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h); + + EAPI void evas_object_size_hint_min_get (const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h); + EAPI void evas_object_size_hint_min_set (Evas_Object *obj, Evas_Coord w, Evas_Coord h); + EAPI void evas_object_size_hint_max_get (const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h); + EAPI void evas_object_size_hint_max_set (Evas_Object *obj, Evas_Coord w, Evas_Coord h); + EAPI void evas_object_size_hint_request_get (const Evas_Object *obj, Evas_Coord *w, Evas_Coord *h); + EAPI void evas_object_size_hint_request_set (Evas_Object *obj, Evas_Coord w, Evas_Coord h); + EAPI void evas_object_size_hint_aspect_get (const Evas_Object *obj, Evas_Aspect_Control *aspect, Evas_Coord *w, Evas_Coord *h); + EAPI void evas_object_size_hint_aspect_set (Evas_Object *obj, Evas_Aspect_Control aspect, Evas_Coord w, Evas_Coord h); + + EAPI void evas_object_show (Evas_Object *obj); + EAPI void evas_object_hide (Evas_Object *obj); + EAPI Evas_Bool evas_object_visible_get (const Evas_Object *obj); + + EAPI void evas_object_render_op_set (Evas_Object *obj, Evas_Render_Op op); + EAPI Evas_Render_Op evas_object_render_op_get (const Evas_Object *obj); + + EAPI void evas_object_anti_alias_set (Evas_Object *obj, Evas_Bool antialias); + EAPI Evas_Bool evas_object_anti_alias_get (const Evas_Object *obj); + + EAPI void evas_object_color_set (Evas_Object *obj, int r, int g, int b, int a); + EAPI void evas_object_color_get (const Evas_Object *obj, int *r, int *g, int *b, int *a); + + EAPI void evas_object_color_interpolation_set (Evas_Object *obj, int color_space); + EAPI int evas_object_color_interpolation_get (const Evas_Object *obj); + + EAPI void evas_object_clip_set (Evas_Object *obj, Evas_Object *clip); + EAPI Evas_Object *evas_object_clip_get (const Evas_Object *obj); + EAPI void evas_object_clip_unset (Evas_Object *obj); + EAPI const Evas_List *evas_object_clipees_get (const Evas_Object *obj); + + EAPI void evas_object_data_set (Evas_Object *obj, const char *key, const void *data); + EAPI void *evas_object_data_get (const Evas_Object *obj, const char *key); + EAPI void *evas_object_data_del (Evas_Object *obj, const char *key); + + EAPI void evas_object_name_set (Evas_Object *obj, const char *name); + EAPI const char *evas_object_name_get (const Evas_Object *obj); + EAPI Evas_Object *evas_object_name_find (const Evas *e, const char *name); + + EAPI Evas *evas_object_evas_get (const Evas_Object *obj); + + EAPI Evas_Object *evas_object_top_at_xy_get (const Evas *e, Evas_Coord x, Evas_Coord y, Evas_Bool include_pass_events_objects, Evas_Bool include_hidden_objects); + EAPI Evas_Object *evas_object_top_at_pointer_get (const Evas *e); + EAPI Evas_Object *evas_object_top_in_rectangle_get (const Evas *e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Evas_Bool include_pass_events_objects, Evas_Bool include_hidden_objects); + + EAPI Evas_List *evas_objects_at_xy_get (const Evas *e, Evas_Coord x, Evas_Coord y, Evas_Bool include_pass_events_objects, Evas_Bool include_hidden_objects); + EAPI Evas_List *evas_objects_in_rectangle_get (const Evas *e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Evas_Bool include_pass_events_objects, Evas_Bool include_hidden_objects); + +/* smart objects */ + EAPI Evas_Smart *evas_smart_new (const char *name, void (*func_add) (Evas_Object *obj), void (*func_del) (Evas_Object *obj), void (*func_layer_set) (Evas_Object *obj, int l), void (*func_raise) (Evas_Object *obj), void (*func_lower) (Evas_Object *obj), void (*func_stack_above) (Evas_Object *obj, Evas_Object *above), void (*func_stack_below) (Evas_Object *obj, Evas_Object *below), void (*func_move) (Evas_Object *obj, Evas_Coord x, Evas_Coord y), void (*func_resize) (Evas_Object *obj, Evas_Coord w, Evas_Coord h), void (*func_show) (Evas_Object *obj), void (*func_hide) (Evas_Object *obj), void (*func_color_set) (Evas_Object *obj, int r, int g, int b, int a), void (*func_clip_set) (Evas_Object *obj, Evas_Object *clip), void (*func_clip_unset) (Evas_Object *obj), const void *data); + EAPI void evas_smart_free (Evas_Smart *s); + EAPI Evas_Smart *evas_smart_class_new (const Evas_Smart_Class *sc); + EAPI const Evas_Smart_Class *evas_smart_class_get (const Evas_Smart *s); + + EAPI void *evas_smart_data_get (const Evas_Smart *s); + + EAPI Evas_Object *evas_object_smart_add (Evas *e, Evas_Smart *s); + EAPI void evas_object_smart_member_add (Evas_Object *obj, Evas_Object *smart_obj); + EAPI void evas_object_smart_member_del (Evas_Object *obj); + EAPI Evas_Object *evas_object_smart_parent_get (const Evas_Object *obj); + EAPI Evas_List *evas_object_smart_members_get (const Evas_Object *obj); + EAPI Evas_Smart *evas_object_smart_smart_get (const Evas_Object *obj); + EAPI void *evas_object_smart_data_get (const Evas_Object *obj); + EAPI void evas_object_smart_data_set (Evas_Object *obj, void *data); + EAPI void evas_object_smart_callback_add (Evas_Object *obj, const char *event, void (*func) (void *data, Evas_Object *obj, void *event_info), const void *data); + EAPI void *evas_object_smart_callback_del (Evas_Object *obj, const char *event, void (*func) (void *data, Evas_Object *obj, void *event_info)); + EAPI void evas_object_smart_callback_call (Evas_Object *obj, const char *event, void *event_info); + +/* events */ + EAPI void evas_event_freeze (Evas *e); + EAPI void evas_event_thaw (Evas *e); + EAPI int evas_event_freeze_get (const Evas *e); + EAPI void evas_event_feed_mouse_down (Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data); + EAPI void evas_event_feed_mouse_up (Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data); + EAPI void evas_event_feed_mouse_move (Evas *e, int x, int y, unsigned int timestamp, const void *data); + EAPI void evas_event_feed_mouse_in (Evas *e, unsigned int timestamp, const void *data); + EAPI void evas_event_feed_mouse_out (Evas *e, unsigned int timestamp, const void *data); + EAPI void evas_event_feed_mouse_cancel (Evas *e, unsigned int timestamp, const void *data); + EAPI void evas_event_feed_mouse_wheel (Evas *e, int direction, int z, unsigned int timestamp, const void *data); + EAPI void evas_event_feed_key_down (Evas *e, const char *keyname, const char *key, const char *string, const char *compose, unsigned int timestamp, const void *data); + EAPI void evas_event_feed_key_up (Evas *e, const char *keyname, const char *key, const char *string, const char *compose, unsigned int timestamp, const void *data); + EAPI void evas_event_feed_hold (Evas *e, int hold, unsigned int timestamp, const void *data); + + EAPI void evas_object_focus_set (Evas_Object *obj, Evas_Bool focus); + EAPI Evas_Bool evas_object_focus_get (const Evas_Object *obj); + + EAPI Evas_Object *evas_focus_get (const Evas *e); + + EAPI const Evas_Modifier *evas_key_modifier_get (const Evas *e); + EAPI const Evas_Lock *evas_key_lock_get (const Evas *e); + + EAPI Evas_Bool evas_key_modifier_is_set (const Evas_Modifier *m, const char *keyname); + + EAPI Evas_Bool evas_key_lock_is_set (const Evas_Lock *l, const char *keyname); + + EAPI void evas_key_modifier_add (Evas *e, const char *keyname); + EAPI void evas_key_modifier_del (Evas *e, const char *keyname); + EAPI void evas_key_lock_add (Evas *e, const char *keyname); + EAPI void evas_key_lock_del (Evas *e, const char *keyname); + + EAPI void evas_key_modifier_on (Evas *e, const char *keyname); + EAPI void evas_key_modifier_off (Evas *e, const char *keyname); + EAPI void evas_key_lock_on (Evas *e, const char *keyname); + EAPI void evas_key_lock_off (Evas *e, const char *keyname); + + EAPI Evas_Modifier_Mask evas_key_modifier_mask_get (const Evas *e, const char *keyname); + + EAPI Evas_Bool evas_object_key_grab (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers, Evas_Bool exclusive); + EAPI void evas_object_key_ungrab (Evas_Object *obj, const char *keyname, Evas_Modifier_Mask modifiers, Evas_Modifier_Mask not_modifiers); + + EAPI void evas_object_pass_events_set (Evas_Object *obj, Evas_Bool pass); + EAPI Evas_Bool evas_object_pass_events_get (const Evas_Object *obj); + EAPI void evas_object_repeat_events_set (Evas_Object *obj, Evas_Bool repeat); + EAPI Evas_Bool evas_object_repeat_events_get (const Evas_Object *obj); + EAPI void evas_object_propagate_events_set (Evas_Object *obj, Evas_Bool prop); + EAPI Evas_Bool evas_object_propagate_events_get (const Evas_Object *obj); + EAPI void evas_object_pointer_mode_set (Evas_Object *obj, Evas_Object_Pointer_Mode setting); + EAPI Evas_Object_Pointer_Mode evas_object_pointer_mode_get(const Evas_Object *obj); + + + EAPI void evas_object_precise_is_inside_set (Evas_Object *obj, Evas_Bool precise); + EAPI Evas_Bool evas_object_precise_is_inside_get (const Evas_Object *obj); + + EAPI void evas_object_event_callback_add (Evas_Object *obj, Evas_Callback_Type type, void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info), const void *data); + EAPI void *evas_object_event_callback_del (Evas_Object *obj, Evas_Callback_Type type, void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info)); + EAPI void *evas_object_event_callback_del_full(Evas_Object *obj, Evas_Callback_Type type, void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info), const void *data); + + EAPI int evas_async_events_fd_get (void); + EAPI int evas_async_events_process (void); + EAPI Evas_Bool evas_async_events_put (void *target, Evas_Callback_Type type, void *event_info, void (*func)(void *target, Evas_Callback_Type type, void *event_info)); + + EAPI void evas_object_intercept_show_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data); + EAPI void *evas_object_intercept_show_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)); + EAPI void evas_object_intercept_hide_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data); + EAPI void *evas_object_intercept_hide_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)); + EAPI void evas_object_intercept_move_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y), const void *data); + EAPI void *evas_object_intercept_move_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y)); + EAPI void evas_object_intercept_resize_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord w, Evas_Coord h), const void *data); + EAPI void *evas_object_intercept_resize_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Coord w, Evas_Coord h)); + EAPI void evas_object_intercept_raise_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data); + EAPI void *evas_object_intercept_raise_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)); + EAPI void evas_object_intercept_lower_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data); + EAPI void *evas_object_intercept_lower_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)); + EAPI void evas_object_intercept_stack_above_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above), const void *data); + EAPI void *evas_object_intercept_stack_above_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *above)); + EAPI void evas_object_intercept_stack_below_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below), const void *data); + EAPI void *evas_object_intercept_stack_below_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *below)); + EAPI void evas_object_intercept_layer_set_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l), const void *data); + EAPI void *evas_object_intercept_layer_set_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int l)); + EAPI void evas_object_intercept_color_set_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int r, int g, int b, int a), const void *data); + EAPI void *evas_object_intercept_color_set_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, int r, int g, int b, int a)); + EAPI void evas_object_intercept_clip_set_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *clip), const void *data); + EAPI void *evas_object_intercept_clip_set_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Evas_Object *clip)); + EAPI void evas_object_intercept_clip_unset_callback_add (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), const void *data); + EAPI void *evas_object_intercept_clip_unset_callback_del (Evas_Object *obj, void (*func) (void *data, Evas_Object *obj)); + +/* Evas utility routines for color space conversions */ +/* hsv color space has h in the range 0.0 to 360.0, and s,v in the range 0.0 to 1.0 */ +/* rgb color space has r,g,b in the range 0 to 255 */ + EAPI void evas_color_hsv_to_rgb (float h, float s, float v, int *r, int *g, int *b); + EAPI void evas_color_rgb_to_hsv (int r, int g, int b, float *h, float *s, float *v); + +/* argb color space has a,r,g,b in the range 0 to 255 */ + EAPI void evas_color_argb_premul (int a, int *r, int *g, int *b); + EAPI void evas_color_argb_unpremul (int a, int *r, int *g, int *b); + + EAPI void evas_data_argb_premul (unsigned int *data, unsigned int len); + EAPI void evas_data_argb_unpremul (unsigned int *data, unsigned int len); + +/* Evas imaging api - exports some of the comon gfx engine routines */ +/* this is not complete and should be considered experimental. use at your */ +/* own risk */ + + typedef struct _Evas_Imaging_Image Evas_Imaging_Image; + typedef struct _Evas_Imaging_Font Evas_Imaging_Font; + + EAPI Evas_Imaging_Image *evas_imaging_image_load (const char *file, const char *key); + EAPI void evas_imaging_image_free (Evas_Imaging_Image *im); + EAPI void evas_imaging_image_size_get (const Evas_Imaging_Image *im, int *w, int *h); + EAPI Evas_Bool evas_imaging_image_alpha_get (const Evas_Imaging_Image *im); + EAPI void evas_imaging_image_cache_set (int bytes); + EAPI int evas_imaging_image_cache_get (void); + + EAPI void evas_imaging_font_hinting_set (Evas_Font_Hinting_Flags hinting); + EAPI Evas_Font_Hinting_Flags evas_imaging_font_hinting_get (void); + EAPI Evas_Bool evas_imaging_font_hinting_can_hint (Evas_Font_Hinting_Flags hinting); + + EAPI Evas_Imaging_Font *evas_imaging_font_load (const char *file, const char *key, int size); + EAPI void evas_imaging_font_free (Evas_Imaging_Font *fn); + EAPI int evas_imaging_font_ascent_get (const Evas_Imaging_Font *fn); + EAPI int evas_imaging_font_descent_get (const Evas_Imaging_Font *fn); + EAPI int evas_imaging_font_max_ascent_get (const Evas_Imaging_Font *fn); + EAPI int evas_imaging_font_max_descent_get (const Evas_Imaging_Font *fn); + EAPI int evas_imaging_font_line_advance_get (const Evas_Imaging_Font *fn); + EAPI void evas_imaging_font_string_advance_get (const Evas_Imaging_Font *fn, char *str, int *x, int *y); + EAPI void evas_imaging_font_string_size_query (const Evas_Imaging_Font *fn, char *str, int *w, int *h); + EAPI int evas_imaging_font_string_inset_get (const Evas_Imaging_Font *fn, char *str); + EAPI int evas_imaging_font_string_char_coords_get (const Evas_Imaging_Font *fn, char *str, int pos, int *cx, int *cy, int *cw, int *ch); + EAPI int evas_imaging_font_string_char_at_coords_get (const Evas_Imaging_Font *fn, char *str, int x, int y, int *cx, int *cy, int *cw, int *ch); + + EAPI void evas_imaging_font_cache_set (int bytes); + EAPI int evas_imaging_font_cache_get (void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/lib/Evas_Data.h b/src/lib/Evas_Data.h new file mode 100644 index 0000000..63b8cd3 --- /dev/null +++ b/src/lib/Evas_Data.h @@ -0,0 +1,175 @@ +#ifndef _EVAS_DATA_H +#define _EVAS_DATA_H + +#ifdef EAPI +# undef EAPI +#endif + +#ifdef _WIN32 +# ifdef EFL_EVAS_BUILD +# ifdef DLL_EXPORT +# define EAPI __declspec(dllexport) +# else +# define EAPI +# endif /* ! DLL_EXPORT */ +# else +# define EAPI __declspec(dllimport) +# endif /* ! EFL_EVAS_BUILD */ +#else +# ifdef __GNUC__ +# if __GNUC__ >= 4 +# define EAPI __attribute__ ((visibility("default"))) +# else +# define EAPI +# endif +# else +# define EAPI +# endif +#endif /* ! _WIN32 */ + +/** + * @file + * @brief These routines are used for Evas data types. + */ + +typedef unsigned char Evas_Bool; + +typedef struct _Evas_Array Evas_Array; /**< A generic vector */ +typedef struct _Evas_Array_Hash Evas_Array_Hash; +typedef struct _Evas_Hash Evas_Hash; /**< A Hash table handle */ +typedef struct _Evas_List Evas_List; /**< A generic linked list node handle */ +typedef struct _Evas_Object_List Evas_Object_List; + + +struct _Evas_Array /** An array of data */ +{ + void **data; /**< Pointer to a vector of pointer to payload */ + unsigned int total; /**< Total number of slot in the vector */ + unsigned int count; /**< Number of activ slot in the vector */ + unsigned int step; /**< How much must we grow the vector When it is full */ +}; + +struct _Evas_Hash +{ + int population; + Evas_Object_List *buckets[256]; +}; + +struct _Evas_List /** A linked list node */ +{ + void *data; /**< Pointer to list element payload */ + Evas_List *next; /**< Next member in the list */ + Evas_List *prev; /**< Previous member in the list */ + struct _Evas_List_Accounting *accounting; /**< Private list accounting info - don't touch */ +}; + +struct _Evas_Object_List +{ + Evas_Object_List *next, *prev; + Evas_Object_List *last; +}; + + +#ifdef __cplusplus +extern "C" { +#endif + + /* + * Evas Array functions + */ + + EAPI Evas_Array *evas_array_new (unsigned int step); + EAPI void evas_array_setup (Evas_Array *array, unsigned int step); + EAPI void evas_array_free (Evas_Array *array); + EAPI void evas_array_append (Evas_Array *array, void *data); + EAPI void *evas_array_get (Evas_Array *array, unsigned int index); + EAPI void evas_array_clean (Evas_Array *array); + EAPI void evas_array_flush (Evas_Array *array); + EAPI void evas_array_remove (Evas_Array *array, Evas_Bool (*keep)(void *data, void *gdata), void *gdata); + + + /* + * Evas Array Hash functions + */ + + EAPI Evas_Array_Hash *evas_array_hash_new (void); + EAPI void evas_array_hash_free (Evas_Array_Hash *hash); + EAPI void evas_array_hash_add (Evas_Array_Hash *hash, int key, int data); + EAPI int evas_array_hash_search (Evas_Array_Hash *hash, int key); + + + /* + * Evas Hash functions + */ + + /* FIXME: add: + * api to add find, del members by data, size not just string and also + * provide hash generation functions settable by the app + * + * do we really need this? hmmm - let me think... there may be a better way + */ + EAPI Evas_Hash *evas_hash_add (Evas_Hash *hash, const char *key, const void *data); + EAPI Evas_Hash *evas_hash_direct_add (Evas_Hash *hash, const char *key, const void *data); + EAPI Evas_Hash *evas_hash_del (Evas_Hash *hash, const char *key, const void *data); + EAPI void *evas_hash_find (const Evas_Hash *hash, const char *key); + EAPI void *evas_hash_modify (Evas_Hash *hash, const char *key, const void *data); + EAPI int evas_hash_size (const Evas_Hash *hash); + EAPI void evas_hash_free (Evas_Hash *hash); + EAPI void evas_hash_foreach (const Evas_Hash *hash, Evas_Bool (*func) (const Evas_Hash *hash, const char *key, void *data, void *fdata), const void *fdata); + EAPI int evas_hash_alloc_error (void); + + + /* + * Evas List functions + */ + + EAPI Evas_List *evas_list_append (Evas_List *list, const void *data); + EAPI Evas_List *evas_list_prepend (Evas_List *list, const void *data); + EAPI Evas_List *evas_list_append_relative (Evas_List *list, const void *data, const void *relative); + EAPI Evas_List *evas_list_append_relative_list (Evas_List *list, const void *data, Evas_List *relative); + EAPI Evas_List *evas_list_prepend_relative (Evas_List *list, const void *data, const void *relative); + EAPI Evas_List *evas_list_prepend_relative_list (Evas_List *list, const void *data, Evas_List *relative); + EAPI Evas_List *evas_list_remove (Evas_List *list, const void *data); + EAPI Evas_List *evas_list_remove_list (Evas_List *list, Evas_List *remove_list); + EAPI Evas_List *evas_list_promote_list (Evas_List *list, Evas_List *move_list); + EAPI void *evas_list_find (const Evas_List *list, const void *data); + EAPI Evas_List *evas_list_find_list (const Evas_List *list, const void *data); + EAPI Evas_List *evas_list_free (Evas_List *list); + EAPI Evas_List *evas_list_last (const Evas_List *list); + EAPI Evas_List *evas_list_next (const Evas_List *list); + EAPI Evas_List *evas_list_prev (const Evas_List *list); + EAPI void *evas_list_data (const Evas_List *list); + EAPI int evas_list_count (const Evas_List *list); + EAPI void *evas_list_nth (const Evas_List *list, int n); + EAPI Evas_List *evas_list_nth_list (const Evas_List *list, int n); + EAPI Evas_List *evas_list_reverse (Evas_List *list); + EAPI Evas_List *evas_list_sort (Evas_List *list, int size, int(*func)(void*,void*)); + EAPI int evas_list_alloc_error (void); + + + /* + * Evas Object List functions + */ + + EAPI void *evas_object_list_append (void *in_list, void *in_item); + EAPI void *evas_object_list_prepend (void *in_list, void *in_item); + EAPI void *evas_object_list_append_relative (void *in_list, void *in_item, void *in_relative); + EAPI void *evas_object_list_prepend_relative (void *in_list, void *in_item, void *in_relative); + EAPI void *evas_object_list_remove (void *in_list, void *in_item); + EAPI void *evas_object_list_find (void *in_list, void *in_item); + + + /* + * Evas Stringshare functions + */ + + EAPI void evas_stringshare_init (void); /* not implemented */ + EAPI void evas_stringshare_shutdown (void); /* not implemented */ + EAPI const char *evas_stringshare_add (const char *str); + EAPI void evas_stringshare_del (const char *str); + +#ifdef __cplusplus +} +#endif + +#endif /* _EVAS_DATA_H */ diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am new file mode 100644 index 0000000..ad080bf --- /dev/null +++ b/src/lib/Makefile.am @@ -0,0 +1,53 @@ + +MAINTAINERCLEANFILES = Makefile.in + +SUBDIRS = canvas data cache file engines imaging include + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/include \ +-DPACKAGE_BIN_DIR=\"$(bindir)\" \ +-DPACKAGE_LIB_DIR=\"$(libdir)\" \ +-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ +@FREETYPE_CFLAGS@ \ +@EET_CFLAGS@ \ +@FONTCONFIG_CFLAGS@ \ +@pthread_cflags@ + +AM_CFLAGS = @WIN32_CFLAGS@ + +lib_LTLIBRARIES = libevas.la + +include_HEADERS = Evas.h Evas_Data.h + +libevas_la_SOURCES = main.c + +libevas_la_LIBADD = \ +canvas/libevas_canvas.la \ +data/libevas_data.la \ +file/libevas_file.la \ +cache/libevas_cache.la \ +imaging/libevas_imaging.la \ +engines/common/libevas_engine_common.la \ +engines/common_16/libevas_engine_common_16.la \ +-lm \ +@fnmatch_libs@ \ +@dlopen_libs@ \ +@FREETYPE_LIBS@ \ +@EET_LIBS@ \ +@FONTCONFIG_LIBS@ \ +@pthread_libs@ + +libevas_la_DEPENDENCIES = \ +$(top_builddir)/config.h \ +canvas/libevas_canvas.la \ +data/libevas_data.la \ +file/libevas_file.la \ +cache/libevas_cache.la \ +imaging/libevas_imaging.la \ +engines/common/libevas_engine_common.la \ +engines/common_16/libevas_engine_common_16.la + +libevas_la_LDFLAGS = @lt_no_undefined@ @lt_enable_auto_import@ -version-info @version_info@ + diff --git a/src/lib/cache/.cvsignore b/src/lib/cache/.cvsignore new file mode 100644 index 0000000..b477e9c --- /dev/null +++ b/src/lib/cache/.cvsignore @@ -0,0 +1,6 @@ +Makefile.in +Makefile +.deps +.libs +*.la +*.lo diff --git a/src/lib/cache/Makefile.am b/src/lib/cache/Makefile.am new file mode 100644 index 0000000..30b7943 --- /dev/null +++ b/src/lib/cache/Makefile.am @@ -0,0 +1,19 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = -I. \ + -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/lib/include \ + -DPACKAGE_BIN_DIR=\"$(bindir)\" \ + -DPACKAGE_LIB_DIR=\"$(libdir)\" \ + -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ + @FREETYPE_CFLAGS@ + +noinst_LTLIBRARIES = libevas_cache.la +libevas_cache_la_SOURCES = \ +evas_cache_image.c \ +evas_cache_engine_image.c + +libevas_cache_la_DEPENDENCIES = $(top_builddir)/config.h + +EXTRA_DIST = evas_cache.h diff --git a/src/lib/cache/evas_cache.h b/src/lib/cache/evas_cache.h new file mode 100644 index 0000000..51ffc46 --- /dev/null +++ b/src/lib/cache/evas_cache.h @@ -0,0 +1,163 @@ +#ifndef _EVAS_CACHE_H +#define _EVAS_CACHE_H + + +typedef struct _Evas_Cache_Image Evas_Cache_Image; +typedef struct _Evas_Cache_Image_Func Evas_Cache_Image_Func; +typedef struct _Evas_Cache_Engine_Image Evas_Cache_Engine_Image; +typedef struct _Evas_Cache_Engine_Image_Func Evas_Cache_Engine_Image_Func; + + +struct _Evas_Cache_Image_Func +{ + Image_Entry *(*alloc)(void); + void (*dealloc)(Image_Entry *im); + + /* The cache provide some helpers for surface manipulation. */ + int (*surface_alloc)(Image_Entry *im, int w, int h); + void (*surface_delete)(Image_Entry *im); + DATA32 *(*surface_pixels)(Image_Entry *im); + + /* The cache is doing the allocation and deallocation, you must just do the rest. */ + int (*constructor)(Image_Entry *im); + void (*destructor)(Image_Entry *im); + + void (*dirty_region)(Image_Entry *im, int x, int y, int w, int h); + /* Only called when references > 0. Need to provide a fresh copie of im. */ + /* The destination surface does have a surface, but no allocated pixel data. */ + int (*dirty)(Image_Entry *dst, const Image_Entry *src); + /* Only called when references == 1. We will call drop on `im'. */ + /* The destination surface does not have any surface. */ + int (*size_set)(Image_Entry *dst, const Image_Entry *src, int w, int h); + + /* The destination surface does not have any surface. */ + int (*copied_data)(Image_Entry *dst, int w, int h, DATA32 *image_data, int alpha, int cspace); + /* The destination surface does not have any surface. */ + int (*data)(Image_Entry *dst, int w, int h, DATA32 *image_data, int alpha, int cspace); + int (*color_space)(Image_Entry *dst, int cspace); + + /* This function need to update im->w and im->h. */ + int (*load)(Image_Entry *im); + int (*mem_size_get)(Image_Entry *im); + void (*debug)(const char *context, Image_Entry *im); +}; + +struct _Evas_Cache_Image +{ + Evas_Cache_Image_Func func; + + Evas_Object_List *dirty; + + Evas_Object_List *lru; + Evas_Object_List *lru_nodata; + Evas_Hash *inactiv; + Evas_Hash *activ; + void *data; + + int usage; + int limit; + int references; +}; + +struct _Evas_Cache_Engine_Image_Func +{ + /* Must return a char* allocated with evas_stringshare_add. */ + char* (*key)(Image_Entry *im, const char *file, const char *key, RGBA_Image_Loadopts *lo, int *error); + + Engine_Image_Entry* (*alloc)(void); + void (*dealloc)(Engine_Image_Entry *eim); + + int (*constructor)(Engine_Image_Entry *eim, void* data); + void (*destructor)(Engine_Image_Entry *eim); + + void (*dirty_region)(Engine_Image_Entry *eim, int x, int y, int w, int h); + /* Only called when references > 0. Need to provide a fresh copie of im. */ + int (*dirty)(Engine_Image_Entry *dst, const Engine_Image_Entry *src); + /* Only called when references == 1. We will call drop on `im'. */ + int (*size_set)(Engine_Image_Entry *dst, const Engine_Image_Entry *src); + + int (*update_data)(Engine_Image_Entry* dst, void* data); + + void (*load)(Engine_Image_Entry *eim, const Image_Entry* im); + int (*mem_size_get)(Engine_Image_Entry *eim); + void (*debug)(const char* context, Engine_Image_Entry *eim); +}; + +struct _Evas_Cache_Engine_Image +{ + Evas_Cache_Engine_Image_Func func; + + Evas_Object_List* dirty; + + Evas_Hash* activ; + Evas_Hash* inactiv; + Evas_Object_List* lru; + + Evas_Cache_Image* parent; + Evas_Cache_Engine_Image* brother; + + int usage; + int limit; + + int references; +}; + + +#ifdef __cplusplus +extern "C" { +#endif + + +EAPI Evas_Cache_Image* evas_cache_image_init(const Evas_Cache_Image_Func *cb); +EAPI void evas_cache_image_shutdown(Evas_Cache_Image *cache); +EAPI Image_Entry* evas_cache_image_request(Evas_Cache_Image *cache, const char *file, const char *key, RGBA_Image_Loadopts *lo, int *error); +EAPI void evas_cache_image_drop(Image_Entry *im); +EAPI void evas_cache_image_data_not_needed(Image_Entry *im); +EAPI int evas_cache_image_flush(Evas_Cache_Image *cache); +EAPI void evas_cache_private_set(Evas_Cache_Image *cache, const void *data); +EAPI void* evas_cache_private_get(Evas_Cache_Image *cache); +EAPI void* evas_cache_private_from_image_entry_get(Image_Entry *im); + +EAPI int evas_cache_image_usage_get(Evas_Cache_Image *cache); +EAPI int evas_cache_image_get(Evas_Cache_Image *cache); +EAPI void evas_cache_image_set(Evas_Cache_Image *cache, int size); + +EAPI Image_Entry* evas_cache_image_alone(Image_Entry *im); +EAPI Image_Entry* evas_cache_image_dirty(Image_Entry *im, int x, int y, int w, int h); +EAPI void evas_cache_image_load_data(Image_Entry *im); +EAPI void evas_cache_image_surface_alloc(Image_Entry *im, int w, int h); +EAPI DATA32* evas_cache_image_pixels(Image_Entry *im); +EAPI Image_Entry* evas_cache_image_copied_data(Evas_Cache_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace); +EAPI Image_Entry* evas_cache_image_data(Evas_Cache_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace); +EAPI void evas_cache_image_colorspace(Image_Entry *im, int cspace); +EAPI Image_Entry* evas_cache_image_empty(Evas_Cache_Image *cache); +EAPI Image_Entry* evas_cache_image_size_set(Image_Entry *im, int w, int h); + +EAPI Evas_Cache_Engine_Image* evas_cache_engine_image_init(const Evas_Cache_Engine_Image_Func *cb, Evas_Cache_Image *parent); +EAPI void evas_cache_engine_image_shutdown(Evas_Cache_Engine_Image *cache); + +EAPI void evas_cache_engine_image_shutdown(Evas_Cache_Engine_Image *cache); +EAPI int evas_cache_engine_image_usage_get(Evas_Cache_Engine_Image *cache); +EAPI int evas_cache_engine_image_get(Evas_Cache_Engine_Image *cache); +EAPI void evas_cache_engine_image_set(Evas_Cache_Engine_Image *cache, int limit); + +EAPI Engine_Image_Entry* evas_cache_engine_image_request(Evas_Cache_Engine_Image *cache, const char *file, const char *key, RGBA_Image_Loadopts *lo, void *engine_data, int *error); +EAPI void evas_cache_engine_parent_not_needed(Engine_Image_Entry *eim); +EAPI Engine_Image_Entry* evas_cache_engine_image_engine(Evas_Cache_Engine_Image *cache, void *engine_data); +EAPI void evas_cache_engine_image_drop(Engine_Image_Entry *eim); +EAPI Engine_Image_Entry* evas_cache_engine_image_alone(Engine_Image_Entry *eim, void *data); +EAPI Engine_Image_Entry* evas_cache_engine_image_dirty(Engine_Image_Entry *eim, int x, int y, int w, int h); +EAPI Engine_Image_Entry* evas_cache_engine_image_copied_data(Evas_Cache_Engine_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace, void *engine_data); +EAPI Engine_Image_Entry* evas_cache_engine_image_data(Evas_Cache_Engine_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace, void *engine_data); +EAPI void evas_cache_engine_image_colorspace(Engine_Image_Entry *eim, int cspace, void *engine_data); +EAPI Engine_Image_Entry* evas_cache_engine_image_size_set(Engine_Image_Entry *eim, int w, int h); + +EAPI void evas_cache_engine_image_load_data(Engine_Image_Entry *eim); + + +#ifdef __cplusplus +} +#endif + + +#endif /* _EVAS_CACHE_H */ diff --git a/src/lib/cache/evas_cache_engine_image.c b/src/lib/cache/evas_cache_engine_image.c new file mode 100644 index 0000000..9c4ddae --- /dev/null +++ b/src/lib/cache/evas_cache_engine_image.c @@ -0,0 +1,692 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include + +#include "evas_common.h" +#include "evas_private.h" + +static void +_evas_cache_engine_image_make_dirty(Evas_Cache_Engine_Image *cache, + Engine_Image_Entry *eim) +{ + eim->flags.cached = 1; + eim->flags.dirty = 1; + eim->flags.loaded = 1; + eim->flags.activ = 0; + cache->dirty = evas_object_list_prepend(cache->dirty, eim); +} + +static void +_evas_cache_engine_image_make_active(Evas_Cache_Engine_Image *cache, + Engine_Image_Entry *eim, + const char *key) +{ + eim->flags.cached = 1; + eim->flags.activ = 1; + eim->flags.dirty = 0; + cache->activ = evas_hash_add(cache->activ, key, eim); +} + +static void +_evas_cache_engine_image_make_inactive(Evas_Cache_Engine_Image *cache, + Engine_Image_Entry *eim, + const char *key) +{ + eim->flags.cached = 1; + eim->flags.dirty = 0; + eim->flags.activ = 0; + cache->inactiv = evas_hash_add(cache->inactiv, key, eim); + cache->lru = evas_object_list_prepend(cache->lru, eim); + cache->usage += cache->func.mem_size_get(eim); +} + +static void +_evas_cache_engine_image_remove_activ(Evas_Cache_Engine_Image *cache, + Engine_Image_Entry *eim) +{ + if (eim->flags.cached) + { + if (eim->flags.dirty) + { + cache->dirty = evas_object_list_remove(cache->dirty, eim); + } + else + if (eim->flags.activ) + { + cache->activ = evas_hash_del(cache->activ, eim->cache_key, eim); + } + else + { + cache->usage -= cache->func.mem_size_get(eim); + cache->inactiv = evas_hash_del(cache->inactiv, eim->cache_key, eim); + cache->lru = evas_object_list_remove(cache->lru, eim); + } + eim->flags.cached = 0; + eim->flags.dirty = 0; + eim->flags.activ = 0; + } +} + +static Engine_Image_Entry * +_evas_cache_engine_image_alloc(Evas_Cache_Engine_Image *cache, + Image_Entry *ie, + const char *hkey) +{ + Engine_Image_Entry *eim; + + assert(cache); + + if (cache->func.alloc) + eim = cache->func.alloc(); + else + eim = malloc(sizeof (Engine_Image_Entry)); + + if (!eim) goto on_error; + memset(eim, 0, sizeof (Engine_Image_Entry)); + + eim->cache = cache; + if (ie) + { + eim->w = ie->w; + eim->h = ie->h; + eim->src = ie; + eim->flags.need_parent = 1; + } + else + { + eim->w = -1; + eim->h = -1; + eim->flags.need_parent = 0; + eim->src = NULL; + } + + eim->flags.cached = 0; + eim->references = 0; + eim->cache_key = hkey; + + if (hkey) + _evas_cache_engine_image_make_active(cache, eim, hkey); + else + _evas_cache_engine_image_make_dirty(cache, eim); + + return eim; + + on_error: + if (eim) + evas_cache_engine_image_drop(eim); + evas_stringshare_del(hkey); + evas_cache_image_drop(ie); + return NULL; +} + +static void +_evas_cache_engine_image_dealloc(Evas_Cache_Engine_Image *cache, Engine_Image_Entry *eim) +{ + Image_Entry *im; + + if (cache->func.debug) cache->func.debug("delete", eim); + + _evas_cache_engine_image_remove_activ(cache, eim); + + im = eim->src; + cache->func.destructor(eim); + if (im) evas_cache_image_drop(im); + + if (cache->func.dealloc) + { + cache->func.dealloc(eim); + } + else + { + memset(eim, 0, sizeof (Engine_Image_Entry)); + free(eim); + } +} + +EAPI int +evas_cache_engine_image_usage_get(Evas_Cache_Engine_Image *cache) +{ + assert(cache != NULL); + + return cache->usage; +} + +EAPI int +evas_cache_engine_image_get(Evas_Cache_Engine_Image *cache) +{ + assert(cache != NULL); + + return cache->limit; +} + +EAPI void +evas_cache_engine_image_set(Evas_Cache_Engine_Image *cache, int limit) +{ + assert(cache != NULL); + + cache->limit = limit; +} + +EAPI Evas_Cache_Engine_Image * +evas_cache_engine_image_init(const Evas_Cache_Engine_Image_Func *cb, Evas_Cache_Image *parent) +{ + Evas_Cache_Engine_Image *new; + + new = malloc(sizeof (Evas_Cache_Engine_Image)); + if (!new) + return NULL; + + new->func = *cb; + + new->limit = 0; + new->usage = 0; + + new->dirty = NULL; + new->lru = NULL; + new->activ = NULL; + new->inactiv = NULL; + + new->parent = parent; + parent->references++; + + new->brother = NULL; + + return new; +} + +EAPI Evas_Cache_Engine_Image * +evas_cache_engine_image_dup(const Evas_Cache_Engine_Image_Func *cb, Evas_Cache_Engine_Image *brother) +{ + Evas_Cache_Engine_Image *new; + + new = malloc(sizeof (Evas_Cache_Engine_Image)); + if (!new) + return NULL; + + new->func = brother->func; + +#define ORD(Func) if (cb->Func) new->func.Func = cb->Func; + + ORD(key); + ORD(constructor); + ORD(destructor); + ORD(dirty_region); + ORD(dirty); + ORD(size_set); + ORD(update_data); + ORD(load); + ORD(mem_size_get); + ORD(debug); + +#undef ORD + + new->limit = -1; + new->usage = 0; + new->references = 1; + + new->dirty = NULL; + new->activ = NULL; + + new->parent = brother->parent; + new->parent->references++; + + new->brother = brother; + brother->references++; + + return new; +} + +static Evas_Bool +_evas_cache_engine_image_free_cb(const Evas_Hash *hash, const char *key, void *data, void *fdata) +{ + Evas_Cache_Engine_Image *cache = fdata; + Engine_Image_Entry *eim = data; + + _evas_cache_engine_image_dealloc(cache, eim); + + return 1; +} + +EAPI void +evas_cache_engine_image_flush(Evas_Cache_Engine_Image *cache) +{ + assert(cache != NULL); + + while ((cache->lru) && (cache->limit < cache->usage)) + { + Engine_Image_Entry *eim; + + eim = (Engine_Image_Entry *) cache->lru->last; + _evas_cache_engine_image_dealloc(cache, eim); + } +} + +EAPI void +evas_cache_engine_image_shutdown(Evas_Cache_Engine_Image *cache) +{ + Engine_Image_Entry *eim; + + assert(cache != NULL); + + if (cache->func.debug) cache->func.debug("shutdown-engine", NULL); + + evas_hash_foreach(cache->inactiv, _evas_cache_engine_image_free_cb, cache); + evas_hash_free(cache->inactiv); + + /* This is mad, I am about to destroy image still alive, but we need to prevent leak. */ + while (cache->dirty) + { + eim = (Engine_Image_Entry *) cache->dirty; + _evas_cache_engine_image_dealloc(cache, eim); + } + + evas_hash_foreach(cache->activ, _evas_cache_engine_image_free_cb, cache); + evas_hash_free(cache->activ); + + evas_cache_image_shutdown(cache->parent); + if (cache->brother) + evas_cache_engine_image_shutdown(cache->brother); + free(cache); +} + +EAPI Engine_Image_Entry * +evas_cache_engine_image_request(Evas_Cache_Engine_Image *cache, + const char *file, const char *key, + RGBA_Image_Loadopts *lo, void *data, int *error) +{ + Engine_Image_Entry *eim; + Image_Entry *im; + const char *ekey; + + assert(cache != NULL); + + *error = -1; + + ekey = NULL; + eim = NULL; + + im = evas_cache_image_request(cache->parent, file, key, lo, error); + if (!im) + goto on_error; + + if (cache->func.key) + ekey = cache->func.key(im, file, key, lo, data); + else + ekey = evas_stringshare_add(im->cache_key); + if (!ekey) + goto on_error; + + eim = evas_hash_find(cache->activ, ekey); + if (eim) + { + evas_cache_image_drop(im); + goto on_ok; + } + + eim = evas_hash_find(cache->inactiv, ekey); + if (eim) + { + _evas_cache_engine_image_remove_activ(cache, eim); + _evas_cache_engine_image_make_active(cache, eim, ekey); + evas_cache_image_drop(im); + goto on_ok; + } + + eim = _evas_cache_engine_image_alloc(cache, im, ekey); + if (!eim) return NULL; + + *error = cache->func.constructor(eim, data); + if (*error != 0) goto on_error; + if (cache->func.debug) + cache->func.debug("constructor-engine", eim); + + on_ok: + eim->references++; + return eim; + + on_error: + if (!eim) + { + if (im) evas_cache_image_drop(im); + if (ekey) evas_stringshare_del(ekey); + } + else + { + _evas_cache_engine_image_dealloc(cache, eim); + } + + return NULL; +} + +EAPI void +evas_cache_engine_image_drop(Engine_Image_Entry *eim) +{ + Evas_Cache_Engine_Image *cache; + + assert(eim); + assert(eim->cache); + + eim->references--; + cache = eim->cache; + + if (eim->flags.dirty) + { + _evas_cache_engine_image_dealloc(cache, eim); + return ; + } + + if (eim->references == 0) + { + _evas_cache_engine_image_remove_activ(cache, eim); + _evas_cache_engine_image_make_inactive(cache, eim, eim->cache_key); + evas_cache_engine_image_flush(cache); + return ; + } +} + +EAPI Engine_Image_Entry * +evas_cache_engine_image_dirty(Engine_Image_Entry *eim, int x, int y, int w, int h) +{ + Engine_Image_Entry *eim_dirty = eim; + Image_Entry *im_dirty = NULL; + Image_Entry *im; + Evas_Cache_Engine_Image *cache; + unsigned char alloc_eim; + + assert(eim); + assert(eim->cache); + + cache = eim->cache; + if (!(eim->flags.dirty)) + { + alloc_eim = 0; + + if (eim->flags.need_parent == 1) + { + im = eim->src; + im_dirty = evas_cache_image_dirty(im, x, y, w, h); + + /* If im == im_dirty, this meens that we have only one reference to the eim. */ + if (im != im_dirty) + { + if (eim->references == 1) + { + _evas_cache_engine_image_remove_activ(cache, eim); + _evas_cache_engine_image_make_dirty(cache, eim); + + eim->src = im_dirty; + } + else + alloc_eim = 1; + } + } + else + if (eim->references > 1) + { + alloc_eim = 1; + } + else + { + _evas_cache_engine_image_remove_activ(cache, eim_dirty); + _evas_cache_engine_image_make_dirty(cache, eim_dirty); + } + + if (alloc_eim == 1) + { + int error; + + eim_dirty = _evas_cache_engine_image_alloc(cache, im_dirty, NULL); + if (!eim_dirty) goto on_error; + + eim_dirty->w = eim->w; + eim_dirty->h = eim->h; + eim_dirty->references = 1; + + error = cache->func.dirty(eim_dirty, eim); + if (cache->func.debug) + cache->func.debug("dirty-engine", eim_dirty); + + if (error != 0) goto on_error; + + evas_cache_engine_image_drop(eim); + } + } + + if (cache->func.dirty_region) + cache->func.dirty_region(eim_dirty, x, y, w, h); + if (cache->func.debug) + cache->func.debug("dirty-region-engine", eim_dirty); + + return eim_dirty; + + on_error: + if (eim) evas_cache_engine_image_drop(eim); + if (eim_dirty && eim_dirty != eim) + evas_cache_engine_image_drop(eim_dirty); + else + if (im_dirty) evas_cache_image_drop(im_dirty); + + return NULL; +} + +EAPI Engine_Image_Entry * +evas_cache_engine_image_alone(Engine_Image_Entry *eim, void *data) +{ + Evas_Cache_Engine_Image *cache; + Image_Entry *im; + + + assert(eim); + assert(eim->cache); + + cache = eim->cache; + im = evas_cache_image_alone(eim->src); + if (im != eim->src) + { + eim = _evas_cache_engine_image_alloc(cache, im, NULL); + if (!eim) goto on_error; + + eim->references = 1; + + if (cache->func.constructor(eim, data)) goto on_error; + } + /* FIXME */ + return eim; + + on_error: + evas_cache_image_drop(im); + return NULL; +} + +static Engine_Image_Entry * +_evas_cache_engine_image_push_dirty(Evas_Cache_Engine_Image *cache, Image_Entry *im, void *engine_data) +{ + Engine_Image_Entry *eim; + int error; + + eim = _evas_cache_engine_image_alloc(cache, im, NULL); + if (!eim) goto on_error; + eim->references = 1; + + error = cache->func.update_data(eim, engine_data); + if (cache->func.debug) + cache->func.debug("dirty-update_data-engine", eim); + if (error != 0) goto on_error; + + return eim; + + on_error: + if (eim) + evas_cache_engine_image_drop(eim); + return NULL; +} + +EAPI Engine_Image_Entry * +evas_cache_engine_image_copied_data(Evas_Cache_Engine_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace, void *engine_data) +{ + Image_Entry *im; + + assert(cache); + + im = evas_cache_image_copied_data(cache->parent, w, h, image_data, alpha, cspace); + + return _evas_cache_engine_image_push_dirty(cache, im, engine_data); +} + +EAPI Engine_Image_Entry * +evas_cache_engine_image_data(Evas_Cache_Engine_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace, void *engine_data) +{ + Image_Entry *im; + + assert(cache); + + im = evas_cache_image_data(cache->parent, w, h, image_data, alpha, cspace); + + return _evas_cache_engine_image_push_dirty(cache, im, engine_data); +} + +EAPI Engine_Image_Entry * +evas_cache_engine_image_size_set(Engine_Image_Entry *eim, int w, int h) +{ + Evas_Cache_Engine_Image *cache; + Engine_Image_Entry *new; + Image_Entry *im; + const char *hkey; + int error; + + assert(eim); + assert(eim->cache); + assert(eim->references > 0); + + im = NULL; + cache = eim->cache; + + if (eim->flags.need_parent == 1) + { + assert(eim->src); + + if (eim->src->w == w + && eim->src->h == h) + return eim; + + im = evas_cache_image_size_set(eim->src, w, h); + /* FIXME: Good idea to call update_data ? */ + if (im == eim->src) return eim; + eim->src = NULL; + } + + hkey = (eim->references > 1 ) ? evas_stringshare_add(eim->cache_key) : NULL; + + new = _evas_cache_engine_image_alloc(cache, im, hkey); + if (!new) goto on_error; + + new->w = w; + new->h = h; + new->references = 1; + + error = cache->func.size_set(new, eim); + if (error) goto on_error; + + evas_cache_engine_image_drop(eim); + return new; + + on_error: + if (new) + evas_cache_engine_image_drop(new); + else + if (im) + evas_cache_image_drop(im); + evas_cache_engine_image_drop(eim); + + return NULL; +} + +EAPI void +evas_cache_engine_image_load_data(Engine_Image_Entry *eim) +{ + Evas_Cache_Engine_Image *cache; + int size = 0; + + assert(eim); + assert(eim->src); + assert(eim->cache); + + if (eim->flags.loaded) return ; + + if (eim->src) + evas_cache_image_load_data(eim->src); + + cache = eim->cache; + if (cache->func.debug) + cache->func.debug("load-engine", eim); + + if (eim->flags.dirty) + size = cache->func.mem_size_get(eim); + cache = eim->cache; + cache->func.load(eim, eim->src); + if (eim->flags.dirty) + cache->usage += cache->func.mem_size_get(eim) - size; + + eim->flags.loaded = 1; +} + +EAPI Engine_Image_Entry * +evas_cache_engine_image_engine(Evas_Cache_Engine_Image *cache, void *engine_data) +{ + Engine_Image_Entry *eim; + Image_Entry *ie; + int error; + + ie = evas_cache_image_empty(cache->parent); + if (!ie) return NULL; + + eim = _evas_cache_engine_image_alloc(cache, ie, NULL); + if (!eim) goto on_error; + eim->references = 1; + + error = cache->func.update_data(eim, engine_data); + if (cache->func.debug) + cache->func.debug("update_data-engine", eim); + + if (error != 0) goto on_error; + + return eim; + + on_error: + if (!eim) + { + if (ie) + evas_cache_image_drop(ie); + } + else + { + evas_cache_engine_image_drop(eim); + } + return NULL; +} + +EAPI void +evas_cache_engine_image_colorspace(Engine_Image_Entry *eim, int cspace, void *engine_data) +{ + Evas_Cache_Engine_Image *cache = eim->cache; + + assert(cache); + + cache->func.destructor(eim); + evas_cache_image_colorspace(eim->src, cspace); + cache->func.constructor(eim, engine_data); + if (cache->func.debug) + cache->func.debug("cosntructor-colorspace-engine", eim); +} + +EAPI void +evas_cache_engine_parent_not_needed(Engine_Image_Entry *eim) +{ + assert(eim); + assert(eim->cache); + + eim->flags.need_parent = 0; + evas_cache_image_data_not_needed(eim->src); +} diff --git a/src/lib/cache/evas_cache_image.c b/src/lib/cache/evas_cache_image.c new file mode 100644 index 0000000..cfd8ecd --- /dev/null +++ b/src/lib/cache/evas_cache_image.c @@ -0,0 +1,853 @@ +/* + * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 + */ + +#include +#include + +#include "evas_common.h" +#include "evas_private.h" + +#define FREESTRC(Var) \ + if (Var) \ + { \ + evas_stringshare_del(Var); \ + Var = NULL; \ + } + +static void _evas_cache_image_entry_delete(Evas_Cache_Image *cache, Image_Entry *ie); + +static void +_evas_cache_image_make_dirty(Evas_Cache_Image *cache, + Image_Entry *im) +{ + im->flags.cached = 1; + im->flags.dirty = 1; + im->flags.activ = 0; + im->flags.lru_nodata = 0; + cache->dirty = evas_object_list_prepend(cache->dirty, im); + + if (im->cache_key) + { + evas_stringshare_del(im->cache_key); + im->cache_key = NULL; + } +} + +static void +_evas_cache_image_make_activ(Evas_Cache_Image *cache, + Image_Entry *im, + const char *key) +{ + im->cache_key = key; + if (key != NULL) + { + im->flags.cached = 1; + im->flags.activ = 1; + im->flags.lru_nodata = 0; + im->flags.dirty = 0; + cache->activ = evas_hash_direct_add(cache->activ, key, im); + } + else + { + _evas_cache_image_make_dirty(cache, im); + } +} + +static void +_evas_cache_image_make_inactiv(Evas_Cache_Image *cache, + Image_Entry *im, + const char *key) +{ + if (im->cache_key) + { + im->flags.activ = 0; + im->flags.dirty = 0; + im->flags.cached = 1; + cache->inactiv = evas_hash_direct_add(cache->inactiv, key, im); + cache->lru = evas_object_list_prepend(cache->lru, im); + cache->usage += cache->func.mem_size_get(im); + } + else + { + _evas_cache_image_entry_delete(cache, im); + } + } + +static void +_evas_cache_image_remove_lru_nodata(Evas_Cache_Image *cache, + Image_Entry *im) +{ + if (im->flags.lru_nodata) + { + im->flags.lru_nodata = 0; + cache->lru_nodata = evas_object_list_remove(cache->lru_nodata, im); + cache->usage -= cache->func.mem_size_get(im); + } +} + +static void +_evas_cache_image_activ_lru_nodata(Evas_Cache_Image *cache, + Image_Entry *im) +{ + im->flags.need_data = 0; + im->flags.lru_nodata = 1; + cache->lru_nodata = evas_object_list_prepend(cache->lru_nodata, im); + cache->usage += cache->func.mem_size_get(im); +} + +static void +_evas_cache_image_remove_activ(Evas_Cache_Image *cache, + Image_Entry *ie) +{ + if (ie->flags.cached) + { + if (ie->flags.activ) + { + cache->activ = evas_hash_del(cache->activ, ie->cache_key, ie); + _evas_cache_image_remove_lru_nodata(cache, ie); + } + else + { + if (ie->flags.dirty) + { + cache->dirty = evas_object_list_remove(cache->dirty, ie); + } + else + { + cache->inactiv = evas_hash_del(cache->inactiv, ie->cache_key, ie); + cache->lru = evas_object_list_remove(cache->lru, ie); + cache->usage -= cache->func.mem_size_get(ie); + } + } + ie->flags.cached = 0; + ie->flags.dirty = 0; + ie->flags.activ = 0; + } +} + +static void +_evas_cache_image_entry_delete(Evas_Cache_Image *cache, Image_Entry *ie) +{ + if (!ie) return ; + + if (cache->func.debug) + cache->func.debug("deleting", ie); + + cache->func.destructor(ie); + + _evas_cache_image_remove_activ(cache, ie); + + if (ie->cache_key) + { + evas_stringshare_del(ie->cache_key); + ie->cache_key = NULL; + } + + FREESTRC(ie->file); + FREESTRC(ie->key); + + cache->func.surface_delete(ie); + cache->func.dealloc(ie); +} + +static Image_Entry * +_evas_cache_image_entry_new(Evas_Cache_Image *cache, + const char *hkey, + time_t timestamp, + const char *file, + const char *key, + RGBA_Image_Loadopts *lo, + int *error) +{ + Image_Entry *ie; + const char *cache_key; + + ie = cache->func.alloc(); + if (!ie) + return NULL; + + cache_key = hkey ? evas_stringshare_add(hkey) : NULL; + + ie->flags.loaded = 0; + ie->flags.need_data = 1; + + _evas_cache_image_make_activ(cache, ie, cache_key); + + ie->space = EVAS_COLORSPACE_ARGB8888; + ie->w = -1; + ie->h = -1; + ie->allocated.w = 0; + ie->allocated.h = 0; + + ie->references = 0; + ie->cache = cache; + + ie->file = file ? evas_stringshare_add(file) : NULL; + ie->key = key ? evas_stringshare_add(key) : NULL; + + ie->timestamp = timestamp; + ie->laststat = time(NULL); + + ie->load_opts.scale_down_by = 0; + ie->load_opts.dpi = 0; + ie->load_opts.w = 0; + ie->load_opts.h = 0; + ie->scale = 1; + + if (lo) + ie->load_opts = *lo; + + if (file) + { + *error = cache->func.constructor(ie); + if (*error != 0) + { + _evas_cache_image_entry_delete(cache, ie); + return NULL; + } + } + if (cache->func.debug) + cache->func.debug("build", ie); + + return ie; +} + +static void +_evas_cache_image_entry_surface_alloc(Evas_Cache_Image *cache, + Image_Entry *ie, + int w, + int h) +{ + int wmin; + int hmin; + + wmin = w > 0 ? w : 1; + hmin = h > 0 ? h : 1; + if (ie->allocated.w == wmin && ie->allocated.h == hmin) + return ; + + if (cache->func.surface_alloc(ie, wmin, hmin)) + { + wmin = 0; + hmin = 0; + } + ie->w = wmin; + ie->h = hmin; + ie->allocated.w = wmin; + ie->allocated.h = hmin; +} + +EAPI int +evas_cache_image_usage_get(Evas_Cache_Image *cache) +{ + assert(cache != NULL); + + return cache->usage; +} + +EAPI int +evas_cache_image_get(Evas_Cache_Image *cache) +{ + assert(cache != NULL); + + return cache->limit; +} + +EAPI void +evas_cache_image_set(Evas_Cache_Image *cache, int limit) +{ + assert(cache != NULL); + if (cache->limit == limit) return; + cache->limit = limit; + evas_cache_image_flush(cache); +} + +EAPI Evas_Cache_Image * +evas_cache_image_init(const Evas_Cache_Image_Func *cb) +{ + Evas_Cache_Image *new; + + new = malloc(sizeof (Evas_Cache_Image)); + if (!new) + return NULL; + + new->func = *cb; + + new->limit = 0; + new->usage = 0; + + new->dirty = NULL; + new->lru = NULL; + new->lru_nodata = NULL; + new->inactiv = NULL; + new->activ = NULL; + + new->references = 1; + + return new; +} + +static Evas_Bool +_evas_cache_image_free_cb(const Evas_Hash *hash, const char *key, void *data, void *fdata) +{ + Evas_Cache_Image *cache = fdata; + Image_Entry *im = data; + + _evas_cache_image_entry_delete(cache, im); + + return 1; +} + +EAPI void +evas_cache_image_shutdown(Evas_Cache_Image *cache) +{ + Image_Entry *im; + + assert(cache != NULL); + cache->references--; + + if (cache->references > 0) + return ; + + while (cache->lru) + { + im = (Image_Entry *) cache->lru; + _evas_cache_image_entry_delete(cache, im); + } + + while (cache->lru_nodata) + { + im = (Image_Entry *) cache->lru_nodata; + _evas_cache_image_entry_delete(cache, im); + } + + /* This is mad, I am about to destroy image still alive, but we need to prevent leak. */ + while (cache->dirty) + { + im = (Image_Entry *) cache->dirty; + _evas_cache_image_entry_delete(cache, im); + } + + evas_hash_foreach(cache->activ, _evas_cache_image_free_cb, cache); + evas_hash_free(cache->activ); + evas_hash_free(cache->inactiv); + + free(cache); +} + +#define STAT_GAP 2 + +EAPI Image_Entry * +evas_cache_image_request(Evas_Cache_Image *cache, const char *file, const char *key, RGBA_Image_Loadopts *lo, int *error) +{ + const char *format; + char *hkey; + Image_Entry *im; + Evas_Image_Load_Opts prevent; + int size; + int stat_done = 0; + struct stat st; + + assert(cache != NULL); + + if (!file && !key) return NULL; + if (!file) return NULL; + if ((!lo) || + (lo && + (lo->scale_down_by == 0) && + (lo->dpi = 0.0) && + ((lo->w == 0) || (lo->h == 0)))) + { + lo = &prevent; + if (key) + format = "%s//://%s"; + else + format = "%s//://%p"; + } + else + { + if (key) + format = "%s//://%s//@/%i/%1.5f/%ix%i"; + else + format = "%s//://%p//@/%i/%1.5f/%ix%i"; + } + size = strlen(file) + (key ? strlen(key) : 6) + 64; + hkey = alloca(sizeof (char) * size); + snprintf(hkey, size, format, file, key, lo->scale_down_by, lo->dpi, lo->w, lo->h); + + im = evas_hash_find(cache->activ, hkey); + if (im) + { + time_t t; + int ok; + + ok = 1; + t = time(NULL); + + if ((t - im->laststat) > STAT_GAP) + { + stat_done = 1; + if (stat(file, &st) < 0) goto on_error; + + im->laststat = t; + if (st.st_mtime != im->timestamp) ok = 0; + } + if (ok) goto on_ok; + + _evas_cache_image_remove_activ(cache, im); + _evas_cache_image_make_dirty(cache, im); + } + + im = evas_hash_find(cache->inactiv, hkey); + if (im) + { + int ok; + + ok = 1; + if (!stat_done) + { + time_t t; + + t = time(NULL); + if ((t - im->laststat) > STAT_GAP) + { + stat_done = 1; + if (stat(file, &st) < 0) goto on_error; + + im->laststat = t; + if (st.st_mtime != im->timestamp) ok = 0; + } + } + else + if (st.st_mtime != im->timestamp) ok = 0; + + if (ok) + { + _evas_cache_image_remove_activ(cache, im); + _evas_cache_image_make_activ(cache, im, im->cache_key); + goto on_ok; + } + + _evas_cache_image_entry_delete(cache, im); + } + + if (!stat_done) + { + if (stat(file, &st) < 0) return NULL; + } + + im = _evas_cache_image_entry_new(cache, hkey, st.st_mtime, file, key, lo, error); + if (!im) + return NULL; + + if (cache->func.debug) + cache->func.debug("request", im); + + on_ok: + *error = 0; + im->references++; + if (im->references > 1 && im->flags.lru_nodata) + _evas_cache_image_remove_lru_nodata(cache, im); + + return im; + + on_error: + _evas_cache_image_entry_delete(cache, im); + return NULL; +} + +EAPI void +evas_cache_image_drop(Image_Entry *im) +{ + Evas_Cache_Image *cache; + + assert(im); + assert(im->cache); + + im->references--; + cache = im->cache; + + if (im->references == 0) + { + if (im->flags.dirty) + { + _evas_cache_image_entry_delete(cache, im); + return ; + } + + _evas_cache_image_remove_activ(cache, im); + _evas_cache_image_make_inactiv(cache, im, im->cache_key); + evas_cache_image_flush(cache); + } +} + +EAPI void +evas_cache_image_data_not_needed(Image_Entry *im) +{ + Evas_Cache_Image *cache; + + assert(im); + assert(im->cache); + + cache = im->cache; + + if (im->references > 1) return ; + if (im->flags.dirty || !im->flags.need_data) return ; + + _evas_cache_image_activ_lru_nodata(cache, im); +} + +EAPI Image_Entry * +evas_cache_image_dirty(Image_Entry *im, int x, int y, int w, int h) +{ + Image_Entry *im_dirty = im; + Evas_Cache_Image *cache; + + assert(im); + assert(im->cache); + + cache = im->cache; + if (!(im->flags.dirty)) + { + if (im->references == 1) im_dirty = im; + else + { + int error; + + im_dirty = _evas_cache_image_entry_new(cache, NULL, im->timestamp, im->file, im->key, &im->load_opts, &error); + if (!im_dirty) goto on_error; + + if (cache->func.debug) + cache->func.debug("dirty-src", im); + error = cache->func.dirty(im_dirty, im); + if (cache->func.debug) + cache->func.debug("dirty-out", im_dirty); + + if (error != 0) goto on_error; + + im_dirty->references = 1; + + evas_cache_image_drop(im); + } + + _evas_cache_image_remove_activ(cache, im_dirty); + _evas_cache_image_make_dirty(cache, im_dirty); + } + + if (cache->func.debug) + cache->func.debug("dirty-region", im_dirty); + if (cache->func.dirty_region) + cache->func.dirty_region(im_dirty, x, y, w, h); + + return im_dirty; + + on_error: + if (im_dirty) _evas_cache_image_entry_delete(cache, im_dirty); + evas_cache_image_drop(im); + return NULL; +} + +EAPI Image_Entry * +evas_cache_image_alone(Image_Entry *im) +{ + Evas_Cache_Image *cache; + Image_Entry *im_dirty = im; + + assert(im); + assert(im->cache); + + cache = im->cache; + if (im->references == 1) + { + if (!(im->flags.dirty)) + { + _evas_cache_image_remove_activ(cache, im); + _evas_cache_image_make_dirty(cache, im); + } + } + else + { + int error; + + im_dirty = _evas_cache_image_entry_new(cache, NULL, im->timestamp, im->file, im->key, &im->load_opts, &error); + if (!im_dirty) goto on_error; + + if (cache->func.debug) + cache->func.debug("dirty-src", im); + error = cache->func.dirty(im_dirty, im); + if (cache->func.debug) + cache->func.debug("dirty-out", im_dirty); + + if (error != 0) goto on_error; + + im_dirty->references = 1; + + evas_cache_image_drop(im); + } + + return im_dirty; + + on_error: + if (im_dirty) _evas_cache_image_entry_delete(cache, im_dirty); + evas_cache_image_drop(im); + return NULL; +} + +EAPI Image_Entry * +evas_cache_image_copied_data(Evas_Cache_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + Image_Entry *im; + + assert(cache); + + if ((cspace == EVAS_COLORSPACE_YCBCR422P601_PL) || + (cspace == EVAS_COLORSPACE_YCBCR422P709_PL)) + w &= ~0x1; + + im = _evas_cache_image_entry_new(cache, NULL, 0, NULL, NULL, NULL, NULL); + if (!im) return NULL; + + im->space = cspace; + im->flags.alpha = alpha; + + _evas_cache_image_entry_surface_alloc(cache, im, w, h); + + if (cache->func.copied_data(im, w, h, image_data, alpha, cspace) != 0) + { + _evas_cache_image_entry_delete(cache, im); + return NULL; + } + im->references = 1; + + if (cache->func.debug) + cache->func.debug("copied-data", im); + return im; +} + +EAPI Image_Entry * +evas_cache_image_data(Evas_Cache_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace) +{ + Image_Entry *im; + + assert(cache); + + if ((cspace == EVAS_COLORSPACE_YCBCR422P601_PL) || + (cspace == EVAS_COLORSPACE_YCBCR422P709_PL)) + w &= ~0x1; + + im = _evas_cache_image_entry_new(cache, NULL, 0, NULL, NULL, NULL, NULL); + im->w = w; + im->h = h; + im->flags.alpha = alpha; + + if (cache->func.data(im, w, h, image_data, alpha, cspace) != 0) + { + _evas_cache_image_entry_delete(cache, im); + return NULL; + } + im->references = 1; + + if (cache->func.debug) + cache->func.debug("data", im); + return im; +} + +EAPI void +evas_cache_image_surface_alloc(Image_Entry *im, int w, int h) +{ + Evas_Cache_Image *cache; + + assert(im); + assert(im->cache); + + cache = im->cache; + + if ((im->space == EVAS_COLORSPACE_YCBCR422P601_PL) || + (im->space == EVAS_COLORSPACE_YCBCR422P709_PL)) + w &= ~0x1; + + _evas_cache_image_entry_surface_alloc(cache, im, w, h); + + if (cache->func.debug) + cache->func.debug("surface-alloc", im); +} + +EAPI Image_Entry * +evas_cache_image_size_set(Image_Entry *im, int w, int h) +{ + Evas_Cache_Image *cache; + Image_Entry *new; + int error; + + assert(im); + assert(im->cache); + assert(im->references > 0); + + if ((im->space == EVAS_COLORSPACE_YCBCR422P601_PL) || + (im->space == EVAS_COLORSPACE_YCBCR422P709_PL)) + w &= ~0x1; + + if ((im->w == w) && (im->h == h)) + return im; + + cache = im->cache; + + new = _evas_cache_image_entry_new(cache, NULL, 0, NULL, NULL, NULL, &error); + if (!new) goto on_error; + + new->flags.alpha = im->flags.alpha; + new->space = im->space; + new->load_opts = im->load_opts; + + _evas_cache_image_entry_surface_alloc(cache, new, w, h); + + error = cache->func.size_set(new, im, w, h); + if (error != 0) goto on_error; + + new->references = 1; + + evas_cache_image_drop(im); + + if (cache->func.debug) + cache->func.debug("size_set", new); + + return new; + + on_error: + if (new) _evas_cache_image_entry_delete(cache, new); + evas_cache_image_drop(im); + return NULL; +} + +EAPI void +evas_cache_image_load_data(Image_Entry *im) +{ + Evas_Cache_Image *cache; + int error; + + assert(im); + assert(im->cache); + + if (im->flags.loaded) return ; + + cache = im->cache; + + error = cache->func.load(im); + + if (cache->func.debug) + cache->func.debug("load", im); + + if (error) + { + _evas_cache_image_entry_surface_alloc(cache, im, im->w, im->h); + im->flags.loaded = 0; + + return ; + } + + im->flags.loaded = 1; +} + +EAPI int +evas_cache_image_flush(Evas_Cache_Image *cache) +{ + assert(cache); + +// printf("cache->limit = %i (used = %i)\n", cache->limit, cache->usage); + if (cache->limit == -1) + return -1; + + while ((cache->lru) && (cache->limit < cache->usage)) + { + Image_Entry *im; + + im = (Image_Entry *) cache->lru->last; + _evas_cache_image_entry_delete(cache, im); + } + + while ((cache->lru_nodata) && (cache->limit < cache->usage)) + { + Image_Entry *im; + + im = (Image_Entry *) cache->lru_nodata->last; + _evas_cache_image_remove_lru_nodata(cache, im); + + cache->func.surface_delete(im); + + im->flags.loaded = 0; + } + + return cache->usage; +} + +EAPI Image_Entry * +evas_cache_image_empty(Evas_Cache_Image *cache) +{ + Image_Entry *new; + + new = _evas_cache_image_entry_new(cache, NULL, 0, NULL, NULL, NULL, NULL); + if (!new) return NULL; + + new->references = 1; + + return new; +} + +EAPI void +evas_cache_image_colorspace(Image_Entry *im, int cspace) +{ + Evas_Cache_Image *cache; + + assert(im); + assert(im->cache); + + cache = im->cache; + + if (im->space == cspace) return ; + + im->space = cspace; + cache->func.color_space(im, cspace); +} + +EAPI void * +evas_cache_private_from_image_entry_get(Image_Entry *im) +{ + Evas_Cache_Image *cache; + + assert(im); + assert(im->cache); + + cache = im->cache; + + return (void*) cache->data; +} + +EAPI void * +evas_cache_private_get(Evas_Cache_Image *cache) +{ + assert(cache); + + return cache->data; +} + +EAPI void +evas_cache_private_set(Evas_Cache_Image *cache, const void *data) +{ + assert(cache); + + cache->data = data; +} + +EAPI DATA32 * +evas_cache_image_pixels(Image_Entry *im) +{ + Evas_Cache_Image *cache; + + assert(im); + assert(im->cache); + + cache = im->cache; + + return cache->func.surface_pixels(im); +} diff --git a/src/lib/canvas/.cvsignore b/src/lib/canvas/.cvsignore new file mode 100644 index 0000000..3923fb5 --- /dev/null +++ b/src/lib/canvas/.cvsignore @@ -0,0 +1,6 @@ +Makefile.in +Makefile +.deps +.libs +libevas_canvas.la +*.lo diff --git a/src/lib/canvas/Makefile.am b/src/lib/canvas/Makefile.am new file mode 100644 index 0000000..db66ba6 --- /dev/null +++ b/src/lib/canvas/Makefile.am @@ -0,0 +1,43 @@ + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = -I. \ + -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/lib/include \ + -DPACKAGE_BIN_DIR=\"$(bindir)\" \ + -DPACKAGE_LIB_DIR=\"$(libdir)\" \ + -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ + @FREETYPE_CFLAGS@ @EET_CFLAGS@ \ + @FONTCONFIG_CFLAGS@ + +noinst_LTLIBRARIES = libevas_canvas.la +libevas_canvas_la_SOURCES = \ +evas_callbacks.c \ +evas_clip.c \ +evas_data.c \ +evas_events.c \ +evas_focus.c \ +evas_key.c \ +evas_key_grab.c \ +evas_layer.c \ +evas_main.c \ +evas_name.c \ +evas_object_gradient.c \ +evas_object_image.c \ +evas_object_main.c \ +evas_object_inform.c \ +evas_object_intercept.c \ +evas_object_line.c \ +evas_object_polygon.c \ +evas_object_rectangle.c \ +evas_object_smart.c \ +evas_object_text.c \ +evas_object_textblock.c \ +evas_font_dir.c \ +evas_rectangle.c \ +evas_render.c \ +evas_smart.c \ +evas_stack.c \ +evas_async_events.c + +libevas_canvas_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/src/lib/canvas/evas_async_events.c b/src/lib/canvas/evas_async_events.c new file mode 100644 index 0000000..e038450 --- /dev/null +++ b/src/lib/canvas/evas_async_events.c @@ -0,0 +1,169 @@ +#include "evas_common.h" +#include "evas_private.h" + +#ifdef BUILD_ASYNC_EVENTS + +#include +#include +#include +#include + +static int _fd_write = -1; +static int _fd_read = -1; + +static int _init_evas_event = 0; +static pthread_mutex_t _mutex = PTHREAD_MUTEX_INITIALIZER; + +typedef struct _Evas_Event_Async Evas_Event_Async; +struct _Evas_Event_Async +{ + void (*func)(void *target, Evas_Callback_Type type, void *event_info); + void *target; + Evas_Callback_Type type; + void *event_info; +}; + +#endif + +int +evas_async_events_init(void) +{ +#ifdef BUILD_ASYNC_EVENTS + int filedes[2]; + + _init_evas_event++; + if (_init_evas_event > 1) return _init_evas_event; + + if (pipe(filedes) == -1) + { + _init_evas_event = 0; + return 0; + } + + _fd_read = filedes[0]; + _fd_write = filedes[1]; + + fcntl(_fd_read, F_SETFL, O_NONBLOCK); + + return _init_evas_event; +#else + return 0; +#endif +} + +int +evas_async_events_shutdown(void) +{ +#ifdef BUILD_ASYNC_EVENTS + _init_evas_event--; + if (_init_evas_event > 0) return _init_evas_event; + + close(_fd_read); + close(_fd_write); + _fd_read = -1; + _fd_write = -1; + + return _init_evas_event; +#else + return 0; +#endif +} + +EAPI int +evas_async_events_fd_get(void) +{ +#ifdef BUILD_ASYNC_EVENTS + return _fd_read; +#else + return -1; +#endif +} + +EAPI int +evas_async_events_process(void) +{ +#ifdef BUILD_ASYNC_EVENTS + static Evas_Event_Async current; + static int size = 0; + int check; + int count = 0; + + if (_fd_read == -1) return 0; + + do + { + check = read(_fd_read, ((char*) ¤t) + size, sizeof(current) - size); + + if (check > 0) + { + size += check; + if (size == sizeof(current)) + { + if (current.func) current.func(current.target, current.type, current.event_info); + size = 0; + count++; + } + } + } + while (check > 0); + + if (check < 0) + switch (errno) + { + case EBADF: + case EINVAL: + case EIO: + case EISDIR: + _fd_read = -1; + } + + return count; +#else + return 0; +#endif +} + +EAPI Evas_Bool +evas_async_events_put(void *target, Evas_Callback_Type type, void *event_info, void (*func)(void *target, Evas_Callback_Type type, void *event_info)) +{ +#ifdef BUILD_ASYNC_EVENTS + Evas_Event_Async new; + ssize_t check; + int offset = 0; + Evas_Bool result = 0; + + if (!func) return 0; + if (_fd_write == -1) return 0; + + new.func = func; + new.target = target; + new.type = type; + new.event_info = event_info; + + pthread_mutex_lock(&_mutex); + + do { + check = write(_fd_write, ((char*)&new) + offset, sizeof(new) - offset); + offset += check; + } while (offset != sizeof(new) && (errno == EINTR || errno == EAGAIN)); + + if (offset == sizeof(new)) + result = 1; + else + switch (errno) + { + case EBADF: + case EINVAL: + case EIO: + case EPIPE: + _fd_write = -1; + } + + pthread_mutex_unlock(&_mutex); + + return result; +#else + return 0; +#endif +} + diff --git a/src/lib/canvas/evas_callbacks.c b/src/lib/canvas/evas_callbacks.c new file mode 100644 index 0000000..1fde375 --- /dev/null +++ b/src/lib/canvas/evas_callbacks.c @@ -0,0 +1,468 @@ +#include "evas_common.h" +#include "evas_private.h" + +static void evas_object_event_callback_list_post_free(Evas_Object_List **list); +static void evas_object_event_callback_clear(Evas_Object *obj); + +static void +evas_object_event_callback_list_post_free(Evas_Object_List **list) +{ + Evas_Object_List *l; + + /* MEM OK */ + for (l = *list; l;) + { + Evas_Func_Node *fn; + + fn = (Evas_Func_Node *)l; + l = l->next; + if (fn->delete_me) + { + *list = evas_object_list_remove(*list, fn); + free(fn); + } + } +} + +static void +evas_object_event_callback_clear(Evas_Object *obj) +{ + if (!obj->callbacks) return; + if (!obj->callbacks->deletions_waiting) return; + obj->callbacks->deletions_waiting = 0; + evas_object_event_callback_list_post_free(&obj->callbacks->callbacks); + if (!obj->callbacks->callbacks) + { + free(obj->callbacks); + obj->callbacks = NULL; + } +} + +void +evas_object_event_callback_all_del(Evas_Object *obj) +{ + Evas_Object_List *l; + + if (!obj->callbacks) return; + for (l = obj->callbacks->callbacks; l; l = l->next) + { + Evas_Func_Node *fn; + + fn = (Evas_Func_Node *)l; + fn->delete_me = 1; + } +} + +void +evas_object_event_callback_cleanup(Evas_Object *obj) +{ + /* MEM OK */ + if (!obj->callbacks) return; + evas_object_event_callback_list_post_free(&obj->callbacks->callbacks); + free(obj->callbacks); + obj->callbacks = NULL; +} + +void +evas_object_event_callback_call(Evas_Object *obj, Evas_Callback_Type type, void *event_info) +{ + /* MEM OK */ + Evas_Object_List **l_mod = NULL, *l; + Evas_Button_Flags flags = EVAS_BUTTON_NONE; + Evas *e; + + if (obj->delete_me) return; + e = evas_object_evas_get(obj); + + _evas_walk(e); + if (obj->callbacks) + { + l_mod = &obj->callbacks->callbacks; + switch (type) + { + case EVAS_CALLBACK_MOUSE_DOWN: + { + Evas_Event_Mouse_Down *ev = event_info; + + flags = ev->flags; + if (ev->flags & (EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK)) + { + if (obj->last_mouse_down_counter < (e->last_mouse_down_counter - 1)) + ev->flags &= ~(EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK); + } + obj->last_mouse_down_counter = e->last_mouse_down_counter; + break; + } + case EVAS_CALLBACK_MOUSE_UP: + { + Evas_Event_Mouse_Up *ev = event_info; + + flags = ev->flags; + if (ev->flags & (EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK)) + { + if (obj->last_mouse_up_counter < (e->last_mouse_up_counter - 1)) + ev->flags &= ~(EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK); + } + obj->last_mouse_up_counter = e->last_mouse_up_counter; + break; + } + default: + break; + } + obj->callbacks->walking_list++; + for (l = *l_mod; l; l = l->next) + { + Evas_Func_Node *fn; + + fn = (Evas_Func_Node *)l; + if ((fn->type == type) && (!fn->delete_me)) + { + if (fn->func) + fn->func(fn->data, obj->layer->evas, obj, event_info); + } + if (obj->delete_me) break; + } + obj->callbacks->walking_list--; + if (!obj->callbacks->walking_list) + { + evas_object_event_callback_clear(obj); + l_mod = NULL; + } + + if (type == EVAS_CALLBACK_MOUSE_DOWN) + { + Evas_Event_Mouse_Down *ev = event_info; + ev->flags = flags; + } + else if (type == EVAS_CALLBACK_MOUSE_UP) + { + Evas_Event_Mouse_Up *ev = event_info; + ev->flags = flags; + } + } + + if (!((obj->no_propagate) && (l_mod) && (*l_mod))) + { + if ((obj->smart.parent) && (type != EVAS_CALLBACK_FREE) && + (type <= EVAS_CALLBACK_KEY_UP)) + evas_object_event_callback_call(obj->smart.parent, type, event_info); + } + _evas_unwalk(e); +} + +/** + * @defgroup Evas_Object_Callback_Group Object Callback Functions + * + * Functions that add and remove callbacks to evas objects. + */ + +/** + * @todo Move this next code example and most of the documentation for + * this next function into the group documentation. + */ + +/** + * Add a callback function to an object + * @param obj Object to attach a callback to + * @param type The type of event that will trigger the callback + * @param func The function to be called when the event is triggered + * @param data The data pointer to be passed to @p func + * + * This function adds a function callback to an object when the event of type + * @p type occurs on object @p obj. The function is @p func. + * + * In the event of a memory allocation error during addition of the callback to + * the object, evas_alloc_error() should be used to determine the nature of + * the error, if any, and the program should sensibly try and recover. + * + * The function will be passed the pointer @p data when it is called. A + * callback function must look like this: + * + * @code + * void callback (void *data, Evas *e, Evas_Object *obj, void *event_info); + * @endcode + * + * The first parameter @p data in this function will be the same value passed + * to evas_object_event_callback_add() as the @p data parameter. The second + * parameter is a convenience for the programmer to know what evas canvas the + * event occured on. The third parameter @p obj is the Object handle on which + * the event occured. The foruth parameter @p event_info is a pointer to a + * data structure that may or may not be passed to the callback, depending on + * the event type that triggered the callback. + * + * The event type @p type to trigger the function may be one of + * EVAS_CALLBACK_MOUSE_IN, EVAS_CALLBACK_MOUSE_OUT, EVAS_CALLBACK_MOUSE_DOWN, + * EVAS_CALLBACK_MOUSE_UP, EVAS_CALLBACK_MOUSE_MOVE, EVAS_CALLBACK_MOUSE_WHEEL, + * EVAS_CALLBACK_FREE, EVAS_CALLBACK_KEY_DOWN, EVAS_CALLBACK_KEY_UP, + * EVAS_CALLBACK_FOCUS_IN, EVAS_CALLBACK_FOCUS_OUT, EVAS_CALLBACK_SHOW, + * EVAS_CALLBACK_HIDE, EVAS_CALLBACK_MOVE, EVAS_CALLBACK_RESIZE or EVAS_CALLBACK_RESTACK. + * This determines the kind of event that will trigger the callback to be called. + * The @p event_info pointer passed to the callback will be one of the + * following, depending on the event triggering it: + * + * EVAS_CALLBACK_MOUSE_IN: event_info = pointer to Evas_Event_Mouse_In + * + * This event is triggered when the mouse pointer enters the region of + * the object @p obj. This may occur by the mouse pointer being moved by + * evas_event_feed_mouse_move() or evas_event_feed_mouse_move_data() calls, + * or by the object being shown, raised, moved, resized, or other objects + * being moved out of the way, hidden, lowered or moved out of the way. + * + * EVAS_CALLBACK_MOUSE_OUT: event_info = pointer to Evas_Event_Mouse_Out + * + * This event is triggered exactly like EVAS_CALLBACK_MOUSE_IN is, but occurs + * when the mouse pointer exits an object. Note that no out events will be + * reported if the mouse pointer is implicitly grabbed to an object (the + * mouse buttons are down at all and any were pressed on that object). An + * out event will be reported as soon as the mouse is no longer grabbed (no + * mouse buttons are depressed). Out events will be reported once all buttons + * are released, if the mouse has left the object. + * + * EVAS_CALLBACK_MOUSE_DOWN: event_info = pointer to Evas_Event_Mouse_Down + * + * This event is triggered by a mouse button being depressed while over an + * object. If pointermode is EVAS_OBJECT_POINTER_MODE_AUTOGRAB (default) + * this causes this object to passively grab the mouse until all mouse + * buttons have been released. + * That means if this mouse button is the first to be pressed, all future + * mouse events will be reported to only this object until no buttons are + * down. That includes mouse move events, in and out events, and further + * button presses. When all buttons are released, event propagation occurs + * as normal. + * + * EVAS_CALLBACK_MOUSE_UP: event_info = pointer to Evas_Event_Mouse_Up + * + * This event is triggered by a mouse button being released while over an + * object or when passively grabbed to an object. If this is the last mouse + * button to be raised on an object then the passive grab is released and + * event processing will continue as normal. + * + * EVAS_CALLBACK_MOUSE_MOVE: event_info = pointer to Evas_Event_Mouse_Move + * + * This event is triggered by the mouse pointer moving while over an object or + * passively grabbed to an object. + * + * EVAS_CALLBACK_MOUSE_WHEEL: event_info = pointer to Evas_Event_Mouse_Wheel + * + * This event is triggered by the mouse wheel being rolled while over an object + * or passively grabbed to an object. + * + * EVAS_CALLBACK_FREE: event_info = NULL + * + * This event is triggered just before Evas is about to free all memory used + * by an object and remove all references to it. This is useful for programs + * to use if they attached data to an object and want to free it when the + * object is deleted. The object is still valid when this callback is called, + * but after this callback returns, there is no guarantee on the object's + * validity. + * + * EVAS_CALLBACK_KEY_DOWN: event_info = pointer to Evas_Event_Key_Down + * + * This callback is called when a key is pressed and the focus is on the + * object, or a key has been grabbed to a particular object which wants to + * intercept the key press regardless of what object has the focus. + * + * EVAS_CALLBACK_KEY_UP: event_info = pointer to Evas_Event_Key_Up + * + * This callback is called when a key is released and the focus is on the + * object, or a key has been grabbed to a particular object which wants to + * intercept the key release regardless of what object has the focus. + * + * EVAS_CALLBACK_FOCUS_IN: event_info = NULL + * + * This event is called when an object gains the focus. When the callback is + * called the object has already gained the focus. + * + * EVAS_CALLBACK_FOCUS_OUT: event_info = NULL + * + * This event is triggered by an object losing the focus. When the callback is + * called the object has already lost the focus. + * + * EVAS_CALLBACK_SHOW: event_info = NULL + * + * This event is triggered by the object being shown by evas_object_show(). + * + * EVAS_CALLBACK_HIDE: event_info = NULL + * + * This event is triggered by an object being hidden by evas_object_hide(). + * + * EVAS_CALLBACK_MOVE: event_info = NULL + * + * This event is triggered by an object being moved. evas_object_move() can + * trigger this, as can any object-specific manipulations that would mean the + * object's origin could move. + * + * EVAS_CALLBACK_RESIZE: event_info = NULL + * + * This event is triggered by an object being resized. Resizes can be + * triggered by evas_object_resize() or by any object-specific calls that may + * cause the object to resize. + * + * Example: + * @code + * extern Evas_Object *object; + * extern void *my_data; + * void down_callback(void *data, Evas *e, Evas_Object *obj, void *event_info); + * void up_callback(void *data, Evas *e, Evas_Object *obj, void *event_info); + * + * evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_UP, up_callback, my_data); + * if (evas_alloc_error() != EVAS_ALLOC_ERROR_NONE) + * { + * fprintf(stderr, "ERROR: Callback registering failed! Abort!\n"); + * exit(-1); + * } + * evas_object_event_callback_add(object, EVAS_CALLBACK_MOUSE_DOWN, down_callback, my_data); + * if (evas_alloc_error() != EVAS_ALLOC_ERROR_NONE) + * { + * fprintf(stderr, "ERROR: Callback registering failed! Abort!\n"); + * exit(-1); + * } + * @endcode + * @ingroup Evas_Object_Callback_Group + */ +EAPI void +evas_object_event_callback_add(Evas_Object *obj, Evas_Callback_Type type, void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info), const void *data) +{ + /* MEM OK */ + Evas_Func_Node *fn; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + + if (!func) return; + + fn = evas_mem_calloc(sizeof(Evas_Func_Node)); + if (!fn) return; + fn->func = func; + fn->data = (void *)data; + fn->type = type; + + if (!obj->callbacks) + obj->callbacks = evas_mem_calloc(sizeof(Evas_Callbacks)); + if (!obj->callbacks) + { + free(fn); + return; + } + obj->callbacks->callbacks = + evas_object_list_append(obj->callbacks->callbacks, fn); +} + +/** + * Delete a callback function from an object + * @param obj Object to remove a callback from + * @param type The type of event that was triggering the callback + * @param func The function that was to be called when the event was triggered + * @return The data pointer that was to be passed to the callback + * + * This function removes the most recently added callback from the object + * @p obj which was triggered by the event type @p type and was calling the + * function @p func when triggered. If the removal is successful it will also + * return the data pointer that was passed to evas_object_event_callback_add() + * when the callback was added to the object. If not successful NULL will be + * returned. + * + * Example: + * @code + * extern Evas_Object *object; + * void *my_data; + * void up_callback(void *data, Evas *e, Evas_Object *obj, void *event_info); + * + * my_data = evas_object_event_callback_del(object, EVAS_CALLBACK_MOUSE_UP, up_callback); + * @endcode + * @ingroup Evas_Object_Callback_Group + */ +EAPI void * +evas_object_event_callback_del(Evas_Object *obj, Evas_Callback_Type type, void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info)) +{ + /* MEM OK */ + Evas_Object_List *l; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + + if (!func) return NULL; + + if (!obj->callbacks) return NULL; + + for (l = obj->callbacks->callbacks; l; l = l->next) + { + Evas_Func_Node *fn; + + fn = (Evas_Func_Node *)l; + if ((fn->func == func) && (fn->type == type) && (!fn->delete_me)) + { + void *data; + + data = fn->data; + fn->delete_me = 1; + obj->callbacks->deletions_waiting = 1; + if (!obj->callbacks->walking_list) + evas_object_event_callback_clear(obj); + return data; + } + } + return NULL; +} + +/** + * Delete a callback function from an object + * @param obj Object to remove a callback from + * @param type The type of event that was triggering the callback + * @param func The function that was to be called when the event was triggered + * @param data The data pointer that was to be passed to the callback + * @return The data pointer that was to be passed to the callback + * + * This function removes the most recently added callback from the object + * @p obj which was triggered by the event type @p type and was calling the + * function @p func with data @p data when triggered. If the removal is + * successful it will also return the data pointer that was passed to + * evas_object_event_callback_add() (that will be the same as the parameter) + * when the callback was added to the object. If not successful NULL will be + * returned. + * + * Example: + * @code + * extern Evas_Object *object; + * void *my_data; + * void up_callback(void *data, Evas *e, Evas_Object *obj, void *event_info); + * + * my_data = evas_object_event_callback_del_full(object, EVAS_CALLBACK_MOUSE_UP, up_callback, data); + * @endcode + * @ingroup Evas_Object_Callback_Group + */ +EAPI void * +evas_object_event_callback_del_full(Evas_Object *obj, Evas_Callback_Type type, void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info), const void *data) +{ + /* MEM OK */ + Evas_Object_List *l; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + + if (!func) return NULL; + + if (!obj->callbacks) return NULL; + + for (l = obj->callbacks->callbacks; l; l = l->next) + { + Evas_Func_Node *fn; + + fn = (Evas_Func_Node *)l; + if ((fn->func == func) && (fn->type == type) && (fn->data == data) && (!fn->delete_me)) + { + void *data; + + data = fn->data; + fn->delete_me = 1; + obj->callbacks->deletions_waiting = 1; + if (!obj->callbacks->walking_list) + evas_object_event_callback_clear(obj); + return data; + } + } + return NULL; +} diff --git a/src/lib/canvas/evas_clip.c b/src/lib/canvas/evas_clip.c new file mode 100644 index 0000000..dfc3e4f --- /dev/null +++ b/src/lib/canvas/evas_clip.c @@ -0,0 +1,300 @@ +#include "evas_common.h" +#include "evas_private.h" + +void +evas_object_clip_dirty(Evas_Object *obj) +{ + Evas_List *l; + + obj->cur.cache.clip.dirty = 1; + for (l = obj->clip.clipees; l; l = l->next) + evas_object_clip_dirty(l->data); +} + +void +evas_object_recalc_clippees(Evas_Object *obj) +{ + Evas_List *l; + + if (obj->cur.cache.clip.dirty) + { + evas_object_clip_recalc(obj); + for (l = obj->clip.clipees; l; l = l->next) + evas_object_recalc_clippees(l->data); + } +} + +int +evas_object_clippers_was_visible(Evas_Object *obj) +{ + if (obj->prev.visible) + { + if (obj->prev.clipper) + return evas_object_clippers_is_visible(obj->prev.clipper); + return 1; + } + return 0; +} + +/* public functions */ + +/** + * @defgroup Evas_Clip_Group Clip Functions + * + * Functions that manage the clipping of objects by other objects. + */ + +/** + * Clip one object to another. + * @param obj The object to be clipped + * @param clip The object to clip @p obj by + * + * This function will clip the object @p obj to the area occupied by the + * object @p clipper. This means the object @p obj will only be visible within + * the area occupied by the clipping object (@p clip). The color of the object + * being clipped will be multiplied by the color of the clipping object, so + * the resulting color for the clipped object is + * RESULT = (OBJ * CLIP) / (255 * 255) per color element (red, green, blue and + * alpha). Clipping is recursive, so clip objects may be clipped by other + * objects, and their color will in tern be multiplied. You may NOT set up + * circular clipping lists (i.e. object 1 clips object 2 which clips object 1). + * The behavior of Evas is undefined in this case. Objects which do not clip + * others are visible as normal, those that clip 1 or more objects become + * invisible themselves, only affecting what they clip. If an object ceases to + * have other objects being clipped by it, it will become visible again. The + * visibility of an object affects the objects that are clipped by it, so if + * the object clipping others is not shown, the objects clipped will not be + * shown either. If the object was being clipped by another object when this + * function is called, it is implicitly removed from the clipper it is being + * clipped to, and now is made to clip its new clipper. + * + * At the moment the only objects that can validly be used to clip other + * objects are rectangle objects. All other object types are invalid and the + * result of using them is undefined. + * + * The clip object @p clip must be a valid object, but may also be NULL in + * which case the effect of this function is the same as calling + * evas_object_clip_unset() on the @p obj object. + * + * Example: + * @code + * extern Evas *evas; + * extern Evas_Object *obj; + * Evas_Object *clipper; + * + * clipper = evas_object_rectangle_add(evas); + * evas_object_color_set(clipper, 255, 255, 255, 255); + * evas_object_move(clipper, 10, 10); + * evas_object_resize(clipper, 20, 50); + * evas_object_clip_set(obj, clipper); + * evas_object_show(clipper); + * @endcode + * + * @ingroup Evas_Clip_Group + */ +EAPI void +evas_object_clip_set(Evas_Object *obj, Evas_Object *clip) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!clip) + { + evas_object_clip_unset(obj); + return; + } + MAGIC_CHECK(clip, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (obj->cur.clipper == clip) return; + if (obj == clip) return; + if (evas_object_intercept_call_clip_set(obj, clip)) return; + if (obj->smart.smart) + { + if (obj->smart.smart->smart_class->clip_set) + obj->smart.smart->smart_class->clip_set(obj, clip); + } + if (obj->cur.clipper) + { + /* unclip */ + obj->cur.clipper->clip.clipees = evas_list_remove(obj->cur.clipper->clip.clipees, obj); + if (!obj->cur.clipper->clip.clipees) obj->cur.clipper->cur.have_clipees = 0; + evas_object_change(obj->cur.clipper); + evas_object_change(obj); + obj->cur.clipper = NULL; + } + /* clip me */ + if ((clip->clip.clipees == NULL) && (clip->cur.visible)) + { + /* Basically it just went invisible */ + clip->changed = 1; + clip->layer->evas->changed = 1; + evas_damage_rectangle_add(clip->layer->evas, + clip->cur.geometry.x, clip->cur.geometry.y, + clip->cur.geometry.w, clip->cur.geometry.h); + } + obj->cur.clipper = clip; + clip->clip.clipees = evas_list_append(clip->clip.clipees, obj); + if (clip->clip.clipees) clip->cur.have_clipees = 1; + evas_object_change(clip); + evas_object_change(obj); + evas_object_clip_dirty(obj); + evas_object_recalc_clippees(obj); + if (!obj->smart.smart) + { + if (evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1)) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + } +} + +/** + * Get the object clipping this one (if any). + * @param obj The object to get the clipper from + * + * This function returns the the object clipping @p obj. If @p obj not being + * clipped, NULL is returned. The object @p obj must be a valid object. + * + * See also evas_object_clip_set(), evas_object_clip_unset() and + * evas_object_clipees_get(). + * + * Example: + * @code + * extern Evas_Object *obj; + * Evas_Object *clipper; + * + * clipper = evas_object_clip_get(obj); + * if (clipper) evas_object_show(clipper); + * @endcode + * + * @ingroup Evas_Clip_Group + */ +EAPI Evas_Object * +evas_object_clip_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + return obj->cur.clipper; +} + +/** + * Disable clipping for an object. + * + * @param obj The object to cease clipping on + * + * This function disables clipping for the object @p obj, if it was already + * clipped. If it wasn't, this has no effect. The object @p obj must be a + * valid object. + * + * See also evas_object_clip_set(), evas_object_clipees_get() and + * evas_object_clip_get(). + * + * Example: + * @code + * extern Evas_Object *obj; + * Evas_Object *clipper; + * + * clipper = evas_object_clip_get(obj); + * if (clipper) + * { + * evas_object_clip_unset(obj); + * evas_object_hide(obj); + * } + * @endcode + * + * @ingroup Evas_Clip_Group + */ +EAPI void +evas_object_clip_unset(Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!obj->cur.clipper) return; + /* unclip */ + if (evas_object_intercept_call_clip_unset(obj)) return; + if (obj->smart.smart) + { + if (obj->smart.smart->smart_class->clip_unset) + obj->smart.smart->smart_class->clip_unset(obj); + } + if (obj->cur.clipper) + { + obj->cur.clipper->clip.clipees = evas_list_remove(obj->cur.clipper->clip.clipees, obj); + if (!obj->cur.clipper->clip.clipees) + obj->cur.clipper->cur.have_clipees = 0; + evas_object_change(obj->cur.clipper); + } + obj->cur.clipper = NULL; + evas_object_change(obj); + evas_object_clip_dirty(obj); + evas_object_recalc_clippees(obj); + if (!obj->smart.smart) + { + if (evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1)) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); + } +} + +/** + * Return a list of objects currently clipped by a specific object. + * + * @param obj The object to get a list of clippees from + * + * This returns the inernal list handle that contains all objects clipped by + * the object @p obj. If none are clipped, it returns NULL. This list is only + * valid until the clip list is changed and should be fetched again with another + * call to evas_object_clipees_get() if any objects being clipped by this object + * are unclipped, clipped by a new object, are deleted or the clipper is + * deleted. These operations will invalidate the list returned so it should + * not be used anymore after that point. Any use of the list after this may have + * undefined results, not limited just to strange behavior but possible + * segfaults and other strange memory errors. The object @p obj must be a valid + * object. + * + * See also evas_object_clip_set(), evas_object_clip_unset() and + * evas_object_clip_get(). + * + * Example: + * @code + * extern Evas_Object *obj; + * Evas_Object *clipper; + * + * clipper = evas_object_clip_get(obj); + * if (clipper) + * { + * Evas_List *clippees, *l; + * + * clippees = evas_object_clipees_get(clipper); + * printf("Clipper clips %i objects\n", evas_list_count(clippees)); + * for (l = clippees; l; l = l->next) + * { + * Evas_Object *obj_tmp; + * + * obj_tmp = l->data; + * evas_object_show(obj_tmp); + * } + * } + * @endcode + * @ingroup Evas_Clip_Group + */ +EAPI const Evas_List * +evas_object_clipees_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + return obj->clip.clipees; +} diff --git a/src/lib/canvas/evas_data.c b/src/lib/canvas/evas_data.c new file mode 100644 index 0000000..6ce6536 --- /dev/null +++ b/src/lib/canvas/evas_data.c @@ -0,0 +1,161 @@ +#include "evas_common.h" +#include "evas_private.h" + +/** + * @defgroup Evas_Object_Data_Group Object Data Functions + * + * Functions that retrieve and set data associated attached to an evas + * object. + */ + +/** + * Set an attached data pointer to an object with a given string key. + * @param obj The object to attach the data pointer to + * @param key The string key for the data to access it + * @param data The ponter to the data to be attached + * + * This attaches the pointer @p data to the object @p obj given the string + * @p key. This pointer will stay "hooked" to the object until a new pointer + * with the same string key is attached with evas_object_data_set() or it is + * deleted with evas_object_data_del(). On deletion of the object @p obj, the + * pointers will not be accessible from the object anymore. + * + * You can find the pointer attached under a string key using + * evas_object_data_get(). It is the job of the calling application to free + * any data pointed to by @p data when it is no longer required. + * + * If @p data is NULL, the old value stored at @p key will be removed but no + * new value will be stored. This is synonymous with calling + * evas_object_data_del() with @p obj and @p key. + * + * Example: + * + * @code + * int *my_data; + * extern Evas_Object *obj; + * + * my_data = malloc(500); + * evas_object_data_set(obj, "name_of_data", my_data); + * printf("The data that was attached was %p\n", evas_object_data_get(obj, "name_of_data")); + * @endcode + * @ingroup Evas_Object_Data_Group + */ +EAPI void +evas_object_data_set(Evas_Object *obj, const char *key, const void *data) +{ + Evas_Data_Node *node; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + if (!key) return; + + evas_object_data_del(obj, key); + if (data == NULL) return; + node = malloc(sizeof(Evas_Data_Node) + strlen(key) + 1); + node->key = (char *)node + sizeof(Evas_Data_Node); + strcpy(node->key, key); + node->data = (void *)data; + obj->data.elements = evas_list_prepend(obj->data.elements, node); +} + +/** + * Return an attached data pointer by its given string key. + * @param obj The object to which the data was attached + * @param key The string key the data was stored under + * @return The data pointer stored, or NULL if none was stored + * + * This function will return the data pointer attached to the object @p obj + * stored using the string key @p key. If the object is valid and data was + * stored under the given key, the pointer that was stored will be reuturned. + * If this is not the case, NULL will be returned, signifying an invalid object + * or non-existent key. It is possible a NULL pointer was stored given that + * key, but this situation is non-sensical and thus can be considered an error + * as well. NULL pointers are never stored as this is the return value if an + * error occurs. + * + * Example: + * + * @code + * int *my_data; + * extern Evas_Object *obj; + * + * my_data = evas_object_data_get(obj, "name_of_my_data"); + * if (my_data) printf("Data stored was %p\n", my_data); + * else printf("No data was stored on the object\n"); + * @endcode + * @ingroup Evas_Object_Data_Group + */ +EAPI void * +evas_object_data_get(const Evas_Object *obj, const char *key) +{ + Evas_List *l; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!key) return NULL; + + for (l = obj->data.elements; l; l = l->next) + { + Evas_Data_Node *node; + + node = l->data; + if (!strcmp(node->key, key)) + { + Evas_List *lst; + lst = obj->data.elements; + lst = evas_list_promote_list(lst, l); + ((Evas_Object *)obj)->data.elements = lst; + return node->data; + } + } + return NULL; +} + +/** + * Delete at attached data pointer from an object. + * @param obj The object to delete the data pointer from + * @param key The string key the data was stored under + * @return The original data pointer stored at @p key on @p obj + * + * This will remove thee stored data pointer from @p obj stored under @p key, + * and return the original pointer stored under @p key, if any, nor NULL if + * nothing was stored under that key. + * + * Example: + * + * @code + * int *my_data; + * extern Evas_Object *obj; + * + * my_data = evas_object_data_del(obj, "name_of_my_data"); + * @endcode + * @ingroup Evas_Object_Data_Group + */ +EAPI void * +evas_object_data_del(Evas_Object *obj, const char *key) +{ + Evas_List *l; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + if (!key) return NULL; + for (l = obj->data.elements; l; l = l->next) + { + Evas_Data_Node *node; + + node = l->data; + if (!strcmp(node->key, key)) + { + void *data; + + data = node->data; + obj->data.elements = evas_list_remove_list(obj->data.elements, l); + free(node); + return data; + } + } + return NULL; +} diff --git a/src/lib/canvas/evas_events.c b/src/lib/canvas/evas_events.c new file mode 100644 index 0000000..705feea --- /dev/null +++ b/src/lib/canvas/evas_events.c @@ -0,0 +1,1221 @@ +#include "evas_common.h" +#include "evas_private.h" + +static Evas_List * +_evas_event_object_list_in_get(Evas *e, Evas_List *in, const Evas_Object_List *list, Evas_Object *stop, int x, int y, int *no_rep) +{ + const Evas_Object_List *l; + + if (!list) return in; + for (l = list->last; l; l = l->prev) + { + Evas_Object *obj; + + obj = (Evas_Object *)l; + if (obj == stop) + { + *no_rep = 1; + return in; + } + if (!evas_event_passes_through(obj)) + { + if ((obj->cur.visible) && (obj->delete_me == 0) && + (!obj->clip.clipees) && + (evas_object_clippers_is_visible(obj))) + { + if (obj->smart.smart) + { + int norep; + + norep = 0; + in = _evas_event_object_list_in_get(e, in, + evas_object_smart_members_get_direct(obj), + stop, x, y, &norep); + if (norep) + { + *no_rep = 1; + return in; + } + } + else + { + if (evas_object_is_in_output_rect(obj, x, y, 1, 1) && + ((!obj->precise_is_inside) || + (evas_object_is_inside(obj, x, y)))) + { + in = evas_list_append(in, obj); + if (!obj->repeat_events) + { + *no_rep = 1; + return in; + } + } + } + } + } + } + *no_rep = 0; + return in; +} + +Evas_List * +evas_event_objects_event_list(Evas *e, Evas_Object *stop, int x, int y) +{ + Evas_Object_List *l; + Evas_List *in = NULL; + + if (!e->layers) return NULL; + for (l = ((Evas_Object_List *)(e->layers))->last; l; l = l->prev) + { + Evas_Layer *lay; + int norep; + + lay = (Evas_Layer *)l; + norep = 0; + in = _evas_event_object_list_in_get(e, in, (Evas_Object_List *)lay->objects, stop, + x, y, &norep); + if (norep) return in; + } + return in; +} + +static Evas_List *evas_event_list_copy(Evas_List *list); +static Evas_List * +evas_event_list_copy(Evas_List *list) +{ + Evas_List *l, *new_l = NULL; + + for (l = list; l; l = l->next) + new_l = evas_list_append(new_l, l->data); + return new_l; +} +/* public functions */ + +/** + * @defgroup Evas_Event_Freezing_Group Evas Event Freezing Functions + * + * Functions that deal with the freezing of event processing of an evas. + */ + +/** + * Freeze all event processing + * @param e The canvas to freeze event processing on + * + * This function will indicate to evas that the canvas @p e is to have all + * event processing frozen until a matching evas_event_thaw() function is + * called on the same canvas. Every freeze call must be matched by a thaw call + * in order to completely thaw out a canvas. + * + * Example: + * @code + * extern Evas *evas; + * extern Evas_Object *object; + * + * evas_event_freeze(evas); + * evas_object_move(object, 50, 100); + * evas_object_resize(object, 200, 200); + * evas_event_thaw(evas); + * @endcode + * @ingroup Evas_Event_Freezing_Group + */ +EAPI void +evas_event_freeze(Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + e->events_frozen++; +} + +/** + * Thaw a canvas out after freezing + * @param e The canvas to thaw out + * + * This will thaw out a canvas after a matching evas_event_freeze() call. If + * this call completely thaws out a canvas, events will start being processed + * again after this call, but this call will not invole any "missed" events + * to be evaluated. + * + * See evas_event_freeze() for an example. + * @ingroup Evas_Event_Freezing_Group + */ +EAPI void +evas_event_thaw(Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + e->events_frozen--; + if (e->events_frozen == 0) + { + Evas_Object_List *l; + + for (l = (Evas_Object_List *)e->layers; l; l = l->next) + { + Evas_Object_List *l2; + Evas_Layer *lay; + + lay = (Evas_Layer *)l; + for (l2 = (Evas_Object_List *)lay->objects; l2; l2 = l2->next) + { + Evas_Object *obj; + + obj = (Evas_Object *)l2; + evas_object_clip_recalc(obj); + evas_object_recalc_clippees(obj); + } + } + } + if (e->events_frozen < 0) + evas_debug_generic(" Thaw of events when already thawed!!!\n"); +} + +/** + * Return the freeze count of a given canvas + * @param e The canvas to fetch the freeze count from + * + * This returns the number of times the canvas has been told to freeze events. + * It is possible to call evas_event_freeze() multiple times, and these must + * be matched by evas_event_thaw() calls. This call allows the program to + * discover just how many times things have been frozen in case it may want + * to break out of a deep freeze state where the count is high. + * + * Example: + * @code + * extern Evas *evas; + * + * while (evas_event_freeze_get(evas) > 0) evas_event_thaw(evas); + * @endcode + * @ingroup Evas_Event_Freezing_Group + */ +EAPI int +evas_event_freeze_get(const Evas *e) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return 0; + MAGIC_CHECK_END(); + return e->events_frozen; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data) +{ + Evas_List *l, *copy; + Evas_Event_Mouse_Down ev; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + if ((b < 1) || (b > 32)) return; + + e->pointer.button |= (1 << (b - 1)); + + if (e->events_frozen > 0) return; + e->last_timestamp = timestamp; + + ev.button = b; + ev.output.x = e->pointer.x; + ev.output.y = e->pointer.y; + ev.canvas.x = e->pointer.x; + ev.canvas.y = e->pointer.y; + ev.data = (void *)data; + ev.modifiers = &(e->modifiers); + ev.locks = &(e->locks); + ev.flags = flags; + ev.timestamp = timestamp; + ev.event_flags = EVAS_EVENT_FLAG_NONE; + + _evas_walk(e); + copy = evas_event_list_copy(e->pointer.object.in); + for (l = copy; l; l = l->next) + { + Evas_Object *obj; + + obj = l->data; + if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB) + { + obj->mouse_grabbed++; + e->pointer.mouse_grabbed++; + } + + if (e->events_frozen <= 0) + evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_DOWN, &ev); + if (e->delete_me) break; + } + if (copy) copy = evas_list_free(copy); + e->last_mouse_down_counter++; + _evas_unwalk(e); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_event_feed_mouse_up(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data) +{ + Evas_List *l, *copy; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + if ((b < 1) || (b > 32)) return; + + e->pointer.button &= ~(1 << (b - 1)); + + if (e->events_frozen > 0) return; + e->last_timestamp = timestamp; + + { + Evas_Event_Mouse_Up ev; + + ev.button = b; + ev.output.x = e->pointer.x; + ev.output.y = e->pointer.y; + ev.canvas.x = e->pointer.x; + ev.canvas.y = e->pointer.y; + ev.data = (void *)data; + ev.modifiers = &(e->modifiers); + ev.locks = &(e->locks); + ev.flags = flags; + ev.timestamp = timestamp; + ev.event_flags = EVAS_EVENT_FLAG_NONE; + + _evas_walk(e); + copy = evas_event_list_copy(e->pointer.object.in); + for (l = copy; l; l = l->next) + { + Evas_Object *obj; + + obj = l->data; + if ((obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB) && + (obj->mouse_in) && (obj->mouse_grabbed > 0)) + { + obj->mouse_grabbed--; + e->pointer.mouse_grabbed--; + } + if (e->events_frozen <= 0) + evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_UP, &ev); + if (e->delete_me) break; + } + if (copy) copy = evas_list_free(copy); + e->last_mouse_up_counter++; + } + + if (!e->pointer.button) + { + Evas_List *ins; + Evas_List *l; + + { + Evas_Event_Mouse_Out ev; + + ev.buttons = e->pointer.button; + ev.output.x = e->pointer.x; + ev.output.y = e->pointer.y; + ev.canvas.x = e->pointer.x; + ev.canvas.y = e->pointer.y; + ev.data = (void *)data; + ev.modifiers = &(e->modifiers); + ev.locks = &(e->locks); + ev.timestamp = timestamp; + ev.event_flags = EVAS_EVENT_FLAG_NONE; + + /* get new list of ins */ + ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y); + /* go thru old list of in objects */ + copy = evas_event_list_copy(e->pointer.object.in); + for (l = copy; l; l = l->next) + { + Evas_Object *obj; + + obj = l->data; + if ((!evas_list_find(ins, obj)) || + (!e->pointer.inside)) + { + + obj->mouse_in = 0; + if (e->events_frozen <= 0) + evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev); + } + if (e->delete_me) break; + } + } + if (copy) copy = evas_list_free(copy); + if (e->pointer.inside) + { + Evas_Event_Mouse_In ev; + + ev.buttons = e->pointer.button; + ev.output.x = e->pointer.x; + ev.output.y = e->pointer.y; + ev.canvas.x = e->pointer.x; + ev.canvas.y = e->pointer.y; + ev.data = (void *)data; + ev.modifiers = &(e->modifiers); + ev.locks = &(e->locks); + ev.timestamp = timestamp; + ev.event_flags = EVAS_EVENT_FLAG_NONE; + + for (l = ins; l; l = l->next) + { + Evas_Object *obj; + + obj = l->data; + + if (!evas_list_find(e->pointer.object.in, obj)) + { + + obj->mouse_in = 1; + if (e->events_frozen <= 0) + evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev); + } + if (e->delete_me) break; + } + } + else + { + ins = evas_list_free(ins); + } + /* free our old list of ins */ + e->pointer.object.in = evas_list_free(e->pointer.object.in); + /* and set up the new one */ + e->pointer.object.in = ins; + if (e->pointer.inside) + evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data); + } + + if (e->pointer.mouse_grabbed < 0) + fprintf(stderr, "BUG? e->pointer.mouse_grabbed (=%d) < 0!\n", + e->pointer.mouse_grabbed); + + if ((e->pointer.button == 0) && (e->pointer.mouse_grabbed)) + { + e->pointer.mouse_grabbed = 0; + } + _evas_unwalk(e); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_event_feed_mouse_cancel(Evas *e, unsigned int timestamp, const void *data) +{ + int i; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + if (e->events_frozen > 0) return; + + _evas_walk(e); + for (i = 0; i < 32; i++) + { + if ((e->pointer.button & (1 << i))) + evas_event_feed_mouse_up(e, i + 1, 0, timestamp, data); + } + _evas_unwalk(e); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_event_feed_mouse_wheel(Evas *e, int direction, int z, unsigned int timestamp, const void *data) +{ + Evas_List *l, *copy; + Evas_Event_Mouse_Wheel ev; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + if (e->events_frozen > 0) return; + e->last_timestamp = timestamp; + + ev.direction = direction; + ev.z = z; + ev.output.x = e->pointer.x; + ev.output.y = e->pointer.y; + ev.canvas.x = e->pointer.x; + ev.canvas.y = e->pointer.y; + ev.data = (void *) data; + ev.modifiers = &(e->modifiers); + ev.locks = &(e->locks); + ev.timestamp = timestamp; + ev.event_flags = EVAS_EVENT_FLAG_NONE; + + _evas_walk(e); + copy = evas_event_list_copy(e->pointer.object.in); + + for (l = copy; l; l = l->next) + { + Evas_Object *obj = l->data; + + if (e->events_frozen <= 0) + evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_WHEEL, &ev); + if (e->delete_me) break; + } + if (copy) copy = evas_list_free(copy); + + _evas_unwalk(e); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_event_feed_mouse_move(Evas *e, int x, int y, unsigned int timestamp, const void *data) +{ + int px, py; +//// Evas_Coord pcx, pcy; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + px = e->pointer.x; + py = e->pointer.y; +//// pcx = e->pointer.canvas_x; +//// pcy = e->pointer.canvas_y; + + if (e->events_frozen > 0) return; + e->last_timestamp = timestamp; + + e->pointer.x = x; + e->pointer.y = y; +//// e->pointer.canvas_x = x; +//// e->pointer.canvas_y = y; +//// e->pointer.canvas_x = evas_coord_screen_x_to_world(e, x); +//// e->pointer.canvas_y = evas_coord_screen_y_to_world(e, y); + if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return; + _evas_walk(e); + /* if our mouse button is grabbed to any objects */ + if (e->pointer.mouse_grabbed > 0) + { + /* go thru old list of in objects */ + Evas_List *outs = NULL; + Evas_List *l, *copy; + + { + Evas_Event_Mouse_Move ev; + + ev.buttons = e->pointer.button; + ev.cur.output.x = e->pointer.x; + ev.cur.output.y = e->pointer.y; + ev.cur.canvas.x = e->pointer.x; + ev.cur.canvas.y = e->pointer.y; + ev.prev.output.x = px; + ev.prev.output.y = py; + ev.prev.canvas.x = px; + ev.prev.canvas.y = py; + ev.data = (void *)data; + ev.modifiers = &(e->modifiers); + ev.locks = &(e->locks); + ev.timestamp = timestamp; + ev.event_flags = EVAS_EVENT_FLAG_NONE; + copy = evas_event_list_copy(e->pointer.object.in); + for (l = copy; l; l = l->next) + { + Evas_Object *obj; + + obj = l->data; + if ((obj->cur.visible) && + (evas_object_clippers_is_visible(obj)) && + (!evas_event_passes_through(obj)) && + (!obj->clip.clipees)) + { + if ((px != x) || (py != y)) + { + if (e->events_frozen <= 0) + evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev); + } + } + else + outs = evas_list_append(outs, obj); + if (e->delete_me) break; + } + } + { + Evas_Event_Mouse_Out ev; + + ev.buttons = e->pointer.button; + ev.output.x = e->pointer.x; + ev.output.y = e->pointer.y; + ev.canvas.x = e->pointer.x; + ev.canvas.y = e->pointer.y; + ev.data = (void *)data; + ev.modifiers = &(e->modifiers); + ev.locks = &(e->locks); + ev.timestamp = timestamp; + ev.event_flags = EVAS_EVENT_FLAG_NONE; + + if (copy) copy = evas_list_free(copy); + while (outs) + { + Evas_Object *obj; + + obj = outs->data; + outs = evas_list_remove(outs, obj); + if ((!obj->mouse_grabbed) && (!e->delete_me)) + { + e->pointer.object.in = evas_list_remove(e->pointer.object.in, obj); + { + obj->mouse_in = 0; + if (e->events_frozen <= 0) + evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev); + } + } + } + } + } + else + { + Evas_List *ins; + Evas_List *l, *copy; + Evas_Event_Mouse_Move ev; + Evas_Event_Mouse_Out ev2; + Evas_Event_Mouse_In ev3; + + ev.buttons = e->pointer.button; + ev.cur.output.x = e->pointer.x; + ev.cur.output.y = e->pointer.y; + ev.cur.canvas.x = e->pointer.x; + ev.cur.canvas.y = e->pointer.y; + ev.prev.output.x = px; + ev.prev.output.y = py; + ev.prev.canvas.x = px; + ev.prev.canvas.y = py; + ev.data = (void *)data; + ev.modifiers = &(e->modifiers); + ev.locks = &(e->locks); + ev.timestamp = timestamp; + ev.event_flags = EVAS_EVENT_FLAG_NONE; + + ev2.buttons = e->pointer.button; + ev2.output.x = e->pointer.x; + ev2.output.y = e->pointer.y; + ev2.canvas.x = e->pointer.x; + ev2.canvas.y = e->pointer.y; + ev2.data = (void *)data; + ev2.modifiers = &(e->modifiers); + ev2.locks = &(e->locks); + ev2.timestamp = timestamp; + ev2.event_flags = EVAS_EVENT_FLAG_NONE; + + ev3.buttons = e->pointer.button; + ev3.output.x = e->pointer.x; + ev3.output.y = e->pointer.y; + ev3.canvas.x = e->pointer.x; + ev3.canvas.y = e->pointer.y; + ev3.data = (void *)data; + ev3.modifiers = &(e->modifiers); + ev3.locks = &(e->locks); + ev3.timestamp = timestamp; + ev3.event_flags = EVAS_EVENT_FLAG_NONE; + + /* get all new in objects */ + ins = evas_event_objects_event_list(e, NULL, x, y); + /* go thru old list of in objects */ + copy = evas_event_list_copy(e->pointer.object.in); + for (l = copy; l; l = l->next) + { + Evas_Object *obj; + + obj = l->data; + /* if its under the pointer and its visible and its in the new */ + /* in list */ +// FIXME: i don't think we need this +// evas_object_clip_recalc(obj); + if (evas_object_is_in_output_rect(obj, x, y, 1, 1) && + (obj->cur.visible) && + (evas_object_clippers_is_visible(obj)) && + (evas_list_find(ins, obj)) && + (!evas_event_passes_through(obj)) && + (!obj->clip.clipees) && + ((!obj->precise_is_inside) || + (evas_object_is_inside(obj, x, y)))) + { + if ((px != x) || (py != y)) + { + if (e->events_frozen <= 0) + evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev); + } + } + /* otherwise it has left the object */ + else + { + obj->mouse_in = 0; + if (e->events_frozen <= 0) + evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev2); + } + if (e->delete_me) break; + } + if (copy) copy = evas_list_free(copy); + /* go thru our current list of ins */ + for (l = ins; l; l = l->next) + { + Evas_Object *obj; + + obj = l->data; + /* if its not in the old list of ins send an enter event */ + if (!evas_list_find(e->pointer.object.in, obj)) + { + obj->mouse_in = 1; + + if (e->events_frozen <= 0) + evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev3); + } + if (e->delete_me) break; + } + /* free our old list of ins */ + evas_list_free(e->pointer.object.in); + /* and set up the new one */ + e->pointer.object.in = ins; + } + _evas_unwalk(e); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_event_feed_mouse_in(Evas *e, unsigned int timestamp, const void *data) +{ + Evas_List *ins; + Evas_List *l; + Evas_Event_Mouse_In ev; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + e->pointer.inside = 1; + + if (e->events_frozen > 0) return; + e->last_timestamp = timestamp; + + if (e->pointer.mouse_grabbed != 0) return; + + ev.buttons = e->pointer.button; + ev.output.x = e->pointer.x; + ev.output.y = e->pointer.y; + ev.canvas.x = e->pointer.x; + ev.canvas.y = e->pointer.y; + ev.data = (void *)data; + ev.modifiers = &(e->modifiers); + ev.locks = &(e->locks); + ev.timestamp = timestamp; + ev.event_flags = EVAS_EVENT_FLAG_NONE; + + _evas_walk(e); + /* get new list of ins */ + ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y); + for (l = ins; l; l = l->next) + { + Evas_Object *obj; + + obj = l->data; + + if (!evas_list_find(e->pointer.object.in, obj)) + { + + obj->mouse_in = 1; + if (e->events_frozen <= 0) + evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev); + } + if (e->delete_me) break; + } + /* free our old list of ins */ + e->pointer.object.in = evas_list_free(e->pointer.object.in); + /* and set up the new one */ + e->pointer.object.in = ins; + evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data); + _evas_unwalk(e); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_event_feed_mouse_out(Evas *e, unsigned int timestamp, const void *data) +{ + Evas_Event_Mouse_Out ev; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + e->pointer.inside = 0; + + if (e->events_frozen > 0) return; + e->last_timestamp = timestamp; + + ev.buttons = e->pointer.button; + ev.output.x = e->pointer.x; + ev.output.y = e->pointer.y; + ev.canvas.x = e->pointer.x; + ev.canvas.y = e->pointer.y; + ev.data = (void *)data; + ev.modifiers = &(e->modifiers); + ev.locks = &(e->locks); + ev.timestamp = timestamp; + ev.event_flags = EVAS_EVENT_FLAG_NONE; + + _evas_walk(e); + /* if our mouse button is grabbed to any objects */ + if (e->pointer.mouse_grabbed == 0) + { + /* go thru old list of in objects */ + Evas_List *l, *copy; + + copy = evas_event_list_copy(e->pointer.object.in); + for (l = copy; l; l = l->next) + { + Evas_Object *obj; + + obj = l->data; + { + + obj->mouse_in = 0; + if (e->events_frozen <= 0) + evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev); + } + if (e->delete_me) break; + } + if (copy) copy = evas_list_free(copy); + /* free our old list of ins */ + e->pointer.object.in = evas_list_free(e->pointer.object.in); + } + _evas_unwalk(e); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_event_feed_key_down(Evas *e, const char *keyname, const char *key, const char *string, const char *compose, unsigned int timestamp, const void *data) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + if (!keyname) return; + if (e->events_frozen > 0) return; + e->last_timestamp = timestamp; + _evas_walk(e); + { + Evas_Event_Key_Down ev; + int exclusive; + + exclusive = 0; + ev.keyname = (char *)keyname; + ev.data = (void *)data; + ev.modifiers = &(e->modifiers); + ev.locks = &(e->locks); + ev.key = key; + ev.string = string; + ev.compose = compose; + ev.timestamp = timestamp; + ev.event_flags = EVAS_EVENT_FLAG_NONE; + if (e->grabs) + { + Evas_List *l; + + e->walking_grabs++; + for (l = e->grabs; l; l= l->next) + { + Evas_Key_Grab *g; + + g = l->data; + if (g->just_added) + { + g->just_added = 0; + continue; + } + if (g->delete_me) continue; + if (((e->modifiers.mask & g->modifiers) || + (g->modifiers == e->modifiers.mask)) && + (!strcmp(keyname, g->keyname))) + { + if (!(e->modifiers.mask & g->not_modifiers)) + { + if (e->events_frozen <= 0) + evas_object_event_callback_call(g->object, EVAS_CALLBACK_KEY_DOWN, &ev); + if (g->exclusive) exclusive = 1; + } + } + if (e->delete_me) break; + } + e->walking_grabs--; + if (e->walking_grabs <= 0) + { + while (e->delete_grabs > 0) + { + Evas_List *l; + + e->delete_grabs--; + for (l = e->grabs; l;) + { + Evas_Key_Grab *g; + + g = l->data; + l = l->next; + if (g->delete_me) + evas_key_grab_free(g->object, g->keyname, g->modifiers, g->not_modifiers); + } + } + } + } + if ((e->focused) && (!exclusive)) + { + if (e->events_frozen <= 0) + evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_DOWN, &ev); + } + } + _evas_unwalk(e); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_event_feed_key_up(Evas *e, const char *keyname, const char *key, const char *string, const char *compose, unsigned int timestamp, const void *data) +{ + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + if (!keyname) return; + if (e->events_frozen > 0) return; + e->last_timestamp = timestamp; + _evas_walk(e); + { + Evas_Event_Key_Up ev; + int exclusive; + + exclusive = 0; + ev.keyname = (char *)keyname; + ev.data = (void *)data; + ev.modifiers = &(e->modifiers); + ev.locks = &(e->locks); + ev.key = key; + ev.string = string; + ev.compose = compose; + ev.timestamp = timestamp; + ev.event_flags = EVAS_EVENT_FLAG_NONE; + if (e->grabs) + { + Evas_List *l; + + e->walking_grabs++; + for (l = e->grabs; l; l= l->next) + { + Evas_Key_Grab *g; + + g = l->data; + if (g->just_added) + { + g->just_added = 0; + continue; + } + if (g->delete_me) continue; + if (((e->modifiers.mask & g->modifiers) || + (g->modifiers == e->modifiers.mask)) && + (!((e->modifiers.mask & g->not_modifiers) || + (g->not_modifiers == ~e->modifiers.mask))) && + (!strcmp(keyname, g->keyname))) + { + if (e->events_frozen <= 0) + evas_object_event_callback_call(g->object, EVAS_CALLBACK_KEY_UP, &ev); + if (g->exclusive) exclusive = 1; + } + if (e->delete_me) break; + } + e->walking_grabs--; + if (e->walking_grabs <= 0) + { + while (e->delete_grabs > 0) + { + Evas_List *l; + + e->delete_grabs--; + for (l = e->grabs; l; l= l->next) + { + Evas_Key_Grab *g; + + g = l->data; + l = l->next; + if (g->delete_me) + evas_key_grab_free(g->object, g->keyname, g->modifiers, g->not_modifiers); + } + } + } + } + if ((e->focused) && (!exclusive)) + { + if (e->events_frozen <= 0) + evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_UP, &ev); + } + } + _evas_unwalk(e); +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +EAPI void +evas_event_feed_hold(Evas *e, int hold, unsigned int timestamp, const void *data) +{ + Evas_List *l, *copy; + Evas_Event_Hold ev; + + MAGIC_CHECK(e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + if (e->events_frozen > 0) return; + e->last_timestamp = timestamp; + + ev.hold = hold; + ev.data = (void *)data; + ev.timestamp = timestamp; + ev.event_flags = EVAS_EVENT_FLAG_NONE; + + _evas_walk(e); + copy = evas_event_list_copy(e->pointer.object.in); + for (l = copy; l; l = l->next) + { + Evas_Object *obj; + + obj = l->data; + if (e->events_frozen <= 0) + evas_object_event_callback_call(obj, EVAS_CALLBACK_HOLD, &ev); + if (e->delete_me) break; + } + if (copy) copy = evas_list_free(copy); + _evas_unwalk(e); +} + +/** + * @defgroup Evas_Object_Event_Flags_Group Evas Object Event Flag Functions + * + * Functions that deal with how events on an Evas Object are processed. + */ + +/** + * Set an object's pass events state. + * @param obj the evas object + * @param pass whether to pass events or not + * + * If @p pass is true, this will cause events on @p obj to be ignored. + * They will be triggered on the next lower object (that is not set to + * pass events) instead. + * + * If @p pass is false, events will be processed as normal. + * + * @ingroup Evas_Object_Event_Flags_Group + */ +EAPI void +evas_object_pass_events_set(Evas_Object *obj, Evas_Bool pass) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + obj->pass_events = pass; + evas_object_smart_member_cache_invalidate(obj); + if (evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1) && + ((!obj->precise_is_inside) || + (evas_object_is_inside(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y)))) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); +} + +/** + * Determine whether an object is set to pass events. + * @param obj + * @return pass events state + * + * @ingroup Evas_Object_Event_Flags_Group + */ +EAPI Evas_Bool +evas_object_pass_events_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + return obj->pass_events; +} + +/** + * Set an object's repeat events state. + * @param obj the object + * @param repeat wheter to repeat events or not + * + * If @p repeat is true, this will cause events on @p obj to trigger + * callbacks, but also to be repeated on the next lower object in the + * stack. + * + * If @p repeat is false, events occuring on @p obj will be processed + * normally. + * + * @ingroup Evas_Object_Event_Flags_Group + */ +EAPI void +evas_object_repeat_events_set(Evas_Object *obj, Evas_Bool repeat) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + obj->repeat_events = repeat; + if (evas_object_is_in_output_rect(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, 1, 1) && + ((!obj->precise_is_inside) || + (evas_object_is_inside(obj, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y)))) + evas_event_feed_mouse_move(obj->layer->evas, + obj->layer->evas->pointer.x, + obj->layer->evas->pointer.y, + obj->layer->evas->last_timestamp, + NULL); +} + +/** + * Determine whether an object is set to repeat events. + * @param obj + * @return repeat events state + * + * @ingroup Evas_Object_Event_Flags_Group + */ +EAPI Evas_Bool +evas_object_repeat_events_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + return obj->repeat_events; +} + +/** + * Set whether events on a smart member object should propagate to its parent. + * + * @param obj the smart member object + * @param prop wheter to propagate events or not + * + * This function has no effect if @p obj is not a member of a smart + * object. + * + * If @p prop is true, events occuring on this object will propagate on + * to the smart object of which @p obj is a member. + * + * If @p prop is false, events for which callbacks are set on the member + * object, @p obj, will not be passed on to the parent smart object. + * + * The default value is true. + * @ingroup Evas_Object_Event_Flags_Group + */ +EAPI void +evas_object_propagate_events_set(Evas_Object *obj, Evas_Bool prop) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + obj->no_propagate = !prop; +} + +/** + * Determine whether an object is set to propagate events. + * @param obj + * @return propogate events state + * + * @ingroup Evas_Object_Event_Flags_Group + */ +EAPI Evas_Bool +evas_object_propagate_events_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + return !(obj->no_propagate); +} + +/** + * Set pointer behavior. + * + * @param obj + * @param setting desired behavior. + * + * This function has direct effect on event callbacks related to mouse. + * + * If @p setting is EVAS_OBJECT_POINTER_MODE_AUTOGRAB, then when mouse is + * down at this object, events will be restricted to it as source, mouse + * moves, for example, will be emitted even if outside this object area. + * + * If @p setting is EVAS_OBJECT_POINTER_MODE_NOGRAB, then events will be + * emitted just when inside this object area. + * + * The default value is EVAS_OBJECT_POINTER_MODE_AUTOGRAB. + */ +EAPI void +evas_object_pointer_mode_set(Evas_Object *obj, Evas_Object_Pointer_Mode setting) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + obj->pointer_mode = setting; +} + +/** + * Determine how pointer will behave. + * @param obj + * @return pointer behavior. + */ +EAPI Evas_Object_Pointer_Mode +evas_object_pointer_mode_get(const Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + return obj->pointer_mode; +} diff --git a/src/lib/canvas/evas_focus.c b/src/lib/canvas/evas_focus.c new file mode 100644 index 0000000..ad6e259 --- /dev/null +++ b/src/lib/canvas/evas_focus.c @@ -0,0 +1,98 @@ +#include "evas_common.h" +#include "evas_private.h" + +/* private calls */ + +/* local calls */ + +/* public calls */ + +/** + * Sets focus to the given object. + * + * @param obj The object to be focused or unfocused. + * @param focus set or remove focus to the object. + * + * Changing focus only affects where key events go. + * There can be only one object focused at any time. + *

    2. SECJYs-b|9Q5*@_B!K+=OffjbCE;5oiE8et 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

    Ge~ohFmh4^uFmPVot&RG=&7r7IY8UkJ5G*f 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

  • lqFZJ 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 z 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�f=YcTDGiM z!ZF*6S2u?$I6JAn=^!71t)6QTZE%?jWDjG)?c?uu?{BKD#FUbXHLXh*mn;c2HsP7w zb2ah}{Y%62$B!$ab)tK37RQUtChUc=hgTdMK3N-`az(b`JotU?PwpLvI}&IHpt^0LF=T4tF(eui~7jMQiI@ zY3xx}+1UJmv1&xffx`rwB%sO8D`E9cPdm0SFXfNy)d7&bliJ^KOk)uPHrn(yN< zrbWwlw>)Tg;zKHHghe_83cMyA%7C6Y*wVPFa&dY2x@~)wS1c(j-_W+dr(1g1198|N zHOf8ls$Ofz`#%2DXL>rDx2>osTT-!ocTb2G5|vw94uIUj5)1{7^vfuLH!ph}k3RO( zXMgp=q4p+ORJL+w&-$gDYqoUvo(H>ny5I?f{6G~Zf$f|ag2#IBwTB*k{HbSu{lZJf zdzvwBNyYNbE&G;NlrJi;-m~uzv*Y&oLvBoyP1+M@tOs8uZ~4@7zxn;2Uw`*-$L{(S zmE{$o=FS75@=#f*wynFHNVq+2$TrA`!Iz}Ye(+`Tz~X!5jrY#>9ctUXzG_)T`Ray8 zYAQJ~tFm#=u`a_&pYo3yYCrhW!;d}jG;chw{O$d-{gGo`Ejw0*%9k$R)_HIRoo^~b zE$t6<8z-F*spM!}JRi@JLVx0Czj*$|SKoU7Tz|xh{QXczbKQ!{WfiOT_v~C=v2;-40vbN=g8rteq zENg0mxdU!m4l5b0rRY3h)IRge7yk6x+ovuJM%>8Thq{`#R);EncgF$uz?&f^@&y0$@=T;q%2fXD&wu^9SOc)`Z@#a3S!HPL!B-lpSv$)b_I4lX z;w2r-$Xm+x$uqpDKlapfzh+kce!6#%WbE4yA8u`0UlppXYCie1)f@m8TD80FFl!Dr z8_>-%JdZ#9bIr&*;)zF9cXR#P(DD@H)x?)+`@-2J!9qxh$z)RWd4|x@R_z@FO zUVG189E>DH-WoX6*1Vy5`HB_IhaX>8T~WTcsT(zP0V>VII(+C(eme3d6(r^Q+(g`LAz( zaISACGBUzyYq^iw+Ny>Fk8WC3QL%XWj`l+*C`ty@K?``*Lk~ax)X#tOBJO;69yM1* z&OG|d)@>VBt*>5t_<@6KS8$ry>nof09zD{1p!2{1!p*Jr$dk|f;zCh;t zn#gYt9oSR9X7#%2ZI2z_v6{p4mfyE`-_f3)?(PHTUe?_F{-wXZ_1>A@K63ikM4o^4 zM0?|=nzhw6`yc4IZ&i7D*~-R_!w+>6G;ZaGS-8J>@#WXwe*f%+i~WN`;`r^+<9oN< zw`Sv-?MIHZuH*E>^6HlT#}4%z=m3xW=`+9l?H^xx{qG-~Ip2G!4-PTBcXVIN<_&9W zR_^KQx_=cBUbeaIz_G6GZeU4n;6J_k#@|0UefIoC;0+kAjlA&C18v)D*VnDy-r2c# zeW-lN((1;pV-I$9J@GV4F_-u8aKsSl6EV&Fj|JwC-%^f0Kl{aRe*e;6-h9WPAV35CgW<^akv}~BQ2UOp8|&88k&n5rs(kU%nk{<|o$UVQ z^DqASwKom!0RjQiG8FlE{&pC_W z0R(?M^2Zl`(!Oik=DM17&F!t5R+TTQtl7G^`@~DHfUJS1U^6ipz{5{QUOMquTf>&k zTh=|aZ%^xe%UBE>cXb|q_4U8K_4eQ2m2>Ea@KcdLz4=JT?uOd>b*p#nYudK4qP)Cj zNBhAy-h}Yo4^E#s=fxll<)0sazHP_$&G&Ek^Zs3X?_0HWapi{HJwk!reII!MF=qNc z6M5zM(UzTc_itRc>p)}U=1_S>^^W!!m2fHf^4Z9%L$9>&-d?w5!|xBY?A^S+VsXX# z-G7s5AYQ$fjB)=QdF_FdEjzbvUAJlXiN+nZYbq*NG#G7=fN!z9J{NiYgZAd_TefU` z>O@QHW`bS0MluBOAR`?4*T@?WJ+h~9+t#&pt&cTqt6jfzaTQBJb8B?`d*pB7_LiO7 z>(?KBu65U@jVmk41%(L+gPYO*hacP1+^}`cmVM9csIO)2L4hu4;e{h#h`igrr*UWf zy2Eeo-L`3CRmItJEJcV1I-Y5`uXfFH=0(%}<;VwnTN|6}*B`pn zaX;3wV$9X|pFGiuq_tbRp5Ad^?P{bW{;QD>_q8^**KIuX-l4k9o1iq;o`$rkb?uge zPwm)Hr&xY1a^}?j)}{mXn-Bf!@TN^fT&C)`cVAjGTXAf9uY! z`)d!KJhYi#&kgj;y_qR57-d}t0;J(NWk@G`;KHT2c+{S2k z!Tq8<)!W6A+Iiou{gH1+EN#QdvDYF>T>!(%$b{Cwvuo2@PNV=LbVgXx8b?;?Sy9E1i|pVe8B|i>&&) zo7b)^70JBPYFeM=%`2~3y;{d`jP!}%+Pe4dtEno&mb}vPm1xVG7pht>86$k&S$d@K z6M>!H*}T5G0@w5AZ3`_CdExRZ*=(;&qCDAAra!69t$lAzby@zrd3i-;HT0Luo40sH zO-(h@5`7$u7bAMN?!Glug_5;2w6b799^b3htX}D^Oz@dw9Ig7KxuNWys=%aq z3%9LY#POzi3zt`IFw)|E$}}g`#nrx5zqNMrx>bwv=gptLX!$CmvvftxnpHZTB+h5o z$JHg)zFEJup|O^j)8TG@{<7+|oLw|`KJO_t)m4xMDV`40ji?n)(71>7U0qH`n)yY` z)|KQF{smPl)~~L?x_}QS?YgUK|H_$`4N&&fZ(h5ql_P+%%MGt)~;j4FPO7nN!4m&we3qp zx>ft4VQB9<^3W5{{q`kl9=dDSuPQ5~GtSZ#&Ga6dPdCAp>sAwEccq1j-*JrQw#JtB z?xPPq`HL4`;-UWbJ6N@>v~c0VlIptJ!ubp5<}a?QUSG4Sic>DazS_jv-_~u}vc0Kg z-+^O4`ROlS_|q$YHBaQ)jjJn43yKPtY}{K}xPa47m#tXE-J`QHIB?J9G*Q8b&)03a zzhT#&{RdAx{1m(|Q;kBU!F%`DV`WJ}LGh|h_b*z=nNEdOE7sr`%x>+oAc#8nu>SrX zyIVUBoqXi!U%c?g|3}_?$47l$`TqKTXGRiWTvPV9yRZH2y>~Z>Qw%~4kicMUYzI_E z5~3M3gbM1t%#1XnUS?EAy(6kCxPie2vYWeilikFzopln&afwUff=x%#s0_dNc}6(S z@BVxLyDvP}%=i18=bYy}=jos4oVNuF@#$xue)8wO&i2~MqS9h(*U<+2+2s^i>Kogs zA3O{FPblU55o#&sJIP;T#fA!bDdmBv4pZ?6hk3M+4$JuPDC@Cpx>gcX2!9!q? zqp?-0jO#}noC>wp{hu%&rpU)%eEDC0_8Rn{Za)6_qmMrPKoeIS|~cp&k$g6^Z=Id()oY;h2$V)@4lzK=Y97b?VXG7 zzW4s{6YUMwG8Um-PFF>7o|bo`xUR9yNnJNKa`^VAo?a=#5-PrlHl@+Fak*gZP}V9(n57 zQ)hqr^Irfg`mZ;A^l!a|7=Uf0HZSz_I9YbvD(X5r=oj(|@+d)jdvkMrFWmq~u}?qu z5))z|J+FgqdGoiw{oU{0(%$-4iUGO@#L5?6p6PWp*IKH|E1O$etY!HHxrLVcCRa;y zqdLlc;+Yptp9iY+pT89R2sjXOcSU?}hOb+pzoaje7}lU-c$ z6qeLAIon#t4jz5##K|+~Ia5*~56J>Gpa(@R;32>$%qK<%nBrS&Dr=fs8Y?l$yi!{u z)^O<9)6boJnPn13gaX$=3zET`zgZ+#V5Mu!H)eZ#+Zt*uw#v4)#`;P+!oqS#lhgUc zGtZqmbCwf4p+||@Yj(c@^Z-yu;Atp;9MpUU_|36FS4*9xw!FHbrLl_e+4;!O>^%Mg zN62#csty5P{ncx)iwxk({`is1-30ptf0?)3>=|lnsH?86>T79itfEyERn;}OzVMPd zmGw#R3##F@*MAKxjV?q`E{eHK-MuUx|LujL&Xxw&MOBTh^|neRD6uuQsx!}@{0rck zpZ)wlKt}!QwKv{;>m9nSPd^uW=2J{?7gz-TtpA|1$ziFjdb*{diFTb=Q0{0^D?Xq( z|Lfm>_A{{pus{IlAXXDz!AH%?D)8rT_V>0mI_#BI4Q=&yOL0MdNllYN#Zhi(6;|rk zzd>mqNbjYlz|$V24!HTB-d{f9YO1r@tB*Jvo2sh{^7G3bf~S)M=Km!!|MGPzOekTx zI3X88&HKxR_xt{L>~_njn;`2|Mfn9~9JzB;tt{nN(%2QDn%6IistC3DH{Ki=X3TYz*EG3nYpN>< z`wb;E#A)p>g{4neCh*KinGlMohK1MW=VoU=|78cgOKnx>Xk%Tq=os4qu|@-hBM>^e z=ua+ud4=Tx)6Kw}hIwsHo7Lvte06Y)IfJ9z)-u3m3;jK0$|QY&Lm~U((sjgy%>U+s zcVS+K^o`j$)+63)zv^gfZmO;7dX{aJs^S8%CD4rueTX4^{Mp4thJT@a-AC!Y`5Ke& zmL?dt4m#LNDx{D<$A*6Wrh@PN`NE~e<&o*82d49LbF(6^aP_hy@%E)(u`X<`t?oKc zjP$DFf1@W66B6Q&KfQQWErS#i%&RSENbH@R)92=;6cBqC-WckWajC-AHej!^meU6S z9Te&h{`C2!YrYj9Ffv7|&+5YW7Ae~P;8j<9v$LkU>v^ZeQU&enSpFYajS6E~2pOnQ z6eSe{TkY$_bDn96?rLdjsjO)i=EC_mZ@t4FfvVN{1;c{TC$Ql!#q}Q^=sO-sq1eXpsG7+Yk>A#v$8n; z^95OWL#m@%kM2RgCWyTYl>LU(*Q{q+X!UEKU%&CQF}JI=rPX5V?6RRHdZuZQ=Fw*j z9&I*YZh=}cdbRm!_=%jt@Dl+odfpqPupM@r%h~)1Hh*J=1)4THF)Bi@k7z~_-MD^LyQ*E&u6qP!NuOoBId#o5=yJC8+G=~0U-hLN(OuY)m=GNk zh0mMl-O;h!kdBVqE~k^85DDJ3=-=e7KEgTDq$JKkdJF|?_>CZW@jDby5bllFEXt{`;AaQ-PxVyPkBhF_e z6MffWvZyU`aW|IiqKWY!$=H_{9Dulo*%e5BUna)m*eGfX?8q*9OI-X8&P&;imsH}} zX9=GRyLN1kiNW1%)V6KhRgKyj!$Akh*n;P9l*49n=q!y0AR~ZA3?b*Xq|5cLTDg2O*tBW(MedO&nhQcP4b1&G~3?Qxsa6t_g2@&uqJ zIaT8X$*}EX5+`okNll4riQf^u6}7}lSesb#55y#l;z2`Fi$j->IC|a=N92h`dvJ=0 z-5M1YgY@Xn5Ep=XC}akr7`DAn?sBZWCw14(L^G13^X*Y`$vcWS9PC4ZU!g@X2Ur8n z&_3V@mcUzzY9CIeP!A>~G1zbt79CAF0^&@Vm|@48>JThZ&cr4CuB5b#+!DOnZ;LT+ ziN$wt0&KVwy)Aw_mTQbN+69gwI?}fNP7bjpf`(9K=9O9;yLREiY^xGbuAN6kn>krS z2L!z3u9uJQ0;jNFqsz)Kv(&Y6j(RCk+*L)J@pr}_F*&Z^iu%}tM^5F2f-A1Sk%FO+ z?YooGvJ1+r^=+MQPAe0z`e?!x<6{?biN%(n#3eqWcv>+g{ukH;9Na>dyf?eB+}63urfp9Ya**6-2o}v6&xRSbg@+6h$G@vee)C3Y4r#u9h#PRYnEuB@qVZF6@gKjv_jEyIZj)aT& zRKYz2%YmNLv-8WUYU-L=+g%-c$0e7uwXu4~u0$FU^@|@QF6~E6N5{pRDSj-qh8rBk zUtATxny_Pc%D$Y!ax!3dfXnMnCi;!_wKcevNr;mecH1Arm6B8%oeXTHcbF0Ll>%ty zPq*!SEG>f*-)ehZV>6x-+HeWcSnnV->?gZ+?})+gnDkC~LZBw&6A9i&6%Z(loN!M3 zWnAJek)M-WdtC$mD_SJj;{xQynm<35u@etXB0*vz{ON+xBFDP1(BtY@Cm3DAj$O(7 zvN@%;)jDLu%+NRwEfHZqsIfbCJcgS%dWQHE{QJ?b(14{1sRkjwOszkbnvqk$`RigN zN3Cv_(;Az^tcAX=A&Gj7qf;~|?ugq;e;cz^3P2AXFZA(=JE^mSLClCIB6Z}nR!KJ#94;fJkezdFuGu~S`3!g zY&8z5qRpALb9bUS4)+TPER8%SIvV+DTg3U>@mR{f?7YIVipr{L4k{$Z?t;})tyh17 zFtv3UQ@gXHWB2auqCkvl&I{q3-G(96500 z$rCA$?V?{qWf-iqgJ|5u(~IweJfCpZvq(S&hB5-Im%YL1X|33ByGxj}$M(!~C(mr( zLpMU8${lE42B#QCf%vSP++6l2W(ta+FY$$sf06_L8Y%lC`-vk@oOu4!nR6LCX-Hx+ z1O%cxB8TX0+j7{O&7}l|WFY^LqP)sdSzYThD9R&r2hC;1KEB>ssLJ3d3cXZ2E1N(k3KWjMqCyQ7j&6eSg4ojLr?6z#= zXFaOr>ji%j5y}>eev9`}#rv#&_TnoqpQ%lu8PYW;CB`M-BZST3Ftbk3K2pR2F*PA4ChqfG#A5=2lmC z54&ts-HR`Y0B2u0Bjj8(x^CH-M35zH0snGzebIAUqbP=!tL43uUqC&QLk;`xZLaR# zp>Z}iUpNI``juN5Ja2gZVs{CRS&TV}IUenCYmT1thg_;bngP`Z|F({vfiZR#pMMbm zFzjDG{nCpsJg=^tzVSlAj$}eQ(WT(K4G)1)(K%uTid<@6$h&%n4^Z>ZgCEwcV#p2p;K1m*swAl$er$iakeI(M|AzP_R{=Gh)vJE0iYWt7VX|c z%cTKt{KHpueP&M&8 z@+IhNH1q|9B|=|Y*X-;WVh8#7b1$6KPtJ>q_QDm!`d#phwjty7MjUlmb&v`;;L#9qwwY)685$6jU<=Dd7t zrlP9G(dEd$LpU77Fx>i?D40bI5Ih2xN8sd^aO^hPngcfKwVm4 zscmR?OI-n@N7&=H9siY}(jj{O#M7MdOpFcK$U=7)q{hKh2G8 zxdF?CWx<+om-)HhJo^m92S$e>?s4}OB;eb1XM#D=yvY|3S#0(+=OXQ zh&!%X06@^|&;9z@6Hh;R^w8wk$Ur~Tz5N3@2~57}{;@T)Pv|4uWasMb<6Np1$7C~- znOv9Fp4CqL2Eh+aj*kpN-R;-)K7QoT z0jLL{?&|3q9A=yH#EYjZK(}qrpu*!P)7clZ~Q7otE8@l#J8JAClK7;^VP zP2V#lJ>Ltb&;B$umqpUfcynUhA>|To;mBbE+`P(_1(5}EAr|V1(c!^9A9X*}j~{>j zGzaCs=slK%02u7{TW&CaaPywOa)r49M+jechZ%fx+5hGeb2W|=zU~%NTw~q}ySDzO z*Y9TS()(}XW5JFmv~_mv#5%ivBGPU+f$If6#uIDprW0%I{wG%315SkFbM1uxi7@*D zXbzM7J^m!WL+$e@f-fQVxu>566XB05wYd||fT)mfvoG`Z8NRNvdrrM{{6+OW$nJUm z%!#LuKZWPDm3Gf_C(j=T!=?PO-DjUU{=%6Tj-Pz$xWD*kyU#v-^tqF-P*qPJ7r$)$ zo_yxTmtP`Re(NWGWWUjW_>bUi!rt9d7r(VI_ z1ub^I~?vKFT8x}>}e72 znd5=-VzQ^Bx3j*cdHne47tfx1_QdngJOjmlvtKyc-`(ERTIc9F{5-dfUOaK)1(nx7 z+A$!4PWY|!(;C5Y+ohDQ8i@G&;7^)ofD@$+w7P56s&KW}}5e*^9`_;?!|0vba7 z=9#PWEX0q{>J5Pn!G7~>5b}mEoj^ze8&>&g&bgLW!ioDg1o?SdWdpIE1S|b!Tb*5; za4l(A;Wy2ktG%U7CE^#WsE#&HO-Od1-%MRwJ4+Ht_#?k*c7~m@BVik~eeM8_@85zw3D_MW?fsqvjXQ5-3k%xzPNyu5>C7y1Dk1?KZC7y02o^B$7@W2dO^3MR(<~Q!Q`SI(W@|qS$-3VtTwFqb8)@26KH787FB%zA)Os`uG%u(D?>N(d7C6X;fA;&J}TKLS(- zB+#j_WhQ$#EF{$L>uk)3CtQRx^MD?OJ-B#MBrxd3^W^(>JqlmJY>bepIUz9NUb_}` zJvJUJF@R#ODj@T{_N#2Su*0(rkE|?riPZf)`xT~EGR>!4k~z=5YuBPl7{#u|P9$Ol z2JLt4UNesMZp2Y45sRTdFrJE4N zNmp`{uH>e;*r6-ANmqi~9siqjC5sNI#R;{z=vj)p9&to{%Nez}^SR}a`j%7byOa}a zaRKz#&Z)&g^|x+*PdTanx}$1wR{gg(|LH4-)wi5h|HDlz`%XVQpZ}A8C9l7HZs+^g zKVN^xcbpN~|8M??uKsT>zm)y|u>Gn0zGF9xeLgxeGCX80&1i4R86N6!f&6&p_~S%; zFpgc|m7U<6g?ST0LtRbX-OoIIOx~Erz8D=LB4cr0CXmE-cTWbB>cd3BG>v^(Q&v%2 zkTW*qZewZr3=`f%zUKsrtjNn8?eA#m>`Z^=aU3`E+&K0{Wm#2u!Tzz4p3csW9vB}z zc+mb`yFPZo!d?^bn-Q=?on2YaJaOdc;YsyItNgO8yriJ0ur!}do2Q?C{OF;>W4zJE zJ};~&D=jHzm!pL6MHx>YJ9dz{x_YG*e31`PNkJ(ghxW_T{Ww zNv^UZKLXkCw*TL zRLJYkD^JS)it6SOq%@7)XV)@31!eXw6?s*D&!lEoS(*kUSgLoNjDKYJWTfYp+q*~g z(Rp8tR34>dRa=_-M*~N-u^-xJGWHQnwrgy3>F5tBM^^hrxkqxySs+{N>l)?1~yn6*y)bz1Qx^%qS@1 zopH=75m?ou^sF*#^8hhtbt1wNeAY1fJ-e1ZM_BI`>vnv@MffI>6i8AXrCdr*N>1XOMTn}^t9$*tsVRn(%gKB8?ApGQeSEl-mKFQ`z|WAP zCtqVjrPgY#tSl=lDaQM)o}wjdN!ODdR>;fBfC&2C=O>S@B_}2Au~b!*gU2hx->sHx zNYau$tdNcB`crA@c4f4xu4gPx9{fTkYqOEK;)k*80sQ z?b%!87vVRbnq4h_cKV)f-;=)IZ;jvVwjC*1x$;FG6bfa+4jNRceA}MHqe@1~8J=a) znB?n@Bu-l@YhgCMZD(2*FiX39-@a#GPC=!^LHt9{wq0pi1!WG+5#~3weNRSCVRc=d z13^8ByX8o&POl?T;-0LWqH4bLeEaUy?1J(-gM3d+%E~FW@I6?iC!;!}eBYjwDbI~{ zt0cWJs58m;ojfnK@IAa;q4UU|??eyJTPO^*Bgrg!Ywx4*EO{5AF4105?f zIC$&G_eUh(oxZ=I+Obr9Pv*$d#`hn}b2L>=8kO*eBO!-wD z!Wipx`MqmTW^Rd94rLrVPri>f9!tq0M0NmAyh6w$rIae-;e6k3b~pSg@LPJXD%}3! z>c#IV(mnG1d%|OHR-uI;JAB`n%sH%lXV6YC#$O7*@B8=ta8+1n@XA#oA)6l9AR~5y z9)B@>b!f<{ApR#WHa)QMei^V6wD^mw!-9i@R)mFytPBYWdjN;RGB77-t1pEHOZru- zRt8J@b?eph%aTLTec@yi92~ak{&m{A@4`S^fARj{RV%~8LRJNbggm$rx5VpZR8AlQ z+Pd`-TEtbjKoPoeBVn~7)T;{;(JLZiZN%EuiiTh7BV|-h_>#T@xN2 zwsCz#Jr|!H9^}Yt~TI2i8l>Fy7p2 zH*CK0;6o3sUbA|2817`r2Wft2_ilbrdr;qWEqqPrMxLz`F&M1%2d6h~+VtRq8=;pN zeQVc-Ggx1GVAF#S@p%vlMciooZ$k7D9vkbZFU7ETw<@^$mWTVn_XEBqdMcngRB zX7zpZqd(@%+8iel$~MpVp39F}l^vi7c|Ny=6`lI-*^C^-ht=bVb)cRLc7WlU=bXIr zo#A@(!#@U3!4WvCaP=Hl*^JOg@F@-V6*T#vEW?fgR$)B?8W9(fZxL7Gk-04~ana^LBHR7| z88-`F1a<-H_w?pRevFW83uy4rV;PMfdiW8TaulvY3HzQPMl{x(VT;F{2nI<;6wwy*FO8mqZE>o=w#%P*t)T?Gy?>9L@HqkS!uD~vwI$S zSXIyxiCY}|9TiDQqAC3iQI%xD>ic|8En;OM>-&h`+wT*B>6Xvi75KUpKew_-7QePE zA(RhWSzJe|g|@C1+TznzKDT__ioaX=NP78*FI@TD@{KEga^-W&Z?5>zmCr4oy5e6~ zKEnUj=a&Cn@x?12-=h5Pul)3i+_yeb4*A?F*CnRo<72~py>3_UyQNhPUGCf50l0MX z_Vj9a(=qjbIxsjmG{omH0qMsE`ue)x{>{P4x;FP6ZWHNd1zgc9E^zww0n^YWnfG(( z(Dlqyqve)H7CU#i4R|dRKSL_bpgweIcuxXZ2Kr%Y0L`}*~M zZNM<74_`gZLV>)Vdv&D3-o_o2zrl4Fp0)b=jr|J)gG1VoHhgsw;rn}YdPd5v^-{~QPyO4$s#+(Y z|GQyg#PgWS1X;9!8-u;>g06v5YoohI@41ur0V)px#*4Jtz;tidYi}N_vUl_tdu~V2 zK=t0hd!^;+flk{bdTZ_p;9`rRdl|0PEui&I^Xk7!EcNc5F1>RJuL9lE!0!j-rOFQHeBC$>6mNM39OK<+ z6MOf)mTbic)aw9Vo7{5)!@So9wSjrbT%VZWpKuVkG1JEM(FHaSzLrc^>Rad*W+sXvhB_sSrqRU= zMJ}x$cVz}re#O<)HPg+V6V_m?y0lSk#4EXetqjY0mbh=_N?E#DN%|6M!}?#+>Ag!Z z6s=p`h70U6jq7CQ9id75m52e{f1-kxE+)`NboG8tDO|j4-9cqwi{r*o(_g(YV8xnP zG0b(OG%hkh6iwZR+xexp6U#VQ_wcx)e`ZOQaJa6C!GKj!PPS)JS#Aj|>kF z8HQ%1S|yUH<4bs{j~Ip*#rE%|Q1Xsjc;m~U9uWib zsa=&^e4#CoR^+~Ye5t(Gzk0ub4C0gRHn(?d{C0BYt%0}N(2UQ5r6d}9)5q>$ZEjG? zSQr`{ShNzMr8UVi`3_d=MugUer@u0Pe_s2$XPvC6WxakoSr|vJD&rlNM7|cJ_e{Hc z+-{d7(?<x>7e-;JSq0L+uO*_z~X*6T$fUf6xi1kq^H$;J$>|_ zovnz4GBso~jNK-wlr4Ju`vUsroUYaeR`6n|Myf|y?DEkYQqey7`%HavuC}K7F?2f4 z!d@d2BdNcZ2>JCst%E}|C)H~ln;E4D@}J^+EBW-TJQ2SJIjOC4#xTXYsve(`&BO%1%Un?$N__To{tK-~1}`E1(3+*n`N=v08u~ z3U06Z+ln^8dRZWZCG0I`o*%BxDXFsj9WQiCfb}Xb*tWhU!j*C+Gh zY=<**i>obv|J74i*LK&i!(g?lr>a;5o?RtXD8g#6ejBWyfvmk2YoK+yAa`sMIjgNk z>o+Y1^+JQ^OzvK*B|E zX5)usbh~At!e;#k^tdHY(@{wPMKoI2b+C&m%F|^koo+EW*o~-F zY`otM40MZ(GtUK;lOf65nR;ovIuF(Z#I}BgF)M}RVJkT+NP#GO_b`q+JlLVMPkXuVuhHM_O8FV*WRiZ;7H(BTR^TOcUA^OHwZs(fL#$GnLjOgkP^+pwInN7FOWv8d7Is6?a)b+JjOQ4#~&f2#(OOg3IZm$bKm|D~p zX!BUJGSYdog#D>N-oUdCiFl0y{cRo`Q>ABTI=;;-*}~G0QB2Qhn?a1dys>NcKwd0$ z-1F5-%{HA48BW$5#2ofV)BuV%>tO#-k_-Jz_P%}DI6NcNvB+z5d|R@&Pt|5;rl)0R zWt$1gJnz%131j(xRNm8>8T)v*-^_lOPOeno-`3r5WM!rA!~L7N#*RBGHsaLdsm%2B z{WzZWqCNt&}iuGTt#|9aV&y2cLEiuJp^sS3){pMrrmjm6@mtpWDkse>xv@n+GB&N)Ukbl}%VyU8vV)-$ zp3J}o-txG6%-49y+k4kPOh`RkAQ~65SRQw``5OCW;bGz1;vd->E$$Khp%WpDNF3)M zcc=NfWV||P<7SZTW`Fi!eC%c0L0(^tWZ!H>A(we#xyAq_UZfJ%T&y6IyUaJ%K)&O_ zhu8p$4P1Qdm76Y-fU7~~8*3@vhV8P66uU$vSWut~_GEZ}hk1H+Sa{?k537BerLnrG zPkb;M(bIDCba+_M`Uj&_u>yE`rxNQnvli~zy5(VRA+e8R;`!Y|6o5i!R)=iZ97RzA z%p&XGQw=jA_j5HPCY~J}!au4f6Mw)7+!%V8xnZ?=UZwnm3UpZrzZ_DAgAgyEJyW zS$1bkN^hciqj>>sEsI@d4kU>@$3G%@={%2%T^`F;lcdGk{z9Xf=dmGPF2N*Fuh`-u zD=|BR`S#cVc_T{y3msQ`c;TP8$|6Yjo;GgK1*$#|?{ zIifBls{mE(K=W;?NCB7v?lu#Ed5~ray4B*Anitqm3?Qw4+(NwE`jU#^I)tcRN39?} z$i_&?RgIZ=Knmpds*O5Q!NmN{xZ6pslc{F@N4_JPW?rU#+<`Qj`Txao?%?loQTcMr z>`s3CEe3xVfBy!%yobNv;`cZC`wa|3gXg#Seh=RbaQJqtf$vLcEO3iu>rOJdeeuCP zK9!m8Sp0oAzr7(eA9*0#dUwYf&9lKY2od^DbSc@~jqr0Jt9YuD`5lW-@8J8wsvv3p zu)llp>2lJ}vt>@6s^Isa8e`m2vYiWE6|@pt6(MP*vXzRx!!uA`vRNNQhoCkNHMC}= zi2iVx4Q59^1TB9{Ju=E8(yk1q$;zX<;I5lJ?8C1N36AxT{U*;u#YVF?I7kax2o9n3 z%ERS~@r)$oqyXc+^>98oXjQNlybxlJy)E_|RPQqLRGcJZmp&}^4jzf1)5sAV5*!*9 zdnbGilxiw?Rd7&na7g$D*kZ-8N8?Au8YK!Tv4kdRd&VUj@Y&C&}>8;HG~ERE)= zkYF+hA%l&e8g9<0{X15xMiy2qHSv7G{(-Ucvl>f7oxMJJ4{+V_0|$ot`?@>9<~8X} zGmV`c9XPxh@-0I3e)hF`{S}$s`L4}U&oG^we01`_1ZVSXb@g;OTiTkM8k+za;G4cv z=!UgH?*JQFKGJvL*x69S!B>51^5KIAAp{}Z)6<1B1?U<()%J-#WEl1=F5a|07K}Y^ zll%AGU3J!Kd!r*Q8K*uI6XRq3L+*2>%K>*ySi9%%T@%7dh~?IJ*@kC-mSMaIO^(?_8d9H9_i%B z&`@t50=G6bH^EoP#6Q2kTIQ>rg??GPvP^%cr`~R@tFKQ^J#q-H6C)#oy>c*uTSn{o)KOdSsB74h0_J04VsvD1ptrX}JV$6v zvyDn;26m8U&kYT8jLk~(YdL(x^1BCz4fXZ*l%&Ie!6zugP>;I{;AfLK5rNRiM>{8b zuu1@p4UL5%sqxvq-bRN7@!v_^bL8j*_ziIAy>3A=wlp=v+3nLEJ5uM)u?=MyQOtG7 zMfw|!b=>-?Z`_l7lnC?M_{CxNlil1wrsz$C3g~pB^tn!<*3Qjh+rz`up2`C2L5Xv^RSl>3EquwSD zj86;?1HQ-7+LYW>o8C1~yn=IvbNYZ+wt{7CEc-$4G}YB$W=(qzA31Pv9HtmrFY9v* zt;r3Y@O0za=-kvR{R6U#jMAZlc5b-UA$9#h^PZGr2M+QIzm@> zkCJ!(?92V^+;|kdlv*za8F7)a#*TrVnjNHPN(L)-rUs8=|N9#H~U3w>7CQgPMvA%m(zwm(ScWr z@O#wQ;*jfch<`|=ALHskZ%?PIlZMg+|L$J0Q1qU&=gz#;Imvf6okfVnJpR}YXuH0# z`LSUxYfK(EFe)N+cDbZuLVPz{=iXlA*U!$L{+F>D2@bNjef}HN*w)lgTi?(~7eT#G zD)|SxyV*f$YlhU_)6+-sdk3*p{p`%?p)*x=JeC~ffZ`7WgRKpCPHb*|j8mA&gJWYu z!vp<2U9thwjQT`%BD{A1{@Pj3nd;ZdYum&UZk-Z*>}s^z>YJLAlMWx1x>p&v#n>Cw zAx01TXsE1T(a)SKJymLL?qp|K_V_>O>&G97y}r3IHRZ?=v@d4pxN>;T#K0Z7GUAGH&60H~u=Sds`NtvPh*H&v?7j%K{ zD?LD}>$p;yjInUcq#e+Qr)BJM(VZjhR4@G-8}b7KO4=LeetNp1)+Jq~JJ9_Ru3zXr zT9S~JhCRk55e$v8wzV|M=@k{id5PiN%-QpM&z9O+x+Eeqo4OyiH`mp+w6^Ttf9&W1 zS|`n8u%E{4#GMk{41HcPB-6Rsy2%n-W0z6w|9|LeZ>Vo;YDrE$cJ$!nq49CH=P6$o zM%CKa^EINg!{heGE(xS#aDRl87CMXOq@za;PSTLjir7L|Cj*W!^3d)E2F}y0^G z(Mgw_R=k7%t%f?>Xe6Z^Wjtn>VjHr*$K5G-eXJZy?;Fqu7S5fQ&hmWntL64i2^eJP zeyy$E0jj+<<=C-9!1x$qsD$2bHv?RokFK8$-r@7-&%JW4exStK!i*uH>!a?DmO49f zCV>|`K!3y8;V?sLcSl=$JDSk@>5&HqhtF&0XCNFJqkLMI0Y7vc2r%5VYxUE#>{NQ2 zLzCL1HgRJNP-GW_LtFcRVPK}eZ-~zA9OP54oEvCS<>aVC#!88Y{ZU7AeM@6=JLEJN zOjhpt^mZ}-aJI?NGc!PZ8M>zPhV!#~UoErub(#nmByR9tbG9|1r}pHOqsP$G7;}M< zp*|)cuJ$&@3W_Cmz4K#dYke(_H&PB$Hv*NMP?M$J9%p+y!cJ46 zYV4)7+S!?|mMVvgOo5$mGhkp}^{p*!DJe$}PtYrkGhYI}h@M^Tbl)5w%J^~h9MYbz z`S-HgL7`mI`4Rr>nj2bLT3a!6nV$)ylCsI}d^>i)oJ{Bt76o;UTU%sAGfLDfz4KK! z_sr|t+MFrPN15;-E~YfZq)<#kDs^aRgeT+Y;rWv%JLPZ}dlx^1TIZ)s4B8y6t*H0d zA^K6D9S-(!vU}C#92^=L5aO|sF;UV_9($w0F(IeEMmen0yWZ)f$7;lHTwC(t!^Z%8 zj*m|=DH`ab%{bc!g!Kr!;8(|pvUC1iU008lixC{;F70~1wWYqLr7b!2=+T4HuDLlj zB7tiyckKUlc zoI9WQ>k3DoXsDZMA{y={hd-jhrbz<+e^S z`lTEoeN^AVtr-jf$Sl=DPb)Kvu5OpqPgaFiiOO4vEI(ba3~6rM69!Iy~%Gf>_AagP(LJH{+^VjRpd zdP3q(=kVw-)anrP+zfo5>aS{)u~Y`OTN!XFuZ~cAraA2pqn`x9dSzl{P*qL`S|*5- zWO0L1pZ!VI&&%uFJ^px$oP|FVP&xM3dj6C`z#gmtvmK+@bPbGUoRQImLwsXYgg-kx zW@+=WH$u;H)TH4 z%dJOQSrD-bh6BCby})Zng+2ZM___11{G{K3Gn8ms&Q`lF+x6A+$&aO_YN=Z67naKM^2+kk zBJuEO?M~gB8fUgy#4|!^VKJch+-wnWue!0WLso0x)PYkm5mL6j4c0F#$-7fi zQqs(^pk&L-ONAZDXV{U2VNR|gcOLLN8^I76@4uzD0 zrOg8*pDA+U0#wiSimd)>liY|}OqP$+QuYus!fY1kF04=no>%v0W@PM3$1lM3TwJH- zpwwEH{@^?9wYnU97@##+=D`@JX=xschtG*}t^D#LKOx?WV*v!!@@8}LaH;|Ed>ua2 z$&rJNGpB-v<^99^x8qs%4RtN8&U5E>8X3t()OBTEVc^H70V%} zVA+`&C>1vlxu#sMC3bXB@r#VrCO&)oM%#_OX#}N7$BBy#*BbMjE8??a8rE5qG#%VG z(L>O#mgmi92{mn1engb;n&XS1u0K($f}kc7u0Y_w7hRJFvWxIv;vbMb zm=3ZKUnF+f@|Pon_a%>-y(yF+of23?YxoMqE^@N7uw5lYzU1%)jtFEIr-PGJB?oz+ zea-#>S?oca>k}bQ&(rc}5CgBS9n8GFPL5YJ4r}K{4B*1{ zE43LZN$}4wn`^2nEAZE$m3&;ZXfElnEy$zsD0<=V#G0pl#c)XdYxZ|iF}C!*F)`Rn zCCy0glyJF&6N~hH1^M~-gr)Sjq99c0d`Ej5r{&f$zjtlW@iP=vG0 zvf3WA`m17dkYxWDeG&2{HWml`u#^r4A&E-ELu!2rkqbD~Efjru*s91Zw{TMTA0l*3 z?Y`7xQFW|1;FQQ8Vs8kXNo%B>QdC8%RMpm2RLe=KobqWk?`EcgxKG~~TPBSIzH*)n zX?8Z%tgfmQ6zYYdB>@by^;q&aPZiSlGWYF8N3<$<`b-=h!ILf#h9az?@LI8OM7^c$ zxkVNOgnzVUq(PRk4>BsI48trEFV0j9qC%$?cnZ1wQzXTlM!6}&IfPj;a!UMRCVc>r zSf~~57!XXPxP)s>V$}Pn6sgO?i(DxxQU=-KOl$$)UJa$m`f(Qe*}E^@94A)+qzfqF z#t=-gW*V24e?hS<@=5F5Q&N*x1^_^ja)AQMj94q3R=MhqIYXy0a@1Dnj~|o8BD$Ov zwV(#%SQ>vmncSlgrTXd;6DXCs6ywh<h`kBdyRGi>^XOKhfbz zv1S&OGgQr6EmqW{S>MmjOiRr~Ub78rmpC>Q71idVARI!&QasIE^A*+QEVtp$)Ik3z z1IT-5iI7tnK7o~LDJo4oJ1YyeBCS?@rNmb$u9Cu>B1RtrXS{I!$eNvznnFY$7*nO7 zFG?{asIj9=B-V?sLa1bp8psB$pmA_*vV3OEOiRfSo;L1@&?hknp(J{;d6**WoN_Ou zm)t~&=_pIm{bYW_+%w=On`?P(3jH%M}}Rs zxWTeW=CN>ypO%80m(4UI=6Ir2x?M3tI7->RgqVL~3ms`CmcmLfD>BCL*>@pLlp2c} z(0wv4OBqGj*_@IRgx5>2@kddPROgk^(VMIWqx;zgy{-P#=*SY>=L|b z;fsj>m%*;HBXMkhu~pH@^y!c3D2DJTH zpaz>lmuOZG(gF~`gfCRl;DoE9&)Y8*Qd(v#(>pcS%)uJe%G46$5j>T3c5fC;q58a< z#!WX^ETxow1@~hxHb6G*>L~6~&4huB=4}Kxqgg-B&dSJU4lILGX@yb`?(1_!+H!H) zRjyMZDJ_|W)m9)UA|Mg#QlGcDCJ5;8MRZ6MqN=8NC_B65GV|}pV=~VAfo1}2GmYF zl73psRIXJ_m9xv@auwT(Xn_W5JOGkw*|D*5e~x~xqMT+kBg1>{{&G=1otRcW#a>;9 ztF{s?(z!xK)zy5yKaO(I*Wl-j8G%%HZjLD7sz_S_MaS;`>|*!?U?5Ce(F5b0MP^J$ zCY@Qq9Fxuc%)Sie*RXC8%}Fb-l-_~#VpwRS=DLmE1=Y#8BjU-xlb5U103*Dtbs^oz zAXinTOgexR(I7yVYDU#cve!#yWrWNvHK@m>rG zv>qhB^pprD9j>FcJSIjWo*Y@YQne%n7}^)uO20j$aAU%9WvET$ftUJuGN|q=bfraO4}d78uBy)gS?cg@ENJ4U`4jDdQF5L z;f-0u?EuVKF(ou%Ql>~P(i;Jd4$bv2&d(uH;^`4uOdy4!e&Q|$iSB~KgSp8E6bY~p z6jvxwcrda_fso7)u@JKrM1qh2ObNOSk5wYqhV>%X+BNzbj}#{)gu2pKdxc^)CTc6z zAm$@QdM|F}eLs@Igl^ctZ8;1sV$Es+CQ+#<8^OR_O(8&R^j4u03lf~sN9ay?t$Khv zeQ11L1f`J6e<7hE!gqlSdRoMMWNgeWgVx1BbeyCiel)8=JIllFv+@fs5Wd0On6o#>q zW)QMrqtNjm$_v-RKclijBdBBuh0;v%wopP7MrAU;9~ZP@1%if$Y?2C#h*-B)Y?tEs z_^pXBMNCt)tvCbV(8^X;+eJy}D*i)>nPz9~$>Khepel2L_ij}K^ z!h<)79wXMRLkC!d>L}zZ%7|F2v_YYwwnjbzGUdZKa}d1**F!_^rPjfB~p6l{yOW%jpR{wOYZk2)9pt)l45q z$qZ`^5tktJ3HZbHn{dmSKm!Ow$Q4ipD|_TxsOr+DRktA;(a?xoKJ_fp>RV>kJ&N}q zz*AzDbHS_NsRdmKUA0j%E=W2pCSz!Pmk zfPm)oxX*%D1>LtQC^#(S0Zai-$`V$KDTIC=u|^3kvf~Cx8q@uc#3U>QKBvWf!i8nv zQRvxc4D{(p3`&zOeR}O0R3x-oByLv4hQc4BwDC$}L&DW~&{Fq-T?$*Zal?8NEzlTg zPCg5q4~3r=c}WajOi*P0-e&wc$rz{k0Dl*`{|x=A&`lJXPM(fYTYE*iT&XB{W6qI! zrU;;sU)TCs|I*GgfLhRCZZm;n&RP>F3BB5#PcqPDDlC^j}hE`%@O-&&9RRB0?Y zn9k&W8Pe%qMPuP%TG(_bcA>gE9fjecdF#DkG{r2n1XH}=R6ha`b|1(t8Q7G8P-1FX z29HoFsYZ*%v_;~m==;`VTlnu%7hHAo@0m2L0MrF%DQ`sNdZCS26N+U@15vFcQfQ~} zGQa*|JhUeOZB*m8`5H}P#j23tu#Li4TX%`hLWW{!!^6ZZsj4}#G2CCxMul%S$0$`9 zM{VZoHYZm3t~#~g@{aV zjnJ?XRBmVpDxMZ18QY@`xNcqlXe@>$sL?M%=ne(F7P;|$-`D^{hRN_*28MOgf<#jW z1XZQhHp}K*Gtmv5UZt*o9W4tFW9{XR3kh9b% zx9zocm(i>!M~2$awUms(JTii^O-HR*FFv!S*_qAf&I8mTu7^-s&Vz(1)$Ez0wKe7eWSK`0IN zdIB?!;E*upksH=)>n~6RQu$b2c$n&peXVp#oO=J@ejGA07m{}7l^Eai@d+X*4cf;U zVg?fiC9F<*NB-$pU38QlHMfIH)nJ?zPw#4JAC4L(wZD#xo`F!Re<`XySa zw%)^V6^W|#aB32n=cU-FTv&e}ckJ9VSL6l&xKe_vA)&ZLKxUs`1%0hos%cJUQ>w)B zKc%mA(Udrl9tp7pc>Fm{`vJ^Px3DgnfDve&sJI+1*|6r%3O*Ugc%q?0h7)Paz`8R9}F1K zI~TgTp;~xFh&*jSs}>>vUEMRBZ7NurA_BqL4;)4tG!7ZLPB=R#fKTYIiTCT%r)vJ) zYHRS($=NGc#`_11!VJ(XFs20{DJJlwfEhrF2>u3!FTbR}G?VvKHH1D&6&+D-n-7?v zkUQrJuj?HEy$ia|$W==b)^OH)Mo80+5{w;E?tp^`RH!fr4MOAt{lLvMG(XsVPRfUy zZ0)7#Z#^kN$D?>7m8&om^swgp^*YcF|{UaYj#3+Bq$eM6Ee zZHN;6`~4-ck;H%q@jm`i?ehcGBn?parO~)V#Up2NL9kegK%p=U8O~ilbNbXvCCA3A z>p+ZtMIc&RP!y`nav64sQ0OAinHw*isu&rst_LYfaXFy&@$sGZ3z_ay)lyV`3r47& z!?XG6mz@2R)eRj2D^MUiflPM`IKszH$Af?>zmHA|cL~(UxwB`^oN{y=s;+k_Qlsyd zvqbI`O>o;Ho)TV%(l*opG%Y#GbpgT1*VQFx&K@3ms&MQO$_nSo(U@RBFHho2L zZE)!2mtQ*dV!Nfz)yetfJfId;Kx9Qm{V&K!ZO|~JLf~qjk&) z_*l_G2TygC--oIcTF}rwqyGevh4y6Ai`Dh*Y*Dd~t$@pmiWOR;@I@`$sW)JB`oNsB zToHd}_|#LcRaslW;Aou-9Rd~tmM5a>J_UoL#M%L*Qgd7a2Pvc=>kwwXTxM(O1b(A; z0y7em*8wzAV5toKYjh?W*)%c^1CA6#xB?|9aI+*7UlDl25Cop+QORf+3>=yrwp7&% zY-%as7cr**Dvd-m2r<=pDFWs_JZGz?#0LBh7`j!9BR`{Cyg=yv04qt#ReWxfgFO>G zvA2$h9|E*9(a1pDW7dKc)%%oj8n_j18upCfLziF@lvxCnp8D{J?*g~GX9?&XtXW)Rcor!PV+L;JkB^Bz1OrGm)7KMALj`0f zxs$nZ43`3O2^>>00!fr;z6PXTMDzNv-~vPx(!~{s zHaP8511Mb)NgLO@#m$7YtVJNz*C>ooOaa97!H^aSG@N#L6bepSlfo78SMl)gpAstp zaiuU%;xsmKfO7AbFR@g6b;ey5o!Lp6v4q<#j;Q9g1fOHxhW&wXP@(LF^ zu90hCwt&Qf^dvP|8}XAtr4wIS#KPM|?;OzkewDpkknxP5Eim`mq<+vl2@DtqE4~_$ zI|kIYF7WAr0AKci<>y9y$-M^;X@?Y|Rt&@-eFdGU@=-&fMS8=~w6rL+B-t;f7ymH| zg$rWOmtOCiQCL#?XmORpot=?ch?Go<2!Na}eoLgqm@sb{jtqUXQgK6rhQT>?j{zd7 zjsug1$@znaWbA{&sNz#g=Oq2DIR8OgJ}U2!+;LV7_ zcmTRehof`3LV2#ZjIf9bcG$;^If&|~CHOO*Ir>C1V%%b=LNp~!f8v0UXonY$NdDql zNA4`pe0-YJq2XfHfEu+_J!@mLis-O@*n6ahJ`E-dh$SN7o}{;L8H0$XCL6U737gtmG2hqsnLupjX#Gv%C6!rT^d;9M0Gy447 z$Pg;lp$%RCiUZo#4thm*^G9K_+*hN(%9&pvr}Tzbd^1ZmE=YeOW5TWa)leUaM7_#G zlHSKy34~r|8Oqsmj3z>L&1*dDzO3am74+ezyFV`_YRW0 zJo7yDbD3FH-GH=nv2%aiMO?(i?%v++o{6}Ni`k2bnYo=EfwZwF=yKhS?95;V2qcVX zTkS2-2Gh{AE!*A!LIUJwM&2Xu9YP>ncbCb^%D&I%d9zx38&FkQna}(9-!H54`+c9+ z!I*O}y0Xp9yO${p0*t77>nmFl;F!4Ss7wYZBtGGmZ1eQSyEv~dF$3-g$IX{_ujqm_ ziC9VGuuIF;li1&|`IbBHlY2niC%}b7<94v;?U;Jw`{mI z#+Kx)h#3v}@|rY&6(x+iVr3oI8Pl+u^CVV2b~6XY0oX!9%M+o))bkr$8@@q-Z%L(}VTyxn0j2xGrCU#_?0R4(UO zH-iSib$+lt~MN$I!O$Tq2?O)`>iF6E)%<#uHeA<-4f zn81NQ|CMyUCSMy(8Q~#kjHpe{a}FP>y-ZNee3i?>3~-TZ4WWhP(-CI4;+AN~Ip?Ci z2HtS7rdT`6MVIJ!va_@0=dErmv61XSZYFfSrDN6Fa&5Mb4ARam88?==wQTwF6_OsH z7cA%dDsEA@!x)e?b3~f2ZLg!%Y-;G=>84gfxTP&}e40wtWJzO9xmJD?GTxqQT!M77 zHKL{~n-*bcO&uYp#P~X_@DMP?(_R}%pg@cFkt&2F4dP!HwDnHx4YEY}xlua8M^og5 z0KDo8C>7AZQ<7@blQ_sqNEXYY=yBDoEa{<&JC8Snoc_v@ERv*GKv3_h*q5*inm4EgIi-SHF>cmF#*`zTE$b$&R>WmCXS|PAG~FuRe9EC|uB~x2~3r794c7a-^6CpU1L`l_#d}GG-mn0C4CG>$8OuB!1ZRiC9@zWm?t z8ka2sB{`cVI^Qsp8_WS*osd3FXXu5%!19E1bH)appXrbB5S%s za|22n%eh$6h38f6wZNz(doD{291*Oa-r!!mC|EtoMIlT9nXtwi^9bMMt!hG=KFC*(UG#Ni2F3GHdjuHO^OG7_xEN`x z$~oT34xQu1SNhIv_NRx){959xHWcJ`ZlnD`ChXvjY_&4}+9>`gTW%U;YxjRzxTbGGW*-2x>1U-OhnW6xY=kWxdmj_{jaw{{4SuO?J(c zYyOInH`h7Nw=@0(GR$?8tl~Ty(V(tHQ=GuVnm=>R+%@mII=j00@BZpPahj)mqga$N z=>ya>@15b`92eC=S6}^a{@g`@i(Fn;yRPhI4v&1V7BCRdS@XJo zZ%Em@vv*Cg=wJT@m>jAcB{TD$fG&unouDq4T@(Pr=$~<*a`x_v@4DuicfRvq{S|YH z7daqYh5)`Xve*@ZIRKu4cQsiwzvNx-eCNOX3#Q|Q-`4^vr8O-9v7RJ8tGG#f*Ywrz z{GZ74{|h3CqT03f>q2h9qS^2SI8E;-|I@p!zWQJM#ouu7Y#l^Lc2UIHTohUDnGd&o z_r+_j{+ECL*8t_bQUT(MX#uyZbrHB&7kUYA5l>|Py|M@lefu`OX z+U8(bWY=OHQ(cQ#zzTpWs09CM@|vsvpZ`d!;TQ9T$ZOVn(bBSlC&@H1_vU@*u7glb z(lr0~U;gK7;W1=@PB|bYhmb0WLd>=B1P@c2cJh=jntaza|Hof44GN_>ty{2aQeZzN z5O|*j;GL1He9_D`|JPqLI~;9fkk@#Ie$peenPekWZS&&4{;O+fMjFekDL!94C>o1u zp*qCNMN@X{UvLOCnmP@nJX(ac9Ir%g#R?vp+PQ1QMtd}BhjhefZxeIDpt-tCerh*{ z9|Z4jRzFTlKv;lOGc5zU#FXB* zOo*Us6pd#wk-Nf}IjEjBYKb^SXMH*}(k|f)uQYY-+Upkbvbe2dxEhE#`P;L#qxoEA zUa}Cma{gt!C=pI=#eIqJm18zjsO+*83k}#q^+jFWl5BtPS(il|0EOcS5JxZHFpd;} zJ?+sGK3f{fN>gGB!LDeX?(44LXSBbBlupp3!kc0WwT4J{FC)~)1T=uqaI{Z(A^>PV% z$&()a^~P=Oog2u@^DB6R_1(qS=SXnX+oIw73bT+_aBJ~0@g5)dBJ*nWu4rjCY|yiP zRY$32i@tah(Gdr-=~G7Mx2?LXVIzc3UJiM0oyT4c+)KS#*k~-&-)MI`8!6tXdK+{Z zx=1z|kG??&U+J6PnyrC5UIF#K@C_%g<>nHhnPNgSypmVZqG%0QtKOJiMk{d#kG~(h z$8#yoYqq}&F3`xoCpE{3ZX2%Ia4xRiWc*+mKQM=4m$C*j`z#2o#cM3Tcj~=Z_$&+ zW`AV8-W2rMg3Mm0QK#n>?~$lYXYxGDrqiFB#?|SE=*eo)+j^ybfSO+MSnbj3v3dfW z3qW?~!NWFq^zC9Ok5zmmEm{v0PyuJNpa!m8lT}gpt=mufc_xOicc5#hp2b9>cc7x> z$cx5fC6l5VX3aorhG+*sBN8G)-tx&SRRa{gAjt>V|7fXGBFS?s>Jj|_*a?Wa+5_<7 zkTX006cd=Q9QNNB7j7->z>ZOR7E17+VsP(a053urEtjcurN!NtqH8spVIN81Vl1BuS5t)U8@$ z4&mPX!SCOB)t z51^6&`}aKFcziC(4zRcfoW%hj^pkE~bnHf~ur0cDsWN$ZYZ9j+0d#s2QVtRC&0{Ee z9u+}vwx@cWR*@;dqI}OJ3*vGJTG1Xx?e7JFegYq#c)VNfB_Rgb7M7YJO?;QNw;ee# zg-7xap1=YNWA1q!z%riAo|wa@PIG4zUP1kOa*m-K^(R_J$VC1p+Cu#CEq}bugFW`U zvCT5;!xcI6DhR&>+JA!F*W@r1PXN}M6Wjm~w8#bD&{Wd`^DUfapBB`i4!}sr_Qo*) zP4IT~;H+iMkuRUD?QJ|>?ycz=_KGLX9yNTT&U5CasjpEFlrubIAG7V-`#_qe1=08~ zyfAxU=d~wWs4*sieQL;>VqgAb$pDRVpWFzaXF5I59dqGxtv!kC-&oR7nO?jS|wX}WA6M`Mm89c7f5k^f3btgH6LK@|k_q{HXS zCtAi*L$ugm9AJFlf!UC+_H~)bC-+vcKuDOV{VZOw;8xv#8j&zucegbAglmsleU}d9cWWr`!7v`+VALB1a>{lLNe zU<<_gV0BRJAKNpmp&U3}QT~Gdcxyk402J|OKgeQ!aE9Lw4=4(N6<$l0+E+GY1bJI(*0gM9*2*V$cup zZ2OSOIW#R>!o}Hs6IVo$_+<{a@&j}Dlpk*4rGy93(vfl)`$F;g!ReT0!`L0J4v&Ax z_nFoMrO2m1F5iknt-~Y3Bl$>sbR-+ehx0?{b%zKIdmkrMdc9MBo`@V{iDlXFG`T?1 zrPb){$mqy0XzlE)!|}z zj_9(H+GsXDcjV}i{K)jg_}C~5$Fi~J=x}N`io=B%InG&B4ab79x$%jk+0l!~jvkpf zGCt;-Vr+KA3UwB%K&mK8??AY<*cy?mu__2ty zJTf;C&WupY==-*d$hswt)v>ZYfz9lA>)7$*C-M{7@g}Q}9wS}Zkx3GaUEJoX0gNXz zGdhBXib%(ch%-A@9B-XCd6LyHpFDoz1b*lMYw?)6&|2h&wxm#zplUQH*5(9ej-SX* zrB9tYc`7@VpUzJ;PEH>qIa;yXLx0y; z5g}z0Q%8@TIC<*S=~Jh()7crmurPf>?JUSfOEec_?Qze9VwFg7S=^MX0q|~*iY+Doj!f0e&*HFm^^us|FLxR=*0N=s2!VOp*>C! zu}7(5DNTRm566xpeEQ6pv;2RS@25|lG#3{m50ODG$!JFN%!LxoRoKn8|Iy=wc>2uQ z;%s)V#p+m$f)f{xN8^y0xHwvRX%FLujo%(;^=qsS+vm=mJ$vrlnOI(&YM-PaZ>0K- zyPOMj;z+^bVysCIkGnRKd-^o%vU4!Ib)2$Pr{-`xJN|}&ca|RELZy@Dj!YQ&cw0YS zrBP3ujO9;1{me5@Y5P?D)YQonCr_L>&SD7~@(@6)Mc#Pe@TPJV&?XQ}VDC9Vkms4K zx?*(=yeZ>*zOo@YB!bTxM^a@#%uSHoz_2|QfYpE@Ko>mBR`!7U0HgqNuUd^k4n^Q4 zQA3bfVFeB|h+jNwfa4_?$mC04dwl6&v3g2o!5Y-BF5qiO1_1Y2m5}}ddP0d@01hz+ zD&UeK4pT@jhLvhH_%Cu-u5JwhVgS7iU4gMU!XaN>8=BF3*b56+bE?LgAci;=NC+%W z!x&m9)LUEQqGY!_(JmIS0Jw6fM+e040eSfXA!h->@vZLCIx^k76sIPLN`caNE(dd~ zgllH8KSb2oP($mrcs{g|B1j@h9Lq#eNB69_%9?UbYwemL`4_PkhjluH1F>>dw`Vg1 z)&v&6b`Ei*d@jOMV{;A371xBUz|Wz&RF^e5kQ3kXwLGWxI9X&Br$pedc$C?IN8$ss z39ha0lYmZZTo4Yah#X`tIl~nhC-pJ^$Va4Z3==x4+WIX??z096a{Wf?cpap<*7*yV^jmWex7Fi2r6}rr71m)A;EkQ`gNe^Yt~kN0~pp7%Tw@l2YKdaW2jnN0d%ihTLWx{ z0wB7F9MJr_8nT!TI)PPCAVa#fe%(6M&aT66o**j-1&mp)t*yfo6Nq@m>I$5YW%cl8 zmKIcbw$6|-7BSiuo!_Ux3ISGmtp;RnqJ=GPy^W|ZOoY+VsaUuUSwWt4pmw<=yJ zDV732=*4;ku2@%3si+ZIv|npYc!9dGnxmnYS^n#&C}>(=7O`gJv6={e?UXX{Ep|45^TIyGV8-IY>~2sL)P4Pin%}Yw zv--ZSJ1I8?tyRc|+8j4F@?QZmTy4nLQ;qeJrxGU$yu|9pd_%FZwn5$aSFW!Jm0sZG z5=-@sZL#vM4YQ6D$F~f-k%nU38dzM?eQ`j&Ea zNCU9-3b5*pyd#$Q+As zF@^kAz~`{{_@6nt*~VfMrpryx3wVX>5l-|-EGhudYa6r8?Jb)do9AHaA?>$pfiG6q5PY`nINHl-yC2ZEbI&qEY!-SI{l_ zX4_^VWbAg?;ntPd zD-?^iWm^^mW|oVT3(fMsST4v0_#ChR5E(p-4$~mW7;%h`Xk3$t6`;K#UKf@EY62|) zamlWm@c|qI5y(2*Z-E<<;8nflb%_ZOuM0uf0TKl{*z%v?q=g9r4Y)Ba6`~R>mOKJT z1lj~L)YscB2F7p9QANM7a*wa6v#+an4sfCam;d>bVYQ0D*$eIEf$oZF#ZP4VniKuQ@j~yDV-VywAO(<%K)--@il4y zrV}f~MEPC#39WUUi4DC8DWZ^pp`lrp5ipX%!mM3DUjoB{Zb>TXph*`|96(mk4V+!j z4V-2mfspZRM^qfNgWypUwbwg<61^444k$J-PMb}95a`b4lH1WhJb|d-gH#njMV3T`yK!|=RFjt}PheAwMnO>^*5G&|`H4$G{gDK%Lp=Hxvs9;)z2IVzNLdXc&in0|D3Bncx5NJfP1n+c@#TU~W)lnSjO7l3JF@h#iZWl_w2&_5b z;YJ>$kZWN+h)&a+K+2A^kUtQ3C3y&j06})M78Da)^$HMWsSq73*_j`~X92_w6<0u% zF$aLe;fOf7B2py4h6VkS3YF2AsTirEGBl8a5u`J52?mcNlBi3hBNThNX;scsM?PIL z(kr53hE(+SU|ecjps|;)P}IRA({hiHwdGBCCznNUU)7gzcD(nYNv;tnwFtFeBIH?Ly>|gW;Zktdt3f&8suFt*m_D#{?l?*` zs96V(zsy+)fVJvt^$*BVDNG8t9j-CD0n0(f>+SE4D~bC>^kM_v!yNJn&=v8n^$E0_ zR|@(@FZ>6+OTBC1+j_yR zt0T&VkZ^N~3d5iud2*8OZQdieq`iPrQIc$2TY&7i*a&oY|@%feFC?z`@G{4J`B>EJJYw)z}a|ti^a*dl*qmeNX84J2e$4WL( z5`tBxG+w@5XTiqln~IdGB`%Lh08S0y9b}4r4R8s_EU=-h4nz^Yf+fQmb7Io6{&rt~ zj+J=YsHLvV$VNS$Ca>LJXNzA3`!k5^J6y$rBMkD40$2CKwOJl@ReltH#qW1d9e zr4zKA)JOeYl%wd+23q|rl23zIH8O&S#NZ_z)$w);_o6>X5bFicb3fu1YkSKONz!xu z{%%uPB=T7H7Xwyo##r#P=87t=S69Tl8PYi-b(EL=R3Te*mA5+|1cS!wpUW7#l6iXi zTNIM!mQR6GyyWGoNI~+u(K1H?(yc48WP)--tt_RA32WAF=G zYXH74l=#Cn(}$<9r+nL|lznXlTZ4;@VVY&A^r8JrUcIgnD(2Z%7$3+6TZ{24>z~n1 z6uoo9Yun?|Fg7r#{+eG9CnJfN1g703GI?s&jMDE1NbljeFTZM3(Mi zMJ%iOC8JDAQF!EGzCT<%T<*@(8S5Oa;k*s^x2ApOZ+hgKN2bMw*B$KkgdN~yk?di% z81K$@&$7MIJ(+BB-<9opgX1mu;~(jr{J$%9hwhl>pAn(Zi4Brn=GgsQ>}EgyZuTQq z?2MdIntwL9`;?uh%rEHP2}L0`@22S_`NQ423s1jrQ*gGc&U}TQofjc4z>t6dl3mlFR>T*-+!)ztz@FnyXJL_x$4PPpjgnLq3+K)2er9`&EhhkT`(_No+#AkPC zv9>3BguyYEHCHS|GBi!c)?AePRC_nB&h0QLsWFj1=dqLwW=TtOmhkwI*WIh`K2f~g z$pR@S)8#kz&Y8SIXV4pwJ^c!{#G_^S79Hdm3v-foDBFb) zp4hQ(Uy$0JMq;q_M+z81a8^9!ux{J1br(M$WwHr-b9e0u!6`eLeXP=5f(4adK9jNO zVOGvtQA_>^Br6o)-EO%U7a@N@t8wQrtd|B7jEm_XEOAjb*Q~NISoq0<686oWm`oxkt@%iJ0q3V9>_L)HLjds^S)rlq@oBgy*a|`t zG#yq`6X-mT2C0QhP&I}v@9FU;Dkv_&&WYh4QbgWN?iwsdXg-?QO}T@OV0}plfnQO= z8pxn#@Dt(1=S>|K+&Rek2;`3)(xc( zTAG}s&bn-`G>BZ*Kn42(R*%Ji1{O-w8W=v=p4#Ij>S1;4?cwVp>Y?($l}fr{&_scK zs(PG2_I9Zm`3}m{RJErIX@jK=r6hf zsVpTiRA&TP?rR{+T#&uZeNW;t1ROj?8RJ46f&f<~SUKcwUpJCi-)El`d+`ygIaXbQ zLJjI__x=(w=oN`9K}TU(IX!PYi5o8|Tjdio&|_rD zKnc>QzR1Q2a?gS6fa3f2L3uhb3E4re3wh^A*YLWIJ}Ftq=lh$mQua$snLZd?45<`w z2RL^smwjYToG61o^ajK(7a1tT8VD`<{z3)}_Ob&PJPr^!jZq>zC1Y;}nF;GYizB3o zmBGCz57dIhBhlnMC#vFwzV3aJvPVs$hl8i3RrpJ+h4aBUgM-CEd^~he77VUHnvq4) zSr}z0_fAXj(jSRPv=j^TLl9_SDKHNqKV0mGe*`;&q|QFE7tf)~&^woxRV-tU0YnPu zHPsHty3#j-#8iX6a(3db|pJ#+AMvO^_AA(%Jifyqv}2$7z`S9Rz6;cV$B+?)JR z{ctgy9WYh+YZsLJnvzOvlze~VfNUZ?kQUTdIY}8V50(cSiJ?UXq)U~kY{JTk0Sy%% zWFbW96^nv+I$CxB0+=C_h~i-La1dGW)CGsy!(^>co4qna&zXZDX-QS7ClXaYT;huI zbBA4^?&3g^a$Z7nLUfV}9)yzToJNn;{{pCM97z=cnrDh7S){!!3w8hj@x#gBo)ft`VZ;!Kv^@x8@f% zkjjUl(vZ)?vv6C6M~abb7~T}evcda0n7&!oc^mpdOoyStC|YBEG17v~BUNa4HvCdn z6NLpn)MY>;#VBsj5wkcoJOXWsqu27$Nq-4_q@xz%dPHg=0~MoqR4vT(ALZf*j3!Lb22|Ii%<}uZ!AwdMq?M7DRGVUCb`;vyXqR@f zVdz@HqAH0sEh`-5!{tAaY9La?lvjA4F zMwq?b?sk?xGl#K~?X|qVoQ>K^CPvT4O7>6nyks7?-3O3_>3H5-GM)zF?KLvMj` z6~n`ks-a6IrDK6}6POXPj6C9VwQNQ=(CvnADK1v1wxY(q!qe+1_eBv)iXmdQJ|)j5GjaL8jy)$!*+c|Wp@UN zYPpQ3rsgCB1)-rvJn4YCJdH(h=YK7&pjRVAnNpebEBH0AIx5Ia6k?VALc>9EqLV6O z!%?EjLo#SGN(Mu#bi_j{ancQono~etffxcCr-aBsB#kvyuwkH^tZm5csPiDmK(%#J zp`;1bU})6Vz8wxqP+RJ}5PTjar4vC5sn-5!S{ux!ARK82@glVU_v>VjtbtmhY1k~V zA#ho;#-HLC6rAly|;V_uTrmkQa<3LXyN(!ffF=87Yva zq=~?@kVS*3wOz=;D&kpqEqW`LroMhsv7nT|vv6F(y7jz*QfNAIW*X~esf4DwVY2A| zde|*^N9NY^>~zqJ&;S8yeLR=1>sepuge04FGw@U(KCG|txC%Z@hilT!FQFk(aDu7Q z;ksn&bGS1LNk^LBu)bP99noMsXf`rOVr^YM4&HUGtI6tt1A}3IcK9I0hAHSc8$+f+ zD)S8sV5>BEc@9Q}zZVcP2-=EE-jP-V6(;=MP+wodQ)ochnF*O-OJM>Q3*;dZ3;!Wc z9Ge^=1*OrD{E}KImnSlcTps5%RFEFVMwG`bq)uqNnR*J zVUS>uo2QRR?qT8u3>4hhu(6It*elQ~{Ht`CDUgMzG3 zuq02+lEx!5}SE-frs2u~?7NOIL# z3vEj`GWhuLTe*Q6XJThfuT4m$?kP;$dra^w>`I6!{Tb;XuaDcB`7UnyEhw?x3G310uH1I2DpJ^+N3JA=! zw-3ZCXUqg>Cy(N@c*zw4d5J6ntgf>6F#Q89=R5FyfNNsi>O~gtBQ26U0#1?u@7R-@ zUke4`+L%uum81g~XT5K#Dx6GEyEF?%WV}af*Io;dBfzQdm;&H0X~R5lUNMgfWU?rbG*V+i6%Y*b1#tP^LAmma{I_qR)u;1EW9c3YV zAZ-OFC8VN`hk>3?GBTi(4{0P)Ii_7g2@wksSH_GA*dQSapTw#Mox|P{D)R|&V+0^~ zxFF!W0J%erbd`w1u??M^mKf{-5+Y`goZw})^oI-bc>?s}IdCG8c}NKzUQiHVq!WR- z(UXW&y-s2XJ6)Yw8A6c-v?2*c&=d>?&QMU}ZW(8jW+VvdZ#5i4$)( zE(l6TBu{bAe#sVHq`l*+z<`r8I?g!$A}rb&hG@Bo4uMJj~fU}Xn`;`Pdw|agWcf@ zZ#Gzk5`a7pqDAF?@tQYPiExm|g0q1xE=xvf0L5FlMDajaUe|ohnfPJvJ9i>YD@lFe z-N2^s8#faaToFnut}?UXEDo$$7bjF)CWb9com)~mauGZm$2fFo5kl)G-9!Y|43ds= z0}(*(gkb)KbZZF^PmDCLAk}dfAX(`mz&ogB-dcFH34150G8Yv=Q^L4N)Tqj9`q?Plj zF^H*uaIn7;HAh^(_0OMD&Ir*YAa8!Mey$)XAaWT5+F3!KsA-}|(A=cXOTkvJGjNE6 z<7>EE^uNUe!FDfI{twa!b}sXvWG0wT%E=upSR;6aMPPTG<9{YnMZi)Y9O=QEXNTAj zq&Cp?!brFfC4CXS+<~~K;7(+SA^5{K?!5W*fbinwV=YNI5BLz z2DpQGD@ol1X#_uwxx;v1>WY?VwnTv`U_*s%600xqs!bSl4q0WvD5^sWfg*t(uS?62 z3W=1IGo)k&)r0(oO{@o7!|bNFIM}fW@NOw(g~%?rO7f3Ci#~_*m{a>NWvXOwkC*3c z+#NGIB(!Q9uY&Gmlr z2D8MKolsLGB(k!dgT zo%#b&nRFEWGx%f&cW7*RiccjZaNvrdrp)d1D1ws7@ih*qh&lLi@Bt|PRd55Q%Wre*%I!%>5d^ zcER4CdPRC|GRR*eJ9q44M0w(QC@ATs#r%2- z!q9)^x@75~s|M91(MX8s5g94Yj3F5o!P5s2gQ=s)yh6p|pc;)WzMg!OQc;v^tug1mtc|4YHA# zE%{^cCV^OcJ{K%sDoOzrWQJ_31%CbwOT+p~d+lm;0j$`!Iv zVnz*kw21D*^~Aw}?o8N`A-^pw4T z@Zgt^dd>y1P=Fpw({VD0DCu;TX|$6#hq*vCfV%+41Na)i9efn26lFTTB2I~V6duas z?Y$5xD$kRVKj4Ig1G5KZom8GS6T@>H+!S;bCsjy9$UWF4(EUJx=MFs%Q7q^t4mhGD z(6X4z1Z9K~EI}3!eh)0-mTn19kBL%_%ay_E>+VW;=ZJ|PtaN`$RKQgY_h;Ce#bb7DPo z@BrxP^j8r&~>W4b-oPo3><S)LCG8xdI)V24g{I~nL}s*mu9WR0hl~FV7z3M90msp3y|3brb!OQ zw4gPSQy1hH!XUr~;zXgY9^?e}fwdXOLXe%*)(#ewle1M09(o62!H5VcVc#A?vyTp4 znMe%bA6#hD94dwj zXD#r!&ZFY6uNqKjgrK0N{BU`&br@*806GV^4@jS371apbgA(Ha@rT6o6)r;s-2$iN z5Nk#W6=YiLBS6$RL}C#`2j2`M)TorpnpB)Whf=X*b4?iHk?MH zFiwRRoq|yjLVL_#AQqHPf(h0DjDP^RuP_08IhSUn+P1MKAapqP8 zmS2n+`Yd4lC`PBn;77+L3@}=Q85d0da7x51LnJ1~7cy_97|+L0+hGVe{9>G^n4eJ{ z&5sle)nKwlodFdYzs!xNxEOLVI+l;sFr6K39LtZ+Fp=cQ(c{O8W3A&ykMg59BAbG6 ztwnt-M`L~@KUy&fB}eAiQD&*Mox;L1*n#gbJ_b=BIhP%6J0PXW$P|X1u;N7RWY3BA zaR#Xrqfk3W$0wMx(Gkv%X2<53UE*w(;$(HIJlQ^RvN}2Iu#?mWrVvjHthbM!C{AQ2 zdroyBrDjx_AKK(&Xi}$({DQi%FlrYG9@@LqGE)1 zx#AtbzWGWBN=uThoCUQ{ zR28@_axcW)>k$N`15a0o(>hkH?82nTK2#UxwhYyVDqe|n%Cwkq+&=#|V6!lKUs{Xf zQaqZ*F)xTm8YN_8%Q#1ausF{l^K1wgNrGrQuRmt05IJj$A*Llro_H&V=O>`S9EvIE5X}>*i+gPIYe@TV^4(O9WFo@MJq{~=o~L$%cs*8$Tc=r4^=~H zCI+)606>N{rFA*ww8*mf?ix(IrbSOMjKygbKOJFl$s$3;kh8ZQnIRJ?l(hl;B zL?r1RX-PWygcwoo=#ro^%#Zb0Ukq7V^mA%KsvCSKDqN5{za$|P>o06D;-S@&m&mQu z5FQLkGa|eipl|~|fPgR|ZU~1wC;)0rB7k^}lK~4S2>@(cz(1f-0ME5=u34+xkUGs- z%)VI*h8$7Vz?y+@5d`Gqp$v$i_0SB#xRBxD^JKu$8v*14=5G*W56IYM5-nH=OQHv1 zaqJ4rJ73==9~qwy^~Awz}pELl}zdYV$RkV8@dGEb&XB`8zCQ{3@$|?1QdAG0Kz7Y^&0?2 z>-e4o@KVS>*a2ujU6%}?DsgJi_f4YlX^==xaIKBJ zWQ=&dKyW?2A_V3TxXx^1*vKZu)p-WYSG3uY4GYOhOAtL1B4$BBc(|3IaiwCW!~(cO_ezoL zXcVy87`w2=Fas_3&_`qek9`NtFgCdf?=GMr7 zDFZ_8!XY8?1WyZR15*PFJB}g7CB)1L8w`?y3mORIVC}Qu=_1t3Vc-jh+tCLzF|}Zu zov~qtfLv0KDF`*-?W_2jA38xsrg<@@GB8;I$i6elVoRO$Fhj)o4Ls$z52r}j;Nfr) zqYhdcYHW3?gK&4D1CF!sAh*a$8o^QFsId4Ppm>anxQbt9wlb)JxeCSh;01t;S77L^ zGz%nSibj`e=7&pcjZWlAPH= z7z9J6h?;0}T;up|=UecB6uYN9m$mLkl%%(gRJpC#J`+(j^5l+rGuS03N#K)b~hLn+B+z8Bs$+V!)bV= zmU#U*(ldo|l9M8Fz)#o;j=H8S2H{j0W?`7`IL}nEY{vpsBmTCX%$iS-N1zS~$NXo& zS`K*NgLv>Cks9G0QL8wHKz4ypnG?}P(ZP5C96YZ>97hz$`R9W3oScE2hegO72vDhm zS-T=e62K||r>k|KIR=>nnYFJ)Rta#xUU&&kKyV7TXdjpcPYZAJh*ah)Su zfWfrnb-+$|s|C{s`_UbtkOYwtCiw@tqzUkNn=0{TTq_pq885o1X)ZD+SU4@D5pchr zS_$$j)&&#|JtQz{qyvg8y?T+4{OWf&LKy`+!SqtcnE^q_D6Oy{_l*h_(a%vhpgTf~ z19W28LlCjZjZ_*-n(ki>rSJha%QW?c$BY7jqR{Im^e)g^a}$@lXI%tVDDoUsEACJr zl7uS4$rKK+5ZNjNg3BG3$O8>6hN~E!s-ojPoC8os0!eqsIHlz}S}Uj`CSBmQ8Neoy zrn5F|D)GStAF31|sBqlJIt!wQ92Szcr{g0Fih;PfDqhjwle9mP3F})bIVcWg@P-VA zSPa;F^A}IN`9R>YwY<4f*X|_AV1oe<)JRG7;2mtIJHCqzdchwhO_xn6&B=;#UnY7p zzKJnMVdj|(KQ)d3pUD~fN_%~}Exd-Vv<)^RYsuh{k! z4iuK500~#-jVYXt7D9Ldz;NG{I2H-d2844-fl8xX{Ng+Tm(hzN-o(VHhY~YNW&_Q^ z0qSS2gp-|x;GBxUu*G<>hEj%m^j~B;18}l8796hicQFdW)`|q-V#)8h&*5q{;2elF z8HS867%&?ut2#n4;S6xWo=h;b1pb0r?t2S^7xawH?Wq-J0cXqpfL zH|GIkIQshs7Z2uxbBhQ2z}Z#jG?jrGlPct{)ceW-$2pLl^I;ChSunUbTRb;tZRVqC z;7;dCB{MOWp{Z&$stOVbzh#5j;%u<1zne%L2oh;@<^wMb0G$(%|L2qd3raRjc!JZp z0IZSu`ezE{iyOS0v(oz)1r^N4P(c4?mJDOBj*wL$xcDn2NDwK%VDrgbF_FTqYZpTm;erY10XN^ubnwvDvCI4sikOJSfY9ZjF|iS@1KGHnl6{-GxU4I3 zP(U}^ieCZJfG~nbh-UyY96SWHlE-Go(oL11xpNOc8jC7GDc~XYVmg@qpfE}7EIiyi zc<3Nl3;Rd~fSedV?7G=Ugy2LEfxrYx*&i%iv;QD?$01N4x3U6%U{3s|a@}E}|3^E^ z+#BsyX2+ppE^XhfAC6J;f%yq?4Clk3^MLN+m4V4=N`Q@xsfQYe6WoUs$iyR_h63{E zmTNFI#WF|2ixQQGD))M_S(6-;U@nc3$OibBhzixQ(|jMhvDsC6&@IDwSwk|wo(|FyW6Rs4PF2_w=$^n`2|8&h^0eu+vqI=b zWXKQ6IsPS_$)Bv@N=3ownB4*6Fqr|Oh|GYeWbA}&j5SFx7%(ZrbPY+Msn{RO>lygOg3+$Aj6Lxk zZJFD=$!UR1Hu4S>TpS-8Gdp66dB;{=2&s|wan{BRGRB#++kPM5pLNj=evgdypdz6W z!osio=cJ1*0wZcb1?*LNC==YrG?oG&Ixz0@YCu{vn9u5dpD{+?H2S9gr;7 zn>s4eym-WzDnB;f0l$e!xKgmGBJ6Ce9sr5O$;fDqVRo7V(zrvOD}rKXluwjx)amws zLu_F+r-3CUU{p8)+tp6irWEznF)sWtgQh9fp-*8@%|&9x?y4b&zkN9-sYd%OPf zRZVm*#{4kA8Aa55MFR7&2C5XPO^6O_&-RKUj$MgNPDJAqzRD){`Q`&J0sy))a5+;w zQJ=^U+0}udp_kCQtk8JZL=~82H9S4yK3kR&qJn3CqV8gv)gHcw?e=#I8?UsOe9tT^p;|Zkt&${i-8C&vBjycZW#4 zSX_yke7r_|00hg4F5F<}_;Aa8#~CVeOl0GA(7oD3d8B<*Ow`@(1>2DWO$02{m2A8U z@UeYlq5#}u4E?b~ptKd>s7RTLqRVPyUE+jC5(1bV^VkTC35_xGespY{2MwwoBlN)t z6iL2$QJPuN=H`=JZ*iKWb;v@rTCf80SC%jc3Vt4!l{O zY@IrD7Fk*sWqCAFh-Al$V@i0wLF>#}WoWeV5`CneLbioAa{|pea#LtJd+r>@#c@kK z>rx0Xmg6R}6P1u=c5?RA>9c2_%ARVDa!)Y?T7u4_RLB`YcCyabB+Aa6d+O<@$Hwb8 zRZ&gx%N$!tjb{&>EO2h}^qF%{J@xc6pZElJy+q2Wys}9hrU6E$bWX8nvuES>5LbG3 zq$HSBwAo`G$dLu;o1JKTKEhl0>Y`^q`Rucw{3K9qHh$%VEnq-(VAM&2;ZTH6Jp0M) zlhdDi?m4%@PxJ&bt^FFd1#xH25X@80d@}!J_NnZ-x#wR1Jy*(BsgvXOsnZD?ewDCQ zh&i-9|NIM|`JDQi9CiT;ZmLUM4OJ75N;z)U7;oypJSr<-RuFXGJE{A_V9dnWtD>$>*Br$6(V&wc(M{^?6!{l>SB*12w`z?DyW zlm^Flghx+tOvSnUT=7(nt+`KJ_U_G3f9~`D_=PWj?Hk|v_IJLY@=cyFXbwF3WA5Bj z&uFK5reJ0EZ1$<*x!*tk>Cb%jbN}##FMaJB-~85hzW0M4{p4qyJi+lLb79c_JeQqo zayUg4qWLLY{1g@W1-?G_9L|3Bvs(Sqm%obL@4Wc^AN}~JKmX-#eg`H`J93ssb~ZaV zO`Tm%8nfrx&%aQ-kbU}lEc=Il{HHH`@r#|M-~Ij%fAo`||MJ%_z5MFyZ+Kcs=R^*2 zIvvZO{p54mbJ_Fx3)yFW>f(R;0*k-=RqTHA+b@3a`#=22&wlZ%-@g3&KfLkQg~=(> z3k1(uAWuE>%+uM^7wKW_TlW{T7p6(^XLUON(r>=}m9KvNo8SHp)_?MImcN4Ww=P_q zYPRM;@w2n}x%N}6&z{Mj%|1E%DcdHG_1gbp_QjXJ^p&rD-Q_>}8Lq$b`kUv^vwEi0 zzLZ@8xQ?y!fP0;J_QFnAZ4{Zv`Cz_S1**LUT#c>PX;QqegSlJ*(jhv*&ON4DZ`sT| zX|eS+L$PNXn9gmn8#cZjWJ{T@*plades)s>8;a+-Dc3Eo0#HI(n}7>Me4NAVi5J*( z!*kld3+kq5AY_$*Q^{6AHyyf}u-MFIZvef_J=bnssSCzWx3AV7(mCIwf(e$tHZArV_PfV(CDxr}9TaJdkIf;at+ncb~Zei zm{7v-~+h*@A0 z-of(VvLbsiOuuGx2C|j0ilOQZ#|O%3U>{I2P%Q?vhw^v$3d)P^?4c%9`z_zx*m4yE z?rYog4YhdgiY-@et+sV-$8cH>IBD{8kfLl`jrG;`>H#-iw>JS2Mm8g|IOy zV-bX${b;XxXEhL3pl5ZOgem&G3?8K3xR?4Ws|criad1IqK_ zD?`H2Yn|nqm0#~U4mF-%NVABx0aIoVbh{cn52UTN190(Axadmf*YhgV<$YDk|C9*d z4jAbGiUhVW@JB?bj(}i6^or$xg7DG7>cnnMuLx*G8>6s>La<4<97v!qnN2yj+wINu zh}PTl)~I*By&iM_iw7md?<{ua((tJ=P$z1ww+L&cbJc@$FxyK+^4%uIt6jn3fg1ZO zvZSHHlmz!q+&$p5LaeTh(*aNfd|9Cc>NuabJhHvV$jA@*uTghuJ3p*nsS*}=*YAAfHZcI zkSNA;R>?6q>U?0~p$=v84|F)T0+j4*$VF_)f)w?jd-Ey9?Bh=$To)|O*z&>df`@jL z)JU|H>814$W|ZNcW_+N42PM^XcSuK+Xm_;IMughKGtN8YW1hmZEFlL!=r)rs^5)hH zbK+sR@o9n|Iq|8>p<#lpJ=9>ML}Udqz2i$k>DbP++dp~W(4paxF=6BqTsdZ*7W(Ia zR_A6GyX(P*=P=RY@tM7R6mjTq{F{9IDElC4tZ+-gE^V|QhG#ERKMjcd9dYe_a{od8 z$telaqu^{QN1TR*Vs{J{O|vo!PG0qMrr$Dj&kxJ^m+0tNI-1VY)y_qu6}u`ri9HQY z*NoFm=Q-T_e{+D3jUWOiV-g}y^EW(yKR;&^H}Hoc)XFs37`AL)i*vHhw z(c`g%KWh2g^0S{~uLN0OpT;idsy^~4%=nzalzbWkqnv+gXNP}_E&gRNarD^9)90Rc z-Sf}$#~pv1rL}eT55?zUW;KcW0k|=9AC)N8x8b{|{gIB7Z^0 zsRRL9fhCC?fCT%AzMpZsNla9n&tu(+#iyY;pXT!6X<)GeU0{a+Nu@E`Knr~E@28=B zBFsnp1AHW1=c87UTfxH1yXFI#6Sqi{xnr+ZY>gWjESNjIWCI@ja@4*0Y9_{ z7Kcz5$cE-R`LHxrK+;G;6#%fTAo`+GmWR3Zo3VfnVnKzvP(3#|Fjx)N2Lb~Z z5vK(mcVJeiC`$B!3$Qf+U_*BdmX68>ZW*lMY6rDTyE*6gT86v`Sjfk3O;*!oIg89X zczxhX;2L5l>JRyX4xEl>a0>{;o!E&Jkia{UnXIotnYsp&lbm^aoIL8aG2wrum+~et-<~g)~@loh?2mh(R2^S+<7nY7$_b$5L-fIuF(Qq@QwpB1IYrq-n>5jO-Sdgl~ ziK2BAAe;+?icg76)(2=zg(wwYq+L)uP7Xkeuy5Q~%Ymy(zj&Rn;>8!NFJ|R z*Nl1rHgX{oY>j*M;w7jVps5GxHrs<+EeVP1-STn?Em>SGp0Q3`rQS9Wv=Ud?`@)gl z%saPdT#3#PZI-n`j{(~au#-KmG4H8Lx0X;-owl9299geVErKGXa4yN^OY)^z-<1>; zpNK30e({D@E~%E1w=NXWshEhHwl{E7fy3Oe;ugN7zEn)N3s?LqmXx?qF3qmbm&O%# z1)+EgC=C^}$mG119LErkO9_ zDpI4TRmi>f{m6;l76UW3LEQ7KR#Vy=ahrZ4N-$q|Y5%1(nT=Ibr{_Wq{t-kSD#`D%7 zrr!U75B=@m{@vgG{o*B5IufEw*;1S_!`G9KifC!Nmu(RQ zsj%?D4}I_h*$1-sXDof|10TfV4L9C&)6KWsa_eo`ZQ1Pxmzu`}(Q?K0*?VWhwd_OL z2eS`cc;EZ=^KbwD#+z@sHNQ3gaPzj?KXT_?5ms)0bb_pw*02BB`!GP>Kd854{|3Fg z{f^sjzwNf$@3`}>kKKKbkUN{@*!;*57LRzUrPui}t*4 z)hZ=`wnl0rjj@H}FYQ}%|9y9V z;JWvTGL?a$cEvWi+PIKNHu38CfpzzP?4x(wbGN&su5Gyk>cq2BTuZn|L%|7dH>LT+YSJyu#rs= z5KI$rt2W+ri{HeN+L4M+{Ab5@EWhur>@K!s-M1atsX!$CXHEgsSGo5MD789LKl&Ds z!pP?PKX&&=?pt}^y`m_S$%KOK+1{NgT zxd45Nsjh+d7x~vL`hYghJ(WMzoOodQedFMw#Sx88bZeO--w_QMByH!*&Sd~D&1a4s zUjK2BSo_1Tg7Wi|v}C|%#|4p^CquOhL=M{GVy%hC*I+?lwGL3ojzN9NG0@rN7~mbK z4w%j-vS+6Q6`Od3GP|TW(iJr-NyM~hkPu!6ns`fK!~gh~?}-r>5P{#=zo<`flzqiI zu`=)`k-v;EKH-AmxtZr*`1GegbA(E32h0wyjDSPTg%sUW`Gb+uyzXN_4k%o8!QEV8t`#+4eaQsvkylQ3LV`p7xLb^hJ=N zZ+`o`!b-nk<*R>SOKEBot>SNSrZ{_1UxB75A>h`p6Bfs37he{X(khVF?_U1>?_c>t zXKik6#MKHsp6cME0%N~;9<$hG?N`43t?zvI2jXzQ{>^WG``edZe&sb`@d($&Adf5# zT7fF`u!i?WVsh17grRtBw63;g#4U_ zDNSdm|1I<#qoqKU;N(p zzW;+C{rD$8HE!&_H932UmYTLo23=$EclkVtrLi_vQdkks@3QoVKLUPq=_{|jH8l$a z*GY9o#BFo-BHiBs0$=#_=S=ihz9xS7ofp&cAA>;t_IIzoaek(KskqcSfz^yM#eQD> z{z1T)*k*O4`fFeRCbnOE@q5_*@lWWj-@o?eWb0Dx65#)tvjm%9$RAw3c4(~V4g&sq zxc&Vf{`ki~12KK&&5N^_x-MmB>XD&~q&KcnaO&(cFPSEL@$29CHVOXm&wjyzH!d{W zmwGOhXF-p-HHmSWQZJVLGq3nj7QOq;Z+{P1^;a*w{Mz~Hxl31Evh>+g#nbI)K9PN* zrF`*x_QI>5Q9X@A-~8;CR{TQi(%UapsY@o&94QwAf5j`~AHVcf6#wwYzc5*EO|>rl z$))04(;&Us%~+m5T3`8^IyO8hx60zOaI-aNmQw;gZaK;i~ZA=zy6&c{`}XkyiR`qhf9$kTPWNmgpqhGxA+T`4&|M61(?C*`uo7-o>(h2NGKmYCPQ|(Lt;!^hPE4;$%8#7s400=)d>FpZ@yy=Vved>r49hSz7#yUm=no{^Xaxdt>I(zq$0< zr{i+_$~V6A1KQ>{ubyvR`nQ)}#~7a<^3>0M{;QW?$CrP1>2;y}?|kpaKmFM+fA#Wf z7p7Z0_Xd~u_qiEyiT>`@Hz%iOv)Ok0(*Jzv)fd0_qo4l#SHJ!ZiGBV2|9+`` z{z7(Pc4`JC|L3Jyl(jCceA_24mB2p>x4vWB?>Btxjt}2@-O71;D%*4-1yh;y!V>7iS8@_L@Bmjwe8jIYwo<`wwrI@ z&(+(Pf9OMh{U7gnw}`H%NsCcb02}NcV;kA_*R~CP%ny&x$V|lZo28i zH{Y=QBkY}PV6DEjC%~vUpE!T;{I+#>-1gy{ZoKujo9|rVt}_gYuf-NLfQ~>@E^Jx$ zk=t**`NrFBz3GnF)YXj|&(Y2U*>NORw&T?;_mJJ2ZvOBsH@UOVt$k+G?6cF3)2Cx= z*~N`_-TvX5Z~pLyZx*5@-*qrQ)rhwtQSLa;ETacD+=;!LK6(c)^AZ58xpsS9z+Zw0 z#m=d%s|fGL4}W}H;C;B1w!4X8lsoD>r*>_-?~dDUx$z@px{C~2h+2ZQ${k%h^W8I> z?#1I9o!Hx{Ji&{yx$Q5u<&`@cU{S^H^ABwN*zLF8(g_M>Y1^P%>x4iQs&+TGufF~E zTS;@ay&m~5Q59;c9W^Anb~m>!zvEUR+=^&o2Vwz&GxtE+!N)GTa>pD~r}CWzzzCC+ ziic+(+;aErAX{!l#G1YZP8J9lNE=uRL$r1>sEaevnD|saoIldqzV=RRh_Y5G?chhd z=63EtF~EyBjiEh3xu?Dv)G|~A7dL| z{!mkVG4>F$C<9PRmIF`%^MF$P_}mj|&tw2)3{L|j^Sn0EtX+Q`JeDvhz>Yv=at>Pp z{MpXrowh z#U%h?0jPkcOdRE}A|bSho*WiT5UbEH+Qnd`Ctd}(5qv>*9N9DHo_^L%j1|4^!E^Nx z{-b6ow*Xxu<3|9JkcD3MNnpIb6Ny(LY@R5ViXOL^A&j6c9Qpt$sRHveRK`V-G%)8+&3a+TxPY(Oj) zkG@W9pm?B!fmx0FFR1+3h2tVu&p!WoItO@-g;mUJa|W0hpOn{4bq>lWW!?<`7~-F* z{~ufL0UyPYw2kk~N+LLiyZi3$^#$L1XB!(E118%C7zqr@LYbUFIiW0#Kso1}kx<@M z&H$g^ekIJiMZ^S5<_4a{2uQfXYg%>RZ}RT)2KWn&zG=odBuS^fyFsC^?1j zNjAuQ-hG^tLvOG71w}=r6}64WJI`L}eemoBG>!qT$Hfk@^AZW$BV2Hh#dS|}Q*1H? ziar5*v8)V|JI-9X+4uPQ%Yiq5j~P2gMK%5vF=I4gT|x%4vf(7)a~~hgE0n=NO&zB$ zUcY_+$&3CsL&Kve(e`#u;)u$WR23Aex{X;0eSur%6_!BDCiL)HZ{K5tl7VA&Z-VT1IvbW?o5IRb4}K zYxlXUw;y85J2a{kjGcrEc&D*oE`Ah}$vWV_lZNSlUdk(K>s#8oPM^Pg^WG!uB(X)9 zoScGC>_Ab)5DM}MH{v0SY{UTMocxl~DpK?`?WM5ucs?-1_8}jN(s*gYEe4EF&z!uX z((3wS9j7i_?Y)PXx|ajAWkKVgfRsz<1u2XO17saJT2NA2-PCsK()HUISlAB1a}!hI zA4GN-V=t+lmPR+tk)wqrWz`LBr+&pA?-|i5B#bWU7GR*rI}96x!9 z$X;SBltb}n@fHbHu2s4DMJ1(`buC@6+kLV*sKyZSrw~C#vxt_R+yaD9mQ^>lokn*b zJbjMPJ{nl;yol_kawW^j$3lbAZ)!h#EWilX#7g`rM<1GJ378ZSFX8 z;WBNpv3-AnU_k^bV#Lso$tl$-esW@pbeJXHJA(BQ3lhEd)HJpt6!a{%{nuGwC5D-M z&Apiz92y=T;YWr>q4~rFCX7OyEso(f!##>%&&w56wav#VM)4Heej_^Z;nU~XD!%L= zc#RN6FhjJ`Ht&d67#F=^VLfTYW*hGgr_WvZ6+8UfeGeW!di)f7OftamC_l|bZypo0 zj3CI8tG-15I=$K8h57Uail!uG@#gvB)c}Q4;wGAy? zuTVE`DZ@W$JIi*yn34PxcxH%did)snSCD4fb;Ij`ck9bnt{`5um)@PQE2fDfo!}<9 zDNdm#N)=N4zA3gSU&rw>t_<^JFNrMDlWnAF+$Z=6;!#W~W-=zJIDj{RE_wyOco{vp z)ywz3!j>HGvalUYN0uAs#z~aQq;zURRN%jv;(dgYLaFOFZuMZJPdoUh*oqIlX6ELH zxsh>%RZ?U-KY{fGB7wHKk4vCe5Qopk(@xti3@?U47O1`E&n;>%i%NCcIB52&m9`!tVQx z^>lT#wAX8?Yph=N{T%v|5H%Qw(04VcHyh;rrY3sYI@%jFwKUXMuKa;I0d$7o6p$hP z5BT7RAmdEO%?zk3ye6kUvhpXG4oDoqPk^Ck0`6l%XPHfqSu{D#2@UmSD`7Jw2sR5A zBMjW^9kW3b18AkG1?`u!AOPqNP)rRNBSYp0mKie9)z;S3)X`F3V*)gj)CD}G3Zfaz z2-MACLw%@&hSYI^fm0-ECV`3so2-2!TqboX(WydZ1rK^Da6;gGcbkGzkwtXxtPU zX)>hzJxnqh4T5qQL}sRD_Kx|4sh*A&Q=e&~3ZhZMn}|qCEvcFjRyMxb+*nteph;y% z@LSb%1T;!uh~adEJrcIY6X3GhbfYfW(_9&d1B8lX1141Vf}kn}KZ162>z2)%Hklfr z^)Ys*uy7QH{J?%B1D3_FP1JwZK@MDiaq!<307_=Y;Kc32rXXR998g0D0{%l_4p3Jm zBm`vu4Q(FWvXu~^ZD8KIh2Jtp*{F;c!7@N6Rl&f_Yd%P0wTS>Lkn`IW+Wd}2pU;hZg5wt5gWHz3hRP#n{?YGB;n?JvKe6P z?!5=B99+D7L!x36lhf!Xc*{mJoA7ML%J5hK{uCAPh!otr-x_R(10!M*Q_`_zqpm3z z7j_#k1G2@0VhQfhyam(l{Z{tQ9*2X%W0TS{kKp}LCMSWUA|bd_=sUkSBVtoBu-&8=!-~pkLYCQdr!k{D@4}YNo6JoB^0P&g47qJ5+*;NE z?1G}=Q!}w0#LF#qF60P>T;d};F$5X>^f$gU?ZINepx|AY)Rs1m9=@S5N$EM@##X6@ z9JJ)moor>~N=Thy!K4GX=?s=2ruELJ^^7-@kunMMKbU;kbl2}&=;ina3}dw+-dF+nWTid$| z0b$VzDd5K_msQo)H?f^8fdt*%U3}MgXGeQ`TPxqnwNV)5W-QU%)*iYW_rhX!&Yr$O z;V~pXHy^KoO*?SrV1XIQ9mq>xe3op4!@XCtGNRZWJBi35!9_j9<`>=r9+1c73boKBO4*R2l zh;VZ5+=@c!`yQ(aZLXD@6A+1%~`3?UYFOG_IEM<*9ocTWK+ zE&l!}OcoLr9vK~n*k9@p<|CP;va-Cqv{Y7H1jP|xv2PEwKm!LXu;g3WI2?3wb#?a; z4xxp>;80>`3k~9Zi5-k3$jK|n$1%ScIqm?r?=(FFEbv$Xx4om&!Gq2&?w(#gzWzZW zp%KK57f=|JVxdtEw}?*v%|*$8@oYSdEYQMD3cawivq!APL0Hhm)y>oUkZ)i}7!3ry z=+aOyczdj{Adi@-3IUgO8LlU5c-Se*19C~QGnm~`>Jwvtaio6ZwUu5-*=f;;RCtJp zjw2{|K+Xr|ezLQ*wL`cE_&7I(2hMT5N3w%MBO)Q3IV>pX8Ez2-TH}K{04I)Q!?}a* z6wAwTpEx=?IYVO$Z;c&;8V}6b0WV21d=7Wv5n`{)xG!KqSt;fo-J1-cI(PB%k0K}eNmNKg z?+?7imD+C@Nu6DAOY{4JnwT20%TZN^@hS-%ro9nEG!V-gtR(4>u=nc zm}j)5RG2TkK3H--*jYcwAi>^vOM&pc(C_A)*%ILC8EBATYPO}YO!!WC<>L~Wm2kw$ zKUhBr-xZY!-wH2NJY2%dLZS>dMwvj;mJ*pTS9l(s;N>E})Of40OfGya zJo79K^>9AY?NG4?(a=d|CRZQ%>lwwEq~w~KY&I!GlC@XydGO6SJ*oMusI& z_)O?|^0Xu!p&-HOxxsGnIahMaMY++Eunh5_W+yv4omL7@l@)XjK z#(BFXWL0}6?y@wBHOWYGfxXNSwo{56+dl|XAmqf`vP?fO&zPb-L@-5FriA+H_=Xyo zq#VK9sJU5*9If*5-wTRKkr#Wbjwbkc`({@q26`mqU5dzcbJ!SSXp)>`YQA-oX_1ol zcY>4k&Akv9?yheXV`!R^XKuP>GwjG3{S<^f14Ze6US7Fnbzz<^ zvSZ27`5S$_;!LtK^36^0>cc3d@{a{Iv8N(8%*Q9F=0swEdqU3n@IV*qjiH7n8JXth zCYxY&IXWekeu!>=#mg zHaX10weV_mXoG5WoJ*v_&CSbXSk$B>KR2CnWlr(WXmSg5?Nt6 zNZ%D^iMOhAA_4=B)?G*r^i0mX79Hqq=xrQr7@v}3YG$&<+*BqqVHqb4pAU`lJ!XYqvhiP_ZzS*X&tXGV7mM~kqS)CUX5}Z@ilosaYR&qQ!s&=!1 zahQ>5T1GzZ@6BfNVzQN*d?wM}t4)rH3oMdVCkA;WS}bzBihiMbTHkDX;myQ zkk1B%~P|&&CR!9e2Ytq<+J2c;XU!j>8!-~06al6qP<|X_?XOWJ)=-#^Srbi z+y+}VLuHy@v*a9zuh$i($A%P^6=Wxcc_lR#gctbed6`5Tnx$nGn3?a`f)19D(zE0W z0q();BUwoaQMH9fG7|#Q3$7)_rG;5x3v8AGtxY#=gPrANO7i!`>rDme86o*?1=)!) z-pQ3WqmCXjH#9*HQ!`*YtQTe=M(eZW?~B*Qr?OKM67SUKWF&;S7oRBbiAmdY*fZA1 z9Mi%KH^nAXnXC-6ZKnJK@oIB^=8>@Cv&Gp-asFuqJu#snn+=U33^yG~%gr}8-@1kF zby-Q7yi~0e)C0G3)8i7Kw&i6cM0m)L7X`(886P%@G%`)e%rQ4Lg&t+4P`U)vABxvH z@{i<)%g>Z$C&&Ax72ZgWJZ@!R6q#VMiN?j;Wb0;AxvUHj4G~{?{A+GTe9GDO;`GGG z4Egbrh%`TAZ|WYd`Y^e zVQhklIodYcL{qPX-z^~d6sx}!&8a~e7;(h|cnN;+gw1&0iMO(TuXvxu5zh#7iF z#zy!K$Oj5Di(?y_+m56q1f*5;q$R`$IR=Hr8Es0<&Nao1!u%_P3DG)V`iXd@6z|YNr{L=aSoRp-zlIo*riGgYL zy=n1zDQ3PtvBsOyGU*i&+L)G?qIIgb03_jZQC??EO@99IjO2*y;#0MeX}()F!i<~D z)3c7^#b_I8PxJ^rS}u{st&k8#Dp@Y!Vkcv?v?a?VKsB8;b@9h|>{@3nUCC0(Xxz_h zT{QLlBugZt>KYm@S{wW&izOrWYc$rnXm8M#ERqacTdcwbZA~4?50XJYOE*0Y4QD}1 z$4|0A^2R1|$2PhuXzTb(=1X4h_boiIY1MuW=grz6_+HX~V4qj?zHM6%s5@(G=>!Bw zzLUJN-tXY$>}GOO=cPz>y;P$ zC0|Ln15bqzL?-y!JMUe&SAD&!7Gv>~d?9&cx!*p@+2Vj*u&s^WwgYS3U0HJhev*Gl z9$H&ixTQNB*za4k@8HjS4ye1jLkDgDKtIVpC6Dc_EG)fqYz{bhdsuEaSYxq)uIg(0 zaen`l^tmHC!8J4qjr%z7+q80>&3ZR?bX6P4{(h3rCHDfItSv2_0}rBmVGi~?%yz6@ z@8YecJx%a;$=wKFv~LyaXLrC+NV2ig*lB?dd27Lyiu&1plD|pr$A)+!D#Irrz#2l_ zt=-huSgc*|s;#wASIZxzqy7FW>8pwkbU~DdTY#%2$=ScnbglIU576jM)BHukHQYyd zht&b+!-0+#2Zb`5g9lcxwb|h2rmd}~6T}+&OmerOF*d~8*3!z&&)xQbqmS2i$MxGR zA78=YjAPZor_J5Mx0@#ui?r&#h z748?{XnEjpvAz91^EH+lE^gjvPdkWu$oc(Ia1we?dB5LF zuAjPat><1`xR1THy>GaeorTlkG)K2B#_ASpH@LZLX>Zik4puh%JIS>xJ%|f?9vk9f zYvURknzu9aP@!(oyJSa@S%i|8h+~b zWI~viqoZ3`hH%hgpKq3vWx$5*J8d_(xOkwWdfLG-GfKg$_`NT=1P~5z(B#BqY_OY? zV?<1`m%WA4p?Z6V?drQN*J`@CdTMD?cLV%T!Cl4gJqflP$>9RtoI}$R+^i2c27B&u zvRb8X1v9#NLw#-SpaA~>KUKeXCD?Mrhk81>1cj#xj+V}c@|`U9Xl!3+z0S$a1ET|& zCfMIMz)#I@Hb`$~MIA<9cScmCJ2W`#W8+|9vd2bmgS)GjrnUh(83+|XJ4-TKycHMb zVZccsl7n92mB6!7n;w?pDL|~LxL{hAukC&~RU$KXsm-}XQ zTf1MF1nmvb3Fg6}6zGH0_apK8nZ(dw@4%SEFxGyQzmw-aja|QBU_IQiRA{4pbb=1B zAnMB_wc$bG-m$TXXx`o}sMN#Jai8g4OIyrzOkX^)baly|xQTpu-;c%1H=@GA+{448 zqkIJy5C7;O$3s?{Yu4MW*K&8qM9^BVPa}(48KcF4{^H}z@Zdx6V@CKNM*Csap7tKL z>v!(6S*PXZ;enM4^xC)^{AdV##gD~bCnG{Ly<&m`Q+<70JpE(B9G&-Tt=6!y(`M5_ zTN6`F8-qa0k?(RrYPv!|T9mP{T%bCy3m21DW21rkqNVhQ-dy#?OUb>V|IfJ^ib2Sz%SW51V)ytR9`EsuMngz@B$-S{m zec6J~0pG4!uvC}a8|te}=Fj>2vTyM9Qhm5LIQ7>nH_V^AVENY?ix)24s88+B=bwd%`%{`aD9|Gxa2d21HY6|@ESh89*gb;wr#Y0=m7m(SJESb}Q?V1s)@M^i`F zL_>YeYLgX9zWg3NfV#_;;+T1IZ|G|2Xz6XzShIZ9PYZwe`itfB)~YXFuym=Ojvl!; z2!PerHK)rf=g;~4tL5|7Y5cHY=@NZiaDOgLY}CTGjMI6du||Eh`o9-_^ZhdPWX%r? zK|$@qzhP#mtEr`JrlYRDY}JN;Fa8S3%~RL-0i9(O@NWRf*3sHvsH3l;v10YAA69(v z<+8coty#Qi`LZP_X3y#URk&+qZiHu=w!Xny7);}*`3t^gnk@QZ*)+{x1kUE3DKJfK zJp)6SXtmkO#ozwps}j@yO<$RKvT8ENTgBZ*jpB(Glh!@s^?{@uK_YZehDjsQ^6`@L|( z!PV2p-^|=lM@vV?**Uq&E+f2 zeq227A9GgB{SM=>a2XWEXiD`y6|RLuM8(72CtWa2RrTH%E+ZbW0)^qqD^PPlN7vYN2N+hYwpqFOn=j|D zfcexl7QuXIUt3R2?>*sCZ4JQ+KwGw$ZPeG%H`t8Mu37%`>g7uoeEucrvj+Dm>n)yp zs(SAVsH4_$1xYvv`p10L)-^IRTfbKQ$JM$k=P#PGU=9|FwQCol3rm+7>gyUn$ZX*P z!9NJ@Idk^h)=h?b+Irg!X*&J5dgV`xzWwI=74zn;TTA_*Vcn=lJhOz0l-5BR5*IIB zGRJ+Pw^840gT~KmR%@(Yw0_P%<}9E4J*l>68O<79y_tG5h4aLKN_3P{vDcgqi9iDQ zFB(7pxJqZ`5}LQvowZA7M$*(JCN*JH$#mf&e{t-BxhYgey@h-0*Z#a_)z7PcT=ebN zUt$o~VHH`(tbiG!t2aYWRhR$sjE(euS%+@vtomWmocT}@ zsm>yF0TuzCQVmpO^B!ZPjfSR1dYYQ+ep-zwvE(~7Fv)-yj%a?!s<&SI%V|3}RG$w0-xt(xE zl6b7W3u!ipC%b6_0NlVt-vm?RmzAs4)mJWA{KdjKE9TADz%z3Z=?zn}$syHiD7_m7kzMHSHRvputG+^~1bTCsmz1I}` zrxcBRGw^c{e!YL#$P_cwz`#UH`xo_})Qx^#wCuYt=C6Pf>#*dI5^UHFSPP>lIoSj0 zNLG{HKi7Bf-rYMrRVF4o^o$MkO|&$j!`gK)!q*tR72nUt(`@mQAFxW174&e6Nc7+w z5?4rgd{o5c)1PG$HE}6EOC&SI#dy72gtw-Jc)?kK7m@jr_r-aV55(^zABx{fJ{G@` zd?J1=`Ba=E`Mvn1PAo)`Kz2qzLcak~cr;=~Pk0o=(k0jrUA4=wl?@PWH-;>N2 z-<2#BXG?w%XGs=`GbKwzHOW#@RkBP}kt`RblK%i`(tnFm6!+|{MU(cRKo%W)J%~Ik1)`T93KwB<&?yO-)t@1T7L@$J2!-IHcNDyg z^9FBnxB6MeBguV+7+s8x3WyLmIy8##&p#7U&kLI3Ota_DDTo(MAP{(z1@n$hiGLA! z;pJUqTw;8Q06Ac<-@JLvvrysTu_^IyAb6uRF@A7g`vxrWl8i&9~TqEKH^ z+k->g(8wTuAr5s?{3ot)uegCp<%QwlAqpU-9(*CH2&3pWMa2$t!{Z2zMfmm{d^IsO%sw*(OmKW=37G8o%oZ^5 z@p(sB@Z0BI0XGCb?+Lg$@OfXrje^ey!guWRp@5rb`ty;1n+czf1>9KEpHGCZMf!Xy z;D($2DCEK?!dD_Er=QZ&kMI-zbm2=;we&;w69gX!yvQs5j;}cR2Lh+~C;s9AO?`pi zQvCiGeyae0qThrr(Qh^UhV^2ll+_b=8)p)vu;_9u`uP;XgsmQcbYw#!sDx5Ck&21T zL<-EmasyH4RLpiLmhzW~{XXz`Bpo0Wfr_4?RvNKaDcMrY=ag@G2(z_!QZ8w4ALB-(`82om%_!Z55=m(pSM~xHt3pjpos7PQqZfD36sTCcGhTVpg&%hOnkgVg-@#k~hj5 zgiX-aHm>b)J0+bX+2DE)>NY=rsa&n^&@jINw0uT@^FyqTn>lpC2E9Yd-G zH!?XqG$>J#a9#Il^UrD#AT9Zk^2SgOGGt0$OW%x8XDKxS>W+?Ji5`62Pn@S7<0a<; z61$P z#Y?chK{^ud9V7yQ2O;}MLJ zvhf!$*aIEw^f;dOJob5tQP50K|B>M{HA)khAERmX90Fiua3}>(R+Xp1@~f*vPuTtD4U)kz9XS|#f?sljgE0+it#b&*du%~GNNo3wxM29_6^#d4RYz& z)cDxAbXXyC;&V!g>OpX@?dYfE!8Vp=61#3C(tOv>r#R(xzb&jy(iODQ;Kc3;Jh+==G!fcY2hx-JnIg zJWdlBp~^B?mx)-~G1=+siw?fT_z*3rOYJh+H@~$D9Xj|9l}^ABl75T)qk8Y)Z18s_GrGq>LyeH?2gW zl8!Q+W=4=WrGNZCc=^50kqASqzClQ1NToDSc)vKDm-^h$m=c31YXRZeOzd7J7J